[
  {
    "path": ".github/CODEOWNERS",
    "content": "# ----------------------------------------------------------------------------\n# CODEOWNERS\n# ----------------------------------------------------------------------------\n# Order is important. The last matching pattern takes precedence.\n# See: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners\n# ----------------------------------------------------------------------------\n\n* @mdn/content-team\n\n/.github/workflows/ @mdn/engineering\n/.github/CODEOWNERS @mdn/content-team @mdn/engineering\n/SECURITY.md @mdn/engineering\n"
  },
  {
    "path": ".gitignore",
    "content": "*.DS_Store\n"
  },
  {
    "path": ".prettierignore",
    "content": "# This .prettierignore file uses .gitignore syntax\n# see https://prettier.io/docs/en/ignore.html#ignoring-files-prettierignore\n\n/css/introduction-to-css/debugging-css/style.css\n/html/introduction-to-html/debugging-html/debug-example.html\n/tools-testing/cross-browser-testing/javascript/broken-js-test.js\n"
  },
  {
    "path": ".prettierrc.json",
    "content": "{\n  \"bracketSameLine\": true\n}\n"
  },
  {
    "path": ".vscode/cspell.json",
    "content": "{\n  \"$schema\": \"https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json\",\n  \"version\": \"0.2\",\n  \"language\": \"en-us\",\n  \"languageId\": \"*\",\n  \"dictionaries\": [\n    \"bash\",\n    \"css\",\n    \"cpp\",\n    \"django\",\n    \"filetypes\",\n    \"fonts\",\n    \"fullstack\",\n    \"html\",\n    \"latex\",\n    \"lorem-ipsum\",\n    \"markdown\",\n    \"node\",\n    \"npm\",\n    \"project-words\",\n    \"python\",\n    \"softwareTerms\",\n    \"svelte\",\n    \"typescript\"\n  ],\n  \"ignorePaths\": [\n    \".vscode/cspell.json\",\n    \".vscode/extensions.json\",\n    \".markdownlint-cli2.jsonc\",\n    \"**/*.ogg\",\n    \"**/*.mp3\",\n    \"**/*.mp4\",\n    \"html/introduction-to-html/debugging-html/debug-example.html\",\n    \"css/styling-text/**/Lovato-Light-demo.html\",\n    \"css/styling-text/**/Lovato-Light-webfont.svg\",\n    \"javascript/apis/drawing-graphics/**/*/three.min.js\",\n    \"tools-testing/cross-browser-testing/**/*.js\",\n    \"css/**/*.otf\"\n  ],\n  \"ignoreRegExpList\": [\n    \"#[\\\\w-]*\",\n    \"aria-activedescendant=\\\"(?:[^\\\\\\\"]+|\\\\.)*\\\"\",\n    \"aria-controls=\\\"(?:[^\\\\\\\"]+|\\\\.)*\\\"\",\n    \"aria-describedby=\\\"(?:[^\\\\\\\"]+|\\\\.)*\\\"\",\n    \"aria-details=\\\"(?:[^\\\\\\\"]+|\\\\.)*\\\"\",\n    \"aria-errormessage=\\\"(?:[^\\\\\\\"]+|\\\\.)*\\\"\",\n    \"aria-flowto=\\\"(?:[^\\\\\\\"]+|\\\\.)*\\\"\",\n    \"aria-labelledby=\\\"(?:[^\\\\\\\"]+|\\\\.)*\\\"\",\n    \"aria-owns=\\\"(?:[^\\\\\\\"]+|\\\\.)*\\\"\",\n    \"Base64\",\n    \"class=\\\"(?:[^\\\\\\\"]+|\\\\.)*\\\"\",\n    \"data-test-id=\\\"(?:[^\\\\\\\"]+|\\\\.)*\\\"\",\n    \"EscapeCharacters\",\n    \"for=\\\"(?:[^\\\\\\\"]+|\\\\.)*\\\"\",\n    \"HexValues\",\n    \"href=\\\"(?:[^\\\\\\\"]+|\\\\.)*\\\"\",\n    \"id=\\\"(?:[^\\\\\\\"]+|\\\\.)*\\\"\",\n    \"lang=\\\".*\\\">.*</\",\n    \"src=\\\"(?:[^\\\\\\\"]+|\\\\.)*\\\"\",\n    \"url\\\\(\\\"data\\\\:image/svg\\\\+xml.*\\\"\\\\)[,;]\",\n    \"Urls\"\n  ],\n  \"allowCompoundWords\": true,\n  \"dictionaryDefinitions\": [\n    {\n      \"name\": \"project-words\",\n      \"path\": \"./project-words.txt\",\n      \"addWords\": true\n    }\n  ]\n}\n"
  },
  {
    "path": ".vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"davidanson.vscode-markdownlint\",\n    \"esbenp.prettier-vscode\",\n    \"streetsidesoftware.code-spell-checker\"\n  ]\n}\n"
  },
  {
    "path": ".vscode/project-words.txt",
    "content": "Bublé\nCEST\ndöner\nDwindlings\ngastropub\nGriffiths\nHalloumi\niframes\nkombucha\nKruse\nLeia\nListicle\nLovato\nModernizr\nninjitsu\nNyancat\nOOJS\npoutine\nQuokka\nRenan\nSelectivizr\nSiouxsie\nsnape\nSwindoll\numami\nvenmo\nWASD\nWEBVTT\nXOXO\nzantroke\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Community Participation Guidelines\n\nThis repository is governed by Mozilla's code of conduct and etiquette guidelines. \nFor more details, please read the\n[Mozilla Community Participation Guidelines](https://www.mozilla.org/about/governance/policies/participation/). \n\n## How to Report\nFor more information on how to report violations of the Community Participation Guidelines, please read our '[How to Report](https://www.mozilla.org/about/governance/policies/participation/reporting/)' page.\n\n<!--\n## Project Specific Etiquette\n\nIn some cases, there will be additional project etiquette i.e.: (https://bugzilla.mozilla.org/page.cgi?id=etiquette.html).\nPlease update for your project.\n-->\n"
  },
  {
    "path": "LICENSE",
    "content": "CC0 1.0 Universal\n\nStatement of Purpose\n\nThe laws of most jurisdictions throughout the world automatically confer\nexclusive Copyright and Related Rights (defined below) upon the creator and\nsubsequent owner(s) (each and all, an \"owner\") of an original work of\nauthorship and/or a database (each, a \"Work\").\n\nCertain owners wish to permanently relinquish those rights to a Work for the\npurpose of contributing to a commons of creative, cultural and scientific\nworks (\"Commons\") that the public can reliably and without fear of later\nclaims of infringement build upon, modify, incorporate in other works, reuse\nand redistribute as freely as possible in any form whatsoever and for any\npurposes, including without limitation commercial purposes. These owners may\ncontribute to the Commons to promote the ideal of a free culture and the\nfurther production of creative, cultural and scientific works, or to gain\nreputation or greater distribution for their Work in part through the use and\nefforts of others.\n\nFor these and/or other purposes and motivations, and without any expectation\nof additional consideration or compensation, the person associating CC0 with a\nWork (the \"Affirmer\"), to the extent that he or she is an owner of Copyright\nand Related Rights in the Work, voluntarily elects to apply CC0 to the Work\nand publicly distribute the Work under its terms, with knowledge of his or her\nCopyright and Related Rights in the Work and the meaning and intended legal\neffect of CC0 on those rights.\n\n1. Copyright and Related Rights. A Work made available under CC0 may be\nprotected by copyright and related or neighboring rights (\"Copyright and\nRelated Rights\"). Copyright and Related Rights include, but are not limited\nto, the following:\n\n  i. the right to reproduce, adapt, distribute, perform, display, communicate,\n  and translate a Work;\n\n  ii. moral rights retained by the original author(s) and/or performer(s);\n\n  iii. publicity and privacy rights pertaining to a person's image or likeness\n  depicted in a Work;\n\n  iv. rights protecting against unfair competition in regards to a Work,\n  subject to the limitations in paragraph 4(a), below;\n\n  v. rights protecting the extraction, dissemination, use and reuse of data in\n  a Work;\n\n  vi. database rights (such as those arising under Directive 96/9/EC of the\n  European Parliament and of the Council of 11 March 1996 on the legal\n  protection of databases, and under any national implementation thereof,\n  including any amended or successor version of such directive); and\n\n  vii. other similar, equivalent or corresponding rights throughout the world\n  based on applicable law or treaty, and any national implementations thereof.\n\n2. Waiver. To the greatest extent permitted by, but not in contravention of,\napplicable law, Affirmer hereby overtly, fully, permanently, irrevocably and\nunconditionally waives, abandons, and surrenders all of Affirmer's Copyright\nand Related Rights and associated claims and causes of action, whether now\nknown or unknown (including existing as well as future claims and causes of\naction), in the Work (i) in all territories worldwide, (ii) for the maximum\nduration provided by applicable law or treaty (including future time\nextensions), (iii) in any current or future medium and for any number of\ncopies, and (iv) for any purpose whatsoever, including without limitation\ncommercial, advertising or promotional purposes (the \"Waiver\"). Affirmer makes\nthe Waiver for the benefit of each member of the public at large and to the\ndetriment of Affirmer's heirs and successors, fully intending that such Waiver\nshall not be subject to revocation, rescission, cancellation, termination, or\nany other legal or equitable action to disrupt the quiet enjoyment of the Work\nby the public as contemplated by Affirmer's express Statement of Purpose.\n\n3. Public License Fallback. Should any part of the Waiver for any reason be\njudged legally invalid or ineffective under applicable law, then the Waiver\nshall be preserved to the maximum extent permitted taking into account\nAffirmer's express Statement of Purpose. In addition, to the extent the Waiver\nis so judged Affirmer hereby grants to each affected person a royalty-free,\nnon transferable, non sublicensable, non exclusive, irrevocable and\nunconditional license to exercise Affirmer's Copyright and Related Rights in\nthe Work (i) in all territories worldwide, (ii) for the maximum duration\nprovided by applicable law or treaty (including future time extensions), (iii)\nin any current or future medium and for any number of copies, and (iv) for any\npurpose whatsoever, including without limitation commercial, advertising or\npromotional purposes (the \"License\"). The License shall be deemed effective as\nof the date CC0 was applied by Affirmer to the Work. Should any part of the\nLicense for any reason be judged legally invalid or ineffective under\napplicable law, such partial invalidity or ineffectiveness shall not\ninvalidate the remainder of the License, and in such case Affirmer hereby\naffirms that he or she will not (i) exercise any of his or her remaining\nCopyright and Related Rights in the Work or (ii) assert any associated claims\nand causes of action with respect to the Work, in either case contrary to\nAffirmer's express Statement of Purpose.\n\n4. Limitations and Disclaimers.\n\n  a. No trademark or patent rights held by Affirmer are waived, abandoned,\n  surrendered, licensed or otherwise affected by this document.\n\n  b. Affirmer offers the Work as-is and makes no representations or warranties\n  of any kind concerning the Work, express, implied, statutory or otherwise,\n  including without limitation warranties of title, merchantability, fitness\n  for a particular purpose, non infringement, or the absence of latent or\n  other defects, accuracy, or the present or absence of errors, whether or not\n  discoverable, all to the greatest extent permissible under applicable law.\n\n  c. Affirmer disclaims responsibility for clearing rights of other persons\n  that may apply to the Work or any use thereof, including without limitation\n  any person's Copyright and Related Rights in the Work. Further, Affirmer\n  disclaims responsibility for obtaining any necessary consents, permissions\n  or other rights required for any use of the Work.\n\n  d. Affirmer understands and acknowledges that Creative Commons is not a\n  party to this document and has no duty or obligation with respect to this\n  CC0 or use of the Work.\n\nFor more information, please see\n<http://creativecommons.org/publicdomain/zero/1.0/>\n"
  },
  {
    "path": "README.md",
    "content": "# learning-area\nWelcome to the GitHub repository for the [MDN Learning Area](https://developer.mozilla.org/en-US/Learn).\n\nMost of the code examples shown and discussed in the Learning Area can be found here; the directories in the repo match the module structure of the articles.\n\nThe one exception is the [Server-side website programming](https://developer.mozilla.org/en-US/docs/Learn/Server-side) examples — we split these into two separate repositories to make them easier to manage:\n\n* https://github.com/mdn/express-locallibrary-tutorial\n* https://github.com/mdn/django-locallibrary-tutorial\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Overview\n\nThis policy applies to MDN's website (`developer.mozilla.org`), backend services, and GitHub repositories in the [`mdn`](https://github.com/mdn) organization. Issues affecting other Mozilla products or services should be reported through the [Mozilla Security Bug Bounty Program](https://www.mozilla.org/en-US/security/bug-bounty/).\n\nFor non-security issues, please file a [content bug](https://github.com/mdn/content/issues/new/choose), a [website bug](https://github.com/mdn/fred/issues/new/choose) or a [content/feature suggestion](https://github.com/mdn/mdn/issues/new/choose).\n\n## Reporting a Vulnerability\n\nIf you discover a potential security issue, please report it privately via <https://hackerone.com/mozilla>.\n\nIf you prefer not to use HackerOne, you can report it via <https://bugzilla.mozilla.org/form.web.bounty>.\n\n## Bounty Program\n\nVulnerabilities in MDN may qualify for Mozilla's Bug Bounty Program. Eligibility and reward amounts are described on <https://hackerone.com/mozilla>.\n\nPlease use the above channels even if you are not interested in a bounty reward.\n\n## Responsible Disclosure\n\nPlease do not publicly disclose details until Mozilla's security team and the MDN engineering team have verified and fixed the issue.\n\nWe appreciate your efforts to keep MDN and its users safe.\n"
  },
  {
    "path": "accessibility/aria/aria-div-buttons.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>ARIA div buttons</title>\n    <style>\n      div {\n        background-color: rgb(240, 240, 240);\n        font-size: 11px;\n        font-family: sans-serif;\n        border: 1px outset rgb(218, 218, 218);\n        line-height: 20px;\n        padding: 0 6px;\n        width: 120px;\n        text-align: center;\n        border-radius: 5px;\n        margin-right: 10px;\n        cursor: pointer;\n        display: inline-block;\n      }\n\n      div:hover, div:focus {\n        font-weight: bold;\n      }\n    </style>\n  </head>\n  <body>\n\n    <h2>ARIA div buttons</h2>\n\n    <div data-message=\"This is from the first button\" tabindex=\"0\" role=\"button\">Click me!</div>\n    <div data-message=\"This is from the second button\" tabindex=\"0\" role=\"button\">Click me too!</div>\n    <div data-message=\"This is from the third button\" tabindex=\"0\" role=\"button\">And me!</div>\n\n    <script>\n      const buttons = document.querySelectorAll('div');\n\n      for(let i = 0; i < buttons.length; i++) {\n        addHandler(buttons[i]);\n      }\n\n      function addHandler(button) {\n        button.onclick = function(e) {\n          let message = e.target.getAttribute('data-message');\n          alert(message);\n        }\n      }\n\n      document.onkeydown = function(e) {\n        if(e.keyCode === 13) { // The Enter/Return key\n          document.activeElement.onclick(e);\n        }\n      };\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/aria/aria-live.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n\n    <title>Random quotes</title>\n\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      h1 {\n        letter-spacing: 2px;\n      }\n\n      p {\n        line-height: 1.6;\n      }\n\n      section {\n        padding: 10px;\n        width: 400px;\n        background: #666;\n        text-shadow: 1px 1px 1px black;\n        color: white;\n        min-height: 150px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section aria-live=\"assertive\" aria-atomic=\"true\">\n      <h1>Random quote</h1>\n      <blockquote>\n        <p></p>\n      </blockquote>\n    </section>\n    <script>\n      const quotePara = document.querySelector(\"section p\");\n\n      let quoteJson;\n\n      getQuotes(\"quotes.json\").then((quotes) => {\n        quoteJson = quotes;\n        window.setInterval(showQuote, 10000);\n      });\n\n      async function getQuotes(url, callback) {\n        const response = await fetch(url);\n        return response.json();\n      }\n\n      function populateJson(response) {\n        quoteJson = response;\n      }\n\n      function showQuote() {\n        let random = Math.floor(Math.random() * 25);\n        quotePara.textContent = `${quoteJson[random].quote} -- ${quoteJson[random].author}`;\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/aria/aria-no-live.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n\n    <title>Random quotes</title>\n\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      h1 {\n        letter-spacing: 2px;\n      }\n\n      p {\n        line-height: 1.6;\n      }\n\n      section {\n        padding: 10px;\n        width: 400px;\n        background: #666;\n        text-shadow: 1px 1px 1px black;\n        color: white;\n        min-height: 150px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section>\n      <h1>Random quote</h1>\n      <blockquote>\n        <p></p>\n      </blockquote>\n    </section>\n    <script>\n      const quotePara = document.querySelector(\"section p\");\n\n      let quoteJson;\n\n      getQuotes(\"quotes.json\").then((quotes) => {\n        quoteJson = quotes;\n        window.setInterval(showQuote, 10000);\n      });\n\n      async function getQuotes(url, callback) {\n        const response = await fetch(url);\n        return response.json();\n      }\n\n      function populateJson(response) {\n        quoteJson = response;\n      }\n\n      function showQuote() {\n        let random = Math.floor(Math.random() * 25);\n        quotePara.textContent = `${quoteJson[random].quote} -- ${quoteJson[random].author}`;\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/aria/aria-tabbed-info-box.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>ARIA tabbed info box</title>\n  <style>\n\n  /* General setup */\n\n  html {\n    font-family: sans-serif;\n  }\n\n  * {\n    box-sizing: border-box;\n  }\n\n  body {\n    margin: 0;\n  }\n\n  /* info-box setup */\n\n  .info-box {\n    width: 450px;\n    height: 400px;\n    margin: 0 auto;\n  }\n\n  /* styling info-box tabs */\n\n  ul[role=\"tablist\"] {\n    padding-left: 0;\n    margin-top: 0;\n  }\n\n  li[role=\"tab\"] {\n    float: left;\n    list-style-type: none;\n    width: 150px;\n    display: inline-block;\n    line-height: 3;\n    background-color: red;\n    color: black;\n    text-align: center;\n  }\n\n  li[role=\"tab\"]:focus, li[role=\"tab\"]:hover {\n    background-color: #a60000;\n    color: white;\n  }\n\n  li[role=\"tab\"].active {\n    background-color: #a60000;\n    color: white;\n  }\n\n  /* styling info-box panels */\n\n  .info-box .panels {\n    clear: both;\n    position: relative;\n    height: 352px;\n  }\n\n  .info-box article {\n    background-color: #a60000;\n    color: white;\n    position: absolute;\n    padding: 10px;\n    height: 352px;\n    top: 0;\n    left: 0;\n  }\n\n  .info-box .active-panel {\n    z-index: 1;\n  }\n\n</style>\n  </head>\n<body>\n\n<section class=\"info-box\">\n  <ul role=\"tablist\">\n    <li class=\"active\" role=\"tab\" aria-selected=\"true\" aria-setsize=\"3\" aria-posinset=\"1\" tabindex=\"0\">Tab 1</li>\n    <li role=\"tab\" aria-selected=\"false\" aria-setsize=\"3\" aria-posinset=\"2\" tabindex=\"0\">Tab 2</li>\n    <li role=\"tab\" aria-selected=\"false\" aria-setsize=\"3\" aria-posinset=\"3\" tabindex=\"0\">Tab 3</li>\n  </ul>\n  <div class=\"panels\">\n    <article class=\"active-panel\" role=\"tabpanel\" aria-hidden=\"false\">\n      <h2>The first tab</h2>\n\n      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque turpis nibh, porttitor nec venenatis eu, pulvinar in augue. Vestibulum et orci scelerisque, vulputate tellus quis, lobortis dui. Vivamus varius libero at ipsum mattis efficitur ut nec nisl. Nullam eget tincidunt metus. Donec ultrices, urna maximus consequat aliquet, dui neque eleifend lorem, a auctor libero turpis at sem. Aliquam ut porttitor urna. Nulla facilisi.</p>\n    </article>\n    <article role=\"tabpanel\" aria-hidden=\"true\">\n      <h2>The second tab</h2>\n\n      <p>This tab hasn't got any Lorem Ipsum in it. But the content isn't very exciting all the same.</p>\n    </article>\n    <article role=\"tabpanel\" aria-hidden=\"true\">\n      <h2>The third tab</h2>\n\n      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque turpis nibh, porttitor nec venenatis eu, pulvinar in augue. And now an ordered list: how exciting!</p>\n\n      <ol>\n        <li>dui neque eleifend lorem, a auctor libero turpis at sem.</li>\n        <li>Aliquam ut porttitor urna.</li>\n        <li>Nulla facilisi</li>\n      </ol>\n    </article>\n  </div>\n</section>\n\n<script>\n\nlet tabs = document.querySelectorAll('.info-box li');\nlet panels = document.querySelectorAll('.info-box article');\n\nfor(let i = 0; i < tabs.length; i++) {\n  let tab = tabs[i];\n  setTabHandler(tab);\n}\n\nfunction setTab(e) {\n  if(e.type === 'keypress' && e.keyCode !== 13) {\n    return;\n  }\n\n  let tabPos = Number(this.getAttribute('aria-posinset'))-1;\n  for(let i = 0; i < tabs.length; i++) {\n    if(tabs[i].getAttribute('class')) {\n      tabs[i].removeAttribute('class');\n    }\n\n    tabs[i].setAttribute('aria-selected', 'false');\n  }\n\n  this.setAttribute('class', 'active');\n  this.setAttribute('aria-selected', 'true');\n\n  for(let i = 0; i < panels.length; i++) {\n    if(panels[i].getAttribute('class')) {\n      panels[i].removeAttribute('class');\n    }\n\n    panels[i].setAttribute('aria-hidden', 'true');\n  }\n\n  panels[tabPos].setAttribute('class', 'active-panel');\n  panels[tabPos].setAttribute('aria-hidden', 'false');\n}\n\nfunction setTabHandler(tab) {\n  tab.addEventListener('click', setTab);\n  tab.addEventListener('keypress', setTab);\n}\n\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "accessibility/aria/form-validation-checkbox-disabled.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Form validation example</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      form {\n        background: #eee;\n        border-radius: 20px;\n        box-shadow: 1px 1px 1px black;\n        padding: 20px;\n        width: 330px;\n      }\n\n      label {\n        width: 160px;\n        float: left;\n        text-align: right;\n        padding: 4px;\n        margin-bottom: 20px;\n      }\n\n      input {\n        width: 130px;\n        float: right;\n      }\n\n      label, input {\n        font-size: 1em;\n        line-height: 1.5;\n      }\n\n      input[type=\"checkbox\"] {\n        height: 24px;\n      }\n\n      div {\n        clear: both;\n      }\n\n      .errors {\n        background: yellow;\n        border-radius: 20px;\n        box-shadow: 1px 1px 1px black;\n        padding: 20px;\n        width: 300px;\n        position: absolute;\n        left: 390px;\n      }\n\n      .hidden-alert {\n        position: absolute;\n        left: -100%;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Form validation example</h1>\n    <div class=\"errors\" role=\"alert\" aria-relevant=\"all\">\n      <ul>\n\n      </ul>\n\n    </div>\n\n    <p>Fields marked with an asterisk (*) are required.</p>\n\n    <form>\n      <div>\n        <label for=\"name\">Enter your name*:</label>\n        <input type=\"text\" name=\"name\" id=\"name\" aria-required=\"true\">\n      </div>\n      <div>\n        <label for=\"age\">Enter your age*:</label>\n        <input type=\"number\" name=\"age\" id=\"age\" placeholder=\"Enter 1 to 150\" aria-required=\"true\">\n      </div>\n      <div>\n        <label for=\"musician\">Musician:</label>\n        <input type=\"checkbox\" name=\"musician\" id=\"musician\">\n      </div>\n      <div>\n        <label for=\"instruments\">Instruments played*:</label>\n        <input type=\"text\" name=\"instruments\" id=\"instruments\" aria-required=\"true\">\n      </div>\n      <div>\n        <input type=\"submit\">\n      </div>\n      <div></div>\n    </form>\n    <p class=\"hidden-alert\" aria-live=\"assertive\"></p>\n    <script src=\"validation-checkbox-disabled.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/aria/form-validation-updated.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Form validation example</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      form {\n        background: #eee;\n        border-radius: 20px;\n        box-shadow: 1px 1px 1px black;\n        padding: 20px;\n        width: 300px;\n      }\n\n      label {\n        width: 130px;\n        float: left;\n        text-align: right;\n        padding: 4px;\n        margin-bottom: 20px;\n      }\n\n      input {\n        width: 130px;\n        float: right;\n      }\n\n      label, input {\n        font-size: 1em;\n        line-height: 1.5;\n      }\n\n      div {\n        clear: both;\n      }\n\n      .errors {\n        background: yellow;\n        border-radius: 20px;\n        box-shadow: 1px 1px 1px black;\n        padding: 20px;\n        width: 300px;\n        position: absolute;\n        left: 360px;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Form validation example</h1>\n    <div class=\"errors\" role=\"alert\" aria-relevant=\"all\">\n      <ul>\n\n      </ul>\n\n    </div>\n\n    <p>Fields marked with an asterisk (*) are required.</p>\n\n    <form>\n      <div>\n        <label for=\"name\">Enter your name*:</label>\n        <input type=\"text\" name=\"name\" id=\"name\" aria-required=\"true\">\n      </div>\n      <div>\n        <label for=\"age\">Enter your age*:</label>\n        <input type=\"number\" name=\"age\" id=\"age\" placeholder=\"Enter 1 to 150\" aria-required=\"true\">\n      </div>\n      <div>\n        <input type=\"submit\">\n      </div>\n      <div></div>\n    </form>\n    <script src=\"validation.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/aria/quotes.json",
    "content": "[\n  {\n    \"quote\" : \"Life is about making an impact, not making an income.\",\n    \"author\" : \"Kevin Kruse\"\n  },\n  {\n    \"quote\" : \"Whatever the mind of man can conceive and believe, it can achieve.\",\n    \"author\" : \"Napoleon Hill\"\n  },\n  {\n    \"quote\" : \"Strive not to be a success, but rather to be of value.\",\n    \"author\" : \"Albert Einstein\"\n  },\n  {\n    \"quote\" : \"Two roads diverged in a wood, and I—I took the one less traveled by, And that has made all the difference\",\n    \"author\" : \"Robert Frost\"\n  },\n  {\n    \"quote\" : \"I attribute my success to this: I never gave or took any excuse.\",\n    \"author\" : \"Florence Nightingale\"\n  },\n  {\n    \"quote\" : \"You miss 100% of the shots you don’t take.\",\n    \"author\" : \"Wayne Gretzky\"\n  },\n  {\n    \"quote\" : \"I’ve missed more than 9000 shots in my career. I’ve lost almost 300 games. 26 times I’ve been trusted to take the game winning shot and missed. I’ve failed over and over and over again in my life. And that is why I succeed.\",\n    \"author\" : \"Michael Jordan\"\n  },\n  {\n    \"quote\" : \"The most difficult thing is the decision to act, the rest is merely tenacity.\",\n    \"author\" : \"Amelia Earhart\"\n  },\n  {\n    \"quote\" : \"Every strike brings me closer to the next home run.\",\n    \"author\" : \"Babe Ruth\"\n  },\n  {\n    \"quote\" : \"Definiteness of purpose is the starting point of all achievement.\",\n    \"author\" : \"W. Clement Stone\"\n  },\n  {\n    \"quote\" : \"Life isn’t about getting and having, it’s about giving and being.\",\n    \"author\" : \"Kevin Kruse\"\n  },\n  {\n    \"quote\" : \"Life is what happens to you while you’re busy making other plans.\",\n    \"author\" : \"John Lennon\"\n  },\n  {\n    \"quote\" : \"We become what we think about.\",\n    \"author\" : \"Earl Nightingale\"\n  },\n  {\n    \"quote\" : \"Twenty years from now you will be more disappointed by the things that you didn’t do than by the ones you did do, so throw off the bowlines, sail away from safe harbor, catch the trade winds in your sails.  Explore, Dream, Discover.\",\n    \"author\" : \"Mark Twain\"\n  },\n  {\n    \"quote\" : \"Life is 10% what happens to me and 90% of how I react to it.\",\n    \"author\" : \"Charles Swindoll\"\n  },\n  {\n    \"quote\" : \"The most common way people give up their power is by thinking they don’t have any.\",\n    \"author\" : \"Alice Walker\"\n  },\n  {\n    \"quote\" : \"The mind is everything. What you think you become.\",\n    \"author\" : \"Buddha\"\n  },\n  {\n    \"quote\" : \"The best time to plant a tree was 20 years ago. The second best time is now.\",\n    \"author\" : \"Chinese Proverb\"\n  },\n  {\n    \"quote\" : \"An unexamined life is not worth living.\",\n    \"author\" : \"Socrates\"\n  },\n  {\n    \"quote\" : \"Eighty percent of success is showing up.\",\n    \"author\" : \"Woody Allen\"\n  },\n  {\n    \"quote\" : \"Your time is limited, so don’t waste it living someone else’s life.\",\n    \"author\" : \"Steve Jobs\"\n  },\n  {\n    \"quote\" : \"Winning isn’t everything, but wanting to win is.\",\n    \"author\" : \"Vince Lombardi\"\n  },\n  {\n    \"quote\" : \"I am not a product of my circumstances. I am a product of my decisions.\",\n    \"author\" : \"Stephen Covey\"\n  },\n  {\n    \"quote\" : \"Every child is an artist. The problem is how to remain an artist once he grows up.\",\n    \"author\" : \"Pablo Picasso\"\n  },\n  {\n    \"quote\" : \"You can never cross the ocean until you have the courage to lose sight of the shore.\",\n    \"author\" : \"Christopher Columbus\"\n  }\n]\n"
  },
  {
    "path": "accessibility/aria/validation-checkbox-disabled.js",
    "content": "const inputs = document.querySelectorAll('input');\nconst labels = document.querySelectorAll('label');\nconst form = document.querySelector('form');\n\nlet formItems = [];\n\nconst errorField = document.querySelector('.errors');\nconst errorList = document.querySelector('.errors ul');\n\nlet checkbox;\nlet checkboxLabel;\n\nconst hiddenAlert = document.querySelector('.hidden-alert');\n\nfor(let i = 0; i < inputs.length-1; i++) {\n  if(inputs[i].type !== 'checkbox') {\n    let obj = {};\n    obj.label = labels[i];\n    obj.input = inputs[i];\n    formItems.push(obj);\n  } else {\n    checkbox = inputs[i];\n    checkboxLabel = labels[i];\n  }\n}\n\nerrorField.style.left = '-100%';\n\ntoggleMusician(false);\n\nform.onsubmit = validate;\n\nfunction validate(e) {\n  errorList.innerHTML = '';\n  for(let i = 0; i < formItems.length; i++) {\n    let testItem = formItems[i];\n    if(testItem.input.value === '' && testItem.input.disabled === false) {\n      errorField.style.left = '390px';\n      createLink(testItem);\n    }\n  }\n\n  if(errorList.innerHTML !== '') {\n    e.preventDefault();\n  }\n}\n\nfunction createLink(testItem) {\n  const listItem = document.createElement('li');\n  const anchor = document.createElement('a');\n  anchor.textContent = testItem.input.name + ' field is empty: fill in your ' + testItem.input.name + '.';\n  anchor.href = '#' + testItem.input.name;\n  anchor.onclick = function() {\n    testItem.input.focus();\n  };\n  listItem.appendChild(anchor);\n  errorList.appendChild(listItem);\n}\n\ncheckbox.onchange = function() {\n  if(checkbox.checked) {\n    toggleMusician(true);\n  } else {\n    toggleMusician(false);\n  }\n};\n\nfunction toggleMusician(bool) {\n  let instruItem = formItems[formItems.length-1];\n  if(bool) {\n    instruItem.input.disabled = false;\n    instruItem.label.style.color = '#000';\n    instruItem.input.setAttribute('aria-disabled', 'false');\n    hiddenAlert.textContent = 'Instruments played field now enabled; use it to tell us what you play.';\n  } else {\n    instruItem.input.disabled = true;\n    instruItem.label.style.color = '#999';\n    instruItem.input.setAttribute('aria-disabled', 'true');\n    hiddenAlert.textContent = 'Instruments played field now disabled.';\n  }\n}\n"
  },
  {
    "path": "accessibility/aria/validation.js",
    "content": "const inputs = document.querySelectorAll('input');\nconst labels = document.querySelectorAll('label');\nconst form = document.querySelector('form');\n\nlet formItems = [];\n\nconst errorField = document.querySelector('.errors');\nconst errorList = document.querySelector('.errors ul');\n\nfor(let i = 0; i < inputs.length-1; i++) {\n  let obj = {};\n  obj.label = labels[i];\n  obj.input = inputs[i];\n  formItems.push(obj);\n}\n\nerrorField.style.left = '-100%';\n\nform.onsubmit = validate;\n\nfunction validate(e) {\n  errorList.innerHTML = '';\n  for(let i = 0; i < formItems.length; i++) {\n    let testItem = formItems[i];\n    if(testItem.input.value === '') {\n      errorField.style.left = '360px';\n      createLink(testItem);\n    }\n  }\n\n  if(errorList.innerHTML !== '') {\n    e.preventDefault();\n  }\n}\n\nfunction createLink(testItem) {\n  const listItem = document.createElement('li');\n  const anchor = document.createElement('a');\n  anchor.textContent = testItem.input.name + ' field is empty: fill in your ' + testItem.input.name + '.';\n  anchor.href = '#' + testItem.input.name;\n  anchor.onclick = function() {\n    testItem.input.focus();\n  };\n  listItem.appendChild(anchor);\n  errorList.appendChild(listItem);\n}\n"
  },
  {
    "path": "accessibility/aria/website-aria-roles/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n\n    <title>Example website with ARIA roles</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300%7CSonsie+One\" rel=\"stylesheet\" type=\"text/css\">\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n\n  <body>\n    <!-- Here is our main header that is used accross all the pages of our website -->\n\n    <header>\n      <h1>Header</h1>\n\n      <!-- Even is it's not mandatory, it's common practice to put the main navigation menu within the main header -->\n\n      <nav>\n        <ul>\n          <li><a href=\"#\">Home</a></li>\n          <li><a href=\"#\">Our team</a></li>\n          <li><a href=\"#\">Projects</a></li>\n          <li><a href=\"#\">Contact</a></li>\n        </ul>\n\n        <!-- A Search form is another common non-linear way to navigate through a website. -->\n\n        <form role=\"search\">\n          <input type=\"search\" name=\"q\" placeholder=\"Search query\" aria-label=\"Search through site content\">\n          <input type=\"submit\" value=\"Go!\">\n        </form>\n      </nav>\n    </header>\n\n    <!-- Here is our page's main content -->\n    <main>\n\n      <!-- It contains an article -->\n      <article>\n        <h2>Article heading</h2>\n\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Donec a diam lectus. Set sit amet ipsum mauris. Maecenas congue ligula as quam viverra nec consectetur ant hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur.</p>\n\n        <h3>subsection</h3>\n\n        <p>Donec ut librero sed accu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor.</p>\n\n        <p>Pelientesque auctor nisi id magna consequat sagittis. Curabitur dapibus, enim sit amet elit pharetra tincidunt feugiat nist imperdiet. Ut convallis libero in urna ultrices accumsan. Donec sed odio eros.</p>\n\n        <h3>Another subsection</h3>\n\n        <p>Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus. Cum soclis natoque penatibus et manis dis parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisi at sem facilisis semper ac in est.</p>\n\n        <p>Vivamus fermentum semper porta. Nunc diam velit, adipscing ut tristique vitae sagittis vel odio. Maecenas convallis ullamcorper ultricied. Curabitur ornare, ligula semper consectetur sagittis, nisi diam iaculis velit, is fringille sem nunc vet mi.</p>\n      </article>\n\n      <!-- the aside content can also be nested within the main content -->\n      <aside>\n        <h2>Related</h2>\n\n        <ul>\n          <li><a href=\"#\">Oh I do like to be beside the seaside</a></li>\n          <li><a href=\"#\">Oh I do like to be beside the sea</a></li>\n          <li><a href=\"#\">Although in the North of England</a></li>\n          <li><a href=\"#\">It never stops raining</a></li>\n          <li><a href=\"#\">Oh well...</a></li>\n        </ul>\n      </aside>\n\n    </main>\n\n    <!-- And here is our main footer that is used across all the pages of our website -->\n\n    <footer>\n      <p>©Copyright 2050 by nobody. All rights reversed.</p>\n    </footer>\n\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/aria/website-aria-roles/style.css",
    "content": "/* || General setup */\n\nhtml, body {\n  margin: 0;\n  padding: 0;\n}\n\nhtml {\n  font-size: 10px;\n  background-color: #a9a9a9;\n}\n\nbody {\n  width: 70%;\n  margin: 0 auto;\n}\n\n/* || typography */\n\nh1, h2, h3 {\n  font-family: 'Sonsie One', cursive;\n  color: #2a2a2a;\n}\n\np, input, li {\n  font-family: 'Open Sans Condensed', sans-serif;\n  color: #2a2a2a;\n}\n\nh1 {\n  font-size: 4rem;\n  text-align: center;\n  color: white;\n  text-shadow: 2px 2px 10px black;\n}\n\nh2 {\n  font-size: 3rem;\n  text-align: center;\n}\n\nh3 {\n  font-size: 2.2rem;\n}\n\np, li {\n  font-size: 1.6rem;\n  line-height: 1.5;\n}\n\n/* || header layout */\n\nheader {\n  margin-bottom: 10px;\n}\n\nnav, article, aside, footer {\n  background-color: white;\n  padding: 1%;\n}\n\nnav {\n  height: 50px;\n  background-color: ff80ff;\n  display: flex;\n}\n\nnav ul {\n  padding: 0;\n  list-style-type: none;\n  flex: 2;\n  display: flex;\n}\n\nnav li {\n  display: inline;\n  text-align: center;\n  flex: 1;\n}\n\nnav a {\n  display: inline-block;\n  font-size: 2rem;\n  text-transform: uppercase;\n  text-decoration: none;\n  color: black;\n}\n\nnav form {\n  flex: 1;\n  display: flex;\n  align-items: center;\n  height: 100%;\n  padding: 0 2em;\n}\n\ninput {\n  font-size: 1.6rem;\n  height: 32px;\n}\n\ninput[type=\"search\"] {\n  flex: 3;\n}\n\ninput[type=\"submit\"] {\n  flex: 1;\n  margin-left: 1rem;\n  background: #333;\n  border: 0;\n  color: white;\n}\n\n/* || main layout */\n\nmain {\n  display: flex;\n}\n\narticle {\n  flex: 4;\n}\n\naside {\n  flex: 1;\n  margin-left: 10px;\n  background-color: #ff80ff;\n}\n\naside li {\n  padding-bottom: 10px;\n}\n\nfooter {\n  margin-top: 10px;\n}\n"
  },
  {
    "path": "accessibility/aria/website-no-roles/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n\n    <title>Example website structure</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300%7CSonsie+One\" rel=\"stylesheet\" type=\"text/css\">\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n\n  <body>\n    <!-- Here is our main header that is used accross all the pages of our website -->\n\n    <header>\n      <h1>Header</h1>\n\n      <!-- Even is it's not mandatory, it's common practice to put the main navigation menu within the main header -->\n\n      <nav>\n        <ul>\n          <li><a href=\"#\">Home</a></li>\n          <li><a href=\"#\">Our team</a></li>\n          <li><a href=\"#\">Projects</a></li>\n          <li><a href=\"#\">Contact</a></li>\n        </ul>\n\n        <!-- A Search form is another common non-linear way to navigate through a website. -->\n\n        <form>\n          <input type=\"search\" name=\"q\" placeholder=\"Search query\">\n          <input type=\"submit\" value=\"Go!\">\n        </form>\n      </nav>\n    </header>\n\n    <!-- Here is our page's main content -->\n    <main>\n\n      <!-- It contains an article -->\n      <article>\n        <h2>Article heading</h2>\n\n        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Donec a diam lectus. Set sit amet ipsum mauris. Maecenas congue ligula as quam viverra nec consectetur ant hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur.</p>\n\n        <h3>subsection</h3>\n\n        <p>Donec ut librero sed accu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor.</p>\n\n        <p>Pelientesque auctor nisi id magna consequat sagittis. Curabitur dapibus, enim sit amet elit pharetra tincidunt feugiat nist imperdiet. Ut convallis libero in urna ultrices accumsan. Donec sed odio eros.</p>\n\n        <h3>Another subsection</h3>\n\n        <p>Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus. Cum soclis natoque penatibus et manis dis parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisi at sem facilisis semper ac in est.</p>\n\n        <p>Vivamus fermentum semper porta. Nunc diam velit, adipscing ut tristique vitae sagittis vel odio. Maecenas convallis ullamcorper ultricied. Curabitur ornare, ligula semper consectetur sagittis, nisi diam iaculis velit, is fringille sem nunc vet mi.</p>\n      </article>\n\n      <!-- the aside content can also be nested within the main content -->\n      <aside>\n        <h2>Related</h2>\n\n        <ul>\n          <li><a href=\"#\">Oh I do like to be beside the seaside</a></li>\n          <li><a href=\"#\">Oh I do like to be beside the sea</a></li>\n          <li><a href=\"#\">Although in the North of England</a></li>\n          <li><a href=\"#\">It never stops raining</a></li>\n          <li><a href=\"#\">Oh well...</a></li>\n        </ul>\n      </aside>\n\n    </main>\n\n    <!-- And here is our main footer that is used across all the pages of our website -->\n\n    <footer>\n      <p>©Copyright 2050 by nobody. All rights reversed.</p>\n    </footer>\n\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/aria/website-no-roles/style.css",
    "content": "/* || General setup */\n\nhtml, body {\n  margin: 0;\n  padding: 0;\n}\n\nhtml {\n  font-size: 10px;\n  background-color: #a9a9a9;\n}\n\nbody {\n  width: 70%;\n  margin: 0 auto;\n}\n\n/* || typography */\n\nh1, h2, h3 {\n  font-family: 'Sonsie One', cursive;\n  color: #2a2a2a;\n}\n\np, input, li {\n  font-family: 'Open Sans Condensed', sans-serif;\n  color: #2a2a2a;\n}\n\nh1 {\n  font-size: 4rem;\n  text-align: center;\n  color: white;\n  text-shadow: 2px 2px 10px black;\n}\n\nh2 {\n  font-size: 3rem;\n  text-align: center;\n}\n\nh3 {\n  font-size: 2.2rem;\n}\n\np, li {\n  font-size: 1.6rem;\n  line-height: 1.5;\n}\n\n/* || header layout */\n\nheader {\n  margin-bottom: 10px;\n}\n\nnav, article, aside, footer {\n  background-color: white;\n  padding: 1%;\n}\n\nnav {\n  height: 50px;\n  background-color: ff80ff;\n  display: flex;\n}\n\nnav ul {\n  padding: 0;\n  list-style-type: none;\n  flex: 2;\n  display: flex;\n}\n\nnav li {\n  display: inline;\n  text-align: center;\n  flex: 1;\n}\n\nnav a {\n  display: inline-block;\n  font-size: 2rem;\n  text-transform: uppercase;\n  text-decoration: none;\n  color: black;\n}\n\nnav form {\n  flex: 1;\n  display: flex;\n  align-items: center;\n  height: 100%;\n  padding: 0 2em;\n}\n\ninput {\n  font-size: 1.6rem;\n  height: 32px;\n}\n\ninput[type=\"search\"] {\n  flex: 3;\n} \n\ninput[type=\"submit\"] {\n  flex: 1;\n  margin-left: 1rem;\n  background: #333;\n  border: 0;\n  color: white; \n} \n\n/* || main layout */\n\nmain {\n  display: flex;\n}\n\narticle {\n  flex: 4;\n}\n\naside {\n  flex: 1;\n  margin-left: 10px;\n  background-color: #ff80ff;\n}\n\naside li {\n  padding-bottom: 10px;\n}\n\nfooter {\n  margin-top: 10px;\n}\n"
  },
  {
    "path": "accessibility/assessment-finished/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n\n    <title>Accessibility assessment</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300%7CSonsie+One\" rel=\"stylesheet\" type=\"text/css\">\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n\n  <body>\n    <header>\n      <h1>Welcome to our wildlife website</h1>\n    </header>\n\n    <nav>\n      <ul>\n        <li><a href=\"#\">Home</a></li>\n        <li><a href=\"#\">Our team</a></li>\n        <li><a href=\"#\">Projects</a></li>\n        <li><a href=\"#\">Blog</a></li>\n      </ul>\n\n      <form class=\"search\">\n        <input type=\"search\" name=\"q\" placeholder=\"Search query\" aria-label=\"Search through site content\">\n        <input type=\"submit\" value=\"Go!\">\n      </form>\n    </nav>\n\n    <main>\n      <article>\n        <h2>The trouble with Bears</h2>\n\n        <p>By Evan Wild</p>\n\n        <p>Tall, lumbering, angry, dangerous. The real live bears of this world are proud, independent creatures, self-serving and always on the hunt for food. Nothing like the bears you see on TV, like Baloo from renowned documentary, The Jungle Book.</p>\n\n        <p>So what are bears really like, and why does the world's media portray them with such a skewed vision? In this article we try to answer those questions, and give you a real insight into the life of the bear.</p>\n\n        <h3>Types of bear</h3>\n\n        <p>Bears come in two varieties — large and medium. You don't get small bears. If you have seen a small bear, then it was in fact probably a baby bear (cub) from another species.</p>\n\n        <p>Bears can also be classified in terms of their habitat — both large and medium bears are just as at home in urban areas as they are in the countryside. Different habitats encourange different behaviour however, as you'll find out below. The below table also gives you some useful facts about bears.</p>\n\n        <table summary=\"Useful statistics about wild and urban bears\">\n          <thead>\n            <tr>\n              <th scope=\"col\">Bear Type</th>\n              <th scope=\"col\">Coat</th>\n              <th scope=\"col\">Adult size</th>\n              <th scope=\"col\">Habitat</th>\n              <th scope=\"col\">Lifespan</th>\n              <th scope=\"col\">Diet</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <th scope=\"row\">Wild</th>\n              <td>Brown or black</td>\n              <td>1.4 to 2.8 meters</td>\n              <td>Woods and forests</td>\n              <td>25 to 28 years</td>\n              <td>Fish, meat, plants</td>\n            </tr>\n            <tr>\n              <th scope=\"row\">Urban</th>\n              <td>North Face</td>\n              <td>18 to 22</td>\n              <td>Condos and coffee shops</td>\n              <td>20 to 32 years</td>\n              <td>Starbucks, sushi</td>\n            </tr>\n          </tbody>\n        </table>\n\n        <h3>Habitats and Eating habits</h3>\n\n        <p>Wild bears eat a variety of meat, fish, fruit, nuts, and other naturally growing ingredients. In general they will hunt for food themselves in woodland or rivers, but at a push they will track down their sustenance from farms or country houses. They tend to live in relative isolation, in caves, tents, or cottages. The below image shows <span id=\"wild-label\">a big brown wild bear, standing in a river looking for fish to eat</span>.</p>\n\n        <img src=\"media/wild-bear.jpg\" aria-labelledby=\"wild-label\">\n\n        <p>Urban (gentrified) bears on the other hand have largely abandoned the old ways. They will hunt other urban creatures if necessary (including other predators like rats and foxes), but prefer to scavenge from readily available urban food outlets like dumpsters, bins, and fast food joints. When food has proven scarce, urban bears have even been known to break into people's kitchens and steal essentials like baked beans, ready meals, and microwave ovens. Below you can see <span id=\"urban-label\">an urban polar bear, looking through the railings of his garden while contemplating whether to eat at Nandos or Taco Bell</span>.</p>\n\n        <img src=\"media/urban-bear.jpg\" aria-labelledby=\"urban-label\">\n\n        <p>Urban bears will sleep anywhere they can, from bus shelters and parks, to the toilets in McDonald's, to their own apartment.</p>\n\n        <h3>Mating rituals</h3>\n\n        <p>Bears are romantic creatures by nature, and will naturally look for a mate that they can spend the rest of their lives with. They will woo a potential suitor by making their dwelling look attractive — for example with cave paintings or a bed of reeds in the case of a wild bear, and mood lighting and a Michael Bublé CD in the case of an urban bear.</p>\n\n        <p>The following audio clip contains a fact file providing more details about bear mating rituals, along with samples and quotes from experts. You can also access a <a href=\"transcript.html\">text transcript of the audio clip</a>.</p>\n\n        <audio controls>\n          <source src=\"media/bear.mp3\" type=\"audio/mp3\">\n          <source src=\"media/bear.ogg\" type=\"audio/ogg\">\n          <p>It looks like your browser doesn't support HTML5 audio players. Here is a <a href=\"bear.mp3\">direct link to the audio file</a> instead.</p>\n        </audio>\n\n        <aside>\n\n          <h3>About the author</h3>\n\n          <p>Evan Wild is an unemployed plumber from Doncaster, who has been really \"in to\" wildlife since childhood. He once went to Chester Zoo on holiday, but got ill after eating a döner kebab.\n\n          <p>He has never seen a bear, but once read a Daily Mail article about them, and thinks they sound cool.</p>\n\n        </aside>\n        <section class=\"comments\">\n          <button class=\"show-hide\">Show comments</button>\n\n          <div class=\"comment-wrapper\">\n\n            <h2>Add comment</h2>\n\n            <form class=\"comment-form\">\n              <div class=\"flex-pair\">\n                <label for=\"name\">Your name:</label>\n                <input type=\"text\" name=\"name\" id=\"name\" placeholder=\"Enter your name\">\n              </div>\n              <div class=\"flex-pair\">\n                <label for=\"comment\">Your comment:</label>\n                <input type=\"text\" name=\"comment\" id=\"comment\" placeholder=\"Enter your comment\">\n              </div>\n              <div>\n                <input type=\"submit\" value=\"Submit comment\">\n              </div>\n            </form>\n\n            <h2>Comments</h2>\n\n            <ul class=\"comment-container\">\n\n              <li>\n\n                <p>Bob Fossil</p>\n\n                <p>Oh I am so glad you taught me all about the big brown angry guys in the woods. With their sniffing little noses and their bad attitudes, they can sure be a menace — I was thinking of putting them all in a truck and driving them outta here. I run a zoo, you know.</p>\n\n              </li>\n\n            </ul>\n\n          </div>\n        </section>\n      </article>\n\n      <div class=\"secondary\">\n        <h2>Related</h2>\n\n        <ul>\n          <li><a href=\"#\">The trouble with Bees</a></li>\n          <li><a href=\"#\">The trouble with Otters</a></li>\n          <li><a href=\"#\">The trouble with Penguins</a></li>\n          <li><a href=\"#\">The trouble with Octopi</a></li>\n          <li><a href=\"#\">The trouble with Lemurs</a></li>\n        </ul>\n      </div>\n    </main>\n\n    <footer>\n      <p>©Copyright 2050 by nobody. All rights reversed.</p>\n    </footer>\n\n    <script src=\"main.js\"></script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/assessment-finished/main.js",
    "content": "// functionality for showing/hiding the comments section\n\nconst showHideBtn = document.querySelector('.show-hide');\nconst commentWrapper = document.querySelector('.comment-wrapper');\n\ncommentWrapper.style.display = 'none';\n\nshowHideBtn.onclick = function() {\n  let showHideText = showHideBtn.textContent;\n  if(showHideText === 'Show comments') {\n    showHideBtn.textContent = 'Hide comments';\n    commentWrapper.style.display = 'block';\n  } else {\n    showHideBtn.textContent = 'Show comments';\n    commentWrapper.style.display = 'none';\n  }\n};\n\n// functionality for adding a new comment via the comments form\n\nconst form = document.querySelector('.comment-form');\nconst nameField = document.querySelector('#name');\nconst commentField = document.querySelector('#comment');\nconst list = document.querySelector('.comment-container');\n\nform.onsubmit = function(e) {\n  e.preventDefault();\n  submitComment();\n};\n\nfunction submitComment() {\n  const listItem = document.createElement('li');\n  const namePara = document.createElement('p');\n  const commentPara = document.createElement('p');\n  const nameValue = nameField.value;\n  const commentValue = commentField.value;\n\n  namePara.textContent = nameValue;\n  commentPara.textContent = commentValue;\n\n  list.appendChild(listItem);\n  listItem.appendChild(namePara);\n  listItem.appendChild(commentPara);\n\n  nameField.value = '';\n  commentField.value = '';\n}\n"
  },
  {
    "path": "accessibility/assessment-finished/marking-guide.md",
    "content": "# Marking guide for \"Accessibility troubleshooting\"\nThe following guide outlines a marking guide for the MDN Learning Area Accessibility Topic — [Accessibility troubleshooting](https://developer.mozilla.org/en-US/docs/Learn/Accessibility/Accessibility_troubleshooting). Each subtask detailed in the assessment is listed below, along with an explanation of how many marks the task is worth, and the mark breakdown.\n\nNote: These are guidelines, not set in stone rules — you are of course free to use your judgement on mark awarding when you meet an edge case, or something that isn't clear cut.\n\nThe overall mark awarded is out of 37. Work out their final mark, and then divide by 37 and multiply by 100 to give a percentage mark. For reference, you can find a [finished version of the site](index.html) that would be awarded top marks.\n\n## Color\n\n<dl>\n<dt>The text is difficult to read because of the current color scheme. Can you do a test of the current color contrast (text/background), report the results of the test, and then fix it by changing the assigned colors?</dt>\n<dd>Two marks for this — one for checking the current text/background contrast in a checker like WebAIM's [Color Contrast Checker](http://webaim.org/resources/contrastchecker/) and reporting the results in some way, and one for updating the current color scheme to one with good contrast (i.e. passes WCAG AA in the checker).</dd>\n</dl>\n\n## Semantic HTML\n\n<dl>\n  <dt>The content is still not very accessible - report on what happens when you try to navigate it using a screenreader.</dt>\n  <dd>One mark; Your report should give some kind of indication that you can't jump between headings and use them as signposts, and you can't even tell where headings and paragraphs start and end.</dd>\n  <dt>Can you update the article text to make it easier for screenreader users to navigate?</dt>\n  <dd>Eight marks.\n  <ul>\n    <li>The line breaks (<code>&lt;br&gt;</code> tags) all need to be removed (2).</li>\n    <li>The <code>&lt;font&gt;</code> elements need to be replaced with appropriate heading elements (<code>&lt;h1&gt;</code>, <code>&lt;h2&gt;</code>, <code>&lt;h3&gt;</code>) (2).</li>\n    <li>The paragraphs need to be wrapped in paragraph elements (<code>&lt;p&gt;</code>)(2).</li>\n    <li>In the CSS file, <code>font[size=\"7\"]</code>/<code>font[size=\"6\"]</code>/<code>font[size=\"5\"]</code> need to be replaced with <code>h1</code>/<code>h2</code>/<code>h3</code>.</li>\n  </ul>\n  </dd>\n  <dt>The navigation menu part of the site (wrapped in <code>&lt;div class=\"nav\"&gt;&lt;/div&gt;</code>) could be made more accessible by putting it in a proper HTML5 semantic element. Which one should it be updated to? Make the update.</dt>\n  <dd>Three marks.\n  <ul>\n    <li>The <code>&lt;div class=\"nav\"&gt;&lt;/div&gt;</code> needs be replaced with <code>&lt;nav&gt;&lt;/nav&gt;</code></li>\n    <li>In the CSS file, instances of <code>div[class=\"nav\"]</code> need to be replaced with <code>nav</code>.</li>\n  </ul>\n  </dd>\n</dl>\n\n## The images\n\n<dl>\n  <dt>The images are currently inaccessible to screenreader users. Can you fix this?</dt>\n  <dd>Three marks. You can fix this by adding in alternative text in any suitable way; see <a href=\"https://developer.mozilla.org/en-US/docs/Learn/Accessibility/HTML#Text_alternatives\">Text alternatives</a> — describing the image in the text and perhaps also using <code>aria-labelledby</code> to link the two is good. you could also use a plain old <code>alt</code> attribute.</dd>\n</dl>\n\n## The audio player\n\n<dl>\n  <dt>The audio isn't accessible to hearing impaired (deaf) people - can you add some kind of accessible alternative for these users?</dt>\n  <dd>Two marks. Any transcript system works for this simple example - a link to a separate file, the transcript written in the same page, etc. They just need to listen to the audio file, write out the transcription, and add it to their page in some way.</dd>\n  <dt>The audio isn't accessible to those using older browsers that don't support HTML5 audio. How can you allow them to still access the audio?</dt>\n  <dd>Two marks. Adding a link to the audio into the alternative contained inside the <audio> tags is fine, or you could go further and provide some kind of Flash audio player as the alternative content.</dd>\n</dl>\n\n## The forms\n\n<dl>\n  <dt>The input element in the search form at the top could do with a label, but we don't want to add a visible text label that would potentially spoil the design and isn't really needed by sighted users. How can you add a label that is only accessible to screenreaders?</dt>\n  <dd>Two marks. You can add a descriptive label into an <code>aria-label</code> attribute on the input element. This will then be read out by screenreaders when the input is encountered.</dd>\n  <dt>The two input elements in the comment form have visible text labels, but they are not unambiguously associated with their labels — how do you achieve this? Note that you'll need to update some of the CSS rule as well.</dt>\n  <dd>Four marks. The label text should be wrapped inside <code>&lt;label&gt;</code> elements, with <code>for</code> attributes containing the ID values of the input elements they are the labels for.</dd>\n</dl>\n\n## The show/hide comment control\n\n<dl>\n  <dt>The show/hide comment control button is not current keyboard-accessible. Can you make it keyboard accessible, both in terms of focusing it, and activating it using the return key?</dt>\n  <dd>Two marks. This can be managed easily by changing the <code>&lt;div&gt;</code> element that currently marks the button up to a <code>&lt;button&gt;</code> element. Or you could use <code>tabindex</code> and JavaScript to fix the button; see <a href=\"https://developer.mozilla.org/en-US/docs/Learn/Accessibility/HTML#Building_keyboard_accessibility_back_in\">Building keyboard accessibility back in</a>. The former is a much easier method however. </dd>\n</dl>\n\n## The table\n\n<dl>\n  <dt>The data table is not currently very accessible — it is hard for screenreader users to associate data rows and columns together, and the table also has no kind of summary to make it clear what it shows. Can you add some features to your HTML to fix this problem?</dt>\n  <dd>Six marks.\n  <ul>\n    <li>They should add a suitable summary of the table in a <code>summary</code> attribute or <code>&lt;caption&gt;</code> element.\n    <li>They should turn each cell in the first row and column into headings (<code>&lt;th&gt;</code>).</li>\n    <li>They should add <code>scope=\"col\"</code> to the headings in the first row, and <code>scope=\"row\"</code> to the headings in the first column.</li>\n  </ul>\n  </dd>\n</dl>\n\n## Other considerations\n\n<dl>\n  <dt>Can you list two more ideas for improvements that would make the website more accessible?</dt>\n  <dd>Two marks for this. Anything reasonable really; the ideas we had are:\n    <ul>\n      <li>Add client-side validation to the comment form</li>\n      <li>Use media queries to make the site more usable on mobile devices.</li>\n      <li>Find a way to announce screenreader users how many comments are displayed when the show comments control button is clicked. For example, put the <code>role</code> attribute with <code>\"alert\"</code> value on the <code>h2</code> element in the comments section and update its text like so \"Comments (1 available)\".</li>\n    </ul>\n  </dd>\n</dl>\n"
  },
  {
    "path": "accessibility/assessment-finished/style.css",
    "content": "/* || General setup */\n\nhtml, body {\n  margin: 0;\n  padding: 0;\n}\n\nhtml {\n  font-size: 10px;\n  background-color: #dde;\n}\n\nbody {\n  width: 80%;\n  min-width: 1024px;\n  margin: 0 auto;\n}\n\n/* || typography */\n\nh1, h2, h3 {\n  font-family: 'Sonsie One', cursive;\n  color: #2a2a2a;\n}\n\np, input, li, table, label {\n  font-family: 'Open Sans Condensed', sans-serif;\n  color: #2a2a2a;\n}\n\nh1 {\n  font-size: 4rem;\n  text-align: center;\n  color: white;\n  text-shadow: 2px 2px 10px black;\n}\n\nh2 {\n  font-size: 3rem;\n  text-align: center;\n}\n\nh3 {\n  font-size: 2.2rem;\n}\n\np, li, table {\n  font-size: 1.6rem;\n  line-height: 1.5;\n}\n\n/* || header layout */\n\nnav, article, footer, .secondary {\n  background-color: white;\n}\n\narticle, footer, .secondary {\n  padding: 10px 30px;\n}\n\narticle {\n  margin-right: 10px;\n}\n\nnav {\n  height: 50px;\n  display: flex;\n  padding: 1% 0;\n  margin-bottom: 10px;\n}\n\nnav ul {\n  padding: 0;\n  list-style-type: none;\n  flex: 2;\n  display: flex;\n}\n\nnav li {\n  display: inline;\n  text-align: center;\n  flex: 1;\n}\n\nnav a {\n  display: inline-block;\n  font-size: 2rem;\n  text-transform: uppercase;\n  text-decoration: none;\n  color: black;\n}\n\nnav .search {\n  flex: 1;\n  display: flex;\n  align-items: center;\n  height: 100%;\n  padding: 0 2em;\n}\n\n.search input {\n  font-size: 1.6rem;\n  height: 32px;\n}\n\n.search input[type=\"search\"] {\n  flex: 3;\n}\n\n.search input[type=\"submit\"] {\n  flex: 1;\n  margin-left: 1rem;\n  background: #333;\n  border: 0;\n  color: white;\n}\n\n/* || main layout */\n\nmain {\n  display: flex;\n}\n\narticle {\n  flex: 5;\n}\n\n.secondary {\n  flex: 2;\n}\n\nfooter {\n  margin-top: 10px;\n}\n\n/* Table styling */\n\ntable {\n  width: 100%;\n  background-color: #dde;\n  border-collapse: collapse;\n}\n\nth, td {\n  padding: 10px;\n}\n\ntd {\n  text-align: center;\n}\n\nth[scope=\"col\"] {\n  border-bottom: 1px solid black;\n}\n\ntbody tr:nth-child(odd) {\n  background-color: #def;\n}\n\n/* styling content images and audio */\n\nimg, audio {\n  display: block;\n  margin: 0 auto;\n}\n\naudio {\n  width: 500px;\n}\n\n/* Comments styling */\n\n.comments {\n  background-color: #def;\n  padding: 10px;\n}\n\n.show-hide {\n  cursor: pointer;\n}\n\n.comments h2 {\n  font-size: 2rem;\n}\n\n.comments h2:nth-of-type(2) {\n  margin-bottom: 0;\n}\n\n.comment-form {\n  margin-bottom: 3rem;\n}\n\n.comment-form .flex-pair {\n  display: flex;\n  padding: 0 3rem 1rem;\n}\n\n.comment-form label {\n  align-self: center;\n  flex: 2;\n  text-align: right;\n}\n\n.comment-form input {\n  margin-left: 1rem;\n  flex: 6;\n}\n\n.comment-form input, .comment-form label, .show-hide {\n  font-size: 1.6rem;\n  height: 32px;\n}\n\n.comment-form input[type=\"submit\"], .show-hide {\n  background: #333;\n  border: 0;\n  color: white;\n}\n\n.comment-form input[type=\"submit\"] {\n  width: 30%;\n  display: block;\n  margin: 0 auto;\n}\n\n.comment-container {\n  margin-top: 0;\n}\n\n.comment-container li {\n  list-style-type: none;\n  display: flex;\n}\n\n.comment-container li p:nth-child(1) {\n  flex: 1;\n  font-weight: bold;\n}\n\n.comment-container li p:nth-child(2) {\n  flex: 5;\n}\n"
  },
  {
    "path": "accessibility/assessment-finished/transcript.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n\n    <title>Transcript</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300%7CSonsie+One\" rel=\"stylesheet\" type=\"text/css\">\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n\n  <body>\n      <h1>Audio transcript</h1>\n      <p>This isn't really an audio fact file about bears, but it is an audio file that you can transcribe.</p>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/assessment-start/assessment-files/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n\n    <title>Accessibility assessment</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300%7CSonsie+One\" rel=\"stylesheet\" type=\"text/css\">\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n\n  <body>\n    <div class=\"header\">\n      <font size=\"7\">Welcome to our wildlife website</font>\n    </div>\n\n    <div class=\"nav\">\n      <ul>\n        <li><a href=\"#\">Home</a></li>\n        <li><a href=\"#\">Our team</a></li>\n        <li><a href=\"#\">Projects</a></li>\n        <li><a href=\"#\">Blog</a></li>\n      </ul>\n\n      <form class=\"search\">\n        <input type=\"search\" name=\"q\" placeholder=\"Search query\">\n        <input type=\"submit\" value=\"Go!\">\n      </form>\n    </div>\n\n    <main>\n      <article>\n        <font size=\"6\">The trouble with Bears</font>\n        <br><br>\n        By Evan Wild\n        <br><br>\n        Tall, lumbering, angry, dangerous. The real live bears of this world are proud, independent creatures, self-serving and always on the hunt for food. Nothing like the bears you see on TV, like Baloo from renowned documentary, The Jungle Book.\n        <br><br>\n        So what are bears really like, and why does the world's media portray them with such a skewed vision? In this article we try to answer those questions, and give you a real insight into the life of the bear.\n        <br><br>\n        <font size=\"5\">Types of bear</font>\n        <br><br>\n        Bears come in two varieties — large and medium. You don't get small bears. If you have seen a small bear, then it was in fact probably a baby bear (cub) from another species.\n        <br><br>\n        Bears can also be classified in terms of their habitat — both large and medium bears are just as at home in urban areas as they are in the countryside. Different habitats encourange different behaviour however, as you'll find out below. The below table also gives you some useful facts about bears.\n        <br><br>\n        <table>\n          <thead>\n            <tr>\n              <td>Bear Type</td>\n              <td>Coat</td>\n              <td>Adult size</td>\n              <td>Habitat</td>\n              <td>Lifespan</td>\n              <td>Diet</td>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td>Wild</td>\n              <td>Brown or black</td>\n              <td>1.4 to 2.8 meters</td>\n              <td>Woods and forests</td>\n              <td>25 to 28 years</td>\n              <td>Fish, meat, plants</td>\n            </tr>\n            <tr>\n              <td>Urban</td>\n              <td>North Face</td>\n              <td>18 to 22</td>\n              <td>Condos and coffee shops</td>\n              <td>20 to 32 years</td>\n              <td>Starbucks, sushi</td>\n            </tr>\n          </tbody>\n        </table>\n\n        <font size=\"5\">Habitats and Eating habits</font>\n        <br><br>\n        Wild bears eat a variety of meat, fish, fruit, nuts, and other naturally growing ingredients. In general they will hunt for food themselves in woodland or rivers, but at a push they will track down their sustenance from farms or country houses. They tend to live in relative isolation, in caves, tents, or cottages.\n        <br><br>\n        <img src=\"media/wild-bear.jpg\">\n        <br><br>\n        Urban (gentrified) bears on the other hand have largely abandoned the old ways. They will hunt other urban creatures if necessary (including other predators like rats and foxes), but prefer to scavenge from readily available urban food outlets like dumpsters, bins, and fast food joints. When food has proven scarce, urban bears have even been known to break into people's kitchens and steal essentials like baked beans, ready meals, and microwave ovens.\n        <br><br>\n        <img src=\"media/urban-bear.jpg\">\n        <br><br>\n        Urban bears will sleep anywhere they can, from bus shelters and parks, to the toilets in McDonald's, to their own apartment.\n        <br><br>\n        <font size=\"5\">Mating rituals</font>\n        <br><br>\n        Bears are romantic creatures by nature, and will naturally look for a mate that they can spend the rest of their lives with. They will woo a potential suitor by making their dwelling look attractive — for example with cave paintings or a bed of reeds in the case of a wild bear, and mood lighting and a Michael Bublé CD in the case of an urban bear.\n        <br><br>\n        The following audio clip contains a fact file providing more details about bear mating rituals, along with samples and quotes from experts.\n        <br><br>\n        <audio controls>\n          <source src=\"media/bear.mp3\" type=\"audio/mp3\">\n          <source src=\"media/bear.ogg\" type=\"audio/ogg\">\n          <p>It looks like your browser doesn't support HTML5 audio players.</p>\n        </audio>\n\n        <aside>\n\n          <font size=\"5\">About the author</font>\n        <br><br>\n          Evan Wild is an unemployed plumber from Doncaster, who has been really \"in to\" wildlife since childhood. He once went to Chester Zoo on holiday, but got ill after eating a doner kebab.\n        <br><br>\n          He has never seen a bear, but once read a Daily Mail article about them, and thinks they sound cool.\n\n        </aside>\n        <section class=\"comments\">\n          <div class=\"show-hide\">Show comments</div>\n\n          <div class=\"comment-wrapper\">\n\n            <font size=\"6\">Add comment</font>\n\n            <form class=\"comment-form\">\n              <div class=\"flex-pair\">\n                Your name:\n                <input type=\"text\" name=\"name\" id=\"name\" placeholder=\"Enter your name\">\n              </div>\n              <div class=\"flex-pair\">\n                Your comment:\n                <input type=\"text\" name=\"comment\" id=\"comment\" placeholder=\"Enter your comment\">\n              </div>\n              <div>\n                <input type=\"submit\" value=\"Submit comment\">\n              </div>\n            </form>\n\n            <font size=\"6\">Comments</font>\n\n            <ul class=\"comment-container\">\n\n              <li>\n\n                <p>Bob Fossil</p>\n\n                <p>Oh I am so glad you taught me all about the big brown angry guys in the woods. With their sniffing little noses and their bad attitudes, they can sure be a menace — I was thinking of putting them all in a truck and driving them outta here. I run a zoo, you know.</p>\n\n              </li>\n\n            </ul>\n\n          </div>\n        </section>\n      </article>\n\n      <div class=\"secondary\">\n        <font size=\"6\">Related</font>\n\n        <ul>\n          <li><a href=\"#\">The trouble with Bees</a></li>\n          <li><a href=\"#\">The trouble with Otters</a></li>\n          <li><a href=\"#\">The trouble with Penguins</a></li>\n          <li><a href=\"#\">The trouble with Octopi</a></li>\n          <li><a href=\"#\">The trouble with Lemurs</a></li>\n        </ul>\n      </div>\n    </main>\n\n    <footer>\n      <p>©Copyright 2050 by nobody. All rights reversed.</p>\n    </footer>\n\n    <script src=\"main.js\"></script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/assessment-start/assessment-files/main.js",
    "content": "// functionality for showing/hiding the comments section\n\nconst showHideBtn = document.querySelector('.show-hide');\nconst commentWrapper = document.querySelector('.comment-wrapper');\n\ncommentWrapper.style.display = 'none';\n\nshowHideBtn.onclick = function() {\n  let showHideText = showHideBtn.textContent;\n  if(showHideText === 'Show comments') {\n    showHideBtn.textContent = 'Hide comments';\n    commentWrapper.style.display = 'block';\n  } else {\n    showHideBtn.textContent = 'Show comments';\n    commentWrapper.style.display = 'none';\n  }\n};\n\n// functionality for adding a new comment via the comments form\n\nconst form = document.querySelector('.comment-form');\nconst nameField = document.querySelector('#name');\nconst commentField = document.querySelector('#comment');\nconst list = document.querySelector('.comment-container');\n\nform.onsubmit = function(e) {\n  e.preventDefault();\n  submitComment();\n};\n\nfunction submitComment() {\n  const listItem = document.createElement('li');\n  const namePara = document.createElement('p');\n  const commentPara = document.createElement('p');\n  const nameValue = nameField.value;\n  const commentValue = commentField.value;\n\n  namePara.textContent = nameValue;\n  commentPara.textContent = commentValue;\n\n  list.appendChild(listItem);\n  listItem.appendChild(namePara);\n  listItem.appendChild(commentPara);\n\n  nameField.value = '';\n  commentField.value = '';\n}\n"
  },
  {
    "path": "accessibility/assessment-start/assessment-files/style.css",
    "content": "/* || General setup */\n\nhtml, body {\n  margin: 0;\n  padding: 0;\n}\n\nhtml {\n  font-size: 10px;\n  background-color: #dde;\n}\n\nbody {\n  width: 80%;\n  min-width: 1024px;\n  margin: 0 auto;\n}\n\n/* || typography */\n\nfont[size=\"7\"], font[size=\"6\"], font[size=\"5\"] {\n  font-family: 'Sonsie One', cursive;\n  color: #2a2a2a;\n}\n\np, input, li, table, label {\n  font-family: 'Open Sans Condensed', sans-serif;\n  color: #2a2a2a;\n}\n\nfont[size=\"7\"] {\n  font-size: 4rem;\n  text-align: center;\n  color: white;\n  text-shadow: 2px 2px 10px black;\n}\n\nfont[size=\"6\"] {\n  font-size: 3rem;\n  text-align: center;\n}\n\nfont[size=\"5\"] {\n  font-size: 2.2rem;\n}\n\np, li, table {\n  font-size: 1.6rem;\n  line-height: 1.5;\n}\n\n/* || header layout */\n\ndiv[class=\"nav\"], article, footer, .secondary {\n  background-color: green;\n}\n\narticle, footer, .secondary {\n  padding: 10px 30px;\n}\n\narticle {\n  margin-right: 10px;\n}\n\ndiv[class=\"nav\"] {\n  height: 50px;\n  background-color: ff80ff;\n  display: flex;\n  padding: 1% 0;\n  margin-bottom: 10px;\n}\n\ndiv[class=\"nav\"] ul {\n  padding: 0;\n  list-style-type: none;\n  flex: 2;\n  display: flex;\n}\n\ndiv[class=\"nav\"] li {\n  display: inline;\n  text-align: center;\n  flex: 1;\n}\n\ndiv[class=\"nav\"] a {\n  display: inline-block;\n  font-size: 2rem;\n  text-transform: uppercase;\n  text-decoration: none;\n  color: black;\n}\n\ndiv[class=\"nav\"] .search {\n  flex: 1;\n  display: flex;\n  align-items: center;\n  height: 100%;\n  padding: 0 2em;\n}\n\n.search input {\n  font-size: 1.6rem;\n  height: 32px;\n}\n\n.search input[type=\"search\"] {\n  flex: 3;\n}\n\n.search input[type=\"submit\"] {\n  flex: 1;\n  margin-left: 1rem;\n  background: #333;\n  border: 0;\n  color: white;\n}\n\n/* || main layout */\n\nmain {\n  display: flex;\n}\n\narticle {\n  flex: 5;\n}\n\n.secondary {\n  flex: 2;\n}\n\nfooter {\n  margin-top: 10px;\n}\n\n/* Table styling */\n\ntable {\n  width: 100%;\n  background-color: #dde;\n  border-collapse: collapse;\n}\n\nth, td {\n  padding: 10px;\n}\n\ntd {\n  text-align: center;\n}\n\nth[scope=\"col\"] {\n  border-bottom: 1px solid black;\n}\n\ntbody tr:nth-child(odd) {\n  background-color: #def;\n}\n\n/* styling content images and audio */\n\nimg, audio {\n  display: block;\n  margin: 0 auto;\n}\n\naudio {\n  width: 500px;\n}\n\n/* Comments styling */\n\n.comments {\n  background-color: #def;\n  padding: 10px;\n}\n\n.show-hide {\n  cursor: pointer;\n}\n\n.comments font[size=\"6\"] {\n  font-size: 2rem;\n}\n\n.comments font[size=\"6\"]:nth-of-type(2) {\n  margin-bottom: 0;\n}\n\n.comment-form {\n  margin-bottom: 3rem;\n}\n\n.comment-form .flex-pair {\n  display: flex;\n  padding: 0 3rem 1rem;\n}\n\n.comment-form label {\n  align-self: center;\n  flex: 2;\n  text-align: right;\n}\n\n.comment-form input {\n  margin-left: 1rem;\n  flex: 6;\n}\n\n.show-hide {\n  text-align: center;\n  width: 150px;\n}\n\n.comment-form input, .comment-form label, .show-hide {\n  font-size: 1.6rem;\n  line-height: 32px;\n}\n\n.comment-form input[type=\"submit\"], .show-hide {\n  background: #333;\n  border: 0;\n  color: white;\n}\n\n.comment-form input[type=\"submit\"] {\n  width: 30%;\n  display: block;\n  margin: 0 auto;\n}\n\n.comment-container {\n  margin-top: 0;\n}\n\n.comment-container li {\n  list-style-type: none;\n  display: flex;\n}\n\n.comment-container li p:nth-child(1) {\n  flex: 1;\n  font-weight: bold;\n}\n\n.comment-container li p:nth-child(2) {\n  flex: 5;\n}\n"
  },
  {
    "path": "accessibility/assessment-start/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n\n    <title>Accessibility assessment</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300%7CSonsie+One\" rel=\"stylesheet\" type=\"text/css\">\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n\n  <body>\n    <div class=\"header\">\n      <font size=\"7\">Welcome to our wildlife website</font>\n    </div>\n\n    <div class=\"nav\">\n      <ul>\n        <li><a href=\"#\">Home</a></li>\n        <li><a href=\"#\">Our team</a></li>\n        <li><a href=\"#\">Projects</a></li>\n        <li><a href=\"#\">Blog</a></li>\n      </ul>\n\n      <form class=\"search\">\n        <input type=\"search\" name=\"q\" placeholder=\"Search query\">\n        <input type=\"submit\" value=\"Go!\">\n      </form>\n    </div>\n\n    <main>\n      <article>\n        <font size=\"6\">The trouble with Bears</font>\n        <br><br>\n        By Evan Wild\n        <br><br>\n        Tall, lumbering, angry, dangerous. The real live bears of this world are proud, independent creatures, self-serving and always on the hunt for food. Nothing like the bears you see on TV, like Baloo from renowned documentary, The Jungle Book.\n        <br><br>\n        So what are bears really like, and why does the world's media portray them with such a skewed vision? In this article we try to answer those questions, and give you a real insight into the life of the bear.\n        <br><br>\n        <font size=\"5\">Types of bear</font>\n        <br><br>\n        Bears come in two varieties — large and medium. You don't get small bears. If you have seen a small bear, then it was in fact probably a baby bear (cub) from another species.\n        <br><br>\n        Bears can also be classified in terms of their habitat — both large and medium bears are just as at home in urban areas as they are in the countryside. Different habitats encourange different behaviour however, as you'll find out below. The below table also gives you some useful facts about bears.\n        <br><br>\n        <table>\n          <thead>\n            <tr>\n              <td>Bear Type</td>\n              <td>Coat</td>\n              <td>Adult size</td>\n              <td>Habitat</td>\n              <td>Lifespan</td>\n              <td>Diet</td>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td>Wild</td>\n              <td>Brown or black</td>\n              <td>1.4 to 2.8 meters</td>\n              <td>Woods and forests</td>\n              <td>25 to 28 years</td>\n              <td>Fish, meat, plants</td>\n            </tr>\n            <tr>\n              <td>Urban</td>\n              <td>North Face</td>\n              <td>18 to 22</td>\n              <td>Condos and coffee shops</td>\n              <td>20 to 32 years</td>\n              <td>Starbucks, sushi</td>\n            </tr>\n          </tbody>\n        </table>\n\n        <font size=\"5\">Habitats and Eating habits</font>\n        <br><br>\n        Wild bears eat a variety of meat, fish, fruit, nuts, and other naturally growing ingredients. In general they will hunt for food themselves in woodland or rivers, but at a push they will track down their sustenance from farms or country houses. They tend to live in relative isolation, in caves, tents, or cottages.\n        <br><br>\n        <img src=\"media/wild-bear.jpg\">\n        <br><br>\n        Urban (gentrified) bears on the other hand have largely abandoned the old ways. They will hunt other urban creatures if necessary (including other predators like rats and foxes), but prefer to scavenge from readily available urban food outlets like dumpsters, bins, and fast food joints. When food has proven scarce, urban bears have even been known to break into people's kitchens and steal essentials like baked beans, ready meals, and microwave ovens.\n        <br><br>\n        <img src=\"media/urban-bear.jpg\">\n        <br><br>\n        Urban bears will sleep anywhere they can, from bus shelters and parks, to the toilets in McDonald's, to their own apartment.\n        <br><br>\n        <font size=\"5\">Mating rituals</font>\n        <br><br>\n        Bears are romantic creatures by nature, and will naturally look for a mate that they can spend the rest of their lives with. They will woo a potential suitor by making their dwelling look attractive — for example with cave paintings or a bed of reeds in the case of a wild bear, and mood lighting and a Michael Bublé CD in the case of an urban bear.\n        <br><br>\n        The following audio clip contains a fact file providing more details about bear mating rituals, along with samples and quotes from experts.\n        <br><br>\n        <audio controls>\n          <source src=\"media/bear.mp3\" type=\"audio/mp3\">\n          <source src=\"media/bear.ogg\" type=\"audio/ogg\">\n          <p>It looks like your browser doesn't support HTML5 audio players.</p>\n        </audio>\n\n        <aside>\n\n          <font size=\"5\">About the author</font>\n        <br><br>\n          Evan Wild is an unemployed plumber from Doncaster, who has been really \"in to\" wildlife since childhood. He once went to Chester Zoo on holiday, but got ill after eating a doner kebab.\n        <br><br>\n          He has never seen a bear, but once read a Daily Mail article about them, and thinks they sound cool.\n\n        </aside>\n        <section class=\"comments\">\n          <div class=\"show-hide\">Show comments</div>\n\n          <div class=\"comment-wrapper\">\n\n            <font size=\"6\">Add comment</font>\n\n            <form class=\"comment-form\">\n              <div class=\"flex-pair\">\n                Your name:\n                <input type=\"text\" name=\"name\" id=\"name\" placeholder=\"Enter your name\">\n              </div>\n              <div class=\"flex-pair\">\n                Your comment:\n                <input type=\"text\" name=\"comment\" id=\"comment\" placeholder=\"Enter your comment\">\n              </div>\n              <div>\n                <input type=\"submit\" value=\"Submit comment\">\n              </div>\n            </form>\n\n            <font size=\"6\">Comments</font>\n\n            <ul class=\"comment-container\">\n\n              <li>\n\n                <p>Bob Fossil</p>\n\n                <p>Oh I am so glad you taught me all about the big brown angry guys in the woods. With their sniffing little noses and their bad attitudes, they can sure be a menace — I was thinking of putting them all in a truck and driving them outta here. I run a zoo, you know.</p>\n\n              </li>\n\n            </ul>\n\n          </div>\n        </section>\n      </article>\n\n      <div class=\"secondary\">\n        <font size=\"6\">Related</font>\n\n        <ul>\n          <li><a href=\"#\">The trouble with Bees</a></li>\n          <li><a href=\"#\">The trouble with Otters</a></li>\n          <li><a href=\"#\">The trouble with Penguins</a></li>\n          <li><a href=\"#\">The trouble with Octopi</a></li>\n          <li><a href=\"#\">The trouble with Lemurs</a></li>\n        </ul>\n      </div>\n    </main>\n\n    <footer>\n      <p>©Copyright 2050 by nobody. All rights reversed.</p>\n    </footer>\n\n    <script src=\"main.js\"></script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/assessment-start/main.js",
    "content": "// functionality for showing/hiding the comments section\n\nconst showHideBtn = document.querySelector('.show-hide');\nconst commentWrapper = document.querySelector('.comment-wrapper');\n\ncommentWrapper.style.display = 'none';\n\nshowHideBtn.onclick = function() {\n  let showHideText = showHideBtn.textContent;\n  if(showHideText === 'Show comments') {\n    showHideBtn.textContent = 'Hide comments';\n    commentWrapper.style.display = 'block';\n  } else {\n    showHideBtn.textContent = 'Show comments';\n    commentWrapper.style.display = 'none';\n  }\n};\n\n// functionality for adding a new comment via the comments form\n\nconst form = document.querySelector('.comment-form');\nconst nameField = document.querySelector('#name');\nconst commentField = document.querySelector('#comment');\nconst list = document.querySelector('.comment-container');\n\nform.onsubmit = function(e) {\n  e.preventDefault();\n  submitComment();\n};\n\nfunction submitComment() {\n  const listItem = document.createElement('li');\n  const namePara = document.createElement('p');\n  const commentPara = document.createElement('p');\n  const nameValue = nameField.value;\n  const commentValue = commentField.value;\n\n  namePara.textContent = nameValue;\n  commentPara.textContent = commentValue;\n\n  list.appendChild(listItem);\n  listItem.appendChild(namePara);\n  listItem.appendChild(commentPara);\n\n  nameField.value = '';\n  commentField.value = '';\n}\n"
  },
  {
    "path": "accessibility/assessment-start/style.css",
    "content": "/* || General setup */\n\nhtml, body {\n  margin: 0;\n  padding: 0;\n}\n\nhtml {\n  font-size: 10px;\n  background-color: #dde;\n}\n\nbody {\n  width: 80%;\n  min-width: 1024px;\n  margin: 0 auto;\n}\n\n/* || typography */\n\nfont[size=\"7\"], font[size=\"6\"], font[size=\"5\"] {\n  font-family: 'Sonsie One', cursive;\n  color: #2a2a2a;\n}\n\np, input, li, table, label {\n  font-family: 'Open Sans Condensed', sans-serif;\n  color: #2a2a2a;\n}\n\nfont[size=\"7\"] {\n  font-size: 4rem;\n  text-align: center;\n  color: white;\n  text-shadow: 2px 2px 10px black;\n}\n\nfont[size=\"6\"] {\n  font-size: 3rem;\n  text-align: center;\n}\n\nfont[size=\"5\"] {\n  font-size: 2.2rem;\n}\n\np, li, table {\n  font-size: 1.6rem;\n  line-height: 1.5;\n}\n\n/* || header layout */\n\ndiv[class=\"nav\"], article, footer, .secondary {\n  background-color: green;\n}\n\narticle, footer, .secondary {\n  padding: 10px 30px;\n}\n\narticle {\n  margin-right: 10px;\n}\n\ndiv[class=\"nav\"] {\n  height: 50px;\n  background-color: ff80ff;\n  display: flex;\n  padding: 1% 0;\n  margin-bottom: 10px;\n}\n\ndiv[class=\"nav\"] ul {\n  padding: 0;\n  list-style-type: none;\n  flex: 2;\n  display: flex;\n}\n\ndiv[class=\"nav\"] li {\n  display: inline;\n  text-align: center;\n  flex: 1;\n}\n\ndiv[class=\"nav\"] a {\n  display: inline-block;\n  font-size: 2rem;\n  text-transform: uppercase;\n  text-decoration: none;\n  color: black;\n}\n\ndiv[class=\"nav\"] .search {\n  flex: 1;\n  display: flex;\n  align-items: center;\n  height: 100%;\n  padding: 0 2em;\n}\n\n.search input {\n  font-size: 1.6rem;\n  height: 32px;\n}\n\n.search input[type=\"search\"] {\n  flex: 3;\n}\n\n.search input[type=\"submit\"] {\n  flex: 1;\n  margin-left: 1rem;\n  background: #333;\n  border: 0;\n  color: white;\n}\n\n/* || main layout */\n\nmain {\n  display: flex;\n}\n\narticle {\n  flex: 5;\n}\n\n.secondary {\n  flex: 2;\n}\n\nfooter {\n  margin-top: 10px;\n}\n\n/* Table styling */\n\ntable {\n  width: 100%;\n  background-color: #dde;\n  border-collapse: collapse;\n}\n\nth, td {\n  padding: 10px;\n}\n\ntd {\n  text-align: center;\n}\n\nth[scope=\"col\"] {\n  border-bottom: 1px solid black;\n}\n\ntbody tr:nth-child(odd) {\n  background-color: #def;\n}\n\n/* styling content images and audio */\n\nimg, audio {\n  display: block;\n  margin: 0 auto;\n}\n\naudio {\n  width: 500px;\n}\n\n/* Comments styling */\n\n.comments {\n  background-color: #def;\n  padding: 10px;\n}\n\n.show-hide {\n  cursor: pointer;\n}\n\n.comments font[size=\"6\"] {\n  font-size: 2rem;\n}\n\n.comments font[size=\"6\"]:nth-of-type(2) {\n  margin-bottom: 0;\n}\n\n.comment-form {\n  margin-bottom: 3rem;\n}\n\n.comment-form .flex-pair {\n  display: flex;\n  padding: 0 3rem 1rem;\n}\n\n.comment-form label {\n  align-self: center;\n  flex: 2;\n  text-align: right;\n}\n\n.comment-form input {\n  margin-left: 1rem;\n  flex: 6;\n}\n\n.show-hide {\n  text-align: center;\n  width: 150px;\n}\n\n.comment-form input, .comment-form label, .show-hide {\n  font-size: 1.6rem;\n  line-height: 32px;\n}\n\n.comment-form input[type=\"submit\"], .show-hide {\n  background: #333;\n  border: 0;\n  color: white;\n}\n\n.comment-form input[type=\"submit\"] {\n  width: 30%;\n  display: block;\n  margin: 0 auto;\n}\n\n.comment-container {\n  margin-top: 0;\n}\n\n.comment-container li {\n  list-style-type: none;\n  display: flex;\n}\n\n.comment-container li p:nth-child(1) {\n  flex: 1;\n  font-weight: bold;\n}\n\n.comment-container li p:nth-child(2) {\n  flex: 5;\n}\n"
  },
  {
    "path": "accessibility/css/form-css.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Form CSS example</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      form {\n        background: #eee;\n        border-radius: 20px;\n        box-shadow: 1px 1px 1px black;\n        padding: 20px;\n        width: 300px;\n      }\n\n      div:first-of-type label {\n        margin-bottom: 20px;\n      }\n\n      label {\n        width: 130px;\n        float: left;\n        text-align: right;\n        padding: 4px;\n      }\n\n      input {\n        width: 130px;\n        float: right;\n      }\n\n      label, input {\n        font-size: 1em;\n        line-height: 1.5;\n      }\n\n      div {\n        clear: both;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Form CSS example</h1>\n    <form>\n      <div>\n        <label for=\"name\">Enter your name:</label>\n        <input type=\"text\" name=\"name\" id=\"name\">\n      </div>\n      <div>\n        <label for=\"age\">Enter your age:</label>\n        <input type=\"text\" name=\"age\" id=\"age\">\n      </div>\n      <div></div>\n    </form>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/css/form-validation.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Form validation example</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      form {\n        background: #eee;\n        border-radius: 20px;\n        box-shadow: 1px 1px 1px black;\n        padding: 20px;\n        width: 300px;\n      }\n\n      label {\n        width: 130px;\n        float: left;\n        text-align: right;\n        padding: 4px;\n        margin-bottom: 20px;\n      }\n\n      input {\n        width: 130px;\n        float: right;\n      }\n\n      label, input {\n        font-size: 1em;\n        line-height: 1.5;\n      }\n\n      div {\n        clear: both;\n      }\n\n      .errors {\n        background: yellow;\n        border-radius: 20px;\n        box-shadow: 1px 1px 1px black;\n        padding: 20px;\n        width: 300px;\n        position: absolute;\n        left: 360px;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Form validation example</h1>\n    <div class=\"errors\" role=\"alert\" aria-relevant=\"all\">\n      <ul>\n\n      </ul>\n\n    </div>\n    <form>\n      <div>\n        <label for=\"name\">Enter your name:</label>\n        <input type=\"text\" name=\"name\" id=\"name\">\n      </div>\n      <div>\n        <label for=\"age\">Enter your age:</label>\n        <input type=\"number\" name=\"age\" id=\"age\">\n      </div>\n      <div>\n        <input type=\"submit\">\n      </div>\n      <div></div>\n    </form>\n    <script src=\"validation.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/css/mouse-and-keyboard-events.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Mouse and keyboard events example</title>\n    <style>\n      .thumb {\n        width: 100px;\n      }\n\n      .zoom {\n        position: absolute;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Mouse and keyboard events example</h1>\n\n    <img class=\"thumb\" src=\"pirate.jpg\" tabindex=\"0\" alt=\"A lego pirate figure with a cutlass, pistol, tricornered hat, peg leg, long hair and beard.\">\n    <script>\n      const imgThumb = document.querySelector('.thumb');\n\n      imgThumb.onmouseover = showImg;\n      imgThumb.onmouseout = hideImg;\n\n      imgThumb.onfocus = showImg;\n      imgThumb.onblur = hideImg;\n\n      function showImg() {\n        const imgZoom = document.createElement('img');\n        imgZoom.setAttribute('class','zoom');\n        imgZoom.setAttribute('src',imgThumb.getAttribute('src'));\n\n        let widthOffset = imgThumb.x + imgThumb.width + 10;\n        imgZoom.style.left = widthOffset + 'px';\n        let heightOffset = imgThumb.y;\n        imgZoom.style.top = heightOffset + 'px';\n\n        document.body.appendChild(imgZoom);\n      }\n\n      function hideImg() {\n        const imgZoom = document.querySelector('.zoom');\n        document.body.removeChild(imgZoom);\n      }\n\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/css/table-css.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Table CSS example</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      table {\n        width: 600px;\n        border-collapse: collapse;\n        border: 1px solid black;\n        border-top: 3px solid black;\n        border-bottom: 3px solid black;\n      }\n\n      th,td {\n        padding: 10px;\n      }\n\n      td {\n        text-align: center;\n      }\n\n      th[scope=\"col\"] {\n        background: #ccc;\n      }\n\n      tr:nth-child(even) {\n        background: #eee;\n      }\n\n      tr:nth-child(odd) {\n        background: #ddd;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Table CSS example</h1>\n    <table>\n      <tr>\n        <th scope=\"col\">Name</th>\n        <th scope=\"col\">Age</th>\n        <th scope=\"col\">Gender</th>\n      </tr>\n      <tr>\n        <th scope=\"row\">Gabriel</th>\n        <td>13</td>\n        <td>Male</td>\n      </tr>\n      <tr>\n        <th scope=\"row\">Elva</th>\n        <td>8</td>\n        <td>Female</td>\n      </tr>\n      <tr>\n        <th scope=\"row\">Freida</th>\n        <td>5</td>\n        <td>Female</td>\n      </tr>\n    </table>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/css/validation.js",
    "content": "const inputs = document.querySelectorAll('input');\nconst labels = document.querySelectorAll('label');\nconst form = document.querySelector('form');\n\nlet formItems = [];\n\nconst errorField = document.querySelector('.errors');\nconst errorList = document.querySelector('.errors ul');\n\nfor(let i = 0; i < inputs.length-1; i++) {\n  let obj = {};\n  obj.label = labels[i];\n  obj.input = inputs[i];\n  formItems.push(obj);\n}\n\nerrorField.style.left = '-100%';\n\nform.onsubmit = validate;\n\nfunction validate(e) {\n  errorList.innerHTML = '';\n  for(let i = 0; i < formItems.length; i++) {\n    let testItem = formItems[i];\n    if(testItem.input.value === '') {\n      errorField.style.left = '360px';\n      createLink(testItem);\n    }\n  }\n\n  if(errorList.innerHTML !== '') {\n    e.preventDefault();\n  }\n}\n\nfunction createLink(testItem) {\n  const listItem = document.createElement('li');\n  const anchor = document.createElement('a');\n  anchor.textContent = testItem.input.name + ' field is empty: fill in your ' + testItem.input.name + '.';\n  anchor.href = '#' + testItem.input.name;\n  anchor.onclick = function() {\n    testItem.input.focus();\n  };\n  listItem.appendChild(anchor);\n  errorList.appendChild(listItem);\n}\n"
  },
  {
    "path": "accessibility/html/accessible-image.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Accessible image example</title>\n    <style>\n      img {\n        display: block;\n        margin: 3em;\n      }\n    </style>\n  </head>\n  <body>\n\n    <h1>Images</h1>\n\n    <img src=\"dinosaur.png\">\n\n    <img src=\"dinosaur.png\"\n         alt=\"A red Tyrannosaurus Rex: A two legged dinosaur standing upright like a human, with small arms, and a large head with lots of sharp teeth.\">\n\n    <img src=\"dinosaur.png\"\n         alt=\"A red Tyrannosaurus Rex: A two legged dinosaur standing upright like a human, with small arms, and a large head with lots of sharp teeth.\"\n         title=\"The Mozilla red dinosaur\">\n\n    <img src=\"dinosaur.png\" aria-labelledby=\"dino-label\">\n\n    <p id=\"dino-label\">The Mozilla red Tyrannosaurus Rex: A two legged dinosaur standing upright like a human, with small arms, and a large head with lots of sharp teeth.</p>\n\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/html/bad-form.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Bad form example</title>\n  </head>\n  <body>\n    <h1>Bad form</h1>\n    <form>\n      <div>\n        <p>Enter your name:</p>\n        <input type=\"text\" name=\"name\">\n      </div>\n      <div>\n        <p>Enter your age:</p>\n        <input type=\"text\" name=\"age\">\n      </div>\n    </form>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/html/bad-links.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Bad links example</title>\n  </head>\n  <body>\n    <h1>Bad links</h1>\n\n    <h2>Further information</h2>\n    <ul>\n      <li>For more information on whales, <a href=\"whales.html\">click here</a>.</li>\n      <li>For more information on squirrels, <a href=\"squirrels.html\">click here</a>.</li>\n      <li>For more information on bees, <a href=\"bees.html\">click here</a>.</li>\n    </ul>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/html/bad-semantics.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Bad semantics example</title>\n  </head>\n  <body>\n    <span style=\"font-size: 3rem\">My heading</span>\n    <br><br>\n    Prow scuttle parrel provost Sail ho shrouds spirits boom mizzenmast yardarm. Pinnace holystone mizzenmast quarter crow's nest nipperkin grog yardarm hempen halter furl. Swab barque interloper chantey doubloon starboard grog black jack gangway rutters. Deadlights jack lad schooner scallywag dance the hempen jig carouser broadside cable strike colors. Bring a spring upon her cable holystone blow the man down spanker Shiver me timbers to go on account lookout wherry doubloon chase. Belay yo-ho-ho keelhaul squiffy black spot yardarm spyglass sheet transom heave to.\n    <br><br>\n    Trysail Sail ho Corsair red ensign hulk smartly boom jib rum gangway. Case shot Shiver me timbers gangplank crack Jenny's tea cup ballast Blimey lee snow crow's nest. Fluke jib scourge of the seven seas boatswain schooner gaff booty Jack Tar transom spirits. Crack Jennys tea cup Sail ho killick transom trysail Chain Shot. Measured fer yer chains lateen sail Davy Jones' Locker prow wench weigh anchor. Port me hang the jib Davy Jones' Locker skysail pirate. Sail ho run a shot across the bow fluke belaying pin boom carouser. Chase guns broadside Corsair mizzen provost Admiral of the Black. Red ensign list brigantine line booty hands. Booty topgallant grapple coffer pinnace fire ship.\n    <br><br>\n    <span style=\"font-size: 2.5rem\">My subheading</span>\n    <br><br>\n    Yard Pirate Round hearties Sail ho log salmagundi. Ye scuttle smartly Jack Tar man-of-war measured fer yer chains. Shrouds sloop transom quarter wench case shot. Hempen halter Cat o'nine tails red ensign strike colors lugsail hogshead. Barbary Coast parrel bilge ho aft gibbet. Tack red ensign crimp yo-ho-ho Buccaneer gaff. Keel careen scuppers port hands reef sails. Hands square-rigged draft lugsail heave to bounty. Clap of thunder scuppers trysail cable yo-ho-ho coxswain. Jury mast cable mizzenmast hail-shot keelhaul execution dock. Black jack ho shrouds bilge water avast hardtack. Clipper deadlights brigantine measured fer yer chains poop deck Blimey. Topsail Arr yo-ho-ho pillage bucko handsomely. Draft pinnace holystone Cat o'nine tails Letter of Marque loaded to the gunwalls.\n    <br><br>\n    <span style=\"font-size: 2.5rem\">My 2nd subheading</span>\n    <br><br>\n    Topgallant American Main coxswain poop deck sloop come about. Piracy hail-shot handsomely Spanish Main flogging interloper. Run a rig lee yo-ho-ho gangplank Pieces of Eight gabion. Sloop Spanish Main reef capstan deadlights rope's end. Six pounders red ensign mizzenmast mizzen chase guns topmast. Broadside fore splice the main brace heave down Chain Shot bounty. Poop deck ballast Jack Tar pressgang jack walk the plank.\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/html/bad-table.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Bad table example</title>\n  </head>\n  <body>\n    <h1>Bad table</h1>\n    <table>\n      <tr>\n        <td>Name</td>\n        <td>Age</td>\n        <td>Gender</td>\n      </tr>\n      <tr>\n        <td>Gabriel</td>\n        <td>13</td>\n        <td>Male</td>\n      </tr>\n      <tr>\n        <td>Elva</td>\n        <td>8</td>\n        <td>Female</td>\n      </tr>\n      <tr>\n        <td>Freida</td>\n        <td>5</td>\n        <td>Female</td>\n      </tr>\n    </table>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/html/dino-info.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Dinosaur longdesc</title>\n  </head>\n  <body>\n\n      <p>A red Tyrannosaurus Rex: A two legged dinosaur standing upright like a human, with small arms, and a large head with lots of sharp teeth.</p>\n\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/html/good-form.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Good form example</title>\n  </head>\n  <body>\n    <h1>Good form</h1>\n    <form>\n      <div>\n        <label for=\"name\">Enter your name:</label>\n        <input type=\"text\" name=\"name\" id=\"name\">\n      </div>\n      <div>\n        <label for=\"age\">Enter your age:</label>\n        <input type=\"text\" name=\"age\" id=\"age\">\n      </div>\n    </form>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/html/good-links.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Good links example</title>\n  </head>\n  <body>\n    <h1>Good links</h1>\n\n    <h2>Further information</h2>\n    <ul>\n      <li><a href=\"whales.html\">Further information on Whales</a>.</li>\n      <li><a href=\"squirrels.html\">Further information on Squirrels</a>.</li>\n      <li><a href=\"bees.html\">Further information on Bees</a>.</li>\n    </ul>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/html/good-semantics.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Good semantics example</title>\n  </head>\n  <body>\n    <h1>My heading</h1>\n\n    <p>Prow scuttle parrel provost Sail ho shrouds spirits boom mizzenmast yardarm. Pinnace holystone mizzenmast quarter crow's nest nipperkin grog yardarm hempen halter furl. Swab barque interloper chantey doubloon starboard grog black jack gangway rutters. Deadlights jack lad schooner scallywag dance the hempen jig carouser broadside cable strike colors. Bring a spring upon her cable holystone blow the man down spanker Shiver me timbers to go on account lookout wherry doubloon chase. Belay yo-ho-ho keelhaul squiffy black spot yardarm spyglass sheet transom heave to.</p>\n\n    <p>Trysail Sail ho Corsair red ensign hulk smartly boom jib rum gangway. Case shot Shiver me timbers gangplank crack Jennys tea cup ballast Blimey lee snow crow's nest rutters. Fluke jib scourge of the seven seas boatswain schooner gaff booty Jack Tar transom spirits. Crack Jennys tea cup Sail ho killick transom trysail Chain Shot. Measured fer yer chains lateen sail Davy Jones' Locker prow wench weigh anchor. Port me hang the jib Davy Jones' Locker skysail pirate. Sail ho run a shot across the bow fluke belaying pin boom carouser. Chase guns broadside Corsair mizzen provost Admiral of the Black. Red ensign list brigantine line booty hands. Booty topgallant grapple coffer pinnace fire ship.</p>\n\n    <h2>My subheading</h2>\n\n    <p>Yard Pirate Round hearties Sail ho log salmagundi. Ye scuttle smartly Jack Tar man-of-war measured fer yer chains. Shrouds sloop transom quarter wench case shot. Hempen halter Cat o'nine tails red ensign strike colors lugsail hogshead. Barbary Coast parrel bilge ho aft gibbet. Tack red ensign crimp yo-ho-ho Buccaneer gaff. Keel careen scuppers port hands reef sails. Hands square-rigged draft lugsail heave to bounty. Clap of thunder scuppers trysail cable yo-ho-ho coxswain. Jury mast cable mizzenmast hail-shot keelhaul execution dock. Black jack ho shrouds bilge water avast hardtack. Clipper deadlights brigantine measured fer yer chains poop deck Blimey. Topsail Arr yo-ho-ho pillage bucko handsomely. Draft pinnace holystone Cat o'nine tails Letter of Marque loaded to the gunwalls. </p>\n\n    <h2>My 2nd subheading</h2>\n\n    <p>Topgallant American Main coxswain poop deck sloop come about. Piracy hail-shot handsomely Spanish Main flogging interloper. Run a rig lee yo-ho-ho gangplank Pieces of Eight gabion. Sloop Spanish Main reef capstan deadlights rope's end. Six pounders red ensign mizzenmast mizzen chase guns topmast. Broadside fore splice the main brace heave down Chain Shot bounty. Poop deck ballast Jack Tar pressgang jack walk the plank.</p>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/html/native-keyboard-accessibility.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Native keyboard accessibility</title>\n    <style>\n      input {\n        margin-bottom: 10px;\n      }\n\n      button {\n        margin-right: 10px;\n      }\n\n      a:hover, input:hover, button:hover, select:hover,\n      a:focus, input:focus, button:focus, select:focus {\n        font-weight: bold;\n      }\n    </style>\n  </head>\n  <body>\n\n    <h1>Links</h1>\n\n    <p>This is a link to <a href=\"https://www.mozilla.org\">Mozilla</a>.</p>\n\n    <p>Another link, to the <a href=\"https://developer.mozilla.org\">Mozilla Developer Network</a>.</p>\n\n    <h2>Buttons</h2>\n\n    <p>\n      <button data-message=\"This is from the first button\">Click me!</button>\n      <button data-message=\"This is from the second button\">Click me too!</button>\n      <button data-message=\"This is from the third button\">And me!</button>\n    </p>\n\n    <h2>Form</h2>\n\n    <form>\n      <div>\n        <label for=\"name\">Fill in your name:</label>\n        <input type=\"text\" id=\"name\" name=\"name\">\n      </div>\n      <div>\n        <label for=\"age\">Enter your age:</label>\n        <input type=\"text\" id=\"age\" name=\"age\">\n      </div>\n      <div>\n        <label for=\"mood\">Choose your mood:</label>\n        <select id=\"mood\" name=\"mood\">\n          <option>Happy</option>\n          <option>Sad</option>\n          <option>Angry</option>\n          <option>Worried</option>\n        </select>\n      </div>\n    </form>\n\n    <script>\n      const buttons = document.querySelectorAll('button');\n\n      for(let i = 0; i < buttons.length; i++) {\n        addHandler(buttons[i]);\n      }\n\n      function addHandler(button) {\n        button.addEventListener('click', function(e) {\n          let message = e.target.getAttribute('data-message');\n          alert(message);\n        })\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/html/style.css",
    "content": "/* || General setup */\n\nhtml, body {\n  margin: 0;\n  padding: 0;\n}\n\nhtml {\n  font-size: 10px;\n}\n\nbody {\n  width: 1200px;\n  margin: 0 auto;\n}\n\ntable {\n  border-collapse: collapse;\n}\n\n/* || typography */\n\nh1, h2, h3 {\n  font-family: 'Sonsie One', cursive;\n  color: #2a2a2a;\n}\n\np, input, li, a {\n  font-family: 'Open Sans Condensed', sans-serif;\n  color: #2a2a2a;\n}\n\nh1 {\n  font-size: 4rem;\n  color: white;\n  text-shadow: 2px 2px 10px black;\n}\n\nh2 {\n  font-size: 3rem;\n}\n\nh3 {\n  font-size: 2.2rem;\n}\n\np, li, a {\n  font-size: 1.6rem;\n  line-height: 1.5;\n}\n\n/* || header layout */\n\n#main td, #aside td, #footer td {\n  padding: 10px;\n}\n\n#content {\n  margin-right: 10px;\n}\n\n#nav {\n  height: 50px;\n}\n\n#nav td {\n  padding: 20px;\n}\n\n#nav a {\n  display: block;\n  font-size: 2rem;\n  text-transform: uppercase;\n  text-align: center;\n  text-decoration: none;\n}\n\n\ninput {\n  font-size: 1.6rem;\n  height: 32px;\n  width: 100%;\n}\n\nbutton {\n  width: 100%;\n  height: 32px;\n  background: #333;\n  border: 0;\n  color: white;\n}\n"
  },
  {
    "path": "accessibility/html/table-layout.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n\n    <title>My page title</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300%7CSonsie+One\" rel=\"stylesheet\" type=\"text/css\">\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n\n  <body width=\"1200\" bgcolor=\"#a9a9a9\">\n\n    <table width=\"1200\">\n      <!-- main heading row -->\n      <tr id=\"heading\">\n        <td colspan=\"6\">\n\n          <h1 align=\"center\">Header</h1>\n\n        </td>\n      </tr>\n      <!-- nav menu row  -->\n      <tr id=\"nav\" bgcolor=\"#ffffff\">\n        <td width=\"200\">\n          <a href=\"#\" align=\"center\">Home</a>\n        </td>\n        <td width=\"200\">\n          <a href=\"#\" align=\"center\">Our team</a>\n        </td>\n        <td width=\"200\">\n          <a href=\"#\" align=\"center\">Projects</a>\n        </td>\n        <td width=\"200\">\n          <a href=\"#\" align=\"center\">Contact</a>\n        </td>\n        <td width=\"300\">\n          <form width=\"300\">\n            <input type=\"search\" name=\"q\" placeholder=\"Search query\" width=\"300\">\n          </form>\n        </td>\n        <td width=\"100\">\n          <button width=\"100\">Go!</button>\n        </td>\n      </tr>\n      <!-- spacer row -->\n      <tr id=\"spacer\" height=\"10\">\n        <td>\n\n        </td>\n      </tr>\n      <!-- main content and aside row -->\n      <tr id=\"main\">\n        <td id=\"content\" colspan=\"4\" bgcolor=\"#ffffff\">\n\n          <h2 align=\"center\">Article heading</h2>\n\n          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Donec a diam lectus. Set sit amet ipsum mauris. Maecenas congue ligula as quam viverra nec consectetur ant hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur.</p>\n\n          <h3>subsection</h3>\n\n          <p>Donec ut librero sed accu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor.</p>\n\n          <p>Pelientesque auctor nisi id magna consequat sagittis. Curabitur dapibus, enim sit amet elit pharetra tincidunt feugiat nist imperdiet. Ut convallis libero in urna ultrices accumsan. Donec sed odio eros.</p>\n\n          <h3>Another subsection</h3>\n\n          <p>Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus. Cum soclis natoque penatibus et manis dis parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisi at sem facilisis semper ac in est.</p>\n\n          <p>Vivamus fermentum semper porta. Nunc diam velit, adipscing ut tristique vitae sagittis vel odio. Maecenas convallis ullamcorper ultricied. Curabitur ornare, ligula semper consectetur sagittis, nisi diam iaculis velit, is fringille sem nunc vet mi.</p>\n\n        </td>\n        <td id=\"aside\" colspan=\"2\" bgcolor=\"#ff80ff\" valign=\"top\">\n          <h2>Related</h2>\n\n          <ul>\n            <li><a href=\"#\">Oh I do like to be beside the seaside</a></li>\n            <li><a href=\"#\">Oh I do like to be beside the sea</a></li>\n            <li><a href=\"#\">Although in the North of England</a></li>\n            <li><a href=\"#\">It never stops raining</a></li>\n            <li><a href=\"#\">Oh well...</a></li>\n          </ul>\n\n        </td>\n      </tr>\n      <!-- spacer row -->\n      <tr id=\"spacer\" height=\"10\">\n        <td>\n\n        </td>\n      </tr>\n      <!-- footer row -->\n      <tr id=\"footer\" bgcolor=\"#ffffff\">\n        <td colspan=\"6\">\n          <p>©Copyright 2050 by nobody. All rights reversed.</p>\n        </td>\n      </tr>\n    </table>\n\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/mobile/common-job-types.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Common job types example</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      div {\n        margin-bottom: 10px;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Common job types form </h1>\n\n    <form>\n      <div>\n        <label for=\"job\">Job type:</label>\n        <select id=\"job\" name=\"job\">\n          <option value=\"\">-- select job --</option>\n          <option value=\"butcher\">Butcher</option>\n          <option value=\"baker\">Baker</option>\n          <option value=\"candle\">Candlestick maker</option>\n          <option value=\"other\">Other</option>\n        </select>\n      </div>\n      <div>\n        <label for=\"other-job\">Other job:</label>\n        <input type=\"text\" name=\"other-job\" id=\"other-job\">\n      </div>\n    </form>\n\n    <script>\n      const select = document.querySelector('select');\n      const other = document.querySelector('input');\n\n      other.parentElement.style.display = 'none';\n\n      select.onchange = function() {\n        if(select.value === 'other') {\n          other.parentElement.style.display = 'block';\n        } else {\n          other.parentElement.style.display = 'none';\n        }\n      }\n\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/mobile/html5-form-examples.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>HTML5 form examples</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      div {\n        margin-bottom: 10px;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>HTML5 form examples</h1>\n\n    <form>\n      <div>\n        <label for=\"myBrowser\">Choose a browser from this list:</label>\n        <input list=\"browsers\" name=\"myBrowser\" id=\"myBrowser\">\n        <datalist id=\"browsers\">\n          <option value=\"Chrome\">\n          <option value=\"Firefox\">\n          <option value=\"Internet Explorer\">\n          <option value=\"Opera\">\n          <option value=\"Safari\">\n          <option value=\"Microsoft Edge\">\n        </datalist>\n      </div>\n      <div>\n        <label for=\"number\">Enter a number:</label>\n        <input type=\"number\" name=\"number\" id=\"number\">\n      </div>\n      <div>\n        <label for=\"tel\">Enter a telephone number:</label>\n        <input type=\"tel\" name=\"tel\" id=\"tel\">\n      </div>\n      <div>\n        <label for=\"email\">Enter an email address:</label>\n        <input type=\"email\" name=\"email\" id=\"email\">\n      </div>\n      <div>\n        <label for=\"time\">Enter a time:</label>\n        <input type=\"time\" name=\"time\" id=\"time\">\n      </div>\n      <div>\n        <label for=\"date\">Enter a date:</label>\n        <input type=\"date\" name=\"date\" id=\"date\">\n      </div>\n    </form>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/mobile/multi-control-box-drag.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, minimum-scale=1.0, maximum-scale=1.0\">\n    <title>Multi control box drag example</title>\n    <style>\n      html {\n        font-family: sans-serif;\n        overflow: hidden;\n      }\n\n      body {\n        background: #ffe;\n        margin: 0;\n      }\n\n      div {\n        background-color: #1FE200;\n        background-image: linear-gradient(to bottom right, rgba(0,0,0,0), rgba(0,0,0,0.4));\n        width: 200px;\n        height: 150px;\n        border: 1px solid green;\n        position: absolute;\n      }\n    </style>\n  </head>\n  <body>\n    <div></div>\n\n    <script>\n      document.body.width = window.innerWidth;\n      document.body.height = window.innerHeight;\n\n      let posX, posY;\n\n      document.onmousemove = positionHandler;\n      document.ontouchmove = positionHandler;\n\n      function positionHandler(e) {\n        if ((e.clientX)&&(e.clientY)) {\n          posX = e.clientX;\n          posY = e.clientY;\n        } else if (e.targetTouches) {\n          posX = e.targetTouches[0].clientX;\n          posY = e.targetTouches[0].clientY;\n          e.preventDefault();\n        }\n      }\n\n      const div = document.querySelector('div');\n\n      let initialPosX = null;\n\n      let initialPosY = null;\n\n      let rAF;\n\n      div.onmousedown = function() {\n        initialBoxX = div.offsetLeft;\n        initialBoxY = div.offsetTop;\n        movePanel();\n      }\n\n      div.ontouchstart = function(e) {\n        initialBoxX = div.offsetLeft;\n        initialBoxY = div.offsetTop;\n        positionHandler(e);\n        movePanel();\n      }\n\n      document.onmouseup = stopMove;\n      document.ontouchend = stopMove;\n\n      function movePanel() {\n        if(initialPosX === null) {\n          initialPosX = posX;\n          initialPosY = posY;\n        } else {\n          let posMoveX = posX - initialPosX;\n          let posMoveY = posY - initialPosY;\n\n          let offsetX = initialBoxX + posMoveX;\n          let offsetY = initialBoxY + posMoveY;\n\n          div.style.left = offsetX + 'px';\n          div.style.top = offsetY + 'px';\n        }\n\n        rAF = requestAnimationFrame(movePanel);\n      }\n\n      function stopMove() {\n        cancelAnimationFrame(rAF);\n\n        initialPosX = null;\n        initialPosY = null;\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/mobile/simple-box-drag.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple box drag example</title>\n    <style>\n      html {\n        font-family: sans-serif;\n        overflow: hidden;\n      }\n\n      body {\n        background: #ffe;\n        margin: 0;\n      }\n\n      div {\n        background-color: #1FE200;\n        background-image: linear-gradient(to bottom right, rgba(0,0,0,0), rgba(0,0,0,0.4));\n        width: 200px;\n        height: 150px;\n        border: 1px solid green;\n        position: absolute;\n      }\n    </style>\n  </head>\n  <body>\n    <div></div>\n\n    <script>\n      document.body.width = window.innerWidth;\n      document.body.height = window.innerHeight;\n\n      let mouseX, mouseY;\n\n      document.onmousemove = function(e) {\n        mouseX = e.clientX;\n        mouseY = e.clientY;\n      }\n\n      const div = document.querySelector('div');\n\n      let initialMouseX = null;\n\n      let initialMouseY = null;\n\n      var initialBoxX, initialBoxY, rAF;\n\n      div.onmousedown = function() {\n        initialBoxX = div.offsetLeft;\n        initialBoxY = div.offsetTop;\n        movePanel();\n      }\n\n      document.onmouseup = stopMove;\n\n      function movePanel() {\n        if(initialMouseX === null) {\n          initialMouseX = mouseX;\n          initialMouseY = mouseY;\n        } else {\n          let mouseMoveX = mouseX - initialMouseX;\n          let mouseMoveY = mouseY - initialMouseY;\n\n          let offsetX = initialBoxX + mouseMoveX;\n          let offsetY = initialBoxY + mouseMoveY;\n          console.log(offsetX + ' ' + offsetY);\n\n          div.style.left = offsetX + 'px';\n          div.style.top = offsetY + 'px';\n        }\n\n        rAF = requestAnimationFrame(movePanel);\n      }\n\n      function stopMove() {\n        cancelAnimationFrame(rAF);\n\n        console.log('mousemove stopped');\n\n        initialMouseX = null;\n        initialMouseY = null;\n      }\n\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/mobile/simple-button-example.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple button example</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      h1 {\n        text-align: center;\n      }\n\n      button {\n        max-width: 480px;\n        width: 70%;\n        margin: 0 auto;\n        display: block;\n        font-size: 150%;\n        line-height: 1.5;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Simple button example</h1>\n\n    <button>Press me!</button>\n\n\n    <script>\n\n      const btn = document.querySelector('button');\n\n      btn.onclick = function() {\n        alert('Ouch, that hurt!');\n      }\n\n\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/multimedia/audio-transcript-ui/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Audio transcript example</title>\n    <link href=\"../custom-controls.css\" rel=\"stylesheet\">\n    <style>\n      .transcript-container {\n        width: 480px;\n        margin: 10px auto;\n        border: 1px solid #ccc;\n        min-height: 38px;\n      }\n\n      .transcript {\n        height: 0;\n        width: 100%;\n        overflow: auto;\n        padding: 0 10px;\n      }\n\n      .transcript-container button {\n        width: 100%;\n        height: 36px;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Audio transcript example</h1>\n\n  <section class=\"player\">\n    <audio controls>\n      <source src=\"../viper.mp3\" type=\"audio/mp3\">\n      <source src=\"../viper.ogg\" type=\"audio/ogg\">\n      <p>Your browser doesn't support HTML5 audio. Here is a <a href=\"../viper.mp3\">link to the audio</a> instead.</p>\n    </audio>\n\n    <div class=\"controls\">\n      <button class=\"playpause\">Play</button>\n      <button class=\"stop\">Stop</button>\n      <button class=\"rwd\">Rwd</button>\n      <button class=\"fwd\">Fwd</button>\n      <div class=\"time\">00:00</div>\n    </div>\n  </section>\n  <div class=\"transcript-container\">\n    <div class=\"transcript-control\">\n      <button>Show transcript</button>\n    </div>\n    <section class=\"transcript\">\n      <p><strong>Person1</strong>: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque at convallis libero, ut ultricies massa. Integer vel tempor nisi. Nunc scelerisque enim est. Duis lorem ipsum, semper vitae sem at, ultricies interdum ex.</p>\n\n      <p><strong>Person 2</strong>: In consectetur maximus blandit. Curabitur convallis iaculis quam, eu porta erat suscipit sit amet. Morbi viverra placerat ipsum, non bibendum libero egestas eu. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed quis condimentum ante. Nullam ullamcorper faucibus eros. Quisque egestas non risus a faucibus. Curabitur luctus tincidunt turpis in scelerisque.</p>\n\n      <p><strong>Person 1</strong>: Suspendisse sapien ipsum, lacinia eu bibendum in, congue eu purus. Sed fringilla sollicitudin faucibus. Cras sodales sapien neque, eget gravida augue lobortis ac. Mauris blandit faucibus porta.</p>\n\n      <p><strong>Person 2</strong>: Fusce non libero eget nisl porta egestas ut sed elit. Nullam molestie lectus ut elementum sagittis. Donec dictum nunc leo, quis gravida diam varius non. Nam ac nisl vel nibh iaculis convallis vel eget arcu. Mauris pharetra purus ac ornare pellentesque. Fusce in leo nunc. Nunc eget vehicula sem, quis aliquam lorem.</p>\n\n      <p><strong>Person 3</strong>: Ut auctor ornare pulvinar. Morbi nisl ipsum, pellentesque et bibendum eget, vestibulum in massa. Cras egestas cursus est sed ultrices. Etiam vel dui felis.</p>\n    </section>\n  </div>\n\n  <script src=\"main.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/multimedia/audio-transcript-ui/main.js",
    "content": "// grab references to buttons and video\n\nconst playPauseBtn = document.querySelector('.playpause');\nconst stopBtn = document.querySelector('.stop');\nconst rwdBtn = document.querySelector('.rwd');\nconst fwdBtn = document.querySelector('.fwd');\nconst timeLabel = document.querySelector('.time');\n\nconst player = document.querySelector('audio');\n\n// Remove the native controls from all players\n\nplayer.removeAttribute('controls');\n\n// Define constructor for player controls object\n\nplayPauseBtn.onclick = function() {\n  if(player.paused) {\n    player.play();\n    playPauseBtn.textContent = 'Pause';\n  } else {\n    player.pause();\n    playPauseBtn.textContent = 'Play';\n  }\n};\n\nstopBtn.onclick = function() {\n  player.pause();\n  player.currentTime = 0;\n  playPauseBtn.textContent = 'Play';\n};\n\nrwdBtn.onclick = function() {\n  player.currentTime -= 3;\n};\n\nfwdBtn.onclick = function() {\n  player.currentTime += 3;\n  if(player.currentTime >= player.duration || player.paused) {\n    player.pause();\n    player.currentTime = 0;\n    playPauseBtn.textContent = 'Play';\n  }\n};\n\nplayer.ontimeupdate = function() {\n  let minutes = Math.floor(player.currentTime / 60);\n  let seconds = Math.floor(player.currentTime - minutes * 60);\n  let minuteValue;\n  let secondValue;\n\n  if (minutes<10) {\n    minuteValue = \"0\" + minutes;\n  } else {\n    minuteValue = minutes;\n  }\n\n  if (seconds<10) {\n    secondValue = \"0\" + seconds;\n  } else {\n    secondValue = seconds;\n  }\n\n  mediaTime = minuteValue + \":\" + secondValue;\n  timeLabel.textContent = mediaTime;\n};\n\n// Control transcript display\n\nconst transcript = document.querySelector('.transcript');\nconst transcriptBtn = document.querySelector('.transcript-container button');\n\ntranscriptBtn.onclick = function() {\n  if(transcriptBtn.textContent === 'Show transcript') {\n    transcript.style.height = '150px';\n    transcriptBtn.textContent = 'Hide transcript';\n  } else {\n    transcript.style.height = '0';\n    transcriptBtn.textContent = 'Show transcript';\n  }\n};\n"
  },
  {
    "path": "accessibility/multimedia/custom-controls-OOJS/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Multiple media players with custom controls</title>\n    <link href=\"../custom-controls.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <h1>Multiple media players with custom controls</h1>\n\n    <h2>Audio player</h2>\n\n  <section class=\"player\">\n    <audio controls>\n      <source src=\"../viper.mp3\" type=\"audio/mp3\">\n      <source src=\"../viper.ogg\" type=\"audio/ogg\">\n      <p>Your browser doesn't support HTML5 audio. Here is a <a href=\"../viper.mp3\">link to the audio</a> instead.</p>\n    </audio>\n  </section>\n\n    <h2>Video player</h2>\n\n  <section class=\"player\">\n    <video controls>\n      <source src=\"../rabbit320.mp4\" type=\"video/mp4\">\n      <source src=\"../rabbit320.webm\" type=\"video/webm\">\n      <p>Your browser doesn't support HTML5 video. Here is a <a href=\"../rabbit320.mp4\">link to the video</a> instead.</p>\n    </video>\n  </section>\n\n  <script src=\"main.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/multimedia/custom-controls-OOJS/main.js",
    "content": "// Get references to all audio and video players\n// Store them all in a single array\n\nconst videos = document.querySelectorAll('video');\n\nconst audios = document.querySelectorAll('audio');\n\nlet players = [];\n\nfor(let a = 0; a < audios.length; a++) {\n  players.push(audios[a]);\n}\n\nfor(let v = 0; v < videos.length; v++) {\n  players.push(videos[v]);\n}\n\n// Remove the native controls from all players\n\nfor(let p = 0; p < players.length; p++) {\n  players[p].removeAttribute('controls');\n}\n\n// Define constructor for player controls object\n\nfunction PlayerController(player, playPauseBtn, stopBtn, rwdBtn, fwdBtn, timeLabel) {\n  this.player = player;\n  this.playPauseBtn = playPauseBtn;\n  this.stopBtn = stopBtn;\n  this.rwdBtn = rwdBtn;\n  this.fwdBtn = fwdBtn;\n  this.timeLabel = timeLabel;\n\n  this.interval;\n\n  this.playPauseBtn.onclick = function() {\n    if(player.paused) {\n      player.play();\n      playPauseBtn.textContent = 'Pause';\n    } else {\n      player.pause();\n      playPauseBtn.textContent = 'Play';\n    }\n  }\n\n  this.stopBtn.onclick = function() {\n    player.pause();\n    player.currentTime = 0;\n    playPauseBtn.textContent = 'Play';\n  }\n\n  this.rwdBtn.onclick = function() {\n    player.currentTime -= 3;\n  }\n\n  this.fwdBtn.onclick = function() {\n    player.currentTime += 3;\n    if(player.currentTime >= player.duration || player.paused) {\n      player.pause();\n      player.currentTime = 0;\n      playPauseBtn.textContent = 'Play';\n    }\n  }\n\n  this.player.ontimeupdate = function() {\n    let minutes = Math.floor(player.currentTime / 60);\n    let seconds = Math.floor(player.currentTime - minutes * 60);\n    let minuteValue;\n    let secondValue;\n\n    if (minutes<10) {\n      minuteValue = \"0\" + minutes;\n    } else {\n      minuteValue = minutes;\n    }\n\n    if (seconds<10) {\n      secondValue = \"0\" + seconds;\n    } else {\n      secondValue = seconds;\n    }\n\n    mediaTime = minuteValue + \":\" + secondValue;\n    timeLabel.textContent = mediaTime;\n  }\n}\n\n\n\n// Add the controls bar to all players\n\nfor(let i = 0; i < players.length; i++) {\n  const controls = document.createElement('div');\n  controls.setAttribute('class', 'controls');\n  players[i].parentNode.appendChild(controls);\n\n  const playpause = document.createElement('button');\n  const stop = document.createElement('button');\n  const rwd = document.createElement('button');\n  const fwd = document.createElement('button');\n  const time = document.createElement('div');\n\n  playpause.setAttribute('class', 'playpause');\n  stop.setAttribute('class', 'stop');\n  rwd.setAttribute('class', 'rwd');\n  fwd.setAttribute('class', 'fwd');\n  time.setAttribute('class', 'time');\n\n  playpause.textContent = 'Play';\n  stop.textContent = 'Stop';\n  rwd.textContent = 'Rwd';\n  fwd.textContent = 'Fwd';\n  time.textContent = '00:00';\n\n  controls.appendChild(playpause);\n  controls.appendChild(stop);\n  controls.appendChild(rwd);\n  controls.appendChild(fwd);\n  controls.appendChild(time);\n\n  let playerInstance = new PlayerController(players[i], playpause, stop, rwd, fwd, time);\n}\n"
  },
  {
    "path": "accessibility/multimedia/custom-controls-basic/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Basic custom controls</title>\n    <link href=\"../custom-controls.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <h1>Basic custom controls</h1>\n\n  <section class=\"player\">\n    <video controls>\n      <source src=\"../rabbit320.mp4\" type=\"video/mp4\">\n      <source src=\"../rabbit320.webm\" type=\"video/webm\">\n      <p>Your browser doesn't support HTML5 video. Here is a <a href=\"../rabbit320.mp4\">link to the video</a> instead.</p>\n    </video>\n\n    <div class=\"controls\">\n      <button class=\"playpause\">Play</button>\n      <button class=\"stop\">Stop</button>\n      <button class=\"rwd\">Rwd</button>\n      <button class=\"fwd\">Fwd</button>\n      <div class=\"time\">00:00</div>\n    </div>\n  </section>\n\n  <script src=\"main.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/multimedia/custom-controls-basic/main.js",
    "content": "// grab references to buttons and video\n\nconst playPauseBtn = document.querySelector('.playpause');\nconst stopBtn = document.querySelector('.stop');\nconst rwdBtn = document.querySelector('.rwd');\nconst fwdBtn = document.querySelector('.fwd');\nconst timeLabel = document.querySelector('.time');\n\nconst player = document.querySelector('video');\n\n// Remove the native controls from all players\n\nplayer.removeAttribute('controls');\n\n// Define constructor for player controls object\n\nplayPauseBtn.onclick = function() {\n  if(player.paused) {\n    player.play();\n    playPauseBtn.textContent = 'Pause';\n  } else {\n    player.pause();\n    playPauseBtn.textContent = 'Play';\n  }\n};\n\nstopBtn.onclick = function() {\n  player.pause();\n  player.currentTime = 0;\n  playPauseBtn.textContent = 'Play';\n};\n\nrwdBtn.onclick = function() {\n  player.currentTime -= 3;\n};\n\nfwdBtn.onclick = function() {\n  player.currentTime += 3;\n  if(player.currentTime >= player.duration || player.paused) {\n    player.pause();\n    player.currentTime = 0;\n    playPauseBtn.textContent = 'Play';\n  }\n};\n\nplayer.ontimeupdate = function() {\n  let minutes = Math.floor(player.currentTime / 60);\n  let seconds = Math.floor(player.currentTime - minutes * 60);\n  let minuteValue;\n  let secondValue;\n\n  if (minutes<10) {\n    minuteValue = \"0\" + minutes;\n  } else {\n    minuteValue = minutes;\n  }\n\n  if (seconds<10) {\n    secondValue = \"0\" + seconds;\n  } else {\n    secondValue = seconds;\n  }\n\n  mediaTime = minuteValue + \":\" + secondValue;\n  timeLabel.textContent = mediaTime;\n};\n"
  },
  {
    "path": "accessibility/multimedia/custom-controls-start.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Basic custom controls</title>\n    <link href=\"custom-controls.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <h1>Basic custom controls</h1>\n\n  <section class=\"player\">\n    <video controls>\n      <source src=\"rabbit320.mp4\" type=\"video/mp4\">\n      <source src=\"rabbit320.webm\" type=\"video/webm\">\n      <p>Your browser doesn't support HTML5 video. Here is a <a href=\"rabbit320.mp4\">link to the video</a> instead.</p>\n    </video>\n\n    <div class=\"controls\">\n      <button class=\"playpause\">Play</button>\n      <button class=\"stop\">Stop</button>\n      <button class=\"rwd\">Rwd</button>\n      <button class=\"fwd\">Fwd</button>\n      <div class=\"time\">00:00</div>\n    </div>\n  </section>\n\n  <script src=\"main.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/multimedia/custom-controls.css",
    "content": "* {\n  box-sizing: border-box;\n}\n\nhtml {\n  font-family: sans-serif;\n}\n\n.player {\n  width: 480px;\n  margin: 10px auto;\n  border: 1px solid #ccc;\n}\n\nvideo, audio, .controls {\n  width: 100%;\n}\n\n.controls {\n  height: 36px;\n}\n\nbutton {\n  display: block;\n  float: left;\n  border: 0;\n  margin-right: 2px;\n  height: 100%;\n  width: 50px;\n  cursor: pointer;\n}\n\nbutton:hover, button:focus {\n  background-color: #ddd;\n}\n\nbutton:active {\n  background-color: #ccc;\n}\n\n.controls div {\n  font-size: 12px;\n  display: inline-block;\n  line-height: 36px;\n  width: 45px;\n  float: right;\n}\n\nvideo {\n  margin-bottom: -5px;\n}\n"
  },
  {
    "path": "accessibility/multimedia/native-controls.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Multiple media players with native controls</title>\n  </head>\n  <body>\n    <h1>Multiple media players with native controls</h1>\n\n    <audio controls>\n      <source src=\"viper.mp3\" type=\"audio/mp3\">\n      <source src=\"viper.ogg\" type=\"audio/ogg\">\n      <p>Your browser doesn't support HTML5 audio. Here is a <a href=\"viper.mp3\">link to the audio</a> instead.</p>\n    </audio>\n\n    <br>\n\n    <video controls>\n      <source src=\"rabbit320.mp4\" type=\"video/mp4\">\n      <source src=\"rabbit320.webm\" type=\"video/webm\">\n      <p>Your browser doesn't support HTML5 video. Here is a <a href=\"rabbit320.mp4\">link to the video</a> instead.</p>\n    </video>\n  </body>\n</html>\n"
  },
  {
    "path": "accessibility/tasks/html-css/aria/aria1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>WAI-ARIA: Task 1</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      div > div {\n        padding-left: 20px;\n        position: relative;\n      }\n\n      div > div::before {\n        content: \" \";\n        width: 8px;\n        height: 8px;\n        background-color: black;\n        border-radius: 50%;\n        position: absolute;\n        left: 0;\n        top: 8px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <p>My favorite animals:</p>\n\n    <div>\n      <div>Pig</div>\n      <div>Gazelle</div>\n      <div>Llama</div>\n      <div>Majestic moose</div>\n      <div>Hedgehog</div>\n    </div>\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "accessibility/tasks/html-css/aria/aria1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>WAI-ARIA: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      div > div {\n        padding-left: 20px;\n        position: relative;\n      }\n\n      div > div::before {\n        content: \" \";\n        width: 8px;\n        height: 8px;\n        background-color: black;\n        border-radius: 50%;\n        position: absolute;\n        left: 0;\n        top: 8px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      <p>My favorite animals:</p>\n\n      <div>\n        <div>Pig</div>\n        <div>Gazelle</div>\n        <div>Llama</div>\n        <div>Majestic moose</div>\n        <div>Hedgehog</div>\n      </div>\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\ndiv > div {\n  padding-left: 20px;\n  position: relative;\n}\n\ndiv > div::before {\n  content: \" \";\n  width: 8px;\n  height: 8px;\n  background-color: black;\n  border-radius: 50%;\n  position: absolute;\n  left: 0;\n  top: 8px;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<p>My favorite animals:</p>\n\n<div>\n  <div>Pig</div>\n  <div>Gazelle</div>\n  <div>Llama</div>\n  <div>Majestic moose</div>\n  <div>Hedgehog</div>\n</div>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "accessibility/tasks/html-css/aria/aria2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>WAI-ARIA: Task 2</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 'Helvetica Neue', Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n      <input type=\"search\" name=\"search\">\n    </form>\n  </body>\n\n</html>\n"
  },
  {
    "path": "accessibility/tasks/html-css/aria/aria2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>WAI-ARIA: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      <form>\n        <input type=\"search\" name=\"search\">\n      </form>\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\n\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<form>\n  <input type=\"search\" name=\"search\">\n</form>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "accessibility/tasks/html-css/aria/marking.md",
    "content": "# WAI-ARIA marking guide\n\nThe aim of these tasks is to demonstrate an understanding of the techniques covered in the [WAI-ARIA Basics](https://developer.mozilla.org/en-US/docs/Learn/Accessibility/WAI-ARIA_basics) lesson in Learn Web Development on MDN.\n\n## Task 1\n\nIn our first ARIA task, we present you with a section of non-semantic markup, which is obviously meant to be a list. Assuming you are not able to change the elements used, how can you allow screenreader users to recognize this as a list?\n\nThe `list` and `listitem` roles are what you need here. The updated markup would look like so:\n\n```html\n<div role=\"list\">\n  <div role=\"listitem\">Pig</div>\n  <div role=\"listitem\">Gazelle</div>\n  <div role=\"listitem\">Llama</div>\n  <div role=\"listitem\">Majestic moose</div>\n  <div role=\"listitem\">Hedgehog</div>\n</div>\n```\n\n## Task 2\n\nIn our second WAI-ARIA task, we present a simple search form, and we want you to add in a couple of WAI-ARIA features to improve its accessibility:\n\n1. How can you allow the search form to be called out as a separate landmark on the page by screenreaders, to make it easily findable?\n2. How can you give the search input a suitable label, without explicitly adding a visible text label to the DOM?\n\nAnswers:\n\n1. Give the `<form>` element a `role=\"search\"`. Most screenreaders will explicitly call this out as a search form, and/or include it as a separate landmark in the page's landmarks list.\n2. Include label text inside an `aria-label=\"\"` attribute on the `<input>` element. This way it won't be visible on the page, but it will be read out by screenreaders.\n\nThe finished HTML should look something like this:\n\n```html\n<form role=\"search\">\n  <input\n    type=\"search\"\n    name=\"search\"\n    aria-label=\"Search for your favorite content on our site\"\n  />\n</form>\n```\n\n## Task 3\n\nFor this final WAI-ARIA task, we return to an example we previously saw in the [CSS and JavaScript skilltest](https://developer.mozilla.org/en-US/docs/Learn/Accessibility/CSS_and_JavaScript/Test_your_skills:_CSS_and_JavaScript_accessibility). As before, we have a simple app that presents a list of animal names. Clicking one of the animal names causes a further description of that animal to appear in a box below the list. Here, we are starting with a mouse- and keyboard-accessible version.\n\nThe problem we have now is that when the DOM changes to show a new description, screenreaders cannot see what has changed. Can you update it so that description changes are announced by the screenreader?\n\nThere are two ways to solve this:\n\n- Add an `aria-live=\"\"` attribute to the animal-description `<div>` to turn it into a live region, so when its content changes, the updated content will be read out by a screenreader. The best value is probably `assertive`, which makes the screenreader read out the updated content as soon as it changed. `polite` means that the screenreader will wait until other descriptions have finished before it starts reading out the changed content.\n- Add a `role=\"alert\"` attribute to the animal-description `<div>`, to make it have alert box semantics. This has the same effect on the screenreader as setting `aria-live=\"assertive\"` on it.\n"
  },
  {
    "path": "accessibility/tasks/html-css/css/css-a11y1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>CSS accessibility: Task 1</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      a {\n        text-decoration: none;\n        color: #666;\n        outline: none;\n      }\n    </style>\n  </head>\n\n  <body>\n\n    <ul>\n      <li><a href=\"\">Animals</a></li>\n      <li><a href=\"\">Computers</a></li>\n      <li><a href=\"\">Diversity and inclusion</a></li>\n      <li><a href=\"\">Food</a></li>\n      <li><a href=\"\">Medicine</a></li>\n      <li><a href=\"\">Music</a></li>\n    </ul>\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "accessibility/tasks/html-css/css/css-a11y1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>CSS accessibility: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      a {\n        text-decoration: none;\n        color: #666;\n        outline: none;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      <ul>\n        <li><a href=\"\">Animals</a></li>\n        <li><a href=\"\">Computers</a></li>\n        <li><a href=\"\">Diversity and inclusion</a></li>\n        <li><a href=\"\">Food</a></li>\n        <li><a href=\"\">Medicine</a></li>\n        <li><a href=\"\">Music</a></li>\n      </ul>\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\na {\n  text-decoration: none;\n  color: #666;\n  outline: none;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<ul>\n  <li><a href=\"\">Animals</a></li>\n  <li><a href=\"\">Computers</a></li>\n  <li><a href=\"\">Diversity and inclusion</a></li>\n  <li><a href=\"\">Food</a></li>\n  <li><a href=\"\">Medicine</a></li>\n  <li><a href=\"\">Music</a></li>\n</ul>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "accessibility/tasks/html-css/css/css-a11y2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>CSS accessibility: Task 2</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      main {\n        padding: 20px;\n        background-color: red;\n      }\n\n      h1, h2, p {\n        color: #999;\n      }\n\n      h1 {\n        font-size: 2vw;\n      }\n\n      h2 {\n        font-size: 1.5vw;\n      }\n\n      p {\n        font-size: 1.2vw;\n      }\n    </style>\n  </head>\n\n  <body>\n    <main>\n      <h1>I am the eggman</h1>\n\n      <p>Prow scuttle parrel provost Sail ho shrouds spirits boom mizzenmast yardarm. Pinnace holystone mizzenmast quarter crow's nest nipperkin grog yardarm hempen halter furl.</p>\n\n      <h2>They are the eggman</h2>\n\n      <p>Swab barque interloper chantey doubloon starboard grog black jack gangway rutters.</p>\n\n      <h2>I am the walrus</h2>\n\n      <p>Deadlights jack lad schooner scallywag dance the hempen jig carouser broadside cable strike colors.</p>\n    </main>\n  </body>\n\n</html>\n"
  },
  {
    "path": "accessibility/tasks/html-css/css/css-a11y2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>CSS accessibility: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      main {\n        padding: 20px;\n        background-color: red;\n      }\n\n      h1, h2, p {\n        color: #999;\n      }\n\n      h1 {\n        font-size: 2vw;\n      }\n\n      h2 {\n        font-size: 1.5vw;\n      }\n\n      p {\n        font-size: 1.2vw;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      <main>\n        <h1>I am the eggman</h1>\n\n        <p>Prow scuttle parrel provost Sail ho shrouds spirits boom mizzenmast yardarm. Pinnace holystone mizzenmast quarter crow's nest nipperkin grog yardarm hempen halter furl.</p>\n\n        <h2>They are the eggman</h2>\n\n        <p>Swab barque interloper chantey doubloon starboard grog black jack gangway rutters.</p>\n\n        <h2>I am the walrus</h2>\n\n        <p>Deadlights jack lad schooner scallywag dance the hempen jig carouser broadside cable strike colors.</p>\n      </main>\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\nmain {\n  padding: 20px;\n  background-color: red;\n}\n\nh1, h2, p {\n  color: #999;\n}\n\nh1 {\n  font-size: 2vw;\n}\n\nh2 {\n  font-size: 1.5vw;\n}\n\np {\n  font-size: 1.2vw;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<main>\n  <h1>I am the eggman</h1>\n\n  <p>Prow scuttle parrel provost Sail ho shrouds spirits boom mizzenmast yardarm. Pinnace holystone mizzenmast quarter crow's nest nipperkin grog yardarm hempen halter furl.</p>\n\n  <h2>They are the eggman</h2>\n\n  <p>Swab barque interloper chantey doubloon starboard grog black jack gangway rutters.</p>\n\n  <h2>I am the walrus</h2>\n\n  <p>Deadlights jack lad schooner scallywag dance the hempen jig carouser broadside cable strike colors.</p>\n</main>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "accessibility/tasks/html-css/css/marking.md",
    "content": "# CSS and JS accessibility marking guide\n\nThe aim of these tasks is to demonstrate an understanding of the techniques covered in the [CSS and JavaScript accessibility best practices](https://developer.mozilla.org/en-US/docs/Learn/Accessibility/CSS_and_JavaScript) lesson in Learn Web Development on MDN.\n\n## Task 1\n\nIn the first task you are presented with a list of links. However, their accessibility is pretty bad — there is no way to really tell that they are links, or to tell which one the user is focussed on.\n\nWe'd like you to assume that the existing ruleset with the `a` selector is supplied by some CMS, and that you can't change it — instead, you need to create new rules to make the links look and behave like links, and for the user to be able to tell where they are in the list.\n\nThe CSS could look something like this:\n\n```css\nli a {\n  text-decoration: underline;\n  color: rgb(150, 0, 0);\n}\n\nli a:hover,\nli a:focus {\n  text-decoration: none;\n  color: rgb(255, 0, 0);\n}\n```\n\n## Task 2\n\nIn this next task you are presented with a simple bit of content — just headings and paragraphs. There are accessibility issues with the colors and sizing of the text; we'd like you to:\n\n1. Explain what the problems are, and what the guidelines are that state the acceptable values for color and sizing.\n2. Select new values for the color and font-size that fix the problem.\n3. Update the CSS with these new values to fix the problem.\n4. Test the code to make sure the problem is now fixed. Explain what tools or methods you used to select the new values and test the code.\n\nThe answers:\n\n1. (Q1) The problems are that first of all, the color contrast is not acceptable, as per WCAG criteria [1.4.3 (AA)](https://www.w3.org/TR/WCAG21/#contrast-minimum) and [1.4.6 (AAA)](https://www.w3.org/TR/WCAG21/#contrast-enhanced), and secondly, the text is sized using vw units, which means that it is not zoomable in most browsers. [WCAG 1.4.4 (AA)](https://www.w3.org/TR/WCAG21/#resize-text) states that text should be resizable.\n2. (Qs 2 and 3) to fix the code, you need to\n\n   - Choose a much better contrasting set of background and foreground colors.\n   - Use some different units to size the text (such as rem or even px), or even implement something that uses a combination of vw and other units, if you want it resizable but still relative in part to the viewport size\n\n3. For testing:\n\n- You can test color contrast using a tool such as [aXe](https://www.deque.com/axe/), The [Firefox Accessibility Inspector](https://developer.mozilla.org/en-US/docs/Tools/Accessibility_inspector), or even a simple standalone web page tool like the [WebAIM Contrast Checker](https://webaim.org/resources/contrastchecker/).\n- For text resizing, you'd need to load the example in a browser and try to resize it. Resizing vw unit-sized text works in Safari, but not Firefox or Chromium-based browsers.\n\nFor the updated code, something like this would work for the updated color scheme:\n\n```css\nmain {\n  padding: 20px;\n  background-color: red;\n}\n\nh1,\nh2,\np {\n  color: black;\n}\n```\n\nAnd something like this would work for the font sizing:\n\n```css\nh1 {\n  font-size: calc(2.5rem);\n}\n\nh2 {\n  font-size: calc(2rem);\n}\n\np {\n  font-size: calc(1.2rem);\n}\n```\n\nOr this, if you want to do something a bit cleverer that gives you resizable viewport-relative units:\n\n```css\nh1 {\n  font-size: calc(1.5vw + 1rem);\n}\n\nh2 {\n  font-size: calc(1.2vw + 0.7rem);\n}\n\np {\n  font-size: calc(1vw + 0.4rem);\n}\n```\n\n## Task 3\n\nIn our final task here, you have some JavaScripting to do. We have a simple app that presents a list of animal names. Clicking one of the animal names causes a further description of that animal to appear in a box below the list.\n\nBut it is not very accessible — in its current state you can only operate it with the mouse. We'd like you to add to the HTML and JavaScript to make it keyboard acessible too.\n\nAnswers:\n\n1. To begin with, you'll need to add `tabindex=\"0\"` to the list items to make them focusable via the keyboard.\n2. Then you'll need to add in another event listener inside the `forEach()` loop, to make the code respond to keys being pressed while the list items are selected. It is probably a good idea to make it respond to a specific key, such as \"Enter\", in which case something like the following is probably acceptable:\n\n```css\nitem.addEventListener('keyup', function(e) {\n  if(e.key === 'Enter') {\n    handleSelection(e);\n  }\n});\n```\n"
  },
  {
    "path": "accessibility/tasks/html-css/html/html-a11y1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>HTML accessibility: Task 1</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      .button {\n        color: white;\n        background-color: blue;\n        border-radius: 10px;\n        width: 170px;\n        padding: 10px;\n        text-align: center;\n      }\n    </style>\n  </head>\n\n  <body>\n\n    <font size=\"7\">Need help?</font>\n    <br><br>\n    If you have any problems with our products, our  support center can offer you all the help you need, whether you want:\n    <br><br>\n    1. Advice choosing a new product\n    <br>\n    2. Tech support on an existing product\n    <br>\n    3. Refund and cancellation assistance\n    <br><br>\n    <font size=\"5\">Contact us now</font>\n    <br><br>\n    Our help center contains live chat, e-mail addresses, and phone numbers.\n    <br><br>\n    <div class=\"button\">Find Contact Details</div>\n    <br>\n    <font size=\"5\">Find out answers</font>\n    <br><br>\n    Our Forums section contains a large knowledge base of searchable previously asked questions, and you can always ask a new question if you can't find the answer you're looking for.\n    <br><br>\n    <div class=\"button\">Access Forums</div>\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "accessibility/tasks/html-css/html/html-a11y1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>HTML accessibility: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      .button {\n        color: white;\n        background-color: blue;\n        border-radius: 10px;\n        width: 170px;\n        padding: 10px;\n        text-align: center;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      <font size=\"7\">Need help?</font>\n      <br><br>\n      If you have any problems with our products, our  support center can offer you all the help you need, whether you want:\n      <br><br>\n      1. Advice choosing a new product\n      <br>\n      2. Tech support on an existing product\n      <br>\n      3. Refund and cancellation assistance\n      <br><br>\n      <font size=\"5\">Contact us now</font>\n      <br><br>\n      Our help center contains live chat, e-mail addresses, and phone numbers.\n      <br><br>\n      <div class=\"button\">Find Contact Details</div>\n      <br>\n      <font size=\"5\">Find out answers</font>\n      <br><br>\n      Our Forums section contains a large knowledge base of searchable previously asked questions, and you can always ask a new question if you can't find the answer you're looking for.\n      <br><br>\n      <div class=\"button\">Access Forums</div>\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\n.button {\n  color: white;\n  background-color: blue;\n  border-radius: 10px;\n  width: 170px;\n  padding: 10px;\n  text-align: center;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<font size=\"7\">Need help?</font>\n<br><br>\nIf you have any problems with our products, our  support center can offer you all the help you need, whether you want:\n<br><br>\n1. Advice choosing a new product\n<br>\n2. Tech support on an existing product\n<br>\n3. Refund and cancellation assistance\n<br><br>\n<font size=\"5\">Contact us now</font>\n<br><br>\nOur help center contains live chat, e-mail addresses, and phone numbers.\n<br><br>\n<div class=\"button\">Find Contact Details</div>\n<br>\n<font size=\"5\">Find out answers</font>\n<br><br>\nOur Forums section contains a large knowledge base of searchable previously asked questions, and you can always ask a new question if you can't find the answer you're looking for.\n<br><br>\n<div class=\"button\">Access Forums</div>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "accessibility/tasks/html-css/html/html-a11y2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>HTML accessibility: Task 2</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      form {\n        width: 400px;\n      }\n\n      li {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        margin-bottom: 20px;\n      }\n    </style>\n  </head>\n\n  <body>\n\n    <form>\n      <ul>\n        <li>\n          Name\n          <input type=\"text\" name=\"name\">\n        </li>\n        <li>\n          Age\n          <input type=\"number\" name=\"age\">\n        </li>\n        <li>\n          Email address\n          <input type=\"email\" name=\"email\">\n        </li>\n      </ul>\n    </form>\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "accessibility/tasks/html-css/html/html-a11y2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>HTML accessibility: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      form {\n        width: 400px;\n      }\n\n      li {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        margin-bottom: 20px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      <form>\n        <ul>\n          <li>\n            Name\n            <input type=\"text\" name=\"name\">\n          </li>\n          <li>\n            Age\n            <input type=\"number\" name=\"age\">\n          </li>\n          <li>\n            Email address\n            <input type=\"email\" name=\"email\">\n          </li>\n        </ul>\n      </form>\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\nform {\n  width: 400px;\n}\n\nli {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-bottom: 20px;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<form>\n  <ul>\n    <li>\n      Name\n      <input type=\"text\" name=\"name\">\n    </li>\n    <li>\n      Age\n      <input type=\"number\" name=\"age\">\n    </li>\n    <li>\n      Email address\n      <input type=\"email\" name=\"email\">\n    </li>\n  </ul>\n</form>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "accessibility/tasks/html-css/html/html-a11y3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>HTML accessibility: Task 3</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n\n    <p>For more information about our activities, check out our fundraising page (<a href=\"/fundraising\">click here</a>), education page (<a href=\"/education\">click here</a>), sponsorship pack (<a href=\"/resources/sponsorship.pdf\">click here</a>), and assessment sheets (<a href=\"/resources/assessments.docx\">click here</a>).</p>\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "accessibility/tasks/html-css/html/html-a11y3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>HTML accessibility: Task 3</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      <p>For more information about our activities, check out our fundraising page (<a href=\"/fundraising\">click here</a>), education page (<a href=\"/education\">click here</a>), sponsorship pack (<a href=\"/resources/sponsorship.pdf\">click here</a>), and assessment sheets (<a href=\"/resources/assessments.docx\">click here</a>).</p>\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\n\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<p>For more information about our activities, check out our fundraising page (<a href=\"/fundraising\">click here</a>), education page (<a href=\"/education\">click here</a>), sponsorship pack (<a href=\"/resources/sponsorship.pdf\">click here</a>), and assessment sheets (<a href=\"/resources/assessments.docx\">click here</a>).</p>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "accessibility/tasks/html-css/html/html-a11y4-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>HTML accessibility: Task 4</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      body {\n        width: 400px;\n        margin: 0 auto;\n      }\n\n      main img {\n        display: block;\n        width: 250px;\n        margin: 20px auto;\n        box-shadow: 5px 5px 0 black;\n      }\n\n      header {\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        gap: 20px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <header>\n      <img src=\"images/star.png\" alt=\"A star that I use to decorate my page\">\n      <h1>Groovy images</h1>\n    </header>\n    <main>\n      <img src=\"images/teapot.jpg\">\n      <img src=\"images/football.jpg\">\n    </main>\n  </body>\n\n</html>\n"
  },
  {
    "path": "accessibility/tasks/html-css/html/html-a11y4.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>HTML accessibility: Task 4</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      .preview {\n        width: 400px;\n        margin: 0 auto;\n      }\n\n      main img {\n        display: block;\n        width: 250px;\n        margin: 20px auto;\n        box-shadow: 5px 5px 0 black;\n      }\n\n      header {\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        gap: 20px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      <header>\n        <img src=\"images/star.png\" alt=\"A star that I use to decorate my page\">\n        <h1>Groovy images</h1>\n      </header>\n      <main>\n        <img src=\"images/teapot.jpg\">\n        <img src=\"images/football.jpg\">\n      </main>\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\n.preview {\n  width: 400px;\n  margin: 0 auto;\n}\n\nmain img {\n  display: block;\n  width: 250px;\n  margin: 20px auto;\n  box-shadow: 5px 5px 0 black;\n}\n\nheader {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  gap: 20px;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<header>\n  <img src=\"images/star.png\" alt=\"A star that I use to decorate my page\">\n  <h1>Groovy images</h1>\n</header>\n<main>\n  <img src=\"images/teapot.jpg\">\n  <img src=\"images/football.jpg\">\n</main>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "accessibility/tasks/html-css/html/marking.md",
    "content": "# HTML accessibility marking guide\n\nThe aim of these tasks is to demonstrate an understanding of the techniques covered in the [HTML: A good basis for accessibility](https://developer.mozilla.org/en-US/docs/Learn/Accessibility/HTML) lesson in Learn Web Development on MDN.\n\n## Task 1\n\nIn this task we will test your understanding of text semantics, and why they are good for accessibility. You don't need to worry too much about recreating the _exact_ same look and text sizing, as long as the semantics are good.\n\nThe given text is a simple information panel with action buttons:\n\n```html\n<font size=\"7\">Need help?</font> <br /><br />\nIf you have any problems with our products, our support center can offer you all\nthe help you need, whether you want:\n<br /><br />\n1. Advice choosing a new product\n<br />\n2. Tech support on an existing product\n<br />\n3. Refund and cancellation assistance\n<br /><br />\n<font size=\"5\">Contact us now</font>\n<br /><br />\nOur help center contains live chat, e-mail addresses, and phone numbers.\n<br /><br />\n<div class=\"button\">Find Contact Details</div>\n<br /><br />\n<font size=\"5\">Find out answers</font>\n<br /><br />\nOur Forums section contains a large knowledge base of searchable previously\nasked questions, and you can always ask a new question if you can't find the\nanswer you're looking for.\n<br /><br />\n<div class=\"button\">Access forums</div>\n```\n\nBut of course, this is terrible for semantics and accessibility. A much better set of markup would look like so:\n\n```html\n<h2>Need help?</h2>\n\n<p>\n  If you have any problems with our products, our support center can offer you\n  all the help you need, whether you want:\n</p>\n\n<ul>\n  <li>Advice choosing a new product</li>\n  <li>Tech support on an existing product</li>\n  <li>Refund and cancellation assistance</li>\n</ul>\n\n<h3>Contact us now</h3>\n\n<p>Our help center contains live chat, e-mail addresses, and phone numbers.</p>\n\n<button>Find Contact Details</button>\n\n<h3>Find out answers</h3>\n\n<p>\n  Our Forums section contains a large knowledge base of searchable previously\n  asked questions, and you can always ask a new question if you can't find the\n  answer you're looking for.\n</p>\n\n<button>Access forums</button>\n```\n\nYou can get a couple of extra marks for:\n\n1. Just using `<button>`, not `<button class=\"button\">` (repeating semantics is unnecessary), and updating the CSS selector to make sure the button still picks up the styles\n2. Using an unordered list, not an ordered list — the list of items doesn't really need to be in any order.\n\n## Task 2\n\nIn the second task, you have a form containing three input fields. You need to:\n\n1. Semantically associate the input with their labels.\n2. Assume that these inputs will be part of a larger form, and wrap them in an element that associates them all together as a single related group.\n3. Give the group a description/title that summarises all of the information as personal data.\n\nThis is fairly simple, especially if you have previously worked through our [Web forms](https://developer.mozilla.org/en-US/docs/Learn/Forms) module. You need to:\n\n1. Use `<label>` elements and `id`s to associate labels with inputs.\n2. Use a `<fieldset>` to associate the elements together as one group.\n3. Use a `<legend>` to give the `<fieldset>` a description/title.\n\nYour answer should end up looking something like this:\n\n```html\n<form>\n  <fieldset>\n    <legend>Personal data</legend>\n    <ul>\n      <li>\n        <label for=\"name\">Name</label>\n        <input type=\"text\" name=\"name\" id=\"name\" />\n      </li>\n      <li>\n        <label for=\"age\">Age</label>\n        <input type=\"number\" name=\"age\" id=\"age\" />\n      </li>\n      <li>\n        <label for=\"email\">Email address</label>\n        <input type=\"email\" name=\"email\" id=\"email\" />\n      </li>\n    </ul>\n  </fieldset>\n</form>\n```\n\n## Task 3\n\nIn this task you are required to turn all the information links in the paragraph into good, accessible links.\n\n1. The first two links just go to regular web pages.\n2. The third link goes to a PDF, and it's large — 8MB.\n3. The fourth link goes to a Word document, so the user will need some kind of application installed that can handle that.\n\nInitially the paragraph looks like this:\n\n```html\n<p>\n  For more information about our activities, check out our fundraising page (\n  <a href=\"/fundraising\">click here</a>), education page (\n  <a href=\"/education\">click here</a>), sponsorship pack (\n  <a href=\"/resources/sponsorship.pdf\">click here</a>), and assessment sheets (\n  <a href=\"/resources/assessments.docx\">click here</a>).\n</p>\n```\n\nBut you should update it to something like this:\n\n```html\n<p>\n  For more information about our activities, check out our\n  <a href=\"/fundraising\">fundraising page</a>,\n  <a href=\"/education\">education page</a>,\n  <a href=\"/resources/sponsorship.pdf\">sponsorship pack (PDF, 8MB)</a>, and\n  <a href=\"/resources/assessments.docx\">assessment sheets (Word document)</a>.\n</p>\n```\n\n## Task 4\n\nIn our final HTML accessibility task, you are given a simple image gallery, which has some accessibility problems. Can you fix them?\n\n1. The header image has an accessibility issue, and so do the gallery images.\n2. You could take the header image further and implement it using CSS for better accessibility. Why is this better, and what would a solution look like?\n\nSo, on to the answers:\n\n1. The header image is decorative, so doesn't really need alt text. The best solution if you are going to use decorative HTML images is to put `alt=\"\"`, so a screenreader will just read out nothing — rather than a description, or the image file name. It is not part of the content.\n2. The gallery images need alt text, and they are part of the content. The updated HTML could look something like this:\n\n   ```html\n   <header>\n     <img src=\"images/star.png\" alt=\"\" />\n     <h1>Groovy images</h1>\n   </header>\n   <main>\n     <img\n       src=\"images/teapot.jpg\"\n       alt=\"a black teapot placed on a shelf just inside a window\"\n     />\n     <img\n       src=\"images/football.jpg\"\n       alt=\"A black and white round panelled ball\"\n     />\n   </main>\n   ```\n\n3. It would be arguable better to implement the background header image using CSS background images. To do this, you would remove the following line:\n\n   ```html\n   <img src=\"images/star.png\" alt=\"A star that I use to decorate my page\" />\n   ```\n\n   And add in a CSS rule along these lines:\n\n   ```css\n   h1 {\n     background: url(images/star.png) no-repeat left;\n     padding-left: 50px;\n   }\n   ```\n"
  },
  {
    "path": "accessibility/tasks/html-css/playable.js",
    "content": "var section = document.querySelector('section');\nvar editable = document.querySelector('.editable');\nvar textareaHTML = document.querySelector('.playable-html');\nvar textareaCSS = document.querySelector('.playable-css');\nvar reset = document.getElementById('reset');\nvar htmlCode = textareaHTML.value;\nvar cssCode = textareaCSS.value;\n\nfunction fillCode() {\n    editable.innerHTML = textareaCSS.value;\n    section.innerHTML = textareaHTML.value;\n}\n\nreset.addEventListener('click', function () {\n    textareaHTML.value = htmlCode;\n    textareaCSS.value = cssCode;\n    fillCode();\n});\n\ntextareaHTML.addEventListener('input', fillCode);\ntextareaCSS.addEventListener('input', fillCode);\nwindow.addEventListener('load', fillCode);"
  },
  {
    "path": "accessibility/tasks/html-css/styles.css",
    "content": "/* Some default styling for cookbook examples */\n/*\nrgb(53,43,34)\nrgb(75,70,74)\nrgb(95,97,110)\nrgb(137,151,188)\nrgb(160,178,226)\n*/\nbody {\n    background-color: #fff;\n    color: #333;\n    font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n    padding: 0;\n    margin: 0;\n}\n\nh1 {\n  font-size: 2rem;\n  margin: 0;\n}\n\nh2 {\n  font-size: 1.6rem;\n  margin: 0;\n}\n\np {\n  margin: 0.5em 0;\n}\n\n/* styles for the editor */\n\n.playable {\n    font-family: monospace;\n    display: block;\n    margin-bottom: 10px;\n    background-color: #F4F7F8;\n    border: none;\n    border-left: 6px solid #558ABB;\n    color: #4D4E53;\n    width: 90%;\n    max-width: 700px;\n    padding: 10px 10px 0px;\n    font-size: 90%;\n  }\n\n  .playable-css {\n    height: 80px;\n  }\n\n  .playable-html {\n    height: 160px;\n  }\n\n  .playable-buttons {\n    text-align: right;\n    width: 90%;\n    max-width: 700px;\n    padding: 5px 10px 5px 26px;\n    font-size: 100%;\n  }\n\n  .preview {\n    width: 90%;\n    max-width: 700px;\n    border: 1px solid #4D4E53;\n    border-radius: 2px;\n    padding: 10px 14px 10px 10px;\n    margin-bottom: 10px;\n  }\n\n  .preview input {\n    display: block;\n    margin: 5px;\n  }\n"
  },
  {
    "path": "accessibility/tasks/js/aria/aria-js1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>JavaScript accessibility: Task 1</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      li {\n        cursor: pointer;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n      <div class=\"animal-list\">\n        <h1>Animal summaries</h1>\n\n        <p>The following list of animals can be clicked to display a description of that animal.</p>\n\n        <ul>\n          <li tabindex=\"0\" data-description=\"A type of wild mountain goat, with large recurved horns, found in Eurasia, North Africa, and East Africa.\">Ibex</li>\n          <li tabindex=\"0\" data-description=\"A medium-sized marine mammal, similar to a manatee, but with a Dolphin-like tail.\">Dugong</li>\n          <li tabindex=\"0\" data-description=\"A rare marsupial, which looks rather like a tiny kangaroo, measuring around 50 to 75 centimeters.\">Quokka</li>\n        </ul>\n      </div>\n\n      <div class=\"animal-description\">\n        <h2></h2>\n\n        <p></p>\n      </div>\n\n    </section>\n\n  </body>\n  <script>\n\n    const listItems = document.querySelectorAll('li');\n    const descHeading = document.querySelector('.animal-description h2');\n    const descPara = document.querySelector('.animal-description p');\n\n    listItems.forEach(function(item) {\n      item.addEventListener('mouseup', handleSelection);\n      item.addEventListener('keyup', function(e) {\n        if(e.key === 'Enter') {\n          handleSelection(e);\n        }\n      });\n    })\n\n    function handleSelection(e) {\n      const heading = e.target.textContent;\n      const description = e.target.getAttribute('data-description');\n      descHeading.textContent = heading;\n      descPara.textContent = description;\n    }\n  </script>\n\n</html>\n"
  },
  {
    "path": "accessibility/tasks/js/js/js1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>JavaScript accessibility: Task 1</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      li {\n        cursor: pointer;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n      <div class=\"animal-list\">\n        <h1>Animal summaries</h1>\n\n        <p>The following list of animals can be clicked to display a description of that animal.</p>\n\n        <ul>\n          <li data-description=\"A type of wild mountain goat, with large recurved horns, found in Eurasia, North Africa, and East Africa.\">Ibex</li>\n          <li data-description=\"A medium-sized marine mammal, similar to a manatee, but with a Dolphin-like tail.\">Dugong</li>\n          <li data-description=\"A rare marsupial, which looks rather like a tiny kangaroo, measuring around 50 to 75 centimeters.\">Quokka</li>\n        </ul>\n      </div>\n\n      <div class=\"animal-description\">\n        <h2></h2>\n\n        <p></p>\n      </div>\n\n    </section>\n\n  </body>\n  <script>\n\n    const listItems = document.querySelectorAll('li');\n    const descHeading = document.querySelector('.animal-description h2');\n    const descPara = document.querySelector('.animal-description p');\n\n    listItems.forEach(function(item) {\n      item.addEventListener('mouseup', handleSelection);\n    })\n\n    function handleSelection(e) {\n      const heading = e.target.textContent;\n      const description = e.target.getAttribute('data-description');\n      descHeading.textContent = heading;\n      descPara.textContent = description;\n    }\n  </script>\n\n</html>\n"
  },
  {
    "path": "accessibility/tasks/js/playable.js",
    "content": "var section = document.querySelector('section');\nvar editable = document.querySelector('.editable');\nvar textareaJS = document.querySelector('.playable-js');\nvar reset = document.getElementById('reset');\nvar jsCode = textareaJS.value;\n\nfunction fillCode() {\n    editable.textContent = textareaJS.value;\n    try {\n      eval(editable.textContent);\n    } catch(e) {\n      let para = document.createElement('p');\n      para.textContent = e;\n      section.appendChild(para);\n    }\n}\n\nreset.addEventListener('click', function () {\n    textareaJS.value = jsCode;\n    fillCode();\n});\n\ntextareaJS.addEventListener('input', fillCode);\nwindow.addEventListener('load', fillCode);\n"
  },
  {
    "path": "accessibility/tasks/js/styles.css",
    "content": "/* Some default styling for cookbook examples */\n/*\nrgb(53,43,34)\nrgb(75,70,74)\nrgb(95,97,110)\nrgb(137,151,188)\nrgb(160,178,226)\n*/\nbody {\n    background-color: #fff;\n    color: #333;\n    font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n    padding: 0;\n    margin: 0;\n}\n\nh1 {\n  font-size: 2rem;\n  margin: 0;\n}\n\nh2 {\n  font-size: 1.6rem;\n  margin: 0;\n}\n\np {\n  margin: 0.5em 0;\n}\n\n/* styles for the editor */\n\n.playable {\n    font-family: monospace;\n    display: block;\n    margin-bottom: 10px;\n    background-color: #F4F7F8;\n    border: none;\n    border-left: 6px solid #558ABB;\n    color: #4D4E53;\n    width: 90%;\n    max-width: 700px;\n    padding: 10px 10px 0px;\n    font-size: 90%;\n  }\n\n  .playable-css {\n    height: 80px;\n  }\n\n  .playable-js {\n    height: 160px;\n  }\n\n  .playable-buttons {\n    text-align: right;\n    width: 90%;\n    max-width: 700px;\n    padding: 5px 10px 5px 26px;\n    font-size: 100%;\n  }\n\n  .preview {\n    width: 90%;\n    max-width: 700px;\n    border: 1px solid #4D4E53;\n    border-radius: 2px;\n    padding: 10px 14px 10px 10px;\n    margin-bottom: 10px;\n  }\n\n  .preview input {\n    display: block;\n    margin: 5px;\n  }\n"
  },
  {
    "path": "css/css-layout/flexbox/complex-flexbox.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Complex flexbox example</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      body {\n        margin: 0;\n      }\n\n      header {\n        background: purple;\n        height: 100px;\n      }\n\n      h1 {\n        text-align: center;\n        color: white;\n        line-height: 100px;\n        margin: 0;\n      }\n\n      article {\n        padding: 10px;\n        margin: 10px;\n        background: aqua;\n      }\n\n      /* Add your flexbox CSS below here */\n\n      section {\n        display: flex;\n      }\n\n      article {\n        flex: 1 200px;\n      }\n\n      article:nth-of-type(3) {\n        flex: 3 200px;\n        display: flex;\n        flex-flow: column;\n      }\n\n      article:nth-of-type(3) div:first-child {\n        flex: 1 100px;\n        display: flex;\n        flex-flow: row wrap;\n        align-items: center;\n        justify-content: space-around;\n      }\n\n      button {\n        flex: 1 auto;\n        margin: 5px;\n        font-size: 18px;\n        line-height: 1.5;\n      }\n      \n    </style>\n  </head>\n  <body>\n    <header>\n      <h1>Complex flexbox example</h1>\n    </header>\n\n    <section>\n      <article>\n        <h2>First article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Second article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <div>\n          <button>Smile</button>\n          <button>Laugh</button>\n          <button>Wink</button>\n          <button>Shrug</button>\n          <button>Blush</button>\n        </div>\n        <div>\n          <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n        </div>\n        <div>\n          <p>Cray food truck brunch, XOXO +1 keffiyeh pickled chambray waistcoat ennui. Organic small batch paleo 8-bit. Intelligentsia umami wayfarers pickled, asymmetrical kombucha letterpress kitsch leggings cold-pressed squid chartreuse put a bird on it. Listicle pickled man bun cornhole heirloom art party.</p>\n        </div>\n      </article>\n    </section>\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/flexbox/flex-align0.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Flexbox align 0 — starting code</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      body {\n        width: 70%;\n        max-width: 960px;\n        margin: 20px auto;\n      }\n\n      button {\n        font-size: 18px;\n        line-height: 1.5;\n        width: 15%;\n      }\n\n      div {\n        height: 100px;\n        border: 1px solid black;\n      }\n\n      /* Add your flexbox CSS below here */\n\n      \n    </style>\n  </head>\n  <body>\n    <div>\n      <button>Smile</button>\n      <button>Laugh</button>\n      <button>Wink</button>\n      <button>Shrug</button>\n      <button>Blush</button>\n    </div>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/flexbox/flex-align1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Flexbox align 1 —  center aligned horizontally and vertically</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      body {\n        width: 70%;\n        max-width: 960px;\n        margin: 20px auto;\n      }\n\n      button {\n        font-size: 18px;\n        line-height: 1.5;\n        width: 15%;\n      }\n\n      div {\n        height: 100px;\n        border: 1px solid black;\n      }\n\n      /* Add your flexbox CSS below here */\n\n      div {\n        display: flex;\n        align-items: center;\n        justify-content: space-around;\n      }\n\n      \n    </style>\n  </head>\n  <body>\n    <div>\n      <button>Smile</button>\n      <button>Laugh</button>\n      <button>Wink</button>\n      <button>Shrug</button>\n      <button>Blush</button>\n    </div>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/flexbox/flex-ordering.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Flexbox ordering example</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      body {\n        width: 70%;\n        max-width: 960px;\n        margin: 20px auto;\n      }\n\n      button {\n        font-size: 18px;\n        line-height: 1.5;\n        width: 15%;\n      }\n\n      div {\n        height: 100px;\n        border: 1px solid black;\n      }\n\n      /* Add your flexbox CSS below here */\n\n      div {\n        display: flex;\n        align-items: center;\n        justify-content: space-around;\n      }\n\n      button:first-child {\n        order: 1;\n      }\n\n      button:last-child {\n        order: -1;\n      }\n\n      \n    </style>\n  </head>\n  <body>\n    <div>\n      <button>Smile</button>\n      <button>Laugh</button>\n      <button>Wink</button>\n      <button>Shrug</button>\n      <button>Blush</button>\n    </div>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/flexbox/flexbox-wrap0.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Flexbox wrap 0 — children overflowing</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      body {\n        margin: 0;\n      }\n\n      header {\n        background: purple;\n        height: 100px;\n      }\n\n      h1 {\n        text-align: center;\n        color: white;\n        line-height: 100px;\n        margin: 0;\n      }\n\n      article {\n        padding: 10px;\n        margin: 10px;\n        background: aqua;\n      }\n\n      /* Add your flexbox CSS below here */\n\n      section {\n        display: flex;\n        flex-direction: row;\n      }\n\n      article {\n        \n      }\n\n\n    </style>\n  </head>\n  <body>\n    <header>\n      <h1>Sample flexbox example</h1>\n    </header>\n\n    <section>\n      <article>\n        <h2>First article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Second article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Third article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n\n        <p>Cray food truck brunch, XOXO +1 keffiyeh pickled chambray waistcoat ennui. Organic small batch paleo 8-bit. Intelligentsia umami wayfarers pickled, asymmetrical kombucha letterpress kitsch leggings cold-pressed squid chartreuse put a bird on it. Listicle pickled man bun cornhole heirloom art party.</p>\n      </article>\n\n      <article>\n        <h2>Fourth article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Fifth article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Sixth article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n\n        <p>Cray food truck brunch, XOXO +1 keffiyeh pickled chambray waistcoat ennui. Organic small batch paleo 8-bit. Intelligentsia umami wayfarers pickled, asymmetrical kombucha letterpress kitsch leggings cold-pressed squid chartreuse put a bird on it. Listicle pickled man bun cornhole heirloom art party.</p>\n      </article>\n\n      <article>\n        <h2>Seventh article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Eighth article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Ninth article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n\n        <p>Cray food truck brunch, XOXO +1 keffiyeh pickled chambray waistcoat ennui. Organic small batch paleo 8-bit. Intelligentsia umami wayfarers pickled, asymmetrical kombucha letterpress kitsch leggings cold-pressed squid chartreuse put a bird on it. Listicle pickled man bun cornhole heirloom art party.</p>\n      </article>\n\n      <article>\n        <h2>Tenth article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Eleventh article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Twelfth article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n\n        <p>Cray food truck brunch, XOXO +1 keffiyeh pickled chambray waistcoat ennui. Organic small batch paleo 8-bit. Intelligentsia umami wayfarers pickled, asymmetrical kombucha letterpress kitsch leggings cold-pressed squid chartreuse put a bird on it. Listicle pickled man bun cornhole heirloom art party.</p>\n      </article>\n    </section>\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/flexbox/flexbox-wrap1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Flexbox wrap 1 — wrapping our content to new rows</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      body {\n        margin: 0;\n      }\n\n      header {\n        background: purple;\n        height: 100px;\n      }\n\n      h1 {\n        text-align: center;\n        color: white;\n        line-height: 100px;\n        margin: 0;\n      }\n\n      article {\n        padding: 10px;\n        margin: 10px;\n        background: aqua;\n      }\n\n      /* Add your flexbox CSS below here */\n\n      section {\n        display: flex;\n        flex-direction: row-reverse;\n        flex-wrap: wrap;\n      }\n\n      article {\n        flex: 200px;\n      }\n\n\n    </style>\n  </head>\n  <body>\n    <header>\n      <h1>Sample flexbox example</h1>\n    </header>\n\n    <section>\n      <article>\n        <h2>First article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Second article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Third article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n\n        <p>Cray food truck brunch, +1 keffiyeh pickled chambray waistcoat ennui. Organic small batch paleo 8-bit. Intelligentsia umami wayfarers pickled, asymmetrical kombucha letterpress kitsch leggings cold-pressed squid chartreuse put a bird on it. Listicle pickled man bun cornhole heirloom art party.</p>\n      </article>\n\n      <article>\n        <h2>Fourth article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Fifth article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Six article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n\n        <p>Cray food truck brunch, +1 keffiyeh pickled chambray waistcoat ennui. Organic small batch paleo 8-bit. Intelligentsia umami wayfarers pickled, asymmetrical kombucha letterpress kitsch leggings cold-pressed squid chartreuse put a bird on it. Listicle pickled man bun cornhole heirloom art party.</p>\n      </article>\n\n      <article>\n        <h2>Seventh article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Eighth article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Ninth article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n\n        <p>Cray food truck brunch, +1 keffiyeh pickled chambray waistcoat ennui. Organic small batch paleo 8-bit. Intelligentsia umami wayfarers pickled, asymmetrical kombucha letterpress kitsch leggings cold-pressed squid chartreuse put a bird on it. Listicle pickled man bun cornhole heirloom art party.</p>\n      </article>\n\n      <article>\n        <h2>Tenth article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Eleventh article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Twelfth article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n\n        <p>Cray food truck brunch, +1 keffiyeh pickled chambray waistcoat ennui. Organic small batch paleo 8-bit. Intelligentsia umami wayfarers pickled, asymmetrical kombucha letterpress kitsch leggings cold-pressed squid chartreuse put a bird on it. Listicle pickled man bun cornhole heirloom art party.</p>\n      </article>\n    </section>\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/flexbox/flexbox0.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Flexbox 0 — starting code</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      body {\n        margin: 0;\n      }\n\n      header {\n        background: purple;\n        height: 100px;\n      }\n\n      h1 {\n        text-align: center;\n        color: white;\n        line-height: 100px;\n        margin: 0;\n      }\n\n      article {\n        padding: 10px;\n        margin: 10px;\n        background: aqua;\n      }\n\n      /* Add your flexbox CSS below here */\n\n\n      \n    </style>\n  </head>\n  <body>\n    <header>\n      <h1>Sample flexbox example</h1>\n    </header>\n\n    <section>\n      <article>\n        <h2>First article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Second article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Third article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n\n        <p>Cray food truck brunch, XOXO +1 keffiyeh pickled chambray waistcoat ennui. Organic small batch paleo 8-bit. Intelligentsia umami wayfarers pickled, asymmetrical kombucha letterpress kitsch leggings cold-pressed squid chartreuse put a bird on it. Listicle pickled man bun cornhole heirloom art party.</p>\n      </article>\n    </section>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/flexbox/flexbox1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Flexbox 1 — basic flexbox model chosen</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      body {\n        margin: 0;\n      }\n\n      header {\n        background: purple;\n        height: 100px;\n      }\n\n      h1 {\n        text-align: center;\n        color: white;\n        line-height: 100px;\n        margin: 0;\n      }\n\n      article {\n        padding: 10px;\n        margin: 10px;\n        background: aqua;\n      }\n\n      /* Add your flexbox CSS below here */\n\n      section {\n        display: flex;\n      }\n\n      \n    </style>\n  </head>\n  <body>\n    <header>\n      <h1>Sample flexbox example</h1>\n    </header>\n\n    <section>\n      <article>\n        <h2>First article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Second article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Third article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n\n        <p>Cray food truck brunch, XOXO +1 keffiyeh pickled chambray waistcoat ennui. Organic small batch paleo 8-bit. Intelligentsia umami wayfarers pickled, asymmetrical kombucha letterpress kitsch leggings cold-pressed squid chartreuse put a bird on it. Listicle pickled man bun cornhole heirloom art party.</p>\n      </article>\n    </section>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/flexbox/flexbox2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Flexbox 2 — flexible sized items</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      body {\n        margin: 0;\n      }\n\n      header {\n        background: purple;\n        height: 100px;\n      }\n\n      h1 {\n        text-align: center;\n        color: white;\n        line-height: 100px;\n        margin: 0;\n      }\n\n      article {\n        padding: 10px;\n        margin: 10px;\n        background: aqua;\n      }\n\n      /* Add your flexbox CSS below here */\n\n      section {\n        display: flex;\n      }\n\n      article {\n        flex: 1 200px;\n      }\n\n      article:nth-of-type(3) {\n        flex: 2 200px;\n      }\n      \n    </style>\n  </head>\n  <body>\n    <header>\n      <h1>Sample flexbox example</h1>\n    </header>\n\n    <section>\n      <article>\n        <h2>First article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Second article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n      </article>\n\n      <article>\n        <h2>Third article</h2>\n\n        <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n\n        <p>Cray food truck brunch, XOXO +1 keffiyeh pickled chambray waistcoat ennui. Organic small batch paleo 8-bit. Intelligentsia umami wayfarers pickled, asymmetrical kombucha letterpress kitsch leggings cold-pressed squid chartreuse put a bird on it. Listicle pickled man bun cornhole heirloom art party.</p>\n      </article>\n    </section>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/floats/0_two-column-layout.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>2 column layout example</title>\n    <style>\n      body {\n        width: 90%;\n        max-width: 900px;\n        margin: 0 auto;\n      }\n\n      div:nth-of-type(1) {\n        width: 48%;\n        float: left;\n      }\n\n      div:nth-of-type(2) {\n        width: 48%;\n        float: right;\n      }   \n    </style>\n  </head>\n  <body>\n    <h1>2 column layout example</h1>\n\n    <div>\n      <h2>First column</h2>\n      <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n    </div>\n\n    <div>\n      <h2>Second column</h2>\n      <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n    </div>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/floats/1-basic-example.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple float example</title>\n    <style>\n      body {\n        width: 90%;\n        max-width: 900px;\n        margin: 0 auto;\n        font: .9em/1.2 Arial, Helvetica, sans-serif\n      }\n\n      .box {\n        float: left;\n        margin-right: 15px;\n        width: 150px;\n        height: 150px;\n        border-radius: 5px;\n        background-color: rgb(207,232,220);\n        padding: 1em;\n      }   \n    </style>\n  </head>\n  <body>\n    <h1>Simple float example</h1>\n\n    <div class=\"box\">Float</div>\n\n    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate.</p>\n    \n    <p>Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n\n    <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/floats/1_three-column-layout.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>3 column layout example</title>\n    <style>\n      body {\n        width: 90%;\n        max-width: 900px;\n        margin: 0 auto;\n      }\n\n      div:nth-of-type(1) {\n        width: 36%;\n        float: left;\n      }\n\n      div:nth-of-type(2) {\n        width: 30%;\n        float: left;\n        margin-left: 4%;\n      }\n\n      div:nth-of-type(3) {\n        width: 26%;\n        float: right;\n      }   \n    </style>\n  </head>\n  <body>\n    <h1>3 column layout example</h1>\n\n    <div>\n      <h2>First column</h2>\n      <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n    </div>\n\n    <div>\n      <h2>Second column</h2>\n      <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n    </div>\n\n    <div>\n      <h2>Third column</h2>\n\n      <p>Nam consequat scelerisque mattis. Duis pulvinar dapibus magna, eget congue purus mollis sit amet. Sed euismod lacus sit amet ex tempus, a semper felis ultrices. Maecenas a efficitur metus. Nullam tempus pharetra pharetra. Morbi in leo mauris. Nullam gravida ligula eros, lacinia sagittis lorem fermentum ut. Praesent dapibus eros vel mi pretium, nec convallis nibh blandit. Sed scelerisque justo ac ligula mollis laoreet. In mattis, risus et porta scelerisque, augue neque hendrerit orci, sit amet imperdiet risus neque vitae lectus. In tempus lectus a quam posuere vestibulum. Duis quis finibus mi. Nullam commodo mi in enim maximus fermentum. Mauris finibus at lorem vel sollicitudin.</p>\n    </div>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/floats/2-line-boxes.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple float example</title>\n    <style>\n      body {\n        width: 90%;\n        max-width: 900px;\n        margin: 0 auto;\n        font: .9em/1.2 Arial, Helvetica, sans-serif\n      }\n\n      .box {\n        float: left;\n        margin: 15px;\n        width: 150px;\n        height: 150px;\n        border-radius: 5px;\n        background-color: rgb(207,232,220);\n        padding: 1em;\n      } \n\n      .special {\n          background-color: rgb(79,185,227);\n          padding: 10px;\n          color: #fff;\n      }  \n    </style>\n  </head>\n  <body>\n    <h1>Simple float example</h1>\n\n    <div class=\"box\">Float</div>\n\n    <p class=\"special\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate. </p>\n    \n    <p>Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n\n    <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/floats/2_float-disaster.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Float disaster</title>\n    <style>\n      body {\n        width: 90%;\n        max-width: 900px;\n        margin: 0 auto;\n      }\n\n      div:nth-of-type(1) {\n        width: 36%;\n        float: left;\n      }\n\n      div:nth-of-type(2) {\n        width: 30%;\n        float: left;\n        margin-left: 4%;\n      }\n\n      div:nth-of-type(3) {\n        width: 26%;\n        float: right;\n      } \n    </style>\n  </head>\n  <body>\n    <h1>Float disaster</h1>\n\n    <div>\n      <h2>First column</h2>\n      <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n    </div>\n\n    <div>\n      <h2>Second column</h2>\n      <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n    </div>\n\n    <div>\n      <h2>Third column</h2>\n\n      <p>Nam consequat scelerisque mattis. Duis pulvinar dapibus magna, eget congue purus mollis sit amet. Sed euismod lacus sit amet ex tempus, a semper felis ultrices. Maecenas a efficitur metus. Nullam tempus pharetra pharetra. Morbi in leo mauris. Nullam gravida ligula eros, lacinia sagittis lorem fermentum ut. Praesent dapibus eros vel mi pretium, nec convallis nibh blandit. Sed scelerisque justo ac ligula mollis laoreet. In mattis, risus et porta scelerisque, augue neque hendrerit orci, sit amet imperdiet risus neque vitae lectus. In tempus lectus a quam posuere vestibulum. Duis quis finibus mi. Nullam commodo mi in enim maximus fermentum. Mauris finibus at lorem vel sollicitudin.</p>\n    </div>\n\n    <footer>\n      <p>&copy;2016 your imagination. This isn't really copyright, this is a mockery of the very concept. Use as you wish.</p>\n    </footer>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/floats/2a_fixed-by-clear.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Float disaster</title>\n    <style>\n      body {\n        width: 90%;\n        max-width: 900px;\n        margin: 0 auto;\n      }\n\n      div:nth-of-type(1) {\n        width: 36%;\n        float: left;\n      }\n\n      div:nth-of-type(2) {\n        width: 30%;\n        float: left;\n        margin-left: 4%;\n      }\n\n      div:nth-of-type(3) {\n        width: 26%;\n        float: right;\n      } \n\n      footer {\n        clear: both;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Float disaster</h1>\n\n    <div>\n      <h2>First column</h2>\n      <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n    </div>\n\n    <div>\n      <h2>Second column</h2>\n      <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n    </div>\n\n    <div>\n      <h2>Third column</h2>\n\n      <p>Nam consequat scelerisque mattis. Duis pulvinar dapibus magna, eget congue purus mollis sit amet. Sed euismod lacus sit amet ex tempus, a semper felis ultrices. Maecenas a efficitur metus. Nullam tempus pharetra pharetra. Morbi in leo mauris. Nullam gravida ligula eros, lacinia sagittis lorem fermentum ut. Praesent dapibus eros vel mi pretium, nec convallis nibh blandit. Sed scelerisque justo ac ligula mollis laoreet. In mattis, risus et porta scelerisque, augue neque hendrerit orci, sit amet imperdiet risus neque vitae lectus. In tempus lectus a quam posuere vestibulum. Duis quis finibus mi. Nullam commodo mi in enim maximus fermentum. Mauris finibus at lorem vel sollicitudin.</p>\n    </div>\n\n    <footer>\n      <p>&copy;2016 your imagination. This isn't really copyright, this is a mockery of the very concept. Use as you wish.</p>\n    </footer>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/floats/3-clearing.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple clearing example</title>\n    <style>\n      body {\n        width: 90%;\n        max-width: 900px;\n        margin: 0 auto;\n        font: .9em/1.2 Arial, Helvetica, sans-serif\n      }\n\n      .box {\n        float: left;\n        margin-right: 15px;\n        width: 150px;\n        height: 150px;\n        border-radius: 5px;\n        background-color: rgb(207,232,220);\n        padding: 1em;\n      } \n\n      .cleared {\n          clear: left;\n      }  \n    </style>\n  </head>\n  <body>\n    <h1>Float clearing example</h1>\n\n    <div class=\"box\">Float</div>\n\n    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate.</p>\n    \n    <p class=\"cleared\">Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n\n    <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/floats/3_broken-layout.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Float disaster</title>\n    <style>\n      body {\n        width: 90%;\n        max-width: 900px;\n        margin: 0 auto;\n      }\n\n      div:nth-of-type(1) {\n        width: 36%;\n        float: left;\n      }\n\n      div:nth-of-type(2) {\n        width: 30%;\n        float: left;\n        margin-left: 4%;\n      }\n\n      div:nth-of-type(3) {\n        width: 26%;\n        float: right;\n      } \n\n      footer {\n        clear: both;\n      }  \n\n      div, footer {\n        padding: 1%;\n        border: 2px solid black;\n        background-color: red;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Float disaster</h1>\n\n    <div>\n      <h2>First column</h2>\n      <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n    </div>\n\n    <div>\n      <h2>Second column</h2>\n      <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n    </div>\n\n    <div>\n      <h2>Third column</h2>\n\n      <p>Nam consequat scelerisque mattis. Duis pulvinar dapibus magna, eget congue purus mollis sit amet. Sed euismod lacus sit amet ex tempus, a semper felis ultrices. Maecenas a efficitur metus. Nullam tempus pharetra pharetra. Morbi in leo mauris. Nullam gravida ligula eros, lacinia sagittis lorem fermentum ut. Praesent dapibus eros vel mi pretium, nec convallis nibh blandit. Sed scelerisque justo ac ligula mollis laoreet. In mattis, risus et porta scelerisque, augue neque hendrerit orci, sit amet imperdiet risus neque vitae lectus. In tempus lectus a quam posuere vestibulum. Duis quis finibus mi. Nullam commodo mi in enim maximus fermentum. Mauris finibus at lorem vel sollicitudin.</p>\n    </div>\n\n    <footer>\n      <p>&copy;2016 your imagination. This isn't really copyright, this is a mockery of the very concept. Use as you wish.</p>\n    </footer>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/floats/4-clearfix.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple clearing example</title>\n    <style>\n      body {\n        width: 90%;\n        max-width: 900px;\n        margin: 0 auto;\n        font: .9em/1.2 Arial, Helvetica, sans-serif\n      }\n\n      .box {\n        float: left;\n        margin-right: 15px;\n        width: 150px;\n        height: 150px;\n        border-radius: 5px;\n        background-color: rgb(207,232,220);\n        color: #000;\n        padding: 1em;\n      } \n\n      .wrapper {\n        background-color: rgb(79,185,227);\n        padding: 10px;\n        color: #fff; \n      }\n\n    .wrapper::after {\n        content: \"\";\n        clear: both;\n        display: block;\n    }\n\n    </style>\n  </head>\n  <body>\n    <h1>\"clearfix\" example</h1>\n    <div class=\"wrapper\">\n        <div class=\"box\">Float</div>\n\n        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate. </p>\n    </div>\n    \n    <p>Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n\n    <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/floats/4_fixed-layout-border-box.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Fixed layout border-box</title>\n    <style>\n      body {\n        width: 90%;\n        max-width: 900px;\n        margin: 0 auto;\n      }\n\n      div:nth-of-type(1) {\n        width: 36%;\n        float: left;\n      }\n\n      div:nth-of-type(2) {\n        width: 30%;\n        float: left;\n        margin-left: 4%;\n      }\n\n      div:nth-of-type(3) {\n        width: 26%;\n        float: right;\n      } \n\n      footer {\n        margin-top: 4%;\n      }  \n\n      .clearfix {\n        clear: both;\n      }\n\n      .column, footer {\n        padding: 1%;\n        border: 2px solid black;\n        background-color: red;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Fixed layout border-box</h1>\n\n    <div class=\"column\">\n      <h2>First column</h2>\n      <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n    </div>\n\n    <div class=\"column\">\n      <h2>Second column</h2>\n      <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n    </div>\n\n    <div class=\"column\">\n      <h2>Third column</h2>\n\n      <p>Nam consequat scelerisque mattis. Duis pulvinar dapibus magna, eget congue purus mollis sit amet. Sed euismod lacus sit amet ex tempus, a semper felis ultrices. Maecenas a efficitur metus. Nullam tempus pharetra pharetra. Morbi in leo mauris. Nullam gravida ligula eros, lacinia sagittis lorem fermentum ut. Praesent dapibus eros vel mi pretium, nec convallis nibh blandit. Sed scelerisque justo ac ligula mollis laoreet. In mattis, risus et porta scelerisque, augue neque hendrerit orci, sit amet imperdiet risus neque vitae lectus. In tempus lectus a quam posuere vestibulum. Duis quis finibus mi. Nullam commodo mi in enim maximus fermentum. Mauris finibus at lorem vel sollicitudin.</p>\n    </div>\n\n    <div class=\"clearfix\"></div>\n\n    <footer>\n      <p>&copy;2016 your imagination. This isn't really copyright, this is a mockery of the very concept. Use as you wish.</p>\n    </footer>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/floats/5-overflow.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple clearing example</title>\n    <style>\n      body {\n        width: 90%;\n        max-width: 900px;\n        margin: 0 auto;\n        font: .9em/1.2 Arial, Helvetica, sans-serif\n      }\n\n      .box {\n        float: left;\n        margin-right: 15px;\n        width: 150px;\n        height: 150px;\n        border-radius: 5px;\n        background-color: rgb(207,232,220);\n        color: #000;\n        padding: 1em;\n      } \n\n      .wrapper {\n        background-color: rgb(79,185,227);\n        padding: 10px;\n        color: #fff; \n        overflow: auto;\n      }\n\n\n    </style>\n  </head>\n  <body>\n    <h1>clearing with overflow example</h1>\n    <div class=\"wrapper\">\n        <div class=\"box\">Float</div>\n\n        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate. </p>\n    </div>\n    \n    <p>Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n\n    <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/floats/5_fixed-height-columns.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Fixed height columns</title>\n    <style>\n      body {\n        width: 90%;\n        max-width: 900px;\n        margin: 0 auto;\n      }\n\n      div:nth-of-type(1) {\n        width: 36%;\n        float: left;\n      }\n\n      div:nth-of-type(2) {\n        width: 30%;\n        float: left;\n        margin-left: 4%;\n      }\n\n      div:nth-of-type(3) {\n        width: 26%;\n        float: right;\n      } \n\n      footer {\n        margin-top: 4%;\n      }  \n\n      .clearfix {\n        clear: both;\n      }\n\n      .column, footer {\n        padding: 1%;\n        border: 2px solid black;\n        background-color: red;\n      }\n\n      .column {\n        height: 550px;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Fixed height columns</h1>\n\n    <div class=\"column\">\n      <h2>First column</h2>\n      <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n    </div>\n\n    <div class=\"column\">\n      <h2>Second column</h2>\n      <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n    </div>\n\n    <div class=\"column\">\n      <h2>Third column</h2>\n\n      <p>Nam consequat scelerisque mattis. Duis pulvinar dapibus magna, eget congue purus mollis sit amet. Sed euismod lacus sit amet ex tempus, a semper felis ultrices. Maecenas a efficitur metus. Nullam tempus pharetra pharetra. Morbi in leo mauris. Nullam gravida ligula eros, lacinia sagittis lorem fermentum ut. Praesent dapibus eros vel mi pretium, nec convallis nibh blandit. Sed scelerisque justo ac ligula mollis laoreet. In mattis, risus et porta scelerisque, augue neque hendrerit orci, sit amet imperdiet risus neque vitae lectus. In tempus lectus a quam posuere vestibulum. Duis quis finibus mi. Nullam commodo mi in enim maximus fermentum. Mauris finibus at lorem vel sollicitudin.</p>\n    </div>\n\n    <div class=\"clearfix\"></div>\n\n    <footer>\n      <p>&copy;2016 your imagination. This isn't really copyright, this is a mockery of the very concept. Use as you wish.</p>\n    </footer>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/floats/6-flow-root.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple clearing example</title>\n    <style>\n      body {\n        width: 90%;\n        max-width: 900px;\n        margin: 0 auto;\n        font: .9em/1.2 Arial, Helvetica, sans-serif;\n      }\n\n      .box {\n        float: left;\n        margin-right: 15px;\n        width: 150px;\n        height: 150px;\n        border-radius: 5px;\n        background-color: rgb(207,232,220);\n        color: #000;\n        padding: 1em;\n      } \n\n      .wrapper {\n        background-color: rgb(79,185,227);\n        padding: 10px;\n        color: #fff; \n        display: flow-root;\n      }\n\n\n    </style>\n  </head>\n  <body>\n    <h1>flow-root example</h1>\n    <div class=\"wrapper\">\n        <div class=\"box\">Float</div>\n\n        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate. </p>\n    </div>\n    \n    <p>Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n\n    <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/floats/fixed-layout-adjusted-percentages.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Fixed layout adjusted percentages</title>\n    <style>\n      body {\n        width: 90%;\n        max-width: 900px;\n        margin: 0 auto;\n      }\n\n      div:nth-of-type(1) {\n        width: 34%;\n        float: left;\n      }\n\n      div:nth-of-type(2) {\n        width: 29%;\n        float: left;\n        margin-left: 3%;\n      }\n\n      div:nth-of-type(3) {\n        width: 24%;\n        float: right;\n      } \n\n      footer {\n        margin-top: 4%;\n      }  \n\n      .clearfix {\n        clear: both;\n      }\n\n      .column, footer {\n        padding: 1%;\n        border: 2px solid black;\n        background-color: red;\n      }\n\n     /* * {\n        box-sizing: border-box;\n      }*/\n    </style>\n  </head>\n  <body>\n    <h1>Fixed layout adjusted percentages</h1>\n\n    <div class=\"column\">\n      <h2>First column</h2>\n      <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n    </div>\n\n    <div class=\"column\">\n      <h2>Second column</h2>\n      <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n    </div>\n\n    <div class=\"column\">\n      <h2>Third column</h2>\n\n      <p>Nam consequat scelerisque mattis. Duis pulvinar dapibus magna, eget congue purus mollis sit amet. Sed euismod lacus sit amet ex tempus, a semper felis ultrices. Maecenas a efficitur metus. Nullam tempus pharetra pharetra. Morbi in leo mauris. Nullam gravida ligula eros, lacinia sagittis lorem fermentum ut. Praesent dapibus eros vel mi pretium, nec convallis nibh blandit. Sed scelerisque justo ac ligula mollis laoreet. In mattis, risus et porta scelerisque, augue neque hendrerit orci, sit amet imperdiet risus neque vitae lectus. In tempus lectus a quam posuere vestibulum. Duis quis finibus mi. Nullam commodo mi in enim maximus fermentum. Mauris finibus at lorem vel sollicitudin.</p>\n    </div>\n\n    <div class=\"clearfix\"></div>\n\n    <footer>\n      <p>&copy;2016 your imagination. This isn't really copyright, this is a mockery of the very concept. Use as you wish.</p>\n    </footer>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/floats/simple-float.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple float example</title>\n    <style>\n      body {\n        width: 90%;\n        max-width: 900px;\n        margin: 0 auto;\n      }\n\n      p {\n        line-height: 2;\n        word-spacing: 0.1rem;\n      }\n\n      img {\n        float: right;\n        margin-left: 30px;\n      }   \n    </style>\n  </head>\n  <body>\n    <h1>Simple float example</h1>\n\n    <img src=\"butterfly.jpg\" alt=\"A pretty butterfly with red, white, and brown coloring, sitting on a large leaf\">\n\n    <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n\n    <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/floats/three-column-layout-wrong-order.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>3 column layout wrong order</title>\n    <style>\n      body {\n        width: 90%;\n        max-width: 900px;\n        margin: 0 auto;\n      }\n\n      div:nth-of-type(1) {\n        width: 36%;\n        float: left;\n      }\n\n      div:nth-of-type(2) {\n        width: 30%;\n        float: right;\n        margin-left: 4%;\n      }\n\n      div:nth-of-type(3) {\n        width: 26%;\n        float: right;\n      }   \n    </style>\n  </head>\n  <body>\n    <h1>3 column layout wrong order</h1>\n\n    <div>\n      <h2>First column</h2>\n      <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n    </div>\n\n    <div>\n      <h2>Second column</h2>\n      <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n    </div>\n\n    <div>\n      <h2>Third column</h2>\n\n      <p>Nam consequat scelerisque mattis. Duis pulvinar dapibus magna, eget congue purus mollis sit amet. Sed euismod lacus sit amet ex tempus, a semper felis ultrices. Maecenas a efficitur metus. Nullam tempus pharetra pharetra. Morbi in leo mauris. Nullam gravida ligula eros, lacinia sagittis lorem fermentum ut. Praesent dapibus eros vel mi pretium, nec convallis nibh blandit. Sed scelerisque justo ac ligula mollis laoreet. In mattis, risus et porta scelerisque, augue neque hendrerit orci, sit amet imperdiet risus neque vitae lectus. In tempus lectus a quam posuere vestibulum. Duis quis finibus mi. Nullam commodo mi in enim maximus fermentum. Mauris finibus at lorem vel sollicitudin.</p>\n    </div>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/floats/two-column-layout-fixed.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>2 column layout fixed example</title>\n    <style>\n      body {\n        width: 900px;\n        margin: 0 auto;\n      }\n\n      div:nth-of-type(1) {\n        width: 430px;\n        float: left;\n      }\n\n      div:nth-of-type(2) {\n        width: 430px;\n        float: right;\n      }   \n    </style>\n  </head>\n  <body>\n    <h1>2 column layout fixed example</h1>\n\n    <div>\n      <h2>First column</h2>\n      <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n    </div>\n\n    <div>\n      <h2>Second column</h2>\n      <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n    </div>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/fundamental-layout-comprehension/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>Layout Task</title>\n    <link href=\"styles.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n\n<body>\n\n  <div class=\"logo\">\n    My exciting website!\n  </div>\n\n  <nav>\n    <ul>\n      <li>\n        <a href=\"\">Home</a>\n      </li>\n      <li>\n        <a href=\"\">Blog</a>\n      </li>\n      <li>\n        <a href=\"\">About us</a>\n      </li>\n      <li>\n        <a href=\"\">Our history</a>\n      </li>\n      <li>\n        <a href=\"\">Contacts</a>\n      </li>\n    </ul>\n  </nav>\n\n  <main class=\"grid\">\n    <article>\n      <h1>\n        An Exciting Blog Post\n      </h1>\n      <img src=\"images/balloon-sq6.jpg\" alt=\"placeholder\" class=\"feature\">\n      <p>Veggies es bonus vobis, proinde vos postulo essum magis kohlrabi welsh onion daikon amaranth tatsoi tomatillo melon\n        azuki bean garlic.</p>\n\n      <p>Gumbo beet greens corn soko endive gumbo gourd. Parsley shallot courgette tatsoi pea sprouts fava bean collard greens\n        dandelion okra wakame tomato. Dandelion cucumber earthnut pea peanut soko zucchini.</p>\n\n      <p>Turnip greens yarrow ricebean rutabaga endive cauliflower sea lettuce kohlrabi amaranth water spinach avocado daikon\n        napa cabbage asparagus winter purslane kale. Celery potato scallion desert raisin horseradish spinach carrot soko.\n        Lotus root water spinach fennel kombu maize bamboo shoot green bean swiss chard seakale pumpkin onion chickpea gram\n        corn pea. Brussels sprout coriander water chestnut gourd swiss chard wakame kohlrabi beetroot carrot watercress.\n        Corn amaranth salsify bunya nuts nori azuki bean chickweed potato bell pepper artichoke.</p>\n\n      <p>Nori grape silver beet broccoli kombu beet greens fava bean potato quandong celery. Bunya nuts black-eyed pea prairie\n        turnip leek lentil turnip greens parsnip. Sea lettuce lettuce water chestnut eggplant winter purslane fennel azuki\n        bean earthnut pea sierra leone bologi leek soko chicory celtuce parsley jícama salsify.</p>\n\n      <p>Celery quandong swiss chard chicory earthnut pea potato. Salsify taro catsear garlic gram celery bitterleaf wattle\n        seed collard greens nori. Grape wattle seed kombu beetroot horseradish carrot squash brussels sprout chard.</p>\n\n    </article>\n\n    <aside>\n      <h2>\n        Photography\n      </h2>\n      <ul class=\"photos\">\n        <li>\n          <img src=\"images/balloon-sq1.jpg\" alt=\"placeholder\">\n        </li>\n        <li>\n          <img src=\"images/balloon-sq2.jpg\" alt=\"placeholder\">\n        </li>\n        <li>\n          <img src=\"images/balloon-sq3.jpg\" alt=\"placeholder\">\n        </li>\n        <li>\n          <img src=\"images/balloon-sq4.jpg\" alt=\"placeholder\">\n        </li>\n        <li>\n          <img src=\"images/balloon-sq5.jpg\" alt=\"placeholder\">\n        </li>\n      </ul>\n\n    </aside>\n  </main>\n\n</body>\n\n</html>\n"
  },
  {
    "path": "css/css-layout/fundamental-layout-comprehension/styles.css",
    "content": "body {\n    background-color: #fff;\n    color: #333;\n    margin: 0;\n    font: 1.2em / 1.2 Arial, Helvetica, sans-serif;\n  }\n\n  img {\n      max-width: 100%;\n      display: block;\n  }\n  \n  .logo {\n    font-size: 200%;\n    padding: 50px 20px;\n    margin: 0 auto;\n    max-width: 980px;\n  }\n  \n  .grid {\n    margin: 0 auto;\n    padding: 0 20px;\n    max-width: 980px;\n  }\n  \n  nav {\n    background-color: #000;\n    padding: .5em;\n  }\n  \n  nav ul {\n    margin: 0;\n    padding: 0;\n    list-style: none;\n  }\n  \n  nav a {\n    color: #fff;\n    text-decoration: none;\n    padding: .5em 1em;\n  }\n  \n  .photos {\n    list-style: none;\n    margin: 0;\n    padding: 0;\n  }\n\n  .feature {\n      width: 200px;\n  }"
  },
  {
    "path": "css/css-layout/fundamental-layout-comprehension-finish/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>Layout Task</title>\n    <link href=\"styles.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n\n<body>\n\n  <div class=\"logo\">\n    My exciting website!\n  </div>\n\n  <nav>\n    <ul>\n      <li>\n        <a href=\"\">Home</a>\n      </li>\n      <li>\n        <a href=\"\">Blog</a>\n      </li>\n      <li>\n        <a href=\"\">About us</a>\n      </li>\n      <li>\n        <a href=\"\">Our history</a>\n      </li>\n      <li>\n        <a href=\"\">Contacts</a>\n      </li>\n    </ul>\n  </nav>\n\n  <main class=\"grid\">\n    <article>\n      <h1>\n        An Exciting Blog Post\n      </h1>\n      <img src=\"images/balloon-sq6.jpg\" alt=\"placeholder\" class=\"feature\">\n      <p>Veggies es bonus vobis, proinde vos postulo essum magis kohlrabi welsh onion daikon amaranth tatsoi tomatillo melon\n        azuki bean garlic.</p>\n\n      <p>Gumbo beet greens corn soko endive gumbo gourd. Parsley shallot courgette tatsoi pea sprouts fava bean collard greens\n        dandelion okra wakame tomato. Dandelion cucumber earthnut pea peanut soko zucchini.</p>\n\n      <p>Turnip greens yarrow ricebean rutabaga endive cauliflower sea lettuce kohlrabi amaranth water spinach avocado daikon\n        napa cabbage asparagus winter purslane kale. Celery potato scallion desert raisin horseradish spinach carrot soko.\n        Lotus root water spinach fennel kombu maize bamboo shoot green bean swiss chard seakale pumpkin onion chickpea gram\n        corn pea. Brussels sprout coriander water chestnut gourd swiss chard wakame kohlrabi beetroot carrot watercress.\n        Corn amaranth salsify bunya nuts nori azuki bean chickweed potato bell pepper artichoke.</p>\n\n      <p>Nori grape silver beet broccoli kombu beet greens fava bean potato quandong celery. Bunya nuts black-eyed pea prairie\n        turnip leek lentil turnip greens parsnip. Sea lettuce lettuce water chestnut eggplant winter purslane fennel azuki\n        bean earthnut pea sierra leone bologi leek soko chicory celtuce parsley jícama salsify.</p>\n\n      <p>Celery quandong swiss chard chicory earthnut pea potato. Salsify taro catsear garlic gram celery bitterleaf wattle\n        seed collard greens nori. Grape wattle seed kombu beetroot horseradish carrot squash brussels sprout chard.</p>\n\n    </article>\n\n    <aside>\n      <h2>\n        Photography\n      </h2>\n      <ul class=\"photos\">\n        <li>\n          <img src=\"images/balloon-sq1.jpg\" alt=\"placeholder\">\n        </li>\n        <li>\n          <img src=\"images/balloon-sq2.jpg\" alt=\"placeholder\">\n        </li>\n        <li>\n          <img src=\"images/balloon-sq3.jpg\" alt=\"placeholder\">\n        </li>\n        <li>\n          <img src=\"images/balloon-sq4.jpg\" alt=\"placeholder\">\n        </li>\n        <li>\n          <img src=\"images/balloon-sq5.jpg\" alt=\"placeholder\">\n        </li>\n      </ul>\n\n    </aside>\n  </main>\n\n</body>\n\n</html>\n"
  },
  {
    "path": "css/css-layout/fundamental-layout-comprehension-finish/marking-guide.md",
    "content": "# Marking guide for \"Fundamental Layout Comprehension\"\n\nThe following guide outlines a marking guide for the MDN Learning Area CSS Layout Topic. Each subtask detailed in the assessment is listed below, along with an explanation of how many marks the task is worth, and the mark breakdown.\n\nNote: These are guidelines, not set in stone rules — you are of course free to use your judgement on mark awarding when you meet an edge case, or somethign that isn't clearly cut.\n\nThe overall mark awarded is out of 25. Work out their final mark, and then divide by 25 and multiply by 100 to give a percentage mark. For reference, you can find a finished example in this folder that would be awarded top marks.\n\nWhile the actual amount of code that is required to be added is relatively small, this task is about making the right choices for this layout.\n\n**Display the navigation items in a row, with an equal amount of space between the items.**\n\nHere the student should use flexbox, adding `display: flex` to `nav ul` (2 marks), and `justify-content: space-between` (2 marks) to distribute the additional space between the items.  \n\n**The navigation bar should scroll with the content and then become stuck at the top of the viewport when it reaches it.**\n\nThe selector `nav` should have `position: sticky` (2 marks) plus an offset value of `top: 0` (2 marks). \n\n**The image that is inside the article should have text wrapped around it.**\n\nThe image should be floated left `float: left` (2 marks) with a right and bottom margin to move the text away from it (3 marks).\n\n**The `<article>` and `<aside>` elements should display as a two column layout. The columns should be a flexible size so that if the browser window shrinks smaller the columns become narrower.**\n\nHere the student would ideally use CSS Grid  `display: grid` (2 marks), with the `fr` unit for the columns `grid-template-columns: 3fr 1fr` (2 marks). It would also be possible to use flexbox, and that would be acceptable too. Percentages would work for the column tracks, but ideally they realise that the fr unit works nicely here. The actual proportions they pick don't really matter. A `grid-gap` or `gap` property should separate the tracks, e.g. `grid-gap: 20px` (2 marks).\n\n**The photographs should display as a two column grid with a 1 pixel gap between the images.**\n\nThis should be grid layout, a flex layout would mean the last image would spread out across the two tracks. A grid layout with two 1fr tracks (4 marks) will get the display we want with a `grid-gap` of 1px (2 marks). In supporting browsers the `gap` property rather than `grid-gap` will work."
  },
  {
    "path": "css/css-layout/fundamental-layout-comprehension-finish/styles.css",
    "content": "body {\n    background-color: #fff;\n    color: #333;\n    margin: 0;\n    font: 1.2em / 1.2 Arial, Helvetica, sans-serif;\n  }\n\n  img {\n      max-width: 100%;\n      display: block;\n  }\n  \n  .logo {\n    font-size: 200%;\n    padding: 50px 20px;\n    margin: 0 auto;\n    max-width: 980px;\n  }\n  \n  .grid {\n    margin: 0 auto;\n    padding: 0 20px;\n    max-width: 980px;\n    display: grid;\n    grid-template-columns: 3fr 1fr;\n    gap: 20px;\n  }\n  \n  nav {\n    background-color: #000;\n    padding: .5em;\n    top: 0;\n    position: sticky;\n  }\n  \n  nav ul {\n    margin: 0;\n    padding: 0;\n    list-style: none;\n    display: flex;\n    justify-content: space-between;\n  }\n  \n  nav a {\n    color: #fff;\n    text-decoration: none;\n    padding: .5em 1em;\n  }\n  \n  .photos {\n    list-style: none;\n    margin: 0;\n    padding: 0;\n    display: grid;\n    gap: 1px;\n    grid-template-columns: 1fr 1fr;\n  }\n\n  .feature {\n      width: 200px;\n      float: left;\n      margin: 0 20px 20px 0;\n  }"
  },
  {
    "path": "css/css-layout/grids/0-starting-point.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS Grid starting point</title>\n    <style>\n        body {\n            width: 90%;\n            max-width: 900px;\n            margin: 2em auto;\n            font: .9em/1.2 Arial, Helvetica, sans-serif;\n        }\n\n        .container > div {\n            border-radius: 5px;\n            padding: 10px;\n            background-color: rgb(207,232,220);\n            border: 2px solid rgb(79,185,227);\n        }\n    </style>\n  </head>\n\n<body>\n    <h1>Simple grid example</h1>\n\n    <div class=\"container\">\n        <div>One</div>\n        <div>Two</div>\n        <div>Three</div>\n        <div>Four</div>\n        <div>Five</div>\n        <div>Six</div>\n        <div>Seven</div>\n    </div>\n\n</body>\n\n</html>"
  },
  {
    "path": "css/css-layout/grids/1-fixed-columns.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS Grid fixed column tracks</title>\n    <style>\n        body {\n            width: 90%;\n            max-width: 900px;\n            margin: 2em auto;\n            font: .9em/1.2 Arial, Helvetica, sans-serif;\n        }\n\n        .container {\n            display: grid;\n            grid-template-columns: 200px 200px 200px;\n        }\n\n        .container > div {\n            border-radius: 5px;\n            padding: 10px;\n            background-color: rgb(207,232,220);\n            border: 2px solid rgb(79,185,227);\n        }\n    </style>\n  </head>\n\n<body>\n    <h1>Simple grid example</h1>\n\n    <div class=\"container\">\n        <div>One</div>\n        <div>Two</div>\n        <div>Three</div>\n        <div>Four</div>\n        <div>Five</div>\n        <div>Six</div>\n        <div>Seven</div>\n    </div>\n\n</body>\n\n</html>"
  },
  {
    "path": "css/css-layout/grids/10-template-completed.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS Grid - line-based placement starting point</title>\n    <style>\n        body {\n            width: 90%;\n            max-width: 900px;\n            margin: 2em auto;\n            font: .9em/1.2 Arial, Helvetica, sans-serif;\n        }\n\n        .container {\n            display: grid;\n            grid-template-areas: \n            \"header header\"\n            \"sidebar content\"\n            \"footer footer\";\n            grid-template-columns: 1fr 3fr;\n            gap: 20px;\n        }\n\n        header {\n            grid-area: header;\n        }\n\n        article {\n            grid-area: content;\n        }\n\n        aside {\n            grid-area: sidebar;\n        }\n\n        footer {\n            grid-area: footer;\n        }\n\n        header,\n        footer {\n            border-radius: 5px;\n            padding: 10px;\n            background-color: rgb(207,232,220);\n            border: 2px solid rgb(79,185,227);\n        }\n\n        aside {\n            border-right: 1px solid #999;\n        }\n    </style>\n  </head>\n\n<body>\n\n    <div class=\"container\">\n        <header>This is my lovely blog</header>\n        <article>\n                <h1>My article</h1>\n                <p>Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n\n                <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n        </article>\n        <aside><h2>Other things</h2>\n            <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est.</p></aside>\n        <footer>Contact me@mysite.com</footer>\n    </div>\n\n</body>\n\n</html>"
  },
  {
    "path": "css/css-layout/grids/11-grid-system-starting-point.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS Grid - line-based placement starting point</title>\n    <style>\n        body {\n            width: 90%;\n            max-width: 900px;\n            margin: 2em auto;\n            font: .9em/1.2 Arial, Helvetica, sans-serif;\n        }\n\n        .container {\n            display: grid;\n            grid-template-columns: repeat(12, minmax(0,1fr));\n            gap: 20px;\n        }\n\n        header,\n        footer {\n            border-radius: 5px;\n            padding: 10px;\n            background-color: rgb(207,232,220);\n            border: 2px solid rgb(79,185,227);\n        }\n\n        aside {\n            border-right: 1px solid #999;\n        }\n\n    </style>\n  </head>\n\n<body>\n\n    <div class=\"container\">\n        <header>This is my lovely blog</header>\n        <article>\n                <h1>My article</h1>\n                <p>Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n\n                <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n        </article>\n        <aside><h2>Other things</h2>\n            <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est.</p></aside>\n        <footer>Contact me@mysite.com</footer>\n    </div>\n\n</body>\n\n</html>"
  },
  {
    "path": "css/css-layout/grids/12-grid-system-completed.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS Grid - line-based placement starting point</title>\n    <style>\n        body {\n            width: 90%;\n            max-width: 900px;\n            margin: 2em auto;\n            font: .9em/1.2 Arial, Helvetica, sans-serif;\n        }\n\n        .container {\n            display: grid;\n            grid-template-columns: repeat(12, minmax(0,1fr));\n            gap: 20px;\n        }\n\n        header,\n        footer {\n            border-radius: 5px;\n            padding: 10px;\n            background-color: rgb(207,232,220);\n            border: 2px solid rgb(79,185,227);\n        }\n\n        aside {\n            border-right: 1px solid #999;\n        }\n\n        header {\n            grid-column: 1 / 13;\n            grid-row: 1;\n        }\n\n        article {\n            grid-column: 4 / 13;\n            grid-row: 2;\n        }\n\n        aside {\n            grid-column: 1 / 4;\n            grid-row: 2;\n        }\n\n        footer {\n            grid-column: 1 / 13;\n            grid-row: 3;\n        }\n\n    </style>\n  </head>\n\n<body>\n\n    <div class=\"container\">\n        <header>This is my lovely blog</header>\n        <article>\n                <h1>My article</h1>\n                <p>Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n\n                <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n        </article>\n        <aside><h2>Other things</h2>\n            <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est.</p></aside>\n        <footer>Contact me@mysite.com</footer>\n    </div>\n\n</body>\n\n</html>"
  },
  {
    "path": "css/css-layout/grids/2-fr-tracks.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS Grid - the fr unit</title>\n    <style>\n        body {\n            width: 90%;\n            max-width: 900px;\n            margin: 2em auto;\n            font: .9em/1.2 Arial, Helvetica, sans-serif;\n        }\n\n        .container {\n            display: grid;\n            grid-template-columns: 2fr 1fr 1fr;\n        }\n\n        .container > div {\n            border-radius: 5px;\n            padding: 10px;\n            background-color: rgb(207,232,220);\n            border: 2px solid rgb(79,185,227);\n        }\n    </style>\n  </head>\n\n<body>\n    <h1>Simple grid example</h1>\n\n    <div class=\"container\">\n        <div>One</div>\n        <div>Two</div>\n        <div>Three</div>\n        <div>Four</div>\n        <div>Five</div>\n        <div>Six</div>\n        <div>Seven</div>\n    </div>\n\n</body>\n\n</html>"
  },
  {
    "path": "css/css-layout/grids/3-gaps.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS Grid - gaps</title>\n    <style>\n        body {\n            width: 90%;\n            max-width: 900px;\n            margin: 2em auto;\n            font: .9em/1.2 Arial, Helvetica, sans-serif;\n        }\n\n        .container {\n            display: grid;\n            grid-template-columns: 2fr 1fr 1fr;\n            gap: 20px;\n        }\n\n        .container > div {\n            border-radius: 5px;\n            padding: 10px;\n            background-color: rgb(207,232,220);\n            border: 2px solid rgb(79,185,227);\n        }\n    </style>\n  </head>\n\n<body>\n    <h1>Simple grid example</h1>\n\n    <div class=\"container\">\n        <div>One</div>\n        <div>Two</div>\n        <div>Three</div>\n        <div>Four</div>\n        <div>Five</div>\n        <div>Six</div>\n        <div>Seven</div>\n    </div>\n\n</body>\n\n</html>"
  },
  {
    "path": "css/css-layout/grids/4-repeat.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS Grid - Repeat Notation</title>\n    <style>\n        body {\n            width: 90%;\n            max-width: 900px;\n            margin: 2em auto;\n            font: .9em/1.2 Arial, Helvetica, sans-serif;\n        }\n\n        .container {\n            display: grid;\n            grid-template-columns: repeat(3, 1fr);\n            gap: 20px;\n        }\n\n        .container > div {\n            border-radius: 5px;\n            padding: 10px;\n            background-color: rgb(207,232,220);\n            border: 2px solid rgb(79,185,227);\n        }\n    </style>\n  </head>\n\n<body>\n    <h1>Simple grid example</h1>\n\n    <div class=\"container\">\n        <div>One</div>\n        <div>Two</div>\n        <div>Three</div>\n        <div>Four</div>\n        <div>Five</div>\n        <div>Six</div>\n        <div>Seven</div>\n    </div>\n\n</body>\n\n</html>"
  },
  {
    "path": "css/css-layout/grids/5-auto-rows.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS Grid - tracks in the implicit grid</title>\n    <style>\n        body {\n            width: 90%;\n            max-width: 900px;\n            margin: 2em auto;\n            font: .9em/1.2 Arial, Helvetica, sans-serif;\n        }\n\n        .container {\n            display: grid;\n            grid-template-columns: repeat(3, 1fr);\n            grid-auto-rows: 100px;\n            gap: 20px;\n        }\n\n        .container > div {\n            border-radius: 5px;\n            padding: 10px;\n            background-color: rgb(207,232,220);\n            border: 2px solid rgb(79,185,227);\n        }\n    </style>\n  </head>\n\n<body>\n    <h1>Simple grid example</h1>\n\n    <div class=\"container\">\n        <div>One</div>\n        <div>Two</div>\n        <div>Three</div>\n        <div>Four</div>\n        <div>Five</div>\n        <div>Six</div>\n        <div>Seven</div>\n    </div>\n\n</body>\n\n</html>"
  },
  {
    "path": "css/css-layout/grids/6-min-max.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS Grid - minmax()</title>\n    <style>\n        body {\n            width: 90%;\n            max-width: 900px;\n            margin: 2em auto;\n            font: .9em/1.2 Arial, Helvetica, sans-serif;\n        }\n\n        .container {\n            display: grid;\n            grid-template-columns: repeat(3, 1fr);\n            grid-auto-rows: minmax(100px, auto);\n            gap: 20px;\n        }\n\n        .container > div {\n            border-radius: 5px;\n            padding: 10px;\n            background-color: rgb(207,232,220);\n            border: 2px solid rgb(79,185,227);\n        }\n    </style>\n  </head>\n\n<body>\n    <h1>Simple grid example</h1>\n\n    <div class=\"container\">\n        <div>One<br>Has<br>More<br>Content<br>And<br>Is<br>Taller<br>Than<br>100px.</div>\n        <div>Two</div>\n        <div>Three</div>\n        <div>Four</div>\n        <div>Five</div>\n        <div>Six</div>\n        <div>Seven</div>\n    </div>\n\n</body>\n\n</html>"
  },
  {
    "path": "css/css-layout/grids/7-auto-fill.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS Grid - minmax()</title>\n    <style>\n        body {\n            width: 90%;\n            max-width: 900px;\n            margin: 2em auto;\n            font: .9em/1.2 Arial, Helvetica, sans-serif;\n        }\n\n        .container {\n            display: grid;\n            grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n            grid-auto-rows: minmax(100px, auto);\n            gap: 20px;\n        }\n\n        .container > div {\n            border-radius: 5px;\n            padding: 10px;\n            background-color: rgb(207,232,220);\n            border: 2px solid rgb(79,185,227);\n        }\n    </style>\n  </head>\n\n<body>\n    <h1>Simple grid example</h1>\n\n    <div class=\"container\">\n        <div>One.</div>\n        <div>Two</div>\n        <div>Three</div>\n        <div>Four</div>\n        <div>Five</div>\n        <div>Six</div>\n        <div>Seven</div>\n    </div>\n\n</body>\n\n</html>"
  },
  {
    "path": "css/css-layout/grids/8-placement-starting-point.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title>CSS Grid - line-based placement starting point</title>\n    <style>\n      body {\n        width: 90%;\n        max-width: 900px;\n        margin: 2em auto;\n        font: 0.9em/1.2 Arial, Helvetica, sans-serif;\n      }\n\n      .container {\n        display: grid;\n        grid-template-columns: 1fr 3fr;\n        gap: 20px;\n      }\n\n      header,\n      footer {\n        border-radius: 5px;\n        padding: 10px;\n        background-color: rgb(207, 232, 220);\n        border: 2px solid rgb(79, 185, 227);\n      }\n\n      aside {\n        border-right: 1px solid #999;\n      }\n    </style>\n  </head>\n\n  <body>\n    <div class=\"container\">\n      <header>This is my lovely blog</header>\n      <article>\n        <h1>My article</h1>\n        <p>\n          Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras\n          porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed\n          auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet\n          orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac\n          ornare ex malesuada et. In vitae convallis lacus. Aliquam erat\n          volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin\n          eros pharetra congue. Duis ornare egestas augue ut luctus. Proin\n          blandit quam nec lacus varius commodo et a urna. Ut id ornare felis,\n          eget fermentum sapien.\n        </p>\n\n        <p>\n          Nam vulputate diam nec tempor bibendum. Donec luctus augue eget\n          malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut,\n          facilisis sed est. Nam id risus quis ante semper consectetur eget\n          aliquam lorem. Vivamus tristique elit dolor, sed pretium metus\n          suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu\n          urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt\n          eget purus in interdum. Cum sociis natoque penatibus et magnis dis\n          parturient montes, nascetur ridiculus mus.\n        </p>\n      </article>\n      <aside>\n        <h2>Other things</h2>\n        <p>\n          Nam vulputate diam nec tempor bibendum. Donec luctus augue eget\n          malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut,\n          facilisis sed est.\n        </p>\n      </aside>\n      <footer>Contact me@mysite.com</footer>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/grids/9-placement-completed.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS Grid - line-based placement starting point</title>\n    <style>\n        body {\n            width: 90%;\n            max-width: 900px;\n            margin: 2em auto;\n            font: .9em/1.2 Arial, Helvetica, sans-serif;\n        }\n\n        .container {\n            display: grid;\n            grid-template-columns: 1fr 3fr;\n            gap: 20px;\n        }\n\n        header,\n        footer {\n            border-radius: 5px;\n            padding: 10px;\n            background-color: rgb(207,232,220);\n            border: 2px solid rgb(79,185,227);\n        }\n\n        aside {\n            border-right: 1px solid #999;\n        }\n\n        header {\n            grid-column: 1 / 3;\n            grid-row: 1;\n        }\n\n        article {\n            grid-column: 2;\n            grid-row: 2;\n        }\n\n        aside {\n            grid-column: 1;\n            grid-row: 2;\n        }\n\n        footer {\n            grid-column: 1 / 3;\n            grid-row: 3;\n        }\n    </style>\n  </head>\n\n<body>\n\n    <div class=\"container\">\n        <header>This is my lovely blog</header>\n        <article>\n                <h1>My article</h1>\n                <p>Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n\n                <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n        </article>\n        <aside><h2>Other things</h2>\n        <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed est.</p></aside>\n        <footer>Contact me@mysite.com</footer>\n    </div>\n\n</body>\n\n</html>"
  },
  {
    "path": "css/css-layout/grids/css-grid-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS grids example</title>\n    <style>\n\n    .wrapper {\n      width: 90%;\n      max-width: 960px;\n      margin: 0 auto;\n      display: grid;\n      grid-template-columns: repeat(12, 1fr);\n      gap: 20px;\n    }\n\n    .col {\n      background: rgb(255,150,150);\n    }\n\n    .span2 { grid-column: auto / span 2;}\n    .span3 { grid-column: auto / span 3;}\n    .span4 { grid-column: auto / span 4;}\n    .span5 { grid-column: auto / span 5;}\n    .span6 { grid-column: auto / span 6;}\n    .span7 { grid-column: auto / span 7;}\n    .span8 { grid-column: auto / span 8;}\n    .span9 { grid-column: auto / span 9;}\n    .span10 { grid-column: auto / span 10;}\n    .span11 { grid-column: auto / span 11;}\n    .span12 { grid-column: auto / span 12;}\n\n    </style>\n  </head>\n\n  <body>\n    <div class=\"wrapper\">\n      <div class=\"col\">1</div>\n      <div class=\"col\">2</div>\n      <div class=\"col\">3</div>\n      <div class=\"col\">4</div>\n      <div class=\"col\">5</div>\n      <div class=\"col\">6</div>\n      <div class=\"col\">7</div>\n      <div class=\"col\">8</div>\n      <div class=\"col\">9</div>\n      <div class=\"col\">10</div>\n      <div class=\"col\">11</div>\n      <div class=\"col\">12</div>\n      <div class=\"col\">13some<br>content</div>\n      <div class=\"col span6\">14this<br>is<br>more<br>content</div>\n      <div class=\"col span3\">15this<br>is<br>less</div>\n      <div class=\"col span2 content\">16</div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/grids/css-grid.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS grids example</title>\n    <style>\n\n    </style>\n  </head>\n\n  <body>\n    <div class=\"wrapper\">\n      <div class=\"col\">1</div>\n      <div class=\"col\">2</div>\n      <div class=\"col\">3</div>\n      <div class=\"col\">4</div>\n      <div class=\"col\">5</div>\n      <div class=\"col\">6</div>\n      <div class=\"col\">7</div>\n      <div class=\"col\">8</div>\n      <div class=\"col\">9</div>\n      <div class=\"col\">10</div>\n      <div class=\"col\">11</div>\n      <div class=\"col\">12</div>\n      <div class=\"col\">13</div>\n      <div class=\"col span6\">14</div>\n      <div class=\"col span3\">15</div>\n      <div class=\"col span2\">16</div>     \n    </div>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/grids/css-tables-as-grid.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS tables example rewritten as CSS grid</title>\n    <style>\n    html {\n      font-family: sans-serif;\n    }\n\n    form {\n      display: grid;\n      grid-template-columns: repeat(5, 1fr);\n      gap: 10px 5%;\n      width: 508px;\n      margin: 0 auto;\n    }\n\n    form label {\n      grid-column: auto / span 2;\n      text-align: right;\n    }\n\n    form input {\n      width: 100%;\n      grid-column: auto / span 3;\n    }\n\n    form p {\n      grid-column: auto / span 5;\n      grid-row: 4;\n      color: #999;\n      font-style: italic;\n    }\n    </style>\n  </head>\n  <body>\n    <form>\n    <p>First of all, tell us your name and age.</p>\n      \n        <label for=\"fname\">First name:</label>\n        <input type=\"text\" id=\"fname\">\n      \n      \n        <label for=\"lname\">Last name:</label>\n        <input type=\"text\" id=\"lname\">\n      \n      \n        <label for=\"age\">Age:</label>\n        <input type=\"text\" id=\"age\">\n      \n    </form>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/grids/flexbox-grid.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Fluid grid with Flexbox</title>\n    <style>\n\n    * { box-sizing: border-box; }\n\n    body {\n      width: 90%;\n      max-width: 980px;\n      margin: 0 auto;\n    }\n\n    .wrapper {\n      padding-right: 2.08333333%;\n    }\n    \n    .row {\n      display: flex;\n    }\n\n    .col {\n      margin-left: 2.08333333%;\n      margin-bottom: 1em;\n      width: 6.25%;\n      flex: 1 1 auto;\n      background: rgb(255,150,150);\n    }\n\n    .col.span2 { width: calc((6.25%*2) + 2.08333333%); }\n    .col.span3 { width: calc((6.25%*3) + (2.08333333%*2)); }\n    .col.span4 { width: calc((6.25%*4) + (2.08333333%*3)); }\n    .col.span5 { width: calc((6.25%*5) + (2.08333333%*4)); }\n    .col.span6 { width: calc((6.25%*6) + (2.08333333%*5)); }\n    .col.span7 { width: calc((6.25%*7) + (2.08333333%*6)); }\n    .col.span8 { width: calc((6.25%*8) + (2.08333333%*7)); }\n    .col.span9 { width: calc((6.25%*9) + (2.08333333%*8)); }\n    .col.span10 { width: calc((6.25%*10) + (2.08333333%*9)); }\n    .col.span11 { width: calc((6.25%*11) + (2.08333333%*10)); }\n    .col.span12 { width: calc((6.25%*12) + (2.08333333%*11)); }\n\n    </style>\n  </head>\n\n  <body>\n    <div class=\"wrapper\">\n      <div class=\"row\">\n        <div class=\"col\">1</div>\n        <div class=\"col\">2</div>\n        <div class=\"col\">3</div>\n        <div class=\"col\">4</div>\n        <div class=\"col\">5</div>\n        <div class=\"col\">6</div>\n        <div class=\"col\">7</div>\n        <div class=\"col\">8</div>\n        <div class=\"col\">9</div>\n        <div class=\"col\">10</div>\n        <div class=\"col\">11</div>\n        <div class=\"col\">12</div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col span1\">13</div>\n        <div class=\"col span6\">14</div>\n        <div class=\"col span3\">15</div>\n        <div class=\"col span2\">16</div>\n      </div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/grids/fluid-grid-calc.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Fluid grid with calc()</title>\n    <style>\n\n    * { box-sizing: border-box; }\n\n    body {\n      width: 90%;\n      max-width: 980px;\n      margin: 0 auto;\n    }\n\n    .wrapper {\n      padding-right: 2.08333333%;\n    }\n\n    .row {\n      clear: both;\n    }\n\n    .col {\n      float: left;\n      margin-left: 2.08333333%;\n      width: 6.25%;\n      background: rgb(255,150,150);\n    }\n\n    .col.span2 { width: calc((6.25%*2) + 2.08333333%); }\n    .col.span3 { width: calc((6.25%*3) + (2.08333333%*2)); }\n    .col.span4 { width: calc((6.25%*4) + (2.08333333%*3)); }\n    .col.span5 { width: calc((6.25%*5) + (2.08333333%*4)); }\n    .col.span6 { width: calc((6.25%*6) + (2.08333333%*5)); }\n    .col.span7 { width: calc((6.25%*7) + (2.08333333%*6)); }\n    .col.span8 { width: calc((6.25%*8) + (2.08333333%*7)); }\n    .col.span9 { width: calc((6.25%*9) + (2.08333333%*8)); }\n    .col.span10 { width: calc((6.25%*10) + (2.08333333%*9)); }\n    .col.span11 { width: calc((6.25%*11) + (2.08333333%*10)); }\n    .col.span12 { width: calc((6.25%*12) + (2.08333333%*11)); }\n\n    </style>\n  </head>\n\n  <body>\n    <div class=\"wrapper\">\n      <div class=\"row\">\n        <div class=\"col\">1</div>\n        <div class=\"col\">2</div>\n        <div class=\"col\">3</div>\n        <div class=\"col\">4</div>\n        <div class=\"col\">5</div>\n        <div class=\"col\">6</div>\n        <div class=\"col\">7</div>\n        <div class=\"col\">8</div>\n        <div class=\"col\">9</div>\n        <div class=\"col\">10</div>\n        <div class=\"col\">11</div>\n        <div class=\"col\">12</div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col span1\">13</div>\n        <div class=\"col span6\">14</div>\n        <div class=\"col span3\">15</div>\n        <div class=\"col span2\">16</div>\n      </div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/grids/fluid-grid-offset.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Fluid grid with offset class</title>\n    <style>\n\n    * { box-sizing: border-box; }\n\n    body {\n      width: 90%;\n      max-width: 980px;\n      margin: 0 auto;\n    }\n\n    .wrapper {\n      padding-right: 2.08333333%;\n    }\n\n    .row {\n      clear: both;\n    }\n\n    .col {\n      float: left;\n      margin-left: 2.08333333%;\n      width: 6.25%;\n      background: rgb(255,150,150);\n    }\n\n    /* Two column widths (12.5%) plus one gutter width (2.08333333%) */\n    .col.span2 { width: 14.58333333%; }\n    /* Three column widths (18.75%) plus two gutter widths (4.1666666) */\n    .col.span3 { width: 22.91666666%; }\n    /* And so on... */\n    .col.span4 { width: 31.24999999%; }\n    .col.span5 { width: 39.58333332%; }\n    .col.span6 { width: 47.91666665%; }\n    .col.span7 { width: 56.24999998%; }\n    .col.span8 { width: 64.58333331%; }\n    .col.span9 { width: 72.91666664%; }\n    .col.span10 { width: 81.24999997%; }\n    .col.span11 { width: 89.5833333%; }\n    .col.span12 { width: 97.91666663%; }\n\n    .offset-by-one {\n      margin-left: 10.41666666%;\n    }\n\n    </style>\n  </head>\n\n  <body>\n    <div class=\"wrapper\">\n      <div class=\"row\">\n        <div class=\"col\">1</div>\n        <div class=\"col\">2</div>\n        <div class=\"col\">3</div>\n        <div class=\"col\">4</div>\n        <div class=\"col\">5</div>\n        <div class=\"col\">6</div>\n        <div class=\"col\">7</div>\n        <div class=\"col\">8</div>\n        <div class=\"col\">9</div>\n        <div class=\"col\">10</div>\n        <div class=\"col\">11</div>\n        <div class=\"col\">12</div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col span1\">13</div>\n        <div class=\"col span5 offset-by-one\">14</div>\n        <div class=\"col span3\">15</div>\n        <div class=\"col span2\">16</div>\n      </div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/grids/fluid-grid.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Fluid grid</title>\n    <style>\n\n    * { box-sizing: border-box; }\n\n    body {\n      width: 90%;\n      max-width: 980px;\n      margin: 0 auto;\n    }\n\n    .wrapper {\n      padding-right: 2.08333333%;\n    }\n\n    .row {\n      clear: both;\n    }\n\n    .col {\n      float: left;\n      margin-left: 2.08333333%;\n      width: 6.25%;\n      background: rgb(255,150,150);\n    }\n\n    /* Two column widths (12.5%) plus one gutter width (2.08333333%) */\n    .col.span2 { width: 14.58333333%; }\n    /* Three column widths (18.75%) plus two gutter widths (4.1666666) */\n    .col.span3 { width: 22.91666666%; }\n    /* And so on... */\n    .col.span4 { width: 31.24999999%; }\n    .col.span5 { width: 39.58333332%; }\n    .col.span6 { width: 47.91666665%; }\n    .col.span7 { width: 56.24999998%; }\n    .col.span8 { width: 64.58333331%; }\n    .col.span9 { width: 72.91666664%; }\n    .col.span10 { width: 81.24999997%; }\n    .col.span11 { width: 89.5833333%; }\n    .col.span12 { width: 97.91666663%; }\n\n    </style>\n  </head>\n\n  <body>\n    <div class=\"wrapper\">\n      <div class=\"row\">\n        <div class=\"col\">1</div>\n        <div class=\"col\">2</div>\n        <div class=\"col\">3</div>\n        <div class=\"col\">4</div>\n        <div class=\"col\">5</div>\n        <div class=\"col\">6</div>\n        <div class=\"col\">7</div>\n        <div class=\"col\">8</div>\n        <div class=\"col\">9</div>\n        <div class=\"col\">10</div>\n        <div class=\"col\">11</div>\n        <div class=\"col\">12</div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col span1\">13</div>\n        <div class=\"col span6\">14</div>\n        <div class=\"col span3\">15</div>\n        <div class=\"col span2\">16</div>\n      </div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/grids/html-skeleton-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Skeleton example</title>\n    <link href=\"normalize.css\" rel=\"stylesheet\">\n    <link href=\"skeleton.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n  <div class=\"container\">\n    <div class=\"row\">\n      <div class=\"one column\">1</div>\n      <div class=\"one column\">2</div>\n      <div class=\"one column\">3</div>\n      <div class=\"one column\">4</div>\n      <div class=\"one column\">5</div>\n      <div class=\"one column\">6</div>\n      <div class=\"one column\">7</div>\n      <div class=\"one column\">8</div>\n      <div class=\"one column\">9</div>\n      <div class=\"one column\">10</div>\n      <div class=\"one column\">11</div>\n      <div class=\"one column\">12</div>\n    </div>\n    <div class=\"row\">\n      <div class=\"one column\">13</div>\n      <div class=\"six columns\">14</div>\n      <div class=\"three columns\">15</div>\n      <div class=\"two columns\">16</div>\n    </div>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/grids/html-skeleton.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Skeleton example</title>\n  </head>\n\n  <body>\n    \n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/grids/normalize.css",
    "content": "/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n/**\n * 1. Set default font family to sans-serif.\n * 2. Prevent iOS text size adjust after orientation change, without disabling\n *    user zoom.\n */\n\nhtml {\n  font-family: sans-serif; /* 1 */\n  -ms-text-size-adjust: 100%; /* 2 */\n  -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/**\n * Remove default margin.\n */\n\nbody {\n  margin: 0;\n}\n\n/* HTML5 display definitions\n   ========================================================================== */\n\n/**\n * Correct `block` display not defined for any HTML5 element in IE 8/9.\n * Correct `block` display not defined for `details` or `summary` in IE 10/11\n * and Firefox.\n * Correct `block` display not defined for `main` in IE 11.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n/**\n * 1. Correct `inline-block` display not defined in IE 8/9.\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n */\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block; /* 1 */\n  vertical-align: baseline; /* 2 */\n}\n\n/**\n * Prevent modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n/**\n * Address `[hidden]` styling not present in IE 8/9/10.\n * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n */\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n/* Links\n   ========================================================================== */\n\n/**\n * Remove the gray background color from active links in IE 10.\n */\n\na {\n  background-color: transparent;\n}\n\n/**\n * Improve readability when focused and also mouse hovered in all browsers.\n */\n\na:active,\na:hover {\n  outline: 0;\n}\n\n/* Text-level semantics\n   ========================================================================== */\n\n/**\n * Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n */\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n/**\n * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n */\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n/**\n * Address styling not present in Safari and Chrome.\n */\n\ndfn {\n  font-style: italic;\n}\n\n/**\n * Address variable `h1` font-size and margin within `section` and `article`\n * contexts in Firefox 4+, Safari, and Chrome.\n */\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n/**\n * Address styling not present in IE 8/9.\n */\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n/**\n * Address inconsistent and variable font size in all browsers.\n */\n\nsmall {\n  font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n/* Embedded content\n   ========================================================================== */\n\n/**\n * Remove border when inside `a` element in IE 8/9/10.\n */\n\nimg {\n  border: 0;\n}\n\n/**\n * Correct overflow not hidden in IE 9/10/11.\n */\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n/* Grouping content\n   ========================================================================== */\n\n/**\n * Address margin not present in IE 8/9 and Safari.\n */\n\nfigure {\n  margin: 1em 40px;\n}\n\n/**\n * Address differences between Firefox and other browsers.\n */\n\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\n\n/**\n * Contain overflow in all browsers.\n */\n\npre {\n  overflow: auto;\n}\n\n/**\n * Address odd `em`-unit font size rendering in all browsers.\n */\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n/* Forms\n   ========================================================================== */\n\n/**\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\n * styling of `select`, unless a `border` property is set.\n */\n\n/**\n * 1. Correct color not being inherited.\n *    Known issue: affects color of disabled elements.\n * 2. Correct font properties not being inherited.\n * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit; /* 1 */\n  font: inherit; /* 2 */\n  margin: 0; /* 3 */\n}\n\n/**\n * Address `overflow` set to `hidden` in IE 8/9/10/11.\n */\n\nbutton {\n  overflow: visible;\n}\n\n/**\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\n * All other form control elements do not inherit `text-transform` values.\n * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n * Correct `select` style inheritance in Firefox.\n */\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n/**\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n *    and `video` controls.\n * 2. Correct inability to style clickable `input` types in iOS.\n * 3. Improve usability and consistency of cursor style between image-type\n *    `input` and others.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; /* 2 */\n  cursor: pointer; /* 3 */\n}\n\n/**\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n/**\n * Remove inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n/**\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\ninput {\n  line-height: normal;\n}\n\n/**\n * It's recommended that you don't attempt to style these elements.\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\n *\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\n * 2. Remove excess padding in IE 8/9/10.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; /* 1 */\n  padding: 0; /* 2 */\n}\n\n/**\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\n * `font-size` values of the `input`, it causes the cursor style of the\n * decrement button to change from `default` to `text`.\n */\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/**\n * 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n * 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n *    (include `-moz` to future-proof).\n */\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; /* 1 */\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box; /* 2 */\n  box-sizing: content-box;\n}\n\n/**\n * Remove inner padding and search cancel button in Safari and Chrome on OS X.\n * Safari (but not Chrome) clips the cancel button when the search input has\n * padding (and `textfield` appearance).\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n/**\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct `color` not being inherited in IE 8/9/10/11.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n  border: 0; /* 1 */\n  padding: 0; /* 2 */\n}\n\n/**\n * Remove default vertical scrollbar in IE 8/9/10/11.\n */\n\ntextarea {\n  overflow: auto;\n}\n\n/**\n * Don't inherit the `font-weight` (applied by a rule above).\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n */\n\noptgroup {\n  font-weight: bold;\n}\n\n/* Tables\n   ========================================================================== */\n\n/**\n * Remove most spacing between table cells.\n */\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}"
  },
  {
    "path": "css/css-layout/grids/simple-grid-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple grid</title>\n    <style>\n\n    * { box-sizing: border-box; }\n\n    body {\n      width: 980px;\n      margin: 0 auto;\n    }\n\n    .wrapper {\n      padding-right: 20px;\n    }\n\n    .row {\n      clear: both;\n    }\n\n    .col {\n      float: left;\n      margin-left: 20px;\n      width: 60px;\n      background: rgb(255,150,150);\n    }\n\n    /* Two column widths (120px) plus one gutter width (20px) */\n    .col.span2 { width: 140px; }\n    /* Three column widths (180px) plus two gutter widths (40px) */\n    .col.span3 { width: 220px; }\n    /* And so on... */\n    .col.span4 { width: 300px; }\n    .col.span5 { width: 380px; }\n    .col.span6 { width: 460px; }\n    .col.span7 { width: 540px; }\n    .col.span8 { width: 620px; }\n    .col.span9 { width: 700px; }\n    .col.span10 { width: 780px; }\n    .col.span11 { width: 860px; }\n    .col.span12 { width: 940px; }\n\n    </style>\n  </head>\n\n  <body>\n    <div class=\"wrapper\">\n      <div class=\"row\">\n        <div class=\"col\">1</div>\n        <div class=\"col\">2</div>\n        <div class=\"col\">3</div>\n        <div class=\"col\">4</div>\n        <div class=\"col\">5</div>\n        <div class=\"col\">6</div>\n        <div class=\"col\">7</div>\n        <div class=\"col\">8</div>\n        <div class=\"col\">9</div>\n        <div class=\"col\">10</div>\n        <div class=\"col\">11</div>\n        <div class=\"col\">12</div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col span1\">13</div>\n        <div class=\"col span6\">14</div>\n        <div class=\"col span3\">15</div>\n        <div class=\"col span2\">16</div>\n      </div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/grids/simple-grid.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple grid</title>\n    <style>\n\n    </style>\n  </head>\n\n  <body>\n    <div class=\"wrapper\">\n      <div class=\"row\">\n        <div class=\"col\">1</div>\n        <div class=\"col\">2</div>\n        <div class=\"col\">3</div>\n        <div class=\"col\">4</div>\n        <div class=\"col\">5</div>\n        <div class=\"col\">6</div>\n        <div class=\"col\">7</div>\n        <div class=\"col\">8</div>\n        <div class=\"col\">9</div>\n        <div class=\"col\">10</div>\n        <div class=\"col\">11</div>\n        <div class=\"col\">12</div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col span1\">13</div>\n        <div class=\"col span6\">14</div>\n        <div class=\"col span3\">15</div>\n        <div class=\"col span2\">16</div>    \n      </div>\n    </div>\n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/grids/skeleton.css",
    "content": "/*\n* Skeleton V2.0.4\n* Copyright 2014, Dave Gamache\n* www.getskeleton.com\n* Free to use under the MIT license.\n* http://www.opensource.org/licenses/mit-license.php\n* 12/29/2014\n*/\n\n\n/* Table of contents\n––––––––––––––––––––––––––––––––––––––––––––––––––\n- Grid\n- Base Styles\n- Typography\n- Links\n- Buttons\n- Forms\n- Lists\n- Code\n- Tables\n- Spacing\n- Utilities\n- Clearing\n- Media Queries\n*/\n\n\n/* Grid\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n.container {\n  position: relative;\n  width: 100%;\n  max-width: 960px;\n  margin: 0 auto;\n  padding: 0 20px;\n  box-sizing: border-box; }\n.column,\n.columns {\n  width: 100%;\n  float: left;\n  box-sizing: border-box; }\n\n/* For devices larger than 400px */\n@media (min-width: 400px) {\n  .container {\n    width: 85%;\n    padding: 0; }\n}\n\n/* For devices larger than 550px */\n@media (min-width: 550px) {\n  .container {\n    width: 80%; }\n  .column,\n  .columns {\n    margin-left: 4%; }\n  .column:first-child,\n  .columns:first-child {\n    margin-left: 0; }\n\n  .one.column,\n  .one.columns                    { width: 4.66666666667%; }\n  .two.columns                    { width: 13.3333333333%; }\n  .three.columns                  { width: 22%;            }\n  .four.columns                   { width: 30.6666666667%; }\n  .five.columns                   { width: 39.3333333333%; }\n  .six.columns                    { width: 48%;            }\n  .seven.columns                  { width: 56.6666666667%; }\n  .eight.columns                  { width: 65.3333333333%; }\n  .nine.columns                   { width: 74.0%;          }\n  .ten.columns                    { width: 82.6666666667%; }\n  .eleven.columns                 { width: 91.3333333333%; }\n  .twelve.columns                 { width: 100%; margin-left: 0; }\n\n  .one-third.column               { width: 30.6666666667%; }\n  .two-thirds.column              { width: 65.3333333333%; }\n\n  .one-half.column                { width: 48%; }\n\n  /* Offsets */\n  .offset-by-one.column,\n  .offset-by-one.columns          { margin-left: 8.66666666667%; }\n  .offset-by-two.column,\n  .offset-by-two.columns          { margin-left: 17.3333333333%; }\n  .offset-by-three.column,\n  .offset-by-three.columns        { margin-left: 26%;            }\n  .offset-by-four.column,\n  .offset-by-four.columns         { margin-left: 34.6666666667%; }\n  .offset-by-five.column,\n  .offset-by-five.columns         { margin-left: 43.3333333333%; }\n  .offset-by-six.column,\n  .offset-by-six.columns          { margin-left: 52%;            }\n  .offset-by-seven.column,\n  .offset-by-seven.columns        { margin-left: 60.6666666667%; }\n  .offset-by-eight.column,\n  .offset-by-eight.columns        { margin-left: 69.3333333333%; }\n  .offset-by-nine.column,\n  .offset-by-nine.columns         { margin-left: 78.0%;          }\n  .offset-by-ten.column,\n  .offset-by-ten.columns          { margin-left: 86.6666666667%; }\n  .offset-by-eleven.column,\n  .offset-by-eleven.columns       { margin-left: 95.3333333333%; }\n\n  .offset-by-one-third.column,\n  .offset-by-one-third.columns    { margin-left: 34.6666666667%; }\n  .offset-by-two-thirds.column,\n  .offset-by-two-thirds.columns   { margin-left: 69.3333333333%; }\n\n  .offset-by-one-half.column,\n  .offset-by-one-half.columns     { margin-left: 52%; }\n\n}\n\n\n/* Base Styles\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n/* NOTE\nhtml is set to 62.5% so that all the REM measurements throughout Skeleton\nare based on 10px sizing. So basically 1.5rem = 15px :) */\nhtml {\n  font-size: 62.5%; }\nbody {\n  font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */\n  line-height: 1.6;\n  font-weight: 400;\n  font-family: \"Raleway\", \"HelveticaNeue\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  color: #222; }\n\n\n/* Typography\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: 2rem;\n  font-weight: 300; }\nh1 { font-size: 4.0rem; line-height: 1.2;  letter-spacing: -.1rem;}\nh2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; }\nh3 { font-size: 3.0rem; line-height: 1.3;  letter-spacing: -.1rem; }\nh4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; }\nh5 { font-size: 1.8rem; line-height: 1.5;  letter-spacing: -.05rem; }\nh6 { font-size: 1.5rem; line-height: 1.6;  letter-spacing: 0; }\n\n/* Larger than phablet */\n@media (min-width: 550px) {\n  h1 { font-size: 5.0rem; }\n  h2 { font-size: 4.2rem; }\n  h3 { font-size: 3.6rem; }\n  h4 { font-size: 3.0rem; }\n  h5 { font-size: 2.4rem; }\n  h6 { font-size: 1.5rem; }\n}\n\np {\n  margin-top: 0; }\n\n\n/* Links\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\na {\n  color: #1EAEDB; }\na:hover {\n  color: #0FA0CE; }\n\n\n/* Buttons\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n.button,\nbutton,\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  display: inline-block;\n  height: 38px;\n  padding: 0 30px;\n  color: #555;\n  text-align: center;\n  font-size: 11px;\n  font-weight: 600;\n  line-height: 38px;\n  letter-spacing: .1rem;\n  text-transform: uppercase;\n  text-decoration: none;\n  white-space: nowrap;\n  background-color: transparent;\n  border-radius: 4px;\n  border: 1px solid #bbb;\n  cursor: pointer;\n  box-sizing: border-box; }\n.button:hover,\nbutton:hover,\ninput[type=\"submit\"]:hover,\ninput[type=\"reset\"]:hover,\ninput[type=\"button\"]:hover,\n.button:focus,\nbutton:focus,\ninput[type=\"submit\"]:focus,\ninput[type=\"reset\"]:focus,\ninput[type=\"button\"]:focus {\n  color: #333;\n  border-color: #888;\n  outline: 0; }\n.button.button-primary,\nbutton.button-primary,\ninput[type=\"submit\"].button-primary,\ninput[type=\"reset\"].button-primary,\ninput[type=\"button\"].button-primary {\n  color: #FFF;\n  background-color: #33C3F0;\n  border-color: #33C3F0; }\n.button.button-primary:hover,\nbutton.button-primary:hover,\ninput[type=\"submit\"].button-primary:hover,\ninput[type=\"reset\"].button-primary:hover,\ninput[type=\"button\"].button-primary:hover,\n.button.button-primary:focus,\nbutton.button-primary:focus,\ninput[type=\"submit\"].button-primary:focus,\ninput[type=\"reset\"].button-primary:focus,\ninput[type=\"button\"].button-primary:focus {\n  color: #FFF;\n  background-color: #1EAEDB;\n  border-color: #1EAEDB; }\n\n\n/* Forms\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\ninput[type=\"email\"],\ninput[type=\"number\"],\ninput[type=\"search\"],\ninput[type=\"text\"],\ninput[type=\"tel\"],\ninput[type=\"url\"],\ninput[type=\"password\"],\ntextarea,\nselect {\n  height: 38px;\n  padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */\n  background-color: #fff;\n  border: 1px solid #D1D1D1;\n  border-radius: 4px;\n  box-shadow: none;\n  box-sizing: border-box; }\n/* Removes awkward default styles on some inputs for iOS */\ninput[type=\"email\"],\ninput[type=\"number\"],\ninput[type=\"search\"],\ninput[type=\"text\"],\ninput[type=\"tel\"],\ninput[type=\"url\"],\ninput[type=\"password\"],\ntextarea {\n  -webkit-appearance: none;\n     -moz-appearance: none;\n          appearance: none; }\ntextarea {\n  min-height: 65px;\n  padding-top: 6px;\n  padding-bottom: 6px; }\ninput[type=\"email\"]:focus,\ninput[type=\"number\"]:focus,\ninput[type=\"search\"]:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"url\"]:focus,\ninput[type=\"password\"]:focus,\ntextarea:focus,\nselect:focus {\n  border: 1px solid #33C3F0;\n  outline: 0; }\nlabel,\nlegend {\n  display: block;\n  margin-bottom: .5rem;\n  font-weight: 600; }\nfieldset {\n  padding: 0;\n  border-width: 0; }\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  display: inline; }\nlabel > .label-body {\n  display: inline-block;\n  margin-left: .5rem;\n  font-weight: normal; }\n\n\n/* Lists\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\nul {\n  list-style: circle inside; }\nol {\n  list-style: decimal inside; }\nol, ul {\n  padding-left: 0;\n  margin-top: 0; }\nul ul,\nul ol,\nol ol,\nol ul {\n  margin: 1.5rem 0 1.5rem 3rem;\n  font-size: 90%; }\nli {\n  margin-bottom: 1rem; }\n\n\n/* Code\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\ncode {\n  padding: .2rem .5rem;\n  margin: 0 .2rem;\n  font-size: 90%;\n  white-space: nowrap;\n  background: #F1F1F1;\n  border: 1px solid #E1E1E1;\n  border-radius: 4px; }\npre > code {\n  display: block;\n  padding: 1rem 1.5rem;\n  white-space: pre; }\n\n\n/* Tables\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\nth,\ntd {\n  padding: 12px 15px;\n  text-align: left;\n  border-bottom: 1px solid #E1E1E1; }\nth:first-child,\ntd:first-child {\n  padding-left: 0; }\nth:last-child,\ntd:last-child {\n  padding-right: 0; }\n\n\n/* Spacing\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\nbutton,\n.button {\n  margin-bottom: 1rem; }\ninput,\ntextarea,\nselect,\nfieldset {\n  margin-bottom: 1.5rem; }\npre,\nblockquote,\ndl,\nfigure,\ntable,\np,\nul,\nol,\nform {\n  margin-bottom: 2.5rem; }\n\n\n/* Utilities\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n.u-full-width {\n  width: 100%;\n  box-sizing: border-box; }\n.u-max-full-width {\n  max-width: 100%;\n  box-sizing: border-box; }\n.u-pull-right {\n  float: right; }\n.u-pull-left {\n  float: left; }\n\n\n/* Misc\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\nhr {\n  margin-top: 3rem;\n  margin-bottom: 3.5rem;\n  border-width: 0;\n  border-top: 1px solid #E1E1E1; }\n\n\n/* Clearing\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n\n/* Self Clearing Goodness */\n.container:after,\n.row:after,\n.u-cf {\n  content: \"\";\n  display: table;\n  clear: both; }\n\n\n/* Media Queries\n–––––––––––––––––––––––––––––––––––––––––––––––––– */\n/*\nNote: The best way to structure the use of media queries is to create the queries\nnear the relevant code. For example, if you wanted to change the styles for buttons\non small devices, paste the mobile query code up in the buttons section and style it\nthere.\n*/\n\n\n/* Larger than mobile */\n@media (min-width: 400px) {}\n\n/* Larger than phablet (also point when grid becomes active) */\n@media (min-width: 550px) {}\n\n/* Larger than tablet */\n@media (min-width: 750px) {}\n\n/* Larger than desktop */\n@media (min-width: 1000px) {}\n\n/* Larger than Desktop HD */\n@media (min-width: 1200px) {}\n"
  },
  {
    "path": "css/css-layout/multicol/0-starting-point.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Multicol starting point</title>\n    <style>\n        body {\n            width: 90%;\n            max-width: 900px;\n            margin: 2em auto;\n            font: .9em/1.2 Arial, Helvetica, sans-serif;\n        }\n    </style>\n  </head>\n\n<body>\n    <div class=\"container\">\n        <h1>Simple multicol example</h1>\n\n        <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate.\n            Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus\n            laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra\n            egestas ligula. Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam\n            erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare\n            egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum\n            sapien.</p>\n\n        <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere\n            sit amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus\n            tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu\n            urna eget velit cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque\n            penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>\n    </div>\n</body>\n\n</html>"
  },
  {
    "path": "css/css-layout/multicol/1-simple-example.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple multicol example, column-count</title>\n  <style>\n    body {\n      width: 90%;\n      max-width: 900px;\n      margin: 2em auto;\n      font: .9em/1.2 Arial, Helvetica, sans-serif;\n    }\n\n    .container {\n      column-count: 3;\n    }\n  </style>\n  </head>\nß\n<body>\n  <div class=\"container\">\n    <h1>Simple multicol example</h1>\n\n    <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate.\n      Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet\n      sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula.\n      Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse\n      ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit\n      quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n\n    <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit\n      amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique\n      elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit\n      cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis\n      dis parturient montes, nascetur ridiculus mus.</p>\n  </div>\n</body>\n\n</html>"
  },
  {
    "path": "css/css-layout/multicol/2-simple-example-width.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple multicol example, column-width</title>\n  <style>\n    body {\n      width: 90%;\n      max-width: 900px;\n      margin: 2em auto;\n      font: .9em/1.2 Arial, Helvetica, sans-serif;\n    }\n\n    .container {\n      column-width: 200px;\n    }\n  </style>\n  </head>\n\n<body>\n  <div class=\"container\">\n    <h1>Simple multicol example</h1>\n\n    <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate.\n      Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet\n      sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula.\n      Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse\n      ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit\n      quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n\n    <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit\n      amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique\n      elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit\n      cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis\n      dis parturient montes, nascetur ridiculus mus.</p>\n  </div>\n</body>\n\n</html>"
  },
  {
    "path": "css/css-layout/multicol/3-gaps-rules.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple multicol example, column-width</title>\n  <style>\n    body {\n      width: 90%;\n      max-width: 900px;\n      margin: 2em auto;\n      font: .9em/1.2 Arial, Helvetica, sans-serif;\n    }\n\n    .container {\n      column-count: 3;\n      column-gap: 20px;\n      column-rule: 4px dotted rgb(79, 185, 227);\n    }\n  </style>\n  </head>\n\n<body>\n  <div class=\"container\">\n    <h1>Simple multicol example</h1>\n\n    <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat vulputate.\n      Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus laoreet\n      sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula.\n      Curabitur vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse\n      ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit\n      quam nec lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.</p>\n\n    <p>Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada ultrices. Phasellus turpis est, posuere sit\n      amet dapibus ut, facilisis sed est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus tristique\n      elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit\n      cursus viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque penatibus et magnis\n      dis parturient montes, nascetur ridiculus mus.</p>\n  </div>\n</body>\n\n</html>"
  },
  {
    "path": "css/css-layout/multicol/4-breaking.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple multicol example, break-inside</title>\n    <style>\n        body {\n            width: 90%;\n            max-width: 900px;\n            margin: 2em auto;\n            font: .9em/1.2 Arial, Helvetica, sans-serif;\n        }\n\n        .container {\n            column-width: 250px;\n            column-gap: 20px;\n        }\n\n        .card {\n            break-inside: avoid;\n            page-break-inside: avoid;\n            background-color: rgb(207, 232, 220);\n            border: 2px solid rgb(79, 185, 227);\n            padding: 10px;\n            margin: 0 0 1em 0;\n        }\n</style>\n  </head>\n\n<body>\n    <div class=\"container\">\n        <div class=\"card\">\n            <h2>I am the heading</h2>\n            <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat\n                vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies\n                tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci\n                vel, viverra egestas ligula.</p>\n        </div>\n\n        <div class=\"card\">\n            <h2>I am the heading</h2>\n            <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat\n                vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies\n                tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci\n                vel, viverra egestas ligula.</p>\n        </div>\n\n        <div class=\"card\">\n            <h2>I am the heading</h2>\n            <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat\n                vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies\n                tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci\n                vel, viverra egestas ligula.</p>\n        </div>\n\n        <div class=\"card\">\n            <h2>I am the heading</h2>\n            <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat\n                vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies\n                tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci\n                vel, viverra egestas ligula.</p>\n        </div>\n\n        <div class=\"card\">\n            <h2>I am the heading</h2>\n            <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat\n                vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies\n                tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci\n                vel, viverra egestas ligula.</p>\n        </div>\n\n        <div class=\"card\">\n            <h2>I am the heading</h2>\n            <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat\n                vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies\n                tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci\n                vel, viverra egestas ligula.</p>\n        </div>\n\n        <div class=\"card\">\n            <h2>I am the heading</h2>\n            <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam dolor, eu lacinia lorem placerat\n                vulputate. Duis felis orci, pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies\n                tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci\n                vel, viverra egestas ligula.</p>\n        </div>\n\n\n    </div>\n    \n</body>\n\n</html>"
  },
  {
    "path": "css/css-layout/positioning/0_basic-flow.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Basic document flow</title>\n\n    <style>\n      body {\n        width: 500px;\n        margin: 0 auto;\n      }\n\n      p {\n        background: aqua;\n        border: 3px solid blue;\n        padding: 10px;\n        margin: 10px;\n      }\n\n      span {\n        background: red;\n        border: 1px solid black;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Basic document flow</h1>\n\n    <p>I am a basic block level element. My adjacent block level elements sit on new lines below me.</p>\n\n    <p>By default we span 100% of the width of our parent element, and our height is as tall as our child content. Our total width and height is our content + padding + border width/height.</p>\n\n    <p>We are separated by our margins. Because of margin collapsing, we are separated by the width of one of our margins, not both.</p>\n\n    <p>inline elements <span>like this one</span> and <span>this one</span> sit on the same line as one another, and adjacent text nodes, if there is space on the same line. Overflowing inline elements <span>wrap onto a new line if possible — like this one containing text</span>, or just go on to a new line if not, much like this image will do: <img src=\"long.jpg\" alt=\"a wide but short section of a photo of several fabrics\"></p>\n\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/positioning/1_static-positioning.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Static positioning</title>\n\n    <style>\n      body {\n        width: 500px;\n        margin: 0 auto;\n      }\n\n      p {\n        background: aqua;\n        border: 3px solid blue;\n        padding: 10px;\n        margin: 10px;\n      }\n\n      span {\n        background: red;\n        border: 1px solid black;\n      }\n\n      .positioned {\n        position: static;\n        background: yellow;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Static positioning</h1>\n\n    <p>I am a basic block level element. My adjacent block level elements sit on new lines below me.</p>\n\n    <p class=\"positioned\">By default we span 100% of the width of our parent element, and our are as tall as our child content. Our total width and height is our content + padding + border width/height.</p>\n\n    <p>We are separated by our margins. Because of margin collapsing, we are separated by the width of one of our margins, not both.</p>\n\n    <p>inline elements <span>like this one</span> and <span>this one</span> sit on the same line as one another, and adjacent text nodes, if there is space on the same line. Overflowing inline elements <span>wrap onto a new line if possible — like this one containing text</span>, or just go on to a new line if not, much like this image will do: <img src=\"long.jpg\" alt=\"a wide but short section of a photo of several fabrics\"></p>\n\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/positioning/2_relative-positioning.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Relative positioning</title>\n\n    <style>\n      body {\n        width: 500px;\n        margin: 0 auto;\n      }\n\n      p {\n        background: aqua;\n        border: 3px solid blue;\n        padding: 10px;\n        margin: 10px;\n      }\n\n      span {\n        background: red;\n        border: 1px solid black;\n      }\n\n      .positioned {\n        position: relative;\n        background: yellow;\n        top: 30px;\n        left: 30px;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Relative positioning</h1>\n\n    <p>I am a basic block level element. My adjacent block level elements sit on new lines below me.</p>\n\n    <p class=\"positioned\">By default we span 100% of the width of our parent element, and our are as tall as our child content. Our total width and height is our content + padding + border width/height.</p>\n\n    <p>We are separated by our margins. Because of margin collapsing, we are separated by the width of one of our margins, not both.</p>\n\n    <p>inline elements <span>like this one</span> and <span>this one</span> sit on the same line as one another, and adjacent text nodes, if there is space on the same line. Overflowing inline elements <span>wrap onto a new line if possible — like this one containing text</span>, or just go on to a new line if not, much like this image will do: <img src=\"long.jpg\" alt=\"a wide but short section of a photo of several fabrics\"></p>\n\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/positioning/3_absolute-positioning.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Absolute positioning</title>\n\n    <style>\n      body {\n        width: 500px;\n        margin: 0 auto;\n      }\n\n      p {\n        background: aqua;\n        border: 3px solid blue;\n        padding: 10px;\n        margin: 10px;\n      }\n\n      span {\n        background: red;\n        border: 1px solid black;\n      }\n\n      .positioned {\n        position: absolute;\n        background: yellow;\n        top: 30px;\n        left: 30px;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Absolute positioning</h1>\n\n    <p>I am a basic block level element. My adjacent block level elements sit on new lines below me.</p>\n\n    <p class=\"positioned\">Now I'm absolutely positioned, I'm not playing by the rules any more!</p>\n\n    <p>We are separated by our margins. Because of margin collapsing, we are separated by the width of one of our margins, not both.</p>\n\n    <p>inline elements <span>like this one</span> and <span>this one</span> sit on the same line as one another, and adjacent text nodes, if there is space on the same line. Overflowing inline elements <span>wrap onto a new line if possible — like this one containing text</span>, or just go on to a new line if not, much like this image will do: <img src=\"long.jpg\" alt=\"a wide but short section of a photo of several fabrics\"></p>\n\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/positioning/4_positioning-context.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Positioning context</title>\n\n    <style>\n      body {\n        width: 500px;\n        margin: 0 auto;\n        position: relative;\n      }\n\n      p {\n        background: aqua;\n        border: 3px solid blue;\n        padding: 10px;\n        margin: 10px;\n      }\n\n      span {\n        background: red;\n        border: 1px solid black;\n      }\n\n      .positioned {\n        position: absolute;\n        background: yellow;\n        top: 30px;\n        left: 30px;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Positioning context</h1>\n\n    <p>I am a basic block level element. My adjacent block level elements sit on new lines below me.</p>\n\n    <p class=\"positioned\">Now I'm absolutely positioned relative to the <code>&lt;body&gt;</code> element, not the <code>&lt;html&gt;</code> element!</p>\n\n    <p>We are separated by our margins. Because of margin collapsing, we are separated by the width of one of our margins, not both.</p>\n\n    <p>inline elements <span>like this one</span> and <span>this one</span> sit on the same line as one another, and adjacent text nodes, if there is space on the same line. Overflowing inline elements <span>wrap onto a new line if possible — like this one containing text</span>, or just go on to a new line if not, much like this image will do: <img src=\"long.jpg\" alt=\"a wide but short section of a photo of several fabrics\"></p>\n\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/positioning/5_z-index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>z-index</title>\n\n    <style>\n      body {\n        width: 500px;\n        margin: 0 auto;\n        position: relative;\n      }\n\n      p {\n        background: aqua;\n        border: 3px solid blue;\n        padding: 10px;\n        margin: 10px;\n      }\n\n      span {\n        background: red;\n        border: 1px solid black;\n      }\n\n      .positioned {\n        position: absolute;\n        background: yellow;\n        top: 30px;\n        left: 30px;\n      }\n\n      p:nth-of-type(1) {\n        position: absolute;\n        background: lime;\n        top: 10px;\n        right: 30px;\n        z-index: 1;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>z-index</h1>\n\n    <p>I am a basic block level element. My adjacent block level elements sit on new lines below me.</p>\n\n    <p class=\"positioned\">Now I'm absolutely positioned relative to the <code>&lt;body&gt;</code> element, not the <code>&lt;html&gt;</code> element!</p>\n\n    <p>We are separated by our margins. Because of margin collapsing, we are separated by the width of one of our margins, not both.</p>\n\n    <p>inline elements <span>like this one</span> and <span>this one</span> sit on the same line as one another, and adjacent text nodes, if there is space on the same line. Overflowing inline elements <span>wrap onto a new line if possible — like this one containing text</span>, or just go on to a new line if not, much like this image will do: <img src=\"long.jpg\" alt=\"a wide but short section of a photo of several fabrics\"></p>\n\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/positioning/6_fixed-positioning.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Fixed positioning</title>\n\n    <style>\n      body {\n        width: 500px;\n        height: 1400px;\n        margin: 0 auto;\n      }\n\n      p {\n        background: aqua;\n        border: 3px solid blue;\n        padding: 10px;\n        margin: 10px;\n      }\n\n      span {\n        background: red;\n        border: 1px solid black;\n      }\n\n      h1 {\n        position: fixed;\n        top: 0px;\n        width: 500px;\n        margin-top: 0;\n        background: white;\n        padding: 10px;\n      }\n\n      p:nth-of-type(1) {\n        margin-top: 60px;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Fixed positioning</h1>\n\n    <p>I am a basic block level element. My adjacent block level elements sit on new lines below me.</p>\n\n    <p class=\"positioned\">Now I'm absolutely positioned relative to the <code>&lt;body&gt;</code> element, not the <code>&lt;html&gt;</code> element!</p>\n\n    <p>We are separated by our margins. Because of margin collapsing, we are separated by the width of one of our margins, not both.</p>\n\n    <p>inline elements <span>like this one</span> and <span>this one</span> sit on the same line as one another, and adjacent text nodes, if there is space on the same line. Overflowing inline elements <span>wrap onto a new line if possible — like this one containing text</span>, or just go on to a new line if not, much like this image will do: <img src=\"long.jpg\" alt=\"a wide but short section of a photo of several fabrics\"></p>\n\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/positioning/7_sticky-positioning.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Sticky positioning</title>\n\n    <style>\n      body {\n        width: 500px;\n        height: 1400px;\n        margin: 0 auto;\n      }\n\n      dt {\n          background-color: black;\n          color: white;\n          padding: 10px;\n          position: sticky;\n          top: 0;\n          left: 0;\n          margin: 1em 0;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Sticky positioning</h1>\n\n   <dl>\n       <dt>A</dt>\n       <dd>Apple</dd>\n       <dd>Ant</dd>\n       <dd>Altimeter</dd>\n       <dd>Airplane</dd>\n       <dt>B</dt>\n       <dd>Bird</dd>\n       <dd>Buzzard</dd>\n       <dd>Bee</dd>\n       <dd>Banana</dd>\n       <dd>Beanstalk</dd>\n       <dt>C</dt>\n       <dd>Calculator</dd>\n       <dd>Cane</dd>\n       <dd>Camera</dd>\n       <dd>Camel</dd>\n       <dt>D</dt>\n       <dd>Duck</dd>\n       <dd>Dime</dd>\n       <dd>Dipstick</dd>\n       <dd>Drone</dd>\n       <dt>E</dt>\n       <dd>Egg</dd>\n       <dd>Elephant</dd>\n       <dd>Egret</dd>\n   </dl>\n\n    \n  </body>\n</html>"
  },
  {
    "path": "css/css-layout/practical-positioning-examples/fixed-info-box.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title>Fixed tabbed info box</title>\n    <style>\n      /* General setup */\n\n      html {\n        font-family: sans-serif;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      body {\n        margin: 0;\n      }\n\n      /* info-box setup */\n\n      .info-box {\n        width: 452px;\n        height: 400px;\n        margin: 0 auto;\n        position: fixed;\n        top: 0;\n      }\n\n      /* styling info-box tabs */\n\n      .info-box [role=\"tablist\"] {\n        min-width: 100%;\n        display: flex;\n      }\n\n      .info-box [role=\"tab\"] {\n        border: none;\n        background: white;\n        padding: 0 1rem 0 1rem;\n        line-height: 3rem;\n        color: #b60000;\n        font-weight: bold;\n        outline: none;\n      }\n\n      .info-box [role=\"tab\"]:focus span,\n      .info-box [role=\"tab\"]:hover span {\n        outline: 1px solid blue;\n        outline-offset: 6px;\n        border-radius: 4px;\n      }\n\n      .info-box [role=\"tab\"][aria-selected=\"true\"] {\n        background-color: #b60000;\n        color: white;\n      }\n\n      /* styling info-box panels */\n\n      .info-box .panels {\n        height: 352px;\n        clear: both;\n        position: relative;\n      }\n\n      .info-box [role=\"tabpanel\"] {\n        background-color: #b60000;\n        color: white;\n        position: absolute;\n        padding: 0.8rem 1.2rem;\n        height: 352px;\n        top: 0;\n        left: 0;\n      }\n\n      .info-box [role=\"tabpanel\"].is-hidden {\n        display: none;\n      }\n\n      /* Styling our fake content */\n\n      .fake-content {\n        background-color: #a60000;\n        color: white;\n        padding: 10px;\n        height: 2000px;\n        margin-left: 470px;\n      }\n\n      .fake-content p {\n        margin-bottom: 200px;\n      }\n    </style>\n  </head>\n  <body>\n    <section class=\"fake-content\">\n      <h1>Fake content</h1>\n      <p>\n        This is fake content. Your main web page contents would probably go\n        here.\n      </p>\n      <p>\n        This is fake content. Your main web page contents would probably go\n        here.\n      </p>\n      <p>\n        This is fake content. Your main web page contents would probably go\n        here.\n      </p>\n      <p>\n        This is fake content. Your main web page contents would probably go\n        here.\n      </p>\n      <p>\n        This is fake content. Your main web page contents would probably go\n        here.\n      </p>\n      <p>\n        This is fake content. Your main web page contents would probably go\n        here.\n      </p>\n      <p>\n        This is fake content. Your main web page contents would probably go\n        here.\n      </p>\n      <p>\n        This is fake content. Your main web page contents would probably go\n        here.\n      </p>\n    </section>\n\n    <section class=\"info-box\">\n      <div role=\"tablist\" class=\"manual\">\n        <button\n          id=\"tab-1\"\n          type=\"button\"\n          role=\"tab\"\n          aria-selected=\"true\"\n          aria-controls=\"tabpanel-1\">\n          <span>Tab 1</span>\n        </button>\n\n        <button\n          id=\"tab-2\"\n          type=\"button\"\n          role=\"tab\"\n          aria-selected=\"false\"\n          aria-controls=\"tabpanel-2\">\n          <span>Tab 2</span>\n        </button>\n        <button\n          id=\"tab-3\"\n          type=\"button\"\n          role=\"tab\"\n          aria-selected=\"false\"\n          aria-controls=\"tabpanel-3\">\n          <span>Tab 3</span>\n        </button>\n      </div>\n\n      <div class=\"panels\">\n        <article id=\"tabpanel-1\" role=\"tabpanel\" aria-labelledby=\"tab-1\">\n          <h2>The first tab</h2>\n          <p>\n            Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n            Pellentesque turpis nibh, porttitor nec venenatis eu, pulvinar in\n            augue. Vestibulum et orci scelerisque, vulputate tellus quis,\n            lobortis dui. Vivamus varius libero at ipsum mattis efficitur ut nec\n            nisl. Nullam eget tincidunt metus. Donec ultrices, urna maximus\n            consequat aliquet, dui neque eleifend lorem, a auctor libero turpis\n            at sem. Aliquam ut porttitor urna. Nulla facilisi.\n          </p>\n        </article>\n\n        <article id=\"tabpanel-2\" role=\"tabpanel\" aria-labelledby=\"tab-2\">\n          <h2>The second tab</h2>\n          <p>\n            This tab hasn't got any Lorem Ipsum in it. But the content isn't\n            very exciting all the same.\n          </p>\n        </article>\n\n        <article id=\"tabpanel-3\" role=\"tabpanel\" aria-labelledby=\"tab-3\">\n          <h2>The third tab</h2>\n          <p>\n            Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n            Pellentesque turpis nibh, porttitor nec venenatis eu, pulvinar in\n            augue. And now an ordered list: how exciting!\n          </p>\n          <ol>\n            <li>dui neque eleifend lorem, a auctor libero turpis at sem.</li>\n            <li>Aliquam ut porttitor urna.</li>\n            <li>Nulla facilisi</li>\n          </ol>\n        </article>\n      </div>\n    </section>\n\n    <script src=\"tabs-manual.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/practical-positioning-examples/hidden-info-panel-start.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title>Hidden info panel</title>\n\n    <style></style>\n  </head>\n\n  <body>\n    <button\n      type=\"button\"\n      id=\"menu-button\"\n      aria-haspopup=\"true\"\n      aria-controls=\"info-panel\"\n      aria-expanded=\"false\">\n      ❔\n    </button>\n\n    <aside id=\"info-panel\" aria-labelledby=\"menu-button\">\n      <h2>Information</h2>\n\n      <p>Some very important information about your app:</p>\n\n      <ol>\n        <li>It has a really cool slide-out information panel.</li>\n        <li>\n          This information panel uses a combination of fixed positioning and a\n          CSS transition for the smooth sliding.\n        </li>\n        <li>\n          Using JavaScript this information panel is brought in and out of the\n          view.\n        </li>\n      </ol>\n    </aside>\n    <script></script>\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/practical-positioning-examples/hidden-info-panel.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title>Hidden info panel</title>\n\n    <style>\n      #menu-button {\n        position: absolute;\n        top: 0.5rem;\n        right: 0.5rem;\n        z-index: 1;\n\n        font-size: 3rem;\n        cursor: pointer;\n        border: none;\n        background-color: transparent;\n      }\n\n      /* information panel styling */\n      #info-panel {\n        background-color: #a60000;\n        color: white;\n\n        width: 340px;\n        height: 100%;\n        padding: 0 20px;\n\n        position: fixed;\n        top: 0;\n        right: -370px;\n\n        transition: 0.6s right ease-out;\n      }\n\n      #info-panel.open {\n        right: 0px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <button\n      type=\"button\"\n      id=\"menu-button\"\n      aria-haspopup=\"true\"\n      aria-controls=\"info-panel\"\n      aria-expanded=\"false\">\n      ❔\n    </button>\n\n    <aside id=\"info-panel\" aria-labelledby=\"menu-button\">\n      <h2>Information</h2>\n\n      <p>Some very important information about your app:</p>\n\n      <ol>\n        <li>It has a really cool slide-out information panel.</li>\n        <li>\n          This information panel uses a combination of fixed positioning and a\n          CSS transition for the smooth sliding.\n        </li>\n        <li>\n          Using JavaScript this information panel is brought in and out of the\n          view.\n        </li>\n      </ol>\n    </aside>\n\n    <script>\n      const button = document.querySelector(\"#menu-button\");\n      const panel = document.querySelector(\"#info-panel\");\n\n      button.addEventListener(\"click\", () => {\n        panel.classList.toggle(\"open\");\n        button.setAttribute(\"aria-expanded\", panel.classList.contains(\"open\"));\n      });\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/practical-positioning-examples/tabbed-info-box-start.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title>Tabbed info box</title>\n    <style></style>\n  </head>\n\n  <body>\n    <section class=\"info-box\">\n      <div role=\"tablist\" class=\"manual\">\n        <button\n          id=\"tab-1\"\n          type=\"button\"\n          role=\"tab\"\n          aria-selected=\"true\"\n          aria-controls=\"tabpanel-1\">\n          <span>Tab 1</span>\n        </button>\n\n        <button\n          id=\"tab-2\"\n          type=\"button\"\n          role=\"tab\"\n          aria-selected=\"false\"\n          aria-controls=\"tabpanel-2\">\n          <span>Tab 2</span>\n        </button>\n        <button\n          id=\"tab-3\"\n          type=\"button\"\n          role=\"tab\"\n          aria-selected=\"false\"\n          aria-controls=\"tabpanel-3\">\n          <span>Tab 3</span>\n        </button>\n      </div>\n\n      <div class=\"panels\">\n        <article id=\"tabpanel-1\" role=\"tabpanel\" aria-labelledby=\"tab-1\">\n          <h2>The first tab</h2>\n          <p>\n            Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n            Pellentesque turpis nibh, porttitor nec venenatis eu, pulvinar in\n            augue. Vestibulum et orci scelerisque, vulputate tellus quis,\n            lobortis dui. Vivamus varius libero at ipsum mattis efficitur ut nec\n            nisl. Nullam eget tincidunt metus. Donec ultrices, urna maximus\n            consequat aliquet, dui neque eleifend lorem, a auctor libero turpis\n            at sem. Aliquam ut porttitor urna. Nulla facilisi.\n          </p>\n        </article>\n\n        <article id=\"tabpanel-2\" role=\"tabpanel\" aria-labelledby=\"tab-2\">\n          <h2>The second tab</h2>\n          <p>\n            This tab hasn't got any Lorem Ipsum in it. But the content isn't\n            very exciting all the same.\n          </p>\n        </article>\n\n        <article id=\"tabpanel-3\" role=\"tabpanel\" aria-labelledby=\"tab-3\">\n          <h2>The third tab</h2>\n          <p>\n            Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n            Pellentesque turpis nibh, porttitor nec venenatis eu, pulvinar in\n            augue. And now an ordered list: how exciting!\n          </p>\n          <ol>\n            <li>dui neque eleifend lorem, a auctor libero turpis at sem.</li>\n            <li>Aliquam ut porttitor urna.</li>\n            <li>Nulla facilisi</li>\n          </ol>\n        </article>\n      </div>\n    </section>\n\n    <script src=\"tabs-manual.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/practical-positioning-examples/tabbed-info-box.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title>Tabbed info box</title>\n    <style>\n      /* General setup */\n\n      html {\n        font-family: sans-serif;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      body {\n        margin: 0;\n      }\n\n      /* info-box setup */\n\n      .info-box {\n        width: 452px;\n        height: 400px;\n        margin: 1.25rem auto 0;\n      }\n\n      /* styling info-box tabs */\n\n      .info-box [role=\"tablist\"] {\n        min-width: 100%;\n        display: flex;\n      }\n\n      .info-box [role=\"tab\"] {\n        border: none;\n        background: white;\n        padding: 0 1rem 0 1rem;\n        line-height: 3rem;\n        color: #b60000;\n        font-weight: bold;\n        outline: none;\n      }\n\n      .info-box [role=\"tab\"]:focus span,\n      .info-box [role=\"tab\"]:hover span {\n        outline: 1px solid blue;\n        outline-offset: 6px;\n        border-radius: 4px;\n      }\n\n      .info-box [role=\"tab\"][aria-selected=\"true\"] {\n        background-color: #b60000;\n        color: white;\n      }\n\n      /* styling info-box panels */\n\n      .info-box .panels {\n        height: 352px;\n        clear: both;\n        position: relative;\n      }\n\n      .info-box [role=\"tabpanel\"] {\n        background-color: #b60000;\n        color: white;\n        position: absolute;\n        padding: 0.8rem 1.2rem;\n        height: 352px;\n        top: 0;\n        left: 0;\n      }\n\n      .info-box [role=\"tabpanel\"].is-hidden {\n        display: none;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"info-box\">\n      <div role=\"tablist\" class=\"manual\">\n        <button\n          id=\"tab-1\"\n          type=\"button\"\n          role=\"tab\"\n          aria-selected=\"true\"\n          aria-controls=\"tabpanel-1\">\n          <span>Tab 1</span>\n        </button>\n\n        <button\n          id=\"tab-2\"\n          type=\"button\"\n          role=\"tab\"\n          aria-selected=\"false\"\n          aria-controls=\"tabpanel-2\">\n          <span>Tab 2</span>\n        </button>\n        <button\n          id=\"tab-3\"\n          type=\"button\"\n          role=\"tab\"\n          aria-selected=\"false\"\n          aria-controls=\"tabpanel-3\">\n          <span>Tab 3</span>\n        </button>\n      </div>\n\n      <div class=\"panels\">\n        <article id=\"tabpanel-1\" role=\"tabpanel\" aria-labelledby=\"tab-1\">\n          <h2>The first tab</h2>\n          <p>\n            Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n            Pellentesque turpis nibh, porttitor nec venenatis eu, pulvinar in\n            augue. Vestibulum et orci scelerisque, vulputate tellus quis,\n            lobortis dui. Vivamus varius libero at ipsum mattis efficitur ut nec\n            nisl. Nullam eget tincidunt metus. Donec ultrices, urna maximus\n            consequat aliquet, dui neque eleifend lorem, a auctor libero turpis\n            at sem. Aliquam ut porttitor urna. Nulla facilisi.\n          </p>\n        </article>\n\n        <article id=\"tabpanel-2\" role=\"tabpanel\" aria-labelledby=\"tab-2\">\n          <h2>The second tab</h2>\n          <p>\n            This tab hasn't got any Lorem Ipsum in it. But the content isn't\n            very exciting all the same.\n          </p>\n        </article>\n\n        <article id=\"tabpanel-3\" role=\"tabpanel\" aria-labelledby=\"tab-3\">\n          <h2>The third tab</h2>\n          <p>\n            Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n            Pellentesque turpis nibh, porttitor nec venenatis eu, pulvinar in\n            augue. And now an ordered list: how exciting!\n          </p>\n          <ol>\n            <li>dui neque eleifend lorem, a auctor libero turpis at sem.</li>\n            <li>Aliquam ut porttitor urna.</li>\n            <li>Nulla facilisi</li>\n          </ol>\n        </article>\n      </div>\n    </section>\n\n    <script src=\"tabs-manual.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "css/css-layout/practical-positioning-examples/tabs-manual.js",
    "content": "/*\n *   This content is licensed according to the W3C Software License at\n *   https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document\n *\n *   File:   tabs-manual.js\n *\n *   Desc:   Tablist widget that implements ARIA Authoring Practices\n */\n\n\"use strict\";\n\nclass TabsManual {\n  constructor(groupNode) {\n    this.tablistNode = groupNode;\n\n    this.tabs = [];\n\n    this.firstTab = null;\n    this.lastTab = null;\n\n    this.tabs = Array.from(this.tablistNode.querySelectorAll(\"[role=tab]\"));\n    this.tabpanels = [];\n\n    for (let i = 0; i < this.tabs.length; i += 1) {\n      const tab = this.tabs[i];\n      const tabpanel = document.getElementById(\n        tab.getAttribute(\"aria-controls\")\n      );\n\n      tab.tabIndex = -1;\n      tab.setAttribute(\"aria-selected\", \"false\");\n      this.tabpanels.push(tabpanel);\n\n      tab.addEventListener(\"keydown\", this.onKeydown.bind(this));\n      tab.addEventListener(\"click\", this.onClick.bind(this));\n\n      if (!this.firstTab) {\n        this.firstTab = tab;\n      }\n      this.lastTab = tab;\n    }\n\n    this.setSelectedTab(this.firstTab);\n  }\n\n  setSelectedTab(currentTab) {\n    for (let i = 0; i < this.tabs.length; i += 1) {\n      const tab = this.tabs[i];\n      if (currentTab === tab) {\n        tab.setAttribute(\"aria-selected\", \"true\");\n        tab.removeAttribute(\"tabindex\");\n        this.tabpanels[i].classList.remove(\"is-hidden\");\n      } else {\n        tab.setAttribute(\"aria-selected\", \"false\");\n        tab.tabIndex = -1;\n        this.tabpanels[i].classList.add(\"is-hidden\");\n      }\n    }\n  }\n\n  moveFocusToTab(currentTab) {\n    currentTab.focus();\n  }\n\n  moveFocusToPreviousTab(currentTab) {\n    let index;\n\n    if (currentTab === this.firstTab) {\n      this.moveFocusToTab(this.lastTab);\n    } else {\n      index = this.tabs.indexOf(currentTab);\n      this.moveFocusToTab(this.tabs[index - 1]);\n    }\n  }\n\n  moveFocusToNextTab(currentTab) {\n    let index;\n\n    if (currentTab === this.lastTab) {\n      this.moveFocusToTab(this.firstTab);\n    } else {\n      index = this.tabs.indexOf(currentTab);\n      this.moveFocusToTab(this.tabs[index + 1]);\n    }\n  }\n\n  /* EVENT HANDLERS */\n\n  onKeydown(event) {\n    const tgt = event.currentTarget;\n    let flag = false;\n\n    switch (event.key) {\n      case \"ArrowLeft\":\n        this.moveFocusToPreviousTab(tgt);\n        flag = true;\n        break;\n\n      case \"ArrowRight\":\n        this.moveFocusToNextTab(tgt);\n        flag = true;\n        break;\n\n      case \"Home\":\n        this.moveFocusToTab(this.firstTab);\n        flag = true;\n        break;\n\n      case \"End\":\n        this.moveFocusToTab(this.lastTab);\n        flag = true;\n        break;\n\n      default:\n        break;\n    }\n\n    if (flag) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  }\n\n  // Since this example uses buttons for the tabs, the click onr also is activated\n  // with the space and enter keys\n  onClick(event) {\n    this.setSelectedTab(event.currentTarget);\n  }\n}\n\n// Initialize tablist\n\nwindow.addEventListener(\"load\", function () {\n  const tablists = document.querySelectorAll(\"[role=tablist].manual\");\n  for (let i = 0; i < tablists.length; i++) {\n    new TabsManual(tablists[i]);\n  }\n});\n"
  },
  {
    "path": "css/css-layout/stacking-and-float/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Stacking and float</title>\n    <style type=\"text/css\">\n\n    div {\n        font: 12px Arial;\n    }\n\n    span.bold { font-weight: bold; }\n\n    #absdiv1 {\n        position: absolute;\n        width: 150px;\n        height: 200px;\n        top: 10px;\n        right: 140px;\n        border: 1px dashed #990000;\n        background-color: #ffdddd;\n        text-align: center;\n    }\n\n    #normdiv {\n        height: 100px;\n        border: 1px dashed #999966;\n        background-color: #ffffcc;\n        margin: 0px 10px 0px 10px;\n        text-align: left;\n    }\n\n    #flodiv1 {\n        margin: 0px 10px 0px 20px;\n        float: left;\n        width: 150px;\n        height: 200px;\n        border: 1px dashed #009900;\n        background-color: #ccffcc;\n        text-align: center;\n    }\n\n    #flodiv2 {\n        margin: 0px 20px 0px 10px;\n        float: right;\n        width: 150px;\n        height: 200px;\n        border: 1px dashed #009900;\n        background-color: #ccffcc;\n        text-align: center;\n    }\n\n    #absdiv2 {\n        position: absolute;\n        width: 150px;\n        height: 100px;\n        top: 130px;\n        left: 100px;\n        border: 1px dashed #990000;\n        background-color: #ffdddd;\n        text-align: center;\n    }\n\n</style>\n  </head>\n\n<body>\n    <br /><br />\n\n    <div id=\"absdiv1\">\n        <br /><span class=\"bold\">DIV #1</span>\n        <br />position: absolute;\n    </div>\n\n    <div id=\"flodiv1\">\n        <br /><span class=\"bold\">DIV #2</span>\n        <br />float: left;\n    </div>\n\n    <div id=\"flodiv2\">\n        <br /><span class=\"bold\">DIV #3</span>\n        <br />float: right;\n    </div>\n\n    <br />\n\n    <div id=\"normdiv\">\n        <br /><span class=\"bold\">DIV #4</span>\n        <br />no positioning\n    </div>\n\n    <div id=\"absdiv2\">\n        <br /><span class=\"bold\">DIV #5</span>\n        <br />position: absolute;\n    </div>\n</body>\n</html>\n"
  },
  {
    "path": "css/introduction-to-css/box-model/app/sass",
    "content": "/*\nErrno::ENOENT: No such file or directory - app/sass\n\nBacktrace:\n/Users/chrismills/.rvm/gems/ruby-1.9.3-p547/gems/sass-3.2.14/lib/sass/plugin/compiler.rb:360:in `read'\n/Users/chrismills/.rvm/gems/ruby-1.9.3-p547/gems/sass-3.2.14/lib/sass/plugin/compiler.rb:360:in `update_stylesheet'\n/Users/chrismills/.rvm/gems/ruby-1.9.3-p547/gems/sass-3.2.14/lib/sass/plugin/compiler.rb:203:in `block in update_stylesheets'\n/Users/chrismills/.rvm/gems/ruby-1.9.3-p547/gems/sass-3.2.14/lib/sass/plugin/compiler.rb:201:in `each'\n/Users/chrismills/.rvm/gems/ruby-1.9.3-p547/gems/sass-3.2.14/lib/sass/plugin/compiler.rb:201:in `update_stylesheets'\n/Users/chrismills/.rvm/gems/ruby-1.9.3-p547/gems/sass-3.2.14/lib/sass/plugin/compiler.rb:235:in `watch'\n/Users/chrismills/.rvm/gems/ruby-1.9.3-p547/gems/sass-3.2.14/lib/sass/plugin.rb:107:in `method_missing'\n/Users/chrismills/.rvm/gems/ruby-1.9.3-p547/gems/sass-3.2.14/lib/sass/exec.rb:463:in `watch_or_update'\n/Users/chrismills/.rvm/gems/ruby-1.9.3-p547/gems/sass-3.2.14/lib/sass/exec.rb:326:in `process_result'\n/Users/chrismills/.rvm/gems/ruby-1.9.3-p547/gems/sass-3.2.14/lib/sass/exec.rb:41:in `parse'\n/Users/chrismills/.rvm/gems/ruby-1.9.3-p547/gems/sass-3.2.14/lib/sass/exec.rb:21:in `parse!'\n/Users/chrismills/.rvm/gems/ruby-1.9.3-p547/gems/sass-3.2.14/bin/sass:13:in `<top (required)>'\n/Users/chrismills/.rvm/gems/ruby-1.9.3-p547/bin/sass:23:in `load'\n/Users/chrismills/.rvm/gems/ruby-1.9.3-p547/bin/sass:23:in `<main>'\n/Users/chrismills/.rvm/gems/ruby-1.9.3-p547/bin/ruby_executable_hooks:15:in `eval'\n/Users/chrismills/.rvm/gems/ruby-1.9.3-p547/bin/ruby_executable_hooks:15:in `<main>'\n*/\nbody:before {\n  white-space: pre;\n  font-family: monospace;\n  content: \"Errno::ENOENT: No such file or directory - app/sass\"; }\n"
  },
  {
    "path": "css/introduction-to-css/box-model/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Box model</title>\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n  <body>\n    <header>Header</header>\n    <main>Main content</main>\n    <footer>Footer</footer>\n  </body>\n</html>\n"
  },
  {
    "path": "css/introduction-to-css/box-model/style.css",
    "content": "/* General styles */\n\nbody {\n  margin: 0;\n}\n\nbody > * {\n  padding: 10px;\n  font-size: 20px;\n  border: 20px solid rgba(0,0,0,0.5);\n}\n\n/* specific boxes */\n\nheader, footer {\n  background-color: blue;\n  color: white;\n}\n\nmain {\n  background-color: yellow;\n}\n\nheader {\n\n}\n\nfooter {\n\n}\n\n"
  },
  {
    "path": "css/introduction-to-css/cascade-and-inheritance/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS values and units</title>\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n  <body>\n    <div id=\"important\">\n      <p class=\"better\">This is a paragraph.</p>\n      <p class=\"better\" id=\"winning\">One selector to rule them all!</p>\n    </div>\n\n    <hr>\n\n    <div id=\"weight\">\n      <div id=\"outer\" class=\"container\">\n        <div id=\"inner\" class=\"container\">\n          <ul>\n            <li class=\"nav\"><a href=\"#\">One</a></li>\n            <li class=\"nav\"><a href=\"#\">Two</a></li>\n          </ul>\n        </div>\n      </div>\n    </div>\n\n    <hr>\n\n    <div id=\"live\">\n      <div id=\"outer\" class=\"container\">\n        <div id=\"inner\" class=\"container\">\n          <ul>\n            <li class=\"nav\"><a href=\"#\">One</a></li>\n            <li class=\"nav\"><a href=\"#\">Two</a></li>\n          </ul>\n        </div>\n      </div>\n    </div>\n\n    "
  },
  {
    "path": "css/introduction-to-css/cascade-and-inheritance/style.css",
    "content": "/* General styles */\n\nhr {\n  width: 80%;\n  margin: 50px auto;\n}\n\n/* Important example */\n\n#important #winning {\n  background-color: red;\n  border: 1px solid black;\n}\n\n#important .better {\n  background-color: gray;\n  border: none !important;\n}\n\n#important p {\n  color: white;\n  background-color: blue;\n  padding: 5px;\n}\n\n/* Selector weight example */\n\n/* specificity: 0201; */\n#weight #outer a {\n  background-color: red;\n}\n\n/* specificity: 0301; */\n#weight #outer #inner a {\n  background-color: blue;\n}\n\n/* specificity: 0204; */\n#weight #outer div ul li a {\n  color: yellow;\n}\n\n/* specificity: 0213; */\n#weight #outer div ul .nav a {\n  color: white;\n}\n\n/* specificity: 0124; */\n#weight div div li:nth-child(2) a:hover {\n  border: 10px solid black;\n}\n\n/* specificity: 0123; */\n#weight div li:nth-child(2) a:hover {\n  border: 10px dashed black;\n}\n\n/* specificity: 0133; */\n#weight div div .nav:nth-child(2) a:hover {\n  border: 10px double black;\n}\n\n#weight a {\n  display: inline-block;\n  line-height: 40px;\n  font-size: 20px;\n  text-decoration: none;\n  text-align: center;\n  width: 200px;\n  margin-bottom: 10px;\n}\n\n#weight ul {\n  padding: 0;\n}\n\n#weight li {\n  list-style-type: none;\n}\n\n/* live sample styling */\n\n#live #outer div ul .nav a {\n  background-color: blue;\n  padding: 5px;\n  display: inline-block;\n  margin-bottom: 10px;\n}\n\n#live div div li a {\ncolor: yellow;\n}\n\n#live #outer #inner a {\n  background-color: initial;\n  color: red;\n}\n"
  },
  {
    "path": "css/introduction-to-css/css-selectors/combinators.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Combinators example</title>\n    <style>\n\n      section p {\n        color: blue;\n      }\n\n      section > p {\n        background-color: yellow;\n      }\n\n      h2 + p {\n        text-transform: uppercase;\n      }\n\n      h2 ~ p {\n        border: 1px dashed black;\n      }\n\n    </style>\n  </head>\n  <body>\n    <section>\n      <h2>Heading 1</h2>\n      <p>Paragraph 1</p>\n      <p>Paragraph 2</p>\n      <div>\n        <h2>Heading 2</h2>\n        <p>Paragraph 3</p>\n        <p>Paragraph 4</p>\n      </div>\n    </section>\n  </body>\n</html>\n"
  },
  {
    "path": "css/introduction-to-css/css-selectors/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS selectors</title>\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n  <body>\n    <div id=\"element-selectors\">\n      <h1>Hello World!</h1>\n      <p>This is a paragraph.</p>\n\n      <ul>\n        <li>This is</li>\n        <li>A list</li>\n      </ul>\n    </div>\n\n    <hr>\n\n    <div id=\"class-selectors\">\n      <p class=\"base-box warning\">My first paragraph.</p>\n      <p class=\"\">My second paragraph.</p>\n      <p class=\"\">My third paragraph</p>\n    </div>\n\n    <hr>\n\n    <div id=\"id-selectors\">\n      <p id=\"first\"><strong>Winner</strong>: Velma Victory</p>\n      <p id=\"second\"><strong>2nd</strong>: Colin Contender</p>\n      <p id=\"third\"><strong>3rd</strong>: Phoebe Player</p>\n    </div>   \n\n    <hr>\n\n    <div id=\"attribute-selectors\">\n      <ol>\n        <li lang=\"en-GB\" data-perf=\"inc-pro\">Manchester United</li>\n        <li lang=\"es\" data-perf=\"same-pro\">Barcelona</li>\n        <li lang=\"de\" data-perf=\"dec\">Bayern Munich</li>\n\n        <li lang=\"es\" data-perf=\"same\">Real Madrid</li>\n        <li lang=\"de\" data-perf=\"inc-rel\">Borussia Dortmund</li>\n        <li lang=\"en-GB\" data-perf=\"dec-rel\">Southampton FC</li>\n      </ol>\n    </div>\n\n    <hr>\n\n    <div id=\"pseudo-class-selectors\">\n      <ul>\n        <li><a href=\"#\">United Kingdom</a></li>\n        <li><a href=\"#\">Germany</a></li>\n        <li><a href=\"#\">Finland</a></li>\n        <li><a href=\"#\">Russia</a></li>\n        <li><a href=\"#\">Spain</a></li>\n        <li><a href=\"#\">Poland</a></li>\n      </ul>\n    </div>\n\n    <hr>\n\n    <div id=\"pseudo-element-selectors\">\n      <p>This is my very important paragraph. I am a distinguished gentleman of such renown that my paragraph needs to be styled in a manner befitting my majesty. Bow before my splendour, dear students, and go forth and learn CSS!</p>\n    </div>\n\n    <hr>\n\n    <div id=\"combinators\"> \n\n      <ul>\n        <li><a href=\"#\">Home</a></li>\n        <li><a href=\"#\">Portfolio</a></li>\n        <li><a href=\"#\">About</a></li>\n      </ul>\n\n      <h1>Welcome to my website</h1>\n\n      <p>Hello, and welcome! I hope you enjoy your time here.</p>\n\n      <h2>My philosophy</h2>\n\n      <p>I am a believer in chilling out, and not getting grumpy. I think everyone else should follow this ideal, and <a href=\"#\">drink green tea</a>.</p>\n    \n    </div>   \n  </body>\n</html> "
  },
  {
    "path": "css/introduction-to-css/css-selectors/style.css",
    "content": "/* General styles */\n\nhr {\n  width: 80%;\n  margin: 50px auto;\n}\n\n/* Element selectors example */\n\n#element-selectors h1 {\n  color: red;\n  text-shadow: 1px 1px 1px black;\n  background: linear-gradient(to bottom, rgba(0,0,0,0.25), rgba(0,0,0,0.1));\n  padding: 3px;\n  text-align: center;\n  box-shadow: inset 2px 2px 5px rgba(0,0,0,0.5), inset -2px -2px 5px rgba(255,255,255,0.5);\n}\n\n/* Class selectors example */\n\n#class-selectors .base-box {\n  background-image: linear-gradient(to bottom, rgba(0,0,0,0.1), rgba(0,0,0,0.3));\n  padding: 3px 3px 3px 7px;\n}\n\n#class-selectors .important {\n  font-weight: bold;\n}\n\n#class-selectors .editor-note {\n  background-color: #9999ff;\n  border-left: 6px solid #333399;\n}\n\n#class-selectors .warning {\n  background-color: #ff9999;\n  border-left: 6px solid #993333;\n}\n\n/* ID selectors example */\n\n#id-selectors p {\n  text-transform: uppercase;\n  padding: 5px;\n}\n\n#id-selectors #first {\n  background-color: goldenrod;\n}\n\n#id-selectors #second {\n  background-color: silver;\n}\n\n#id-selectors #third {\n  background-color: #CD7F32;\n}\n\n/* Attribute selectors */\n\n#attribute-selectors li[lang=\"en-GB\"] {\n  background: url(\"en-GB.png\") 5px center no-repeat;\n}\n\n#attribute-selectors li[lang=\"de\"] {\n  background: url(\"de.png\") 5px center no-repeat;\n}\n\n#attribute-selectors li[lang=\"es\"] {\n  background: url(\"es.png\") 5px center no-repeat;\n}\n\n#attribute-selectors li[data-perf*=\"inc\"] {\n  background-color: rgba(0,255,0,0.7);\n}\n\n#attribute-selectors li[data-perf*=\"same\"] {\n  background-color: rgba(0,0,255,0.5);\n}\n\n#attribute-selectors li[data-perf*=\"dec\"] {\n  background-color: rgba(255,0,0,0.7);\n}\n\n#attribute-selectors li[data-perf*=\"pro\"] {\n  font-weight: bold;\n}\n\n#attribute-selectors li[data-perf*=\"rel\"] {\n  font-style: italic;\n  color: #666;\n}\n\n#attribute-selectors ol {\n  padding: 0;\n}\n\n#attribute-selectors li {\n  padding: 3px 3px 3px 34px;\n  margin-bottom: 5px;\n  list-style-position: inside;\n}\n\n/* Pseudo class selectors */\n\n#pseudo-class-selectors ul {\n  padding: 0;\n}\n\n#pseudo-class-selectors li {\n  padding: 3px;\n  margin-bottom: 5px;\n  list-style-type: none;\n}\n\n#pseudo-class-selectors a {\n  text-decoration: none;\n  color: black;\n}\n\n#pseudo-class-selectors a:hover {\n  text-decoration: underline;\n  color: red;\n}\n\n#pseudo-class-selectors li:nth-of-type(2n) {\n  background-color: #ccc;\n}\n\n#pseudo-class-selectors li:nth-of-type(2n+1) {\n  background-color: #eee;\n}\n\n/* Pseudo element selectors */\n\n#pseudo-element-selectors p::first-line {\n  text-transform: uppercase;\n}\n\n#pseudo-element-selectors p::first-letter {\n  font-size: 3em;\n  border: 1px solid black;\n  background: red;\n  display: block;\n  float: left;\n  padding: 2px;\n  margin-right: 4px;\n}\n\n/* Combinators */\n\n#combinators ul {\n  padding: 0;\n  list-style-type: none;\n}\n\n#combinators ul a {\n  text-decoration: none;\n  display: inline-block;\n  color: black;\n  background-color: red;\n  padding: 5px;\n  margin-bottom: 10px;\n}\n\n#combinators ul a:hover {\n  color: red;\n  background-color: black;\n}\n\nh1 + p {\n  font-weight: bold;\n  color: blue;\n}\n"
  },
  {
    "path": "css/introduction-to-css/css-values-and-units/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS values and units</title>\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n  <body>\n    <div id=\"length-simple\">\n      <p>This is a paragraph.</p>\n      <p>This is a paragraph.</p>\n      <p>This is a paragraph.</p>\n    </div>\n\n    <hr>\n\n    <div id=\"unitless\">\n      <p>Blue ocean silo royal baby space local evergreen relationship housekeeping native advertising diversify ideation session. Soup-to-nuts herding cats resolutionary virtuoso granularity catalyst wow factor loop back brainstorm. Core competency baked in push back silo irrational exuberance circle back roll-up.</p>\n    </div>\n\n    <hr>\n\n    <div id=\"animation\">\n      <p>Hello</p>\n    </div>\n\n    <hr>\n\n    <div id=\"percentage\">\n      <div>Fixed width layout with pixels</div>\n      <div>Liquid layout with percentages</div>\n    </div>\n\n    <hr>\n\n    <div id=\"color\">\n      <p>This paragraph has a red background</p>\n      <p>This paragraph has a blue background</p>\n      <p>This paragraph has a kind of pinky lilac background</p>\n    </div>\n\n    <hr>\n\n    <div id=\"length-playground\">\n      <div class=\"outer\">\n        <div class=\"inner\">\n        </div>\n      </div>\n    </div>\n\n    <hr>\n\n    <div id=\"color-playground\">\n      <div class=\"first\">\n      </div>\n      <div class=\"second\">\n      </div>\n      <div class=\"third\">\n      </div>\n    </div>\n       \n  </body>\n</html> "
  },
  {
    "path": "css/introduction-to-css/css-values-and-units/style.css",
    "content": "/* General styles */\n\nhr {\n  width: 80%;\n  margin: 50px auto;\n}\n\n/* Simple size/length example */\n\n#length-simple p {\n  margin: 5px;\n  padding: 10px;\n  border: 2px solid black;\n  background-color: cyan;\n}\n\n/* length units example */\n\n#length-simple p:nth-child(1) {\n  width: 150px;\n  font-size: 18px;\n}\n\n#length-simple p:nth-child(2) {\n  width: 250px;\n  font-size: 24px;\n}\n\n#length-simple p:nth-child(3) {\n  width: 350px;\n  font-size: 30px;\n}\n\n/* unitless number example */\n\n#unitless p {\n  line-height: 1.5;\n}\n\n/* CSS animation example */\n\n@keyframes rotate {\n  0% {\n    transform: rotate(0deg);\n  }\n\n  100% {\n    transform: rotate(360deg);\n  }\n}\n\n#animation p {\n  color: red;\n  width: 100px;\n  font-size: 40px;\n  transform-origin: center;\n}\n\n#animation p:hover {\n  animation-name: rotate;\n  animation-duration: 0.6s;\n  animation-timing-function: linear;\n  animation-iteration-count: 5;\n}\n\n/* Percentage example */\n\n#percentage div {\n  margin: 10px;\n  font-size: 200%;\n  color: white;\n  height: 150px;\n  border: 2px solid black;\n}\n\n#percentage div:nth-child(1) {\n  background-color: red;\n  width: 1300px;\n}\n\n#percentage div:nth-child(2) {\n  background-color: blue;\n  width: 75%;\n}\n\n/* Color example */\n\n/* equivalent to the red keyword */\n#color p:nth-child(1) {\n  background-color: rgb(255,0,0);\n}\n\n/* equivalent to the blue keyword */\n#color p:nth-child(2) {\n  background-color: rgb(0,0,255);\n}\n\n/* has no exact keyword equivalent */\n#color p:nth-child(3) {\n  background-color: rgb(224,176,255);\n}\n\n/* length playground for live sample */\n\n#length-playground .outer {\n  width: 100%;\n  height: 200px;\n  background-color: red;\n}\n\n#length-playground .inner {\n  width: 550px;\n  height: 200px;\n  background-color: blue;\n}\n\n/* color playground for live sample */\n\n#color-playground .first {\n  background-color: red;\n  width: 400px;\n  height: 200px;\n  top: 0;\n  left: 100px;\n}\n\n#color-playground .second {\n  background-color: blue;\n  width: 200px;\n  height: 200px;\n  top: -50px;\n  left: 125px;\n}\n\n#color-playground .third {\n  background-color: pink;\n  width: 200px;\n  height: 300px;\n  top: -375px;\n  left: 250px;\n}\n\n#color-playground div {\n  position: relative;\n}"
  },
  {
    "path": "css/introduction-to-css/debugging-css/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Debugging CSS</title>\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n  <body>\n    <header>\n      <h1>My imperfect page</h1>\n    </header> \n\n    <main>\n\n      <h2>My article</h2>\n\n      <img src=\"https://mdn.mozillademos.org/files/11947/ff-logo.png\" alt=\"firefox logo\">\n\n      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla.</p>\n\n      <ul>\n        <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>\n        <li>Integer nec odio. Praesent libero.</li>\n        <li>Sed cursus ante dapibus diam.</li>\n      </ul>\n\n      <p>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales ligula in libero. Sed dignissim lacinia nunc. Curabitur tortor. Pellentesque nibh. Aenean quam. In scelerisque sem at dolor.</p>\n      \n    </main>\n\n    <footer>\n      <p>&copy;1978 Chris' brain</p>\n    </footer>  \n  </body>\n</html>\n"
  },
  {
    "path": "css/introduction-to-css/debugging-css/style.css",
    "content": "/* General styles */\n\nhtml {\n  font-family: 'Helvetica neue', Arial, 'sans serif';\n  font-size: 10px;\n}\n\nbody {\n  width: 80em;\n  margin: 0 auto;\n}\n\n/* Typography */\n\nh1 {\n  font-size: 4em;\n}\n\nh2 {\n  font-size: 3.2em;\n}\n\npli {\n  font-size: 1.7em;\n}\n\n/*+++ more specific section styles +++*/\n\n/* header and footer */\n\nheader, footer {\n  background-colour: teal;\n  height: 10em;\n  padding: 2em;\n}\n\nh1, footer p {\n  margin: -70px;\n}\n\nh1 {\n  text-align: center;\n  padding: 0.5em 0;\n}\n\n/* main content */\n\nmain {\n  padding: 2em;\n}\n\nmain p, main li {\n  line-height: 2;\n}\n\nimg {\n  float: right\n  margin: 1.2em 2em;\n}"
  },
  {
    "path": "css/introduction-to-css/debugging-css-finished/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS comprehension</title>\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n  <body>\n    <header>\n      <h1>My imperfect page</h1>\n    </header> \n\n    <main>\n\n      <h2>My article</h2>\n\n      <img src=\"https://mdn.mozillademos.org/files/11947/ff-logo.png\" alt=\"firefox logo\">\n\n      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla.</p>\n\n      <ul>\n        <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>\n        <li>Integer nec odio. Praesent libero.</li>\n        <li>Sed cursus ante dapibus diam.</li>\n      </ul>\n\n      <p>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales ligula in libero. Sed dignissim lacinia nunc. Curabitur tortor. Pellentesque nibh. Aenean quam. In scelerisque sem at dolor.</p>\n      \n    </main>\n\n    <footer>\n      <p>&copy;1978 Chris' brain</p>\n    </footer>  \n  </body>\n</html>\n"
  },
  {
    "path": "css/introduction-to-css/debugging-css-finished/style.css",
    "content": "/* General styles */\n\nhtml {\n  font-family: 'Helvetica neue', Arial, 'sans serif';\n  font-size: 10px;\n}\n\nbody {\n  width: 80em;\n  margin: 0 auto;\n}\n\n/* Typography */\n\nh1 {\n  font-size: 4em;\n}\n\nh2 {\n  font-size: 3.2em;\n}\n\np, li {\n  font-size: 1.7em;\n}\n\n/*+++ more specific section styles +++*/\n\n/* header and footer */\n\nheader, footer {\n  background-color: teal;\n  height: 10em;\n  padding: 2em;\n}\n\nh1, footer p {\n  margin: 0;\n}\n\nh1 {\n  text-align: center;\n  padding: 0.5em 0;\n}\n\n/* main content */\n\nmain {\n  padding: 2em;\n}\n\nmain p, main li {\n  line-height: 2;\n}\n\nimg {\n  float: right;\n  margin: 1.2em 2em;\n}"
  },
  {
    "path": "css/introduction-to-css/fundamental-css-comprehension/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Fundamental CSS comprehension</title>\n  </head>\n  <body>\n\n  <section class=\"card\">\n    <header>\n      <h2>Chris Mills</h2>\n    </header>\n    <article>\n      <img src=\"chris.jpg\" alt=\"A picture of Chris - a man with glasses, a beard, and a silly wooly hat\">\n      <p>50 My Street<br>\n         The Town<br>\n         Gray Peach<br>\n         UK<br>\n         ZO50 1MU<br>\n        <strong>Tel</strong>: 01234 567 890<br>\n        <strong>Mail</strong>: chris@nothere.com</p>\n    </article>\n    <footer>\n      <p>Editing, writing, and web development services</p>\n    </footer>\n  </section>\n\n  </body>\n</html>\n"
  },
  {
    "path": "css/introduction-to-css/fundamental-css-comprehension/style-resources.txt",
    "content": "/* General styles - put these straight into your stylesheet */\n\nbody {\n  margin: 0;\n}\n\nhtml {\n  font-family: 'Helvetica neue', Arial, 'sans serif';\n  font-size: 10px;\n  background-color: #ccc;\n}\n\n/* Selectors to be matched up with rulesets */\n\n.card article img\n.card footer\n.card header\n.card\n\n/* Rulesets to be matched up with selectors */\n\n{\n  width: 35em;\n  height: 22em;\n  margin: 5em auto;\n  background-colour: red;\n  border: 0.2em solid black;\n  border-radius: 1.5em;\n}\n\n{\n  background-image: linear-gradient(to bottom,rgba(0,0,0,0.1), rgba(0,0,0,0));\n  border-radius: 1.5em 1.5em 0 0;\n}\n\n{\n  background-image: linear-gradient(to bottom,rgba(0,0,0,0), rgba(0,0,0,0.1));\n  border-radius: 0 0 1.5em 1.5em;\n}\n\n{\n  max-height: 100%\n  float: right;\n}\n"
  },
  {
    "path": "css/introduction-to-css/fundamental-css-comprehension-finished/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Fundamental CSS comprehension</title>\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n  <body>\n\n  <section class=\"card\">\n    <header>\n      <h2>Chris Mills</h2>\n    </header>\n    <article>\n      <img src=\"chris.jpg\" alt=\"A picture of Chris - a man with glasses, a beard, and a silly wooly hat\">\n      <p>50 My Street<br>\n         The Town<br>\n         Gray Peach<br>\n         UK<br>\n         ZO50 1MU<br>\n        <strong>Tel</strong>: 01234 567 890<br>\n        <strong>Mail</strong>: chris@nothere.com</p>\n    </article>\n    <footer>\n      <p>Editing, writing, and web development services</p>\n    </footer>\n  </section>\n\n  </body>\n</html>\n"
  },
  {
    "path": "css/introduction-to-css/fundamental-css-comprehension-finished/marking-guide.md",
    "content": "# Marking guide for \"Fundamental CSS comprehension\"\nThe following guide outlines a marking guide for the MDN Learning Area HTML Topic — [Fundamental CSS comprehension](https://developer.mozilla.org/en-US/Learn/CSS/Introduction_to_CSS/Fundamental_CSS_comprehension). Each subtask detailed in the assessment is listed below, along with an explanation of how many marks the task is worth, and the mark breakdown.\n\nNote: These are guidelines, not set in stone rules — you are of course free to use your judgement on mark awarding when you meet an edge case, or something that isn't clear cut.\n\nThe overall mark awarded is out of 35. Work out their final mark, and then divide by 35 and multiply by 100 to give a percentage mark. For reference, you can find a [finished business card](https://mdn.github.io/learning-area/css/introduction-to-css/fundamental-css-comprehension-finished/) that would be awarded top marks.\n\n## Basic setup\n\n<dl>\n<dt>\"create a new file in the same directory as your HTML and image files\" (1 mark)</dt>\n<dd>The first task — creating your CSS file — is only worth one mark. It is pretty easy, although you won't be able to do much without getting this right.</dd>\n<dt>\"Link your CSS to your HTML file via a <code>&lt;link&gt;</code> element\" (2 marks)</dt>\n<dd>Slightly more challenging, but again pretty easy.</dd>\n<dt>\"copy and paste them into the top of your new CSS file. Use them as a test to make sure your CSS is properly applied to your HTML.\" (1 mark)</dt>\n<dd>This is just copy and paste, so not really worth much.</dd>\n<dt>\"Above the two rules, add a CSS comment with some text inside it to indicate that this is a set of general styles for the overall page. \"General page styles\" would do. Also add three more comments...\" (2 marks)</dt>\n<dd>Good commenting is important. You should award 0.5 marks for each of the four comments, as long as they are written in a sensible place with meaningful text.</dd>\n</dl>\n\n## Taking care of the provided selectors and rulesets\n\n<dl>\n<dt>\"look at the four selectors, and calculate the specificity for each one.\" (2 marks)</dt>\n<dd>The correct specificity for each one is as follows (half a mark each):\n  <ul>\n    <li>0012</li>\n    <li>0011</li>\n    <li>0011</li>\n    <li>0010</li>\n  </ul>\n</dd>\n<dt>\"Now it's time to put the right selector on the right rule set!\" (4 marks)</dt>\n<dd>The correct pairing are as follows (1 mark for each):\n  <ul>\n    <li><code>.card article img</code> goes with the fourth ruleset.</li>\n    <li><code>.card footer</code> goes with the third ruleset.</li>\n    <li><code>.card header</code> goes with the second ruleset.</li>\n    <li><code>.card</code> goes with the first ruleset.</li>\n  </ul>\n</dd>\n<dt>\"Beware! There are two errors in the provided rulesets.\" (2 marks)</dt>\n<dd>The errors are as follows (one mark for fixing each one):\n  <ul>\n    <li><code>background-colour</code> in the first ruleset: colour > color.</li>\n    <li><code>max-height: 100%</code> in the fourth rule needs a semi-colon at the end of it.</li>\n  </ul>\n</dd>\n</dl>\n\n## New rulesets you need to write\n\n<dl>\n<dt>\"Write a ruleset that targets both the card header, and card footer...\" (3 marks)</dt>\n<dd>The correct rule should look <a href=\"https://github.com/mdn/learning-area/blob/master/css/introduction-to-css/fundamental-css-comprehension-finished/style.css#L30-L33\">something like this</a>. Since the default font size as set on the <code>&lt;html&gt;</code> element is 10px, 1em is 10px, so the height (30px) should be represented by 3em, and the padding by 1em. 10 + 30 + 10 = 50.  \n</dd>\n<dt>\"The default margin applied to the <code>&lt;h2&gt;</code> and <code>&lt;p&gt;</code> elements by the browser will interfere with our design\" (3 marks)</dt>\n<dd>The correct rule should look <a href=\"https://github.com/mdn/learning-area/blob/master/css/introduction-to-css/fundamental-css-comprehension-finished/style.css#L24-L26\">something like this</a>. Simply setting the margin to 0 on all paragraphs and the <code>&lt;h2&gt;</code> should be fine.</dd>\n<dt>\"To stop the image from spilling out of the main business card content (the <code>&lt;article&gt;</code> element), we need to give it a specific height.\" (3 marks)</dt>\n<dd>The correct rule should look <a href=\"https://github.com/mdn/learning-area/blob/master/css/introduction-to-css/fundamental-css-comprehension-finished/style.css#L57-L60\">something like this</a>. The height needs to be 12ems (as 12 x the base size of 10px = 120px), and the color needs to be RGBA — black expressed in RGB (0,0,0) with an alpha channel value of about 0.1-0.3.</dd>\n<dt>\"Write a ruleset that gives the <code>&lt;h2&gt;</code> an effective font size of 20px (but expressed in ems) and an appropriate line height to place it in the center of the header's content box...\" (3 marks)</dt>\n<dd>The correct rule should look <a href=\"https://github.com/mdn/learning-area/blob/master/css/introduction-to-css/fundamental-css-comprehension-finished/style.css#L46-L48\">something like this</a>. The height needs to be 2ems (2 x 10 = 20), and the line height would be expressed best as 1.5 (1.5 x 20px = 30px, the height of the header content.) Setting line height to 30px would also be ok.</dd>\n<dt>\"Write a ruleset that gives the <code>&lt;p&gt;</code> an effective font size of 15px (but expressed in ems) and an appropriate line height to place it in the center of the footer's content box...\" (3 marks)</dt>\n<dd>The correct rule should look <a href=\"https://github.com/mdn/learning-area/blob/master/css/introduction-to-css/fundamental-css-comprehension-finished/style.css#L50-L53\">something like this</a>. The height needs to be 1.5ems (1.5 x 10 = 15), and the line height would be expressed best as 2 (2 x 15px = 30px, the height of the header content.) Setting line height to 30px would also be ok.</dd>\n<dt>\"As a last little touch, give the paragraph inside the <code>&lt;article&gt;</code> an appropriate padding value so that its left edge lines up with the <code>&lt;h2&gt;</code> and footer paragraph, and set its color to be fairly light so it is easy to read.\" (3 marks)</dt>\n<dd>The correct rule should look <a href=\"https://github.com/mdn/learning-area/blob/master/css/introduction-to-css/fundamental-css-comprehension-finished/style.css#L67-L70\">something like this</a>. The padding needs to be 1em, and the color needs to be set to some kind of lighter color that will show up well against the darker background we set earlier. Pure white would be ok, or something similar.</dd>\n</dl>\n\n## Other things to think about\n<dl>\n<dt>\"You'll get bonus marks if you write your CSS for maximum readability, with a separate declaration on each line.\" (2 marks)</dt>\n<dd>If the CSS is arranged in a readable  manner, with a separate declaration on each line (or similar), then they get the marks. If not, then they don't.</dd>\n<dt>\"You should include <code>.card</code> at the start of the selector chain in all your rules, so that these rules wouldn't interfere with the styling of any other elements if the business card were to be put on a page with a load of other content.\" (1 mark)</dt>\n<dd>A nice little addition to include in the assessment for promoting the idea of \"compartmentalisation\", or \"namespacing\" of CSS so different sets of rules don't interfere with one another. Not that important in this particular context, but it would be nice for the student to include.</dd>\n</dl>\n"
  },
  {
    "path": "css/introduction-to-css/fundamental-css-comprehension-finished/style.css",
    "content": "/* General styles */\n\nbody {\n  margin: 0;\n}\n\nhtml {\n  font-family: 'Helvetica neue', Arial, 'sans serif';\n  font-size: 10px;\n  background-color: #ccc;\n}\n\n/* card setup */\n\n.card {\n  width: 35em;\n  height: 22em;\n  margin: 5em auto;\n  background-color: red;\n  border: 0.2em solid black;\n  border-radius: 1.5em;\n}\n\n.card h2, .card p {\n  margin: 0;\n}\n\n/* Header and footer */\n\n.card header, .card footer {\n  height: 3em;\n  padding: 1em;\n}\n\n.card header {\n  background-image: linear-gradient(to bottom,rgba(0,0,0,0.1), rgba(0,0,0,0));\n  border-radius: 1.5em 1.5em 0 0;\n}\n\n.card footer {\n  background-image: linear-gradient(to bottom,rgba(0,0,0,0), rgba(0,0,0,0.1));\n  border-radius: 0 0 1.5em 1.5em;\n}\n\n.card header h2 {\n  font-size: 2em;\n  line-height: 1.5;\n}\n\n.card footer p {\n  font-size: 1.5em;\n  line-height: 2;\n}\n\n/* Main body of card (article) */\n\n.card article {\n  height: 12em;\n  background-color: rgba(0,0,0,0.25);\n}\n\n.card article img {\n  max-height: 100%;\n  float: right;\n}\n\n.card article p {\n  padding: 1em;\n  color: rgba(255,255,255,0.8);\n}\n"
  },
  {
    "path": "css/introduction-to-css/how-css-works/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>My CSS experiment</title>\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n  <body>\n    <h1>Hello World!</h1>\n    <p>This is my first CSS example</p>\n  </body>\n</html>\n"
  },
  {
    "path": "css/introduction-to-css/how-css-works/style.css",
    "content": "\nh1 {\n  color: blue;\n  background-color: yellow;\n  border: 1px solid black;\n}\n\np {\n  color: red;\n}"
  },
  {
    "path": "css/styling-boxes/advanced_box_effects/background-clip-text.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS filters examples</title>\n    <style>\n    html {\n      font-family: impact, sans-serif;\n    }\n\n    h2 {\n      width: 250px;\n      height: 250px;\n      text-align: center;\n      line-height: 250px;\n      font-size: 75px;\n      display: inline-block;\n      background: url(colorful-heart.png) no-repeat center;\n    }\n\n    .text-clip {\n      -webkit-background-clip: text;\n      -webkit-text-fill-color: transparent;\n    }\n\n    \n\n    </style>\n  </head>\n  <body>\n    <h2>WOW</h2>\n    <h2 class=\"text-clip\">WOW</h2>   \n  </body>\n</html>"
  },
  {
    "path": "css/styling-boxes/advanced_box_effects/blend-modes.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS blend modes examples</title>\n    <style>\n    html {\n      font-family: sans-serif;\n    }\n\n    body {\n      margin: 0;\n    }\n\n    div {\n      width: 280px;\n      height: 130px;\n      padding: 10px;\n      margin: 10px;\n    }\n\n    article {\n      width: 330px;\n      height: 180px;\n      margin: 10px;\n      position: relative;\n\n    }\n\n    body > div, article div:first-child {\n      background: url(colorful-heart.png) no-repeat center 20px;\n      background-color: green;\n    }\n\n    body > div, article {\n      display: inline-block;\n    }\n\n    article div:first-child {\n      position: absolute;\n      top: 10px;\n      left: 0;\n    }\n\n    article div:last-child {\n      background-color: purple;\n      position: absolute;\n      bottom: -10px;\n      right: 0;\n      z-index: -1;\n    }\n\n\n    .multiply {\n      background-blend-mode: multiply;\n    }\n\n    .multiply-mix {\n      mix-blend-mode: multiply;\n    }\n\n    .screen {\n      background-blend-mode: screen;\n    }\n\n    .screen-mix {\n      mix-blend-mode: screen;\n    }\n\n    .overlay {\n      background-blend-mode: overlay;\n    }\n\n    .overlay-mix {\n      mix-blend-mode: overlay;\n    }\n\n    .darken {\n      background-blend-mode: darken;\n    }\n\n    .darken-mix {\n      mix-blend-mode: darken;\n    }\n\n    .lighten {\n      background-blend-mode: lighten;\n    }\n\n    .lighten-mix {\n      mix-blend-mode: lighten;\n    }\n\n    .color-dodge {\n      background-blend-mode: color-dodge;\n    }\n\n    .color-dodge-mix {\n      mix-blend-mode: color-dodge;\n    }\n\n    .color-burn {\n      background-blend-mode: color-burn;\n    }\n\n    .color-burn-mix {\n      mix-blend-mode: color-burn;\n    }\n\n    .hard-light {\n      background-blend-mode: hard-light;\n    }\n\n    .hard-light-mix {\n      mix-blend-mode: hard-light;\n    }\n\n    .soft-light {\n      background-blend-mode: soft-light;\n    }\n\n    .soft-light-mix {\n      mix-blend-mode: soft-light;\n    }\n\n    .difference {\n      background-blend-mode: difference;\n    }\n\n    .difference-mix {\n      mix-blend-mode: difference;\n    }\n\n    .hue {\n      background-blend-mode: hue;\n    }\n\n    .hue-mix {\n      mix-blend-mode: hue;\n    }\n\n\n\n    </style>\n  </head>\n  <body>\n  <h2>Background blend modes</h2>\n\n    <div>\n      No blend mode\n    </div>\n\n    <div class=\"multiply\">\n      Multiply\n    </div>\n\n    <div class=\"screen\">\n      Screen\n    </div>\n\n    <div class=\"overlay\">\n      Overlay\n    </div>\n\n    <div class=\"color-dodge\">\n      Color-dodge\n    </div>\n\n    <div class=\"color-burn\">\n      Color-burn\n    </div>\n\n    <div class=\"hard-light\">\n      Hard-light\n    </div>\n\n    <div class=\"soft-light\">\n      Soft-light\n    </div>\n\n    <div class=\"difference\">\n      Difference\n    </div>\n\n    <div class=\"hue\">\n      Hue\n    </div>\n\n    <h2>Mix blend modes</h2>\n\n    <article>\n      No mix blend mode\n      <div>\n\n      </div>\n      <div>\n      </div>\n    </article>\n\n    <article>\n      Multiply mix\n      <div class=\"multiply-mix\">\n\n      </div>\n      <div>\n      </div>\n    </article>\n\n    <article>\n      Screen mix\n      <div class=\"screen-mix\">\n\n      </div>\n      <div>\n      </div>\n    </article>\n\n    <article>\n      Overlay mix\n      <div class=\"overlay-mix\">\n\n      </div>\n      <div>\n      </div>\n    </article>\n\n    <article>\n      Color-dodge mix\n      <div class=\"color-dodge-mix\">\n\n      </div>\n      <div>\n      </div>\n    </article>\n\n    <article>\n      Color-burn mix\n      <div class=\"color-burn-mix\">\n\n      </div>\n      <div>\n      </div>\n    </article>\n\n    <article>\n      Hard-light mix\n      <div class=\"hard-light-mix\">\n\n      </div>\n      <div>\n      </div>\n    </article>\n\n    <article>\n      Soft-light mix\n      <div class=\"soft-light-mix\">\n\n      </div>\n      <div>\n      </div>\n    </article>\n\n    <article>\n      Difference mix\n      <div class=\"difference-mix\">\n\n      </div>\n      <div>\n      </div>\n    </article>\n\n    <article>\n      Hue mix\n      <div class=\"hue-mix\">\n\n      </div>\n      <div>\n      </div>\n    </article>\n  </body>\n</html>\n"
  },
  {
    "path": "css/styling-boxes/advanced_box_effects/box-shadow.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS box shadow examples</title>\n    <style>\n    html {\n      font-family: sans-serif;\n    }\n\n    p {\n      margin: 0;\n    }\n\n    article {\n      max-width: 500px;\n      padding: 10px;\n      background-color: red;\n      background-image: linear-gradient(to bottom, rgba(0,0,0,0), rgba(0,0,0,0.25));\n    }  \n\n    .simple {\n      box-shadow: 5px 5px 5px rgba(0,0,0,0.7);\n    }\n\n    .multiple {\n      box-shadow: 1px 1px 1px black,\n                  2px 2px 1px black,\n                  3px 3px 1px red,\n                  4px 4px 1px red,\n                  5px 5px 1px black,\n                  6px 6px 1px black;\n    }  \n\n    button {\n      width: 150px;\n      font-size: 1.1rem;\n      line-height: 2;\n      border-radius: 10px;\n      border: none;\n      background-image: linear-gradient(to bottom right, #777, #ddd);\n      box-shadow: 1px 1px 1px black,\n                  inset 2px 3px 5px rgba(0,0,0,0.3),\n                  inset -2px -3px 5px rgba(255,255,255,0.5);\n    }\n\n    button:focus, button:hover {\n      background-image: linear-gradient(to bottom right, #888, #eee);\n    }\n\n    button:active {\n      box-shadow: inset 2px 2px 1px black,\n                  inset 2px 3px 5px rgba(0,0,0,0.3),\n                  inset -2px -3px 5px rgba(255,255,255,0.5);\n    }\n    </style>\n  </head>\n  <body>\n    <h2 id=\"basic\">Basic box shadow example</h2>\n\n    <article class=\"simple\">\n      <p><strong>Warning</strong>: The thermostat on the cosmic transcender has reached a critical level.</p>\n    </article>\n    \n    <h2 id=\"multiple\">Multiple box shadows example</h2>\n\n    <article class=\"multiple\">\n      <p><strong>Warning</strong>: The thermostat on the cosmic transcender has reached a critical level.</p>\n    </article>\n\n    <h2 id=\"inner\">Inner shadows example</h2>\n\n    <button>Press me!</button>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-boxes/advanced_box_effects/filters.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS filters examples</title>\n    <style>\n    html {\n      font-family: sans-serif;\n    }\n\n    figure {\n      transition: 1s all;\n      display: inline-block;\n      position: relative;\n    }\n\n    figcaption {\n      position: absolute;\n      left: 0;\n      bottom: 50px;\n      text-shadow: 1px 1px 1px white,\n                   2px 2px 1px white;\n      font-size: 1.3rem;\n      letter-spacing: 2px\n    }\n\n    .blur:hover {\n      -webkit-filter: blur(5px);\n      filter: blur(5px);\n    }\n\n    .brightness:hover {\n      -webkit-filter: brightness(0.6);\n      filter: brightness(0.6);\n    }\n\n    .shadow:hover {\n      -webkit-filter: drop-shadow(10px 10px 5px rgba(0,0,0,0.7));\n      filter: drop-shadow(10px 10px 5px rgba(0,0,0,0.7));\n    }\n\n    .gray:hover {\n      -webkit-filter: grayscale(100%);\n      filter: grayscale(100%);\n    }\n\n    .sepia:hover {\n      -webkit-filter: sepia(100%);\n      filter: sepia(100%);\n    }\n\n    .invert:hover {\n      -webkit-filter: invert(100%);\n      filter: invert(100%);\n    }\n\n    .saturate:hover {\n      -webkit-filter: saturate(300%);\n      filter: saturate(300%);\n    }\n\n    .opacity:hover {\n      -webkit-filter: opacity(0%);\n      filter: opacity(0%);\n    }\n\n    .hue-rotate:hover {\n      -webkit-filter: hue-rotate(210deg);\n      filter: hue-rotate(210deg);\n    }\n\n    </style>\n  </head>\n  <body>\n    <figure class=\"blur\">\n      <img src=\"colorful-heart.png\" alt=\"a colorful prism heart\">\n      <figcaption>Blur filter</figcaption>\n    </figure>\n\n    <figure class=\"brightness\">\n      <img src=\"colorful-heart.png\" alt=\"a colorful prism heart\">\n      <figcaption>Brightness filter</figcaption>\n    </figure>\n\n    <figure class=\"shadow\">\n      <img src=\"colorful-heart.png\" alt=\"a colorful prism heart\">\n      <figcaption>Drop shadow filter</figcaption>\n    </figure>\n\n    <figure class=\"gray\">\n      <img src=\"colorful-heart.png\" alt=\"a colorful prism heart\">\n      <figcaption>Grayscale filter</figcaption>\n    </figure>\n\n    <figure class=\"sepia\">\n      <img src=\"colorful-heart.png\" alt=\"a colorful prism heart\">\n      <figcaption>Sepia filter</figcaption>\n    </figure>\n\n    <figure class=\"invert\">\n      <img src=\"colorful-heart.png\" alt=\"a colorful prism heart\">\n      <figcaption>Inversion filter</figcaption>\n    </figure>\n\n    <figure class=\"saturate\">\n      <img src=\"colorful-heart.png\" alt=\"a colorful prism heart\">\n      <figcaption>Saturation filter</figcaption>\n    </figure>\n\n    <figure class=\"opacity\">\n      <img src=\"colorful-heart.png\" alt=\"a colorful prism heart\">\n      <figcaption>Opacity filter</figcaption>\n    </figure>\n\n    <figure class=\"hue-rotate\">\n      <img src=\"colorful-heart.png\" alt=\"a colorful prism heart\">\n      <figcaption>Hue rotation filter</figcaption>\n    </figure>\n    \n  </body>\n</html>"
  },
  {
    "path": "css/styling-boxes/backgrounds/background-attachment.css",
    "content": "html, body {\n  margin: 0;\n  padding: 0;\n}\n\nh1 {\n  margin-top: 0;\n}\n\nbody {\n  padding: 1em;\n}\n\nhtml {\n  background-color: yellow;\n  font-family: sans-serif;\n}\n\nbody {\n  height: 2000px;\n}\n\np {\n  padding: 10px;\n  color: white;\n  background: rgba(0,0,0,0.3);\n}\n\nsection {\n  display: flex;\n}\n\narticle {\n  flex: 1;\n  height: 400px;\n  background-color: rgba(0,0,0,0.5);\n  background-image: url(emoji.png);\n  background-size: 400px 400px;\n  background-repeat: no-repeat;\n  background-position: top center;\n  padding: 1%;\n  overflow: auto;\n}\n\narticle pre {\n  height: 800px;\n}\n\n.fixed, .scroll {\n  margin-right: 1%;\n}\n\n.fixed {\n  background-attachment: fixed;\n}\n\n.scroll {\n  background-attachment: scroll;\n}\n\n.local {\n  background-attachment: local;\n}\n\nfooter {\n  clear: both;\n}"
  },
  {
    "path": "css/styling-boxes/backgrounds/background-attachment.html",
    "content": "<!DOCTYPE HTML>\n<html lang=\"en-US\">\n  <head>\n\t<meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n\t<title>Background attachment example</title>\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"background-attachment.css\">\n  </head>\n<body>\n\n<h1>Background attachment example</h1>\n\n<section>\n<article class=\"scroll\">\n\n  <p><code>background-attachment: scroll</code> causes the element's background to be fixed to the page, so that it scrolls when the page is scrolled. If the element content is scrolled, the background does not move.</p>\n  \n  <pre></pre>\n\n</article>\n\n<article class=\"fixed\">\n\n  <p><code>background-attachment: fixed</code> causes an element's background to be fixed to the viewport, so that it doesn't scroll when the page or element content is scrolled. It will always remain in the same position on the screen.</p>\n  \n  <pre></pre>\n\n</article>\n\n<article class=\"local\">\n\n  <p><code>background-attachment: local</code>, new to CSS3, causes an element's background to be fixed to the actual element itself. So When the page is scrolled, the element's background will move along with it only if the element does so (so not in the case of elements with <code>position: fixed</code>.) When the element's content is scrolled, the background will scroll along with it.</p>\n  \n  <pre></pre>\n\n</article>\n</section>\n\n</body>\n</html>"
  },
  {
    "path": "css/styling-boxes/backgrounds/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Backgrounds example</title>\n    <style>\n      p {\n        font-family: sans-serif;\n        padding: 20px;\n        /* background properties */\n        background-color: yellow;\n        background: url(fire-ball-icon.png) no-repeat 99% center,\n                    linear-gradient(to bottom, yellow, #dddd00 50%, orange);\n      }\n    </style>\n  </head>\n  <body>\n    <p>Exciting box!</p>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-boxes/backgrounds/repeating-background.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Repeating background example</title>\n    <style>\n      body {\n        margin: 0;\n      }\n\n      p {\n        font-family: sans-serif;\n        text-align: center;\n      }\n\n      div {\n        width: 100%;\n        height: 400px;\n        /* background properties */\n        background-color: red;\n        background-image: url(tile.png);\n      }\n    </style>\n  </head>\n  <body>\n    <p>A single instance of the image looks like this: <img src=\"tile.png\" alt=\"a background tile\">. If we use it as a repeating background image along with a solid background color, it could look like this:</p>\n\n    <div></div>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-boxes/borders/border-image.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Border image</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      div {\n        width: 300px;\n        padding: 20px;\n        margin: 10px auto;\n        line-height: 3;\n        background-color: #f66;\n        text-align: center;\n        /* border-related properties */\n        border: 20px solid black;\n        background-clip: padding-box;\n        border-image-source: url(border-image.png);\n        border-image-slice: 40;\n        border-image-repeat: round;\n        border-image-outset: 5px;\n      }\n    </style>\n  </head>\n  <body>\n    <div>\n      <p>Border image</p>\n    </div>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-boxes/borders/border-longhand.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Writing progress</title>\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      html {\n        font-family: sans-serif;\n      }\n\n      div {\n        width: 220px;\n        padding: 20px;\n        margin: 10px;\n        line-height: 2;\n        background-color: yellow;\n        text-align: center;\n        display: inline-block;\n      }\n\n      .complete {\n        border-style: solid;\n      }\n\n      .written {\n        border-style: dashed;\n      }\n\n      .incomplete {\n        border-style: dotted;\n      }\n\n      .writing, .review {\n        border-bottom: 6px solid red;\n      }\n\n    </style>\n  </head>\n  <body>\n    <h1>Writing progress</h1>\n\n    <div class=\"complete\">\n      <p>Chapter 1: I was born</p>\n    </div>\n\n    <div class=\"complete\">\n      <p>Chapter 2: School</p>\n    </div>\n\n    <div class=\"written review\">\n      <p>Chapter 3: University</p>\n    </div>\n\n    <div class=\"written\">\n      <p>Chapter 4: Rock and roll</p>\n    </div>\n\n    <div class=\"incomplete writing\">\n      <p>Chapter 5: Fell in love</p>\n    </div>\n\n    <div class=\"incomplete\">\n      <p>Chapter 6: Children</p>\n    </div>\n\n    <div class=\"incomplete\">\n      <p>Chapter 7: Tired!</p>\n    </div>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-boxes/borders/rounded-corners.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Rounded corners</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      div {\n        width: 220px;\n        padding: 20px;\n        margin: 10px;\n        line-height: 2;\n        background-color: yellow;\n        text-align: center;\n        border-style: dashed;\n        border-radius: 20px;\n      }\n    </style>\n  </head>\n  <body>\n    <div>\n      <p>Rounded corners are groovy!</p>\n    </div>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-boxes/box-model-recap/box-sizing-example.css",
    "content": "html {\n  font-family: sans-serif;\n  background: #ccc;\n}\n\n.one, .two {\n  background: red;\n  width: 300px;\n  height: 150px;\n  padding: 20px;\n  border: 10px solid black;\n  margin: 20px auto;\n}\n\n.two {\n  box-sizing: border-box;\n}"
  },
  {
    "path": "css/styling-boxes/box-model-recap/box-sizing-example.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Box sizing example</title>\n    <link href=\"box-sizing-example.css\" type=\"text/css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <div class=\"one\"></div>\n\n    <div class=\"two\"></div>\n\n    <script>\n\n      var one = document.querySelector('.one');\n      var two = document.querySelector('.two');\n\n      function outputWH(box) {\n        var width = box.offsetWidth;\n        var height = box.offsetHeight;\n        box.textContent = 'Width: ' + width + 'px, Height: ' + height + 'px.'\n      }\n\n      outputWH(one);\n      outputWH(two);\n\n    </script>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-boxes/box-model-recap/css-tables-example.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS tables example</title>\n    <style>\n    html {\n      font-family: sans-serif;\n    }\n\n    form {\n      display: table;\n      margin: 0 auto;\n    }\n\n    form div {\n      display: table-row;\n    }\n\n    form label, form input {\n      display: table-cell;\n      margin-bottom: 10px;\n    }\n\n    form label {\n      width: 200px;\n      padding-right: 5%;\n      text-align: right;\n    }\n\n    form input {\n      width: 300px;\n    }\n\n    form p {\n      display: table-caption;\n      caption-side: bottom;\n      width: 300px;\n      color: #999;\n      font-style: italic;\n    }\n    </style>\n  </head>\n  <body>\n    <form>\n    <p>First of all, tell us your name and age.</p>\n      <div>\n        <label for=\"fname\">First name:</label>\n        <input type=\"text\" id=\"fname\">\n      </div>\n      <div>\n        <label for=\"lname\">Last name:</label>\n        <input type=\"text\" id=\"lname\">\n      </div>\n      <div>\n        <label for=\"age\">Age:</label>\n        <input type=\"text\" id=\"age\">\n      </div>\n    </form>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-boxes/box-model-recap/flexbox-example.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Flexbox example</title>\n    <style>\n    html {\n      font-family: sans-serif;\n    }\n\n    section {\n      width: 70%;\n      height: 300px;\n      margin: 20px auto;\n      background: purple;\n      display: flex;\n    }\n\n    div {\n      color: white;\n      background: orange;\n      flex: 1;\n      margin-right: 10px;\n      text-shadow: 1px 1px 1px black;\n    }\n\n    div:last-child {\n      margin-right: 0;\n    }\n\n    section, div {\n      border: 5px solid rgba(0,0,0,0.85);\n      padding: 10px;\n    }\n    </style>\n  </head>\n  <body>\n\n    <section>\n      <div>This is a box</div>\n      <div>This is a box</div>\n      <div>This is a box</div>\n    </section>\n\n    <button class=\"create\">Create box</button>\n    <button class=\"reset\">Reset demo</button>\n    \n\n    <script>\n      var section = document.querySelector('section');\n      var createBtn = document.querySelector('.create');\n      var resetBtn = document.querySelector('.reset');\n\n      function createBox() {\n        var box = document.createElement('div');\n        box.textContent = 'This is a box';\n        section.appendChild(box);\n      }\n\n      createBtn.onclick = createBox;\n\n      resetBtn.onclick = function() {\n        while (section.firstChild) {\n            section.removeChild(section.firstChild);\n        }\n        createBox();\n        createBox();\n        createBox();\n      }\n    </script>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-boxes/box-model-recap/min-max-container.css",
    "content": "html {\n  font-family: sans-serif;\n  background: #ccc;\n}\n\nh1 {\n  margin-top: 0;\n  padding-top: 24px;\n}\n\np {\n  line-height: 1.5;\n  letter-spacing: 1px;\n}\n\nbody {\n  background: white;\n  padding: 10px;\n  \n  /* First bit of CSS from the article */\n  width: 70%;\n  max-width: 1280px;\n  min-width: 480px;\n  margin: 0 auto;\n}"
  },
  {
    "path": "css/styling-boxes/box-model-recap/min-max-container.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Min and max width example</title>\n    <link href=\"min-max-container.css\" type=\"text/css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <h1>Min and max width example</h1>\n\n    <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n\n    <img src=\"teddy-bear.jpg\" alt=\"A teddy bear in a box\">\n\n    <p>Cray food truck brunch, XOXO +1 keffiyeh pickled chambray waistcoat ennui. Organic small batch paleo 8-bit. Intelligentsia umami wayfarers pickled, asymmetrical kombucha letterpress kitsch leggings cold-pressed squid chartreuse put a bird on it. Listicle pickled man bun cornhole heirloom art party.</p>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-boxes/box-model-recap/min-max-image-container.css",
    "content": "html {\n  font-family: sans-serif;\n  background: #ccc;\n}\n\nh1 {\n  margin-top: 0;\n  padding-top: 24px;\n}\n\np {\n  line-height: 1.5;\n  letter-spacing: 1px;\n}\n\nbody {\n  background: white;\n  padding: 10px;\n  \n  /* First bit of CSS from the article */\n  width: 70%;\n  max-width: 1280px;\n  min-width: 480px;\n  margin: 0 auto;\n}\n\nimg {\n  /* Second bit of CSS from the article */\n  display: block;\n  margin: 0 auto;\n  max-width: 100%;\n}"
  },
  {
    "path": "css/styling-boxes/box-model-recap/min-max-image-container.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Max width image example</title>\n    <link href=\"min-max-image-container.css\" type=\"text/css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <h1>Max width image example</h1>\n\n    <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n\n    <img src=\"teddy-bear.jpg\" alt=\"A teddy bear in a box\">\n\n    <p>Cray food truck brunch, XOXO +1 keffiyeh pickled chambray waistcoat ennui. Organic small batch paleo 8-bit. Intelligentsia umami wayfarers pickled, asymmetrical kombucha letterpress kitsch leggings cold-pressed squid chartreuse put a bird on it. Listicle pickled man bun cornhole heirloom art party.</p>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-boxes/cool-information-box-finished/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Cool box</title>\n    <link href=\"style.css\" rel=\"stylesheet\" type=\"text/css\" />\n  </head>\n  <body>\n    <div><p>This is a cool box</p></div>\n  </body>\n</html>\n"
  },
  {
    "path": "css/styling-boxes/cool-information-box-finished/marking-guide.md",
    "content": "# Marking guide for \"A cool looking box\"\nThe following guide outlines a marking guide for the MDN Learning Area CSS assessment — [A cool looking box](https://developer.mozilla.org/en-US/Learn/CSS/Styling_boxes/A_cool_looking_box). Each subtask detailed in the assessment is listed below, along with an explanation of how many marks the task is worth, and the mark breakdown.\n\nNote: These are guidelines, not set in stone rules — you are of course free to use your judgement on mark awarding when you meet an edge case, or something that isn't clear cut.\n\nThe overall mark awarded is out of 22. Work out their final mark, and then divide by 22 and multiply by 100 to give a percentage mark. For reference, you can find a [finished styled box](index.html) that would be awarded top marks.\n\n## General tasks\n\n<dl>\n<dt>\"Apply the CSS to the HTML.\" (1 mark)</dt>\n<dd>One mark for creating a suitable <code>&ltlink&gt;</code> element, or <code>&lt;style&gt;</code> element to apply the CSS with.</dd>\n</dl>\n\n## Styling the box\n\n<dl>\n<dt>\"A reasonable width for a large box.\" (1 mark)</dt>\n  <dd>One mark for giving the <code>div</code> a <code>width</code> of around 150-300px. This is fairly hard to not get, as long as it isn't set to 1000px, or 50px.</dd>\n<dt>\"A reasonable height for a large box, centering the text vertically.\" (1 mark)</dt>\n  <dd>One mark for giving the <code>div</code> a <code>line-height</code> of around 8-10. Again, award the mark as long as it doesn't look ridiculous.</dd>\n<dt>\"Horizontally Centered box.\" (1 mark)</dt>\n<dd>One mark for giving the <code>div</code> <code>margin</code> of <code>0 auto</code>, or <code>auto</code>, or similar.</dd>\n<dt>\"A slight Increase in font size, to around 17-18px computed style. Use rems.\" (2 marks)</dt>\n<dd>One mark for setting an appropriate <code>font-size</code> (somewhere between 1.0625-1.125rem), and one mark for a good explanation. Something like recalling that the default font size is 16px, and calculating an exact rem value (e.g. 17/16), or approximating it and checking it in the browser dev tools, will do fine.</dd>\n<dt>\"A base color for the design. Give the box this color as its background color.\" (1 mark)</dt>\n<dd>One mark for choosing a reasonable color and setting it as a <code>background-color</code>. Easy.</dd>\n<dt>\"A contrasting color for the text; a black text shadow. Make it readable.\" (2 marks)</dt>\n<dd>One mark for setting a contrasting color and one mark for a tight <code>text-shadow</code>. Something like <code>1px 1px 1px black</code> is fine, but nothing too diffuse.</dd>\n<dt>\"A fairly subtle border radius.\" (1 mark)</dt>\n<dd>One mark for setting a fairly subtle <code>border-radius</code> value like 10-15px, or 1rem perhaps. 20px at the most; nothing too ridiculous.</dd>\n<dt>\"A 1 pixel solid border with a color similar to the base color, but a slightly darker shade.\" (2 marks)</dt>\n<dd>One mark for setting the <code>border</code> as <code>1px solid [a color]</code>, and one mark for setting the color to a slightly darker shade than the base color, e.g. if your base color is <code>rgb(255,0,0)</code>, set it to <code>rgb(200,0,0)</code>.</dd>\n<dt>\"A linear semi-transparent black gradient that goes towards the top left corner. Make it completely transparent at the start, a gradient to around 0.2 opacity by 30%, and remaining at the same color until the end.\" (4 marks)</dt>\n<dd>An ideal value would be <code>background-image: linear-gradient(to top left, rgba(0,0,0,0.2), rgba(0,0,0,0.2) 30%, rgba(0,0,0,0));</code>. The student can get:\n  <ul>\n    <li>One mark for knowing how to use a <code>linear-gradient</code>.</li>\n    <li>One mark for getting the direction value right: <code>to top left</code> (<code>to left top</code> is also fine)</li>\n    <li>One mark for using <code>rgba()</code> or <code>hsla()</code> colors correctly, with an opacity channel value of 0.2 or similar.</li>\n    <li>One mark for the correct use of an 0.2 opacity color stop at 30% along.</li>\n  </ul>\n</dd>\n<dt>\"Multiple box shadows.\" (6 marks)</dt>\n<dd>The mark scheme is as follows:\n  <ul>\n    <li>One mark for getting the basic <code>box-shadow</code> syntax correct.</li>\n    <li>One mark for the simple, non-inset box shadow. Something like this is fine: <code>2px 2px 5px black</code>. But not too diffuse.</li>\n    <li>Two marks for the top left shadow. It should have a positive offset to move it down and right - making it hug the top and left edges, and use a semi-transparent white. A good example: <code>inset 2px 2px 3px rgba(255,255,255,0.6)</code>.</li>\n    <li>Two marks for the bottom right shadow. It should have a negative offset to move it up and left - making it hug the bottom and right edges, and use a semi-transparent black. A good example: <code>inset -2px -2px 3px rgba(0,0,0,0.6)</code>.</li>\n  </ul>\n</dd>\n</dl>\n"
  },
  {
    "path": "css/styling-boxes/cool-information-box-finished/style.css",
    "content": "html {\n  font-family: sans-serif;\n}\n\ndiv {\n  /* sizing and position */\n  width: 200px;\n  margin: auto;\n  line-height: 9;\n  /* text */\n  font-size: 1.1rem;\n  /* Since the default font-size is 16px, I guessed that the correct\n  size would be 1.1rem. I set it, then checked it in the dev tools. */\n  text-align: center;\n  color: white;\n  /* Choose a text color which contrasts well with it's background\n  ...again make use of the dev tools! */\n  text-shadow: 1px 1px 1px black;\n  /*border*/\n  border-radius: 10px;\n  border: 1px solid #990000;\n  /* background */\n  background-color: red;\n  background-image: linear-gradient(\n    to top left,\n    rgba(0, 0, 0, 0.2),\n    rgba(0, 0, 0, 0.2) 30%,\n    rgba(0, 0, 0, 0)\n  );\n  /* other effects */\n  box-shadow: inset 2px 2px 3px rgba(255, 255, 255, 0.6),\n    inset -2px -2px 3px rgba(0, 0, 0, 0.6), 2px 2px 5px black;\n}\n"
  },
  {
    "path": "css/styling-boxes/cool-information-box-start/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Cool box</title>\n    \n  </head>\n  <body>\n      <div>This is a cool box</div>\n  </body>\n</html>\n"
  },
  {
    "path": "css/styling-boxes/cool-information-box-start/style.css",
    "content": "html {\n  font-family: sans-serif;\n}\n\n/* Your CSS below here */"
  },
  {
    "path": "css/styling-boxes/letterheaded-paper-finished/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Fancy letterheaded paper</title>\n    <link href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n  <body>\n\n    <article>\n      <h1>Awesome<br>Company</h1>\n\n      <address>\n        <p>The Awesome Company</p>\n        <p>102-112 Frail Bend Bridge<br>\n        The Dwindlings<br>\n        Little Hornet<br>\n        HX3 9ZQ<br>\n        UK</p>\n      </address>\n    </article>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-boxes/letterheaded-paper-finished/marking-guide.md",
    "content": "# Marking guide for \"Creating fancy letterheaded paper\"\nThe following guide outlines a marking guide for the MDN Learning Area CSS assessment — [Creating fancy letterheaded paper](https://developer.mozilla.org/en-US/Learn/CSS/Styling_boxes/Creating_fancy_letterheaded_paper). Each subtask detailed in the assessment is listed below, along with an explanation of how many marks the task is worth, and the mark breakdown.\n\nNote: These are guidelines, not set in stone rules — you are of course free to use your judgement on mark awarding when you meet an edge case, or something that isn't clear cut.\n\nThe overall mark awarded is out of 19. Work out their final mark, and then divide by 19 and multiply by 100 to give a percentage mark. For reference, you can find a [finished styled letterhead](index.html) that would be awarded top marks.\n\n## The main letter\n\n<dl>\n<dt>\"Apply the CSS to the HTML.\" (1 mark)</dt>\n<dd>One mark for creating a suitable <code>&ltlink&gt;</code> element, or <code>&lt;style&gt;</code> element to apply the CSS with.</dd>\n<dt>\"Add a background declaration to the letter...\" (6 marks)</dt>\n<dd>This requires a <code>background</code> property with multiple values. This is the most complicated part of this assessment, and there are a number of marks involved:\n  <ul>\n    <li>One mark for getting the basic syntax right and the background applying successfully.</li>\n    <li>One mark for putting the three required backgrounds in the right order — the linear gradient has to go at the top so it is seen over the top of the two images.</li>\n    <li>One mark for getting the top background image correct — <code>url(top-image.png) no-repeat left top</code>.</li>\n    <li>One mark for getting the bottom background image correct — <code>url(bottom-image.png) no-repeat left bottom</code>.</li>\n    <li>Two marks for getting the linear gradient correct; something like this —  <code>linear-gradient(to bottom, rgba(0,0,0,0.2), rgba(0,0,0,0) 20%, rgba(0,0,0,0) 80%, rgba(0,0,0,0.2))</code></li>\n  </ul>\n</dd>\n<dt>\"Add another background declaration that just adds the top image to the top of the letter, as a fallback for browsers that don't support the previous declaration.\" (2 marks)</dt>\n<dd>One mark for adding a <code>background</code> property that just specifies <code>url(top-image.png) no-repeat left top</code> in it's value; one mark for putting it before the main <code>background</code> declaration.</dd>\n<dt>\"Add a white background color to the letter.\" (1 mark)</dt>\n<dd>Easy — <code>background-color: white;</code>.</dd>\n<dt>\"Add a 1mm top and bottom solid border to the letter, in a color that is in keeping with the rest of the color scheme.\" (3 marks)</dt>\n<dd>Two marks for an appropriate <code>border-top</code> and <code>border-bottom</code> declaration (one for each), and one mark for choosing an appropriate color to go with the top and bottom graphics (e.g. a red or brown for the default provided options).</dd>\n</dl>\n\n## The logo\n\n<dl>\n<dt>\"To the <code>&lt;h1&gt;</code>, add the logo as a background image.\" (1 mark)</dt>\n<dd>One mark for an appropriate use of <code>background</code> to add the logo image. For example <code>background-image: url(logo.png);</code>.</dd>\n<dt>\"Add a filter to the logo to give it a subtle drop shadow.\" (2 marks)</dt>\n<dd>One mark for using the <code>filter</code> property, and one mark for a suitable value, e.g. <code>drop-shadow(3px 3px 3px black)</code>.</dd>\n<dt>\"Now comment out the filter and implement the drop shadow in a different (slightly more cross-browser compatible) way, which still follows the shape of the round image.\" (3 marks)</dt>\n<dd>The marks available are:\n  <ul>\n    <li>One mark for commenting out the filter property.</li>\n    <li>One mark for making the box circular. <code>border-radius: 64px;</code> or <code>border-radius: 50%;</code> would both be fine.</li>\n    <li>One mark for appropriate use of the <code>box-shadow</code> property.</li>\n  </ul>\n</dd>\n\n\n</dl>\n"
  },
  {
    "path": "css/styling-boxes/letterheaded-paper-finished/style.css",
    "content": "* {\n  box-sizing: border-box;\n}\n\nhtml {\n  font-family: sans-serif;\n}\n\nbody {\n  margin: 0;\n  background: #ccc;\n}\n\narticle {\n  width: 210mm;\n  height: 297mm;\n  margin: 20px auto;\n  position: relative;\n}\n\naddress {\n  position: absolute;\n  bottom: 8mm;\n  right: 20mm;\n}\n\nh1 {\n  position: absolute;\n  top: 12mm;\n  left: 20mm;\n  width: 128px;\n  height: 128px;\n  font-size: 20px;\n  letter-spacing: 1px;\n  text-align: center;\n  padding: 44px 0;\n  color: white;\n  text-shadow: 1px 1px 1px black;\n}\n\n/* background images, border */\n\narticle {\n  background: url(top-image.png) no-repeat left top;\n  background: linear-gradient(to bottom, rgba(0,0,0,0.2), rgba(0,0,0,0) 20%, rgba(0,0,0,0) 80%, rgba(0,0,0,0.2)),\n              url(top-image.png) no-repeat left top,\n              url(bottom-image.png) no-repeat left bottom;\n  background-color: white;\n  border-top: 1mm solid red;\n  border-bottom: 1mm solid red;\n}\n\nh1 {\n  background-image: url(logo.png);\n  /* filter: drop-shadow(3px 3px 3px black); */\n  border-radius: 64px;\n  box-shadow: 3px 3px 3px black;\n}"
  },
  {
    "path": "css/styling-boxes/letterheaded-paper-start/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Fancy letterheaded paper</title>\n    \n  </head>\n  <body>\n\n    <article>\n      <h1>Awesome<br>Company</h1>\n\n      <address>\n        <p>The Awesome Company</p>\n        <p>102-112 Frail Bend Bridge<br>\n        The Dwindlings<br>\n        Little Hornet<br>\n        HX3 9ZQ<br>\n        UK</p>\n      </address>\n    </article>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-boxes/letterheaded-paper-start/style.css",
    "content": "* {\n  box-sizing: border-box;\n}\n\nhtml {\n  font-family: sans-serif;\n}\n\nbody {\n  margin: 0;\n  background: #ccc;\n}\n\narticle {\n  width: 210mm;\n  height: 297mm;\n  margin: 20px auto;\n  position: relative;\n}\n\naddress {\n  position: absolute;\n  bottom: 8mm;\n  right: 20mm;\n}\n\nh1 {\n  position: absolute;\n  top: 12mm;\n  left: 20mm;\n  width: 128px;\n  height: 128px;\n  font-size: 20px;\n  letter-spacing: 1px;\n  text-align: center;\n  padding: 44px 0;\n  color: white;\n  text-shadow: 1px 1px 1px black;\n}\n\n/* Your CSS below here */"
  },
  {
    "path": "css/styling-boxes/styling-tables/punk-bands-complete.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>UK punk bands</title>\n    <link href='https://fonts.googleapis.com/css?family=Rock+Salt' rel='stylesheet' type='text/css'>\n    <link href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n  <body>\n    <table>\n      <caption>A summary of the UK's most famous punk bands</caption>\n      <thead>\n        <tr>\n          <th scope=\"col\">Band</th>\n          <th scope=\"col\">Year formed</th>\n          <th scope=\"col\">No. of Albums</th>\n          <th scope=\"col\">Most famous song</th>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <th scope=\"row\">Buzzcocks</th>\n          <td>1976</td>\n          <td>9</td>\n          <td>Ever fallen in love (with someone you shouldn't've)</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">The Clash</th>\n          <td>1976</td>\n          <td>6</td>\n          <td>London Calling</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">The Damned</th>\n          <td>1976</td>\n          <td>10</td>\n          <td>Smash it up</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Sex Pistols</th>\n          <td>1975</td>\n          <td>1</td>\n          <td>Anarchy in the UK</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Sham 69</th>\n          <td>1976</td>\n          <td>13</td>\n          <td>If The Kids Are United</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Siouxsie and the Banshees</th>\n          <td>1976</td>\n          <td>11</td>\n          <td>Hong Kong Garden</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Stiff Little Fingers</th>\n          <td>1977</td>\n          <td>10</td>\n          <td>Suspect Device</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">The Stranglers</th>\n          <td>1974</td>\n          <td>17</td>\n          <td>No More Heroes</td>\n        </tr>\n      </tbody>\n      <tfoot>\n        <tr>\n          <th scope=\"row\" colspan=\"2\">Total albums</th>\n          <td colspan=\"2\">77</td>\n        </tr>\n      </tfoot>\n    </table>\n  </body>\n</html>\n"
  },
  {
    "path": "css/styling-boxes/styling-tables/punk-bands-unstyled.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>UK punk bands</title>\n  </head>\n  <body>\n    <table>\n      <caption>A summary of the UK's most famous punk bands</caption>\n      <thead>\n        <tr>\n          <th scope=\"col\">Band</th>\n          <th scope=\"col\">Year formed</th>\n          <th scope=\"col\">No. of Albums</th>\n          <th scope=\"col\">Most famous song</th>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <th scope=\"row\">Buzzcocks</th>\n          <td>1976</td>\n          <td>9</td>\n          <td>Ever fallen in love (with someone you shouldn't've)</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">The Clash</th>\n          <td>1976</td>\n          <td>6</td>\n          <td>London Calling</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">The Damned</th>\n          <td>1976</td>\n          <td>10</td>\n          <td>Smash it up</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Sex Pistols</th>\n          <td>1975</td>\n          <td>1</td>\n          <td>Anarchy in the UK</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Sham 69</th>\n          <td>1976</td>\n          <td>13</td>\n          <td>If The Kids Are United</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Siouxsie and the Banshees</th>\n          <td>1976</td>\n          <td>11</td>\n          <td>Hong Kong Garden</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Stiff Little Fingers</th>\n          <td>1977</td>\n          <td>10</td>\n          <td>Suspect Device</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">The Stranglers</th>\n          <td>1974</td>\n          <td>17</td>\n          <td>No More Heroes</td>\n        </tr>\n      </tbody>\n      <tfoot>\n        <tr>\n          <th scope=\"row\" colspan=\"2\">Total albums</th>\n          <td colspan=\"2\">77</td>\n        </tr>\n      </tfoot>\n    </table>\n  </body>\n</html>\n"
  },
  {
    "path": "css/styling-boxes/styling-tables/style.css",
    "content": "/* spacing */\n\ntable {\n  table-layout: fixed;\n  width: 100%;\n  border-collapse: collapse;\n  border: 3px solid purple;\n}\n\nthead th:nth-child(1) {\n  width: 30%;\n}\n\nthead th:nth-child(2) {\n  width: 20%;\n}\n\nthead th:nth-child(3) {\n  width: 15%;\n}\n\nthead th:nth-child(4) {\n  width: 35%;\n}\n\nth, td {\n  padding: 20px;\n}\n\n/* typography */\n\nhtml {\n  font-family: 'helvetica neue', helvetica, arial, sans-serif;\n}\n\nthead th, tfoot th {\n  font-family: 'Rock Salt', cursive;\n}\n\nth {\n  letter-spacing: 2px;\n}\n\ntd {\n  letter-spacing: 1px;\n}\n\ntbody td {\n  text-align: center;\n}\n\ntfoot th {\n  text-align: right;\n}\n\n/* graphics */\n\nthead, tfoot {\n  background: url(leopardskin.jpg);\n  color: white;\n}\n\nthead th, tfoot th, tfoot td {\n  background: linear-gradient(to bottom, rgba(0,0,0,0.1), rgba(0,0,0,0.5));\n  border: 3px solid purple;\n  text-shadow: 1px 1px 1px black;\n}\n\ntbody tr:nth-child(odd) {\n  background-color: #ff33cc;\n}\n\ntbody tr:nth-child(even) {\n  background-color: #e495e4;\n}\n\ntbody tr {\n  background-image: url(noise.png);\n}\n\ntable {\n  background-color: #ff33cc;\n}\n\n/* caption */\n\ncaption {\n  font-family: 'Rock Salt', cursive;\n  padding: 20px;\n  font-style: italic;\n  caption-side: bottom;\n  color: #666;\n  text-align: right;\n  letter-spacing: 1px;\n}"
  },
  {
    "path": "css/styling-text/fundamentals/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Fundamental text styling</title>\n    <style>\n      html {\n        font-size: 10px;\n      }\n\n      h1 {\n        font-size: 5rem;\n        text-transform: capitalize;\n        text-shadow: 1px 1px 1px red,\n                     2px 2px 1px red;\n        text-align: center;\n        letter-spacing: 2px;\n      }\n\n      h1 + p {\n        font-weight: bold;\n      }\n\n      p::first-line {\n        letter-spacing: 4px;\n        word-spacing: 4px;\n      }\n\n      p {\n        font-size: 1.5rem;\n        color: red;\n        font-family: Helvetica, Arial, sans-serif;\n        line-height: 1.6;\n        letter-spacing: 1px;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Tommy the cat</h1>\n\n    <p>Well I remember it as though it were a meal ago...</p>\n\n    <p>Said Tommy the Cat as he reeled back to clear whatever foreign matter may have nestled its way into his mighty throat. Many a fat alley rat had met its demise while staring point blank down the cavernous barrel of this awesome prowling machine. Truly a wonder of nature this urban predator — Tommy the cat had many a story to tell. But it was a rare occasion such as this that he did.</p>\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "css/styling-text/styling-links/default-styles.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Default link styles</title>\n    <style>\n    p {\n      font-size: 3rem;\n      text-align: center;\n    }\n    </style>\n  </head>\n  <body>\n    <p><a href=\"http://mozilla.org\">A link to the Mozilla homepage</a></p>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-text/styling-links/external-link-icon.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>External link icon</title>\n    <style>\n    body {\n      width: 300px;\n      margin: 0 auto;\n      font-family: sans-serif;\n    }\n\n    p {\n      line-height: 1.4;\n    }\n\n    a {\n      outline: none;\n      text-decoration: none;\n      padding: 2px 1px 0;\n    }\n\n    a:link {\n      color: blue;\n    }\n\n    a:visited {\n      color: purple;\n    }\n\n    a:focus, a:hover {\n      border-bottom: 1px solid;\n    }\n\n    a:active {\n      color: red;\n    }\n\n    a[href*=\"http\"] {\n      background: url('external-link-52.png') no-repeat 100% 0;\n      background-size: 16px 16px;\n      padding-right: 19px;\n    }\n    </style>\n  </head>\n  <body>\n    <p>For more information on the weather, visit our <a href=\"weather.html\">weather page</a>, look at <a href=\"https://en.wikipedia.org/wiki/Weather\">weather on Wikipedia</a>, or check out <a href=\"http://www.extremescience.com/weather.htm\">weather on Extreme Science</a>.</p>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-text/styling-links/link-buttons.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Link buttons</title>\n    <style>\n    body,html {\n      margin: 0;\n      font-family: sans-serif;\n    }\n\n    ul {\n      padding: 0;\n      width: 100%;\n    }\n\n    li {\n      display: inline;\n    }\n\n    a {\n      outline: none;\n      text-decoration: none;\n      display: inline-block;\n      width: 19.5%;\n      margin-right: 0.625%;\n      text-align: center;\n      line-height: 3;\n      color: black;\n    }\n\n    li:last-child a {\n      margin-right: 0;\n    }\n\n    a:link, a:visited, a:focus {\n      background: yellow;\n    }\n\n    a:hover {     \n      background: orange;\n    }\n\n    a:active {\n      background: red;\n      color: white;\n    }\n    </style>\n  </head>\n  <body>\n    <ul>\n      <li><a href=\"#\">Home</a></li><li><a href=\"#\">Pizza</a></li><li><a href=\"#\">Music</a></li><li><a href=\"#\">Wombats</a></li><li><a href=\"#\">Finland</a></li>\n    </ul>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-text/styling-links/styled-links.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Styled links</title>\n    <style>\n    body {\n      width: 300px;\n      margin: 0 auto;\n      font-family: sans-serif;\n    }\n\n    p {\n      line-height: 1.4;\n    }\n\n    a {\n      outline: none;\n      text-decoration: none;\n      padding: 2px 1px 0;\n    }\n\n    a:link {\n      color: #265301;\n    }\n\n    a:visited {\n      color: #437A16;\n    }\n\n    a:focus {\n      border-bottom: 1px solid;\n      background: #BAE498;\n    }\n\n    a:hover {\n      border-bottom: 1px solid;     \n      background: #CDFEAA;\n    }\n\n    a:active {\n      background: #265301;\n      color: #CDFEAA;\n    }\n    </style>\n  </head>\n  <body>\n    <p>There are several browsers available, such as <a href=\"https://www.mozilla.org/en-US/firefox/\">Mozilla Firefox</a>, <a href=\"https://www.google.com/chrome/index.html\">Google Chrome</a>, and <a href=\"https://www.microsoft.com/en-us/windows/microsoft-edge\">Microsoft Edge</a>.</p>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-text/styling-lists/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Styling lists</title>\n    <style>\n      /* General styles */\n\n      html {\n        font-family: Helvetica, Arial, sans-serif;\n        font-size: 10px;\n      }\n\n      h2 {\n        font-size: 2rem;\n      }\n\n      ul,ol,dl,p {\n        font-size: 1.5rem;\n      }\n\n      li, p {\n        line-height: 1.5;\n      }\n\n      /* Unordered list styles */\n\n      ul {\n        padding-left: 2rem;\n        list-style-type: none;\n      }\n\n      ul li {\n        padding-left: 2rem;\n        background-image: url(star.svg);\n        background-position: 0 0;\n        background-size: 1.6rem 1.6rem;\n        background-repeat: no-repeat;\n      }\n\n      /* Ordered list styles */\n\n      ol {\n        list-style-type: upper-roman;\n      }\n\n      /* Description list styles */\n\n      dd, dt {\n        line-height: 1.5;\n      }\n\n      dt {\n        font-weight: bold;\n      }\n\n    </style>\n  </head>\n  <body>\n    <h2>Shopping (unordered) list</h2>\n\n    <p>Paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference.</p>\n\n    <ul>\n      <li>Hummus</li>\n      <li>Pitta</li>\n      <li>Green salad</li>\n      <li>Halloumi</li>\n    </ul>\n\n    <h2>Recipe (ordered) list</h2>\n\n    <p>Paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference.</p>\n\n    <ol start=\"4\">\n      <li>Toast pitta, leave to cool, then slice down the edge.</li>\n      <li>Fry the halloumi in a shallow, non-stick pan, until browned on both sides.</li>\n      <li>Wash and chop the salad.</li>\n      <li>Fill pitta with salad, hummus, and fried halloumi.</li>\n    </ol>\n\n    <h2>Ingredient description list</h2>\n\n    <p>Paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference.</p>\n\n    <dl>\n      <dt>Hummus</dt>\n      <dd>A thick dip/sauce generally made from chick peas blended with tahini, lemon juice, salt, garlic, and other ingredients.</dd>\n      <dt>Pitta</dt>\n      <dd>A soft, slightly leavened flatbread.</dd>\n      <dt>Halloumi</dt>\n      <dd>A semi-hard, unripened, brined cheese with a higher-than-usual melting point, usually made from goat/sheep milk.</dd>\n      <dt>Green salad</dt>\n      <dd>That green healthy stuff that many of us just use to garnish kebabs.</dd>\n    </dl>\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "css/styling-text/styling-lists/unstyled-list.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Styling lists</title>\n  </head>\n  <body>\n    <h2>Shopping (unordered) list</h2>\n\n    <p>Paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference.</p>\n\n    <ul>\n      <li>Hummus</li>\n      <li>Pitta</li>\n      <li>Green salad</li>\n      <li>Halloumi</li>\n    </ul>\n\n    <h2>Recipe (ordered) list</h2>\n\n    <p>Paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference.</p>\n\n    <ol>\n      <li>Toast pitta, leave to cool, then slice down the edge.</li>\n      <li>Fry the halloumi in a shallow, non-stick pan, until browned on both sides.</li>\n      <li>Wash and chop the salad</li>\n      <li>Fill Pitta with salad, hummus, and fried halloumi.</li>\n    </ol>\n\n    <h2>Ingredient description list</h2>\n\n    <p>Paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference, paragraph for reference.</p>\n\n    <dl>\n      <dt>Hummus</dt>\n      <dd>A thick dip/sauce generally made from chick peas blended with tahini, lemon juice, salt, garlic, and other ingredients.</dd>\n      <dt>Pitta</dt>\n      <dd>A soft, slightly leavened flatbread.</dd>\n      <dt>Halloumi</dt>\n      <dd>A semi-hard, unripened, brined cheese with a higher-than-usual melting point, usually made from goat/sheep milk.</dd>\n      <dt>Green salad</dt>\n      <dd>That green healthy stuff that many of us just use to garnish kebabs.</dd>\n    </dl>\n\n\n  </body>\n</html>"
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-finished/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>St Huxley's Community College</title>\n    <link href=\"style.css\" type=\"text/css\" rel=\"stylesheet\">\n  </head>\n  <body>\n\n  <header>\n    <h1>St Huxley's Community College</h1>\n  </header>\n\n  <section>\n      <h2>Brave new world</h2>\n\n      <p>It's a brave new world out there. Our children are being put in increasing more competitive situations, both during recreation, and as they start to move into the adult world of <a href=\"https://en.wikipedia.org/wiki/Examination\">examinations</a>, <a href=\"https://en.wikipedia.org/wiki/Jobs\">jobs</a>, <a href=\"https://en.wikipedia.org/wiki/Career\">careers</a>, and other life choices. Having the wrong mindset, becoming <a href=\"https://en.wikipedia.org/wiki/Emotion\">too emotional</a>, or making the wrong choices can contribute to them experiencing difficulty in taking their rightful place in today's ideal society.</p>\n\n      <p>As concerned parents, guardians or carers, you will no doubt want to give your children the best possible start in life — and you've come to the right place.</p>\n\n      <h2>The best start in life</h2>\n\n      <p>At St. Huxley's, we pride ourselves in not only giving our students a top quality education, but also giving them the societal and emotional intelligence they need to win big in the coming utopia. We not only excel at subjects such as genetics, data mining, and chemistry, but we also include compulsory lessons in:</p>\n\n      <ul>\n        <li>Emotional control</li>\n        <li>Judgement</li>\n        <li>Assertion</li>\n        <li>Focus and resolve</li>\n      </ul>\n\n      <p>If you are interested, then you next steps will likely be to:</p>\n      \n      <ol>\n        <li><a href=\"#\">Call us</a> for more information</li>\n        <li><a href=\"#\">Ask for a brochure</a>, which includes signup form</li>\n        <li><a href=\"#\">Book a visit</a>!</li>\n      </ol>\n  </section>\n\n  <aside>\n\n    <h2>Top course choices</h2>\n\n    <ul>\n      <li><a href=\"#\">Genetic engineering</a></li>\n      <li><a href=\"#\">Genetic mutation</a></li>\n      <li><a href=\"#\">Organic Chemistry</a></li>\n      <li><a href=\"#\">Pharmaceuticals</a></li>\n      <li><a href=\"#\">Biochemistry with behaviour</a></li>\n      <li><a href=\"#\">Pure biochemistry</a></li>\n      <li><a href=\"#\">Data mining</a></li>\n      <li><a href=\"#\">Computer security</a></li>\n      <li><a href=\"#\">Bioinformatics</a></li>\n      <li><a href=\"#\">Cybernetics</a></li>\n    </ul>\n\n    <p><a href=\"#\">See more</a></p>\n\n  </aside>\n\n  <nav>\n\n    <ul>\n      <li><a href=\"#\">Home</a></li>\n      <li><a href=\"#\">Finding us</a></li>\n      <li><a href=\"#\">Courses</a></li>\n      <li><a href=\"#\">Staff</a></li>\n      <li><a href=\"#\">Media</a></li>\n      <li><a href=\"#\">Prospectus</a></li>\n    </ul>\n\n  </nav>\n\n  <footer>\n\n    <p>&copy; 2016 St Huxley's Community College</p>\n\n  </footer>\n\n  </body>\n</html>"
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-finished/marking-guide.md",
    "content": "# Marking guide for \"Typesetting a community school homepage\"\n\nThe following guide outlines a marking guide for the MDN Learning Area HTML Topic — [Typesetting a community school homepage](https://developer.mozilla.org/en-US/Learn/CSS/Introduction_to_CSS/Fundamental_CSS_comprehension). Each subtask detailed in the assessment is listed below, along with an explanation of how many marks the task is worth, and the mark breakdown.\n\nNote: These are guidelines, not set in stone rules — you are of course free to use your judgement on mark awarding when you meet an edge case, or something that isn't clear cut.\n\nThe overall mark awarded is out of 40. Work out their final mark, and then divide by 40 and multiply by 100 to give a percentage mark. For reference, you can find a [finished typeset homepage](index.html) that would be awarded top marks.\n\n## Fonts\n\n<dl>\n<dt>\"download a couple of free-to-use fonts\" (3 marks)</dt>\n<dd>the student will get one mark for the suitability of each of the two fonts (the description in the question says \"the fonts should be chosen to give the page a fairly serious, formal, trustworthy feel — a serif side-wide font for the general text body, coupled with sans-serif or slab serif for the headings might be nice.\") and one mark for the fonts being ok to use.</dd>\n<dt>\"Use a suitable service to generate bulletproof <code>@font-face</code> code\" (2 marks)</dt>\n<dd>The student will get the marks by using a service like fontsquirrel's generator to create bulletproof <code>@font-face</code> code. You can check it against the example linked above. If it is not cross-browser, or fails to apply the fonts, then they get no marks.</dd>\n<dt>\"Apply your body font to the whole page, and your heading font to your headings.\" (3 marks)</dt>\n<dd>The body font should be applied to the <code>&lt;html&gt;</code> element, and the heading font should be applied only to <code>&lt;h1&gt;</code> and <code>&lt;h2&gt;</code>. One mark for each. Also, one bonus mark for providing something of a fallback for each in a font stack, and not just a single font.</dd>\n</dl>\n\n## General text styling\n\n<dl>\n<dt>\"Give the page a site-wide <code>font-size</code> of 10px\" (1 mark)</dt>\n<dd><code>font-size: 10px;</code> should be applied to the <code>&lt;html&gt;</code> element.</dd>\n<dt>\"Give your headings and other element types appropriate font-sizes defined using a suitable relative unit.\" (3 marks)</dt>\n<dd>Award between 0 and 2 marks for the sizing, depending on how well thought out it looks. Also award one mark if a sensible relative unit such as em or rem is used.</dd>\n<dt>\"Give your body text a suitable <code>line-height</code>.\" (1 mark)</dt>\n<dd>Between about 1.4 and 1.6 is ideal, and will get the mark.</dd>\n<dt>\"Center your top level heading on the page.\" (1 mark)</dt>\n<dd>Setting <code>text-align: center;</code> on the <code>h1</code> will get the mark. Flexbox would also do. Anything else is probably too convoluted to get the mark.</dd>\n<dt>\"Give your headings a little bit of <code>letter-spacing</code>...\" (1 mark)</dt>\n<dd>Generally something small like 1 or 2 pixels (0.1 or 0.2 rem) will work ok, depending on the font.</dd>\n<dt>\"Give your body text some letter-spacing and word-spacing, as appropriate.\" (1 mark)</dt>\n<dd>About 0.5 or 1 pixel of letter spacing and about 3px of word spacing will look ok to help the text breathe a bit, depending on the font.</dd>\n<dt>\"Give the first paragraph after each heading in the <code>&lt;section&gt;</code> a little bit of text-indentation, say 20px.\" (2 marks)</dt>\n<dd>A good little test of selector and background knowledge. The selector should be <code>h2 + p</code>, and the declaration used should be <code>text-indent: 20px;</code>. One mark for each.</dd>\n</dl>\n\n## Links\n\n<dl>\n<dt>\"Give the link, visited, focus, and hover states some colors that go with the color of the horizontal bars at the top and bottom of the page.\" (3 marks)</dt>\n<dd>The link state rules should be laid out in the proper order of <code>a</code>, <code>a:link</code>, <code>a:visited</code>, <code>a:focus</code>, <code>a:hover</code>, and <code>a:active</code> to get the first mark. For the second mark, make the link and visited states have a color that goes with the page. For the third mark, make the focus AND hover states have a different color, or you could even just give them the same color, because of the next instruction. It is acceptable for link and visited to have the same styling, and focus and hover.</dd>\n<dt>\"Make it so that links are underlined by default, but when you hover or focus them, the underline disappears.\" (2 marks)</dt>\n<dd>The links will have <code>text-decoration: underline</code> set by default. You could just set <code>text-decoration: none;</code> on the focus and hover states. The method of using <code>border-bottom</code> is also acceptable.</dd>\n<dt>\"Remove the default focus outline from ALL the links on the page.\" (1 mark)</dt>\n<dd>You just need to set <code>outline: none</code> on all links (<code>a</code>).</dd>\n<dt>\"Give the active state a noticeably different styling so it stands out nicely, but make it still fit in with the overall page design.\" (2 marks)</dt>\n<dd>they can get one mark for something totally crazy that stands out, or two marks for something tasteful that stands out.</dd>\n<dt>\"Make it so that external links have the external link icon inserted next to them.\" (4 marks)</dt>\n<dd>This is worth four marks because it is fairly complex. They can get a mark each for:\n  <ul>\n    <li>Using a suitable attribute selector that only selects links containing \"http\" in their <code>href</code> attribute.</li>\n    <li>Including some padding to make way for the link to be displayed.</li>\n    <li>Including the correct <code>background-*</code> properties or <code>background</code> shorthand to place the background image, and to make it not repeat.</li>\n    <li>Including the <code>background-size</code> property to resize the icon to something appropriate dynamically, OR resizing it in an image editor to an appropriate size.</li>\n  </ul>\n</dd>\n</dl>\n\n## Lists\n\n<dl>\n<dt>\"Make sure the spacing of your lists and list items works well with the styling of the overall page.\" (1 mark)</dt>\n<dd>This will basically work ok anyway, but one bonus mark is being awarded for students that set 16px (1.6rem) for the top and bottom margins of <code>&lt;ul&gt;</code> and <code>&lt;ol&gt;</code>. This is to make sure the spacing will always be correct, even if two lists were to be placed next to one another.</dd>\n<dt>\"Give your list items a nice bullet, appropriate for the design of the page. It is up to you whether you choose a custom bullet image or something else.\" (1 mark)</dt>\n<dd>This is really up to the student: they can give <code>&lt;ul&gt;</code> and <code>&lt;ol&gt;</code> a simple <code>list-style-type</code> or something a bit more interesting; whatever they feel like.</dd>\n</dl>\n\n## Navigation menu\n\n<dl>\n<dt>\"Style your navigation menu so that it has an appropriate look for the look and feel for the page.\" (8 marks)</dt>\n<dd>The mark award for this one question is quite high, because it is fairly complex and has multiple parts. Ideally, they should:\n  <ul>\n    <li>Start every selector with <code>nav</code> to make sure only the nav menu is affected.</li>\n    <li>Set the left padding on the <code>&lt;ul&gt;</code> to 0.</li>\n    <li>Set some top margin on the <code>&lt;ul&gt;</code> to bring the text of the top bullet in line with the headings on the other columns, and some bottom margin on the <code>&lt;li&gt;</code>s to space the menu items out a bit.</li>\n    <li>Set <code>list-style-type: none;</code> on the <code>&lt;li&gt;</code> to get rid of the bullets.</li>\n    <li>Make the links sizeable by setting them to <code>display: inline-block</code>.</li>\n    <li>Give the links appropriate styling to make them look nice and fit in with the style of the page. This could include center aligned text, line height, larger font size, color, border, whatever, as long as it looks ok.</li>\n    <li>Give the focus and hover states different styling so the nav menu responds when interacted with.</li>\n    <li>Give the active state a different style again, so it is obvious when a link becomes activated.</li>\n  </ul>  \n</dd>\n</dl>\n"
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-finished/original-font-files/Lovato Light-Webfont/Licenses/Webfont EULA 1.6.txt",
    "content": "The Fontspring Webfont End User License Agreement\nVersion 1.6.0 - March 13, 2014\n\nBy downloading, installing and/or embedding font software (“Webfont”) offered by Fontspring or its distributors, you (“Licensee”) agree to be bound by the following terms and conditions of this End User Licensing Agreement (“EULA”):\n\n1. Right Granted\nFontspring grants Licensee a perpetual, worldwide, non-exclusive and non-transferrable license to link the Webfont to Websites using the @font-face selector in CSS files.\n\n2. Requirements and Restrictions \nLicensee agrees to abide by the following requirements and restrictions:\na. Licensee must use the Webfont provided by Fontspring under this EULA. Licensee may not  link to the full, CFF OpenType or TrueType font designed for desktop installation.\nb. Licensee must include the entire commented header in the provided CSS file.\nc. The total traffic of the Website(s), measured in pageviews per month, may be no greater than the number of pageviews specified in the Receipt.\nd. Licensee may only install the Webfont on Websites that it owns or controls.\ne. Licensee may embed Webfont in reports generated by the Website(s), provided that Licensee does not sell the reports for profit.\n\n3. Provision to Third Parties\nLicensee may temporarily provide the Webfont to a website developer, agent or independent contractor, who is working on behalf of the Licensee, ONLY IF the developer, agent or independent contractor (1) agrees in writing to use the Font exclusively for Licensee’s work, according to the terms of this EULA, and (2) retains no copies of the Font upon completion of the work.\n\nLicensee may not otherwise distribute the Webfont to third parties or make the Webfont publicly accessible or available except by embedding or linking in accordance with this EULA.\n\n4. Term\nThis EULA grants a perpetual license for the rights set forth in Paragraph 1 unless and until the EULA terminates under Paragraph 8.  Fontspring will not charge additional fees post purchase, annually or otherwise.\n\n5. Other Usage\nLicenses for desktop use, computer applications and games, installable interactive books, software, mobile applications and games, Ebooks and Epubs, product creation websites, website template distribution, website templates, and other uses not allowed by this EULA may be available for an additional fee. Contact Fontspring at support@fontspring.com for more information.\n\n6. Modifications\nLicensee may not modify the Webfont or create derivative works based upon the Webfont without prior written consent from Fontspring or the owning foundry EXCEPT THAT Licensee may generate files necessary for embedding or linking in accordance with this EULA.\n\n7. Copyright\nThe Webfont is protected by copyright law.   The Foundry is the sole, exclusive owner of all intellectual property rights, including rights under copyright and trademark law.  Licensee agrees not to use the Webfont in any manner that infringes the intellectual property rights of the Foundry or violates the terms of this EULA.  Licensee will be held legally responsible, and indemnifies Fontspring, for any infringements on the foundry's rights caused by failure to abide by the terms of this EULA.\n\n8. Termination\nThis EULA is effective until terminated. If Licensee fails to comply with any term of this EULA, Fontspring may terminate the EULA with 30 days notice.  This EULA will terminate automatically 30 days after the issuance of such notice.\n\n9. Disclaimer and Limited Warranty\nFontspring warrants the Product to be free from defects in materials and workmanship under normal use for a period of twenty one (21) days from the date of delivery as shown on Receipt. Fontspring's entire liability, and Licensee’s exclusive remedy, for a defective product shall be, at Fontspring's election, either (1) return of purchase price or (2) replacement of any such product that is returned to Fontspring with a copy of the Receipt. Fontspring shall have no responsibility to replace the product or refund the purchase price if failure results from accident, abuse or misapplication, or if any product is lost or damaged due to theft, fire, or negligence. Any replacement product will be warranted for twenty one (21) days. This warranty gives Licensee specific legal rights. Licensee may have other rights, which vary from state to state.\n\nEXCEPT AS EXPRESSLY PROVIDED ABOVE, THE PRODUCT, IS PROVIDED “AS IS”. FONTSPRING MAKES NO WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n\nThe entire risk as to the quality and performance of the Product rests upon Licensee. Neither Fontspring nor the Foundry warrants that the functions contained in the Product will meet Licensee’s requirements or that the operation of the software will be uninterrupted or error free.\n\nFONTSPRING SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, OR INCIDENTAL DAMAGES (INCLUDING DAMAGES FROM LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, AND THE LIKE) ARISING OUT OF THE USE OF OR INABILITY TO USE THE PRODUCT EVEN IF FONTSPRING OR THE FOUNDRY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\nBecause some states do not allow the exclusion or limitation of liability for consequential or incidental damages, the above limitation may not apply to Licensee.\n\n10. Governing Law\nThis EULA is governed by the laws of the United States of America and the State of Delaware.\n\n11.  Entire Agreement\nThis EULA, in conjunction with the receipt (“Receipt”) that accompanies each Font licensed from Fontspring or its distributors, constitutes the entire agreement between Fontspring and Licensee.\n\n12.  Modification\nThe Parties may modify or amend this EULA in writing.\n\n13. Waiver. The waiver of one breach or default hereunder shall not constitute the waiver of any subsequent breach or default. \n"
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-finished/original-font-files/Lovato Light-Webfont/Reference/How_to_use_webfonts.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en-US\" lang=\"en-US\">\n  <head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\n\t<link rel=\"stylesheet\" href=\"stylesheet.css\" type=\"text/css\" charset=\"utf-8\" />\n\n\t<style type=\"text/css\" media=\"screen\">\n\t\t/*-- RESET ------*/\n\t\thtml, body, div, span, applet, object, iframe,\n\t\th1, h2, h3, h4, h5, h6, p, blockquote, pre,\n\t\ta, abbr, acronym, address, big, cite, code,\n\t\tdel, dfn, em, font, img, ins, kbd, q, s, samp,\n\t\tsmall, strike, strong, sub, sup, tt, var,\n\t\tb, u, i, center, dl, dt, dd, ol, ul, li,\n\t\tfieldset, form, label, legend, table,\n\t\tcaption, tbody, tfoot, thead, tr, th, td\n\t\t                  {margin: 0;padding: 0;border: 0;outline: 0;\n\t\t                  font-size: 100%;vertical-align: baseline;\n\t\t                  background: transparent;}\n\t\tbody              {line-height: 1;}\n\t\tol, ul            {list-style: none;}\n\t\tblockquote, q     {quotes: none;}\n\t\tblockquote:before, blockquote:after,\n\t\tq:before, q:after {content: '';\tcontent: none;}\n\t\t:focus            {outline: 0;}\n\t\tins               {text-decoration: none;}\n\t\tdel               {text-decoration: line-through;}\n\t\ttable             {border-collapse: collapse;border-spacing: 0;}\n\n\t\t/*-- GRID -----*/\n\t\t.section {margin-bottom: 18px;\n\t\t}\n\t\t.section:after\t{content: \".\";display: block;height: 0;clear: both;visibility: hidden;}\n\t\t.section \t\t{*zoom: 1;}\n\n\t\t.section .firstcolumn,\n\t\t.section .firstcol {margin-left: 0;}\n\n\t\t.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12\n\t\t{margin-left: 15px;float: left;display: inline; overflow: hidden;}\n\t\t.width5, .grid5, .span-5 {width: 335px;}\n\t\t.width5_2cols,.grid5_2cols {width: 160px;}\n\t\t.width5_3cols,.grid5_3cols  {width: 101px;}\n\t\t.width5_4cols,.grid5_4cols  {width: 72px;}\n\t\t.input_width5 {width: 329px;}\n\n\t\t.width6, .grid6, .span-6 {width: 405px;}\n\t\t.width6_4cols,.grid6_4cols  {width: 90px;}\n\t\t.input_width6 {width: 399px;}\n\n\t\t.width7, .grid7, .span-7 {width: 475px;}\n\t\t.width7_2cols,.grid7_2cols {width: 230px;}\n\t\t.width7_3cols,.grid7_3cols  {width: 148px;}\n\t\t.width7_4cols,.grid7_4cols  {width: 107px;}\n\t\t.input_width7 {width: 469px;}\n\n\t\t/*-- STYLES -----*/\n\t\tbody {\n\t\t\tcolor: #000;\n\t\t\tbackground-color: #dcdcdc;\n\t\t\tfont: 13px Arial, sans-serif;\n\t\t}\n\n\t\ta {\n\t\t\ttext-decoration: none;\n\t\t\tcolor: #1883ba;\n\t\t}\n\n\t\th1{\n\t\t\tfont-size: 32px;\n\t\t\tfont-weight: normal;\n\t\t\tfont-style: normal;\n\t\t\tmargin-bottom: 18px;\n\t\t}\n\n\t\th2{\n\t\t\tfont-size: 18px;\n\t\t}\n\n\t\t#container {\n\t\t\twidth: 865px;\n\t\t\tmargin: 0px auto;\n\t\t}\n\n\n\n\t\t#header {\n\t\t\theight:109px;\n\t\t\tfont-size: 36px;\n\t\t\tbackground-color: #000;\n\t\t\tcolor: #fff;\n\t\t\ttext-indent:-9999px;\n\t\t\tbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASoAAABtCAMAAAAhztx9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADBQTFRFzen3mNLwDCc17fj8GVRwUbXlLprOrNzyesbrEjtOZb3oJXulP63iAAAA////MqfgopnD5wAABSNJREFUeNrs2u1yqyAQBmBARATU+7/bo6CRTwMp7ZnJvPurjUbrU1gWkGyIyiAgABWoQAUqUIEKASpQgQpUoAIVAlSgAhWoQAUqxJdSCbYsHFQ1MS/Lr1h9IRU7qBZQVVNpUL0PDao2K1BVJ/ZjKORdyb6SSiwLc0VDT6uvohKcMS72H/gyn0VDx7Lhq6hsM2LiyFZ6404KrSobzuawWoQ4pRhyVZnKdj7b/djMO1btX0V197m9UbHe5cJ3jYB7Wj873TwL1FUVw+CR1DEHrMT6jct+59Ke1qD6nwGqn1HpTATJQPN9rGGcR+1caC1y17oOPl/XSDoRQiiV4/2ZumMML6zKh4z/UXLUfTX+iNL93hOl6dmPVGxJwkuUevY+5yJc/WAiLQvZvTSSxnXeSNY7hul6gnUNPvaecA0PEek99/4Bvc8b4qc/vhDQ0qF0l59QiTk6osOFIvYZFQ2ffM1S7UFMnmr1RSKqdTCPVHKIb9KFSqTHeEB1TCvaqWKpItVttZatYqr42UMqmt6jjYqHoQNF96vQ0YpQbqn2RSWuS7kdlStc77NPeuaoUVHiU+3Zy8Vk//uT97w0PERKVK8vZaik07luLvebN1I9zLK8OYPDEcFvoVXaJ3W6oTLF/0qTe+jN2Hw25pqGOS6xyhLVKktUo0Wm4ajQgUokPUz7XfDqY6KV6vhzTe6GIdVmhvv3ODcPd+PJUK2qQDUlkM0jYL4KjiHOdhZR+cNgFVUxP0RUfvOLqeh9KEflD4PeV8ekTXWimjMLsF6XOxDmqOH1pZJlKlWmIiQYOzdyf5VmBsguVGmjCvi0zfjhqNiXSn1GZRMSyVGRJOf3odK5HW6vmLJU0TZcda6SP6SSD1Sun00ZqiFKYz2p2Fsqt1WiW0fAdRrfU9EyFSmndXKWBDKhMvFVPqFifvAHKnE/+Unlii/RQGWGc3ay11DKPFB5HnHJ/VAskPO/caX2m+o4c/gpVa5W59lttZTKlvTnMFhFdVY3V7EsS1Q0X1cZJW3FdeXnHJX1OU8Iqcj/pPJnOHVU8Yw1N0UxzoMUJzavDpalMvcwWKC6Z1H076i8yrSS6pxTkCG0UuWJXlkqT+Va7vQLVNVpXeSoXGWqm6iupOO3HVVePkjmuOP2TOXSGS3nql+nSkfAV7l1WDVTnY805qgGb5T0p8vRkF+gcqlOFkfA0V6LdKNaKqm2M7V/QGUfRaUrC1SV5rw0zM4lqmsYfKyraBeqqmo96JjsI6rp9deq8gzNpzJhDVukOofBx2q9E1XFHDBe6PuEirZS2T57T+XKVNaUPM4BO1FVrCzw6Oyfd8Aaqm3wTyxT3QVccWWhE1XFehWPGdupxjCtV1HJpwVjEo8ZT+tVnagqVkF53GFrqILZn927IVsbVZB0lJ+A4nqchlTJKmgvqvdr6wGVYHVUZJikm/sZ5ZbJZSuV8pY6g2opmbqQ9WFt3U2RulC93bHhaY+toIrryWlrpdq8tmgz1zAVqNwKfdolvehC9XYfkL+tWiuo6NZONXqNka7BYg3JzM2f9gE7Ub3ZXU5qCV1DJQOradw+oHL1pcmtwZPMuPEwV2/ZXY7fUUhaln1nYc69s5B9aSE9S+cmy9S+saDCfSZVeokgefHAvt9gXpOUaXqdl1xhTN5ZGF/vLJimRRgEqEAFKlCBClQIUIEKVKACFahAhQAVqEAFKlCBCgEqUIEKVKACFQJUoAIVqEAFKgSoQAUqUIEKVKBCgApUfx3/BBgAeuw63hnBp0AAAAAASUVORK5CYII=) no-repeat left center;\n\t\t\tbackground-color: #31a7e0;\n\n\t\t}\n\n\t\t#main_content {\n\t\t\tbackground-color: #fff;\n\t\t\tpadding: 20px 20px 20px;\n\t\t}\n\n\n\t\t#footer p {\n\t\t\tmargin: 0;\n\t\t\tpadding-top: 10px;\n\t\t\tpadding-bottom: 50px;\n\t\t\tcolor: #333;\n\t\t\tfont: 10px Arial, sans-serif;\n\t\t}\n\t\tcode {\n\t\t\twhite-space: pre;\n\t\t\tbackground-color: #eee;\n\t\t\tdisplay: block;\n\t\t\tpadding: 10px;\n\t\t\tmargin-bottom: 18px;\n\t\t\toverflow: auto;\n\t\t}\n\n\t\t.box  {\n\t\t  padding: 18px;\n\t\t  margin-bottom: 18px;\n\t\t  background: #eee;\n\t\t}\n\t\t.bottom,.last \t{margin-bottom:0 !important; padding-bottom:0 !important;}\n\n\n\n\t\tp{\n\t\t\tline-height: 1.2em;\n\t\t\tmargin-bottom: 18px;\n\t\t\tfont: 13px Arial, sans-serif;\n\t\t}\n\n\n\n\t\th3{\n\t\t\tfont-size: 15px;\n\t\t\tmargin-top: 18px;\n\t\t}\n\n\t\t.sidebar p{\n\t\t\tfont-size: 12px;\n\t\t\tline-height: 1.4em;\n\t\t}\n\n\t</style>\n\n<title>How to Use Webfonts</title>\n\n  </head>\n\n<body>\n<div id=\"container\">\n\t<div id=\"header\">\n\t\tFontspring\n\t</div>\n\t<div id=\"main_content\">\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"grid7 firstcol\">\n\t\t\t\t\t<h1>Installing Webfonts</h1>\n\n\t\t\t\t\t<p>Webfonts are supported by all major browser platforms but not all in the same way. There are currently four different font formats that must be included in order to target all browsers. This includes TTF, WOFF, EOT and SVG.</p>\n\n\t\t\t\t\t<h2>1. Upload your webfonts</h2>\n\t\t\t\t\t<p>You must upload your webfont kit to your website. They should be in or near the same directory as your CSS files.</p>\n\n\t\t\t\t\t<h2>2. Include the webfont stylesheet</h2>\n\t\t\t\t\t<p>A special CSS @font-face declaration helps the various browsers select the appropriate font it needs without causing you a bunch of headaches. Learn more about this syntax by reading the <a href=\"http://www.fontspring.com/blog/further-hardening-of-the-bulletproof-syntax\">Fontspring blog post</a> about it. The code for it is as follows:</p>\n\n\n<code>\n@font-face{\n\tfont-family: 'MyWebFont';\n\tsrc: url('WebFont.eot');\n\tsrc: url('WebFont.eot?#iefix') format('embedded-opentype'),\n\t     url('WebFont.woff') format('woff'),\n\t     url('WebFont.ttf') format('truetype'),\n\t     url('WebFont.svg#webfont') format('svg');\n}\n</code>\n\t<p>We've already gone ahead and generated the code for you. All you have to do is link to the stylesheet in your HTML, like this:</p>\n\t<code>&lt;link rel=&quot;stylesheet&quot; href=&quot;stylesheet.css&quot; type=&quot;text/css&quot; charset=&quot;utf-8&quot; /&gt;</code>\n\n\t\t\t\t\t<h2>3. Modify your own stylesheet</h2>\n\t\t\t\t\t<p>To take advantage of your new fonts, you must tell your stylesheet to use them. Look at the original @font-face declaration above and find the property called \"font-family.\" The name linked there will be what you use to reference the font. Prepend that webfont name to the font stack in the \"font-family\" property, inside the selector you want to change. For example:</p>\n<code>p { font-family: 'MyWebFont', Arial, sans-serif; }</code>\n\n<h2>4. Test</h2>\n<p>Getting webfonts to work cross-browser <em>can</em> be tricky. Use the information in the sidebar to help you if you find that fonts aren't loading in a particular browser.</p>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"grid5 sidebar\">\n\t\t\t\t\t<div class=\"box\">\n\t\t\t\t\t\t<h2>Troubleshooting<br />Font-Face Problems</h2>\n\t\t\t\t\t\t<p>Having trouble getting your webfonts to load in your new website? Here are some tips to sort out what might be the problem.</p>\n\n\t\t\t\t\t\t<h3>Fonts not showing in any browser</h3>\n\n\t\t\t\t\t\t<p>This sounds like you need to work on the plumbing. You either did not upload the fonts to the correct directory, or you did not link the fonts properly in the CSS. If you've confirmed that all this is correct and you still have a problem, take a look at your .htaccess file and see if requests are getting intercepted.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in iPhone or iPad</h3>\n\n\t\t\t\t\t\t<p>The most common problem here is that you are serving the fonts from an IIS server. IIS refuses to serve files that have unknown MIME types. If that is the case, you must set the MIME type for SVG to \"image/svg+xml\" in the server settings. Follow these instructions from Microsoft if you need help.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in Firefox</h3>\n\n\t\t\t\t\t\t<p>The primary reason for this failure? You are still using a version Firefox older than 3.5. So upgrade already! If that isn't it, then you are very likely serving fonts from a different domain. Firefox requires that all font assets be served from the same domain. Lastly it is possible that you need to add WOFF to your list of MIME types (if you are serving via IIS.)</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in IE</h3>\n\n\t\t\t\t\t\t<p>Are you looking at Internet Explorer on an actual Windows machine or are you cheating by using a service like Adobe BrowserLab? Many of these screenshot services do not render @font-face for IE. Best to test it on a real machine.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in IE9</h3>\n\n\t\t\t\t\t\t<p>IE9, like Firefox, requires that fonts be served from the same domain as the website. Make sure that is the case.</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t</div>\n\n\t</div>\n\n</body>\n</html>\n"
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-finished/original-font-files/Lovato Light-Webfont/Webfonts/lovato_light_macroman/Lovato-Light-demo.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en-US\" lang=\"en-US\">\n  <head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\t<script src=\"specimen_files/easytabs.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\t<link rel=\"stylesheet\" href=\"specimen_files/specimen_stylesheet.css\" type=\"text/css\" charset=\"utf-8\" />\n\t<link rel=\"stylesheet\" href=\"stylesheet.css\" type=\"text/css\" charset=\"utf-8\" />\n\n\t<style type=\"text/css\">\n\t\t\tbody{\n\t\t\tfont-family: 'lovatolight';\n\t\t\t\t\t}\n</style>\n\n<title>Lovato Light Specimen</title>\n\t\n\t\n\t<script type=\"text/javascript\" charset=\"utf-8\">\n\t\t$(document).ready(function() {\n\t\t\t$('#container').easyTabs({defaultContent:1});\n\t\t});\n\t</script>\n  </head>\n\n<body>\n<div id=\"container\">\n\t<div id=\"header\">\n\t\tLovato Light\t</div>\n\t<ul class=\"tabs\">\n\t\t<li><a href=\"#specimen\">Specimen</a></li>\n\t\t<li><a href=\"#layout\">Sample Layout</a></li>\n\t\t\t\t<li><a href=\"#glyphs\">Glyphs &amp; Languages</a></li>\n\t\t<li><a href=\"#installing\">Installing Webfonts</a></li>\n\t\t\n\t</ul>\n\t\n\t<div id=\"main_content\">\n\n\t\t\n\t\t\t<div id=\"specimen\">\n\t\t\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<div class=\"huge\">AaBb</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"glyph_range\">A&#x200B;B&#x200b;C&#x200b;D&#x200b;E&#x200b;F&#x200b;G&#x200b;H&#x200b;I&#x200b;J&#x200b;K&#x200b;L&#x200b;M&#x200b;N&#x200b;O&#x200b;P&#x200b;Q&#x200b;R&#x200b;S&#x200b;T&#x200b;U&#x200b;V&#x200b;W&#x200b;X&#x200b;Y&#x200b;Z&#x200b;a&#x200b;b&#x200b;c&#x200b;d&#x200b;e&#x200b;f&#x200b;g&#x200b;h&#x200b;i&#x200b;j&#x200b;k&#x200b;l&#x200b;m&#x200b;n&#x200b;o&#x200b;p&#x200b;q&#x200b;r&#x200b;s&#x200b;t&#x200b;u&#x200b;v&#x200b;w&#x200b;x&#x200b;y&#x200b;z&#x200b;1&#x200b;2&#x200b;3&#x200b;4&#x200b;5&#x200b;6&#x200b;7&#x200b;8&#x200b;9&#x200b;0&#x200b;&amp;&#x200b;.&#x200b;,&#x200b;?&#x200b;!&#x200b;&#64;&#x200b;(&#x200b;)&#x200b;#&#x200b;$&#x200b;%&#x200b;*&#x200b;+&#x200b;-&#x200b;=&#x200b;:&#x200b;;</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<table class=\"sample_table\">\n\t\t\t\t\t\t\t<tr><td>10</td><td class=\"size10\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>11</td><td class=\"size11\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>12</td><td class=\"size12\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>13</td><td class=\"size13\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>14</td><td class=\"size14\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>16</td><td class=\"size16\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>18</td><td class=\"size18\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>20</td><td class=\"size20\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>24</td><td class=\"size24\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>30</td><td class=\"size30\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>36</td><td class=\"size36\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>48</td><td class=\"size48\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>60</td><td class=\"size60\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>72</td><td class=\"size72\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>90</td><td class=\"size90\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\n\t\t\t\t</div>\n\t\t\n\t\t\n\t\t\n\t\t\t\t\t\t\t\t<div class=\"section\" id=\"bodycomparison\">\n\n\n\t\t\t\t\t\t\t\t\t\t<div id=\"xheight\">\n\t\t\t\t<div class=\"fontbody\">&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;&#xE000;body</div><div class=\"arialbody\">body</div><div class=\"verdanabody\">body</div><div class=\"georgiabody\">body</div></div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"fontbody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Lovato Light</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"arialbody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Arial</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"verdanabody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Verdana</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"georgiabody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Georgia</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\n\n\n\t\t\t\t\t\t\t\t</div>\n\t\t\n\t\t\n\t\t\t\t<div class=\"section psample psample_row1\" id=\"\">\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"grid2 firstcol\">\n\t\t\t\t\t\t<p class=\"size10\"><span>10.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size11\"><span>11.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size12\"><span>12.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size13\"><span>13.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section psample psample_row2\" id=\"\">\n\t\t\t\t\t<div class=\"grid3 firstcol\">\n\t\t\t\t\t\t<p class=\"size14\"><span>14.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size16\"><span>16.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid5\">\n\t\t\t\t\t\t<p class=\"size18\"><span>18.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row3\" id=\"\">\n\t\t\t\t\t<div class=\"grid5 firstcol\">\n\t\t\t\t\t\t<p class=\"size20\"><span>20.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid7\">\n\t\t\t\t\t\t<p class=\"size24\"><span>24.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row4\" id=\"\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<p class=\"size30\"><span>30.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row1 fullreverse\">\n\t\t\t\t\t<div class=\"grid2 firstcol\">\n\t\t\t\t\t\t<p class=\"size10\"><span>10.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size11\"><span>11.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size12\"><span>12.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size13\"><span>13.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row2 fullreverse\">\n\t\t\t\t\t<div class=\"grid3 firstcol\">\n\t\t\t\t\t\t<p class=\"size14\"><span>14.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size16\"><span>16.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid5\">\n\t\t\t\t\t\t<p class=\"size18\"><span>18.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample fullreverse psample_row3\" id=\"\">\n\t\t\t\t\t<div class=\"grid5 firstcol\">\n\t\t\t\t\t\t<p class=\"size20\"><span>20.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid7\">\n\t\t\t\t\t\t<p class=\"size24\"><span>24.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample fullreverse psample_row4\" id=\"\" style=\"border-bottom: 20px #000 solid;\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<p class=\"size30\"><span>30.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<div id=\"layout\">\n\t\t\t\t\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<h1>Lorem Ipsum Dolor</h1>\n\t\t\t\t\t\t<h2>Etiam porta sem malesuada magna mollis euismod</h2>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<p class=\"byline\">By <a href=\"#link\">Aenean Lacinia</a></p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"grid8 firstcol\">\n\t\t\t\t\t\t<p class=\"large\">Donec sed odio dui. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t<h3>Pellentesque ornare sem</h3>\n\n\t\t\t\t\t\t<p>Maecenas sed diam eget risus varius blandit sit amet non magna. Maecenas faucibus mollis interdum. Donec ullamcorper nulla non metus auctor fringilla. Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam id dolor id nibh ultricies vehicula ut id elit. </p>\n\n\t\t\t\t\t\t<p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. </p>\n\n\t\t\t\t\t\t<p>Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Aenean lacinia bibendum nulla sed consectetur. </p>\n\n\t\t\t\t\t\t<p>Nullam quis risus eget urna mollis ornare vel eu leo. Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec ullamcorper nulla non metus auctor fringilla. </p>\n\n\t\t\t\t\t\t<h3>Cras mattis consectetur</h3>\n\n\t\t\t\t\t\t<p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean lacinia bibendum nulla sed consectetur. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Cras mattis consectetur purus sit amet fermentum. </p>\n\n\t\t\t\t\t\t<p>Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam quis risus eget urna mollis ornare vel eu leo. Cras mattis consectetur purus sit amet fermentum.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"grid4 sidebar\">\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class=\"box reverse\">\n\t\t\t\t\t\t\t<p class=\"last\">Nullam quis risus eget urna mollis ornare vel eu leo. Donec ullamcorper nulla non metus auctor fringilla. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. </p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<p class=\"caption\">Maecenas sed diam eget risus varius.</p>\n\n\t\t\t\t\t\t<p>Vestibulum id ligula porta felis euismod semper. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>\n\n\t\t\t\t\t\n\n\t\t\t\t\t\t<p>Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Aenean lacinia bibendum nulla sed consectetur. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean lacinia bibendum nulla sed consectetur. Nullam quis risus eget urna mollis ornare vel eu leo. </p>\n\n\t\t\t\t\t\t<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec ullamcorper nulla non metus auctor fringilla. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>\n\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t</div>\n\n\n\t\t\t\n\n\n\n\t\t<div id=\"glyphs\">\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\n\t\t\t\t<h1>Language Support</h1>\n\t\t\t\t<p>The subset of Lovato Light in this kit supports the following languages:<br />\n\t\t\t\t\t\n\t\t\t\t\tAlbanian, Alsatian, Aragonese, Arapaho, Aromanian, Arrernte, Asturian, Aymara, Basque, Belarusian (Lacinka), Bislama, Bosnian, Breton, Catalan, Cebuano, Chamorro, Cheyenne, Chichewa (Nyanja), Cimbrian, Corsican, Croatian, Czech, Danish, Dutch, English, Estonian, Faroese, Fijian, Finnish, French, French Creole (Saint Lucia), Frisian, Friulian, Galician, Genoese, German, Gilbertese (Kiribati), Greenlandic, Haitian Creole, Hawaiian, Hiligaynon, Hmong, Hopi, Hungarian, Ibanag, Iloko (Ilokano), Indonesian, Interglossa (Glosa), Interlingua, Irish (Gaelic), Islandic, Istro-Romanian, Italian, Jèrriais, Kashubian, Kurdish (Kurmanji), Ladin, Latin Basic, Latvian, Lithuanian, Lojban, Lombard, Low Saxon, Luxembourgian, Malagasy, Malay (Latinized), Maltese, Manx, Maori, Megleno-Romanian, Mohawk, Nahuatl, Norfolk/Pitcairnese, Northern Sotho (Pedi), Norwegian, Occitan, Oromo, Pangasinan, Papiamento, Piedmontese, Polish, Portuguese, Potawatomi, Rhaeto-Romance, Romanian, Romansh (Rumantsch), Rotokas, Sami (Inari), Sami (Lule), Samoan, Sardinian (Sardu), Scots (Gaelic), Serbian, Seychellois Creole (Seselwa), Shona, Sicilian, Slovak, Slovenian (Slovene), Somali, Southern Ndebele, Southern Sotho (Sesotho), Spanish, Swahili, Swati/Swazi, Swedish, Tagalog (Filipino/Pilipino), Tahitian, Tausug, Tetum (Tetun), Tok Pisin, Tongan (Faka-Tonga), Tswana, Turkish, Turkmen, Turkmen (Latinized), Tuvaluan, ubasic, Uyghur (Latinized), Veps, Volapük, Votic (Latinized), Walloon, Warlpiri, Welsh, Xhosa, Yapese, Zulu\t\t\t\t</p>\n\t\t\t\t<h1>Glyph Chart</h1>\n\t\t\t\t<p>The subset of Lovato Light in this kit includes all the glyphs listed below. Unicode entities are included above each glyph to help you insert individual characters into your layout.</p>\n\t\t\t\t<div id=\"glyph_chart\">\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t</div>\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t</div>\n\t\t</div>\n\t\t\n\t\t\n\t\t<div id=\"specs\">\n\t\t\t\n\t\t</div>\n\t\n\t\t<div id=\"installing\">\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"grid7 firstcol\">\n\t\t\t\t\t<h1>Installing Webfonts</h1>\n\t\t\t\t\t\n\t\t\t\t\t<p>Webfonts are supported by all major browser platforms but not all in the same way. There are currently four different font formats that must be included in order to target all browsers. This includes TTF, WOFF, EOT and SVG.</p>\n\t\t\t\t\t\n\t\t\t\t\t<h2>1. Upload your webfonts</h2>\n\t\t\t\t\t<p>You must upload your webfont kit to your website. They should be in or near the same directory as your CSS files.</p>\n\t\t\t\t\t\n\t\t\t\t\t<h2>2. Include the webfont stylesheet</h2>\n\t\t\t\t\t<p>A special CSS @font-face declaration helps the various browsers select the appropriate font it needs without causing you a bunch of headaches. Learn more about this syntax by reading the <a href=\"http://www.fontspring.com/blog/further-hardening-of-the-bulletproof-syntax\">Fontspring blog post</a> about it. The code for it is as follows:</p>\n\t\t\t\t\t\n\t\t\t\t\t\n<code>\n@font-face{ \n\tfont-family: 'MyWebFont';\n\tsrc: url('WebFont.eot');\n\tsrc: url('WebFont.eot?#iefix') format('embedded-opentype'),\n\t     url('WebFont.woff') format('woff'),\n\t     url('WebFont.ttf') format('truetype'),\n\t     url('WebFont.svg#webfont') format('svg');\n}\n</code>\n\n\t<p>We've already gone ahead and generated the code for you. All you have to do is link to the stylesheet in your HTML, like this:</p>\n\t<code>&lt;link rel=&quot;stylesheet&quot; href=&quot;stylesheet.css&quot; type=&quot;text/css&quot; charset=&quot;utf-8&quot; /&gt;</code>\n\n\t\t\t\t\t<h2>3. Modify your own stylesheet</h2>\n\t\t\t\t\t<p>To take advantage of your new fonts, you must tell your stylesheet to use them. Look at the original @font-face declaration above and find the property called \"font-family.\" The name linked there will be what you use to reference the font. Prepend that webfont name to the font stack in the \"font-family\" property, inside the selector you want to change. For example:</p>\n<code>p { font-family: 'MyWebFont', Arial, sans-serif; }</code>\n\n<h2>4. Test</h2>\n<p>Getting webfonts to work cross-browser <em>can</em> be tricky. Use the information in the sidebar to help you if you find that fonts aren't loading in a particular browser.</p>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"grid5 sidebar\">\n\t\t\t\t\t<div class=\"box\">\n\t\t\t\t\t\t<h2>Troubleshooting<br />Font-Face Problems</h2>\n\t\t\t\t\t\t<p>Having trouble getting your webfonts to load in your new website? Here are some tips to sort out what might be the problem.</p>\n\n\t\t\t\t\t\t<h3>Fonts not showing in any browser</h3>\n\n\t\t\t\t\t\t<p>This sounds like you need to work on the plumbing. You either did not upload the fonts to the correct directory, or you did not link the fonts properly in the CSS. If you've confirmed that all this is correct and you still have a problem, take a look at your .htaccess file and see if requests are getting intercepted.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in iPhone or iPad</h3>\n\n\t\t\t\t\t\t<p>The most common problem here is that you are serving the fonts from an IIS server. IIS refuses to serve files that have unknown MIME types. If that is the case, you must set the MIME type for SVG to \"image/svg+xml\" in the server settings. Follow these instructions from Microsoft if you need help.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in Firefox</h3>\n\n\t\t\t\t\t\t<p>The primary reason for this failure? You are still using a version Firefox older than 3.5. So upgrade already! If that isn't it, then you are very likely serving fonts from a different domain. Firefox requires that all font assets be served from the same domain. Lastly it is possible that you need to add WOFF to your list of MIME types (if you are serving via IIS.)</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in IE</h3>\n\n\t\t\t\t\t\t<p>Are you looking at Internet Explorer on an actual Windows machine or are you cheating by using a service like Adobe BrowserLab? Many of these screenshot services do not render @font-face for IE. Best to test it on a real machine.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in IE9</h3>\n\n\t\t\t\t\t\t<p>IE9, like Firefox, requires that fonts be served from the same domain as the website. Make sure that is the case.</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\n\t\t</div>\n\t\n\t</div>\n\t<div id=\"footer\">\n\t\t<p>&copy;2010-2013 Font Squirrel. All rights reserved.</p>\n\t</div>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-finished/original-font-files/Lovato Light-Webfont/Webfonts/lovato_light_macroman/specimen_files/easytabs.js",
    "content": "(function($){$.fn.easyTabs=function(option){var param=jQuery.extend({fadeSpeed:\"fast\",defaultContent:1,activeClass:'active'},option);$(this).each(function(){var thisId=\"#\"+this.id;if(param.defaultContent==''){param.defaultContent=1;}\nif(typeof param.defaultContent==\"number\")\n{var defaultTab=$(thisId+\" .tabs li:eq(\"+(param.defaultContent-1)+\") a\").attr('href').substr(1);}else{var defaultTab=param.defaultContent;}\n$(thisId+\" .tabs li a\").each(function(){var tabToHide=$(this).attr('href').substr(1);$(\"#\"+tabToHide).addClass('easytabs-tab-content');});hideAll();changeContent(defaultTab);function hideAll(){$(thisId+\" .easytabs-tab-content\").hide();}\nfunction changeContent(tabId){hideAll();$(thisId+\" .tabs li\").removeClass(param.activeClass);$(thisId+\" .tabs li a[href=#\"+tabId+\"]\").closest('li').addClass(param.activeClass);if(param.fadeSpeed!=\"none\")\n{$(thisId+\" #\"+tabId).fadeIn(param.fadeSpeed);}else{$(thisId+\" #\"+tabId).show();}}\n$(thisId+\" .tabs li\").click(function(){var tabId=$(this).find('a').attr('href').substr(1);changeContent(tabId);return false;});});}})(jQuery);"
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-finished/original-font-files/Lovato Light-Webfont/Webfonts/lovato_light_macroman/specimen_files/grid_12-825-55-15.css",
    "content": "/*Notes about grid:\nColumns:      12\nGrid Width:   825px\nColumn Width: 55px\nGutter Width: 15px\n-------------------------------*/\n \n \n \n.section \t\t{margin-bottom: 18px;\n}\n.section:after\t{content: \".\";display: block;height: 0;clear: both;visibility: hidden;}\n.section \t\t{*zoom: 1;}\n \n.section .firstcolumn,\n.section .firstcol {margin-left: 0;}\n \n \n/* Border on left hand side of a column. */\n.border {\n  padding-left: 7px;\n  margin-left: 7px;\n  border-left: 1px solid #eee;\n}\n \n/* Border with more whitespace, spans one column. */\n.colborder {\n    padding-left: 42px;\n  margin-left: 42px;\n  border-left: 1px solid #eee;\n}\n \n\n \n/* The Grid Classes */\n.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12\n{margin-left: 15px;float: left;display: inline; overflow: hidden;}\n \n \n.width1, .grid1, .span-1 {width: 55px;}\n.width1_2cols,.grid1_2cols {width: 20px;}\n.width1_3cols,.grid1_3cols  {width: 8px;}\n.width1_4cols,.grid1_4cols  {width: 2px;}\n.input_width1 {width: 49px;}\n \n.width2, .grid2, .span-2 {width: 125px;}\n.width2_3cols,.grid2_3cols  {width: 31px;}\n.width2_4cols,.grid2_4cols  {width: 20px;}\n.input_width2 {width: 119px;}\n \n.width3, .grid3, .span-3 {width: 195px;}\n.width3_2cols,.grid3_2cols {width: 90px;}\n.width3_4cols,.grid3_4cols  {width: 37px;}\n.input_width3 {width: 189px;}\n \n.width4, .grid4, .span-4 {width: 265px;}\n.width4_3cols,.grid4_3cols  {width: 78px;}\n.input_width4 {width: 259px;}\n \n.width5, .grid5, .span-5 {width: 335px;}\n.width5_2cols,.grid5_2cols {width: 160px;}\n.width5_3cols,.grid5_3cols  {width: 101px;}\n.width5_4cols,.grid5_4cols  {width: 72px;}\n.input_width5 {width: 329px;}\n \n.width6, .grid6, .span-6 {width: 405px;}\n.width6_4cols,.grid6_4cols  {width: 90px;}\n.input_width6 {width: 399px;}\n \n.width7, .grid7, .span-7 {width: 475px;}\n.width7_2cols,.grid7_2cols {width: 230px;}\n.width7_3cols,.grid7_3cols  {width: 148px;}\n.width7_4cols,.grid7_4cols  {width: 107px;}\n.input_width7 {width: 469px;}\n \n.width8, .grid8, .span-8 {width: 545px;}\n.width8_3cols,.grid8_3cols  {width: 171px;}\n.input_width8 {width: 539px;}\n \n.width9, .grid9, .span-9 {width: 615px;}\n.width9_2cols,.grid9_2cols {width: 300px;}\n.width9_4cols,.grid9_4cols  {width: 142px;}\n.input_width9 {width: 609px;}\n \n.width10, .grid10, .span-10 {width: 685px;}\n.width10_3cols,.grid10_3cols  {width: 218px;}\n.width10_4cols,.grid10_4cols  {width: 160px;}\n.input_width10 {width: 679px;}\n \n.width11, .grid11, .span-11 {width: 755px;}\n.width11_2cols,.grid11_2cols {width: 370px;}\n.width11_3cols,.grid11_3cols  {width: 241px;}\n.width11_4cols,.grid11_4cols  {width: 177px;}\n.input_width11 {width: 749px;}\n \n.width12, .grid12, .span-12 {width: 825px;}\n.input_width12 {width: 819px;}\n \n/* Subdivided grid spaces */\n.emptycols_left1, .prepend-1 {padding-left: 70px;}\n.emptycols_right1, .append-1 {padding-right: 70px;}\n.emptycols_left2, .prepend-2 {padding-left: 140px;}\n.emptycols_right2, .append-2 {padding-right: 140px;}\n.emptycols_left3, .prepend-3 {padding-left: 210px;}\n.emptycols_right3, .append-3 {padding-right: 210px;}\n.emptycols_left4, .prepend-4 {padding-left: 280px;}\n.emptycols_right4, .append-4 {padding-right: 280px;}\n.emptycols_left5, .prepend-5 {padding-left: 350px;}\n.emptycols_right5, .append-5 {padding-right: 350px;}\n.emptycols_left6, .prepend-6 {padding-left: 420px;}\n.emptycols_right6, .append-6 {padding-right: 420px;}\n.emptycols_left7, .prepend-7 {padding-left: 490px;}\n.emptycols_right7, .append-7 {padding-right: 490px;}\n.emptycols_left8, .prepend-8 {padding-left: 560px;}\n.emptycols_right8, .append-8 {padding-right: 560px;}\n.emptycols_left9, .prepend-9 {padding-left: 630px;}\n.emptycols_right9, .append-9 {padding-right: 630px;}\n.emptycols_left10, .prepend-10 {padding-left: 700px;}\n.emptycols_right10, .append-10 {padding-right: 700px;}\n.emptycols_left11, .prepend-11 {padding-left: 770px;}\n.emptycols_right11, .append-11 {padding-right: 770px;}\n.pull-1 {margin-left: -70px;}\n.push-1 {margin-right: -70px;margin-left: 18px;float: right;}\n.pull-2 {margin-left: -140px;}\n.push-2 {margin-right: -140px;margin-left: 18px;float: right;}\n.pull-3 {margin-left: -210px;}\n.push-3 {margin-right: -210px;margin-left: 18px;float: right;}\n.pull-4 {margin-left: -280px;}\n.push-4 {margin-right: -280px;margin-left: 18px;float: right;}"
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-finished/original-font-files/Lovato Light-Webfont/Webfonts/lovato_light_macroman/specimen_files/specimen_stylesheet.css",
    "content": "@import url('grid_12-825-55-15.css');\n\n/*  \n\tCSS Reset by Eric Meyer - Released under Public Domain\n    http://meyerweb.com/eric/tools/css/reset/\n*/\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, font, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center, dl, dt, dd, ol, ul, li,\nfieldset, form, label, legend, table, \ncaption, tbody, tfoot, thead, tr, th, td \n                  {margin: 0;padding: 0;border: 0;outline: 0;\n                  font-size: 100%;vertical-align: baseline;\n                  background: transparent;}\nbody              {line-height: 1;}\nol, ul            {list-style: none;}\nblockquote, q     {quotes: none;}\nblockquote:before, blockquote:after,\nq:before, q:after {content: '';\tcontent: none;}\n:focus            {outline: 0;}\nins               {text-decoration: none;}\ndel               {text-decoration: line-through;}\ntable             {border-collapse: collapse;border-spacing: 0;}\n\n\n\n\nbody {\n\tcolor: #000;\n\tbackground-color: #dcdcdc;\n}\n\na {\n\ttext-decoration: none;\n\tcolor: #1883ba;\n}\n\nh1{\n\tfont-size: 32px;\n\tfont-weight: normal;\n\tfont-style: normal;\n\tmargin-bottom: 18px;\n}\n\nh2{\n\tfont-size: 18px;\n}\n\n#container {\n\twidth: 865px;\n\tmargin: 0px auto;\n}\n\n\n#header {\n\tpadding: 20px;\n\tfont-size: 36px;\n\tbackground-color: #000;\n\tcolor: #fff;\n}\n\n#header span {\n\tcolor: #666;\n}\n#main_content {\n\tbackground-color: #fff;\n\tpadding: 60px 20px 20px;\n}\n\n\n#footer p {\n\tmargin: 0;\n\tpadding-top: 10px;\n\tpadding-bottom: 50px;\n\tcolor: #333;\n\tfont: 10px Arial, sans-serif;\n}\n\n.tabs {\n\twidth: 100%;\n\theight: 31px;\n\tbackground-color: #444;\n}\n.tabs li {\n\tfloat:  left;\n\tmargin: 0;\n\toverflow: hidden;\n\tbackground-color: #444;\n}\n.tabs li a {\n\tdisplay: block;\n\tcolor: #fff;\n\ttext-decoration: none;\n\tfont: bold 11px/11px 'Arial';\n\ttext-transform: uppercase;\n\tpadding: 10px 15px;\n\tborder-right: 1px solid #fff;\n}\n\n.tabs li a:hover {\n\t\tbackground-color: #00b3ff;\n\n}\n\n.tabs li.active a {\n\tcolor:  #000;\n\tbackground-color: #fff;\n}\n\n\n\ndiv.huge {\n\t\n\tfont-size: 300px;\n\tline-height: 1em;\n\tpadding: 0;\n\tletter-spacing: -.02em;\n\toverflow: hidden;\n}\ndiv.glyph_range {\n\tfont-size: 72px;\n\tline-height: 1.1em;\n}\n\n.size10{ font-size: 10px; }\n.size11{ font-size: 11px; }\n.size12{ font-size: 12px; }\n.size13{ font-size: 13px; }\n.size14{ font-size: 14px; }\n.size16{ font-size: 16px; }\n.size18{ font-size: 18px; }\n.size20{ font-size: 20px; }\n.size24{ font-size: 24px; }\n.size30{ font-size: 30px; }\n.size36{ font-size: 36px; }\n.size48{ font-size: 48px; }\n.size60{ font-size: 60px; }\n.size72{ font-size: 72px; }\n.size90{ font-size: 90px; }\n\n\n.psample_row1 {\theight: 120px;}\n.psample_row1 {\theight: 120px;}\n.psample_row2 {\theight: 160px;}\n.psample_row3 {\theight: 160px;}\n.psample_row4 {\theight: 160px;}\n\n.psample {\n\toverflow: hidden;\n\tposition: relative;\n}\n.psample p {\n\tline-height: 1.3em;\n\tdisplay: block;\n\toverflow: hidden;\n\tmargin: 0;\n}\n\n.psample span {\n\tmargin-right: .5em;\n}\n\n.white_blend {\n\twidth: 100%;\n\theight: 61px;\n\tbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==);\n\tposition: absolute;\n\tbottom: 0;\n}\n.black_blend {\n\twidth: 100%;\n\theight: 61px;\n\tbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC);\n\tposition: absolute;\n\tbottom: 0;\n}\n.fullreverse {\n\tbackground:  #000 !important;\n\tcolor:  #fff !important;\n\tmargin-left: -20px;\n\tpadding-left: 20px;\n\tmargin-right: -20px;\n\tpadding-right: 20px;\n\tpadding: 20px;\n\tmargin-bottom:0;\n}\n\n\n.sample_table td {\n\tpadding-top: 3px;\n\tpadding-bottom:5px;\n\tpadding-left: 5px;\n\tvertical-align: middle;\n\tline-height: 1.2em;\n}\n\n.sample_table td:first-child {\n\tbackground-color: #eee;\n\ttext-align: right;\n\tpadding-right: 5px;\n\tpadding-left: 0;\n\tpadding: 5px;\n\tfont: 11px/12px \"Courier New\", Courier, mono;\n}\n\ncode {\n\twhite-space: pre;\n\tbackground-color: #eee;\n\tdisplay: block;\n\tpadding: 10px;\n\tmargin-bottom: 18px;\n\toverflow: auto;\n}\n\n\n.bottom,.last \t{margin-bottom:0 !important; padding-bottom:0 !important;}\n\n.box  { \n  padding: 18px; \n  margin-bottom: 18px; \n  background: #eee; \n}\n\n.reverse,.reversed { background:  #000 !important;color:  #fff !important; border: none !important;}\n\n#bodycomparison {\n\tposition: relative;\n\toverflow: hidden;\n\tfont-size: 72px;\n\theight: 90px;\n\twhite-space: nowrap;\n}\n\n#bodycomparison div{\n\tfont-size: 72px;\n\tline-height: 90px;\n\tdisplay: inline;\n\tmargin: 0 15px 0 0;\n\tpadding: 0;\n}\n\n#bodycomparison div span{\n\tfont: 10px Arial;\n\tposition: absolute;\n\tleft: 0;\n}\n#xheight {\n\tfloat: none;\n\tposition: absolute;\n\tcolor: #d9f3ff;\n\tfont-size: 72px;\n\tline-height: 90px;\n}\n\n.fontbody {\n position: relative;\n}\n.arialbody{\n\tfont-family: Arial;\n\tposition: relative;\n}\n.verdanabody{\n\tfont-family: Verdana;\n\tposition: relative;\n}\n.georgiabody{\n\tfont-family: Georgia;\n\tposition: relative;\n}\n\n/* @group Layout page\n */\n\n#layout h1 {\n\tfont-size: 36px;\n\tline-height: 42px;\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n\n#layout h2 {\n\tfont-size: 24px;\n\tline-height: 23px;\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n\n#layout h3 {\n\tfont-size: 22px;\n\tline-height: 1.4em;\n\tmargin-top: 1em;\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n\n\n#layout p.byline {\n\tfont-size: 12px;\n\tmargin-top: 18px;\n\tline-height: 12px;\n\tmargin-bottom: 0;\n}\n#layout p {\n\tfont-size: 14px;\n\tline-height: 21px;\n\tmargin-bottom: .5em;\n}\n\n#layout p.large{\n\tfont-size: 18px;\n\tline-height: 26px;\n}\n\n#layout .sidebar p{\n\tfont-size: 12px;\n\tline-height: 1.4em;\n}\n\n#layout p.caption {\n\tfont-size: 10px;\n\tmargin-top: -16px;\n\tmargin-bottom: 18px;\n}\n\n/* @end */\n\n/* @group Glyphs */\n\n#glyph_chart div{\n\tbackground-color: #d9f3ff;\n\tcolor: black;\n\tfloat: left;\n\tfont-size: 36px;\n\theight: 1.2em;\n\tline-height: 1.2em;\n\tmargin-bottom: 1px;\n\tmargin-right: 1px;\n\ttext-align: center;\n\twidth: 1.2em;\n\tposition: relative;\n\tpadding: .6em .2em .2em;\n}\n\n#glyph_chart div p {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\tdisplay: block;\n\ttext-align: center;\n\tfont: bold 9px Arial, sans-serif;\n\tbackground-color: #3a768f;\n\twidth: 100%;\n\tcolor: #fff;\n\tpadding: 2px 0;\n}\n\n\n#glyphs h1 {\n\tfont-family: Arial, sans-serif;\n}\n/* @end */\n\n/* @group Installing */\n\n#installing {\n\tfont: 13px Arial, sans-serif;\n}\n\n#installing p,\n#glyphs p{\n\tline-height: 1.2em;\n\tmargin-bottom: 18px;\n\tfont: 13px Arial, sans-serif;\n}\n\n\n\n#installing h3{\n\tfont-size: 15px;\n\tmargin-top: 18px;\n}\n\n/* @end */\n\n#rendering h1 {\n\tfont-family: Arial, sans-serif;\n}\n.render_table td {\n\tfont: 11px \"Courier New\", Courier, mono;\n\tvertical-align: middle;\n}\n\n\n"
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-finished/original-font-files/Lovato Light-Webfont/Webfonts/lovato_light_macroman/stylesheet.css",
    "content": "/*\n * Web Fonts from fontspring.com\n *\n * All OpenType features and all extended glyphs have been removed.\n * Fully installable fonts can be purchased at http://www.fontspring.com\n *\n * The fonts included in this stylesheet are subject to the End User License you purchased\n * from Fontspring. The fonts are protected under domestic and international trademark and \n * copyright law. You are prohibited from modifying, reverse engineering, duplicating, or\n * distributing this font software.\n *\n * (c) 2010-2015 Fontspring\n *\n *\n *\n *\n * The fonts included are copyrighted by the vendor listed below.\n *\n * Vendor:      Philatype\n * License URL: http://www.fontspring.com/licenses/philatype/webfont\n *\n *\n */\n\n@font-face {\n    font-family: 'lovatolight';\n    src: url('Lovato-Light-webfont.eot');\n    src: url('Lovato-Light-webfont.eot?#iefix') format('embedded-opentype'),\n         url('Lovato-Light-webfont.woff2') format('woff2'),\n         url('Lovato-Light-webfont.woff') format('woff'),\n         url('Lovato-Light-webfont.ttf') format('truetype'),\n         url('Lovato-Light-webfont.svg#lovatolight') format('svg');\n    font-weight: normal;\n    font-style: normal;\n\n}\n\n"
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-finished/original-font-files/josefin-slab/SIL Open Font License.txt",
    "content": "Copyright (c) 2010 by Typemade (hi@typemade.mx). All rights reserved.\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the copyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as distributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.\n\n5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are not met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE."
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-finished/original-font-files/webfontkit-20160419-074110/generator_config.txt",
    "content": "# Font Squirrel Font-face Generator Configuration File\n# Upload this file to the generator to recreate the settings\n# you used to create these fonts.\n\n{\"mode\":\"optimal\",\"formats\":[\"ttf\",\"woff\",\"woff2\",\"eotz\"],\"tt_instructor\":\"default\",\"fix_gasp\":\"xy\",\"fix_vertical_metrics\":\"Y\",\"metrics_ascent\":\"\",\"metrics_descent\":\"\",\"metrics_linegap\":\"\",\"add_spaces\":\"Y\",\"add_hyphens\":\"Y\",\"fallback\":\"none\",\"fallback_custom\":\"100\",\"options_subset\":\"basic\",\"subset_custom\":\"\",\"subset_custom_range\":\"\",\"subset_ot_features_list\":\"\",\"css_stylesheet\":\"stylesheet.css\",\"filename_suffix\":\"-webfont\",\"emsquare\":\"2048\",\"spacing_adjustment\":\"0\"}"
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-finished/original-font-files/webfontkit-20160419-074110/josefinslab-bold-demo.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en-US\" lang=\"en-US\">\n  <head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<script src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\t<script src=\"specimen_files/easytabs.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\t<link rel=\"stylesheet\" href=\"specimen_files/specimen_stylesheet.css\" type=\"text/css\" charset=\"utf-8\" />\n\t<link rel=\"stylesheet\" href=\"stylesheet.css\" type=\"text/css\" charset=\"utf-8\" />\n\n\t<style type=\"text/css\">\n\t\t\t\t\tbody{\n\t\t\t\tfont-family: 'josefin_slabbold';\n\t\t\t\t\t\t\t}\n\t\t</style>\n\n\t<title>Josefin Slab Bold Specimen</title>\n\t\n\t\n\t<script type=\"text/javascript\" charset=\"utf-8\">\n\t\t$(document).ready(function() {\n\t\t\t$('#container').easyTabs({defaultContent:1});\n\t\t});\n\t</script>\n  </head>\n\n<body>\n<div id=\"container\">\n\t<div id=\"header\">\n\t\tJosefin Slab Bold\t</div>\n\t<ul class=\"tabs\">\n\t\t<li><a href=\"#specimen\">Specimen</a></li>\n\t\t<li><a href=\"#layout\">Sample Layout</a></li>\n\t\t\t\t<li><a href=\"#glyphs\">Glyphs &amp; Languages</a></li>\n\t\t<li><a href=\"#installing\">Installing Webfonts</a></li>\n\t\t\n\t</ul>\n\t\n\t<div id=\"main_content\">\n\n\t\t\n\t\t\t<div id=\"specimen\">\n\t\t\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<div class=\"huge\">AaBb</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"glyph_range\">A&#x200B;B&#x200b;C&#x200b;D&#x200b;E&#x200b;F&#x200b;G&#x200b;H&#x200b;I&#x200b;J&#x200b;K&#x200b;L&#x200b;M&#x200b;N&#x200b;O&#x200b;P&#x200b;Q&#x200b;R&#x200b;S&#x200b;T&#x200b;U&#x200b;V&#x200b;W&#x200b;X&#x200b;Y&#x200b;Z&#x200b;a&#x200b;b&#x200b;c&#x200b;d&#x200b;e&#x200b;f&#x200b;g&#x200b;h&#x200b;i&#x200b;j&#x200b;k&#x200b;l&#x200b;m&#x200b;n&#x200b;o&#x200b;p&#x200b;q&#x200b;r&#x200b;s&#x200b;t&#x200b;u&#x200b;v&#x200b;w&#x200b;x&#x200b;y&#x200b;z&#x200b;1&#x200b;2&#x200b;3&#x200b;4&#x200b;5&#x200b;6&#x200b;7&#x200b;8&#x200b;9&#x200b;0&#x200b;&amp;&#x200b;.&#x200b;,&#x200b;?&#x200b;!&#x200b;&#64;&#x200b;(&#x200b;)&#x200b;#&#x200b;$&#x200b;%&#x200b;*&#x200b;+&#x200b;-&#x200b;=&#x200b;:&#x200b;;</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<table class=\"sample_table\">\n\t\t\t\t\t\t\t<tr><td>10</td><td class=\"size10\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>11</td><td class=\"size11\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>12</td><td class=\"size12\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>13</td><td class=\"size13\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>14</td><td class=\"size14\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>16</td><td class=\"size16\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>18</td><td class=\"size18\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>20</td><td class=\"size20\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>24</td><td class=\"size24\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>30</td><td class=\"size30\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>36</td><td class=\"size36\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>48</td><td class=\"size48\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>60</td><td class=\"size60\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>72</td><td class=\"size72\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>90</td><td class=\"size90\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\n\t\t\t\t</div>\n\t\t\n\t\t\n\t\t\n\t\t\t\t\t\t\t\t<div class=\"section\" id=\"bodycomparison\">\n\n\n\t\t\t\t\t\t\t\t\t\t<div id=\"xheight\">\n\t\t\t\t<div class=\"fontbody\">&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;body</div><div class=\"arialbody\">body</div><div class=\"verdanabody\">body</div><div class=\"georgiabody\">body</div></div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"fontbody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Josefin Slab Bold</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"arialbody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Arial</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"verdanabody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Verdana</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"georgiabody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Georgia</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\n\n\n\t\t\t\t\t\t\t\t</div>\n\t\t\n\t\t\n\t\t\t\t<div class=\"section psample psample_row1\" id=\"\">\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"grid2 firstcol\">\n\t\t\t\t\t\t<p class=\"size10\"><span>10.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size11\"><span>11.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size12\"><span>12.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size13\"><span>13.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section psample psample_row2\" id=\"\">\n\t\t\t\t\t<div class=\"grid3 firstcol\">\n\t\t\t\t\t\t<p class=\"size14\"><span>14.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size16\"><span>16.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid5\">\n\t\t\t\t\t\t<p class=\"size18\"><span>18.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row3\" id=\"\">\n\t\t\t\t\t<div class=\"grid5 firstcol\">\n\t\t\t\t\t\t<p class=\"size20\"><span>20.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid7\">\n\t\t\t\t\t\t<p class=\"size24\"><span>24.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row4\" id=\"\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<p class=\"size30\"><span>30.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row1 fullreverse\">\n\t\t\t\t\t<div class=\"grid2 firstcol\">\n\t\t\t\t\t\t<p class=\"size10\"><span>10.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size11\"><span>11.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size12\"><span>12.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size13\"><span>13.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row2 fullreverse\">\n\t\t\t\t\t<div class=\"grid3 firstcol\">\n\t\t\t\t\t\t<p class=\"size14\"><span>14.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size16\"><span>16.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid5\">\n\t\t\t\t\t\t<p class=\"size18\"><span>18.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample fullreverse psample_row3\" id=\"\">\n\t\t\t\t\t<div class=\"grid5 firstcol\">\n\t\t\t\t\t\t<p class=\"size20\"><span>20.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid7\">\n\t\t\t\t\t\t<p class=\"size24\"><span>24.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample fullreverse psample_row4\" id=\"\" style=\"border-bottom: 20px #000 solid;\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<p class=\"size30\"><span>30.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<div id=\"layout\">\n\t\t\t\t\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<h1>Lorem Ipsum Dolor</h1>\n\t\t\t\t\t\t<h2>Etiam porta sem malesuada magna mollis euismod</h2>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<p class=\"byline\">By <a href=\"#link\">Aenean Lacinia</a></p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"grid8 firstcol\">\n\t\t\t\t\t\t<p class=\"large\">Donec sed odio dui. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t<h3>Pellentesque ornare sem</h3>\n\n\t\t\t\t\t\t<p>Maecenas sed diam eget risus varius blandit sit amet non magna. Maecenas faucibus mollis interdum. Donec ullamcorper nulla non metus auctor fringilla. Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam id dolor id nibh ultricies vehicula ut id elit. </p>\n\n\t\t\t\t\t\t<p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. </p>\n\n\t\t\t\t\t\t<p>Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Aenean lacinia bibendum nulla sed consectetur. </p>\n\n\t\t\t\t\t\t<p>Nullam quis risus eget urna mollis ornare vel eu leo. Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec ullamcorper nulla non metus auctor fringilla. </p>\n\n\t\t\t\t\t\t<h3>Cras mattis consectetur</h3>\n\n\t\t\t\t\t\t<p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean lacinia bibendum nulla sed consectetur. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Cras mattis consectetur purus sit amet fermentum. </p>\n\n\t\t\t\t\t\t<p>Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam quis risus eget urna mollis ornare vel eu leo. Cras mattis consectetur purus sit amet fermentum.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"grid4 sidebar\">\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class=\"box reverse\">\n\t\t\t\t\t\t\t<p class=\"last\">Nullam quis risus eget urna mollis ornare vel eu leo. Donec ullamcorper nulla non metus auctor fringilla. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. </p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<p class=\"caption\">Maecenas sed diam eget risus varius.</p>\n\n\t\t\t\t\t\t<p>Vestibulum id ligula porta felis euismod semper. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>\n\n\t\t\t\t\t\n\n\t\t\t\t\t\t<p>Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Aenean lacinia bibendum nulla sed consectetur. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean lacinia bibendum nulla sed consectetur. Nullam quis risus eget urna mollis ornare vel eu leo. </p>\n\n\t\t\t\t\t\t<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec ullamcorper nulla non metus auctor fringilla. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>\n\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t</div>\n\n\n\t\t\t\n\n\n\n\t\t<div id=\"glyphs\">\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\n\t\t\t\t<h1>Language Support</h1>\n\t\t\t\t<p>The subset of Josefin Slab Bold in this kit supports the following languages:<br />\n\t\t\t\n\t\t\t\t\tAlbanian, Basque, Breton, Chamorro, Danish, English, Faroese, Finnish, Frisian, Galician, German, Icelandic, Italian, Malagasy, Norwegian, Portuguese, Spanish, Swedish\t\t\t\t</p>\n\t\t\t\t<h1>Glyph Chart</h1>\n\t\t\t\t<p>The subset of Josefin Slab Bold in this kit includes all the glyphs listed below. Unicode entities are included above each glyph to help you insert individual characters into your layout.</p>\n\t\t\t\t<div id=\"glyph_chart\">\n\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#13;</p>&#13;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#32;</p>&#32;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#33;</p>&#33;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#34;</p>&#34;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#35;</p>&#35;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#36;</p>&#36;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#37;</p>&#37;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#38;</p>&#38;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#39;</p>&#39;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#40;</p>&#40;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#41;</p>&#41;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#42;</p>&#42;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#43;</p>&#43;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#44;</p>&#44;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#45;</p>&#45;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#46;</p>&#46;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#47;</p>&#47;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#48;</p>&#48;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#49;</p>&#49;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#50;</p>&#50;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#51;</p>&#51;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#52;</p>&#52;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#53;</p>&#53;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#54;</p>&#54;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#55;</p>&#55;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#56;</p>&#56;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#57;</p>&#57;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#58;</p>&#58;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#59;</p>&#59;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#60;</p>&#60;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#61;</p>&#61;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#62;</p>&#62;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#63;</p>&#63;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#64;</p>&#64;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#65;</p>&#65;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#66;</p>&#66;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#67;</p>&#67;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#68;</p>&#68;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#69;</p>&#69;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#70;</p>&#70;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#71;</p>&#71;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#72;</p>&#72;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#73;</p>&#73;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#74;</p>&#74;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#75;</p>&#75;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#76;</p>&#76;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#77;</p>&#77;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#78;</p>&#78;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#79;</p>&#79;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#80;</p>&#80;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#81;</p>&#81;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#82;</p>&#82;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#83;</p>&#83;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#84;</p>&#84;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#85;</p>&#85;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#86;</p>&#86;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#87;</p>&#87;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#88;</p>&#88;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#89;</p>&#89;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#90;</p>&#90;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#91;</p>&#91;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#92;</p>&#92;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#93;</p>&#93;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#94;</p>&#94;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#95;</p>&#95;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#96;</p>&#96;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#97;</p>&#97;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#98;</p>&#98;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#99;</p>&#99;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#100;</p>&#100;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#101;</p>&#101;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#102;</p>&#102;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#103;</p>&#103;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#104;</p>&#104;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#105;</p>&#105;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#106;</p>&#106;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#107;</p>&#107;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#108;</p>&#108;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#109;</p>&#109;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#110;</p>&#110;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#111;</p>&#111;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#112;</p>&#112;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#113;</p>&#113;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#114;</p>&#114;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#115;</p>&#115;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#116;</p>&#116;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#117;</p>&#117;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#118;</p>&#118;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#119;</p>&#119;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#120;</p>&#120;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#121;</p>&#121;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#122;</p>&#122;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#123;</p>&#123;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#124;</p>&#124;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#125;</p>&#125;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#126;</p>&#126;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#160;</p>&#160;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#161;</p>&#161;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#162;</p>&#162;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#163;</p>&#163;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#164;</p>&#164;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#165;</p>&#165;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#166;</p>&#166;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#167;</p>&#167;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#168;</p>&#168;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#169;</p>&#169;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#170;</p>&#170;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#171;</p>&#171;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#172;</p>&#172;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#173;</p>&#173;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#174;</p>&#174;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#175;</p>&#175;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#176;</p>&#176;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#177;</p>&#177;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#178;</p>&#178;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#179;</p>&#179;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#180;</p>&#180;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#181;</p>&#181;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#182;</p>&#182;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#183;</p>&#183;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#184;</p>&#184;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#185;</p>&#185;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#186;</p>&#186;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#187;</p>&#187;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#188;</p>&#188;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#189;</p>&#189;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#190;</p>&#190;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#191;</p>&#191;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#192;</p>&#192;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#193;</p>&#193;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#194;</p>&#194;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#195;</p>&#195;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#196;</p>&#196;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#197;</p>&#197;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#198;</p>&#198;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#199;</p>&#199;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#200;</p>&#200;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#201;</p>&#201;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#202;</p>&#202;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#203;</p>&#203;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#204;</p>&#204;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#205;</p>&#205;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#206;</p>&#206;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#207;</p>&#207;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#208;</p>&#208;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#209;</p>&#209;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#210;</p>&#210;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#211;</p>&#211;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#212;</p>&#212;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#213;</p>&#213;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#214;</p>&#214;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#215;</p>&#215;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#216;</p>&#216;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#217;</p>&#217;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#218;</p>&#218;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#219;</p>&#219;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#220;</p>&#220;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#221;</p>&#221;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#222;</p>&#222;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#223;</p>&#223;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#224;</p>&#224;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#225;</p>&#225;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#226;</p>&#226;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#227;</p>&#227;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#228;</p>&#228;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#229;</p>&#229;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#230;</p>&#230;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#231;</p>&#231;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#232;</p>&#232;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#233;</p>&#233;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#234;</p>&#234;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#235;</p>&#235;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#236;</p>&#236;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#237;</p>&#237;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#238;</p>&#238;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#239;</p>&#239;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#240;</p>&#240;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#241;</p>&#241;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#242;</p>&#242;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#243;</p>&#243;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#244;</p>&#244;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#245;</p>&#245;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#246;</p>&#246;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#247;</p>&#247;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#248;</p>&#248;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#249;</p>&#249;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#250;</p>&#250;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#251;</p>&#251;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#252;</p>&#252;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#253;</p>&#253;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#254;</p>&#254;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#255;</p>&#255;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8192;</p>&#8192;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8193;</p>&#8193;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8194;</p>&#8194;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8195;</p>&#8195;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8196;</p>&#8196;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8197;</p>&#8197;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8198;</p>&#8198;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8199;</p>&#8199;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8200;</p>&#8200;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8201;</p>&#8201;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8202;</p>&#8202;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8208;</p>&#8208;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8209;</p>&#8209;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8210;</p>&#8210;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8211;</p>&#8211;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8212;</p>&#8212;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8216;</p>&#8216;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8217;</p>&#8217;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8218;</p>&#8218;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8220;</p>&#8220;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8221;</p>&#8221;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8222;</p>&#8222;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8226;</p>&#8226;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8239;</p>&#8239;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8249;</p>&#8249;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8250;</p>&#8250;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8287;</p>&#8287;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#9724;</p>&#9724;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\t\n\t\t\t\t</div>\n\t\t\n\t\t\n\t\t\t</div>\n\t\t</div>\n\t\t\n\t\t\n\t\t<div id=\"specs\">\n\t\t\t\n\t\t</div>\n\t\n\t\t<div id=\"installing\">\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"grid7 firstcol\">\n\t\t\t\t\t<h1>Installing Webfonts</h1>\n\t\t\t\t\t\n\t\t\t\t\t<p>Webfonts are supported by all major browser platforms but not all in the same way. There are currently four different font formats that must be included in order to target all browsers. This includes TTF, WOFF, EOT and SVG.</p>\n\t\t\t\t\t\n\t\t\t\t\t<h2>1. Upload your webfonts</h2>\n\t\t\t\t\t<p>You must upload your webfont kit to your website. They should be in or near the same directory as your CSS files.</p>\n\t\t\t\t\t\n\t\t\t\t\t<h2>2. Include the webfont stylesheet</h2>\n\t\t\t\t\t<p>A special CSS @font-face declaration helps the various browsers select the appropriate font it needs without causing you a bunch of headaches. Learn more about this syntax by reading the <a href=\"https://www.fontspring.com/blog/further-hardening-of-the-bulletproof-syntax\">Fontspring blog post</a> about it. The code for it is as follows:</p>\n\n\n<code>\n@font-face{ \n\tfont-family: 'MyWebFont';\n\tsrc: url('WebFont.eot');\n\tsrc: url('WebFont.eot?#iefix') format('embedded-opentype'),\n\t     url('WebFont.woff') format('woff'),\n\t     url('WebFont.ttf') format('truetype'),\n\t     url('WebFont.svg#webfont') format('svg');\n}\n</code>\n\n\t<p>We've already gone ahead and generated the code for you. All you have to do is link to the stylesheet in your HTML, like this:</p>\n\t<code>&lt;link rel=&quot;stylesheet&quot; href=&quot;stylesheet.css&quot; type=&quot;text/css&quot; charset=&quot;utf-8&quot; /&gt;</code>\n\n\t\t\t\t\t<h2>3. Modify your own stylesheet</h2>\n\t\t\t\t\t<p>To take advantage of your new fonts, you must tell your stylesheet to use them. Look at the original @font-face declaration above and find the property called \"font-family.\" The name linked there will be what you use to reference the font. Prepend that webfont name to the font stack in the \"font-family\" property, inside the selector you want to change. For example:</p>\n<code>p { font-family: 'WebFont', Arial, sans-serif; }</code>\n\n<h2>4. Test</h2>\n<p>Getting webfonts to work cross-browser <em>can</em> be tricky. Use the information in the sidebar to help you if you find that fonts aren't loading in a particular browser.</p>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"grid5 sidebar\">\n\t\t\t\t\t<div class=\"box\">\n\t\t\t\t\t\t<h2>Troubleshooting<br />Font-Face Problems</h2>\n\t\t\t\t\t\t<p>Having trouble getting your webfonts to load in your new website? Here are some tips to sort out what might be the problem.</p>\n\n\t\t\t\t\t\t<h3>Fonts not showing in any browser</h3>\n\n\t\t\t\t\t\t<p>This sounds like you need to work on the plumbing. You either did not upload the fonts to the correct directory, or you did not link the fonts properly in the CSS. If you've confirmed that all this is correct and you still have a problem, take a look at your .htaccess file and see if requests are getting intercepted.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in iPhone or iPad</h3>\n\n\t\t\t\t\t\t<p>The most common problem here is that you are serving the fonts from an IIS server. IIS refuses to serve files that have unknown MIME types. If that is the case, you must set the MIME type for SVG to \"image/svg+xml\" in the server settings. Follow these instructions from Microsoft if you need help.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in Firefox</h3>\n\n\t\t\t\t\t\t<p>The primary reason for this failure? You are still using a version Firefox older than 3.5. So upgrade already! If that isn't it, then you are very likely serving fonts from a different domain. Firefox requires that all font assets be served from the same domain. Lastly it is possible that you need to add WOFF to your list of MIME types (if you are serving via IIS.)</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in IE</h3>\n\n\t\t\t\t\t\t<p>Are you looking at Internet Explorer on an actual Windows machine or are you cheating by using a service like Adobe BrowserLab? Many of these screenshot services do not render @font-face for IE. Best to test it on a real machine.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in IE9</h3>\n\n\t\t\t\t\t\t<p>IE9, like Firefox, requires that fonts be served from the same domain as the website. Make sure that is the case.</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\n\t\t</div>\n\t\n\t</div>\n\t<div id=\"footer\">\n\t\t<p>&copy;2010-2011 Font Squirrel. All rights reserved.</p>\n\t</div>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-finished/original-font-files/webfontkit-20160419-074110/specimen_files/grid_12-825-55-15.css",
    "content": "/*Notes about grid:\nColumns:      12\nGrid Width:   825px\nColumn Width: 55px\nGutter Width: 15px\n-------------------------------*/\n \n \n \n.section \t\t{margin-bottom: 18px;\n}\n.section:after\t{content: \".\";display: block;height: 0;clear: both;visibility: hidden;}\n.section \t\t{*zoom: 1;}\n \n.section .firstcolumn,\n.section .firstcol {margin-left: 0;}\n \n \n/* Border on left hand side of a column. */\n.border {\n  padding-left: 7px;\n  margin-left: 7px;\n  border-left: 1px solid #eee;\n}\n \n/* Border with more whitespace, spans one column. */\n.colborder {\n    padding-left: 42px;\n  margin-left: 42px;\n  border-left: 1px solid #eee;\n}\n \n\n \n/* The Grid Classes */\n.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12\n{margin-left: 15px;float: left;display: inline; overflow: hidden;}\n \n \n.width1, .grid1, .span-1 {width: 55px;}\n.width1_2cols,.grid1_2cols {width: 20px;}\n.width1_3cols,.grid1_3cols  {width: 8px;}\n.width1_4cols,.grid1_4cols  {width: 2px;}\n.input_width1 {width: 49px;}\n \n.width2, .grid2, .span-2 {width: 125px;}\n.width2_3cols,.grid2_3cols  {width: 31px;}\n.width2_4cols,.grid2_4cols  {width: 20px;}\n.input_width2 {width: 119px;}\n \n.width3, .grid3, .span-3 {width: 195px;}\n.width3_2cols,.grid3_2cols {width: 90px;}\n.width3_4cols,.grid3_4cols  {width: 37px;}\n.input_width3 {width: 189px;}\n \n.width4, .grid4, .span-4 {width: 265px;}\n.width4_3cols,.grid4_3cols  {width: 78px;}\n.input_width4 {width: 259px;}\n \n.width5, .grid5, .span-5 {width: 335px;}\n.width5_2cols,.grid5_2cols {width: 160px;}\n.width5_3cols,.grid5_3cols  {width: 101px;}\n.width5_4cols,.grid5_4cols  {width: 72px;}\n.input_width5 {width: 329px;}\n \n.width6, .grid6, .span-6 {width: 405px;}\n.width6_4cols,.grid6_4cols  {width: 90px;}\n.input_width6 {width: 399px;}\n \n.width7, .grid7, .span-7 {width: 475px;}\n.width7_2cols,.grid7_2cols {width: 230px;}\n.width7_3cols,.grid7_3cols  {width: 148px;}\n.width7_4cols,.grid7_4cols  {width: 107px;}\n.input_width7 {width: 469px;}\n \n.width8, .grid8, .span-8 {width: 545px;}\n.width8_3cols,.grid8_3cols  {width: 171px;}\n.input_width8 {width: 539px;}\n \n.width9, .grid9, .span-9 {width: 615px;}\n.width9_2cols,.grid9_2cols {width: 300px;}\n.width9_4cols,.grid9_4cols  {width: 142px;}\n.input_width9 {width: 609px;}\n \n.width10, .grid10, .span-10 {width: 685px;}\n.width10_3cols,.grid10_3cols  {width: 218px;}\n.width10_4cols,.grid10_4cols  {width: 160px;}\n.input_width10 {width: 679px;}\n \n.width11, .grid11, .span-11 {width: 755px;}\n.width11_2cols,.grid11_2cols {width: 370px;}\n.width11_3cols,.grid11_3cols  {width: 241px;}\n.width11_4cols,.grid11_4cols  {width: 177px;}\n.input_width11 {width: 749px;}\n \n.width12, .grid12, .span-12 {width: 825px;}\n.input_width12 {width: 819px;}\n \n/* Subdivided grid spaces */\n.emptycols_left1, .prepend-1 {padding-left: 70px;}\n.emptycols_right1, .append-1 {padding-right: 70px;}\n.emptycols_left2, .prepend-2 {padding-left: 140px;}\n.emptycols_right2, .append-2 {padding-right: 140px;}\n.emptycols_left3, .prepend-3 {padding-left: 210px;}\n.emptycols_right3, .append-3 {padding-right: 210px;}\n.emptycols_left4, .prepend-4 {padding-left: 280px;}\n.emptycols_right4, .append-4 {padding-right: 280px;}\n.emptycols_left5, .prepend-5 {padding-left: 350px;}\n.emptycols_right5, .append-5 {padding-right: 350px;}\n.emptycols_left6, .prepend-6 {padding-left: 420px;}\n.emptycols_right6, .append-6 {padding-right: 420px;}\n.emptycols_left7, .prepend-7 {padding-left: 490px;}\n.emptycols_right7, .append-7 {padding-right: 490px;}\n.emptycols_left8, .prepend-8 {padding-left: 560px;}\n.emptycols_right8, .append-8 {padding-right: 560px;}\n.emptycols_left9, .prepend-9 {padding-left: 630px;}\n.emptycols_right9, .append-9 {padding-right: 630px;}\n.emptycols_left10, .prepend-10 {padding-left: 700px;}\n.emptycols_right10, .append-10 {padding-right: 700px;}\n.emptycols_left11, .prepend-11 {padding-left: 770px;}\n.emptycols_right11, .append-11 {padding-right: 770px;}\n.pull-1 {margin-left: -70px;}\n.push-1 {margin-right: -70px;margin-left: 18px;float: right;}\n.pull-2 {margin-left: -140px;}\n.push-2 {margin-right: -140px;margin-left: 18px;float: right;}\n.pull-3 {margin-left: -210px;}\n.push-3 {margin-right: -210px;margin-left: 18px;float: right;}\n.pull-4 {margin-left: -280px;}\n.push-4 {margin-right: -280px;margin-left: 18px;float: right;}"
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-finished/original-font-files/webfontkit-20160419-074110/specimen_files/specimen_stylesheet.css",
    "content": "@import url('grid_12-825-55-15.css');\n\n/*  \n\tCSS Reset by Eric Meyer - Released under Public Domain\n    http://meyerweb.com/eric/tools/css/reset/\n*/\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, font, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center, dl, dt, dd, ol, ul, li,\nfieldset, form, label, legend, table, \ncaption, tbody, tfoot, thead, tr, th, td \n                  {margin: 0;padding: 0;border: 0;outline: 0;\n                  font-size: 100%;vertical-align: baseline;\n                  background: transparent;}\nbody              {line-height: 1;}\nol, ul            {list-style: none;}\nblockquote, q     {quotes: none;}\nblockquote:before, blockquote:after,\nq:before, q:after {content: '';\tcontent: none;}\n:focus            {outline: 0;}\nins               {text-decoration: none;}\ndel               {text-decoration: line-through;}\ntable             {border-collapse: collapse;border-spacing: 0;}\n\n\n\n\nbody {\n\tcolor: #000;\n\tbackground-color: #dcdcdc;\n}\n\na {\n\ttext-decoration: none;\n\tcolor: #1883ba;\n}\n\nh1{\n\tfont-size: 32px;\n\tfont-weight: normal;\n\tfont-style: normal;\n\tmargin-bottom: 18px;\n}\n\nh2{\n\tfont-size: 18px;\n}\n\n#container {\n\twidth: 865px;\n\tmargin: 0px auto;\n}\n\n\n#header {\n\tpadding: 20px;\n\tfont-size: 36px;\n\tbackground-color: #000;\n\tcolor: #fff;\n}\n\n#header span {\n\tcolor: #666;\n}\n#main_content {\n\tbackground-color: #fff;\n\tpadding: 60px 20px 20px;\n}\n\n\n#footer p {\n\tmargin: 0;\n\tpadding-top: 10px;\n\tpadding-bottom: 50px;\n\tcolor: #333;\n\tfont: 10px Arial, sans-serif;\n}\n\n.tabs {\n\twidth: 100%;\n\theight: 31px;\n\tbackground-color: #444;\n}\n.tabs li {\n\tfloat:  left;\n\tmargin: 0;\n\toverflow: hidden;\n\tbackground-color: #444;\n}\n.tabs li a {\n\tdisplay: block;\n\tcolor: #fff;\n\ttext-decoration: none;\n\tfont: bold 11px/11px 'Arial';\n\ttext-transform: uppercase;\n\tpadding: 10px 15px;\n\tborder-right: 1px solid #fff;\n}\n\n.tabs li a:hover {\n\t\tbackground-color: #00b3ff;\n\n}\n\n.tabs li.active a {\n\tcolor:  #000;\n\tbackground-color: #fff;\n}\n\n\n\ndiv.huge {\n\t\n\tfont-size: 300px;\n\tline-height: 1em;\n\tpadding: 0;\n\tletter-spacing: -.02em;\n\toverflow: hidden;\n}\ndiv.glyph_range {\n\tfont-size: 72px;\n\tline-height: 1.1em;\n}\n\n.size10{ font-size: 10px; }\n.size11{ font-size: 11px; }\n.size12{ font-size: 12px; }\n.size13{ font-size: 13px; }\n.size14{ font-size: 14px; }\n.size16{ font-size: 16px; }\n.size18{ font-size: 18px; }\n.size20{ font-size: 20px; }\n.size24{ font-size: 24px; }\n.size30{ font-size: 30px; }\n.size36{ font-size: 36px; }\n.size48{ font-size: 48px; }\n.size60{ font-size: 60px; }\n.size72{ font-size: 72px; }\n.size90{ font-size: 90px; }\n\n\n.psample_row1 {\theight: 120px;}\n.psample_row1 {\theight: 120px;}\n.psample_row2 {\theight: 160px;}\n.psample_row3 {\theight: 160px;}\n.psample_row4 {\theight: 160px;}\n\n.psample {\n\toverflow: hidden;\n\tposition: relative;\n}\n.psample p {\n\tline-height: 1.3em;\n\tdisplay: block;\n\toverflow: hidden;\n\tmargin: 0;\n}\n\n.psample span {\n\tmargin-right: .5em;\n}\n\n.white_blend {\n\twidth: 100%;\n\theight: 61px;\n\tbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==);\n\tposition: absolute;\n\tbottom: 0;\n}\n.black_blend {\n\twidth: 100%;\n\theight: 61px;\n\tbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC);\n\tposition: absolute;\n\tbottom: 0;\n}\n.fullreverse {\n\tbackground:  #000 !important;\n\tcolor:  #fff !important;\n\tmargin-left: -20px;\n\tpadding-left: 20px;\n\tmargin-right: -20px;\n\tpadding-right: 20px;\n\tpadding: 20px;\n\tmargin-bottom:0;\n}\n\n\n.sample_table td {\n\tpadding-top: 3px;\n\tpadding-bottom:5px;\n\tpadding-left: 5px;\n\tvertical-align: middle;\n\tline-height: 1.2em;\n}\n\n.sample_table td:first-child {\n\tbackground-color: #eee;\n\ttext-align: right;\n\tpadding-right: 5px;\n\tpadding-left: 0;\n\tpadding: 5px;\n\tfont: 11px/12px \"Courier New\", Courier, mono;\n}\n\ncode {\n\twhite-space: pre;\n\tbackground-color: #eee;\n\tdisplay: block;\n\tpadding: 10px;\n\tmargin-bottom: 18px;\n\toverflow: auto;\n}\n\n\n.bottom,.last \t{margin-bottom:0 !important; padding-bottom:0 !important;}\n\n.box  { \n  padding: 18px; \n  margin-bottom: 18px; \n  background: #eee; \n}\n\n.reverse,.reversed { background:  #000 !important;color:  #fff !important; border: none !important;}\n\n#bodycomparison {\n\tposition: relative;\n\toverflow: hidden;\n\tfont-size: 72px;\n\theight: 90px;\n\twhite-space: nowrap;\n}\n\n#bodycomparison div{\n\tfont-size: 72px;\n\tline-height: 90px;\n\tdisplay: inline;\n\tmargin: 0 15px 0 0;\n\tpadding: 0;\n}\n\n#bodycomparison div span{\n\tfont: 10px Arial;\n\tposition: absolute;\n\tleft: 0;\n}\n#xheight {\n\tfloat: none;\n\tposition: absolute;\n\tcolor: #d9f3ff;\n\tfont-size: 72px;\n\tline-height: 90px;\n}\n\n.fontbody {\n position: relative;\n}\n.arialbody{\n\tfont-family: Arial;\n\tposition: relative;\n}\n.verdanabody{\n\tfont-family: Verdana;\n\tposition: relative;\n}\n.georgiabody{\n\tfont-family: Georgia;\n\tposition: relative;\n}\n\n/* @group Layout page\n */\n\n#layout h1 {\n\tfont-size: 36px;\n\tline-height: 42px;\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n\n#layout h2 {\n\tfont-size: 24px;\n\tline-height: 23px;\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n\n#layout h3 {\n\tfont-size: 22px;\n\tline-height: 1.4em;\n\tmargin-top: 1em;\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n\n\n#layout p.byline {\n\tfont-size: 12px;\n\tmargin-top: 18px;\n\tline-height: 12px;\n\tmargin-bottom: 0;\n}\n#layout p {\n\tfont-size: 14px;\n\tline-height: 21px;\n\tmargin-bottom: .5em;\n}\n\n#layout p.large{\n\tfont-size: 18px;\n\tline-height: 26px;\n}\n\n#layout .sidebar p{\n\tfont-size: 12px;\n\tline-height: 1.4em;\n}\n\n#layout p.caption {\n\tfont-size: 10px;\n\tmargin-top: -16px;\n\tmargin-bottom: 18px;\n}\n\n/* @end */\n\n/* @group Glyphs */\n\n#glyph_chart div{\n\tbackground-color: #d9f3ff;\n\tcolor: black;\n\tfloat: left;\n\tfont-size: 36px;\n\theight: 1.2em;\n\tline-height: 1.2em;\n\tmargin-bottom: 1px;\n\tmargin-right: 1px;\n\ttext-align: center;\n\twidth: 1.2em;\n\tposition: relative;\n\tpadding: .6em .2em .2em;\n}\n\n#glyph_chart div p {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\tdisplay: block;\n\ttext-align: center;\n\tfont: bold 9px Arial, sans-serif;\n\tbackground-color: #3a768f;\n\twidth: 100%;\n\tcolor: #fff;\n\tpadding: 2px 0;\n}\n\n\n#glyphs h1 {\n\tfont-family: Arial, sans-serif;\n}\n/* @end */\n\n/* @group Installing */\n\n#installing {\n\tfont: 13px Arial, sans-serif;\n}\n\n#installing p,\n#glyphs p{\n\tline-height: 1.2em;\n\tmargin-bottom: 18px;\n\tfont: 13px Arial, sans-serif;\n}\n\n\n\n#installing h3{\n\tfont-size: 15px;\n\tmargin-top: 18px;\n}\n\n/* @end */\n\n#rendering h1 {\n\tfont-family: Arial, sans-serif;\n}\n.render_table td {\n\tfont: 11px \"Courier New\", Courier, mono;\n\tvertical-align: middle;\n}\n\n\n"
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-finished/original-font-files/webfontkit-20160419-074110/stylesheet.css",
    "content": "/* Generated by Font Squirrel (https://www.fontsquirrel.com) on April 19, 2016 */\n\n\n\n@font-face {\n    font-family: 'josefin_slabbold';\n    src: url('josefinslab-bold-webfont.eot');\n    src: url('josefinslab-bold-webfont.eot?#iefix') format('embedded-opentype'),\n         url('josefinslab-bold-webfont.woff2') format('woff2'),\n         url('josefinslab-bold-webfont.woff') format('woff'),\n         url('josefinslab-bold-webfont.ttf') format('truetype'),\n         url('josefinslab-bold-webfont.svg#josefin_slabbold') format('svg');\n    font-weight: normal;\n    font-style: normal;\n\n}"
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-finished/style.css",
    "content": "/* General setup */\n\n* {\n  box-sizing: border-box;\n}\n\nbody {\n  margin: 0 auto;\n  min-width: 1000px;\n  max-width: 1400px;\n}\n\n/* Layout */\n\nsection {\n  float: left;\n  width: 50%;\n}\n\naside {\n  float: left;\n  width: 30%;\n}\n\nnav {\n  float: left;\n  width: 20%;\n}\n\nfooter {\n  clear: both;\n}\n\nheader, section, aside, nav, footer {\n  padding: 20px;\n}\n\n/* header and footer */\n\nheader, footer {\n  border-top: 5px solid #a66;\n  border-bottom: 5px solid #a66;\n}\n\n/* WRITE YOUR CODE BELOW HERE */\n\n/* font imports */\n\n/*\n\nLovato light font obtained from fontspring.com,\noriginally created by Philatype\nSee https://www.fontspring.com/fonts/philatype/lovato\n\nJosefin slab bold obtained from fontsquirrel.com,\noriginally created by Typemade\nSee https://www.fontsquirrel.com/fonts/josefin-slab\n\n*/\n\n@font-face {\n    font-family: 'lovatolight';\n    src: url('fonts/Lovato-Light-webfont.eot');\n    src: url('fonts/Lovato-Light-webfont.eot?#iefix') format('embedded-opentype'),\n         url('fonts/Lovato-Light-webfont.woff2') format('woff2'),\n         url('fonts/Lovato-Light-webfont.woff') format('woff'),\n         url('fonts/Lovato-Light-webfont.ttf') format('truetype'),\n         url('fonts/Lovato-Light-webfont.svg#lovatolight') format('svg');\n    font-weight: normal;\n    font-style: normal;\n}\n\n@font-face {\n    font-family: 'josefin_slabbold';\n    src: url('fonts/josefinslab-bold-webfont.eot');\n    src: url('fonts/josefinslab-bold-webfont.eot?#iefix') format('embedded-opentype'),\n         url('fonts/josefinslab-bold-webfont.woff2') format('woff2'),\n         url('fonts/josefinslab-bold-webfont.woff') format('woff'),\n         url('fonts/josefinslab-bold-webfont.ttf') format('truetype'),\n         url('fonts/josefinslab-bold-webfont.svg#josefin_slabbold') format('svg');\n    font-weight: normal;\n    font-style: normal;\n}\n\n/* typography stuff */\n\nhtml {\n  font-family: lovatolight, serif;\n  font-size: 10px;\n}\n\nh1, h2 {\n  font-family: josefin_slabbold, sans-serif;\n  letter-spacing: 2px;\n}\n\nh1 {\n  font-size: 5rem;\n  text-align: center;\n}\n\nh2 {\n  font-size: 3.2rem;\n}\n\nsection h2 + p {\n  text-indent: 20px;\n}\n\np, li {\n  font-size: 1.6rem;\n  line-height: 1.5;\n  letter-spacing: 0.5px;\n  word-spacing: 3px;\n}\n\n/* Link styling */\n\na {\n  outline: none;\n}\n\na[href*=\"http\"] {\n  padding-right: 19px;\n  background: url(external-link-52.png) no-repeat 100% 0;\n  background-size: 16px 16px;\n}\n\na:link, a:visited {\n  color: #a66;\n}\n\na:focus, a:hover {\n  text-decoration: none;\n}\n\na:active {\n  color: transparent;\n  text-shadow: 0px 0px 1px #f00,\n               0px 0px 2px #f00,\n               0px 0px 3px black,\n               0px 0px 4px black;\n}\n\n/* lists: extra margin top and bottom to make it\nalways have the same spacing as with paragraphs */\n\nul, ol {\n  margin: 1.6rem 0;\n}\n\nul {\n  list-style-type: square;\n}\n\nol {\n  list-style-type: lower-latin;\n}\n\n/* nav menu */\n\nnav ul {\n  padding-left: 0;\n  margin-top: 0.8rem;\n}\n\nnav li {\n  list-style-type: none;\n  margin-bottom: 2rem;\n}\n\nnav li a {\n  text-decoration: none;\n  display: inline-block;\n  width: 100%;\n  line-height: 3;\n  text-align: center;\n  font-size: 2.5rem;\n  border: 1px solid #a66;\n}\n\nnav li a:focus, nav li a:hover {\n  color: white;\n  background: #a66;\n}\n\nnav li a:active {\n  color: white;\n  background: black;\n}\n"
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-start/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>St Huxley's Community College</title>\n    <link href=\"style.css\" type=\"text/css\" rel=\"stylesheet\">\n  </head>\n  <body>\n\n  <header>\n    <h1>St Huxley's Community College</h1>\n  </header>\n\n  <section>\n      <h2>Brave new world</h2>\n\n      <p>It's a brave new world out there. Our children are being put in increasing more competitive situations, both during recreation, and as they start to move into the adult world of <a href=\"https://en.wikipedia.org/wiki/Examination\">examinations</a>, <a href=\"https://en.wikipedia.org/wiki/Jobs\">jobs</a>, <a href=\"https://en.wikipedia.org/wiki/Career\">careers</a>, and other life choices. Having the wrong mindset, becoming <a href=\"https://en.wikipedia.org/wiki/Emotion\">too emotional</a>, or making the wrong choices can contribute to them experiencing difficulty in taking their rightful place in today's ideal society.</p>\n\n      <p>As concerned parents, guardians or carers, you will no doubt want to give your children the best possible start in life — and you've come to the right place.</p>\n\n      <h2>The best start in life</h2>\n\n      <p>At St. Huxley's, we pride ourselves in not only giving our students a top quality education, but also giving them the societal and emotional intelligence they need to win big in the coming utopia. We not only excel at subjects such as genetics, data mining, and chemistry, but we also include compulsory lessons in:</p>\n\n      <ul>\n        <li>Emotional control</li>\n        <li>Judgement</li>\n        <li>Assertion</li>\n        <li>Focus and resolve</li>\n      </ul>\n\n      <p>If you are interested, then you next steps will likely be to:</p>\n      \n      <ol>\n        <li><a href=\"#\">Call us</a> for more information</li>\n        <li><a href=\"#\">Ask for a brochure</a>, which includes signup form</li>\n        <li><a href=\"#\">Book a visit</a>!</li>\n      </ol>\n  </section>\n\n  <aside>\n\n    <h2>Top course choices</h2>\n\n    <ul>\n      <li><a href=\"#\">Genetic engineering</a></li>\n      <li><a href=\"#\">Genetic mutation</a></li>\n      <li><a href=\"#\">Organic Chemistry</a></li>\n      <li><a href=\"#\">Pharmaceuticals</a></li>\n      <li><a href=\"#\">Biochemistry with behaviour</a></li>\n      <li><a href=\"#\">Pure biochemistry</a></li>\n      <li><a href=\"#\">Data mining</a></li>\n      <li><a href=\"#\">Computer security</a></li>\n      <li><a href=\"#\">Bioinformatics</a></li>\n      <li><a href=\"#\">Cybernetics</a></li>\n    </ul>\n\n    <p><a href=\"#\">See more</a></p>\n\n  </aside>\n\n  <nav>\n\n    <ul>\n      <li><a href=\"#\">Home</a></li>\n      <li><a href=\"#\">Finding us</a></li>\n      <li><a href=\"#\">Courses</a></li>\n      <li><a href=\"#\">Staff</a></li>\n      <li><a href=\"#\">Media</a></li>\n      <li><a href=\"#\">Prospectus</a></li>\n    </ul>\n\n  </nav>\n\n  <footer>\n\n    <p>&copy; 2016 St Huxley's Community College</p>\n\n  </footer>\n\n  </body>\n</html>"
  },
  {
    "path": "css/styling-text/typesetting-a-homepage-start/style.css",
    "content": "/* General setup */\n\n* {\n  box-sizing: border-box;\n}\n\nbody {\n  margin: 0 auto;\n  min-width: 1000px;\n  max-width: 1400px;\n}\n\n/* Layout */\n\nsection {\n  float: left;\n  width: 50%;\n}\n\naside {\n  float: left;\n  width: 30%;\n}\n\nnav {\n  float: left;\n  width: 20%;\n}\n\nfooter {\n  clear: both;\n}\n\nheader, section, aside, nav, footer {\n  padding: 20px;\n}\n\n/* header and footer */\n\nheader, footer {\n  border-top: 5px solid #a66;\n  border-bottom: 5px solid #a66;\n}\n\n/* WRITE YOUR CODE BELOW HERE */"
  },
  {
    "path": "css/styling-text/web-fonts/fonts/cicle_fina-demo.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en-US\" lang=\"en-US\">\n  <head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<script src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\t<script src=\"specimen_files/easytabs.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\t<link rel=\"stylesheet\" href=\"specimen_files/specimen_stylesheet.css\" type=\"text/css\" charset=\"utf-8\" />\n\t<link rel=\"stylesheet\" href=\"stylesheet.css\" type=\"text/css\" charset=\"utf-8\" />\n\n\t<style type=\"text/css\">\n\t\t\t\t\tbody{\n\t\t\t\tfont-family: 'ciclefina';\n\t\t\t\t\t\t\t}\n\t\t</style>\n\n\t<title>Cicle Fina Specimen</title>\n\t\n\t\n\t<script type=\"text/javascript\" charset=\"utf-8\">\n\t\t$(document).ready(function() {\n\t\t\t$('#container').easyTabs({defaultContent:1});\n\t\t});\n\t</script>\n  </head>\n\n<body>\n<div id=\"container\">\n\t<div id=\"header\">\n\t\tCicle Fina\t</div>\n\t<ul class=\"tabs\">\n\t\t<li><a href=\"#specimen\">Specimen</a></li>\n\t\t<li><a href=\"#layout\">Sample Layout</a></li>\n\t\t\t\t<li><a href=\"#glyphs\">Glyphs &amp; Languages</a></li>\n\t\t<li><a href=\"#installing\">Installing Webfonts</a></li>\n\t\t\n\t</ul>\n\t\n\t<div id=\"main_content\">\n\n\t\t\n\t\t\t<div id=\"specimen\">\n\t\t\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<div class=\"huge\">AaBb</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"glyph_range\">A&#x200B;B&#x200b;C&#x200b;D&#x200b;E&#x200b;F&#x200b;G&#x200b;H&#x200b;I&#x200b;J&#x200b;K&#x200b;L&#x200b;M&#x200b;N&#x200b;O&#x200b;P&#x200b;Q&#x200b;R&#x200b;S&#x200b;T&#x200b;U&#x200b;V&#x200b;W&#x200b;X&#x200b;Y&#x200b;Z&#x200b;a&#x200b;b&#x200b;c&#x200b;d&#x200b;e&#x200b;f&#x200b;g&#x200b;h&#x200b;i&#x200b;j&#x200b;k&#x200b;l&#x200b;m&#x200b;n&#x200b;o&#x200b;p&#x200b;q&#x200b;r&#x200b;s&#x200b;t&#x200b;u&#x200b;v&#x200b;w&#x200b;x&#x200b;y&#x200b;z&#x200b;1&#x200b;2&#x200b;3&#x200b;4&#x200b;5&#x200b;6&#x200b;7&#x200b;8&#x200b;9&#x200b;0&#x200b;&amp;&#x200b;.&#x200b;,&#x200b;?&#x200b;!&#x200b;&#64;&#x200b;(&#x200b;)&#x200b;#&#x200b;$&#x200b;%&#x200b;*&#x200b;+&#x200b;-&#x200b;=&#x200b;:&#x200b;;</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<table class=\"sample_table\">\n\t\t\t\t\t\t\t<tr><td>10</td><td class=\"size10\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>11</td><td class=\"size11\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>12</td><td class=\"size12\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>13</td><td class=\"size13\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>14</td><td class=\"size14\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>16</td><td class=\"size16\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>18</td><td class=\"size18\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>20</td><td class=\"size20\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>24</td><td class=\"size24\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>30</td><td class=\"size30\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>36</td><td class=\"size36\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>48</td><td class=\"size48\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>60</td><td class=\"size60\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>72</td><td class=\"size72\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>90</td><td class=\"size90\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\n\t\t\t\t</div>\n\t\t\n\t\t\n\t\t\n\t\t\t\t\t\t\t\t<div class=\"section\" id=\"bodycomparison\">\n\n\n\t\t\t\t\t\t\t\t\t\t<div id=\"xheight\">\n\t\t\t\t<div class=\"fontbody\">&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;body</div><div class=\"arialbody\">body</div><div class=\"verdanabody\">body</div><div class=\"georgiabody\">body</div></div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"fontbody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Cicle Fina</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"arialbody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Arial</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"verdanabody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Verdana</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"georgiabody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Georgia</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\n\n\n\t\t\t\t\t\t\t\t</div>\n\t\t\n\t\t\n\t\t\t\t<div class=\"section psample psample_row1\" id=\"\">\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"grid2 firstcol\">\n\t\t\t\t\t\t<p class=\"size10\"><span>10.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size11\"><span>11.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size12\"><span>12.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size13\"><span>13.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section psample psample_row2\" id=\"\">\n\t\t\t\t\t<div class=\"grid3 firstcol\">\n\t\t\t\t\t\t<p class=\"size14\"><span>14.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size16\"><span>16.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid5\">\n\t\t\t\t\t\t<p class=\"size18\"><span>18.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row3\" id=\"\">\n\t\t\t\t\t<div class=\"grid5 firstcol\">\n\t\t\t\t\t\t<p class=\"size20\"><span>20.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid7\">\n\t\t\t\t\t\t<p class=\"size24\"><span>24.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row4\" id=\"\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<p class=\"size30\"><span>30.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row1 fullreverse\">\n\t\t\t\t\t<div class=\"grid2 firstcol\">\n\t\t\t\t\t\t<p class=\"size10\"><span>10.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size11\"><span>11.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size12\"><span>12.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size13\"><span>13.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row2 fullreverse\">\n\t\t\t\t\t<div class=\"grid3 firstcol\">\n\t\t\t\t\t\t<p class=\"size14\"><span>14.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size16\"><span>16.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid5\">\n\t\t\t\t\t\t<p class=\"size18\"><span>18.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample fullreverse psample_row3\" id=\"\">\n\t\t\t\t\t<div class=\"grid5 firstcol\">\n\t\t\t\t\t\t<p class=\"size20\"><span>20.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid7\">\n\t\t\t\t\t\t<p class=\"size24\"><span>24.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample fullreverse psample_row4\" id=\"\" style=\"border-bottom: 20px #000 solid;\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<p class=\"size30\"><span>30.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<div id=\"layout\">\n\t\t\t\t\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<h1>Lorem Ipsum Dolor</h1>\n\t\t\t\t\t\t<h2>Etiam porta sem malesuada magna mollis euismod</h2>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<p class=\"byline\">By <a href=\"#link\">Aenean Lacinia</a></p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"grid8 firstcol\">\n\t\t\t\t\t\t<p class=\"large\">Donec sed odio dui. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t<h3>Pellentesque ornare sem</h3>\n\n\t\t\t\t\t\t<p>Maecenas sed diam eget risus varius blandit sit amet non magna. Maecenas faucibus mollis interdum. Donec ullamcorper nulla non metus auctor fringilla. Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam id dolor id nibh ultricies vehicula ut id elit. </p>\n\n\t\t\t\t\t\t<p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. </p>\n\n\t\t\t\t\t\t<p>Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Aenean lacinia bibendum nulla sed consectetur. </p>\n\n\t\t\t\t\t\t<p>Nullam quis risus eget urna mollis ornare vel eu leo. Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec ullamcorper nulla non metus auctor fringilla. </p>\n\n\t\t\t\t\t\t<h3>Cras mattis consectetur</h3>\n\n\t\t\t\t\t\t<p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean lacinia bibendum nulla sed consectetur. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Cras mattis consectetur purus sit amet fermentum. </p>\n\n\t\t\t\t\t\t<p>Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam quis risus eget urna mollis ornare vel eu leo. Cras mattis consectetur purus sit amet fermentum.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"grid4 sidebar\">\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class=\"box reverse\">\n\t\t\t\t\t\t\t<p class=\"last\">Nullam quis risus eget urna mollis ornare vel eu leo. Donec ullamcorper nulla non metus auctor fringilla. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. </p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<p class=\"caption\">Maecenas sed diam eget risus varius.</p>\n\n\t\t\t\t\t\t<p>Vestibulum id ligula porta felis euismod semper. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>\n\n\t\t\t\t\t\n\n\t\t\t\t\t\t<p>Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Aenean lacinia bibendum nulla sed consectetur. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean lacinia bibendum nulla sed consectetur. Nullam quis risus eget urna mollis ornare vel eu leo. </p>\n\n\t\t\t\t\t\t<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec ullamcorper nulla non metus auctor fringilla. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>\n\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t</div>\n\n\n\t\t\t\n\n\n\n\t\t<div id=\"glyphs\">\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\n\t\t\t\t<h1>Language Support</h1>\n\t\t\t\t<p>The subset of Cicle Fina in this kit supports the following languages:<br />\n\t\t\t\n\t\t\t\t\tAlbanian, Basque, Chamorro, English, Faroese, Galician, German, Icelandic, Italian, Spanish\t\t\t\t</p>\n\t\t\t\t<h1>Glyph Chart</h1>\n\t\t\t\t<p>The subset of Cicle Fina in this kit includes all the glyphs listed below. Unicode entities are included above each glyph to help you insert individual characters into your layout.</p>\n\t\t\t\t<div id=\"glyph_chart\">\n\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#32;</p>&#32;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#33;</p>&#33;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#34;</p>&#34;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#35;</p>&#35;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#36;</p>&#36;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#38;</p>&#38;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#39;</p>&#39;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#40;</p>&#40;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#41;</p>&#41;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#42;</p>&#42;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#43;</p>&#43;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#44;</p>&#44;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#45;</p>&#45;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#46;</p>&#46;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#47;</p>&#47;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#48;</p>&#48;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#49;</p>&#49;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#50;</p>&#50;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#51;</p>&#51;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#52;</p>&#52;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#53;</p>&#53;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#54;</p>&#54;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#55;</p>&#55;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#56;</p>&#56;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#57;</p>&#57;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#58;</p>&#58;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#59;</p>&#59;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#60;</p>&#60;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#61;</p>&#61;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#62;</p>&#62;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#63;</p>&#63;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#64;</p>&#64;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#65;</p>&#65;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#66;</p>&#66;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#67;</p>&#67;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#68;</p>&#68;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#69;</p>&#69;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#70;</p>&#70;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#71;</p>&#71;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#72;</p>&#72;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#73;</p>&#73;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#74;</p>&#74;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#75;</p>&#75;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#76;</p>&#76;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#77;</p>&#77;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#78;</p>&#78;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#79;</p>&#79;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#80;</p>&#80;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#81;</p>&#81;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#82;</p>&#82;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#83;</p>&#83;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#84;</p>&#84;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#85;</p>&#85;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#86;</p>&#86;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#87;</p>&#87;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#88;</p>&#88;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#89;</p>&#89;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#90;</p>&#90;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#91;</p>&#91;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#92;</p>&#92;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#93;</p>&#93;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#94;</p>&#94;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#95;</p>&#95;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#96;</p>&#96;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#97;</p>&#97;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#98;</p>&#98;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#99;</p>&#99;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#100;</p>&#100;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#101;</p>&#101;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#102;</p>&#102;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#103;</p>&#103;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#104;</p>&#104;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#105;</p>&#105;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#106;</p>&#106;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#107;</p>&#107;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#108;</p>&#108;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#109;</p>&#109;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#110;</p>&#110;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#111;</p>&#111;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#112;</p>&#112;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#113;</p>&#113;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#114;</p>&#114;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#115;</p>&#115;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#116;</p>&#116;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#117;</p>&#117;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#118;</p>&#118;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#119;</p>&#119;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#120;</p>&#120;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#121;</p>&#121;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#122;</p>&#122;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#123;</p>&#123;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#124;</p>&#124;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#125;</p>&#125;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#126;</p>&#126;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#160;</p>&#160;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#161;</p>&#161;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#162;</p>&#162;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#163;</p>&#163;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#165;</p>&#165;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#166;</p>&#166;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#167;</p>&#167;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#168;</p>&#168;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#170;</p>&#170;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#171;</p>&#171;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#172;</p>&#172;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#173;</p>&#173;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#176;</p>&#176;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#177;</p>&#177;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#178;</p>&#178;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#179;</p>&#179;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#180;</p>&#180;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#182;</p>&#182;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#183;</p>&#183;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#185;</p>&#185;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#186;</p>&#186;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#187;</p>&#187;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#188;</p>&#188;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#189;</p>&#189;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#190;</p>&#190;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#191;</p>&#191;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#192;</p>&#192;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#193;</p>&#193;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#194;</p>&#194;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#195;</p>&#195;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#196;</p>&#196;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#198;</p>&#198;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#199;</p>&#199;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#200;</p>&#200;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#201;</p>&#201;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#203;</p>&#203;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#204;</p>&#204;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#205;</p>&#205;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#206;</p>&#206;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#207;</p>&#207;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#208;</p>&#208;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#209;</p>&#209;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#210;</p>&#210;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#211;</p>&#211;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#213;</p>&#213;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#214;</p>&#214;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#215;</p>&#215;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#216;</p>&#216;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#217;</p>&#217;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#218;</p>&#218;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#220;</p>&#220;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#221;</p>&#221;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#222;</p>&#222;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#223;</p>&#223;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#224;</p>&#224;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#225;</p>&#225;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#226;</p>&#226;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#227;</p>&#227;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#228;</p>&#228;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#230;</p>&#230;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#231;</p>&#231;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#232;</p>&#232;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#233;</p>&#233;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#234;</p>&#234;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#235;</p>&#235;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#236;</p>&#236;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#237;</p>&#237;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#238;</p>&#238;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#239;</p>&#239;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#240;</p>&#240;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#241;</p>&#241;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#242;</p>&#242;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#243;</p>&#243;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#244;</p>&#244;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#245;</p>&#245;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#246;</p>&#246;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#247;</p>&#247;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#248;</p>&#248;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#249;</p>&#249;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#250;</p>&#250;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#251;</p>&#251;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#252;</p>&#252;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#253;</p>&#253;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#254;</p>&#254;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#255;</p>&#255;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#338;</p>&#338;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#339;</p>&#339;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#376;</p>&#376;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#710;</p>&#710;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#732;</p>&#732;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8192;</p>&#8192;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8193;</p>&#8193;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8194;</p>&#8194;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8195;</p>&#8195;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8196;</p>&#8196;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8197;</p>&#8197;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8198;</p>&#8198;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8199;</p>&#8199;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8200;</p>&#8200;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8201;</p>&#8201;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8202;</p>&#8202;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8208;</p>&#8208;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8209;</p>&#8209;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8210;</p>&#8210;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8211;</p>&#8211;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8212;</p>&#8212;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8216;</p>&#8216;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8217;</p>&#8217;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8218;</p>&#8218;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8220;</p>&#8220;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8221;</p>&#8221;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8222;</p>&#8222;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8226;</p>&#8226;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8230;</p>&#8230;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8239;</p>&#8239;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8249;</p>&#8249;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8250;</p>&#8250;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8287;</p>&#8287;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8364;</p>&#8364;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8482;</p>&#8482;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#9724;</p>&#9724;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#64257;</p>&#64257;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#64258;</p>&#64258;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\t\n\t\t\t\t</div>\n\t\t\n\t\t\n\t\t\t</div>\n\t\t</div>\n\t\t\n\t\t\n\t\t<div id=\"specs\">\n\t\t\t\n\t\t</div>\n\t\n\t\t<div id=\"installing\">\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"grid7 firstcol\">\n\t\t\t\t\t<h1>Installing Webfonts</h1>\n\t\t\t\t\t\n\t\t\t\t\t<p>Webfonts are supported by all major browser platforms but not all in the same way. There are currently four different font formats that must be included in order to target all browsers. This includes TTF, WOFF, EOT and SVG.</p>\n\t\t\t\t\t\n\t\t\t\t\t<h2>1. Upload your webfonts</h2>\n\t\t\t\t\t<p>You must upload your webfont kit to your website. They should be in or near the same directory as your CSS files.</p>\n\t\t\t\t\t\n\t\t\t\t\t<h2>2. Include the webfont stylesheet</h2>\n\t\t\t\t\t<p>A special CSS @font-face declaration helps the various browsers select the appropriate font it needs without causing you a bunch of headaches. Learn more about this syntax by reading the <a href=\"https://www.fontspring.com/blog/further-hardening-of-the-bulletproof-syntax\">Fontspring blog post</a> about it. The code for it is as follows:</p>\n\n\n<code>\n@font-face{ \n\tfont-family: 'MyWebFont';\n\tsrc: url('WebFont.eot');\n\tsrc: url('WebFont.eot?#iefix') format('embedded-opentype'),\n\t     url('WebFont.woff') format('woff'),\n\t     url('WebFont.ttf') format('truetype'),\n\t     url('WebFont.svg#webfont') format('svg');\n}\n</code>\n\n\t<p>We've already gone ahead and generated the code for you. All you have to do is link to the stylesheet in your HTML, like this:</p>\n\t<code>&lt;link rel=&quot;stylesheet&quot; href=&quot;stylesheet.css&quot; type=&quot;text/css&quot; charset=&quot;utf-8&quot; /&gt;</code>\n\n\t\t\t\t\t<h2>3. Modify your own stylesheet</h2>\n\t\t\t\t\t<p>To take advantage of your new fonts, you must tell your stylesheet to use them. Look at the original @font-face declaration above and find the property called \"font-family.\" The name linked there will be what you use to reference the font. Prepend that webfont name to the font stack in the \"font-family\" property, inside the selector you want to change. For example:</p>\n<code>p { font-family: 'WebFont', Arial, sans-serif; }</code>\n\n<h2>4. Test</h2>\n<p>Getting webfonts to work cross-browser <em>can</em> be tricky. Use the information in the sidebar to help you if you find that fonts aren't loading in a particular browser.</p>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"grid5 sidebar\">\n\t\t\t\t\t<div class=\"box\">\n\t\t\t\t\t\t<h2>Troubleshooting<br />Font-Face Problems</h2>\n\t\t\t\t\t\t<p>Having trouble getting your webfonts to load in your new website? Here are some tips to sort out what might be the problem.</p>\n\n\t\t\t\t\t\t<h3>Fonts not showing in any browser</h3>\n\n\t\t\t\t\t\t<p>This sounds like you need to work on the plumbing. You either did not upload the fonts to the correct directory, or you did not link the fonts properly in the CSS. If you've confirmed that all this is correct and you still have a problem, take a look at your .htaccess file and see if requests are getting intercepted.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in iPhone or iPad</h3>\n\n\t\t\t\t\t\t<p>The most common problem here is that you are serving the fonts from an IIS server. IIS refuses to serve files that have unknown MIME types. If that is the case, you must set the MIME type for SVG to \"image/svg+xml\" in the server settings. Follow these instructions from Microsoft if you need help.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in Firefox</h3>\n\n\t\t\t\t\t\t<p>The primary reason for this failure? You are still using a version Firefox older than 3.5. So upgrade already! If that isn't it, then you are very likely serving fonts from a different domain. Firefox requires that all font assets be served from the same domain. Lastly it is possible that you need to add WOFF to your list of MIME types (if you are serving via IIS.)</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in IE</h3>\n\n\t\t\t\t\t\t<p>Are you looking at Internet Explorer on an actual Windows machine or are you cheating by using a service like Adobe BrowserLab? Many of these screenshot services do not render @font-face for IE. Best to test it on a real machine.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in IE9</h3>\n\n\t\t\t\t\t\t<p>IE9, like Firefox, requires that fonts be served from the same domain as the website. Make sure that is the case.</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\n\t\t</div>\n\t\n\t</div>\n\t<div id=\"footer\">\n\t\t<p>&copy;2010-2011 Font Squirrel. All rights reserved.</p>\n\t</div>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "css/styling-text/web-fonts/fonts/generator_config.txt",
    "content": "# Font Squirrel Font-face Generator Configuration File\n# Upload this file to the generator to recreate the settings\n# you used to create these fonts.\n\n{\"mode\":\"optimal\",\"formats\":[\"ttf\",\"woff\",\"woff2\",\"eotz\"],\"tt_instructor\":\"default\",\"fix_gasp\":\"xy\",\"fix_vertical_metrics\":\"Y\",\"metrics_ascent\":\"\",\"metrics_descent\":\"\",\"metrics_linegap\":\"\",\"add_spaces\":\"Y\",\"add_hyphens\":\"Y\",\"fallback\":\"none\",\"fallback_custom\":\"100\",\"options_subset\":\"basic\",\"subset_custom\":\"\",\"subset_custom_range\":\"\",\"subset_ot_features_list\":\"\",\"css_stylesheet\":\"stylesheet.css\",\"filename_suffix\":\"-webfont\",\"emsquare\":\"2048\",\"spacing_adjustment\":\"0\"}"
  },
  {
    "path": "css/styling-text/web-fonts/fonts/specimen_files/grid_12-825-55-15.css",
    "content": "/*Notes about grid:\nColumns:      12\nGrid Width:   825px\nColumn Width: 55px\nGutter Width: 15px\n-------------------------------*/\n \n \n \n.section \t\t{margin-bottom: 18px;\n}\n.section:after\t{content: \".\";display: block;height: 0;clear: both;visibility: hidden;}\n.section \t\t{*zoom: 1;}\n \n.section .firstcolumn,\n.section .firstcol {margin-left: 0;}\n \n \n/* Border on left hand side of a column. */\n.border {\n  padding-left: 7px;\n  margin-left: 7px;\n  border-left: 1px solid #eee;\n}\n \n/* Border with more whitespace, spans one column. */\n.colborder {\n    padding-left: 42px;\n  margin-left: 42px;\n  border-left: 1px solid #eee;\n}\n \n\n \n/* The Grid Classes */\n.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12\n{margin-left: 15px;float: left;display: inline; overflow: hidden;}\n \n \n.width1, .grid1, .span-1 {width: 55px;}\n.width1_2cols,.grid1_2cols {width: 20px;}\n.width1_3cols,.grid1_3cols  {width: 8px;}\n.width1_4cols,.grid1_4cols  {width: 2px;}\n.input_width1 {width: 49px;}\n \n.width2, .grid2, .span-2 {width: 125px;}\n.width2_3cols,.grid2_3cols  {width: 31px;}\n.width2_4cols,.grid2_4cols  {width: 20px;}\n.input_width2 {width: 119px;}\n \n.width3, .grid3, .span-3 {width: 195px;}\n.width3_2cols,.grid3_2cols {width: 90px;}\n.width3_4cols,.grid3_4cols  {width: 37px;}\n.input_width3 {width: 189px;}\n \n.width4, .grid4, .span-4 {width: 265px;}\n.width4_3cols,.grid4_3cols  {width: 78px;}\n.input_width4 {width: 259px;}\n \n.width5, .grid5, .span-5 {width: 335px;}\n.width5_2cols,.grid5_2cols {width: 160px;}\n.width5_3cols,.grid5_3cols  {width: 101px;}\n.width5_4cols,.grid5_4cols  {width: 72px;}\n.input_width5 {width: 329px;}\n \n.width6, .grid6, .span-6 {width: 405px;}\n.width6_4cols,.grid6_4cols  {width: 90px;}\n.input_width6 {width: 399px;}\n \n.width7, .grid7, .span-7 {width: 475px;}\n.width7_2cols,.grid7_2cols {width: 230px;}\n.width7_3cols,.grid7_3cols  {width: 148px;}\n.width7_4cols,.grid7_4cols  {width: 107px;}\n.input_width7 {width: 469px;}\n \n.width8, .grid8, .span-8 {width: 545px;}\n.width8_3cols,.grid8_3cols  {width: 171px;}\n.input_width8 {width: 539px;}\n \n.width9, .grid9, .span-9 {width: 615px;}\n.width9_2cols,.grid9_2cols {width: 300px;}\n.width9_4cols,.grid9_4cols  {width: 142px;}\n.input_width9 {width: 609px;}\n \n.width10, .grid10, .span-10 {width: 685px;}\n.width10_3cols,.grid10_3cols  {width: 218px;}\n.width10_4cols,.grid10_4cols  {width: 160px;}\n.input_width10 {width: 679px;}\n \n.width11, .grid11, .span-11 {width: 755px;}\n.width11_2cols,.grid11_2cols {width: 370px;}\n.width11_3cols,.grid11_3cols  {width: 241px;}\n.width11_4cols,.grid11_4cols  {width: 177px;}\n.input_width11 {width: 749px;}\n \n.width12, .grid12, .span-12 {width: 825px;}\n.input_width12 {width: 819px;}\n \n/* Subdivided grid spaces */\n.emptycols_left1, .prepend-1 {padding-left: 70px;}\n.emptycols_right1, .append-1 {padding-right: 70px;}\n.emptycols_left2, .prepend-2 {padding-left: 140px;}\n.emptycols_right2, .append-2 {padding-right: 140px;}\n.emptycols_left3, .prepend-3 {padding-left: 210px;}\n.emptycols_right3, .append-3 {padding-right: 210px;}\n.emptycols_left4, .prepend-4 {padding-left: 280px;}\n.emptycols_right4, .append-4 {padding-right: 280px;}\n.emptycols_left5, .prepend-5 {padding-left: 350px;}\n.emptycols_right5, .append-5 {padding-right: 350px;}\n.emptycols_left6, .prepend-6 {padding-left: 420px;}\n.emptycols_right6, .append-6 {padding-right: 420px;}\n.emptycols_left7, .prepend-7 {padding-left: 490px;}\n.emptycols_right7, .append-7 {padding-right: 490px;}\n.emptycols_left8, .prepend-8 {padding-left: 560px;}\n.emptycols_right8, .append-8 {padding-right: 560px;}\n.emptycols_left9, .prepend-9 {padding-left: 630px;}\n.emptycols_right9, .append-9 {padding-right: 630px;}\n.emptycols_left10, .prepend-10 {padding-left: 700px;}\n.emptycols_right10, .append-10 {padding-right: 700px;}\n.emptycols_left11, .prepend-11 {padding-left: 770px;}\n.emptycols_right11, .append-11 {padding-right: 770px;}\n.pull-1 {margin-left: -70px;}\n.push-1 {margin-right: -70px;margin-left: 18px;float: right;}\n.pull-2 {margin-left: -140px;}\n.push-2 {margin-right: -140px;margin-left: 18px;float: right;}\n.pull-3 {margin-left: -210px;}\n.push-3 {margin-right: -210px;margin-left: 18px;float: right;}\n.pull-4 {margin-left: -280px;}\n.push-4 {margin-right: -280px;margin-left: 18px;float: right;}"
  },
  {
    "path": "css/styling-text/web-fonts/fonts/specimen_files/specimen_stylesheet.css",
    "content": "@import url('grid_12-825-55-15.css');\n\n/*  \n\tCSS Reset by Eric Meyer - Released under Public Domain\n    http://meyerweb.com/eric/tools/css/reset/\n*/\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, font, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center, dl, dt, dd, ol, ul, li,\nfieldset, form, label, legend, table, \ncaption, tbody, tfoot, thead, tr, th, td \n                  {margin: 0;padding: 0;border: 0;outline: 0;\n                  font-size: 100%;vertical-align: baseline;\n                  background: transparent;}\nbody              {line-height: 1;}\nol, ul            {list-style: none;}\nblockquote, q     {quotes: none;}\nblockquote:before, blockquote:after,\nq:before, q:after {content: '';\tcontent: none;}\n:focus            {outline: 0;}\nins               {text-decoration: none;}\ndel               {text-decoration: line-through;}\ntable             {border-collapse: collapse;border-spacing: 0;}\n\n\n\n\nbody {\n\tcolor: #000;\n\tbackground-color: #dcdcdc;\n}\n\na {\n\ttext-decoration: none;\n\tcolor: #1883ba;\n}\n\nh1{\n\tfont-size: 32px;\n\tfont-weight: normal;\n\tfont-style: normal;\n\tmargin-bottom: 18px;\n}\n\nh2{\n\tfont-size: 18px;\n}\n\n#container {\n\twidth: 865px;\n\tmargin: 0px auto;\n}\n\n\n#header {\n\tpadding: 20px;\n\tfont-size: 36px;\n\tbackground-color: #000;\n\tcolor: #fff;\n}\n\n#header span {\n\tcolor: #666;\n}\n#main_content {\n\tbackground-color: #fff;\n\tpadding: 60px 20px 20px;\n}\n\n\n#footer p {\n\tmargin: 0;\n\tpadding-top: 10px;\n\tpadding-bottom: 50px;\n\tcolor: #333;\n\tfont: 10px Arial, sans-serif;\n}\n\n.tabs {\n\twidth: 100%;\n\theight: 31px;\n\tbackground-color: #444;\n}\n.tabs li {\n\tfloat:  left;\n\tmargin: 0;\n\toverflow: hidden;\n\tbackground-color: #444;\n}\n.tabs li a {\n\tdisplay: block;\n\tcolor: #fff;\n\ttext-decoration: none;\n\tfont: bold 11px/11px 'Arial';\n\ttext-transform: uppercase;\n\tpadding: 10px 15px;\n\tborder-right: 1px solid #fff;\n}\n\n.tabs li a:hover {\n\t\tbackground-color: #00b3ff;\n\n}\n\n.tabs li.active a {\n\tcolor:  #000;\n\tbackground-color: #fff;\n}\n\n\n\ndiv.huge {\n\t\n\tfont-size: 300px;\n\tline-height: 1em;\n\tpadding: 0;\n\tletter-spacing: -.02em;\n\toverflow: hidden;\n}\ndiv.glyph_range {\n\tfont-size: 72px;\n\tline-height: 1.1em;\n}\n\n.size10{ font-size: 10px; }\n.size11{ font-size: 11px; }\n.size12{ font-size: 12px; }\n.size13{ font-size: 13px; }\n.size14{ font-size: 14px; }\n.size16{ font-size: 16px; }\n.size18{ font-size: 18px; }\n.size20{ font-size: 20px; }\n.size24{ font-size: 24px; }\n.size30{ font-size: 30px; }\n.size36{ font-size: 36px; }\n.size48{ font-size: 48px; }\n.size60{ font-size: 60px; }\n.size72{ font-size: 72px; }\n.size90{ font-size: 90px; }\n\n\n.psample_row1 {\theight: 120px;}\n.psample_row1 {\theight: 120px;}\n.psample_row2 {\theight: 160px;}\n.psample_row3 {\theight: 160px;}\n.psample_row4 {\theight: 160px;}\n\n.psample {\n\toverflow: hidden;\n\tposition: relative;\n}\n.psample p {\n\tline-height: 1.3em;\n\tdisplay: block;\n\toverflow: hidden;\n\tmargin: 0;\n}\n\n.psample span {\n\tmargin-right: .5em;\n}\n\n.white_blend {\n\twidth: 100%;\n\theight: 61px;\n\tbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==);\n\tposition: absolute;\n\tbottom: 0;\n}\n.black_blend {\n\twidth: 100%;\n\theight: 61px;\n\tbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC);\n\tposition: absolute;\n\tbottom: 0;\n}\n.fullreverse {\n\tbackground:  #000 !important;\n\tcolor:  #fff !important;\n\tmargin-left: -20px;\n\tpadding-left: 20px;\n\tmargin-right: -20px;\n\tpadding-right: 20px;\n\tpadding: 20px;\n\tmargin-bottom:0;\n}\n\n\n.sample_table td {\n\tpadding-top: 3px;\n\tpadding-bottom:5px;\n\tpadding-left: 5px;\n\tvertical-align: middle;\n\tline-height: 1.2em;\n}\n\n.sample_table td:first-child {\n\tbackground-color: #eee;\n\ttext-align: right;\n\tpadding-right: 5px;\n\tpadding-left: 0;\n\tpadding: 5px;\n\tfont: 11px/12px \"Courier New\", Courier, mono;\n}\n\ncode {\n\twhite-space: pre;\n\tbackground-color: #eee;\n\tdisplay: block;\n\tpadding: 10px;\n\tmargin-bottom: 18px;\n\toverflow: auto;\n}\n\n\n.bottom,.last \t{margin-bottom:0 !important; padding-bottom:0 !important;}\n\n.box  { \n  padding: 18px; \n  margin-bottom: 18px; \n  background: #eee; \n}\n\n.reverse,.reversed { background:  #000 !important;color:  #fff !important; border: none !important;}\n\n#bodycomparison {\n\tposition: relative;\n\toverflow: hidden;\n\tfont-size: 72px;\n\theight: 90px;\n\twhite-space: nowrap;\n}\n\n#bodycomparison div{\n\tfont-size: 72px;\n\tline-height: 90px;\n\tdisplay: inline;\n\tmargin: 0 15px 0 0;\n\tpadding: 0;\n}\n\n#bodycomparison div span{\n\tfont: 10px Arial;\n\tposition: absolute;\n\tleft: 0;\n}\n#xheight {\n\tfloat: none;\n\tposition: absolute;\n\tcolor: #d9f3ff;\n\tfont-size: 72px;\n\tline-height: 90px;\n}\n\n.fontbody {\n position: relative;\n}\n.arialbody{\n\tfont-family: Arial;\n\tposition: relative;\n}\n.verdanabody{\n\tfont-family: Verdana;\n\tposition: relative;\n}\n.georgiabody{\n\tfont-family: Georgia;\n\tposition: relative;\n}\n\n/* @group Layout page\n */\n\n#layout h1 {\n\tfont-size: 36px;\n\tline-height: 42px;\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n\n#layout h2 {\n\tfont-size: 24px;\n\tline-height: 23px;\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n\n#layout h3 {\n\tfont-size: 22px;\n\tline-height: 1.4em;\n\tmargin-top: 1em;\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n\n\n#layout p.byline {\n\tfont-size: 12px;\n\tmargin-top: 18px;\n\tline-height: 12px;\n\tmargin-bottom: 0;\n}\n#layout p {\n\tfont-size: 14px;\n\tline-height: 21px;\n\tmargin-bottom: .5em;\n}\n\n#layout p.large{\n\tfont-size: 18px;\n\tline-height: 26px;\n}\n\n#layout .sidebar p{\n\tfont-size: 12px;\n\tline-height: 1.4em;\n}\n\n#layout p.caption {\n\tfont-size: 10px;\n\tmargin-top: -16px;\n\tmargin-bottom: 18px;\n}\n\n/* @end */\n\n/* @group Glyphs */\n\n#glyph_chart div{\n\tbackground-color: #d9f3ff;\n\tcolor: black;\n\tfloat: left;\n\tfont-size: 36px;\n\theight: 1.2em;\n\tline-height: 1.2em;\n\tmargin-bottom: 1px;\n\tmargin-right: 1px;\n\ttext-align: center;\n\twidth: 1.2em;\n\tposition: relative;\n\tpadding: .6em .2em .2em;\n}\n\n#glyph_chart div p {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\tdisplay: block;\n\ttext-align: center;\n\tfont: bold 9px Arial, sans-serif;\n\tbackground-color: #3a768f;\n\twidth: 100%;\n\tcolor: #fff;\n\tpadding: 2px 0;\n}\n\n\n#glyphs h1 {\n\tfont-family: Arial, sans-serif;\n}\n/* @end */\n\n/* @group Installing */\n\n#installing {\n\tfont: 13px Arial, sans-serif;\n}\n\n#installing p,\n#glyphs p{\n\tline-height: 1.2em;\n\tmargin-bottom: 18px;\n\tfont: 13px Arial, sans-serif;\n}\n\n\n\n#installing h3{\n\tfont-size: 15px;\n\tmargin-top: 18px;\n}\n\n/* @end */\n\n#rendering h1 {\n\tfont-family: Arial, sans-serif;\n}\n.render_table td {\n\tfont: 11px \"Courier New\", Courier, mono;\n\tvertical-align: middle;\n}\n\n\n"
  },
  {
    "path": "css/styling-text/web-fonts/fonts/stylesheet.css",
    "content": "/* Generated by Font Squirrel (https://www.fontsquirrel.com) on April 14, 2016 */\n\n\n\n@font-face {\n    font-family: 'ciclefina';\n    src: url('cicle_fina-webfont.eot');\n    src: url('cicle_fina-webfont.eot?#iefix') format('embedded-opentype'),\n         url('cicle_fina-webfont.woff2') format('woff2'),\n         url('cicle_fina-webfont.woff') format('woff'),\n         url('cicle_fina-webfont.ttf') format('truetype'),\n         url('cicle_fina-webfont.svg#ciclefina') format('svg');\n    font-weight: normal;\n    font-style: normal;\n\n}\n\n\n\n\n@font-face {\n    font-family: 'zantrokeregular';\n    src: url('zantroke-webfont.eot');\n    src: url('zantroke-webfont.eot?#iefix') format('embedded-opentype'),\n         url('zantroke-webfont.woff2') format('woff2'),\n         url('zantroke-webfont.woff') format('woff'),\n         url('zantroke-webfont.ttf') format('truetype'),\n         url('zantroke-webfont.svg#zantrokeregular') format('svg');\n    font-weight: normal;\n    font-style: normal;\n\n}"
  },
  {
    "path": "css/styling-text/web-fonts/fonts/zantroke-demo.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en-US\" lang=\"en-US\">\n  <head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<script src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\t<script src=\"specimen_files/easytabs.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n\t<link rel=\"stylesheet\" href=\"specimen_files/specimen_stylesheet.css\" type=\"text/css\" charset=\"utf-8\" />\n\t<link rel=\"stylesheet\" href=\"stylesheet.css\" type=\"text/css\" charset=\"utf-8\" />\n\n\t<style type=\"text/css\">\n\t\t\t\t\tbody{\n\t\t\t\tfont-family: 'zantrokeregular';\n\t\t\t\t\t\t\t}\n\t\t</style>\n\n\t<title>Zantroke Regular Specimen</title>\n\t\n\t\n\t<script type=\"text/javascript\" charset=\"utf-8\">\n\t\t$(document).ready(function() {\n\t\t\t$('#container').easyTabs({defaultContent:1});\n\t\t});\n\t</script>\n  </head>\n\n<body>\n<div id=\"container\">\n\t<div id=\"header\">\n\t\tZantroke Regular\t</div>\n\t<ul class=\"tabs\">\n\t\t<li><a href=\"#specimen\">Specimen</a></li>\n\t\t<li><a href=\"#layout\">Sample Layout</a></li>\n\t\t\t\t<li><a href=\"#glyphs\">Glyphs &amp; Languages</a></li>\n\t\t<li><a href=\"#installing\">Installing Webfonts</a></li>\n\t\t\n\t</ul>\n\t\n\t<div id=\"main_content\">\n\n\t\t\n\t\t\t<div id=\"specimen\">\n\t\t\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<div class=\"huge\">AaBb</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"glyph_range\">A&#x200B;B&#x200b;C&#x200b;D&#x200b;E&#x200b;F&#x200b;G&#x200b;H&#x200b;I&#x200b;J&#x200b;K&#x200b;L&#x200b;M&#x200b;N&#x200b;O&#x200b;P&#x200b;Q&#x200b;R&#x200b;S&#x200b;T&#x200b;U&#x200b;V&#x200b;W&#x200b;X&#x200b;Y&#x200b;Z&#x200b;a&#x200b;b&#x200b;c&#x200b;d&#x200b;e&#x200b;f&#x200b;g&#x200b;h&#x200b;i&#x200b;j&#x200b;k&#x200b;l&#x200b;m&#x200b;n&#x200b;o&#x200b;p&#x200b;q&#x200b;r&#x200b;s&#x200b;t&#x200b;u&#x200b;v&#x200b;w&#x200b;x&#x200b;y&#x200b;z&#x200b;1&#x200b;2&#x200b;3&#x200b;4&#x200b;5&#x200b;6&#x200b;7&#x200b;8&#x200b;9&#x200b;0&#x200b;&amp;&#x200b;.&#x200b;,&#x200b;?&#x200b;!&#x200b;&#64;&#x200b;(&#x200b;)&#x200b;#&#x200b;$&#x200b;%&#x200b;*&#x200b;+&#x200b;-&#x200b;=&#x200b;:&#x200b;;</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<table class=\"sample_table\">\n\t\t\t\t\t\t\t<tr><td>10</td><td class=\"size10\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>11</td><td class=\"size11\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>12</td><td class=\"size12\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>13</td><td class=\"size13\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>14</td><td class=\"size14\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>16</td><td class=\"size16\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>18</td><td class=\"size18\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>20</td><td class=\"size20\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>24</td><td class=\"size24\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>30</td><td class=\"size30\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>36</td><td class=\"size36\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>48</td><td class=\"size48\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>60</td><td class=\"size60\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>72</td><td class=\"size72\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t\t<tr><td>90</td><td class=\"size90\">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\n\t\t\t\t</div>\n\t\t\n\t\t\n\t\t\n\t\t\t\t\t\t\t\t<div class=\"section\" id=\"bodycomparison\">\n\n\n\t\t\t\t\t\t\t\t\t\t<div id=\"xheight\">\n\t\t\t\t<div class=\"fontbody\">&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;&#x25FC;body</div><div class=\"arialbody\">body</div><div class=\"verdanabody\">body</div><div class=\"georgiabody\">body</div></div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"fontbody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Zantroke Regular</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"arialbody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Arial</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"verdanabody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Verdana</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"georgiabody\" style=\"z-index:1\">\n\t\t\t\t\t\t\t\t\t\t\tbody<span>Georgia</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\n\n\n\t\t\t\t\t\t\t\t</div>\n\t\t\n\t\t\n\t\t\t\t<div class=\"section psample psample_row1\" id=\"\">\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"grid2 firstcol\">\n\t\t\t\t\t\t<p class=\"size10\"><span>10.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size11\"><span>11.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size12\"><span>12.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size13\"><span>13.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section psample psample_row2\" id=\"\">\n\t\t\t\t\t<div class=\"grid3 firstcol\">\n\t\t\t\t\t\t<p class=\"size14\"><span>14.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size16\"><span>16.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid5\">\n\t\t\t\t\t\t<p class=\"size18\"><span>18.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row3\" id=\"\">\n\t\t\t\t\t<div class=\"grid5 firstcol\">\n\t\t\t\t\t\t<p class=\"size20\"><span>20.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid7\">\n\t\t\t\t\t\t<p class=\"size24\"><span>24.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row4\" id=\"\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<p class=\"size30\"><span>30.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"white_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row1 fullreverse\">\n\t\t\t\t\t<div class=\"grid2 firstcol\">\n\t\t\t\t\t\t<p class=\"size10\"><span>10.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size11\"><span>11.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid3\">\n\t\t\t\t\t\t<p class=\"size12\"><span>12.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size13\"><span>13.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample psample_row2 fullreverse\">\n\t\t\t\t\t<div class=\"grid3 firstcol\">\n\t\t\t\t\t\t<p class=\"size14\"><span>14.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid4\">\n\t\t\t\t\t\t<p class=\"size16\"><span>16.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid5\">\n\t\t\t\t\t\t<p class=\"size18\"><span>18.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample fullreverse psample_row3\" id=\"\">\n\t\t\t\t\t<div class=\"grid5 firstcol\">\n\t\t\t\t\t\t<p class=\"size20\"><span>20.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"grid7\">\n\t\t\t\t\t\t<p class=\"size24\"><span>24.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"section psample fullreverse psample_row4\" id=\"\" style=\"border-bottom: 20px #000 solid;\">\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<p class=\"size30\"><span>30.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"black_blend\"></div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<div id=\"layout\">\n\t\t\t\t\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\t\t\t<h1>Lorem Ipsum Dolor</h1>\n\t\t\t\t\t\t<h2>Etiam porta sem malesuada magna mollis euismod</h2>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<p class=\"byline\">By <a href=\"#link\">Aenean Lacinia</a></p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section\">\n\t\t\t\t\t<div class=\"grid8 firstcol\">\n\t\t\t\t\t\t<p class=\"large\">Donec sed odio dui. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t<h3>Pellentesque ornare sem</h3>\n\n\t\t\t\t\t\t<p>Maecenas sed diam eget risus varius blandit sit amet non magna. Maecenas faucibus mollis interdum. Donec ullamcorper nulla non metus auctor fringilla. Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam id dolor id nibh ultricies vehicula ut id elit. </p>\n\n\t\t\t\t\t\t<p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. </p>\n\n\t\t\t\t\t\t<p>Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Aenean lacinia bibendum nulla sed consectetur. </p>\n\n\t\t\t\t\t\t<p>Nullam quis risus eget urna mollis ornare vel eu leo. Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec ullamcorper nulla non metus auctor fringilla. </p>\n\n\t\t\t\t\t\t<h3>Cras mattis consectetur</h3>\n\n\t\t\t\t\t\t<p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean lacinia bibendum nulla sed consectetur. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Cras mattis consectetur purus sit amet fermentum. </p>\n\n\t\t\t\t\t\t<p>Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam quis risus eget urna mollis ornare vel eu leo. Cras mattis consectetur purus sit amet fermentum.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"grid4 sidebar\">\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class=\"box reverse\">\n\t\t\t\t\t\t\t<p class=\"last\">Nullam quis risus eget urna mollis ornare vel eu leo. Donec ullamcorper nulla non metus auctor fringilla. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. </p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<p class=\"caption\">Maecenas sed diam eget risus varius.</p>\n\n\t\t\t\t\t\t<p>Vestibulum id ligula porta felis euismod semper. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>\n\n\t\t\t\t\t\n\n\t\t\t\t\t\t<p>Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Aenean lacinia bibendum nulla sed consectetur. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean lacinia bibendum nulla sed consectetur. Nullam quis risus eget urna mollis ornare vel eu leo. </p>\n\n\t\t\t\t\t\t<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec ullamcorper nulla non metus auctor fringilla. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>\n\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t</div>\n\n\n\t\t\t\n\n\n\n\t\t<div id=\"glyphs\">\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"grid12 firstcol\">\n\t\t\t\n\t\t\t\t<h1>Language Support</h1>\n\t\t\t\t<p>The subset of Zantroke Regular in this kit supports the following languages:<br />\n\t\t\t\n\t\t\t\t\tAlbanian, Basque, Breton, Chamorro, Danish, Dutch, English, Faroese, Finnish, French, Frisian, Galician, German, Icelandic, Italian, Malagasy, Norwegian, Portuguese, Spanish, Swedish\t\t\t\t</p>\n\t\t\t\t<h1>Glyph Chart</h1>\n\t\t\t\t<p>The subset of Zantroke Regular in this kit includes all the glyphs listed below. Unicode entities are included above each glyph to help you insert individual characters into your layout.</p>\n\t\t\t\t<div id=\"glyph_chart\">\n\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#13;</p>&#13;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#32;</p>&#32;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#33;</p>&#33;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#34;</p>&#34;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#35;</p>&#35;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#36;</p>&#36;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#37;</p>&#37;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#38;</p>&#38;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#39;</p>&#39;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#40;</p>&#40;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#41;</p>&#41;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#42;</p>&#42;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#43;</p>&#43;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#44;</p>&#44;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#45;</p>&#45;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#46;</p>&#46;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#47;</p>&#47;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#48;</p>&#48;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#49;</p>&#49;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#50;</p>&#50;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#51;</p>&#51;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#52;</p>&#52;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#53;</p>&#53;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#54;</p>&#54;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#55;</p>&#55;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#56;</p>&#56;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#57;</p>&#57;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#58;</p>&#58;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#59;</p>&#59;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#60;</p>&#60;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#61;</p>&#61;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#62;</p>&#62;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#63;</p>&#63;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#64;</p>&#64;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#65;</p>&#65;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#66;</p>&#66;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#67;</p>&#67;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#68;</p>&#68;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#69;</p>&#69;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#70;</p>&#70;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#71;</p>&#71;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#72;</p>&#72;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#73;</p>&#73;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#74;</p>&#74;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#75;</p>&#75;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#76;</p>&#76;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#77;</p>&#77;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#78;</p>&#78;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#79;</p>&#79;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#80;</p>&#80;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#81;</p>&#81;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#82;</p>&#82;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#83;</p>&#83;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#84;</p>&#84;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#85;</p>&#85;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#86;</p>&#86;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#87;</p>&#87;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#88;</p>&#88;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#89;</p>&#89;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#90;</p>&#90;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#91;</p>&#91;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#92;</p>&#92;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#93;</p>&#93;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#94;</p>&#94;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#95;</p>&#95;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#96;</p>&#96;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#97;</p>&#97;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#98;</p>&#98;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#99;</p>&#99;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#100;</p>&#100;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#101;</p>&#101;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#102;</p>&#102;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#103;</p>&#103;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#104;</p>&#104;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#105;</p>&#105;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#106;</p>&#106;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#107;</p>&#107;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#108;</p>&#108;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#109;</p>&#109;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#110;</p>&#110;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#111;</p>&#111;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#112;</p>&#112;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#113;</p>&#113;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#114;</p>&#114;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#115;</p>&#115;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#116;</p>&#116;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#117;</p>&#117;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#118;</p>&#118;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#119;</p>&#119;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#120;</p>&#120;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#121;</p>&#121;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#122;</p>&#122;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#123;</p>&#123;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#124;</p>&#124;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#125;</p>&#125;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#126;</p>&#126;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#160;</p>&#160;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#161;</p>&#161;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#162;</p>&#162;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#163;</p>&#163;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#164;</p>&#164;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#165;</p>&#165;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#166;</p>&#166;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#167;</p>&#167;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#168;</p>&#168;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#169;</p>&#169;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#170;</p>&#170;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#171;</p>&#171;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#172;</p>&#172;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#173;</p>&#173;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#174;</p>&#174;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#175;</p>&#175;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#176;</p>&#176;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#177;</p>&#177;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#178;</p>&#178;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#179;</p>&#179;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#180;</p>&#180;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#181;</p>&#181;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#182;</p>&#182;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#183;</p>&#183;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#184;</p>&#184;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#185;</p>&#185;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#186;</p>&#186;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#187;</p>&#187;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#191;</p>&#191;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#192;</p>&#192;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#193;</p>&#193;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#194;</p>&#194;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#195;</p>&#195;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#196;</p>&#196;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#197;</p>&#197;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#198;</p>&#198;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#199;</p>&#199;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#200;</p>&#200;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#201;</p>&#201;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#202;</p>&#202;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#203;</p>&#203;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#204;</p>&#204;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#205;</p>&#205;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#206;</p>&#206;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#207;</p>&#207;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#208;</p>&#208;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#209;</p>&#209;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#210;</p>&#210;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#211;</p>&#211;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#212;</p>&#212;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#213;</p>&#213;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#214;</p>&#214;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#215;</p>&#215;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#216;</p>&#216;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#217;</p>&#217;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#218;</p>&#218;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#219;</p>&#219;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#220;</p>&#220;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#221;</p>&#221;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#222;</p>&#222;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#223;</p>&#223;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#224;</p>&#224;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#225;</p>&#225;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#226;</p>&#226;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#227;</p>&#227;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#228;</p>&#228;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#229;</p>&#229;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#230;</p>&#230;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#231;</p>&#231;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#232;</p>&#232;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#233;</p>&#233;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#234;</p>&#234;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#235;</p>&#235;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#236;</p>&#236;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#237;</p>&#237;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#238;</p>&#238;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#239;</p>&#239;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#240;</p>&#240;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#241;</p>&#241;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#242;</p>&#242;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#243;</p>&#243;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#244;</p>&#244;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#245;</p>&#245;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#246;</p>&#246;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#247;</p>&#247;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#248;</p>&#248;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#249;</p>&#249;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#250;</p>&#250;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#251;</p>&#251;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#252;</p>&#252;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#253;</p>&#253;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#254;</p>&#254;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#255;</p>&#255;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#338;</p>&#338;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#339;</p>&#339;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#376;</p>&#376;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#710;</p>&#710;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#732;</p>&#732;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8192;</p>&#8192;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8193;</p>&#8193;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8194;</p>&#8194;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8195;</p>&#8195;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8196;</p>&#8196;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8197;</p>&#8197;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8198;</p>&#8198;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8199;</p>&#8199;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8200;</p>&#8200;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8201;</p>&#8201;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8202;</p>&#8202;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8208;</p>&#8208;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8209;</p>&#8209;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8210;</p>&#8210;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8211;</p>&#8211;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8212;</p>&#8212;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8216;</p>&#8216;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8217;</p>&#8217;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8218;</p>&#8218;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8220;</p>&#8220;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8221;</p>&#8221;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8222;</p>&#8222;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8226;</p>&#8226;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8230;</p>&#8230;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8239;</p>&#8239;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8249;</p>&#8249;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8250;</p>&#8250;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8287;</p>&#8287;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8364;</p>&#8364;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#8482;</p>&#8482;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#9724;</p>&#9724;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#64257;</p>&#64257;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#64258;</p>&#64258;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#64259;</p>&#64259;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t <div><p>&amp;#64260;</p>&#64260;</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\t\n\t\t\t\t</div>\n\t\t\n\t\t\n\t\t\t</div>\n\t\t</div>\n\t\t\n\t\t\n\t\t<div id=\"specs\">\n\t\t\t\n\t\t</div>\n\t\n\t\t<div id=\"installing\">\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"grid7 firstcol\">\n\t\t\t\t\t<h1>Installing Webfonts</h1>\n\t\t\t\t\t\n\t\t\t\t\t<p>Webfonts are supported by all major browser platforms but not all in the same way. There are currently four different font formats that must be included in order to target all browsers. This includes TTF, WOFF, EOT and SVG.</p>\n\t\t\t\t\t\n\t\t\t\t\t<h2>1. Upload your webfonts</h2>\n\t\t\t\t\t<p>You must upload your webfont kit to your website. They should be in or near the same directory as your CSS files.</p>\n\t\t\t\t\t\n\t\t\t\t\t<h2>2. Include the webfont stylesheet</h2>\n\t\t\t\t\t<p>A special CSS @font-face declaration helps the various browsers select the appropriate font it needs without causing you a bunch of headaches. Learn more about this syntax by reading the <a href=\"https://www.fontspring.com/blog/further-hardening-of-the-bulletproof-syntax\">Fontspring blog post</a> about it. The code for it is as follows:</p>\n\n\n<code>\n@font-face{ \n\tfont-family: 'MyWebFont';\n\tsrc: url('WebFont.eot');\n\tsrc: url('WebFont.eot?#iefix') format('embedded-opentype'),\n\t     url('WebFont.woff') format('woff'),\n\t     url('WebFont.ttf') format('truetype'),\n\t     url('WebFont.svg#webfont') format('svg');\n}\n</code>\n\n\t<p>We've already gone ahead and generated the code for you. All you have to do is link to the stylesheet in your HTML, like this:</p>\n\t<code>&lt;link rel=&quot;stylesheet&quot; href=&quot;stylesheet.css&quot; type=&quot;text/css&quot; charset=&quot;utf-8&quot; /&gt;</code>\n\n\t\t\t\t\t<h2>3. Modify your own stylesheet</h2>\n\t\t\t\t\t<p>To take advantage of your new fonts, you must tell your stylesheet to use them. Look at the original @font-face declaration above and find the property called \"font-family.\" The name linked there will be what you use to reference the font. Prepend that webfont name to the font stack in the \"font-family\" property, inside the selector you want to change. For example:</p>\n<code>p { font-family: 'WebFont', Arial, sans-serif; }</code>\n\n<h2>4. Test</h2>\n<p>Getting webfonts to work cross-browser <em>can</em> be tricky. Use the information in the sidebar to help you if you find that fonts aren't loading in a particular browser.</p>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"grid5 sidebar\">\n\t\t\t\t\t<div class=\"box\">\n\t\t\t\t\t\t<h2>Troubleshooting<br />Font-Face Problems</h2>\n\t\t\t\t\t\t<p>Having trouble getting your webfonts to load in your new website? Here are some tips to sort out what might be the problem.</p>\n\n\t\t\t\t\t\t<h3>Fonts not showing in any browser</h3>\n\n\t\t\t\t\t\t<p>This sounds like you need to work on the plumbing. You either did not upload the fonts to the correct directory, or you did not link the fonts properly in the CSS. If you've confirmed that all this is correct and you still have a problem, take a look at your .htaccess file and see if requests are getting intercepted.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in iPhone or iPad</h3>\n\n\t\t\t\t\t\t<p>The most common problem here is that you are serving the fonts from an IIS server. IIS refuses to serve files that have unknown MIME types. If that is the case, you must set the MIME type for SVG to \"image/svg+xml\" in the server settings. Follow these instructions from Microsoft if you need help.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in Firefox</h3>\n\n\t\t\t\t\t\t<p>The primary reason for this failure? You are still using a version Firefox older than 3.5. So upgrade already! If that isn't it, then you are very likely serving fonts from a different domain. Firefox requires that all font assets be served from the same domain. Lastly it is possible that you need to add WOFF to your list of MIME types (if you are serving via IIS.)</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in IE</h3>\n\n\t\t\t\t\t\t<p>Are you looking at Internet Explorer on an actual Windows machine or are you cheating by using a service like Adobe BrowserLab? Many of these screenshot services do not render @font-face for IE. Best to test it on a real machine.</p>\n\n\t\t\t\t\t\t<h3>Fonts not loading in IE9</h3>\n\n\t\t\t\t\t\t<p>IE9, like Firefox, requires that fonts be served from the same domain as the website. Make sure that is the case.</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\n\t\t</div>\n\t\n\t</div>\n\t<div id=\"footer\">\n\t\t<p>&copy;2010-2011 Font Squirrel. All rights reserved.</p>\n\t</div>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "css/styling-text/web-fonts/google-font.css",
    "content": "/* General setup */\n\nhtml {\n  font-size: 10px;\n  margin: 0;\n  font-family: sans-serif;\n}\n\nbody {\n  width: 80%;\n  max-width: 800px;\n  margin: 0 auto;\n}\n\n/* Typography */\n\nh1 {\n  font-size: 4rem;\n}\n\nh2 {\n  font-size: 3rem;\n}\n\nh1, h2 {\n  font-family: 'Lobster', cursive;\n}\n\np {\n  font-size: 1.4rem;\n  line-height: 1.6;\n  word-spacing: 0.6rem;\n  letter-spacing: 0.1rem;\n  font-family: 'Raleway', sans-serif;\n}"
  },
  {
    "path": "css/styling-text/web-fonts/google-font.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Web font example</title>\n    <link href='https://fonts.googleapis.com/css?family=Lobster|Raleway' rel='stylesheet' type='text/css'>\n    <link href=\"google-font.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n  <body>\n    <h1>Hipster ipsum is the best</h1>\n\n    <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n\n    <p>Cray food truck brunch, XOXO +1 keffiyeh pickled chambray waistcoat ennui. Organic small batch paleo 8-bit. Intelligentsia umami wayfarers pickled, asymmetrical kombucha letterpress kitsch leggings cold-pressed squid chartreuse put a bird on it. Listicle pickled man bun cornhole heirloom art party.</p>\n\n    <h2>It is the quaintest</h2>\n\n    <p>Bespoke green juice aesthetic leggings DIY williamsburg selvage. Bespoke health goth tote bag, fingerstache venmo ennui thundercats butcher trust fund cardigan. Wolf vinyl you probably haven't heard of them taxidermy, ugh quinoa neutral meditation asymmetrical mixtape church-key kitsch man bun occupy. Knausgaard butcher raw denim ramps, offal seitan williamsburg venmo gastropub mlkshk cardigan chillwave chartreuse single-origin coffee twee. Ethical asymmetrical banjo typewriter fap. Polaroid waistcoat tousled selfies four dollar toast locavore thundercats. Truffaut post-ironic skateboard trust fund.</p>\n\n    <h2>No, really...</h2>\n\n    <p>Trust fund celiac farm-to-table PBR&B. Brunch art party mumblecore, fingerstache cred echo park literally stumptown humblebrag chambray. Vinyl distillery humblebrag crucifix. Mustache craft beer put a bird on it, irony deep v poutine ramps williamsburg heirloom brooklyn.</p>\n\n    <p>Taxidermy tofu YOLO, sustainable etsy art party stumptown portland. Ethical williamsburg retro paleo. Put a bird on it leggings actually, skateboard jean shorts paleo salvia plaid you probably haven't heard of them.\n  </body>\n</html>"
  },
  {
    "path": "css/styling-text/web-fonts/web-font-finished.css",
    "content": "/* font imports, generated by transfonter.org */\n\n@font-face {\n    font-family: 'ciclefina';\n    src: url('fonts/cicle_fina-webfont.woff2') format('woff2'),\n         url('fonts/cicle_fina-webfont.woff') format('woff');\n    font-weight: normal;\n    font-style: normal;\n    font-display: swap;\n}\n\n@font-face {\n  font-family: 'zantrokeregular';\n  src: url('fonts/zantroke-webfont.woff2') format('woff2'),\n       url('fonts/zantroke-webfont.woff') format('woff');\n  font-weight: normal;\n  font-style: normal;\n  font-display: swap;  \n}\n\n/* General setup */\n\nhtml {\n  font-size: 10px;\n  margin: 0;\n  font-family: sans-serif;\n}\n\nbody {\n  width: 80%;\n  max-width: 800px;\n  margin: 0 auto;\n}\n\n/* Typography */\n\nh1 {\n  font-size: 3.2rem;\n}\n\nh2 {\n  font-size: 2.4rem;\n}\n\nh1,h2 {\n  font-family: 'zantrokeregular', serif;\n  letter-spacing: 0.2rem;\n}\n\np {\n  font-size: 1.6rem;\n  line-height: 1.6;\n  letter-spacing: 0.1rem;\n  word-spacing: 0.3rem;\n  font-family: 'ciclefina', sans-serif;\n}\n"
  },
  {
    "path": "css/styling-text/web-fonts/web-font-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Web font example</title>\n    <link href=\"web-font-finished.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n  <body>\n    <h1>Hipster ipsum is the best</h1>\n\n    <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&amp;B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&amp;B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n\n    <p>Cray food truck brunch, XOXO +1 keffiyeh pickled chambray waistcoat ennui. Organic small batch paleo 8-bit. Intelligentsia umami wayfarers pickled, asymmetrical kombucha letterpress kitsch leggings cold-pressed squid chartreuse put a bird on it. Listicle pickled man bun cornhole heirloom art party.</p>\n\n    <h2>It is the quaintest</h2>\n\n    <p>Bespoke green juice aesthetic leggings DIY williamsburg selvage. Bespoke health goth tote bag, fingerstache venmo ennui thundercats butcher trust fund cardigan hella. Wolf vinyl you probably haven't heard of them taxidermy, ugh quinoa neutra meditation asymmetrical mixtape church-key kitsch man bun occupy. Knausgaard butcher raw denim ramps, offal seitan williamsburg venmo gastropub mlkshk cardigan chillwave chartreuse single-origin coffee twee. Ethical asymmetrical banjo typewriter fap. Polaroid waistcoat tousled selfies four dollar toast locavore thundercats. Truffaut post-ironic skateboard trust fund.</p>\n\n    <h2>No, really...</h2>\n\n    <p>Trust fund celiac farm-to-table PBR&amp;B. Brunch art party mumblecore, fingerstache cred echo park literally stumptown humblebrag chambray. Mlkshk vinyl distillery humblebrag crucifix. Mustache craft beer put a bird on it, irony deep v poutine ramps williamsburg heirloom brooklyn.</p>\n\n    <p>Taxidermy tofu YOLO, sustainable etsy flexitarian art party stumptown portland. Ethical williamsburg retro paleo. Put a bird on it leggings yuccie actually, skateboard jean shorts paleo lomo salvia plaid you probably haven't heard of them.</p>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-text/web-fonts/web-font-start.css",
    "content": "/* General setup */\n\nhtml {\n  font-size: 10px;\n  margin: 0;\n  font-family: sans-serif;\n}\n\nbody {\n  width: 80%;\n  max-width: 800px;\n  margin: 0 auto;\n}\n\n/* Typography */\n\nh1 {\n  font-size: 3.2rem;\n}\n\nh2 {\n  font-size: 2.4rem;\n}\n\np {\n  font-size: 1.4rem;\n  line-height: 1.6;\n  word-spacing: 0.6rem;\n}"
  },
  {
    "path": "css/styling-text/web-fonts/web-font-start.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Web font example</title>\n    <link href=\"web-font-start.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n  <body>\n    <h1>Hipster ipsum is the best</h1>\n\n    <p>Tacos actually microdosing, pour-over semiotics banjo chicharrones retro fanny pack portland everyday carry vinyl typewriter. Tacos PBR&amp;B pork belly, everyday carry ennui pickled sriracha normcore hashtag polaroid single-origin coffee cold-pressed. PBR&amp;B tattooed trust fund twee, leggings salvia iPhone photo booth health goth gastropub hammock.</p>\n\n    <p>Cray food truck brunch, XOXO +1 keffiyeh pickled chambray waistcoat ennui. Organic small batch paleo 8-bit. Intelligentsia umami wayfarers pickled, asymmetrical kombucha letterpress kitsch leggings cold-pressed squid chartreuse put a bird on it. Listicle pickled man bun cornhole heirloom art party.</p>\n\n    <h2>It is the quaintest</h2>\n\n    <p>Bespoke green juice aesthetic leggings DIY williamsburg selvage. Bespoke health goth tote bag, fingerstache venmo ennui thundercats butcher trust fund cardigan hella. Wolf vinyl you probably haven't heard of them taxidermy, ugh quinoa neutra meditation asymmetrical mixtape church-key kitsch man bun occupy. Knausgaard butcher raw denim ramps, offal seitan williamsburg venmo gastropub mlkshk cardigan chillwave chartreuse single-origin coffee twee. Ethical asymmetrical banjo typewriter fap. Polaroid waistcoat tousled selfies four dollar toast locavore thundercats. Truffaut post-ironic skateboard trust fund.</p>\n\n    <h2>No, really...</h2>\n\n    <p>Trust fund celiac farm-to-table PBR&amp;B. Brunch art party mumblecore, fingerstache cred echo park literally stumptown humblebrag chambray. Mlkshk vinyl distillery humblebrag crucifix. Mustache craft beer put a bird on it, irony deep v poutine ramps williamsburg heirloom brooklyn.</p>\n\n    <p>Taxidermy tofu YOLO, sustainable etsy flexitarian art party stumptown portland. Ethical williamsburg retro paleo. Put a bird on it leggings yuccie actually, skateboard jean shorts paleo lomo salvia plaid you probably haven't heard of them.</p>\n  </body>\n</html>"
  },
  {
    "path": "css/styling-text/web-fonts/zantroke/SIL Open Font License.txt",
    "content": "Copyright (c) 2011, gluk (gluksza@wp.pl),\nwith Reserved Font Zantroke.\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the copyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as distributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.\n\n5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are not met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE."
  },
  {
    "path": "html/forms/basic-input-examples/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Basic input types</title>\n    <style>\n      html, input {\n        font-family: sans-serif;\n      }\n\n      body {\n        width: 90%;\n        max-width: 500px;\n        margin: 0 auto;\n      }\n\n      form {\n        margin-top: 20px;\n      }\n\n      div {\n        margin-bottom: 20px;\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n      }\n\n      label, input, button {\n        font-size: 14px;\n        line-height: 1.5\n      }\n\n      label {\n        text-align: right;\n        width: 30%;\n        margin-right: 2%;\n      }\n\n      input {\n        flex: auto;\n      }\n\n      button {\n        width: 70%;\n        margin: 0 auto;\n      }\n\n    </style>\n   </head>\n  <body>\n    <form>\n      <div>\n        <label for=\"text\">text input type: </label>\n        <input type=\"text\" id=\"text\" name=\"text\">\n      </div>\n      <div>\n        <label for=\"pwd\">password input type: </label>\n        <input type=\"password\" id=\"pwd\" name=\"pwd\">\n      </div>\n      <div>\n        <label for=\"email\">email input type: </label>\n        <input type=\"email\" id=\"email\" name=\"email\">\n      </div>\n      <div>\n        <label for=\"url\">url input type: </label>\n        <input type=\"url\" id=\"url\" name=\"url\">\n      </div>\n      <div>\n        <label for=\"number\">number input type: </label>\n        <input type=\"number\" id=\"number\" name=\"number\">\n      </div>\n      <div>\n        <label for=\"tel\">tel input type: </label>\n        <input type=\"tel\" id=\"tel\" name=\"tel\">\n      </div>\n      <div>\n        <label for=\"search\">search input type: </label>\n        <input type=\"search\" id=\"search\" name=\"search\">\n      </div>\n      <div>\n        <button>Submit</button>\n      </div>\n    </form>\n    <script>\n\n    </script>\n</body>\n  </html>\n"
  },
  {
    "path": "html/forms/color-example/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>&lt;input type=\"color\"&gt; example</title>\n    <style>\n      html, input {\n        font-family: sans-serif;\n      }\n\n      body {\n        width: 90%;\n        max-width: 500px;\n        margin: 0 auto;\n      }\n\n      form {\n        margin-top: 20px;\n      }\n\n      div {\n        margin-bottom: 20px;\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n      }\n\n      label, input, button {\n        font-size: 14px;\n        line-height: 1.5\n      }\n\n      label {\n        text-align: right;\n        width: 30%;\n        margin-right: 2%;\n      }\n\n      input {\n        flex: auto;\n      }\n\n      button {\n        width: 70%;\n        margin: 0 auto;\n      }\n\n    </style>\n   </head>\n  <body>\n    <form>\n      <div>\n        <label for=\"color\">Pick a color: </label>\n        <input type=\"color\" id=\"color\" name=\"color\">\n      </div>\n      <div>\n        <button>Submit</button>\n      </div>\n    </form>\n    <script>\n\n    </script>\n</body>\n  </html>\n"
  },
  {
    "path": "html/forms/date-picker-fallback/index.html",
    "content": "<!doctype html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>date control with fallback</title>\n  <style>\n    input:invalid+span:after {\n      content: '✖';\n      padding-left: 5px;\n    }\n\n    input:valid+span:after {\n      content: '✓';\n      padding-left: 5px;\n    }\n  </style>\n  </head>\n\n<body>\n  <form>\n      <div class=\"nativeDatePicker\">\n        <label for=\"bday\">Enter your birthday:</label>\n        <input type=\"date\" id=\"bday\" name=\"bday\">\n        <span class=\"validity\"></span>\n      </div>\n      <p class=\"fallbackLabel\">Enter your birthday:</p>\n      <div class=\"fallbackDatePicker\">\n        <span>\n          <label for=\"day\">Day:</label>\n          <select id=\"day\" name=\"day\">\n          </select>\n        </span>\n        <span>\n          <label for=\"month\">Month:</label>\n          <select id=\"month\" name=\"month\">\n            <option selected>January</option>\n            <option>February</option>\n            <option>March</option>\n            <option>April</option>\n            <option>May</option>\n            <option>June</option>\n            <option>July</option>\n            <option>August</option>\n            <option>September</option>\n            <option>October</option>\n            <option>November</option>\n            <option>December</option>\n          </select>\n        </span>\n        <span>\n          <label for=\"year\">Year:</label>\n          <select id=\"year\" name=\"year\">\n          </select>\n        </span>\n      </div>\n  </form>\n\n  <script>\n// define variables\nvar nativePicker = document.querySelector('.nativeDatePicker');\nvar fallbackPicker = document.querySelector('.fallbackDatePicker');\nvar fallbackLabel = document.querySelector('.fallbackLabel');\n\nvar yearSelect = document.querySelector('#year');\nvar monthSelect = document.querySelector('#month');\nvar daySelect = document.querySelector('#day');\n\n// hide fallback initially\nfallbackPicker.style.display = 'none';\nfallbackLabel.style.display = 'none';\n\n// test whether a new date input falls back to a text input or not\nvar test = document.createElement('input');\n\ntry {\n  test.type = 'date';\n} catch (e) {\n  console.log(e.description);\n}\n\n// if it does, run the code inside the if() {} block\nif(test.type === 'text') {\n  // hide the native picker and show the fallback\n  nativePicker.style.display = 'none';\n  fallbackPicker.style.display = 'block';\n  fallbackLabel.style.display = 'block';\n\n  // populate the days and years dynamically\n  // (the months are always the same, therefore hardcoded)\n  populateDays(monthSelect.value);\n  populateYears();\n}\n\nfunction populateDays(month) {\n  // delete the current set of <option> elements out of the\n  // day <select>, ready for the next set to be injected\n  while(daySelect.firstChild){\n    daySelect.removeChild(daySelect.firstChild);\n  }\n\n  // Create variable to hold new number of days to inject\n  var dayNum;\n\n  // 31 or 30 days?\n  if(month === 'January' | month === 'March' | month === 'May' | month === 'July' | month === 'August' | month === 'October' | month === 'December') {\n    dayNum = 31;\n  } else if(month === 'April' | month === 'June' | month === 'September' | month === 'November') {\n    dayNum = 30;\n  } else {\n  // If month is February, calculate whether it is a leap year or not\n  var year = yearSelect.value;\n  var isLeap = new Date(year, 1, 29).getMonth() == 1;\n  isLeap ? dayNum = 29 : dayNum = 28;\n  }\n\n  // inject the right number of new <option> elements into the day <select>\n  for(i = 1; i <= dayNum; i++) {\n    var option = document.createElement('option');\n    option.textContent = i;\n    daySelect.appendChild(option);\n  }\n\n  // if previous day has already been set, set daySelect's value\n  // to that day, to avoid the day jumping back to 1 when you\n  // change the year\n  if(previousDay) {\n    daySelect.value = previousDay;\n\n    // If the previous day was set to a high number, say 31, and then\n    // you chose a month with less total days in it (e.g. February),\n    // this part of the code ensures that the highest day available\n    // is selected, rather than showing a blank daySelect\n    if(daySelect.value === \"\") {\n      daySelect.value = previousDay - 1;\n    }\n\n    if(daySelect.value === \"\") {\n      daySelect.value = previousDay - 2;\n    }\n\n    if(daySelect.value === \"\") {\n      daySelect.value = previousDay - 3;\n    }\n  }\n}\n\nfunction populateYears() {\n  // get this year as a number\n  var date = new Date();\n  var year = date.getFullYear();\n\n  // Make this year, and the 100 years before it available in the year <select>\n  for(var i = 0; i <= 100; i++) {\n    var option = document.createElement('option');\n    option.textContent = year-i;\n    yearSelect.appendChild(option);\n  }\n}\n\n// when the month or year <select> values are changed, rerun populateDays()\n// in case the change affected the number of available days\nyearSelect.onchange = function() {\n  populateDays(monthSelect.value);\n}\n\nmonthSelect.onchange = function() {\n  populateDays(monthSelect.value);\n}\n\n//preserve day selection\nvar previousDay;\n\n// update what day has been set to previously\n// see end of populateDays() for usage\ndaySelect.onchange = function() {\n  previousDay = daySelect.value;\n}\n  </script>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/datetime-local-example/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>&lt;input type=\"datetime-local\"&gt; example</title>\n    <style>\n      div {\n        margin-bottom: 10px;\n        display: flex;\n        align-items: center;\n      }\n\n      label {\n      display: inline-block;\n      width: 300px;\n      }\n\n      input:invalid+span:after {\n        content: '✖';\n        padding-left: 5px;\n      }\n\n      input:valid+span:after {\n        content: '✓';\n        padding-left: 5px;\n      }\n    </style>\n  </head>\n\n<body>\n<form>\n    <div>\n        <label for=\"party\">Choose your preferred party date and time (required, June 1st 8.30am to June 30th 4.30pm):</label>\n        <input id=\"party\" type=\"datetime-local\" name=\"partydate\"\n               min=\"2017-06-01T08:30\" max=\"2017-06-30T16:30\"\n               pattern=\"[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}\" required>\n        <span class=\"validity\"></span>\n    </div>\n    <div>\n        <input type=\"submit\" value=\"Book party!\">\n    </div>\n    <input type=\"hidden\" id=\"timezone\" name=\"timezone\" value=\"-08:00\">\n</form>\n</body>\n"
  },
  {
    "path": "html/forms/datetime-local-picker-fallback/index.html",
    "content": "<!doctype html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>datetime-local control with fallback</title>\n  <style>\n    div {\n      margin-bottom: 10px;\n    }\n\n    input:invalid+span:after {\n      content: '✖';\n      padding-left: 5px;\n    }\n\n    input:valid+span:after {\n      content: '✓';\n      padding-left: 5px;\n    }\n  </style>\n  </head>\n\n<body>\n  <form>\n    <div class=\"nativeDateTimePicker\">\n      <label for=\"party\">Choose a date and time for your party:</label>\n      <input type=\"datetime-local\" id=\"party\" name=\"bday\">\n      <span class=\"validity\"></span>\n    </div>\n    <p class=\"fallbackLabel\">Choose a date and time for your party:</p>\n    <div class=\"fallbackDateTimePicker\">\n      <div>\n        <span>\n          <label for=\"day\">Day:</label>\n          <select id=\"day\" name=\"day\">\n          </select>\n        </span>\n        <span>\n          <label for=\"month\">Month:</label>\n          <select id=\"month\" name=\"month\">\n            <option selected>January</option>\n            <option>February</option>\n            <option>March</option>\n            <option>April</option>\n            <option>May</option>\n            <option>June</option>\n            <option>July</option>\n            <option>August</option>\n            <option>September</option>\n            <option>October</option>\n            <option>November</option>\n            <option>December</option>\n          </select>\n        </span>\n        <span>\n          <label for=\"year\">Year:</label>\n          <select id=\"year\" name=\"year\">\n          </select>\n        </span>\n      </div>\n      <div>\n        <span>\n          <label for=\"hour\">Hour:</label>\n          <select id=\"hour\" name=\"hour\">\n          </select>\n        </span>\n        <span>\n          <label for=\"minute\">Minute:</label>\n          <select id=\"minute\" name=\"minute\">\n          </select>\n        </span>\n      </div>\n    </div>\n  </form>\n\n  <script>\n// define variables\nvar nativePicker = document.querySelector('.nativeDateTimePicker');\nvar fallbackPicker = document.querySelector('.fallbackDateTimePicker');\nvar fallbackLabel = document.querySelector('.fallbackLabel');\n\nvar yearSelect = document.querySelector('#year');\nvar monthSelect = document.querySelector('#month');\nvar daySelect = document.querySelector('#day');\nvar hourSelect = document.querySelector('#hour');\nvar minuteSelect = document.querySelector('#minute');\n\n// hide fallback initially\nfallbackPicker.style.display = 'none';\nfallbackLabel.style.display = 'none';\n\n// test whether a new date input falls back to a text input or not\nvar test = document.createElement('input');\n\ntry {\n  test.type = 'datetime-local';\n} catch (e) {\n  console.log(e.description);\n}\n\n// if it does, run the code inside the if() {} block\nif(test.type === 'text') {\n  // hide the native picker and show the fallback\n  nativePicker.style.display = 'none';\n  fallbackPicker.style.display = 'block';\n  fallbackLabel.style.display = 'block';\n\n  // populate the days and years dynamically\n  // (the months are always the same, therefore hardcoded)\n  populateDays(monthSelect.value);\n  populateYears();\n  populateHours();\n  populateMinutes();\n}\n\nfunction populateDays(month) {\n  // delete the current set of <option> elements out of the\n  // day <select>, ready for the next set to be injected\n  while(daySelect.firstChild){\n    daySelect.removeChild(daySelect.firstChild);\n  }\n\n  // Create variable to hold new number of days to inject\n  var dayNum;\n\n  // 31 or 30 days?\n  if(month === 'January' | month === 'March' | month === 'May' | month === 'July' | month === 'August' | month === 'October' | month === 'December') {\n    dayNum = 31;\n  } else if(month === 'April' | month === 'June' | month === 'September' | month === 'November') {\n    dayNum = 30;\n  } else {\n  // If month is February, calculate whether it is a leap year or not\n    var year = yearSelect.value;\n    var isLeap = new Date(year, 1, 29).getMonth() == 1;\n    isLeap ? dayNum = 29 : dayNum = 28;\n  }\n\n  // inject the right number of new <option> elements into the day <select>\n  for(i = 1; i <= dayNum; i++) {\n    var option = document.createElement('option');\n    option.textContent = i;\n    daySelect.appendChild(option);\n  }\n\n  // if previous day has already been set, set daySelect's value\n  // to that day, to avoid the day jumping back to 1 when you\n  // change the year\n  if(previousDay) {\n    daySelect.value = previousDay;\n\n    // If the previous day was set to a high number, say 31, and then\n    // you chose a month with less total days in it (e.g. February),\n    // this part of the code ensures that the highest day available\n    // is selected, rather than showing a blank daySelect\n    if(daySelect.value === \"\") {\n      daySelect.value = previousDay - 1;\n    }\n\n    if(daySelect.value === \"\") {\n      daySelect.value = previousDay - 2;\n    }\n\n    if(daySelect.value === \"\") {\n      daySelect.value = previousDay - 3;\n    }\n  }\n}\n\nfunction populateYears() {\n  // get this year as a number\n  var date = new Date();\n  var year = date.getFullYear();\n\n  // Make this year, and the 100 years before it available in the year <select>\n  for(var i = 0; i <= 100; i++) {\n    var option = document.createElement('option');\n    option.textContent = year-i;\n    yearSelect.appendChild(option);\n  }\n}\n\nfunction populateHours() {\n  // populate the hours <select> with the 24 hours of the day\n  for(var i = 0; i <= 23; i++) {\n    var option = document.createElement('option');\n    option.textContent = (i < 10) ? (\"0\" + i) : i;\n    hourSelect.appendChild(option);\n  }\n}\n\nfunction populateMinutes() {\n  // populate the minutes <select> with the 60 hours of each minute\n  for(var i = 0; i <= 59; i++) {\n    var option = document.createElement('option');\n    option.textContent = (i < 10) ? (\"0\" + i) : i;\n    minuteSelect.appendChild(option);\n  }\n}\n\n// when the month or year <select> values are changed, rerun populateDays()\n// in case the change affected the number of available days\nyearSelect.onchange = function() {\n  populateDays(monthSelect.value);\n}\n\nmonthSelect.onchange = function() {\n  populateDays(monthSelect.value);\n}\n\n//preserve day selection\nvar previousDay;\n\n// update what day has been set to previously\n// see end of populateDays() for usage\ndaySelect.onchange = function() {\n  previousDay = daySelect.value;\n}\n  </script>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/editable-input-example/editable_input.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Editable form &lt;input&gt; example</title>\n    <style>\n      textarea {\n        height: 80px;\n        background-color: #F4F7F8;\n        border: none;\n        border-left: 6px solid #558ABB;\n        color: #4D4E53;\n        width: 90%;\n        max-width: 700px;\n        padding: 10px 10px 0px;\n      }\n\n      .playable-buttons {\n        text-align: right;\n        width: 90%;\n        max-width: 700px;\n        padding: 5px 10px 5px 26px;\n      }\n\n      section {\n        width: 90%;\n        max-width: 700px;\n        border: 1px solid #4D4E53;\n        border-radius: 2px;\n        padding: 10px 14px 10px 10px;\n        margin-bottom: 10px;\n      }\n\n      section input {\n        display: block;\n        margin: 5px;\n      }\n    </style>\n  </head>\n  <body>\n    <section>\n    </section>\n\n    <textarea id=\"code\" class=\"playable-code\">\n<input id=\"input1\" type=\"text\">\n<input id=\"input2\" type=\"text\">\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\">\n    </div>\n  </body>\n\n  <script>\n    var section = document.querySelector('section');\n    var textarea = document.getElementById('code');\n    var reset = document.getElementById('reset');\n    var edit = document.getElementById('edit');\n    var code = textarea.value;\n\n    function fillSection() {\n      while (section.firstChild) {\n          section.removeChild(section.firstChild);\n      }\n      section.innerHTML = textarea.value;\n    }\n\n    reset.addEventListener('click', function() {\n      textarea.value = code;\n      fillSection();\n    });\n\n    textarea.addEventListener('input', fillSection);\n    window.addEventListener('load', fillSection);\n  </script>\n</html>\n"
  },
  {
    "path": "html/forms/file-examples/file-example.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <title>Complete file example</title>\n  <style>\n    html {\n      font-family: sans-serif;\n    }\n\n    form {\n      width: 600px;\n      background: #ccc;\n      margin: 0 auto;\n      padding: 20px;\n      border: 1px solid black;\n    }\n\n    form ol {\n      padding-left: 0;\n    }\n\n    form li, div > p {\n      background: #eee;\n      display: flex;\n      justify-content: space-between;\n      margin-bottom: 10px;\n      list-style-type: none;\n      border: 1px solid black;\n    }\n\n    form img {\n      height: 64px;\n      order: 1;\n    }\n\n    form p {\n      line-height: 32px;\n      padding-left: 10px;\n    }\n\n    form label, form button {\n      background-color: #7F9CCB;\n      padding: 5px 10px;\n      border-radius: 5px;\n      border: 1px ridge black;\n      font-size: 0.8rem;\n      height: auto;\n    }\n\n    form label:hover, form button:hover {\n      background-color: #2D5BA3;\n      color: white;\n    }\n\n    form label:active, form button:active {\n      background-color: #0D3F8F;\n      color: white;\n    }\n  </style>\n  </head>\n<body>\n  <form>\n    <div>\n      <label for=\"image_uploads\">Choose images to upload (PNG, JPG)</label>\n      <input type=\"file\" id=\"image_uploads\" name=\"image_uploads\" accept=\".jpg, .jpeg, .png\" multiple>\n    </div>\n    <div class=\"preview\">\n      <p>No files currently selected for upload</p>\n    </div>\n    <div>\n      <button>Submit</button>\n    </div>\n  </form>\n  <script>\n    const input = document.querySelector('input');\n    const preview = document.querySelector('.preview');\n\n    input.style.opacity = 0;\n\n    input.addEventListener('change', updateImageDisplay);\n\n    function updateImageDisplay() {\n      while(preview.firstChild) {\n        preview.removeChild(preview.firstChild);\n      }\n\n      const curFiles = input.files;\n      if(curFiles.length === 0) {\n        const para = document.createElement('p');\n        para.textContent = 'No files currently selected for upload';\n        preview.appendChild(para);\n      } else {\n        const list = document.createElement('ol');\n        preview.appendChild(list);\n\n        for(const file of curFiles) {\n          const listItem = document.createElement('li');\n          const para = document.createElement('p');\n\n          if(validFileType(file)) {\n            para.textContent = `File name ${file.name}, file size ${returnFileSize(file.size)}.`;\n            const image = document.createElement('img');\n            image.src = URL.createObjectURL(file);\n\n            listItem.appendChild(image);\n            listItem.appendChild(para);\n          } else {\n            para.textContent = `File name ${file.name}: Not a valid file type. Update your selection.`;\n            listItem.appendChild(para);\n          }\n\n          list.appendChild(listItem);\n        }\n      }\n    }\n\n// https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Image_types\n    const fileTypes = [\n        'image/apng',\n        'image/bmp',\n        'image/gif',\n        'image/jpeg',\n        'image/pjpeg',\n        'image/png',\n        'image/svg+xml',\n        'image/tiff',\n        'image/webp',\n        `image/x-icon`\n    ];\n\n    function validFileType(file) {\n      return fileTypes.includes(file.type);\n    }\n\n    function returnFileSize(number) {\n      if(number < 1024) {\n        return number + 'bytes';\n      } else if(number > 1024 && number < 1048576) {\n        return (number/1024).toFixed(1) + 'KB';\n      } else if(number > 1048576) {\n        return (number/1048576).toFixed(1) + 'MB';\n      }\n    }\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": "html/forms/file-examples/file-with-accept.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <title>File upload example with accept</title>\n    <style>\n      div {\n        margin-bottom: 10px;\n      }\n    </style>\n  </head>\n  <body>\n<form>\n <div>\n   <label for=\"profile_pic\">Choose file to upload</label>\n   <input type=\"file\" id=\"profile_pic\" name=\"profile_pic\" accept=\".jpg, .jpeg, .png\">\n </div>\n <div>\n   <button>Submit</button>\n </div>\n</form>\n     <script>\n       var test = document.querySelector('input');\n     </script>\n  </body>\n</html>\n"
  },
  {
    "path": "html/forms/file-examples/simple-file.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <title>File upload example</title>\n    <style>\n      div {\n        margin-bottom: 10px;\n      }\n    </style>\n  </head>\n  <body>\n      <form>\n       <div>\n         <label for=\"file\">Choose file to upload</label>\n         <input type=\"file\" id=\"file\" name=\"file\" multiple>\n       </div>\n       <div>\n         <button>Submit</button>\n       </div>\n      </form>\n     <script>\n       var test = document.querySelector('input');\n     </script>\n  </body>\n</html>\n"
  },
  {
    "path": "html/forms/form-validation/custom-error-message.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple custom error message</title>\n    <style>\n      input:invalid {\n        border: 2px dashed red;\n      }\n\n      input:valid {\n        border: 2px solid black;\n      }\n      form {\n        margin: 3rem 0;\n      }\n    </style>\n  </head>\n\n<body>\n  <form>\n    <label for=\"mail\">I would like you to provide me with an e-mail address:</label>\n    <input type=\"email\" id=\"mail\" name=\"mail\">\n    <button>Submit</button>\n  </form>\n\n  <script>\n  const email = document.getElementById(\"mail\");\n\n  email.addEventListener(\"input\", function (event) {\n    if (email.validity.typeMismatch) {\n      email.setCustomValidity(\"I am expecting an e-mail address!\");\n    } else {\n      email.setCustomValidity(\"\");\n    }\n  });\n  </script>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/form-validation/detailed-custom-validation.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Detailed custom validation</title>\n    <style>\n      body {\n        font: 1em sans-serif;\n        width: 200px;\n        padding: 0;\n        margin : 0 auto;\n      }\n\n      p * {\n        display: block;\n      }\n\n      input[type=email]{\n        -webkit-appearance: none;\n        appearance: none;\n\n        width: 100%;\n        border: 1px solid #333;\n        margin: 0;\n\n        font-family: inherit;\n        font-size: 90%;\n\n        box-sizing: border-box;\n      }\n\n      /* This is our style for the invalid fields */\n      input:invalid{\n        border-color: #900;\n        background-color: #FDD;\n      }\n\n      input:focus:invalid {\n        outline: none;\n      }\n\n      /* This is the style of our error messages */\n      .error {\n        width  : 100%;\n        padding: 0;\n\n        font-size: 80%;\n        color: white;\n        background-color: #900;\n        border-radius: 0 0 5px 5px;\n\n        box-sizing: border-box;\n      }\n\n      .error.active {\n        padding: 0.3em;\n      }\n    </style>\n  </head>\n\n<body>\n  <form novalidate>\n    <p>\n      <label for=\"mail\">\n        <span>Please enter an email address:</span>\n        <input type=\"email\" id=\"mail\" name=\"mail\" required minlength=\"8\">\n        <span class=\"error\" aria-live=\"polite\"></span>\n      </label>\n    </p>\n    <button>Submit</button>\n  </form>\n\n  <script>\n    // There are many ways to pick a DOM node; here we get the form itself and the email\n    // input box, as well as the span element into which we will place the error message.\n    const form  = document.getElementsByTagName('form')[0];\n\n    const email = document.getElementById('mail');\n    const emailError = document.querySelector('#mail + span.error');\n\n    email.addEventListener('input', function (event) {\n      // Each time the user types something, we check if the\n      // form fields are valid.\n\n      if (email.validity.valid) {\n        // In case there is an error message visible, if the field\n        // is valid, we remove the error message.\n        emailError.innerHTML = ''; // Reset the content of the message\n        emailError.className = 'error'; // Reset the visual state of the message\n      } else {\n        // If there is still an error, show the correct error\n        showError();\n      }\n    });\n\n    form.addEventListener('submit', function (event) {\n      // if the form contains valid data, we let it submit\n\n      if(!email.validity.valid) {\n        // If it isn't, we display an appropriate error message\n        showError();\n        // Then we prevent the form from being sent by canceling the event\n        event.preventDefault();\n      }\n    });\n\n    function showError() {\n      if(email.validity.valueMissing) {\n        // If the field is empty\n        // display the following error message.\n        emailError.textContent = 'You need to enter an e-mail address.';\n      } else if(email.validity.typeMismatch) {\n        // If the field doesn't contain an email address\n        // display the following error message.\n        emailError.textContent = 'Entered value needs to be an e-mail address.';\n      } else if(email.validity.tooShort) {\n        // If the data is too short\n        // display the following error message.\n        emailError.textContent = `Email should be at least ${ email.minLength } characters; you entered ${ email.value.length }.`;\n      }\n\n      // Set the styling appropriately\n      emailError.className = 'error active';\n    }\n  </script>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/form-validation/fruit-length.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title>Favorite fruit length constraint</title>\n    <style>\n      input:invalid {\n        border: 2px dashed red;\n      }\n\n      input:valid {\n        border: 2px solid black;\n      }\n\n      div {\n        margin-bottom: 1rem;\n      }\n      form {\n        margin: 2rem 0 2rem 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n      <div>\n        <label for=\"choose\">Would you prefer a banana or a cherry?</label>\n        <input id=\"choose\" name=\"i_like\" required minlength=\"6\" maxlength=\"6\" />\n      </div>\n      <div>\n        <label for=\"number\">How many would you like?</label>\n        <input\n          type=\"number\"\n          id=\"number\"\n          name=\"amount\"\n          value=\"1\"\n          min=\"1\"\n          max=\"10\"\n        />\n      </div>\n      <div>\n        <button>Submit</button>\n      </div>\n    </form>\n  </body>\n</html>\n"
  },
  {
    "path": "html/forms/form-validation/fruit-pattern.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Favorite fruit with required and pattern attributes</title>\n    <style>\n      input:invalid {\n        border: 2px dashed red;\n      }\n\n      input:valid {\n        border: 2px solid black;\n      }\n    </style>\n  </head>\n\n<body>\n    <form>\n      <label for=\"choose\">Would you prefer a banana or a cherry?</label>\n      <input id=\"choose\" name=\"i_like\" required pattern=\"[Bb]anana|[Cc]herry\">\n      <button>Submit</button>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/form-validation/fruit-required.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Favorite fruit with required attribute</title>\n    <style>\n      input:invalid {\n        border: 2px dashed red;\n      }\n\n      input:invalid:required {\n        background-image: linear-gradient(to right, pink, lightgreen);\n      }\n\n      input:valid {\n        border: 2px solid black;\n      }\n    </style>\n  </head>\n\n<body>\n    <form>\n      <label for=\"choose\">Would you prefer a banana or a cherry?</label>\n      <input id=\"choose\" name=\"i_like\" required>\n      <button>Submit</button>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/form-validation/fruit-start.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Favorite fruit start</title>\n    <style>\n      input:invalid {\n        border: 2px dashed red;\n      }\n\n      input:valid {\n        border: 2px solid black;\n      }\n    </style>\n  </head>\n\n<body>\n    <form>\n      <label for=\"choose\">Would you prefer a banana or a cherry?</label>\n      <input id=\"choose\" name=\"i_like\">\n      <button>Submit</button>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/form-validation/full-example.html",
    "content": "<!doctype html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title>Full built-in validation example</title>\n    <style>\n      form {\n        font: 1em sans-serif;\n        max-width: 320px;\n      }\n\n      p > label {\n        display: block;\n      }\n\n      input[type=\"text\"],\n      input[type=\"email\"],\n      input[type=\"number\"],\n      textarea,\n      fieldset {\n        width: 100%;\n        border: 1px solid #333;\n        box-sizing: border-box;\n      }\n\n      input:invalid {\n        box-shadow: 0 0 5px 1px red;\n      }\n\n      input:focus:invalid {\n        box-shadow: none;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n      <fieldset>\n        <legend>\n          Do you have a driver's license?<span aria-label=\"required\">*</span>\n        </legend>\n        <!-- While only one radio button in a same-named group can be selected at a time,\n           and therefore only one radio button in a same-named group having the \"required\"\n           attribute suffices in making a selection a requirement -->\n        <input type=\"radio\" required name=\"driver\" id=\"r1\" value=\"yes\" /><label\n          for=\"r1\"\n          >Yes</label\n        >\n        <input type=\"radio\" required name=\"driver\" id=\"r2\" value=\"no\" /><label\n          for=\"r2\"\n          >No</label\n        >\n      </fieldset>\n      <p>\n        <label for=\"n1\">How old are you?</label>\n        <!-- The pattern attribute can act as a fallback for browsers which\n           don't implement the number input type but support the pattern attribute.\n           Please note that browsers that support the pattern attribute will make it\n           fail silently when used with a number field.\n           Its usage here acts only as a fallback -->\n        <input\n          type=\"number\"\n          min=\"12\"\n          max=\"120\"\n          step=\"1\"\n          id=\"n1\"\n          name=\"age\"\n          pattern=\"\\d+\"\n        />\n      </p>\n      <p>\n        <label for=\"t1\"\n          >What's your favorite fruit?<span aria-label=\"required\"\n            >*</span\n          ></label\n        >\n        <input\n          type=\"text\"\n          id=\"t1\"\n          name=\"fruit\"\n          list=\"l1\"\n          required\n          pattern=\"[Bb]anana|[Cc]herry|[Aa]pple|[Ss]trawberry|[Ll]emon|[Oo]range\"\n        />\n        <datalist id=\"l1\">\n          <option>Banana</option>\n          <option>Cherry</option>\n          <option>Apple</option>\n          <option>Strawberry</option>\n          <option>Lemon</option>\n          <option>Orange</option>\n        </datalist>\n      </p>\n      <p>\n        <label for=\"t2\">What's your e-mail address?</label>\n        <input type=\"email\" id=\"t2\" name=\"email\" />\n      </p>\n      <p>\n        <label for=\"t3\">Leave a short message</label>\n        <textarea id=\"t3\" name=\"msg\" maxlength=\"140\" rows=\"5\"></textarea>\n      </p>\n      <p>\n        <button>Submit</button>\n      </p>\n    </form>\n  </body>\n</html>\n"
  },
  {
    "path": "html/forms/form-validation/min-max.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Minimum and maximum examples</title>\n    <style>\n      input:invalid {\n        border: 2px dashed red;\n      }\n\n      input:valid {\n        border: 2px solid black;\n      }\n    </style>\n  </head>\n\n<body>\n    <form>\n      <p>\n        <label for=\"n1\">How old are you?</label>\n        <input type=\"number\" id=\"n1\" name=\"age\" pattern=\"\\d+\" min=\"12\" max=\"120\">\n      </p>\n      <p>\n        <label for=\"t3\">Leave a short message</label>\n        <textarea id=\"t3\" name=\"msg\" rows=\"5\" maxlength=\"10\"></textarea>\n      </p>\n      <p>\n        <button>Submit</button>\n      </p>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/hidden-input-example/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>&lt;input type=\"hidden\"&gt; example</title>\n  <style>\n    html {\n      font-family: sans-serif;\n    }\n\n    form {\n      width: 500px;\n    }\n\n    div {\n      display: flex;\n      margin-bottom: 10px;\n    }\n\n    label {\n      flex: 2;\n      line-height: 2;\n      text-align: right;\n      padding-right: 20px;\n    }\n\n    input, textarea {\n      flex: 7;\n      font-family: sans-serif;\n      font-size: 1.1rem;\n      padding: 5px;\n    }\n\n    textarea {\n      height: 60px;\n    }\n\n  </style>\n  </head>\n<body>\n  <form>\n    <div>\n      <label for=\"title\">Post title:</label>\n      <input type=\"text\" id=\"title\" name=\"title\" value=\"My excellent blog post\">\n    </div>\n    <div>\n      <label for=\"content\">Post content:</label>\n      <textarea id=\"content\" name=\"content\">\nThis is the content of my excellent blog post. I hope you enjoy it!\n      </textarea>\n    </div>\n    <div>\n      <button type=\"submit\">Update post</button>\n    </div>\n    <input type=\"hidden\" id=\"postId\" name=\"postId\" value=\"34657\">\n  </form>\n</body>\n"
  },
  {
    "path": "html/forms/html-form-structure/checkbox-label.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Checkbox label example</title>\n  </head>\n\n<body>\n    <form>\n          <p>\n            <input type=\"checkbox\" id=\"taste_1\" name=\"taste_cherry\" value=\"cherry\">\n            <label for=\"taste_1\">I like cherry</label>\n          </p>\n          <p>\n            <input type=\"checkbox\" id=\"taste_2\" name=\"taste_banana\" value=\"banana\">\n            <label for=\"taste_2\">I like banana</label>\n          </p>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/html-form-structure/fieldset-legend.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>fieldset and legend example</title>\n  </head>\n\n<body>\n    <form>\n        <fieldset>\n            <legend>Fruit juice size</legend>\n            <p> <input type=\"radio\" name=\"size\" id=\"size_1\" value=\"small\"> <label for=\"size_1\">Small</label> </p>\n            <p> <input type=\"radio\" name=\"size\" id=\"size_2\" value=\"medium\"> <label for=\"size_2\">Medium</label> </p>\n            <p> <input type=\"radio\" name=\"size\" id=\"size_3\" value=\"large\"> <label for=\"size_3\">Large</label> </p>\n        </fieldset>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/html-form-structure/required-labels.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Required label examples</title>\n  </head>\n\n<body>\n    <form>\n        <p>Required fields are followed by <span aria-label=\"required\">*</span>.</p>\n\n        <!-- So this: -->\n        <!--<div>\n          <label for=\"username\">Name:</label>\n          <input type=\"text\" name=\"username\">\n          <label for=\"username\"><span aria-label=\"required\">*</span></label>\n        </div>-->\n\n        <!-- would be better done like this: -->\n        <!--<div>\n          <label for=\"username\">\n            <span>Name:</span>\n            <input id=\"username\" type=\"text\" name=\"username\">\n            <span aria-label=\"required\">*</span>\n          </label>\n        </div>-->\n\n        <!-- But this is probably best: -->\n        <div>\n          <label for=\"username\">Name: <span aria-label=\"required\">*</span></label>\n          <input id=\"username\" type=\"text\" name=\"username\">\n        </div>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/image-type-example/index.html",
    "content": "<!doctype html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>&lt;input type=\"image\"&gt; example</title>\n  <style>\n    div {\n      margin-bottom: 10px;\n    }\n\n    label {\n      display: inline-block;\n      width: 70px;\n      text-align: right;\n      padding-right: 10px;\n    }\n  </style>\n  </head>\n<body>\n  <form>\n    <p>Login to your account</p>\n    <div>\n      <label for=\"userId\">User ID</label>\n      <input type=\"text\" id=\"userId\" name=\"userId\">\n    </div>\n    <div>\n      <label for=\"pwd\">Password</label>\n      <input type=\"password\" id=\"pwd\" name=\"pwd\">\n    </div>\n    <div>\n      <input id=\"image\" type=\"image\" src=\"login.png\" alt=\"login button\" width=\"100\">\n    </div>\n  </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/image-type-example/xy-coordinates-example.html",
    "content": "<!doctype html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>X Y coordinates example</title>\n  <style>\n    div {\n      margin-bottom: 10px;\n    }\n\n    label {\n      display: inline-block;\n      width: 70px;\n      text-align: right;\n      padding-right: 10px;\n    }\n  </style>\n  </head>\n<body>\n  <form>\n    <p>Choose your favourite color</p>\n    <div>\n      <input id=\"image\" type=\"image\" src=\"colors.png\" alt=\"image of four colored squares\">\n    </div>\n  </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/indeterminate-example/index.html",
    "content": "<!doctype html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Indeterminate &lt;input type=\"checkbox\"&gt; example</title>\n  </head>\n\n<body>\n  <form>\n    <fieldset>\n    <legend>Complete the recipe</legend>\n      <div>\n        <input type=\"checkbox\" id=\"enchantment\" name=\"enchantment\">\n        <label for=\"enchantment\">Enchantment table</label>\n        <ul>\n          <li>\n            <input type=\"checkbox\" id=\"book\" name=\"ingredient\" value=\"book\">\n            <label for=\"book\">Book</label>\n          </li>\n          <li>\n            <input type=\"checkbox\" id=\"diamonds\" name=\"ingredient\" value=\"diamonds\">\n            <label for=\"diamonds\">Diamonds (x2)</label>\n          </li>\n          <li>\n            <input type=\"checkbox\" id=\"obsidian\" name=\"ingredient\" value=\"obsidian\">\n            <label for=\"obsidian\">Obsidian (x4)</label>\n          </li>\n        </ul>\n      </div>\n    </fieldset>\n  </form>\n  <script>\n    const overall = document.querySelector('#enchantment');\n    const ingredients = document.querySelectorAll('ul input');\n\n    overall.addEventListener('click', (e) => {\n      e.preventDefault();\n    });\n\n    for(const ingredient of ingredients) {\n      ingredient.addEventListener('click', updateDisplay);\n    }\n\n    function updateDisplay() {\n      let checkedCount = 0;\n      for(const ingredient of ingredients) {\n        if(ingredient.checked) {\n          checkedCount++;\n        }\n      }\n\n      if(checkedCount === 0) {\n        overall.checked = false;\n        overall.indeterminate = false;\n      } else if(checkedCount === ingredients.length) {\n        overall.checked = true;\n        overall.indeterminate = false;\n      } else {\n        overall.checked = false;\n        overall.indeterminate = true;\n      }\n    }\n  </script>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/month-examples/month-validation.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset = \"utf-8\">\n    <title>Month example</title>\n    <style>\n      div {\n        margin-bottom: 10px;\n        position: relative;\n      }\n\n      input[type=\"number\"] {\n        width: 100px;\n      }\n\n      input + span {\n        padding-right: 30px;\n      }\n\n      input:invalid+span:after {\n        position: absolute;\n        content: '✖';\n        padding-left: 5px;\n      }\n\n      input:valid+span:after {\n        position: absolute;\n        content: '✓';\n        padding-left: 5px;\n      }\n    </style>\n   </head>\n  <body>\n    <form>\n      <div>\n        <label for=\"month\">What Month would you like to visit us? (Summer months only.)</label>\n        <input id=\"month\" type=\"month\" name=\"month\"\n               min=\"2017-06\" max=\"2017-09\" required>\n        <span class=\"validity\"></span>\n      </div>\n      <div>\n          <input type=\"submit\" value=\"Submit form\">\n      </div>\n    </form>\n</body>\n  </html>\n"
  },
  {
    "path": "html/forms/native-form-widgets/advanced-examples.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Advanced examples</title>\n  </head>\n\n<body>\n    <form>\n        <p>\n          <label for=\"age\">What is your age?</label>\n          <input type=\"number\" name=\"age\" id=\"age\" min=\"1\" max=\"10\" step=\"2\">\n        </p>\n        <p>\n          <label for=\"beans\">How many beans can you eat?</label>\n          <input type=\"range\" name=\"beans\" id=\"beans\" min=\"0\" max=\"500\" step=\"10\">\n          <span class=\"beancount\"></span>\n        </p>\n        <p>\n          <label for=\"myDate\">When are you available this summer?</label>\n          <input type=\"date\" name=\"myDate\" min=\"2013-06-01\" max=\"2013-08-31\" id=\"myDate\">\n        </p>\n        <p>\n          <label for=\"meet\">When shall we have the meeting?</label>\n          <input type=\"datetime-local\" name=\"meet\" id=\"meet\">\n        </p>\n        <p>\n          <label for=\"month\">What month is your favorite?</label>\n          <input type=\"month\" name=\"month\" id=\"month\">\n        </p>\n        <p>\n          <label for=\"time\">Set the time for your wifi fridge</label>\n          <input type=\"time\" name=\"time\" id=\"time\">\n        </p>\n        <p>\n          <label for=\"color\">What is your favourite color?</label>\n          <input type=\"color\" name=\"color\" id=\"color\">\n        </p>\n    </form>\n<script>\n   var beans = document.querySelector('#beans');\n   var count = document.querySelector('.beancount');\n\n   count.textContent = beans.value;\n\n   beans.oninput = function() {\n     count.textContent = beans.value;\n   }\n</script>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/native-form-widgets/button-examples.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Button examples</title>\n  </head>\n\n<body>\n    <form>\n        <p>\n          <button type=\"submit\">\n            This a <br><strong>submit button</strong>\n          </button>\n        </p>\n        <p>\n          <input type=\"submit\" value=\"This is a submit button\">\n        </p>\n        <p>\n          <button type=\"reset\">\n              This a <br><strong>reset button</strong>\n          </button>\n        </p>\n        <p>\n          <input type=\"reset\" value=\"This is a reset button\">\n        </p>\n        <p>\n          <button type=\"button\">\n              This an <br><strong>anonymous button</strong>\n          </button>\n        </p>\n        <p>\n          <input type=\"button\" value=\"This is an anonymous button\">\n        </p>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/native-form-widgets/checkable-items.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Checkable items examples</title>\n  </head>\n\n<body>\n    <form>\n        <fieldset>\n          <legend>Choose all the vegetables you like to eat</legend>\n          <ul>\n            <li>\n              <label for=\"carrots\">Carrots</label>\n              <input type=\"checkbox\" checked id=\"carrots\" name=\"vegetable\" value=\"carrots\">\n            </li>\n            <li>\n              <label for=\"peas\">Peas</label>\n              <input type=\"checkbox\" id=\"peas\" name=\"vegetable\" value=\"peas\">\n            </li>\n            <li>\n              <label for=\"cabbage\">Cabbage</label>\n              <input type=\"checkbox\" id=\"cabbage\" name=\"vegetable\" value=\"cabbage\">\n            </li>\n            <li>\n              <label for=\"cauli\">Cauliflower</label>\n              <input type=\"checkbox\" id=\"cauli\" name=\"vegetable\" value=\"cauli\">\n            </li>\n            <li>\n              <label for=\"broc\">Broccoli</label>\n              <input type=\"checkbox\" id=\"broc\" name=\"vegetable\" value=\"broc\">\n            </li>\n          </ul>\n        </fieldset>\n        <fieldset>\n          <legend>What is your favorite meal?</legend>\n          <ul>\n            <li>\n              <label for=\"soup\">Soup</label>\n              <input type=\"radio\" checked id=\"soup\" name=\"meal\" value=\"soup\">\n            </li>\n            <li>\n              <label for=\"curry\">Curry</label>\n              <input type=\"radio\" id=\"curry\" name=\"meal\" value=\"curry\">\n            </li>\n            <li>\n              <label for=\"pizza\">Pizza</label>\n              <input type=\"radio\" id=\"pizza\" name=\"meal\" value=\"pizza\">\n            </li>\n            <li>\n              <label for=\"tacos\">Tacos</label>\n              <input type=\"radio\" id=\"tacos\" name=\"meal\" value=\"tacos\">\n            </li>\n            <li>\n              <label for=\"bolognaise\">Bolognaise</label>\n              <input type=\"radio\" id=\"bolognaise\" name=\"meal\"  value=\"bolognaise\">\n            </li>\n          </ul>\n        </fieldset>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/native-form-widgets/drop-down-content.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Drop down content examples</title>\n  </head>\n\n<body>\n    <form>\n        <p>\n          <label for=\"simple\">A simple select box:</label>\n          <select id=\"simple\" name=\"simple\">\n            <option>Banana</option>\n            <option>Cherry</option>\n            <option>Lemon</option>\n          </select>\n        </p>\n        <p>\n            <label for=\"groups\">Select box with option groups:</label>\n            <select id=\"groups\" name=\"groups\">\n            <optgroup label=\"fruits\">\n              <option>Banana</option>\n              <option selected>Cherry</option>\n              <option>Lemon</option>\n            </optgroup>\n            <optgroup label=\"vegetables\">\n              <option>Carrot</option>\n              <option>Eggplant</option>\n              <option>Potato</option>\n            </optgroup>\n          </select>\n        </p>\n        <p>\n            <label for=\"multi\">Select box allowing multiple selections:</label>\n            <select multiple id=\"multi\" name=\"multi\">\n            <option>Banana</option>\n            <option>Cherry</option>\n            <option>Lemon</option>\n          </select>\n        </p>\n        <p>\n            <label for=\"myFruit\">What's your favorite fruit?</label>\n            <input type=\"text\" name=\"myFruit\" id=\"myFruit\" list=\"mySuggestion\">\n            <datalist id=\"mySuggestion\">\n              <option>Apple</option>\n              <option>Banana</option>\n              <option>Blackberry</option>\n              <option>Blueberry</option>\n              <option>Lemon</option>\n              <option>Lychee</option>\n              <option>Peach</option>\n              <option>Pear</option>\n            </datalist>\n        </p>\n        <p>\n            <label for=\"myFruit\">What is your favorite fruit? (With fallback)</label>\n            <input type=\"text\" id=\"myFruit\" name=\"fruit\" list=\"fruitList\">\n            <datalist id=\"fruitList\">   <label for=\"suggestion\">or pick a fruit</label>\n              <select id=\"suggestion\" name=\"altFruit\">\n                <option>Apple</option>\n                <option>Banana</option>\n                <option>Blackberry</option>\n                <option>Blueberry</option>\n                <option>Lemon</option>\n                <option>Lychee</option>\n                <option>Peach</option>\n                <option>Pear</option>\n              </select>\n            </datalist>\n        </p>\n        <p>\n            <button type=\"submit\">Submit me!</button>\n        </p>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/native-form-widgets/multi-line-text-field.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Multiple line text field example</title>\n    <style>\n      textarea {\n        width: 50px;\n      }\n    </style>\n  </head>\n\n<body>\n    <form>\n        <p>\n          <label for=\"comment\">Add a comment here:</label>\n          <textarea cols=\"30\" rows=\"10\">\nThis is my default content.\n          </textarea>\n        </p>\n        <p>\n          <button type=\"submit\">Submit me!</button>\n        </p>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/native-form-widgets/other-examples.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Other examples</title>\n  </head>\n\n<body>\n    <form>\n        <p>\n          <label for=\"file\">Choose an image to upload</label>\n          <input type=\"file\" name=\"file\" id=\"file\" accept=\"image/*\" multiple>\n        </p>\n        <div>\n          <input type=\"hidden\" id=\"timestamp\" name=\"timestamp\" value=\"1286705410\">\n        </div>\n        <p>\n          <input type=\"image\" name=\"pos\" alt=\"Ramsbottom\" src=\"map.png\">\n        </p>\n        <p>\n          <progress max=\"100\" value=\"75\">75/100</progress>\n        </p>\n        <p>\n          <meter min=\"0\" max=\"100\" value=\"75\" low=\"33\" high=\"66\" optimum=\"50\">75</meter>\n        </p>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/native-form-widgets/positioned-legend.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Positioned legend example</title>\n    <style>\n      form {\n        width: 500px;\n        margin: 0 auto;\n      }\n\n      fieldset {\n        position: relative;\n        margin-bottom: 20px;\n      }\n\n      legend {\n        position: absolute;\n        color: white;\n        background-color: black;\n        padding: 3px;\n        bottom: 0;\n        right: 0;\n      }\n    </style>\n  </head>\n<body>\n    <form>\n        <fieldset>\n          <legend>Choose all the vegetables you like to eat</legend>\n          <ul>\n            <li>\n              <label for=\"carrots\">Carrots</label>\n              <input type=\"checkbox\" checked id=\"carrots\" name=\"carrots\" value=\"carrots\">\n            </li>\n            <li>\n              <label for=\"peas\">Peas</label>\n              <input type=\"checkbox\" id=\"peas\" name=\"peas\" value=\"peas\">\n            </li>\n            <li>\n              <label for=\"cabbage\">Cabbage</label>\n              <input type=\"checkbox\" id=\"cabbage\" name=\"cabbage\" value=\"cabbage\">\n            </li>\n            <li>\n              <label for=\"cauli\">Cauliflower</label>\n              <input type=\"checkbox\" id=\"cauli\" name=\"cauli\" value=\"cauli\">\n            </li>\n            <li>\n              <label for=\"broc\">Broccoli</label>\n              <input type=\"checkbox\" id=\"broc\" name=\"broc\" value=\"broc\">\n            </li>\n          </ul>\n        </fieldset>\n        <fieldset>\n          <legend>What is your favorite meal?</legend>\n          <ul>\n            <li>\n              <label for=\"soup\">Soup</label>\n              <input type=\"radio\" checked id=\"soup\" name=\"meal\" value=\"soup\">\n            </li>\n            <li>\n              <label for=\"curry\">Curry</label>\n              <input type=\"radio\" id=\"curry\" name=\"meal\" value=\"curry\">\n            </li>\n            <li>\n              <label for=\"pizza\">Pizza</label>\n              <input type=\"radio\" id=\"pizza\" name=\"meal\" value=\"pizza\">\n            </li>\n            <li>\n              <label for=\"tacos\">Tacos</label>\n              <input type=\"radio\" id=\"tacos\" name=\"meal\" value=\"tacos\">\n            </li>\n            <li>\n              <label for=\"bolognaise\">Bolognaise</label>\n              <input type=\"radio\" id=\"bolognaise\" name=\"meal\"  value=\"bolognaise\">\n            </li>\n          </ul>\n        </fieldset>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/native-form-widgets/single-line-text-fields.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Single line text field examples</title>\n  </head>\n\n<body>\n    <form>\n        <p>\n          <label for=\"comment\">Add a comment here:</label>\n          <input type=\"text\" id=\"comment\" name=\"comment\" value=\"I'm a text field\">\n        </p>\n        <p>\n          <label for=\"email\">Enter your email address:</label>\n          <input type=\"email\" id=\"email\" name=\"email\" multiple>\n        </p>\n        <p>\n          <label for=\"pwd\">Enter your password:</label>\n          <input type=\"password\" id=\"pwd\" name=\"pwd\">\n        </p>\n        <p>\n          <label for=\"search\">Search:</label>\n          <input type=\"search\" id=\"search\" name=\"search\">\n        </p>\n        <p>\n          <label for=\"tel\">Enter your number:</label>\n          <input type=\"tel\" id=\"tel\" name=\"tel\">\n        </p>\n        <p>\n          <label for=\"url\">Web address:</label>\n          <input type=\"url\" id=\"url\" name=\"url\">\n        </p>\n        <p>\n          <button type=\"submit\">Submit me!</button>\n        </p>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/number-example/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>&lt;input type=\"number\"&gt; example</title>\n    <style>\n      div {\n        margin-bottom: 10px;\n        position: relative;\n      }\n\n      input[type=\"number\"] {\n        width: 100px;\n      }\n\n      input + span {\n        padding-right: 30px;\n      }\n\n      input:invalid+span:after {\n        position: absolute;\n        content: '✖';\n        padding-left: 5px;\n      }\n\n      input:valid+span:after {\n        position: absolute;\n        content: '✓';\n        padding-left: 5px;\n      }\n    </style>\n  </head>\n\n<body>\n    <form>\n        <div class=\"metersInputGroup\">\n            <label for=\"meters\">Enter your height — meters:</label>\n            <input id=\"meters\" type=\"number\" name=\"meters\" step=\"0.01\" min=\"0\" placeholder=\"e.g. 1.78\" required>\n            <span class=\"validity\"></span>\n        </div>\n        <div class=\"feetInputGroup\" style=\"display: none;\">\n            <span>Enter your height — </span>\n            <label for=\"feet\">feet:</label>\n            <input id=\"feet\" type=\"number\" name=\"feet\" min=\"0\" step=\"1\">\n            <span class=\"validity\"></span>\n            <label for=\"inches\">inches:</label>\n            <input id=\"inches\" type=\"number\" name=\"inches\" min=\"0\" max=\"11\" step=\"1\">\n            <span class=\"validity\"></span>\n        </div>\n        <div>\n          <input type=\"button\" class=\"meters\" value=\"Enter height in feet and inches\">\n        </div>\n        <div>\n            <input type=\"submit\" value=\"Submit form\">\n        </div>\n    </form>\n    <script>\n      var metersInputGroup = document.querySelector('.metersInputGroup');\n      var feetInputGroup = document.querySelector('.feetInputGroup');\n      var metersInput = document.querySelector('#meters');\n      var feetInput = document.querySelector('#feet');\n      var inchesInput = document.querySelector('#inches');\n      var switchBtn = document.querySelector('input[type=\"button\"]');\n\n      switchBtn.addEventListener('click', function() {\n        if(switchBtn.getAttribute('class') === 'meters') {\n          switchBtn.setAttribute('class', 'feet');\n          switchBtn.value = 'Enter height in meters';\n\n          metersInputGroup.style.display = 'none';\n          feetInputGroup.style.display = 'block';\n\n          feetInput.setAttribute('required', '');\n          inchesInput.setAttribute('required', '');\n          metersInput.removeAttribute('required');\n\n          metersInput.value = '';\n        } else {\n          switchBtn.setAttribute('class', 'meters');\n          switchBtn.value = 'Enter height in feet and inches';\n\n          metersInputGroup.style.display = 'block';\n          feetInputGroup.style.display = 'none';\n\n          feetInput.removeAttribute('required');\n          inchesInput.removeAttribute('required');\n          metersInput.setAttribute('required', '');\n\n          feetInput.value = '';\n          inchesInput.value = '';\n        }\n      });\n\n    </script>\n</body>\n"
  },
  {
    "path": "html/forms/postcard-example/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Postcard example</title>\n    <style>\n\n@font-face {\n    font-family: 'handwriting';\n    src: url('fonts/journal-webfont.woff2') format('woff2'),\n         url('fonts/journal-webfont.woff') format('woff');\n    font-weight: normal;\n    font-style: normal;\n}\n\n@font-face {\n    font-family: 'typewriter';\n    src: url('fonts/veteran_typewriter-webfont.woff2') format('woff2'),\n         url('fonts/veteran_typewriter-webfont.woff') format('woff');\n    font-weight: normal;\n    font-style: normal;\n}\n\nbody {\n  font  : 1.3rem sans-serif;\n  padding : 0.5em;\n  margin  : 0;\n  background : #222;\n}\n\nform {\n  position : relative;\n  width  : 740px;\n  height : 498px;\n  margin : 0 auto;\n  padding: 1em;\n  box-sizing: border-box;\n  background : #FFF url(background.jpg);\n\n  /* we create our grid */\n  display  : grid;\n  gap : 20px;\n  grid-template-columns : repeat(2, 1fr);\n  grid-template-rows    : 10em 1em 1em 1em;\n}\n\nh1 {\n  font : 1em \"typewriter\", monospace;\n  align-self : end;\n}\n\n#message {\n   grid-row: 1 / 5;\n}\n\n#from, #reply {\n   display: flex;\n}\n\nlabel {\n  font : .8em \"typewriter\", sans-serif;\n}\n\ninput,\ntextarea {\n  font    : 1.4em/1.5em \"handwriting\", cursive, sans-serif;\n  border  : none;\n  padding : 0 10px;\n  margin  : 0;\n  width   : 80%;\n  background : none;\n}\n\ninput:focus,\ntextarea:focus {\n  background   : rgba(0,0,0,.1);\n  border-radius: 5px;\n}\n\ntextarea {\n  display : block;\n\n  padding : 10px;\n  margin  : 10px 0 0 -10px;\n  width   : 100%;\n  height  : 90%;\n\n  border-right: 1px solid;\n\n  /* resize  : none; */\n  overflow: auto;\n}\n\nbutton {\n  padding      : 5px;\n  font         : bold .6em sans-serif;\n  border       : 2px solid #333;\n  border-radius: 5px;\n  background   : none;\n  cursor       : pointer;\n  transform    : rotate(-1.5deg);\n}\n\nbutton:after {\n  content      : \" >>>\";\n}\n\nbutton:hover,\nbutton:focus {\n  outline     : none;\n  background  : #000;\n  color       : #FFF;\n}\n\n    </style>\n  </head>\n\n<body>\n\n  <form>\n    <h1>to: Mozilla</h1>\n\n    <div id=\"from\">\n      <label for=\"name\">from:</label>\n      <input type=\"text\" id=\"name\" name=\"user_name\">\n    </div>\n\n    <div id=\"reply\">\n      <label for=\"mail\">reply:</label>\n      <input type=\"email\" id=\"mail\" name=\"user_email\">\n    </div>\n\n    <div id=\"message\">\n      <label for=\"msg\">Your message:</label>\n      <textarea id=\"msg\" name=\"user_message\"></textarea>\n    </div>\n\n    <div class=\"button\">\n      <button type=\"submit\">Send your message</button>\n    </div>\n  </form>\n\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/postcard-example/postcard-start.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Postcard example</title>\n    <style>\n\n    </style>\n  </head>\n\n<body>\n\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/pseudo-classes/basic-required-optional.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Basic :required and :optional demo</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Josefin+Sans&display=swap\" rel=\"stylesheet\">\n    <style>\n      body {\n        font-family: 'Josefin Sans', sans-serif;\n        margin: 20px auto;\n        max-width: 460px;\n      }\n\n      fieldset {\n        padding: 10px 30px 0;\n      }\n\n      legend {\n        color: white;\n        background: black;\n        padding: 5px 10px;\n      }\n\n      fieldset > div {\n        margin-bottom: 20px;\n      }\n\n      button, label, input {\n        display: block;\n        font-family: inherit;\n        font-size: 100%;\n        padding: 0;\n        margin: 0;\n        box-sizing: border-box;\n        width: 100%;\n        padding: 5px;\n        height: 30px;\n      }\n\n      input {\n        box-shadow: inset 1px 1px 3px #ccc;\n        border-radius: 5px;\n      }\n\n      input:hover, input:focus {\n        background-color: #eee;\n      }\n\n      input:required {\n        border: 1px solid black;\n      }\n\n      input:optional {\n        border: 1px solid silver;\n      }\n\n      button {\n        width: 60%;\n        margin: 0 auto;\n      }\n    </style>\n  </head>\n\n<body>\n    <form>\n      <fieldset>\n        <legend>Feedback form</legend>\n        <div>\n          <label for=\"fname\">First name: </label>\n          <input id=\"fname\" name=\"fname\" type=\"text\" required>\n        </div>\n        <div>\n          <label for=\"lname\">Last name: </label>\n          <input id=\"lname\" name=\"lname\" type=\"text\" required>\n        </div>\n        <div>\n          <label for=\"email\">Email address (include if you want a response): </label>\n          <input id=\"email\" name=\"email\" type=\"email\">\n        </div>\n        <div><button>Submit</button></div>\n      </fieldset>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/pseudo-classes/enabled-disabled-shipping.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>:enabled and :disabled demo — shipping form</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Josefin+Sans&display=swap\" rel=\"stylesheet\">\n    <style>\n      body {\n        font-family: 'Josefin Sans', sans-serif;\n        margin: 20px auto;\n        max-width: 460px;\n      }\n\n      fieldset {\n        padding: 10px 30px 0;\n        margin-bottom: 20px;\n      }\n\n      legend {\n        color: white;\n        background: black;\n        padding: 5px 10px;\n      }\n\n      fieldset > div {\n        margin-bottom: 20px;\n        display: flex;\n      }\n\n      button, label, input[type=\"text\"] {\n        display: block;\n        font-family: inherit;\n        font-size: 100%;\n        padding: 0;\n        margin: 0;\n        box-sizing: border-box;\n        width: 100%;\n        padding: 5px;\n        height: 30px;\n      }\n\n      input {\n        box-shadow: inset 1px 1px 3px #ccc;\n        border-radius: 5px;\n      }\n\n      input:hover, input:focus {\n        background-color: #eee;\n      }\n\n      input[type=\"text\"]:disabled {\n          background: #eee;\n          border: 1px solid #ccc;\n      }\n\n      label:has(+ :disabled) {\n        color: #aaa;\n      }\n\n      button {\n        width: 60%;\n        margin: 0 auto;\n      }\n    </style>\n  </head>\n\n<body>\n    <form>\n      <fieldset id=\"shipping\">\n        <legend>Shipping address</legend>\n        <div>\n          <label for=\"name1\">Name: </label>\n          <input id=\"name1\" name=\"name1\" type=\"text\" required>\n        </div>\n        <div>\n          <label for=\"address1\">Address: </label>\n          <input id=\"address1\" name=\"address1\" type=\"text\" required>\n        </div>\n        <div>\n          <label for=\"pcode1\">Zip/postal code: </label>\n          <input id=\"pcode1\" name=\"pcode1\" type=\"text\" required>\n        </div>\n      </fieldset>\n      <fieldset id=\"billing\">\n        <legend>Billing address</legend>\n        <div>\n          <label for=\"billing-checkbox\">Same as shipping address:</label>\n          <input type=\"checkbox\" id=\"billing-checkbox\" checked>\n        </div>\n        <div>\n          <label for=\"name\" class=\"billing-label\">Name: </label>\n          <input id=\"name\" name=\"name\" type=\"text\" disabled required>\n        </div>\n        <div>\n          <label for=\"address2\" class=\"billing-label\">Address: </label>\n          <input id=\"address2\" name=\"address2\" type=\"text\" disabled required>\n        </div>\n        <div>\n          <label for=\"pcode2\" class=\"billing-label\">Zip/postal code: </label>\n          <input id=\"pcode2\" name=\"pcode2\" type=\"text\" disabled required>\n        </div>\n      </fieldset>\n\n      <div><button>Submit</button></div>\n    </form>\n\n    <script>\n      // Wait for the page to finish loading\n      document.addEventListener('DOMContentLoaded', function () {\n\n        // Attach `change` event listener to checkbox\n        document.getElementById('billing-checkbox').addEventListener('change', toggleBilling);\n      }, false);\n\n      function toggleBilling() {\n        // Select the billing text fields\n        let billingItems = document.querySelectorAll('#billing input[type=\"text\"]');\n\n        // Toggle the billing text fields\n        for (let i = 0; i < billingItems.length; i++) {\n          billingItems[i].disabled = !billingItems[i].disabled;\n        }\n      }\n    </script>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/pseudo-classes/out-of-range.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>:out-of-range example</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Josefin+Sans&display=swap\" rel=\"stylesheet\">\n    <style>\n      body {\n        font-family: 'Josefin Sans', sans-serif;\n        margin: 20px auto;\n        max-width: 460px;\n      }\n\n      fieldset {\n        padding: 10px 30px 0;\n      }\n\n      legend {\n        color: white;\n        background: black;\n        padding: 5px 10px;\n      }\n\n      fieldset > div {\n        margin-bottom: 20px;\n        display: flex;\n        flex-flow: row wrap;\n      }\n\n      button, label, input {\n        display: block;\n        font-family: inherit;\n        font-size: 100%;\n        padding: 0;\n        margin: 0;\n        box-sizing: border-box;\n        width: 100%;\n        padding: 5px;\n        height: 30px;\n      }\n\n      input {\n        box-shadow: inset 1px 1px 3px #ccc;\n        border-radius: 5px;\n      }\n\n      input:hover, input:focus {\n        background-color: #eee;\n      }\n\n      input + span {\n        position: relative;\n      }\n\n      input + span::after {\n        font-size: 0.7rem;\n        position: absolute;\n        padding: 5px 10px;\n        top: -26px;\n      }\n\n      input:required + span::after {\n        color: white;\n        background-color: black;\n        content: \"required\";\n        left: -70px;\n      }\n\n      input:out-of-range + span::after {\n        color: white;\n        background-color: red;\n        width: 155px;\n        content: \"Outside allowable value range\";\n        left: -182px;\n      }\n\n      input + span::before {\n        position: absolute;\n        right: -20px;\n        top: 5px;\n      }\n\n      input:invalid {\n        border: 2px solid red;\n      }\n\n      input:invalid + span::before {\n        content: '✖';\n        color: red;\n      }\n\n      input:valid + span::before {\n        content: '✓';\n        color: green;\n      }\n\n      button {\n        width: 60%;\n        margin: 0 auto;\n      }\n    </style>\n  </head>\n\n<body>\n    <form>\n      <fieldset>\n        <legend>Feedback form</legend>\n\n        <p>Required fields are labelled with \"required\".</p>\n        <div>\n          <label for=\"name\">Name: </label>\n          <input id=\"name\" name=\"name\" type=\"text\" required>\n          <span></span>\n        </div>\n        <div>\n          <label for=\"age\">Age (must be 12+): </label>\n          <input id=\"age\" name=\"age\" type=\"number\" min=\"12\" max=\"120\" required>\n          <span></span>\n        </div>\n        <div>\n          <label for=\"email\">Email address (include if you want a response): </label>\n          <input id=\"email\" name=\"email\" type=\"email\">\n          <span></span>\n        </div>\n        <div><button>Submit</button></div>\n      </fieldset>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/pseudo-classes/radios-checked-default.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Radio buttons :checked, :default</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Josefin+Sans&display=swap\" rel=\"stylesheet\">\n    <style>\n      body {\n        font-family: 'Josefin Sans', sans-serif;\n      }\n\n      input[type=\"radio\"] {\n        -webkit-appearance: none;\n        appearance: none;\n      }\n\n      input[type=\"radio\"] {\n        width: 20px;\n        height: 20px;\n        border-radius: 10px;\n        border: 2px solid gray;\n        /* Adjusts the position of the checkboxes on the text baseline */\n        vertical-align: -2px;\n        outline: none;\n      }\n\n      input[type=\"radio\"]::before {\n        display: block;\n        content: \" \";\n        width: 10px;\n        height: 10px;\n        border-radius: 6px;\n        background-color: red;\n        font-size: 1.2em;\n        transform: translate(3px, 3px) scale(0);\n        transform-origin: center;\n        transition: all 0.3s ease-in;\n      }\n\n      input[type=\"radio\"]:checked::before {\n        transform: translate(3px, 3px) scale(1);\n        transition: all 0.3s cubic-bezier(0.25, 0.25, 0.56, 2);\n      }\n\n      input ~ span {\n        position: relative;\n      }\n\n      input:default ~ span::after {\n        font-size: 0.7rem;\n        position: absolute;\n        content: \"Default\";\n        color: white;\n        background-color: black;\n        padding: 5px 10px;\n        right: -65px;\n        top: -3px;\n      }\n    </style>\n  </head>\n\n<body>\n  <form>\n    <fieldset>\n      <legend>Choose your favourite fruit</legend>\n\n      <p>\n        <input type=\"radio\" name=\"fruit\" value=\"cherry\" id=\"cherry\">\n        <label for=\"cherry\">Cherry</label>\n        <span></span>\n      </p>\n      <p>\n        <input type=\"radio\" name=\"fruit\" value=\"banana\" id=\"banana\" checked>\n        <label for=\"banana\">Banana</label>\n        <span></span>\n      </p>\n      <p>\n        <input type=\"radio\" name=\"fruit\" value=\"strawberry\" id=\"strawberry\">\n        <label for=\"strawberry\">Strawberry</label>\n        <span></span>\n      </p>\n    </fieldset>\n  </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/pseudo-classes/radios-checked-indeterminate.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Radio buttons :checked, :indeterminate</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Josefin+Sans&display=swap\" rel=\"stylesheet\">\n    <style>\n      body {\n        font-family: 'Josefin Sans', sans-serif;\n      }\n\n      input[type=\"radio\"] {\n        -webkit-appearance: none;\n        appearance: none;\n      }\n\n      input[type=\"radio\"] {\n        width: 20px;\n        height: 20px;\n        border-radius: 10px;\n        border: 2px solid gray;\n        /* Adjusts the position of the checkboxes on the text baseline */\n        vertical-align: -2px;\n        outline: none;\n      }\n\n      input[type=\"radio\"]::before {\n        display: block;\n        content: \" \";\n        width: 10px;\n        height: 10px;\n        border-radius: 6px;\n        background-color: red;\n        font-size: 1.2em;\n        transform: translate(3px, 3px) scale(0);\n        transform-origin: center;\n        transition: all 0.3s ease-in;\n      }\n\n      input[type=\"radio\"]:checked::before {\n        transform: translate(3px, 3px) scale(1);\n        transition: all 0.3s cubic-bezier(0.25, 0.25, 0.56, 2);\n      }\n\n      input[type=\"radio\"]:indeterminate {\n        border: 2px solid red;\n        animation: 0.4s linear infinite alternate border-pulse;\n      }\n\n      @keyframes border-pulse {\n        from {\n          border: 2px solid red;\n        }\n\n        to {\n          border: 6px solid red;\n        }\n      }\n    </style>\n  </head>\n\n<body>\n  <form>\n    <fieldset>\n      <legend>Choose your favourite fruit</legend>\n\n<p>\n  <input type=\"radio\" name=\"fruit\" value=\"cherry\" id=\"cherry\">\n  <label for=\"cherry\">Cherry</label>\n  <span></span>\n</p>\n      <p>\n        <input type=\"radio\" name=\"fruit\" value=\"banana\" id=\"banana\">\n        <label for=\"banana\">Banana</label>\n        <span></span>\n      </p>\n      <p>\n        <input type=\"radio\" name=\"fruit\" value=\"strawberry\" id=\"strawberry\">\n        <label for=\"strawberry\">Strawberry</label>\n        <span></span>\n      </p>\n    </fieldset>\n  </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/pseudo-classes/readonly-confirmation.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>:read-only demo — confirmation form</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Josefin+Sans&display=swap\" rel=\"stylesheet\">\n    <style>\n      body {\n        font-family: 'Josefin Sans', sans-serif;\n        margin: 20px auto;\n        max-width: 460px;\n      }\n\n      fieldset {\n        padding: 10px 30px 0;\n        margin-bottom: 20px;\n      }\n\n      legend {\n        color: white;\n        background: black;\n        padding: 5px 10px;\n      }\n\n      fieldset > div {\n        margin-bottom: 20px;\n        display: flex;\n        justify-content: space-between;\n      }\n\n      button, label, input[type=\"text\"], textarea {\n        display: block;\n        font-family: inherit;\n        font-size: 100%;\n        padding: 0;\n        margin: 0;\n        box-sizing: border-box;\n        padding: 5px;\n        height: 30px;\n      }\n\n      input[type=\"text\"], textarea {\n        width: 50%\n      }\n\n      textarea {\n        height: 110px;\n        resize: none;\n      }\n\n      label {\n        width: 40%;\n      }\n\n      input:hover, input:focus, textarea:hover, textarea:focus {\n        background-color: #eee;\n      }\n\n      button {\n        width: 60%;\n        margin: 20px auto;\n      }\n\n      input:read-only, textarea:read-only {\n        border: 0;\n        box-shadow: none;\n        background-color: white;\n      }\n\n      textarea:read-write {\n        box-shadow: inset 1px 1px 3px #ccc;\n        border-radius: 5px;\n      }\n    </style>\n  </head>\n\n<body>\n    <form>\n      <fieldset>\n        <legend>Check shipping details</legend>\n        <div>\n          <label for=\"name\">Name: </label>\n          <input id=\"name\" name=\"name\" type=\"text\"\n                 value=\"Mr Soft\" readonly>\n        </div>\n        <div>\n          <label for=\"address\">Address: </label>\n          <textarea id=\"address\" name=\"address\" readonly>\n23 Elastic Way,\nViscous,\nBright Ridge,\nCA\n</textarea>\n        </div>\n        <div>\n          <label for=\"pcode\">Zip/postal code: </label>\n          <input id=\"pcode\" name=\"pcode\" type=\"text\"\n                 value=\"94708\" readonly>\n        </div>\n      </fieldset>\n\n      <fieldset>\n        <legend>Final instructions</legend>\n        <div>\n          <label for=\"sms-confirm\">Send confirmation by SMS?</label>\n          <input id=\"sms-confirm\" name=\"sms-confirm\" type=\"checkbox\">\n        </div>\n        <div>\n          <label for=\"instructions\">Any special instructions?</label>\n          <textarea id=\"instructions\" name=\"instructions\"></textarea>\n        </div>\n      </fieldset>\n\n      <div><button type=\"button\">Amend details</button></div>\n      <div><button type=\"submit\">Submit</button></div>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/pseudo-classes/required-optional-generated.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>:required and :optional with generated content</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Josefin+Sans&display=swap\" rel=\"stylesheet\">\n    <style>\n      body {\n        font-family: 'Josefin Sans', sans-serif;\n        margin: 20px auto;\n        max-width: 460px;\n      }\n\n      fieldset {\n        padding: 10px 30px 0;\n      }\n\n      legend {\n        color: white;\n        background: black;\n        padding: 5px 10px;\n      }\n\n      fieldset > div {\n        margin-bottom: 20px;\n        display: flex;\n        flex-flow: row wrap;\n      }\n\n      button, label, input {\n        display: block;\n        font-family: inherit;\n        font-size: 100%;\n        padding: 0;\n        margin: 0;\n        box-sizing: border-box;\n        width: 100%;\n        padding: 5px;\n        height: 30px;\n      }\n\n      input {\n        box-shadow: inset 1px 1px 3px #ccc;\n        border-radius: 5px;\n      }\n\n      input:hover, input:focus {\n        background-color: #eee;\n      }\n\n      input + span {\n        position: relative;\n      }\n\n      input:required + span::after {\n        font-size: 0.7rem;\n        position: absolute;\n        content: \"required\";\n        color: white;\n        background-color: black;\n        padding: 5px 10px;\n        top: -26px;\n        left: -70px;\n      }\n\n      button {\n        width: 60%;\n        margin: 0 auto;\n      }\n    </style>\n  </head>\n\n<body>\n    <form>\n      <fieldset>\n        <legend>Feedback form</legend>\n\n        <p>Required fields are labelled with \"required\".</p>\n        <div>\n          <label for=\"fname\">First name: </label>\n          <input id=\"fname\" name=\"fname\" type=\"text\" required>\n          <span></span>\n        </div>\n        <div>\n          <label for=\"lname\">Last name: </label>\n          <input id=\"lname\" name=\"lname\" type=\"text\" required>\n          <span></span>\n        </div>\n        <div>\n          <label for=\"email\">Email address (include if you want a response): </label>\n          <input id=\"email\" name=\"email\" type=\"email\">\n          <span></span>\n        </div>\n        <div><button>Submit</button></div>\n      </fieldset>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/pseudo-classes/user-valid-invalid.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>:user-valid and :user-invalid example</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Josefin+Sans&display=swap\" rel=\"stylesheet\">\n    <style>\n      body {\n        font-family: 'Josefin Sans', sans-serif;\n        margin: 20px auto;\n        max-width: 460px;\n      }\n\n      fieldset {\n        padding: 10px 30px 0;\n      }\n\n      legend {\n        color: white;\n        background: black;\n        padding: 5px 10px;\n      }\n\n      fieldset > div {\n        margin-bottom: 20px;\n        display: flex;\n        flex-flow: row wrap;\n      }\n\n      button, label, input {\n        display: block;\n        font-family: inherit;\n        font-size: 100%;\n        padding: 0;\n        margin: 0;\n        box-sizing: border-box;\n        width: 100%;\n        padding: 5px;\n        height: 30px;\n      }\n\n      input {\n        box-shadow: inset 1px 1px 3px #ccc;\n        border-radius: 5px;\n      }\n\n      input:hover, input:focus {\n        background-color: #eee;\n      }\n\n      input + span {\n        position: relative;\n      }\n\n      input:required + span::after {\n        font-size: 0.7rem;\n        position: absolute;\n        content: \"required\";\n        color: white;\n        background-color: black;\n        padding: 5px 10px;\n        top: -26px;\n        left: -70px;\n      }\n\n      input + span::before {\n        position: absolute;\n        right: -20px;\n        top: 5px;\n      }\n\n      input:user-invalid {\n        border: 2px solid red;\n      }\n\n      input:user-invalid + span::before {\n        content: '✖';\n        color: red;\n      }\n\n      input:user-valid + span::before {\n        content: '✓';\n        color: green;\n      }\n\n      button {\n        width: 60%;\n        margin: 0 auto;\n      }\n    </style>\n  </head>\n\n<body>\n    <form>\n      <fieldset>\n        <legend>Feedback form</legend>\n\n        <p>Required fields are labelled with \"required\".</p>\n        <div>\n          <label for=\"fname\">First name: </label>\n          <input id=\"fname\" name=\"fname\" type=\"text\" required>\n          <span></span>\n        </div>\n        <div>\n          <label for=\"lname\">Last name: </label>\n          <input id=\"lname\" name=\"lname\" type=\"text\" required>\n          <span></span>\n        </div>\n        <div>\n          <label for=\"email\">Email address (include if you want a response): </label>\n          <input id=\"email\" name=\"email\" type=\"email\">\n          <span></span>\n        </div>\n        <div><button>Submit</button></div>\n      </fieldset>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/pseudo-classes/valid-invalid.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>:valid and :invalid example</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Josefin+Sans&display=swap\" rel=\"stylesheet\">\n    <style>\n      body {\n        font-family: 'Josefin Sans', sans-serif;\n        margin: 20px auto;\n        max-width: 460px;\n      }\n\n      fieldset {\n        padding: 10px 30px 0;\n      }\n\n      legend {\n        color: white;\n        background: black;\n        padding: 5px 10px;\n      }\n\n      fieldset > div {\n        margin-bottom: 20px;\n        display: flex;\n        flex-flow: row wrap;\n      }\n\n      button, label, input {\n        display: block;\n        font-family: inherit;\n        font-size: 100%;\n        padding: 0;\n        margin: 0;\n        box-sizing: border-box;\n        width: 100%;\n        padding: 5px;\n        height: 30px;\n      }\n\n      input {\n        box-shadow: inset 1px 1px 3px #ccc;\n        border-radius: 5px;\n      }\n\n      input:hover, input:focus {\n        background-color: #eee;\n      }\n\n      input + span {\n        position: relative;\n      }\n\n      input:required + span::after {\n        font-size: 0.7rem;\n        position: absolute;\n        content: \"required\";\n        color: white;\n        background-color: black;\n        padding: 5px 10px;\n        top: -26px;\n        left: -70px;\n      }\n\n      input + span::before {\n        position: absolute;\n        right: -20px;\n        top: 5px;\n      }\n\n      input:invalid {\n        border: 2px solid red;\n      }\n\n      input:invalid + span::before {\n        content: '✖';\n        color: red;\n      }\n\n      input:valid + span::before {\n        content: '✓';\n        color: green;\n      }\n\n      button {\n        width: 60%;\n        margin: 0 auto;\n      }\n    </style>\n  </head>\n\n<body>\n    <form>\n      <fieldset>\n        <legend>Feedback form</legend>\n\n        <p>Required fields are labelled with \"required\".</p>\n        <div>\n          <label for=\"fname\">First name: </label>\n          <input id=\"fname\" name=\"fname\" type=\"text\" required>\n          <span></span>\n        </div>\n        <div>\n          <label for=\"lname\">Last name: </label>\n          <input id=\"lname\" name=\"lname\" type=\"text\" required>\n          <span></span>\n        </div>\n        <div>\n          <label for=\"email\">Email address (include if you want a response): </label>\n          <input id=\"email\" name=\"email\" type=\"email\">\n          <span></span>\n        </div>\n        <div><button>Submit</button></div>\n      </fieldset>\n    </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/range-example/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>&lt;input type=\"range\"&gt; example</title>\n    <style>\n      html, input {\n        font-family: sans-serif;\n      }\n\n      body {\n        width: 90%;\n        max-width: 500px;\n        margin: 0 auto;\n      }\n\n      form {\n        margin-top: 20px;\n      }\n\n      div {\n        margin-bottom: 20px;\n        display: flex;\n        flex-flow: row wrap;\n        justify-content: space-between;\n        align-items: center;\n      }\n\n      label, input, button {\n        font-size: 14px;\n        line-height: 1.5\n      }\n\n      label {\n        width: 100%;\n        margin-right: 2%;\n      }\n\n      input {\n        flex: auto;\n        margin-right: 2%;\n      }\n\n      button {\n        width: 70%;\n        margin: 0 auto;\n      }\n\n    </style>\n   </head>\n  <body>\n    <form>\n\n      <div>\n        <label for=\"price\">Choose a maximum house price: </label>\n        <input type=\"range\" name=\"price\" id=\"price\" min=\"50000\" max=\"500000\" step=\"100\" value=\"250000\">\n        <output class=\"price-output\" for=\"price\"></output>\n      </div>\n      <div>\n        <button>Submit</button>\n      </div>\n    </form>\n    <script>\n      const price = document.querySelector('#price')\n      const output = document.querySelector('.price-output')\n\n      output.textContent = price.value\n\n      price.addEventListener('input', function() {\n        output.textContent = price.value\n      });\n    </script>\n</body>\n  </html>\n"
  },
  {
    "path": "html/forms/select-example/select-multiple.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>My test page</title>\n    <style>\n      select {\n        /* font-family: cursive; */\n      }\n    </style>\n  </head>\n  <body>\n    <select id=\"pet-select\" name=\"pet\" multiple size=\"4\">\n    <option value=\"none\" selected>-- Please choose one or more --</option>\n    <optgroup label=\"4-legged pets\">\n      <option value=\"dog\">Dog</option>\n      <option value=\"cat\">Cat</option>\n      <option value=\"hamster\" disabled>Hamster</option>\n    </optgroup>\n    <optgroup label=\"Flying pets\">\n      <option value=\"parrot\">Parrot</option>\n      <option value=\"macaw\">Macaw</option>\n      <option value=\"albatross\">Albatross</option>\n    </optgroup>\n</select>\n  </body>\n</html>\n"
  },
  {
    "path": "html/forms/sending-form-data/get-method.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Get method example</title>\n    <style>\n      form {\n        width: 420px;\n      }\n\n      div {\n        margin-bottom: 20px;\n      }\n\n      label {\n        display: inline-block;\n        width: 240px;\n        text-align: right;\n        padding-right: 10px;\n      }\n\n      button, input {\n        float: right;\n      }\n    </style>\n  </head>\n  <body>\n    <form action=\"http://foo.com\" method=\"get\">\n      <div>\n        <label for=\"say\">What greeting do you want to say?</label>\n        <input name=\"say\" id=\"say\" value=\"Hi\">\n      </div>\n      <div>\n        <label for=\"to\">Who do you want to say it to?</label>\n        <input name=\"to\" value=\"Mom\">\n      </div>\n      <div>\n        <button>Send my greetings</button>\n      </div>\n    </form>\n  </body>\n</html>\n"
  },
  {
    "path": "html/forms/sending-form-data/php-example.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>PHP form submission example</title>\n    <style>\n      form {\n        width: 420px;\n      }\n\n      div {\n        margin-bottom: 20px;\n      }\n\n      label {\n        display: inline-block;\n        width: 240px;\n        text-align: right;\n        padding-right: 10px;\n      }\n\n      button, input {\n        float: right;\n      }\n    </style>\n  </head>\n  <body>\n    <form method=\"post\" action=\"php-example.php\">\n      <div>\n        <label for=\"say\">What greeting do you want to say?</label>\n        <input name=\"say\" id=\"say\" value=\"Hi\">\n      </div>\n      <div>\n        <label for=\"to\">Who do you want to say it to?</label>\n        <input name=\"to\" value=\"Mom\">\n      </div>\n      <div>\n        <button>Send my greetings</button>\n      </div>\n    </form>\n  </body>\n</html>\n"
  },
  {
    "path": "html/forms/sending-form-data/php-example.php",
    "content": "<?php\n  // The global $_POST variable allows you to access the data sent with the POST method by name\n  // To access the data sent with the GET method, you can use $_GET\n  $say = htmlspecialchars($_POST['say']);\n  $to  = htmlspecialchars($_POST['to']);\n\n  echo  $say, ' ', $to;\n?>\n"
  },
  {
    "path": "html/forms/sending-form-data/post-method.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Post method example</title>\n    <style>\n      form {\n        width: 420px;\n      }\n\n      div {\n        margin-bottom: 20px;\n      }\n\n      label {\n        display: inline-block;\n        width: 240px;\n        text-align: right;\n        padding-right: 10px;\n      }\n\n      button, input {\n        float: right;\n      }\n    </style>\n  </head>\n  <body>\n    <form action=\"http://foo.com\" method=\"post\">\n      <div>\n        <label for=\"say\">What greeting do you want to say?</label>\n        <input name=\"say\" id=\"say\" value=\"Hi\">\n      </div>\n      <div>\n        <label for=\"to\">Who do you want to say it to?</label>\n        <input name=\"to\" value=\"Mom\">\n      </div>\n      <div>\n        <button>Send my greetings</button>\n      </div>\n    </form>\n  </body>\n</html>\n"
  },
  {
    "path": "html/forms/sending-form-data/python-example.py",
    "content": "from flask import Flask, render_template, request\napp = Flask(__name__)\n\n@app.route('/', methods=['GET', 'POST'])\ndef form():\n    return render_template('form.html')\n\n@app.route('/hello', methods=['GET', 'POST'])\ndef hello():\n    return render_template('greeting.html', say=request.form['say'], to=request.form['to'])\n\nif __name__ == \"__main__\":\n    app.run()\n"
  },
  {
    "path": "html/forms/sending-form-data/templates/form.html",
    "content": "<!DOCTYPE html>\n    <html lang=\"en-US\">\n    <head>\n      <meta charset=\"utf-8\">\n      <title>Python form submission example</title>\n      <style>\n        form {\n          width: 420px;\n        }\n\n        div {\n          margin-bottom: 20px;\n        }\n\n        label {\n          display: inline-block;\n          width: 240px;\n          text-align: right;\n          padding-right: 10px;\n        }\n\n        button, input {\n          float: right;\n        }\n      </style>\n    </head>\n    <body>\n      <form method=\"post\" action=\"{{ url_for('hello') }}\">\n        <div>\n          <label for=\"say\">What greeting do you want to say?</label>\n          <input name=\"say\" id=\"say\" value=\"Hi\">\n        </div>\n        <div>\n          <label for=\"to\">Who do you want to say it to?</label>\n          <input name=\"to\" id=\"to\" value=\"Mom\">\n        </div>\n        <div>\n          <button>Send my greetings</button>\n        </div>\n      </form>\n    </body>\n  </html>\n"
  },
  {
    "path": "html/forms/sending-form-data/templates/greeting.html",
    "content": "<!DOCTYPE html>\n    <html lang=\"en-US\">\n    <head>\n      <meta charset=\"utf-8\">\n      <title>Greeting</title>\n    </head>\n    <body>\n      <p>{{say}}  {{to}}</p>\n    </body>\n  </html>\n"
  },
  {
    "path": "html/forms/styling-examples/appearance-tester.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Appearance Tester</title>\n    <style>\n      body {\n        margin: 20px auto;\n        max-width: 800px;\n        justify-content: space-around;\n      }\n\n      body, form > div {\n        display: flex;\n      }\n\n      form > div {\n        margin-bottom: 20px;\n      }\n\n      .appearance input {\n        appearance: none;\n      }\n    </style>\n  </head>\n\n<body>\n  <div>\n    <form>\n      <div>\n        <label for=\"search1\">search: </label>\n        <input id=\"search1\" name=\"search1\" type=\"search\">\n      </div>\n      <div>\n        <label for=\"text1\">text: </label>\n        <input id=\"text1\" name=\"text1\" type=\"text\">\n      </div>\n      <div>\n        <label for=\"date1\">date: </label>\n        <input id=\"date1\" name=\"date1\" type=\"datetime-local\">\n      </div>\n      <div>\n        <label for=\"radio1\">radio: </label>\n        <input id=\"radio1\" name=\"radio1\" type=\"radio\">\n      </div>\n      <div>\n        <label for=\"checkbox1\">checkbox: </label>\n        <input id=\"checkbox1\" name=\"checkbox1\" type=\"checkbox\">\n      </div>\n      <div><input type=\"submit\" value=\"submit\"></div>\n      <div><input type=\"button\" value=\"button\"></div>\n    </form>\n  </div>\n  <div class=\"appearance\">\n    <form>\n      <div>\n        <label for=\"search2\">search: </label>\n        <input id=\"search2\" name=\"search2\" type=\"search\">\n      </div>\n      <div>\n        <label for=\"text2\">text: </label>\n        <input id=\"text2\" name=\"text2\" type=\"text\">\n      </div>\n      <div>\n        <label for=\"date2\">date: </label>\n        <input id=\"date2\" name=\"date2\" type=\"datetime-local\">\n      </div>\n      <div>\n        <label for=\"radio2\">radio: </label>\n        <input id=\"radio2\" name=\"radio2\" type=\"radio\">\n      </div>\n      <div>\n        <label for=\"checkbox2\">checkbox: </label>\n        <input id=\"checkbox2\" name=\"checkbox2\" type=\"checkbox\">\n      </div>\n      <div><input type=\"submit\" value=\"submit\"></div>\n      <div><input type=\"button\" value=\"button\"></div>\n    </form>\n  </div>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/styling-examples/checkboxes-styled.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Checkboxes styled</title>\n    <style>\n      input[type=\"checkbox\"] {\n        appearance: none;\n      }\n\n      input[type=\"checkbox\"] {\n        position: relative;\n        width: 1em;\n        height: 1em;\n        border: 1px solid gray;\n        /* Adjusts the position of the checkboxes on the text baseline */\n        vertical-align: -2px;\n        /* Set here so that Windows' High-Contrast Mode can override */\n        color: green;\n      }\n\n      input[type=\"checkbox\"]::before {\n        content: \"✔\";\n        position: absolute;\n        font-size: 1.2em;\n        right: 0;\n        top: -0.3em;\n        visibility: hidden;\n      }\n\n      input[type=\"checkbox\"]:checked::before {\n        /* Use `visibility` instead of `display` to avoid recalculating layout */\n        visibility: visible;\n      }\n\n      input[type=\"checkbox\"]:disabled {\n        border-color: black;\n        background: #ddd;\n        color: gray;\n      }\n\n    </style>\n  </head>\n\n<body>\n  <form>\n    <fieldset>\n      <legend>Fruit preferences</legend>\n\n      <p>\n        <label>\n          <input type=\"checkbox\" name=\"fruit\" value=\"cherry\">\n          I like cherry\n        </label>\n      </p>\n      <p>\n        <label>\n          <input type=\"checkbox\" name=\"fruit\" value=\"banana\" disabled>\n          I can't like banana\n        </label>\n      </p>\n      <p>\n        <label>\n          <input type=\"checkbox\" name=\"fruit\" value=\"strawberry\">\n          I like strawberry\n        </label>\n      </p>\n    </fieldset>\n  </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/styling-examples/radios-styled.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Radio buttons styled</title>\n    <style>\n      input[type=\"radio\"] {\n        appearance: none;\n      }\n\n      input[type=\"radio\"] {\n        width: 20px;\n        height: 20px;\n        border-radius: 10px;\n        border: 2px solid gray;\n        /* Adjusts the position of the checkboxes on the text baseline */\n        vertical-align: -2px;\n        outline: none;\n      }\n\n      input[type=\"radio\"]::before {\n        display: block;\n        content: \" \";\n        width: 10px;\n        height: 10px;\n        border-radius: 6px;\n        background-color: red;\n        font-size: 1.2em;\n        transform: translate(3px, 3px) scale(0);\n        transform-origin: center;\n        transition: all 0.3s ease-in;\n      }\n\n      input[type=\"radio\"]:checked::before {\n        transform: translate(3px, 3px) scale(1);\n        transition: all 0.3s cubic-bezier(0.25, 0.25, 0.56, 2);\n      }\n    </style>\n  </head>\n\n<body>\n  <form>\n    <fieldset>\n      <legend>Choose your favourite fruit</legend>\n\n      <p>\n        <label>\n          <input type=\"radio\" name=\"fruit\" value=\"cherry\">\n          Cherry\n        </label>\n      </p>\n      <p>\n        <label>\n          <input type=\"radio\" name=\"fruit\" value=\"banana\">\n          Banana\n        </label>\n      </p>\n      <p>\n        <label>\n          <input type=\"radio\" name=\"fruit\" value=\"strawberry\">\n          Strawberry\n        </label>\n      </p>\n    </fieldset>\n  </form>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/styling-examples/search-appearance.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Search Appearance</title>\n    <style>\n      body, form > div {\n        display: flex;\n      }\n\n      body {\n        margin: 20px auto;\n        max-width: 800px;\n        justify-content: space-around;\n      }\n\n      form > div {\n        align-items: center;\n      }\n\n      input[type=\"search\"] {\n        height: 32px;\n        padding: 0 10px;\n        font-size: 14px;\n        letter-spacing: 1px;\n      }\n\n      .appearance input[type=\"search\"] {\n        appearance: none;\n      }\n    </style>\n  </head>\n\n<body>\n  <div>\n    <form>\n      <div>\n        <label for=\"search1\">search: </label>\n        <input id=\"search1\" name=\"search1\" type=\"search\">\n      </div>\n    </form>\n  </div>\n  <div class=\"appearance\">\n    <form>\n      <div>\n        <label for=\"search2\">search: </label>\n        <input id=\"search2\" name=\"search2\" type=\"search\">\n      </div>\n    </form>\n  </div>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/styling-examples/styled-file-picker.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Styled file picker example</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Josefin+Sans&display=swap\" rel=\"stylesheet\">\n    <style>\n      body {\n        font-family: 'Josefin Sans', sans-serif;\n        margin: 20px auto;\n        max-width: 400px;\n      }\n\n      form > div {\n        margin-bottom: 20px;\n      }\n\n      button, label, input {\n        display: block;\n        font-family: inherit;\n        font-size: 100%;\n        padding: 0;\n        margin: 0;\n        box-sizing: border-box;\n        width: 100%;\n        padding: 5px;\n        height: 30px;\n      }\n\n      input[type=\"file\"] {\n        height: 0;\n        padding: 0;\n        opacity: 0;\n      }\n\n      label[for=\"file\"] {\n        box-shadow: 1px 1px 3px #ccc;\n        background: linear-gradient(to bottom, #eee, #ccc);\n        border: 1px solid rgb(169, 169, 169);\n        border-radius: 5px;\n        text-align: center;\n        line-height: 1.5;\n      }\n\n      label[for=\"file\"]:hover {\n        background: linear-gradient(to bottom, #fff, #ddd);\n      }\n\n      label[for=\"file\"]:active {\n        box-shadow: inset 1px 1px 3px #ccc;\n      }\n\n      button {\n        width: 60%;\n        margin: 0 auto;\n      }\n    </style>\n  </head>\n\n<body>\n    <form>\n      <div>\n        <label for=\"file\">Choose a file to upload</label>\n        <input id=\"file\" name=\"file\" type=\"file\" multiple>\n        <ul id=\"file-list\">\n\n        </ul>\n      </div>\n      <div><button>Submit?</button></div>\n    </form>\n\n    <script>\n      const fileInput = document.querySelector('#file');\n      const fileList = document.querySelector('#file-list');\n\n      fileInput.addEventListener('change', updateFileList);\n\n      function updateFileList() {\n        while(fileList.firstChild) {\n          fileList.removeChild(fileList.firstChild);\n        }\n\n        let curFiles = fileInput.files;\n\n        if(!(curFiles.length === 0))  {\n          console.log('test');\n          for(let i = 0; i < curFiles.length; i++) {\n            const listItem = document.createElement('li');\n            listItem.textContent = 'File name: ' + curFiles[i].name + '; file size ' + returnFileSize(curFiles[i].size) + '.';\n            fileList.appendChild(listItem);\n          }\n        }\n      }\n\n      function returnFileSize(number) {\n        if(number < 1024) {\n          return number + 'bytes';\n        } else if(number >= 1024 && number < 1048576) {\n          return (number/1024).toFixed(1) + 'KB';\n        } else if(number >= 1048576) {\n          return (number/1048576).toFixed(1) + 'MB';\n        }\n      }\n    </script>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/styling-examples/styled-search.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Styled search</title>\n    <style>\n      body, form > div {\n        display: flex;\n      }\n\n      body {\n        margin: 20px auto;\n        max-width: 800px;\n        justify-content: space-around;\n      }\n\n      form > div {\n        align-items: center;\n      }\n\n      input[type=\"search\"] {\n        border: 2px solid black;\n        border-radius: 16px;\n        box-shadow: 1px 1px 1px red;\n        height: 32px;\n        padding: 0 10px;\n        font-size: 14px;\n        letter-spacing: 1px;\n        outline: none;\n      }\n\n      input[type=\"search\"]:hover, input[type=\"search\"]:focus {\n        background: #eee;\n        box-shadow: 1px 1px 1px red,\n                    inset 2px 2px 3px #666;\n      }\n    </style>\n  </head>\n\n<body>\n  <div>\n    <form>\n      <div>\n        <label for=\"search2\">search: </label>\n        <input id=\"search2\" name=\"search2\" type=\"search\">\n      </div>\n    </form>\n  </div>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/styling-examples/ugly-controls.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Ugly controls basic styling</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Josefin+Sans&display=swap\" rel=\"stylesheet\">\n    <style>\n      body {\n        font-family: 'Josefin Sans', sans-serif;\n        margin: 20px auto;\n        max-width: 400px;\n      }\n\n      form > div {\n        margin-bottom: 20px;\n      }\n\n      button, label, input, select, progress, meter {\n        display: block;\n        font-family: inherit;\n        font-size: 100%;\n        margin: 0;\n        box-sizing: border-box;\n        width: 100%;\n        padding: 5px;\n        height: 30px;\n      }\n\n      select {\n        appearance: none;\n      }\n\n      .select-wrapper {\n        position: relative;\n      }\n\n      .select-wrapper::after {\n        content: \"▼\";\n        font-size: 1rem;\n        top: 6px;\n        right: 10px;\n        position: absolute;\n      }\n\n      input[type=\"text\"], \n      input[type=\"datetime-local\"], \n      input[type=\"color\"], \n      select {\n        box-shadow: inset 1px 1px 3px #ccc;\n        border-radius: 5px;\n      }\n\n      label {\n        margin-bottom: 5px;\n      }\n\n      button {\n        width: 60%;\n        margin: 0 auto;\n      }\n    </style>\n  </head>\n\n<body>\n    <form>\n      <div>\n        <label for=\"select\">Select box:</label>\n        <div class=\"select-wrapper\">\n            <select id=\"select\" name=\"select\">\n              <option>Banana</option>\n              <option>Cherry</option>\n              <option>Lemon</option>\n            </select>\n         </div>\n      </div>\n      <div>\n        <label for=\"myFruit\">\"Favorite fruit?\" datalist:</label>\n        <input type=\"text\" name=\"myFruit\" id=\"myFruit\" list=\"mySuggestion\">\n        <datalist id=\"mySuggestion\">\n          <option>Apple</option>\n          <option>Banana</option>\n          <option>Blackberry</option>\n          <option>Blueberry</option>\n          <option>Lemon</option>\n          <option>Lychee</option>\n          <option>Peach</option>\n          <option>Pear</option>\n        </datalist>\n      </div>\n      <div>\n        <label for=\"date1\">Datetime local: </label>\n        <input id=\"date1\" name=\"date1\" type=\"datetime-local\">\n      </div>\n      <div>\n        <label for=\"range\">Range: </label>\n        <input id=\"range\" name=\"range\" type=\"range\">\n      </div>\n      <div>\n        <label for=\"color\">Color: </label>\n        <input id=\"color\" name=\"color\" type=\"color\">\n      </div>\n      <div>\n        <label for=\"file\">File picker: </label>\n        <input id=\"file\" name=\"file\" type=\"file\" multiple>\n        <ul id=\"file-list\">\n\n        </ul>\n      </div>\n      <div>\n        <label for=\"progress\">Progress: </label>\n        <progress max=\"100\" value=\"75\" id=\"progress\">75/100</progress>\n      </div>\n      <div>\n        <label for=\"meter\">Meter: </label>\n        <meter  id=\"meter\" min=\"0\" max=\"100\" value=\"75\" low=\"33\" high=\"66\" optimum=\"50\">75</meter>\n      </div>\n      <div><button>Submit?</button></div>\n    </form>\n\n    <script>\n      const fileInput = document.querySelector('#file');\n      const fileList = document.querySelector('#file-list');\n\n      fileInput.addEventListener('change', updateFileList);\n\n      function updateFileList() {\n        while(fileList.firstChild) {\n          fileList.removeChild(fileList.firstChild);\n        }\n\n        let curFiles = fileInput.files;\n\n        if(!(curFiles.length === 0))  {\n          for(let i = 0; i < curFiles.length; i++) {\n            const listItem = document.createElement('li');\n            listItem.textContent = 'File name: ' + curFiles[i].name + '; file size ' + returnFileSize(curFiles[i].size) + '.';\n            fileList.appendChild(listItem);\n          }\n        }\n      }\n\n      function returnFileSize(number) {\n        if(number < 1024) {\n          return number + 'bytes';\n        } else if(number >= 1024 && number < 1048576) {\n          return (number/1024).toFixed(1) + 'KB';\n        } else if(number >= 1048576) {\n          return (number/1048576).toFixed(1) + 'MB';\n        }\n      }\n    </script>\n</body>\n\n</html>\n"
  },
  {
    "path": "html/forms/tasks/advanced-styling/advanced-styling1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Advanced styling: Task 1</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      button,\n      input,\n      select {\n        font-family: inherit;\n        font-size: 100%;\n        padding: 0; margin: 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n      <input type=\"search\" name=\"search\" id=\"search\" aria-label=\"Search our site\">\n      <div></div>\n    </form>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/forms/tasks/advanced-styling/advanced-styling1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Advanced styling: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n\n    </style>\n\n    <style class=\"editable\">\n\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\nbody {\n  background-color: #fff;\n  color: #333;\n  font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n  padding: 1em;\n  margin: 0;\n}\n\n* {\n  box-sizing: border-box;\n}\n\nbutton,\ninput,\nselect {\n  font-family: inherit;\n  font-size: 100%;\n  padding: 0; margin: 0;\n}\n</textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<form>\n  <input type=\"search\" name=\"search\" id=\"search\" aria-label=\"Search our site\">\n  <div></div>\n</form>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/forms/tasks/advanced-styling/advanced-styling2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Advanced styling: Task 2</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      button,\n      input,\n      select {\n        font-family: inherit;\n        font-size: 100%;\n        padding: 0; margin: 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n      <fieldset>\n        <legend>Who is your favorite pony?</legend>\n        <ul>\n          <li>\n            <label for=\"pinkie\">Pinkie Pie</label>\n            <input type=\"radio\" id=\"pinkie\" name=\"pony\" value=\"pinkie\">\n          </li>\n          <li>\n            <label for=\"rainbow\">Rainbow Dash</label>\n            <input type=\"radio\" id=\"rainbow\" name=\"pony\" value=\"rainbow\">\n          </li>\n          <li>\n            <label for=\"twilight\">Twilight Sparkle</label>\n            <input type=\"radio\" id=\"twilight\" name=\"pony\" value=\"twilight\">\n          </li>\n        </ul>\n      </fieldset>\n    </form>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/forms/tasks/advanced-styling/advanced-styling2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Advanced styling: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n\n    </style>\n\n    <style class=\"editable\">\n\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\nbody {\n  background-color: #fff;\n  color: #333;\n  font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n  padding: 1em;\n  margin: 0;\n}\n\n* {\n  box-sizing: border-box;\n}\n\nbutton,\ninput,\nselect {\n  font-family: inherit;\n  font-size: 100%;\n  padding: 0; margin: 0;\n}\n</textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<form>\n  <fieldset>\n    <legend>Who is your favorite pony?</legend>\n    <ul>\n      <li>\n        <label for=\"pinkie\">Pinkie Pie</label>\n        <input type=\"radio\" id=\"pinkie\" name=\"pony\" value=\"pinkie\">\n      </li>\n      <li>\n        <label for=\"rainbow\">Rainbow Dash</label>\n        <input type=\"radio\" id=\"rainbow\" name=\"pony\" value=\"rainbow\">\n      </li>\n      <li>\n        <label for=\"twilight\">Twilight Sparkle</label>\n        <input type=\"radio\" id=\"twilight\" name=\"pony\" value=\"twilight\">\n      </li>\n    </ul>\n  </fieldset>\n</form>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/forms/tasks/advanced-styling/advanced-styling3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Advanced styling: Task 3</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      button,\n      input,\n      select {\n        font-family: inherit;\n        font-size: 100%;\n        padding: 0; margin: 0;\n      }\n\n      fieldset {\n        padding: 10px 30px 0;\n        width: 400px;\n      }\n\n      legend {\n        color: white;\n        background: black;\n        padding: 5px 10px;\n      }\n\n      fieldset > div {\n        margin-bottom: 20px;\n        display: flex;\n        flex-flow: row wrap;\n      }\n\n      button, label, input {\n        display: block;\n        font-family: inherit;\n        font-size: 100%;\n        padding: 0;\n        margin: 0;\n        box-sizing: border-box;\n        width: 100%;\n        padding: 5px;\n        height: 30px;\n      }\n\n      input {\n        box-shadow: inset 1px 1px 3px #ccc;\n        border-radius: 5px;\n      }\n\n      input:hover, input:focus {\n        background-color: #eee;\n      }\n\n      button {\n        width: 60%;\n        margin: 0 auto;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n      <fieldset>\n        <legend>Feedback form</legend>\n\n        <p>Required fields are labelled with \"required\".</p>\n        <div>\n          <label for=\"fname\">First name: </label>\n          <input id=\"fname\" name=\"fname\" type=\"text\" required>\n          <span></span>\n        </div>\n        <div>\n          <label for=\"lname\">Last name: </label>\n          <input id=\"lname\" name=\"lname\" type=\"text\" required>\n          <span></span>\n        </div>\n        <div>\n          <label for=\"email\">Email address: </label>\n          <input id=\"email\" name=\"email\" type=\"email\">\n          <span></span>\n        </div>\n        <div><button>Submit</button></div>\n      </fieldset>\n    </form>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/forms/tasks/advanced-styling/marking.md",
    "content": "# Advanced form styling marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the features covered in the [Advanced form styling](https://wiki.developer.mozilla.org/en-US/docs/Learn/Forms/Advanced_form_styling) and [UI pseudo-classes](https://wiki.developer.mozilla.org/en-US/docs/Learn/Forms/UI_pseudo-classes) lessons in Learn Web Development on MDN.\n\n## Task 1\n\nIn our first advanced styling tasks, we want you to handle making a search input as consistent as possible across browsers — a trickier task than with standard text inputs, even on modern browsers.\n\nWe've already provided you with a basic reset to build upon.\n\n1. First of all, try giving the search box a consistent width, height, padding, and border color across browsers. This is pretty self-explanatory; `line-height` tends to work better than `height` for keeping a consistent height in which the input text is vertically-centered.\n2. You'll find that some browsers will not behave in terms of the form element's height. This is due to native OS styling being used in some cases. How can you remove this native styling? The answer here is `-webkit-appearance: none;`.\n3. Once you've removed the native styling, you'll need to add back one of the features it was providing, to keep same look and feel we originally had. How do you do this? Answer: rounded corners! We need `border-radius`.\n4. One thing that is inconsistent across browsers (particularly looking at Safari here) is the position of the standard blue focus outline. How can you remove this? Answer: `outline: none;`\n5. There is a major problem with just getting rid of the blue focus outline. What is it? Can you add some kind of styling back in so that users can tell when the search box is being hovered or focused? Answer: Use some kind of styling applied to the input using the `:hover` and `:focus` pseudo-classes.\n6. Another thing that commonly denotes a search box is a magnifying glass icon. We've made one available in the same directory as `search-24px.png`, plus a `<div>` element after the search input to help you attach it, should you need it. Can you figure out a sensible way to attach it, and can you use some CSS to get it to sit to the right of the search box, and be lined up vertically as well? Answer: There are many ways to do this, but the easiest is probably to make it a background image of the `<div>`, and then use flexbox to line it up.\n\nThe finished CSS could look something like this:\n\n```css\nbody {\n  background-color: #fff;\n  color: #333;\n  font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n  padding: 1em;\n  margin: 0;\n}\n\n* {\n  box-sizing: border-box;\n}\n\nbutton,\ninput,\nselect {\n  font-family: inherit;\n  font-size: 100%;\n  padding: 0;\n  margin: 0;\n}\n\ninput[type=\"search\"] {\n  line-height: 1.5rem;\n  padding: 5px;\n  border: 2px solid #ccc;\n  width: 200px;\n\n  -webkit-appearance: none;\n  border-radius: 6px;\n\n  outline: none;\n}\n\ninput[type=\"search\"]:hover,\ninput[type=\"search\"]:focus {\n  border: 2px solid red;\n  box-shadow: 1px 1px 1px gray;\n}\n\ndiv {\n  width: 36px;\n  height: 24px;\n  background: url(search-24px.png) no-repeat center;\n  background-size: 18px;\n}\n\nform {\n  display: flex;\n  align-items: center;\n}\n```\n\n## Task 2\n\nIn our next task we provide you with a set of three radio buttons. We want you to give them custom styling.\n\nWe've already provided you with a basic reset to build upon.\n\n1. First of all, get rid of their default styling. Again, `-webkit-appearance: none;` is what you need here.\n2. Next, give the radio buttons a reasonable base style — the style they have when the page first loads. This can be anything you like, but you probably want to set a width and height (of somewhere between about 18 and 24 pixels), and a subtle border and/or background color.\n3. Now give the radio buttons a different style for when they are selected. You'll need to use the `:checked` pseudo-class for selecting when the radio button is selected. If you want to do something a bit more fancy, you can also use a combination of `:checked` and `::before` or `::after` to use some generated content to provide a central glyph, or image. You'd need to use absolute positioning on the generated content and relative positioning on the radio button to help line things up. Bear in mind that using an actual text character is a pain to align, so using a background image would be more successful.\n4. Align the radio buttons nicely with the labels. A simple bit of flexbox would work nicely here as well.\n\nThe finished CSS could look something like this:\n\n```css\nbody {\n  background-color: #fff;\n  color: #333;\n  font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n  padding: 1em;\n  margin: 0;\n}\n\n* {\n  box-sizing: border-box;\n}\n\nbutton,\ninput,\nselect {\n  font-family: inherit;\n  font-size: 100%;\n  padding: 0;\n  margin: 0;\n}\n\ninput[type=\"radio\"] {\n  -webkit-appearance: none;\n\n  height: 24px;\n  width: 24px;\n  border: 2px solid #ccc;\n}\n\ninput[type=\"radio\"]:checked {\n  border: 2px solid red;\n  position: relative;\n}\n\ninput[type=\"radio\"]:checked::before {\n  content: \"\";\n  background-color: red;\n  width: 12px;\n  height: 12px;\n  position: absolute;\n  top: 4px;\n  left: 4px;\n}\n\nli {\n  display: flex;\n  align-items: center;\n  margin-bottom: 10px;\n}\n\nlabel {\n  width: 150px;\n  margin-right: 10px;\n}\n```\n\n## Task 3\n\nIn our final task for this assessment series, we provide you with a feedback form that is already nicely-styled — you've already seen something similar if you've worked through our UI pseudo-classes article, and now we want you to come up with your own solution.\n\nWhat we'd like you to do is make use of some advanced pseudo-classes to provide some useful indicators of validity.\n\n1. First of all, we want you to provide some specific styling to visually indicate which inputs have to be filled in — they cannot be left empty. The basis of doing this is use of the `:required` pseudo-class. Apart from that, you can use whatever styling you like, as long as it reasonably indicates what inputs are required. In our case, we've used `:required` plus an adjacent combinator to attach some generated content to the `<span>` that appears after the input, but the provided solution doesn't have to be this complex.\n2. Second, we want you to provide a useful visual indicator of whether the data entered inside each input is valid or not. This requires use of the `:valid` and `:invalid` pseudo-classes. Again, any reasonable solution is OK here, and attaching something to the trailing `<span>` in each case remains an option.\n\nThe finished CSS could look something like this:\n\n```css\nbody {\n  background-color: #fff;\n  color: #333;\n  font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n  padding: 1em;\n  margin: 0;\n}\n\n* {\n  box-sizing: border-box;\n}\n\nbutton,\ninput,\nselect {\n  font-family: inherit;\n  font-size: 100%;\n  padding: 0;\n  margin: 0;\n}\n\nfieldset {\n  padding: 10px 30px 0;\n  width: 400px;\n}\n\nlegend {\n  color: white;\n  background: black;\n  padding: 5px 10px;\n}\n\nfieldset > div {\n  margin-bottom: 20px;\n  display: flex;\n  flex-flow: row wrap;\n}\n\nbutton,\nlabel,\ninput {\n  display: block;\n  font-family: inherit;\n  font-size: 100%;\n  padding: 0;\n  margin: 0;\n  box-sizing: border-box;\n  width: 100%;\n  padding: 5px;\n  height: 30px;\n}\n\ninput {\n  box-shadow: inset 1px 1px 3px #ccc;\n  border-radius: 5px;\n}\n\ninput:hover,\ninput:focus {\n  background-color: #eee;\n}\n\nbutton {\n  width: 60%;\n  margin: 0 auto;\n}\n\ninput + span {\n  position: relative;\n}\n\ninput:required + span::after {\n  font-size: 0.7rem;\n  position: absolute;\n  content: \"required\";\n  color: white;\n  background-color: black;\n  padding: 5px 10px;\n  top: -26px;\n  left: -70px;\n}\n\ninput + span::before {\n  position: absolute;\n  right: -20px;\n  top: 5px;\n}\n\ninput:invalid {\n  border: 2px solid red;\n}\n\ninput:invalid + span::before {\n  content: \"✖\";\n  color: red;\n}\n\ninput:valid + span::before {\n  content: \"✓\";\n  color: green;\n}\n```\n"
  },
  {
    "path": "html/forms/tasks/basic-controls/basic-controls1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Basic controls: Task 1</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n      <ul>\n        <li>\n          User ID\n\n        </li>\n        <li>\n          Password\n\n        </li>\n        <li>\n\n        </li>\n      </ul>\n    </form>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/forms/tasks/basic-controls/basic-controls1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Basic controls: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<form>\n  <ul>\n    <li>\n      User ID\n\n    </li>\n    <li>\n      Password\n\n    </li>\n    <li>\n\n    </li>\n  </ul>\n</form>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/forms/tasks/basic-controls/basic-controls2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Basic controls: Task 2</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n      <fieldset>\n        <legend>Who is your favorite pony?</legend>\n        <ul>\n          <li>\n            <label for=\"pinkie\">Pinkie Pie</label>\n\n          </li>\n          <li>\n            <label for=\"rainbow\">Rainbow Dash</label>\n\n          </li>\n          <li>\n            <label for=\"twilight\">Twilight Sparkle</label>\n\n          </li>\n        </ul>\n      </fieldset>\n      <fieldset>\n        <legend>Hotdog preferences</legend>\n        <ul>\n          <li>\n            <label for=\"vegan\">Vegan</label>\n\n          </li>\n          <li>\n            <label for=\"onions\">Onions</label>\n\n          </li>\n        </ul>\n      </fieldset>\n      <button>Submit</button>\n    </form>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/forms/tasks/basic-controls/basic-controls2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Basic controls: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n      <form>\n        <fieldset>\n          <legend>Who is your favorite pony?</legend>\n          <ul>\n            <li>\n              <label for=\"pinkie\">Pinkie Pie</label>\n\n            </li>\n            <li>\n              <label for=\"rainbow\">Rainbow Dash</label>\n\n            </li>\n            <li>\n              <label for=\"twilight\">Twilight Sparkle</label>\n\n            </li>\n          </ul>\n        </fieldset>\n        <fieldset>\n          <legend>Hotdog preferences</legend>\n          <ul>\n            <li>\n              <label for=\"vegan\">Vegan</label>\n\n            </li>\n            <li>\n              <label for=\"onions\">Onions</label>\n\n            </li>\n          </ul>\n        </fieldset>\n        <button>Submit</button>\n      </form>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/forms/tasks/basic-controls/basic-controls3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Basic controls: Task 3</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n        <ul>\n          <li>\n            <label for=\"gallery-img\">Choose gallery images to upload</label>\n\n          </li>\n        </ul>\n      <button>Submit</button>\n    </form>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/forms/tasks/basic-controls/basic-controls3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Basic controls: Task 3</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<form>\n    <ul>\n      <li>\n        <label for=\"gallery-img\">Choose gallery images to upload</label>\n\n      </li>\n    </ul>\n  <button>Submit</button>\n</form>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/forms/tasks/basic-controls/marking.md",
    "content": "# Basic controls marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the features covered in the [Basic native form controls](https://developer.mozilla.org/en-US/docs/Learn/Forms/Basic_native_form_controls) lesson in Learn Web Development on MDN.\n\n## Task 1\n\nThis task starts you off nice and gently by asking you to create two input elements, for a user's ID and password, along with a submit button.\n\n1. Create appropriate inputs for user ID and password — you need to use appropriate `<input>` elements, with `type`s of `text` and `password` respectively. They should also have `id`s and `name`s.\n2. You should also associate them with their text labels semantically — use `<label>` elements appropriately, with `for` attributes as required.\n3. Create a submit button inside the remaining list item, with button text of \"Log in\". Either `<button>Log in</button>`, or `<input type=\"submit\" value=\"Log in\">` will do.\n4. Try submitting your form to see if it submits successfully (there will be no redirect, but you should see the data attached to the page URL).\n\nThe finished markup should look something like this:\n\n```html\n<form>\n  <ul>\n    <li>\n      <label for=\"uid\">User ID</label>\n      <input type=\"text\" id=\"uid\" name=\"uid\" />\n    </li>\n    <li>\n      <label for=\"pwd\">Password</label>\n      <input type=\"password\" id=\"pwd\" name=\"pwd\" />\n    </li>\n    <li>\n      <button>Log in</button>\n    </li>\n  </ul>\n</form>\n```\n\n## Task 2\n\nThe next task requires you to create working sets of checkboxes and radio buttons, from the provided text labels.\n\n1. Turn the first fieldset's contents into a set of radio buttons — you should only be able to select one pony character at once. `<input type=\"radio\">` is the key here. You should use the same `name` attribute value for all the inputs, so that it associates the radio buttons into the same group.\n2. Make it so that the first radio button is selected upon page load. This is done by setting the `checked` attribute on the first input.\n3. Turn the second fieldset's content into a set of checkboxes. `<input type=\"checkbox\">` is needed here. We've given each input the same `name` attribute value because the items are related.\n4. Add a couple more hotdog choices of your own.\n\nNote: It is usually better if you set `value` attributes explicitly on radio buttons and checkboxes, as well as the usually `type`, `id`, and `name`. If you don't, their value defaults to `on` when submitted, which is often not what you want.\n\nThe finished markup should look something like this:\n\n```html\n<form>\n  <fieldset>\n    <legend>Who is your favorite pony?</legend>\n    <ul>\n      <li>\n        <label for=\"pinkie\">Pinkie Pie</label>\n        <input type=\"radio\" id=\"pinkie\" name=\"pony\" value=\"pinkie\" checked />\n      </li>\n      <li>\n        <label for=\"rainbow\">Rainbow Dash</label>\n        <input type=\"radio\" id=\"rainbow\" name=\"pony\" value=\"rainbow\" />\n      </li>\n      <li>\n        <label for=\"twilight\">Twilight Sparkle</label>\n        <input type=\"radio\" id=\"twilight\" name=\"pony\" value=\"twilight\" />\n      </li>\n    </ul>\n  </fieldset>\n  <fieldset>\n    <legend>Hotdog preferences</legend>\n    <ul>\n      <li>\n        <label for=\"vegan\">Vegan</label>\n        <input type=\"checkbox\" id=\"vegan\" name=\"hotdog\" value=\"vegan\" />\n      </li>\n      <li>\n        <label for=\"onions\">Onions</label>\n        <input type=\"checkbox\" id=\"onions\" name=\"hotdog\" value=\"onions\" />\n      </li>\n      <li>\n        <label for=\"mustard\">Mustard</label>\n        <input type=\"checkbox\" id=\"mustard\" name=\"hotdog\" value=\"mustard\" />\n      </li>\n\n      <li>\n        <label for=\"ketchup\">Ketchup</label>\n        <input type=\"checkbox\" id=\"ketchup\" name=\"hotdog\" value=\"ketchup\" />\n      </li>\n    </ul>\n  </fieldset>\n  <button>Submit</button>\n</form>\n```\n\n## Task 3\n\nThe final task in this set requires you to create a file picker.\n\n1. Create a basic file picker. Use `<input type=\"file\">`\n2. Allow the user to pick multiple files at once. Do this by including the `multiple` attribute.\n3. Allow the file picker to accept JPG and PNG images. To do this, you need to include the `accept` attribute, and give it a value of `image/png, image/jpeg`.\n\nThe finished markup should look something like this:\n\n```html\n<form>\n  <ul>\n    <li>\n      <label for=\"gallery-img\">Choose gallery images to upload</label>\n      <input\n        type=\"file\"\n        id=\"gallery-img\"\n        name=\"gallery-img\"\n        multiple\n        accept=\"image/png, image/jpeg\"\n      />\n    </li>\n  </ul>\n  <button>Submit</button>\n</form>\n```\n"
  },
  {
    "path": "html/forms/tasks/form-structure/form-structure1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Form structure: Task 1</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n      Name:\n      <input type=\"text\" id=\"name\" name=\"name\">\n\n      Age:\n      <input type=\"number\" id=\"age\" name=\"age\">\n\n      Comment:\n      <input type=\"text\" id=\"comment\" name=\"comment\">\n\n      Email:\n      <input type=\"email\" id=\"email\" name=\"email\">\n    </form>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/forms/tasks/form-structure/form-structure1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Form structure: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<form>\n  Name:\n  <input type=\"text\" id=\"name\" name=\"name\">\n\n  Age:\n  <input type=\"number\" id=\"age\" name=\"age\">\n\n  Comment:\n  <input type=\"text\" id=\"comment\" name=\"comment\">\n\n  Email:\n  <input type=\"email\" id=\"email\" name=\"email\">\n</form>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/forms/tasks/form-structure/marking.md",
    "content": "# Form structure marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the features covered in the [How to structure a web form](https://developer.mozilla.org/en-US/docs/Learn/Forms/How_to_structure_a_web_form) lesson in Learn Web Development on MDN.\n\n## Task 1\n\nThe only task in this test your skills assessment looks at your knowledge of simple form structure. You are asked to:\n\n1. Separate out the first two and second two form fields into two distinct containers, each with a descriptive legend (use \"Personal details\" for the first two, and \"Comment information\" for the second two). This is what the `<fieldset>` and `<legend>` elements are made for.\n2. Mark up each text label with an appropriate element so that it is semantically associated with its respective form field. This needs the `<label>` element, and the `for` attribute if you are choosing not to wrap the `<label>` around the `<input>`.\n3. Add a suitable set of structural elements around the label/field pairs to separate them out. Ordered/unordered lists would be ideal, but something like `<div>`s would also be acceptable.\n\nThe finished markup should look something like this:\n\n```html\n<form>\n  <fieldset>\n    <legend>Personal details</legend>\n    <ul>\n      <li>\n        <label for=\"name\">Name:</label>\n        <input type=\"text\" id=\"name\" name=\"name\" />\n      </li>\n      <li>\n        <label for=\"age\">Age:</label>\n        <input type=\"number\" id=\"age\" name=\"age\" />\n      </li>\n    </ul>\n  </fieldset>\n  <fieldset>\n    <legend>Comment information</legend>\n    <ul>\n      <li>\n        <label for=\"comment\">Comment:</label>\n        <input type=\"text\" id=\"comment\" name=\"comment\" />\n      </li>\n      <li>\n        <label for=\"email\">Email (include if you want a reply):</label>\n        <input type=\"email\" id=\"email\" name=\"email\" />\n      </li>\n    </ul>\n  </fieldset>\n</form>\n```\n"
  },
  {
    "path": "html/forms/tasks/form-validation/form-validation1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Form validation: Task 1</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n      <h2>Enter your support query</h2>\n      <ul>\n        <li>\n          <label for=\"uname\">User name:</label>\n          <input type=\"text\" name=\"uname\" id=\"uname\">\n        </li>\n        <li>\n          <label for=\"email\">Email address:</label>\n          <input type=\"text\" name=\"email\" id=\"email\">\n        </li>\n        <li>\n          <label for=\"phone\">Phone number:</label>\n          <input type=\"text\" name=\"phone\" id=\"phone\">\n        </li>\n        <li>\n          <label for=\"comment\">Comment:</label>\n          <textarea name=\"comment\" id=\"comment\">\n          </textarea>\n        </li>\n        <li>\n          <button>Submit comment</button>\n        </li>\n      </ul>\n    </form>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/forms/tasks/form-validation/form-validation2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Form validation: Task 2</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n      <h2>Enter your support query</h2>\n      <ul>\n        <li>\n          <label for=\"uname\">User name:</label>\n          <input type=\"text\" name=\"uname\" id=\"uname\" required>\n        </li>\n        <li>\n          <label for=\"email\">Email address:</label>\n          <input type=\"text\" name=\"email\" id=\"email\" required>\n        </li>\n        <li>\n          <label for=\"phone\">Phone number:</label>\n          <input type=\"text\" name=\"phone\" id=\"phone\" required>\n        </li>\n        <li>\n          <label for=\"comment\">Comment:</label>\n          <textarea name=\"comment\" id=\"comment\" required>\n          </textarea>\n        </li>\n        <li>\n          <button>Submit comment</button>\n        </li>\n      </ul>\n    </form>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/forms/tasks/form-validation/form-validation3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Form validation: Task 3</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n      <label for=\"mail\">I would like you to provide me with an e-mail address:</label>\n      <input type=\"email\" id=\"mail\" name=\"mail\">\n      <button>Submit</button>\n    </form>\n  </body>\n  <script>\n    const email = document.getElementById(\"mail\");\n\n\n  </script>\n\n</html>\n"
  },
  {
    "path": "html/forms/tasks/form-validation/marking.md",
    "content": "# Form validation marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the features covered in the [Client-side form validation](https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation) lesson in Learn Web Development on MDN.\n\n## Task 1\n\nIn this task, we are providing you with a simple support query form, and we want you to add some validation features to it:\n\n1. Make all of the input fields mandatory to complete before the form can be submitted. This is simple — just use the `required` attribute.\n2. Change the type of the \"Email address\" and \"Phone number\" fields to make the browser apply some more specific validation suitable for the data being asked for. The `email` and `tel` types are most suitable for these fields.\n3. Give the \"User name\" field a required length of between 5 and 20 characters, the \"Phone number\" field a maximum length of 15 characters, and the \"Comment\" field a maximum length of 200 characters. The first and last of these three take string data, so require the `minlength` and `maxlength` attributes. The second one is slightly more tricky — you'd think a phone number would constitute a numeric field, so would require the `max` attribute, but it is the number of digits in a phone number that matter, not the value of the number. This one requires `maxlength` too.\n\nTry submitting your form — it should refuse to submit until the above constraints are followed, and give suitable error messages. To help, you might want to consider adding some simple CSS to show when a form field is valid or invalid.\n\nThe finished markup should look something like this:\n\n```html\n<form>\n  <h2>Enter your support query</h2>\n  <ul>\n    <li>\n      <label for=\"uname\">User name:</label>\n      <input\n        type=\"text\"\n        name=\"uname\"\n        id=\"uname\"\n        required\n        minlength=\"5\"\n        maxlength=\"20\"\n      />\n    </li>\n    <li>\n      <label for=\"email\">Email address:</label>\n      <input type=\"email\" name=\"email\" id=\"email\" required />\n    </li>\n    <li>\n      <label for=\"phone\">Phone number:</label>\n      <input type=\"tel\" name=\"phone\" id=\"phone\" required maxlength=\"15\" />\n    </li>\n    <li>\n      <label for=\"comment\">Comment:</label>\n      <textarea name=\"comment\" id=\"comment\" required maxlength=\"200\"></textarea>\n    </li>\n    <li>\n      <button>Submit comment</button>\n    </li>\n  </ul>\n</form>\n```\n\n## Task 2\n\nNow we want you to take the same form you saw in the previous task (use your previous answer if you want to), and add some more specific pattern validation to the first three fields.\n\n1. All of the user names in our application consist of a single letter, followed by a dot, followed by three or more letters or numbers. All letters should be lowercase. This will work — `pattern=\"[a-z]{1}\\.[a-z0-9]{3,}\"`.\n2. All of the email addresses for our users consist of one or more letters (lower or upper case) or numbers, followed by \"@bigcorp.eu\". This will work — `[a-zA-Z0-9]+@bigcorp\\.eu`.\n3. Remove the length validation from the phone number field if it is present, and set it so that it accepts 10 digits — either 10 digits in a row, or a pattern of three digits, three digits, then four digits, separated by either spaces, dashes, or dots. The following will work for this — `pattern=\"[0-9]{10}|[0-9]{3}[\\-. ][0-9]{3}[\\-. ][0-9]{4}\"` — although bear in mind that it will work if the separators are not all the same (e.g. one dot and two dashes). This is OK for the purposes of this task — you'd be unlikely to get people entering numbers like this anyway, and it would be easy to sanitize the data on the server.\n\nTry submitting your form — it should refuse to submit until the above constraints are followed, and give suitable error messages. To help, you might want to consider adding some simple CSS to show when a form field is valid or invalid.\n\nThe finished markup should look something like this:\n\n```html\n<form>\n  <h2>Enter your support query</h2>\n  <ul>\n    <li>\n      <label for=\"uname\">User name:</label>\n      <input\n        type=\"text\"\n        name=\"uname\"\n        id=\"uname\"\n        required\n        pattern=\"[a-z]{1}\\.[a-z0-9]{3,}\"\n      />\n    </li>\n    <li>\n      <label for=\"email\">Email address:</label>\n      <input\n        type=\"text\"\n        name=\"email\"\n        id=\"email\"\n        required\n        pattern=\"[A-z0-9]+@bigcorp.eu\"\n      />\n    </li>\n    <li>\n      <label for=\"phone\">Phone number:</label>\n      <input\n        type=\"text\"\n        name=\"phone\"\n        id=\"phone\"\n        required\n        pattern=\"[0-9]{10}|[0-9]{3}[\\-. ][0-9]{3}[\\-. ][0-9]{4}\"\n      />\n    </li>\n    <li>\n      <label for=\"comment\">Comment:</label>\n      <textarea name=\"comment\" id=\"comment\" required> </textarea>\n    </li>\n    <li>\n      <button>Submit comment</button>\n    </li>\n  </ul>\n</form>\n```\n\n## Task 3\n\nIn our final task for this set, we are providing you with a similar example to what you saw in the accompanying article — a simple email address entry input. We would like you to use the constraint validation API, plus some form validation attributes, to program some custom error messages.\n\n1. Make the input mandatory to fill in, and give it a minimum length of 10 characters.\n2. Add an event listener that checks whether the inputted value is an email address, and whether it is long enough. If it doesn't look like an email address or is too short, provide the user with appropriate custom error messages.\n\nThe finished markup should look something like this:\n\n```html\n<form>\n  <label for=\"mail\">\n    I would like you to provide me with an e-mail address:\n  </label>\n  <input type=\"email\" id=\"mail\" name=\"mail\" required minlength=\"10\" />\n  <button>Submit</button>\n</form>\n```\n\nAnd the JavaScript should look something like this:\n\n```js\nconst email = document.getElementById(\"mail\");\n\nemail.addEventListener(\"input\", function (event) {\n  if (email.validity.typeMismatch) {\n    email.setCustomValidity(\"I am expecting an e-mail address!\");\n  } else if (email.validity.tooShort) {\n    email.setCustomValidity(\"Your e-mail address is too short!!\");\n  } else {\n    email.setCustomValidity(\"\");\n  }\n});\n```\n"
  },
  {
    "path": "html/forms/tasks/html5-controls/html5-controls1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>HTML5 controls: Task 1</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n      <h2>Edit your preferences</h2>\n      <ul>\n        <li>\n          <label for=\"e-mail\">Email</label>\n\n        </li>\n        <li>\n          <label for=\"website\">Website</label>\n\n        </li>\n        <li>\n          <label for=\"phone\">Phone number</label>\n\n        </li>\n        <li>\n          <label for=\"fave-color\">Favorite color</label>\n\n        </li>\n        <li>\n          <button>Update preferences</button>\n        </li>\n      </ul>\n    </form>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/forms/tasks/html5-controls/html5-controls1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>HTML5 controls: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<form>\n  <h2>Edit your preferences</h2>\n  <ul>\n    <li>\n      <label for=\"e-mail\">Email</label>\n\n    </li>\n    <li>\n      <label for=\"website\">Website</label>\n\n    </li>\n    <li>\n      <label for=\"phone\">Phone number</label>\n\n    </li>\n    <li>\n      <label for=\"fave-color\">Favorite color</label>\n\n    </li>\n    <li>\n      <button>Update preferences</button>\n    </li>\n  </ul>\n</form>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/forms/tasks/html5-controls/html5-controls2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>HTML5 controls: Task 2</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n      <ul>\n        <li>\n          <label for=\"max-invite\">Select maximum number of invitations</label>\n          \n        </li>\n        <li>\n          <button>Submit</button>\n        </li>\n      </ul>\n    </form>\n    <script>\n      const invite = document.querySelector('#max-invite');\n      const output = document.querySelector('.invite-output');\n\n      output.textContent = invite.value;\n\n      invite.addEventListener('input', function() {\n        output.textContent = invite.value;\n      });\n    </script>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/forms/tasks/html5-controls/html5-controls2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>HTML5 controls: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<form>\n  <ul>\n    <li>\n      <label for=\"max-invite\">Select maximum number of invitations</label>\n      \n    </li>\n    <li>\n      <button>Submit</button>\n    </li>\n  </ul>\n</form>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n\n  <script>\n    function setSliderOutput() {\n      const invite = document.querySelector('#max-invite');\n      const output = document.querySelector('.invite-output');\n\n      output.textContent = invite.value;\n\n      invite.addEventListener('input', function() {\n        output.textContent = invite.value;\n      });\n    }\n\n    setInterval(setSliderOutput, 200);\n  </script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/forms/tasks/html5-controls/marking.md",
    "content": "# HTML5 controls marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the features covered in the [The HTML5 input types](https://wiki.developer.mozilla.org/en-US/docs/Learn/Forms/HTML5_input_types) lesson in Learn Web Development on MDN.\n\n## Task 1\n\nFirst let's explore some of the new HTML5 input types.\n\nCreate appropriate inputs for a user to update their details for:\n\n1. Email\n2. Website\n3. Phone number\n4. Favourite color\n\nThe appropriate input types to use here are `email`, `url`, `tel`, and `color`.\n\nThe finished markup should look something like this:\n\n```html\n<form>\n  <h2>Edit your preferences</h2>\n  <ul>\n    <li>\n      <label for=\"e-mail\">Email</label>\n      <input type=\"email\" id=\"e-mail\" name=\"e-mail\" />\n    </li>\n    <li>\n      <label for=\"website\">Website</label>\n      <input type=\"url\" id=\"website\" name=\"website\" />\n    </li>\n    <li>\n      <label for=\"phone\">Phone number</label>\n      <input type=\"tel\" id=\"phone\" name=\"phone\" />\n    </li>\n    <li>\n      <label for=\"fave-color\">Favorite color</label>\n      <input type=\"color\" id=\"fave-color\" name=\"fave-color\" />\n    </li>\n    <li>\n      <button>Update preferences</button>\n    </li>\n  </ul>\n</form>\n```\n\n## Task 2\n\nNext, we want you to implement a slider control to allow the user to choose a maximum number of people to invite to their party.\n\n1. Implement a basic slider control to go along with the provided label. This requires `<input type=\"range\">`.\n2. Give it a minimum value of 1, maximum value of 30, and initial value of 10. To do this, you should use the `min`, `max`, and `value` attributes.\n3. Create a corresponding output element to put the current value of the slider into. Give it a class of `invite-output`, and semantically associate it with the input. If you do this correctly, the JavaScript included on the page will automatically update the output value when the slider is moved. To achieve this, you need to use an `<output>` element, give it a `class` attribute with value `invite-output`, and give it a `for` attribute with value `max-invite`.\n\nThe finished markup should look something like this:\n\n```html\n<form>\n  <ul>\n    <li>\n      <label for=\"max-invite\">Select maximum number of invitations</label>\n      <input\n        type=\"range\"\n        id=\"max-invite\"\n        name=\"max-invite\"\n        min=\"1\"\n        max=\"30\"\n        value=\"10\"\n      />\n      <output class=\"invite-output\" for=\"max-invite\"></output>\n    </li>\n    <li>\n      <button>Submit</button>\n    </li>\n  </ul>\n</form>\n```\n"
  },
  {
    "path": "html/forms/tasks/other-controls/marking.md",
    "content": "# Other controls marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the features covered in the [Other form controls](https://developer.mozilla.org/en-US/docs/Learn/Forms/Other_form_controls) lesson in Learn Web Development on MDN.\n\n## Task 1\n\nIn our first \"other controls\" assessment, we'll get you to create a multi-line text input.\n\n1. Create a basic multi-line text input. You should use a `<textarea>` element for this.\n2. Associate it semantically with the provided \"Comment\" label. Use the same value that the `for` attribute already has, for the `id` of the `<textarea>`.\n3. Give the input 35 columns, and 10 rows of space in which to add comments. The `cols` and `rows` attributes are what you need here.\n4. Give the comments a maximum length of 100 characters. This requires use of the `maxlength` attribute.\n\nThe finished markup should look something like this:\n\n```html\n<form>\n  <h2>Enter your comment</h2>\n  <ul>\n    <li>\n      <label for=\"name\">Name:</label>\n      <input type=\"text\" name=\"name\" id=\"name\" />\n    </li>\n    <li>\n      <label for=\"comment\">Comment:</label>\n      <textarea id=\"comment\" name=\"comment\" cols=\"35\" rows=\"10\" maxlength=\"100\">\nEnter comment here</textarea\n      >\n    </li>\n    <li>\n      <button>Submit comment</button>\n    </li>\n  </ul>\n</form>\n```\n\n## Task 2\n\nNow it's time to have a go at implementing a drop-down select menu, to allow a user to pick their favourite food from the choices provided.\n\n1. Create your basic select box structure. You should use a `<select>` element for this, inside which you should nest an `<option>` element for each choice.\n2. Associate it semantically with the provided \"Comment\" label. Use the same value that the `for` attribute already has, for the `id` of the `<select>`.\n3. Inside the list, split the choices up into 2 subgroups — \"mains\" and \"snacks\". To do this, you should use `<optgroup>` elements inside the main `<select>`, with appropriate `label` attributes.\n\nThe finished markup should look something like this:\n\n```html\n<form>\n  <ul>\n    <li>\n      <label for=\"food\">Pick your favorite food:</label>\n      <select name=\"food\" id=\"food\">\n        <optgroup label=\"mains\">\n          <option>Salad</option>\n          <option>Curry</option>\n          <option>Pizza</option>\n          <option>Fajitas</option>\n        </optgroup>\n        <optgroup label=\"snacks\">\n          <option>Biscuits</option>\n          <option>Crisps</option>\n          <option>Fruit</option>\n          <option>Breadsticks</option>\n        </optgroup>\n      </select>\n    </li>\n    <li>\n      <button>Submit choice</button>\n    </li>\n  </ul>\n</form>\n```\n\n## Task 3\n\nIn our final task of this set, we start with much the same list of food choices. However, this time we want to do things differently:\n\n1. Create a basic text input that is semantically associated with the provided label. This is done as you'd expect — use a simple `<input type=\"text\">` with an `id` that matches the label's `for` value.\n2. Put the food choices into a list that can be associated with a form input. For this, you need to wrap each option in an `<option>` element, and wrap the whole series of them in a `<datalist>` element.\n3. Associate the list with your text input, so that when you type characters, any of the list options that match the character sequence are given in a dropdown list as autocomplete suggestions. To do this, you need to give the `<datalist>` an `id`, and then given the `<input>` a `list` attribute whose value matches the `<datalist>`'s `id`.\n\nThe finished markup should look something like this:\n\n```html\n<form>\n  <ul>\n    <li>\n      <label for=\"food\">Enter your favorite food:</label>\n      <input type=\"text\" name=\"food\" id=\"food\" list=\"food-suggest\" />\n      <datalist id=\"food-suggest\">\n        <option>Salad</option>\n        <option>Curry</option>\n        <option>Pizza</option>\n        <option>Fajitas</option>\n        <option>Biscuits</option>\n        <option>Crisps</option>\n        <option>Fruit</option>\n        <option>Breadsticks</option>\n      </datalist>\n    </li>\n    <li>\n      <button>Submit choice</button>\n    </li>\n  </ul>\n</form>\n```\n"
  },
  {
    "path": "html/forms/tasks/other-controls/other-controls1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Other controls: Task 1</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n      <h2>Enter your comment</h2>\n      <ul>\n        <li>\n          <label for=\"name\">Name:</label>\n          <input type=\"text\" name=\"name\" id=\"name\">\n        </li>\n        <li>\n          <label for=\"comment\">Comment:</label>\n          <!-- add your input here  -->\n        </li>\n        <li>\n          <button>Submit comment</button>\n        </li>\n      </ul>\n    </form>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/forms/tasks/other-controls/other-controls1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Other controls: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<form>\n  <h2>Enter your comment</h2>\n  <ul>\n    <li>\n      <label for=\"name\">Name:</label>\n      <input type=\"text\" name=\"name\" id=\"name\">\n    </li>\n    <li>\n      <label for=\"comment\">Comment:</label>\n      <!-- add your input here  -->\n    </li>\n    <li>\n      <button>Submit comment</button>\n    </li>\n  </ul>\n</form>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/forms/tasks/other-controls/other-controls2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Other controls: Task 2</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n      <ul>\n        <li>\n          <label for=\"food\">Pick your favorite food:</label>\n\n              Salad\n              Curry\n              Pizza\n              Fajitas\n\n              Biscuits\n              Crisps\n              Fruit\n              Breadsticks\n\n        </li>\n        <li>\n          <button>Submit choice</button>\n        </li>\n      </ul>\n    </form>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/forms/tasks/other-controls/other-controls2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Other controls: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<form>\n  <ul>\n    <li>\n      <label for=\"food\">Pick your favorite food:</label>\n\n          Salad\n          Curry\n          Pizza\n          Fajitas\n\n          Biscuits\n          Crisps\n          Fruit\n          Breadsticks\n\n    </li>\n    <li>\n      <button>Submit choice</button>\n    </li>\n  </ul>\n</form>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/forms/tasks/other-controls/other-controls3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Other controls: Task 3</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n    <form>\n      <ul>\n        <li>\n          <label for=\"food\">Enter your favorite food:</label>\n\n\n              Salad\n              Curry\n              Pizza\n              Fajitas\n              Biscuits\n              Crisps\n              Fruit\n              Breadsticks\n\n        </li>\n        <li>\n          <button>Submit choice</button>\n        </li>\n      </ul>\n    </form>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/forms/tasks/other-controls/other-controls3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Other controls: Task 3</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<form>\n  <ul>\n    <li>\n      <label for=\"food\">Enter your favorite food:</label>\n\n\n          Salad\n          Curry\n          Pizza\n          Fajitas\n          Biscuits\n          Crisps\n          Fruit\n          Breadsticks\n\n    </li>\n    <li>\n      <button>Submit choice</button>\n    </li>\n  </ul>\n</form>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/forms/tasks/playable.js",
    "content": "var section = document.querySelector(\"section\");\nvar editable = document.querySelector(\".editable\");\nvar textareaHTML = document.querySelector(\".playable-html\");\nvar textareaCSS = document.querySelector(\".playable-css\");\nvar reset = document.getElementById(\"reset\");\nvar htmlCode = textareaHTML.value;\nvar cssCode = textareaCSS?.value;\n\nfunction fillCode() {\n  editable.innerHTML = textareaCSS?.value;\n  section.innerHTML = textareaHTML.value;\n}\n\nreset.addEventListener(\"click\", function () {\n  textareaHTML.value = htmlCode;\n  if (textareaCSS) {\n    textareaCSS.value = cssCode;\n  }\n  fillCode();\n});\n\ntextareaHTML.addEventListener(\"input\", fillCode);\ntextareaCSS?.addEventListener(\"input\", fillCode);\nwindow.addEventListener(\"load\", fillCode);\n"
  },
  {
    "path": "html/forms/tasks/styles.css",
    "content": "/* Some default styling for cookbook examples */\n/*\nrgb(53,43,34)\nrgb(75,70,74)\nrgb(95,97,110)\nrgb(137,151,188)\nrgb(160,178,226)\n*/\nbody {\n    background-color: #fff;\n    color: #333;\n    font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n    padding: 0;\n    margin: 0;\n}\n\nh1 {\n  font-size: 2rem;\n  margin: 0;\n}\n\nh2 {\n  font-size: 1.6rem;\n  margin: 0;\n}\n\np {\n  margin: 0.5em 0;\n}\n\n/* styles for the editor */\n\n.playable {\n    font-family: monospace;\n    display: block;\n    margin-bottom: 10px;\n    background-color: #F4F7F8;\n    border: none;\n    border-left: 6px solid #558ABB;\n    color: #4D4E53;\n    width: 90%;\n    max-width: 700px;\n    padding: 10px 10px 0px;\n    font-size: 90%;\n  }\n\n  .playable-css {\n    height: 80px;\n  }\n\n  .playable-html {\n    height: 160px;\n  }\n\n  .playable-buttons {\n    text-align: right;\n    width: 90%;\n    max-width: 700px;\n    padding: 5px 10px 5px 26px;\n    font-size: 100%;\n  }\n\n  .preview {\n    width: 90%;\n    max-width: 700px;\n    border: 1px solid #4D4E53;\n    border-radius: 2px;\n    padding: 10px 14px 10px 10px;\n    margin-bottom: 10px;\n  }\n\n  .preview input {\n    display: block;\n    margin: 5px;\n  }\n"
  },
  {
    "path": "html/forms/tasks/styling-basics/marking.md",
    "content": "# Styling basics marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the features covered in the [Styling web forms](https://developer.mozilla.org/en-US/docs/Learn/Forms/Styling_web_forms) lesson in Learn Web Development on MDN.\n\n## Task 1\n\nOur basic form styling assessment is fairly free-form, and you have a lot of flexibility over what you end up doing here. But your CSS should aim to fulfill the following requirements:\n\n1. Add some kind of lightweight \"reset\" to make fonts, padding, margin, and sizing more consistent to begin with.\n2. On top of that, add in some nice, consistent styling for the inputs and button.\n3. Use some kind of layout technique to make the inputs and labels line up neatly. Flexbox or Grid would be ideal for this, or CSS tables if you prefer something a bit more compatible with old browsers.\n\nThe finished CSS could look something like this:\n\n```css\n* {\n  box-sizing: border-box;\n}\n\nbody {\n  background-color: #fff;\n  color: #333;\n  font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n  padding: 1em;\n  margin: 0;\n  width: 400px;\n}\n\nbutton,\ninput,\nselect {\n  font-family: inherit;\n  font-size: 100%;\n  padding: 0;\n  margin: 0;\n}\n\nli {\n  display: flex;\n  align-items: center;\n  margin-bottom: 10px;\n}\n\nli:last-of-type {\n  margin-top: 30px;\n}\n\nlabel {\n  flex: 0 40%;\n  text-align: right;\n  padding-right: 10px;\n}\n\ninput,\nselect {\n  flex: auto;\n  height: 2em;\n}\n\ninput,\nselect,\nbutton {\n  display: block;\n  padding: 5px 10px;\n  border: 1px solid #ccc;\n  border-radius: 3px;\n}\n\nselect {\n  padding: 5px;\n}\n\nbutton {\n  margin: 0 auto;\n  padding: 5px 20px;\n  line-height: 1.5;\n  background: #eee;\n}\n\nbutton:hover,\nbutton:focus {\n  background: #ddd;\n}\n```\n"
  },
  {
    "path": "html/forms/tasks/styling-basics/styling-basics1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Styling basics: Task 1</title>\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n        width: 500px;\n      }\n\n    </style>\n  </head>\n\n  <body>\n    <form>\n      <h2>Edit your preferences</h2>\n      <ul>\n        <li>\n          <label for=\"e-mail\">Email:</label>\n          <input type=\"email\" id=\"e-mail\" name=\"e-mail\">\n        </li>\n        <li>\n          <label for=\"website\">Website:</label>\n          <input type=\"url\" id=\"website\" name=\"website\">\n        </li>\n        <li>\n          <label for=\"phone\">Phone number:</label>\n          <input type=\"tel\" id=\"phone\" name=\"phone\">\n        </li>\n        <li>\n          <label for=\"food\">Favorite food:</label>\n          <select name=\"food\" id=\"food\">\n            <option>Salad</option>\n            <option>Curry</option>\n            <option>Pizza</option>\n            <option>Fajitas</option>\n          </select>\n        </li>\n        <li>\n          <button>Update preferences</button>\n        </li>\n      </ul>\n    </form>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/forms/tel-example/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>&lt;input type=\"tel\"&gt; example</title>\n    <style>\n        div {\n        margin-bottom: 10px;\n        position: relative;\n        }\n\n        input[type=\"number\"] {\n          width: 100px;\n        }\n\n        input + span {\n          padding-right: 30px;\n        }\n\n        input:invalid+span:after {\n          position: absolute; content: '✖';\n          padding-left: 5px;\n        }\n\n        input:valid+span:after {\n          position: absolute;\n          content: '✓';\n          padding-left: 5px;\n        }\n    </style>\n   </head>\n  <body>\n    <form>\n      <div>\n        <label for=\"country\">Choose your country:</label>\n        <select id=\"country\" name=\"country\">\n          <option>UK</option>\n          <option selected>US</option>\n          <option>Germany</option>\n        </select>\n      </div>\n      <div>\n        <p>Enter your telephone number: </p>\n        <span class=\"areaDiv\">\n          <input id=\"areaNo\" name=\"areaNo\" type=\"tel\" required\n                 placeholder=\"Area code\" pattern=\"[0-9]{3}\"\n                 aria-label=\"Area code\">\n          <span class=\"validity\"></span>\n        </span>\n        <span class=\"number1Div\">\n          <input id=\"number1\" name=\"number1\" type=\"tel\" required\n                 placeholder=\"First part\" pattern=\"[0-9]{3}\"\n                 aria-label=\"First part of number\">\n          <span class=\"validity\"></span>\n        </span>\n        <span class=\"number2Div\">\n          <input id=\"number2\" name=\"number2\" type=\"tel\" required\n                 placeholder=\"Second part\" pattern=\"[0-9]{4}\"\n                 aria-label=\"Second part of number\">\n          <span class=\"validity\"></span>\n        </span>\n      </div>\n      <div>\n        <button>Submit</button>\n      </div>\n    </form>\n    <script>\n      var selectElem = document.querySelector(\"select\");\n      var inputElems = document.querySelectorAll(\"input\");\n\n      selectElem.onchange = function() {\n        for(var i = 0; i < inputElems.length; i++) {\n          inputElems[i].value = \"\";\n        }\n\n        if(selectElem.value === \"US\") {\n          inputElems[2].parentNode.style.display = \"inline\";\n\n          inputElems[0].placeholder = \"Area code\";\n          inputElems[0].pattern = \"[0-9]{3}\";\n\n          inputElems[2].placeholder = \"First part\";\n          inputElems[1].pattern = \"[0-9]{3}\";\n          inputElems[1].setAttribute(\"aria-label\",\"First part of number\");\n\n          inputElems[2].placeholder = \"Second part\";\n          inputElems[2].pattern = \"[0-9]{4}\";\n          inputElems[2].setAttribute(\"aria-label\",\"Second part of number\");\n        } else if(selectElem.value === \"UK\") {\n          inputElems[2].parentNode.style.display = \"none\";\n\n          inputElems[0].placeholder = \"Area code\";\n          inputElems[0].pattern = \"[0-9]{3,6}\";\n\n          inputElems[1].placeholder = \"Local number\";\n          inputElems[1].pattern = \"[0-9]{4,8}\";\n          inputElems[1].setAttribute(\"aria-label\",\"Local number\");\n        } else if(selectElem.value === \"Germany\") {\n          inputElems[2].parentNode.style.display = \"inline\";\n\n          inputElems[0].placeholder = \"Area code\";\n          inputElems[0].pattern = \"[0-9]{3,5}\";\n\n          inputElems[1].placeholder = \"First part\";\n          inputElems[1].pattern = \"[0-9]{2,4}\";\n          inputElems[1].setAttribute(\"aria-label\",\"First part of number\");\n\n          inputElems[2].placeholder = \"Second part\";\n          inputElems[2].pattern = \"[0-9]{4}\";\n          inputElems[2].setAttribute(\"aria-label\",\"Second part of number\");\n        }\n      }\n    </script>\n</body>\n  </html>\n"
  },
  {
    "path": "html/forms/text-example/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>&lt;input type=\"text\"&gt; example</title>\n    <style>\n      div {\n        margin-bottom: 10px;\n        position: relative;\n        }\n\n        input[type=\"number\"] {\n          width: 100px;\n        }\n\n        input + span {\n          padding-right: 30px;\n        }\n\n        input:invalid+span:after {\n          position: absolute; content: '✖';\n          padding-left: 5px;\n        }\n\n        input:valid+span:after {\n          position: absolute;\n          content: '✓';\n          padding-left: 5px;\n        }\n    </style>\n   </head>\n  <body>\n    <form>\n      <div>\n        <label for=\"uname\">Choose a username: </label>\n        <input type=\"text\" id=\"uname\" name=\"name\" required\n               placeholder=\"lowercase, 4-8 characters\"\n               pattern=\"[a-z]{4,8}\">\n      </div>\n      <div>\n        <span class=\"validity\"></span>\n      </div>\n      <div>\n        <button>Submit</button>\n      </div>\n    </form>\n    <script>\n\n    </script>\n</body>\n  </html>\n"
  },
  {
    "path": "html/forms/time-example/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset = \"utf-8\">\n    <title>Time example</title>\n    <style>\n      div {\n        margin-bottom: 10px;\n        position: relative;\n      }\n\n      input[type=\"number\"] {\n        width: 100px;\n      }\n\n      input + span {\n        padding-right: 30px;\n      }\n\n      input:invalid+span:after {\n        position: absolute;\n        content: '✖';\n        padding-left: 5px;\n      }\n\n      input:valid+span:after {\n        position: absolute;\n        content: '✓';\n        padding-left: 5px;\n      }\n    </style>\n   </head>\n  <body>\n    <form>\n      <div>\n        <label for=\"appt-time\">Choose an appointment time (opening hours 12:00 to 18:00): </label>\n        <input id=\"appt-time\" type=\"time\" name=\"appt-time\"\n               min=\"12:00\" max=\"18:00\" required>\n        <span class=\"validity\"></span>\n      </div>\n      <div>\n        <input type=\"submit\" value=\"Submit form\">\n      </div>\n    </form>\n</body>\n  </html>\n"
  },
  {
    "path": "html/forms/toggle-switch-example/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Toggle switch example</title>\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      /* Flexbox fu to make the control and label line up */\n\n      li {\n        width: 100px;\n        display: flex;\n        align-items: center;\n        justify-content: space-around;\n        position: relative;\n      }\n\n      /*\n         Size the label, and make the on and off parts sit on top\n         of one another using positioning\n      */\n\n      label {\n        width: 20px;\n        height: 20px;\n        line-height: 20px;\n        position: relative;\n      }\n\n      label span {\n        position: absolute;\n      }\n\n      /*\n         remove the default styling of the checkbox using appearance\n         and create the outer toggle area\n      */\n\n      input[type=\"checkbox\"] {\n        -webkit-appearance: none;\n        appearance: none;\n        width: 44px;\n        height: 24px;\n        border-radius: 12px;\n        border: 2px solid black;\n        background: #eee;\n        transition: all 0.4s;\n      }\n\n      /*\n         style the ::before content to look like\n         the inner toggle switch - the bit that moves\n      */\n\n      input[type=\"checkbox\"]::before {\n        width: 16px;\n        height: 16px;\n        border-radius: 9px;\n        background-color: black;\n        content: '';\n        position: absolute;\n        top: 7px;\n        left: 16%;\n        transition: all 0.4s;\n      }\n\n      /*\n         change the outer background color and move the inner toggle switch\n         when the checkbox is checked; use transitions for smooth animation\n      */\n\n      input[type=\"checkbox\"]:checked {\n        background-color: #ffaa00;\n        transition: all 0.4s;\n      }\n\n      input[type=\"checkbox\"]:checked::before {\n        left: 35%;\n        transition: all 0.4s;\n      }\n\n      /*\n         cause the On and Off parts of the label to be visible when the checkbox is\n         checked and unchecked, respectively\n      */\n\n      input[type=\"checkbox\"] ~ label .on, input[type=\"checkbox\"]:checked ~ label .off {\n        opacity: 0;\n      }\n\n      input[type=\"checkbox\"] ~ label .off, input[type=\"checkbox\"]:checked ~ label .on {\n        opacity: 1;\n      }\n\n      /*\n         make the focus outline a bit more subtle on Chrome, rather than the\n         default heavy blue outline\n      */\n\n      input:focus {\n        outline: 1px dotted black;\n      }\n\n    </style>\n  </head>\n  <body>\n    <ul>\n      <li>\n        <input type=\"checkbox\" name=\"power\" id=\"power\">\n        <label for=\"power\"><span class=\"on\">On</span> <span class=\"off\">Off</span></label>\n      </li>\n    </ul>\n  </body>\n</html>\n"
  },
  {
    "path": "html/forms/url-example/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>&lt;input type=\"url\"&gt; example</title>\n    <style>\n      div {\n        margin-bottom: 10px;\n        position: relative;\n        }\n\n        input[type=\"number\"] {\n          width: 100px;\n        }\n\n        input + span {\n          padding-right: 30px;\n        }\n\n        input:invalid+span:after {\n          position: absolute; content: '✖';\n          padding-left: 5px;\n        }\n\n        input:valid+span:after {\n          position: absolute;\n          content: '✓';\n          padding-left: 5px;\n        }\n    </style>\n   </head>\n  <body>\n    <form>\n      <div>\n        <label for=\"myURL\">Enter the problem website address:</label>\n        <input id=\"myURL\" name=\"myURL\" type=\"url\"\n               required pattern=\".*\\.myco\\..*\"\n               title=\"URL should be in a myco domain\">\n        <span class=\"validity\"></span>\n      </div>\n      <div>\n        <label for=\"myComment\">What is the problem?</label>\n        <input id=\"myComment\" name=\"myComment\" type=\"text\"\n               required>\n        <span class=\"validity\"></span>\n      </div>\n      <div>\n        <button>Submit</button>\n      </div>\n    </form>\n    <script>\n\n    </script>\n</body>\n  </html>\n"
  },
  {
    "path": "html/forms/week-example/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Week example</title>\n    <style>\n      div {\n        margin-bottom: 10px;\n        position: relative;\n      }\n\n      input[type=\"number\"] {\n        width: 100px;\n      }\n\n      input + span {\n        padding-right: 30px;\n      }\n\n      input:invalid+span:after {\n        position: absolute;\n        content: '✖';\n        padding-left: 5px;\n      }\n\n      input:valid+span:after {\n        position: absolute;\n        content: '✓';\n        padding-left: 5px;\n      }\n    </style>\n   </head>\n  <body>\n    <form>\n      <div>\n        <label for=\"week\">What week would you like to start?</label>\n        <input id=\"week\" type=\"week\" name=\"week\"\n               min=\"2017-W01\" max=\"2017-W52\" required>\n        <span class=\"validity\"></span>\n      </div>\n      <div>\n        <input type=\"submit\" value=\"Submit form\">\n      </div>\n    </form>\n\n\n</body>\n  </html>\n"
  },
  {
    "path": "html/forms/your-first-HTML-form/first-form-styled.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<title>Your first HTML form, styled</title>\n\t\t<style>\n\t\t\tbody{\n\t\t\t\t/* Center the form on the page */\n\t\t\t\ttext-align: center;\n\t\t\t}\n\t\t\tform {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\t/* Form outline */\n\t\t\t\tpadding: 1em;\n\t\t\t\tborder: 1px solid #ccc;\n\t\t\t\tborder-radius: 1em;\n\t\t\t}\n\n\t\t\tp + p {\n\t\t\t\tmargin-top: 1em;\n\t\t\t}\n\n\t\t\tlabel {\n\t\t\t\t/* Uniform size & alignment */\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tmin-width: 90px;\n\n\t\t\t\ttext-align: right;\n\t\t\t}\n\n\t\t\tinput,\n\t\t\ttextarea {\n\t\t\t\t/* To make sure that all text fields have the same font settings By default, textareas have a monospace font */\n\t\t\t\tfont: 1em sans-serif;\n\t\t\t\t/* Uniform text field size */\n\t\t\t\twidth: 300px;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\t/* Match form field borders */\n\t\t\t\tborder: 1px solid #999;\n\t\t\t}\n\n\t\t\tinput:focus,\n\t\t\ttextarea:focus {\n\t\t\t\t/* Set the outline width and style */\n\t\t\t\toutline-style: solid;\n\t\t\t\t/* To give a little highlight on active elements */\n\t\t\t\toutline-color: #000;\n\t\t\t}\n\n\t\t\ttextarea {\n\t\t\t\t/* Align multiline text fields with their labels */\n\t\t\t\tvertical-align: top;\n\t\t\t\t/* Provide space to type some text */\n\t\t\t\theight: 5em;\n\t\t\t}\n\n\t\t\t.button {\n\t\t\t\t/* Align buttons with the text fields */\n\t\t\t\tpadding-left: 90px;\n\t\t\t\t/* same size as the label elements */\n\t\t\t}\n\n\t\t\tbutton {\n\t\t\t\t/* This extra margin represent roughly the same space as the space between the labels and their text fields */\n\t\t\t\tmargin-left: 0.5em;\n\t\t\t}\n\t\t</style>\n\t</head>\n\n\t<body>\n\t\t<form action=\"/my-handling-form-page\" method=\"post\">\n\t\t\t<p>\n\t\t\t\t<label for=\"name\">Name:</label>\n\t\t\t\t<input type=\"text\" id=\"name\" name=\"user_name\" />\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<label for=\"mail\">E-mail:</label>\n\t\t\t\t<input type=\"email\" id=\"mail\" name=\"user_mail\" />\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<label for=\"msg\">Message:</label>\n\t\t\t\t<textarea id=\"msg\" name=\"user_message\"></textarea>\n\t\t\t</p>\n\t\t\t<p class=\"button\">\n\t\t\t\t<button type=\"submit\">Send your message</button>\n\t\t\t</p>\n\t\t</form>\n\t</body>\n</html>\n"
  },
  {
    "path": "html/forms/your-first-HTML-form/first-form.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<title>Your first HTML form</title>\n\t</head>\n\n\t<body>\n\t\t<form action=\"/my-handling-form-page\" method=\"post\">\n\t\t\t<p>\n\t\t\t\t<label for=\"name\">Name:</label>\n\t\t\t\t<input type=\"text\" id=\"name\" name=\"user_name\" />\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<label for=\"mail\">E-mail:</label>\n\t\t\t\t<input type=\"email\" id=\"mail\" name=\"user_mail\" />\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<label for=\"msg\">Message:</label>\n\t\t\t\t<textarea id=\"msg\" name=\"user_message\"></textarea>\n\t\t\t</p>\n\t\t\t<p class=\"button\">\n\t\t\t\t<button type=\"submit\">Send your message</button>\n\t\t\t</p>\n\t\t</form>\n\t</body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/advanced-text-formatting/description-list.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Description list example</title>\n  </head>\n  <body>\n    <dl>\n      <dt>soliloquy</dt>\n      <dd>In drama, where a character speaks to themselves, representing their inner thoughts or feelings and in the process relaying them to the audience (but not to other characters.)</dd>\n      <dt>monologue</dt>\n      <dd>In drama, where a character speaks their thoughts out loud to share them with the audience and any other characters present.</dd>\n      <dt>aside</dt>\n      <dd>In drama, where a character shares a comment only with the audience for humorous or dramatic effect. This is usually a feeling, thought or piece of additional background information.</dd>\n    </dl>\n\n\n  </body>\n</html>"
  },
  {
    "path": "html/introduction-to-html/advanced-text-formatting/other-semantics.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title>Other semantics examples</title>\n  </head>\n  <body>\n    <p>\n      We use <abbr>HTML</abbr>, Hypertext Markup Language, to structure our web\n      documents.\n    </p>\n\n    <p>\n      I think <abbr title=\"Reverend\">Rev.</abbr> Green did it in the kitchen\n      with the chainsaw.\n    </p>\n\n    <address>\n      <p>Chris Mills, Manchester, The Grim North, UK</p>\n    </address>\n\n    <p>My birthday is on the 25<sup>th</sup> of May 2001.</p>\n\n    <p>\n      Caffeine's chemical formula is\n      C<sub>8</sub>H<sub>10</sub>N<sub>4</sub>O<sub>2</sub>.\n    </p>\n\n    <p>If x<sup>2</sup> is 9, x must equal 3.</p>\n\n    <pre><code>const para = document.querySelector('p');\n\npara.onclick = function() {\n  alert('Owww, stop poking me!');\n}</code></pre>\n\n    <p>\n      You shouldn't use presentational elements like\n      <code>&lt;font&gt;</code> and <code>&lt;center&gt;</code>.\n    </p>\n\n    <p>\n      In the above JavaScript example, <var>para</var> represents a paragraph\n      element.\n    </p>\n\n    <p>\n      Select all the text with <kbd>Ctrl</kbd>/<kbd>Cmd</kbd> + <kbd>A</kbd>.\n    </p>\n\n    <pre>$ <kbd>ping mozilla.org</kbd>\n<samp>PING mozilla.org (63.245.215.20): 56 data bytes\n64 bytes from 63.245.215.20: icmp_seq=0 ttl=40 time=158.233 ms</samp></pre>\n  </body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/advanced-text-formatting/quotations.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Quote examples</title>\n  </head>\n  <body>\n    <p>According to the <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blockquote\"> <cite>MDN blockquote page</cite></a>:</p>\n\n    <blockquote cite=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blockquote\">\n      <p>The <strong>HTML <code>&lt;blockquote&gt;</code> Element</strong> (or <em>HTML Block Quotation Element</em>) indicates that the enclosed text is an extended quotation.</p>\n    </blockquote>\n\n    <p>The quote element — <code>&lt;q&gt;</code> — is <q cite=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/q\">intended for short quotations that don't require paragraph breaks.</q> -- <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/q\"><cite>MDN q page</cite></a>.</p>\n\n\n  </body>\n</html>"
  },
  {
    "path": "html/introduction-to-html/creating-hyperlinks/contacts.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>My contacts page</title>\n  </head>\n\n  <body>\n    <h1>This is my contacts page</h1>\n\n    <p>The <a href=\"#Mailing_address\">company mailing address</a> can be found at the bottom of this page.</p>\n\n    <p>Chris is the only guy that works here, and he doesn't have a phone.</p>\n\n    <h2 id=\"Mailing_address\"></h2>\n\n    <address>52 Business street<br>\n    Very important town<br>\n    Commerce city<br>\n    CA, 999654</address>\n  </body>\n</html>"
  },
  {
    "path": "html/introduction-to-html/creating-hyperlinks/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>My sample homepage</title>\n  </head>\n\n  <body>\n    <h1>This is my sample homepage</h1>\n\n    <p>Visit my <a href=\"projects/index.html\">project homepage</a>.</p>\n\n    <p>Want to contact a specific staff member? Find details on our <a href=\"contacts.html\">contacts page</a>.</p>\n\n    <p>Want to write us a letter? Use our <a href=\"contacts.html#Mailing_address\">mailing address</a>.</p>\n  </body>\n</html>"
  },
  {
    "path": "html/introduction-to-html/creating-hyperlinks/projects/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>My project page</title>\n  </head>\n\n  <body>\n    <h1>This is my project page</h1>\n\n    <p>A link to my <a href=\"../pdfs/project-brief.pdf\">project brief</a>.</p>\n  </body>\n</html>"
  },
  {
    "path": "html/introduction-to-html/debugging-html/debug-example-fixed.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n\n    <title>HTML debugging examples</title>\n\n\n  </head>\n\n  <body>\n    <h1>HTML debugging examples</h1>\n\n    <p>What causes errors in HTML?</p>\n\n    <ul>\n      <li>Unclosed elements: If an element is <strong>not closed properly</strong>, then its effect can spread to areas you didn't intend</li>\n\n      <li>Badly nested elements: Nesting elements properly is also very important for code behaving correctly. <strong>strong <em>strong emphasized?</em></strong> what is this?</li>\n\n      <li>Unclosed attributes: Another common source of HTML problems. Let's look at an example: <a href=\"https://www.mozilla.org/\">link to Mozilla homepage</a></li>\n    </ul>\n  </body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/debugging-html/debug-example.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n\n    <title>HTML debugging examples</title>\n\n\n  </head>\n\n  <body>\n    <h1>HTML debugging examples</h1>\n\n    <p>What causes errors in HTML?\n\n    <ul>\n      <li>Unclosed elements: If an element is <strong>not closed properly, then its effect can spread to areas you didn't intend\n\n      <li>Badly nested elements: Nesting elements properly is also very important for code behaving correctly. <strong>strong <em>strong emphasised?</strong> what is this?</em>\n\n      <li>Unclosed attributes: Another common source of HTML problems. Let's look at an example: <a href=\"https://www.mozilla.org/>link to Mozilla homepage</a>\n    </ul>\n  </body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/document_and_website_structure/index.html",
    "content": "<!doctype html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n\n    <title>My page title</title>\n    <link\n      href=\"https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300|Sonsie+One\"\n      rel=\"stylesheet\" />\n    <link rel=\"stylesheet\" href=\"style.css\" />\n  </head>\n\n  <body>\n    <!-- Here is our main header that is used across all the pages of our website -->\n\n    <header>\n      <h1>Header</h1>\n    </header>\n\n    <nav>\n      <ul>\n        <li><a href=\"#\">Home</a></li>\n        <li><a href=\"#\">Our team</a></li>\n        <li><a href=\"#\">Projects</a></li>\n        <li><a href=\"#\">Contact</a></li>\n      </ul>\n\n      <!-- A Search form is another common non-linear way to navigate through a website. -->\n\n      <form>\n        <input type=\"search\" name=\"q\" placeholder=\"Search query\" />\n        <input type=\"submit\" value=\"Go!\" />\n      </form>\n    </nav>\n\n    <!-- Here is our page's main content -->\n    <main>\n      <!-- It contains an article -->\n      <article>\n        <h2>Article heading</h2>\n\n        <p>\n          Lorem ipsum dolor sit amet, consectetur adipisicing elit. Donec a diam\n          lectus. Set sit amet ipsum mauris. Maecenas congue ligula as quam\n          viverra nec consectetur ant hendrerit. Donec et mollis dolor. Praesent\n          et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt\n          congue enim, ut porta lorem lacinia consectetur.\n        </p>\n\n        <section>\n          <h3>Subsection</h3>\n\n          <p>\n            Donec ut librero sed accu vehicula ultricies a non tortor. Lorem\n            ipsum dolor sit amet, consectetur adipisicing elit. Aenean ut\n            gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id\n            dolor.\n          </p>\n\n          <p>\n            Pelientesque auctor nisi id magna consequat sagittis. Curabitur\n            dapibus, enim sit amet elit pharetra tincidunt feugiat nist\n            imperdiet. Ut convallis libero in urna ultrices accumsan. Donec sed\n            odio eros.\n          </p>\n        </section>\n\n        <section>\n          <h3>Another subsection</h3>\n\n          <p>\n            Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus. Cum\n            soclis natoque penatibus et manis dis parturient montes, nascetur\n            ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisi at\n            sem facilisis semper ac in est.\n          </p>\n\n          <p>\n            Vivamus fermentum semper porta. Nunc diam velit, adipscing ut\n            tristique vitae sagittis vel odio. Maecenas convallis ullamcorper\n            ultricied. Curabitur ornare, ligula semper consectetur sagittis,\n            nisi diam iaculis velit, is fringille sem nunc vet mi.\n          </p>\n        </section>\n      </article>\n\n      <!-- the aside content can also be nested within the main content -->\n      <aside>\n        <h2>Related</h2>\n\n        <ul>\n          <li><a href=\"#\">Oh I do like to be beside the seaside</a></li>\n          <li><a href=\"#\">Oh I do like to be beside the sea</a></li>\n          <li><a href=\"#\">Although in the North of England</a></li>\n          <li><a href=\"#\">It never stops raining</a></li>\n          <li><a href=\"#\">Oh well…</a></li>\n        </ul>\n      </aside>\n    </main>\n\n    <!-- And here is our main footer that is used across all the pages of our website -->\n\n    <footer>\n      <p>©Copyright 2050 by nobody. All rights reversed.</p>\n    </footer>\n  </body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/document_and_website_structure/style.css",
    "content": "/* || General setup */\n\nhtml, body {\n  margin: 0;\n  padding: 0;\n}\n\nhtml {\n  font-size: 10px;\n  background-color: #a9a9a9;\n}\n\nbody {\n  width: 70%;\n  margin: 0 auto;\n}\n\n/* || typography */\n\nh1, h2, h3 {\n  font-family: 'Sonsie One', cursive;\n  color: #2a2a2a;\n}\n\np, input, li {\n  font-family: 'Open Sans Condensed', sans-serif;\n  color: #2a2a2a;\n}\n\nh1 {\n  font-size: 4rem;\n  text-align: center;\n  color: white;\n  text-shadow: 2px 2px 10px black;\n}\n\nh2 {\n  font-size: 3rem;\n  text-align: center;\n}\n\nh3 {\n  font-size: 2.2rem;\n}\n\np, li {\n  font-size: 1.6rem;\n  line-height: 1.5;\n}\n\n/* || header layout */\n\nnav, article, aside, footer {\n  background-color: white;\n  padding: 1%;\n}\n\nnav {\n  height: 50px;\n  background-color: #ff80ff;\n  display: flex;\n  margin-bottom: 10px;\n}\n\nnav ul {\n  padding: 0;\n  list-style-type: none;\n  flex: 2;\n  display: flex;\n}\n\nnav li {\n  display: inline;\n  text-align: center;\n  flex: 1;\n}\n\nnav a {\n  display: inline-block;\n  font-size: 2rem;\n  text-transform: uppercase;\n  text-decoration: none;\n  color: black;\n}\n\nnav form {\n  flex: 1;\n  display: flex;\n  align-items: center;\n  height: 100%;\n  padding: 0 2em;\n}\n\ninput {\n  font-size: 1.6rem;\n  height: 32px;\n}\n\ninput[type=\"search\"] {\n  flex: 3;\n}\n\ninput[type=\"submit\"] {\n  flex: 1;\n  margin-left: 1rem;\n  background: #333;\n  border: 0;\n  color: white;\n}\n\n/* || main layout */\n\nmain {\n  display: flex;\n}\n\narticle {\n  flex: 4;\n}\n\naside {\n  flex: 1;\n  margin-left: 10px;\n  background-color: #ff80ff;\n}\n\naside li {\n  padding-bottom: 10px;\n}\n\nfooter {\n  margin-top: 10px;\n}\n"
  },
  {
    "path": "html/introduction-to-html/getting-started/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>My test page</title>\n  </head>\n  <body>\n    <p>This is my page</p>\n  </body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/html-text-formatting/text-complete.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Quick hummus recipe</title>\n  </head>\n  <body>\n    <h1>Quick hummus recipe</h1>\n\n    <p>This recipe makes quick, tasty hummus, with no messing. It has been adapted from a number of different recipes that I have read over the years.</p>\n\n   <p>hummus is a delicious thick paste used heavily in Greek and Middle Eastern dishes. It is very tasty with salad, grilled meats and pitta breads.</p>\n\n    <h2>Ingredients</h2>\n\n    <ul>\n      <li>1 can (400g) of chick peas (garbanzo beans)</li>\n      <li>175g of tahini</li>\n      <li>6 sundried tomatoes</li>\n      <li>Half a red pepper</li>\n      <li>A pinch of cayenne pepper</li>\n      <li>1 clove of garlic</li>\n      <li>A dash of olive oil</li>\n    </ul>\n\n    <h2>Instructions</h2>\n\n    <ol>\n      <li>Remove the skin from the garlic, and chop coarsely.</li>\n      <li>Remove all the seeds and stalk from the pepper, and chop coarsely.</li>\n      <li>Add all the ingredients into a food processor.</li>\n      <li>Process all the ingredients into a paste.</li>\n      <li>If you want a coarse \"chunky\" hummus, process it for a short time.</li>\n      <li>If you want a smooth hummus, process it for a longer time.</li>\n    </ol>\n\n    <p>For a different flavour, you could try blending in a small measure of lemon and coriander, chili pepper, lime and chipotle, harissa and mint, or spinach and feta cheese. Experiment and see what works for you.</p>\n\n    <h2>Storage</h2>\n\n    <p>Refrigerate the finished hummus in a sealed container. You should be able to use it for about a week after you've made it. If it starts to become fizzy, you should definitely discard it.</p>\n\n    <p>hummus is suitable for freezing; you should thaw it and use it within a couple of months.</p>\n\n  </body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/html-text-formatting/text-start.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Quick hummus recipe</title>\n  </head>\n  <body>\n    Quick hummus recipe\n\n    This recipe makes quick, tasty hummus, with no messing. It has been adapted from a number of different recipes that I have read over the years.\n\n    Hummus is a delicious thick paste used heavily in Greek and Middle Eastern dishes. It is very tasty with salad, grilled meats and pitta breads.\n\n    Ingredients\n\n    1 can (400g) of chick peas (garbanzo beans)\n    175g of tahini\n    6 sundried tomatoes\n    Half a red pepper\n    A pinch of cayenne pepper\n    1 clove of garlic\n    A dash of olive oil\n\n    Instructions\n\n    Remove the skin from the garlic, and chop coarsely\n    Remove all the seeds and stalk from the pepper, and chop coarsely\n    Add all the ingredients into a food processor\n    Process all the ingredients into a paste.\n    If you want a coarse \"chunky\" hummus, process it for a short time\n    If you want a smooth hummus, process it for a longer time\n\n    For a different flavour, you could try blending in a small measure of lemon and coriander, chili pepper, lime and chipotle, harissa and mint, or spinach and feta cheese. Experiment and see what works for you.\n\n    Storage\n\n    Refrigerate the finished hummus in a sealed container. You should be able to use it for about a week after you've made it. If it starts to become fizzy, you should definitely discard it.\n\n    Hummus is suitable for freezing; you should thaw it and use it within a couple of months.\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/marking-up-a-letter-finished/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"author\" content=\"Dr. Eleanor Gaye\">\n    <title>Awesome science application correspondence</title>\n    <style>\n      body {\n        max-width: 800px;\n        margin: 0 auto;\n      }\n\n      .sender-column {\n        text-align: right;\n      }\n\n      h1 {\n        font-size: 1.5em;\n      }\n\n      h2 {\n        font-size: 1.3em;\n      }\n\n      p,ul,ol,dl,address {\n        font-size: 1.1em;\n      }\n\n      p, li, dd, dt, address {\n        line-height: 1.5;\n      }\n    </style>\n  </head>\n  <body>\n    <address class=\"sender-column\">\n      <strong>Dr. Eleanor Gaye</strong><br>\n      Awesome Science faculty<br>\n      University of Awesome<br>\n      Bobtown, CA 99999,<br>\n      USA<br>\n      <strong>Tel</strong>: 123-456-7890<br>\n      <strong>Email</strong>: no_reply@example.com\n    </address>\n\n    <p class=\"sender-column\"><time datetime=\"2016-01-20\">20 January 2016</time></p>\n\n    <address>\n      <strong>Miss Eileen Dover</strong><br>\n      4321 Cliff Top Edge<br>\n      Dover, CT9 XXX<br>\n      UK\n    </address>\n\n    <h1>Re: Eileen Dover university application</h1>\n\n    <p>Dear Eileen,</p>\n\n    <p>Thank you for your recent application to join us at the University of Awesome's science faculty to study as part of your <abbr>PhD</abbr> (Doctor of Philosophy) next year. I will answer your questions one by one, in the following sections.</p>\n\n    <h2>Starting dates</h2>\n\n    <p>We are happy to accommodate you starting your study with us at any time, however it would suit us better if you could start at the beginning of a semester; the start dates for each one are as follows:</p>\n\n    <ul>\n      <li>First semester: <time datetime=\"2016-09-09\">9 September 2016</time></li>\n      <li>Second semester: <time datetime=\"2017-01-15\">15 January 2017</time></li>\n      <li>Third semester: <time datetime=\"2017-05-02\">2 May 2017</time></li>\n    </ul>\n\n    <p>Please let me know if this is ok, and if so which start date you would prefer.</p>\n\n    <p>You can find more information about <a href=\"http://www.example.com\" title=\"table of awesome university important dates\">important university dates</a> on our website.</p>\n\n    <h2>Subjects of study</h2>\n\n    <p>At the Awesome Science Faculty, we have a pretty open-minded research facility — as long as the subjects fall somewhere in the realm of science and technology. You seem like an intelligent, dedicated researcher, and just the kind of person we'd like to have on our team. Saying that, of the ideas you submitted we were most intrigued by are as follows, in order of priority:</p>\n\n    <ol>\n      <li>Turning H<sub>2</sub>O into wine, and the health benefits of Resveratrol (C<sub>14</sub>H<sub>12</sub>O<sub>3</sub>.)</li>\n      <li>Measuring the effect on performance of funk bassplayers at temperatures exceeding 30°C (86°F), when the audience size exponentially increases (effect of 3 × 10<sup>3</sup> increasing to 3 × 10<sup>4</sup>.)</li>\n      <li><abbr>HTML</abbr>, Hypertext Markup Language, and <abbr>CSS</abbr>, Cascading Style Sheets, constructs for representing musical scores.</li>\n    </ol>\n\n    <p>So please can you provide more information on each of these subjects, including how long you'd expect the research to take, required staff and other resources, and anything else you think we'd need to know? Thanks.</p>\n\n    <h2>Exotic dance moves</h2>\n\n    <p>Yes, you are right! As part of my post-doctorate work, I <em>did</em> study exotic tribal dances. To answer your question, my favourite dances are as follows, with definitions:</p>\n\n    <dl>\n      <dt>Polynesian chicken dance</dt>\n      <dd>A little known but <em>very</em> influential dance dating back as far as 300 <abbr title=\"Before Common Era\">BCE</abbr>, a whole village would dance around in a circle like chickens, to encourage their livestock to be \"fruitful\".</dd>\n      <dt>Icelandic brownian shuffle</dt>\n      <dd>Before the Icelanders developed fire as a means of getting warm, they used to practice this dance, which involved huddling close together in a circle on the floor, and shuffling their bodies around in imperceptibly tiny, very rapid movements. One of my fellow students used to say that he thought this dance inspired modern styles such as Twerking.</dd>\n      <dt>Arctic robot dance</dt>\n      <dd>An interesting example of historic misinformation, English explorers in the 1960s believed to have discovered a new dance style characterised by \"robotic\", stilted movements, being practiced by inhabitants of Northern Alaska and Canada. Later on however it was discovered that they were just moving like this because they were really cold.</dd>\n    </dl>\n\n    <p>For more of my research, see my <a href=\"http://www.example.com\" aria-label=\"Dr Gaye's exotic dance research\">exotic dance research page</a>.</p>\n\n    <p>Yours sincerely,</p>\n\n    <p>Dr Eleanor Gaye</p>\n\n\n    <p>University of Awesome motto: <q>Be awesome to each other.</q> -- <cite>The memoirs of Bill S Preston, <abbr title=\"Esquire\">Esq.</abbr></cite></p>\n  </body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/marking-up-a-letter-finished/marking-guide.md",
    "content": "# Marking guide for \"Marking up a letter\"\n\nThe following guide outlines a marking guide for the MDN Learning Area HTML Topic — [Marking up a letter](https://developer.mozilla.org/en-US/Learn/HTML/Introduction_to_HTML/Marking_up_a_letter). Each subtask detailed in the assessment is listed below, along with an explanation of how many marks the task is worth, and the mark breakdown.\n\nNote: These are guidelines, not set in stone rules — you are of course free to use your judgement on mark awarding when you meet an edge case, or somethign that isn't clearly cut.\n\nThe overall mark awarded is out of 45.5. Work out their final mark, and then divide by 45.5 and multiply by 100 to give a percentage mark. For reference, you can find a [finished marked up letter](index.html) that would be awarded top marks.\n\n## Block/structural semantics\n\n<dl>\n<dt>You should structure the overall document with an appropriate structure including doctype, and <code>&lt;html&gt;</code>, <code>&lt;head&gt;</code> and <code>&lt;body&gt;</code> elements (5 marks)</dt>\n<dd>They need to:\n<ul>\n  <li>Provide an HTML5 doctype (<code>&lt;!doctype html&gt;</code>, 1 mark)</li>\n  <li>Include a <code>&lt;head&gt;</code> element just below that (1 mark)</li>\n  <li>Wrap the content in a <code>&lt;body&gt;</code> element (1 mark)</li>\n  <li>Wrap head and body in an <code>&lt;html&gt;</code> element (1 mark)</li>\n  <li>You get one bonus mark for including a lang attribute in the <code>&lt;html&gt;</code> tag (1 mark)</li>\n</ul>\n</dd>\n<dt>The letter in general should be marked up with a structure of paragraphs and headings, with the exception of the below points. There is one top level heading (the \"Re:\" line) and two second level headings (6 marks)</dt>\n<dd>They need to:\n  <ul>\n  <li>Mark up the \"Re:\" line as an <code>&lt;h1&gt;</code> element (1 mark)</li>\n  <li>Mark up the \"Starting dates\", \"Subjects of study\" and \"Exotic dance moves\" as <code>&lt;h2&gt;</code> elements (3 marks)</li>\n  <li>Mark up all appropriate structural elements that shouldn't be headings or lists as paragraphs (2 marks)</li>\n</ul>\n</dd>\n<dt>The semester start dates, study subjects and exotic dances should be marked up using an appropriate list type (6 marks)</dt>\n<dd>This is fairly simple. Looking at the different lists and their context/usage, the reader should know to:\n<ul>\n  <li>Mark up the semester start dates as an unordered list (<code>&lt;ul&gt;</code>/<code>&lt;li&gt;</code>), or arguably an ordered list (<code>&lt;ol&gt;</code>/<code>&lt;li&gt;</code>) — either is ok (2 marks)</li>\n  <li>Mark up the study subjects as an ordered list (<code>&lt;ol&gt;</code>/<code>&lt;li&gt;</code>) (2 marks)</li>\n  <li>Mark up the exotic dances as a description list (<code>&lt;dl&gt;</code>/<code>&lt;dd&gt;</code>/<code>&lt;dt&gt;</code>) (2 marks)</li>\n</ul>\n</dd>\n<dt>The two addresses should be put inside <code><code>&lt;address&gt;</code></code> elements. Each line of the address should sit on a new line, but not be in a new paragraph. (3 marks)</dt>\n<dd>Wrap both of the addresses in an <code>&lt;address&gt;</code> element, and put a <code>&lt;br&gt;</code> element at the end of each line of the address, except for the last line in each case.</dd>\n</dl>\n\n## Inline semantics\n\n<dl>\n<dt>The names of the sender and receiver (and \"Tel\" and \"Email\") should be marked up with strong importance (2 marks, half a mark each)</dt>\n<dd>\"Dr. Eleanor Gaye\", \"Miss Eileen Dover\", \"Tel\", and \"Email\" should be wrapped in a <code>&lt;strong&gt;</code> element.</dd>\n<dt>The four dates in the document should be given appropriate elements containing machine-readable dates (2 marks, half a mark each)</dt>\n<dd>All four dates should be marked up using a <code>&lt;time&gt;</code> element. Each one should have a datetime attribute containing a machine readable date. For example <code>&lt;time datetime=\"2016-01-20\"&gt;20 January 2016&lt;/time&gt;</code></dd>\n<dt>The first address and first date in the letter should be given a class attribute value of \"sender-column\"; the CSS you'll add later will then cause these to be right aligned, as should be the case in a classic letter layout. (2 marks)</dt>\n<dd>The first <code>&lt;p&gt;</code> element in the document should be given an attribute of class=\"sender-column\"; the first date should be wrapped in a <code>&lt;p&gt;</code>, which should also be given the class=\"sender-column\" attribute.</dd>\n<dt>The five acronyms/abbreviations in the main text of the letter should be marked up to provide expansions of each acronym/abbreviation. (2.5 marks, half a mark each)</dt>\n<dd>Each acronym/abbreviation in the main text of the letter — \"PhD\", \"HTML\", \"CSS\", \"BC\" and \"Esq\" — should be wrapped in an <code>&lt;abbr&gt;</code> element with a title attribute, for example <code>&lt;abbr title=\"Cascading Style Sheets\"&gt;CSS&lt;/abbr&gt;</code></dd>\n<dt>The six sub/superscripts should be marked up appropriately (3 marks, half a mark each).</dt>\n<dd>The four numbers in the chemical formulae should be wrapped in a <code>&lt;sub&gt;</code> element, e.g. <code>H&lt;sub&gt;2&lt;/sub&gt;O</code>. The rightmost number in both exponential expressions should be wrapped in a <code>&lt;sup&gt;</code> element, e.g. <code>10&lt;sup&gt;3&lt;/sup&gt;</code>.</dd>\n<dt>Try to mark up at least two appropriate words in the text with strong importance/emphasis (1 mark, half a mark each)</dt>\n<dd>This is very open to interpretation; anything that seems appropriate should be fine.</dd>\n<dt>There are two places where a hyperlink should be added; add appropriate links with titles. For the location that the links point to, just use http://example.com (4 marks)</dt>\n<dd>\n  The two places should have an <code>&lt;a&gt;</code> element wrapped around reasonable words to make the link. Each element should have an href attribute pointing to a dummy URL, such as \"http://www.example.com\" or \"*\", and a title attribute that describes what the link should point to. Half a mark should be taken off if the link text is inappropriate, and/or attributes are missing.\n  <ul>\n    <li>First instance: something like <code>&lt;a href=\"http://www.example.com\" title=\"table of awesome university important dates\"&gt;important university dates&lt;/a&gt;</code></li>\n    <li>Second instance: something like <code>&lt;a href=\"http://www.example.com\" title=\"Dr Gaye's exotic dance research\"&gt;exotic dance research page&lt;/a&gt;</code></li>\n  </ul>\n</dd>\n<dt>The university motto quote and citation should be marked up with appropriate elements (2 marks)</dt>\n<dd>\"Be excellent to each other\" should be wrapped in a <code>&lt;q&gt;</code> element, and \"The memoirs of Bill S Preston, Esq\" should be wrapped in a <code>&lt;cite&gt;</code> element</dd>\n</dl>\n\n## The head of the document\n\n<dl>\n  <dt>The character set of the document should be specified as utf-8 using an appropriate meta tag (1 mark)</dt>\n  <dd>The answer should be <code>&lt;meta charset=\"utf-8\"&gt;</code> or equivalent, included inside the <code>&lt;head&gt;</code> element.</dd>\n  <dt>The author of the letter should be specified in an appropriate meta tag (1 mark)</dt>\n  <dd>The answer should be something like <code>&lt;meta name=\"author\" content=\"Dr. Eleanor Gaye\"&gt;</code>, included inside the <code>&lt;head&gt;</code> element.</dd>\n  <dt>The provided CSS should be included inside an appropriate tag (2 marks)</dt>\n  <dd>The CSS from the provided CSS file should be pasted inside a <code>&lt;style&gt;</code> element, included inside the <code>&lt;head&gt;</code> element. OR, it would also be acceptable (in fact better) if the student put the CSS inside an external CSS file and linked it via a <code>&lt;link&gt;</code> element.</dd>\n</dl>\n\n## Other tasks\n\n<dl>\n<dt>You'll get bonus points if it validates as much as possible (2 marks.)</dt>\n<dd>If the student's code validates, apart from the Google Font link element, they get the marks.</dd>\n"
  },
  {
    "path": "html/introduction-to-html/marking-up-a-letter-start/css.txt",
    "content": "body {\n  max-width: 800px;\n  margin: 0 auto;\n}\n\n.sender-column {\n  text-align: right;\n}\n\nh1 {\n  font-size: 1.5em;\n}\n\nh2 {\n  font-size: 1.3em;\n}\n\np,ul,ol,dl,address {\n  font-size: 1.1em;\n}\n\np, li, dd, dt, address {\n  line-height: 1.5;\n}\n"
  },
  {
    "path": "html/introduction-to-html/marking-up-a-letter-start/letter-text.txt",
    "content": "Dr. Eleanor Gaye\nAwesome Science faculty\nUniversity of Awesome\nBobtown, CA 99999,\nUSA\nTel: 123-456-7890\nEmail: no_reply@example.com\n\n20 January 2016\n\nMiss Eileen Dover\n4321 Cliff Top Edge\nDover, CT9 XXX\nUK\n\n\nRe: Eileen Dover university application\n\nDear Eileen,\n\nThank you for your recent application to join us at the University of Awesome's science faculty to study as part of your PhD next year. I will answer your questions one by one, in the following sections.\n\nStarting dates\n\nWe are happy to accommodate you starting your study with us at any time, however it would suit us better if you could start at the beginning of a semester; the start dates for each one are as follows:\n\nFirst semester: 9 September 2016\nSecond semester: 15 January 2017\nThird semester: 2 May 2017\n\nPlease let me know if this is ok, and if so which start date you would prefer.\n\nYou can find more information about important university dates on our website.\n\n\nSubjects of study\n\nAt the Awesome Science Faculty, we have a pretty open-minded research facility — as long as the subjects fall somewhere in the realm of science and technology. You seem like an intelligent, dedicated researcher, and just the kind of person we'd like to have on our team. Saying that, of the ideas you submitted we were most intrigued by are as follows, in order of priority:\n\nTurning H2O into wine, and the health benefits of Resveratrol (C14H12O3.)\nMeasuring the effect on performance of funk bassplayers at temperatures exceeding 30°C (86°F), when the audience size exponentially increases (effect of 3 × 103 increasing to 3 × 104.)\nHTML and CSS constructs for representing musical scores.\n\nSo please can you provide more information on each of these subjects, including how long you'd expect the research to take, required staff and other resources, and anything else you think we'd need to know? Thanks.\n\n\nExotic dance moves\n\nYes, you are right! As part of my post-doctorate work, I did study exotic tribal dances. To answer your question, my favourite dances are as follows, with definitions:\n\nPolynesian chicken dance\nA little known but very influential dance dating back as far as 300BC, a whole village would dance around in a circle like chickens, to encourage their livestock to be \"fruitful\".\nIcelandic brownian shuffle\nBefore the Icelanders developed fire as a means of getting warm, they used to practice this dance, which involved huddling close together in a circle on the floor, and shuffling their bodies around in imperceptibly tiny, very rapid movements. One of my fellow students used to say that he thought this dance inspired modern styles such as Twerking.\nArctic robot dance\nAn interesting example of historic misinformation, English explorers in the 1960s believed to have discovered a new dance style characterized by \"robotic\", stilted movements, being practiced by inhabitants of Northern Alaska and Canada. Later on however it was discovered that they were just moving like this because they were really cold.\n\nFor more of my research, see my exotic dance research page.\n\nYours sincerely,\nDr Eleanor Gaye\n\nUniversity of Awesome motto: \"Be awesome to each other.\" -- The memoirs of Bill S Preston, Esq\n"
  },
  {
    "path": "html/introduction-to-html/navigation-menu-marked-up/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Homepage</title>\n  </head>\n\n  <body>\n    <!-- put navigation menu just below here -->\n\n    <ul>\n      <li>Home</li>\n      <li><a href=\"pictures.html\">Pictures</a></li>\n      <li><a href=\"projects.html\">Projects</a></li>\n      <li><a href=\"social.html\">Social</a></li>\n    </ul>\n\n    <h1>Homepage</h1>\n\n    <p>Welcome to my exciting homepage</p>\n  </body>\n</html>"
  },
  {
    "path": "html/introduction-to-html/navigation-menu-marked-up/pictures.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Pictures</title>\n  </head>\n\n  <body>\n    <!-- put navigation menu just below here -->\n\n    <ul>\n      <li><a href=\"index.html\">Home</a></li>\n      <li>Pictures</li>\n      <li><a href=\"projects.html\">Projects</a></li>\n      <li><a href=\"social.html\">Social</a></li>\n    </ul>\n\n    <h1>Pictures</h1>\n\n    <p>My pictures will go here, when I start taking some.</p>\n  </body>\n</html>"
  },
  {
    "path": "html/introduction-to-html/navigation-menu-marked-up/projects.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Projects</title>\n  </head>\n\n  <body>\n    <!-- put navigation menu just below here -->\n\n    <ul>\n      <li><a href=\"index.html\">Home</a></li>\n      <li><a href=\"pictures.html\">Pictures</a></li>\n      <li>Projects</li>\n      <li><a href=\"social.html\">Social</a></li>\n    </ul>\n\n    <h1>My projects</h1>\n\n    <p>Welcome to my project page, showing what exciting things I am currently doing.</p>\n  </body>\n</html>"
  },
  {
    "path": "html/introduction-to-html/navigation-menu-marked-up/social.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Social</title>\n  </head>\n\n  <body>\n    <!-- put navigation menu just below here -->\n\n    <ul>\n      <li><a href=\"index.html\">Home</a></li>\n      <li><a href=\"pictures.html\">Pictures</a></li>\n      <li><a href=\"projects.html\">Projects</a></li>\n      <li>Social</li>\n    </ul>\n\n    <h1>Social media</h1>\n\n    <p>Welcome to my social media page. I am currently antisocial, but will start putting my social media widgets on here when the time is right.</p>\n  </body>\n</html>"
  },
  {
    "path": "html/introduction-to-html/navigation-menu-start/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Homepage</title>\n  </head>\n\n  <body>\n    <!-- put navigation menu just below here -->\n\n    <h1>Homepage</h1>\n\n    <p>Welcome to my exciting homepage</p>\n  </body>\n</html>"
  },
  {
    "path": "html/introduction-to-html/navigation-menu-start/pictures.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Pictures</title>\n  </head>\n\n  <body>\n    <!-- put navigation menu just below here -->\n\n    <h1>Pictures</h1>\n\n    <p>My pictures will go here, when I start taking some.</p>\n  </body>\n</html>"
  },
  {
    "path": "html/introduction-to-html/navigation-menu-start/projects.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Projects</title>\n  </head>\n\n  <body>\n    <!-- put navigation menu just below here -->\n\n    <h1>My projects</h1>\n\n    <p>Welcome to my project page, showing what exciting things I am currently doing.</p>\n  </body>\n</html>"
  },
  {
    "path": "html/introduction-to-html/navigation-menu-start/social.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Social</title>\n  </head>\n\n  <body>\n    <!-- put navigation menu just below here -->\n\n    <h1>Social media</h1>\n\n    <p>Welcome to my social media page. I am currently antisocial, but will start putting my social media widgets on here when the time is right.</p>\n  </body>\n</html>"
  },
  {
    "path": "html/introduction-to-html/structuring-a-page-of-content-finished/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Birdwatching</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Roboto+Condensed:300|Cinzel+Decorative:700\" rel=\"stylesheet\">\n    <link rel=\"stylesheet\" href=\"style.css\">\n\n\n  </head>\n\n  <body>\n    <header>\n      <h1>Birdwatching</h1>\n      <img src=\"dove.png\" alt=\"a simple dove logo\">\n\n      <nav>\n        <ul>\n          <li><span>Home</span></li>\n          <li><a href=\"#\">Get started</a></li>\n          <li><a href=\"#\">Photos</a></li>\n          <li><a href=\"#\">Gear</a></li>\n          <li><a href=\"#\">Forum</a></li>\n        </ul>\n      </nav>\n    </header>\n\n    <main>\n\n      <article>\n        <h2>Welcome</h2>\n\n        <p>Welcome to our fake birdwatching site. If this were a real site, it would be the ideal place to come to learn more about birdwatching, whether you are a beginner looking to learn how to get into birding, or an expert wanting to share ideas, tips, and photos with other like-minded people.</p>\n\n        <p>So don't waste time! Get what you need, then turn off that computer and get out into the great outdoors!</p>\n      </article>\n\n      <aside>\n        <h2>Favourite photos</h2>\n\n        <a href=\"favorite-1.jpg\"><img src=\"favorite-1_th.jpg\" alt=\"Small black bird, black claws, long black slender beak, links to larger version of the image\"></a>\n        <a href=\"favorite-2.jpg\"><img src=\"favorite-2_th.jpg\" alt=\"Top half of a pretty bird with bright blue plumage on neck, light colored beak, blue headdress, links to larger version of the image\"></a>\n        <a href=\"favorite-3.jpg\"><img src=\"favorite-3_th.jpg\" alt=\"Top half of a large bird with white plumage, very long curved narrow light colored break, links to larger version of the image\"></a>\n        <a href=\"favorite-4.jpg\"><img src=\"favorite-4_th.jpg\" alt=\"Large bird, mostly white plumage with black plumage on back and rear, long straight white beak, links to larger version of the image\"></a>\n      </aside>\n    </main>\n\n    <footer>\n\n      <p>This fake website example is CC0 — any part of this code may be reused in any way you wish. Original example written by Chris Mills, 2016.</p>\n\n      <p><a href=\"http://game-icons.net/lorc/originals/dove.html\">Dove icon</a> by Lorc.</p>\n    </footer>\n\n  </body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/structuring-a-page-of-content-finished/marking-guide.md",
    "content": "# Marking guide for \"Structuring a page of content\"\n\nThe following guide outlines a marking guide for the MDN Learning Area HTML Topic — [Structuring a page of content](https://developer.mozilla.org/en-US/Learn/HTML/Introduction_to_HTML/Structuring_a_page_of_content). Each subtask detailed in the assessment is listed below, along with an explanation of how many marks the task is worth.\n\nNote: These are guidelines, not set in stone rules — you are of course free to use your judgement on mark awarding when you meet an edge case, or something that isn't clearly cut.\n\nThe overall mark awarded is out of 30. Work out their final mark, and then divide by 30 and multiply by 100 to give a percentage mark. For reference, you can find a [finished marked up page](index.html) that would be awarded top marks.\n\n## Block/structural semantics\n\n<dl>\n<dt>The header (4 marks.)</dt>\n<dd>They need to wrap the <code>&lt;h1&gt;</code>, first <code>&lt;img&gt;</code> and whole of the <code>&lt;ul&gt;</code> in a <code>&lt;header&gt;</code> element.</dd>\n<dt>The navigation menu (4 marks.)</dt>\n<dd>They need to wrap the <code>&lt;ul&gt;</code> in a <code>&lt;nav&gt;</code> element.</dd>\n<dt>The main content (4 marks.)</dt>\n<dd>They need to wrap both <code>&lt;h2&gt;</code>s, the first two <code>&lt;p&gt;</code>s and the last four <code>&lt;img&gt;</code>s in a <code>&lt;main&gt;</code> element.</dd>\n<dt>The welcome text (4 marks.)</dt>\n<dd>They need to wrap the first <code>&lt;h2&gt;</code> and the first two <code>&lt;p&gt;</code>s in an <code>&lt;article&gt;</code> element or a <code>&lt;section&gt;</code> element.</dd>\n<dt>The image sidebar (4 marks.)</dt>\n<dd>They need to wrap the second <code>&lt;h2&gt;</code> and the last four <code>&lt;img&gt;</code>s in an <code>&lt;aside&gt;</code> element.</dd>\n<dt>The footer (4 marks.)</dt>\n<dd>They need to wrap the last two <code>&lt;p&gt;</code>s in a <code>&lt;footer&gt;</code> element.</dd>\n</dl>\n\n## Other tasks\n\n<dl>\n<dt>Apply the provided CSS to the page by adding another <code>&lt;link&gt;</code> element just below the existing one provided at the start (4 marks.)</dt>\n<dd>The element should look like this: <code>&lt;link rel=\"stylesheet\" href=\"style.css\"&gt;</code></dd>\n<dt>You'll get bonus points if it validates as much as possible (2 marks.)</dt>\n<dd>If the student's code validates, apart from the Google Font link element, they get the marks.</dd>\n"
  },
  {
    "path": "html/introduction-to-html/structuring-a-page-of-content-finished/style.css",
    "content": "/* || General setup */\n\nhtml, body {\n  margin: 0;\n  padding: 0;\n}\n\nhtml {\n  font-size: 10px;\n  background-color: #a9a9a9;\n}\n\nbody {\n  width: 70%;\n  min-width: 800px;\n  margin: 0 auto;\n}\n\n/* || typography */\n\nh1, h2, h3 {\n  font-family: 'Cinzel Decorative', cursive;\n  color: #2a2a2a;\n}\n\np, input, li {\n  font-family: 'Roboto Condensed', sans-serif;\n  color: #2a2a2a;\n}\n\nh1 {\n  font-size: 4rem;\n  text-align: center;\n  text-shadow: 2px 2px 10px black;\n}\n\nh2 {\n  font-size: 3rem;\n  text-align: center;\n}\n\nh3 {\n  font-size: 2.2rem;\n}\n\np, li {\n  font-size: 1.6rem;\n  line-height: 1.5;\n}\n\n/* || header layout */\n\nheader {\n  margin-bottom: 10px;\n  display: flex;\n  flex-flow: row wrap;\n}\n\nbody > * {\n  background-color: red;\n  padding: 1%;\n}\n\nmain, header, nav, article, aside, footer, section {\n  background-color: rgba(0,255,0,0.5);\n  padding: 1%;\n}\n\nh1 {\n  flex: 5;\n  text-transform: uppercase;\n}\n\nheader img {\n  display: block;\n  height: 60px;\n  padding-top: 20.15px;\n}\n\nnav {\n  height: 50px;\n  flex: 100%;\n  display: flex;\n}\n\nnav ul {\n  padding: 0;\n  list-style-type: none;\n  flex: 2;\n  display: flex;\n}\n\nnav li {\n  display: inline;\n  text-align: center;\n  flex: 1;\n}\n\nnav a, nav span {\n  display: inline-block;\n  font-size: 2rem;\n  height: 3rem;\n  line-height: 1.7;\n  text-transform: uppercase;\n  text-decoration: none;\n  color: black;\n\n}\n\n/* || main layout */\n\nmain {\n  display: flex;\n}\n\narticle,section {\n  flex: 4;\n}\n\naside {\n  flex: 1;\n  margin-left: 10px;\n  padding: 1%;\n}\n\naside a {\n  display: block;\n  float: left;\n  width: 50%;\n}\n\naside img {\n  max-width: 100%;\n}\n\nfooter {\n  margin-top: 10px;\n}\n"
  },
  {
    "path": "html/introduction-to-html/structuring-a-page-of-content-start/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Birdwatching</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Roboto+Condensed:300%7CCinzel+Decorative:700\" rel=\"stylesheet\">\n\n\n  </head>\n\n  <body>\n\n      <h1>Birdwatching</h1>\n      <img src=\"dove.png\" alt=\"a simple dove logo\">\n\n\n      <ul>\n        <li><span>Home</span></li>\n        <li><a href=\"#\">Get started</a></li>\n        <li><a href=\"#\">Photos</a></li>\n        <li><a href=\"#\">Gear</a></li>\n        <li><a href=\"#\">Forum</a></li>\n      </ul>\n\n\n      <h2>Welcome</h2>\n\n      <p>Welcome to our fake birdwatching site. If this were a real site, it would be the ideal place to come to learn more about birdwatching, whether you are a beginner looking to learn how to get into birding, or an expert wanting to share ideas, tips, and photos with other like-minded people.</p>\n\n      <p>So don't waste time! Get what you need, then turn off that computer and get out into the great outdoors!</p>\n\n      <h2>Favourite photos</h2>\n\n      <a href=\"favorite-1.jpg\"><img src=\"favorite-1_th.jpg\" alt=\"Small black bird, black claws, long black slender beak, links to larger version of the image\"></a>\n      <a href=\"favorite-2.jpg\"><img src=\"favorite-2_th.jpg\" alt=\"Top half of a pretty bird with bright blue plumage on neck, light colored beak, blue headdress, links to larger version of the image\"></a>\n      <a href=\"favorite-3.jpg\"><img src=\"favorite-3_th.jpg\" alt=\"Top half of a large bird with white plumage, very long curved narrow light colored break, links to larger version of the image\"></a>\n      <a href=\"favorite-4.jpg\"><img src=\"favorite-4_th.jpg\" alt=\"Large bird, mostly white plumage with black plumage on back and rear, long straight white beak, links to larger version of the image\"></a>\n\n\n      <p>This fake website example is CC0 — any part of this code may be reused in any way you wish. Original example written by Chris Mills, 2016.</p>\n\n      <p><a href=\"http://game-icons.net/lorc/originals/dove.html\">Dove icon</a> by Lorc.</p>\n\n  </body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/structuring-a-page-of-content-start/style.css",
    "content": "/* || General setup */\n\nhtml, body {\n  margin: 0;\n  padding: 0;\n}\n\nhtml {\n  font-size: 10px;\n  background-color: #a9a9a9;\n}\n\nbody {\n  width: 70%;\n  min-width: 800px;\n  margin: 0 auto;\n}\n\n/* || typography */\n\nh1, h2, h3 {\n  font-family: 'Cinzel Decorative', cursive;\n  color: #2a2a2a;\n}\n\np, input, li {\n  font-family: 'Roboto Condensed', sans-serif;\n  color: #2a2a2a;\n}\n\nh1 {\n  font-size: 4rem;\n  text-align: center;\n  text-shadow: 2px 2px 10px black;\n}\n\nh2 {\n  font-size: 3rem;\n  text-align: center;\n}\n\nh3 {\n  font-size: 2.2rem;\n}\n\np, li {\n  font-size: 1.6rem;\n  line-height: 1.5;\n}\n\n/* || header layout */\n\nheader {\n  margin-bottom: 10px;\n  display: flex;\n  flex-flow: row wrap;\n}\n\nbody > * {\n  background-color: red;\n  padding: 1%;\n}\n\nmain, header, nav, article, aside, footer, section {\n  background-color: rgba(0,255,0,0.5);\n  padding: 1%;\n}\n\nh1 {\n  flex: 5;\n  text-transform: uppercase;\n}\n\nheader img {\n  display: block;\n  height: 60px;\n  padding-top: 20.15px;\n}\n\nnav {\n  height: 50px;\n  flex: 100%;\n  display: flex;\n}\n\nnav ul {\n  padding: 0;\n  list-style-type: none;\n  flex: 2;\n  display: flex;\n}\n\nnav li {\n  display: inline;\n  text-align: center;\n  flex: 1;\n}\n\nnav a, nav span {\n  display: inline-block;\n  font-size: 2rem;\n  height: 3rem;\n  line-height: 1.7;\n  text-transform: uppercase;\n  text-decoration: none;\n  color: black;\n\n}\n\n/* || main layout */\n\nmain {\n  display: flex;\n}\n\narticle, section {\n  flex: 4;\n}\n\naside {\n  flex: 1;\n  margin-left: 10px;\n  padding: 1%;\n}\n\naside a {\n  display: block;\n  float: left;\n  width: 50%;\n}\n\naside img {\n  max-width: 100%;\n}\n\nfooter {\n  margin-top: 10px;\n}\n"
  },
  {
    "path": "html/introduction-to-html/tasks/advanced-text/advanced-text1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Advanced HTML text: Task 1</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      h1 {\n        font-size: 2rem;\n        margin: 0;\n        color: purple;\n      }\n\n      dl {\n        color: gray;\n        margin: 0.5em 0;\n      }\n\n      dt {\n        font-weight: bold;\n        color: purple;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n\n    <h1>Advanced HTML Animals</h1>\n\n    Llama\n    Tall, woolly quadruped, pointy ears. Sometimes rideable, but grumpy and spits a lot. Big fan of list items.\n    Anaconda\n    A very large constrictor snake; travels rapidly by way of anchors to sneak up on his prey.\n    Hippopotamus\n    His description is bottomless.\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/advanced-text/advanced-text1-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Advanced HTML text: Task 1</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      h1 {\n        font-size: 2rem;\n        margin: 0;\n        color: purple;\n      }\n\n      dl {\n        color: gray;\n        margin: 0.5em 0;\n      }\n\n      dt {\n        font-weight: bold;\n        color: purple;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n    <h1>Advanced HTML Animals</h1>\n\n    <dl>\n      <dt>Llama</dt>\n      <dd>\n        Tall, woolly quadruped, pointy ears. Sometimes rideable, but grumpy and\n        spits a lot. Big fan of list items.\n      </dd>\n      <dt>Anaconda</dt>\n      <dd>\n        A very large constrictor snake; travels rapidly by way of anchors to\n        sneak up on his prey.\n      </dd>\n      <dt>Hippopotamus</dt>\n      <dd>His description is bottomless.</dd>\n    </dl>\n  </body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/advanced-text/advanced-text1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Advanced HTML text: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      h1 {\n        font-size: 2rem;\n        margin: 0;\n        color: purple;\n      }\n\n      dl {\n        color: gray;\n        margin: 0.5em 0;\n      }\n\n      dt {\n        font-weight: bold;\n        color: purple;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      <h1>Advanced HTML Animals</h1>\n\n      Llama\n      Tall, woolly quadruped, pointy ears. Sometimes rideable, but grumpy and spits a lot. Big fan of list items.\n      Anaconda\n      A very large constrictor snake; travels rapidly by way of anchors to sneak up on his prey.\n      Hippopotamus\n      His description is bottomless.\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\nh1 {\n  font-size: 2rem;\n  margin: 0;\n  color: purple;\n}\n\ndl {\n  color: gray;\n  margin: 0.5em 0;\n}\n\ndt {\n  font-weight: bold;\n  color: purple;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<h1>Advanced HTML Animals</h1>\n\nLlama\nTall, woolly quadruped, pointy ears. Sometimes rideable, but grumpy and spits a lot. Big fan of list items.\nAnaconda\nA very large constrictor snake; travels rapidly by way of anchors to sneak up on his prey.\nHippopotamus\nHis description is bottomless.\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/advanced-text/advanced-text2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Advanced HTML text: Task 2</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      h1 {\n        font-size: 2rem;\n        margin: 0;\n        color: purple;\n      }\n\n      p {\n        margin: 0.5em 0;\n      }\n\n      abbr, time {\n        color: green;\n      }\n    </style>\n  </head>\n\n  <body>\n\n    <h1>Advanced text semantics</h1>\n\n    <p>Let's start with a quote:</p>\n\n    <p>HTML, Hypertext Markup Language is by default accessible, if used correctly.</p>\n\n    <p>CSS can also be used to make web pages more, or less, accessible.</p>\n\n    <p>Chemical Formulae: H2O (Water), C2H6O (Ethanol).</p>\n\n    <p>Dates: December 25th 2019 (Christmas Day), November 2nd 2019 (Día de los Muertos).</p>\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/advanced-text/advanced-text2-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Advanced HTML text: Task 2</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      h1 {\n        font-size: 2rem;\n        margin: 0;\n        color: purple;\n      }\n\n      p {\n        margin: 0.5em 0;\n      }\n\n      abbr,\n      time {\n        color: green;\n      }\n    </style>\n  </head>\n\n  <body>\n    <h1>Advanced text semantics</h1>\n\n    <p>Let's start with a quote:</p>\n\n    <blockquote\n      cite=\"https://developer.mozilla.org/en-US/docs/Learn/Accessibility\"\n    >\n      <p>\n        <abbr title=\"HyperText Markup Language\">HTML</abbr>, Hypertext Markup Language is by default accessible,\n        if used correctly.\n      </p>\n    </blockquote>\n\n    <p>\n      <abbr title=\"Cascading Style Sheets\">CSS</abbr>, Cascading Style Sheets, can also be used to make web\n      pages more, or less, accessible.\n    </p>\n\n    <p>\n      Chemical Formulae: H<sub>2</sub>O (Water), C<sub>2</sub>H<sub>6</sub>O\n      (Ethanol).\n    </p>\n\n    <p>\n      Dates:\n      <time datetime=\"2019-12-25\">December 25<sup>th</sup> 2019</time>\n      (Christmas Day),\n      <time datetime=\"2019-11-02\">November 2<sup>nd</sup> 2019</time> (Día de\n      los Muertos).\n    </p>\n  </body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/advanced-text/advanced-text2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Advanced HTML text: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      h1 {\n        font-size: 2rem;\n        margin: 0;\n        color: purple;\n      }\n\n      p {\n        margin: 0.5em 0;\n      }\n\n      abbr, time {\n        color: green;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n      <h1>Advanced text semantics</h1>\n\n      <p>Let's start with a quote:</p>\n\n      <p>HTML, Hypertext Markup Language is by default accessible, if used correctly.</p>\n\n      <p>CSS can also be used to make web pages more, or less, accessible.</p>\n\n      <p>Chemical Formulae: H2O (Water), C2H6O (Ethanol).</p>\n\n      <p>Dates: December 25th 2019 (Christmas Day), November 2nd 2019 (Día de los Muertos).</p>\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\nh1 {\n  font-size: 2rem;\n  margin: 0;\n  color: purple;\n}\n\np {\n  margin: 0.5em 0;\n}\n\nabbr, time {\n  color: green;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<h1>Advanced text semantics</h1>\n\n<p>Let's start with a quote:</p>\n\n<p>HTML, Hypertext Markup Language is by default accessible, if used correctly.</p>\n\n<p>CSS can also be used to make web pages more, or less, accessible.</p>\n\n<p>Chemical Formulae: H2O (Water), C2H6O (Ethanol).</p>\n\n<p>Dates: December 25th 2019 (Christmas Day), November 2nd 2019 (Día de los Muertos).</p>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/advanced-text/marking.md",
    "content": "# Advanced HTML text marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the HTML features covered in the [Advanced text formatting](https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Advanced_text_formatting) lesson in Learn Web Development on MDN.\n\n## Task 1\n\nThis task covers understanding of HTML description lists. Ideally the answer should look something like this:\n\n```html\n<h1>Advanced HTML Animals</h1>\n\n<dl>\n  <dt>Llama</dt>\n  <dd>\n    Tall, woolly quadruped, pointy ears. Sometimes rideable, but grumpy and\n    spits a lot. Big fan of list items.\n  </dd>\n  <dt>Anaconda</dt>\n  <dd>\n    A very large constrictor snake; travels rapidly by way of anchors to sneak\n    up on his prey.\n  </dd>\n  <dt>Hippopotamus</dt>\n  <dd>His description is bottomless.</dd>\n</dl>\n```\n\n## Task 2\n\nOur second task is designed to test knowledge of a number of different slightly-more-obscure semantic elements.\n\nThe finished code should look like this:\n\n```html\n<h1>Advanced text semantics</h1>\n\n<p>Let's start with a quote:</p>\n\n<blockquote cite=\"https://developer.mozilla.org/en-US/docs/Learn/Accessibility\">\n  <p>\n    <abbr>HTML</abbr>, Hypertext Markup Language is by default accessible, if\n    used correctly.\n  </p>\n</blockquote>\n\n<p>\n  <abbr>CSS</abbr>, Cascading Style Sheets, can also be used to make web pages\n  more, or less, accessible.\n</p>\n\n<p>\n  Chemical Formulae: H<sub>2</sub>O (Water), C<sub>2</sub>H<sub>6</sub>O\n  (Ethanol).\n</p>\n\n<p>\n  Dates:\n  <time datetime=\"2019-12-25\">December 25<sup>th</sup> 2019</time> (Christmas\n  Day), <time datetime=\"2019-11-02\">November 2<sup>nd</sup> 2019</time> (Día de\n  los Muertos).\n</p>\n```\n"
  },
  {
    "path": "html/introduction-to-html/tasks/basic-text/basic-text1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Basic HTML text: Task 1</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      h1 {\n        font-size: 2rem;\n        margin: 0;\n      }\n\n      h2 {\n        font-size: 1.6rem;\n        margin: 0;\n      }\n\n      h1, h2 {\n        color: purple;\n      }\n\n      p {\n        color: gray;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n\n  Basic HTML Animals\n\n  This is the first paragraph in our page. It introduces our animals.\n\n  The Llama\n\n  Our Llama is a big fan of list items. When she spies a patch of them on a web page, she will eat them like sweets, licking her lips as she goes.\n\n  The Anaconda\n\n  The crafty anaconda likes to slither around the page, travelling rapidly by way of anchors to sneak up on his prey.\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/basic-text/basic-text1-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Basic HTML text finished example: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      h1,\n      h2 {\n        color: purple;\n      }\n\n      p {\n        color: gray;\n      }\n    </style>\n  </head>\n\n  <body>\n    <main>\n      <h1>Basic HTML Animals</h1>\n\n      <p>This is the first paragraph in our page. It introduces our animals.</p>\n\n      <h2>The Llama</h2>\n\n      <p>\n        Our Llama is a big fan of list items. When she spies a patch of them on\n        a web page, she will eat them like sweets, licking her lips as she goes.\n      </p>\n\n      <h2>The Anaconda</h2>\n\n      <p>\n        The crafty anaconda likes to slither around the page, travelling rapidly\n        by way of anchors to sneak up on his prey.\n      </p>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/basic-text/basic-text1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Basic HTML text: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      h1, h2 {\n        color: purple;\n      }\n\n      p {\n        color: gray;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      Basic HTML Animals\n\n      This is the first paragraph in our page. It introduces our animals.\n\n      The Llama\n\n      Our Llama is a big fan of list items. When she spies a patch of them on a web page, she will eat them like sweets, licking her lips as she goes.\n\n      The Anaconda\n\n      The crafty anaconda likes to slither around the page, travelling rapidly by way of anchors to sneak up on his prey.\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\nh1, h2 {\n  color: purple;\n}\n\np {\n  color: gray;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\nBasic HTML Animals\n\nThis is the first paragraph in our page. It introduces our animals.\n\nThe Llama\n\nOur Llama is a big fan of list items. When she spies a patch of them on a web page, she will eat them like sweets, licking her lips as she goes.\n\nThe Anaconda\n\nThe crafty anaconda likes to slither around the page, travelling rapidly by way of anchors to sneak up on his prey.\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/basic-text/basic-text2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Basic HTML text: Task 2</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      h1 {\n        font-size: 2rem;\n        margin: 0;\n      }\n\n      h2 {\n        font-size: 1.6rem;\n        margin: 0;\n      }\n\n      p {\n        margin: 0.5em 0;\n      }\n\n      ol {\n        border: 2px solid purple;\n      }\n\n      ul {\n        border: 2px solid orange;\n      }\n\n      ol, ul {\n        padding: 5px 20px;\n        border-radius: 4px;\n      }\n    </style>\n  </head>\n\n  <body>\n\n    <h1>Looking at lists</h1>\n\n    <p>Turn the following list of my favorite vegetables into an unordered list.</p>\n\n      Cucumber\n      Broccoli\n      Asparagus\n      Pepper\n\n    <p>Turn the following directions into an ordered list.</p>\n\n      First knock on the door\n      When prompted, say the magic word\n      Wait for at least 5 seconds\n      Turn the handle and push\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/basic-text/basic-text2-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Basic HTML text finished example: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      ul {\n        border: 2px solid orange;\n      }\n\n      ol {\n        border: 2px solid purple;\n      }\n\n      ol,\n      ul {\n        padding: 5px 20px;\n        border-radius: 4px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <main>\n      <h1>Looking at lists</h1>\n\n      <p>\n        Turn the following list of my favorite vegetables into an unordered\n        list.\n      </p>\n\n      <ul>\n        <li>Cucumber</li>\n        <li>Broccoli</li>\n        <li>Asparagus</li>\n        <li>Pepper</li>\n      </ul>\n\n      <p>Turn the following directions into an ordered list.</p>\n\n      <ol>\n        <li>First knock on the door</li>\n        <li>When prompted, say the magic word</li>\n        <li>Wait for at least 5 seconds</li>\n        <li>Turn the handle and push</li>\n      </ol>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/basic-text/basic-text2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Basic HTML text: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      ul {\n        border: 2px solid orange;\n      }\n\n      ol {\n        border: 2px solid purple;\n      }\n\n      ol, ul {\n        padding: 5px 20px;\n        border-radius: 4px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n      <h1>Looking at lists</h1>\n\n      <p>Turn the following list of my favorite vegetables into an unordered list.</p>\n\n        Cucumber\n        Broccoli\n        Asparagus\n        Pepper\n\n      <p>Turn the following directions into an ordered list.</p>\n\n        First knock on the door\n        When prompted, say the magic word\n        Wait for at least 5 seconds\n        Turn the handle and push\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\nul {\n  border: 2px solid orange;\n}\n\nol {\n  border: 2px solid purple;\n}\n\nol, ul {\n  padding: 5px 20px;\n  border-radius: 4px;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<h1>Looking at lists</h1>\n\n<p>Turn the following list of my favorite vegetables into an unordered list.</p>\n\n  Cucumber\n  Broccoli\n  Asparagus\n  Pepper\n\n<p>Turn the following directions into an ordered list.</p>\n\n  First knock on the door\n  When prompted, say the magic word\n  Wait for at least 5 seconds\n  Turn the handle and push\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/basic-text/basic-text3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Basic HTML text: Task 3</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      h1 {\n        font-size: 2rem;\n        margin: 0;\n      }\n\n      h1,strong {\n        color: purple;\n      }\n\n      p, em {\n        margin: 0.5em 0;\n      }\n\n      em {\n        color: gray;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n\n  <h1>Emphasis and importance</h1>\n\n  <p>There are two things I care about — music and friends. Someday I might be able to get my friends interested in each other, and my music!</p>\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/basic-text/basic-text3-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Basic HTML text finished example: Task 3</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      h1,\n      strong {\n        color: purple;\n      }\n\n      em {\n        color: gray;\n      }\n    </style>\n  </head>\n\n  <body>\n    <main>\n      <h1>Emphasis and importance</h1>\n\n      <p>\n        There are <strong>two</strong> things I care about —\n        <strong>music</strong> and <strong>friends</strong>. Someday I\n        <em>might</em> be able to get my friends interested in each other,\n        <em>and</em> my music!\n      </p>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/basic-text/basic-text3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Basic HTML text: Task 3</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      h1, strong {\n        color: purple;\n      }\n\n      em {\n        color: gray;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      <h1>Emphasis and importance</h1>\n\n      <p>There are two things I care about — music and friends. Someday I might be able to get my friends interested in each other, and my music!</p>\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\nh1, strong {\n  color: purple;\n}\n\nem {\n  color: gray;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n      <h1>Emphasis and importance</h1>\n\n      <p>There are two things I care about — music and friends. Someday I might be able to get my friends interested in each other, and my music!</p>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/basic-text/marking.md",
    "content": "# Basic HTML text marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the HTML features covered in the [HTML text fundamentals](https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/HTML_text_fundamentals) lesson in Learn Web Development on MDN.\n\n## Task 1\n\nThis task covers understanding of HTML headings and paragraphs. Ideally the answer should look something like this:\n\n```html\n<h1>Basic HTML Animals</h1>\n\n<p>This is the first paragraph in our page. It introduces our animals.</p>\n\n<h2>The Llama</h2>\n\n<p>\n  Our Llama is a big fan of list items. When she spies a patch of them on a web\n  page, she will eat them like sweets, licking her lips as she goes.\n</p>\n\n<h2>The Anaconda</h2>\n\n<p>\n  The crafty anaconda likes to slither around the page, travelling rapidly by\n  way of anchors to sneak up on his prey.\n</p>\n```\n\nIt doesn't make sense for the subheadings to be a higher level than the top-level heading, or for the paragraphs to be marked up with something other than `<p>`.\n\n## Task 2\n\nIn task 2 the student needs to wrap the first list in a `<ul>` element, and the second list in a `<ol>`. The individual list items for both lists need to be wrapped in `<li>` elements.\n\nThe finished code should look like this:\n\n```html\n<h1>Looking at lists</h1>\n\n<p>Turn the following list of my favorite vegetables into an unordered list.</p>\n\n<ul>\n  <li>Cucumber</li>\n  <li>Broccoli</li>\n  <li>Asparagus</li>\n  <li>Pepper</li>\n</ul>\n\n<p>Turn the following directions into an ordered list.</p>\n\n<ol>\n  <li>First knock on the door</li>\n  <li>When prompted, say the magic word</li>\n  <li>Wait for at least 5 seconds</li>\n  <li>Turn the handle and push</li>\n</ol>\n```\n\n## Task 3\n\nThe last task aims to test understanding of using basic inline elements such as `<strong>` and `<em>`. Simply, the student needs to markup a couple of words appropriately using each one.\n\nThe final code should look like this:\n\n```html\n<h1>Emphasis and importance</h1>\n\n<p>\n  There are two things I care about — <strong>music</strong> and\n  <strong>friends</strong>. Someday I <em>might</em> be able to get my friends\n  interested in each other, <em>and</em> my music!\n</p>\n```\n"
  },
  {
    "path": "html/introduction-to-html/tasks/links/links1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Links: Task 1</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      h1 {\n        font-size: 2rem;\n        margin: 0;\n        color: purple;\n      }\n\n      p {\n        color: gray;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n\n    <h1>Information on Whales</h1>\n\n    <p>For more information on our conservation activities and which Whales we study,\n    see our <a target=\"_blank\">Whales page</a>.</p>\n\n    <p>If you want to ask our team more questions, feel free to <a>email us</a>.</p>\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/links/links1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Links: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      p {\n        color: gray;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      <h1>Information on Whales</h1>\n\n      <p>For more information on our conservation activities and which Whales we study,\n      see our <a target=\"_blank\">Whales page</a>.</p>\n\n      <p>If you want to ask our team more questions, feel free to <a target=\"_blank\">email us</a>.</p>\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\np {\n  color: gray;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<h1>Information on Whales</h1>\n\n<p>For more information on our conservation activities and which Whales we study,\nsee our <a target=\"_blank\">Whales page</a>.</p>\n\n<p>If you want to ask our team more questions, feel free to <a target=\"_blank\">email us</a>.</p>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/links/links2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Links: Task 2</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      h1 {\n        font-size: 2rem;\n        margin: 0;\n        color: purple;\n      }\n\n      li {\n        color: gray;\n        margin: 0.5em 0;\n      }\n\n      div {\n        height: 600px;\n      }\n    </style>\n  </head>\n\n  <body>\n\n    <h1>List path tests</h1>\n\n    <ul>\n      <li><a target=\"_blank\">Link me to the blue whale image</a></li>\n      <li><a target=\"_blank\">Link me to the narwhal image</a></li>\n      <li><a target=\"_blank\">Link me to Google image search</a></li>\n      <li><a>Link me to the paragraph at the bottom of the page</a></li>\n    </ul>\n\n    <div></div>\n\n    <p id=\"bottom\">The bottom of the page!</p>\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/links/links2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Links: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      h1 {\n        font-size: 2rem;\n        margin: 0;\n        color: purple;\n      }\n\n      li {\n        color: gray;\n        margin: 0.5em 0;\n      }\n\n      div {\n        height: 600px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\" style=\"height: 300px;overflow:auto\">\n      <h1>List path tests</h1>\n\n      <ul>\n        <li><a target=\"_blank\">Link me to the blue whale image</a></li>\n        <li><a target=\"_blank\">Link me to the narwhal image</a></li>\n        <li><a target=\"_blank\">Link me to Google image search</a></li>\n        <li><a>Link me to the paragraph at the bottom of the page</a></li>\n      </ul>\n\n      <div></div>\n\n      <p id=\"bottom\">The bottom of the page!</p>\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\nh1 {\n  font-size: 2rem;\n  margin: 0;\n  color: purple;\n}\n\nli {\n  color: gray;\n  margin: 0.5em 0;\n}\n\ndiv {\n  height: 600px;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<h1>List path tests</h1>\n\n<ul>\n  <li><a target=\"_blank\">Link me to the blue whale image</a></li>\n  <li><a target=\"_blank\">Link me to the narwhal image</a></li>\n  <li><a target=\"_blank\">Link me to Google image search</a></li>\n  <li><a>Link me to the paragraph at the bottom of the page</a></li>\n</ul>\n\n<div></div>\n\n<p id=\"bottom\">The bottom of the page!</p>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/links/links3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Links: Task 3</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      p {\n        color: gray;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n\n    <p>We do lots of work with Narwhals. To find out more about this work, <a href=\"narwhals.html\" target=\"_blank\">click here</a>.</p>\n\n    <p>You can email our support team if you have any more questions — <a href=\"mailto:whales@example.com\">click here</a> to do so.</p>\n\n    <p>You can also <a href=\"factfile.pdf\" target=\"_blank\">click here</a> to download our factfile, which contains lots more information, including an FAQ.</p>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/links/links3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Links: Task 3</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      p {\n        color: gray;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n      <p>We do lots of work with Narwhals. To find out more about this work, <a href=\"narwhals.html\" target=\"_blank\">click here</a>.</p>\n\n      <p>You can email our support team if you have any more questions — <a href=\"mailto:whales@example.com\">click here</a> to do so.</p>\n\n      <p>You can also <a href=\"factfile.pdf\" target=\"_blank\">click here</a> to download our factfile, which contains lots more information, including an FAQ.</p>\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\np {\n  color: gray;\n  margin: 0.5em 0;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n      <p>We do lots of work with Narwhals. To find out more about this work, <a href=\"narwhals.html\" target=\"_blank\">click here</a>.</p>\n\n      <p>You can email our support team if you have any more questions — <a href=\"mailto:whales@example.com\">click here</a> to do so.</p>\n\n      <p>You can also <a href=\"factfile.pdf\" target=\"_blank\">click here</a> to download our factfile, which contains lots more information, including an FAQ.</p>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/links/marking.md",
    "content": "# Links marking guide\n\nThe aim of the tasks is to demonstrate an understanding of hyperlinks, as covered in the [Creating hyperlinks](https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Creating_hyperlinks) lesson in Learn Web Development on MDN.\n\n## Task 1\n\nThe first task covers some link basics — setting a link destination, giving it a descriptive title, and creating an email link. The solution should look something like this:\n\n```html\n<h1>Information on Whales</h1>\n\n<p>\n  For more information on our conservation activities and which Whales we study,\n  see our\n  <a\n    href=\"whales.html\"\n    target=\"_blank\"\n    title=\"includes information on Blue Whales and Sperm Whales\"\n    >Whales page</a\n  >.\n</p>\n\n<p>\n  If you want to ask our team more questions, feel free to\n  <a href=\"mailto:whales@example.com?subject=Question%20about%20Whales\"\n    >email us</a\n  >.\n</p>\n```\n\nThe title needs to contain some supplemental information about the page that is useful but not essential for knowing what the linked page is about. If the subject was included on the email link, it really needs `%20` escape characters included so that you get spaces in the subject line.\n\n## Task 2\n\nOur second task here tests the student's knowledge of absolute and relative paths, as well as link fragments\n\nThe finished list code should look like this:\n\n```html\n<h1>List path tests</h1>\n\n<ul>\n  <li>\n    <a href=\"blue/blue-whale.jpg\" target=\"_blank\">\n      Link me to the blue whale image\n    </a>\n  </li>\n  <li>\n    <a href=\"../narwhal/narwhal.png\" target=\"_blank\">\n      Link me to the narwhal image\n    </a>\n  </li>\n  <li>\n    <a href=\"https://www.google.co.uk/imghp\" target=\"_blank\">\n      Link me to Google image search\n    </a>\n  </li>\n  <li>\n    <a href=\"#bottom\">Link me to the paragraph at the bottom of the page</a>\n  </li>\n</ul>\n```\n\n## Task 3\n\nOur final task in this set is concerned with good practices for link text; the code should look something like this:\n\n```html\n<p>\n  We do lots of work with Narwhals. To find out more, visit our\n  <a href=\"narwhals.html\" target=\"_blank\">Narwhals page</a>.\n</p>\n\n<p>\n  You can <a href=\"mailto:whales@example.com\">email our support team</a> if you\n  have any more questions.\n</p>\n\n<p>\n  You can also\n  <a href=\"factfile.pdf\" target=\"_blank\">download our factfile (PDF, 4MB)</a>\n  for lots more information, including an FAQ.\n</p>\n```\n\nBasically, all three paragraphs need to be rewritten with good link text, and the third one needs to have a warning added to the link to say that it is a large download.\n"
  },
  {
    "path": "html/introduction-to-html/tasks/links/narwhals.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Narwhals!</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      h1 {\n        font-size: 2rem;\n        margin: 0;\n        color: purple;\n      }\n\n      p {\n        color: gray;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n\n    <h1>Whales</h1>\n\n    <p>You found our Narwhals page — well done!</p>\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/links/whales.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Whales!</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      h1 {\n        font-size: 2rem;\n        margin: 0;\n        color: purple;\n      }\n\n      p {\n        color: gray;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n\n    <h1>Whales</h1>\n\n    <p>You found our Whales page — well done!</p>\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/tasks/playable.js",
    "content": "var section = document.querySelector('section');\nvar editable = document.querySelector('.editable');\nvar textareaHTML = document.querySelector('.playable-html');\nvar textareaCSS = document.querySelector('.playable-css');\nvar reset = document.getElementById('reset');\nvar htmlCode = textareaHTML.value;\nvar cssCode = textareaCSS.value;\n\nfunction fillCode() {\n    editable.innerHTML = textareaCSS.value;\n    section.innerHTML = textareaHTML.value;\n}\n\nreset.addEventListener('click', function () {\n    textareaHTML.value = htmlCode;\n    textareaCSS.value = cssCode;\n    fillCode();\n});\n\ntextareaHTML.addEventListener('input', fillCode);\ntextareaCSS.addEventListener('input', fillCode);\nwindow.addEventListener('load', fillCode);"
  },
  {
    "path": "html/introduction-to-html/tasks/styles.css",
    "content": "/* Some default styling for cookbook examples */\n/*\nrgb(53,43,34)\nrgb(75,70,74)\nrgb(95,97,110)\nrgb(137,151,188)\nrgb(160,178,226)\n*/\nbody {\n    background-color: #fff;\n    color: #333;\n    font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n    padding: 0;\n    margin: 0;\n}\n\nh1 {\n  font-size: 2rem;\n  margin: 0;\n}\n\nh2 {\n  font-size: 1.6rem;\n  margin: 0;\n}\n\np {\n  margin: 0.5em 0;\n}\n\n/* styles for the editor */\n\n.playable {\n    font-family: monospace;\n    display: block;\n    margin-bottom: 10px;\n    background-color: #F4F7F8;\n    border: none;\n    border-left: 6px solid #558ABB;\n    color: #4D4E53;\n    width: 90%;\n    max-width: 700px;\n    padding: 10px 10px 0px;\n    font-size: 90%;\n  }\n\n  .playable-css {\n    height: 80px;\n  }\n\n  .playable-html {\n    height: 160px;\n  }\n\n  .playable-buttons {\n    text-align: right;\n    width: 90%;\n    max-width: 700px;\n    padding: 5px 10px 5px 26px;\n    font-size: 100%;\n  }\n\n  .preview {\n    width: 90%;\n    max-width: 700px;\n    border: 1px solid #4D4E53;\n    border-radius: 2px;\n    padding: 10px 14px 10px 10px;\n    margin-bottom: 10px;\n  }\n\n  .preview input {\n    display: block;\n    margin: 5px;\n  }\n"
  },
  {
    "path": "html/introduction-to-html/the-html-head/css-and-js.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Meta examples</title>\n\n    <meta name=\"author\" content=\"Chris Mills\">\n    <meta name=\"description\" content=\"This is an example page to demonstrate usage of metadata on web pages.\">\n\n    <meta property=\"og:image\" content=\"https://developer.mozilla.org/mdn-social-share.png\">\n    <meta property=\"og:description\" content=\"This is an example page to demonstrate usage of metadata on web pages.\">\n    <meta property=\"og:title\" content=\"Metadata; The HTML &lt;head&gt;, on MDN\">\n\n    <link rel=\"Shortcut Icon\" href=\"favicon.ico\" type=\"image/x-icon\">\n\n    <link rel=\"stylesheet\" href=\"style.css\">\n    <script src=\"script.js\" defer></script>\n  </head>\n  <body>\n    <h1>Meta examples</h1>\n\n    <p>Japanese example: ご飯が熱い。</p>\n\n    \n  </body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/the-html-head/meta-example.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Meta examples</title>\n\n    <meta name=\"author\" content=\"Chris Mills\">\n    <meta name=\"description\" content=\"This is an example page to demonstrate usage of metadata on web pages.\">\n\n    <meta property=\"og:image\" content=\"https://developer.mozilla.org/mdn-social-share.png\">\n    <meta property=\"og:description\" content=\"This is an example page to demonstrate usage of metadata on web pages.\">\n    <meta property=\"og:title\" content=\"Metadata; The HTML &lt;head&gt;, on MDN\">\n\n    <link rel=\"Shortcut Icon\" href=\"favicon.ico\" type=\"image/x-icon\">\n  </head>\n  <body>\n    <h1>Meta examples</h1>\n\n    <p>Japanese example: ご飯が熱い。</p>\n  </body>\n</html>\n"
  },
  {
    "path": "html/introduction-to-html/the-html-head/script.js",
    "content": "const list = document.createElement('ul');\nconst info = document.createElement('p');\nconst html = document.querySelector('html');\n\ninfo.textContent = 'Below is a dynamic list. Click anywhere on the page to add a new list item. Click an existing list item to change its text to something else.';\n\ndocument.body.appendChild(info);\ndocument.body.appendChild(list);\n\nhtml.onclick = function() {\n  const listItem = document.createElement('li');\n  const listContent = prompt('What content do you want the list item to have?');\n  listItem.textContent = listContent;\n  list.appendChild(listItem);\n\n  listItem.onclick = function(e) {\n    e.stopPropagation();\n    const listContent = prompt('Enter new content for your list item');\n    this.textContent = listContent;\n  }\n}\n"
  },
  {
    "path": "html/introduction-to-html/the-html-head/style.css",
    "content": "html {\n  background-color: green;\n  font-size: 20px;\n}\n\nul {\n  background: red;\n  padding: 10px;\n  border: 1px solid black;\n}\n\nli {\n  margin-left: 20px;\n}\n"
  },
  {
    "path": "html/introduction-to-html/the-html-head/title-example.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>&lt;title&gt; element</title>\n  </head>\n  <body>\n    <h1>&lt;h1&gt; element</h1>\n  </body>\n</html>"
  },
  {
    "path": "html/multimedia-and-embedding/adding-vector-graphics-to-the-web/vector-versus-raster.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Vector versus raster</title>\n  </head>\n  <body>\n    <h1>Vector versus raster</h1>\n\n    <img src=\"star.png\" alt=\"A raster star\">\n    <img  src=\"star.svg\" role=\"img\" alt=\"A vector star\">\n  </body>\n</html>"
  },
  {
    "path": "html/multimedia-and-embedding/images-in-html/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Images in HTML</title>\n  </head>\n  <body>\n    <h1>Images in HTML</h1>\n\n    <img src=\"dinosaur.jpg\"\n         alt=\"The head and torso of a dinosaur skeleton; it has a large head with long sharp teeth\"\n         width=\"400\"\n         height=\"341\"\n         title=\"A T-Rex on display in the Manchester University Museum\">\n  </body>\n</html>"
  },
  {
    "path": "html/multimedia-and-embedding/mdn-splash-page-finished/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Mozilla splash page</title>\n    <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css'>\n    <style>\n      /* header and body setup */\n\n      html {\n        font-family: 'Open Sans', sans-serif;\n        background: url(pattern.png);\n      }\n\n      body {\n        width: 100%;\n        max-width: 1200px;\n        margin: 0 auto;\n        background-color: white;\n        position: relative;\n      }\n\n      /* Header styling */\n\n      header {\n        height: 150px;\n      }\n\n      header img {\n        width: 100px;\n        position: absolute;\n        right: 32.5px;\n        top: 32.5px;\n      }\n\n      h1 {\n        font-size: 50px;\n        line-height: 140px;\n        margin: 0 0 0 32.5px;\n      }\n\n      /* main section and video styling */\n\n      main {\n        background: #ccc;\n      }\n\n      article {\n        padding: 20px;\n      }\n\n      h2 {\n        margin-top: 0;\n      }\n\n      p {\n        line-height: 2;\n      }\n\n      iframe {\n        float: left;\n        margin: 0 20px 20px 0;\n        max-width: 100%;\n      }\n\n      /* further info links */\n\n      .further-info {\n        clear: left;\n        padding: 40px 0;\n        background: #c13832;\n        box-shadow: inset 0 3px 2px rgba(0,0,0,0.5),\n                    inset 0 -3px 2px rgba(0,0,0,0.5);\n      }\n\n      .further-info a {\n        width: 25%;\n        display: block;\n        float: left;\n      }\n\n      .further-info img {\n        max-width: 100%;\n      }\n\n      .clearfix {\n        clear: both;\n      }\n\n      /* Red panda image */\n\n      .red-panda img {\n        display: block;\n        max-width: 100%;\n      }\n    </style>\n  </head>\n  <body>\n    <header>\n      <h1>Mozilla</h1>\n      <img src=\"firefox-logo120.png\" alt=\"Firefox logo\">\n    </header>\n\n    <main>\n      <article>\n        <iframe width=\"400\" height=\"225\" src=\"https://www.youtube.com/embed/ojcNcvb1olg\" frameborder=\"0\" allowfullscreen></iframe>\n        <h2>Rocking the free web</h2>\n\n        <p>Mozilla are a global community of technologists, thinkers, and builders, working together to keep the Internet alive and accessible, so people worldwide can be informed contributors and creators of the Web. We believe this act of human collaboration across an open platform is essential to individual growth and our collective future.</p>\n\n        <p>Click on the images below to find more information about the cool stuff Mozilla does. <a href=\"https://www.flickr.com/photos/mathiasappel/21675551065/\">Red panda picture</a> by Mathias Appel.</p>\n      </article>\n\n      <div class=\"further-info\">\n        <a href=\"https://www.mozilla.org/en-US/firefox/new/\">\n          <img srcset=\"firefox-logo120.png 120w,\n                       firefox-logo400.png 400w\"\n               sizes=\"(max-width: 500px) 120px,\n                      400px\"\n               src=\"firefox-logo400.png\" alt=\"Download Firefox\">\n        </a>\n        <a href=\"https://www.mozilla.org/\">\n          <img srcset=\"mozilla-dinosaur120.png 120w,\n                       mozilla-dinosaur400.png 400w\"\n               sizes=\"(max-width: 500px) 120px,\n                      400px\"\n               src=\"mozilla-dinosaur400.png\" alt=\"Learn more about Mozilla\">\n        </a>\n        <a href=\"https://addons.mozilla.org/\">\n          <img srcset=\"firefox-addons120.jpg 120w,\n                       firefox-addons400.jpg 400w\"\n               sizes=\"(max-width: 500px) 120px,\n                      400px\"\n               src=\"firefox-addons400.jpg\" alt=\"Customize Firefox with add-ons\">\n        </a>\n        <a href=\"https://developer.mozilla.org/en-US/\">\n          <img  src=\"mdn.svg\" role=\"img\" alt=\"Learn web development with MDN\">\n        </a>\n        <div class=\"clearfix\"></div>\n      </div>\n\n      <div class=\"red-panda\">\n\n\n        <picture>\n          <source media=\"(max-width: 600px)\" srcset=\"red-panda-portrait-small.jpg\">\n          <img src=\"red-panda-landscape.jpg\" alt=\"a red panda\">\n        </picture>\n      </div>\n\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/mdn-splash-page-finished/marking-guide.md",
    "content": "# Marking guide for \"Mozilla splash page\"\nThe following article outlines a marking guide for the MDN Learning Area HTML Assessment — [Mozilla splash page](https://developer.mozilla.org/en-US/Learn/HTML/Multimedia_and_embedding/Mozilla_splash_page). Each subtask detailed in the assessment is listed below, along with an explanation of how many marks the task is worth, and the mark breakdown.\n\nNote: These are guidelines, not set in stone rules — you are of course free to use your judgement on mark awarding when you meet an edge case, or something that isn't clearly cut.\n\nThe overall mark awarded is out of 28. Work out their final mark, and then divide by 28 and multiply by 100 to give a percentage mark. For reference, you can find a [finished splash page](index.html) that would be awarded top marks.\n\n## Preparing images\n\n<dl>\n<dt>A total of 6 marks should be awarded for this section</dt>\n<ul>\n  <li>1 for creating the 400px and 120px version of the Firefox logo.</li>\n  <li>1 for creating the 400px and 120px version of the Addons image.</li>\n  <li>1 for creating the 400px and 120px version of the Dinosaur logo.</li>\n  <li>1 for leaving the MDN logo SVG as it is.</li>\n  <li>1 for creating the 1200px and 600px version of the Red Panda image, but only if the former is landscape, and the latter is portrait and shows the panda close up.</li>\n  <li>1 for optimizing them so they are nice and compact.</li>\n  </ul>\n</dd>\n</dl>\n\n## Adding a logo to the header\n\n<dl>\n<dt>A total of 2 marks should be awarded for this section</dt>\n<ul>\n  <li>1 for making the image <code>src</code> point to the 120px version of the Firefox logo.</li>\n  <li>1 for giving the image appropriate <code>alt</code> text.</li>\n</ul>\n</dd>\n</dl>\n\n## Adding a video to the main article content\n\n<dl>\n<dt>A total of 2 marks should be awarded for this section</dt>\n<ul>\n  <li>1 for embedding the correct video.</li>\n  <li>1 for making it 400px wide, and a reasonable amount tall.</li>\n</ul>\n</dd>\n</dl>\n\n## Adding responsive images to the further info links\n\n<dl>\n<dt>A total of 14 marks should be awarded for this section</dt>\n<ul>\n  <li>4 for each of the first three links. To get full marks for each one, the student must:\n    <ul>\n      <li>Use the correct image inside the link (Firefox logo for \"Download Firefox\", Dinosaur for mozilla.org, Add-ons image for the add-ons site.)</li>\n      <li>Include an appropriate <code>src</code> and <code>alt</code> attribute.</li>\n      <li>Include a <code>srcset</code> attribute that declares the 120px version of the image as 120w, and the 400px version of 400w.</li>\n      <li>Include a <code>sizes</code> attribute that declares that the 120px version should be used if the viewport is 500px wide or narrower (<code>(max-width: 500px)</code>), and the 400px version should be used otherwise.</li>\n    </ul>\n  </li>\n  <li>2 for embedding the SVG image inside the last link, just in a normal image element, with appropriate <code>src</code> attribute and <code>alt</code> text.</li>\n</ul>\n</dd>\n</dl>\n\n## An art directed red panda\n\n<dl>\n<dt>A total of 5 marks should be awarded for this section</dt>\n<ul>\n  <li>1 for using a <code>&lt;picture&gt;</code> element.</li>\n  <li>2 for including an <code>&lt;img&gt;</code> element inside the <code>&lt;picture&gt;</code> element, pointing to the landscape version, with appropriate <code>alt</code> text.</li>\n  <li>2 for including a <code>&lt;source&gt;</code> element with a <code>srcset</code> attribute pointing to the portrait version of the image, and a <code>media</code> attribute that causes the portrait image to show up only if the viewport is 600px wide or less (<code>(max-width: 600px)</code>.)</li>\n</ul>\n</dd>\n</dl>\n"
  },
  {
    "path": "html/multimedia-and-embedding/mdn-splash-page-start/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Mozilla splash page</title>\n    <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css'>\n    <style>\n      /* header and body setup */\n\n      html {\n        font-family: 'Open Sans', sans-serif;\n        background: url(pattern.png);\n      }\n\n      body {\n        width: 100%;\n        max-width: 1200px;\n        margin: 0 auto;\n        background-color: white;\n        position: relative;\n      }\n\n      /* Header styling */\n\n      header {\n        height: 150px;\n      }\n\n      header img {\n        width: 100px;\n        position: absolute;\n        right: 32.5px;\n        top: 32.5px;\n      }\n\n      h1 {\n        font-size: 50px;\n        line-height: 140px;\n        margin: 0 0 0 32.5px;\n      }\n\n      /* main section and video styling */\n\n      main {\n        background: #ccc;\n      }\n\n      article {\n        padding: 20px;\n      }\n\n      h2 {\n        margin-top: 0;\n      }\n\n      p {\n        line-height: 2;\n      }\n\n      iframe {\n        float: left;\n        margin: 0 20px 20px 0;\n        max-width: 100%;\n      }\n\n      /* further info links */\n\n      .further-info {\n        clear: left;\n        padding: 40px 0;\n        background: #c13832;\n        box-shadow: inset 0 3px 2px rgba(0,0,0,0.5),\n                    inset 0 -3px 2px rgba(0,0,0,0.5);\n      }\n\n      .further-info a {\n        width: 25%;\n        display: block;\n        float: left;\n      }\n\n      .further-info img {\n        max-width: 100%;\n      }\n\n      .clearfix {\n        clear: both;\n      }\n\n      /* Red panda image */\n\n      .red-panda img {\n        display: block;\n        max-width: 100%;\n      }\n    </style>\n  </head>\n  <body>\n    <header>\n      <h1>Mozilla</h1>\n      <!-- insert <img> element, link to the small\n          version of the Firefox logo -->\n\n    </header>\n\n    <main>\n      <article>\n        <!-- insert iframe from youtube -->\n\n        <h2>Rocking the free web</h2>\n\n        <p>Mozilla are a global community of technologists, thinkers, and builders, working together to keep the Internet alive and accessible, so people worldwide can be informed contributors and creators of the Web. We believe this act of human collaboration across an open platform is essential to individual growth and our collective future.</p>\n\n        <p>Click on the images below to find more information about the cool stuff Mozilla does. <a href=\"https://www.flickr.com/photos/mathiasappel/21675551065/\">Red panda picture</a> by Mathias Appel.</p>\n      </article>\n\n      <div class=\"further-info\">\n        <!-- insert images with srcsets and sizes -->\n        <a href=\"https://www.mozilla.org/en-US/firefox/new/\">\n          <img>\n        </a>\n        <a href=\"https://www.mozilla.org/\">\n          <img>\n        </a>\n        <a href=\"https://addons.mozilla.org/\">\n          <img>\n        </a>\n        <a href=\"https://developer.mozilla.org/en-US/\">\n          <img>\n        </a>\n        <div class=\"clearfix\"></div>\n      </div>\n\n      <div class=\"red-panda\">\n        <!-- insert picture element -->\n      </div>\n\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/other-embedding-technologies/iframe-detail.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Iframe with basic details</title>\n  </head>\n  <body>\n    <h1>Iframe with basic details</h1>\n\n    <iframe src=\"https://developer.mozilla.org/en-US/docs/Glossary\" width=\"100%\" height=\"500\" frameborder=\"0\" allowfullscreen sandbox>\n      <p> <a href=\"https://developer.mozilla.org/en-US/docs/Glossary\"> Fallback link for browsers that don't support iframes </a> </p>\n    </iframe>\n  </body>\n</html>"
  },
  {
    "path": "html/multimedia-and-embedding/other-embedding-technologies/iframe-youtube.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Iframe youtube example</title>\n  </head>\n  <body>\n    <h1>Everybody loves Nyancat</h1>\n\n    <iframe width=\"420\" height=\"315\" src=\"https://www.youtube.com/embed/QH2-TGUlwu4\" frameborder=\"0\" allowfullscreen>\\n</iframe>\n  </body>\n</html>"
  },
  {
    "path": "html/multimedia-and-embedding/other-embedding-technologies/object-image.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Object element example</title>\n  </head>\n  <body>\n    <h1>Object element example</h1>\n\n \n    <object data=\"dinosaur.jpg\" type=\"image/jpeg\" width=\"400\" height=\"341\">\n      <p>Why oh why didn't we just use the image element?</p>\n    </object>\n\n  </body>\n</html>"
  },
  {
    "path": "html/multimedia-and-embedding/other-embedding-technologies/object-pdf.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Object element example</title>\n  </head>\n  <body>\n    <h1>Object element example</h1>\n\n \n    <object data=\"mypdf.pdf\" type=\"application/pdf\" width=\"800\" height=\"1200\">\n      <p>You don't have a PDF plugin, but you can <a href=\"mypdf.pdf\">download the PDF file.</a></p>\n    </object>\n\n  </body>\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/responsive-images/not-responsive.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Not responsive demo</title>\n    <style>\n      html {\n        font-family: sans-serif;\n        background-color: gray;\n      }\n\n      body {\n        width: 100%;\n        max-width: 1200px;\n        margin: 0 auto;\n        background-color: white;\n      }\n\n      header {\n        background: url(header.jpg) no-repeat center;\n        height: 200px;\n      }\n\n      section {\n        padding: 20px;\n      }\n\n      p {\n        line-height: 1.5;\n      }\n\n      img {\n        display: block;\n        margin: 0 auto;\n        max-width: 100%;\n      }\n    </style>\n  </head>\n  <body>\n    <header>\n      \n    </header>\n\n    <main>\n      <section>\n        <h1>My website</h1>\n\n        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris eget venenatis ligula. Ut lacinia at dolor vitae pulvinar. Aliquam pretium dignissim eros. Integer faucibus, dui non aliquet bibendum, lectus orci lobortis odio, ornare porttitor est tellus eget velit. Nulla eros elit, malesuada id neque vel, viverra vehicula neque. Nullam auctor turpis non leo iaculis finibus. Quisque blandit arcu venenatis libero tempor, ac pulvinar ligula dapibus.</p>\n\n        <img src=\"elva-800w.jpg\" alt=\"Chris standing up holding his daughter Elva\">\n\n        <p>Suspendisse potenti. Ut in luctus eros. Mauris pulvinar vehicula aliquet. Etiam imperdiet eleifend luctus. Duis ut justo nec eros ornare consectetur. Vestibulum convallis condimentum varius. Maecenas rutrum porta varius. Phasellus volutpat sem id sagittis luctus. Morbi vitae quam vitae nisi iaculis dignissim.</p>\n\n        <img src=\"elva-fairy-800w.jpg\" alt=\"Elva dressed as a fairy\">\n\n        <p>Header image originally by <a href=\"https://www.flickr.com/photos/miwok/17086751527/\">Miwok</a>.</p>\n      </section>\n    </main>\n  </body>\n</html>"
  },
  {
    "path": "html/multimedia-and-embedding/responsive-images/responsive.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Responsive HTML images demo</title>\n    <style>\n      html {\n        font-family: sans-serif;\n        background-color: gray;\n      }\n\n      body {\n        max-width: 1200px;\n        margin: 0 auto;\n        background-color: white;\n      }\n\n      header {\n        background: url(header.jpg) no-repeat center;\n        height: 200px;\n      }\n\n      section {\n        padding: 20px;\n      }\n\n      p {\n        line-height: 1.5;\n      }\n\n      img {\n        display: block;\n        margin: 0 auto;\n        max-width: 100%;\n      }\n    </style>\n  </head>\n  <body>\n    <header>\n\n    </header>\n\n    <main>\n      <section>\n        <h1>My website</h1>\n\n        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris eget venenatis ligula. Ut lacinia at dolor vitae pulvinar. Aliquam pretium dignissim eros. Integer faucibus, dui non aliquet bibendum, lectus orci lobortis odio, ornare porttitor est tellus eget velit. Nulla eros elit, malesuada id neque vel, viverra vehicula neque. Nullam auctor turpis non leo iaculis finibus. Quisque blandit arcu venenatis libero tempor, ac pulvinar ligula dapibus.</p>\n\n        <picture>\n          <source media=\"(width < 800px)\" srcset=\"elva-480w-close-portrait.jpg\">\n          <source media=\"(width >= 800px)\" srcset=\"elva-800w.jpg\">\n          <img src=\"elva-800w.jpg\" alt=\"Chris standing up holding his daughter Elva\">\n        </picture>\n\n        <p>Suspendisse potenti. Ut in luctus eros. Mauris pulvinar vehicula aliquet. Etiam imperdiet eleifend luctus. Duis ut justo nec eros ornare consectetur. Vestibulum convallis condimentum varius. Maecenas rutrum porta varius. Phasellus volutpat sem id sagittis luctus. Morbi vitae quam vitae nisi iaculis dignissim.</p>\n\n        <img srcset=\"elva-fairy-480w.jpg 480w,\n                     elva-fairy-800w.jpg 800w\"\n             sizes=\"(width <= 600px) 480px,\n                    800px\"\n             src=\"elva-fairy-800w.jpg\" alt=\"Elva dressed as a fairy\">\n\n        <p>Header image originally by <a href=\"https://www.flickr.com/photos/miwok/17086751527/\">Miwok</a>.</p>\n      </section>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/responsive-images/srcset-resolutions.html",
    "content": "<!doctype html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title>Responsive HTML images demo</title>\n    <style>\n      img {\n        width: 320px;\n      }\n    </style>\n  </head>\n  <body>\n    <img\n      srcset=\"\n        elva-fairy-320w.jpg,\n        elva-fairy-480w.jpg 1.5x,\n        elva-fairy-640w.jpg 2x\n      \"\n      src=\"elva-fairy-640w.jpg\"\n      alt=\"Elva dressed as a fairy\"\n      id=\"img\"\n      onload=\"showUrl()\"\n    />\n    <script>\n      function showUrl() {\n        const img = document.getElementById(\"img\");\n        const p = document.createElement(\"p\");\n        const fileName = img.currentSrc?.substring(\n          img.currentSrc.lastIndexOf(\"/\"),\n        );\n        p.textContent = `Loaded: ${fileName}`;\n        document.body.appendChild(p);\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/tasks/images/images1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>HTML images: Task 1</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      img {\n        border: 1px solid black;\n      }\n    </style>\n  </head>\n\n  <body>\n    <h1>Basic image embed</h1>\n    <img>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/tasks/images/images1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>HTML images: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      img {\n        border: 1px solid black;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      <h1>Basic image embed</h1>\n\n      <img>\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\nimg {\n  border: 1px solid black;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<h1>Basic image embed</h1>\n<img>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/tasks/images/images2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>HTML images: Task 2</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      img {\n        border: 1px solid black;\n        max-width: 100%;\n      }\n    </style>\n  </head>\n\n  <body>\n    <h1>Basic image title</h1>\n\n    <img src=\"larch.jpg\"\n         alt=\"Several tall evergreen trees called larches\">\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/tasks/images/images2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>HTML images: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      img {\n        border: 1px solid black;\n        max-width: 100%;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      <h1>Basic image title</h1>\n\n      <img src=\"larch.jpg\"\n           alt=\"Several tall evergreen trees called larches\">\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\nimg {\n  border: 1px solid black;\n  max-width: 100%;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<h1>Basic image title</h1>\n\n<img src=\"larch.jpg\"\n     alt=\"Several tall evergreen trees called larches\">\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/tasks/images/images3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>HTML images: Task 3</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n    <h1>Image and caption</h1>\n\n  \t<img src=\"firefox.png\"\n  \t     alt=\"An abstract flaming fox wrapping around a blue sphere\"\n  \t     width=\"446\" height=\"460\">\n  \tThe Firefox logo, newly abstracted for 2019!\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/tasks/images/images3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>HTML images: Task 3</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      <h1>Image and caption</h1>\n\n    \t<img src=\"firefox.png\"\n    \t     alt=\"An abstract flaming fox wrapping around a blue sphere\"\n    \t     width=\"446\" height=\"460\">\n    \tThe Firefox logo, newly abstracted for 2019!\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\n\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<h1>Image and caption</h1>\n\n<img src=\"firefox.png\"\n     alt=\"An abstract flaming fox wrapping around a blue sphere\"\n     width=\"446\" height=\"460\">\nThe Firefox logo, newly abstracted for 2019!\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/tasks/images/marking.md",
    "content": "# Images marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the HTML features covered in the [Images in HTML](https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Images_in_HTML) lesson in Learn Web Development on MDN.\n\n## Task 1\n\nThis task tests your ability to embed a simple image on the page, give it some alternative text, and give it some `width` and `height` attributes. Ideally the answer should look something like this:\n\n```html\n<h1>Basic image embed</h1>\n\n<img\n  src=\"images/blueberries.jpg\"\n  alt=\"A pile of blueberries, small, round, blue berries\"\n  width=\"615\"\n  height=\"419\"\n/>\n```\n\nThe filename and path must be correct for the image to show up. The `alt` text should describe the visual appearance of image for those that can't see it. Finally, the `width` and `height` attributes should contain the same values as the image's intrinsic width and height, so it displays at the correct size.\n\n## Task 2\n\nHere the student needs to add a `title` to the `<image>` element to create a tooltip that appears when moused over. The code would look something like this:\n\n```html\n<h1>Basic image title</h1>\n\n<img\n  src=\"larch.jpg\"\n  alt=\"Several tall evergreen trees called larches\"\n  title=\"Number 1 in Monty Python's How to recognise different trees from quite a long way away\"\n/>\n```\n\nBecause screenreader support is unreliable and potentially unhelpful, information contained in the `title` attributes should be non-essential. Here were are just having a bit of fun.\n\n## Task 3\n\nIn task 3 the student needs to create an image that is associated with a caption inside the HTML itself.\n\nThe finished would probably look like this:\n\n```html\n<h1>Image and caption</h1>\n\n<figure>\n  <img\n    src=\"firefox.png\"\n    alt=\"An abstract flaming fox wrapping around a blue sphere\"\n    width=\"446\"\n    height=\"460\"\n  />\n  <figcaption>The Firefox logo, newly abstracted for 2019!</figcaption>\n</figure>\n```\n\nNote that the caption should contain additional information, and not just repeat the image description found in the `alt` text.\n"
  },
  {
    "path": "html/multimedia-and-embedding/tasks/media-embed/marking.md",
    "content": "# Media and embedding marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the HTML features covered in the [Video and audio content](https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Video_and_audio_content) and [From object to iframe — other embedding technologies](https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Other_embedding_technologies) lessons in Learn Web Development on MDN.\n\n## Task 1\n\nThis task tests your ability to put together a simple audio player with a single source. Ideally the answer should look something like this:\n\n```html\n<h1>Basic audio embed</h1>\n\n<audio src=\"media/audio.mp3\" controls>\n  <p>\n    Your browser doesn't support HTML5 audio. Here is a\n    <a href=\"media/audio.mp3\">link to the audio</a> instead.\n  </p>\n</audio>\n```\n\nThe filename and path must be correct for the audio to show up. The `controls` attribute should be included so we can easily play the audio, and the fallback text is also a best practice, although most browsers will support this now.\n\n## Task 2\n\nIn this next task we're doing something a bit more complex; a full-featured video player with multiple sources. The code would look something like this:\n\n```html\n<h1>Video embed</h1>\n\n<video controls muted width=\"320\" height=\"240\">\n  <source src=\"media/video.mp4\" type=\"video/mp4\" />\n  <source src=\"media/video.webm\" type=\"video/webm\" />\n  <track kind=\"subtitles\" src=\"media/subtitles_en.vtt\" srclang=\"en-US\" />\n  <p>\n    Your browser doesn't support HTML5 video. Here is a\n    <a href=\"media/video.mp4\">link to the video</a> instead.\n  </p>\n</video>\n```\n\nHere we've got a number of things that need to be put in place:\n\n- `controls` to make the controls appear.\n- `width` and `height` as requested.\n- `muted` to make sure no sound is played, as per the requirements.\n- two separate `<source>` elements pointing to the two different video formats, to provide support in older browsers that don't support MP4 and instead support WebM. Each should be given a `type` attribute to indicate what the video's MIME type is, so the browser can tell up front if it can play with video without needing to start downloading it.\n- A `<track>` element to display the subtitles, with appropriate `kind`, `src`, and `srclang` attributes.\n- Suitable fallback content, as before.\n\nNote that the subtitles will not load if you try to run the example locally, due to browser security policy. To see the subtitles you must run the example from an actual web server.\n\n## Task 3\n\nIn task 3 the student needs to test embedding techniques.\n\nThe finished code would probably look like something this:\n\n```html\n<h1>Embedding</h1>\n\n<object\n  data=\"media/MyPDF.pdf\"\n  type=\"application/pdf\"\n  width=\"400\"\n  height=\"400\"\n></object>\n\n<hr />\n\n<iframe\n  width=\"560\"\n  height=\"315\"\n  src=\"https://www.youtube.com/embed/SB-qEYVdvXA\"\n  frameborder=\"0\"\n  allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\"\n  allowfullscreen\n></iframe>\n```\n\nIn the first example, you just need to look up the correct code to embed a PDF in the page, making sure you get the path to the PDF file correct.\n\nIn the second example, you'll need to go to YouTube, Google Maps, or a similar site, find the embed functionality, and copy over the embed code into the live example. This code will look markedly different depending on what service you use.\n"
  },
  {
    "path": "html/multimedia-and-embedding/tasks/media-embed/media/subtitles_en.vtt",
    "content": "WEBVTT\n\n1\n00:00:02.010 --> 00:00:03.500\nThis is the first subtitle.\n\n2\n00:00:05.739 --> 00:00:06.074\nThis is the second.\n\n3\n00:00:06.901 --> 00:00:08.000\nAnd this is the third!\n"
  },
  {
    "path": "html/multimedia-and-embedding/tasks/media-embed/mediaembed1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Media/embedding: Task 1</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      audio {\n        border: 1px solid black;\n      }\n    </style>\n  </head>\n\n  <body>\n    <h1>Basic audio embed</h1>\n\n    <audio>\n\n    </audio>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/tasks/media-embed/mediaembed1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Media/embedding: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      audio {\n        border: 1px solid black;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      <h1>Basic audio embed</h1>\n\n      <audio>\n      </audio>\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\naudio {\n  border: 1px solid black;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<h1>Basic audio embed</h1>\n\n<audio>\n</audio>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/tasks/media-embed/mediaembed2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Media/embedding: Task 2</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      video {\n        border: 1px solid black;\n      }\n    </style>\n  </head>\n\n  <body>\n    <h1>Video embed</h1>\n\n    <video>\n    </video>\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/tasks/media-embed/mediaembed2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Media/embedding: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n      video {\n        border: 1px solid black;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      <h1>Video embed</h1>\n\n      <video>\n      </video>\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\nvideo {\n  border: 1px solid black;\n}\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<h1>Video embed</h1>\n\n<video>\n</video>\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/tasks/media-embed/mediaembed3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Media/embedding: Task 3</title>\n    <style>\n      body {\n        background-color: #fff;\n        color: #333;\n        font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n        padding: 1em;\n        margin: 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n  </head>\n\n  <body>\n    <h1>Embedding</h1>\n\n    <!-- PDF embed here  -->\n\n    <hr>\n\n    <!-- 3rd party embed here  -->\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/tasks/media-embed/mediaembed3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Media/embedding: Task 3</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n\n    <style class=\"editable\">\n\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n      <h1>Embedding</h1>\n\n      <!-- PDF embed here  -->\n\n      <hr>\n\n      <!-- 3rd party embed here  -->\n\n    </section>\n\n    <textarea class=\"playable playable-css\" style=\"height: 130px;\">\n\n    </textarea>\n\n    <textarea class=\"playable playable-html\" style=\"height: 220px;\">\n<h1>Embedding</h1>\n\n<!-- PDF embed here  -->\n\n<hr>\n\n<!-- 3rd party embed here  -->\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/tasks/playable.js",
    "content": "var section = document.querySelector('section');\nvar editable = document.querySelector('.editable');\nvar textareaHTML = document.querySelector('.playable-html');\nvar textareaCSS = document.querySelector('.playable-css');\nvar reset = document.getElementById('reset');\nvar htmlCode = textareaHTML.value;\nvar cssCode = textareaCSS.value;\n\nfunction fillCode() {\n    editable.innerHTML = textareaCSS.value;\n    section.innerHTML = textareaHTML.value;\n}\n\nreset.addEventListener('click', function () {\n    textareaHTML.value = htmlCode;\n    textareaCSS.value = cssCode;\n    fillCode();\n});\n\ntextareaHTML.addEventListener('input', fillCode);\ntextareaCSS.addEventListener('input', fillCode);\nwindow.addEventListener('load', fillCode);"
  },
  {
    "path": "html/multimedia-and-embedding/tasks/styles.css",
    "content": "/* Some default styling for cookbook examples */\n/*\nrgb(53,43,34)\nrgb(75,70,74)\nrgb(95,97,110)\nrgb(137,151,188)\nrgb(160,178,226)\n*/\nbody {\n    background-color: #fff;\n    color: #333;\n    font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n    padding: 0;\n    margin: 0;\n}\n\nh1 {\n  font-size: 2rem;\n  margin: 0;\n}\n\nh2 {\n  font-size: 1.6rem;\n  margin: 0;\n}\n\np {\n  margin: 0.5em 0;\n}\n\n/* styles for the editor */\n\n.playable {\n    font-family: monospace;\n    display: block;\n    margin-bottom: 10px;\n    background-color: #F4F7F8;\n    border: none;\n    border-left: 6px solid #558ABB;\n    color: #4D4E53;\n    width: 90%;\n    max-width: 700px;\n    padding: 10px 10px 0px;\n    font-size: 90%;\n  }\n\n  .playable-css {\n    height: 80px;\n  }\n\n  .playable-html {\n    height: 160px;\n  }\n\n  .playable-buttons {\n    text-align: right;\n    width: 90%;\n    max-width: 700px;\n    padding: 5px 10px 5px 26px;\n    font-size: 100%;\n  }\n\n  .preview {\n    width: 90%;\n    max-width: 700px;\n    border: 1px solid #4D4E53;\n    border-radius: 2px;\n    padding: 10px 14px 10px 10px;\n    margin-bottom: 10px;\n  }\n\n  .preview input {\n    display: block;\n    margin: 5px;\n  }\n"
  },
  {
    "path": "html/multimedia-and-embedding/video-and-audio-content/extra-video-features.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Extra video features example</title>\n    <style>\n      video {\n        background: black;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Extra video features example</h1>\n\n    <video controls width=\"400\" height=\"400\"\n           loop muted preload=\"auto\"\n           poster=\"poster.png\">\n      <source src=\"rabbit320.mp4\" type=\"video/mp4\">\n      <source src=\"rabbit320.webm\" type=\"video/webm\">\n      <p>Your browser doesn't support HTML5 video. Here is a <a href=\"rabbit320.mp4\">link to the video</a> instead.</p>\n    </video>\n  </body>\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/video-and-audio-content/multiple-audio-formats.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Multiple format audio example</title>\n  </head>\n  <body>\n    <h1>Below is an audio player that will play in all modern browsers</h1>\n\n    <audio controls>\n      <source src=\"viper.mp3\" type=\"audio/mp3\">\n      <source src=\"viper.ogg\" type=\"audio/ogg\">\n      <p>Your browser doesn't support HTML5 audio. Here is a <a href=\"viper.mp3\">link to the audio</a> instead.</p> \n    </audio>\n  </body>\n</html>"
  },
  {
    "path": "html/multimedia-and-embedding/video-and-audio-content/multiple-video-formats-no-controls.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Multiple format video example</title>\n  </head>\n  <body>\n    <h1>Below is a video that will play in all modern browsers</h1>\n\n    <video>\n      <source src=\"rabbit320.mp4\" type=\"video/mp4\">\n      <source src=\"rabbit320.webm\" type=\"video/webm\">\n      <p>Your browser doesn't support HTML5 video. Here is a <a href=\"rabbit320.mp4\">link to the video</a> instead.</p>\n    </video>\n  </body>\n</html>\n"
  },
  {
    "path": "html/multimedia-and-embedding/video-and-audio-content/multiple-video-formats.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Multiple format video example</title>\n  </head>\n  <body>\n    <h1>Below is a video that will play in all modern browsers</h1>\n\n    <video controls>\n      <source src=\"rabbit320.mp4\" type=\"video/mp4\">\n      <source src=\"rabbit320.webm\" type=\"video/webm\">\n      <p>Your browser doesn't support HTML5 video. Here is a <a href=\"rabbit320.mp4\">link to the video</a> instead.</p> \n    </video>\n  </body>\n</html>"
  },
  {
    "path": "html/multimedia-and-embedding/video-and-audio-content/simple-video.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple video example</title>\n  </head>\n  <body>\n    <h1>Below is a simple video example</h1>\n\n    <video src=\"rabbit320.webm\" controls>\n      <p>Your browser doesn't support HTML5 video. Here is a <a href=\"rabbit320.webm\">link to the video</a> instead.</p> \n    </video>\n  </body>\n</html>"
  },
  {
    "path": "html/tables/advanced/items-sold-headers.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Items sold summary</title>\n    <link href=\"minimal-table.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n\n<body>\n    <h1>Items sold summary</h1>\n\n    <table>\n      <caption>Items Sold August 2016</caption>\n      <thead>\n        <tr>\n          <td colspan=\"2\" rowspan=\"2\"></td>\n          <th colspan=\"3\" id=\"clothes\">Clothes</th>\n          <th colspan=\"2\" id=\"accessories\">Accessories</th>\n        </tr>\n        <tr>\n          <th id=\"trousers\" headers=\"clothes\">Trousers</th>\n          <th id=\"skirts\" headers=\"clothes\">Skirts</th>\n          <th id=\"dresses\" headers=\"clothes\">Dresses</th>\n          <th id=\"bracelets\" headers=\"accessories\">Bracelets</th>\n          <th id=\"rings\" headers=\"accessories\">Rings</th>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <th rowspan=\"3\" id=\"belgium\">Belgium</th>\n          <th id=\"antwerp\" headers=\"belgium\">Antwerp</th>\n          <td headers=\"antwerp belgium clothes trousers\">56</td>\n          <td headers=\"antwerp belgium clothes skirts\">22</td>\n          <td headers=\"antwerp belgium clothes dresses\">43</td>\n          <td headers=\"antwerp belgium accessories bracelets\">72</td>\n          <td headers=\"antwerp belgium accessories rings\">23</td>\n        </tr>\n        <tr>\n          <th id=\"ghent\" headers=\"belgium\">Ghent</th>\n          <td headers=\"ghent belgium clothes trousers\">46</td>\n          <td headers=\"ghent belgium clothes skirts\">18</td>\n          <td headers=\"ghent belgium clothes dresses\">50</td>\n          <td headers=\"ghent belgium accessories bracelets\">61</td>\n          <td headers=\"ghent belgium accessories rings\">15</td>\n        </tr>\n        <tr>\n          <th id=\"brussels\" headers=\"belgium\">Brussels</th>\n          <td headers=\"brussels belgium clothes trousers\">51</td>\n          <td headers=\"brussels belgium clothes skirts\">27</td>\n          <td headers=\"brussels belgium clothes dresses\">38</td>\n          <td headers=\"brussels belgium accessories bracelets\">69</td>\n          <td headers=\"brussels belgium accessories rings\">28</td>\n        </tr>\n        <tr>\n          <th rowspan=\"2\" id=\"netherlands\">The Netherlands</th>\n          <th id=\"amsterdam\" headers=\"netherlands\">Amsterdam</th>\n          <td headers=\"amsterdam netherlands clothes trousers\">89</td>\n          <td headers=\"amsterdam netherlands clothes skirts\">34</td>\n          <td headers=\"amsterdam netherlands clothes dresses\">69</td>\n          <td headers=\"amsterdam netherlands accessories bracelets\">85</td>\n          <td headers=\"amsterdam netherlands accessories rings\">38</td>\n        </tr>\n        <tr>\n          <th id=\"utrecht\" headers=\"netherlands\">Utrecht</th>\n          <td headers=\"utrecht netherlands clothes trousers\">80</td>\n          <td headers=\"utrecht netherlands clothes skirts\">12</td>\n          <td headers=\"utrecht netherlands clothes dresses\">43</td>\n          <td headers=\"utrecht netherlands accessories bracelets\">36</td>\n          <td headers=\"utrecht netherlands accessories rings\">19</td>\n        </tr>\n      </tbody>\n    </table>\n\n</body>\n\n</html>\n"
  },
  {
    "path": "html/tables/advanced/items-sold-scope.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Items sold summary</title>\n    <link href=\"minimal-table.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n\n<body>\n    <h1>Items sold summary</h1>\n\n    <table>\n      <caption>Items Sold August 2016</caption>\n      <thead>\n        <tr>\n          <td colspan=\"2\" rowspan=\"2\"></td>\n          <th colspan=\"3\" scope=\"colgroup\">Clothes</th>\n          <th colspan=\"2\" scope=\"colgroup\">Accessories</th>\n        </tr>\n        <tr>\n          <th scope=\"col\">Trousers</th>\n          <th scope=\"col\">Skirts</th>\n          <th scope=\"col\">Dresses</th>\n          <th scope=\"col\">Bracelets</th>\n          <th scope=\"col\">Rings</th>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <th rowspan=\"3\" scope=\"rowgroup\">Belgium</th>\n          <th scope=\"row\">Antwerp</th>\n          <td>56</td>\n          <td>22</td>\n          <td>43</td>\n          <td>72</td>\n          <td>23</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Ghent</th>\n          <td>46</td>\n          <td>18</td>\n          <td>50</td>\n          <td>61</td>\n          <td>15</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Brussels</th>\n          <td>51</td>\n          <td>27</td>\n          <td>38</td>\n          <td>69</td>\n          <td>28</td>\n        </tr>\n        <tr>\n          <th rowspan=\"2\" scope=\"rowgroup\">The Netherlands</th>\n          <th scope=\"row\">Amsterdam</th>\n          <td>89</td>\n          <td>34</td>\n          <td>69</td>\n          <td>85</td>\n          <td>38</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Utrecht</th>\n          <td>80</td>\n          <td>12</td>\n          <td>43</td>\n          <td>36</td>\n          <td>19</td>\n        </tr>\n      </tbody>\n    </table>\n\n</body>\n\n</html>\n"
  },
  {
    "path": "html/tables/advanced/items-sold.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Items sold summary</title>\n    <link href=\"minimal-table.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n\n<body>\n    <h1>Items sold summary</h1>\n\n    <table>\n      <caption>Items Sold August 2016</caption>\n      <thead>\n        <tr>\n          <td colspan=\"2\" rowspan=\"2\"></td>\n          <th colspan=\"3\">Clothes</th>\n          <th colspan=\"2\">Accessories</th>\n        </tr>\n        <tr>\n          <th>Trousers</th>\n          <th>Skirts</th>\n          <th>Dresses</th>\n          <th>Bracelets</th>\n          <th>Rings</th>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <th rowspan=\"3\">Belgium</th>\n          <th>Antwerp</th>\n          <td>56</td>\n          <td>22</td>\n          <td>43</td>\n          <td>72</td>\n          <td>23</td>\n        </tr>\n        <tr>\n          <th>Ghent</th>\n          <td>46</td>\n          <td>18</td>\n          <td>50</td>\n          <td>61</td>\n          <td>15</td>\n        </tr>\n        <tr>\n          <th>Brussels</th>\n          <td>51</td>\n          <td>27</td>\n          <td>38</td>\n          <td>69</td>\n          <td>28</td>\n        </tr>\n        <tr>\n          <th rowspan=\"2\">The Netherlands</th>\n          <th>Amsterdam</th>\n          <td>89</td>\n          <td>34</td>\n          <td>69</td>\n          <td>85</td>\n          <td>38</td>\n        </tr>\n        <tr>\n          <th>Utrecht</th>\n          <td>80</td>\n          <td>12</td>\n          <td>43</td>\n          <td>36</td>\n          <td>19</td>\n        </tr>\n      </tbody>\n    </table>\n\n</body>\n\n</html>\n"
  },
  {
    "path": "html/tables/advanced/minimal-table.css",
    "content": "html {\n  font-family: sans-serif;\n}\n\ntable {\n  border-collapse: collapse;\n  border: 2px solid rgb(200,200,200);\n  letter-spacing: 1px;\n  font-size: 0.8rem;\n}\n\ntd, th {\n  border: 1px solid rgb(190,190,190);\n  padding: 10px 20px;\n}\n\nth {\n  background-color: rgb(235,235,235);\n}\n\ntd {\n  text-align: center;\n}\n\ntr:nth-child(even) td {\n  background-color: rgb(250,250,250);\n}\n\ntr:nth-child(odd) td {\n  background-color: rgb(245,245,245);\n}\n\ncaption {\n  padding: 10px;\n}\n"
  },
  {
    "path": "html/tables/advanced/nested-tables.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Nested tables</title>\n    <link href=\"minimal-table.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n\n<body>\n    <h1>Nested tables</h1>\n\n    <table id=\"table1\">\n        <tr>\n            <th>title1</th>\n            <th>title2</th>\n            <th>title3</th>\n        </tr>\n        <tr>\n            <td id=\"nested\">\n                <table id=\"table2\">\n                    <tr>\n                        <td>cell1</td>\n                        <td>cell2</td>\n                        <td>cell3</td>\n                    </tr>\n                </table>\n            </td>\n            <td>cell2</td>\n            <td>cell3</td>\n        </tr>\n        <tr>\n            <td>cell4</td>\n            <td>cell5</td>\n            <td>cell6</td>\n        </tr>\n    </table>\n\n</body>\n\n</html>\n"
  },
  {
    "path": "html/tables/advanced/spending-record-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>My spending record</title>\n    <link href=\"minimal-table.css\" rel=\"stylesheet\" type=\"text/css\">\n    <style>\n        tbody {\n          font-size: 90%;\n          font-style: italic;\n        }\n\n        tfoot {\n          font-weight: bold;\n        }\n    </style>\n  </head>\n  <body>\n    <h1>My spending record</h1>\n\n      <table>\n        <caption>How I chose to spend my money</caption>\n        <thead>\n          <tr>\n            <th>Purchase</th>\n            <th>Location</th>\n            <th>Date</th>\n            <th>Evaluation</th>\n            <th>Cost (€)</th>\n          </tr>\n        </thead>\n        <tfoot>\n          <tr>\n            <td colspan=\"4\">SUM</td>\n            <td>118</td>\n          </tr>\n        </tfoot>\n        <tbody>\n          <tr>\n            <td>Haircut</td>\n            <td>Hairdresser</td>\n            <td>12/09</td>\n            <td>Great idea</td>\n            <td>30</td>\n          </tr>\n          <tr>\n            <td>Lasagna</td>\n            <td>Restaurant</td>\n            <td>12/09</td>\n            <td>Regrets</td>\n            <td>18</td>\n          </tr>\n          <tr>\n            <td>Shoes</td>\n            <td>Shoeshop</td>\n            <td>13/09</td>\n            <td>Big regrets</td>\n            <td>65</td>\n          </tr>\n          <tr>\n            <td>Toothpaste</td>\n            <td>Supermarket</td>\n            <td>13/09</td>\n            <td>Good</td>\n            <td>5</td>\n          </tr>\n        </tbody>\n    </table>\n\n  </body>\n</html>\n"
  },
  {
    "path": "html/tables/advanced/spending-record.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>My spending record</title>\n    <link href=\"minimal-table.css\" rel=\"stylesheet\" type=\"text/css\">\n    <style>\n    </style>\n  </head>\n  <body>\n    <h1>My spending record</h1>\n\n      <table>\n        <caption>How I chose to spend my money</caption>\n          <tr>\n            <th>Purchase</th>\n            <th>Location</th>\n            <th>Date</th>\n            <th>Evaluation</th>\n            <th>Cost (€)</th>\n          </tr>\n          <tr>\n            <td>SUM</td>\n            <td>118</td>\n          </tr>\n          <tr>\n            <td>Haircut</td>\n            <td>Hairdresser</td>\n            <td>12/09</td>\n            <td>Great idea</td>\n            <td>30</td>\n          </tr>\n          <tr>\n            <td>Lasagna</td>\n            <td>Restaurant</td>\n            <td>12/09</td>\n            <td>Regrets</td>\n            <td>18</td>\n          </tr>\n          <tr>\n            <td>Shoes</td>\n            <td>Shoeshop</td>\n            <td>13/09</td>\n            <td>Big regrets</td>\n            <td>65</td>\n          </tr>\n          <tr>\n            <td>Toothpaste</td>\n            <td>Supermarket</td>\n            <td>13/09</td>\n            <td>Good</td>\n            <td>5</td>\n          </tr>\n    </table>\n\n  </body>\n</html>\n"
  },
  {
    "path": "html/tables/advanced/timetable-caption.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>School timetable</title>\n    <style>\n    html {\n      font-family: sans-serif;\n    }\n\n    table {\n      border-collapse: collapse;\n      border: 2px solid rgb(200,200,200);\n      letter-spacing: 1px;\n      font-size: 0.8rem;\n    }\n\n    td, th {\n      border: 1px solid rgb(190,190,190);\n      padding: 10px 20px;\n    }\n\n    td {\n      text-align: center;\n    }\n\n    caption {\n      padding: 10px;\n    }\n    </style>\n  </head>\n  <body>\n    <h1>School timetable</h1>\n\n    <table>\n      <caption>Florence's weekly lesson timetable</caption>\n      <colgroup>\n        <col span=\"2\">\n        <col style=\"background-color:#97DB9A;\">\n        <col style=\"width:42px;\">\n        <col style=\"background-color:#97DB9A;\">\n        <col style=\"background-color:#DCC48E; border:4px solid #C1437A;\">\n        <col span=\"2\" style=\"width:42px;\">\n      </colgroup>\n      <tr>\n        <td>&nbsp;</td>\n        <th>Mon</th>\n        <th>Tues</th>\n        <th>Wed</th>\n        <th>Thurs</th>\n        <th>Fri</th>\n        <th>Sat</th>\n        <th>Sun</th>\n      </tr>\n      <tr>\n        <th>1st period</th>\n        <td>English</td>\n        <td>&nbsp;</td>\n        <td>&nbsp;</td>\n        <td>German</td>\n        <td>Dutch</td>\n        <td>&nbsp;</td>\n        <td>&nbsp;</td>\n      </tr>\n      <tr>\n        <th>2nd period</th>\n        <td>English</td>\n        <td>English</td>\n        <td>&nbsp;</td>\n        <td>German</td>\n        <td>Dutch</td>\n        <td>&nbsp;</td>\n        <td>&nbsp;</td>\n      </tr>\n      <tr>\n        <th>3rd period</th>\n        <td>&nbsp;</td>\n        <td>German</td>\n        <td>&nbsp;</td>\n        <td>German</td>\n        <td>Dutch</td>\n        <td>&nbsp;</td>\n        <td>&nbsp;</td>\n      </tr>\n      <tr>\n        <th>4th period</th>\n        <td>&nbsp;</td>\n        <td>English</td>\n        <td>&nbsp;</td>\n        <td>English</td>\n        <td>Dutch</td>\n        <td>&nbsp;</td>\n        <td>&nbsp;</td>\n      </tr>\n    </table>\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "html/tables/assessment-finished/marking-guide.md",
    "content": "# Marking guide for \"Structuring planet data\"\nThe following guide outlines a marking guide for the MDN Learning Area HTML Topic — [Structuring planet data](https://developer.mozilla.org/en-US/docs/Learn/HTML/Tables/Structuring_planet_data). Each subtask detailed in the assessment is listed below, along with an explanation of how many marks the task is worth.\n\nNote: These are guidelines, not set in stone rules — you are of course free to use your judgement on mark awarding when you meet an edge case, or something that isn't clearly cut.\n\nThe overall mark awarded is out of 34. Work out their final mark, and then divide by 34 and multiply by 100 to give a percentage mark. For reference, you can find a [finished marked up page](planets-data.html) that would be awarded top marks.\n\n## Block/structural semantics\n\n<dl>\n  <dt>Giving the table a basic high level structure — an outer container, a table header, and a table body (3 marks.)</dt>\n  <dd>This is pretty simple. The student just needs to include a <code>&lt;table&gt;</code> element in the page, with a <code>&lt;thead&gt;</code> and <code>&lt;tbody&gt;</code> as children.</dd>\n  <dt>Add the provided caption to your table. (2 marks)</dt>\n  <dd>Again, simple, but it needs it be put in the right place — the provided caption needs to be put in a <code>&lt;caption&gt;</code> element, right below the opening <code>&lt;table&gt;</code> tag.</dd>\n  <dt>Add a row to the table header containing all the column headers (5 marks).</dt>\n  <dd>The student needs to:\n    <ul>\n      <li>Put the cells of the row inside a <code>&lt;tr&gt;</code> element and use <code>&lt;th&gt;</code> elements for the cells because they are headers (2 marks).</li>\n      <li>Put the column header text in each cell correctly, copied from the raw data (1 mark).</li>\n      <li>Leave a two-column gap at the start of the row — this is best done with a single cell with <code>colspan=\"2\"</code> set on it, but we would accept two cells (2 marks).</dd>\n      <li>Note: Giving the planet names column a header of \"Name\" is recommended, but they won't lose a mark if they forget this.</li>\n    </ul>\n  </dd>\n  <dt>Create all the content rows inside the table body, remembering to make all the row headings into headings semantically (15 marks).</dt>\n  <dd>This is the most difficult part of the table — it requires getting all the group row headings in the right rows, and making them span the right number of rows and columns.\n    <ul>\n      <li>First of all, each row needs to be put inside the <code>&lt;tbody&gt;</code> (1 mark).</li>\n      <li>Each row needs to contain a <code>&lt;th&gt;</code> element containing the planet name at the start followed by nine <code>&lt;td&gt;</code> elements containing the planet's data (5 marks). Give full marks if this is mostly right with a couple of typos, but start to reduce the mark at your discretion if significant data points are wrong, wrongly placed, or omitted. Take two marks off if the planet names are not put in headers.</li>\n      <li>The first body row needs to contain an extra <code>&lt;th&gt;</code> element at the start of it, containing \"Terrestrial planets\", with <code>rowspan=\"4\"</code> and <code>colspan=\"2\"</code> (2 marks).</li>\n      <li>The fifth body row needs to contain two extra <code>&lt;th&gt;</code> elements at the start, containing \"Jovian planets\" and \"Gas giants\" respectively. The former needs <code>rowspan=\"4\"</code>, and the latter needs <code>rowspan=\"2\"</code> (3 marks).</li>\n      <li>The seventh body row needs to contain an extra <code>&lt;th&gt;</code> element at the start, containing \"Ice giants\", with <code>rowspan=\"2\"</code> (2 marks).</li>\n      <li>The ninth body row needs to contain an extra <code>&lt;th&gt;</code> element at the start, containing \"Dwarf planets\", with <code>colspan=\"2\"</code> (2 marks).</li>\n    </ul>\n  </dd>\n  <dt>Add attributes to make the row and column headers unambiguously associated with the rows, columns, or rowgroups that they act as headings for (5 marks).</dt>\n  <dd>\n    The student needs to add the <code>scope</code> value to all the <code>&lt;th&gt;</code> elements, giving them appropriate values as shown below:\n    <ul>\n      <li><code>col</code>: All the <code>&lt;th&gt;</code> elements in the table header row.</li>\n      <li><code>row</code>: All the <code>&lt;th&gt;</code> elements containing planet names, and the one containing \"Dwarf planets\" (it is also a heading over only one row).</li>\n      <li><code>rowgroup</code>: The <code>&lt;th&gt;</code> elements containing \"Terrestrial planets\", \"Jovian planets\", \"Gas giants\", and \"Ice giants\".</li>\n    </ul>\n  </dd>\n  <dt>Add a black border just around the column that contains all the planet name row headers (4 marks).</dt>\n  <dd>The easiest way to do this is to:\n    <ol>\n      <li>Add a <code>&lt;colgroup&gt;</code> element just below the <code>&lt;caption&gt;</code> element.</li>\n      <li>Inside this, nest two <code>&lt;col&gt;</code> elements, one with a <code>span=\"2\"</code> attribute, and the other with a <code>style</code> attribute along the lines of <code>style=\"border: 2px solid black\"</code>.</li>\n      <li>Notes: It would be acceptable to define all the columns in the table inside the colgroup, although you don't need to. Adding the style to each cell in the column individual would not be acceptable — this would put the styling around every cell in the column, not the column.</li>\n    </ol>\n  </dd>\n</dl>\n"
  },
  {
    "path": "html/tables/assessment-finished/minimal-table.css",
    "content": "html {\n  font-family: sans-serif;\n}\n\ntable {\n  border-collapse: collapse;\n  border: 2px solid rgb(200,200,200);\n  letter-spacing: 1px;\n  font-size: 0.8rem;\n}\n\ntd, th {\n  border: 1px solid rgb(190,190,190);\n  padding: 10px 20px;\n}\n\nth {\n  background-color: rgb(235,235,235);\n}\n\ntd {\n  text-align: center;\n}\n\ntr:nth-child(even) td {\n  background-color: rgb(250,250,250);\n}\n\ntr:nth-child(odd) td {\n  background-color: rgb(245,245,245);\n}\n\ncaption {\n  padding: 10px;\n}\n"
  },
  {
    "path": "html/tables/assessment-finished/planets-data.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Planets data</title>\n    <link href=\"minimal-table.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n  <body>\n    <h1>Planets data</h1>\n\n    <table>\n      <caption>Data about the planets of our solar system (Planetary facts taken from <a href=\"https://nssdc.gsfc.nasa.gov/planetary/factsheet/\">Nasa's Planetary Fact Sheet - Metric</a>).</caption>\n      <colgroup>\n        <col span=\"2\">\n        <col style=\"border: 2px solid black\">\n        <col span=\"9\">\n      </colgroup>\n      <thead>\n        <tr>\n          <td colspan=\"2\"></td>\n          <th scope=\"col\">Name</th>\n          <th scope=\"col\">Mass (10<sup>24</sup>kg)</th>\n          <th scope=\"col\">Diameter (km)</th>\n          <th scope=\"col\">Density (kg/m<sup>3</sup>)</th>\n          <th scope=\"col\">Gravity (m/s<sup>2</sup>)</th>\n          <th scope=\"col\">Length of day (hours)</th>\n          <th scope=\"col\">Distance from Sun (10<sup>6</sup>km)</th>\n          <th scope=\"col\">Mean temperature (°C)</th>\n          <th scope=\"col\">Number of moons</th>\n          <th scope=\"col\">Notes</th>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <th rowspan=\"4\" colspan=\"2\" scope=\"rowgroup\">Terrestrial planets</th>\n          <th scope=\"row\">Mercury</th>\n          <td>0.330</td>\n          <td>4,879</td>\n          <td>5427</td>\n          <td>3.7</td>\n          <td>4222.6</td>\n          <td>57.9</td>\n          <td>167</td>\n          <td>0</td>\n          <td>Closest to the Sun</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Venus</th>\n          <td>4.87</td>\n          <td>12,104</td>\n          <td>5243</td>\n          <td>8.9</td>\n          <td>2802.0</td>\n          <td>108.2</td>\n          <td>464</td>\n          <td>0</td>\n          <td></td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Earth</th>\n          <td>5.97</td>\n          <td>12,756</td>\n          <td>5514</td>\n          <td>9.8</td>\n          <td>24.0</td>\n          <td>149.6</td>\n          <td>15</td>\n          <td>1</td>\n          <td>Our world</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Mars</th>\n          <td>0.642</td>\n          <td>6,792</td>\n          <td>3933</td>\n          <td>3.7</td>\n          <td>24.7</td>\n          <td>227.9</td>\n          <td>-65</td>\n          <td>2</td>\n          <td>The red planet</td>\n        </tr>\n        <tr>\n          <th rowspan=\"4\" scope=\"rowgroup\">Jovian planets</th>\n          <th rowspan=\"2\" scope=\"rowgroup\">Gas giants</th>\n          <th scope=\"row\">Jupiter</th>\n          <td>1898</td>\n          <td>142,984</td>\n          <td>1326</td>\n          <td>23.1</td>\n          <td>9.9</td>\n          <td>778.6</td>\n          <td>-110</td>\n          <td>67</td>\n          <td>The largest planet</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Saturn</th>\n          <td>568</td>\n          <td>120,536</td>\n          <td>687</td>\n          <td>9.0</td>\n          <td>10.7</td>\n          <td>1433.5</td>\n          <td>-140</td>\n          <td>62</td>\n          <td></td>\n        </tr>\n        <tr>\n          <th rowspan=\"2\" scope=\"rowgroup\">Ice giants</th>\n          <th scope=\"row\">Uranus</th>\n          <td>86.8</td>\n          <td>51,118</td>\n          <td>1271</td>\n          <td>8.7</td>\n          <td>17.2</td>\n          <td>2872.5</td>\n          <td>-195</td>\n          <td>27</td>\n          <td></td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Neptune</th>\n          <td>102</td>\n          <td>49,528</td>\n          <td>1638</td>\n          <td>11.0</td>\n          <td>16.1</td>\n          <td>4495.1</td>\n          <td>-200</td>\n          <td>14</td>\n          <td></td>\n        </tr>\n        <tr>\n          <th colspan=\"2\" scope=\"row\">Dwarf planets</th>\n          <th scope=\"row\">Pluto</th>\n          <td>0.0146</td>\n          <td>2,370</td>\n          <td>2095</td>\n          <td>0.7</td>\n          <td>153.3</td>\n          <td>5906.4</td>\n          <td>-225</td>\n          <td>5</td>\n          <td>Declassified as a planet in 2006, but this <a href=\"https://www.usatoday.com/story/tech/2014/10/02/pluto-planet-solar-system/16578959/\">remains controversial</a>.</td>\n        </tr>\n      </tbody>\n    </table>\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "html/tables/assessment-start/blank-template.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Table template</title>\n    <link href=\"minimal-table.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n  <body>\n    <h1>Table template</h1>\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "html/tables/assessment-start/minimal-table.css",
    "content": "html {\n  font-family: sans-serif;\n}\n\ntable {\n  border-collapse: collapse;\n  border: 2px solid rgb(200,200,200);\n  letter-spacing: 1px;\n  font-size: 0.8rem;\n}\n\ntd, th {\n  border: 1px solid rgb(190,190,190);\n  padding: 10px 20px;\n}\n\nth {\n  background-color: rgb(235,235,235);\n}\n\ntd {\n  text-align: center;\n}\n\ntr:nth-child(even) td {\n  background-color: rgb(250,250,250);\n}\n\ntr:nth-child(odd) td {\n  background-color: rgb(245,245,245);\n}\n\ncaption {\n  padding: 10px;\n}\n"
  },
  {
    "path": "html/tables/assessment-start/planets-data.txt",
    "content": "Rows\n\nTerrestrial planets\n\nMercury 0.330 4,879 5427 3.7 4222.6 57.9 167 0 Closest to the Sun\nVenus 4.87 12,104 5243 8.9 2802.0 108.2 464 0\nEarth 5.97 12,756 5514 9.8 24.0 149.6 15 1 Our world\nMars 0.642 6,792 3933 3.7 24.7 227.9 -65 2 The red planet\n\nJovian planets\n\nGas giants\n\nJupiter 1898 142,984 1326 23.1 9.9 778.6 -110 67 The largest planet\nSaturn 568 120,536 687 9.0 10.7 1433.5 -140 62\n\nIce giants\n\nUranus 86.8 51,118 1271 8.7 17.2 2872.5 -195 27\nNeptune 102 49,528 1638 11.0 16.1 4495.1 -200 14\n\nDwarf planets*\n\nPluto 0.0146 2,370 2095 0.7 153.3 5906.4 -225 5 Declassified as a planet in 2006, but this <a href=\"http://www.usatoday.com/story/tech/2014/10/02/pluto-planet-solar-system/16578959/\">remains controversial</a>.\n\n\n\nColumns\n\nName\nMass (10<sup>24</sup>kg)\nDiameter (km)\nDensity (kg/m<sup>3</sup>)\nGravity (m/s<sup>2</sup>)\nLength of day (hours)\nDistance from Sun (10<sup>6</sup>km)\nMean temperature (°C)\nNumber of moons\nNotes\n\nCaption\n\nData about the planets of our solar system (Planetary facts taken from <a href=\"http://nssdc.gsfc.nasa.gov/planetary/factsheet/\">Nasa's Planetary Fact Sheet - Metric</a>).\n"
  },
  {
    "path": "html/tables/basic/animals-table-fixed.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Animals table</title>\n    <link href=\"minimal-table.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n  <body>\n    <h1>Animals table</h1>\n\n    <table>\n      <tr>\n        <th colspan=\"2\">Animals</th>\n      </tr>\n      <tr>\n        <th colspan=\"2\">Hippopotamus</th>\n      </tr>\n      <tr>\n        <th rowspan=\"2\">Horse</th>\n        <td>Mare</td>\n      </tr>\n      <tr>\n        <td>Stallion</td>\n      </tr>\n      <tr>\n        <th colspan=\"2\">Crocodile</th>\n      </tr>\n      <tr>\n        <th rowspan=\"2\">Chicken</th>\n        <td>Hen</td>\n      </tr>\n      <tr>\n        <td>Rooster</td>\n      </tr>\n    </table>\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "html/tables/basic/animals-table.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Animals table</title>\n    <link href=\"minimal-table.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n  <body>\n    <h1>Animals table</h1>\n\n    <table>\n      <tr>\n        <th>Animals</th>\n      </tr>\n      <tr>\n        <th>Hippopotamus</th>\n      </tr>\n      <tr>\n        <th>Horse</th>\n        <td>Mare</td>\n      </tr>\n      <tr>\n        <td>Stallion</td>\n      </tr>\n      <tr>\n        <th>Crocodile</th>\n      </tr>\n      <tr>\n        <th>Chicken</th>\n        <td>Hen</td>\n      </tr>\n      <tr>\n        <td>Rooster</td>\n      </tr>\n    </table>\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "html/tables/basic/blank-template.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Table template</title>\n    <link href=\"minimal-table.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n  <body>\n    <h1>Table template</h1>\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "html/tables/basic/dogs-table-fixed.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Dogs table</title>\n    <link href=\"minimal-table.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n  <body>\n    <h1>Dogs Table</h1>\n\n    <table>\n      <tr>\n        <td>&nbsp;</td>\n        <th scope=\"col\">Knocky</th>\n        <th scope=\"col\">Flor</th>\n        <th scope=\"col\">Ella</th>\n        <th scope=\"col\">Juan</th>\n      </tr>\n      <tr>\n        <th scope=\"row\">Breed</th>\n        <td>Jack Russell</td>\n        <td>Poodle</td>\n        <td>Streetdog</td>\n        <td>Cocker Spaniel</td>\n      </tr>\n      <tr>\n        <th scope=\"row\">Age</th>\n        <td>16</td>\n        <td>9</td>\n        <td>10</td>\n        <td>5</td>\n      </tr>\n      <tr>\n        <th scope=\"row\">Owner</th>\n        <td>Mother-in-law</td>\n        <td>Me</td>\n        <td>Me</td>\n        <td>Sister-in-law</td>\n      </tr>\n      <tr>\n        <th scope=\"row\">Eating Habits</th>\n        <td>Eats everyone's leftovers</td>\n        <td>Nibbles at food</td>\n        <td>Hearty eater</td>\n        <td>Will eat till he explodes</td>\n      </tr>\n    </table>\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "html/tables/basic/dogs-table.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Dogs table</title>\n    <link href=\"minimal-table.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n  <body>\n    <h1>Dogs Table</h1>\n\n    <table>\n      <tr>\n        <td>&nbsp;</td>\n        <td>Knocky</td>\n        <td>Flor</td>\n        <td>Ella</td>\n        <td>Juan</td>\n      </tr>\n      <tr>\n        <td>Breed</td>\n        <td>Jack Russell</td>\n        <td>Poodle</td>\n        <td>Streetdog</td>\n        <td>Cocker Spaniel</td>\n      </tr>\n      <tr>\n        <td>Age</td>\n        <td>16</td>\n        <td>9</td>\n        <td>10</td>\n        <td>5</td>\n      </tr>\n      <tr>\n        <td>Owner</td>\n        <td>Mother-in-law</td>\n        <td>Me</td>\n        <td>Me</td>\n        <td>Sister-in-law</td>\n      </tr>\n      <tr>\n        <td>Eating Habits</td>\n        <td>Eats everyone's leftovers</td>\n        <td>Nibbles at food</td>\n        <td>Hearty eater</td>\n        <td>Will eat till he explodes</td>\n      </tr>\n    </table>\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "html/tables/basic/minimal-table.css",
    "content": "html {\n  font-family: sans-serif;\n}\n\ntable {\n  border-collapse: collapse;\n  border: 2px solid rgb(200,200,200);\n  letter-spacing: 1px;\n  font-size: 0.8rem;\n}\n\ntd, th {\n  border: 1px solid rgb(190,190,190);\n  padding: 10px 20px;\n}\n\nth {\n  background-color: rgb(235,235,235);\n}\n\ntd {\n  text-align: center;\n}\n\ntr:nth-child(even) td {\n  background-color: rgb(250,250,250);\n}\n\ntr:nth-child(odd) td {\n  background-color: rgb(245,245,245);\n}\n\ncaption {\n  padding: 10px;\n}\n"
  },
  {
    "path": "html/tables/basic/personal-pronouns-styled.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Personal pronouns table</title>\n    <link href=\"minimal-table.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n  <body>\n    <h1>Personal pronouns table</h1>\n\n    <table>\n     <caption>Personal pronouns</caption>\n      <tr>\n       <td colspan=\"3\">&nbsp;</td>\n       <th scope=\"col\">Subject</th>\n       <th scope=\"col\">Object</th>\n      </tr>\n      <tr>\n       <th rowspan=\"5\" scope=\"rowgroup\">Singular</th>\n       <th colspan=\"2\" scope=\"row\">1st Person</th>\n       <td>I</td>\n       <td>me</td>\n      </tr>\n      <tr>\n       <th colspan=\"2\" scope=\"row\">2nd Person</th>\n       <td>you</td>\n       <td>you</td>\n      </tr>\n      <tr>\n       <th rowspan=\"3\" scope=\"rowgroup\">3rd Person</th>\n       <th class=\"symbol\" scope=\"row\">♂</th>\n       <td>he</td>\n       <td>him</td>\n      </tr>\n      <tr>\n       <th class=\"symbol\" scope=\"row\">♀</th>\n       <td>she</td>\n       <td>her</td>\n      </tr>\n      <tr>\n       <th class=\"symbol\" scope=\"row\">o</th>\n       <td>it</td>\n       <td>it</td>\n      </tr>\n      <tr>\n       <th rowspan=\"3\" scope=\"rowgroup\">Plural</th>\n       <th colspan=\"2\" scope=\"row\">1st Person</th>\n       <td>we</td>\n       <td>we</td>\n      </tr>\n      <tr>\n       <th colspan=\"2\" scope=\"row\">2nd Person</th>\n       <td>you</td>\n       <td>you</td>\n      </tr>\n      <tr>\n       <th colspan=\"2\" scope=\"row\">3rd Person</th>\n       <td>they</td>\n       <td>they</td>\n      </tr>\n    </table>\n  </body>\n</html>\n"
  },
  {
    "path": "html/tables/basic/personal-pronouns.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Personal pronouns table</title>\n  </head>\n  <body>\n    <h1>Personal pronouns table</h1>\n\n    <table>\n     <caption>Personal pronouns</caption>\n      <tr>\n       <td colspan=\"3\">&nbsp;</td>\n       <th scope=\"col\">Subject</th>\n       <th scope=\"col\">Object</th>\n      </tr>\n      <tr>\n       <th rowspan=\"5\" scope=\"rowgroup\">Singular</th>\n       <th colspan=\"2\" scope=\"row\">1st Person</th>\n       <td>I</td>\n       <td>me</td>\n      </tr>\n      <tr>\n       <th colspan=\"2\" scope=\"row\">2nd Person</th>\n       <td>you</td>\n       <td>you</td>\n      </tr>\n      <tr>\n       <th rowspan=\"3\" scope=\"rowgroup\">3rd Person</th>\n       <th class=\"symbol\" scope=\"row\">♂</th>\n       <td>he</td>\n       <td>him</td>\n      </tr>\n      <tr>\n       <th class=\"symbol\" scope=\"row\">♀</th>\n       <td>she</td>\n       <td>her</td>\n      </tr>\n      <tr>\n       <th class=\"symbol\" scope=\"row\">o</th>\n       <td>it</td>\n       <td>it</td>\n      </tr>\n      <tr>\n       <th rowspan=\"3\" scope=\"rowgroup\">Plural</th>\n       <th colspan=\"2\" scope=\"row\">1st Person</th>\n       <td>we</td>\n       <td>we</td>\n      </tr>\n      <tr>\n       <th colspan=\"2\" scope=\"row\">2nd Person</th>\n       <td>you</td>\n       <td>you</td>\n      </tr>\n      <tr>\n       <th colspan=\"2\" scope=\"row\">3rd Person</th>\n       <td>they</td>\n       <td>they</td>\n      </tr>\n    </table>\n  </body>\n</html>\n"
  },
  {
    "path": "html/tables/basic/simple-table.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple table</title>\n    <link href=\"minimal-table.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n  <body>\n    <h1>Simple table</h1>\n\n    <table>\n      <tr>\n        <td>Hi, I'm your first cell.</td>\n        <td>I'm your second cell.</td>\n        <td>I'm your third cell.</td>\n        <td>I'm your fourth cell.</td>\n      </tr>\n      <tr>\n        <td>Second row, first cell.</td>\n        <td>Cell 2.</td>\n        <td>Cell 3.</td>\n        <td>Cell 4.</td>\n      </tr>\n    </table>\n  </body>\n</html>\n"
  },
  {
    "path": "html/tables/basic/timetable-fixed.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>School timetable</title>\n    <style>\n    html {\n      font-family: sans-serif;\n    }\n\n    table {\n      border-collapse: collapse;\n      border: 2px solid rgb(200,200,200);\n      letter-spacing: 1px;\n      font-size: 0.8rem;\n    }\n\n    td, th {\n      border: 1px solid rgb(190,190,190);\n      padding: 10px 20px;\n    }\n\n    td {\n      text-align: center;\n    }\n\n    caption {\n      padding: 10px;\n    }\n    </style>\n  </head>\n  <body>\n    <h1>School timetable</h1>\n\n    <table>\n      <colgroup>\n        <col span=\"2\">\n        <col style=\"background-color:#97DB9A;\">\n        <col style=\"width:100px;\">\n        <col style=\"background-color:#97DB9A;\">\n        <col style=\"background-color:#DCC48E; border:4px solid #C1437A;\">\n        <col span=\"2\" style=\"width:100px;\">\n      </colgroup>\n      <tr>\n        <td>&nbsp;</td>\n        <th>Mon</th>\n        <th>Tues</th>\n        <th>Wed</th>\n        <th>Thurs</th>\n        <th>Fri</th>\n        <th>Sat</th>\n        <th>Sun</th>\n      </tr>\n      <tr>\n        <th>1st period</th>\n        <td>English</td>\n        <td>&nbsp;</td>\n        <td>&nbsp;</td>\n        <td>German</td>\n        <td>Dutch</td>\n        <td>&nbsp;</td>\n        <td>&nbsp;</td>\n      </tr>\n      <tr>\n        <th>2nd period</th>\n        <td>English</td>\n        <td>English</td>\n        <td>&nbsp;</td>\n        <td>German</td>\n        <td>Dutch</td>\n        <td>&nbsp;</td>\n        <td>&nbsp;</td>\n      </tr>\n      <tr>\n        <th>3rd period</th>\n        <td>&nbsp;</td>\n        <td>German</td>\n        <td>&nbsp;</td>\n        <td>German</td>\n        <td>Dutch</td>\n        <td>&nbsp;</td>\n        <td>&nbsp;</td>\n      </tr>\n      <tr>\n        <th>4th period</th>\n        <td>&nbsp;</td>\n        <td>English</td>\n        <td>&nbsp;</td>\n        <td>English</td>\n        <td>Dutch</td>\n        <td>&nbsp;</td>\n        <td>&nbsp;</td>\n      </tr>\n    </table>\n\n  </body>\n</html>\n"
  },
  {
    "path": "html/tables/basic/timetable.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>School timetable</title>\n    <style>\n    html {\n      font-family: sans-serif;\n    }\n\n    table {\n      border-collapse: collapse;\n      border: 2px solid rgb(200,200,200);\n      letter-spacing: 1px;\n      font-size: 0.8rem;\n    }\n\n    td, th {\n      border: 1px solid rgb(190,190,190);\n      padding: 10px 20px;\n    }\n\n    td {\n      text-align: center;\n    }\n\n    caption {\n      padding: 10px;\n    }\n    </style>\n  </head>\n  <body>\n    <h1>School timetable</h1>\n\n    <table>\n      <tr>\n        <td>&nbsp;</td>\n        <th>Mon</th>\n        <th>Tues</th>\n        <th>Wed</th>\n        <th>Thurs</th>\n        <th>Fri</th>\n        <th>Sat</th>\n        <th>Sun</th>\n      </tr>\n      <tr>\n        <th>1st period</th>\n        <td>English</td>\n        <td>&nbsp;</td>\n        <td>&nbsp;</td>\n        <td>German</td>\n        <td>Dutch</td>\n        <td>&nbsp;</td>\n        <td>&nbsp;</td>\n      </tr>\n      <tr>\n        <th>2nd period</th>\n        <td>English</td>\n        <td>English</td>\n        <td>&nbsp;</td>\n        <td>German</td>\n        <td>Dutch</td>\n        <td>&nbsp;</td>\n        <td>&nbsp;</td>\n      </tr>\n      <tr>\n        <th>3rd period</th>\n        <td>&nbsp;</td>\n        <td>German</td>\n        <td>&nbsp;</td>\n        <td>German</td>\n        <td>Dutch</td>\n        <td>&nbsp;</td>\n        <td>&nbsp;</td>\n      </tr>\n      <tr>\n        <th>4th period</th>\n        <td>&nbsp;</td>\n        <td>English</td>\n        <td>&nbsp;</td>\n        <td>English</td>\n        <td>Dutch</td>\n        <td>&nbsp;</td>\n        <td>&nbsp;</td>\n      </tr>\n    </table>\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/client-side-storage/cache-sw/video-store-offline/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>IndexedDB video store offline</title>\n    <link href=\"style.css\" rel=\"stylesheet\">\n    <script src=\"index.js\" defer></script>\n  </head>\n  <body>\n    <header>\n      <h1>IndexedDB video store with service worker</h1>\n    </header>\n\n    <main>\n      <section>\n\n      </section>\n    </main>\n\n    <footer>\n      <p>Copyright nobody. Use the code as you like.</p>\n    </footer>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/client-side-storage/cache-sw/video-store-offline/index.js",
    "content": "// Create constants\nconst section = document.querySelector('section');\nconst videos = [\n  { 'name' : 'crystal' },\n  { 'name' : 'elf' },\n  { 'name' : 'frog' },\n  { 'name' : 'monster' },\n  { 'name' : 'pig' },\n  { 'name' : 'rabbit' }\n];\n// Create an instance of a db object for us to store our database in\nlet db;\n\nfunction init() {\n  // Loop through the video names one by one\n  for(const video of videos) {\n    // Open transaction, get object store, and get() each video by name\n    const objectStore = db.transaction('videos_os').objectStore('videos_os');\n    const request = objectStore.get(video.name);\n    request.addEventListener('success', () => {\n      // If the result exists in the database (is not undefined)\n      if(request.result) {\n        // Grab the videos from IDB and display them using displayVideo()\n        console.log('taking videos from IDB');\n        displayVideo(request.result.mp4, request.result.webm, request.result.name);\n      } else {\n        // Fetch the videos from the network\n        fetchVideoFromNetwork(video);\n      }\n    });\n  }\n}\n\n// Define the fetchVideoFromNetwork() function\nfunction fetchVideoFromNetwork(video) {\n  console.log('fetching videos from network');\n  // Fetch the MP4 and WebM versions of the video using the fetch() function,\n  // then expose their response bodies as blobs\n  const mp4Blob = fetch(`videos/${video.name}.mp4`).then(response => response.blob());\n  const webmBlob = fetch(`videos/${video.name}.webm`).then(response => response.blob());\n\n  // Only run the next code when both promises have fulfilled\n  Promise.all([mp4Blob, webmBlob]).then(values => {\n    // display the video fetched from the network with displayVideo()\n    displayVideo(values[0], values[1], video.name);\n    // store it in the IDB using storeVideo()\n    storeVideo(values[0], values[1], video.name);\n  });\n}\n\n// Define the storeVideo() function\nfunction storeVideo(mp4Blob, webmBlob, name) {\n  // Open transaction, get object store; make it a readwrite so we can write to the IDB\n  const objectStore = db.transaction(['videos_os'], 'readwrite').objectStore('videos_os');\n  // Create a record to add to the IDB\n  const record = {\n    mp4 : mp4Blob,\n    webm : webmBlob,\n    name : name\n  }\n\n  // Add the record to the IDB using add()\n  const request = objectStore.add(record);\n\n  request.addEventListener('success', () => console.log('Record addition attempt finished'));\n  request.addEventListener('error', () => console.error(request.error));\n}\n\n// Define the displayVideo() function\nfunction displayVideo(mp4Blob, webmBlob, title) {\n  // Create object URLs out of the blobs\n  const mp4URL = URL.createObjectURL(mp4Blob);\n  const webmURL = URL.createObjectURL(webmBlob);\n\n  // Create DOM elements to embed video in the page\n  const article = document.createElement('article');\n  const h2 = document.createElement('h2');\n  h2.textContent = title;\n  const video = document.createElement('video');\n  video.controls = true;\n  const source1 = document.createElement('source');\n  source1.src = mp4URL;\n  source1.type = 'video/mp4';\n  const source2 = document.createElement('source');\n  source2.src = webmURL;\n  source2.type = 'video/webm';\n\n  // Embed DOM elements into page\n  section.appendChild(article);\n  article.appendChild(h2);\n  article.appendChild(video);\n  video.appendChild(source1);\n  video.appendChild(source2);\n}\n\n// Open our database; it is created if it doesn't already exist\n// (see upgradeneeded below)\nconst request = window.indexedDB.open('videos_db', 1);\n\n// error handler signifies that the database didn't open successfully\nrequest.addEventListener('error', () => console.error('Database failed to open'));\n\n// success handler signifies that the database opened successfully\nrequest.addEventListener('success', () => {\n  console.log('Database opened successfully');\n\n  // Store the opened database object in the db variable. This is used a lot below\n  db = request.result;\n  init();\n});\n\n// Setup the database tables if this has not already been done\nrequest.addEventListener('upgradeneeded', e => {\n\n  // Grab a reference to the opened database\n  const db = e.target.result;\n\n  // Create an objectStore to store our videos in (basically like a single table)\n  // including a auto-incrementing key\n  const objectStore = db.createObjectStore('videos_os', { keyPath: 'name' });\n\n  // Define what data items the objectStore will contain\n  objectStore.createIndex('mp4', 'mp4', { unique: false });\n  objectStore.createIndex('webm', 'webm', { unique: false });\n\n  console.log('Database setup complete');\n});\n\n// Register service worker to control making site work offline\nif('serviceWorker' in navigator) {\n  navigator.serviceWorker\n    .register('/learning-area/javascript/apis/client-side-storage/cache-sw/video-store-offline/sw.js')\n    .then(() => console.log('Service Worker Registered'));\n}\n"
  },
  {
    "path": "javascript/apis/client-side-storage/cache-sw/video-store-offline/style.css",
    "content": "html {\n  font-family: sans-serif;\n}\n\nbody {\n  margin: 0 auto;\n  max-width: 800px;\n}\n\nheader, footer {\n  background-color: green;\n  color: white;\n  line-height: 100px;\n  padding: 0 20px;\n}\n\narticle {\n  padding: 10px;\n  margin: 10px 0;\n  border: 1px solid black;\n  background-color: #eee;\n}\n\nh2 {\n  margin: 10px 0;\n}\n\nvideo {\n  margin: 0 auto;\n  border: 1px solid black;\n  display: block;\n}\n\nbutton {\n  display: block;\n  margin-top: 10px;\n}\n"
  },
  {
    "path": "javascript/apis/client-side-storage/cache-sw/video-store-offline/sw.js",
    "content": "self.addEventListener('install', e => {\n e.waitUntil(\n   caches.open('video-store').then(function(cache) {\n     return cache.addAll([\n       '/learning-area/javascript/apis/client-side-storage/cache-sw/video-store-offline/',\n       '/learning-area/javascript/apis/client-side-storage/cache-sw/video-store-offline/index.html',\n       '/learning-area/javascript/apis/client-side-storage/cache-sw/video-store-offline/index.js',\n       '/learning-area/javascript/apis/client-side-storage/cache-sw/video-store-offline/style.css'\n     ]);\n   })\n );\n});\n\nself.addEventListener('fetch', e => {\n  console.log(e.request.url);\n  e.respondWith(\n    caches.match(e.request).then(response => response || fetch(e.request))\n  );\n});\n"
  },
  {
    "path": "javascript/apis/client-side-storage/indexeddb/notes/index-start.js",
    "content": "// Create needed constants\nconst list = document.querySelector('ul');\nconst titleInput = document.querySelector('#title');\nconst bodyInput = document.querySelector('#body');\nconst form = document.querySelector('form');\nconst submitBtn = document.querySelector('form button');\n"
  },
  {
    "path": "javascript/apis/client-side-storage/indexeddb/notes/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>IndexedDB demo</title>\n    <link href=\"style.css\" rel=\"stylesheet\">\n    <script src=\"index.js\" defer></script>\n  </head>\n  <body>\n    <header>\n      <h1>IndexedDB notes demo</h1>\n    </header>\n\n    <main>\n      <section class=\"note-display\">\n        <h2>Notes</h2>\n        <ul>\n\n        </ul>\n      </section>\n      <section class=\"new-note\">\n        <h2>Enter a new note</h2>\n        <form>\n          <div>\n            <label for=\"title\">Note title</label>\n            <input id=\"title\" type=\"text\" required>\n          </div>\n          <div>\n            <label for=\"body\">Note text</label>\n            <input id=\"body\" type=\"text\" required>\n          </div>\n          <div>\n            <button>Create new note</button>\n          </div>\n        </form>\n      </section>\n    </main>\n\n    <footer>\n      <p>Copyright nobody. Use the code as you like.</p>\n    </footer>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/client-side-storage/indexeddb/notes/index.js",
    "content": "// Create needed constants\nconst list = document.querySelector('ul');\nconst titleInput = document.querySelector('#title');\nconst bodyInput = document.querySelector('#body');\nconst form = document.querySelector('form');\nconst submitBtn = document.querySelector('form button');\n\n// Create an instance of a db object for us to store the open database in\nlet db;\n\n// Open our database; it is created if it doesn't already exist\n// (see the upgradeneeded handler below)\nconst openRequest = window.indexedDB.open('notes_db', 1);\n\n// error handler signifies that the database didn't open successfully\nopenRequest.addEventListener('error', () => console.error('Database failed to open'));\n\n// success handler signifies that the database opened successfully\nopenRequest.addEventListener('success', () => {\n  console.log('Database opened successfully');\n\n  // Store the opened database object in the db variable. This is used a lot below\n  db = openRequest.result;\n\n  // Run the displayData() function to display the notes already in the IDB\n  displayData();\n});\n\n// Set up the database tables if this has not already been done\nopenRequest.addEventListener('upgradeneeded', e => {\n\n  // Grab a reference to the opened database\n  db = e.target.result;\n\n  // Create an objectStore to store our notes in (basically like a single table)\n  // including a auto-incrementing key\n  const objectStore = db.createObjectStore('notes_os', { keyPath: 'id', autoIncrement:true });\n\n  // Define what data items the objectStore will contain\n  objectStore.createIndex('title', 'title', { unique: false });\n  objectStore.createIndex('body', 'body', { unique: false });\n\n  console.log('Database setup complete');\n});\n\n// Create an submit handler so that when the form is submitted the addData() function is run\nform.addEventListener('submit', addData);\n\n// Define the addData() function\nfunction addData(e) {\n  // prevent default - we don't want the form to submit in the conventional way\n  e.preventDefault();\n\n  // grab the values entered into the form fields and store them in an object ready for being inserted into the DB\n  const newItem = { title: titleInput.value, body: bodyInput.value };\n\n  // open a read/write db transaction, ready for adding the data\n  const transaction = db.transaction(['notes_os'], 'readwrite');\n\n  // call an object store that's already been added to the database\n  const objectStore = transaction.objectStore('notes_os');\n\n  // Make a request to add our newItem object to the object store\n  const addRequest = objectStore.add(newItem);\n\n  addRequest.addEventListener('success', () => {\n    // Clear the form, ready for adding the next entry\n    titleInput.value = '';\n    bodyInput.value = '';\n  });\n\n  // Report on the success of the transaction completing, when everything is done\n  transaction.addEventListener('complete', () => {\n    console.log('Transaction completed: database modification finished.');\n\n    // update the display of data to show the newly added item, by running displayData() again.\n    displayData();\n  });\n\n  transaction.addEventListener('error', () => console.log('Transaction not opened due to error'));\n}\n\n// Define the displayData() function\nfunction displayData() {\n  // Here we empty the contents of the list element each time the display is updated\n  // If you ddn't do this, you'd get duplicates listed each time a new note is added\n  while (list.firstChild) {\n    list.removeChild(list.firstChild);\n  }\n\n  // Open our object store and then get a cursor - which iterates through all the\n  // different data items in the store\n  const objectStore = db.transaction('notes_os').objectStore('notes_os');\n  objectStore.openCursor().addEventListener('success', e => {\n    // Get a reference to the cursor\n    const cursor = e.target.result;\n\n    // If there is still another data item to iterate through, keep running this code\n    if(cursor) {\n      // Create a list item, h3, and p to put each data item inside when displaying it\n      // structure the HTML fragment, and append it inside the list\n      const listItem = document.createElement('li');\n      const h3 = document.createElement('h3');\n      const para = document.createElement('p');\n\n      listItem.appendChild(h3);\n      listItem.appendChild(para);\n      list.appendChild(listItem);\n\n      // Put the data from the cursor inside the h3 and para\n      h3.textContent = cursor.value.title;\n      para.textContent = cursor.value.body;\n\n      // Store the ID of the data item inside an attribute on the listItem, so we know\n      // which item it corresponds to. This will be useful later when we want to delete items\n      listItem.setAttribute('data-note-id', cursor.value.id);\n\n      // Create a button and place it inside each listItem\n      const deleteBtn = document.createElement('button');\n      listItem.appendChild(deleteBtn);\n      deleteBtn.textContent = 'Delete';\n\n      // Set an event handler so that when the button is clicked, the deleteItem()\n      // function is run\n      deleteBtn.addEventListener('click', deleteItem);\n\n      // Iterate to the next item in the cursor\n      cursor.continue();\n    } else {\n      // Again, if list item is empty, display a 'No notes stored' message\n      if(!list.firstChild) {\n        const listItem = document.createElement('li');\n        listItem.textContent = 'No notes stored.'\n        list.appendChild(listItem);\n      }\n      // if there are no more cursor items to iterate through, say so\n      console.log('Notes all displayed');\n    }\n  });\n}\n\n// Define the deleteItem() function\nfunction deleteItem(e) {\n  // retrieve the name of the task we want to delete. We need\n  // to convert it to a number before trying it use it with IDB; IDB key\n  // values are type-sensitive.\n  const noteId = Number(e.target.parentNode.getAttribute('data-note-id'));\n\n  // open a database transaction and delete the task, finding it using the id we retrieved above\n  const transaction = db.transaction(['notes_os'], 'readwrite');\n  const objectStore = transaction.objectStore('notes_os');\n  const deleteRequest = objectStore.delete(noteId);\n\n  // report that the data item has been deleted\n  transaction.addEventListener('complete', () => {\n    // delete the parent of the button\n    // which is the list item, so it is no longer displayed\n    e.target.parentNode.parentNode.removeChild(e.target.parentNode);\n    console.log(`Note ${noteId} deleted.`);\n\n    // Again, if list item is empty, display a 'No notes stored' message\n    if(!list.firstChild) {\n      const listItem = document.createElement('li');\n      listItem.textContent = 'No notes stored.';\n      list.appendChild(listItem);\n    }\n  });\n}\n"
  },
  {
    "path": "javascript/apis/client-side-storage/indexeddb/notes/style.css",
    "content": "html {\n  font-family: sans-serif;\n}\n\nbody {\n  margin: 0 auto;\n  max-width: 800px;\n}\n\nheader, footer {\n  background-color: green;\n  color: white;\n  line-height: 100px;\n  padding: 0 20px;\n}\n\n.new-note, .note-display {\n  padding: 20px;\n}\n\n.new-note {\n  background: #ddd;\n}\n\nh1 {\n  margin: 0;\n}\n\nul {\n  list-style-type: none;\n}\n\ndiv {\n  margin-bottom: 10px;\n}\n"
  },
  {
    "path": "javascript/apis/client-side-storage/indexeddb/video-store/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>IndexedDB video store</title>\n    <link href=\"style.css\" rel=\"stylesheet\">\n    <script src=\"index.js\" defer></script>\n  </head>\n  <body>\n    <header>\n      <h1>IndexedDB video store</h1>\n    </header>\n\n    <main>\n      <section>\n        \n      </section>\n    </main>\n\n    <footer>\n      <p>Copyright nobody. Use the code as you like.</p>\n    </footer>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/client-side-storage/indexeddb/video-store/index.js",
    "content": "// Create constants\nconst section = document.querySelector('section');\nconst videos = [\n  { 'name' : 'crystal' },\n  { 'name' : 'elf' },\n  { 'name' : 'frog' },\n  { 'name' : 'monster' },\n  { 'name' : 'pig' },\n  { 'name' : 'rabbit' }\n];\n// Create an instance of a db object for us to store our database in\nlet db;\n\nfunction init() {\n  // Loop through the video names one by one\n  for(const video of videos) {\n    // Open transaction, get object store, and get() each video by name\n    const objectStore = db.transaction('videos_os').objectStore('videos_os');\n    const request = objectStore.get(video.name);\n    request.addEventListener('success', () => {\n      // If the result exists in the database (is not undefined)\n      if(request.result) {\n        // Grab the videos from IDB and display them using displayVideo()\n        console.log('taking videos from IDB');\n        displayVideo(request.result.mp4, request.result.webm, request.result.name);\n      } else {\n        // Fetch the videos from the network\n        fetchVideoFromNetwork(video);\n      }\n    });\n  }\n}\n\n// Define the fetchVideoFromNetwork() function\nfunction fetchVideoFromNetwork(video) {\n  console.log('fetching videos from network');\n  // Fetch the MP4 and WebM versions of the video using the fetch() function,\n  // then expose their response bodies as blobs\n  const mp4Blob = fetch(`videos/${video.name}.mp4`).then(response => response.blob());\n  const webmBlob = fetch(`videos/${video.name}.webm`).then(response => response.blob());\n\n  // Only run the next code when both promises have fulfilled\n  Promise.all([mp4Blob, webmBlob]).then(values => {\n    // display the video fetched from the network with displayVideo()\n    displayVideo(values[0], values[1], video.name);\n    // store it in the IDB using storeVideo()\n    storeVideo(values[0], values[1], video.name);\n  });\n}\n\n// Define the storeVideo() function\nfunction storeVideo(mp4Blob, webmBlob, name) {\n  // Open transaction, get object store; make it a readwrite so we can write to the IDB\n  const objectStore = db.transaction(['videos_os'], 'readwrite').objectStore('videos_os');\n  // Create a record to add to the IDB\n  const record = {\n    mp4 : mp4Blob,\n    webm : webmBlob,\n    name : name\n  }\n\n  // Add the record to the IDB using add()\n  const request = objectStore.add(record);\n\n  request.addEventListener('success', () => console.log('Record addition attempt finished'));\n  request.addEventListener('error', () => console.error(request.error));\n}\n\n// Define the displayVideo() function\nfunction displayVideo(mp4Blob, webmBlob, title) {\n  // Create object URLs out of the blobs\n  const mp4URL = URL.createObjectURL(mp4Blob);\n  const webmURL = URL.createObjectURL(webmBlob);\n\n  // Create DOM elements to embed video in the page\n  const article = document.createElement('article');\n  const h2 = document.createElement('h2');\n  h2.textContent = title;\n  const video = document.createElement('video');\n  video.controls = true;\n  const source1 = document.createElement('source');\n  source1.src = mp4URL;\n  source1.type = 'video/mp4';\n  const source2 = document.createElement('source');\n  source2.src = webmURL;\n  source2.type = 'video/webm';\n\n  // Embed DOM elements into page\n  section.appendChild(article);\n  article.appendChild(h2);\n  article.appendChild(video);\n  video.appendChild(source1);\n  video.appendChild(source2);\n}\n\n// Open our database; it is created if it doesn't already exist\n// (see upgradeneeded below)\nconst request = window.indexedDB.open('videos_db', 1);\n\n// error handler signifies that the database didn't open successfully\nrequest.addEventListener('error', () => console.error('Database failed to open'));\n\n// success handler signifies that the database opened successfully\nrequest.addEventListener('success', () => {\n  console.log('Database opened successfully');\n\n  // Store the opened database object in the db variable. This is used a lot below\n  db = request.result;\n  init();\n});\n\n// Setup the database tables if this has not already been done\nrequest.addEventListener('upgradeneeded', e => {\n\n  // Grab a reference to the opened database\n  const db = e.target.result;\n\n  // Create an objectStore to store our videos in (basically like a single table)\n  // including a auto-incrementing key\n  const objectStore = db.createObjectStore('videos_os', { keyPath: 'name' });\n\n  // Define what data items the objectStore will contain\n  objectStore.createIndex('mp4', 'mp4', { unique: false });\n  objectStore.createIndex('webm', 'webm', { unique: false });\n\n  console.log('Database setup complete');\n});\n"
  },
  {
    "path": "javascript/apis/client-side-storage/indexeddb/video-store/style.css",
    "content": "html {\n  font-family: sans-serif;\n}\n\nbody {\n  margin: 0 auto;\n  max-width: 800px;\n}\n\nheader, footer {\n  background-color: green;\n  color: white;\n  line-height: 100px;\n  padding: 0 20px;\n}\n\narticle {\n  padding: 10px;\n  margin: 10px 0;\n  border: 1px solid black;\n  background-color: #eee;\n}\n\nh2 {\n  margin: 10px 0;\n}\n\nvideo {\n  margin: 0 auto;\n  border: 1px solid black;\n  display: block;\n}\n\nbutton {\n  display: block;\n  margin-top: 10px;\n}\n"
  },
  {
    "path": "javascript/apis/client-side-storage/web-storage/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Web storage demo</title>\n  </head>\n  <body>\n    <h1>Web storage demo</h1>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/client-side-storage/web-storage/index.js",
    "content": "// create needed constants\nconst rememberDiv = document.querySelector('.remember');\nconst forgetDiv = document.querySelector('.forget');\nconst form = document.querySelector('form');\nconst nameInput = document.querySelector('#entername');\nconst submitBtn = document.querySelector('#submitname');\nconst forgetBtn = document.querySelector('#forgetname');\n\nconst h1 = document.querySelector('h1');\nconst personalGreeting = document.querySelector('.personal-greeting');\n\n// Stop the form from submitting when a button is pressed\nform.addEventListener('submit', e => e.preventDefault());\n\n// run function when the 'Say hello' button is clicked\nsubmitBtn.addEventListener('click', () => {\n  // store the entered name in web storage\n  localStorage.setItem('name', nameInput.value);\n  // run nameDisplayCheck() to sort out displaying the personalized greetings and updating the form display\n  nameDisplayCheck();\n});\n\n// run function when the 'Forget' button is clicked\nforgetBtn.addEventListener('click', () => {\n  // Remove the stored name from web storage\n  localStorage.removeItem('name');\n  // run nameDisplayCheck() to sort out displaying the generic greeting again and updating the form display\n  nameDisplayCheck();\n});\n\n// define the nameDisplayCheck() function\nfunction nameDisplayCheck() {\n  // check whether the 'name' data item is stored in web Storage\n  if(localStorage.getItem('name')) {\n    // If it is, display personalized greeting\n    const name = localStorage.getItem('name');\n    h1.textContent = `Welcome, ${name}`;\n    personalGreeting.textContent = `Welcome to our website, ${name}! We hope you have fun while you are here.`;\n    // hide the 'remember' part of the form and show the 'forget' part\n    forgetDiv.style.display = 'block';\n    rememberDiv.style.display = 'none';\n  } else {\n    // if not, display generic greeting\n    h1.textContent = 'Welcome to our website ';\n    personalGreeting.textContent = 'Welcome to our website. We hope you have fun while you are here.';\n    // hide the 'forget' part of the form and show the 'remember' part\n    forgetDiv.style.display = 'none';\n    rememberDiv.style.display = 'block';\n  }\n}\n\n// run nameDisplayCheck() when the page first loads to check wether a personal name was previously\n// set, and if so display the personalized greeting. If not, show the generic greeting\nnameDisplayCheck();\n"
  },
  {
    "path": "javascript/apis/client-side-storage/web-storage/personal-greeting.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Personal greeting</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      body {\n        margin: 0 auto;\n        max-width: 1024px;\n      }\n\n      main {\n        padding: 20px;\n      }\n\n      header, footer {\n        background: cyan;\n        padding: 20px;\n        border: 1px solid black;\n      }\n\n      header {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n      }\n\n      form {\n        font-size: 0.8rem;\n      }\n\n      .personal-greeting {\n        font-weight: bold;\n      }\n    </style>\n    <script src=\"index.js\" defer></script>\n  </head>\n  <body>\n    <header>\n      <h1>Our website</h1>\n\n      <form>\n        <div class=\"remember\">\n          <label for=\"entername\">Enter your name:</label>\n          <input id=\"entername\" type=\"text\" required>\n          <input id=\"submitname\" type=\"submit\" value=\"Say hello\">\n        </div>\n        <div class=\"forget\">\n          <label for=\"forgetname\">Want me to forget you?</label>\n          <input id=\"forgetname\" type=\"reset\" value=\"Forget\">\n        </div>\n      </form>\n    </header>\n\n    <main>\n\n      <p class=\"personal-greeting\">Welcome to our website.</p>\n\n      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam malesuada, metus ut mollis volutpat, felis est rhoncus turpis, in blandit est risus malesuada dui. Phasellus tempus elit at purus vestibulum suscipit. Donec quis est nec dui pretium venenatis sit amet eu nulla. Donec finibus, ipsum non semper dignissim, massa magna sagittis est, vitae vehicula nunc magna vitae diam. Integer ultrices mauris aliquet arcu tempor, at mattis justo sagittis. Nunc ut nulla et erat viverra tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer vitae bibendum justo. Vestibulum porta velit sit amet libero accumsan fermentum.</p>\n\n      <p>Ut id mauris urna. In sed porttitor lectus. Suspendisse dignissim dolor id lectus pellentesque, eu bibendum lectus malesuada. Phasellus volutpat sollicitudin suscipit. Donec id libero nisl. Praesent gravida purus vel euismod facilisis. Maecenas sit amet velit non lacus aliquam dictum vitae eu augue. Donec euismod enim elementum elit laoreet sodales. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>\n\n      <p>Integer vulputate, libero sed vulputate eleifend, magna libero malesuada ligula, sit amet tincidunt dui mi vitae mauris. Aliquam aliquam turpis mauris, in sagittis orci rutrum efficitur. Sed vel purus fringilla, pretium sapien sed, accumsan erat. Morbi scelerisque tempor purus in faucibus. Nunc fringilla nulla ut aliquam posuere. Vivamus id lectus eleifend, bibendum urna non, ornare nibh. Fusce bibendum vulputate mollis.</p>\n\n    </main>\n\n    <footer>\n      <p>Copyright nobody. Use the code as you like.</p>\n    </footer>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/document-manipulation/dom-example-manipulated.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Simple DOM example</title>\n    <style>\n      .highlight {\n        color: white;\n        background-color: black;\n        padding: 10px;\n        width: 250px;\n        text-align: center;\n      }\n    </style>\n  </head>\n  <body>\n    <section>\n      <img src=\"dinosaur.png\" alt=\"A red Tyrannosaurus Rex: A two legged dinosaur standing upright like a human, with small arms, and a large head with lots of sharp teeth.\">\n      <p>Here we will add a link to the <a href=\"https://www.mozilla.org/\">Mozilla homepage</a></p>\n    </section>\n\n    <script>\n      const link = document.querySelector('a');\n      link.textContent = 'Mozilla Developer Network';\n      link.href = 'https://developer.mozilla.org';\n\n      const sect = document.querySelector('section');\n      const para = document.createElement('p');\n      para.textContent = 'We hope you enjoyed the ride.';\n      sect.appendChild(para);\n\n      const text = document.createTextNode(' — the premier source for web development knowledge.');\n      const linkPara = document.querySelector('p');\n      linkPara.appendChild(text);\n\n      // You could clone link para by doing something like this and inserting the new para instead\n      // var newPara = linkPara.cloneNode(true);\n\n      sect.appendChild(linkPara);\n      linkPara.parentNode.removeChild(linkPara);\n\n      para.setAttribute('class', 'highlight');\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/document-manipulation/dom-example.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Simple DOM example</title>\n  </head>\n  <body>\n      <section>\n        <img src=\"dinosaur.png\" alt=\"A red Tyrannosaurus Rex: A two legged dinosaur standing upright like a human, with small arms, and a large head with lots of sharp teeth.\">\n        <p>Here we will add a link to the <a href=\"https://www.mozilla.org/\">Mozilla homepage</a></p>\n      </section>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/document-manipulation/shopping-list-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Shopping list example</title>\n    <style>\n      li {\n        margin-bottom: 10px;\n      }\n\n      li button {\n        font-size: 12px;\n        margin-left: 20px;\n        color: #666;\n      }\n    </style>\n  </head>\n  <body>\n\n    <h1>My shopping list</h1>\n\n    <form>\n      <label for=\"item\">Enter a new item:</label>\n      <input type=\"text\" name=\"item\" id=\"item\">\n      <button>Add item</button>\n    </form>\n\n    <ul>\n\n    </ul>\n\n    <script>\n      const list = document.querySelector('ul');\n      const input = document.querySelector('input');\n      const button = document.querySelector('button');\n\n      button.addEventListener('click', (event) => {\n        event.preventDefault();\n\n        const myItem = input.value;\n        input.value = '';\n\n        const listItem = document.createElement('li');\n        const listText = document.createElement('span');\n        const listBtn = document.createElement('button');\n\n        listItem.appendChild(listText);\n        listText.textContent = myItem;\n        listItem.appendChild(listBtn);\n        listBtn.textContent = 'Delete';\n        list.appendChild(listItem);\n\n        listBtn.addEventListener('click', () => {\n          list.removeChild(listItem);\n        });\n\n        input.focus();\n      });\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/document-manipulation/shopping-list.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Shopping list example</title>\n    <style>\n      li {\n        margin-bottom: 10px;\n      }\n\n      li button {\n        font-size: 12px;\n        margin-left: 20px;\n        color: #666;\n      }\n    </style>\n  </head>\n  <body>\n\n    <h1>My shopping list</h1>\n\n    <form>\n      <label for=\"item\">Enter a new item:</label>\n      <input type=\"text\" name=\"item\" id=\"item\">\n      <button>Add item</button>\n    </form>\n\n    <ul>\n\n    </ul>\n\n    <script>\n\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/0_canvas_start/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Canvas</title>\n    <script src=\"script.js\" defer></script>\n    <link href=\"style.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/0_canvas_start/script.js",
    "content": ""
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/0_canvas_start/style.css",
    "content": "body {\n  margin: 0;\n  overflow: hidden;\n}\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/1_canvas_template/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Canvas</title>\n    <script src=\"script.js\" defer></script>\n    <link href=\"style.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <canvas class=\"myCanvas\">\n      <p>Add suitable fallback here.</p>\n    </canvas>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/1_canvas_template/script.js",
    "content": "const canvas = document.querySelector('.myCanvas');\nconst width = canvas.width = window.innerWidth;\nconst height = canvas.height = window.innerHeight;\nconst ctx = canvas.getContext('2d');\n\nctx.fillStyle = 'rgb(0,0,0)';\nctx.fillRect(0,0,width,height);\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/1_canvas_template/style.css",
    "content": "body {\n  margin: 0;\n  overflow: hidden;\n}\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/2_canvas_rectangles/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Canvas</title>\n    <script src=\"script.js\" defer></script>\n    <link href=\"style.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <canvas class=\"myCanvas\">\n      <p>Add suitable fallback here.</p>\n    </canvas>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/2_canvas_rectangles/script.js",
    "content": "const canvas = document.querySelector('.myCanvas');\nconst width = canvas.width = window.innerWidth;\nconst height = canvas.height = window.innerHeight;\nconst ctx = canvas.getContext('2d');\n\nctx.fillStyle = 'rgb(0,0,0)';\nctx.fillRect(0,0,width,height);\n\nctx.fillStyle = 'rgb(255,0,0)';\nctx.fillRect(50,50,100,150);\n\nctx.fillStyle = 'rgb(0,255,0)';\nctx.fillRect(75,75,100,100);\n\nctx.fillStyle = 'rgba(255,0,255,0.75)';\nctx.fillRect(25,100,175,50);\n\nctx.strokeStyle = 'rgb(255,255,255)';\nctx.lineWidth = 5;\nctx.strokeRect(25,25,175,200);\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/2_canvas_rectangles/style.css",
    "content": "body {\n  margin: 0;\n  overflow: hidden;\n}\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/3_canvas_paths/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Canvas</title>\n    <script src=\"script.js\" defer></script>\n    <link href=\"style.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <canvas class=\"myCanvas\">\n      <p>Add suitable fallback here.</p>\n    </canvas>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/3_canvas_paths/script.js",
    "content": "const canvas = document.querySelector('.myCanvas');\nconst width = canvas.width = window.innerWidth;\nconst height = canvas.height = window.innerHeight;\nconst ctx = canvas.getContext('2d');\n\nctx.fillStyle = 'rgb(0,0,0)';\nctx.fillRect(0,0,width,height);\n\nfunction degToRad(degrees) {\n  return degrees * Math.PI / 180;\n};\n\nctx.fillStyle = 'rgb(255,0,0)';\nctx.beginPath();\nctx.moveTo(50,50);\nctx.lineTo(150,50);\nconst triHeight = 50 * Math.tan(degToRad(60));\nctx.lineTo(100,50+triHeight);\nctx.lineTo(50,50);\nctx.fill();\n\nctx.fillStyle = 'rgb(0,0,255)';\nctx.beginPath();\nctx.arc(150, 106, 50, degToRad(0), degToRad(360), false);\nctx.fill()\n\nctx.fillStyle = 'yellow';\nctx.beginPath();\nctx.arc(200, 106, 50, degToRad(-45), degToRad(45), true);\nctx.lineTo(200,106);\nctx.fill();\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/3_canvas_paths/style.css",
    "content": "body {\n  margin: 0;\n  overflow: hidden;\n}\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/4_canvas_text/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Canvas</title>\n    <script src=\"script.js\" defer></script>\n    <link href=\"style.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <canvas class=\"myCanvas\">\n      <p>Add suitable fallback here.</p>\n    </canvas>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/4_canvas_text/script.js",
    "content": "const canvas = document.querySelector('.myCanvas');\nconst width = canvas.width = window.innerWidth;\nconst height = canvas.height = window.innerHeight;\nconst ctx = canvas.getContext('2d');\n\nctx.fillStyle = 'rgb(0,0,0)';\nctx.fillRect(0,0,width,height);\n\nctx.strokeStyle = 'white';\nctx.lineWidth = 1;\nctx.font = '36px arial';\nctx.strokeText('Canvas text', 50, 50);\n\nctx.fillStyle = 'red';\nctx.font = '48px georgia';\nctx.fillText('Canvas text', 50, 150);\n\ncanvas.setAttribute('aria-label', 'Canvas text');\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/4_canvas_text/style.css",
    "content": "body {\n  margin: 0;\n  overflow: hidden;\n}\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/5_canvas_images/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Canvas</title>\n    <script src=\"script.js\" defer></script>\n    <link href=\"style.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <canvas class=\"myCanvas\">\n      <p>Add suitable fallback here.</p>\n    </canvas>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/5_canvas_images/script.js",
    "content": "const canvas = document.querySelector('.myCanvas');\nconst width = canvas.width = window.innerWidth;\nconst height = canvas.height = window.innerHeight;\nconst ctx = canvas.getContext('2d');\n\nctx.fillStyle = 'rgb(0,0,0)';\nctx.fillRect(0,0,width,height);\n\nconst image = new Image();\nimage.src = 'firefox.png';\nimage.addEventListener('load', () => ctx.drawImage(image, 20, 20, 185, 175, 50, 50, 185, 175));\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/getting-started/5_canvas_images/style.css",
    "content": "body {\n  margin: 0;\n  overflow: hidden;\n}\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/loops_animation/6_canvas_for_loop/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Canvas</title>\n    <script src=\"script.js\" defer></script>\n    <link href=\"style.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <canvas class=\"myCanvas\">\n      <p>Add suitable fallback here.</p>\n    </canvas>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/loops_animation/6_canvas_for_loop/script.js",
    "content": "const canvas = document.querySelector('.myCanvas');\nconst width = canvas.width = window.innerWidth;\nconst height = canvas.height = window.innerHeight;\nconst ctx = canvas.getContext('2d');\n\nctx.fillStyle = 'rgb(0,0,0)';\nctx.fillRect(0,0,width,height);\n\nctx.translate(width/2, height/2);\n\nfunction degToRad(degrees) {\n  return degrees * Math.PI / 180;\n};\n\nfunction rand(min, max) {\n  return Math.floor(Math.random() * (max-min+1)) + (min);\n}\n\nlet length = 250;\nlet moveOffset = 20;\n\nfor (let i = 0; i < length; i++) {\n  ctx.fillStyle = `rgba(${255-length},0,${255-length},0.9)`;\n  ctx.beginPath();\n  ctx.moveTo(moveOffset,moveOffset);\n  ctx.lineTo(moveOffset+length,moveOffset);\n  const triHeight = length/2 * Math.tan(degToRad(60));\n  ctx.lineTo(moveOffset+(length/2),moveOffset+triHeight);\n  ctx.lineTo(moveOffset,moveOffset);\n  ctx.fill();\n\n  length--;\n  moveOffset+=0.7;\n  ctx.rotate(degToRad(5));\n}\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/loops_animation/6_canvas_for_loop/style.css",
    "content": "body {\n  margin: 0;\n  overflow: hidden;\n}\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/loops_animation/7_canvas_walking_animation/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Canvas</title>\n    <script src=\"script.js\" defer></script>\n    <link href=\"style.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <canvas class=\"myCanvas\">\n      <p>Add suitable fallback here.</p>\n    </canvas>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/loops_animation/7_canvas_walking_animation/script.js",
    "content": "const canvas = document.querySelector('.myCanvas');\nconst width = canvas.width = window.innerWidth;\nconst height = canvas.height = window.innerHeight;\nconst ctx = canvas.getContext('2d');\n\nctx.fillStyle = 'rgb(0,0,0)';\nctx.fillRect(0,0,width,height);\n\nctx.translate(width/2,height/2);\n\nconst image = new Image();\nimage.src = 'walk-right.png';\nimage.onload = draw;\n\nlet sprite = 0;\nlet posX = 0;\n\nfunction draw() {\n  ctx.fillRect(-(width/2),-(height/2),width,height);\n  ctx.drawImage(image, (sprite*102), 0, 102, 148, 0+posX, -74, 102, 148);\n\n  if (posX % 13 === 0) {\n    if (sprite === 5) {\n      sprite = 0;\n    } else {\n      sprite++;\n    }\n  }\n\n  if (posX > width/2) {\n    let newStartPos = -((width/2) + 102);\n    posX = Math.ceil(newStartPos);\n    console.log(posX);\n  } else {\n    posX += 2;\n  }\n\n  window.requestAnimationFrame(draw);\n};\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/loops_animation/7_canvas_walking_animation/style.css",
    "content": "body {\n  margin: 0;\n  overflow: hidden;\n}\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/loops_animation/8_canvas_drawing_app/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Canvas</title>\n    <script src=\"script.js\" defer></script>\n    <link href=\"style.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <div class=\"toolbar\">\n      <input type=\"color\" aria-label=\"select pen color\" value=\"#ff0000\">\n      <input type=\"range\" min=\"2\" max=\"50\" value=\"30\" aria-label=\"select pen size\"><span class=\"output\">30</span>\n      <button>Clear canvas</button>\n    </div>\n\n    <canvas class=\"myCanvas\">\n      <p>Add suitable fallback here.</p>\n    </canvas>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/loops_animation/8_canvas_drawing_app/script.js",
    "content": "const canvas = document.querySelector('.myCanvas');\nconst width = canvas.width = window.innerWidth;\nconst height = canvas.height = window.innerHeight-85;\nconst ctx = canvas.getContext('2d');\n\nctx.fillStyle = 'rgb(0,0,0)';\nctx.fillRect(0,0,width,height);\n\nconst colorPicker = document.querySelector('input[type=\"color\"]');\nconst sizePicker = document.querySelector('input[type=\"range\"]');\nconst output = document.querySelector('.output');\nconst clearBtn = document.querySelector('button');\n\n// covert degrees to radians\nfunction degToRad(degrees) {\n  return degrees * Math.PI / 180;\n};\n\n// update sizepicker output value\n\nsizePicker.addEventListener('input', () => output.textContent = sizePicker.value);\n\n// store mouse pointer coordinates, and whether the button is pressed\nlet curX;\nlet curY;\nlet pressed = false;\n\n// update mouse pointer coordinates\ndocument.addEventListener('mousemove', e => {\n  curX = (window.Event) ? e.pageX : e.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);\n  curY = (window.Event) ? e.pageY : e.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);\n});\n\ncanvas.addEventListener('mousedown', () => pressed = true);\n\ncanvas.addEventListener('mouseup', () => pressed = false);\n\nclearBtn.addEventListener('click', () => {\n  ctx.fillStyle = 'rgb(0,0,0)';\n  ctx.fillRect(0,0,width,height);\n});\n\nfunction draw() {\n  if (pressed) {\n    ctx.fillStyle = colorPicker.value;\n    ctx.beginPath();\n    ctx.arc(curX, curY-85, sizePicker.value, degToRad(0), degToRad(360), false);\n    ctx.fill();\n  }\n\n  requestAnimationFrame(draw);\n}\n\ndraw();\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/loops_animation/8_canvas_drawing_app/style.css",
    "content": "body {\n  margin: 0;\n  overflow: hidden;\n  background: #ccc;\n}\n\n.toolbar {\n  width: 150px;\n  height: 75px;\n  background: #ccc;\n  padding: 5px;\n}\n\ninput[type=\"color\"], button {\n  width: 90%;\n  margin: 0 auto;\n  display: block;\n}\n\ninput[type=\"range\"] {\n  width: 70%;\n}\n\nspan {\n position: relative;\n bottom: 5px;\n}\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/threejs-cube/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n\n    <title>Three.js basic cube example</title>\n\n    <script src=\"three.min.js\" defer></script>\n    <script src=\"script.js\" defer></script>\n    <link href=\"style.css\" rel=\"stylesheet\" />\n  </head>\n\n  <body></body>\n</html>\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/threejs-cube/script.js",
    "content": "const scene = new THREE.Scene();\n\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);\ncamera.position.z = 5;\n\nconst renderer = new THREE.WebGLRenderer();\nrenderer.setSize(window.innerWidth, window.innerHeight);\ndocument.body.appendChild(renderer.domElement);\n\nlet cube;\n\nconst loader = new THREE.TextureLoader();\n\nloader.load('metal003.png', texture => {\n\ttexture.wrapS = THREE.RepeatWrapping;\n\ttexture.wrapT = THREE.RepeatWrapping;\n\ttexture.repeat.set(2, 2);\n\n\tconst geometry = new THREE.BoxGeometry(2.4,2.4,2.4);\n\tconst material = new THREE.MeshLambertMaterial( { map: texture } );\n\tcube = new THREE.Mesh(geometry, material);\n\tscene.add(cube);\n\n\tdraw();\n});\n\nconst light = new THREE.AmbientLight('rgb(255,255,255)'); // soft white light\nscene.add(light);\n\nconst spotLight = new THREE.SpotLight('rgb(255,255,255)');\nspotLight.position.set( 100, 1000, 1000 );\nspotLight.castShadow = true;\nscene.add(spotLight);\n\nfunction draw() {\n  cube.rotation.x += 0.01;\n  cube.rotation.y += 0.01;\n  renderer.render(scene, camera);\n\n\trequestAnimationFrame(draw);\n}\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/threejs-cube/style.css",
    "content": "html,body {\n  margin: 0;\n}\n\nbody {\n  overflow: hidden;\n}\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/threejs-video-cube/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n\n    <title>Three.js video cube</title>\n\n    <script src=\"three.min.js\" defer></script>\n    <script src=\"script.js\" defer></script>\n    <link rel=\"stylesheet\" href=\"style/style.css\" />\n  </head>\n\n  <body></body>\n</html>\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/threejs-video-cube/script.js",
    "content": "//main block for doing the video recording\n\nif (navigator.mediaDevices.getUserMedia) {\n  const constraints = {\n     audio: false,\n     video: true\n  }\n\n  navigator.mediaDevices.getUserMedia(constraints)\n  .then(stream => {\n    const video = document.createElement('video');\n    video.srcObject = stream;\n    video.addEventListener('loadedmetadata', () => {\n      video.play();\n      threeRender(video);\n    });\n  })\n  .catch(err => console.error(`The following gUM error occurred: ${err}`));\n} else {\n   console.error('getUserMedia not supported on your browser!');\n}\n\n// three.js cube drawing\n\nfunction threeRender(video) {\n\n  const scene = new THREE.Scene();\n\n  const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );\n  const renderer = new THREE.WebGLRenderer();\n\n  renderer.setSize( window.innerWidth, window.innerHeight );\n  document.body.appendChild( renderer.domElement );\n\n  // load a texture, set wrap mode to repeat\n  const texture = new THREE.Texture(video);\n  texture.wrapS = THREE.RepeatWrapping;\n  texture.wrapT = THREE.RepeatWrapping;\n  texture.repeat.set( 1, 1 );\n\n  const geometry = new THREE.BoxGeometry(3,3,3);\n  const material = new THREE.MeshLambertMaterial( { map: texture } );\n  const cube = new THREE.Mesh( geometry, material );\n  scene.add( cube );\n\n  camera.position.x = 0;\n  camera.position.y = 0;\n  camera.position.z = 5;\n\n  const light = new THREE.AmbientLight( 'rgb(100,100,100)' ); // soft white light\n  scene.add( light );\n\n  // White directional light at half intensity shining from the top.\n  //var directionalLight = new THREE.DirectionalLight( 0xffffff, 1 );\n  //directionalLight.position.set( 0, 1, 0 );\n  //scene.add( directionalLight );\n\n  // white spotlight shining from the side, casting shadow\n  const spotLight = new THREE.SpotLight( 'rgb(255,255,255)' );\n  spotLight.position.set( 100, 1000, 1000 );\n  spotLight.castShadow = true;\n  spotLight.shadowMapWidth = 1024;\n  spotLight.shadowMapHeight = 1024;\n  spotLight.shadowCameraNear = 500;\n  spotLight.shadowCameraFar = 4000;\n  spotLight.shadowCameraFov = 30;\n  scene.add( spotLight );\n\n  //render the scene\n\n  function render() {\n    requestAnimationFrame(render);\n\n    cube.rotation.x += 0.005;\n    cube.rotation.y += 0.005;\n    texture.needsUpdate = true;\n    renderer.render(scene, camera);\n  }\n\n  render();\n\n  // keyboard controls\n\n  const body = document.querySelector('body');\n\n  body.addEventListener('keydown', e => {\n    // 37 is arrow left, 39 is arrow right,\n    // 38 is arrow up, 40 is arrow down\n\n    if (e.keyCode == 37) {\n      camera.position.x += 0.05;\n    };\n\n    if (e.keyCode == 39) {\n      camera.position.x -= 0.05;\n    };\n\n    if (e.keyCode == 38) {\n      camera.position.y -= 0.05;\n    };\n\n    if (e.keyCode == 40) {\n      camera.position.y += 0.05;\n    };\n  });\n\n  function onWindowResize() {\n      renderer.setSize( window.innerWidth, window.innerHeight );\n      camera.aspect = window.innerWidth / window.innerHeight;\n      camera.updateProjectionMatrix();\n  }\n  window.addEventListener( 'resize', onWindowResize, false );\n\n}\n"
  },
  {
    "path": "javascript/apis/drawing-graphics/threejs-video-cube/style.css",
    "content": "html,body {\n  margin: 0;\n  padding: 0;\n}\n\nbody {\n  overflow: hidden;\n}\n"
  },
  {
    "path": "javascript/apis/fetching-data/can-store/can-script.js",
    "content": "// use fetch to retrieve the products and pass them to init\n// report any errors that occur in the fetch operation\n// once the products have been successfully loaded and formatted as a JSON object\n// using response.json(), run the initialize() function\nfetch('products.json')\n  .then( response => {\n    if (!response.ok) {\n      throw new Error(`HTTP error: ${response.status}`);\n    }\n    return response.json();\n  })\n  .then( json => initialize(json) )\n  .catch( err => console.error(`Fetch problem: ${err.message}`) );\n\n// sets up the app logic, declares required variables, contains all the other functions\nfunction initialize(products) {\n  // grab the UI elements that we need to manipulate\n  const category = document.querySelector('#category');\n  const searchTerm = document.querySelector('#searchTerm');\n  const searchBtn = document.querySelector('button');\n  const main = document.querySelector('main');\n\n  // keep a record of what the last category and search term entered were\n  let lastCategory = category.value;\n  // no search has been made yet\n  let lastSearch = '';\n\n  // these contain the results of filtering by category, and search term\n  // finalGroup will contain the products that need to be displayed after\n  // the searching has been done. Each will be an array containing objects.\n  // Each object will represent a product\n  let categoryGroup;\n  let finalGroup;\n\n  // To start with, set finalGroup to equal the entire products database\n  // then run updateDisplay(), so ALL products are displayed initially.\n  finalGroup = products;\n  updateDisplay();\n\n  // Set both to equal an empty array, in time for searches to be run\n  categoryGroup = [];\n  finalGroup = [];\n\n  // when the search button is clicked, invoke selectCategory() to start\n  // a search running to select the category of products we want to display\n  searchBtn.addEventListener('click', selectCategory);\n\n  function selectCategory(e) {\n    // Use preventDefault() to stop the form submitting — that would ruin\n    // the experience\n    e.preventDefault();\n\n    // Set these back to empty arrays, to clear out the previous search\n    categoryGroup = [];\n    finalGroup = [];\n\n    // if the category and search term are the same as they were the last time a\n    // search was run, the results will be the same, so there is no point running\n    // it again — just return out of the function\n    if (category.value === lastCategory && searchTerm.value.trim() === lastSearch) {\n      return;\n    } else {\n      // update the record of last category and search term\n      lastCategory = category.value;\n      lastSearch = searchTerm.value.trim();\n      // In this case we want to select all products, then filter them by the search\n      // term, so we just set categoryGroup to the entire JSON object, then run selectProducts()\n      if (category.value === 'All') {\n        categoryGroup = products;\n        selectProducts();\n      // If a specific category is chosen, we need to filter out the products not in that\n      // category, then put the remaining products inside categoryGroup, before running\n      // selectProducts()\n      } else {\n        // the values in the <option> elements are uppercase, whereas the categories\n        // store in the JSON (under \"type\") are lowercase. We therefore need to convert\n        // to lower case before we do a comparison\n        const lowerCaseType = category.value.toLowerCase();\n        // Filter categoryGroup to contain only products whose type includes the category\n        categoryGroup = products.filter( product => product.type === lowerCaseType );\n\n        // Run selectProducts() after the filtering has been done\n        selectProducts();\n      }\n    }\n  }\n\n  // selectProducts() Takes the group of products selected by selectCategory(), and further\n  // filters them by the tiered search term (if one has been entered)\n  function selectProducts() {\n    // If no search term has been entered, just make the finalGroup array equal to the categoryGroup\n    // array — we don't want to filter the products further.\n    if (searchTerm.value.trim() === '') {\n      finalGroup = categoryGroup;\n    } else {\n      // Make sure the search term is converted to lower case before comparison. We've kept the\n      // product names all lower case to keep things simple\n      const lowerCaseSearchTerm = searchTerm.value.trim().toLowerCase();\n      // Filter finalGroup to contain only products whose name includes the search term\n      finalGroup = categoryGroup.filter( product => product.name.includes(lowerCaseSearchTerm));\n    }\n    // Once we have the final group, update the display\n    updateDisplay();\n  }\n\n  // start the process of updating the display with the new set of products\n  function updateDisplay() {\n    // remove the previous contents of the <main> element\n    while (main.firstChild) {\n      main.removeChild(main.firstChild);\n    }\n\n    // if no products match the search term, display a \"No results to display\" message\n    if (finalGroup.length === 0) {\n      const para = document.createElement('p');\n      para.textContent = 'No results to display!';\n      main.appendChild(para);\n    // for each product we want to display, pass its product object to fetchBlob()\n    } else {\n      for (const product of finalGroup) {\n        fetchBlob(product);\n      }\n    }\n  }\n\n  // fetchBlob uses fetch to retrieve the image for that product, and then sends the\n  // resulting image display URL and product object on to showProduct() to finally\n  // display it\n  function fetchBlob(product) {\n    // construct the URL path to the image file from the product.image property\n    const url = `images/${product.image}`;\n    // Use fetch to fetch the image, and convert the resulting response to a blob\n    // Again, if any errors occur we report them in the console.\n    fetch(url)\n      .then( response => {\n        if (!response.ok) {\n          throw new Error(`HTTP error: ${response.status}`);\n        }\n        return response.blob();\n      })\n      .then( blob => showProduct(blob, product) )\n      .catch( err => console.error(`Fetch problem: ${err.message}`) );\n  }\n\n  // Display a product inside the <main> element\n  function showProduct(blob, product) {\n    // Convert the blob to an object URL — this is basically an temporary internal URL\n    // that points to an object stored inside the browser\n    const objectURL = URL.createObjectURL(blob);\n    // create <section>, <h2>, <p>, and <img> elements\n    const section = document.createElement('section');\n    const heading = document.createElement('h2');\n    const para = document.createElement('p');\n    const image = document.createElement('img');\n\n    // give the <section> a classname equal to the product \"type\" property so it will display the correct icon\n    section.setAttribute('class', product.type);\n\n    // Give the <h2> textContent equal to the product \"name\" property, but with the first character\n    // replaced with the uppercase version of the first character\n    heading.textContent = product.name.replace(product.name.charAt(0), product.name.charAt(0).toUpperCase());\n\n    // Give the <p> textContent equal to the product \"price\" property, with a $ sign in front\n    // toFixed(2) is used to fix the price at 2 decimal places, so for example 1.40 is displayed\n    // as 1.40, not 1.4.\n    para.textContent = `$${product.price.toFixed(2)}`;\n\n    // Set the src of the <img> element to the ObjectURL, and the alt to the product \"name\" property\n    image.src = objectURL;\n    image.alt = product.name;\n\n    // append the elements to the DOM as appropriate, to add the product to the UI\n    main.appendChild(section);\n    section.appendChild(heading);\n    section.appendChild(para);\n    section.appendChild(image);\n  }\n}\n"
  },
  {
    "path": "javascript/apis/fetching-data/can-store/can-style.css",
    "content": "/* General */\n\nhtml {\n  font-family: 'Raleway', sans-serif;\n  background-color: yellow;\n  font-size: 10px;\n}\n\nbody {\n  width: 800px;\n  margin: 0 auto;\n}\n\n/* Typography */\n\nh1, h2 {\n  font-family: 'Cherry Swash', cursive;\n  margin: 0;\n  text-align: center;\n}\n\nh1 {\n  font-size: 5rem;\n  background: url(icons/bean_can.png) no-repeat 20% center, url(icons/bean_can.png) no-repeat 80% center;\n  background-size: 48px 48px;\n}\n\nh2 {\n  font-size: 2rem;\n  color: yellow;\n  text-align: right;\n  width: 160px;\n  position: absolute;\n  right: 4%;\n  z-index: 3000;\n  text-shadow: 2px 2px 1px black;\n  line-height: 2rem;\n  padding-top: 0.3rem;\n}\n\n\n\np, label, input, select, button, li {\n  font-size: 1.5rem;\n}\n\nli {\n  line-height: 1.5;\n}\n\n/* block styling */\n\nheader, aside, main, footer {\n  padding: 20px;\n}\n\nheader {\n  border: 5px solid black;\n  border-bottom: 0;\n}\n\naside {\n  border-right: 5px solid black;\n}\n\nbody > div {\n  border: 5px solid black;\n  display: flex;\n}\n\nfooter {\n  border: 5px solid black;\n  border-top: 0;\n}\n\naside {\n  flex: 3;\n}\n\nmain {\n  flex: 7;\n}\n\n/* Form styling */\n\naside {\n  display: flex;\n  flex-flow: column;\n  align-items: stretch;\n}\n\naside div {\n  margin-bottom: 20px;\n}\n\nlabel, select, input {\n  display: block;\n}\n\nlabel {\n  margin-bottom: 5px;\n}\n\nselect, input, button {\n  width: 100%;\n}\n\ninput {\n  background: black;\n  box-shadow: inset 1px 1px 1px white;\n  color: yellow;\n  border: none;\n  padding: 5px;\n  width: 201.5px;\n}\n\nbutton {\n  background: black;\n  color: yellow;\n  padding: 5px 0;\n  border: none;\n  border-radius: 10px;\n  box-shadow: inset 1px 1px 2px white, inset -1px -1px 2px #ccc;\n}\n\n/* Styling the products */\n\nmain {\n  display: flex;\n  flex-flow: row wrap;\n  justify-content: space-around;\n}\n\nsection {\n  width: 45%;\n  margin: 5px;\n  background-color: black;\n  position: relative;\n  height: 215px;\n}\n\nsection img {\n  width: 100%;\n  display: block;\n  position: absolute;\n  bottom: 0px;\n}\n\nsection p {\n  color: yellow;\n  background: black;\n  width: 50px;\n  height: 50px;\n  line-height: 50px;\n  text-align: center;\n  border-radius: 50%;\n  box-shadow: 2px 2px 1px yellow;\n  position: absolute;\n  right: 10px;\n  bottom: -6px;\n  z-index: 2000;\n}\n\n.vegetables {\n  background: black url(icons/vegetable.png) no-repeat 2px 2px;\n  background-size: 24px 24px;\n}\n\n.meat {\n  background: black url(icons/meat.png) no-repeat 2px 2px;\n  background-size: 24px 24px;\n}\n\n.soup {\n  background: black url(icons/soup.png) no-repeat 2px 2px;\n  background-size: 24px 24px;\n}\n\n/* mobile responsive styles*/\n@media screen and (max-width: 800px){\n  body, body div {\n    display: grid;\n    max-width: 480px;\n  }\n  header {\n    grid-row: 1;\n    margin-top: 10px;\n  }  \n  header h1 {\n    font-size: 3.5rem;\n    font-weight: bold;\n    background: url(icons/bean_can.png) no-repeat 0% center, url(icons/bean_can.png) no-repeat 100% center;\n    background-size: 48px 48px;\n  }\n  aside {\n    grid-row: 1;\n    border-right: none;    \n    border-bottom: 5px solid black;    \n  }\n  input{\n    width: calc(100% - 5px);\n    padding: 5px 0 5px 5px;\n  }\n  main {\n    grid-row: 2;\n  }\n  footer {\n    grid-row: 3;\n    margin-bottom: 10px;\n  }\n  .vegetables, .meat, .soup {\n    background: black;\n  }\n}\n"
  },
  {
    "path": "javascript/apis/fetching-data/can-store/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>The Can Store</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Cherry+Swash|Raleway\" rel=\"stylesheet\">\n    <link href=\"can-style.css\" rel=\"stylesheet\">\n\n  </head>\n\n  <body>\n    <header>\n      <h1>The Can Store</h1>\n    </header>\n    <div>\n      <aside>\n        <form>\n          <div>\n            <label for=\"category\">Choose a category:</label>\n            <select id=\"category\">\n              <option selected>All</option>\n              <option>Vegetables</option>\n              <option>Meat</option>\n              <option>Soup</option>\n            </select>\n          </div>\n          <div>\n            <label for=\"searchTerm\">Enter search term:</label>\n            <input type=\"text\" id=\"searchTerm\" placeholder=\"e.g. beans\">\n          </div>\n          <div>\n            <button>Filter results</button>\n          </div>\n        </form>\n      </aside>\n      <main>\n\n      </main>\n    </div>\n    <footer>\n      <p>All icons found at the Noun Project:</p>\n\n      <ul>\n        <li>Bean can icon by <a href=\"https://thenounproject.com/yalanis/\">Yazmin Alanis</a></li>\n        <li>Vegetable icon by <a href=\"https://thenounproject.com/skatakila/\">Ricardo Moreira</a></li>\n        <li>Soup icon by <a href=\"https://thenounproject.com/ArtZ91/\">Arthur Shlain</a></li>\n        <li>Meat Chunk icon by <a href=\"https://thenounproject.com/smashicons/\">Oliviu Stoian</a>.</li>\n      </ul>\n    </footer>\n    <script src=\"can-script.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/fetching-data/can-store/products.json",
    "content": "[\n  {\n    \"name\" : \"baked beans\",\n    \"price\" : 0.40,\n    \"image\" : \"beans.jpg\",\n    \"type\" : \"vegetables\"\n  },\n  {\n    \"name\" : \"hot dogs\",\n    \"price\" : 1.99,\n    \"image\" : \"hotdogs.jpg\",\n    \"type\" : \"meat\"\n  },\n  {\n    \"name\" : \"spam\",\n    \"price\" : 2.85,\n    \"image\" : \"spam.jpg\",\n    \"type\" : \"meat\"\n  },\n  {\n    \"name\" : \"refried beans\",\n    \"price\" : 0.99,\n    \"image\" : \"refried.jpg\",\n    \"type\" : \"vegetables\"\n  },\n  {\n    \"name\" : \"kidney beans\",\n    \"price\" : 0.58,\n    \"image\" : \"kidney.jpg\",\n    \"type\" : \"vegetables\"\n  },\n  {\n    \"name\" : \"garden peas\",\n    \"price\" : 0.52,\n    \"image\" : \"gardenpeas.jpg\",\n    \"type\" : \"vegetables\"\n  },\n  {\n    \"name\" : \"mushy peas\",\n    \"price\" : 0.58,\n    \"image\" : \"mushypeas.jpg\",\n    \"type\" : \"vegetables\"\n  },\n  {\n    \"name\" : \"corned beef\",\n    \"price\" : 2.39,\n    \"image\" : \"cornedbeef.jpg\",\n    \"type\" : \"meat\"\n  },\n  {\n    \"name\" : \"tomato soup\",\n    \"price\" : 1.40,\n    \"image\" : \"tomatosoup.jpg\",\n    \"type\" : \"soup\"\n  },\n  {\n    \"name\" : \"chopped tomatoes\",\n    \"price\" : 0.45,\n    \"image\" : \"tomato.jpg\",\n    \"type\" : \"vegetables\"\n  },\n  {\n    \"name\" : \"chicken noodle soup\",\n    \"price\" : 1.89,\n    \"image\" : \"chickennoodle.jpg\",\n    \"type\" : \"soup\"\n  },\n  {\n    \"name\" : \"carrot and coriander soup\",\n    \"price\" : 1.49,\n    \"image\" : \"carrotcoriander.jpg\",\n    \"type\" : \"soup\"\n  }\n]\n"
  },
  {
    "path": "javascript/apis/fetching-data/can-store-xhr/can-script.js",
    "content": "// use fetch to retrieve the products and pass them to init\n// report any errors that occur in the fetch operation\n// once the products have been successfully loaded and formatted as a JSON object\n// using response.json(), run the initialize() function\nconst request = new XMLHttpRequest();\nrequest.open('GET', 'products.json');\nrequest.responseType = 'json';\n\nrequest.onload = function() {\n  if(request.status === 200) {\n    let products = request.response;\n    initialize(products);\n  } else {\n    console.log('Network request for products.json failed with response ' + request.status + ': ' + request.statusText)\n  }\n};\n\nrequest.send();\n\n// sets up the app logic, declares required variables, contains all the other functions\nfunction initialize(products) {\n  // grab the UI elements that we need to manipulate\n  const category = document.querySelector('#category');\n  const searchTerm = document.querySelector('#searchTerm');\n  const searchBtn = document.querySelector('button');\n  const main = document.querySelector('main');\n\n  // keep a record of what the last category and search term entered were\n  let lastCategory = category.value;\n  // no search has been made yet\n  let lastSearch = '';\n\n  // these contain the results of filtering by category, and search term\n  // finalGroup will contain the products that need to be displayed after\n  // the searching has been done. Each will be an array containing objects.\n  // Each object will represent a product\n  let categoryGroup;\n  let finalGroup;\n\n  // To start with, set finalGroup to equal the entire products database\n  // then run updateDisplay(), so ALL products are displayed initially.\n  finalGroup = products;\n  updateDisplay();\n\n  // Set both to equal an empty array, in time for searches to be run\n  categoryGroup = [];\n  finalGroup = [];\n\n  // when the search button is clicked, invoke selectCategory() to start\n  // a search running to select the category of products we want to display\n  searchBtn.onclick = selectCategory;\n\n  function selectCategory(e) {\n    // Use preventDefault() to stop the form submitting — that would ruin\n    // the experience\n    e.preventDefault();\n\n    // Set these back to empty arrays, to clear out the previous search\n    categoryGroup = [];\n    finalGroup = [];\n\n    // if the category and search term are the same as they were the last time a\n    // search was run, the results will be the same, so there is no point running\n    // it again — just return out of the function\n    if(category.value === lastCategory && searchTerm.value.trim() === lastSearch) {\n      return;\n    } else {\n      // update the record of last category and search term\n      lastCategory = category.value;\n      lastSearch = searchTerm.value.trim();\n      // In this case we want to select all products, then filter them by the search\n      // term, so we just set categoryGroup to the entire JSON object, then run selectProducts()\n      if(category.value === 'All') {\n        categoryGroup = products;\n        selectProducts();\n      // If a specific category is chosen, we need to filter out the products not in that\n      // category, then put the remaining products inside categoryGroup, before running\n      // selectProducts()\n      } else {\n        // the values in the <option> elements are uppercase, whereas the categories\n        // store in the JSON (under \"type\") are lowercase. We therefore need to convert\n        // to lower case before we do a comparison\n        let lowerCaseType = category.value.toLowerCase();\n        for(let i = 0; i < products.length ; i++) {\n          // If a product's type property is the same as the chosen category, we want to\n          // display it, so we push it onto the categoryGroup array\n          if(products[i].type === lowerCaseType) {\n            categoryGroup.push(products[i]);\n          }\n        }\n\n        // Run selectProducts() after the filtering has been done\n        selectProducts();\n      }\n    }\n  }\n\n  // selectProducts() Takes the group of products selected by selectCategory(), and further\n  // filters them by the tiered search term (if one has been entered)\n  function selectProducts() {\n    // If no search term has been entered, just make the finalGroup array equal to the categoryGroup\n    // array — we don't want to filter the products further — then run updateDisplay().\n    if(searchTerm.value.trim() === '') {\n      finalGroup = categoryGroup;\n      updateDisplay();\n    } else {\n      // Make sure the search term is converted to lower case before comparison. We've kept the\n      // product names all lower case to keep things simple\n      let lowerCaseSearchTerm = searchTerm.value.trim().toLowerCase();\n      // For each product in categoryGroup, see if the search term is contained inside the product name\n      // (if the indexOf() result doesn't return -1, it means it is) — if it is, then push the product\n      // onto the finalGroup array\n      for(let i = 0; i < categoryGroup.length ; i++) {\n        if(categoryGroup[i].name.indexOf(lowerCaseSearchTerm) !== -1) {\n          finalGroup.push(categoryGroup[i]);\n        }\n      }\n\n      // run updateDisplay() after this second round of filtering has been done\n      updateDisplay();\n    }\n\n  }\n\n  // start the process of updating the display with the new set of products\n  function updateDisplay() {\n    // remove the previous contents of the <main> element\n    while (main.firstChild) {\n      main.removeChild(main.firstChild);\n    }\n\n    // if no products match the search term, display a \"No results to display\" message\n    if(finalGroup.length === 0) {\n      const para = document.createElement('p');\n      para.textContent = 'No results to display!';\n      main.appendChild(para);\n    // for each product we want to display, pass its product object to fetchBlob()\n    } else {\n      for(var i = 0; i < finalGroup.length; i++) {\n        fetchBlob(finalGroup[i]);\n      }\n    }\n  }\n\n  // fetchBlob uses XHR to retrieve the image for that product, and then sends the\n  // resulting image display URL and product object on to showProduct() to finally\n  // display it\n  function fetchBlob(product) {\n    // construct the URL path to the image file from the product.image property\n    let url = 'images/' + product.image;\n    // Use XHR to fetch the image, as a blob\n    // Again, if any errors occur we report them in the console.\n    const request = new XMLHttpRequest();\n    request.open('GET', url);\n    request.responseType = 'blob';\n\n    request.onload = function() {\n      if(request.status === 200) {\n          // Convert the blob to an object URL — this is basically an temporary internal URL\n          // that points to an object stored inside the browser\n          let blob = request.response;\n          let objectURL = URL.createObjectURL(blob);\n          // invoke showProduct\n          showProduct(objectURL, product);\n      } else {\n        console.log('Network request for \"' + product.name + '\" image failed with response ' + request.status + ': ' + request.statusText);\n      }\n    };\n\n    request.send();\n  }\n\n  // Display a product inside the <main> element\n  function showProduct(objectURL, product) {\n    // create <section>, <h2>, <p>, and <img> elements\n    const section = document.createElement('section');\n    const heading = document.createElement('h2');\n    const para = document.createElement('p');\n    const image = document.createElement('img');\n\n    // give the <section> a classname equal to the product \"type\" property so it will display the correct icon\n    section.setAttribute('class', product.type);\n\n    // Give the <h2> textContent equal to the product \"name\" property, but with the first character\n    // replaced with the uppercase version of the first character\n    heading.textContent = product.name.replace(product.name.charAt(0), product.name.charAt(0).toUpperCase());\n\n    // Give the <p> textContent equal to the product \"price\" property, with a $ sign in front\n    // toFixed(2) is used to fix the price at 2 decimal places, so for example 1.40 is displayed\n    // as 1.40, not 1.4.\n    para.textContent = '$' + product.price.toFixed(2);\n\n    // Set the src of the <img> element to the ObjectURL, and the alt to the product \"name\" property\n    image.src = objectURL;\n    image.alt = product.name;\n\n    // append the elements to the DOM as appropriate, to add the product to the UI\n    main.appendChild(section);\n    section.appendChild(heading);\n    section.appendChild(para);\n    section.appendChild(image);\n  }\n}\n"
  },
  {
    "path": "javascript/apis/fetching-data/can-store-xhr/can-style.css",
    "content": "/* General */\n\nhtml {\n  font-family: 'Raleway', sans-serif;\n  background-color: yellow;\n  font-size: 10px;\n}\n\nbody {\n  width: 800px;\n  margin: 0 auto;\n}\n\n/* Typography */\n\nh1, h2 {\n  font-family: 'Cherry Swash', cursive;\n  margin: 0;\n  text-align: center;\n}\n\nh1 {\n  font-size: 5rem;\n  background: url(icons/bean_can.png) no-repeat 20% center, url(icons/bean_can.png) no-repeat 80% center;\n  background-size: 48px 48px;\n}\n\nh2 {\n  font-size: 2rem;\n  color: yellow;\n  text-align: right;\n  width: 160px;\n  position: absolute;\n  right: 4%;\n  z-index: 3000;\n  text-shadow: 2px 2px 1px black;\n  line-height: 2rem;\n  padding-top: 0.3rem;\n}\n\n\n\np, label, input, select, button, li {\n  font-size: 1.5rem;\n}\n\nli {\n  line-height: 1.5;\n}\n\n/* block styling */\n\nheader, aside, main, footer {\n  padding: 20px;\n}\n\nheader {\n  border: 5px solid black;\n  border-bottom: 0;\n}\n\naside {\n  border-right: 5px solid black;\n}\n\nbody > div {\n  border: 5px solid black;\n  display: flex;\n}\n\nfooter {\n  border: 5px solid black;\n  border-top: 0;\n}\n\naside {\n  flex: 3;\n}\n\nmain {\n  flex: 7;\n}\n\n/* Form styling */\n\naside {\n  display: flex;\n  flex-flow: column;\n  align-items: stretch;\n}\n\naside div {\n  margin-bottom: 20px;\n}\n\nlabel, select, input {\n  display: block;\n}\n\nlabel {\n  margin-bottom: 5px;\n}\n\nselect, input, button {\n  width: 100%;\n}\n\ninput {\n  background: black;\n  box-shadow: inset 1px 1px 1px white;\n  color: yellow;\n  border: none;\n  padding: 5px;\n  width: 201.5px;\n}\n\nbutton {\n  background: black;\n  color: yellow;\n  padding: 5px 0;\n  border: none;\n  border-radius: 10px;\n  box-shadow: inset 1px 1px 2px white, inset -1px -1px 2px #ccc;\n}\n\n/* Styling the products */\n\nmain {\n  display: flex;\n  flex-flow: row wrap;\n  justify-content: space-around;\n}\n\nsection {\n  width: 45%;\n  margin: 5px;\n  background-color: black;\n  position: relative;\n  height: 215px;\n}\n\nsection img {\n  width: 100%;\n  display: block;\n  position: absolute;\n  bottom: 0px;\n}\n\nsection p {\n  color: yellow;\n  background: black;\n  width: 50px;\n  height: 50px;\n  line-height: 50px;\n  text-align: center;\n  border-radius: 50%;\n  box-shadow: 2px 2px 1px yellow;\n  position: absolute;\n  right: 10px;\n  bottom: -6px;\n  z-index: 2000;\n}\n\n.vegetables {\n  background: black url(icons/vegetable.png) no-repeat 2px 2px;\n  background-size: 24px 24px;\n}\n\n.meat {\n  background: black url(icons/meat.png) no-repeat 2px 2px;\n  background-size: 24px 24px;\n}\n\n.soup {\n  background: black url(icons/soup.png) no-repeat 2px 2px;\n  background-size: 24px 24px;\n}\n"
  },
  {
    "path": "javascript/apis/fetching-data/can-store-xhr/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>The Can Store</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Cherry+Swash|Raleway\" rel=\"stylesheet\">\n    <link href=\"can-style.css\" rel=\"stylesheet\">\n\n  </head>\n\n  <body>\n    <header>\n      <h1>The Can Store</h1>\n    </header>\n    <div>\n      <aside>\n        <form>\n          <div>\n            <label for=\"category\">Choose a category:</label>\n            <select id=\"category\">\n              <option selected>All</option>\n              <option>Vegetables</option>\n              <option>Meat</option>\n              <option>Soup</option>\n            </select>\n          </div>\n          <div>\n            <label for=\"searchTerm\">Enter search term:</label>\n            <input type=\"text\" id=\"searchTerm\" placeholder=\"e.g. beans\">\n          </div>\n          <div>\n            <button>Filter results</button>\n          </div>\n        </form>\n      </aside>\n      <main>\n\n      </main>\n    </div>\n    <footer>\n      <p>All icons found at the Noun Project:</p>\n\n      <ul>\n        <li>Bean can icon by <a href=\"https://thenounproject.com/yalanis/\">Yazmin Alanis</a></li>\n        <li>Vegetable icon by <a href=\"https://thenounproject.com/skatakila/\">Ricardo Moreira</a></li>\n        <li>Soup icon by <a href=\"https://thenounproject.com/ArtZ91/\">Arthur Shlain</a></li>\n        <li>Meat Chunk icon by <a href=\"https://thenounproject.com/smashicons/\">Oliviu Stoian</a>.</li>\n      </ul>\n    </footer>\n    <script src=\"can-script.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/fetching-data/can-store-xhr/products.json",
    "content": "[\n  {\n    \"name\" : \"baked beans\",\n    \"price\" : 0.40,\n    \"image\" : \"beans.jpg\",\n    \"type\" : \"vegetables\"\n  },\n  {\n    \"name\" : \"hot dogs\",\n    \"price\" : 1.99,\n    \"image\" : \"hotdogs.jpg\",\n    \"type\" : \"meat\"\n  },\n  {\n    \"name\" : \"spam\",\n    \"price\" : 2.85,\n    \"image\" : \"spam.jpg\",\n    \"type\" : \"meat\"\n  },\n  {\n    \"name\" : \"refried beans\",\n    \"price\" : 0.99,\n    \"image\" : \"refried.jpg\",\n    \"type\" : \"vegetables\"\n  },\n  {\n    \"name\" : \"kidney beans\",\n    \"price\" : 0.58,\n    \"image\" : \"kidney.jpg\",\n    \"type\" : \"vegetables\"\n  },\n  {\n    \"name\" : \"garden peas\",\n    \"price\" : 0.52,\n    \"image\" : \"gardenpeas.jpg\",\n    \"type\" : \"vegetables\"\n  },\n  {\n    \"name\" : \"mushy peas\",\n    \"price\" : 0.58,\n    \"image\" : \"mushypeas.jpg\",\n    \"type\" : \"vegetables\"\n  },\n  {\n    \"name\" : \"corned beef\",\n    \"price\" : 2.39,\n    \"image\" : \"cornedbeef.jpg\",\n    \"type\" : \"meat\"\n  },\n  {\n    \"name\" : \"tomato soup\",\n    \"price\" : 1.40,\n    \"image\" : \"tomatosoup.jpg\",\n    \"type\" : \"soup\"\n  },\n  {\n    \"name\" : \"chopped tomatoes\",\n    \"price\" : 0.45,\n    \"image\" : \"tomato.jpg\",\n    \"type\" : \"vegetables\"\n  },\n  {\n    \"name\" : \"chicken noodle soup\",\n    \"price\" : 1.89,\n    \"image\" : \"chickennoodle.jpg\",\n    \"type\" : \"soup\"\n  },\n  {\n    \"name\" : \"carrot and coriander soup\",\n    \"price\" : 1.49,\n    \"image\" : \"carrotcoriander.jpg\",\n    \"type\" : \"soup\"\n  }\n]\n"
  },
  {
    "path": "javascript/apis/fetching-data/fetch-finish.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n\n    <title>Fetch starting point</title>\n\n    <style>\n      html,\n      pre {\n        font-family: sans-serif;\n      }\n\n      body {\n        width: 500px;\n        margin: 0 auto;\n        background-color: #ccc;\n      }\n\n      pre {\n        line-height: 1.5;\n        letter-spacing: 0.05rem;\n        padding: 1rem;\n        background-color: white;\n      }\n\n      label {\n        width: 200px;\n        margin-right: 33px;\n      }\n\n      select {\n        width: 350px;\n        padding: 5px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <h1>Fetch starting point</h1>\n\n    <form>\n      <label for=\"verse-choose\">Choose a verse</label>\n      <select id=\"verse-choose\" name=\"verse-choose\">\n        <option>Verse 1</option>\n        <option>Verse 2</option>\n        <option>Verse 3</option>\n        <option>Verse 4</option>\n      </select>\n    </form>\n\n    <h2>The Conqueror Worm, <em>Edgar Allen Poe, 1843</em></h2>\n\n    <pre></pre>\n\n    <script>\n      const verseChoose = document.querySelector(\"select\");\n      const poemDisplay = document.querySelector(\"pre\");\n\n      verseChoose.addEventListener(\"change\", () => {\n        const verse = verseChoose.value;\n        updateDisplay(verse);\n      });\n\n      function updateDisplay(verse) {\n        verse = verse.replace(\" \", \"\").toLowerCase();\n        const url = `${verse}.txt`;\n\n        // Call `fetch()`, passing in the URL.\n        fetch(url)\n          // fetch() returns a promise. When we have received a response from the server,\n          // the promise's `then()` handler is called with the response.\n          .then((response) => {\n            // Our handler throws an error if the request did not succeed.\n            if (!response.ok) {\n              throw new Error(`HTTP error: ${response.status}`);\n            }\n            // Otherwise (if the response succeeded), our handler fetches the response\n            // as text by calling response.text(), and immediately returns the promise\n            // returned by `response.text()`.\n            return response.text();\n          })\n          // When response.text() has succeeded, the `then()` handler is called with\n          // the text, and we copy it into the `poemDisplay` box.\n          .then((text) => {\n            poemDisplay.textContent = text;\n          })\n          // Catch any errors that might happen, and display a message\n          // in the `poemDisplay` box.\n          .catch((error) => {\n            poemDisplay.textContent = `Could not fetch verse: ${error}`;\n          });\n      }\n\n      updateDisplay(\"Verse 1\");\n      verseChoose.value = \"Verse 1\";\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/fetching-data/fetch-start.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n\n    <title>Fetch starting point</title>\n\n    <style>\n      html,\n      pre {\n        font-family: sans-serif;\n      }\n\n      body {\n        width: 500px;\n        margin: 0 auto;\n        background-color: #ccc;\n      }\n\n      pre {\n        line-height: 1.5;\n        letter-spacing: 0.05rem;\n        padding: 1rem;\n        background-color: white;\n      }\n\n      label {\n        width: 200px;\n        margin-right: 33px;\n      }\n\n      select {\n        width: 350px;\n        padding: 5px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <h1>Fetch starting point</h1>\n\n    <form>\n      <label for=\"verse-choose\">Choose a verse</label>\n      <select id=\"verse-choose\" name=\"verse-choose\">\n        <option>Verse 1</option>\n        <option>Verse 2</option>\n        <option>Verse 3</option>\n        <option>Verse 4</option>\n      </select>\n    </form>\n\n    <h2>The Conqueror Worm, <em>Edgar Allen Poe, 1843</em></h2>\n\n    <pre></pre>\n\n    <script></script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/fetching-data/verse1.txt",
    "content": "Lo! 'tis a gala night\n   Within the lonesome latter years!\nAn angel throng, bewinged, bedight\n   In veils, and drowned in tears,\nSit in a theatre, to see\n   A play of hopes and fears,\nWhile the orchestra breathes fitfully\n   The music of the spheres.\nMimes, in the form of God on high,\n   Mutter and mumble low,\nAnd hither and thither fly-\n   Mere puppets they, who come and go\nAt bidding of vast formless things\n   That shift the scenery to and fro,\nFlapping from out their Condor wings\n   Invisible Woe!\n"
  },
  {
    "path": "javascript/apis/fetching-data/verse2.txt",
    "content": "That motley drama- oh, be sure\n   It shall not be forgot!\nWith its Phantom chased for evermore,\n   By a crowd that seize it not,\nThrough a circle that ever returneth in\n   To the self-same spot,\nAnd much of Madness, and more of Sin,\n   And Horror the soul of the plot.\n"
  },
  {
    "path": "javascript/apis/fetching-data/verse3.txt",
    "content": "But see, amid the mimic rout\n   A crawling shape intrude!\nA blood-red thing that writhes from out\n   The scenic solitude!\nIt writhes!- it writhes!- with mortal pangs\n   The mimes become its food,\nAnd seraphs sob at vermin fangs\n   In human gore imbued.\n"
  },
  {
    "path": "javascript/apis/fetching-data/verse4.txt",
    "content": "Out- out are the lights- out all!\n   And, over each quivering form,\nThe curtain, a funeral pall,\n   Comes down with the rush of a storm,\nWhile the angels, all pallid and wan,\n   Uprising, unveiling, affirm\nThat the play is the tragedy, \"Man,\"\n   And its hero the Conqueror Worm. \n"
  },
  {
    "path": "javascript/apis/introduction/bouncing-balls.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Bouncing balls</title>\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n\n  <body>\n    <h1>bouncing balls</h1>\n    <canvas></canvas>\n\n    <script src=\"main.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/introduction/main.js",
    "content": "// setup canvas\n\nconst canvas = document.querySelector(\"canvas\");\nconst ctx = canvas.getContext(\"2d\");\n\nconst width = (canvas.width = window.innerWidth);\nconst height = (canvas.height = window.innerHeight);\n\n// function to generate random number\n\nfunction random(min, max) {\n  return Math.floor(Math.random() * (max - min)) + min;\n}\n\n// function to generate random color\n\nfunction randomRGB() {\n  return `rgb(${random(0, 255)},${random(0, 255)},${random(0, 255)})`;\n}\n\n// define Ball constructor\n\nfunction Ball() {\n  this.size = random(10, 20);\n  this.x = random(this.size * 2, width);\n  this.y = random(this.size * 2, height);\n  this.velX = random(-7, 7);\n  this.velY = random(-7, 7);\n  this.color = randomRGB();\n\n  while (this.velX == 0 && this.velY == 0) {\n    var change = random(0, 1); //decides whether to change x or y\n    if (change == 0) this.velX = random(-7, 7);\n    else this.velY = random(-7, 7);\n  }\n}\n\n// define ball draw method\n\nBall.prototype.draw = function () {\n  ctx.beginPath();\n  ctx.fillStyle = this.color;\n  ctx.arc(this.x, this.y, this.size, 0, 2 * Math.PI);\n  ctx.fill();\n};\n\n// define ball update method\n\nBall.prototype.update = function () {\n  if (this.x + this.size >= width) {\n    this.velX = -this.velX;\n  }\n\n  if (this.x - this.size <= 0) {\n    this.velX = -this.velX;\n  }\n\n  if (this.y + this.size >= height) {\n    this.velY = -this.velY;\n  }\n\n  if (this.y - this.size <= 0) {\n    this.velY = -this.velY;\n  }\n\n  this.x += this.velX;\n  this.y += this.velY;\n};\n\n// define ball collision detection\n\nBall.prototype.collisionDetect = function () {\n  for (const ball of balls) {\n    if (\n      !(\n        this.x === ball.x &&\n        this.y === ball.y &&\n        this.velX === ball.velX &&\n        this.velY === ball.velY\n      )\n    ) {\n      const dx = this.x - ball.x;\n      const dy = this.y - ball.y;\n      const distance = Math.sqrt(dx * dx + dy * dy);\n\n      if (distance < this.size + ball.size) {\n        ball.color = this.color = randomRGB();\n      }\n    }\n  }\n};\n\n// define array to store balls\n\nconst balls = [];\n\n// define loop that keeps drawing the scene constantly\n\nfunction loop() {\n  ctx.fillStyle = \"rgba(0,0,0,0.25)\";\n  ctx.fillRect(0, 0, width, height);\n\n  while (balls.length < 25) {\n    const ball = new Ball();\n    balls.push(ball);\n  }\n\n  for (const ball of balls) {\n    ball.draw();\n    ball.update();\n    ball.collisionDetect();\n  }\n\n  requestAnimationFrame(loop);\n}\n\nloop();\n"
  },
  {
    "path": "javascript/apis/introduction/style.css",
    "content": "html, body {\n  margin: 0;\n}\n\nhtml {\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  height: 100%;\n}\n\nbody {\n  overflow: hidden;\n  height: inherit;\n}\n\nh1 {\n  font-size: 2rem;\n  letter-spacing: -1px;\n  position: absolute;\n  margin: 0;\n  top: -4px;\n  right: 5px;\n\n  color: transparent;\n  text-shadow: 0 0 4px white;\n}"
  },
  {
    "path": "javascript/apis/introduction/web-audio/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Basic Web Audio example</title>\n    <style>\n      input {\n        height: 1.5em;\n      }\n    </style>\n  </head>\n  <body>\n    <audio src=\"outfoxing.mp3\"></audio>\n\n    <button class=\"paused\">Play</button>\n    <br />\n    <input type=\"range\" min=\"0\" max=\"1\" step=\"0.01\" value=\"1\" class=\"volume\" />\n\n    <script>\n      // Create an AudioContext (cross browser)\n      const AudioContext = window.AudioContext || window.webkitAudioContext;\n      const audioCtx = new AudioContext();\n\n      // store references to our HTML elements\n      const audioElement = document.querySelector(\"audio\");\n      const playBtn = document.querySelector(\"button\");\n      const volumeSlider = document.querySelector(\".volume\");\n\n      // load the audio source into our audio graph\n      const audioSource = audioCtx.createMediaElementSource(audioElement);\n\n      // play/pause audio\n      playBtn.addEventListener(\"click\", () => {\n        // check if context is in suspended state (autoplay policy)\n        if (audioCtx.state === \"suspended\") {\n          audioCtx.resume();\n        }\n\n        // if track is stopped, play it\n        if (playBtn.getAttribute(\"class\") === \"paused\") {\n          audioElement.play();\n          playBtn.setAttribute(\"class\", \"playing\");\n          playBtn.textContent = \"Pause\";\n          // if track is playing, stop it\n        } else if (playBtn.getAttribute(\"class\") === \"playing\") {\n          audioElement.pause();\n          playBtn.setAttribute(\"class\", \"paused\");\n          playBtn.textContent = \"Play\";\n        }\n      });\n\n      // if track ends\n      audioElement.addEventListener(\"ended\", () => {\n        playBtn.setAttribute(\"class\", \"paused\");\n        playBtn.textContent = \"Play\";\n      });\n\n      // volume\n      const gainNode = audioCtx.createGain();\n\n      volumeSlider.addEventListener(\"input\", () => {\n        gainNode.gain.value = volumeSlider.value;\n      });\n\n      // connect our graph\n      audioSource.connect(gainNode).connect(audioCtx.destination);\n\n      // Track credit: Outfoxing the Fox by Kevin MacLeod under Creative Commons\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/third-party-apis/mapquest/finished/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Mapquest example</title>\n    <script src=\"https://api.mqcdn.com/sdk/mapquest-js/v1.3.2/mapquest.js\" defer></script>\n    <script src=\"script.js\" defer></script>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://api.mqcdn.com/sdk/mapquest-js/v1.3.2/mapquest.css\"/>\n    <link href=\"style.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <h1>Simple Mapquest example</h1>\n\n    <div id=\"map\"></div>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/third-party-apis/mapquest/finished/script.js",
    "content": "L.mapquest.key = 'YOUR-API-KEY-HERE';\n\n// 'map' refers to a <div> element with the ID map\nconst map = L.mapquest.map('map', {\n  center: [53.480759, -2.242631],\n  // 1. change 'map' to 'hybrid', try other type of map\n  layers: L.mapquest.tileLayer('hybrid'),\n  zoom: 12\n});\n\n// 2. Add control\nmap.addControl(L.mapquest.control());\n\n// 3. Add icon\nL.marker([53.480759, -2.242631], {\n  icon: L.mapquest.icons.marker({\n    primaryColor: '#22407F',\n    secondaryColor: '#3B5998',\n    shadow: true,\n    size: 'md',\n    symbol: 'A'\n  })\n})\n.bindPopup('This is Manchester!')\n.addTo(map);\n"
  },
  {
    "path": "javascript/apis/third-party-apis/mapquest/finished/style.css",
    "content": "#map {\n  width: 600px;\n  height: 600px;\n}\n"
  },
  {
    "path": "javascript/apis/third-party-apis/mapquest/start/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Mapquest example</title>\n    <script src=\"https://api.mqcdn.com/sdk/mapquest-js/v1.3.2/mapquest.js\" defer></script>\n    <script src=\"script.js\" defer></script>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://api.mqcdn.com/sdk/mapquest-js/v1.3.2/mapquest.css\"/>\n    <link href=\"style.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <h1>Simple Mapquest example</h1>\n\n    <div id=\"map\"></div>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/third-party-apis/mapquest/start/script.js",
    "content": "L.mapquest.key = 'YOUR-API-KEY-HERE';\n\n// 'map' refers to a <div> element with the ID map\nconst map = L.mapquest.map('map', {\n  center: [53.480759, -2.242631],\n  layers: L.mapquest.tileLayer('map'),\n  zoom: 12\n});\n"
  },
  {
    "path": "javascript/apis/third-party-apis/mapquest/start/style.css",
    "content": "#map {\n  width: 600px;\n  height: 600px;\n}\n"
  },
  {
    "path": "javascript/apis/third-party-apis/nytimes/finished/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>NY Times API example</title>\n  <script src=\"script.js\" defer></script>\n    <link href=\"style.css\" rel=\"stylesheet\">\n  </head>\n<body>\n  <h1>NY Times article search</h1>\n\n  <div class=\"wrapper\">\n\n    <div class=\"controls\">\n      <form>\n        <p>\n          <label for=\"search\">Enter a SINGLE search term (required): </label>\n          <input type=\"text\" id=\"search\" class=\"search\" required>\n        </p>\n        <p>\n          <label for=\"start-date\">Enter a start date (format YYYYMMDD): </label>\n          <input type=\"date\" id=\"start-date\" class=\"start-date\" pattern=\"[0-9]{8}\">\n        </p>\n        <p>\n          <label for=\"end-date\">Enter an end date (format YYYYMMDD): </label>\n          <input type=\"date\" id=\"end-date\" class=\"end-date\" pattern=\"[0-9]{8}\">\n        </p>\n        <p>\n          <button class=\"submit\">Submit search</button>\n        </p>\n      </form>\n    </div>\n\n    <div class=\"results\">\n      <nav>\n        <button class=\"prev\">Previous 10</button>\n        <button class=\"next\">Next 10</button>\n      </nav>\n\n      <section>\n      </section>\n    </div>\n\n  </div>\n\n\n</body>\n</html>\n"
  },
  {
    "path": "javascript/apis/third-party-apis/nytimes/finished/script.js",
    "content": "// Defining a baseURL and key to as part of the request URL\n\nconst baseURL = 'https://api.nytimes.com/svc/search/v2/articlesearch.json';\nconst key = '3Cm3bHxG1I3ROE2N94Y8vw7347XEAaQk';\n\n// Grab references to all the DOM elements you'll need to manipulate\nconst searchTerm = document.querySelector('.search');\nconst startDate = document.querySelector('.start-date');\nconst endDate = document.querySelector('.end-date');\nconst searchForm = document.querySelector('form');\nconst nextBtn = document.querySelector('.next');\nconst previousBtn = document.querySelector('.prev');\nconst section = document.querySelector('section');\nconst nav = document.querySelector('nav');\n\n// Hide the \"Previous\"/\"Next\" navigation to begin with, as we don't need it immediately\nnav.style.display = 'none';\n\n// define the initial page number and status of the navigation being displayed\nlet pageNumber = 0;\n\n// Event listeners to control the functionality\nsearchForm.addEventListener('submit', submitSearch);\nnextBtn.addEventListener('click', nextPage);\npreviousBtn.addEventListener('click', previousPage);\n\nfunction submitSearch(e){\n  pageNumber = 0;\n  fetchResults(e);\n}\n\nfunction fetchResults(e) {\n  // Use preventDefault() to stop the form submitting\n  e.preventDefault();\n\n  // Assemble the full URL\n  let url = `${baseURL}?api-key=${key}&page=${pageNumber}&q=${searchTerm.value}&fq=document_type:(\"article\")`;\n\n  if (startDate.value !== '') {\n    url = `${url}&begin_date=${startDate.value}`;\n  };\n\n  if (endDate.value !== '') {\n    url = `${url}&end_date=${endDate.value}`;\n  };\n\n  // Use fetch() to make the request to the API\n  fetch(url)\n    .then( response => response.json() )\n    .then( json => displayResults(json) )\n    .catch( error => console.error(`Error fetching data: ${error.message}`) );\n}\n\nfunction displayResults(json) {\n  while (section.firstChild) {\n    section.removeChild(section.firstChild);\n  }\n\n  const articles = json.response.docs;\n\n  if (articles.length === 10) {\n    nav.style.display = 'block';\n  } else {\n    nav.style.display = 'none';\n  }\n\n  if (articles.length === 0) {\n    const para = document.createElement('p');\n    para.textContent = 'No results returned.'\n    section.appendChild(para);\n  } else {\n    for (const current of articles) {\n      const article = document.createElement('article');\n      const heading = document.createElement('h2');\n      const link = document.createElement('a');\n      const img = document.createElement('img');\n      const para1 = document.createElement('p');\n      const keywordPara = document.createElement('p');\n      keywordPara.classList.add('keywords');\n\n      console.log(current);\n\n      link.href = current.web_url;\n      link.textContent = current.headline.main;\n      para1.textContent = current.snippet;\n      keywordPara.textContent = 'Keywords: ';\n      for (const keyword of current.keywords) {\n        const span = document.createElement('span');\n        span.textContent = `${keyword.value} `;\n        keywordPara.appendChild(span);\n      }\n\n      if (current.multimedia.length > 0) {\n        img.src = `http://www.nytimes.com/${current.multimedia[0].url}`;\n        img.alt = current.headline.main;\n      }\n\n      article.appendChild(heading);\n      heading.appendChild(link);\n      article.appendChild(img);\n      article.appendChild(para1);\n      article.appendChild(keywordPara);\n      section.appendChild(article);\n    }\n  }\n};\n\nfunction nextPage(e) {\n  pageNumber++;\n  fetchResults(e);\n};\n\nfunction previousPage(e) {\n  if(pageNumber > 0) {\n    pageNumber--;\n  } else {\n    return;\n  }\n  fetchResults(e);\n};\n"
  },
  {
    "path": "javascript/apis/third-party-apis/nytimes/finished/style.css",
    "content": "body {\n  font-family: sans-serif;\n}\n\n.wrapper {\n  width: 80%;\n  margin: 0 auto;\n  display: flex;\n}\n\n.controls, .results {\n  flex: 1;\n  padding: 10px;\n}\n\nform p:nth-of-type(1) {\n  margin-top: 0;\n}\n\nh1 {\n  text-align: center;\n}\n\nh2 {\n  font-size: 20px;\n}\n\narticle p {\n  font-size: 14px;\n  line-height: 1.5;\n}\n\narticle p.keywords {\n  font-size: 14px;\n  line-height: 2;\n}\n\nnav {\n  margin-bottom: 50px;\n}\n\n.prev {\n  float: left;\n}\n\n.next {\n  float: right;\n}\n\narticle {\n  padding: 10px;\n  margin-bottom: 20px;\n  background-color: #ddd;\n  border: 1px solid #ccc;\n}\n\nimg {\n  float: right;\n  margin-left: 20px;\n  max-width: 200px;\n}\n\nspan {\n  background-color: #ccc;\n  padding: 5px;\n  margin: 5px;\n}\n"
  },
  {
    "path": "javascript/apis/third-party-apis/nytimes/start/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>NY Times API example</title>\n  <script src=\"script.js\" defer></script>\n    <link href=\"style.css\" rel=\"stylesheet\">\n  </head>\n<body>\n  <h1>NY Times article search</h1>\n\n  <div class=\"wrapper\">\n\n    <div class=\"controls\">\n      <form>\n        <p>\n          <label for=\"search\">Enter a SINGLE search term (required): </label>\n          <input type=\"text\" id=\"search\" class=\"search\" required>\n        </p>\n        <p>\n          <label for=\"start-date\">Enter a start date (format YYYYMMDD): </label>\n          <input type=\"date\" id=\"start-date\" class=\"start-date\" pattern=\"[0-9]{8}\">\n        </p>\n        <p>\n          <label for=\"end-date\">Enter an end date (format YYYYMMDD): </label>\n          <input type=\"date\" id=\"end-date\" class=\"end-date\" pattern=\"[0-9]{8}\">\n        </p>\n        <p>\n          <button class=\"submit\">Submit search</button>\n        </p>\n      </form>\n    </div>\n\n    <div class=\"results\">\n      <nav>\n        <button class=\"prev\">Previous 10</button>\n        <button class=\"next\">Next 10</button>\n      </nav>\n\n      <section>\n      </section>\n    </div>\n\n  </div>\n\n</body>\n</html>\n"
  },
  {
    "path": "javascript/apis/third-party-apis/nytimes/start/script.js",
    "content": "// Defining a baseURL and key to as part of the request URL\n\nconst baseURL = 'https://api.nytimes.com/svc/search/v2/articlesearch.json';\nconst key = 'INSERT-YOUR-API-KEY-HERE';\n\n// Grab references to all the DOM elements you'll need to manipulate\nconst searchTerm = document.querySelector('.search');\nconst startDate = document.querySelector('.start-date');\nconst endDate = document.querySelector('.end-date');\nconst searchForm = document.querySelector('form');\nconst nextBtn = document.querySelector('.next');\nconst previousBtn = document.querySelector('.prev');\nconst section = document.querySelector('section');\nconst nav = document.querySelector('nav');\n\n// Hide the \"Previous\"/\"Next\" navigation to begin with, as we don't need it immediately\nnav.style.display = 'none';\n\n// define the initial page number and status of the navigation being displayed\nlet pageNumber = 0;\n\n// Event listeners to control the functionality\n"
  },
  {
    "path": "javascript/apis/third-party-apis/nytimes/start/style.css",
    "content": "body {\n  font-family: sans-serif;\n}\n\n.wrapper {\n  width: 80%;\n  margin: 0 auto;\n  display: flex;\n}\n\n.controls, .results {\n  flex: 1;\n  padding: 10px;\n}\n\nform p:nth-of-type(1) {\n  margin-top: 0;\n}\n\nh1 {\n  text-align: center;\n}\n\nh2 {\n  font-size: 20px;\n}\n\narticle p {\n  font-size: 14px;\n  line-height: 1.5;\n}\n\narticle p.keywords {\n  line-height: 2;\n}\n\nnav {\n  margin-bottom: 50px;\n}\n\n.prev {\n  float: left;\n}\n\n.next {\n  float: right;\n}\n\narticle {\n  padding: 10px;\n  margin-bottom: 20px;\n  background-color: #ddd;\n  border: 1px solid #ccc;\n}\n\nimg {\n  float: right;\n  margin-left: 20px;\n  max-width: 200px;\n}\n\nspan {\n  background-color: #ccc;\n  padding: 5px;\n  margin: 5px;\n}\n"
  },
  {
    "path": "javascript/apis/third-party-apis/youtube/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>YouTube APIs example</title>\n    <!--\n      Apply both necessary API scripts to your HTML. The first is for the YouTube Data\n      API, and the second is for the YouTube Iframe Player API\n    -->\n    <script src=\"https://apis.google.com/js/client.js\" type=\"text/javascript\"></script>\n    <script src=\"https://www.youtube.com/iframe_api\" type=\"text/javascript\"></script>\n    <script src=\"script.js\" defer></script>\n    <link href=\"youtube.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <h1>YouTube video search</h1>\n\n    <div class=\"wrapper\">\n\n      <div class=\"controls\">\n        <form>\n          <p>\n            <label for=\"search\">Enter a search term (required): </label>\n            <input type=\"text\" id=\"search\" class=\"search\" required>\n          </p>\n          <p>\n            <button class=\"submit\">Submit search</button>\n          </p>\n        </form>\n      </div>\n\n      <div class=\"results\">\n        <section>\n        </section>\n      </div>\n\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/third-party-apis/youtube/script.js",
    "content": "// Get references to DOM elements we need to manipulate\nconst searchTerm = document.querySelector('.search');\nconst searchForm = document.querySelector('form');\nconst submitBtn = document.querySelector('.submit');\n\nconst section = document.querySelector('section');\n\n// When the window (tab) has finished loading, run onClientLoad()\n// to get it all started\nwindow.addEventListener('load', onClientLoad);\n\n// Load and initialize the API, then run the onYouTubeApiLoad() function once this is done\nfunction onClientLoad() {\n  gapi.client.load('youtube', 'v3', onYouTubeApiLoad);\n}\n\n// Attach your key to the API\nfunction onYouTubeApiLoad() {\n  // To get a key for your own application:\n  // 1. Go to https://console.cloud.google.com/apis/dashboard\n  // 2. Create a new project if you've not already got one\n  // 3. Click the Enable API button\n  // 4. Choose YouTube Data API\n  // 5. Click the Enable button\n  // 6. Click create credentials\n  // 7. Select \"Web browser (JavaScript)\" from the second dropdown\n  // 8. Click the \"Public data\" radio button\n  // 9. Click the \"What credentials do I need?\" button\n  // 10. Copy your API key and paste it in below\n  gapi.client.setApiKey('YOUR-API-KEY-HERE');\n\n  // Attach an event listener to the form so that a search is carried out\n  // when it is submitted — the search() function\n  searchForm.addEventListener('submit', search);\n}\n\nfunction search(e) {\n  // use preventDefault() to stop form actually submitting\n  e.preventDefault();\n\n  // create a search request using the Data API;\n  const request = gapi.client.youtube.search.list({\n    // set what kind of data the response will include\n    part: 'snippet',\n    // set the number of results that will be returned\n    maxResults: 10,\n    // set the search query to search for\n    q: searchTerm.value\n  });\n\n  // send the request, and specify a function to run when the response returns\n  request.execute(onSearchResponse);\n}\n\n// This function automatically has the response passed in as a parameter\nfunction onSearchResponse(response) {\n  // Empty the <section> element\n  while (section.firstChild) {\n      section.removeChild(section.firstChild);\n  }\n\n  // Store the actual results of the search in a variable\n  const results = response.items;\n\n  // loop through the results and run displayVideo() on each\n  for (let i = 0; i < results.length; i++) {\n    displayVideo(results[i], i);\n  }\n}\n\nfunction displayVideo(result, i) {\n  // Create a div with a unique ID for each video, and append it to the <section>\n  // The YouTube Iframe Player API will replace each one with\n  // an <iframe> containing the corresponding video\n  const vid = document.createElement('div');\n  vidId = 'vid' + i;\n  vid.id = vidId;\n  section.appendChild(vid);\n\n  // Use the YT.Player() constructor to create a new video player object,\n  // Specifying the ID of the element to be replaced by it (the <div>),\n  // A height and width, and an event handler to handle the custom onReady event\n  const player = new YT.Player(vidId, {\n    height: '360',\n    width: '480',\n    videoId: result.id.videoId,\n    events: {\n      'onReady': onPlayerReady\n    }\n  });\n\n  // The onPlayerReady() handler grabs the ID of each video, and checks its duration\n  // If the duration is 0, the video can't be played, so we just delete it\n  function onPlayerReady(e) {\n    console.log(e.target)\n    const myId = e.target.id;\n    const duration = e.target.getDuration();\n    if (duration === 0) {\n      console.log(`Video ${myId} cannot be played, so it was deleted.`);\n      section.removeChild(e.target.a);\n    } else {\n      console.log(`Video ${myId} ready to play.`);\n    }\n  }\n}\n"
  },
  {
    "path": "javascript/apis/third-party-apis/youtube/youtube.css",
    "content": "body {\n  font-family: sans-serif;\n}\n\n.wrapper {\n  width: 80%;\n  margin: 0 auto;\n  display: flex;\n}\n\n.controls, .results {\n  flex: 1;\n  padding: 10px;\n}\n\nform p:nth-of-type(1) {\n  margin-top: 0;\n}\n\nh1 {\n  text-align: center;\n}\n\nh2 {\n  font-size: 20px;\n}\n\narticle p {\n  font-size: 14px;\n  line-height: 1.5;\n}\n\narticle p:nth-of-type(2) {\n  font-size: 14px;\n  line-height: 2;\n}\n\nnav {\n  margin-bottom: 50px;\n}\n\n.prev {\n  float: left;\n}\n\n.next {\n  float: right;\n}\n\narticle {\n  padding: 10px;\n  margin-bottom: 20px;\n  background-color: #ddd;\n  border: 1px solid #ccc;\n}\n\nimg {\n  float: right;\n  margin-left: 20px;\n  max-width: 200px;\n}\n\n.clearfix {\n  clear: both;\n}\n\nspan {\n  background-color: #ccc;\n  padding: 5px;\n  margin: 5px;\n}\n"
  },
  {
    "path": "javascript/apis/video-audio/finished/custom-player.js",
    "content": "const media = document.querySelector(\"video\");\nconst controls = document.querySelector(\".controls\");\n\nconst play = document.querySelector(\".play\");\nconst stop = document.querySelector(\".stop\");\nconst rwd = document.querySelector(\".rwd\");\nconst fwd = document.querySelector(\".fwd\");\n\nconst timerWrapper = document.querySelector(\".timer\");\nconst timer = document.querySelector(\".timer span\");\nconst timerBar = document.querySelector(\".timer div\");\n\nmedia.removeAttribute(\"controls\");\ncontrols.style.visibility = \"visible\";\n\nplay.addEventListener(\"click\", playPauseMedia);\nstop.addEventListener(\"click\", stopMedia);\nmedia.addEventListener(\"ended\", stopMedia);\nrwd.addEventListener(\"click\", mediaBackward);\nfwd.addEventListener(\"click\", mediaForward);\nmedia.addEventListener(\"timeupdate\", setTime);\n\nfunction playPauseMedia() {\n  rwd.classList.remove(\"active\");\n  fwd.classList.remove(\"active\");\n  clearInterval(intervalRwd);\n  clearInterval(intervalFwd);\n  if (media.paused) {\n    play.setAttribute(\"data-icon\", \"u\");\n    media.play();\n  } else {\n    play.setAttribute(\"data-icon\", \"P\");\n    media.pause();\n  }\n}\n\nfunction stopMedia() {\n  rwd.classList.remove(\"active\");\n  fwd.classList.remove(\"active\");\n  media.pause();\n  media.currentTime = 0;\n  clearInterval(intervalRwd);\n  clearInterval(intervalFwd);\n  play.setAttribute(\"data-icon\", \"P\");\n}\n\nlet intervalFwd;\nlet intervalRwd;\n\nfunction mediaBackward() {\n  clearInterval(intervalFwd);\n  fwd.classList.remove(\"active\");\n\n  if (rwd.classList.contains(\"active\")) {\n    rwd.classList.remove(\"active\");\n    clearInterval(intervalRwd);\n    media.play();\n  } else {\n    rwd.classList.add(\"active\");\n    media.pause();\n    intervalRwd = setInterval(windBackward, 200);\n  }\n}\n\nfunction mediaForward() {\n  clearInterval(intervalRwd);\n  rwd.classList.remove(\"active\");\n\n  if (fwd.classList.contains(\"active\")) {\n    fwd.classList.remove(\"active\");\n    clearInterval(intervalFwd);\n    media.play();\n  } else {\n    fwd.classList.add(\"active\");\n    media.pause();\n    intervalFwd = setInterval(windForward, 200);\n  }\n}\n\nfunction windBackward() {\n  if (media.currentTime <= 3) {\n    rwd.classList.remove(\"active\");\n    clearInterval(intervalRwd);\n    stopMedia();\n  } else {\n    media.currentTime -= 3;\n  }\n}\n\nfunction windForward() {\n  if (media.currentTime >= media.duration - 3) {\n    fwd.classList.remove(\"active\");\n    clearInterval(intervalFwd);\n    stopMedia();\n  } else {\n    media.currentTime += 3;\n  }\n}\n\nfunction setTime() {\n  const minutes = Math.floor(media.currentTime / 60);\n  const seconds = Math.floor(media.currentTime - minutes * 60);\n\n  const minuteValue = minutes.toString().padStart(2, \"0\");\n  const secondValue = seconds.toString().padStart(2, \"0\");\n\n  const mediaTime = `${minuteValue}:${secondValue}`;\n  timer.textContent = mediaTime;\n\n  const barLength =\n    timerWrapper.clientWidth * (media.currentTime / media.duration);\n  timerBar.style.width = `${barLength}px`;\n}\n"
  },
  {
    "path": "javascript/apis/video-audio/finished/index.html",
    "content": "<!DOCTYPE HTML>\n<html lang=\"en-gb\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Video player example</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n  </head>\n  <body>\n    <div class=\"player\">\n      <video controls>\n        <source src=\"video/sintel-short.mp4\" type=\"video/mp4\" />\n        <source src=\"video/sintel-short.webm\" type=\"video/webm\" />\n        <!-- fallback content here -->\n      </video>\n      <div class=\"controls\">\n        <button class=\"play\" data-icon=\"P\" aria-label=\"play pause toggle\"></button>\n        <button class=\"stop\" data-icon=\"S\" aria-label=\"stop\"></button>\n        <div class=\"timer\">\n          <div></div>\n          <span aria-label=\"timer\">00:00</span>\n        </div>\n        <button class=\"rwd\" data-icon=\"B\" aria-label=\"rewind\"></button>\n        <button class=\"fwd\" data-icon=\"F\" aria-label=\"fast forward\"></button>\n      </div>\n    </div>\n    <p>Sintel &copy; copyright Blender Foundation | <a href=\"https://studio.blender.org/films/sintel/\">studio.blender.org/films/sintel/</a>.</p>\n    <script src=\"custom-player.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/video-audio/finished/style.css",
    "content": "@font-face {\n  font-family: \"HeydingsControlsRegular\";\n  src: url(\"fonts/heydings_controls-webfont.eot\");\n  src:\n    url(\"fonts/heydings_controls-webfont.eot?#iefix\") format(\"embedded-opentype\"),\n    url(\"fonts/heydings_controls-webfont.woff\") format(\"woff\"),\n    url(\"fonts/heydings_controls-webfont.ttf\") format(\"truetype\");\n  font-weight: normal;\n  font-style: normal;\n}\n\nvideo {\n  border: 1px solid black;\n}\n\np {\n  position: absolute;\n  top: 310px;\n}\n\n.player {\n  position: absolute;\n}\n\n.controls {\n  visibility: hidden;\n  opacity: 0.5;\n  width: 400px;\n  border-radius: 10px;\n  position: absolute;\n  bottom: 20px;\n  left: 50%;\n  margin-left: -200px;\n  background-color: black;\n  box-shadow: 3px 3px 5px black;\n  transition: 1s all;\n  display: flex;\n}\n\n.player:hover .controls,\n.player:focus-within .controls {\n  opacity: 1;\n}\n\nbutton, .controls {\n  background: linear-gradient(to bottom,#222,#666);\n}\n\nbutton:before {\n  font-family: HeydingsControlsRegular;\n  font-size: 20px;\n  position: relative;\n  content: attr(data-icon);\n  color: #aaa;\n  text-shadow: 1px 1px 0px black;\n}\n\n.play:before {\n  font-size: 22px;\n}\n\n\nbutton, .timer {\n  height: 38px;\n  line-height: 19px;\n  box-shadow: inset 0 -5px 25px rgba(0,0,0,0.3);\n  border-right: 1px solid #333;\n}\n\nbutton {\n  position: relative;\n  border: 0;\n  flex: 1;\n  outline: none;\n}\n\n.play {\n  border-radius: 10px 0 0 10px;\n}\n\n.fwd {\n  border-radius: 0 10px 10px 0;\n}\n\n.timer {\n  line-height: 38px;\n  font-size: 10px;\n  font-family: monospace;\n  text-shadow: 1px 1px 0px black;\n  color: white;\n  flex: 5;\n  position: relative;\n}\n\n.timer div {\n  position: absolute;\n  background-color: rgb(255 255 255 / 20%);\n  left: 0;\n  top: 0;\n  width: 0;\n  height: 38px;\n  z-index: 2;\n}\n\n.timer span {\n  position: absolute;\n  z-index: 3;\n  left: 19px;\n}\n\nbutton:hover,button:focus {\n  box-shadow: inset 1px 1px 2px black;\n}\n\nbutton:active {\n  box-shadow: inset 3px 3px 2px black;\n}\n\n.active:before {\n  color: red;\n}\n"
  },
  {
    "path": "javascript/apis/video-audio/start/index.html",
    "content": "<!DOCTYPE HTML>\n<html lang=\"en-gb\">\n  <head>\n  \t<meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  \t<title>Video player example</title>\n  \t<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n  </head>\n  <body>\n    <div class=\"player\">\n      <video controls>\n        <source src=\"video/sintel-short.mp4\" type=\"video/mp4\" />\n        <source src=\"video/sintel-short.webm\" type=\"video/webm\" />\n        <!-- fallback content here -->\n      </video>\n      <div class=\"controls\">\n        <button class=\"play\" data-icon=\"P\" aria-label=\"play pause toggle\"></button>\n        <button class=\"stop\" data-icon=\"S\" aria-label=\"stop\"></button>\n        <div class=\"timer\">\n          <div></div>\n          <span aria-label=\"timer\">00:00</span>\n        </div>\n        <button class=\"rwd\" data-icon=\"B\" aria-label=\"rewind\"></button>\n        <button class=\"fwd\" data-icon=\"F\" aria-label=\"fast forward\"></button>\n      </div>\n    </div>\n    <p>Sintel &copy; copyright Blender Foundation | <a href=\"https://studio.blender.org/films/sintel/\">studio.blender.org/films/sintel/</a>.</p>\n    <script src=\"custom-player.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/apis/video-audio/start/style.css",
    "content": "@font-face {\n  font-family: \"HeydingsControlsRegular\";\n  src: url(\"fonts/heydings_controls-webfont.eot\");\n  src:\n    url(\"fonts/heydings_controls-webfont.eot?#iefix\") format(\"embedded-opentype\"),\n    url(\"fonts/heydings_controls-webfont.woff\") format(\"woff\"),\n    url(\"fonts/heydings_controls-webfont.ttf\") format(\"truetype\");\n  font-weight: normal;\n  font-style: normal;\n}\n\nvideo {\n  border: 1px solid black;\n}\n\np {\n  position: absolute;\n  top: 310px;\n}\n\n.player {\n  position: absolute;\n}\n\n.controls {\n  visibility: hidden;\n  opacity: 0.5;\n  width: 400px;\n  border-radius: 10px;\n  position: absolute;\n  bottom: 20px;\n  left: 50%;\n  margin-left: -200px;\n  background-color: black;\n  box-shadow: 3px 3px 5px black;\n  transition: 1s all;\n  display: flex;\n}\n\n.player:hover .controls,\n.player:focus-within .controls {\n  opacity: 1;\n}\n\nbutton, .controls {\n  background: linear-gradient(to bottom,#222,#666);\n}\n\nbutton:before {\n  font-family: HeydingsControlsRegular;\n  font-size: 20px;\n  position: relative;\n  content: attr(data-icon);\n  color: #aaa;\n  text-shadow: 1px 1px 0px black;\n}\n\n.play:before {\n  font-size: 22px;\n}\n\n\nbutton, .timer {\n  height: 38px;\n  line-height: 19px;\n  box-shadow: inset 0 -5px 25px rgba(0,0,0,0.3);\n  border-right: 1px solid #333;\n}\n\nbutton {\n  position: relative;\n  border: 0;\n  flex: 1;\n  outline: none;\n}\n\n.play {\n  border-radius: 10px 0 0 10px;\n}\n\n.fwd {\n  border-radius: 0 10px 10px 0;\n}\n\n.timer {\n  line-height: 38px;\n  font-size: 10px;\n  font-family: monospace;\n  text-shadow: 1px 1px 0px black;\n  color: white;\n  flex: 5;\n  position: relative;\n}\n\n.timer div {\n  position: absolute;\n  background-color: rgb(255 255 255 / 20%);\n  left: 0;\n  top: 0;\n  width: 0;\n  height: 38px;\n  z-index: 2;\n}\n\n.timer span {\n  position: absolute;\n  z-index: 3;\n  left: 19px;\n}\n\nbutton:hover,button:focus {\n  box-shadow: inset 1px 1px 2px black;\n}\n\nbutton:active {\n  box-shadow: inset 3px 3px 2px black;\n}\n\n.active:before {\n  color: red;\n}\n"
  },
  {
    "path": "javascript/asynchronous/sequencing-animations/finished/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Sequencing Animations</title>\n    <script type=\"text/javascript\" src=\"main.js\" defer></script>\n    <link href=\"style.css\"rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <div id=\"alice-container\">\n      <img id=\"alice1\"  src=\"alice.svg\" role=\"img\" alt=\"silhouette of crouching long haired character in dress and short boots\">\n      <img id=\"alice2\"  src=\"alice.svg\" role=\"img\" alt=\"silhouette of crouching long haired character in dress and short boots\">\n      <img id=\"alice3\"  src=\"alice.svg\" role=\"img\" alt=\"silhouette of crouching long haired character in dress and short boots\">\n    </div>\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "javascript/asynchronous/sequencing-animations/finished/main.js",
    "content": "const aliceTumbling = [\n  { transform: 'rotate(0) scale(1)' },\n  { transform: 'rotate(360deg) scale(0)' }\n];\n\nconst aliceTiming = {\n  duration: 2000,\n  iterations: 1,\n  fill: 'forwards'\n}\n\nconst alice1 = document.querySelector(\"#alice1\");\nconst alice2 = document.querySelector(\"#alice2\");\nconst alice3 = document.querySelector(\"#alice3\");\n\nalice1.animate(aliceTumbling, aliceTiming).finished\n  .then(() => alice2.animate(aliceTumbling, aliceTiming).finished)\n  .then(() => alice3.animate(aliceTumbling, aliceTiming).finished)\n  .catch(error => console.error(`Error animating Alices: ${error}`));\n"
  },
  {
    "path": "javascript/asynchronous/sequencing-animations/finished/style.css",
    "content": "body {\n  background: #6c373f;\n  display: flex;\n  justify-content: center;\n  }\n\n#alice-container {\n  width: 90vh;\n  display: grid;\n  place-items: center;\n  grid-template-areas:\n    \"a1 . .\"\n    \". a2 .\"\n    \". . a3\";\n}\n\n#alice1 {\n  grid-area: a1;\n}\n\n#alice2 {\n  grid-area: a2;\n}\n\n#alice3 {\n  grid-area: a3;\n}\n"
  },
  {
    "path": "javascript/asynchronous/sequencing-animations/marking-guide.md",
    "content": "\n# Marking guide for \"Sequencing animations\"\n\nThe following guide outlines a marking guide for the MDN Learning Area JavaScript Topic — [Sequencing animations](https://developer.mozilla.org/en-US/Learn/JavaScript/Asynchronous/Sequencing_animations). Each subtask detailed in the assessment is listed below, along with an explanation of how many marks the task is worth, and the mark breakdown.\n\nNote: These are guidelines, not set in stone rules — you are of course free to use your judgement on mark awarding when you meet an edge case, or something that isn't clear cut.\n\nThe overall mark awarded is out of 9.\n\nThe assessment asks for the animation sequence to be implemented in three different forms:\n\n1. \"Promise hell\": something that works, but has the promise version of the \"callback hell\" problem.\n\n2. \"Promise chain\": implemented as a promise chain. There are a few different ways to write this, because of the different forms an arrow function can take. We ask which is the most concise form.\n\n3. \"async/await\": implemented using async and await.\n\n## Promise hell\n\nThree marks for this. The code should look something like:\n\n```js\nalice1.animate(aliceTumbling, aliceTiming).finished\n  .then(() => {\n    const alice2Animation = alice2.animate(aliceTumbling, aliceTiming).finished;\n    alice2Animation.then(() => {\n      alice3.animate(aliceTumbling, aliceTiming);\n    });\n  });\n```\n\nThe main thing here is that we nest calls to `then()`, making the code much harder to read.\n\n## Promise chain\n\nThree marks for this. The code should look something like:\n\n```js\nalice1.animate(aliceTumbling, aliceTiming).finished\n  .then(() => alice2.animate(aliceTumbling, aliceTiming).finished)\n  .then(() => alice3.animate(aliceTumbling, aliceTiming).finished)\n  .catch(error => console.error(`Error animating Alices: ${error}`));\n```\n\nThis is the most concise version. It would be fine to have some different ways of writing the arrow functions, such as:\n\n```js\nalice1.animate(aliceTumbling, aliceTiming).finished\n  .then(() => { return alice2.animate(aliceTumbling, aliceTiming).finished; })\n  .then(() => { return alice3.animate(aliceTumbling, aliceTiming).finished; })\n  .catch(error => console.error(`Error animating Alices: ${error}`));\n```\n\n## async/await\n\nThree marks for this. The code should look something like:\n\n```js\nasync function animateAlices() {\n  try {\n    await alice1.animate(aliceTumbling, aliceTiming).finished;\n    await alice2.animate(aliceTumbling, aliceTiming).finished;\n    await alice3.animate(aliceTumbling, aliceTiming).finished;\n  }\n  catch (error) {\n    console.error(`Error animating Alices: ${error}`);\n  }\n}\n\nanimateAlices();\n```\n"
  },
  {
    "path": "javascript/asynchronous/sequencing-animations/start/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Sequencing animations</title>\n    <script type=\"text/javascript\" src=\"main.js\" defer></script>\n    <link href=\"style.css\"rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <div id=\"alice-container\">\n      <img id=\"alice1\"  src=\"alice.svg\" role=\"img\" alt=\"silhouette of crouching long haired character in dress and short boots\">\n      <img id=\"alice2\"  src=\"alice.svg\" role=\"img\" alt=\"silhouette of crouching long haired character in dress and short boots\">\n      <img id=\"alice3\"  src=\"alice.svg\" role=\"img\" alt=\"silhouette of crouching long haired character in dress and short boots\">\n    </div>\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "javascript/asynchronous/sequencing-animations/start/main.js",
    "content": "const aliceTumbling = [\n  { transform: 'rotate(0) scale(1)' },\n  { transform: 'rotate(360deg) scale(0)' }\n];\n\nconst aliceTiming = {\n  duration: 2000,\n  iterations: 1,\n  fill: 'forwards'\n}\n\nconst alice1 = document.querySelector(\"#alice1\");\nconst alice2 = document.querySelector(\"#alice2\");\nconst alice3 = document.querySelector(\"#alice3\");\n"
  },
  {
    "path": "javascript/asynchronous/sequencing-animations/start/style.css",
    "content": "body {\n  background: #6c373f;\n  display: flex;\n  justify-content: center;\n  }\n\n#alice-container {\n  width: 90vh;\n  display: grid;\n  place-items: center;\n  grid-template-areas:\n    \"a1 . .\"\n    \". a2 .\"\n    \". . a3\";\n}\n\n#alice1 {\n  grid-area: a1;\n}\n\n#alice2 {\n  grid-area: a2;\n}\n\n#alice3 {\n  grid-area: a3;\n}\n"
  },
  {
    "path": "javascript/asynchronous/workers/finished/generate.js",
    "content": "addEventListener(\"message\", message => {\n  if (message.data.command === 'generate') {\n    generatePrimes(message.data.quota);\n  }\n});\n\nfunction generatePrimes(quota) {\n\n  function isPrime(n) {\n    for (let c = 2; c <= Math.sqrt(n); ++c) {\n      if (n % c === 0) {\n          return false;\n       }\n    }\n    return true;\n  }\n\n  const primes = [];\n  const maximum = 1000000;\n\n  while (primes.length < quota) {\n    const candidate = Math.floor(Math.random() * (maximum + 1));\n    if (isPrime(candidate)) {\n      primes.push(candidate);\n    }\n  }\n\n  postMessage(primes.length);\n}\n"
  },
  {
    "path": "javascript/asynchronous/workers/finished/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Prime numbers</title>\n    <script type=\"text/javascript\" src=\"main.js\" defer></script>\n    <link href=\"style.css\"rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <label for=\"quota\">Number of primes:</label>\n    <input type=\"text\" id=\"quota\" name=\"quota\" value=\"1000000\">\n\n    <button id=\"generate-primes\">Generate primes</button>\n    <button id=\"reload\">Reload</button>\n\n    <textarea id=\"user-input\" rows=\"5\" cols=\"62\">Try typing in here immediately after pressing \"Generate primes\"</textarea>\n\n    <div id=\"output\"></div>\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "javascript/asynchronous/workers/finished/main.js",
    "content": "// Create a new worker, giving it the code in \"generate.js\"\nconst worker = new Worker('./generate.js');\n\n// When the user clicks \"Generate primes\", send a message to the worker.\n// The message command is \"generate\", and the message also contains \"quota\",\n// which is the number of primes to generate.\ndocument.querySelector('#generate-primes').addEventListener('click', () => {\n  const quota = document.querySelector('#quota').value;\n  worker.postMessage({\n    command: 'generate',\n    quota: quota\n  });\n});\n\n// When the worker sends a message back to the main thread,\n// update the output box with a message for the user, including the number of\n// primes that were generated, taken from the message data.\nworker.addEventListener('message', message => {\n  document.querySelector('#output').textContent = `Finished generating ${message.data} primes!`;\n});\n\ndocument.querySelector('#reload').addEventListener('click', () => {\n  document.querySelector('#user-input').value = 'Try typing in here immediately after pressing \"Generate primes\"';\n  document.location.reload();\n});\n"
  },
  {
    "path": "javascript/asynchronous/workers/finished/style.css",
    "content": "textarea {\n  display: block;\n  margin: 1rem 0;\n}\n"
  },
  {
    "path": "javascript/asynchronous/workers/start/generate.js",
    "content": ""
  },
  {
    "path": "javascript/asynchronous/workers/start/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Number of primes</title>\n    <script type=\"text/javascript\" src=\"main.js\" defer></script>\n    <link href=\"style.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n\n    <label for=\"quota\">Number of primes:</label>\n    <input type=\"text\" id=\"quota\" name=\"quota\" value=\"1000000\">\n\n    <button id=\"generate\">Generate primes</button>\n    <button id=\"reload\">Reload</button>\n\n    <textarea id=\"user-input\" rows=\"5\" cols=\"62\">Try typing in here immediately after pressing \"Generate primes\"</textarea>\n\n    <div id=\"output\"></div>\n\n  </body>\n\n</html>\n"
  },
  {
    "path": "javascript/asynchronous/workers/start/main.js",
    "content": ""
  },
  {
    "path": "javascript/asynchronous/workers/start/style.css",
    "content": "textarea {\n  display: block;\n  margin: 1rem 0;\n}\n"
  },
  {
    "path": "javascript/building-blocks/allowance-updater.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Allowance updater example</title>\n  </head>\n  <body>\n    <label for=\"shopping-check\">Has the shopping been done? </label>\n    <input type=\"checkbox\" id=\"shopping-check\">\n\n    <p></p>\n\n    <script>\n      const checkBox = document.querySelector('input');\n      const para = document.querySelector('p');\n      let shoppingDone = false;\n\n      checkBox.addEventListener('change', () => {\n        checkBox.disabled = true;\n        shoppingDone = true;\n        updateAllowance();\n      });\n\n      function updateAllowance() {\n        let childsAllowance;\n        if (shoppingDone === true) {\n          childsAllowance = 10;\n        } else {\n          childsAllowance = 5;\n        }\n\n        para.textContent = `Child has earned \\$${childsAllowance} this week.`;\n      }\n\n      updateAllowance();\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/calendar-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple calendar example</title>\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      ul {\n        padding-left: 0;\n      }\n\n      li {\n        display: block;\n        float: left;\n        width: 25%;\n        border: 2px solid white;\n        padding: 5px;\n        height: 80px;\n        background-color: #4A2DB6;\n        color: white;\n      }\n    </style>\n  </head>\n  <body>\n    <label for=\"month\">Select month: </label>\n    <select id=\"month\">\n      <option value=\"January\">January</option>\n      <option value=\"February\">February</option>\n      <option value=\"March\">March</option>\n      <option value=\"April\">April</option>\n      <option value=\"May\">May</option>\n      <option value=\"June\">June</option>\n      <option value=\"July\">July</option>\n      <option value=\"August\">August</option>\n      <option value=\"September\">September</option>\n      <option value=\"October\">October</option>\n      <option value=\"November\">November</option>\n      <option value=\"December\">December</option>\n    </select>\n\n    <h1></h1>\n\n    <ul>\n\n    </ul>\n\n    <script>\n      const select = document.querySelector(\"select\");\n      const list = document.querySelector(\"ul\");\n      const h1 = document.querySelector(\"h1\");\n\n      select.addEventListener(\"change\", () => {\n        const choice = select.value;\n        createCalendar(choice);\n      });\n\n      function createCalendar(month) {\n        let days = 31;\n\n        if (month === \"February\") {\n          days = 28;\n        } else if (\n          month === \"April\" ||\n          month === \"June\" ||\n          month === \"September\" ||\n          month === \"November\"\n        ) {\n          days = 30;\n        }\n\n        list.textContent = \"\";\n        h1.textContent = month;\n        for (let i = 1; i <= days; i++) {\n          const listItem = document.createElement(\"li\");\n          listItem.textContent = i;\n          list.appendChild(listItem);\n        }\n      }\n\n      select.value = \"January\";\n      createCalendar(\"January\");\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/events/preventdefault-validation.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Prevent default example</title>\n    <style>\n      div {\n        margin-bottom: 10px;\n      }\n    </style>\n  </head>\n  <body>\n    <form>\n      <div>\n        <label for=\"fname\">First name: </label>\n        <input id=\"fname\" type=\"text\">\n      </div>\n      <div>\n        <label for=\"lname\">Last name: </label>\n        <input id=\"lname\" type=\"text\">\n      </div>\n      <div>\n        <input id=\"submit\" type=\"submit\">\n      </div>\n    </form>\n    <p></p>\n    <script>\n      const form = document.querySelector('form');\n      const fname = document.getElementById('fname');\n      const lname = document.getElementById('lname');\n      const para = document.querySelector('p');\n\n      form.addEventListener('submit', e => {\n        if (fname.value === '' || lname.value === '') {\n          e.preventDefault();\n          para.textContent = 'You need to fill in both names!';\n        }\n      });\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/events/random-color-addeventlistener.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Random color example — event handler attribute</title>\n    <style>\n      button {\n        margin: 10px;\n      }\n    </style>\n  </head>\n  <body>\n    <button>Change color</button>\n    <script>\n      const btn = document.querySelector('button');\n\n      function random(number) {\n        return Math.floor(Math.random() * (number+1));\n      }\n\n      btn.addEventListener('click', () => {\n        const rndCol = `rgb(${random(255)}, ${random(255)}, ${random(255)})`;\n        document.body.style.backgroundColor = rndCol;\n      });\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/events/random-color-eventhandlerattributes.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Random color example — event handler attribute</title>\n    <style>\n      button {\n        margin: 10px\n      };\n    </style>\n  </head>\n  <body>\n    <button onclick=\"bgChange()\">Change color</button>\n    <script>\n      function random(number) {\n        return Math.floor(Math.random()*number);\n      }\n\n      function bgChange() {\n        const rndCol = 'rgb(' + random(255) + ',' + random(255) + ',' + random(255) + ')';\n        document.body.style.backgroundColor = rndCol;\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/events/random-color-eventhandlerproperty.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Random color example — event handler property</title>\n    <style>\n      button {\n        margin: 10px;\n      }\n    </style>\n  </head>\n  <body>\n    <button>Change color</button>\n    <script>\n      const btn = document.querySelector('button');\n\n      function random(number) {\n        return Math.floor(Math.random()*number);\n      }\n\n      function bgChange() {\n        const rndCol = 'rgb(' + random(255) + ',' + random(255) + ',' + random(255) + ')';\n        document.body.style.backgroundColor = rndCol;\n      }\n\n      btn.onclick = bgChange;\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/events/random-color-eventobject.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Random color event object example</title>\n    <style>\n      button {\n        margin: 10px;\n        font-size: 300%;\n        padding: 30px;\n      };\n    </style>\n  </head>\n  <body>\n    <button>Change color</button>\n    <script>\n      const btn = document.querySelector('button');\n\n      function random(number) {\n        return Math.floor(Math.random() * (number+1));\n      }\n\n      function bgChange(e) {\n        const rndCol = `rgb(${random(255)}, ${random(255)}, ${random(255)})`;\n        e.target.style.backgroundColor = rndCol;\n        console.log(e);\n      }\n\n      btn.addEventListener('click', bgChange);\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/events/show-video-box-fixed.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Show video box example</title>\n    <style>\n      div {\n        position: absolute;\n        top: 50%;\n        transform: translate(-50%,-50%);\n        width: 480px;\n        height: 380px;\n        border-radius: 10px;\n        background-color: #eee;\n        background-image: linear-gradient(to bottom, rgba(0,0,0,0), rgba(0,0,0,0.1));\n      }\n\n      .hidden {\n        left: -50%;\n      }\n\n      .showing {\n        left: 50%;\n      }\n\n      div video {\n        display: block;\n        width: 400px;\n        margin: 40px auto;\n      }\n\n    </style>\n  </head>\n  <body>\n    <button>Display video</button>\n\n    <div class=\"hidden\">\n      <video>\n        <source src=\"rabbit320.mp4\" type=\"video/mp4\">\n        <source src=\"rabbit320.webm\" type=\"video/webm\">\n        <p>Your browser doesn't support HTML5 video. Here is a <a href=\"rabbit320.mp4\">link to the video</a> instead.</p>\n      </video>\n    </div>\n\n    <script>\n\n      const btn = document.querySelector('button');\n      const videoBox = document.querySelector('div');\n\n      function displayVideo() {\n        if (videoBox.getAttribute('class') === 'hidden') {\n          videoBox.setAttribute('class','showing');\n        }\n      }\n\n      btn.addEventListener('click', displayVideo);\n\n      videoBox.addEventListener('click', () => videoBox.setAttribute('class', 'hidden'));\n\n      const video = document.querySelector('video');\n\n      video.addEventListener('click', e => {\n        e.stopPropagation();\n        video.play();\n      });\n\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/events/show-video-box.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Show video box example</title>\n    <style>\n      div {\n        position: absolute;\n        top: 50%;\n        transform: translate(-50%,-50%);\n        width: 480px;\n        height: 380px;\n        border-radius: 10px;\n        background-color: #eee;\n        background-image: linear-gradient(to bottom, rgba(0,0,0,0), rgba(0,0,0,0.1));\n      }\n\n      .hidden {\n        left: -50%;\n      }\n\n      .showing {\n        left: 50%;\n      }\n\n      div video {\n        display: block;\n        width: 400px;\n        margin: 40px auto;\n      }\n\n    </style>\n  </head>\n  <body>\n    <button>Display video</button>\n\n    <div class=\"hidden\">\n      <video>\n        <source src=\"rabbit320.mp4\" type=\"video/mp4\">\n        <source src=\"rabbit320.webm\" type=\"video/webm\">\n        <p>Your browser doesn't support HTML5 video. Here is a <a href=\"rabbit320.mp4\">link to the video</a> instead.</p>\n      </video>\n    </div>\n\n    <script>\n\n      const btn = document.querySelector('button');\n      const videoBox = document.querySelector('div');\n\n      function displayVideo() {\n        if (videoBox.getAttribute('class') === 'hidden') {\n          videoBox.setAttribute('class','showing');\n        }\n      }\n\n      btn.addEventListener('click', displayVideo);\n\n      videoBox.addEventListener('click', () => videoBox.setAttribute('class', 'hidden'));\n\n      const video = document.querySelector('video');\n\n      video.addEventListener('click', () => video.play());\n\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/events/useful-eventtarget.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Useful event target example</title>\n    <style>\n      .tile {\n        height: 100px;\n        width: 25%;\n        float: left;\n      }\n    </style>\n  </head>\n  <body>\n    <div id=\"container\">\n     <div class=\"tile\"></div>\n     <div class=\"tile\"></div>\n     <div class=\"tile\"></div>\n     <div class=\"tile\"></div>\n     <div class=\"tile\"></div>\n     <div class=\"tile\"></div>\n     <div class=\"tile\"></div>\n     <div class=\"tile\"></div>\n     <div class=\"tile\"></div>\n     <div class=\"tile\"></div>\n     <div class=\"tile\"></div>\n     <div class=\"tile\"></div>\n     <div class=\"tile\"></div>\n     <div class=\"tile\"></div>\n     <div class=\"tile\"></div>\n     <div class=\"tile\"></div>\n   </div>\n\n    <script>\n      function random(number) {\n        return Math.floor(Math.random()*number);\n      }\n\n      function bgChange() {\n        const rndCol = `rgb(${random(255)}, ${random(255)}, ${random(255)})`;\n        return rndCol;\n      }\n\n      const container = document.querySelector('#container');\n      container.addEventListener('click', event => event.target.style.backgroundColor = bgChange());\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/functions/conflict.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Conflict example</title>\n  </head>\n\n  <body>\n    <p>My body</p>\n    <script src=\"first.js\"></script>\n    <script src=\"second.js\"></script>\n    <script>\n      greeting();\n    </script>\n  </body>\n</html>"
  },
  {
    "path": "javascript/building-blocks/functions/first.js",
    "content": "const name = 'Chris';\nfunction greeting() {\n  alert(`Hello ${name}: welcome to our company.`);\n}\n"
  },
  {
    "path": "javascript/building-blocks/functions/function-library-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Function library example</title>\n  <style>\n    input {\n      font-size: 2em;\n      margin: 10px 1px 0;\n    }\n  </style>\n  </head>\n<body>\n\n  <input class=\"numberInput\" type=\"text\">\n  <p></p>\n\n  <script>\n    const input = document.querySelector('.numberInput');\n    const para = document.querySelector('p');\n\n    function squared(num) {\n      return num * num;\n    }\n\n    function cubed(num) {\n      return num * num * num;\n    }\n\n    function factorial(num) {\n      let x = num;\n      while (x > 1) {\n        num *= x-1;\n        x--;\n      }\n\n      return num;\n    }\n\n    input.addEventListener('change', () => {\n      const num = parseFloat(input.value);\n      if (isNaN(num)) {\n        para.textContent = 'You need to enter a number!';\n      } else {\n        para.textContent = `${num} squared is ${squared(num)}. `;\n        para.textContent += `${num} cubed is ${cubed(num)}. `;\n        para.textContent += `${num} factorial is ${factorial(num)}. `;\n      }\n    });\n\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/functions/function-library.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Function library example</title>\n  <style>\n    input {\n      font-size: 2em;\n      margin: 10px 1px 0;\n    }\n  </style>\n  </head>\n<body>\n\n  <input class=\"numberInput\" type=\"text\">\n  <p></p>\n\n  <script>\n    const input = document.querySelector('.numberInput');\n    const para = document.querySelector('p');\n\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/functions/function-scope.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Function scope example</title>\n  </head>\n<body>\n\n  <script>\n    const x = 1;\n\n    function a() {\n      const y = 2;\n    }\n\n    function b() {\n      const z = 3;\n    }\n\n    function output(value) {\n      const para = document.createElement('p');\n      document.body.appendChild(para);\n      para.textContent = `Value: ${value}`;\n    }\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/functions/function-stage-2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Function stage 2</title>\n    <style>\n      .msgBox {\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        transform: translate(-50%,-50%);\n        width: 200px;\n        border-radius: 10px;\n        background-color: #eee;\n        background-image: linear-gradient(to bottom, rgba(0,0,0,0), rgba(0,0,0,0.1));\n      }\n\n      .msgBox p {\n        line-height: 1.5;\n        padding: 10px 20px;\n        color: #333;\n      }\n\n      .msgBox button {\n        background: none;\n        border: none;\n        position: absolute;\n        top: 0;\n        right: 0;\n        font-size: 1.1rem;\n        color: #aaa;\n      }\n\n    </style>\n  </head>\n  <body>\n    <button>Display message box</button>\n\n    <script>\n      function displayMessage() {\n        const html = document.querySelector('html');\n\n        const panel = document.createElement('div');\n        panel.setAttribute('class','msgBox');\n        html.appendChild(panel);\n\n        const msg = document.createElement('p');\n        msg.textContent = 'This is a message box';\n        panel.appendChild(msg);\n\n        const closeBtn = document.createElement('button');\n        closeBtn.textContent = 'x';\n        panel.appendChild(closeBtn);\n\n        closeBtn.addEventListener('click', () => panel.parentNode.removeChild(panel));\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/functions/function-stage-3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Function stage 3</title>\n    <style>\n      .msgBox {\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        transform: translate(-50%,-50%);\n        width: 200px;\n        border-radius: 10px;\n        background-color: #eee;\n        background-image: linear-gradient(to bottom, rgba(0,0,0,0), rgba(0,0,0,0.1));\n      }\n\n      .msgBox p {\n        line-height: 1.5;\n        padding: 10px 20px;\n        color: #333;\n      }\n\n      .msgBox button {\n        background: none;\n        border: none;\n        position: absolute;\n        top: 0;\n        right: 0;\n        font-size: 1.1rem;\n        color: #aaa;\n      }\n\n    </style>\n  </head>\n  <body>\n    <button>Display message box</button>\n\n    <script>\n\n      const btn = document.querySelector('button');\n\n      btn.addEventListener('click', displayMessage);\n\n      function displayMessage() {\n        const html = document.querySelector('html');\n\n        const panel = document.createElement('div');\n        panel.setAttribute('class','msgBox');\n        html.appendChild(panel);\n\n        const msg = document.createElement('p');\n        msg.textContent = 'This is a message box';\n        panel.appendChild(msg);\n\n        const closeBtn = document.createElement('button');\n        closeBtn.textContent = 'x';\n        panel.appendChild(closeBtn);\n\n        closeBtn.onclick = function() {\n          panel.parentNode.removeChild(panel);\n        }\n      }\n\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/functions/function-stage-4.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Function stage 4</title>\n    <style>\n      .msgBox {\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        transform: translate(-50%,-50%);\n        width: 242px;\n        border-radius: 10px;\n        background-color: #eee;\n        background-image: linear-gradient(to bottom, rgba(0,0,0,0), rgba(0,0,0,0.1));\n      }\n\n      .msgBox p {\n        line-height: 1.5;\n        padding: 10px 20px;\n        color: #333;\n        padding-left: 82px;\n        background-position: 25px center;\n        background-repeat: no-repeat;\n      }\n\n      .msgBox button {\n        background: none;\n        border: none;\n        position: absolute;\n        top: 0;\n        right: 0;\n        font-size: 1.1rem;\n        color: #aaa;\n      }\n\n    </style>\n  </head>\n  <body>\n    <button>Display message box</button>\n\n    <script>\n\n      const btn = document.querySelector('button');\n      btn.addEventListener('click', () => displayMessage('Brian: Hi there, how are you today?', 'chat'));\n\n      function displayMessage(msgText,msgType) {\n        const html = document.querySelector('html');\n\n        const panel = document.createElement('div');\n        panel.setAttribute('class','msgBox');\n        html.appendChild(panel);\n\n        const msg = document.createElement('p');\n        msg.textContent = msgText;\n        panel.appendChild(msg);\n\n        const closeBtn = document.createElement('button');\n        closeBtn.textContent = 'x';\n        panel.appendChild(closeBtn);\n\n        closeBtn.onclick = function() {\n          panel.parentNode.removeChild(panel);\n        }\n\n        if(msgType === 'warning') {\n          msg.style.backgroundImage = 'url(icons/warning.png)';\n          panel.style.backgroundColor = 'red';\n        } else if(msgType === 'chat') {\n          msg.style.backgroundImage = 'url(icons/chat.png)';\n          panel.style.backgroundColor = 'aqua';\n        } else {\n          msg.style.paddingLeft = '20px';\n        }\n      }\n\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/functions/function-start.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Function start</title>\n    <style>\n      .msgBox {\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        transform: translate(-50%,-50%);\n        width: 200px;\n        background: #eee;\n      }\n\n      .msgBox p {\n        line-height: 1.5;\n        padding: 10px 20px;\n        color: #333;\n      }\n\n      .msgBox button {\n        background: none;\n        border: none;\n        position: absolute;\n        top: 0;\n        right: 0;\n        font-size: 1.1rem;\n        color: #aaa;\n      }\n\n    </style>\n  </head>\n  <body>\n    <button>Display message box</button>\n\n    <script>\n      \n    </script>\n  </body>\n</html>"
  },
  {
    "path": "javascript/building-blocks/functions/second.js",
    "content": "const name = 'Zaptec';\nfunction greeting() {\n  alert(`Our company is called ${name}.`);\n}\n"
  },
  {
    "path": "javascript/building-blocks/gallery/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Image gallery</title>\n\n    <link rel=\"stylesheet\" href=\"style.css\">\n    \n  </head>\n\n  <body>\n    <h1>Image gallery example</h1>\n\n    <div class=\"full-img\">\n      <img class=\"displayed-img\" src=\"images/pic1.jpg\" alt=\"Closeup of a human eye\">\n      <div class=\"overlay\"></div>\n      <button class=\"dark\">Darken</button>\n    </div>\n\n    <div class=\"thumb-bar\">\n\n\n    </div>\n    <script src=\"main.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/gallery/main.js",
    "content": "const displayedImage = document.querySelector('.displayed-img');\nconst thumbBar = document.querySelector('.thumb-bar');\n\nconst btn = document.querySelector('button');\nconst overlay = document.querySelector('.overlay');\n\n/* Declaring the array of image filenames */\n\nconst images = ['pic1.jpg', `pic2.jpg`, `pic3.jpg`, `pic4.jpg`, `pic5.jpg`];\nconst alts = {\n  'pic1.jpg' : 'Closeup of a human eye',\n  'pic2.jpg' : 'Rock that looks like a wave',\n  'pic3.jpg' : 'Purple and white pansies',\n  'pic4.jpg' : 'Section of wall from a pharoah\\'s tomb',\n  'pic5.jpg' : 'Large moth on a leaf'\n}\n\n/* Looping through images */\n\nfor (const image of images) {\n  const newImage = document.createElement('img');\n  newImage.setAttribute('src', `images/${image}`);\n  newImage.setAttribute('alt', alts[image]);\n  thumbBar.appendChild(newImage);\n  newImage.addEventListener('click', e => {\n    displayedImage.src = e.target.src;\n    displayedImage.alt = e.target.alt;\n  });\n}\n\n/* Wiring up the Darken/Lighten button */\n\nbtn.addEventListener('click', () => {\n  const btnClass = btn.getAttribute('class');\n  if (btnClass === 'dark') {\n    btn.setAttribute('class','light');\n    btn.textContent = 'Lighten';\n    overlay.style.backgroundColor = 'rgba(0,0,0,0.5)';\n  } else {\n    btn.setAttribute('class','dark');\n    btn.textContent = 'Darken';\n    overlay.style.backgroundColor = 'rgba(0,0,0,0)';\n  }\n});\n"
  },
  {
    "path": "javascript/building-blocks/gallery/marking-guide.md",
    "content": "# Marking guide for \"Image gallery\"\nThe following guide outlines a marking guide for the MDN Learning Area JavaScript Topic — [Image gallery](https://developer.mozilla.org/en-US/Learn/JavaScript/Building_blocks/Image_gallery). Each subtask detailed in the assessment is listed below, along with an explanation of how many marks the task is worth, and the mark breakdown.\n\nNote: These are guidelines, not set in stone rules — you are of course free to use your judgement on mark awarding when you meet an edge case, or something that isn't clear cut.\n\nThe overall mark awarded is out of 22. Work out their final mark, and then divide by 21 and multiply by 100 to give a percentage mark. For reference, you can find a [finished program](main.js) that would be awarded top marks.\n\n## Declaring the array of filenames\n\n1. **Declaring a constant that holds the names of image files**: One mark for this. It should be an array of strings, where each string is the name of one of the image files, such as `'pic1.jpg'`. It should be declared using `const`.\n\n## Looping through the images\n\n1. **Creating the loop**: Four marks for this — the actual solution is fairy simple, but there are a few details to get right (any suitable loop type can be used):\n    * The initializer should start at 1, and the loop should iterate until a value of 5. This is useful, as the first image has the number 1 in its filename, then 2, 3, etc.\n    * The iterator should add 1 to the initializer after each iteration.\n\n2. **Building the image path for each loop iteration<**: Three marks for this. The student basically just needs to replace the `xxx` placeholder with a template literal that will use the initializer to build the image path in each case. The pattern we need is this: `images/pic${i}.jpg`.\n\n## Adding an click event listener to each thumbnail image\n\n1. **Find the value of the src attribute of the current image.**: Four marks for this. An anonymous function would make most sense:\n\n  ```js\n  newImage.addEventListener('click', e => displayedImage.src = e.target.src);\n  ```\n\n## Writing a handler that runs the darken/lighten button\n\n1. **Adding an onclick handler**: Two marks; the `<button>` is referenced in the `btn` constant, so the handler will need to look something like `btn.addEventListener('click', () => {`. In this case, invoking a named function would also be ok, e.g. `btn.addEventListener('click', myFunction);`\n\n2. **Checking the current class name set on the `<button>` element**: Two marks; this again uses `getAttribute()`, and you just need to run this on the `btn` constant — `const btnClass = btn.getAttribute('class');`\n\n3. **The conditional statement**: Six marks for this. It is not that complex, but there is a fair bit of work to do here. The conditional statement just needs to look like this:\n\n  ```js\n  if (btnClass === 'dark') {\n    /* ... */  \n  } else {\n    /* ... */\n  }\n  ```\n\n  Then the student needs to grab the three lines provided in the assessment text, and modify it to set the things that are needed in each state. So a finished event handler could look something like this:\n\n  ```js\n  btn.addEventListener('click', () => {\n    const btnClass = btn.getAttribute('class');\n    if (btnClass === 'dark') {\n      btn.setAttribute('class','light');\n      btn.textContent = 'Lighten';\n      overlay.style.backgroundColor = 'rgba(0,0,0,0.5)';\n    } else {\n      btn.setAttribute('class','dark');\n      btn.textContent = 'Darken';\n      overlay.style.backgroundColor = 'rgba(0,0,0,0)';\n    }\n  });\n  ```\n"
  },
  {
    "path": "javascript/building-blocks/gallery/style.css",
    "content": "h1 {\n  font-family: helvetica, arial, sans-serif;\n  text-align: center;\n}\n\nbody {\n  width: 640px;\n  margin: 0 auto;\n}\n\n.full-img {\n  position: relative;\n  display: block;\n  width: 640px;\n  height: 480px;\n}\n\n.overlay {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 640px;\n  height: 480px;\n  background-color: rgba(0,0,0,0);\n}\n\nbutton {\n  border: 0;\n  background: rgba(150,150,150,0.6);\n  text-shadow: 1px 1px 1px white;\n  border: 1px solid #999;\n  position: absolute;\n  cursor: pointer;\n  top: 2px;\n  left: 2px;\n}\n\n.thumb-bar img {\n  display: block;\n  width: 20%;\n  float: left;\n  cursor: pointer;\n}"
  },
  {
    "path": "javascript/building-blocks/loops/basic-for-improved.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Basic for loop example improved</title>\n    <style>\n\n    </style>\n  </head>\n  <body>\n\n  <p></p>\n\n\n    <script>\n    const cats = ['Bill', 'Jeff', 'Pete', 'Biggles', 'Jasmin'];\n    let info = 'My cats are called ';\n    const para = document.querySelector('p');\n\n    for(let i = 0; i < cats.length; i++) {\n      if(i === cats.length - 1) {\n        info += 'and ' + cats[i] + '.';\n      } else {\n        info += cats[i] + ', ';\n      }\n    }\n\n    para.textContent = info;\n\n    </script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/loops/basic-for.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Basic for loop example</title>\n    <style>\n\n    </style>\n  </head>\n  <body>\n\n  <p></p>\n\n\n    <script>\n    const cats = ['Bill', 'Jeff', 'Pete', 'Biggles', 'Jasmin'];\n    let info = 'My cats are called ';\n    const para = document.querySelector('p');\n\n    for(let i = 0; i < cats.length; i++) {\n      info += cats[i] + ', ';\n    }\n\n    para.textContent = info;\n\n    </script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/loops/contact-search.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple contact search example</title>\n    <style>\n\n    </style>\n  </head>\n  <body>\n\n  <label for=\"search\">Search by contact name: </label>\n  <input id=\"search\" type=\"text\">\n  <button>Search</button>\n\n  <p></p>\n\n\n    <script>\n    const contacts = ['Chris:2232322', 'Sarah:3453456', 'Bill:7654322', 'Mary:9998769', 'Dianne:9384975'];\n    const para = document.querySelector('p');\n    const input = document.querySelector('input');\n    const btn = document.querySelector('button');\n\n    btn.addEventListener('click', () => {\n      const searchName = input.value.toLowerCase();\n      input.value = '';\n      input.focus();\n      para.textContent = '';\n      for (let contact of contacts) {\n        let splitContact = contact.split(':');\n        if (splitContact[0].toLowerCase() === searchName) {\n          para.textContent = splitContact[0] + '\\'s number is ' + splitContact[1] + '.';\n          break;\n        }\n      }\n      if (para.textContent === '') {\n       para.textContent = 'Contact not found.';\n     }\n    });\n\n    </script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/loops/do-while.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Basic do...while loop example</title>\n    <style>\n\n    </style>\n  </head>\n  <body>\n\n  <p></p>\n\n\n    <script>\n    const cats = ['Bill', 'Jeff', 'Pete', 'Biggles', 'Jasmin'];\n    let myFavoriteCats = 'My cats are called ';\n    const para = document.querySelector('p');\n\n    let i = 0;\n\n    do {\n      if (i === cats.length - 1) {\n        myFavoriteCats += `and ${cats[i]}.`;\n      } else {\n        myFavoriteCats += `${cats[i]}, `;\n      }\n\n      i++;\n    } while (i < cats.length);\n\n    para.textContent = myFavoriteCats;\n\n    </script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/loops/guest-list.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Guest list example</title>\n    <style>\n\n    </style>\n  </head>\n  <body>\n\n  <p class=\"admitted\">Admit: </p>\n  <p class=\"refused\">Refuse: </p>\n\n\n    <script>\n    const people = ['Chris', 'Anne', 'Colin', 'Terri', 'Phil', 'Lola', 'Sam', 'Kay', 'Bruce'];\n\n    const admitted = document.querySelector('.admitted');\n    const refused = document.querySelector('.refused');\n\n    let i = 0;\n\n    do {\n      if(people[i] === 'Phil' || people[i] === 'Lola') {\n        refused.textContent += people[i] + ', ';\n      } else {\n        admitted.textContent += people[i] + ', ';\n      }\n\n      i++;\n    } while(i < people.length);\n\n    refused.textContent = refused.textContent.slice(0,refused.textContent.length-2) + '.';\n    admitted.textContent = admitted.textContent.slice(0,admitted.textContent.length-2) + '.';\n\n    </script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/loops/integer-squares.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Integer squares generator</title>\n    <style>\n\n    </style>\n  </head>\n  <body>\n\n  <label for=\"number\">Enter number: </label>\n  <input id=\"number\" type=\"text\">\n  <button>Generate integer squares</button>\n\n  <p>Output: </p>\n\n\n    <script>\n    const para = document.querySelector('p');\n    const input = document.querySelector('input');\n    const btn = document.querySelector('button');\n\n    btn.addEventListener('click', () => {\n      para.textContent = 'Output: ';\n      const num = input.value;\n      input.value = '';\n      input.focus();\n      for (let i = 1; i <= num; i++) {\n        let sqRoot = Math.sqrt(i);\n        if (Math.floor(sqRoot) !== sqRoot) {\n          continue;\n        }\n        para.textContent += `${i} `;\n      }\n    });\n\n    </script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/loops/launch-countdown.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Launch countdown example</title>\n    <style>\n\n    </style>\n  </head>\n  <body>\n\n\n    <script>\n\n    let i = 10;\n\n    while(i >= 0) {\n      const para = document.createElement('p');\n      if(i === 10) {\n        para.textContent = 'Countdown ' + i;\n      } else if(i === 0) {\n        para.textContent = 'Blast off!';\n      } else {\n        para.textContent = i;\n      }\n\n      document.body.appendChild(para);\n\n      i--;\n    }\n      \n    </script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/loops/random-canvas-circles.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Random canvas circles</title>\n    <style>\n      html {\n        width: 100%;\n        height: inherit;\n      }\n\n      canvas {\n        display: block;\n      }\n\n      body {\n        margin: 0;\n      }\n\n      button {\n        position: absolute;\n        top: 5px;\n        left: 5px;\n      }\n    </style>\n  </head>\n  <body>\n\n  <button>Update</button>\n\n  <canvas></canvas>\n\n\n    <script>\n    const btn = document.querySelector('button');\n    const canvas = document.querySelector('canvas');\n    const ctx = canvas.getContext('2d');\n\n    let WIDTH = document.documentElement.clientWidth;\n    let HEIGHT = document.documentElement.clientHeight;\n\n    canvas.width = WIDTH;\n    canvas.height = HEIGHT;\n\n    function random(number) {\n      return Math.floor(Math.random()*number);\n    }\n\n    function draw() {\n      ctx.clearRect(0,0,WIDTH,HEIGHT);\n      for(let i = 0; i < 100; i++) {\n        ctx.beginPath();\n        ctx.fillStyle = 'rgba(255,0,0,0.5)';\n        ctx.arc(random(WIDTH), random(HEIGHT), random(50), 0, 2 * Math.PI);\n        ctx.fill();\n      }\n    }\n\n    btn.addEventListener('click',draw);\n\n    </script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/loops/while.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Basic while loop example</title>\n    <style>\n\n    </style>\n  </head>\n  <body>\n\n  <p></p>\n\n\n    <script>\n    const cats = ['Bill', 'Jeff', 'Pete', 'Biggles', 'Jasmin'];\n    let myFavoriteCats = 'My cats are called ';\n    let para = document.querySelector('p');\n\n    let i = 0;\n\n    while (i < cats.length) {\n      if (i === cats.length - 1) {\n        myFavoriteCats += `and ${cats[i]}.`;\n      } else {\n        myFavoriteCats += `${cats[i]}, `;\n      }\n\n      i++;\n    }\n\n    para.textContent = myFavoriteCats;\n\n    </script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/more-color-choices-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>More color choices!</title>\n  </head>\n  <body>\n    <label for=\"theme\">Select theme: </label>\n    <select id=\"theme\">\n      <option value=\"white\">White</option>\n      <option value=\"black\">Black</option>\n      <option value=\"purple\">Purple</option>\n      <option value=\"yellow\">Yellow</option>\n      <option value=\"psychedelic\">Psychedelic</option>\n    </select>\n\n    <h1>This is my website</h1>\n\n    <script>\n      const select = document.querySelector('select');\n      const html = document.querySelector('html');\n\n      select.onchange = function() {\n        const choice = select.value;\n\n        switch(choice) {\n          case 'black':\n            update('black','white');\n            break;\n          case 'white':\n            update('white','black');\n            break;\n          case 'purple':\n            update('purple','white');\n            break;\n          case 'yellow':\n            update('yellow','darkgray');\n            break;\n          case 'psychedelic':\n            update('lime','purple');\n            break;\n        }\n      }\n\n      select.value = 'white';\n      update('white','black');\n      function update(bgColor, textColor) {\n        html.style.backgroundColor = bgColor;\n        html.style.color = textColor;\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/simple-else-if.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple else if example</title>\n  </head>\n  <body>\n    <label for=\"weather\">Select the weather type today: </label>\n    <select id=\"weather\">\n      <option value=\"\">--Make a choice--</option>\n      <option value=\"sunny\">Sunny</option>\n      <option value=\"rainy\">Rainy</option>\n      <option value=\"snowing\">Snowing</option>\n      <option value=\"overcast\">Overcast</option>\n    </select>\n\n    <p></p>\n\n    <script>\n      const select = document.querySelector('select');\n      const para = document.querySelector('p');\n\n      select.addEventListener(\"change\", setWeather);\n\n      function setWeather() {\n        const choice = select.value;\n\n        if(choice === 'sunny') {\n          para.textContent = 'It is nice and sunny outside today. Wear shorts! Go to the beach, or the park, and get an ice cream.';\n        } else if(choice === 'rainy') {\n          para.textContent = 'Rain is falling outside; take a rain coat and a brolly, and don\\'t stay out for too long.';\n        } else if(choice === 'snowing') {\n          para.textContent = 'The snow is coming down — it is freezing! Best to stay in with a cup of hot chocolate, or go build a snowman.';\n        } else if(choice === 'overcast') {\n          para.textContent = 'It isn\\'t raining, but the sky is grey and gloomy; it could turn any minute, so take a rain coat just in case.';\n        } else {\n          para.textContent = '';\n        }\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/simple-switch.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple switch example</title>\n  </head>\n  <body>\n    <label for=\"weather\">Select the weather type today: </label>\n    <select id=\"weather\">\n      <option value=\"\">--Make a choice--</option>\n      <option value=\"sunny\">Sunny</option>\n      <option value=\"rainy\">Rainy</option>\n      <option value=\"snowing\">Snowing</option>\n      <option value=\"overcast\">Overcast</option>\n    </select>\n\n    <p></p>\n\n    <script>\n      const select = document.querySelector('select');\n      const para = document.querySelector('p');\n\n      select.addEventListener(\"change\", setWeather);\n\n      function setWeather() {\n        const choice = select.value;\n\n        switch(choice) {\n          case 'sunny':\n            para.textContent = 'It is nice and sunny outside today. Wear shorts! Go to the beach, or the park, and get an ice cream.';\n            break;\n          case 'rainy':\n            para.textContent = 'Rain is falling outside; take a rain coat and a brolly, and don\\'t stay out for too long.';\n            break;\n          case 'snowing':\n            para.textContent = 'The snow is coming down — it is freezing! Best to stay in with a cup of hot chocolate, or go build a snowman.';\n            break;\n          case 'overcast':\n            para.textContent = 'It isn\\'t raining, but the sky is grey and gloomy; it could turn any minute, so take a rain coat just in case.';\n            break;\n          default:\n            para.textContent = '';\n        }\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/simple-ternary.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple ternary operator example</title>\n  </head>\n  <body>\n    <label for=\"theme\">Select theme: </label>\n    <select id=\"theme\">\n      <option value=\"white\">White</option>\n      <option value=\"black\">Black</option>\n    </select>\n\n    <h1>This is my website</h1>\n\n    <script>\n      const select = document.querySelector('select');\n      const html = document.querySelector('html');\n\n      select.addEventListener('change', () => ( select.value === 'black' ) ? update('black','white') : update('white','black'));\n\n      function update(bgColor, textColor) {\n        html.style.backgroundColor = bgColor;\n        html.style.color = textColor;\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/conditionals/conditionals1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Conditionals: Task 1</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\"></section>\n\n  </body>\n  \n  \n  <script>\n    let season = 'summer';\n    let response;\n\n    // Add your code here\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    let para1 = document.createElement('p');\n    para1.textContent = response;\n    section.appendChild(para1);\n    \n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/conditionals/conditionals1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Conditionals: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\n\nlet season = 'summer';\nlet response;\n\n// Add your code here\n\n// Don't edit the code below here!\n\nconst section = document.querySelector('.preview');\nsection.innerHTML = ' ';\nlet para1 = document.createElement('p');\npara1.textContent = response;\nsection.appendChild(para1);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/conditionals/conditionals2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Conditionals: Task 2</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\"></section>\n\n  </body>\n  \n  \n  <script>\n    let response;\n    let score = 75;\n    let machineActive = false;\n  \n    // Add your code here\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    let para1 = document.createElement('p');\n    let para2 = document.createElement('p');\n\n    para1.textContent = `Your score is ${ score }`;\n    para2.textContent = response;\n\n    section.appendChild(para1);\n    section.appendChild(para2);\n    \n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/conditionals/conditionals2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Conditionals: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\n\nlet response;\nlet score = 75;\nlet machineActive = false;\n\n// Add your code here\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\nlet para1 = document.createElement('p');\nlet para2 = document.createElement('p');\n\npara1.textContent = `Your score is ${ score }`;\npara2.textContent = response;\n\nsection.appendChild(para1);\nsection.appendChild(para2);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/conditionals/conditionals3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Conditionals: Task 3</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n    <section class=\"preview\"></section>\n  </body>\n  <script>\n    let machineActive = true;\n    let pwd = \"cheese\";\n\n    let machineResult;\n    let pwdResult;\n\n    // Add your code here\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector(\"section\");\n\n    let para1 = document.createElement(\"p\");\n    let para2 = document.createElement(\"p\");\n\n    para1.textContent = machineResult;\n    para2.textContent = pwdResult;\n\n    section.appendChild(para1);\n    section.appendChild(para2);\n  </script>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/conditionals/conditionals3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Conditionals: Task 3</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\"></section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px\">\n\nlet machineActive = true;\nlet pwd = 'cheese';\n\nlet machineResult;\nlet pwdResult;\n\n// Add your code here\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\nlet para1 = document.createElement('p');\nlet para2 = document.createElement('p');\n\npara1.textContent = machineResult;\npara2.textContent = pwdResult;\n\nsection.appendChild(para1);\nsection.appendChild(para2);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/conditionals/marking.md",
    "content": "# JavaScript conditionals marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the JavaScript features covered in the [Making decisions in your code — conditionals](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/conditionals) lesson in Learn Web Development on MDN.\n\nNote: If there is an error in your code, it will be outputted into the results panel on the page, to help you try to figure out the answer (or into the browser's JavaScript console, in the case of the downloadable version).\n\n## Task 1\n\nIn this task you are supposed to create your own basic `if ... else` statement that tests whether the season is summer or not, and stores an appropriate response in the `response` variable, which is then printed out in the results panel. The `else` clause should print some kind of generic response.\n\nTo finish off, you need to add an `else if` clause to also check whether it is winter, and if so, put an appropriate response inside `response`.\n\nThe finished code should look something like this:\n\n```js\nlet season = \"summer\";\nlet response;\n\nif (season === \"summer\") {\n  response = \"It's probably nice and warm where you are; enjoy the sun!\";\n} else if (season === \"winter\") {\n  response = \"I hope you are not too cold. Put some warm clothes on!\";\n} else {\n  response =\n    \"I don't know what the season is where you are. Hope you are well.\";\n}\n```\n\n## Task 2\n\nTask 2 tests some more complex conditionals, like not equal, less than, greater than, etc., along with a nested structure.\n\nYou are given two variables containing an indicator of the answer machine being switched on or not (`true`/`false`), and a score. You are also given an uninitialized `response` variable.\n\nYou need to create one `if ... else` structure that checks whether the machine is switched on and puts a message into the `response` variable if it isn't, telling the user to switch the machine on.\n\nInside the `if` part, you need to nest an `if ... else if` structure that puts appropriate messages into the `response` variable depending on different scores. The conditional operator tests should look like this:\n\n- `score < 0 || score > 100` - \"This is not possible, an error has occurred.\" This could also be done just by an `else` clause, as the scores between 0 and 100 are all covered by the other clauses. But it's nice to be exact.\n- `score >= 0 && score < 20` - \"That was a terrible score — total fail!\"\n- `score >= 20 && score < 40` - \"You know some things, but it\\'s a pretty bad score. Needs improvement.\"\n- `score >= 40 && score < 70` — \"You did a passable job, not bad!\"\n- `score >= 70 && score < 90` — \"That\\'s a great score, you really know your stuff.\"\n- `score >= 90 && score <= 100` — \"What an amazing score! Did you cheat? Are you for real?\"\n\nThe finished code should look something like this:\n\n```js\nlet response;\nlet score = 75;\nlet machineActive = false;\n\nif (machineActive) {\n  if (score < 0 || score > 100) {\n    response = \"This is not possible, an error has occurred.\";\n  } else if (score >= 0 && score < 20) {\n    response = \"That was a terrible score — total fail!\";\n  } else if (score >= 20 && score < 40) {\n    response =\n      \"You know some things, but it's a pretty bad score. Needs improvement.\";\n  } else if (score >= 40 && score < 70) {\n    response = \"You did a passable job, not bad!\";\n  } else if (score >= 70 && score < 90) {\n    response = \"That's a great score, you really know your stuff.\";\n  } else if (score >= 90 && score <= 100) {\n    response = \"What an amazing score! Did you cheat? Are you for real?\";\n  }\n} else {\n  response = \"The machine is turned off. Turn it on to process your score.\";\n}\n```\n\n## Task 3\n\nFor the final task we have to offer in this set, we need you to first write an `if ... else` statement that checks whether `machineActive` is `true`. If so, set `machineResult` to a string telling the user they can successfully log in. If not, set it to a message telling them they need to activate the machine before they can log in.\n\nInside the `if` part of the structure, you need to write a ternary operator that checks whether `pwd` is equal to `cheese`. If so, it assigns a string saying that the login was successful; if not assign a string saying the log in failed. The result should be assigned to a variable called `pwdResult`.\n\nYour solution should look something like this:\n\n```js\nlet machineActive = true;\nlet pwd = \"cheese\";\n\nlet machineResult;\nlet pwdResult;\n\nif (machineActive) {\n  machineResult = \"Machine is active. Trying login.\";\n  pwdResult =\n    pwd === \"cheese\"\n      ? \"Login successful.\"\n      : \"Password incorrect; login failed.\";\n} else {\n  machineResult = \"Machine is inactive. Activate and try logging in again.\";\n}\n```\n"
  },
  {
    "path": "javascript/building-blocks/tasks/events/events1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Events: Task 1</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      button {\n        display: block;\n        margin: 20px 0 20px 20px;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n    </section>\n\n    <button class=\"off\">Machine is off</button>\n\n  <script>\n    const btn = document.querySelector('.off');\n\n    // Add your code here\n\n  </script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/events/events1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Events: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      button {\n        display: block;\n        margin: 20px 0 20px 20px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <button class=\"off\">Machine is off</button>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\n\nconst btn = document.querySelector('.off');\n\n// Add your code here\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/events/events2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Events: Task 2</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      canvas {\n        border: 1px solid black;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n    </section>\n\n    <canvas width=\"480\" height=\"320\" tabindex=\"0\">\n\n    </canvas>\n\n  <script>\n    const canvas = document.querySelector('canvas');\n    const ctx = canvas.getContext('2d');\n\n    function drawCircle(x, y, size) {\n      ctx.fillStyle = 'white';\n      ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n      ctx.beginPath();\n      ctx.fillStyle = 'black';\n      ctx.arc(x, y, size, 0, 2 * Math.PI);\n      ctx.fill();\n    }\n\n    let x = 50;\n    let y = 50;\n    const size = 30;\n\n    drawCircle(x, y, size);\n\n    // Add your code here\n\n  </script>\n  </body>\n  \n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/events/events2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Events: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      button {\n        display: block;\n        margin: 20px 0 20px 20px;\n      }\n\n      canvas {\n        border: 1px solid black;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n    </section>\n\n    <canvas width=\"480\" height=\"320\" tabindex=\"0\">\n\n    </canvas>\n\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\n\nconst canvas = document.querySelector('canvas');\nconst ctx = canvas.getContext('2d');\n\nfunction drawCircle(x, y, size) {\n  ctx.fillStyle = 'white';\n  ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n  ctx.beginPath();\n  ctx.fillStyle = 'black';\n  ctx.arc(x, y, size, 0, 2 * Math.PI);\n  ctx.fill();\n}\n\nlet x = 50;\nlet y = 50;\nconst size = 30;\n\ndrawCircle(x, y, size);\n\n// Add your code here\n\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/events/events3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Events: Task 3</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      button {\n        display: block;\n        margin: 20px 0 20px 20px;\n      }\n\n      .button-bar {\n        padding: 20px 0;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n    </section>\n\n    <div class=\"button-bar\">\n      <button data-color=\"red\">Red</button>\n      <button data-color=\"yellow\">Yellow</button>\n      <button data-color=\"green\">Green</button>\n      <button data-color=\"purple\">Purple</button>\n    </div>\n\n  <script>\n\n  const buttonBar = document.querySelector('.button-bar');\n\n  // Add your code here\n\n  </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/events/events3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Events: Task 3</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      button {\n        display: block;\n        margin: 20px 0 20px 20px;\n      }\n\n      .button-bar {\n        padding: 20px 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <div class=\"button-bar\">\n      <button data-color=\"red\">Red</button>\n      <button data-color=\"yellow\">Yellow</button>\n      <button data-color=\"green\">Green</button>\n      <button data-color=\"purple\">Purple</button>\n    </div>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\n\n      const buttonBar = document.querySelector('.button-bar');\n\n      // Add your code here\n\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/events/marking.md",
    "content": "# JavaScript events marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the JavaScript features covered in the [Introduction to events](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events) lesson in Learn Web Development on MDN.\n\nNote: If there is an error in your code, it will be outputted into the results panel on the page, to help you try to figure out the answer (or into the browser's JavaScript console, in the case of the downloadable version).\n\n## Task 1\n\nIn our first events-related task, you need to create a simple event handler that causes the text inside the button to change when it is clicked on, and change back when it is clicked again.\n\nThe HTML should not be changed; just the JavaScript.\n\nThe finished code should look something like this:\n\n```js\nconst btn = document.querySelector(\"button\");\n\nbtn.addEventListener(\"click\", () => {\n  if (btn.className === \"on\") {\n    btn.textContent = \"Machine is off\";\n    btn.className = \"off\";\n  } else {\n    btn.textContent = \"Machine is on\";\n    btn.className = \"on\";\n  }\n});\n```\n\n## Task 2\n\nNow we'll look at keyboard events. To pass this assessment you need to build an event handler that moves the circle around the provided canvas when the WASD keys are pressed on the keyboard. The circle is drawn with the function `drawCircle()`.\n\nThe finished code should look something like this:\n\n```js\nconst canvas = document.querySelector(\"canvas\");\nconst ctx = canvas.getContext(\"2d\");\n\nfunction drawCircle(x, y, size) {\n  ctx.fillStyle = \"white\";\n  ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n  ctx.beginPath();\n  ctx.fillStyle = \"black\";\n  ctx.arc(x, y, size, 0, 2 * Math.PI);\n  ctx.fill();\n}\n\nlet x = 50;\nlet y = 50;\nconst size = 30;\n\ndrawCircle(x, y, size);\n\n// Add your code here\n\nwindow.addEventListener(\"keydown\", (e) => {\n  switch (e.key) {\n    case \"a\":\n      x -= 2;\n      break;\n    case \"d\":\n      x += 2;\n      break;\n    case \"w\":\n      y -= 2;\n      break;\n    case \"s\":\n      y += 2;\n      break;\n  }\n\n  drawCircle(x, y, size);\n});\n```\n\n## Task 3\n\nOur final events-related task involves making use of bubbling and event objects. You need to set a click listener on the buttons' parent element, which when invoked by clicking any of the buttons will use `e.target` to grab the `data-color` attribute of the particular button that was clicked, and set the background of the `button-bar` to that color.\n\nYou should be able to solve this without looping through all the buttons and giving each one their own event listener.\n\nThe code should look like this:\n\n```js\nconst buttonBar = document.querySelector(\".button-bar\");\n\n// Add your code here\n\nfunction setColor(e) {\n  buttonBar.style.backgroundColor = e.target.getAttribute(\"data-color\");\n}\n\nbuttonBar.addEventListener(\"click\", setColor);\n```\n"
  },
  {
    "path": "javascript/building-blocks/tasks/functions/functions1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Functions: Task 1</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    const names = ['Chris', 'Li Kang', 'Anne', 'Francesca', 'Mustafa', 'Tina', 'Bert', 'Jada']\n    const para = document.createElement('p');\n\n    // Add your code here\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    section.appendChild(para);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/functions/functions1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Functions: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\nconst names = ['Chris', 'Li Kang', 'Anne', 'Francesca', 'Mustafa', 'Tina', 'Bert', 'Jada']\nconst para = document.createElement('p');\n\n// Add your code here\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\n\nsection.appendChild(para);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/functions/functions2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Functions: Task 2</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n\n      canvas {\n        border: 1px solid black;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n    </section>\n\n    <canvas width=\"480\" height=\"320\">\n\n    </canvas>\n\n  </body>\n  <script>\n    const canvas = document.querySelector('canvas');\n    const ctx = canvas.getContext('2d');\n\n    const x = 50;\n    const y = 60;\n    const width = 100;\n    const height = 75;\n    const color = 'blue';\n\n    // Add your code here\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/functions/functions2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Functions: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      canvas {\n        border: 1px solid black;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n    </section>\n\n    <canvas width=\"480\" height=\"320\">\n\n    </canvas>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\nconst canvas = document.querySelector('canvas');\nconst ctx = canvas.getContext('2d');\n\nconst x = 50;\nconst y = 60;\nconst width = 100;\nconst height = 75;\nconst color = 'blue';\n\n// Add your code here\n\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/functions/functions3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Functions: Task 3</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    const names = ['Chris', 'Li Kang', 'Anne', 'Francesca', 'Mustafa', 'Tina', 'Bert', 'Jada']\n    const para = document.createElement('p');\n\n    // Add your code here\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    section.appendChild(para);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/functions/functions3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Functions: Task 3</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\nconst names = ['Chris', 'Li Kang', 'Anne', 'Francesca', 'Mustafa', 'Tina', 'Bert', 'Jada']\nconst para = document.createElement('p');\n\n// Add your code here\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\n\nsection.appendChild(para);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/functions/functions4-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Functions: Task 4</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    const names = ['Chris', 'Li Kang', 'Anne', 'Francesca', 'Mustafa', 'Tina', 'Bert', 'Jada'];\n    const para = document.createElement('p');\n\n    function isShort(name) {\n      return name.length < 5;\n    }\n\n    const shortNames = names.filter(isShort);\n    para.textContent = shortNames;\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    section.appendChild(para);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/functions/functions4.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Functions: Task 3</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\nconst names = ['Chris', 'Li Kang', 'Anne', 'Francesca', 'Mustafa', 'Tina', 'Bert', 'Jada'];\nconst para = document.createElement('p');\n\nfunction isShort(name) {\n  return name.length < 5;\n}\n\nconst shortNames = names.filter(isShort);\npara.textContent = shortNames;\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\n\nsection.appendChild(para);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/functions/marking.md",
    "content": "# JavaScript functions marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the JavaScript features covered in the [Functions — reusable blocks of code](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/conditionals), [Build your own function](https://wiki.developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Build_your_own_function), and [https://wiki.developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Return_values](https://wiki.developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Return_values) lessons in Learn Web Development on MDN.\n\nNote: If there is an error in your code, it will be outputted into the results panel on the page, to help you try to figure out the answer (or into the browser's JavaScript console, in the case of the downloadable version).\n\n## Task 1\n\nIn the first task, you have to create a simple function that prints a random name from the provided array to the provided paragraph, and then run it once.\n\nThe finished code should look something like this:\n\n```js\nconst names = [\n  \"Chris\",\n  \"Li Kang\",\n  \"Anne\",\n  \"Francesca\",\n  \"Mustafa\",\n  \"Tina\",\n  \"Bert\",\n  \"Jada\",\n];\nconst para = document.querySelector(\"p\");\n\nfunction chooseName() {\n  const randomNumber = Math.floor(Math.random() * names.length);\n  const choice = names[randomNumber];\n  para.textContent = choice;\n}\n\nchooseName();\n```\n\n## Task 2\n\nFor our second functions-related task, you need to create a function that draws a rectangle on the provided `<canvas>`, based on five input variables — `x`, `y`, `width`, `height`, and `color`.\n\nYou'll want to clear the canvas before drawing, so that when the code is updated in the case of the live version, you don't get lots of rectangles drawn on top of one another.\n\nThe finished code should look something like this:\n\n```js\nconst canvas = document.querySelector(\"canvas\");\nconst ctx = canvas.getContext(\"2d\");\n\nconst x = 50;\nconst y = 60;\nconst width = 100;\nconst height = 75;\nconst color = \"blue\";\n\nfunction drawSquare(x, y, width, height, color) {\n  ctx.fillStyle = \"white\";\n  ctx.fillRect(0, 0, canvas.width, canvas.height);\n  ctx.fillStyle = color;\n  ctx.fillRect(x, y, width, height);\n}\n\ndrawSquare(x, y, width, height, color);\n```\n\n## Task 3\n\nIn this task, you return to the problem posed in Task 1, with the aim of improving it. The three improvements we are expecting here are:\n\n1. Refactor the code that generates the random number into a separate function that takes two generic bounds that the random number should be between, and returns the result.\n2. Update the `chooseName()` function so that it makes use of the random number function, takes the array to choose from as a parameter (making it more flexible), and returns its result.\n3. Print this returned result into the paragraph.\n\n```js\nconst names = [\n  \"Chris\",\n  \"Li Kang\",\n  \"Anne\",\n  \"Francesca\",\n  \"Mustafa\",\n  \"Tina\",\n  \"Bert\",\n  \"Jada\",\n];\nconst para = document.querySelector(\"p\");\n\nfunction random(min, max) {\n  const num = Math.floor(Math.random() * (max - min)) + min;\n  return num;\n}\n\nfunction chooseItem(array) {\n  const choice = array[random(0, array.length)];\n  return choice;\n}\n\npara.textContent = chooseItem(names);\n```\n\n## Task 4\n\nIn this task, you are asked to change the named `isShort()` function into an arrow function expression.\n\nThe finished code should look something like this:\n\n```js\nconst names = [\n  \"Chris\",\n  \"Li Kang\",\n  \"Anne\",\n  \"Francesca\",\n  \"Mustafa\",\n  \"Tina\",\n  \"Bert\",\n  \"Jada\",\n];\nconst para = document.createElement(\"p\");\n\nconst shortNames = names.filter((name) => name.length < 5);\npara.textContent = shortNames;\n```\n"
  },
  {
    "path": "javascript/building-blocks/tasks/loops/loops1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Loops: Task 1</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    const myArray = ['tomatoes', 'chick peas', 'onions', 'rice', 'black beans'];\n    const list = document.createElement('ul');\n\n    // Add your code here\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n    section.appendChild(list);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/loops/loops2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Loops: Task 2</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    const name = 'Mustafa';\n    const para = document.createElement('p');\n\n    const phonebook = [\n      { name : 'Chris', number : '1549' },\n      { name : 'Li Kang', number : '9634' },\n      { name : 'Anne', number : '9065' },\n      { name : 'Francesca', number : '3001' },\n      { name : 'Mustafa', number : '6888' },\n      { name : 'Tina', number : '4312' },\n      { name : 'Bert', number : '7780' },\n      { name : 'Jada', number : '2282' },\n    ]\n\n    // Add your code here\n\n    // Don't edit the code below here!\n    const section = document.querySelector('section');\n    section.appendChild(para);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/loops/loops3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Loops: Task 3</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    let i = 500;\n    const para = document.createElement('p');\n\n    function isPrime(num) {\n      for(let i = 2; i < num; i++) {\n        if(num % i === 0) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n\n\n    // Add your code here\n\n\n    // Don't edit the code below here!\n    const section = document.querySelector('section');\n    section.appendChild(para);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/building-blocks/tasks/loops/marking.md",
    "content": "# JavaScript loops marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the JavaScript features covered in the [Looping code](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Looping_code) lesson in Learn Web Development on MDN.\n\nNote: If there is an error in your code, it will be outputted into the results panel on the page, to help you try to figure out the answer (or into the browser's JavaScript console, in the case of the downloadable version).\n\nNote: We didn't provide live editable versions of these tasks because of the risk of creating infinite loops and crashing the assessment page.\n\n## Task 1\n\nIn our first looping task we want you start by creating a simple `for...of` loop that goes through all the items in the provided `myArray` and prints them out on the screen inside list items, which are appended to the provided `list`.\n\nNote that using a `for()` loop would also be acceptable, as would a different loop structure such as `while()`.\n\nThe finished code should look something like this:\n\n```js\nconst myArray = [\"tomatoes\", \"chick peas\", \"onions\", \"rice\", \"black beans\"];\n\nconst list = document.createElement(\"ul\");\n\nfor (let item of myArray) {\n  const listItem = document.createElement(\"li\");\n  listItem.textContent = item;\n  list.appendChild(listItem);\n}\n```\n\n## Task 2\n\nIn this next task, we want you to write a simple program that, given a name, searches an array of objects containing names and emails (`phonebook`) and, if it finds the name, outputs the name and phone number and then uses `break` to exit the loop.\n\nIf the name is not found, it lets the user know.\n\nYou should use a type of loop that you've not used in the previous task.\n\nThe finished code should look something like this:\n\n```js\nconst name = \"Mustafa\";\nconst para = document.createElement(\"p\");\n\nconst phonebook = [\n  { name: \"Chris\", number: \"1549\" },\n  { name: \"Li Kang\", number: \"9634\" },\n  { name: \"Anne\", number: \"9065\" },\n  { name: \"Francesca\", number: \"3001\" },\n  { name: \"Mustafa\", number: \"6888\" },\n  { name: \"Tina\", number: \"4312\" },\n  { name: \"Bert\", number: \"7780\" },\n  { name: \"Jada\", number: \"2282\" },\n];\n\n// Add your code here\nfor (let i = 0; i < phonebook.length; i++) {\n  if (phonebook[i].name === name) {\n    para.textContent = `${phonebook[i].name}'s number is ${phonebook[i].number}.`;\n    break;\n  }\n\n  if (i === phonebook.length - 1) {\n    para.textContent = \"Name not found in the phonebook\";\n  }\n}\n```\n\n## Task 3\n\nFinally, you'll need to use a loop to go through the numbers 1 to 500, backwards, and run the `isPrime()` function on them. For each number that isn't a prime number, use the `continue` keyword to move on to the next loop iteration. For each one that is a prime number, add it to the paragraph's `textContent`.\n\nYou should use a type of loop that you've not used in the previous two tasks.\n\nThe code should look something like this:\n\n```js\ndo {\n  if (isPrime(i)) {\n    para.textContent += `${i} `;\n  }\n  i--;\n} while (i > 1);\n```\n\n(Answer provided by harryghgim; well done!)\n"
  },
  {
    "path": "javascript/building-blocks/tasks/playable.js",
    "content": "var section = document.querySelector('section');\nvar editable = document.querySelector('.editable');\nvar textareaJS = document.querySelector('.playable-js');\nvar reset = document.getElementById('reset');\nvar jsCode = textareaJS.value;\n\nfunction fillCode() {\n    editable.textContent = textareaJS.value;\n    section.innerHTML = ' ';\n    try {\n      eval(editable.textContent);\n    } catch(e) {\n      let para = document.createElement('p');\n      para.textContent = e;\n      section.appendChild(para);\n    }\n}\n\nreset.addEventListener('click', function () {\n    textareaJS.value = jsCode;\n    fillCode();\n});\n\ntextareaJS.addEventListener('input', fillCode);\nwindow.addEventListener('load', fillCode);\n"
  },
  {
    "path": "javascript/building-blocks/tasks/styles.css",
    "content": "/* Some default styling for cookbook examples */\n/*\nrgb(53,43,34)\nrgb(75,70,74)\nrgb(95,97,110)\nrgb(137,151,188)\nrgb(160,178,226)\n*/\nbody {\n    background-color: #fff;\n    color: #333;\n    font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n    padding: 0;\n    margin: 0;\n}\n\nh1 {\n  font-size: 2rem;\n  margin: 0;\n}\n\nh2 {\n  font-size: 1.6rem;\n  margin: 0;\n}\n\np {\n  margin: 0.5em 0;\n}\n\n/* styles for the editor */\n\n.playable {\n    font-family: monospace;\n    display: block;\n    margin-bottom: 10px;\n    background-color: #F4F7F8;\n    border: none;\n    border-left: 6px solid #558ABB;\n    color: #4D4E53;\n    width: 90%;\n    max-width: 700px;\n    padding: 10px 10px 0px;\n    font-size: 90%;\n  }\n\n  .playable-css {\n    height: 80px;\n  }\n\n  .playable-js {\n    height: 160px;\n  }\n\n  .playable-buttons {\n    text-align: right;\n    width: 90%;\n    max-width: 700px;\n    padding: 5px 10px 5px 26px;\n    font-size: 100%;\n  }\n\n  .preview {\n    width: 90%;\n    max-width: 700px;\n    border: 1px solid #4D4E53;\n    border-radius: 2px;\n    padding: 10px 14px 10px 10px;\n    margin-bottom: 10px;\n  }\n\n  .preview input {\n    display: block;\n    margin: 5px;\n  }\n"
  },
  {
    "path": "javascript/introduction-to-js-1/assessment-finished/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n\n    <title>Silly story generator</title>\n\n    <style>\n      body {\n        font-family: helvetica, sans-serif;\n        width: 350px;\n      }\n\n      label {\n        font-weight: bold;\n      }\n\n      div {\n        padding-bottom: 20px;\n      }\n\n      input[type=\"text\"] {\n        padding: 5px;\n        width: 150px;\n      }\n\n      p {\n        background: #ffc125;\n        color: #5e2612;\n        padding: 10px;\n        visibility: hidden;\n      }\n    </style>\n  </head>\n\n  <body>\n    <div>\n      <label for=\"customname\">Enter custom name:</label>\n      <input id=\"customname\" type=\"text\" placeholder=\"\" />\n    </div>\n    <div>\n      <label for=\"us\">US</label\n      ><input id=\"us\" type=\"radio\" name=\"ukus\" value=\"us\" checked />\n      <label for=\"uk\">UK</label\n      ><input id=\"uk\" type=\"radio\" name=\"ukus\" value=\"uk\" />\n    </div>\n    <div>\n      <button class=\"randomize\">Generate random story</button>\n    </div>\n    <!-- Thanks a lot to Willy Aguirre for his help with the code for this assessment -->\n    <p class=\"story\"></p>\n    <script src=\"main.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/assessment-finished/main.js",
    "content": "const customName = document.getElementById('customname');\nconst randomize = document.querySelector('.randomize');\nconst story = document.querySelector('.story');\n\nfunction randomValueFromArray(array){\n  const random = Math.floor(Math.random()*array.length);\n  return array[random];\n}\n\nconst storyText = 'It was 94 fahrenheit outside, so :insertx: went for a walk. When they got to :inserty:, they stared in horror for a few moments, then :insertz:. Bob saw the whole thing, but was not surprised — :insertx: weighs 300 pounds, and it was a hot day.';\nconst insertX = ['Willy the Goblin', 'Big Daddy', 'Father Christmas'];\nconst insertY = ['the soup kitchen', 'Disneyland', 'the White House'];\nconst insertZ = ['spontaneously combusted', 'melted into a puddle on the sidewalk', 'turned into a slug and crawled away'];\n\nrandomize.addEventListener('click', result);\n\nfunction result() {\n  let newStory = storyText;\n\n  const xItem = randomValueFromArray(insertX);\n  const yItem = randomValueFromArray(insertY);\n  const zItem = randomValueFromArray(insertZ);\n\n  newStory = newStory.replaceAll(':insertx:',xItem);\n  newStory = newStory.replaceAll(':inserty:',yItem);\n  newStory = newStory.replaceAll(':insertz:',zItem);\n\n  if (customName.value !== '') {\n    const name = customName.value;\n    newStory = newStory.replaceAll('Bob', name);\n  }\n\n  if (document.getElementById(\"uk\").checked) {\n    const weight = `${Math.round(300*0.0714286)} stone`;\n    const temperature =  `${Math.round((94-32) * 5 / 9)} centigrade`;\n    newStory = newStory.replaceAll('94 fahrenheit', temperature);\n    newStory = newStory.replaceAll('300 pounds', weight);\n  }\n\n  story.textContent = newStory;\n  story.style.visibility = 'visible';\n}\n"
  },
  {
    "path": "javascript/introduction-to-js-1/assessment-finished/marking-guide.md",
    "content": "# Marking guide for \"Silly story generator\"\nThe following guide outlines a marking guide for the MDN Learning Area JavaScript Topic — [Silly story generator](https://developer.mozilla.org/en-US/Learn/JavaScript/First_steps/Silly_story_generator). Each subtask detailed in the assessment is listed below, along with an explanation of how many marks the task is worth, and the mark breakdown.\n\nNote: These are guidelines, not set in stone rules — you are of course free to use your judgement on mark awarding when you meet an edge case, or something that isn't clear cut.\n\nThe overall mark awarded is out of 39. Work out their final mark, and then divide by 39 and multiply by 100 to give a percentage mark. For reference, you can find a [finished program](main.js) that would be awarded top marks.\n\n## Basic setup\n\n<dl>\n<dt>Create <code>main.js</code></dt>\n<dd>One mark for this; it is pretty simple.</dd>\n<dt>Apply the external JS file to your HTML</dt>\n<dd>One mark for this too.</dd>\n</dl>\n\n## Initial variables and functions\n\n<dl>\n<dt>Copy the code from section 1 of the raw text file into <code>main.js</code>.</dt>\n<dd>One mark for this.</dd>\n<dt>Store the big long text string inside a variable called <code>storyText</code>.</dt>\n<dd>One mark for this — creating a simple variable and storing a string inside it is not complex.</dd>\n<dt>Store the three sets of strings inside three arrays called <code>insertX</code>, <code>insertY</code>, and <code>insertZ</code>.</dt>\n<dd>6 marks for this — 2 for each array. Creating an array of strings is not quite as simple as a string variable.</dd>\n</dl>\n\n## Placing the event handler and incomplete function\nOnly one mark for this bit — it's just more simple copy and paste.\n\n## Completing the result() function\n\n<dl>\n<dt>Create a new variable called <code>newStory</code>, and set it's value to equal <code>storyText</code>.</dt>\n<dd>One mark for this — another simple variable definition.</dd>\n<dt>Create three new variables called <code>xItem</code>, <code>yItem</code>, and <code>zItem</code>...</dt>\n<dd>6 marks for this, 2 for each correct definition. For each one they basically have to initialise the new variable, and declare it's value as the corresponding array passed to the <code>randomValueFromArray()</code> function. So for example, <code>const xItem = randomValueFromArray(insertX);</code>.</dd>\n<dt>Next we want to replace the three placeholders in the newStory string...</dt>\n<dd>8 marks, two for each of the four substitutions needed. For each of these lines, we need to call the <code>replaceAll()</code> string method on <code>newStory</code>, giving it as parameters the placeholder first of all (e.g. <code>'insertx:'</code>), and then the variable value to replace the placeholder with (e.g. <code>xItem</code>). We need to store the result of that method call in <code>newStory</code>, so the result of each line is that <code>newStory</code> will be made equal to itself, but with some substitutions made. An example correct line is <code>newStory = newStory.replaceAll(':insertx:',xItem);</code>. This line will substitute both instances of <code>':insertx:'</code>. If you use <code>replace()</code> instead of <code>replaceAll()</code> then this line needs to be called twice, as using <code>replace()</code> like this only replaces the first instance of the matched substring.\n<dt>Inside the second <code>if</code> block, we are checking to see if the <code>uk</code> radio button has been selected...</dt>\n<dd>There are four parts to this question. Let's go through each one in turn:\n  <ul>\n    <li>Four marks for this, 2 for each formula. The two required formulae are <code>pounds x 0.0714286 = stone</code> and <code>(Fahrenheit - 32) * (5 / 9) = centigrade. </code></li>\n    <li>Two marks for this. They need to replace <code>300</code> with <code>300*0.0714286</code>, and then concatenate <code>' stone'</code> onto the end of the whole line, so in total, the value of <code>weight</code> is <code>Math.round(300*0.0714286) + ' stone'</code>.</li>\n    <li>Two marks for this. They need to replace <code>94</code> with <code>(94-32) * 5 / 9</code>, and then concatenate <code>' centigrade'</code> onto the end of the whole line, so in total, the value of <code>temperature</code> is <code>Math.round((94-32) * 5 / 9) + ' centigrade'</code>.</li>\n    <li>Four marks in total for these; they are just the same as the other <code>replaceAll()</code> lines that came before them. For these two lines we need <code>newStory = newStory.replaceAll('94 fahrenheit',temperature);</code> and\n    <code>newStory = newStory.replaceAll('300 pounds',weight);</code></li>\n  </ul>\n</dd>\n<dt>Finally, in the second-to-last line of the function, make the <code>textContent</code> property of the <code>story</code> variable...</dt>\n<dd>One mark for this, as it's pretty easy; just add the <code>newStory</code> variable into the line — <code>story.textContent = newStory;</code>.</dd>\n</dl>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/assessment-start/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n\n    <title>Silly story generator</title>\n\n    <style>\n      body {\n        font-family: helvetica, sans-serif;\n        width: 350px;\n      }\n\n      label {\n        font-weight: bold;\n      }\n\n      div {\n        padding-bottom: 20px;\n      }\n\n      input[type=\"text\"] {\n        padding: 5px;\n        width: 150px;\n      }\n\n      p {\n        background: #ffc125;\n        color: #5e2612;\n        padding: 10px;\n        visibility: hidden;\n      }\n    </style>\n  </head>\n\n  <body>\n    <div>\n      <label for=\"customname\">Enter custom name:</label>\n      <input id=\"customname\" type=\"text\" placeholder=\"\" />\n    </div>\n    <div>\n      <label for=\"us\">US</label\n      ><input id=\"us\" type=\"radio\" name=\"ukus\" value=\"us\" checked />\n      <label for=\"uk\">UK</label\n      ><input id=\"uk\" type=\"radio\" name=\"ukus\" value=\"uk\" />\n    </div>\n    <div>\n      <button class=\"randomize\">Generate random story</button>\n    </div>\n    <!-- Thanks a lot to Willy Aguirre for his help with the code for this assessment -->\n    <p class=\"story\"></p>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/assessment-start/raw-text.txt",
    "content": "1. COMPLETE VARIABLE AND FUNCTION DEFINITIONS\n\nconst customName = document.getElementById('customname');\nconst randomize = document.querySelector('.randomize');\nconst story = document.querySelector('.story');\n\nfunction randomValueFromArray(array){\n  const random = Math.floor(Math.random()*array.length);\n  return array[random];\n}\n\n2. RAW TEXT STRINGS\n\nIt was 94 fahrenheit outside, so :insertx: went for a walk. When they got to :inserty:, they stared in horror for a few moments, then :insertz:. Bob saw the whole thing, but was not surprised — :insertx: weighs 300 pounds, and it was a hot day.\n\nWilly the Goblin\nBig Daddy\nFather Christmas\n\nthe soup kitchen\nDisneyland\nthe White House\n\nspontaneously combusted\nmelted into a puddle on the sidewalk\nturned into a slug and crawled away\n\n3. EVENT LISTENER AND PARTIAL FUNCTION DEFINITION\n\nrandomize.addEventListener('click', result);\n\nfunction result() {\n\n  if(customName.value !== '') {\n    const name = customName.value;\n\n  }\n\n  if(document.getElementById(\"uk\").checked) {\n    const weight = Math.round(300);\n    const temperature =  Math.round(94);\n\n  }\n\n  story.textContent = ;\n  story.style.visibility = 'visible';\n}\n"
  },
  {
    "path": "javascript/introduction-to-js-1/first-splash/number-guessing-game-start.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n\n    <title>Number guessing game</title>\n\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      body {\n        width: 50%;\n        max-width: 800px;\n        min-width: 480px;\n        margin: 0 auto;\n      }\n      \n      .form input[type=\"number\"] {\n        width: 200px;\n      }\n\n      .lastResult {\n        color: white;\n        padding: 3px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <h1>Number guessing game</h1>\n\n    <p>We have selected a random number between 1 and 100. See if you can guess it in 10 turns or fewer. We'll tell you if your guess was too high or too low.</p>\n\n    <div class=\"form\">\n      <label for=\"guessField\">Enter a guess: </label>\n      <input type=\"number\" min=\"1\" max=\"100\" required id=\"guessField\" class=\"guessField\">\n      <input type=\"submit\" value=\"Submit guess\" class=\"guessSubmit\">\n    </div>\n\n    <div class=\"resultParas\">\n      <p class=\"guesses\"></p>\n      <p class=\"lastResult\"></p>\n      <p class=\"lowOrHi\"></p>\n    </div>\n\n    <script>\n\n      // Your JavaScript goes here\n\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/first-splash/number-guessing-game.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n\n    <title>Number guessing game</title>\n\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      body {\n        width: 50%;\n        max-width: 800px;\n        min-width: 480px;\n        margin: 0 auto;\n      }\n      \n      .form input[type=\"number\"] {\n        width: 200px;\n      }\n\n      .lastResult {\n        color: white;\n        padding: 3px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <h1>Number guessing game</h1>\n\n    <p>We have selected a random number between 1 and 100. See if you can guess it in 10 turns or fewer. We'll tell you if your guess was too high or too low.</p>\n\n    <div class=\"form\">\n      <label for=\"guessField\">Enter a guess: </label>\n      <input type=\"number\" min=\"1\" max=\"100\" required id=\"guessField\" class=\"guessField\">\n      <input type=\"submit\" value=\"Submit guess\" class=\"guessSubmit\">\n    </div>\n\n    <div class=\"resultParas\">\n      <p class=\"guesses\"></p>\n      <p class=\"lastResult\"></p>\n      <p class=\"lowOrHi\"></p>\n    </div>\n\n    <script>\n      let randomNumber = Math.floor(Math.random() * 100) + 1;\n      const guesses = document.querySelector('.guesses');\n      const lastResult = document.querySelector('.lastResult');\n      const lowOrHi = document.querySelector('.lowOrHi');\n      const guessSubmit = document.querySelector('.guessSubmit');\n      const guessField = document.querySelector('.guessField');\n      let guessCount = 1;\n      let resetButton;\n\n      function checkGuess() {\n        const userGuess = Number(guessField.value);\n        if (guessCount === 1) {\n          guesses.textContent = 'Previous guesses: ';\n        }\n\n        guesses.textContent = `${guesses.textContent} ${userGuess}`;\n\n        if (userGuess === randomNumber) {\n          lastResult.textContent = 'Congratulations! You got it right!';\n          lastResult.style.backgroundColor = 'green';\n          lowOrHi.textContent = '';\n          setGameOver();\n        } else if (guessCount === 10) {\n          lastResult.textContent = '!!!GAME OVER!!!';\n          lowOrHi.textContent = '';\n          setGameOver();\n        } else {\n          lastResult.textContent = 'Wrong!';\n          lastResult.style.backgroundColor = 'red';\n          if(userGuess < randomNumber) {\n            lowOrHi.textContent = 'Last guess was too low!' ;\n          } else if(userGuess > randomNumber) {\n            lowOrHi.textContent = 'Last guess was too high!';\n          }\n        }\n\n        guessCount++;\n        guessField.value = '';\n        guessField.focus();\n      }\n\n      guessSubmit.addEventListener('click', checkGuess);\n\n      function setGameOver() {\n        guessField.disabled = true;\n        guessSubmit.disabled = true;\n        resetButton = document.createElement('button');\n        resetButton.textContent = 'Start new game';\n        document.body.appendChild(resetButton);\n        resetButton.addEventListener('click', resetGame);\n      }\n\n      function resetGame() {\n        guessCount = 1;\n        const resetParas = document.querySelectorAll('.resultParas p');\n        for (const resetPara of resetParas) {\n          resetPara.textContent = '';\n        }\n\n        resetButton.parentNode.removeChild(resetButton);\n        guessField.disabled = false;\n        guessSubmit.disabled = false;\n        guessField.value = '';\n        guessField.focus();\n        lastResult.style.backgroundColor = 'white';\n        randomNumber = Math.floor(Math.random() * 100) + 1;\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/maths/conditional.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>First conditional example</title>\n  </head>\n  <body>\n    <button>Start machine</button>\n    <p>The machine is stopped.</p>\n  </body>\n\n  <script>\n    const btn = document.querySelector('button');\n    const txt = document.querySelector('p');\n\n    btn.addEventListener('click', updateBtn);\n\n    function updateBtn() {\n      if(btn.textContent === 'Start machine') {\n        btn.textContent = 'Stop machine';\n        txt.textContent = 'The machine has started!';\n      } else {\n        btn.textContent = 'Start machine';\n        txt.textContent = 'The machine is stopped.';\n      }\n    }\n  </script>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/maths/editable_canvas.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title>Editable canvas example</title>\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n\n      h2 {\n        font-size: 16px;\n      }\n\n      .a11y-label {\n        margin: 0;\n        text-align: right;\n        font-size: 0.7rem;\n        width: 98%;\n      }\n\n      body {\n        margin: 10px;\n        background: #f5f9fa;\n      }\n\n      textarea {\n        height: 150px;\n        background-color: #f4f7f8;\n        border: none;\n        border-left: 6px solid #558abb;\n        color: #4d4e53;\n        width: 90%;\n        max-width: 700px;\n        padding: 10px 10px 0px;\n      }\n\n      .playable-buttons {\n        text-align: right;\n        width: 90%;\n        max-width: 700px;\n        padding: 5px 10px 5px 26px;\n      }\n\n      canvas {\n        background: white;\n        border: 1px solid #4d4e53;\n        border-radius: 2px;\n      }\n\n      li {\n        padding-bottom: 0.5em;\n      }\n    </style>\n  </head>\n  <body>\n    <h2>Live output</h2>\n    <canvas id=\"canvas\" width=\"400\" height=\"250\" class=\"playable-canvas\">\n    </canvas>\n\n    <p>The rectangle is 50px wide and 50px high.</p>\n\n    <h2>Editable code</h2>\n    <p class=\"a11y-label\">\n      Press Esc to move focus away from the code area (Tab inserts a tab\n      character).\n    </p>\n    <textarea id=\"code\" class=\"playable-code\" style=\"height: 150px; width: 95%\">\n// Edit the two lines below here ONLY\nx = 50;\ny = 50;\n\nctx.fillStyle = 'green';\nctx.fillRect(10, 10, x, y);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n    <div>\n      <p>Let's try the following:</p>\n      <ol>\n        <li>\n          Change the line that calculates <code>x</code> so the box is still 50px wide, but\n          the 50 is calculated using the numbers 43 and 7 and an arithmetic\n          operator.\n        </li>\n        <li>\n          Change the line that calculates <code>y</code> so the box is 75px high, but the 75\n          is calculated using the numbers 25 and 3 and an arithmetic operator.\n        </li>\n        <li>\n          Change the line that calculates <code>x</code> so the box is 250px wide, but the\n          250 is calculated using two numbers and the remainder (modulo)\n          operator.\n        </li>\n        <li>\n          Change the line that calculates <code>y</code> so the box is 150px high, but the\n          150 is calculated using three numbers and the subtraction and division\n          operators.\n        </li>\n        <li>\n          Change the line that calculates <code>x</code> so the box is 200px wide, but the\n          200 is calculated using the number 4 and an assignment operator.\n        </li>\n        <li>\n          Change the line that calculates <code>y</code> so the box is 200px high, but the\n          200 is calculated using the numbers 50 and 3, the multiplication\n          operator, and the addition assignment operator.\n          Don't forget to first assign a default value to <code>y</code> (in a separate line), so the addition works as expected.\n        </li>\n      </ol>\n    </div>\n\n    <script>\n      const canvas = document.getElementById(\"canvas\");\n      const para = document.querySelector(\"p\");\n      const ctx = canvas.getContext(\"2d\");\n      const textarea = document.getElementById(\"code\");\n      const reset = document.getElementById(\"reset\");\n      const edit = document.getElementById(\"edit\");\n      let code = textarea.value;\n      let x = 50;\n      let y = 50;\n\n      function drawCanvas() {\n        ctx.clearRect(0, 0, canvas.width, canvas.height);\n        eval(textarea.value);\n        para.textContent = `The rectangle is ${x}px wide and ${y}px high.`;\n      }\n\n      reset.addEventListener(\"click\", function () {\n        textarea.value = code;\n        drawCanvas();\n      });\n\n      textarea.addEventListener(\"input\", drawCanvas);\n      window.addEventListener(\"load\", drawCanvas);\n\n      // stop tab key tabbing out of textarea and\n      // make it write a tab at the caret position instead\n\n      textarea.onkeydown = function (e) {\n        if (e.keyCode === 9) {\n          e.preventDefault();\n          insertAtCaret(\"\\t\");\n        }\n\n        if (e.keyCode === 27) {\n          textarea.blur();\n        }\n      };\n\n      function insertAtCaret(text) {\n        const scrollPos = textarea.scrollTop;\n        const caretPos = textarea.selectionStart;\n        const front = textarea.value.substring(0, caretPos);\n        const back = textarea.value.substring(\n          textarea.selectionEnd,\n          textarea.value.length\n        );\n\n        textarea.value = front + text + back;\n        caretPos = caretPos + text.length;\n        textarea.selectionStart = caretPos;\n        textarea.selectionEnd = caretPos;\n        textarea.focus();\n        textarea.scrollTop = scrollPos;\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/arrays/arrays1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Arrays: Task 1</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    // Add your code here\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    let para1 = document.createElement('p');\n    para1.textContent = `Array: ${ myArray }`;\n\n    section.appendChild(para1);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/arrays/arrays1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Arrays: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\n\n// Add your code here\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\nlet para1 = document.createElement('p');\npara1.textContent = `Array: ${ myArray }`;\n\nsection.appendChild(para1);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/arrays/arrays2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Arrays: Task 2</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    // Add your code here\n\n    let myString = 'Ryu+Ken+Chun-Li+Cammy+Guile+Sakura+Sagat+Juri';\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    let para1 = document.createElement('p');\n    para1.textContent = `Array: ${ myArray }`;\n\n    let para2 = document.createElement('p');\n    para2.textContent = `The length of the array is ${ arrayLength }.`;\n\n    let para3 = document.createElement('p');\n    para3.textContent = `The last item in the array is \"${ lastItem }\".`;\n\n    section.appendChild(para1);\n    section.appendChild(para2);\n    section.appendChild(para3);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/arrays/arrays2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Arrays: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\n\n// Add your code here\n\nlet myString = 'Ryu+Ken+Chun-Li+Cammy+Guile+Sakura+Sagat+Juri';\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\nlet para1 = document.createElement('p');\npara1.textContent = `Array: ${ myArray }`;\n\nlet para2 = document.createElement('p');\npara2.textContent = `The length of the array is ${ arrayLength }.`;\n\nlet para3 = document.createElement('p');\npara3.textContent = `The last item in the array is \"${ lastItem }\".`;\n\nsection.appendChild(para1);\nsection.appendChild(para2);\nsection.appendChild(para3);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/arrays/arrays3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Arrays: Task 3</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    let myArray = [ \"Ryu\", \"Ken\", \"Chun-Li\", \"Cammy\", \"Guile\", \"Sakura\", \"Sagat\", \"Juri\" ];\n\n    // Add your code here\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    let para1 = document.createElement('p');\n    para1.textContent = myString;\n\n    section.appendChild(para1);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/arrays/arrays3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Arrays: Task 3</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\nlet myArray = [ \"Ryu\", \"Ken\", \"Chun-Li\", \"Cammy\", \"Guile\", \"Sakura\", \"Sagat\", \"Juri\" ];\n\n// Add your code here\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\n\nlet para1 = document.createElement('p');\npara1.textContent = myString;\n\nsection.appendChild(para1);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/arrays/arrays4-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Arrays: Task 4</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    const birds = [ \"Parrots\", \"Falcons\", \"Eagles\", \"Emus\", \"Caracaras\", \"Egrets\" ];\n\n    // Add your code here\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    const para1 = document.createElement('p');\n    para1.textContent = eBirds;\n\n    section.appendChild(para1);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/arrays/arrays4.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Arrays: Task 4</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\nconst birds = [ \"Parrots\", \"Falcons\", \"Eagles\", \"Emus\", \"Caracaras\", \"Egrets\" ];\n\n// Add your code here\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\n\nconst para1 = document.createElement('p');\npara1.textContent = eBirds;\n\nsection.appendChild(para1);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/arrays/marking.md",
    "content": "# JavaScript arrays marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the JavaScript features covered in the [Arrays](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Arrays) lesson in Learn Web Development on MDN.\n\nNote: If there is an error in your code, it will be outputted into the results panel on the page, to help you try to figure out the answer (or into the browser's JavaScript console, in the case of the downloadable version).\n\n## Task 1\n\nWe'll start off simple; the first thing you need to do here is create an array of three items. Choose whatever items you like — your favourite bands or foods, perhaps? Store in a variable called `myArray`.\n\nNext, modify the first two items in the array to some different items, using simple bracket notation, e.g. `myArray[0] = 'pizza'`.\n\nLast of all, add an item to the start of the array using `.unshift()`.\n\nThe answer should look something like this:\n\n```js\nlet myArray = [\"cats\", \"dogs\", \"chickens\"];\n\nmyArray[0] = \"horses\";\nmyArray[1] = \"pigs\";\n\nmyArray.unshift(\"crocodiles\");\n```\n\n## Task 2\n\nMoving on, the next task provides a string for you to work on.\n\nHere you are expected to start by splitting the string into an array using `.split('+')`. Store the array in `myArray`.\n\nNext, store the length of the array (`myArray.length`) in a variable called `arrayLength`.\n\nLast up, retrieve the last item in the array with `myArray[myArray.length - 1]`; store it in `lastItem`.\n\nThe example should look something like this:\n\n```js\nlet myString = \"Ryu+Ken+Chun-Li+Cammy+Guile+Sakura+Sagat+Juri\";\n\nlet myArray = myString.split(\"+\");\n\nlet arrayLength = myArray.length;\n\nlet lastItem = myArray[arrayLength - 1];\n```\n\n## Task 3\n\nYou should start by popping the last item off the array using `myArray.pop()`.\n\nNext, add two new names to the end of the array using `myArray.push()`\n\nFor an added challenge, you'll need to use `.forEach()` or some kind of loop (we didn't cover these in the array article, so look them up) to go over each item in the array and add its index number after the name inside parentheses. Note that when using `forEach` you are performing operations on a copy of the array elements, not the array elements themselves, so you can't change them directly — you have to create the new array item and copy it back over.\n\nFinally you need to stitch the array items together into a string using `myArray.join(' - ')`, and store the result in `myString`.\n\n```js\nlet myArray = [\n  \"Ryu\",\n  \"Ken\",\n  \"Chun-Li\",\n  \"Cammy\",\n  \"Guile\",\n  \"Sakura\",\n  \"Sagat\",\n  \"Juri\",\n];\n\nmyArray.pop();\n\nmyArray.push(\"Zangief\");\nmyArray.push(\"Ibuki\");\n\nmyArray.forEach(function (element, index) {\n  let newElement = `${element} (${index})`;\n  myArray[index] = newElement;\n});\n\nlet myString = myArray.join(\" - \");\n```\n\n## Task 4\n\nYou should start by finding the index of `\"Eagles\"`, using `birds.indexOf()`.\n\nNext, use the index with `birds.splice()` to remove the `\"Eagles\"` item.\n\nFinally, you can use `birds.filter()` to get an array containing only birds starting with \"E\".\n\nThe function passed to `filter()` can use `bird.startsWith()` to test whether the bird starts with \"E\".\n\n```js\nconst eaglesIndex = birds.indexOf(\"Eagles\");\nbirds.splice(eaglesIndex, 1);\n\nfunction startsWithE(bird) {\n  return bird.startsWith(\"E\");\n}\nconst eBirds = birds.filter(startsWithE);\n```\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/math/marking.md",
    "content": "# JavaScript math marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the JavaScript features covered in the [Basic math in JavaScript — numbers and operators](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Math) lesson in Learn Web Development on MDN.\n\nNote: If there is an error in your code, it will be outputted into the results panel on the page, to help you try to figure out the answer (or into the browser's JavaScript console, in the case of the downloadable version).\n\n## Task 1\n\nIn this task you need to create four variables that contain numbers. The first two need to be added together and stored, while the fourth needs to be subtracted from the third and the result stored. The two results of these operations need to be multiplied together to create another result, 48, which should be stored in the variable `finalResult`.\n\nFinally, you need to write a calculation that checks whether this number is even or odd, with the result stored in `evenOddCheck`. The operator you need here is modulo (`%`). If your value modulo 2 equals 0, you know it is even.\n\nThe answer should look something like this:\n\n```js\nconst number1 = 4;\nconst number2 = 8;\nconst number3 = 12;\nconst number4 = 8;\n\nconst additionResult = number1 + number2;\nconst subtractionResult = number3 - number4;\n\nfinalResult = additionResult * subtractionResult;\n\nevenOddResult = finalResult % 2;\n```\n\nThis task also tests your variable naming abilities. An extra mark if the variables have sensible names that follow best practices (lower camel case, descriptive, not too long).\n\n## Task 2\n\nIn our second task for this article we need to consider operator precedence and use parentheses to make the first two calculations give the result we were expecting.\n\nNext, we ideally need to use the multiplication assignment operator to multiply the two results together and then assign the product of this back to `result`.\n\nAfter that we need to use the `toFixed()` method available on numbers to round `result` to 2 decimal places, storing the product of this in a `finalResult` variable.\n\nFinally, using `typeof` we can test if a variable contains a string. We need to use `Number()` to convert `finalResult` to a number type. This final number needs to be stored in a variable called `finalNumber`.\n\nThe result should look something like this:\n\n```js\nlet result = (7 + 13) / (9 + 7);\nlet result2 = 100 / (2 * 6);\n\nresult *= result2;\n\nconst finalResult = result.toFixed(2);\n\nconst finalNumber = Number(finalResult);\n```\n\n## Task 3\n\nThis last task tests the student's ability to use comparison operators. Here we need to write some tests to show that mathematically prove or disprove the statements in the question.\n\nThe test results should be stored inside variables called `weightComparison`, `heightComparison`, and `pwdMatch`, respectively.\n\nYour code should look something like this:\n\n```js\nconst weightComparison = eleWeight < mouseWeight;\n\nconst heightComparison = ostrichHeight > duckHeight;\n\nconst pwdMatch = pwd1 === pwd2;\n```\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/math/math1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Math: Task 1</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    let finalResult;\n\n    let evenOddResult;\n\n    // Add your code here\n\n\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    const para1 = document.createElement('p');\n    const finalResultCheck = finalResult === 48 ? `Yes, well done!` : `No, it is ${ finalResult }`;\n    para1.textContent = `Is the finalResult 48? ${ finalResultCheck }`;\n    const para2 = document.createElement('p');\n    const evenOddResultCheck = evenOddResult === 0 ? 'The final result is even!' : 'The final result is odd. Hrm.';\n    para2.textContent = evenOddResultCheck;\n\n    section.appendChild(para1);\n    section.appendChild(para2);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/math/math1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Math: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\n\nlet finalResult;\n\nlet evenOddResult;\n\n// Add your code here\n\n\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\nconst para1 = document.createElement('p');\nconst finalResultCheck = finalResult === 48 ? `Yes, well done!` : `No, it is ${ finalResult }`;\npara1.textContent = `Is the finalResult 48? ${ finalResultCheck }`;\nconst para2 = document.createElement('p');\nconst evenOddResultCheck = evenOddResult === 0 ? 'The final result is even!' : 'The final result is odd. Hrm.';\npara2.textContent = evenOddResultCheck;\n\nsection.appendChild(para1);\nsection.appendChild(para2);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/math/math2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Math: Task 2</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    // Final result should be 4633.33\n    // Add/update your code here\n\n    let result = 7 + 13 / 9 + 7;\n    let result2 = 100 / 2 * 6;\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    const para1 = document.createElement('p');\n    para1.textContent = `Your finalResult is ${ finalResult }`;\n    const para2 = document.createElement('p');\n    const finalNumberCheck = isNaN(finalNumber) === false ? 'finalNumber is a number type. Well done!' : `Ooops! finalNumber is not a number.`;\n    para2.textContent = finalNumberCheck;\n\n    section.appendChild(para1);\n    section.appendChild(para2);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/math/math2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Math: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\n\n// Final result should be 4633.33\n// Add/update your code here\n\nlet result = 7 + 13 / 9 + 7;\nlet result2 = 100 / 2 * 6;\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\nconst para1 = document.createElement('p');\npara1.textContent = `Your finalResult is ${ finalResult }`;\nconst para2 = document.createElement('p');\nconst finalNumberCheck = typeof finalNumber === 'number' ? 'finalNumber is a number type. Well done!' : `Ooops! finalNumber is not a number.`;\npara2.textContent = finalNumberCheck;\n\nsection.appendChild(para1);\nsection.appendChild(para2);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/math/math3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Math: Task 3</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    // Statement 1: The elephant weighs less than the mouse\n    const eleWeight = 1000;\n    const mouseWeight = 2;\n\n    // Statement 2: The Ostrich is taller than the duck\n    const ostrichHeight = 2;\n    const duckHeight = 0.3;\n\n    // Statement 3: The two passwords match\n    const pwd1 = 'stromboli';\n    const pwd2 = 'stROmBoLi';\n\n    // Add your code here\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    const para1 = document.createElement('p');\n    const para2 = document.createElement('p');\n    const para3 = document.createElement('p');\n\n    const weightTest = weightComparison ? 'True — elephants do weigh less than mice!?' : 'False — of course an elephant is heavier than a mouse!';\n    const heightTest = heightComparison ? 'True — an ostrich is indeed taller than a duck!' : 'False — apparently a duck is taller than an ostrich!?';\n    const pwdTest = pwdMatch ? 'True — the passwords match.' : 'False — the passwords do not match; please check them';\n\n    para1.textContent = weightTest;\n    section.appendChild(para1);\n    para2.textContent = heightTest;\n    section.appendChild(para2);\n    para3.textContent = pwdTest;\n    section.appendChild(para3);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/math/math3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Math: Task 3</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 400px;\">\n\n// Statement 1: The elephant weighs less than the mouse\nconst eleWeight = 1000;\nconst mouseWeight = 2;\n\n// Statement 2: The Ostrich is taller than the duck\nconst ostrichHeight = 2;\nconst duckHeight = 0.3;\n\n// Statement 3: The two passwords match\nconst pwd1 = 'stromboli';\nconst pwd2 = 'stROmBoLi';\n\n// Add your code here\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\nconst para1 = document.createElement('p');\nconst para2 = document.createElement('p');\nconst para3 = document.createElement('p');\n\nconst weightTest = weightComparison ? 'True — elephants weigh less than mice!?' : 'False — of course an elephant is heavier than a mouse!';\nconst heightTest = heightComparison ? 'True — an ostrich is indeed taller than a duck!' : 'False — apparently a duck is taller than an ostrich!?';\nconst pwdTest = pwdMatch ? 'True — the passwords match.' : 'False — the passwords do not match; please check them';\n\npara1.textContent = weightTest;\nsection.appendChild(para1);\npara2.textContent = heightTest;\nsection.appendChild(para2);\npara3.textContent = pwdTest;\nsection.appendChild(para3);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/playable.js",
    "content": "var section = document.querySelector('section');\nvar editable = document.querySelector('.editable');\nvar textareaJS = document.querySelector('.playable-js');\nvar reset = document.getElementById('reset');\nvar jsCode = textareaJS.value;\n\nfunction fillCode() {\n    editable.textContent = textareaJS.value;\n    try {\n      eval(editable.textContent);\n    } catch(e) {\n      section.innerHTML = ' ';\n      let para = document.createElement('p');\n      para.textContent = e;\n      section.appendChild(para);\n    }\n}\n\nreset.addEventListener('click', function () {\n    textareaJS.value = jsCode;\n    fillCode();\n});\n\ntextareaJS.addEventListener('input', fillCode);\nwindow.addEventListener('load', fillCode);\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/strings/marking.md",
    "content": "# JavaScript strings marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the JavaScript features covered in the [Handling text — strings in JavaScript](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Strings) and [Useful string methods](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Useful_string_methods) lessons in Learn Web Development on MDN.\n\nNote: If there is an error in your code, it will be outputted into the results panel on the page, to help you try to figure out the answer (or into the browser's JavaScript console, in the case of the downloadable version).\n\n## Task 1\n\nThe first task asks you to store a new string in a variable to go along with the existing one, which contains the missing half of the famous quote. Call the new variable you add `quoteEnd`.\n\nYou'll also need to escape the apostrophe in the existing string so that it doesn't throw an error.\n\nFinally, you'll need to concatenate the two strings together, and store the result in a variable called `finalQuote`.\n\nThe answer should look something like this:\n\n```js\nconst quoteStart = \"Don't judge each day by the harvest you reap \";\nconst quoteEnd = \"but by the seeds that you plant.\";\n\nconst finalQuote = `${quoteStart}${quoteEnd}`;\n```\n\n## Task 2\n\nNext up, task 2 requires the student to:\n\n- Check the length of the provided string using `.length`, and store the result in a variable called `quoteLength`.\n- Find the index of the substring 'green eggs and ham' using `.indexOf` and store it in `index`.\n- Use a combination of the variables you have, `.length`, and `.slice()`, to trim down the original quote to 'I do not like green eggs and ham.', and store it in `revisedQuote`.\n\n```js\nconst quote = \"I do not like green eggs and ham. I do not like them, Sam-I-Am.\";\nconst substring = \"green eggs and ham\";\n\nconst quoteLength = quote.length;\n\nconst index = quote.indexOf(substring);\n\nconst revisedQuote = quote.slice(0, index + substring.length + 1);\n```\n\n## Task 3\n\nFor our next string task, we return to our Green Eggs and Ham revised quote, which someone has messed up. You need to:\n\n- Fix the casing. The best way to do this is to put it all in lower case using `.toLowerCase()`, and then put the first letter in uppercase using `replace()`, `slice()`, and `toUpperCase()`. Store the new quote in `fixedQuote`.\n- Replace `green eggs and ham` with whatever food you really don't like using `replace()`.\n- Add a full stop to the end of the sentence using some means.\n\nYour code should look something like this:\n\n```js\nconst quote = \"I dO nOT lIke gREen eGgS anD HAM\";\n\nlet fixedQuote = quote.toLowerCase();\nconst firstLetter = fixedQuote.slice(0, 1);\nfixedQuote = fixedQuote.replace(firstLetter, firstLetter.toUpperCase());\n\nfixedQuote = fixedQuote.replace(\"green eggs and ham\", \"pickled onions\");\n\nconst finalQuote = `${fixedQuote}.`;\n```\n\n## Task 4\n\nOur final string task looks at your ability to use template literals. Your answer is expected to take the existing string literal, `myString`, turn it into a template literal, and include four placeholders in place of the asterisks:\n\n- The `theorem` string.\n- The value of `a`.\n- The value of `b`.\n- The length of the hypotenuse, if `a` and `b` are the lengths of the two shortest sides of a right-angled triangle. You can use pythagoras' theorem to work this out.\n\nYour code should look something like this:\n\n```js\nconst theorem = \"Pythagorean theorem\";\n\nconst a = 5;\nconst b = 8;\n\nconst myString = `Using ${theorem}, we can work out that that if the two shortest sides of a right-angled triangle have lengths of ${a} and ${b}, the length of the hypotenuse is ${Math.sqrt(\n  a ** 2 + b ** 2\n)}.`;\n```\n\nYou could use a different form of the fourth placeholder, such as `Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2))` or `${ Math.sqrt((a * a) + (b * b)) }`.\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/strings/strings1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Strings: Task 1</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    // Add your code here\n\n    const quoteStart = 'Don't judge each day by the harvest you reap ';\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n    const para1 = document.createElement('p');\n    para1.textContent = finalQuote;\n\n    section.appendChild(para1);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/strings/strings1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Strings: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\n\n// Add your code here\n\nconst quoteStart = 'Don't judge each day by the harvest you reap ';\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\nconst para1 = document.createElement('p');\npara1.textContent = finalQuote;\n\nsection.appendChild(para1);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/strings/strings2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Strings: Task 2</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    const quote = 'I do not like green eggs and ham. I do not like them, Sam-I-Am.';\n    const substring = 'green eggs and ham';\n\n    // Add your code here\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    section.innerHTML = ' ';\n    const para1 = document.createElement('p');\n    para1.textContent = `The quote is ${ quoteLength } characters long.`;\n    const para2 = document.createElement('p');\n    para2.textContent = revisedQuote;\n\n    section.appendChild(para1);\n    section.appendChild(para2);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/strings/strings2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Strings: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\nconst quote = 'I do not like green eggs and ham. I do not like them, Sam-I-Am.';\nconst substring = 'green eggs and ham';\n\n// Add your code here\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\nconst para1 = document.createElement('p');\npara1.textContent = `The quote is ${ quoteLength } characters long.`;\nconst para2 = document.createElement('p');\npara2.textContent = revisedQuote;\n\nsection.appendChild(para1);\nsection.appendChild(para2);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/strings/strings3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Strings: Task 3</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    const quote = 'I dO nOT lIke gREen eGgS anD HAM';\n\n    // Add your code here\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    const para1 = document.createElement('p');\n    para1.textContent = fixedQuote;\n    const para2 = document.createElement('p');\n    para2.textContent = finalQuote;\n\n    section.appendChild(para1);\n    section.appendChild(para2);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/strings/strings3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Strings: Task 3</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\nconst quote = 'I dO nOT lIke gREen eGgS anD HAM';\n\n// Add your code here\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\nconst para1 = document.createElement('p');\npara1.textContent = fixedQuote;\nconst para2 = document.createElement('p');\npara2.textContent = finalQuote;\n\nsection.appendChild(para1);\nsection.appendChild(para2);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/strings/strings4-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Strings: Task 4</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    const theorem = 'Pythagorean theorem';\n\n    const a = 5;\n    const b = 8;\n\n    const myString = 'Using *, we can work out that that if the two shortest sides of a right-angled triangle have lengths of * and *, the length of the hypotenuse is *.';\n\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    const para1 = document.createElement('p');\n    para1.textContent = myString;\n    section.appendChild(para1);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/strings/strings4.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Strings: Task 4</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\nconst theorem = 'Pythagorean theorem';\n\nconst a = 5;\nconst b = 8;\n\nconst myString = 'Using *, we can work out that that if the two shortest sides of a right-angled triangle have lengths of * and *, the length of the hypotenuse is *.';\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\nconst para1 = document.createElement('p');\npara1.textContent = myString;\n\nsection.appendChild(para1);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/styles.css",
    "content": "/* Some default styling for cookbook examples */\n/*\nrgb(53,43,34)\nrgb(75,70,74)\nrgb(95,97,110)\nrgb(137,151,188)\nrgb(160,178,226)\n*/\nbody {\n    background-color: #fff;\n    color: #333;\n    font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n    padding: 0;\n    margin: 0;\n}\n\nh1 {\n  font-size: 2rem;\n  margin: 0;\n}\n\nh2 {\n  font-size: 1.6rem;\n  margin: 0;\n}\n\np {\n  margin: 0.5em 0;\n}\n\n/* styles for the editor */\n\n.playable {\n    font-family: monospace;\n    display: block;\n    margin-bottom: 10px;\n    background-color: #F4F7F8;\n    border: none;\n    border-left: 6px solid #558ABB;\n    color: #4D4E53;\n    width: 90%;\n    max-width: 700px;\n    padding: 10px 10px 0px;\n    font-size: 90%;\n  }\n\n  .playable-css {\n    height: 80px;\n  }\n\n  .playable-js {\n    height: 160px;\n  }\n\n  .playable-buttons {\n    text-align: right;\n    width: 90%;\n    max-width: 700px;\n    padding: 5px 10px 5px 26px;\n    font-size: 100%;\n  }\n\n  .preview {\n    width: 90%;\n    max-width: 700px;\n    border: 1px solid #4D4E53;\n    border-radius: 2px;\n    padding: 10px 14px 10px 10px;\n    margin-bottom: 10px;\n  }\n\n  .preview input {\n    display: block;\n    margin: 5px;\n  }\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/variables/marking.md",
    "content": "# JavaScript variables marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the JavaScript features covered in the [Storing the information you need — Variables](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Variables) lesson in Learn Web Development on MDN.\n\nNote: If there is an error in your code, it will be outputted into the results panel on the page, to help you try to figure out the answer (or into the browser's JavaScript console, in the case of the downloadable version).\n\n## Task 1\n\nThis task covers basic understanding of declaring a variable with a value, and initializing it — both separately and at the same time. Ideally your code should look something like this:\n\n```js\nlet myName;\nmyName = \"Chris\";\nlet myAge = 42;\n```\n\n`let` is ideal for both declarations. `const` is not really appropriate, as such values might change, and it won't work in the first instance. `var` is not OK.\n\nThe `myAge` value will work whether you've initialised it with a numeric (no quotes) or string (quotes) value, however it is a numeric value, so using quotes for it isn't correct.\n\n## Task 2\n\nIn task 2 the student needs to add a new line to correct the `myName` variable value so that it outputs their name on the screen.\n\nThe finished code should look something like this:\n\n```js\nlet myName = \"Paul\";\nmyName = \"Chris\";\n```\n\n## Task 3\n\nThe last task in this article focuses around fixing some variable-related errors. Basically:\n\n1. The `myName` variable is not being outputted correctly because it is being declared once using `const`, and then an attempt is being made to change the value.\n2. The result of the sum is not being outputted correctly because the `myAge` variable is being declared as a number. It needs to have the quotes removed.\n\nThe solution should look something like this:\n\n```js\nlet myName = \"Default\";\nmyName = \"Chris\";\n\nlet myAge = 42;\n```\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/variables/variables1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Variables: Task 1</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    // Add your code here\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    const para1 = document.createElement('p');\n    para1.textContent = myName;\n    const para2 = document.createElement('p');\n    para2.textContent = myAge;\n    section.appendChild(para1);\n    section.appendChild(para2);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/variables/variables1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Variables: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\n\n// Add your code here\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\nconst para1 = document.createElement('p');\npara1.textContent = myName;\nconst para2 = document.createElement('p');\npara2.textContent = myAge;\nsection.appendChild(para1);\nsection.appendChild(para2);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/variables/variables2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Variables: Task 2</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    // Add your code here\n\n    let myName = 'Paul';\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    const para = document.createElement('p');\n    para.textContent = myName;\n    section.appendChild(para);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/variables/variables2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Variables: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\n\n// Add your code here\n\nlet myName = 'Paul';\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\nconst para = document.createElement('p');\npara.textContent = myName;\nsection.appendChild(para);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/variables/variables3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Variables: Task 3</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    // Add your code here\n\n    const myName = 'Default';\n    myName = 'Chris';\n\n    let myAge = '42';\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    const para1 = document.createElement('p');\n    const para2 = document.createElement('p');\n    para1.textContent = myName;\n    para2.textContent = `In 20 years, I will be ${myAge + 20}`;\n    section.appendChild(para1);\n    section.appendChild(para2);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/tasks/variables/variables3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Variables: Task 3</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\n\n// Add your code here\n\nconst myName = 'Default';\nmyName = 'Chris';\n\nlet myAge = '42';\n\n// Don't edit the code below here!\n\nsection.innerHTML = ' ';\nconst para1 = document.createElement('p');\nconst para2 = document.createElement('p');\npara1.textContent = myName;\npara2.textContent = `In 20 years, I will be ${myAge + 20}`;\nsection.appendChild(para1);\nsection.appendChild(para2);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/troubleshooting/number-game-errors.html",
    "content": "<!doctype html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n\n    <title>Number guessing game</title>\n\n    <style>\n      html {\n        font-family: sans-serif;\n      }\n      body {\n        width: 50%;\n        max-width: 800px;\n        min-width: 480px;\n        margin: 0 auto;\n      }\n      .lastResult {\n        color: white;\n        padding: 3px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <h1>Number guessing game</h1>\n\n    <p>\n      We have selected a random number between 1 and 100. See if you can guess\n      it in 10 turns or less. We'll tell you if your guess was too high or too\n      low.\n    </p>\n\n    <div class=\"form\">\n      <label for=\"guessField\">Enter a guess: </label>\n      <input type=\"text\" id=\"guessField\" class=\"guessField\" />\n      <input type=\"submit\" value=\"Submit guess\" class=\"guessSubmit\" />\n    </div>\n\n    <div class=\"resultParas\">\n      <p class=\"guesses\"></p>\n      <p class=\"lastResult\"></p>\n      <p class=\"lowOrHi\"></p>\n    </div>\n\n    <script>\n      let randomNumber = Math.floor(Math.random()) + 1;\n\n      const guesses = document.querySelector(\".guesses\");\n      const lastResult = document.querySelector(\".lastResult\");\n      const lowOrHi = document.querySelector(\"lowOrHi\");\n      const guessSubmit = document.querySelector(\".guessSubmit\");\n      const guessField = document.querySelector(\".guessField\");\n\n      let guessCount = 1;\n      let resetButton;\n\n      function checkGuess() {\n        const userGuess = Number(guessField.value);\n        if (guessCount === 1) {\n          guesses.textContent = \"Previous guesses: \";\n        }\n        guesses.textContent += userGuess + \" \";\n\n        if (userGuess === randomNumber) {\n          lastResult.textContent = \"Congratulations! You got it right!\";\n          lastResult.style.backgroundColor = \"green\";\n          lowOrHi.textContent = \"\";\n          setGameOver();\n        } else if (guessCount === 10) {\n          lastResult.textContent = \"!!!GAME OVER!!!\";\n          setGameOver();\n        } else {\n          lastResult.textContent = \"Wrong!\";\n          lastResult.style.backgroundColor = \"red\";\n          if (userGuess < randomNumber) {\n            lowOrHi.textContent = \"Last guess was too low!\";\n          } else if (userGuess > randomNumber) {\n            lowOrHi.textContent = \"Last guess was too high!\";\n          }\n        }\n\n        guessCount++;\n        guessField.value = \"\";\n        guessField.focus();\n      }\n      guessSubmit.addeventListener(\"click\", checkGuess);\n\n      function setGameOver() {\n        guessField.disabled = true;\n        guessSubmit.disabled = true;\n        resetButton = document.createElement(\"button\");\n        resetButton.textContent = \"Start new game\";\n        document.body.appendChild(resetButton);\n        resetButton.addeventListener(\"click\", resetGame);\n      }\n\n      function resetGame() {\n        guessCount = 1;\n\n        const resetParas = document.querySelectorAll(\".resultParas p\");\n        for (const resetPara of resetParas) {\n          resetPara.textContent = \"\";\n        }\n        resetButton.parentNode.removeChild(resetButton);\n\n        guessField.disabled = false;\n        guessSubmit.disabled = false;\n        guessField.value = \"\";\n        guessField.focus();\n\n        lastResult.style.backgroundColor = \"white\";\n\n        randomNumber = Math.floor(Math.random()) + 1;\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/what-is-js/apply-javascript-external.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>External JavaScript example</title>\n    <script type=\"module\" src=\"script.js\"></script>\n  </head>\n  <body>\n    <button>Click me</button>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/what-is-js/apply-javascript-internal.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Internal JavaScript example</title>\n  </head>\n  <body>\n    <button>Click me</button>\n\n    <script>\n      function createParagraph() {\n        const para = document.createElement('p');\n        para.textContent = 'You clicked the button!';\n        document.body.appendChild(para);\n      }\n\n      const buttons = document.querySelectorAll('button');\n\n      for (const button of buttons) {\n        button.addEventListener('click', createParagraph);\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/what-is-js/apply-javascript.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Apply JavaScript example</title>\n  </head>\n  <body>\n    <button>Click me</button>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/what-is-js/javascript-label.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title>JavaScript label example</title>\n    <style>\n      button {\n        font-family: \"helvetica neue\", helvetica, sans-serif;\n        letter-spacing: 1px;\n        text-transform: uppercase;\n        text-align: center;\n        border: 2px solid rgb(200 200 0 / 0.6);\n        background: rgba(0, 217, 217, 0.6);\n        color: rgb(100 0 0 / 1);\n        box-shadow: 1px 1px 2px rgb(0 0 200 / 0.4);\n        border-radius: 10px;\n        padding: 3px 10px;\n        cursor: pointer;\n      }\n    </style>\n  </head>\n  <body>\n    <button type=\"button\">Player 1: Chris</button>\n\n    <script>\n      const button = document.querySelector(\"button\");\n\n      button.addEventListener(\"click\", updateName);\n\n      function updateName() {\n        const name = prompt(\"Enter a new name\");\n        button.textContent = `Player 1: ${name}`;\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/introduction-to-js-1/what-is-js/script.js",
    "content": "function createParagraph() {\n  const para = document.createElement('p');\n  para.textContent = 'You clicked the button!';\n  document.body.appendChild(para);\n}\n\nconst buttons = document.querySelectorAll('button');\n\nfor (const button of buttons) {\n  button.addEventListener('click', createParagraph);\n}\n"
  },
  {
    "path": "javascript/oojs/advanced/es2015-class-inheritance.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Object-oriented JavaScript inheritance</title>\n  </head>\n\n  <body>\n\n  </body>\n\n    <script>\n\n    // Basic Person class\n\n    class Person {\n      constructor(first, last, age, gender, interests) {\n        this.name = {\n          first,\n          last\n        };\n        this.age = age;\n        this.gender = gender;\n        this.interests = interests;\n      }\n\n      greeting() {\n        console.log(`Hi! I'm ${this.name.first}`);\n      };\n\n      farewell() {\n        console.log(`${this.name.first} has left the building. Bye for now!`);\n      };\n    }\n\n    // Instantiate Person\n\n    let han = new Person('Han', 'Solo', 25, 'male', ['Smuggling']);\n    han.greeting();\n    // Hi! I'm Han\n\n    let leia = new Person('Leia', 'Organa', 19, 'female' ['Government']);\n    leia.farewell();\n    // Leia has left the building. Bye for now\n\n    // Extend Person with Teacher\n\n    class Teacher extends Person {\n      constructor(first, last, age, gender, interests, subject, grade) {\n        super(first, last, age, gender, interests);\n\n        // subject and grade are specific to Teacher\n        this.subject = subject;\n        this.grade = grade;\n      }\n    }\n\n    // Instantiate Teacher\n\n    let snape = new Teacher('Severus', 'Snape', 58, 'male', ['Potions'], 'Dark arts', 5);\n    snape.greeting(); // Hi! I'm Severus.\n    snape.farewell(); // Severus has left the building. Bye for now.\n    console.log(snape.age) // 58\n    console.log(snape.subject) // Dark arts\n\n    </script>\n</html>\n"
  },
  {
    "path": "javascript/oojs/advanced/es2015-getters-setters.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Object-oriented JavaScript inheritance</title>\n  </head>\n\n  <body>\n\n  </body>\n\n    <script>\n\n    // Basic Person class\n\n    class Person {\n      constructor(first, last, age, gender, interests) {\n        this.name = {\n          first,\n          last\n        };\n        this.age = age;\n        this.gender = gender;\n        this.interests = interests;\n      }\n\n      greeting() {\n        console.log(`Hi! I'm ${this.name.first}`);\n      };\n\n      farewell() {\n        console.log(`${this.name.first} has left the building. Bye for now!`);\n      };\n    }\n\n    // Extend Person with Teacher\n\n    class Teacher extends Person {\n      constructor(first, last, age, gender, interests, subject, grade) {\n        super(first, last, age, gender, interests);\n        // subject and grade are specific to Teacher\n        this._subject = subject;\n        this.grade = grade;\n      }\n\n      get subject() {\n        return this._subject;\n      }\n\n      set subject(newSubject) {\n        this._subject = newSubject;\n      }\n    }\n\n    // Instantiate Teacher\n\n    let snape = new Teacher('Severus', 'Snape', 58, 'male', ['Potions'], 'Dark arts', 5);\n    // Check the default value\n    console.log(snape.subject) // Returns \"Dark arts\"\n\n    // Change the value\n    snape.subject = \"Balloon animals\" // Sets subject to \"Balloon animals\"\n\n    // Check it again and see if it matches the new value\n    console.log(snape.subject) // Returns \"Balloon animals\"\n\n    </script>\n</html>\n"
  },
  {
    "path": "javascript/oojs/advanced/oojs-class-inheritance-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Object-oriented JavaScript inheritance</title>\n  </head>\n\n  <body>\n    <div>\n      <label for=\"jscode\">Enter code:</label>\n      <input type=\"text\" id=\"jscode\">\n      <button>Submit code</button>\n    </div>\n\n    <p></p>\n  </body>\n\n    <script>\n      const input = document.querySelector('input');\n      const btn = document.querySelector('button');\n      const para = document.querySelector('p');\n\n      btn.onclick = function() {\n        const code = input.value;\n        para.textContent = eval(code);\n      }\n\n      function Person(first, last, age, gender, interests) {\n        this.name = {\n          first,\n          last\n        };\n        this.age = age;\n        this.gender = gender;\n        this.interests = interests;\n      };\n\n      Person.prototype.bio = function() {\n        // First define a string, and make it equal to the part of\n        // the bio that we know will always be the same.\n        let string = this.name.first + ' ' + this.name.last + ' is ' + this.age + ' years old. ';\n        // define a variable that will contain the pronoun part of\n        // the second sentence\n        let pronoun;\n\n        // check what the value of gender is, and set pronoun\n        // to an appropriate value in each case\n        if(this.gender === 'male' || this.gender === 'Male' || this.gender === 'm' || this.gender === 'M') {\n          pronoun = 'He likes ';\n        } else if(this.gender === 'female' || this.gender === 'Female' || this.gender === 'f' || this.gender === 'F') {\n          pronoun = 'She likes ';\n        } else {\n          pronoun = 'They like ';\n        }\n\n        // add the pronoun string on to the end of the main string\n        string += pronoun;\n\n        // use another conditional to structure the last part of the\n        // second sentence depending on whether the number of interests\n        // is 1, 2, or 3\n        if(this.interests.length === 1) {\n          string += this.interests[0] + '.';\n        } else if(this.interests.length === 2) {\n          string += this.interests[0] + ' and ' + this.interests[1] + '.';\n        } else {\n          // if there are more than 2 interests, we loop through them\n          // all, adding each one to the main string followed by a comma,\n          // except for the last one, which needs an and & a full stop\n          for(let i = 0; i < this.interests.length; i++) {\n            if(i === this.interests.length - 1) {\n              string += 'and ' + this.interests[i] + '.';\n            } else {\n              string += this.interests[i] + ', ';\n            }\n          }\n        }\n\n        // finally, with the string built, we alert() it\n        alert(string);\n      };\n\n      Person.prototype.greeting = function() {\n        alert('Hi! I\\'m ' + this.name.first + '.');\n      };\n\n      Person.prototype.farewell = function() {\n        alert(this.name.first + ' has left the building. Bye for now!');\n      }\n\n      let person1 = new Person('Tammi', 'Smith', 17, 'female', ['music', 'skiing', 'kickboxing']);\n\n      function Teacher(first, last, age, gender, interests, subject) {\n        Person.call(this, first, last, age, gender, interests);\n\n        this.subject = subject;\n      }\n\n      Teacher.prototype = Object.create(Person.prototype);\n      Object.defineProperty(Teacher.prototype, 'constructor', { \n         value: Teacher, \n         enumerable: false, // so that it does not appear in 'for in' loop\n         writable: true \n      });\n\n      Teacher.prototype.greeting = function() {\n        let prefix;\n\n        if(this.gender === 'male' || this.gender === 'Male' || this.gender === 'm' || this.gender === 'M') {\n          prefix = 'Mr.';\n        } else if(this.gender === 'female' || this.gender === 'Female' || this.gender === 'f' || this.gender === 'F') {\n          prefix = 'Mrs.';\n        } else {\n          prefix = 'Mx.';\n        }\n\n        alert('Hello. My name is ' + prefix + ' ' + this.name.last + ', and I teach ' + this.subject + '.');\n      };\n\n      let teacher1 = new Teacher('Dave', 'Griffiths', 31, 'male', ['football', 'cookery'], 'mathematics');\n    </script>\n</html>\n"
  },
  {
    "path": "javascript/oojs/advanced/oojs-class-inheritance-start.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Object-oriented JavaScript inheritance</title>\n  </head>\n\n  <body>\n    <div>\n      <label for=\"jscode\">Enter code:</label>\n      <input type=\"text\" id=\"jscode\">\n      <button>Submit code</button>\n    </div>\n\n    <p></p>\n  </body>\n\n    <script>\n      const input = document.querySelector('input');\n      const btn = document.querySelector('button');\n      const para = document.querySelector('p');\n\n      btn.onclick = function() {\n        const code = input.value;\n        para.textContent = eval(code);\n      }\n\n      function Person(first, last, age, gender, interests) {\n        this.name = {\n          first,\n          last\n        };\n        this.age = age;\n        this.gender = gender;\n        this.interests = interests;\n      };\n\n      Person.prototype.bio = function() {\n        // First define a string, and make it equal to the part of\n        // the bio that we know will always be the same.\n        let string = this.name.first + ' ' + this.name.last + ' is ' + this.age + ' years old. ';\n        // define a variable that will contain the pronoun part of\n        // the second sentence\n        let pronoun;\n\n        // check what the value of gender is, and set pronoun\n        // to an appropriate value in each case\n        if(this.gender === 'male' || this.gender === 'Male' || this.gender === 'm' || this.gender === 'M') {\n          pronoun = 'He likes ';\n        } else if(this.gender === 'female' || this.gender === 'Female' || this.gender === 'f' || this.gender === 'F') {\n          pronoun = 'She likes ';\n        } else {\n          pronoun = 'They like ';\n        }\n\n        // add the pronoun string on to the end of the main string\n        string += pronoun;\n\n        // use another conditional to structure the last part of the\n        // second sentence depending on whether the number of interests\n        // is 1, 2, or 3\n        if(this.interests.length === 1) {\n          string += this.interests[0] + '.';\n        } else if(this.interests.length === 2) {\n          string += this.interests[0] + ' and ' + this.interests[1] + '.';\n        } else {\n          // if there are more than 2 interests, we loop through them\n          // all, adding each one to the main string followed by a comma,\n          // except for the last one, which needs an and & a full stop\n          for(let i = 0; i < this.interests.length; i++) {\n            if(i === this.interests.length - 1) {\n              string += 'and ' + this.interests[i] + '.';\n            } else {\n              string += this.interests[i] + ', ';\n            }\n          }\n        }\n\n        // finally, with the string built, we alert() it\n        alert(string);\n      };\n\n      Person.prototype.greeting = function() {\n        alert('Hi! I\\'m ' + this.name.first + '.');\n      };\n\n      Person.prototype.farewell = function() {\n        alert(this.name.first + ' has left the building. Bye for now!');\n      }\n\n      let person1 = new Person('Tammi', 'Smith', 17, 'female', ['music', 'skiing', 'kickboxing']);\n\n    </script>\n</html>\n"
  },
  {
    "path": "javascript/oojs/advanced/oojs-class-inheritance-student.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Object-oriented JavaScript inheritance</title>\n  </head>\n\n  <body>\n    <div>\n      <label for=\"jscode\">Enter code:</label>\n      <input type=\"text\" id=\"jscode\">\n      <button>Submit code</button>\n    </div>\n\n    <p></p>\n  </body>\n\n    <script>\n      const input = document.querySelector('input');\n      const btn = document.querySelector('button');\n      const para = document.querySelector('p');\n\n      btn.onclick = function() {\n        const code = input.value;\n        para.textContent = eval(code);\n      }\n\n      function Person(first, last, age, gender, interests) {\n        this.name = {\n          first,\n          last\n        };\n        this.age = age;\n        this.gender = gender;\n        this.interests = interests;\n      };\n\n      Person.prototype.bio = function() {\n        // First define a string, and make it equal to the part of\n        // the bio that we know will always be the same.\n        let string = this.name.first + ' ' + this.name.last + ' is ' + this.age + ' years old. ';\n        // define a variable that will contain the pronoun part of\n        // the second sentence\n        let pronoun;\n\n        // check what the value of gender is, and set pronoun\n        // to an appropriate value in each case\n        if(this.gender === 'male' || this.gender === 'Male' || this.gender === 'm' || this.gender === 'M') {\n          pronoun = 'He likes ';\n        } else if(this.gender === 'female' || this.gender === 'Female' || this.gender === 'f' || this.gender === 'F') {\n          pronoun = 'She likes ';\n        } else {\n          pronoun = 'They like ';\n        }\n\n        // add the pronoun string on to the end of the main string\n        string += pronoun;\n\n        // use another conditional to structure the last part of the\n        // second sentence depending on whether the number of interests\n        // is 1, 2, or 3\n        if(this.interests.length === 1) {\n          string += this.interests[0] + '.';\n        } else if(this.interests.length === 2) {\n          string += this.interests[0] + ' and ' + this.interests[1] + '.';\n        } else {\n          // if there are more than 2 interests, we loop through them\n          // all, adding each one to the main string followed by a comma,\n          // except for the last one, which needs an and & a full stop\n          for(let i = 0; i < this.interests.length; i++) {\n            if(i === this.interests.length - 1) {\n              string += 'and ' + this.interests[i] + '.';\n            } else {\n              string += this.interests[i] + ', ';\n            }\n          }\n        }\n\n        // finally, with the string built, we alert() it\n        alert(string);\n      };\n\n      Person.prototype.greeting = function() {\n        alert('Hi! I\\'m ' + this.name.first + '.');\n      };\n\n      Person.prototype.farewell = function() {\n        alert(this.name.first + ' has left the building. Bye for now!');\n      }\n\n      let person1 = new Person('Tammi', 'Smith', 17, 'female', ['music', 'skiing', 'kickboxing']);\n\n      function Teacher(first, last, age, gender, interests, subject) {\n        Person.call(this, first, last, age, gender, interests);\n\n        this.subject = subject;\n      }\n\n      Teacher.prototype = Object.create(Person.prototype);\n      Teacher.prototype.constructor = Teacher;\n\n      Teacher.prototype.greeting = function() {\n        let prefix;\n\n        if(this.gender === 'male' || this.gender === 'Male' || this.gender === 'm' || this.gender === 'M') {\n          prefix = 'Mr.';\n        } else if(this.gender === 'female' || this.gender === 'Female' || this.gender === 'f' || this.gender === 'F') {\n          prefix = 'Mrs.';\n        } else {\n          prefix = 'Mx.';\n        }\n\n        alert('Hello. My name is ' + prefix + ' ' + this.name.last + ', and I teach ' + this.subject + '.');\n      };\n\n      let teacher1 = new Teacher('Dave', 'Griffiths', 31, 'male', ['football', 'cookery'], 'mathematics');\n\n\n      // Student class!\n\n      function Student(first, last, age, gender, interests) {\n        Person.call(this, first, last, age, gender, interests);\n      }\n\n      Student.prototype = Object.create(Person.prototype);\n      Student.prototype.constructor = Student;\n\n      Student.prototype.greeting = function() {\n\n        alert('Yo! I\\'m ' + this.name.first + '.');\n      };\n\n      let student1 = new Student('Liz', 'Sheppard', 17, 'female', ['ninjitsu', 'air cadets']);\n    </script>\n</html>\n"
  },
  {
    "path": "javascript/oojs/advanced/oojs-class-prototype.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Object-oriented JavaScript prototype addition</title>\n  </head>\n\n  <body>\n    <div>\n      <label for=\"jscode\">Enter code:</label>\n      <input type=\"text\" id=\"jscode\">\n      <button>Submit code</button>\n    </div>\n\n    <p></p>\n  </body>\n\n    <script>\n      const input = document.querySelector('input');\n      const btn = document.querySelector('button');\n      const para = document.querySelector('p');\n\n      btn.onclick = function() {\n        const code = input.value;\n        para.textContent = eval(code);\n      }\n\n      function Person(first, last, age, gender, interests) {\n        this.name = {\n          first,\n          last\n        };\n        this.age = age;\n        this.gender = gender;\n        this.interests = interests;\n        this.bio = function() {\n          // First define a string, and make it equal to the part of\n          // the bio that we know will always be the same.\n          let string = this.name.first + ' ' + this.name.last + ' is ' + this.age + ' years old. ';\n          // define a variable that will contain the pronoun part of\n          // the second sentence\n          let pronoun;\n\n          // check what the value of gender is, and set pronoun\n          // to an appropriate value in each case\n          if(this.gender === 'male' || this.gender === 'Male' || this.gender === 'm' || this.gender === 'M') {\n            pronoun = 'He likes ';\n          } else if(this.gender === 'female' || this.gender === 'Female' || this.gender === 'f' || this.gender === 'F') {\n            pronoun = 'She likes ';\n          } else {\n            pronoun = 'They like ';\n          }\n\n          // add the pronoun string on to the end of the main string\n          string += pronoun;\n\n          // use another conditional to structure the last part of the\n          // second sentence depending on whether the number of interests\n          // is 1, 2, or 3\n          if(this.interests.length === 1) {\n            string += this.interests[0] + '.';\n          } else if(this.interests.length === 2) {\n            string += this.interests[0] + ' and ' + this.interests[1] + '.';\n          } else {\n            // if there are more than 2 interests, we loop through them\n            // all, adding each one to the main string followed by a comma,\n            // except for the last one, which needs an and & a full stop\n            for(let i = 0; i < this.interests.length; i++) {\n              if(i === this.interests.length - 1) {\n                string += 'and ' + this.interests[i] + '.';\n              } else {\n                string += this.interests[i] + ', ';\n              }\n            }\n          }\n\n          // finally, with the string built, we alert() it\n          alert(string);\n        };\n        this.greeting = function() {\n          alert('Hi! I\\'m ' + this.name.first + '.');\n        };\n      };\n\n      let person1 = new Person('Tammi', 'Smith', 32, 'neutral', ['music', 'skiing', 'kickboxing']);\n\n      Person.prototype.farewell = function() {\n        console.log(this.name.first + ' has left the building. Bye for now!');\n      }\n    </script>\n</html>\n"
  },
  {
    "path": "javascript/oojs/assessment/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Bouncing balls</title>\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n\n  <body>\n    <h1>bouncing balls</h1>\n    <p>Ball count: </p>\n    <canvas></canvas>\n\n    <script src=\"main.js\"></script>\n  </body>\n</html>"
  },
  {
    "path": "javascript/oojs/assessment/main.js",
    "content": "// Thanks to Renan Martineli for this version of the demo\n\n// setup canvas\n\nconst para = document.querySelector('p');\nlet count = 0;\n\nconst canvas = document.querySelector('canvas');\nconst ctx = canvas.getContext('2d');\n\nconst width = canvas.width = window.innerWidth;\nconst height = canvas.height = window.innerHeight;\n\n// function to generate random number\n\nfunction random(min,max) {\n  const num = Math.floor(Math.random()*(max-min)) + min;\n  return num;\n};\n\n// function to generate random RGB color value\n\nfunction randomRGB() {\n  return `rgb(${random(0, 255)},${random(0, 255)},${random(0, 255)})`;\n}\n\nclass Shape {\n\n  constructor(x, y, velX, velY) {\n    this.x = x;\n    this.y = y;\n    this.velX = velX;\n    this.velY = velY;\n  }\n\n}\n\nclass Ball extends Shape {\n\n  constructor(x, y, velX, velY, color, size) {\n    super(x, y, velX, velY);\n\n    this.color = color;\n    this.size = size;\n    this.exists = true;\n  }\n\n  draw() {\n    ctx.beginPath();\n    ctx.fillStyle = this.color;\n    ctx.arc(this.x, this.y, this.size, 0, 2 * Math.PI);\n    ctx.fill();\n  }\n\n  update() {\n    if ((this.x + this.size) >= width) {\n      this.velX = -(this.velX);\n    }\n\n    if ((this.x - this.size) <= 0) {\n      this.velX = -(this.velX);\n    }\n\n    if ((this.y + this.size) >= height) {\n      this.velY = -(this.velY);\n    }\n\n    if ((this.y - this.size) <= 0) {\n      this.velY = -(this.velY);\n    }\n\n    this.x += this.velX;\n    this.y += this.velY;\n  }\n\n\n  collisionDetect() {\n     for (const ball of balls) {\n        if (!(this === ball) && ball.exists) {\n           const dx = this.x - ball.x;\n           const dy = this.y - ball.y;\n           const distance = Math.sqrt(dx * dx + dy * dy);\n\n           if (distance < this.size + ball.size) {\n             ball.color = this.color = randomRGB();\n           }\n        }\n     }\n  }\n\n}\n\nclass EvilCircle extends Shape {\n\n  constructor(x, y) {\n    super(x, y, 20, 20);\n\n    this.color = \"white\";\n    this.size = 10;\n\n    window.addEventListener('keydown', (e) => {\n      switch(e.key) {\n        case 'a':\n          this.x -= this.velX;\n          break;\n        case 'd':\n          this.x += this.velX;\n          break;\n        case 'w':\n          this.y -= this.velY;\n          break;\n        case 's':\n          this.y += this.velY;\n          break;\n      }\n    });\n  }\n\n  draw() {\n    ctx.beginPath();\n    ctx.strokeStyle = this.color;\n    ctx.lineWidth = 3;\n    ctx.arc(this.x, this.y, this.size, 0, 2 * Math.PI);\n    ctx.stroke();\n  }\n\n  checkBounds() {\n    if ((this.x + this.size) >= width) {\n      this.x -= this.size;\n    }\n\n    if ((this.x - this.size) <= 0) {\n      this.x += this.size;\n    }\n\n    if ((this.y + this.size) >= height) {\n      this.y -= this.size;\n    }\n\n    if ((this.y - this.size) <= 0) {\n      this.y += this.size;\n    }\n  }\n\n  collisionDetect() {\n    for (const ball of balls) {\n      if (ball.exists) {\n        const dx = this.x - ball.x;\n        const dy = this.y - ball.y;\n        const distance = Math.sqrt(dx * dx + dy * dy);\n\n        if (distance < this.size + ball.size) {\n          ball.exists = false;\n          count--;\n          para.textContent = 'Ball count: ' + count;\n        }\n      }\n    }\n  }\n\n}\n\n// define array to store balls and populate it\n\nconst balls = [];\n\nwhile (balls.length < 25) {\n  const size = random(10, 20);\n  const ball = new Ball(\n    // ball position always drawn at least one ball width\n    // away from the edge of the canvas, to avoid drawing errors\n    random(0 + size, width - size),\n    random(0 + size, height - size),\n    random(-7, 7),\n    random(-7, 7),\n    randomRGB(),\n    size\n  );\n  balls.push(ball);\n  count++;\n  para.textContent = 'Ball count: ' + count;\n}\n\nconst evilBall = new EvilCircle(random(0, width), random(0, height));\n\nfunction loop() {\n  ctx.fillStyle = 'rgba(0, 0, 0, 0.25)';\n  ctx.fillRect(0, 0, width, height);\n\n  for (const ball of balls) {\n    if (ball.exists) {\n      ball.draw();\n      ball.update();\n      ball.collisionDetect();\n    }\n  }\n\n  evilBall.draw();\n  evilBall.checkBounds();\n  evilBall.collisionDetect();\n\n  requestAnimationFrame(loop);\n}\n\nloop();\n"
  },
  {
    "path": "javascript/oojs/assessment/marking-guide.md",
    "content": "# Marking guide for \"Adding features to our bouncing balls demo\"\n\nThe following guide outlines a marking guide for the \"Introducing JavaScript Objects\" module assessment, part of the MDN Learning Area JavaScript Topic — see [Adding features to our bouncing balls demo](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Adding_bouncing_balls_features). Each subtask detailed in the assessment is listed below, along with an explanation of how many marks the task is worth, and the mark breakdown.\n\nNote: These are guidelines, not set in stone rules — you are of course free to use your judgement on mark awarding when you meet an edge case, or something that isn't clear cut.\n\nThe overall mark awarded is out of 44. Work out their final mark, and then divide by 44 and multiply by 100 to give a percentage mark. For reference, you can find a [finished program](main.js) that would be awarded top marks.\n\n## Shape class\n\n* **The `Shape` class definition**: One mark for this.\n* **The `Shape` constructor**: Three marks for this. You need to copy the original `Ball()` constructor and remove the `color` and `size` definitions.\n\n## Ball class\n\n* **The `Ball` class definition**: Two marks for deriving from `Shape` using `extends`.\n\n* **The `Ball` constructor**: Six marks for this in total:\n  * Two marks for using `super(x, y, velX, velY);` to initialize the `Shape` properties.\n  * Two marks for initializing `color` and `size` properties, which should be the same as the ones in the original `Ball` constructor.\n  * Two marks for initializing `exists` to `true` in the constructor.\n\n\n## EvilCircle class\n\n* **The `EvilCircle` class definition**: Two marks for deriving from `Shape` using `extends`.\n\n* **The `EvilCircle` constructor**: Six marks for this in total:\n  * Two marks for using `super(x, y, velX, velY);` to initialize the `Shape` properties.\n  * Two marks for initializing `color` and `size` properties.\n  * Two marks for including the `keydown` event listener code.\n\n* **`draw()`**: Three marks for this.\n\n* **`checkBounds()`**: Five marks for this.\n\n* **`collisionDetect()`** Two marks for this.\n\n## Bringing the evil circle into the program\n\n* **Creating an <code>EvilCircle</code> instance**: Two marks for this. You need to create a new instance of the `EvilCircle`. This must be done in a way that it only runs once, not with every loop iteration. The easiest way to do this is to just include the lines outside the loop function definition, before `loop()` is called.\n\n* **Update the `loop()` code so that the ball functions are only called inside the loop if the current ball exists**: Two marks for this.\n\n* **Call the evil ball instance's `draw()`, `checkBounds()`, and `collisionDetect()` methods**: Two marks for this.\n\n## Implementing the score counter\n\n* **Adding a `<p>` element**: One mark.\n* **Adding the provided CSS rule to the bottom of the CSS file**: One mark — the CSS rule needs to be copied exactly as shown in to the bottom of the CSS file.\n* **JavaScript updates**: Four marks in total. You need to complete the following tasks:\n  * Create a variable that stores a reference to the paragraph — something like this is fine.\n  * Keep a count of the number of balls on screen in some way.\n  * Increment the count and display the updated number of balls present each time a ball is added to the scene.\n  * Decrement the count and display the updated number of balls present each time the evil circle eats a ball (causes it not to exist).\n"
  },
  {
    "path": "javascript/oojs/assessment/style.css",
    "content": "html, body {\n  margin: 0;\n}\n\nhtml {\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  height: 100%;\n}\n\nbody {\n  overflow: hidden;\n  height: inherit;\n}\n\nh1 {\n  font-size: 2rem;\n  letter-spacing: -1px;\n  position: absolute;\n  margin: 0;\n  top: -4px;\n  right: 5px;\n\n  color: transparent;\n  text-shadow: 0 0 4px white;\n}\n\np {\n  position: absolute;\n  margin: 0;\n  top: 35px;\n  right: 5px;\n  color: #aaa;\n}"
  },
  {
    "path": "javascript/oojs/bouncing-balls/index-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Bouncing balls</title>\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n\n  <body>\n    <h1>bouncing balls</h1>\n    <canvas></canvas>\n\n    <script src=\"main-finished.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/oojs/bouncing-balls/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Bouncing balls</title>\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n\n  <body>\n    <h1>bouncing balls</h1>\n    <canvas></canvas>\n\n    <script src=\"main.js\"></script>\n  </body>\n</html>"
  },
  {
    "path": "javascript/oojs/bouncing-balls/main-finished.js",
    "content": "// set up canvas\n\nconst canvas = document.querySelector(\"canvas\");\nconst ctx = canvas.getContext(\"2d\");\n\nconst width = (canvas.width = window.innerWidth);\nconst height = (canvas.height = window.innerHeight);\n\n// function to generate random number\n\nfunction random(min, max) {\n  return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\n// function to generate random RGB color value\n\nfunction randomRGB() {\n  return `rgb(${random(0, 255)},${random(0, 255)},${random(0, 255)})`;\n}\n\nclass Ball {\n  constructor(x, y, velX, velY, color, size) {\n    this.x = x;\n    this.y = y;\n    this.velX = velX;\n    this.velY = velY;\n    this.color = color;\n    this.size = size;\n  }\n\n  draw() {\n    ctx.beginPath();\n    ctx.fillStyle = this.color;\n    ctx.arc(this.x, this.y, this.size, 0, 2 * Math.PI);\n    ctx.fill();\n  }\n\n  update() {\n    if (this.x + this.size >= width) {\n      this.velX = -Math.abs(this.velX);\n    }\n\n    if (this.x - this.size <= 0) {\n      this.velX = Math.abs(this.velX);\n    }\n\n    if (this.y + this.size >= height) {\n      this.velY = -Math.abs(this.velY);\n    }\n\n    if (this.y - this.size <= 0) {\n      this.velY = Math.abs(this.velY);\n    }\n\n    this.x += this.velX;\n    this.y += this.velY;\n  }\n\n  collisionDetect() {\n    for (const ball of balls) {\n      if (!(this === ball)) {\n        const dx = this.x - ball.x;\n        const dy = this.y - ball.y;\n        const distance = Math.sqrt(dx * dx + dy * dy);\n\n        if (distance < this.size + ball.size) {\n          ball.color = this.color = randomRGB();\n        }\n      }\n    }\n  }\n}\n\nconst balls = [];\n\nwhile (balls.length < 25) {\n  const size = random(10, 20);\n  const ball = new Ball(\n    // ball position always drawn at least one ball width\n    // away from the edge of the canvas, to avoid drawing errors\n    random(0 + size, width - size),\n    random(0 + size, height - size),\n    random(-7, 7),\n    random(-7, 7),\n    randomRGB(),\n    size\n  );\n\n  balls.push(ball);\n}\n\nfunction loop() {\n  ctx.fillStyle = \"rgba(0, 0, 0, 0.25)\";\n  ctx.fillRect(0, 0, width, height);\n\n  for (const ball of balls) {\n    ball.draw();\n    ball.update();\n    ball.collisionDetect();\n  }\n\n  requestAnimationFrame(loop);\n}\n\nloop();\n"
  },
  {
    "path": "javascript/oojs/bouncing-balls/main.js",
    "content": "// setup canvas\n\nconst canvas = document.querySelector(\"canvas\");\nconst ctx = canvas.getContext(\"2d\");\n\nconst width = (canvas.width = window.innerWidth);\nconst height = (canvas.height = window.innerHeight);\n\n// function to generate random number\n\nfunction random(min, max) {\n  return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\n// function to generate random color\n\nfunction randomRGB() {\n  return `rgb(${random(0, 255)},${random(0, 255)},${random(0, 255)})`;\n}\n"
  },
  {
    "path": "javascript/oojs/bouncing-balls/style.css",
    "content": "html, body {\n  margin: 0;\n}\n\nhtml {\n  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  height: 100%;\n}\n\nbody {\n  overflow: hidden;\n  height: inherit;\n}\n\nh1 {\n  font-size: 2rem;\n  letter-spacing: -1px;\n  position: absolute;\n  margin: 0;\n  top: -4px;\n  right: 5px;\n\n  color: transparent;\n  text-shadow: 0 0 4px white;\n}"
  },
  {
    "path": "javascript/oojs/introduction/oojs-class-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Object-oriented JavaScript class example</title>\n  </head>\n\n  <body>\n    <p>This example requires you to enter commands in your browser's JavaScript console (see <a href=\"https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_are_browser_developer_tools\">What are browser developer tools</a> for more information).</p>\n\n  </body>\n\n    <script>\n      function Person(first, last, age, gender, interests) {\n        this.name = {\n          'first': first,\n          'last' : last\n        };\n        this.age = age;\n        this.gender = gender;\n        this.interests = interests;\n        this.bio = function() {\n          alert(this.name.first + ' ' + this.name.last + ' is ' + this.age + ' years old. He likes ' + this.interests[0] + ' and ' + this.interests[1] + '.');\n        };\n        this.greeting = function() {\n          alert('Hi! I\\'m ' + this.name.first + '.');\n        };\n      };\n\n      let person1 = new Person('Bob', 'Smith', 32, 'male', ['music', 'skiing']);\n    </script>\n</html>\n"
  },
  {
    "path": "javascript/oojs/introduction/oojs-class-further-exercises.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Object-oriented JavaScript class further exercises</title>\n  </head>\n\n  <body>\n    <p>This example requires you to enter commands in your browser's JavaScript console (see <a href=\"https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_are_browser_developer_tools\">What are browser developer tools</a> for more information).</p>\n\n  </body>\n\n    <script>\n      function Person(first, last, age, gender, interests) {\n        this.name = {\n          'first': first,\n          'last' : last\n        };\n        this.age = age;\n        this.gender = gender;\n        this.interests = interests;\n        this.bio = function() {\n          // First define a string, and make it equal to the part of\n          // the bio that we know will always be the same.\n          var string = this.name.first + ' ' + this.name.last + ' is ' + this.age + ' years old. ';\n          // define a variable that will contain the pronoun part of\n          // the second sentence\n          var pronoun;\n\n          // check what the value of gender is, and set pronoun\n          // to an appropriate value in each case\n          if(this.gender === 'male' || this.gender === 'Male' || this.gender === 'm' || this.gender === 'M') {\n            pronoun = 'He likes ';\n          } else if(this.gender === 'female' || this.gender === 'Female' || this.gender === 'f' || this.gender === 'F') {\n            pronoun = 'She likes ';\n          } else {\n            pronoun = 'They like ';\n          }\n\n          // add the pronoun string on to the end of the main string\n          string += pronoun;\n\n          // use another conditional to structure the last part of the\n          // second sentence depending on whether the number of interests\n          // is 1, 2, or 3\n          if(this.interests.length === 1) {\n            string += this.interests[0] + '.';\n          } else if(this.interests.length === 2) {\n            string += this.interests[0] + ' and ' + this.interests[1] + '.';\n          } else {\n            // if there are more than 2 interests, we loop through them\n            // all, adding each one to the main string followed by a comma,\n            // except for the last one, which needs an and & a full stop\n            for(var i = 0; i < this.interests.length; i++) {\n              if(i === this.interests.length - 1) {\n                string += 'and ' + this.interests[i] + '.';\n              } else {\n                string += this.interests[i] + ', ';\n              }\n            }\n          }\n\n          // finally, with the string built, we alert() it\n          alert(string);\n        };\n        this.greeting = function() {\n          alert('Hi! I\\'m ' + this.name.first + '.');\n        };\n      };\n\n      let person1 = new Person('Tammi', 'Smith', 32, 'neutral', ['music', 'skiing', 'kickboxing']);\n    </script>\n</html>\n"
  },
  {
    "path": "javascript/oojs/introduction/oojs-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Object-oriented JavaScript example</title>\n  </head>\n\n  <body>\n    <p>This example requires you to enter commands in your browser's JavaScript console (see <a href=\"https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_are_browser_developer_tools\">What are browser developer tools</a> for more information).</p>\n\n  </body>\n\n    <script>\n      const person = {\n        name: [\"Kate\", \"Smith\"],\n        age: 32,\n        gender: \"female\",\n        interests: [\"music\", \"skiing\"],\n        bio() {\n          alert(\n            `${this.name[0]} ${this.name[1]} is ${this.age} years old. She likes ${\n              this.interests[0]} and ${this.interests[1]}.`,\n          );\n        },\n        greeting() {\n          alert(`Hi! I'm ${this.name[0]}.`);\n        },\n      };\n      const myDataName = 'height';\n      const myDataValue = '1.75m';\n      person[myDataName] = myDataValue;\n    </script>\n</html>\n"
  },
  {
    "path": "javascript/oojs/introduction/oojs.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Object-oriented JavaScript example</title>\n  </head>\n\n  <body>\n    <p>This example requires you to enter commands in your browser's JavaScript console (see <a href=\"https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_are_browser_developer_tools\">What are browser developer tools</a> for more information).</p>\n    \n    <script>\n\n    </script>\n  </body>\n\n</html>\n"
  },
  {
    "path": "javascript/oojs/json/JSONTest.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Simple JSON example</title>\n  </head>\n\n  <body>\n\n    <script>\n    const superHeroes = {\n      \"squadName\" : \"Super hero squad\",\n      \"homeTown\" : \"Metro City\",\n      \"formed\" : 2016,\n      \"secretBase\" : \"Super tower\",\n      \"active\" : true,\n      \"members\" : [\n        {\n          \"name\" : \"Molecule Man\",\n          \"age\" : 29,\n          \"secretIdentity\" : \"Dan Jukes\",\n          \"powers\" : [\n            \"Radiation resistance\",\n            \"Turning tiny\",\n            \"Radiation blast\"\n          ]\n        },\n        {\n          \"name\" : \"Madame Uppercut\",\n          \"age\" : 39,\n          \"secretIdentity\" : \"Jane Wilson\",\n          \"powers\" : [\n            \"Million tonne punch\",\n            \"Damage resistance\",\n            \"Superhuman reflexes\"\n          ]\n        },\n        {\n          \"name\" : \"Eternal Flame\",\n          \"age\" : 1000000,\n          \"secretIdentity\" : \"Unknown\",\n          \"powers\" : [\n            \"Immortality\",\n            \"Heat Immunity\",\n            \"Inferno\",\n            \"Teleportation\",\n            \"Interdimensional travel\"\n          ]\n        }\n      ]\n    }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/oojs/json/heroes-finished-json-parse.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n\n    <title>Our superheroes</title>\n\n    <link href=\"https://fonts.googleapis.com/css?family=Faster+One\" rel=\"stylesheet\">\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n\n  <body>\n\n      <header>\n\n      </header>\n\n      <section>\n\n      </section>\n\n    <script>\n\n    async function populate() {\n\n      const requestURL = 'https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json';\n      const request = new Request(requestURL);\n\n      const response = await fetch(request);\n      const superHeroesText = await response.text();\n\n      const superHeroes = JSON.parse(superHeroesText);\n      populateHeader(superHeroes);\n      populateHeroes(superHeroes);\n\n    }\n\n    function populateHeader(obj) {\n      const header = document.querySelector('header');\n      const myH1 = document.createElement('h1');\n      myH1.textContent = obj.squadName;\n      header.appendChild(myH1);\n\n      const myPara = document.createElement('p');\n      myPara.textContent = `Hometown: ${obj.homeTown} // Formed: ${obj.formed}`;\n      header.appendChild(myPara);\n    }\n\n    function populateHeroes(obj) {\n      const section = document.querySelector('section');\n      const heroes = obj.members;\n\n      for (const hero of heroes) {\n        const myArticle = document.createElement('article');\n        const myH2 = document.createElement('h2');\n        const myPara1 = document.createElement('p');\n        const myPara2 = document.createElement('p');\n        const myPara3 = document.createElement('p');\n        const myList = document.createElement('ul');\n\n        myH2.textContent = hero.name;\n        myPara1.textContent = `Secret identity: ${hero.secretIdentity}`;\n        myPara2.textContent = `Age: ${hero.age}`;\n        myPara3.textContent = 'Superpowers:';\n\n        const superPowers = hero.powers;\n        for (const power of superPowers) {\n          const listItem = document.createElement('li');\n          listItem.textContent = power;\n          myList.appendChild(listItem);\n        }\n\n        myArticle.appendChild(myH2);\n        myArticle.appendChild(myPara1);\n        myArticle.appendChild(myPara2);\n        myArticle.appendChild(myPara3);\n        myArticle.appendChild(myList);\n\n        section.appendChild(myArticle);\n      }\n    }\n\n    populate();\n\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/oojs/json/heroes-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n\n    <title>Our superheroes</title>\n\n    <link href=\"https://fonts.googleapis.com/css?family=Faster+One\" rel=\"stylesheet\">\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n\n  <body>\n\n      <header>\n\n      </header>\n\n      <section>\n\n      </section>\n\n    <script>\n\n    async function populate() {\n\n      const requestURL = 'https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json';\n      const request = new Request(requestURL);\n\n      const response = await fetch(request);\n      const superHeroes = await response.json();\n\n      populateHeader(superHeroes);\n      populateHeroes(superHeroes);\n\n    }\n\n    function populateHeader(obj) {\n      const header = document.querySelector('header');\n      const myH1 = document.createElement('h1');\n      myH1.textContent = obj.squadName;\n      header.appendChild(myH1);\n\n      const myPara = document.createElement('p');\n      myPara.textContent = `Hometown: ${obj.homeTown} // Formed: ${obj.formed}`;\n      header.appendChild(myPara);\n    }\n\n    function populateHeroes(obj) {\n      const section = document.querySelector('section');\n      const heroes = obj.members;\n\n      for (const hero of heroes) {\n        const myArticle = document.createElement('article');\n        const myH2 = document.createElement('h2');\n        const myPara1 = document.createElement('p');\n        const myPara2 = document.createElement('p');\n        const myPara3 = document.createElement('p');\n        const myList = document.createElement('ul');\n\n        myH2.textContent = hero.name;\n        myPara1.textContent = `Secret identity: ${hero.secretIdentity}`;\n        myPara2.textContent = `Age: ${hero.age}`;\n        myPara3.textContent = 'Superpowers:';\n\n        const superPowers = hero.powers;\n        for (const power of superPowers) {\n          const listItem = document.createElement('li');\n          listItem.textContent = power;\n          myList.appendChild(listItem);\n        }\n\n        myArticle.appendChild(myH2);\n        myArticle.appendChild(myPara1);\n        myArticle.appendChild(myPara2);\n        myArticle.appendChild(myPara3);\n        myArticle.appendChild(myList);\n\n        section.appendChild(myArticle);\n      }\n    }\n\n    populate();\n\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/oojs/json/heroes.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n\n    <title>Our superheroes</title>\n\n    <link href=\"https://fonts.googleapis.com/css?family=Faster+One\" rel=\"stylesheet\">\n    <link rel=\"stylesheet\" href=\"style.css\">\n  </head>\n\n  <body>\n\n      <header>\n\n      </header>\n\n      <section>\n\n      </section>\n\n      <script>\n\n      </script>\n  </body>\n</html>\n"
  },
  {
    "path": "javascript/oojs/json/style.css",
    "content": "/* || general styles */\n\nhtml {\n  font-family: 'helvetica neue', helvetica, arial, sans-serif;\n}\n\nbody {\n  width: 800px;\n  margin: 0 auto;\n}\n\nh1, h2 {\n  font-family: 'Faster One', cursive;\n}\n\n/* header styles */\n\nh1 {\n  font-size: 4rem;\n  text-align: center;\n}\n\nheader p {\n  font-size: 1.3rem;\n  font-weight: bold;\n  text-align: center;\n}\n\n/* section styles */\n\nsection article {\n  width: 33%;\n  float: left;\n}\n\nsection p {\n  margin: 5px 0;\n}\n\nsection ul {\n  margin-top: 0;\n}\n\nh2 {\n  font-size: 2.5rem;\n  letter-spacing: -5px;\n  margin-bottom: 10px;\n}"
  },
  {
    "path": "javascript/oojs/json/superheroes.json",
    "content": "{\n  \"squadName\" : \"Super Hero Squad\",\n  \"homeTown\" : \"Metro City\",\n  \"formed\" : 2016,\n  \"secretBase\" : \"Super tower\",\n  \"active\" : true,\n  \"members\" : [\n    {\n      \"name\" : \"Molecule Man\",\n      \"age\" : 29,\n      \"secretIdentity\" : \"Dan Jukes\",\n      \"powers\" : [\n        \"Radiation resistance\",\n        \"Turning tiny\",\n        \"Radiation blast\"\n      ]\n    },\n    {\n      \"name\" : \"Madame Uppercut\",\n      \"age\" : 39,\n      \"secretIdentity\" : \"Jane Wilson\",\n      \"powers\" : [\n        \"Million tonne punch\",\n        \"Damage resistance\",\n        \"Superhuman reflexes\"\n      ]\n    },\n    {\n      \"name\" : \"Eternal Flame\",\n      \"age\" : 1000000,\n      \"secretIdentity\" : \"Unknown\",\n      \"powers\" : [\n        \"Immortality\",\n        \"Heat Immunity\",\n        \"Inferno\",\n        \"Teleportation\",\n        \"Interdimensional travel\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "javascript/oojs/tasks/json/json1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>JSON: Task 1</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    const section = document.querySelector('section');\n\n    let para1 = document.createElement('p');\n    let para2 = document.createElement('p');\n    let motherInfo = 'The mother cats are called ';\n    let kittenInfo;\n    const requestURL = 'https://mdn.github.io/learning-area/javascript/oojs/tasks/json/sample.json';\n\n    fetch(requestURL)\n    .then(response => response.text())\n    .then(text => displayCatInfo(text))\n\n    function displayCatInfo(catString) {\n      let total = 0;\n      let male = 0;\n\n      // Add your code here\n\n      // Don't edit the code below here!\n\n      para1.textContent = motherInfo;\n      para2.textContent = kittenInfo;\n    }\n\n    section.appendChild(para1);\n    section.appendChild(para2);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/oojs/tasks/json/json1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>JSON: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\nconst section = document.querySelector('section');\n\nlet para1 = document.createElement('p');\nlet para2 = document.createElement('p');\nlet motherInfo = 'The mother cats are called ';\nlet kittenInfo;\nconst requestURL = 'https://mdn.github.io/learning-area/javascript/oojs/tasks/json/sample.json';\n\nfetch(requestURL)\n  .then(response => response.text())\n  .then(text => displayCatInfo(text))\n\nfunction displayCatInfo(catString) {\n  let total = 0;\n  let male = 0;\n\n// Add your code here\n\n// Don't edit the code below here!\n\n  para1.textContent = motherInfo;\n  para2.textContent = kittenInfo;\n}\n\nsection.appendChild(para1);\nsection.appendChild(para2);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/oojs/tasks/json/marking.md",
    "content": "# JSON marking guide\n\nThe aim of the task is to demonstrate an understanding of the JavaScript features covered in the [Working with JSON](https://wiki.developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON) lesson in Learn Web Development on MDN.\n\nNote: If there is an error in your code, it will be outputted into the results panel on the page, to help you try to figure out the answer (or into the browser's JavaScript console, in the case of the downloadable version).\n\n## Task 1\n\nThe one and only task in this article concerns accessing JSON data and using it in your page. JSON data about some mother cats and their kittens is available in [sample.json](sample.json). The JSON is loaded into the page as a text string and made available in the `catString` parameter of the `displayCatInfo()` function, called when the provided promise chain (which starts by fetching the JSON data) is fulfilled. Your task is to fill in the missing parts of the `displayCatInfo()` function to store:\n\n- The names of the three mother cats, separated by commas, in the `motherInfo` variable.\n- The total number of kittens, and how many are male and female, in the `kittenInfo` variable.\n\nThe values of these variables are then printed to the screen inside paragraphs.\n\nSome hints/questions:\n\n- The JSON data is provided as text inside the `displayCatInfo()` function. You'll need to parse it into JSON using the `JSON.parse()` method.\n- You'll probably want to use an outer loop to loop through the cats and add their names to the `motherInfo` variable string, and an inner loop to loop through all the kittens, add up the total of all/male/female kittens, and add those details to the `kittenInfo` variable string.\n- The last mother cat name should have an \"and\" before it, and a full stop after it. How do you make sure this can work, no matter how many cats are in the JSON?\n- Why are the `para1.textContent = motherInfo;` and `para2.textContent = kittenInfo;` lines inside the `displayCatInfo()` function, and. not at the end of the script? This has something to do with async code.\n\nYour code should look something like this:\n\n```js\nfunction displayCatInfo(catString) {\n  let total = 0;\n  let male = 0;\n\n  // Add your code here\n  const cats = JSON.parse(catString);\n\n  for (let i = 0; i < cats.length; i++) {\n    for (const kitten of cats[i].kittens) {\n      total++;\n      if (kitten.gender === \"m\") {\n        male++;\n      }\n    }\n\n    if (i < cats.length - 1) {\n      motherInfo += `${cats[i].name}, `;\n    } else {\n      motherInfo += `and ${cats[i].name}.`;\n    }\n  }\n\n  kittenInfo = `There are ${total} kittens in total, ${male} males and ${\n    total - male\n  } females.`;\n\n  // Don't edit the code below here!\n\n  para1.textContent = motherInfo;\n  para2.textContent = kittenInfo;\n}\n```\n"
  },
  {
    "path": "javascript/oojs/tasks/json/sample.json",
    "content": "[\n  {\n    \"name\" : \"Lindy\",\n    \"breed\" : \"Cymric\",\n    \"color\" : \"white\",\n    \"kittens\" : [\n      {\n        \"name\" : \"Percy\",\n        \"gender\" : \"m\"\n      },\n      {\n        \"name\" : \"Thea\",\n        \"gender\" : \"f\"\n      },\n      {\n        \"name\" : \"Annis\",\n        \"gender\" : \"f\"\n      }\n    ]\n  },\n  {\n    \"name\" : \"Mina\",\n    \"breed\" : \"Aphrodite Giant\",\n    \"color\" : \"ginger\",\n    \"kittens\" : [\n      {\n        \"name\" : \"Doris\",\n        \"gender\" : \"f\"\n      },\n      {\n        \"name\" : \"Pickle\",\n        \"gender\" : \"f\"\n      },\n      {\n        \"name\" : \"Max\",\n        \"gender\" : \"m\"\n      }\n    ]\n  },\n  {\n    \"name\" : \"Antonia\",\n    \"breed\" : \"Ocicat\",\n    \"color\" : \"leopard spotted\",\n    \"kittens\" : [\n      {\n        \"name\" : \"Bridget\",\n        \"gender\" : \"f\"\n      },\n      {\n        \"name\" : \"Randolph\",\n        \"gender\" : \"m\"\n      }\n    ]\n  }\n]\n"
  },
  {
    "path": "javascript/oojs/tasks/object-basics/marking.md",
    "content": "# JavaScript object basics marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the JavaScript features covered in the [JavaScript object basics](https://wiki.developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Basics) lesson in Learn Web Development on MDN.\n\nNote: If there is an error in your code, it will be outputted into the results panel on the page, to help you try to figure out the answer (or into the browser's JavaScript console, in the case of the downloadable version).\n\n## Task 1\n\nIn this task you are provided with an object literal, and your tasks are to\n\n- Store the value of the `name` property inside `catName`, using bracket notation.\n- Run the `greeting()` method using dot notation (it will log the greeting to the browser DevTools' console).\n- Update the `color` property value to `black`.\n\nThe finished code should look something like this:\n\n```js\nconst cat = {\n  name: \"Bertie\",\n  breed: \"Cymric\",\n  color: \"white\",\n  greeting: function () {\n    console.log(\"Meow!\");\n  },\n};\n\nconst catName = cat[\"name\"];\ncat.greeting();\ncat.color = \"black\";\n```\n\n## Task 2\n\nIn our next task, we want you to have a go at creating your own object literal to represent one of your favourite bands. The required members are:\n\n- `name`: A string representing the band name.\n- `nationality`: A string representing the country the band comes from.\n- `genre`: What type of music the band plays.\n- `members`: A number representing the number of members the band has.\n- `formed`: A number representing the year the band formed.\n- `split`: A number representing the year the band split up, or `false` if they are still together.\n- `albums`: An array representing the albums released by the band. Each array item should be an object containing the following members:\n  - `name`: A string representing the name of the album.\n  - `released`: A number representing the year the album was released.\n\nInclude at least two albums in the `albums` array.\n\nOnce you've done this, you should then write a string to the variable `bandInfo`, which will contain a small biography detailing their name, nationality, years active, and style, and the title and release date of their first album.\n\nThe finished code should look something like this:\n\n```js\nlet bandInfo;\n\nconst band = {\n  name: \"Black Sabbath\",\n  nationality: \"British\",\n  genre: \"heavy metal\",\n  members: 4,\n  formed: 1968,\n  split: 2017,\n  albums: [\n    {\n      name: \"Black Sabbath\",\n      released: 1970,\n    },\n    {\n      name: \"Paranoid\",\n      released: 1970,\n    },\n    {\n      name: \"Master of Reality\",\n      released: 1971,\n    },\n    {\n      name: \"Vol. 4\",\n      released: 1972,\n    },\n  ],\n};\n\nbandInfo = `The ${band.nationality} ${band.genre} band ${band.name} were active ${band.formed}–${band.split}. Their first album, ${band.albums[0].name}, was released in ${band.albums[0].released}.`;\n```\n\n## Task 3\n\nIn this task we want you to return to the `cat` object literal from Task #1. We want you to rewrite the `greeting()` method so that it logs \"Hello, said Bertie the Cymric.\" to the browser DevTools' console, but in a way that will work across _any_ cat object of the same structure, regardless of its name or breed.\n\nWhen you are done, write your own object called `cat2`, which has the same structure, exactly the same `greeting()` method, but a different `name`, `breed`, and `color`.\n\nCall both `greeting()` methods to check that they log appropriate greetings to the console.\n\nThe code should look like this:\n\n```js\nconst cat = {\n  name: \"Bertie\",\n  breed: \"Cymric\",\n  color: \"white\",\n  greeting: function () {\n    console.log(`Hello, said ${this.name} the ${this.breed}.`);\n  },\n};\n\nconst cat2 = {\n  name: \"Elfie\",\n  breed: \"Aphrodite Giant\",\n  color: \"ginger\",\n  greeting: function () {\n    console.log(`Hello, said ${this.name} the ${this.breed}.`);\n  },\n};\n\ncat.greeting();\ncat2.greeting();\n```\n\n## Task 4\n\nIn this task we want you to update the code from Task 3 to use a constructor for the cats, so we only have to define `greeting()` once.\n\nThe code should look like this:\n\n```js\nfunction Cat(name, breed, color) {\n  this.name = name;\n  this.breed = breed;\n  this.color = color;\n  this.greeting = function () {\n    console.log(`Hello, said ${this.name} the ${this.breed}.`);\n  };\n}\n\nconst cat = new Cat(\"Bertie\", \"Cymric\", \"white\");\nconst cat2 = new Cat(\"Elfie\", \"Aphrodite Giant\", \"ginger\");\n\ncat.greeting();\ncat2.greeting();\n```\n"
  },
  {
    "path": "javascript/oojs/tasks/object-basics/object-basics1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Object basics: Task 1</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    const cat = {\n      name : 'Bertie',\n      breed : 'Cymric',\n      color : 'white',\n      greeting: function() {\n        console.log('Meow!');\n      }\n    }\n\n    // Add your code here\n\n\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n\n    let para1 = document.createElement('p');\n    let para2 = document.createElement('p');\n\n    para1.textContent = `The cat's name is ${ catName }.`;\n    para2.textContent = `The cat's color is ${ cat.color }.`;\n\n    section.appendChild(para1);\n    section.appendChild(para2);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/oojs/tasks/object-basics/object-basics1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Object basics: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\nconst cat = {\n  name : 'Bertie',\n  breed : 'Cymric',\n  color : 'white',\n  greeting: function() {\n    console.log('Meow!');\n  }\n}\n\n// Put your code here\n\n\n\n// Don't edit the code below here\n\nlet para1 = document.createElement('p');\nlet para2 = document.createElement('p');\n\npara1.textContent = `The cat's name is ${ catName }.`;\npara2.textContent = `The cat's color is ${ cat.color }.`;\n\nsection.appendChild(para1);\nsection.appendChild(para2);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/oojs/tasks/object-basics/object-basics2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Object basics: Task 2</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    let bandInfo;\n\n    // Add your code here\n\n\n    // Don't edit the code below here!\n\n    const section = document.querySelector('section');\n    let para1 = document.createElement('p');\n    para1.textContent = bandInfo;\n    section.appendChild(para1);\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/oojs/tasks/object-basics/object-basics2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Object basics: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\nlet bandInfo;\n\n// Put your code here\n\n\n// Don't edit the code below here\n\nlet para1 = document.createElement('p');\npara1.textContent = bandInfo;\nsection.appendChild(para1);\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/oojs/tasks/object-basics/object-basics3-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Object basics: Task 3</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    const cat = {\n      name : 'Bertie',\n      breed : 'Cymric',\n      color : 'white',\n      greeting: function() {\n        console.log('Meow!');\n      }\n    }\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/oojs/tasks/object-basics/object-basics3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Object basics: Task 3</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\nconst cat = {\n  name : 'Bertie',\n  breed : 'Cymric',\n  color : 'white',\n  greeting: function() {\n    console.log('Meow!');\n  }\n}\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/oojs/tasks/object-basics/object-basics4-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Object basics: Task 4</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n    const cat = {\n      name : 'Bertie',\n      breed : 'Cymric',\n      color : 'white',\n      greeting: function() {\n        console.log(`Hello, said ${ this.name } the ${ this.breed }.`);\n      }\n    }\n\n    const cat2 = {\n      name : 'Elfie',\n      breed : 'Aphrodite Giant',\n      color : 'ginger',\n      greeting: function() {\n        console.log(`Hello, said ${ this.name } the ${ this.breed }.`);\n      }\n    }\n\n    cat.greeting();\n    cat2.greeting();\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/oojs/tasks/object-basics/object-basics4.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Object basics: Task 4</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\nconst cat = {\n  name : 'Bertie',\n  breed : 'Cymric',\n  color : 'white',\n  greeting: function() {\n    console.log(`Hello, said ${ this.name } the ${ this.breed }.`);\n  }\n}\n\nconst cat2 = {\n  name : 'Elfie',\n  breed : 'Aphrodite Giant',\n  color : 'ginger',\n  greeting: function() {\n    console.log(`Hello, said ${ this.name } the ${ this.breed }.`);\n  }\n}\n\ncat.greeting();\ncat2.greeting();\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/oojs/tasks/oojs/marking.md",
    "content": "# Object-oriented JavaScript marking guide\n\nThe aim of the tasks is to demonstrate an understanding of the JavaScript features covered in the [Object-oriented JavaScript for beginners](https://wiki.developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object-oriented_JS), [Object prototypes](https://wiki.developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes), and [Inheritance in JavaScript](https://wiki.developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Inheritance) lessons in Learn Web Development on MDN.\n\nNote: If there is an error in your code, it will be outputted into the results panel on the page, to help you try to figure out the answer (or into the browser's JavaScript console, in the case of the downloadable version).\n\n## Task 1\n\nIn this task we provide you with a `Shape` class containing only some data properties.\n\nWe want you to:\n\n- add a constructor\n- define a `calcPerimeter()` method\n- create two instances of the class, a square and a triangle, and call their `calcPerimeter()` methods\n\nYour code should look something like this:\n\n```js\nclass Shape {\n  name;\n  sides;\n  sideLength;\n\n  constructor(name, sides, sideLength) {\n    this.name = name;\n    this.sides = sides;\n    this.sideLength = sideLength;\n  }\n\n  calcPerimeter() {\n    console.log(\n      `The ${this.name}'s perimeter length is ${this.sides * this.sideLength}.`\n    );\n  }\n}\n\nconst square = new Shape(\"square\", 4, 5);\nsquare.calcPerimeter();\n\nconst triangle = new Shape(\"triangle\", 3, 3);\ntriangle.calcPerimeter();\n```\n\n## Task 2\n\nNext, we'd like you to start with the `Shape` class you created in the last task.\n\nWe'd like you to create a `Square` class that inherits from `Shape`, and adds a `calcArea()` method that calculates the square's area.\n\nCreate an instance of the `Square` called square with appropriate property values, and call its `calcPerimeter()` and `calcArea()` methods to show that it works.\n\nYour code should look something like this:\n\n```js\nclass Shape {\n  name;\n  sides;\n  sideLength;\n\n  constructor(name, sides, sideLength) {\n    this.name = name;\n    this.sides = sides;\n    this.sideLength = sideLength;\n  }\n\n  calcPerimeter() {\n    console.log(\n      `The ${this.name}'s perimeter length is ${this.sides * this.sideLength}.`\n    );\n  }\n}\n\nclass Square extends Shape {\n  constructor(sideLength) {\n    super(\"square\", 4, sideLength);\n  }\n\n  calcArea() {\n    console.log(\n      `The ${this.name}'s area is ${this.sideLength * this.sideLength} squared.`\n    );\n  }\n}\n\nconst square = new Square(4);\n\nsquare.calcPerimeter();\nsquare.calcArea();\n```\n"
  },
  {
    "path": "javascript/oojs/tasks/oojs/oojs1-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>OOJS: Task 1</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n  class Shape {\n\n    name;\n    sides;\n    sideLength;\n\n  }\n\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/oojs/tasks/oojs/oojs1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>OOJS: Task 1</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\nclass Shape {\n\n  name;\n  sides;\n  sideLength;\n\n}\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/oojs/tasks/oojs/oojs2-download.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>OOJS: Task 2</title>\n    <style>\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n\n      * {\n        box-sizing: border-box;\n      }\n    </style>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n  </head>\n\n  <body>\n\n    <section class=\"preview\">\n\n\n\n    </section>\n\n  </body>\n  <script>\n\n  </script>\n\n</html>\n"
  },
  {
    "path": "javascript/oojs/tasks/oojs/oojs2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>OOJS: Task 2</title>\n    <link rel=\"stylesheet\" href=\"../styles.css\" />\n    <style>\n      * {\n        box-sizing: border-box;\n      }\n\n      p {\n        color: purple;\n        margin: 0.5em 0;\n      }\n    </style>\n  </head>\n\n  <body>\n    <section class=\"preview\">\n\n\n\n    </section>\n\n    <textarea class=\"playable playable-js\" style=\"height: 220px;\">\n\n\n    </textarea>\n\n    <div class=\"playable-buttons\">\n      <input id=\"reset\" type=\"button\" value=\"Reset\" />\n    </div>\n  </body>\n  <script class=\"editable\"></script>\n  <script src=\"../playable.js\"></script>\n</html>\n"
  },
  {
    "path": "javascript/oojs/tasks/playable.js",
    "content": "var section = document.querySelector('section');\nvar editable = document.querySelector('.editable');\nvar textareaJS = document.querySelector('.playable-js');\nvar reset = document.getElementById('reset');\nvar jsCode = textareaJS.value;\n\nfunction fillCode() {\n    editable.textContent = textareaJS.value;\n    section.innerHTML = ' ';\n    try {\n      eval(editable.textContent);\n    } catch(e) {\n      let para = document.createElement('p');\n      para.textContent = e;\n      section.appendChild(para);\n    }\n}\n\nreset.addEventListener('click', function () {\n    textareaJS.value = jsCode;\n    fillCode();\n});\n\ntextareaJS.addEventListener('input', fillCode);\nwindow.addEventListener('load', fillCode);\n"
  },
  {
    "path": "javascript/oojs/tasks/styles.css",
    "content": "/* Some default styling for cookbook examples */\n/*\nrgb(53,43,34)\nrgb(75,70,74)\nrgb(95,97,110)\nrgb(137,151,188)\nrgb(160,178,226)\n*/\nbody {\n    background-color: #fff;\n    color: #333;\n    font: 1em / 1.4 Helvetica Neue, Helvetica, Arial, sans-serif;\n    padding: 0;\n    margin: 0;\n}\n\nh1 {\n  font-size: 2rem;\n  margin: 0;\n}\n\nh2 {\n  font-size: 1.6rem;\n  margin: 0;\n}\n\np {\n  margin: 0.5em 0;\n}\n\n/* styles for the editor */\n\n.playable {\n    font-family: monospace;\n    display: block;\n    margin-bottom: 10px;\n    background-color: #F4F7F8;\n    border: none;\n    border-left: 6px solid #558ABB;\n    color: #4D4E53;\n    width: 90%;\n    max-width: 700px;\n    padding: 10px 10px 0px;\n    font-size: 90%;\n  }\n\n  .playable-css {\n    height: 80px;\n  }\n\n  .playable-js {\n    height: 160px;\n  }\n\n  .playable-buttons {\n    text-align: right;\n    width: 90%;\n    max-width: 700px;\n    padding: 5px 10px 5px 26px;\n    font-size: 100%;\n  }\n\n  .preview {\n    width: 90%;\n    max-width: 700px;\n    border: 1px solid #4D4E53;\n    border-radius: 2px;\n    padding: 10px 14px 10px 10px;\n    margin-bottom: 10px;\n  }\n\n  .preview input {\n    display: block;\n    margin: 5px;\n  }\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/accessibility/bad-semantics.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Bad semantics example</title>\n  </head>\n  <body>\n    <font size=\"7\">My heading</font>\n    <br><br>\n    This is the first section of my document.\n    <br><br>\n    I'll add another paragraph here too.\n    <br><br>\n    <font size=\"5\">My subheading</font>\n    <br><br>\n    This is the first subsection of my document. I'd love people to be able to find this content!\n    <br><br>\n    <font size=\"5\">My 2nd subheading</font>\n    <br><br>\n    This is the second subsection of my content. I think is more interesting than the last one.\n  </body>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/accessibility/fake-div-buttons.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Fake div buttons</title>\n    <style>\n      div {\n        background-color: rgb(240, 240, 240);\n        font-size: 11px;\n        font-family: sans-serif;\n        border: 1px outset rgb(218, 218, 218);\n        line-height: 20px;\n        padding: 0 6px;\n        width: 120px;\n        text-align: center;\n        border-radius: 5px;\n        margin-right: 10px;\n        cursor: pointer;\n        display: inline-block;\n      }\n\n      div:hover, div:focus {\n        font-weight: bold;\n      }\n    </style>\n  </head>\n  <body>\n\n    <h2>Fake buttons</h2>\n\n    <div data-message=\"This is from the first button\" tabindex=\"0\" role=\"button\">Click me!</div>\n    <div data-message=\"This is from the second button\" tabindex=\"0\" role=\"button\">Click me too!</div>\n    <div data-message=\"This is from the third button\" tabindex=\"0\" role=\"button\">And me!</div>\n\n    <script>\n      const buttons = document.querySelectorAll('div');\n\n      for(let i = 0; i < buttons.length; i++) {\n        addHandler(buttons[i]);\n      }\n\n      function addHandler(button) {\n        button.onclick = function(e) {\n          let message = e.target.getAttribute('data-message');\n          alert(message);\n        }\n      }\n\n      document.onkeydown = function(e) {\n        if(e.key === 'Enter') { // The Enter/Return key\n          document.activeElement.onclick(e);\n        }\n      };\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/accessibility/good-semantics.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Good semantics example</title>\n  </head>\n  <body>\n    <h1>My heading</h1>\n\n    <p>This is the first section of my document.</p>\n\n    <p>I'll add another paragraph here too.</p>\n\n    <h2>My subheading</h2>\n\n    <p>This is the first subsection of my document. I'd love people to be able to find this content!</p>\n\n    <h2>My 2nd subheading</h2>\n\n    <p>This is the second subsection of my content. I think is more interesting than the last one.</p>\n  </body>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/accessibility/native-keyboard-accessibility.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Native keyboard accessibility</title>\n    <style>\n      input {\n        margin-bottom: 10px;\n      }\n\n      button {\n        margin-right: 10px;\n      }\n\n      a:hover, input:hover, button:hover, select:hover,\n      a:focus, input:focus, button:focus, select:focus {\n        font-weight: bold;\n      }\n    </style>\n  </head>\n  <body>\n\n    <h1>Links</h1>\n\n    <p>This is a link to <a href=\"https://www.mozilla.org\">Mozilla</a>.</p>\n\n    <p>Another link, to the <a href=\"https://developer.mozilla.org\">Mozilla Developer Network</a>.</p>\n\n    <h2>Buttons</h2>\n\n    <p>\n      <button data-message=\"This is from the first button\">Click me!</button>\n      <button data-message=\"This is from the second button\">Click me too!</button>\n      <button data-message=\"This is from the third button\">And me!</button>\n    </p>\n\n    <h2>Form</h2>\n\n    <form>\n      <div>\n        <label for=\"name\">Fill in your name:</label>\n        <input type=\"text\" id=\"name\" name=\"name\">\n      </div>\n      <div>\n        <label for=\"age\">Enter your age:</label>\n        <input type=\"text\" id=\"age\" name=\"age\">\n      </div>\n      <div>\n        <label for=\"mood\">Choose your mood:</label>\n        <select id=\"mood\" name=\"mood\">\n          <option>Happy</option>\n          <option>Sad</option>\n          <option>Angry</option>\n          <option>Worried</option>\n        </select>\n      </div>\n    </form>\n\n    <script>\n      const buttons = document.querySelectorAll('button');\n\n      for(let i = 0; i < buttons.length; i++) {\n        addHandler(buttons[i]);\n      }\n\n      function addHandler(button) {\n        button.addEventListener('click', function(e) {\n          let message = e.target.getAttribute('data-message');\n          alert(message);\n        })\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/automation/call_bstack.js",
    "content": "const request = require(\"request\");\n\nlet bsUser = \"BROWSERSTACK_USERNAME\";\nlet bsKey = \"BROWSERSTACK_ACCESS_KEY\";\nlet baseUrl = \"https://\" + bsUser + \":\" + bsKey + \"@www.browserstack.com/automate/\";\n\nfunction getPlanDetails(){\n\trequest({uri: baseUrl + \"plan.json\"}, function(err, res, body){\n\t\tconsole.log(JSON.parse(body));\n\t});\n\t/* Response:\n\t{\n\t\tautomate_plan: <string>,\n\t\tparallel_sessions_running: <int>,\n\t\tteam_parallel_sessions_max_allowed: <int>,\n\t\tparallel_sessions_max_allowed: <int>,\n\t\tqueued_sessions: <int>,\n\t\tqueued_sessions_max_allowed: <int>\n\t}\n\t*/\n}\n\ngetPlanDetails();\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/automation/call_sauce.js",
    "content": "const SauceLabs = require('saucelabs');\n\nlet myAccount = new SauceLabs({\n  username: \"your-sauce-username\",\n  password: \"your-sauce-api-key\"\n});\n\nmyAccount.getAccountDetails(function (err, res) {\n  console.log(res);\n  myAccount.getServiceStatus(function (err, res) {\n    // Status of the Sauce Labs services\n    console.log(res);\n    myAccount.getJobs(function (err, jobs) {\n      // Get a list of all your jobs\n      for (let k in jobs) {\n        if ( jobs.hasOwnProperty( k )) {\n          myAccount.showJob(jobs[k].id, function (err, res) {\n            let str = res.id + \": Status: \" + res.status;\n            if (res.error) {\n              str += \"\\033[31m Error: \" + res.error + \" \\033[0m\";\n            }\n            console.log(str);\n          });\n        }\n      }\n    });\n  });\n});\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/automation/gulpfile.js",
    "content": "const gulp = require('gulp');\nconst htmltidy = require('gulp-htmltidy');\nconst autoprefixer = require('gulp-autoprefixer');\nconst csslint = require('gulp-csslint');\nconst babel = require('gulp-babel');\nconst jshint = require('gulp-jshint');\nconst { series } = require('gulp');\n\nfunction html(cb) {\n  return gulp.src('src/index.html')\n        .pipe(htmltidy())\n        .pipe(gulp.dest('build'));\n    cb();\n}\n\nfunction css(cb) {\n    return gulp.src('src/style.css')\n        .pipe(csslint())\n        .pipe(csslint.formatter('compact'))\n        .pipe(autoprefixer({\n            cascade: false\n        }))\n        .pipe(gulp.dest('build'));\n    cb();\n}\n\nfunction js(cb) {\n    return gulp.src('src/main.js')\n        .pipe(jshint())\n        .pipe(jshint.reporter('default'))\n        .pipe(babel({\n            presets: ['@babel/env']\n        }))\n        .pipe(gulp.dest('build'));\n        cb();\n}\n\nexports.html = html;\nexports.css = css;\nexports.js = js;\nexports.default = series(html, css, js);\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/automation/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Arrow function example</title>\n    <link href=\"style.css\" rel=\"stylesheet\">\n  </head>\n\n  <body>\n    <!-- Intentionally empty paragraph to demonstrate element removal by a markup corrector -->\n    <p></p>\n    <script src=\"main.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/automation/main.js",
    "content": "let array = ['Chris', 'Bob', 'Mark', 'Paul'];\n\n// Arrow function syntax\narray.forEach((e, i, a) => {\n   const elem = document.createElement('p');\n   elem.textContent = (i + 1) + '. ' + e;\n   document.body.appendChild(elem);\n});\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/automation/style.css",
    "content": "body {\n  display: flex;\n}\n\nbody > p {\n  flex: 1;\n  text-align: center;\n}\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/feature-detection/basic-styling.css",
    "content": "html {\n  font-family: sans-serif;\n}\n\nbody {\n  min-width: 960px;\n  width: 70%;\n  margin: 0 auto;\n}\n\nheader {\n  background-color: lime;\n  height: 100px;\n}\n\nfooter {\n  background-color: lime;\n  height: 50px;\n  padding: 0 2%;\n}\n\nmain {\n  padding: 2%;\n}\n\nh1 {\n  margin: 0;\n  font-size: 4em;\n  text-align: center;\n  line-height: 100px;\n}\n\np {\n  font-size: 1em;\n  line-height: 1.5;\n}\n\nfooter p {\n  line-height: 50px;\n}\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/feature-detection/css-feature-detect-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS feature detection example</title>\n    <link href=\"basic-styling.css\" rel=\"stylesheet\">\n    <link class=\"conditional\" href=\"\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <header>\n      <h1>My funky website</h1>\n    </header>\n\n    <main>\n      <div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare\n        erat diam, ut blandit enim tincidunt ut. Phasellus varius aliquam orci\n       at ultricies. Cras lobortis, risus nec finibus volutpat, nibh urna\n       feugiat eros, quis suscipit turpis mi facilisis nulla. Nunc lacinia\n       auctor magna, vel tempus tortor semper sit amet. Nunc ac varius risus.\n       In a purus ac tortor venenatis tincidunt commodo in est. Etiam est ante,\n       laoreet vel orci sed, finibus ornare turpis. Pellentesque habitant morbi\n       tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>\n      <div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare\n       erat diam, ut blandit enim tincidunt ut. Phasellus varius aliquam orci\n      at ultricies. Cras lobortis, risus nec finibus volutpat, nibh urna\n      feugiat eros, quis suscipit turpis mi facilisis nulla. Nunc lacinia\n      auctor magna, vel tempus tortor semper sit amet. Nunc ac varius risus.\n      In a purus ac tortor venenatis tincidunt commodo in est. Etiam est ante,\n      laoreet vel orci sed, finibus ornare turpis. Pellentesque habitant morbi\n      tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>\n      <div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare\n        erat diam, ut blandit enim tincidunt ut. Phasellus varius aliquam orci\n       at ultricies. Cras lobortis, risus nec finibus volutpat, nibh urna\n       feugiat eros, quis suscipit turpis mi facilisis nulla. Nunc lacinia\n       auctor magna, vel tempus tortor semper sit amet. Nunc ac varius risus.\n       In a purus ac tortor venenatis tincidunt commodo in est. Etiam est ante,\n       laoreet vel orci sed, finibus ornare turpis. Pellentesque habitant morbi\n       tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>\n      <div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare\n       erat diam, ut blandit enim tincidunt ut. Phasellus varius aliquam orci\n      at ultricies. Cras lobortis, risus nec finibus volutpat, nibh urna\n      feugiat eros, quis suscipit turpis mi facilisis nulla. Nunc lacinia\n      auctor magna, vel tempus tortor semper sit amet. Nunc ac varius risus.\n      In a purus ac tortor venenatis tincidunt commodo in est. Etiam est ante,\n      laoreet vel orci sed, finibus ornare turpis. Pellentesque habitant morbi\n      tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>\n    </main>\n\n    <footer>\n      <p>Copyright blah blah</p>\n    </footer>\n\n    <script>\n\n      const conditional = document.querySelector('.conditional');\n      const testElem = document.createElement('div');\n      if(testElem.style.flex !== undefined && testElem.style.flexFlow !== undefined) {\n        conditional.setAttribute('href', 'flex-layout.css');\n      } else {\n        conditional.setAttribute('href', 'float-layout.css');\n      }\n\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/feature-detection/css-feature-detect.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS feature detection example</title>\n\n    <link href=\"basic-styling.css\" rel=\"stylesheet\">\n    <link class=\"conditional\" href=\"float-layout.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <header>\n      <h1>My funky website</h1>\n    </header>\n\n    <main>\n      <div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare\n        erat diam, ut blandit enim tincidunt ut. Phasellus varius aliquam orci\n       at ultricies. Cras lobortis, risus nec finibus volutpat, nibh urna\n       feugiat eros, quis suscipit turpis mi facilisis nulla. Nunc lacinia\n       auctor magna, vel tempus tortor semper sit amet. Nunc ac varius risus.\n       In a purus ac tortor venenatis tincidunt commodo in est. Etiam est ante,\n       laoreet vel orci sed, finibus ornare turpis. Pellentesque habitant morbi\n       tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>\n      <div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare\n       erat diam, ut blandit enim tincidunt ut. Phasellus varius aliquam orci\n      at ultricies. Cras lobortis, risus nec finibus volutpat, nibh urna\n      feugiat eros, quis suscipit turpis mi facilisis nulla. Nunc lacinia\n      auctor magna, vel tempus tortor semper sit amet. Nunc ac varius risus.\n      In a purus ac tortor venenatis tincidunt commodo in est. Etiam est ante,\n      laoreet vel orci sed, finibus ornare turpis. Pellentesque habitant morbi\n      tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>\n      <div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare\n        erat diam, ut blandit enim tincidunt ut. Phasellus varius aliquam orci\n       at ultricies. Cras lobortis, risus nec finibus volutpat, nibh urna\n       feugiat eros, quis suscipit turpis mi facilisis nulla. Nunc lacinia\n       auctor magna, vel tempus tortor semper sit amet. Nunc ac varius risus.\n       In a purus ac tortor venenatis tincidunt commodo in est. Etiam est ante,\n       laoreet vel orci sed, finibus ornare turpis. Pellentesque habitant morbi\n       tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>\n      <div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare\n       erat diam, ut blandit enim tincidunt ut. Phasellus varius aliquam orci\n      at ultricies. Cras lobortis, risus nec finibus volutpat, nibh urna\n      feugiat eros, quis suscipit turpis mi facilisis nulla. Nunc lacinia\n      auctor magna, vel tempus tortor semper sit amet. Nunc ac varius risus.\n      In a purus ac tortor venenatis tincidunt commodo in est. Etiam est ante,\n      laoreet vel orci sed, finibus ornare turpis. Pellentesque habitant morbi\n      tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>\n    </main>\n\n    <footer>\n      <p>Copyright blah blah</p>\n    </footer>\n  </body>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/feature-detection/flex-layout.css",
    "content": "main {\n  display: flex;\n}\n\nmain div {\n  padding-right: 4%;\n  flex: 1;\n}\n\nmain div:last-child {\n  padding-right: 0;\n}\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/feature-detection/float-layout.css",
    "content": "main div {\n  width: 22%;\n  float: left;\n  padding-right: 4%;\n}\n\nmain div:last-child {\n  padding-right: 0;\n}\n\nfooter {\n  clear: left;\n}\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/feature-detection/modernizr-css.css",
    "content": "html {\n  font-family: sans-serif;\n}\n\nbody {\n  min-width: 960px;\n  width: 70%;\n  margin: 0 auto;\n}\n\nheader {\n  background-color: lime;\n  height: 100px;\n}\n\nfooter {\n  background-color: lime;\n  height: 50px;\n  padding: 0 2%;\n}\n\nmain {\n  padding: 2%;\n}\n\nh1 {\n  margin: 0;\n  font-size: 4em;\n  text-align: center;\n  line-height: 100px;\n}\n\np {\n  font-size: 1em;\n  line-height: 1.5;\n}\n\nfooter p {\n  line-height: 50px;\n}\n\n\n/* Properties for browsers with modern flexbox */\n\n.flexbox main {\n  display: flex;\n}\n\n.flexbox main div {\n  padding-right: 4%;\n  flex: 1;\n}\n\n.flexbox main div:last-child {\n  padding-right: 0;\n}\n\n\n/* Fallbacks for browsers that don't support modern flexbox */\n\n.no-flexbox main div {\n  width: 22%;\n  float: left;\n  padding-right: 4%;\n}\n\n.no-flexbox main div:last-child {\n  padding-right: 0;\n}\n\n.no-flexbox footer {\n  clear: left;\n}\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/feature-detection/modernizr-css.html",
    "content": "<!DOCTYPE html>\n<html class=\"no-js\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Modernizr CSS example</title>\n    <script src=\"modernizr-custom.js\"></script>\n    <link href=\"modernizr-css.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <header>\n      <h1>My funky website</h1>\n    </header>\n\n    <main>\n      <div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare\n        erat diam, ut blandit enim tincidunt ut. Phasellus varius aliquam orci\n       at ultricies. Cras lobortis, risus nec finibus volutpat, nibh urna\n       feugiat eros, quis suscipit turpis mi facilisis nulla. Nunc lacinia\n       auctor magna, vel tempus tortor semper sit amet. Nunc ac varius risus.\n       In a purus ac tortor venenatis tincidunt commodo in est. Etiam est ante,\n       laoreet vel orci sed, finibus ornare turpis. Pellentesque habitant morbi\n       tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>\n      <div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare\n       erat diam, ut blandit enim tincidunt ut. Phasellus varius aliquam orci\n      at ultricies. Cras lobortis, risus nec finibus volutpat, nibh urna\n      feugiat eros, quis suscipit turpis mi facilisis nulla. Nunc lacinia\n      auctor magna, vel tempus tortor semper sit amet. Nunc ac varius risus.\n      In a purus ac tortor venenatis tincidunt commodo in est. Etiam est ante,\n      laoreet vel orci sed, finibus ornare turpis. Pellentesque habitant morbi\n      tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>\n      <div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare\n        erat diam, ut blandit enim tincidunt ut. Phasellus varius aliquam orci\n       at ultricies. Cras lobortis, risus nec finibus volutpat, nibh urna\n       feugiat eros, quis suscipit turpis mi facilisis nulla. Nunc lacinia\n       auctor magna, vel tempus tortor semper sit amet. Nunc ac varius risus.\n       In a purus ac tortor venenatis tincidunt commodo in est. Etiam est ante,\n       laoreet vel orci sed, finibus ornare turpis. Pellentesque habitant morbi\n       tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>\n      <div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare\n       erat diam, ut blandit enim tincidunt ut. Phasellus varius aliquam orci\n      at ultricies. Cras lobortis, risus nec finibus volutpat, nibh urna\n      feugiat eros, quis suscipit turpis mi facilisis nulla. Nunc lacinia\n      auctor magna, vel tempus tortor semper sit amet. Nunc ac varius risus.\n      In a purus ac tortor venenatis tincidunt commodo in est. Etiam est ante,\n      laoreet vel orci sed, finibus ornare turpis. Pellentesque habitant morbi\n      tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>\n    </main>\n\n    <footer>\n      <p>Copyright blah blah</p>\n    </footer>\n  </body>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/feature-detection/modernizr-custom.js",
    "content": "/*! modernizr 3.3.1 (Custom Build) | MIT *\n * https://modernizr.com/download/?-adownload-ambientlight-animation-apng-appearance-applicationcache-atobbtoa-audio-audioloop-audiopreload-backdropfilter-backgroundblendmode-backgroundcliptext-backgroundsize-batteryapi-bdi-beacon-bgpositionshorthand-bgpositionxy-bgrepeatspace_bgrepeatround-bgsizecover-blobconstructor-bloburls-blobworkers-borderimage-borderradius-boxshadow-boxsizing-canvas-canvasblending-canvastext-canvaswinding-capture-checked-classlist-contains-contenteditable-contextmenu-cookies-cors-createelementattrs_createelement_attrs-cryptography-cssall-cssanimations-csscalc-csschunit-csscolumns-cssescape-cssexunit-cssfilters-cssgradients-csshairline-csshyphens_softhyphens_softhyphensfind-cssinvalid-cssmask-csspointerevents-csspositionsticky-csspseudoanimations-csspseudotransitions-cssreflections-cssremunit-cssresize-cssscrollbar-csstransforms-csstransforms3d-csstransitions-cssvalid-cssvhunit-cssvmaxunit-cssvminunit-cssvwunit-cubicbezierrange-customevent-customprotocolhandler-dart-datachannel-datalistelem-dataset-datauri-dataview-dataworkers-details-devicemotion_deviceorientation-directory-display_runin-displaytable-documentfragment-ellipsis-emoji-es5-es5array-es5date-es5function-es5object-es5string-es5syntax-es5undefined-es6array-es6collections-es6math-es6number-es6object-es6string-eventlistener-eventsource-exiforientation-fetch-fileinput-filereader-filesystem-flash-flexbox-flexboxlegacy-flexboxtweener-flexwrap-fontface-forcetouch-formattribute-formvalidation-framed-fullscreen-gamepads-generatedcontent-generators-geolocation-getrandomvalues-getusermedia-hashchange-hidden-hiddenscroll-history-hsla-htmlimports-ie8compat-imgcrossorigin-indexeddb-indexeddbblob-inlinesvg-input-inputformaction-inputformenctype-inputformmethod-inputformtarget-inputtypes-intl-jpeg2000-jpegxr-json-lastchild-ligatures-localizednumber-localstorage-lowbandwidth-lowbattery-matchmedia-mathml-mediaqueries-microdata-multiplebgs-mutationobserver-notification-nthchild-objectfit-olreversed-oninput-opacity-outputelem-overflowscrolling-pagevisibility-peerconnection-performance-picture-placeholder-pointerevents-pointerlock-postmessage-preserve3d-progressbar_meter-promises-proximity-queryselector-quotamanagement-regions-requestanimationframe-requestautocomplete-rgba-ruby-sandbox-scriptasync-scriptdefer-scrollsnappoints-seamless-search-serviceworker-sessionstorage-shapes-sharedworkers-siblinggeneral-sizes-smil-speechrecognition-speechsynthesis-srcdoc-srcset-strictmode-stylescoped-subpixelfont-supports-svg-svgasimg-svgclippaths-svgfilters-svgforeignobject-target-template-templatestrings-textalignlast-textareamaxlength-textshadow-texttrackapi_track-time-todataurljpeg_todataurlpng_todataurlwebp-touchevents-transferables-typedarrays-unicode-unicoderange-unknownelements-urlparser-userdata-userselect-vibrate-video-videoautoplay-videoloop-videopreload-vml-webaudio-webgl-webglextensions-webintents-webp-webpalpha-webpanimation-webplossless_webp_lossless-websockets-websocketsbinary-websqldatabase-webworkers-willchange-wrapflow-xdomainrequest-xhr2-xhrresponsetype-xhrresponsetypearraybuffer-xhrresponsetypeblob-xhrresponsetypedocument-xhrresponsetypejson-xhrresponsetypetext-addtest-atrule-domprefixes-hasevent-mq-prefixed-prefixedcss-prefixedcssvalue-prefixes-setclasses-shiv-testallprops-testprop-teststyles !*/\n!function(window,document,undefined){function is(A,e){return typeof A===e}function testRunner(){var A,e,t,n,r,i,o;for(var d in tests)if(tests.hasOwnProperty(d)){if(A=[],e=tests[d],e.name&&(A.push(e.name.toLowerCase()),e.options&&e.options.aliases&&e.options.aliases.length))for(t=0;t<e.options.aliases.length;t++)A.push(e.options.aliases[t].toLowerCase());for(n=is(e.fn,\"function\")?e.fn():e.fn,r=0;r<A.length;r++)i=A[r],o=i.split(\".\"),1===o.length?Modernizr[o[0]]=n:(!Modernizr[o[0]]||Modernizr[o[0]]instanceof Boolean||(Modernizr[o[0]]=new Boolean(Modernizr[o[0]])),Modernizr[o[0]][o[1]]=n),classes.push((n?\"\":\"no-\")+o.join(\"-\"))}}function setClasses(A){var e=docElement.className,t=Modernizr._config.classPrefix||\"\";if(isSVG&&(e=e.baseVal),Modernizr._config.enableJSClass){var n=new RegExp(\"(^|\\\\s)\"+t+\"no-js(\\\\s|$)\");e=e.replace(n,\"$1\"+t+\"js$2\")}Modernizr._config.enableClasses&&(e+=\" \"+t+A.join(\" \"+t),isSVG?docElement.className.baseVal=e:docElement.className=e)}function addTest(A,e){if(\"object\"==typeof A)for(var t in A)hasOwnProp(A,t)&&addTest(t,A[t]);else{A=A.toLowerCase();var n=A.split(\".\"),r=Modernizr[n[0]];if(2==n.length&&(r=r[n[1]]),\"undefined\"!=typeof r)return Modernizr;e=\"function\"==typeof e?e():e,1==n.length?Modernizr[n[0]]=e:(!Modernizr[n[0]]||Modernizr[n[0]]instanceof Boolean||(Modernizr[n[0]]=new Boolean(Modernizr[n[0]])),Modernizr[n[0]][n[1]]=e),setClasses([(e&&0!=e?\"\":\"no-\")+n.join(\"-\")]),Modernizr._trigger(A,e)}return Modernizr}function createElement(){return\"function\"!=typeof document.createElement?document.createElement(arguments[0]):isSVG?document.createElementNS.call(document,\"http://www.w3.org/2000/svg\",arguments[0]):document.createElement.apply(document,arguments)}function cssToDOM(A){return A.replace(/([a-z])-([a-z])/g,function(A,e,t){return e+t.toUpperCase()}).replace(/^-/,\"\")}function domToCSS(A){return A.replace(/([A-Z])/g,function(A,e){return\"-\"+e.toLowerCase()}).replace(/^ms-/,\"-ms-\")}function getBody(){var A=document.body;return A||(A=createElement(isSVG?\"svg\":\"body\"),A.fake=!0),A}function injectElementWithStyles(A,e,t,n){var r,i,o,d,a=\"modernizr\",s=createElement(\"div\"),l=getBody();if(parseInt(t,10))for(;t--;)o=createElement(\"div\"),o.id=n?n[t]:a+(t+1),s.appendChild(o);return r=createElement(\"style\"),r.type=\"text/css\",r.id=\"s\"+a,(l.fake?l:s).appendChild(r),l.appendChild(s),r.styleSheet?r.styleSheet.cssText=A:r.appendChild(document.createTextNode(A)),s.id=a,l.fake&&(l.style.background=\"\",l.style.overflow=\"hidden\",d=docElement.style.overflow,docElement.style.overflow=\"hidden\",docElement.appendChild(l)),i=e(s,A),l.fake?(l.parentNode.removeChild(l),docElement.style.overflow=d,docElement.offsetHeight):s.parentNode.removeChild(s),!!i}function contains(A,e){return!!~(\"\"+A).indexOf(e)}function roundedEquals(A,e){return A-1===e||A===e||A+1===e}function nativeTestProps(A,e){var t=A.length;if(\"CSS\"in window&&\"supports\"in window.CSS){for(;t--;)if(window.CSS.supports(domToCSS(A[t]),e))return!0;return!1}if(\"CSSSupportsRule\"in window){for(var n=[];t--;)n.push(\"(\"+domToCSS(A[t])+\":\"+e+\")\");return n=n.join(\" or \"),injectElementWithStyles(\"@supports (\"+n+\") { #modernizr { position: absolute; } }\",function(A){return\"absolute\"==getComputedStyle(A,null).position})}return undefined}function testProps(A,e,t,n){function r(){o&&(delete mStyle.style,delete mStyle.modElem)}if(n=is(n,\"undefined\")?!1:n,!is(t,\"undefined\")){var i=nativeTestProps(A,t);if(!is(i,\"undefined\"))return i}for(var o,d,a,s,l,c=[\"modernizr\",\"tspan\",\"samp\"];!mStyle.style&&c.length;)o=!0,mStyle.modElem=createElement(c.shift()),mStyle.style=mStyle.modElem.style;for(a=A.length,d=0;a>d;d++)if(s=A[d],l=mStyle.style[s],contains(s,\"-\")&&(s=cssToDOM(s)),mStyle.style[s]!==undefined){if(n||is(t,\"undefined\"))return r(),\"pfx\"==e?s:!0;try{mStyle.style[s]=t}catch(u){}if(mStyle.style[s]!=l)return r(),\"pfx\"==e?s:!0}return r(),!1}function fnBind(A,e){return function(){return A.apply(e,arguments)}}function testDOMProps(A,e,t){var n;for(var r in A)if(A[r]in e)return t===!1?A[r]:(n=e[A[r]],is(n,\"function\")?fnBind(n,t||e):n);return!1}function testPropsAll(A,e,t,n,r){var i=A.charAt(0).toUpperCase()+A.slice(1),o=(A+\" \"+cssomPrefixes.join(i+\" \")+i).split(\" \");return is(e,\"string\")||is(e,\"undefined\")?testProps(o,e,n,r):(o=(A+\" \"+domPrefixes.join(i+\" \")+i).split(\" \"),testDOMProps(o,e,t))}function testAllProps(A,e,t){return testPropsAll(A,undefined,undefined,e,t)}var classes=[],tests=[],ModernizrProto={_version:\"3.3.1\",_config:{classPrefix:\"\",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(A,e){var t=this;setTimeout(function(){e(t[A])},0)},addTest:function(A,e,t){tests.push({name:A,fn:e,options:t})},addAsyncTest:function(A){tests.push({name:null,fn:A})}},Modernizr=function(){};Modernizr.prototype=ModernizrProto,Modernizr=new Modernizr,Modernizr.addTest(\"applicationcache\",\"applicationCache\"in window),Modernizr.addTest(\"blobconstructor\",function(){try{return!!new Blob}catch(A){return!1}},{aliases:[\"blob-constructor\"]}),Modernizr.addTest(\"cookies\",function(){try{document.cookie=\"cookietest=1\";var A=-1!=document.cookie.indexOf(\"cookietest=\");return document.cookie=\"cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT\",A}catch(e){return!1}}),Modernizr.addTest(\"cors\",\"XMLHttpRequest\"in window&&\"withCredentials\"in new XMLHttpRequest),Modernizr.addTest(\"customprotocolhandler\",function(){if(!navigator.registerProtocolHandler)return!1;try{navigator.registerProtocolHandler(\"thisShouldFail\")}catch(A){return A instanceof TypeError}return!1}),Modernizr.addTest(\"customevent\",\"CustomEvent\"in window&&\"function\"==typeof window.CustomEvent);var prefixes=ModernizrProto._config.usePrefixes?\" -webkit- -moz- -o- -ms- \".split(\" \"):[\"\",\"\"];ModernizrProto._prefixes=prefixes,Modernizr.addTest(\"dataview\",\"undefined\"!=typeof DataView&&\"getFloat64\"in DataView.prototype);var docElement=document.documentElement;Modernizr.addTest(\"contextmenu\",\"contextMenu\"in docElement&&\"HTMLMenuItemElement\"in window);var isSVG=\"svg\"===docElement.nodeName.toLowerCase(),html5;isSVG||!function(A,e){function t(A,e){var t=A.createElement(\"p\"),n=A.getElementsByTagName(\"head\")[0]||A.documentElement;return t.innerHTML=\"x<style>\"+e+\"</style>\",n.insertBefore(t.lastChild,n.firstChild)}function n(){var A=h.elements;return\"string\"==typeof A?A.split(\" \"):A}function r(A,e){var t=h.elements;\"string\"!=typeof t&&(t=t.join(\" \")),\"string\"!=typeof A&&(A=A.join(\" \")),h.elements=t+\" \"+A,s(e)}function i(A){var e=E[A[f]];return e||(e={},g++,A[f]=g,E[g]=e),e}function o(A,t,n){if(t||(t=e),c)return t.createElement(A);n||(n=i(t));var r;return r=n.cache[A]?n.cache[A].cloneNode():m.test(A)?(n.cache[A]=n.createElem(A)).cloneNode():n.createElem(A),!r.canHaveChildren||w.test(A)||r.tagUrn?r:n.frag.appendChild(r)}function d(A,t){if(A||(A=e),c)return A.createDocumentFragment();t=t||i(A);for(var r=t.frag.cloneNode(),o=0,d=n(),a=d.length;a>o;o++)r.createElement(d[o]);return r}function a(A,e){e.cache||(e.cache={},e.createElem=A.createElement,e.createFrag=A.createDocumentFragment,e.frag=e.createFrag()),A.createElement=function(t){return h.shivMethods?o(t,A,e):e.createElem(t)},A.createDocumentFragment=Function(\"h,f\",\"return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&(\"+n().join().replace(/[\\w\\-:]+/g,function(A){return e.createElem(A),e.frag.createElement(A),'c(\"'+A+'\")'})+\");return n}\")(h,e.frag)}function s(A){A||(A=e);var n=i(A);return!h.shivCSS||l||n.hasCSS||(n.hasCSS=!!t(A,\"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}\")),c||a(A,n),A}var l,c,u=\"3.7.3\",p=A.html5||{},w=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,m=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,f=\"_html5shiv\",g=0,E={};!function(){try{var A=e.createElement(\"a\");A.innerHTML=\"<xyz></xyz>\",l=\"hidden\"in A,c=1==A.childNodes.length||function(){e.createElement(\"a\");var A=e.createDocumentFragment();return\"undefined\"==typeof A.cloneNode||\"undefined\"==typeof A.createDocumentFragment||\"undefined\"==typeof A.createElement}()}catch(t){l=!0,c=!0}}();var h={elements:p.elements||\"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video\",version:u,shivCSS:p.shivCSS!==!1,supportsUnknownElements:c,shivMethods:p.shivMethods!==!1,type:\"default\",shivDocument:s,createElement:o,createDocumentFragment:d,addElements:r};A.html5=h,s(e),\"object\"==typeof module&&module.exports&&(module.exports=h)}(\"undefined\"!=typeof window?window:this,document),Modernizr.addTest(\"eventlistener\",\"addEventListener\"in window),Modernizr.addTest(\"geolocation\",\"geolocation\"in navigator),Modernizr.addTest(\"history\",function(){var A=navigator.userAgent;return-1===A.indexOf(\"Android 2.\")&&-1===A.indexOf(\"Android 4.0\")||-1===A.indexOf(\"Mobile Safari\")||-1!==A.indexOf(\"Chrome\")||-1!==A.indexOf(\"Windows Phone\")?window.history&&\"pushState\"in window.history:!1}),Modernizr.addTest(\"ie8compat\",!window.addEventListener&&!!document.documentMode&&7===document.documentMode),Modernizr.addTest(\"json\",\"JSON\"in window&&\"parse\"in JSON&&\"stringify\"in JSON),Modernizr.addTest(\"notification\",function(){if(!window.Notification||!window.Notification.requestPermission)return!1;if(\"granted\"===window.Notification.permission)return!0;try{new window.Notification(\"\")}catch(A){if(\"TypeError\"===A.name)return!1}return!0}),Modernizr.addTest(\"postmessage\",\"postMessage\"in window),Modernizr.addTest(\"queryselector\",\"querySelector\"in document&&\"querySelectorAll\"in document),Modernizr.addTest(\"serviceworker\",\"serviceWorker\"in navigator),Modernizr.addTest(\"svg\",!!document.createElementNS&&!!document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\").createSVGRect),Modernizr.addTest(\"templatestrings\",function(){var supports;try{eval(\"``\"),supports=!0}catch(e){}return!!supports}),Modernizr.addTest(\"typedarrays\",\"ArrayBuffer\"in window);var supports=!1;try{supports=\"WebSocket\"in window&&2===window.WebSocket.CLOSING}catch(e){}Modernizr.addTest(\"websockets\",supports),Modernizr.addTest(\"xdomainrequest\",\"XDomainRequest\"in window),Modernizr.addTest(\"webaudio\",function(){var A=\"webkitAudioContext\"in window,e=\"AudioContext\"in window;return Modernizr._config.usePrefixes?A||e:e}),Modernizr.addTest(\"cssall\",\"all\"in docElement.style);var CSS=window.CSS;Modernizr.addTest(\"cssescape\",CSS?\"function\"==typeof CSS.escape:!1);var newSyntax=\"CSS\"in window&&\"supports\"in window.CSS,oldSyntax=\"supportsCSS\"in window;Modernizr.addTest(\"supports\",newSyntax||oldSyntax),Modernizr.addTest(\"target\",function(){var A=window.document;if(!(\"querySelectorAll\"in A))return!1;try{return A.querySelectorAll(\":target\"),!0}catch(e){return!1}}),Modernizr.addTest(\"willchange\",\"willChange\"in docElement.style),Modernizr.addTest(\"classlist\",\"classList\"in docElement),Modernizr.addTest(\"documentfragment\",function(){return\"createDocumentFragment\"in document&&\"appendChild\"in docElement}),Modernizr.addTest(\"microdata\",\"getItems\"in document),Modernizr.addTest(\"mutationobserver\",!!window.MutationObserver||!!window.WebKitMutationObserver),Modernizr.addTest(\"picture\",\"HTMLPictureElement\"in window),Modernizr.addTest(\"es5array\",function(){return!!(Array.prototype&&Array.prototype.every&&Array.prototype.filter&&Array.prototype.forEach&&Array.prototype.indexOf&&Array.prototype.lastIndexOf&&Array.prototype.map&&Array.prototype.some&&Array.prototype.reduce&&Array.prototype.reduceRight&&Array.isArray)}),Modernizr.addTest(\"es5date\",function(){var A=\"2013-04-12T06:06:37.307Z\",e=!1;try{e=!!Date.parse(A)}catch(t){}return!!(Date.now&&Date.prototype&&Date.prototype.toISOString&&Date.prototype.toJSON&&e)}),Modernizr.addTest(\"es5object\",function(){return!!(Object.keys&&Object.create&&Object.getPrototypeOf&&Object.getOwnPropertyNames&&Object.isSealed&&Object.isFrozen&&Object.isExtensible&&Object.getOwnPropertyDescriptor&&Object.defineProperty&&Object.defineProperties&&Object.seal&&Object.freeze&&Object.preventExtensions)}),Modernizr.addTest(\"es5function\",function(){return!(!Function.prototype||!Function.prototype.bind)}),Modernizr.addTest(\"strictmode\",function(){\"use strict\";return!this}()),Modernizr.addTest(\"es5syntax\",function(){var value,obj,stringAccess,getter,setter,reservedWords,zeroWidthChars;try{return stringAccess=eval('\"foobar\"[3] === \"b\"'),getter=eval(\"({ get x(){ return 1 } }).x === 1\"),eval(\"({ set x(v){ value = v; } }).x = 1\"),setter=1===value,eval(\"obj = ({ if: 1 })\"),reservedWords=1===obj[\"if\"],zeroWidthChars=eval(\"_‌‍ = true\"),stringAccess&&getter&&setter&&reservedWords&&zeroWidthChars}catch(ignore){return!1}}),Modernizr.addTest(\"es5string\",function(){return!(!String.prototype||!String.prototype.trim)}),Modernizr.addTest(\"es5undefined\",function(){var A,e;try{e=window.undefined,window.undefined=12345,A=\"undefined\"==typeof window.undefined,window.undefined=e}catch(t){return!1}return A}),Modernizr.addTest(\"es5\",function(){return!!(Modernizr.es5array&&Modernizr.es5date&&Modernizr.es5function&&Modernizr.es5object&&Modernizr.strictmode&&Modernizr.es5string&&Modernizr.json&&Modernizr.es5syntax&&Modernizr.es5undefined)}),Modernizr.addTest(\"es6array\",!!(Array.prototype&&Array.prototype.copyWithin&&Array.prototype.fill&&Array.prototype.find&&Array.prototype.findIndex&&Array.prototype.keys&&Array.prototype.entries&&Array.prototype.values&&Array.from&&Array.of)),Modernizr.addTest(\"es6collections\",!!(window.Map&&window.Set&&window.WeakMap&&window.WeakSet)),Modernizr.addTest(\"contains\",is(String.prototype.contains,\"function\")),Modernizr.addTest(\"generators\",function(){try{new Function(\"function* test() {}\")()}catch(A){return!1}return!0}),Modernizr.addTest(\"es6math\",!!(Math&&Math.clz32&&Math.cbrt&&Math.imul&&Math.sign&&Math.log10&&Math.log2&&Math.log1p&&Math.expm1&&Math.cosh&&Math.sinh&&Math.tanh&&Math.acosh&&Math.asinh&&Math.atanh&&Math.hypot&&Math.trunc&&Math.fround)),Modernizr.addTest(\"es6number\",!!(Number.isFinite&&Number.isInteger&&Number.isSafeInteger&&Number.isNaN&&Number.parseInt&&Number.parseFloat&&Number.isInteger(Number.MAX_SAFE_INTEGER)&&Number.isInteger(Number.MIN_SAFE_INTEGER)&&Number.isFinite(Number.EPSILON))),Modernizr.addTest(\"es6object\",!!(Object.assign&&Object.is&&Object.setPrototypeOf)),Modernizr.addTest(\"promises\",function(){return\"Promise\"in window&&\"resolve\"in window.Promise&&\"reject\"in window.Promise&&\"all\"in window.Promise&&\"race\"in window.Promise&&function(){var A;return new window.Promise(function(e){A=e}),\"function\"==typeof A}()}),Modernizr.addTest(\"es6string\",!!(String.fromCodePoint&&String.raw&&String.prototype.codePointAt&&String.prototype.repeat&&String.prototype.startsWith&&String.prototype.endsWith&&String.prototype.contains)),Modernizr.addTest(\"devicemotion\",\"DeviceMotionEvent\"in window),Modernizr.addTest(\"deviceorientation\",\"DeviceOrientationEvent\"in window),Modernizr.addTest(\"filereader\",!!(window.File&&window.FileList&&window.FileReader)),Modernizr.addTest(\"beacon\",\"sendBeacon\"in navigator),Modernizr.addTest(\"lowbandwidth\",function(){var A=navigator.connection||{type:0};return 3==A.type||4==A.type||/^[23]g$/.test(A.type)}),Modernizr.addTest(\"eventsource\",\"EventSource\"in window),Modernizr.addTest(\"fetch\",\"fetch\"in window),Modernizr.addTest(\"xhrresponsetype\",function(){if(\"undefined\"==typeof XMLHttpRequest)return!1;var A=new XMLHttpRequest;return A.open(\"get\",\"/\",!0),\"response\"in A}()),Modernizr.addTest(\"xhr2\",\"XMLHttpRequest\"in window&&\"withCredentials\"in new XMLHttpRequest),Modernizr.addTest(\"speechsynthesis\",\"SpeechSynthesisUtterance\"in window),Modernizr.addTest(\"localstorage\",function(){var A=\"modernizr\";try{return localStorage.setItem(A,A),localStorage.removeItem(A),!0}catch(e){return!1}}),Modernizr.addTest(\"sessionstorage\",function(){var A=\"modernizr\";try{return sessionStorage.setItem(A,A),sessionStorage.removeItem(A),!0}catch(e){return!1}}),Modernizr.addTest(\"websqldatabase\",\"openDatabase\"in window),Modernizr.addTest(\"svgfilters\",function(){var A=!1;try{A=\"SVGFEColorMatrixElement\"in window&&2==SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE}catch(e){}return A}),Modernizr.addTest(\"urlparser\",function(){var A;try{return A=new URL(\"http://modernizr.com/\"),\"http://modernizr.com/\"===A.href}catch(e){return!1}}),Modernizr.addTest(\"websocketsbinary\",function(){var A,e=\"https:\"==location.protocol?\"wss\":\"ws\";if(\"WebSocket\"in window){if(A=\"binaryType\"in WebSocket.prototype)return A;try{return!!new WebSocket(e+\"://.\").binaryType}catch(t){}}return!1}),Modernizr.addTest(\"atobbtoa\",\"atob\"in window&&\"btoa\"in window,{aliases:[\"atob-btoa\"]}),Modernizr.addTest(\"framed\",window.location!=top.location),Modernizr.addTest(\"sharedworkers\",\"SharedWorker\"in window),Modernizr.addTest(\"webworkers\",\"Worker\"in window);var omPrefixes=\"Moz O ms Webkit\",domPrefixes=ModernizrProto._config.usePrefixes?omPrefixes.toLowerCase().split(\" \"):[];ModernizrProto._domPrefixes=domPrefixes;var hasOwnProp;!function(){var A={}.hasOwnProperty;hasOwnProp=is(A,\"undefined\")||is(A.call,\"undefined\")?function(A,e){return e in A&&is(A.constructor.prototype[e],\"undefined\")}:function(e,t){return A.call(e,t)}}(),ModernizrProto._l={},ModernizrProto.on=function(A,e){this._l[A]||(this._l[A]=[]),this._l[A].push(e),Modernizr.hasOwnProperty(A)&&setTimeout(function(){Modernizr._trigger(A,Modernizr[A])},0)},ModernizrProto._trigger=function(A,e){if(this._l[A]){var t=this._l[A];setTimeout(function(){var A,n;for(A=0;A<t.length;A++)(n=t[A])(e)},0),delete this._l[A]}},Modernizr._q.push(function(){ModernizrProto.addTest=addTest}),Modernizr.addAsyncTest(function(){var A=new Image;A.onerror=function(){addTest(\"exiforientation\",!1,{aliases:[\"exif-orientation\"]})},A.onload=function(){addTest(\"exiforientation\",2!==A.width,{aliases:[\"exif-orientation\"]})},A.src=\"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAASUkqAAgAAAABABIBAwABAAAABgASAAAAAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAABAAIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+/iiiigD/2Q==\"}),Modernizr.addAsyncTest(function(){function A(){clearTimeout(e),window.removeEventListener(\"deviceproximity\",A),addTest(\"proximity\",!0)}var e,t=300;\"ondeviceproximity\"in window&&\"onuserproximity\"in window?(window.addEventListener(\"deviceproximity\",A),e=setTimeout(function(){window.removeEventListener(\"deviceproximity\",A),addTest(\"proximity\",!1)},t)):addTest(\"proximity\",!1)}),Modernizr.addAsyncTest(function(){var A=new Image;A.onload=A.onerror=function(){addTest(\"jpeg2000\",1==A.width)},A.src=\"data:image/jp2;base64,/0//UQAyAAAAAAABAAAAAgAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAEBwEBBwEBBwEBBwEB/1IADAAAAAEAAAQEAAH/XAAEQED/ZAAlAAFDcmVhdGVkIGJ5IE9wZW5KUEVHIHZlcnNpb24gMi4wLjD/kAAKAAAAAABYAAH/UwAJAQAABAQAAf9dAAUBQED/UwAJAgAABAQAAf9dAAUCQED/UwAJAwAABAQAAf9dAAUDQED/k8+kEAGvz6QQAa/PpBABr994EAk//9k=\"}),Modernizr.addAsyncTest(function(){var A=new Image;A.onload=A.onerror=function(){addTest(\"jpegxr\",1==A.width,{aliases:[\"jpeg-xr\"]})},A.src=\"data:image/vnd.ms-photo;base64,SUm8AQgAAAAFAAG8AQAQAAAASgAAAIC8BAABAAAAAQAAAIG8BAABAAAAAQAAAMC8BAABAAAAWgAAAMG8BAABAAAAHwAAAAAAAAAkw91vA07+S7GFPXd2jckNV01QSE9UTwAZAYBxAAAAABP/gAAEb/8AAQAAAQAAAA==\"}),Modernizr.addAsyncTest(function(){var A=new Image;A.onerror=function(){addTest(\"webpalpha\",!1,{aliases:[\"webp-alpha\"]})},A.onload=function(){addTest(\"webpalpha\",1==A.width,{aliases:[\"webp-alpha\"]})},A.src=\"data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAABBxAR/Q9ERP8DAABWUDggGAAAADABAJ0BKgEAAQADADQlpAADcAD++/1QAA==\"}),Modernizr.addAsyncTest(function(){var A=new Image;A.onerror=function(){addTest(\"webpanimation\",!1,{aliases:[\"webp-animation\"]})},A.onload=function(){addTest(\"webpanimation\",1==A.width,{aliases:[\"webp-animation\"]})},A.src=\"data:image/webp;base64,UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/////AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA\"}),Modernizr.addAsyncTest(function(){var A=new Image;A.onerror=function(){addTest(\"webplossless\",!1,{aliases:[\"webp-lossless\"]})},A.onload=function(){addTest(\"webplossless\",1==A.width,{aliases:[\"webp-lossless\"]})},A.src=\"data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAAAAAAfQ//73v/+BiOh/AAA=\"}),Modernizr.addAsyncTest(function(){function A(A,e,t){function n(e){var n=e&&\"load\"===e.type?1==r.width:!1,i=\"webp\"===A;addTest(A,i?new Boolean(n):n),t&&t(e)}var r=new Image;r.onerror=n,r.onload=n,r.src=e}var e=[{uri:\"data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAAwAQCdASoBAAEAAwA0JaQAA3AA/vuUAAA=\",name:\"webp\"},{uri:\"data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAABBxAR/Q9ERP8DAABWUDggGAAAADABAJ0BKgEAAQADADQlpAADcAD++/1QAA==\",name:\"webp.alpha\"},{uri:\"data:image/webp;base64,UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/////AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA\",name:\"webp.animation\"},{uri:\"data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAAAAAAfQ//73v/+BiOh/AAA=\",name:\"webp.lossless\"}],t=e.shift();A(t.name,t.uri,function(t){if(t&&\"load\"===t.type)for(var n=0;n<e.length;n++)A(e[n].name,e[n].uri)})}),Modernizr.addTest(\"svgasimg\",document.implementation.hasFeature(\"http://www.w3.org/TR/SVG11/feature#Image\",\"1.1\")),Modernizr.addAsyncTest(function(){function A(){var A=new Image;A.onerror=function(){addTest(\"datauri\",!0),Modernizr.datauri=new Boolean(!0),Modernizr.datauri.over32kb=!1},A.onload=function(){addTest(\"datauri\",!0),Modernizr.datauri=new Boolean(!0),Modernizr.datauri.over32kb=1==A.width&&1==A.height};for(var e=\"R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==\";e.length<33e3;)e=\"\\r\\n\"+e;A.src=\"data:image/gif;base64,\"+e}-1!==navigator.userAgent.indexOf(\"MSIE 7.\")&&setTimeout(function(){addTest(\"datauri\",!1)},10);var e=new Image;e.onerror=function(){addTest(\"datauri\",!1)},e.onload=function(){1==e.width&&1==e.height?A():addTest(\"datauri\",!1)},e.src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==\"}),Modernizr.addAsyncTest(function(){function A(){addTest(\"blobworkers\",!1),e()}function e(){d&&n.revokeObjectURL(d),o&&o.terminate(),a&&clearTimeout(a)}try{var t=window.BlobBuilder,n=window.URL;Modernizr._config.usePrefix&&(t=t||window.MozBlobBuilder||window.WebKitBlobBuilder||window.MSBlobBuilder||window.OBlobBuilder,n=n||window.MozURL||window.webkitURL||window.MSURL||window.OURL);var r,i,o,d,a,s=\"Modernizr\",l=\"this.onmessage=function(e){postMessage(e.data)}\";try{r=new Blob([l],{type:\"text/javascript\"})}catch(c){}r||(i=new t,i.append(l),r=i.getBlob()),d=n.createObjectURL(r),o=new Worker(d),o.onmessage=function(A){addTest(\"blobworkers\",s===A.data),e()},o.onerror=A,a=setTimeout(A,200),o.postMessage(s)}catch(c){A()}}),Modernizr.addAsyncTest(function(){try{var A=\"Modernizr\",e=new Worker(\"data:text/javascript;base64,dGhpcy5vbm1lc3NhZ2U9ZnVuY3Rpb24oZSl7cG9zdE1lc3NhZ2UoZS5kYXRhKX0=\");e.onmessage=function(t){e.terminate(),addTest(\"dataworkers\",A===t.data),e=null},e.onerror=function(){addTest(\"dataworkers\",!1),e=null},setTimeout(function(){addTest(\"dataworkers\",!1)},200),e.postMessage(A)}catch(t){setTimeout(function(){addTest(\"dataworkers\",!1)},0)}});var cssomPrefixes=ModernizrProto._config.usePrefixes?omPrefixes.split(\" \"):[];ModernizrProto._cssomPrefixes=cssomPrefixes;var atRule=function(A){var e,t=prefixes.length,n=window.CSSRule;if(\"undefined\"==typeof n)return undefined;if(!A)return!1;if(A=A.replace(/^@/,\"\"),e=A.replace(/-/g,\"_\").toUpperCase()+\"_RULE\",e in n)return\"@\"+A;for(var r=0;t>r;r++){var i=prefixes[r],o=i.toUpperCase()+\"_\"+e;if(o in n)return\"@-\"+i.toLowerCase()+\"-\"+A}return!1};ModernizrProto.atRule=atRule;var hasEvent=function(){function A(A,t){var n;return A?(t&&\"string\"!=typeof t||(t=createElement(t||\"div\")),A=\"on\"+A,n=A in t,!n&&e&&(t.setAttribute||(t=createElement(\"div\")),t.setAttribute(A,\"\"),n=\"function\"==typeof t[A],t[A]!==undefined&&(t[A]=undefined),t.removeAttribute(A)),n):!1}var e=!(\"onblur\"in document.documentElement);return A}();ModernizrProto.hasEvent=hasEvent,Modernizr.addTest(\"ambientlight\",hasEvent(\"devicelight\",window)),Modernizr.addTest(\"hashchange\",function(){return hasEvent(\"hashchange\",window)===!1?!1:document.documentMode===undefined||document.documentMode>7}),Modernizr.addTest(\"inputsearchevent\",hasEvent(\"search\")),Modernizr.addTest(\"pointerevents\",function(){var A=!1,e=domPrefixes.length;for(A=Modernizr.hasEvent(\"pointerdown\");e--&&!A;)hasEvent(domPrefixes[e]+\"pointerdown\")&&(A=!0);return A});var prefixedCSSValue=function(A,e){var t=!1,n=createElement(\"div\"),r=n.style;if(A in r){var i=domPrefixes.length;for(r[A]=e,t=r[A];i--&&!t;)r[A]=\"-\"+domPrefixes[i]+\"-\"+e,t=r[A]}return\"\"===t&&(t=!1),t};ModernizrProto.prefixedCSSValue=prefixedCSSValue,Modernizr.addTest(\"audio\",function(){var A=createElement(\"audio\"),e=!1;try{(e=!!A.canPlayType)&&(e=new Boolean(e),e.ogg=A.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/,\"\"),e.mp3=A.canPlayType('audio/mpeg; codecs=\"mp3\"').replace(/^no$/,\"\"),e.opus=A.canPlayType('audio/ogg; codecs=\"opus\"')||A.canPlayType('audio/webm; codecs=\"opus\"').replace(/^no$/,\"\"),e.wav=A.canPlayType('audio/wav; codecs=\"1\"').replace(/^no$/,\"\"),e.m4a=(A.canPlayType(\"audio/x-m4a;\")||A.canPlayType(\"audio/aac;\")).replace(/^no$/,\"\"))}catch(t){}return e}),Modernizr.addTest(\"canvas\",function(){var A=createElement(\"canvas\");return!(!A.getContext||!A.getContext(\"2d\"))}),Modernizr.addTest(\"canvastext\",function(){return Modernizr.canvas===!1?!1:\"function\"==typeof createElement(\"canvas\").getContext(\"2d\").fillText}),Modernizr.addTest(\"contenteditable\",function(){if(\"contentEditable\"in docElement){var A=createElement(\"div\");return A.contentEditable=!0,\"true\"===A.contentEditable}}),Modernizr.addTest(\"emoji\",function(){if(!Modernizr.canvastext)return!1;var A=window.devicePixelRatio||1,e=12*A,t=createElement(\"canvas\"),n=t.getContext(\"2d\");return n.fillStyle=\"#f00\",n.textBaseline=\"top\",n.font=\"32px Arial\",n.fillText(\"🐨\",0,0),0!==n.getImageData(e,e,1,1).data[0]}),addTest(\"htmlimports\",\"import\"in createElement(\"link\")),Modernizr.addTest(\"olreversed\",\"reversed\"in createElement(\"ol\")),Modernizr.addTest(\"userdata\",!!createElement(\"div\").addBehavior),Modernizr.addTest(\"video\",function(){var A=createElement(\"video\"),e=!1;try{(e=!!A.canPlayType)&&(e=new Boolean(e),e.ogg=A.canPlayType('video/ogg; codecs=\"theora\"').replace(/^no$/,\"\"),e.h264=A.canPlayType('video/mp4; codecs=\"avc1.42E01E\"').replace(/^no$/,\"\"),e.webm=A.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/^no$/,\"\"),e.vp9=A.canPlayType('video/webm; codecs=\"vp9\"').replace(/^no$/,\"\"),e.hls=A.canPlayType('application/x-mpegURL; codecs=\"avc1.42E01E\"').replace(/^no$/,\"\"))}catch(t){}return e}),Modernizr.addTest(\"vml\",function(){var A,e=createElement(\"div\"),t=!1;return isSVG||(e.innerHTML='<v:shape id=\"vml_flag1\" adj=\"1\" />',A=e.firstChild,\"style\"in A&&(A.style.behavior=\"url(#default#VML)\"),t=A?\"object\"==typeof A.adj:!0),t}),Modernizr.addTest(\"webanimations\",\"animate\"in createElement(\"div\")),Modernizr.addTest(\"webgl\",function(){var A=createElement(\"canvas\"),e=\"probablySupportsContext\"in A?\"probablySupportsContext\":\"supportsContext\";return e in A?A[e](\"webgl\")||A[e](\"experimental-webgl\"):\"WebGLRenderingContext\"in window}),Modernizr.addTest(\"audioloop\",\"loop\"in createElement(\"audio\")),Modernizr.addTest(\"adownload\",!window.externalHost&&\"download\"in createElement(\"a\")),Modernizr.addAsyncTest(function(){function A(t){clearTimeout(e);var r=t!==undefined&&\"loadeddata\"===t.type?!0:!1;n.removeEventListener(\"loadeddata\",A,!1),addTest(\"audiopreload\",r),n.parentNode.removeChild(n)}var e,t=300,n=createElement(\"audio\"),r=n.style;if(!(Modernizr.audio&&\"preload\"in n))return void addTest(\"audiopreload\",!1);r.position=\"absolute\",r.height=0,r.width=0;try{if(Modernizr.audio.mp3)n.src=\"data:audio/mpeg;base64,//MUxAAB6AXgAAAAAPP+c6nf//yi/6f3//MUxAMAAAIAAAjEcH//0fTX6C9Lf//0//MUxA4BeAIAAAAAAKX2/6zv//+IlR4f//MUxBMCMAH8AAAAABYWalVMQU1FMy45//MUxBUB0AH0AAAAADkuM1VVVVVVVVVV//MUxBgBUATowAAAAFVVVVVVVVVVVVVV\";else if(Modernizr.audio.m4a)n.src=\"data:audio/x-m4a;base64,AAAAGGZ0eXBNNEEgAAACAGlzb21pc28yAAAACGZyZWUAAAAfbWRhdN4EAABsaWJmYWFjIDEuMjgAAAFoAQBHAAACiG1vb3YAAABsbXZoZAAAAAB8JbCAfCWwgAAAA+gAAAAYAAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAG0dHJhawAAAFx0a2hkAAAAD3wlsIB8JbCAAAAAAQAAAAAAAAAYAAAAAAAAAAAAAAAAAQAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAABUG1kaWEAAAAgbWRoZAAAAAB8JbCAfCWwgAAArEQAAAQAVcQAAAAAAC1oZGxyAAAAAAAAAABzb3VuAAAAAAAAAAAAAAAAU291bmRIYW5kbGVyAAAAAPttaW5mAAAAEHNtaGQAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAL9zdGJsAAAAW3N0c2QAAAAAAAAAAQAAAEttcDRhAAAAAAAAAAEAAAAAAAAAAAACABAAAAAArEQAAAAAACdlc2RzAAAAAAMZAAEABBFAFQAAAAABftAAAAAABQISCAYBAgAAABhzdHRzAAAAAAAAAAEAAAABAAAEAAAAABxzdHNjAAAAAAAAAAEAAAABAAAAAQAAAAEAAAAUc3RzegAAAAAAAAAXAAAAAQAAABRzdGNvAAAAAAAAAAEAAAAoAAAAYHVkdGEAAABYbWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAraWxzdAAAACOpdG9vAAAAG2RhdGEAAAABAAAAAExhdmY1Mi42NC4y\";else if(Modernizr.audio.ogg)n.src=\"data:audio/ogg;base64,T2dnUwACAAAAAAAAAAD/QwAAAAAAAM2LVKsBHgF2b3JiaXMAAAAAAUSsAAAAAAAAgLsAAAAAAAC4AU9nZ1MAAAAAAAAAAAAA/0MAAAEAAADmvOe6Dy3/////////////////MgN2b3JiaXMdAAAAWGlwaC5PcmcgbGliVm9yYmlzIEkgMjAwNzA2MjIAAAAAAQV2b3JiaXMfQkNWAQAAAQAYY1QpRplS0kqJGXOUMUaZYpJKiaWEFkJInXMUU6k515xrrLm1IIQQGlNQKQWZUo5SaRljkCkFmVIQS0kldBI6J51jEFtJwdaYa4tBthyEDZpSTCnElFKKQggZU4wpxZRSSkIHJXQOOuYcU45KKEG4nHOrtZaWY4updJJK5yRkTEJIKYWSSgelU05CSDWW1lIpHXNSUmpB6CCEEEK2IIQNgtCQVQAAAQDAQBAasgoAUAAAEIqhGIoChIasAgAyAAAEoCiO4iiOIzmSY0kWEBqyCgAAAgAQAADAcBRJkRTJsSRL0ixL00RRVX3VNlVV9nVd13Vd13UgNGQVAAABAEBIp5mlGiDCDGQYCA1ZBQAgAAAARijCEANCQ1YBAAABAABiKDmIJrTmfHOOg2Y5aCrF5nRwItXmSW4q5uacc845J5tzxjjnnHOKcmYxaCa05pxzEoNmKWgmtOacc57E5kFrqrTmnHPGOaeDcUYY55xzmrTmQWo21uaccxa0pjlqLsXmnHMi5eZJbS7V5pxzzjnnnHPOOeecc6oXp3NwTjjnnHOi9uZabkIX55xzPhmne3NCOOecc84555xzzjnnnHOC0JBVAAAQAABBGDaGcacgSJ+jgRhFiGnIpAfdo8MkaAxyCqlHo6ORUuoglFTGSSmdIDRkFQAACAAAIYQUUkghhRRSSCGFFFKIIYYYYsgpp5yCCiqppKKKMsoss8wyyyyzzDLrsLPOOuwwxBBDDK20EktNtdVYY62555xrDtJaaa211koppZRSSikIDVkFAIAAABAIGWSQQUYhhRRSiCGmnHLKKaigAkJDVgEAgAAAAgAAADzJc0RHdERHdERHdERHdETHczxHlERJlERJtEzL1ExPFVXVlV1b1mXd9m1hF3bd93Xf93Xj14VhWZZlWZZlWZZlWZZlWZZlWYLQkFUAAAgAAIAQQgghhRRSSCGlGGPMMeegk1BCIDRkFQAACAAgAAAAwFEcxXEkR3IkyZIsSZM0S7M8zdM8TfREURRN01RFV3RF3bRF2ZRN13RN2XRVWbVdWbZt2dZtX5Zt3/d93/d93/d93/d93/d1HQgNWQUASAAA6EiOpEiKpEiO4ziSJAGhIasAABkAAAEAKIqjOI7jSJIkSZakSZ7lWaJmaqZneqqoAqEhqwAAQAAAAQAAAAAAKJriKabiKaLiOaIjSqJlWqKmaq4om7Lruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7rui4QGrIKAJAAANCRHMmRHEmRFEmRHMkBQkNWAQAyAAACAHAMx5AUybEsS9M8zdM8TfRET/RMTxVd0QVCQ1YBAIAAAAIAAAAAADAkw1IsR3M0SZRUS7VUTbVUSxVVT1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTVN0zRNIDRkJQAABADAYo3B5SAhJSXl3hDCEJOeMSYhtV4hBJGS3jEGFYOeMqIMct5C4xCDHggNWREARAEAAMYgxxBzyDlHqZMSOeeodJQa5xyljlJnKcWYYs0oldhSrI1zjlJHraOUYiwtdpRSjanGAgAAAhwAAAIshEJDVgQAUQAAhDFIKaQUYow5p5xDjCnnmHOGMeYcc44556B0UirnnHROSsQYc445p5xzUjonlXNOSiehAACAAAcAgAALodCQFQFAnACAQZI8T/I0UZQ0TxRFU3RdUTRd1/I81fRMU1U90VRVU1Vt2VRVWZY8zzQ901RVzzRV1VRVWTZVVZZFVdVt03V123RV3ZZt2/ddWxZ2UVVt3VRd2zdV1/Zd2fZ9WdZ1Y/I8VfVM03U903Rl1XVtW3VdXfdMU5ZN15Vl03Vt25VlXXdl2fc103Rd01Vl2XRd2XZlV7ddWfZ903WF35VlX1dlWRh2XfeFW9eV5XRd3VdlVzdWWfZ9W9eF4dZ1YZk8T1U903RdzzRdV3VdX1dd19Y105Rl03Vt2VRdWXZl2fddV9Z1zzRl2XRd2zZdV5ZdWfZ9V5Z13XRdX1dlWfhVV/Z1WdeV4dZt4Tdd1/dVWfaFV5Z14dZ1Ybl1XRg+VfV9U3aF4XRl39eF31luXTiW0XV9YZVt4VhlWTl+4ViW3feVZXRdX1ht2RhWWRaGX/id5fZ943h1XRlu3efMuu8Mx++k+8rT1W1jmX3dWWZfd47hGDq/8OOpqq+brisMpywLv+3rxrP7vrKMruv7qiwLvyrbwrHrvvP8vrAso+z6wmrLwrDatjHcvm4sv3Acy2vryjHrvlG2dXxfeArD83R1XXlmXcf2dXTjRzh+ygAAgAEHAIAAE8pAoSErAoA4AQCPJImiZFmiKFmWKIqm6LqiaLqupGmmqWmeaVqaZ5qmaaqyKZquLGmaaVqeZpqap5mmaJqua5qmrIqmKcumasqyaZqy7LqybbuubNuiacqyaZqybJqmLLuyq9uu7Oq6pFmmqXmeaWqeZ5qmasqyaZquq3meanqeaKqeKKqqaqqqraqqLFueZ5qa6KmmJ4qqaqqmrZqqKsumqtqyaaq2bKqqbbuq7Pqybeu6aaqybaqmLZuqatuu7OqyLNu6L2maaWqeZ5qa55mmaZqybJqqK1uep5qeKKqq5ommaqqqLJumqsqW55mqJ4qq6omea5qqKsumatqqaZq2bKqqLZumKsuubfu+68qybqqqbJuqauumasqybMu+78qq7oqmKcumqtqyaaqyLduy78uyrPuiacqyaaqybaqqLsuybRuzbPu6aJqybaqmLZuqKtuyLfu6LNu678qub6uqrOuyLfu67vqucOu6MLyybPuqrPq6K9u6b+sy2/Z9RNOUZVM1bdtUVVl2Zdn2Zdv2fdE0bVtVVVs2TdW2ZVn2fVm2bWE0Tdk2VVXWTdW0bVmWbWG2ZeF2Zdm3ZVv2ddeVdV/XfePXZd3murLty7Kt+6qr+rbu+8Jw667wCgAAGHAAAAgwoQwUGrISAIgCAACMYYwxCI1SzjkHoVHKOecgZM5BCCGVzDkIIZSSOQehlJQy5yCUklIIoZSUWgshlJRSawUAABQ4AAAE2KApsThAoSErAYBUAACD41iW55miatqyY0meJ4qqqaq27UiW54miaaqqbVueJ4qmqaqu6+ua54miaaqq6+q6aJqmqaqu67q6Lpqiqaqq67qyrpumqqquK7uy7Oumqqqq68quLPvCqrquK8uybevCsKqu68qybNu2b9y6ruu+7/vCka3rui78wjEMRwEA4AkOAEAFNqyOcFI0FlhoyEoAIAMAgDAGIYMQQgYhhJBSSiGllBIAADDgAAAQYEIZKDRkRQAQJwAAGEMppJRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkgppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkqppJRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoplVJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSCgCQinAAkHowoQwUGrISAEgFAACMUUopxpyDEDHmGGPQSSgpYsw5xhyUklLlHIQQUmktt8o5CCGk1FJtmXNSWosx5hgz56SkFFvNOYdSUoux5ppr7qS0VmuuNedaWqs115xzzbm0FmuuOdecc8sx15xzzjnnGHPOOeecc84FAOA0OACAHtiwOsJJ0VhgoSErAYBUAAACGaUYc8456BBSjDnnHIQQIoUYc845CCFUjDnnHHQQQqgYc8w5CCGEkDnnHIQQQgghcw466CCEEEIHHYQQQgihlM5BCCGEEEooIYQQQgghhBA6CCGEEEIIIYQQQgghhFJKCCGEEEIJoZRQAABggQMAQIANqyOcFI0FFhqyEgAAAgCAHJagUs6EQY5Bjw1BylEzDUJMOdGZYk5qMxVTkDkQnXQSGWpB2V4yCwAAgCAAIMAEEBggKPhCCIgxAABBiMwQCYVVsMCgDBoc5gHAA0SERACQmKBIu7iALgNc0MVdB0IIQhCCWBxAAQk4OOGGJ97whBucoFNU6iAAAAAAAAwA4AEA4KAAIiKaq7C4wMjQ2ODo8AgAAAAAABYA+AAAOD6AiIjmKiwuMDI0Njg6PAIAAAAAAAAAAICAgAAAAAAAQAAAAICAT2dnUwAE7AwAAAAAAAD/QwAAAgAAADuydfsFAQEBAQEACg4ODg==\";else{\nif(!Modernizr.audio.wav)return void addTest(\"audiopreload\",!1);n.src=\"data:audio/wav;base64,UklGRvwZAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YdgZAAAAAAEA/v8CAP//AAABAP////8DAPz/BAD9/wEAAAAAAAAAAAABAP7/AgD//wAAAQD//wAAAQD//wAAAQD+/wIA//8AAAAAAAD//wIA/v8BAAAA//8BAAAA//8BAP//AQAAAP//AQD//wEAAAD//wEA//8BAP//AQD//wEA//8BAP//AQD+/wMA/f8DAP3/AgD+/wIA/////wMA/f8CAP7/AgD+/wMA/f8CAP7/AgD//wAAAAAAAAAAAQD+/wIA/v8CAP7/AwD9/wIA/v8BAAEA/v8CAP7/AQAAAAAAAAD//wEAAAD//wIA/f8DAP7/AQD//wEAAAD//wEA//8CAP7/AQD//wIA/v8CAP7/AQAAAAAAAAD//wEAAAAAAAAA//8BAP//AgD9/wQA+/8FAPz/AgAAAP//AgD+/wEAAAD//wIA/v8CAP3/BAD8/wQA/P8DAP7/AwD8/wQA/P8DAP7/AQAAAAAA//8BAP//AgD+/wEAAAD//wIA/v8BAP//AQD//wEAAAD//wEA//8BAAAAAAAAAP//AgD+/wEAAAAAAAAAAAD//wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AgD+/wIA/v8BAP//AQABAP7/AQD//wIA/v8CAP3/AwD/////AgD9/wMA/v8BAP//AQAAAP//AQD//wEA//8BAP//AAABAP//AAABAP//AQD//wAAAAACAP3/AwD9/wIA//8BAP//AQD//wEA//8BAP//AgD9/wMA/v8AAAIA/f8CAAAA/v8EAPv/BAD9/wIAAAD+/wQA+v8HAPr/BAD+/wEAAAD//wIA/f8EAPz/BAD7/wUA/P8EAPz/AwD+/wEAAAD//wEAAAAAAP//AgD8/wUA+/8FAPz/AwD9/wIA//8AAAEA/v8CAP//AQD//wAAAAABAP//AgD9/wMA/f8EAPz/AwD+/wAAAwD7/wUA/P8DAP7/AQAAAP//AgD+/wEAAQD+/wIA/v8BAAEA/v8CAP7/AQAAAP//AgD9/wMA/f8DAP7/AgD+/wEAAAAAAAEA//8AAAEA/v8DAP3/AgD//wEA//8BAP7/AwD9/wMA/v8BAP//AQAAAP//AgD9/wMA/v8BAP//AQAAAP//AgD+/wEAAQD+/wIA/////wIA//8AAAEA/f8DAP//AAABAP////8DAP3/AwD+/wEA//8BAP//AQAAAAAA//8BAP//AQD//wEA//8BAP//AAAAAAEA//8BAP7/AgD//wEA//8AAAAAAAAAAAAAAAD//wIA/v8BAAAA//8BAAEA/v8BAAAA//8DAPz/AwD+/wIA/v8CAP3/AwD+/wEAAAD//wEA//8BAAAA//8BAAAA/v8EAPv/BAD+/wAAAAABAP7/AgD//wAAAAABAP7/AgD//wAAAAAAAAAAAAABAP3/BAD8/wQA/f8BAAAAAAABAP7/AgD+/wIA/v8CAP7/AgD+/wIA/v8BAAAAAAD//wIA/f8DAP7/AAABAP//AAACAPz/BAD9/wIA//8AAP//AwD9/wMA/P8EAP3/AwD9/wIA//8BAP//AQD+/wMA/f8DAP7/AAABAP//AQAAAP//AQD//wIA/f8DAP7/AQAAAP//AQAAAAAA//8CAP7/AQABAP7/AgD+/wEAAQD+/wIA/v8CAP////8CAP7/AgD//wAAAAABAP7/AwD9/wIAAAD+/wMA/f8CAP//AQD+/wMA/f8CAP//AAACAPz/BQD6/wUA/v///wIA/v8CAP3/BAD7/wYA+v8FAPz/AwD/////AgD+/wEAAAD//wEAAAD//wIA/f8DAP7/AQAAAP//AgD//wAA//8BAAAAAAAAAP//AQD//wEA//8AAAIA/f8DAP3/AgAAAP//AQD//wEA//8AAAEA//8BAP////8CAP//AAABAP3/BAD9/wIA/v8BAAEA//8BAP7/AgD//wEA//8AAAEA//8BAP//AAAAAAEA//8BAP7/AgD//wEA//8AAAAAAQD+/wIA/v8BAAAAAAD//wIA/v8BAAAAAAAAAAAAAQD+/wMA/f8CAP//AQD//wIA/f8DAP7/AQD//wEA//8CAP7/AAABAP7/AwD9/wMA/v8AAAEA//8BAAAAAAD//wIA/v8BAAAA//8CAP7/AgD+/wEA//8CAP7/AgD//wAAAAAAAAAAAQD//wEA/v8DAPz/BQD8/wIA//8AAAEAAAD//wEA//8BAP//AQAAAAAA//8BAP//AgD+/wEAAAAAAP//AQD+/wMA/////wEA/v8CAP//AQD//wEA//8AAAEA//8BAAAA/v8EAPz/AwD+/wEAAAAAAAAA//8CAP7/AQD//wEA//8BAP//AAABAP7/AwD9/wIA//8BAP//AQD//wEA//8AAAEA/v8EAPv/BAD9/wIA//8BAP7/AwD9/wIA//8AAAEA//8BAP//AQD//wAAAQD//wEAAAD+/wMA/v8AAAIA/f8DAP7/AQD//wAAAQD+/wMA/f8CAP//AAABAP7/AgD+/wMA/f8CAP7/AQABAP7/AgD+/wIA/v8CAP7/AwD8/wMA//8AAAEA//8AAAAAAAABAP//AQD//wAAAQD//wIA/f8DAP3/AwD+/wAAAgD9/wIA//8AAAEAAAD+/wMA/P8FAPv/BAD9/wIA//8AAP//AgD+/wIA/v8BAAAAAAD//wEAAAAAAP//AQD//wEA//8BAP//AAABAP7/AwD9/wIA//8BAP//AAABAP//AQD//wAAAQD//wEA//8BAP//AAABAAAA//8BAP7/AwD9/wMA/f8DAP3/AgD//wEA//8BAP7/AgD//wAAAgD8/wQA/f8CAP//AQD+/wMA/f8CAP7/AgD//wAAAAAAAAAAAAABAP7/AwD9/wIA/v8DAP3/AwD9/wIA/v8DAPz/BQD7/wQA/f8CAP7/AwD9/wMA/f8CAP//AQAAAP7/AwD+/wEA//8AAAEAAAAAAP//AAABAP//AQAAAP7/AwD9/wMA/f8CAP//AQD//wEA//8AAAIA/f8CAAAA//8BAAAA//8BAAAA/v8EAPv/BAD9/wIA//8AAAEA/v8CAP//AAABAP//AAABAP//AAABAP7/AwD8/wQA/f8CAAAA/v8DAP3/AwD9/wMA/v8BAAAA//8BAAAA//8CAP7/AQAAAAAAAAAAAAAA//8CAP7/AgD+/wIA/v8CAP7/AgD//wAAAQD//wAAAQD//wAAAQD//wAAAQD+/wIA//8AAAAAAQD+/wMA/f8CAP//AQD//wEA//8AAAEA/v8DAP3/AgD//wAAAAABAP7/AwD9/wIA//8AAAEA/v8DAP3/AgD//wAAAAABAP7/AwD8/wMA/v8CAP//AAD//wIA/v8CAP7/AQABAP7/AQAAAP//AgD/////AQD//wEAAAD//wEA/v8EAPv/BAD9/wMA/v8BAAAA//8BAAEA/P8GAPr/BQD8/wMA/v8BAAAA//8CAP7/AQABAP3/BAD7/wYA+/8EAPz/AwD//wEA//8BAP7/BAD8/wMA/v8AAAIA/v8BAAAA//8BAAAA//8BAAAA//8CAP3/AwD+/wAAAgD8/wUA/P8DAP7/AAABAAAAAAD//wEAAAD//wIA/f8DAP7/AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA/f8EAPz/AwD/////AgD+/wIA/f8DAP7/AgD+/wEA//8CAP7/AQD//wEAAAAAAP//AQAAAP//AgD9/wMA/v8BAAAA//8BAP//AQAAAP//AAACAP3/BAD7/wQA/v8BAAAA//8BAP//AQAAAP//AQAAAP7/BAD7/wUA+/8EAP3/AgD//wAAAQD+/wIA//8AAAEA/v8CAP//AQD+/wEAAAAAAAAAAAD//wEA//8CAP3/AwD9/wIA//8AAAAAAAAAAAAA//8BAP//AgD+/wEA//8CAP7/AQAAAP//AgD/////AgD/////AgD+/wIA//8AAP//AQABAP7/AgD9/wMA/v8CAP////8BAAAAAAAAAAAA//8CAP////8DAPz/AwD+/wEAAAAAAP//AQD//wEAAAD//wEAAAD+/wQA+/8FAPz/AgAAAP//AgD9/wMA/v8BAAAAAAD//wEAAAD//wIA/v8BAAAAAAD//wIA/v8BAAAA//8BAAAA//8CAP7/AQD//wEA//8BAAAA//8BAP//AAABAP//AQAAAP7/AgD//wEA//8AAAAAAQD+/wMA/P8EAP7///8DAPz/BQD8/wEAAQD+/wMA/v8AAAEA//8BAP//AQD//wEA/v8CAP//AQD//wAAAAABAAAA//8BAP//AQAAAAAA//8BAP//AgD+/wAAAQD//wIA/f8CAP//AQAAAP7/AwD9/wMA/v8BAP//AAABAP//AgD9/wIA//8BAAAA//8BAAAA//8CAP3/AwD+/wEAAAD+/wQA/P8DAP7/AAACAP7/AQAAAP//AQAAAP//AQAAAP//AgD9/wIAAAD//wIA/f8DAP7/AQD//wEA//8CAP7/AQD//wAAAQD//wEA//8AAAAAAQD//wEAAAD9/wUA+/8FAPz/AgD//wAAAQD//wAAAQD+/wMA/f8BAAEA/v8CAP7/AgD+/wIA/v8BAAAAAAAAAAAAAAD//wIA/v8CAP////8CAP7/AgD+/wIA/v8CAP7/AQAAAP//AQAAAP//AQD//wAAAQD//wAAAQD+/wMA/f8CAAAA/v8DAP3/AgAAAP//AQAAAP7/AwD9/wMA/v8BAP//AQD//wEAAAD+/wMA/f8CAAAA/v8CAP//AAAAAAEA//8AAAEA/v8DAP3/AwD9/wIA//8BAP//AgD8/wQA/v8BAAAA/v8CAP//AQD//wAAAAAAAAEA/f8EAPz/BAD9/wIA//8AAAAAAAABAP//AAAAAAAAAAABAP3/BAD9/wIA/v8BAAEA//8AAAAA//8CAP7/AgD9/wQA+/8FAPv/BQD8/wMA/f8DAP3/AwD+/wAAAgD9/wMA/f8CAAAA/v8EAPv/BQD7/wUA/P8DAP///v8DAP3/BAD8/wMA/f8DAP7/AQD//wEAAAD//wEA/v8CAAAA/v8CAP7/AgD//wAAAAAAAAAAAQD+/wIA//8AAAEA/v8DAPz/BAD9/wIA//8AAP//AgD//wEA/v8BAAAAAQD//wAAAAAAAAEA//8AAAEA//8BAP//AAABAP//AQD+/wIA/v8DAPz/BAD8/wQA/f8BAAAAAQD+/wMA/P8DAP//AAAAAAAAAAD//wMA+/8FAP3/AQABAP3/BAD8/wMA/v8BAAAA//8CAP3/AwD+/wEAAQD9/wMA/f8EAPz/BAD7/wQA/v8BAAEA/f8DAP7/AQAAAP//AgD+/wEAAAD//wIA/v8CAP7/AgD+/wEAAQD//wEA/v8CAP7/BAD7/wQA/f8CAAAA//8AAAAAAAABAP//AQD+/wEAAQD+/wMA/f8BAAEA/v8DAPz/AwD/////AwD8/wQA/P8DAP7/AgD//wAA//8BAAAAAAAAAP//AgD+/wEAAAD//wIA/v8BAAAA//8CAP3/AgD//wAAAQD+/wIA/v8BAAAA//8CAP7/AgD+/wEA//8CAP3/BAD7/wQA/v8BAAAA//8AAAEAAAD//wIA/f8DAP7/AgD+/wIA/v8CAP7/AgD+/wEAAAAAAP//AgD9/wMA/v8BAP//AgD9/wMA/v8AAAEA//8BAP//AQD//wEA//8AAAEA/v8EAPz/AgD//wAAAQAAAP//AAABAP//AQD//wEAAAD//wEA//8BAAEA/f8DAP7/AQABAP3/AwD+/wIA/////wEAAAAAAAAAAAD//wIA/v8CAP////8CAP7/AgD//wAA//8CAP3/BAD9/wAAAgD9/wMA/v8BAP//AQAAAP//AQAAAP//AgD9/wMA/f8EAPz/AwD+/wEAAAAAAAAAAAD//wIA/f8EAP3/AAABAAAA//8CAP7/AQAAAP//AQAAAAAA//8BAP//AQAAAP//AQAAAP//AQAAAP//AgD9/wMA/v8BAP//AQAAAP//AQD//wIA/v8CAP3/BAD9/wEAAAD//wEAAQD9/wMA/f8CAAAA/v8DAP3/AgD//wAAAQD+/wIA/v8CAP7/AQAAAP//AgD+/wEAAAAAAP//AwD7/wUA/f8BAAEA/v8BAAEA/v8DAP3/AgD//wEA//8BAP//AQD//wEA//8CAP3/BAD7/wQA/////wIA/v8AAAIA/v8CAP3/BAD7/wUA/P8DAP3/AwD9/wMA/v8AAAIA/v8CAP7/AgD+/wIA//8AAAEA/v8CAP7/AgD//wAAAAD//wEAAAAAAAAA//8BAP7/BAD7/wUA/P8CAAAA//8BAP//AQAAAP//AgD9/wMA/v8BAAAA//8BAAAA//8CAP3/AwD+/wEA//8CAP3/AwD+/wAAAwD8/wIAAAD//wIA/////wIA/v8CAP7/AgD+/wEAAAAAAAAAAAAAAP//AgD+/wIA//8AAAAA//8CAP7/AgD+/wEA//8CAP3/AwD9/wMA/v8BAP7/AwD9/wMA/f8CAP//AQD+/wIA//8BAP//AQD+/wMA/v8BAAAA//8BAAAA//8CAP7/AQAAAP//AgD+/wIA/v8CAP//AAAAAAEA//8BAP//AAABAAAA//8BAP//AQD//wEA//8BAP//AQAAAP//AQD//wEAAAD//wIA/f8CAAAA//8BAAAA//8BAP//AAABAP//AQD//wAAAAAAAAEA/v8CAP//AQD//wAAAAABAP7/AwD9/wIAAAD+/wIA//8BAP//AgD9/wMA/f8DAP7/AgD+/wEAAAAAAAEA/v8CAP7/AgD//wAAAAAAAAAAAAAAAP//AgD/////AgD9/wQA/f8BAAAAAAAAAAEA/f8DAP////8DAP3/AQABAP7/AgD//wAAAQD+/wMA/f8CAP7/AQABAP7/AwD7/wYA+v8FAP3/AQABAP7/AgD+/wMA/f8CAP7/AwD+/wEA//8BAP//AQAAAP7/BQD5/wcA+v8FAPz/AwD+/wIA/v8BAAAA//8DAPv/BQD8/wMA/////wEAAAAAAAAAAAD//wIA/f8DAP7/AQAAAP//AQAAAP//AgD+/wIA/v8BAAEA/f8EAPz/AwD+/wEA//8CAP7/AQD//wEA//8CAP7/AQAAAP//AgD+/wEAAAAAAAAAAAAAAAAAAAD//wIA/f8EAPz/AwD+/wEA//8CAP7/AgD+/wEAAQD+/wEAAQD+/wIA/////wIA//8AAAAAAAAAAAAAAAD//wEAAAAAAP//AgD9/wMA/v8BAP//AQAAAP//AQD//wEA//8BAP//AQD//wEA//8BAP//AQAAAP7/AwD9/wMA/v8BAP7/AwD9/wMA/v8BAP//AAABAP//AQD//wAAAAABAP//AAAAAAAAAQD//wEA/v8CAAAA/v8EAPv/BAD9/wIAAAD+/wMA/P8DAP//AAAAAP//AQD//wIA/f8DAP3/AwD9/wMA/v8BAAAA//8BAAAA//8CAP3/AwD9/wQA+/8FAPv/BQD8/wMA/v8BAAAA//8BAP//AgD+/wEAAAD//wIA/v8BAAEA/f8DAP3/AgAAAP//AQD//wAAAQD//wEA//8BAP//AQD//wEA/v8DAP3/AgAAAP7/AwD9/wIAAAD//wEAAAD//wIA/f8DAP7/AgD9/wQA+/8FAPz/AgAAAP//AgD9/wIA//8BAP//AQD//wEA//8BAP//AQD//wIA/f8DAP3/AgD//wAAAQD+/wIA/v8BAAEA/v8CAP7/AgD+/wMA/P8DAP//AAABAP7/AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA/v8CAP3/BAD8/wMA/v8BAAAAAAD//wEAAAAAAAAAAAD//wEAAAAAAAAA//8BAP//AgD+/wEA//8CAP3/AwD9/wMA/f8EAPv/BAD+/wAAAQD//wEA//8BAP//AAABAP//AQD//wEAAAD//wEA//8BAP//AgD9/wMA/v8AAAIA/f8DAP7/AAACAP3/AwD+/wEA//8BAP//AQAAAP//AQAAAP7/AwD9/wMA/v8AAAEA//8BAP//AAAAAAEA//8AAAEA/v8CAP//AAAAAAEA/v8DAPz/BAD9/wEAAQD+/wEAAQD9/wQA/P8DAP7/AQAAAAAAAAAAAAAAAAAAAAAAAQD+/wIA/////wIA/v8BAAAA//8BAP//AQD//wEA//8BAAAA/v8EAPz/AwD///7/BAD8/wMA/////wIA/v8CAP////8CAP7/AgD+/wIA/v8CAP////8CAP7/AwD9/wIA/v8CAP//AAABAP7/AwD9/wEAAQD+/wMA/f8CAP//AAAAAAEA/v8DAPz/BAD9/wIA/v8CAP7/AgD//wAAAAD//wIA/v8CAP7/AQAAAAAA//8CAP7/AgD+/wIA/v8CAP7/AwD8/wUA+v8GAPv/AwD//wAAAAAAAAAA//8DAPv/BQD9/wAAAgD9/wMA/v8BAP//AQAAAP//AgD9/wMA/v8BAAAA//8BAAAAAAAAAP//AQAAAAAAAAD//wEA//8CAP3/AwD+/wAAAgD+/wEAAAD//wIA/v8CAP7/AgD/////AwD8/wUA/P8CAP//AQD//wIA/f8DAP3/AwD+/wAAAQD+/wMA/f8DAP3/AgD//wAAAQD//wEA//8BAP7/AwD+/wEA//8AAAEA//8CAPz/BAD9/wIA//8AAAEA/v8DAPz/BAD9/wIA//8AAAEA/v8CAP7/AgD//wEA/f8EAPz/BAD+////AgD//wAAAQD//wAAAQD//wEA//8BAP7/AwD+/wEA\"}}catch(i){return void addTest(\"audiopreload\",!1)}n.setAttribute(\"preload\",\"auto\"),n.style.cssText=\"display:none\",docElement.appendChild(n),setTimeout(function(){n.addEventListener(\"loadeddata\",A,!1),e=setTimeout(A,t)},0)}),Modernizr.addTest(\"canvasblending\",function(){if(Modernizr.canvas===!1)return!1;var A=createElement(\"canvas\").getContext(\"2d\");try{A.globalCompositeOperation=\"screen\"}catch(e){}return\"screen\"===A.globalCompositeOperation});var canvas=createElement(\"canvas\");Modernizr.addTest(\"todataurljpeg\",function(){return!!Modernizr.canvas&&0===canvas.toDataURL(\"image/jpeg\").indexOf(\"data:image/jpeg\")}),Modernizr.addTest(\"todataurlpng\",function(){return!!Modernizr.canvas&&0===canvas.toDataURL(\"image/png\").indexOf(\"data:image/png\")}),Modernizr.addTest(\"todataurlwebp\",function(){var A=!1;try{A=!!Modernizr.canvas&&0===canvas.toDataURL(\"image/webp\").indexOf(\"data:image/webp\")}catch(e){}return A}),Modernizr.addTest(\"canvaswinding\",function(){if(Modernizr.canvas===!1)return!1;var A=createElement(\"canvas\").getContext(\"2d\");return A.rect(0,0,10,10),A.rect(2,2,6,6),A.isPointInPath(5,5,\"evenodd\")===!1}),Modernizr.addTest(\"bgpositionshorthand\",function(){var A=createElement(\"a\"),e=A.style,t=\"right 10px bottom 10px\";return e.cssText=\"background-position: \"+t+\";\",e.backgroundPosition===t}),Modernizr.addTest(\"csscalc\",function(){var A=\"width:\",e=\"calc(10px);\",t=createElement(\"a\");return t.style.cssText=A+prefixes.join(e+A),!!t.style.length}),Modernizr.addTest(\"cubicbezierrange\",function(){var A=createElement(\"a\");return A.style.cssText=prefixes.join(\"transition-timing-function:cubic-bezier(1,0,0,1.1); \"),!!A.style.length}),Modernizr.addTest(\"cssgradients\",function(){for(var A,e=\"background-image:\",t=\"gradient(linear,left top,right bottom,from(#9f9),to(white));\",n=\"\",r=0,i=prefixes.length-1;i>r;r++)A=0===r?\"to \":\"\",n+=e+prefixes[r]+\"linear-gradient(\"+A+\"left top, #9f9, white);\";Modernizr._config.usePrefixes&&(n+=e+\"-webkit-\"+t);var o=createElement(\"a\"),d=o.style;return d.cssText=n,(\"\"+d.backgroundImage).indexOf(\"gradient\")>-1}),Modernizr.addTest(\"multiplebgs\",function(){var A=createElement(\"a\").style;return A.cssText=\"background:url(https://),url(https://),red url(https://)\",/(url\\s*\\(.*?){3}/.test(A.background)}),Modernizr.addTest(\"opacity\",function(){var A=createElement(\"a\").style;return A.cssText=prefixes.join(\"opacity:.55;\"),/^0.55$/.test(A.opacity)}),Modernizr.addTest(\"csspointerevents\",function(){var A=createElement(\"a\").style;return A.cssText=\"pointer-events:auto\",\"auto\"===A.pointerEvents}),Modernizr.addTest(\"csspositionsticky\",function(){var A=\"position:\",e=\"sticky\",t=createElement(\"a\"),n=t.style;return n.cssText=A+prefixes.join(e+\";\"+A).slice(0,-A.length),-1!==n.position.indexOf(e)}),Modernizr.addTest(\"rgba\",function(){var A=createElement(\"a\").style;return A.cssText=\"background-color:rgba(150,255,150,.5)\",(\"\"+A.backgroundColor).indexOf(\"rgba\")>-1}),Modernizr.addTest(\"regions\",function(){if(isSVG)return!1;var A=Modernizr.prefixed(\"flowFrom\"),e=Modernizr.prefixed(\"flowInto\"),t=!1;if(!A||!e)return t;var n=createElement(\"iframe\"),r=createElement(\"div\"),i=createElement(\"div\"),o=createElement(\"div\"),d=\"modernizr_flow_for_regions_check\";i.innerText=\"M\",r.style.cssText=\"top: 150px; left: 150px; padding: 0px;\",o.style.cssText=\"width: 50px; height: 50px; padding: 42px;\",o.style[A]=d,r.appendChild(i),r.appendChild(o),docElement.appendChild(r);var a,s,l=i.getBoundingClientRect();return i.style[e]=d,a=i.getBoundingClientRect(),s=parseInt(a.left-l.left,10),docElement.removeChild(r),42==s?t=!0:(docElement.appendChild(n),l=n.getBoundingClientRect(),n.style[e]=d,a=n.getBoundingClientRect(),l.height>0&&l.height!==a.height&&0===a.height&&(t=!0)),i=o=r=n=undefined,t}),Modernizr.addTest(\"cssremunit\",function(){var A=createElement(\"a\").style;try{A.fontSize=\"3rem\"}catch(e){}return/rem/.test(A.fontSize)}),Modernizr.addTest(\"preserve3d\",function(){var A=createElement(\"a\"),e=createElement(\"a\");A.style.cssText=\"display: block; transform-style: preserve-3d; transform-origin: right; transform: rotateY(40deg);\",e.style.cssText=\"display: block; width: 9px; height: 1px; background: #000; transform-origin: right; transform: rotateY(40deg);\",A.appendChild(e),docElement.appendChild(A);var t=e.getBoundingClientRect();return docElement.removeChild(A),t.width&&t.width<4}),Modernizr.addTest(\"createelementattrs\",function(){try{return\"test\"==createElement('<input name=\"test\" />').getAttribute(\"name\")}catch(A){return!1}},{aliases:[\"createelement-attrs\"]}),Modernizr.addTest(\"dataset\",function(){var A=createElement(\"div\");return A.setAttribute(\"data-a-b\",\"c\"),!(!A.dataset||\"c\"!==A.dataset.aB)}),Modernizr.addTest(\"hidden\",\"hidden\"in createElement(\"a\")),Modernizr.addTest(\"bdi\",function(){var A=createElement(\"div\"),e=createElement(\"bdi\");e.innerHTML=\"&#1573;\",A.appendChild(e),docElement.appendChild(A);var t=\"rtl\"===(window.getComputedStyle?getComputedStyle(e,null):e.currentStyle).direction;return docElement.removeChild(A),t}),Modernizr.addTest(\"outputelem\",\"value\"in createElement(\"output\")),Modernizr.addTest(\"progressbar\",createElement(\"progress\").max!==undefined),Modernizr.addTest(\"meter\",createElement(\"meter\").max!==undefined),Modernizr.addTest(\"ruby\",function(){function A(A,e){var t;return window.getComputedStyle?t=document.defaultView.getComputedStyle(A,null).getPropertyValue(e):A.currentStyle&&(t=A.currentStyle[e]),t}function e(){docElement.removeChild(t),t=null,n=null,r=null}var t=createElement(\"ruby\"),n=createElement(\"rt\"),r=createElement(\"rp\"),i=\"display\",o=\"fontSize\";return t.appendChild(r),t.appendChild(n),docElement.appendChild(t),\"none\"==A(r,i)||\"ruby\"==A(t,i)&&\"ruby-text\"==A(n,i)||\"6pt\"==A(r,o)&&\"6pt\"==A(n,o)?(e(),!0):(e(),!1)}),Modernizr.addTest(\"template\",\"content\"in createElement(\"template\")),Modernizr.addTest(\"time\",\"valueAsDate\"in createElement(\"time\")),Modernizr.addTest(\"texttrackapi\",\"function\"==typeof createElement(\"video\").addTextTrack),Modernizr.addTest(\"track\",\"kind\"in createElement(\"track\")),Modernizr.addTest(\"unknownelements\",function(){var A=createElement(\"a\");return A.innerHTML=\"<xyz></xyz>\",1===A.childNodes.length}),Modernizr.addTest(\"capture\",\"capture\"in createElement(\"input\")),Modernizr.addTest(\"fileinput\",function(){if(navigator.userAgent.match(/(Android (1.0|1.1|1.5|1.6|2.0|2.1))|(Windows Phone (OS 7|8.0))|(XBLWP)|(ZuneWP)|(w(eb)?OSBrowser)|(webOS)|(Kindle\\/(1.0|2.0|2.5|3.0))/))return!1;var A=createElement(\"input\");return A.type=\"file\",!A.disabled}),Modernizr.addTest(\"fileinputdirectory\",function(){var A=createElement(\"input\"),e=\"directory\";if(A.type=\"file\",e in A)return!0;for(var t=0,n=domPrefixes.length;n>t;t++)if(domPrefixes[t]+e in A)return!0;return!1}),Modernizr.addTest(\"formattribute\",function(){var A,e=createElement(\"form\"),t=createElement(\"input\"),n=createElement(\"div\"),r=\"formtest\"+(new Date).getTime(),i=!1;e.id=r;try{t.setAttribute(\"form\",r)}catch(o){document.createAttribute&&(A=document.createAttribute(\"form\"),A.nodeValue=r,t.setAttributeNode(A))}return n.appendChild(e),n.appendChild(t),docElement.appendChild(n),i=e.elements&&1===e.elements.length&&t.form==e,n.parentNode.removeChild(n),i}),Modernizr.addTest(\"placeholder\",\"placeholder\"in createElement(\"input\")&&\"placeholder\"in createElement(\"textarea\")),Modernizr.addTest(\"sandbox\",\"sandbox\"in createElement(\"iframe\")),Modernizr.addTest(\"seamless\",\"seamless\"in createElement(\"iframe\")),Modernizr.addTest(\"srcdoc\",\"srcdoc\"in createElement(\"iframe\")),Modernizr.addAsyncTest(function(){if(!Modernizr.canvas)return!1;var A=new Image,e=createElement(\"canvas\"),t=e.getContext(\"2d\");A.onload=function(){addTest(\"apng\",function(){return\"undefined\"==typeof e.getContext?!1:(t.drawImage(A,0,0),0===t.getImageData(0,0,1,1).data[3])})},A.src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACGFjVEwAAAABAAAAAcMq2TYAAAANSURBVAiZY2BgYPgPAAEEAQB9ssjfAAAAGmZjVEwAAAAAAAAAAQAAAAEAAAAAAAAAAAD6A+gBAbNU+2sAAAARZmRBVAAAAAEImWNgYGBgAAAABQAB6MzFdgAAAABJRU5ErkJggg==\"}),Modernizr.addTest(\"imgcrossorigin\",\"crossOrigin\"in createElement(\"img\")),Modernizr.addAsyncTest(function(){var A,e,t,n=createElement(\"img\"),r=\"sizes\"in n;!r&&\"srcset\"in n?(e=\"data:image/gif;base64,R0lGODlhAgABAPAAAP///wAAACH5BAAAAAAALAAAAAACAAEAAAICBAoAOw==\",A=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",t=function(){addTest(\"sizes\",2==n.width)},n.onload=t,n.onerror=t,n.setAttribute(\"sizes\",\"9px\"),n.srcset=A+\" 1w,\"+e+\" 8w\",n.src=A):addTest(\"sizes\",r)}),Modernizr.addTest(\"srcset\",\"srcset\"in createElement(\"img\")),Modernizr.addTest(\"inputformaction\",!!(\"formAction\"in createElement(\"input\")),{aliases:[\"input-formaction\"]}),Modernizr.addTest(\"inputformenctype\",!!(\"formEnctype\"in createElement(\"input\")),{aliases:[\"input-formenctype\"]}),Modernizr.addTest(\"inputformmethod\",!!(\"formMethod\"in createElement(\"input\"))),Modernizr.addTest(\"inputformtarget\",!!(\"formtarget\"in createElement(\"input\")),{aliases:[\"input-formtarget\"]}),Modernizr.addTest(\"scriptasync\",\"async\"in createElement(\"script\")),Modernizr.addTest(\"scriptdefer\",\"defer\"in createElement(\"script\")),Modernizr.addTest(\"stylescoped\",\"scoped\"in createElement(\"style\")),Modernizr.addTest(\"inlinesvg\",function(){var A=createElement(\"div\");return A.innerHTML=\"<svg/>\",\"http://www.w3.org/2000/svg\"==(\"undefined\"!=typeof SVGRect&&A.firstChild&&A.firstChild.namespaceURI)}),Modernizr.addTest(\"textareamaxlength\",!!(\"maxLength\"in createElement(\"textarea\"))),Modernizr.addAsyncTest(function(){function A(o){r++,clearTimeout(e);var d=o&&\"playing\"===o.type||0!==i.currentTime;return!d&&n>r?void(e=setTimeout(A,t)):(i.removeEventListener(\"playing\",A,!1),addTest(\"videoautoplay\",d),void i.parentNode.removeChild(i))}var e,t=200,n=5,r=0,i=createElement(\"video\"),o=i.style;if(!(Modernizr.video&&\"autoplay\"in i))return void addTest(\"videoautoplay\",!1);o.position=\"absolute\",o.height=0,o.width=0;try{if(Modernizr.video.ogg)i.src=\"data:video/ogg;base64,T2dnUwACAAAAAAAAAABmnCATAAAAAHDEixYBKoB0aGVvcmEDAgEAAQABAAAQAAAQAAAAAAAFAAAAAQAAAAAAAAAAAGIAYE9nZ1MAAAAAAAAAAAAAZpwgEwEAAAACrA7TDlj///////////////+QgXRoZW9yYSsAAABYaXBoLk9yZyBsaWJ0aGVvcmEgMS4xIDIwMDkwODIyIChUaHVzbmVsZGEpAQAAABoAAABFTkNPREVSPWZmbXBlZzJ0aGVvcmEtMC4yOYJ0aGVvcmG+zSj3uc1rGLWpSUoQc5zmMYxSlKQhCDGMYhCEIQhAAAAAAAAAAAAAEW2uU2eSyPxWEvx4OVts5ir1aKtUKBMpJFoQ/nk5m41mUwl4slUpk4kkghkIfDwdjgajQYC8VioUCQRiIQh8PBwMhgLBQIg4FRba5TZ5LI/FYS/Hg5W2zmKvVoq1QoEykkWhD+eTmbjWZTCXiyVSmTiSSCGQh8PB2OBqNBgLxWKhQJBGIhCHw8HAyGAsFAiDgUCw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDAwPEhQUFQ0NDhESFRUUDg4PEhQVFRUOEBETFBUVFRARFBUVFRUVEhMUFRUVFRUUFRUVFRUVFRUVFRUVFRUVEAwLEBQZGxwNDQ4SFRwcGw4NEBQZHBwcDhATFhsdHRwRExkcHB4eHRQYGxwdHh4dGxwdHR4eHh4dHR0dHh4eHRALChAYKDM9DAwOExo6PDcODRAYKDlFOA4RFh0zV1A+EhYlOkRtZ00YIzdAUWhxXDFATldneXhlSFxfYnBkZ2MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEhIVGRoaGhoSFBYaGhoaGhUWGRoaGhoaGRoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhESFh8kJCQkEhQYIiQkJCQWGCEkJCQkJB8iJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQREhgvY2NjYxIVGkJjY2NjGBo4Y2NjY2MvQmNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRISEhUXGBkbEhIVFxgZGxwSFRcYGRscHRUXGBkbHB0dFxgZGxwdHR0YGRscHR0dHhkbHB0dHR4eGxwdHR0eHh4REREUFxocIBERFBcaHCAiERQXGhwgIiUUFxocICIlJRcaHCAiJSUlGhwgIiUlJSkcICIlJSUpKiAiJSUlKSoqEBAQFBgcICgQEBQYHCAoMBAUGBwgKDBAFBgcICgwQEAYHCAoMEBAQBwgKDBAQEBgICgwQEBAYIAoMEBAQGCAgAfF5cdH1e3Ow/L66wGmYnfIUbwdUTe3LMRbqON8B+5RJEvcGxkvrVUjTMrsXYhAnIwe0dTJfOYbWrDYyqUrz7dw/JO4hpmV2LsQQvkUeGq1BsZLx+cu5iV0e0eScJ91VIQYrmqfdVSK7GgjOU0oPaPOu5IcDK1mNvnD+K8LwS87f8Jx2mHtHnUkTGAurWZlNQa74ZLSFH9oF6FPGxzLsjQO5Qe0edcpttd7BXBSqMCL4k/4tFrHIPuEQ7m1/uIWkbDMWVoDdOSuRQ9286kvVUlQjzOE6VrNguN4oRXYGkgcnih7t13/9kxvLYKQezwLTrO44sVmMPgMqORo1E0sm1/9SludkcWHwfJwTSybR4LeAz6ugWVgRaY8mV/9SluQmtHrzsBtRF/wPY+X0JuYTs+ltgrXAmlk10xQHmTu9VSIAk1+vcvU4ml2oNzrNhEtQ3CysNP8UeR35wqpKUBdGdZMSjX4WVi8nJpdpHnbhzEIdx7mwf6W1FKAiucMXrWUWVjyRf23chNtR9mIzDoT/6ZLYailAjhFlZuvPtSeZ+2oREubDoWmT3TguY+JHPdRVSLKxfKH3vgNqJ/9emeEYikGXDFNzaLjvTeGAL61mogOoeG3y6oU4rW55ydoj0lUTSR/mmRhPmF86uwIfzp3FtiufQCmppaHDlGE0r2iTzXIw3zBq5hvaTldjG4CPb9wdxAme0SyedVKczJ9AtYbgPOzYKJvZZImsN7ecrxWZg5dR6ZLj/j4qpWsIA+vYwE+Tca9ounMIsrXMB4Stiib2SPQtZv+FVIpfEbzv8ncZoLBXc3YBqTG1HsskTTotZOYTG+oVUjLk6zhP8bg4RhMUNtfZdO7FdpBuXzhJ5Fh8IKlJG7wtD9ik8rWOJxy6iQ3NwzBpQ219mlyv+FLicYs2iJGSE0u2txzed++D61ZWCiHD/cZdQVCqkO2gJpdpNaObhnDfAPrT89RxdWFZ5hO3MseBSIlANppdZNIV/Rwe5eLTDvkfWKzFnH+QJ7m9QWV1KdwnuIwTNtZdJMoXBf74OhRnh2t+OTGL+AVUnIkyYY+QG7g9itHXyF3OIygG2s2kud679ZWKqSFa9n3IHD6MeLv1lZ0XyduRhiDRtrNnKoyiFVLcBm0ba5Yy3fQkDh4XsFE34isVpOzpa9nR8iCpS4HoxG2rJpnRhf3YboVa1PcRouh5LIJv/uQcPNd095ickTaiGBnWLKVWRc0OnYTSyex/n2FofEPnDG8y3PztHrzOLK1xo6RAml2k9owKajOC0Wr4D5x+3nA0UEhK2m198wuBHF3zlWWVKWLN1CHzLClUfuoYBcx4b1llpeBKmbayaR58njtE9onD66lUcsg0Spm2snsb+8HaJRn4dYcLbCuBuYwziB8/5U1C1DOOz2gZjSZtrLJk6vrLF3hwY4Io9xuT/ruUFRSBkNtUzTOWhjh26irLEPx4jPZL3Fo3QrReoGTTM21xYTT9oFdhTUIvjqTkfkvt0bzgVUjq/hOYY8j60IaO/0AzRBtqkTS6R5ellZd5uKdzzhb8BFlDdAcrwkE0rbXTOPB+7Y0FlZO96qFL4Ykg21StJs8qIW7h16H5hGiv8V2Cflau7QVDepTAHa6Lgt6feiEvJDM21StJsmOH/hynURrKxvUpQ8BH0JF7BiyG2qZpnL/7AOU66gt+reLEXY8pVOCQvSsBtqZTNM8bk9ohRcwD18o/WVkbvrceVKRb9I59IEKysjBeTMmmbA21xu/6iHadLRxuIzkLpi8wZYmmbbWi32RVAUjruxWlJ//iFxE38FI9hNKOoCdhwf5fDe4xZ81lgREhK2m1j78vW1CqkuMu/AjBNK210kzRUX/B+69cMMUG5bYrIeZxVSEZISmkzbXOi9yxwIfPgdsov7R71xuJ7rFcACjG/9PzApqFq7wEgzNJm2suWESPuwrQvejj7cbnQxMkxpm21lUYJL0fKmogPPqywn7e3FvB/FCNxPJ85iVUkCE9/tLKx31G4CgNtWTTPFhMvlu8G4/TrgaZttTChljfNJGgOT2X6EqpETy2tYd9cCBI4lIXJ1/3uVUllZEJz4baqGF64yxaZ+zPLYwde8Uqn1oKANtUrSaTOPHkhvuQP3bBlEJ/LFe4pqQOHUI8T8q7AXx3fLVBgSCVpMba55YxN3rv8U1Dv51bAPSOLlZWebkL8vSMGI21lJmmeVxPRwFlZF1CpqCN8uLwymaZyjbXHCRytogPN3o/n74CNykfT+qqRv5AQlHcRxYrC5KvGmbbUwmZY/29BvF6C1/93x4WVglXDLFpmbapmF89HKTogRwqqSlGbu+oiAkcWFbklC6Zhf+NtTLFpn8oWz+HsNRVSgIxZWON+yVyJlE5tq/+GWLTMutYX9ekTySEQPLVNQQ3OfycwJBM0zNtZcse7CvcKI0V/zh16Dr9OSA21MpmmcrHC+6pTAPHPwoit3LHHqs7jhFNRD6W8+EBGoSEoaZttTCZljfduH/fFisn+dRBGAZYtMzbVMwvul/T/crK1NQh8gN0SRRa9cOux6clC0/mDLFpmbarmF8/e6CopeOLCNW6S/IUUg3jJIYiAcDoMcGeRbOvuTPjXR/tyo79LK3kqqkbxkkMRAOB0GODPItnX3Jnxro/25Ud+llbyVVSN4ySGIgHA6DHBnkWzr7kz410f7cqO/Syt5KqpFVJwn6gBEvBM0zNtZcpGOEPiysW8vvRd2R0f7gtjhqUvXL+gWVwHm4XJDBiMpmmZtrLfPwd/IugP5+fKVSysH1EXreFAcEhelGmbbUmZY4Xdo1vQWVnK19P4RuEnbf0gQnR+lDCZlivNM22t1ESmopPIgfT0duOfQrsjgG4tPxli0zJmF5trdL1JDUIUT1ZXSqQDeR4B8mX3TrRro/2McGeUvLtwo6jIEKMkCUXWsLyZROd9P/rFYNtXPBli0z398iVUlVKAjFlY437JXImUTm2r/4ZYtMy61hf16RPJIU9nZ1MABAwAAAAAAAAAZpwgEwIAAABhp658BScAAAAAAADnUFBQXIDGXLhwtttNHDhw5OcpQRMETBEwRPduylKVB0HRdF0A\";else{if(!Modernizr.video.h264)return void addTest(\"videoautoplay\",!1);i.src=\"data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAAs1tZGF0AAACrgYF//+q3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE0OCByMjYwMSBhMGNkN2QzIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxNSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTEgbG9va2FoZWFkX3RocmVhZHM9MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50PTI1MCBrZXlpbnRfbWluPTEwIHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29rYWhlYWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02OSBxcHN0ZXA9NCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAAD2WIhAA3//728P4FNjuZQQAAAu5tb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAAZAABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACGHRyYWsAAABcdGtoZAAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAZAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAgAAAAIAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAAGQAAAAAAAEAAAAAAZBtZGlhAAAAIG1kaGQAAAAAAAAAAAAAAAAAACgAAAAEAFXEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZpZGVvSGFuZGxlcgAAAAE7bWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAAA+3N0YmwAAACXc3RzZAAAAAAAAAABAAAAh2F2YzEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgACAEgAAABIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY//8AAAAxYXZjQwFkAAr/4QAYZ2QACqzZX4iIhAAAAwAEAAADAFA8SJZYAQAGaOvjyyLAAAAAGHN0dHMAAAAAAAAAAQAAAAEAAAQAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAABAAAAAQAAABRzdHN6AAAAAAAAAsUAAAABAAAAFHN0Y28AAAAAAAAAAQAAADAAAABidWR0YQAAAFptZXRhAAAAAAAAACFoZGxyAAAAAAAAAABtZGlyYXBwbAAAAAAAAAAAAAAAAC1pbHN0AAAAJal0b28AAAAdZGF0YQAAAAEAAAAATGF2ZjU2LjQwLjEwMQ==\"}}catch(d){return void addTest(\"videoautoplay\",!1)}i.setAttribute(\"autoplay\",\"\"),i.style.cssText=\"display:none\",docElement.appendChild(i),setTimeout(function(){i.addEventListener(\"playing\",A,!1),e=setTimeout(A,t)},0)}),Modernizr.addTest(\"videoloop\",\"loop\"in createElement(\"video\")),Modernizr.addTest(\"videopreload\",\"preload\"in createElement(\"video\")),Modernizr.addAsyncTest(function(){if(Modernizr.webglextensions=new Boolean(!1),Modernizr.webgl){var A,e,t;try{A=createElement(\"canvas\"),e=A.getContext(\"webgl\")||A.getContext(\"experimental-webgl\"),t=e.getSupportedExtensions()}catch(n){return}e!==undefined&&(Modernizr.webglextensions=new Boolean(!0));for(var r=-1,i=t.length;++r<i;)Modernizr.webglextensions[t[r]]=!0;A=undefined}}),Modernizr.addAsyncTest(function(){var A,e,t=function(A){docElement.contains(A)||docElement.appendChild(A)},n=function(A){A.fake&&A.parentNode&&A.parentNode.removeChild(A)},r=function(A,e){var t=!!A;if(t&&(t=new Boolean(t),t.blocked=\"blocked\"===A),addTest(\"flash\",function(){return t}),e&&s.contains(e)){for(;e.parentNode!==s;)e=e.parentNode;s.removeChild(e)}};try{e=\"ActiveXObject\"in window&&\"Pan\"in new window.ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\")}catch(i){}if(A=!(\"plugins\"in navigator&&\"Shockwave Flash\"in navigator.plugins||e),A||isSVG)r(!1);else{var o,d,a=createElement(\"embed\"),s=getBody();if(a.type=\"application/x-shockwave-flash\",s.appendChild(a),!(\"Pan\"in a||e))return t(s),r(\"blocked\",a),void n(s);o=function(){return t(s),docElement.contains(s)?(docElement.contains(a)?(d=a.style.cssText,\"\"!==d?r(\"blocked\",a):r(!0,a)):r(\"blocked\"),void n(s)):(s=document.body||s,a=createElement(\"embed\"),a.type=\"application/x-shockwave-flash\",s.appendChild(a),setTimeout(o,1e3))},setTimeout(o,10)}});var mq=function(){var A=window.matchMedia||window.msMatchMedia;return A?function(e){var t=A(e);return t&&t.matches||!1}:function(A){var e=!1;return injectElementWithStyles(\"@media \"+A+\" { #modernizr { position: absolute; } }\",function(A){e=\"absolute\"==(window.getComputedStyle?window.getComputedStyle(A,null):A.currentStyle).position}),e}}();ModernizrProto.mq=mq,Modernizr.addTest(\"mediaqueries\",mq(\"only all\"));var testStyles=ModernizrProto.testStyles=injectElementWithStyles;Modernizr.addTest(\"hiddenscroll\",function(){return testStyles(\"#modernizr {width:100px;height:100px;overflow:scroll}\",function(A){return A.offsetWidth===A.clientWidth})}),Modernizr.addTest(\"mathml\",function(){var A;return testStyles(\"#modernizr{position:absolute;display:inline-block}\",function(e){e.innerHTML+=\"<math><mfrac><mi>xx</mi><mi>yy</mi></mfrac></math>\",A=e.offsetHeight>e.offsetWidth}),A}),Modernizr.addTest(\"touchevents\",function(){var A;if(\"ontouchstart\"in window||window.DocumentTouch&&document instanceof DocumentTouch)A=!0;else{var e=[\"@media (\",prefixes.join(\"touch-enabled),(\"),\"heartz\",\")\",\"{#modernizr{top:9px;position:absolute}}\"].join(\"\");testStyles(e,function(e){A=9===e.offsetTop})}return A}),Modernizr.addTest(\"unicoderange\",function(){return Modernizr.testStyles('@font-face{font-family:\"unicodeRange\";src:local(\"Arial\");unicode-range:U+0020,U+002E}#modernizr span{font-size:20px;display:inline-block;font-family:\"unicodeRange\",monospace}#modernizr .mono{font-family:monospace}',function(A){for(var e=[\".\",\".\",\"m\",\"m\"],t=0;t<e.length;t++){var n=createElement(\"span\");n.innerHTML=e[t],n.className=t%2?\"mono\":\"\",A.appendChild(n),e[t]=n.clientWidth}return e[0]!==e[1]&&e[2]===e[3]})}),Modernizr.addTest(\"unicode\",function(){var A,e=createElement(\"span\"),t=createElement(\"span\");return testStyles(\"#modernizr{font-family:Arial,sans;font-size:300em;}\",function(n){e.innerHTML=isSVG?\"妇\":\"&#5987;\",t.innerHTML=isSVG?\"☆\":\"&#9734;\",n.appendChild(e),n.appendChild(t),A=\"offsetWidth\"in e&&e.offsetWidth!==t.offsetWidth}),A}),Modernizr.addTest(\"checked\",function(){return testStyles(\"#modernizr {position:absolute} #modernizr input {margin-left:10px} #modernizr :checked {margin-left:20px;display:block}\",function(A){var e=createElement(\"input\");return e.setAttribute(\"type\",\"checkbox\"),e.setAttribute(\"checked\",\"checked\"),A.appendChild(e),20===e.offsetLeft})}),testStyles(\"#modernizr{display: table; direction: ltr}#modernizr div{display: table-cell; padding: 10px}\",function(A){var e,t=A.childNodes;e=t[0].offsetLeft<t[1].offsetLeft,Modernizr.addTest(\"displaytable\",e,{aliases:[\"display-table\"]})},2);var blacklist=function(){var A=navigator.userAgent,e=A.match(/applewebkit\\/([0-9]+)/gi)&&parseFloat(RegExp.$1),t=A.match(/w(eb)?osbrowser/gi),n=A.match(/windows phone/gi)&&A.match(/iemobile\\/([0-9])+/gi)&&parseFloat(RegExp.$1)>=9,r=533>e&&A.match(/android/gi);return t||r||n}();blacklist?Modernizr.addTest(\"fontface\",!1):testStyles('@font-face {font-family:\"font\";src:url(\"https://\")}',function(A,e){var t=document.getElementById(\"smodernizr\"),n=t.sheet||t.styleSheet,r=n?n.cssRules&&n.cssRules[0]?n.cssRules[0].cssText:n.cssText||\"\":\"\",i=/src/i.test(r)&&0===r.indexOf(e.split(\" \")[0]);Modernizr.addTest(\"fontface\",i)}),testStyles('#modernizr{font:0/0 a}#modernizr:after{content:\":)\";visibility:hidden;font:7px/1 a}',function(A){Modernizr.addTest(\"generatedcontent\",A.offsetHeight>=7)}),Modernizr.addTest(\"hairline\",function(){return testStyles(\"#modernizr {border:.5px solid transparent}\",function(A){return 1===A.offsetHeight})}),Modernizr.addTest(\"cssinvalid\",function(){return testStyles(\"#modernizr input{height:0;border:0;padding:0;margin:0;width:10px} #modernizr input:invalid{width:50px}\",function(A){var e=createElement(\"input\");return e.required=!0,A.appendChild(e),e.clientWidth>10})}),testStyles(\"#modernizr div {width:100px} #modernizr :last-child{width:200px;display:block}\",function(A){Modernizr.addTest(\"lastchild\",A.lastChild.offsetWidth>A.firstChild.offsetWidth)},2),testStyles(\"#modernizr div {width:1px} #modernizr div:nth-child(2n) {width:2px;}\",function(A){for(var e=A.getElementsByTagName(\"div\"),t=!0,n=0;5>n;n++)t=t&&e[n].offsetWidth===n%2+1;Modernizr.addTest(\"nthchild\",t)},5),testStyles(\"#modernizr{overflow: scroll; width: 40px; height: 40px; }#\"+prefixes.join(\"scrollbar{width:0px} #modernizr::\").split(\"#\").slice(1).join(\"#\")+\"scrollbar{width:0px}\",function(A){Modernizr.addTest(\"cssscrollbar\",40==A.scrollWidth)}),Modernizr.addTest(\"siblinggeneral\",function(){return testStyles(\"#modernizr div {width:100px} #modernizr div ~ div {width:200px;display:block}\",function(A){return 200==A.lastChild.offsetWidth},2)}),testStyles(\"#modernizr{position: absolute; top: -10em; visibility:hidden; font: normal 10px arial;}#subpixel{float: left; font-size: 33.3333%;}\",function(A){\nvar e=A.firstChild;e.innerHTML=\"This is a text written in Arial\",Modernizr.addTest(\"subpixelfont\",window.getComputedStyle?\"44px\"!==window.getComputedStyle(e,null).getPropertyValue(\"width\"):!1)},1,[\"subpixel\"]),Modernizr.addTest(\"cssvalid\",function(){return testStyles(\"#modernizr input{height:0;border:0;padding:0;margin:0;width:10px} #modernizr input:valid{width:50px}\",function(A){var e=createElement(\"input\");return A.appendChild(e),e.clientWidth>10})}),testStyles(\"#modernizr { height: 50vh; }\",function(A){var e=parseInt(window.innerHeight/2,10),t=parseInt((window.getComputedStyle?getComputedStyle(A,null):A.currentStyle).height,10);Modernizr.addTest(\"cssvhunit\",t==e)}),testStyles(\"#modernizr { width: 50vw; }\",function(A){var e=parseInt(window.innerWidth/2,10),t=parseInt((window.getComputedStyle?getComputedStyle(A,null):A.currentStyle).width,10);Modernizr.addTest(\"cssvwunit\",t==e)}),Modernizr.addTest(\"details\",function(){var A,e=createElement(\"details\");return\"open\"in e?(testStyles(\"#modernizr details{display:block}\",function(t){t.appendChild(e),e.innerHTML=\"<summary>a</summary>b\",A=e.offsetHeight,e.open=!0,A=A!=e.offsetHeight}),A):!1}),Modernizr.addTest(\"oninput\",function(){var A,e=createElement(\"input\");if(e.setAttribute(\"oninput\",\"return\"),hasEvent(\"oninput\",docElement)||\"function\"==typeof e.oninput)return!0;try{var t=document.createEvent(\"KeyboardEvent\");A=!1;var n=function(e){A=!0,e.preventDefault(),e.stopPropagation()};t.initKeyEvent(\"keypress\",!0,!0,window,!1,!1,!1,!1,0,\"e\".charCodeAt(0)),docElement.appendChild(e),e.addEventListener(\"input\",n,!1),e.focus(),e.dispatchEvent(t),e.removeEventListener(\"input\",n,!1),docElement.removeChild(e)}catch(r){A=!1}return A}),Modernizr.addTest(\"formvalidation\",function(){var A=createElement(\"form\");if(!(\"checkValidity\"in A&&\"addEventListener\"in A))return!1;if(\"reportValidity\"in A)return!0;var e,t=!1;return Modernizr.formvalidationapi=!0,A.addEventListener(\"submit\",function(A){(!window.opera||window.operamini)&&A.preventDefault(),A.stopPropagation()},!1),A.innerHTML='<input name=\"modTest\" required=\"required\" /><button></button>',testStyles(\"#modernizr form{position:absolute;top:-99999em}\",function(n){n.appendChild(A),e=A.getElementsByTagName(\"input\")[0],e.addEventListener(\"invalid\",function(A){t=!0,A.preventDefault(),A.stopPropagation()},!1),Modernizr.formvalidationmessage=!!e.validationMessage,A.getElementsByTagName(\"button\")[0].click()}),t});var inputElem=createElement(\"input\"),inputattrs=\"autocomplete autofocus list placeholder max min multiple pattern required step\".split(\" \"),attrs={};Modernizr.input=function(A){for(var e=0,t=A.length;t>e;e++)attrs[A[e]]=!!(A[e]in inputElem);return attrs.list&&(attrs.list=!(!createElement(\"datalist\")||!window.HTMLDataListElement)),attrs}(inputattrs),Modernizr.addTest(\"datalistelem\",Modernizr.input.list);var inputtypes=\"search tel url email datetime date month week time datetime-local number range color\".split(\" \"),inputs={};Modernizr.inputtypes=function(A){for(var e,t,n,r=A.length,i=\"1)\",o=0;r>o;o++)inputElem.setAttribute(\"type\",e=A[o]),n=\"text\"!==inputElem.type&&\"style\"in inputElem,n&&(inputElem.value=i,inputElem.style.cssText=\"position:absolute;visibility:hidden;\",/^range$/.test(e)&&inputElem.style.WebkitAppearance!==undefined?(docElement.appendChild(inputElem),t=document.defaultView,n=t.getComputedStyle&&\"textfield\"!==t.getComputedStyle(inputElem,null).WebkitAppearance&&0!==inputElem.offsetHeight,docElement.removeChild(inputElem)):/^(search|tel)$/.test(e)||(n=/^(url|email)$/.test(e)?inputElem.checkValidity&&inputElem.checkValidity()===!1:inputElem.value!=i)),inputs[A[o]]=!!n;return inputs}(inputtypes),Modernizr.addTest(\"localizednumber\",function(){if(!Modernizr.inputtypes.number)return!1;if(!Modernizr.formvalidation)return!1;var A,e=createElement(\"div\"),t=getBody(),n=function(){return docElement.insertBefore(t,docElement.firstElementChild||docElement.firstChild)}();e.innerHTML='<input type=\"number\" value=\"1.0\" step=\"0.1\"/>';var r=e.childNodes[0];n.appendChild(e),r.focus();try{document.execCommand(\"InsertText\",!1,\"1,1\")}catch(i){}return A=\"number\"===r.type&&1.1===r.valueAsNumber&&r.checkValidity(),n.removeChild(e),t.fake&&n.parentNode.removeChild(n),A});var modElem={elem:createElement(\"modernizr\")};Modernizr._q.push(function(){delete modElem.elem}),Modernizr.addTest(\"csschunit\",function(){var A,e=modElem.elem.style;try{e.fontSize=\"3ch\",A=-1!==e.fontSize.indexOf(\"ch\")}catch(t){A=!1}return A}),Modernizr.addTest(\"cssexunit\",function(){var A,e=modElem.elem.style;try{e.fontSize=\"3ex\",A=-1!==e.fontSize.indexOf(\"ex\")}catch(t){A=!1}return A}),Modernizr.addTest(\"hsla\",function(){var A=createElement(\"a\").style;return A.cssText=\"background-color:hsla(120,40%,100%,.5)\",contains(A.backgroundColor,\"rgba\")||contains(A.backgroundColor,\"hsla\")}),testStyles(\"#modernizr1{width: 50vmax}#modernizr2{width:50px;height:50px;overflow:scroll}#modernizr3{position:fixed;top:0;left:0;bottom:0;right:0}\",function(A){var e=A.childNodes[2],t=A.childNodes[1],n=A.childNodes[0],r=parseInt((t.offsetWidth-t.clientWidth)/2,10),i=n.clientWidth/100,o=n.clientHeight/100,d=parseInt(50*Math.max(i,o),10),a=parseInt((window.getComputedStyle?getComputedStyle(e,null):e.currentStyle).width,10);Modernizr.addTest(\"cssvmaxunit\",roundedEquals(d,a)||roundedEquals(d,a-r))},3),testStyles(\"#modernizr1{width: 50vm;width:50vmin}#modernizr2{width:50px;height:50px;overflow:scroll}#modernizr3{position:fixed;top:0;left:0;bottom:0;right:0}\",function(A){var e=A.childNodes[2],t=A.childNodes[1],n=A.childNodes[0],r=parseInt((t.offsetWidth-t.clientWidth)/2,10),i=n.clientWidth/100,o=n.clientHeight/100,d=parseInt(50*Math.min(i,o),10),a=parseInt((window.getComputedStyle?getComputedStyle(e,null):e.currentStyle).width,10);Modernizr.addTest(\"cssvminunit\",roundedEquals(d,a)||roundedEquals(d,a-r))},3);var testXhrType=function(A){if(\"undefined\"==typeof XMLHttpRequest)return!1;var e=new XMLHttpRequest;e.open(\"get\",\"/\",!0);try{e.responseType=A}catch(t){return!1}return\"response\"in e&&e.responseType==A};Modernizr.addTest(\"xhrresponsetypearraybuffer\",testXhrType(\"arraybuffer\")),Modernizr.addTest(\"xhrresponsetypeblob\",testXhrType(\"blob\")),Modernizr.addTest(\"xhrresponsetypedocument\",testXhrType(\"document\")),Modernizr.addTest(\"xhrresponsetypejson\",testXhrType(\"json\")),Modernizr.addTest(\"xhrresponsetypetext\",testXhrType(\"text\"));var toStringFn={}.toString;Modernizr.addTest(\"svgclippaths\",function(){return!!document.createElementNS&&/SVGClipPath/.test(toStringFn.call(document.createElementNS(\"http://www.w3.org/2000/svg\",\"clipPath\")))}),Modernizr.addTest(\"svgforeignobject\",function(){return!!document.createElementNS&&/SVGForeignObject/.test(toStringFn.call(document.createElementNS(\"http://www.w3.org/2000/svg\",\"foreignObject\")))}),Modernizr.addTest(\"smil\",function(){return!!document.createElementNS&&/SVGAnimate/.test(toStringFn.call(document.createElementNS(\"http://www.w3.org/2000/svg\",\"animate\")))});var mStyle={style:modElem.elem.style};Modernizr._q.unshift(function(){delete mStyle.style});var testProp=ModernizrProto.testProp=function(A,e,t){return testProps([A],undefined,e,t)};Modernizr.addTest(\"textshadow\",testProp(\"textShadow\",\"1px 1px\")),ModernizrProto.testAllProps=testPropsAll;var prefixed=ModernizrProto.prefixed=function(A,e,t){return 0===A.indexOf(\"@\")?atRule(A):(-1!=A.indexOf(\"-\")&&(A=cssToDOM(A)),e?testPropsAll(A,e,t):testPropsAll(A,\"pfx\"))},prefixedCSS=ModernizrProto.prefixedCSS=function(A){var e=prefixed(A);return e&&domToCSS(e)};Modernizr.addTest(\"batteryapi\",!!prefixed(\"battery\",navigator),{aliases:[\"battery-api\"]});var crypto=prefixed(\"crypto\",window);Modernizr.addTest(\"crypto\",!!prefixed(\"subtle\",crypto)),Modernizr.addTest(\"dart\",!!prefixed(\"startDart\",navigator)),Modernizr.addTest(\"forcetouch\",function(){return hasEvent(prefixed(\"mouseforcewillbegin\",window,!1),window)?MouseEvent.WEBKIT_FORCE_AT_MOUSE_DOWN&&MouseEvent.WEBKIT_FORCE_AT_FORCE_MOUSE_DOWN:!1}),Modernizr.addTest(\"fullscreen\",!(!prefixed(\"exitFullscreen\",document,!1)&&!prefixed(\"cancelFullScreen\",document,!1))),Modernizr.addTest(\"gamepads\",!!prefixed(\"getGamepads\",navigator));var indexeddb;try{indexeddb=prefixed(\"indexedDB\",window)}catch(e){}Modernizr.addTest(\"indexeddb\",!!indexeddb),indexeddb&&Modernizr.addTest(\"indexeddb.deletedatabase\",\"deleteDatabase\"in indexeddb),Modernizr.addAsyncTest(function(){var A,e,t,n=\"detect-blob-support\",r=!1;try{A=prefixed(\"indexedDB\",window)}catch(i){}if(!Modernizr.indexeddb||!Modernizr.indexeddb.deletedatabase)return!1;try{A.deleteDatabase(n).onsuccess=function(){e=A.open(n,1),e.onupgradeneeded=function(){e.result.createObjectStore(\"store\")},e.onsuccess=function(){t=e.result;try{t.transaction(\"store\",\"readwrite\").objectStore(\"store\").put(new Blob,\"key\"),r=!0}catch(i){r=!1}finally{addTest(\"indexeddbblob\",r),t.close(),A.deleteDatabase(n)}}}}catch(i){addTest(\"indexeddbblob\",!1)}}),Modernizr.addTest(\"intl\",!!prefixed(\"Intl\",window)),Modernizr.addTest(\"pagevisibility\",!!prefixed(\"hidden\",document,!1)),Modernizr.addTest(\"performance\",!!prefixed(\"performance\",window)),Modernizr.addTest(\"pointerlock\",!!prefixed(\"exitPointerLock\",document)),Modernizr.addTest(\"requestanimationframe\",!!prefixed(\"requestAnimationFrame\",window),{aliases:[\"raf\"]}),Modernizr.addTest(\"quotamanagement\",function(){var A=prefixed(\"temporaryStorage\",navigator),e=prefixed(\"persistentStorage\",navigator);return!(!A||!e)}),Modernizr.addTest(\"vibrate\",!!prefixed(\"vibrate\",navigator)),Modernizr.addTest(\"webintents\",!!prefixed(\"startActivity\",navigator)),Modernizr.addTest(\"lowbattery\",function(){var A=.2,e=prefixed(\"battery\",navigator);return!!(e&&!e.charging&&e.level<=A)});var crypto=prefixed(\"crypto\",window),supportsGetRandomValues;if(crypto&&\"getRandomValues\"in crypto&&\"Uint32Array\"in window){var array=new Uint32Array(10),values=crypto.getRandomValues(array);supportsGetRandomValues=values&&is(values[0],\"number\")}Modernizr.addTest(\"getrandomvalues\",!!supportsGetRandomValues),Modernizr.addTest(\"backgroundblendmode\",prefixed(\"backgroundBlendMode\",\"text\")),Modernizr.addTest(\"objectfit\",!!prefixed(\"objectFit\"),{aliases:[\"object-fit\"]}),Modernizr.addTest(\"wrapflow\",function(){var A=prefixed(\"wrapFlow\");if(!A||isSVG)return!1;var e=A.replace(/([A-Z])/g,function(A,e){return\"-\"+e.toLowerCase()}).replace(/^ms-/,\"-ms-\"),t=createElement(\"div\"),n=createElement(\"div\"),r=createElement(\"span\");n.style.cssText=\"position: absolute; left: 50px; width: 100px; height: 20px;\"+e+\":end;\",r.innerText=\"X\",t.appendChild(n),t.appendChild(r),docElement.appendChild(t);var i=r.offsetLeft;return docElement.removeChild(t),n=r=t=undefined,150==i}),Modernizr.addTest(\"filesystem\",!!prefixed(\"requestFileSystem\",window)),Modernizr.addTest(\"requestautocomplete\",!!prefixed(\"requestAutocomplete\",createElement(\"form\"))),Modernizr.addTest(\"speechrecognition\",!!prefixed(\"SpeechRecognition\",window));var url=prefixed(\"URL\",window,!1);url=url&&window[url],Modernizr.addTest(\"bloburls\",url&&\"revokeObjectURL\"in url&&\"createObjectURL\"in url),Modernizr.addAsyncTest(function(){function A(){addTest(\"transferables\",!1),e()}function e(){d&&URL.revokeObjectURL(d),a&&a.terminate(),r&&clearTimeout(r)}var t=!!(Modernizr.blobconstructor&&Modernizr.bloburls&&Modernizr.webworkers&&Modernizr.typedarrays);if(!t)return addTest(\"transferables\",!1);try{var n,r,i='var hello = \"world\"',o=new Blob([i],{type:\"text/javascript\"}),d=URL.createObjectURL(o),a=new Worker(d);a.onerror=A,r=setTimeout(A,200),n=new ArrayBuffer(1),a.postMessage(n,[n]),addTest(\"transferables\",0===n.byteLength),e()}catch(s){A()}}),Modernizr.addTest(\"getusermedia\",!!prefixed(\"getUserMedia\",navigator)),Modernizr.addTest(\"peerconnection\",!!prefixed(\"RTCPeerConnection\",window)),Modernizr.addTest(\"datachannel\",function(){if(!Modernizr.peerconnection)return!1;for(var A=0,e=domPrefixes.length;e>A;A++){var t=window[domPrefixes[A]+\"RTCPeerConnection\"];if(t){var n=new t({iceServers:[{url:\"stun:0\"}]});return\"createDataChannel\"in n}}return!1}),Modernizr.addTest(\"matchmedia\",!!prefixed(\"matchMedia\",window)),ModernizrProto.testAllProps=testAllProps,Modernizr.addTest(\"ligatures\",testAllProps(\"fontFeatureSettings\",'\"liga\" 1')),Modernizr.addTest(\"cssanimations\",testAllProps(\"animationName\",\"a\",!0)),Modernizr.addTest(\"csspseudoanimations\",function(){var A=!1;if(!Modernizr.cssanimations||!window.getComputedStyle)return A;var e=[\"@\",Modernizr._prefixes.join(\"keyframes csspseudoanimations { from { font-size: 10px; } }@\").replace(/\\@$/,\"\"),'#modernizr:before { content:\" \"; font-size:5px;',Modernizr._prefixes.join(\"animation:csspseudoanimations 1ms infinite;\"),\"}\"].join(\"\");return Modernizr.testStyles(e,function(e){A=\"10px\"===window.getComputedStyle(e,\":before\").getPropertyValue(\"font-size\")}),A}),Modernizr.addTest(\"appearance\",testAllProps(\"appearance\")),Modernizr.addTest(\"backdropfilter\",testAllProps(\"backdropFilter\")),Modernizr.addTest(\"backgroundcliptext\",function(){return testAllProps(\"backgroundClip\",\"text\")}),Modernizr.addTest(\"bgpositionxy\",function(){return testAllProps(\"backgroundPositionX\",\"3px\",!0)&&testAllProps(\"backgroundPositionY\",\"5px\",!0)}),Modernizr.addTest(\"bgrepeatround\",testAllProps(\"backgroundRepeat\",\"round\")),Modernizr.addTest(\"bgrepeatspace\",testAllProps(\"backgroundRepeat\",\"space\")),Modernizr.addTest(\"backgroundsize\",testAllProps(\"backgroundSize\",\"100%\",!0)),Modernizr.addTest(\"bgsizecover\",testAllProps(\"backgroundSize\",\"cover\")),Modernizr.addTest(\"borderimage\",testAllProps(\"borderImage\",\"url() 1\",!0)),Modernizr.addTest(\"borderradius\",testAllProps(\"borderRadius\",\"0px\",!0)),Modernizr.addTest(\"boxshadow\",testAllProps(\"boxShadow\",\"1px 1px\",!0)),Modernizr.addTest(\"boxsizing\",testAllProps(\"boxSizing\",\"border-box\",!0)&&(document.documentMode===undefined||document.documentMode>7)),function(){Modernizr.addTest(\"csscolumns\",function(){var A=!1,e=testAllProps(\"columnCount\");try{(A=!!e)&&(A=new Boolean(A))}catch(t){}return A});for(var A,e,t=[\"Width\",\"Span\",\"Fill\",\"Gap\",\"Rule\",\"RuleColor\",\"RuleStyle\",\"RuleWidth\",\"BreakBefore\",\"BreakAfter\",\"BreakInside\"],n=0;n<t.length;n++)A=t[n].toLowerCase(),e=testAllProps(\"column\"+t[n]),(\"breakbefore\"===A||\"breakafter\"===A||\"breakinside\"==A)&&(e=e||testAllProps(t[n])),Modernizr.addTest(\"csscolumns.\"+A,e)}(),Modernizr.addTest(\"displayrunin\",testAllProps(\"display\",\"run-in\"),{aliases:[\"display-runin\"]}),Modernizr.addTest(\"ellipsis\",testAllProps(\"textOverflow\",\"ellipsis\")),Modernizr.addTest(\"cssfilters\",function(){if(Modernizr.supports)return testAllProps(\"filter\",\"blur(2px)\");var A=createElement(\"a\");return A.style.cssText=prefixes.join(\"filter:blur(2px); \"),!!A.style.length&&(document.documentMode===undefined||document.documentMode>9)}),Modernizr.addTest(\"flexbox\",testAllProps(\"flexBasis\",\"1px\",!0)),Modernizr.addTest(\"flexboxlegacy\",testAllProps(\"boxDirection\",\"reverse\",!0)),Modernizr.addTest(\"flexboxtweener\",testAllProps(\"flexAlign\",\"end\",!0)),Modernizr.addTest(\"flexwrap\",testAllProps(\"flexWrap\",\"wrap\",!0)),Modernizr.addAsyncTest(function(){function A(){function t(){try{var A=createElement(\"div\"),e=createElement(\"span\"),t=A.style,n=0,r=0,i=!1,o=document.body.firstElementChild||document.body.firstChild;return A.appendChild(e),e.innerHTML=\"Bacon ipsum dolor sit amet jerky velit in culpa hamburger et. Laborum dolor proident, enim dolore duis commodo et strip steak. Salami anim et, veniam consectetur dolore qui tenderloin jowl velit sirloin. Et ad culpa, fatback cillum jowl ball tip ham hock nulla short ribs pariatur aute. Pig pancetta ham bresaola, ut boudin nostrud commodo flank esse cow tongue culpa. Pork belly bresaola enim pig, ea consectetur nisi. Fugiat officia turkey, ea cow jowl pariatur ullamco proident do laborum velit sausage. Magna biltong sint tri-tip commodo sed bacon, esse proident aliquip. Ullamco ham sint fugiat, velit in enim sed mollit nulla cow ut adipisicing nostrud consectetur. Proident dolore beef ribs, laborum nostrud meatball ea laboris rump cupidatat labore culpa. Shankle minim beef, velit sint cupidatat fugiat tenderloin pig et ball tip. Ut cow fatback salami, bacon ball tip et in shank strip steak bresaola. In ut pork belly sed mollit tri-tip magna culpa veniam, short ribs qui in andouille ham consequat. Dolore bacon t-bone, velit short ribs enim strip steak nulla. Voluptate labore ut, biltong swine irure jerky. Cupidatat excepteur aliquip salami dolore. Ball tip strip steak in pork dolor. Ad in esse biltong. Dolore tenderloin exercitation ad pork loin t-bone, dolore in chicken ball tip qui pig. Ut culpa tongue, sint ribeye dolore ex shank voluptate hamburger. Jowl et tempor, boudin pork chop labore ham hock drumstick consectetur tri-tip elit swine meatball chicken ground round. Proident shankle mollit dolore. Shoulder ut duis t-bone quis reprehenderit. Meatloaf dolore minim strip steak, laboris ea aute bacon beef ribs elit shank in veniam drumstick qui. Ex laboris meatball cow tongue pork belly. Ea ball tip reprehenderit pig, sed fatback boudin dolore flank aliquip laboris eu quis. Beef ribs duis beef, cow corned beef adipisicing commodo nisi deserunt exercitation. Cillum dolor t-bone spare ribs, ham hock est sirloin. Brisket irure meatloaf in, boudin pork belly sirloin ball tip. Sirloin sint irure nisi nostrud aliqua. Nostrud nulla aute, enim officia culpa ham hock. Aliqua reprehenderit dolore sunt nostrud sausage, ea boudin pork loin ut t-bone ham tempor. Tri-tip et pancetta drumstick laborum. Ham hock magna do nostrud in proident. Ex ground round fatback, venison non ribeye in.\",document.body.insertBefore(A,o),t.cssText=\"position:absolute;top:0;left:0;width:5em;text-align:justify;text-justification:newspaper;\",n=e.offsetHeight,r=e.offsetWidth,t.cssText=\"position:absolute;top:0;left:0;width:5em;text-align:justify;text-justification:newspaper;\"+prefixes.join(\"hyphens:auto; \"),i=e.offsetHeight!=n||e.offsetWidth!=r,document.body.removeChild(A),A.removeChild(e),i}catch(d){return!1}}function n(A,e){try{var t=createElement(\"div\"),n=createElement(\"span\"),r=t.style,i=0,o=!1,d=!1,a=!1,s=document.body.firstElementChild||document.body.firstChild;return r.cssText=\"position:absolute;top:0;left:0;overflow:visible;width:1.25em;\",t.appendChild(n),document.body.insertBefore(t,s),n.innerHTML=\"mm\",i=n.offsetHeight,n.innerHTML=\"m\"+A+\"m\",d=n.offsetHeight>i,e?(n.innerHTML=\"m<br />m\",i=n.offsetWidth,n.innerHTML=\"m\"+A+\"m\",a=n.offsetWidth>i):a=!0,d===!0&&a===!0&&(o=!0),document.body.removeChild(t),t.removeChild(n),o}catch(l){return!1}}function r(A){try{var e,t=createElement(\"input\"),n=createElement(\"div\"),r=\"lebowski\",i=!1,o=document.body.firstElementChild||document.body.firstChild;n.innerHTML=r+A+r,document.body.insertBefore(n,o),document.body.insertBefore(t,n),t.setSelectionRange?(t.focus(),t.setSelectionRange(0,0)):t.createTextRange&&(e=t.createTextRange(),e.collapse(!0),e.moveEnd(\"character\",0),e.moveStart(\"character\",0),e.select());try{window.find?i=window.find(r+r):(e=window.self.document.body.createTextRange(),i=e.findText(r+r))}catch(d){i=!1}return document.body.removeChild(n),document.body.removeChild(t),i}catch(d){return!1}}return document.body||document.getElementsByTagName(\"body\")[0]?(addTest(\"csshyphens\",function(){if(!testAllProps(\"hyphens\",\"auto\",!0))return!1;try{return t()}catch(A){return!1}}),addTest(\"softhyphens\",function(){try{return n(\"&#173;\",!0)&&n(\"&#8203;\",!1)}catch(A){return!1}}),void addTest(\"softhyphensfind\",function(){try{return r(\"&#173;\")&&r(\"&#8203;\")}catch(A){return!1}})):void setTimeout(A,e)}var e=300;setTimeout(A,e)}),Modernizr.addTest(\"cssmask\",testAllProps(\"maskRepeat\",\"repeat-x\",!0)),Modernizr.addTest(\"overflowscrolling\",testAllProps(\"overflowScrolling\",\"touch\",!0)),Modernizr.addTest(\"cssreflections\",testAllProps(\"boxReflect\",\"above\",!0)),Modernizr.addTest(\"cssresize\",testAllProps(\"resize\",\"both\",!0)),Modernizr.addTest(\"scrollsnappoints\",testAllProps(\"scrollSnapType\")),Modernizr.addTest(\"shapes\",testAllProps(\"shapeOutside\",\"content-box\",!0)),Modernizr.addTest(\"textalignlast\",testAllProps(\"textAlignLast\")),Modernizr.addTest(\"csstransforms\",function(){return-1===navigator.userAgent.indexOf(\"Android 2.\")&&testAllProps(\"transform\",\"scale(1)\",!0)}),Modernizr.addTest(\"csstransforms3d\",function(){var A=!!testAllProps(\"perspective\",\"1px\",!0),e=Modernizr._config.usePrefixes;if(A&&(!e||\"webkitPerspective\"in docElement.style)){var t,n=\"#modernizr{width:0;height:0}\";Modernizr.supports?t=\"@supports (perspective: 1px)\":(t=\"@media (transform-3d)\",e&&(t+=\",(-webkit-transform-3d)\")),t+=\"{#modernizr{width:7px;height:18px;margin:0;padding:0;border:0}}\",testStyles(n+t,function(e){A=7===e.offsetWidth&&18===e.offsetHeight})}return A}),Modernizr.addTest(\"csstransitions\",testAllProps(\"transition\",\"all\",!0)),Modernizr.addTest(\"csspseudotransitions\",function(){var A=!1;if(!Modernizr.csstransitions||!window.getComputedStyle)return A;var e='#modernizr:before { content:\" \"; font-size:5px;'+Modernizr._prefixes.join(\"transition:0s 100s;\")+\"}#modernizr.trigger:before { font-size:10px; }\";return Modernizr.testStyles(e,function(e){window.getComputedStyle(e,\":before\").getPropertyValue(\"font-size\"),e.className+=\"trigger\",A=\"5px\"===window.getComputedStyle(e,\":before\").getPropertyValue(\"font-size\")}),A}),Modernizr.addTest(\"userselect\",testAllProps(\"userSelect\",\"none\",!0)),testRunner(),setClasses(classes),delete ModernizrProto.addTest,delete ModernizrProto.addAsyncTest;for(var i=0;i<Modernizr._q.length;i++)Modernizr._q[i]();window.Modernizr=Modernizr}(window,document);\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/feature-detection/modernizr-js.html",
    "content": "<!DOCTYPE html>\n<html class=\"no-js\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Modernizr JavaScript example</title>\n    \n    <script type=\"text/javascript\" src=\"http://maps.google.com/maps/api/js?key=YOUR-API-KEY\"></script>\n    <style>\n      #map_canvas {\n        width: 600px;\n        height: 600px;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>Simple maps example</h1>\n\n    <div id=\"map_canvas\"></div>\n\n\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/feature-detection/supports-feature-detect.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>CSS @supports example</title>\n    <link href=\"supports-styling.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <header>\n      <h1>My funky website</h1>\n    </header>\n\n    <main>\n      <div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare\n        erat diam, ut blandit enim tincidunt ut. Phasellus varius aliquam orci\n       at ultricies. Cras lobortis, risus nec finibus volutpat, nibh urna\n       feugiat eros, quis suscipit turpis mi facilisis nulla. Nunc lacinia\n       auctor magna, vel tempus tortor semper sit amet. Nunc ac varius risus.\n       In a purus ac tortor venenatis tincidunt commodo in est. Etiam est ante,\n       laoreet vel orci sed, finibus ornare turpis. Pellentesque habitant morbi\n       tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>\n      <div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare\n       erat diam, ut blandit enim tincidunt ut. Phasellus varius aliquam orci\n      at ultricies. Cras lobortis, risus nec finibus volutpat, nibh urna\n      feugiat eros, quis suscipit turpis mi facilisis nulla. Nunc lacinia\n      auctor magna, vel tempus tortor semper sit amet. Nunc ac varius risus.\n      In a purus ac tortor venenatis tincidunt commodo in est. Etiam est ante,\n      laoreet vel orci sed, finibus ornare turpis. Pellentesque habitant morbi\n      tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>\n      <div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare\n        erat diam, ut blandit enim tincidunt ut. Phasellus varius aliquam orci\n       at ultricies. Cras lobortis, risus nec finibus volutpat, nibh urna\n       feugiat eros, quis suscipit turpis mi facilisis nulla. Nunc lacinia\n       auctor magna, vel tempus tortor semper sit amet. Nunc ac varius risus.\n       In a purus ac tortor venenatis tincidunt commodo in est. Etiam est ante,\n       laoreet vel orci sed, finibus ornare turpis. Pellentesque habitant morbi\n       tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>\n      <div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ornare\n       erat diam, ut blandit enim tincidunt ut. Phasellus varius aliquam orci\n      at ultricies. Cras lobortis, risus nec finibus volutpat, nibh urna\n      feugiat eros, quis suscipit turpis mi facilisis nulla. Nunc lacinia\n      auctor magna, vel tempus tortor semper sit amet. Nunc ac varius risus.\n      In a purus ac tortor venenatis tincidunt commodo in est. Etiam est ante,\n      laoreet vel orci sed, finibus ornare turpis. Pellentesque habitant morbi\n      tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>\n    </main>\n\n    <footer>\n      <p>Copyright blah blah</p>\n    </footer>\n  </body>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/feature-detection/supports-styling.css",
    "content": "html {\n  font-family: sans-serif;\n}\n\nbody {\n  min-width: 960px;\n  width: 70%;\n  margin: 0 auto;\n}\n\nheader {\n  background-color: lime;\n  height: 100px;\n}\n\nfooter {\n  background-color: lime;\n  height: 50px;\n  padding: 0 2%;\n}\n\nmain {\n  padding: 2%;\n}\n\nh1 {\n  margin: 0;\n  font-size: 4em;\n  text-align: center;\n  line-height: 100px;\n}\n\np {\n  font-size: 1em;\n  line-height: 1.5;\n}\n\nfooter p {\n  line-height: 50px;\n}\n\n@supports (flex-flow: row) and (flex: 1) {\n\n  main {\n    display: flex;\n  }\n\n  main div {\n    padding-right: 4%;\n    flex: 1;\n  }\n\n  main div:last-child {\n    padding-right: 0;\n  }\n\n}\n\n@supports not (flex-flow: row) and (flex: 1) {\n\n  main div {\n    width: 22%;\n    float: left;\n    padding-right: 4%;\n  }\n\n  main div:last-child {\n    padding-right: 0;\n  }\n\n  footer {\n    clear: left;\n  }\n\n}\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/html-css/MooTools-Core-1.6.0.js",
    "content": "/* MooTools: the javascript framework. license: MIT-style license. copyright: Copyright (c) 2006-2016 [Valerio Proietti](http://mad4milk.net/).*/ \n/*!\nWeb Build: http://mootools.net/core/builder/e426a9ae7167c5807b173d5deff673fc\n*/\n/*\n---\n\nname: Core\n\ndescription: The heart of MooTools.\n\nlicense: MIT-style license.\n\ncopyright: Copyright (c) 2006-2015 [Valerio Proietti](http://mad4milk.net/).\n\nauthors: The MooTools production team (http://mootools.net/developers/)\n\ninspiration:\n  - Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php)\n  - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php)\n\nprovides: [Core, MooTools, Type, typeOf, instanceOf, Native]\n\n...\n*/\n/*! MooTools: the javascript framework. license: MIT-style license. copyright: Copyright (c) 2006-2015 [Valerio Proietti](http://mad4milk.net/).*/\n(function(){\n\nthis.MooTools = {\n\tversion: '1.6.0',\n\tbuild: '529422872adfff401b901b8b6c7ca5114ee95e2b'\n};\n\n// typeOf, instanceOf\n\nvar typeOf = this.typeOf = function(item){\n\tif (item == null) return 'null';\n\tif (item.$family != null) return item.$family();\n\n\tif (item.nodeName){\n\t\tif (item.nodeType == 1) return 'element';\n\t\tif (item.nodeType == 3) return (/\\S/).test(item.nodeValue) ? 'textnode' : 'whitespace';\n\t} else if (typeof item.length == 'number'){\n\t\tif ('callee' in item) return 'arguments';\n\t\tif ('item' in item) return 'collection';\n\t}\n\n\treturn typeof item;\n};\n\nvar instanceOf = this.instanceOf = function(item, object){\n\tif (item == null) return false;\n\tvar constructor = item.$constructor || item.constructor;\n\twhile (constructor){\n\t\tif (constructor === object) return true;\n\t\tconstructor = constructor.parent;\n\t}\n\t/*<ltIE8>*/\n\tif (!item.hasOwnProperty) return false;\n\t/*</ltIE8>*/\n\treturn item instanceof object;\n};\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/*<ltIE8>*/\nvar enumerables = true;\nfor (var i in {toString: 1}) enumerables = null;\nif (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor'];\nfunction forEachObjectEnumberableKey(object, fn, bind){\n\tif (enumerables) for (var i = enumerables.length; i--;){\n\t\tvar k = enumerables[i];\n\t\t// signature has key-value, so overloadSetter can directly pass the\n\t\t// method function, without swapping arguments.\n\t\tif (hasOwnProperty.call(object, k)) fn.call(bind, k, object[k]);\n\t}\n}\n/*</ltIE8>*/\n\n// Function overloading\n\nvar Function = this.Function;\n\nFunction.prototype.overloadSetter = function(usePlural){\n\tvar self = this;\n\treturn function(a, b){\n\t\tif (a == null) return this;\n\t\tif (usePlural || typeof a != 'string'){\n\t\t\tfor (var k in a) self.call(this, k, a[k]);\n\t\t\t/*<ltIE8>*/\n\t\t\tforEachObjectEnumberableKey(a, self, this);\n\t\t\t/*</ltIE8>*/\n\t\t} else {\n\t\t\tself.call(this, a, b);\n\t\t}\n\t\treturn this;\n\t};\n};\n\nFunction.prototype.overloadGetter = function(usePlural){\n\tvar self = this;\n\treturn function(a){\n\t\tvar args, result;\n\t\tif (typeof a != 'string') args = a;\n\t\telse if (arguments.length > 1) args = arguments;\n\t\telse if (usePlural) args = [a];\n\t\tif (args){\n\t\t\tresult = {};\n\t\t\tfor (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]);\n\t\t} else {\n\t\t\tresult = self.call(this, a);\n\t\t}\n\t\treturn result;\n\t};\n};\n\nFunction.prototype.extend = function(key, value){\n\tthis[key] = value;\n}.overloadSetter();\n\nFunction.prototype.implement = function(key, value){\n\tthis.prototype[key] = value;\n}.overloadSetter();\n\n// From\n\nvar slice = Array.prototype.slice;\n\nArray.convert = function(item){\n\tif (item == null) return [];\n\treturn (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item];\n};\n\nFunction.convert = function(item){\n\treturn (typeOf(item) == 'function') ? item : function(){\n\t\treturn item;\n\t};\n};\n\n\nNumber.convert = function(item){\n\tvar number = parseFloat(item);\n\treturn isFinite(number) ? number : null;\n};\n\nString.convert = function(item){\n\treturn item + '';\n};\n\n\n\nFunction.from = Function.convert;\nNumber.from = Number.convert;\nString.from = String.convert;\n\n// hide, protect\n\nFunction.implement({\n\n\thide: function(){\n\t\tthis.$hidden = true;\n\t\treturn this;\n\t},\n\n\tprotect: function(){\n\t\tthis.$protected = true;\n\t\treturn this;\n\t}\n\n});\n\n// Type\n\nvar Type = this.Type = function(name, object){\n\tif (name){\n\t\tvar lower = name.toLowerCase();\n\t\tvar typeCheck = function(item){\n\t\t\treturn (typeOf(item) == lower);\n\t\t};\n\n\t\tType['is' + name] = typeCheck;\n\t\tif (object != null){\n\t\t\tobject.prototype.$family = (function(){\n\t\t\t\treturn lower;\n\t\t\t}).hide();\n\t\t\t\n\t\t}\n\t}\n\n\tif (object == null) return null;\n\n\tobject.extend(this);\n\tobject.$constructor = Type;\n\tobject.prototype.$constructor = object;\n\n\treturn object;\n};\n\nvar toString = Object.prototype.toString;\n\nType.isEnumerable = function(item){\n\treturn (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' );\n};\n\nvar hooks = {};\n\nvar hooksOf = function(object){\n\tvar type = typeOf(object.prototype);\n\treturn hooks[type] || (hooks[type] = []);\n};\n\nvar implement = function(name, method){\n\tif (method && method.$hidden) return;\n\n\tvar hooks = hooksOf(this);\n\n\tfor (var i = 0; i < hooks.length; i++){\n\t\tvar hook = hooks[i];\n\t\tif (typeOf(hook) == 'type') implement.call(hook, name, method);\n\t\telse hook.call(this, name, method);\n\t}\n\n\tvar previous = this.prototype[name];\n\tif (previous == null || !previous.$protected) this.prototype[name] = method;\n\n\tif (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){\n\t\treturn method.apply(item, slice.call(arguments, 1));\n\t});\n};\n\nvar extend = function(name, method){\n\tif (method && method.$hidden) return;\n\tvar previous = this[name];\n\tif (previous == null || !previous.$protected) this[name] = method;\n};\n\nType.implement({\n\n\timplement: implement.overloadSetter(),\n\n\textend: extend.overloadSetter(),\n\n\talias: function(name, existing){\n\t\timplement.call(this, name, this.prototype[existing]);\n\t}.overloadSetter(),\n\n\tmirror: function(hook){\n\t\thooksOf(this).push(hook);\n\t\treturn this;\n\t}\n\n});\n\nnew Type('Type', Type);\n\n// Default Types\n\nvar force = function(name, object, methods){\n\tvar isType = (object != Object),\n\t\tprototype = object.prototype;\n\n\tif (isType) object = new Type(name, object);\n\n\tfor (var i = 0, l = methods.length; i < l; i++){\n\t\tvar key = methods[i],\n\t\t\tgeneric = object[key],\n\t\t\tproto = prototype[key];\n\n\t\tif (generic) generic.protect();\n\t\tif (isType && proto) object.implement(key, proto.protect());\n\t}\n\n\tif (isType){\n\t\tvar methodsEnumerable = prototype.propertyIsEnumerable(methods[0]);\n\t\tobject.forEachMethod = function(fn){\n\t\t\tif (!methodsEnumerable) for (var i = 0, l = methods.length; i < l; i++){\n\t\t\t\tfn.call(prototype, prototype[methods[i]], methods[i]);\n\t\t\t}\n\t\t\tfor (var key in prototype) fn.call(prototype, prototype[key], key);\n\t\t};\n\t}\n\n\treturn force;\n};\n\nforce('String', String, [\n\t'charAt', 'charCodeAt', 'concat', 'contains', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search',\n\t'slice', 'split', 'substr', 'substring', 'trim', 'toLowerCase', 'toUpperCase'\n])('Array', Array, [\n\t'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice',\n\t'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight', 'contains'\n])('Number', Number, [\n\t'toExponential', 'toFixed', 'toLocaleString', 'toPrecision'\n])('Function', Function, [\n\t'apply', 'call', 'bind'\n])('RegExp', RegExp, [\n\t'exec', 'test'\n])('Object', Object, [\n\t'create', 'defineProperty', 'defineProperties', 'keys',\n\t'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames',\n\t'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen'\n])('Date', Date, ['now']);\n\nObject.extend = extend.overloadSetter();\n\nDate.extend('now', function(){\n\treturn +(new Date);\n});\n\nnew Type('Boolean', Boolean);\n\n// fixes NaN returning as Number\n\nNumber.prototype.$family = function(){\n\treturn isFinite(this) ? 'number' : 'null';\n}.hide();\n\n// Number.random\n\nNumber.extend('random', function(min, max){\n\treturn Math.floor(Math.random() * (max - min + 1) + min);\n});\n\n// forEach, each, keys\n\nArray.implement({\n\n\t/*<!ES5>*/\n\tforEach: function(fn, bind){\n\t\tfor (var i = 0, l = this.length; i < l; i++){\n\t\t\tif (i in this) fn.call(bind, this[i], i, this);\n\t\t}\n\t},\n\t/*</!ES5>*/\n\n\teach: function(fn, bind){\n\t\tArray.forEach(this, fn, bind);\n\t\treturn this;\n\t}\n\n});\n\nObject.extend({\n\n\tkeys: function(object){\n\t\tvar keys = [];\n\t\tfor (var k in object){\n\t\t\tif (hasOwnProperty.call(object, k)) keys.push(k);\n\t\t}\n\t\t/*<ltIE8>*/\n\t\tforEachObjectEnumberableKey(object, function(k){\n\t\t\tkeys.push(k);\n\t\t});\n\t\t/*</ltIE8>*/\n\t\treturn keys;\n\t},\n\n\tforEach: function(object, fn, bind){\n\t\tObject.keys(object).forEach(function(key){\n\t\t\tfn.call(bind, object[key], key, object);\n\t\t});\n\t}\n\n});\n\nObject.each = Object.forEach;\n\n\n// Array & Object cloning, Object merging and appending\n\nvar cloneOf = function(item){\n\tswitch (typeOf(item)){\n\t\tcase 'array': return item.clone();\n\t\tcase 'object': return Object.clone(item);\n\t\tdefault: return item;\n\t}\n};\n\nArray.implement('clone', function(){\n\tvar i = this.length, clone = new Array(i);\n\twhile (i--) clone[i] = cloneOf(this[i]);\n\treturn clone;\n});\n\nvar mergeOne = function(source, key, current){\n\tswitch (typeOf(current)){\n\t\tcase 'object':\n\t\t\tif (typeOf(source[key]) == 'object') Object.merge(source[key], current);\n\t\t\telse source[key] = Object.clone(current);\n\t\t\tbreak;\n\t\tcase 'array': source[key] = current.clone(); break;\n\t\tdefault: source[key] = current;\n\t}\n\treturn source;\n};\n\nObject.extend({\n\n\tmerge: function(source, k, v){\n\t\tif (typeOf(k) == 'string') return mergeOne(source, k, v);\n\t\tfor (var i = 1, l = arguments.length; i < l; i++){\n\t\t\tvar object = arguments[i];\n\t\t\tfor (var key in object) mergeOne(source, key, object[key]);\n\t\t}\n\t\treturn source;\n\t},\n\n\tclone: function(object){\n\t\tvar clone = {};\n\t\tfor (var key in object) clone[key] = cloneOf(object[key]);\n\t\treturn clone;\n\t},\n\n\tappend: function(original){\n\t\tfor (var i = 1, l = arguments.length; i < l; i++){\n\t\t\tvar extended = arguments[i] || {};\n\t\t\tfor (var key in extended) original[key] = extended[key];\n\t\t}\n\t\treturn original;\n\t}\n\n});\n\n// Object-less types\n\n['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){\n\tnew Type(name);\n});\n\n// Unique ID\n\nvar UID = Date.now();\n\nString.extend('uniqueID', function(){\n\treturn (UID++).toString(36);\n});\n\n\n\n})();\n\n/*\n---\n\nname: Array\n\ndescription: Contains Array Prototypes like each, contains, and erase.\n\nlicense: MIT-style license.\n\nrequires: [Type]\n\nprovides: Array\n\n...\n*/\n\nArray.implement({\n\n\t/*<!ES5>*/\n\tevery: function(fn, bind){\n\t\tfor (var i = 0, l = this.length >>> 0; i < l; i++){\n\t\t\tif ((i in this) && !fn.call(bind, this[i], i, this)) return false;\n\t\t}\n\t\treturn true;\n\t},\n\n\tfilter: function(fn, bind){\n\t\tvar results = [];\n\t\tfor (var value, i = 0, l = this.length >>> 0; i < l; i++) if (i in this){\n\t\t\tvalue = this[i];\n\t\t\tif (fn.call(bind, value, i, this)) results.push(value);\n\t\t}\n\t\treturn results;\n\t},\n\n\tindexOf: function(item, from){\n\t\tvar length = this.length >>> 0;\n\t\tfor (var i = (from < 0) ? Math.max(0, length + from) : from || 0; i < length; i++){\n\t\t\tif (this[i] === item) return i;\n\t\t}\n\t\treturn -1;\n\t},\n\n\tmap: function(fn, bind){\n\t\tvar length = this.length >>> 0, results = Array(length);\n\t\tfor (var i = 0; i < length; i++){\n\t\t\tif (i in this) results[i] = fn.call(bind, this[i], i, this);\n\t\t}\n\t\treturn results;\n\t},\n\n\tsome: function(fn, bind){\n\t\tfor (var i = 0, l = this.length >>> 0; i < l; i++){\n\t\t\tif ((i in this) && fn.call(bind, this[i], i, this)) return true;\n\t\t}\n\t\treturn false;\n\t},\n\t/*</!ES5>*/\n\n\tclean: function(){\n\t\treturn this.filter(function(item){\n\t\t\treturn item != null;\n\t\t});\n\t},\n\n\tinvoke: function(methodName){\n\t\tvar args = Array.slice(arguments, 1);\n\t\treturn this.map(function(item){\n\t\t\treturn item[methodName].apply(item, args);\n\t\t});\n\t},\n\n\tassociate: function(keys){\n\t\tvar obj = {}, length = Math.min(this.length, keys.length);\n\t\tfor (var i = 0; i < length; i++) obj[keys[i]] = this[i];\n\t\treturn obj;\n\t},\n\n\tlink: function(object){\n\t\tvar result = {};\n\t\tfor (var i = 0, l = this.length; i < l; i++){\n\t\t\tfor (var key in object){\n\t\t\t\tif (object[key](this[i])){\n\t\t\t\t\tresult[key] = this[i];\n\t\t\t\t\tdelete object[key];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t},\n\n\tcontains: function(item, from){\n\t\treturn this.indexOf(item, from) != -1;\n\t},\n\n\tappend: function(array){\n\t\tthis.push.apply(this, array);\n\t\treturn this;\n\t},\n\n\tgetLast: function(){\n\t\treturn (this.length) ? this[this.length - 1] : null;\n\t},\n\n\tgetRandom: function(){\n\t\treturn (this.length) ? this[Number.random(0, this.length - 1)] : null;\n\t},\n\n\tinclude: function(item){\n\t\tif (!this.contains(item)) this.push(item);\n\t\treturn this;\n\t},\n\n\tcombine: function(array){\n\t\tfor (var i = 0, l = array.length; i < l; i++) this.include(array[i]);\n\t\treturn this;\n\t},\n\n\terase: function(item){\n\t\tfor (var i = this.length; i--;){\n\t\t\tif (this[i] === item) this.splice(i, 1);\n\t\t}\n\t\treturn this;\n\t},\n\n\tempty: function(){\n\t\tthis.length = 0;\n\t\treturn this;\n\t},\n\n\tflatten: function(){\n\t\tvar array = [];\n\t\tfor (var i = 0, l = this.length; i < l; i++){\n\t\t\tvar type = typeOf(this[i]);\n\t\t\tif (type == 'null') continue;\n\t\t\tarray = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]);\n\t\t}\n\t\treturn array;\n\t},\n\n\tpick: function(){\n\t\tfor (var i = 0, l = this.length; i < l; i++){\n\t\t\tif (this[i] != null) return this[i];\n\t\t}\n\t\treturn null;\n\t},\n\n\thexToRgb: function(array){\n\t\tif (this.length != 3) return null;\n\t\tvar rgb = this.map(function(value){\n\t\t\tif (value.length == 1) value += value;\n\t\t\treturn parseInt(value, 16);\n\t\t});\n\t\treturn (array) ? rgb : 'rgb(' + rgb + ')';\n\t},\n\n\trgbToHex: function(array){\n\t\tif (this.length < 3) return null;\n\t\tif (this.length == 4 && this[3] == 0 && !array) return 'transparent';\n\t\tvar hex = [];\n\t\tfor (var i = 0; i < 3; i++){\n\t\t\tvar bit = (this[i] - 0).toString(16);\n\t\t\thex.push((bit.length == 1) ? '0' + bit : bit);\n\t\t}\n\t\treturn (array) ? hex : '#' + hex.join('');\n\t}\n\n});\n\n\n\n/*\n---\n\nname: Function\n\ndescription: Contains Function Prototypes like create, bind, pass, and delay.\n\nlicense: MIT-style license.\n\nrequires: Type\n\nprovides: Function\n\n...\n*/\n\nFunction.extend({\n\n\tattempt: function(){\n\t\tfor (var i = 0, l = arguments.length; i < l; i++){\n\t\t\ttry {\n\t\t\t\treturn arguments[i]();\n\t\t\t} catch (e){}\n\t\t}\n\t\treturn null;\n\t}\n\n});\n\nFunction.implement({\n\n\tattempt: function(args, bind){\n\t\ttry {\n\t\t\treturn this.apply(bind, Array.convert(args));\n\t\t} catch (e){}\n\n\t\treturn null;\n\t},\n\n\t/*<!ES5-bind>*/\n\tbind: function(that){\n\t\tvar self = this,\n\t\t\targs = arguments.length > 1 ? Array.slice(arguments, 1) : null,\n\t\t\tF = function(){};\n\n\t\tvar bound = function(){\n\t\t\tvar context = that, length = arguments.length;\n\t\t\tif (this instanceof bound){\n\t\t\t\tF.prototype = self.prototype;\n\t\t\t\tcontext = new F;\n\t\t\t}\n\t\t\tvar result = (!args && !length)\n\t\t\t\t? self.call(context)\n\t\t\t\t: self.apply(context, args && length ? args.concat(Array.slice(arguments)) : args || arguments);\n\t\t\treturn context == that ? result : context;\n\t\t};\n\t\treturn bound;\n\t},\n\t/*</!ES5-bind>*/\n\n\tpass: function(args, bind){\n\t\tvar self = this;\n\t\tif (args != null) args = Array.convert(args);\n\t\treturn function(){\n\t\t\treturn self.apply(bind, args || arguments);\n\t\t};\n\t},\n\n\tdelay: function(delay, bind, args){\n\t\treturn setTimeout(this.pass((args == null ? [] : args), bind), delay);\n\t},\n\n\tperiodical: function(periodical, bind, args){\n\t\treturn setInterval(this.pass((args == null ? [] : args), bind), periodical);\n\t}\n\n});\n\n\n\n/*\n---\n\nname: Number\n\ndescription: Contains Number Prototypes like limit, round, times, and ceil.\n\nlicense: MIT-style license.\n\nrequires: Type\n\nprovides: Number\n\n...\n*/\n\nNumber.implement({\n\n\tlimit: function(min, max){\n\t\treturn Math.min(max, Math.max(min, this));\n\t},\n\n\tround: function(precision){\n\t\tprecision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0);\n\t\treturn Math.round(this * precision) / precision;\n\t},\n\n\ttimes: function(fn, bind){\n\t\tfor (var i = 0; i < this; i++) fn.call(bind, i, this);\n\t},\n\n\ttoFloat: function(){\n\t\treturn parseFloat(this);\n\t},\n\n\ttoInt: function(base){\n\t\treturn parseInt(this, base || 10);\n\t}\n\n});\n\nNumber.alias('each', 'times');\n\n(function(math){\n\nvar methods = {};\n\nmath.each(function(name){\n\tif (!Number[name]) methods[name] = function(){\n\t\treturn Math[name].apply(null, [this].concat(Array.convert(arguments)));\n\t};\n});\n\nNumber.implement(methods);\n\n})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);\n\n/*\n---\n\nname: String\n\ndescription: Contains String Prototypes like camelCase, capitalize, test, and toInt.\n\nlicense: MIT-style license.\n\nrequires: [Type, Array]\n\nprovides: String\n\n...\n*/\n\nString.implement({\n\n\t//<!ES6>\n\tcontains: function(string, index){\n\t\treturn (index ? String(this).slice(index) : String(this)).indexOf(string) > -1;\n\t},\n\t//</!ES6>\n\n\ttest: function(regex, params){\n\t\treturn ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this);\n\t},\n\n\ttrim: function(){\n\t\treturn String(this).replace(/^\\s+|\\s+$/g, '');\n\t},\n\n\tclean: function(){\n\t\treturn String(this).replace(/\\s+/g, ' ').trim();\n\t},\n\n\tcamelCase: function(){\n\t\treturn String(this).replace(/-\\D/g, function(match){\n\t\t\treturn match.charAt(1).toUpperCase();\n\t\t});\n\t},\n\n\thyphenate: function(){\n\t\treturn String(this).replace(/[A-Z]/g, function(match){\n\t\t\treturn ('-' + match.charAt(0).toLowerCase());\n\t\t});\n\t},\n\n\tcapitalize: function(){\n\t\treturn String(this).replace(/\\b[a-z]/g, function(match){\n\t\t\treturn match.toUpperCase();\n\t\t});\n\t},\n\n\tescapeRegExp: function(){\n\t\treturn String(this).replace(/([-.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n\t},\n\n\ttoInt: function(base){\n\t\treturn parseInt(this, base || 10);\n\t},\n\n\ttoFloat: function(){\n\t\treturn parseFloat(this);\n\t},\n\n\thexToRgb: function(array){\n\t\tvar hex = String(this).match(/^#?(\\w{1,2})(\\w{1,2})(\\w{1,2})$/);\n\t\treturn (hex) ? hex.slice(1).hexToRgb(array) : null;\n\t},\n\n\trgbToHex: function(array){\n\t\tvar rgb = String(this).match(/\\d{1,3}/g);\n\t\treturn (rgb) ? rgb.rgbToHex(array) : null;\n\t},\n\n\tsubstitute: function(object, regexp){\n\t\treturn String(this).replace(regexp || (/\\\\?\\{([^{}]+)\\}/g), function(match, name){\n\t\t\tif (match.charAt(0) == '\\\\') return match.slice(1);\n\t\t\treturn (object[name] != null) ? object[name] : '';\n\t\t});\n\t}\n\n});\n\n\n\n/*\n---\n\nname: Browser\n\ndescription: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash.\n\nlicense: MIT-style license.\n\nrequires: [Array, Function, Number, String]\n\nprovides: [Browser, Window, Document]\n\n...\n*/\n\n(function(){\n\nvar document = this.document;\nvar window = document.window = this;\n\nvar parse = function(ua, platform){\n\tua = ua.toLowerCase();\n\tplatform = (platform ? platform.toLowerCase() : '');\n\n\t// chrome is included in the edge UA, so need to check for edge first,\n\t// before checking if it's chrome.\n\tvar UA = ua.match(/(edge)[\\s\\/:]([\\w\\d\\.]+)/);\n\tif (!UA){\n\t\tUA = ua.match(/(opera|ie|firefox|chrome|trident|crios|version)[\\s\\/:]([\\w\\d\\.]+)?.*?(safari|(?:rv[\\s\\/:]|version[\\s\\/:])([\\w\\d\\.]+)|$)/) || [null, 'unknown', 0];\n\t}\n\n\tif (UA[1] == 'trident'){\n\t\tUA[1] = 'ie';\n\t\tif (UA[4]) UA[2] = UA[4];\n\t} else if (UA[1] == 'crios'){\n\t\tUA[1] = 'chrome';\n\t}\n\n\tplatform = ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || ua.match(/mac|win|linux/) || ['other'])[0];\n\tif (platform == 'win') platform = 'windows';\n\n\treturn {\n\t\textend: Function.prototype.extend,\n\t\tname: (UA[1] == 'version') ? UA[3] : UA[1],\n\t\tversion: parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]),\n\t\tplatform: platform\n\t};\n};\n\nvar Browser = this.Browser = parse(navigator.userAgent, navigator.platform);\n\nif (Browser.name == 'ie' && document.documentMode){\n\tBrowser.version = document.documentMode;\n}\n\nBrowser.extend({\n\tFeatures: {\n\t\txpath: !!(document.evaluate),\n\t\tair: !!(window.runtime),\n\t\tquery: !!(document.querySelector),\n\t\tjson: !!(window.JSON)\n\t},\n\tparseUA: parse\n});\n\n\n\n// Request\n\nBrowser.Request = (function(){\n\n\tvar XMLHTTP = function(){\n\t\treturn new XMLHttpRequest();\n\t};\n\n\tvar MSXML2 = function(){\n\t\treturn new ActiveXObject('MSXML2.XMLHTTP');\n\t};\n\n\tvar MSXML = function(){\n\t\treturn new ActiveXObject('Microsoft.XMLHTTP');\n\t};\n\n\treturn Function.attempt(function(){\n\t\tXMLHTTP();\n\t\treturn XMLHTTP;\n\t}, function(){\n\t\tMSXML2();\n\t\treturn MSXML2;\n\t}, function(){\n\t\tMSXML();\n\t\treturn MSXML;\n\t});\n\n})();\n\nBrowser.Features.xhr = !!(Browser.Request);\n\n\n\n// String scripts\n\nBrowser.exec = function(text){\n\tif (!text) return text;\n\tif (window.execScript){\n\t\twindow.execScript(text);\n\t} else {\n\t\tvar script = document.createElement('script');\n\t\tscript.setAttribute('type', 'text/javascript');\n\t\tscript.text = text;\n\t\tdocument.head.appendChild(script);\n\t\tdocument.head.removeChild(script);\n\t}\n\treturn text;\n};\n\nString.implement('stripScripts', function(exec){\n\tvar scripts = '';\n\tvar text = this.replace(/<script[^>]*>([\\s\\S]*?)<\\/script>/gi, function(all, code){\n\t\tscripts += code + '\\n';\n\t\treturn '';\n\t});\n\tif (exec === true) Browser.exec(scripts);\n\telse if (typeOf(exec) == 'function') exec(scripts, text);\n\treturn text;\n});\n\n// Window, Document\n\nBrowser.extend({\n\tDocument: this.Document,\n\tWindow: this.Window,\n\tElement: this.Element,\n\tEvent: this.Event\n});\n\nthis.Window = this.$constructor = new Type('Window', function(){});\n\nthis.$family = Function.convert('window').hide();\n\nWindow.mirror(function(name, method){\n\twindow[name] = method;\n});\n\nthis.Document = document.$constructor = new Type('Document', function(){});\n\ndocument.$family = Function.convert('document').hide();\n\nDocument.mirror(function(name, method){\n\tdocument[name] = method;\n});\n\ndocument.html = document.documentElement;\nif (!document.head) document.head = document.getElementsByTagName('head')[0];\n\nif (document.execCommand) try {\n\tdocument.execCommand('BackgroundImageCache', false, true);\n} catch (e){}\n\n/*<ltIE9>*/\nif (this.attachEvent && !this.addEventListener){\n\tvar unloadEvent = function(){\n\t\tthis.detachEvent('onunload', unloadEvent);\n\t\tdocument.head = document.html = document.window = null;\n\t\twindow = this.Window = document = null;\n\t};\n\tthis.attachEvent('onunload', unloadEvent);\n}\n\n// IE fails on collections and <select>.options (refers to <select>)\nvar arrayFrom = Array.convert;\ntry {\n\tarrayFrom(document.html.childNodes);\n} catch (e){\n\tArray.convert = function(item){\n\t\tif (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){\n\t\t\tvar i = item.length, array = new Array(i);\n\t\t\twhile (i--) array[i] = item[i];\n\t\t\treturn array;\n\t\t}\n\t\treturn arrayFrom(item);\n\t};\n\n\tvar prototype = Array.prototype,\n\t\tslice = prototype.slice;\n\t['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice'].each(function(name){\n\t\tvar method = prototype[name];\n\t\tArray[name] = function(item){\n\t\t\treturn method.apply(Array.convert(item), slice.call(arguments, 1));\n\t\t};\n\t});\n}\n/*</ltIE9>*/\n\n\n\n})();\n\n/*\n---\n\nname: Class\n\ndescription: Contains the Class Function for easily creating, extending, and implementing reusable Classes.\n\nlicense: MIT-style license.\n\nrequires: [Array, String, Function, Number]\n\nprovides: Class\n\n...\n*/\n\n(function(){\n\nvar Class = this.Class = new Type('Class', function(params){\n\tif (instanceOf(params, Function)) params = {initialize: params};\n\n\tvar newClass = function(){\n\t\treset(this);\n\t\tif (newClass.$prototyping) return this;\n\t\tthis.$caller = null;\n\t\tthis.$family = null;\n\t\tvar value = (this.initialize) ? this.initialize.apply(this, arguments) : this;\n\t\tthis.$caller = this.caller = null;\n\t\treturn value;\n\t}.extend(this).implement(params);\n\n\tnewClass.$constructor = Class;\n\tnewClass.prototype.$constructor = newClass;\n\tnewClass.prototype.parent = parent;\n\n\treturn newClass;\n});\n\nvar parent = function(){\n\tif (!this.$caller) throw new Error('The method \"parent\" cannot be called.');\n\tvar name = this.$caller.$name,\n\t\tparent = this.$caller.$owner.parent,\n\t\tprevious = (parent) ? parent.prototype[name] : null;\n\tif (!previous) throw new Error('The method \"' + name + '\" has no parent.');\n\treturn previous.apply(this, arguments);\n};\n\nvar reset = function(object){\n\tfor (var key in object){\n\t\tvar value = object[key];\n\t\tswitch (typeOf(value)){\n\t\t\tcase 'object':\n\t\t\t\tvar F = function(){};\n\t\t\t\tF.prototype = value;\n\t\t\t\tobject[key] = reset(new F);\n\t\t\t\tbreak;\n\t\t\tcase 'array': object[key] = value.clone(); break;\n\t\t}\n\t}\n\treturn object;\n};\n\nvar wrap = function(self, key, method){\n\tif (method.$origin) method = method.$origin;\n\tvar wrapper = function(){\n\t\tif (method.$protected && this.$caller == null) throw new Error('The method \"' + key + '\" cannot be called.');\n\t\tvar caller = this.caller, current = this.$caller;\n\t\tthis.caller = current; this.$caller = wrapper;\n\t\tvar result = method.apply(this, arguments);\n\t\tthis.$caller = current; this.caller = caller;\n\t\treturn result;\n\t}.extend({$owner: self, $origin: method, $name: key});\n\treturn wrapper;\n};\n\nvar implement = function(key, value, retain){\n\tif (Class.Mutators.hasOwnProperty(key)){\n\t\tvalue = Class.Mutators[key].call(this, value);\n\t\tif (value == null) return this;\n\t}\n\n\tif (typeOf(value) == 'function'){\n\t\tif (value.$hidden) return this;\n\t\tthis.prototype[key] = (retain) ? value : wrap(this, key, value);\n\t} else {\n\t\tObject.merge(this.prototype, key, value);\n\t}\n\n\treturn this;\n};\n\nvar getInstance = function(klass){\n\tklass.$prototyping = true;\n\tvar proto = new klass;\n\tdelete klass.$prototyping;\n\treturn proto;\n};\n\nClass.implement('implement', implement.overloadSetter());\n\nClass.Mutators = {\n\n\tExtends: function(parent){\n\t\tthis.parent = parent;\n\t\tthis.prototype = getInstance(parent);\n\t},\n\n\tImplements: function(items){\n\t\tArray.convert(items).each(function(item){\n\t\t\tvar instance = new item;\n\t\t\tfor (var key in instance) implement.call(this, key, instance[key], true);\n\t\t}, this);\n\t}\n};\n\n})();\n\n/*\n---\n\nname: Class.Extras\n\ndescription: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks.\n\nlicense: MIT-style license.\n\nrequires: Class\n\nprovides: [Class.Extras, Chain, Events, Options]\n\n...\n*/\n\n(function(){\n\nthis.Chain = new Class({\n\n\t$chain: [],\n\n\tchain: function(){\n\t\tthis.$chain.append(Array.flatten(arguments));\n\t\treturn this;\n\t},\n\n\tcallChain: function(){\n\t\treturn (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false;\n\t},\n\n\tclearChain: function(){\n\t\tthis.$chain.empty();\n\t\treturn this;\n\t}\n\n});\n\nvar removeOn = function(string){\n\treturn string.replace(/^on([A-Z])/, function(full, first){\n\t\treturn first.toLowerCase();\n\t});\n};\n\nthis.Events = new Class({\n\n\t$events: {},\n\n\taddEvent: function(type, fn, internal){\n\t\ttype = removeOn(type);\n\n\t\t\n\n\t\tthis.$events[type] = (this.$events[type] || []).include(fn);\n\t\tif (internal) fn.internal = true;\n\t\treturn this;\n\t},\n\n\taddEvents: function(events){\n\t\tfor (var type in events) this.addEvent(type, events[type]);\n\t\treturn this;\n\t},\n\n\tfireEvent: function(type, args, delay){\n\t\ttype = removeOn(type);\n\t\tvar events = this.$events[type];\n\t\tif (!events) return this;\n\t\targs = Array.convert(args);\n\t\tevents.each(function(fn){\n\t\t\tif (delay) fn.delay(delay, this, args);\n\t\t\telse fn.apply(this, args);\n\t\t}, this);\n\t\treturn this;\n\t},\n\n\tremoveEvent: function(type, fn){\n\t\ttype = removeOn(type);\n\t\tvar events = this.$events[type];\n\t\tif (events && !fn.internal){\n\t\t\tvar index = events.indexOf(fn);\n\t\t\tif (index != -1) delete events[index];\n\t\t}\n\t\treturn this;\n\t},\n\n\tremoveEvents: function(events){\n\t\tvar type;\n\t\tif (typeOf(events) == 'object'){\n\t\t\tfor (type in events) this.removeEvent(type, events[type]);\n\t\t\treturn this;\n\t\t}\n\t\tif (events) events = removeOn(events);\n\t\tfor (type in this.$events){\n\t\t\tif (events && events != type) continue;\n\t\t\tvar fns = this.$events[type];\n\t\t\tfor (var i = fns.length; i--;) if (i in fns){\n\t\t\t\tthis.removeEvent(type, fns[i]);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n});\n\nthis.Options = new Class({\n\n\tsetOptions: function(){\n\t\tvar options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments));\n\t\tif (this.addEvent) for (var option in options){\n\t\t\tif (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;\n\t\t\tthis.addEvent(option, options[option]);\n\t\t\tdelete options[option];\n\t\t}\n\t\treturn this;\n\t}\n\n});\n\n})();\n\n/*\n---\n\nname: Class.Thenable\n\ndescription: Contains a Utility Class that can be implemented into your own Classes to make them \"thenable\".\n\nlicense: MIT-style license.\n\nrequires: Class\n\nprovides: [Class.Thenable]\n\n...\n*/\n\n(function(){\n\nvar STATE_PENDING = 0,\n\tSTATE_FULFILLED = 1,\n\tSTATE_REJECTED = 2;\n\nvar Thenable = Class.Thenable = new Class({\n\n\t$thenableState: STATE_PENDING,\n\t$thenableResult: null,\n\t$thenableReactions: [],\n\n\tresolve: function(value){\n\t\tresolve(this, value);\n\t\treturn this;\n\t},\n\n\treject: function(reason){\n\t\treject(this, reason);\n\t\treturn this;\n\t},\n\n\tgetThenableState: function(){\n\t\tswitch (this.$thenableState){\n\t\t\tcase STATE_PENDING:\n\t\t\t\treturn 'pending';\n\n\t\t\tcase STATE_FULFILLED:\n\t\t\t\treturn 'fulfilled';\n\n\t\t\tcase STATE_REJECTED:\n\t\t\t\treturn 'rejected';\n\t\t}\n\t},\n\n\tresetThenable: function(reason){\n\t\treject(this, reason);\n\t\treset(this);\n\t\treturn this;\n\t},\n\n\tthen: function(onFulfilled, onRejected){\n\t\tif (typeof onFulfilled !== 'function') onFulfilled = 'Identity';\n\t\tif (typeof onRejected !== 'function') onRejected = 'Thrower';\n\n\t\tvar thenable = new Thenable();\n\n\t\tthis.$thenableReactions.push({\n\t\t\tthenable: thenable,\n\t\t\tfulfillHandler: onFulfilled,\n\t\t\trejectHandler: onRejected\n\t\t});\n\n\t\tif (this.$thenableState !== STATE_PENDING){\n\t\t\treact(this);\n\t\t}\n\n\t\treturn thenable;\n\t},\n\n\t'catch': function(onRejected){\n\t\treturn this.then(null, onRejected);\n\t}\n\n});\n\nThenable.extend({\n\tresolve: function(value){\n\t\tvar thenable;\n\t\tif (value instanceof Thenable){\n\t\t\tthenable = value;\n\t\t} else {\n\t\t\tthenable = new Thenable();\n\t\t\tresolve(thenable, value);\n\t\t}\n\t\treturn thenable;\n\t},\n\treject: function(reason){\n\t\tvar thenable = new Thenable();\n\t\treject(thenable, reason);\n\t\treturn thenable;\n\t}\n});\n\n// Private functions\n\nfunction resolve(thenable, value){\n\tif (thenable.$thenableState === STATE_PENDING){\n\t\tif (thenable === value){\n\t\t\treject(thenable, new TypeError('Tried to resolve a thenable with itself.'));\n\t\t} else if (value && (typeof value === 'object' || typeof value === 'function')){\n\t\t\tvar then;\n\t\t\ttry {\n\t\t\t\tthen = value.then;\n\t\t\t} catch (exception){\n\t\t\t\treject(thenable, exception);\n\t\t\t}\n\t\t\tif (typeof then === 'function'){\n\t\t\t\tvar resolved = false;\n\t\t\t\tdefer(function(){\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\tfunction(nextValue){\n\t\t\t\t\t\t\t\tif (!resolved){\n\t\t\t\t\t\t\t\t\tresolved = true;\n\t\t\t\t\t\t\t\t\tresolve(thenable, nextValue);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfunction(reason){\n\t\t\t\t\t\t\t\tif (!resolved){\n\t\t\t\t\t\t\t\t\tresolved = true;\n\t\t\t\t\t\t\t\t\treject(thenable, reason);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (exception){\n\t\t\t\t\t\tif (!resolved){\n\t\t\t\t\t\t\tresolved = true;\n\t\t\t\t\t\t\treject(thenable, exception);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfulfill(thenable, value);\n\t\t\t}\n\t\t} else {\n\t\t\tfulfill(thenable, value);\n\t\t}\n\t}\n}\n\nfunction fulfill(thenable, value){\n\tif (thenable.$thenableState === STATE_PENDING){\n\t\tthenable.$thenableResult = value;\n\t\tthenable.$thenableState = STATE_FULFILLED;\n\n\t\treact(thenable);\n\t}\n}\n\nfunction reject(thenable, reason){\n\tif (thenable.$thenableState === STATE_PENDING){\n\t\tthenable.$thenableResult = reason;\n\t\tthenable.$thenableState = STATE_REJECTED;\n\n\t\treact(thenable);\n\t}\n}\n\nfunction reset(thenable){\n\tif (thenable.$thenableState !== STATE_PENDING){\n\t\tthenable.$thenableResult = null;\n\t\tthenable.$thenableState = STATE_PENDING;\n\t}\n}\n\nfunction react(thenable){\n\tvar state = thenable.$thenableState,\n\t\tresult = thenable.$thenableResult,\n\t\treactions = thenable.$thenableReactions,\n\t\ttype;\n\n\tif (state === STATE_FULFILLED){\n\t\tthenable.$thenableReactions = [];\n\t\ttype = 'fulfillHandler';\n\t} else if (state == STATE_REJECTED){\n\t\tthenable.$thenableReactions = [];\n\t\ttype = 'rejectHandler';\n\t}\n\n\tif (type){\n\t\tdefer(handle.pass([result, reactions, type]));\n\t}\n}\n\nfunction handle(result, reactions, type){\n\tfor (var i = 0, l = reactions.length; i < l; ++i){\n\t\tvar reaction = reactions[i],\n\t\t\thandler = reaction[type];\n\n\t\tif (handler === 'Identity'){\n\t\t\tresolve(reaction.thenable, result);\n\t\t} else if (handler === 'Thrower'){\n\t\t\treject(reaction.thenable, result);\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tresolve(reaction.thenable, handler(result));\n\t\t\t} catch (exception){\n\t\t\t\treject(reaction.thenable, exception);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvar defer;\nif (typeof process !== 'undefined' && typeof process.nextTick === 'function'){\n\tdefer = process.nextTick;\n} else if (typeof setImmediate !== 'undefined'){\n\tdefer = setImmediate;\n} else {\n\tdefer = function(fn){\n\t\tsetTimeout(fn, 0);\n\t};\n}\n\n})();\n\n/*\n---\n\nname: Object\n\ndescription: Object generic methods\n\nlicense: MIT-style license.\n\nrequires: Type\n\nprovides: [Object, Hash]\n\n...\n*/\n\n(function(){\n\nObject.extend({\n\n\tsubset: function(object, keys){\n\t\tvar results = {};\n\t\tfor (var i = 0, l = keys.length; i < l; i++){\n\t\t\tvar k = keys[i];\n\t\t\tif (k in object) results[k] = object[k];\n\t\t}\n\t\treturn results;\n\t},\n\n\tmap: function(object, fn, bind){\n\t\tvar results = {};\n\t\tvar keys = Object.keys(object);\n\t\tfor (var i = 0; i < keys.length; i++){\n\t\t\tvar key = keys[i];\n\t\t\tresults[key] = fn.call(bind, object[key], key, object);\n\t\t}\n\t\treturn results;\n\t},\n\n\tfilter: function(object, fn, bind){\n\t\tvar results = {};\n\t\tvar keys = Object.keys(object);\n\t\tfor (var i = 0; i < keys.length; i++){\n\t\t\tvar key = keys[i], value = object[key];\n\t\t\tif (fn.call(bind, value, key, object)) results[key] = value;\n\t\t}\n\t\treturn results;\n\t},\n\n\tevery: function(object, fn, bind){\n\t\tvar keys = Object.keys(object);\n\t\tfor (var i = 0; i < keys.length; i++){\n\t\t\tvar key = keys[i];\n\t\t\tif (!fn.call(bind, object[key], key)) return false;\n\t\t}\n\t\treturn true;\n\t},\n\n\tsome: function(object, fn, bind){\n\t\tvar keys = Object.keys(object);\n\t\tfor (var i = 0; i < keys.length; i++){\n\t\t\tvar key = keys[i];\n\t\t\tif (fn.call(bind, object[key], key)) return true;\n\t\t}\n\t\treturn false;\n\t},\n\n\tvalues: function(object){\n\t\tvar values = [];\n\t\tvar keys = Object.keys(object);\n\t\tfor (var i = 0; i < keys.length; i++){\n\t\t\tvar k = keys[i];\n\t\t\tvalues.push(object[k]);\n\t\t}\n\t\treturn values;\n\t},\n\n\tgetLength: function(object){\n\t\treturn Object.keys(object).length;\n\t},\n\n\tkeyOf: function(object, value){\n\t\tvar keys = Object.keys(object);\n\t\tfor (var i = 0; i < keys.length; i++){\n\t\t\tvar key = keys[i];\n\t\t\tif (object[key] === value) return key;\n\t\t}\n\t\treturn null;\n\t},\n\n\tcontains: function(object, value){\n\t\treturn Object.keyOf(object, value) != null;\n\t},\n\n\ttoQueryString: function(object, base){\n\t\tvar queryString = [];\n\n\t\tObject.each(object, function(value, key){\n\t\t\tif (base) key = base + '[' + key + ']';\n\t\t\tvar result;\n\t\t\tswitch (typeOf(value)){\n\t\t\t\tcase 'object': result = Object.toQueryString(value, key); break;\n\t\t\t\tcase 'array':\n\t\t\t\t\tvar qs = {};\n\t\t\t\t\tvalue.each(function(val, i){\n\t\t\t\t\t\tqs[i] = val;\n\t\t\t\t\t});\n\t\t\t\t\tresult = Object.toQueryString(qs, key);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault: result = key + '=' + encodeURIComponent(value);\n\t\t\t}\n\t\t\tif (value != null) queryString.push(result);\n\t\t});\n\n\t\treturn queryString.join('&');\n\t}\n\n});\n\n})();\n\n\n\n/*\n---\nname: Slick.Parser\ndescription: Standalone CSS3 Selector parser\nprovides: Slick.Parser\n...\n*/\n\n;(function(){\n\nvar parsed,\n\tseparatorIndex,\n\tcombinatorIndex,\n\treversed,\n\tcache = {},\n\treverseCache = {},\n\treUnescape = /\\\\/g;\n\nvar parse = function(expression, isReversed){\n\tif (expression == null) return null;\n\tif (expression.Slick === true) return expression;\n\texpression = ('' + expression).replace(/^\\s+|\\s+$/g, '');\n\treversed = !!isReversed;\n\tvar currentCache = (reversed) ? reverseCache : cache;\n\tif (currentCache[expression]) return currentCache[expression];\n\tparsed = {\n\t\tSlick: true,\n\t\texpressions: [],\n\t\traw: expression,\n\t\treverse: function(){\n\t\t\treturn parse(this.raw, true);\n\t\t}\n\t};\n\tseparatorIndex = -1;\n\twhile (expression != (expression = expression.replace(regexp, parser)));\n\tparsed.length = parsed.expressions.length;\n\treturn currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed;\n};\n\nvar reverseCombinator = function(combinator){\n\tif (combinator === '!') return ' ';\n\telse if (combinator === ' ') return '!';\n\telse if ((/^!/).test(combinator)) return combinator.replace(/^!/, '');\n\telse return '!' + combinator;\n};\n\nvar reverse = function(expression){\n\tvar expressions = expression.expressions;\n\tfor (var i = 0; i < expressions.length; i++){\n\t\tvar exp = expressions[i];\n\t\tvar last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)};\n\n\t\tfor (var j = 0; j < exp.length; j++){\n\t\t\tvar cexp = exp[j];\n\t\t\tif (!cexp.reverseCombinator) cexp.reverseCombinator = ' ';\n\t\t\tcexp.combinator = cexp.reverseCombinator;\n\t\t\tdelete cexp.reverseCombinator;\n\t\t}\n\n\t\texp.reverse().push(last);\n\t}\n\treturn expression;\n};\n\nvar escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan <http://stevenlevithan.com/regex/xregexp/> MIT License\n\treturn string.replace(/[-[\\]{}()*+?.\\\\^$|,#\\s]/g, function(match){\n\t\treturn '\\\\' + match;\n\t});\n};\n\nvar regexp = new RegExp(\n/*\n#!/usr/bin/env ruby\nputs \"\\t\\t\" + DATA.read.gsub(/\\(\\?x\\)|\\s+#.*$|\\s+|\\\\$|\\\\n/,'')\n__END__\n\t\"(?x)^(?:\\\n\t  \\\\s* ( , ) \\\\s*               # Separator          \\n\\\n\t| \\\\s* ( <combinator>+ ) \\\\s*   # Combinator         \\n\\\n\t|      ( \\\\s+ )                 # CombinatorChildren \\n\\\n\t|      ( <unicode>+ | \\\\* )     # Tag                \\n\\\n\t| \\\\#  ( <unicode>+       )     # ID                 \\n\\\n\t| \\\\.  ( <unicode>+       )     # ClassName          \\n\\\n\t|                               # Attribute          \\n\\\n\t\\\\[  \\\n\t\t\\\\s* (<unicode1>+)  (?:  \\\n\t\t\t\\\\s* ([*^$!~|]?=)  (?:  \\\n\t\t\t\t\\\\s* (?:\\\n\t\t\t\t\t([\\\"']?)(.*?)\\\\9 \\\n\t\t\t\t)\\\n\t\t\t)  \\\n\t\t)?  \\\\s*  \\\n\t\\\\](?!\\\\]) \\n\\\n\t|   :+ ( <unicode>+ )(?:\\\n\t\\\\( (?:\\\n\t\t(?:([\\\"'])([^\\\\12]*)\\\\12)|((?:\\\\([^)]+\\\\)|[^()]*)+)\\\n\t) \\\\)\\\n\t)?\\\n\t)\"\n*/\n\t\"^(?:\\\\s*(,)\\\\s*|\\\\s*(<combinator>+)\\\\s*|(\\\\s+)|(<unicode>+|\\\\*)|\\\\#(<unicode>+)|\\\\.(<unicode>+)|\\\\[\\\\s*(<unicode1>+)(?:\\\\s*([*^$!~|]?=)(?:\\\\s*(?:([\\\"']?)(.*?)\\\\9)))?\\\\s*\\\\](?!\\\\])|(:+)(<unicode>+)(?:\\\\((?:(?:([\\\"'])([^\\\\13]*)\\\\13)|((?:\\\\([^)]+\\\\)|[^()]*)+))\\\\))?)\"\n\t.replace(/<combinator>/, '[' + escapeRegExp('>+~`!@$%^&={}\\\\;</') + ']')\n\t.replace(/<unicode>/g, '(?:[\\\\w\\\\u00a1-\\\\uFFFF-]|\\\\\\\\[^\\\\s0-9a-f])')\n\t.replace(/<unicode1>/g, '(?:[:\\\\w\\\\u00a1-\\\\uFFFF-]|\\\\\\\\[^\\\\s0-9a-f])')\n);\n\nfunction parser(\n\trawMatch,\n\n\tseparator,\n\tcombinator,\n\tcombinatorChildren,\n\n\ttagName,\n\tid,\n\tclassName,\n\n\tattributeKey,\n\tattributeOperator,\n\tattributeQuote,\n\tattributeValue,\n\n\tpseudoMarker,\n\tpseudoClass,\n\tpseudoQuote,\n\tpseudoClassQuotedValue,\n\tpseudoClassValue\n){\n\tif (separator || separatorIndex === -1){\n\t\tparsed.expressions[++separatorIndex] = [];\n\t\tcombinatorIndex = -1;\n\t\tif (separator) return '';\n\t}\n\n\tif (combinator || combinatorChildren || combinatorIndex === -1){\n\t\tcombinator = combinator || ' ';\n\t\tvar currentSeparator = parsed.expressions[separatorIndex];\n\t\tif (reversed && currentSeparator[combinatorIndex])\n\t\t\tcurrentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator);\n\t\tcurrentSeparator[++combinatorIndex] = {combinator: combinator, tag: '*'};\n\t}\n\n\tvar currentParsed = parsed.expressions[separatorIndex][combinatorIndex];\n\n\tif (tagName){\n\t\tcurrentParsed.tag = tagName.replace(reUnescape, '');\n\n\t} else if (id){\n\t\tcurrentParsed.id = id.replace(reUnescape, '');\n\n\t} else if (className){\n\t\tclassName = className.replace(reUnescape, '');\n\n\t\tif (!currentParsed.classList) currentParsed.classList = [];\n\t\tif (!currentParsed.classes) currentParsed.classes = [];\n\t\tcurrentParsed.classList.push(className);\n\t\tcurrentParsed.classes.push({\n\t\t\tvalue: className,\n\t\t\tregexp: new RegExp('(^|\\\\s)' + escapeRegExp(className) + '(\\\\s|$)')\n\t\t});\n\n\t} else if (pseudoClass){\n\t\tpseudoClassValue = pseudoClassValue || pseudoClassQuotedValue;\n\t\tpseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null;\n\n\t\tif (!currentParsed.pseudos) currentParsed.pseudos = [];\n\t\tcurrentParsed.pseudos.push({\n\t\t\tkey: pseudoClass.replace(reUnescape, ''),\n\t\t\tvalue: pseudoClassValue,\n\t\t\ttype: pseudoMarker.length == 1 ? 'class' : 'element'\n\t\t});\n\n\t} else if (attributeKey){\n\t\tattributeKey = attributeKey.replace(reUnescape, '');\n\t\tattributeValue = (attributeValue || '').replace(reUnescape, '');\n\n\t\tvar test, regexp;\n\n\t\tswitch (attributeOperator){\n\t\t\tcase '^=' : regexp = new RegExp(       '^'+ escapeRegExp(attributeValue)            ); break;\n\t\t\tcase '$=' : regexp = new RegExp(            escapeRegExp(attributeValue) +'$'       ); break;\n\t\t\tcase '~=' : regexp = new RegExp( '(^|\\\\s)'+ escapeRegExp(attributeValue) +'(\\\\s|$)' ); break;\n\t\t\tcase '|=' : regexp = new RegExp(       '^'+ escapeRegExp(attributeValue) +'(-|$)'   ); break;\n\t\t\tcase  '=' : test = function(value){\n\t\t\t\treturn attributeValue == value;\n\t\t\t}; break;\n\t\t\tcase '*=' : test = function(value){\n\t\t\t\treturn value && value.indexOf(attributeValue) > -1;\n\t\t\t}; break;\n\t\t\tcase '!=' : test = function(value){\n\t\t\t\treturn attributeValue != value;\n\t\t\t}; break;\n\t\t\tdefault   : test = function(value){\n\t\t\t\treturn !!value;\n\t\t\t};\n\t\t}\n\n\t\tif (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){\n\t\t\treturn false;\n\t\t};\n\n\t\tif (!test) test = function(value){\n\t\t\treturn value && regexp.test(value);\n\t\t};\n\n\t\tif (!currentParsed.attributes) currentParsed.attributes = [];\n\t\tcurrentParsed.attributes.push({\n\t\t\tkey: attributeKey,\n\t\t\toperator: attributeOperator,\n\t\t\tvalue: attributeValue,\n\t\t\ttest: test\n\t\t});\n\n\t}\n\n\treturn '';\n};\n\n// Slick NS\n\nvar Slick = (this.Slick || {});\n\nSlick.parse = function(expression){\n\treturn parse(expression);\n};\n\nSlick.escapeRegExp = escapeRegExp;\n\nif (!this.Slick) this.Slick = Slick;\n\n}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);\n\n/*\n---\nname: Slick.Finder\ndescription: The new, superfast css selector engine.\nprovides: Slick.Finder\nrequires: Slick.Parser\n...\n*/\n\n;(function(){\n\nvar local = {},\n\tfeaturesCache = {},\n\ttoString = Object.prototype.toString;\n\n// Feature / Bug detection\n\nlocal.isNativeCode = function(fn){\n\treturn (/\\{\\s*\\[native code\\]\\s*\\}/).test('' + fn);\n};\n\nlocal.isXML = function(document){\n\treturn (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') ||\n\t(document.nodeType == 9 && document.documentElement.nodeName != 'HTML');\n};\n\nlocal.setDocument = function(document){\n\n\t// convert elements / window arguments to document. if document cannot be extrapolated, the function returns.\n\tvar nodeType = document.nodeType;\n\tif (nodeType == 9); // document\n\telse if (nodeType) document = document.ownerDocument; // node\n\telse if (document.navigator) document = document.document; // window\n\telse return;\n\n\t// check if it's the old document\n\n\tif (this.document === document) return;\n\tthis.document = document;\n\n\t// check if we have done feature detection on this document before\n\n\tvar root = document.documentElement,\n\t\trootUid = this.getUIDXML(root),\n\t\tfeatures = featuresCache[rootUid],\n\t\tfeature;\n\n\tif (features){\n\t\tfor (feature in features){\n\t\t\tthis[feature] = features[feature];\n\t\t}\n\t\treturn;\n\t}\n\n\tfeatures = featuresCache[rootUid] = {};\n\n\tfeatures.root = root;\n\tfeatures.isXMLDocument = this.isXML(document);\n\n\tfeatures.brokenStarGEBTN\n\t= features.starSelectsClosedQSA\n\t= features.idGetsName\n\t= features.brokenMixedCaseQSA\n\t= features.brokenGEBCN\n\t= features.brokenCheckedQSA\n\t= features.brokenEmptyAttributeQSA\n\t= features.isHTMLDocument\n\t= features.nativeMatchesSelector\n\t= false;\n\n\tvar starSelectsClosed, starSelectsComments,\n\t\tbrokenSecondClassNameGEBCN, cachedGetElementsByClassName,\n\t\tbrokenFormAttributeGetter;\n\n\tvar selected, id = 'slick_uniqueid';\n\tvar testNode = document.createElement('div');\n\n\tvar testRoot = document.body || document.getElementsByTagName('body')[0] || root;\n\ttestRoot.appendChild(testNode);\n\n\t// on non-HTML documents innerHTML and getElementsById doesnt work properly\n\ttry {\n\t\ttestNode.innerHTML = '<a id=\"'+id+'\"></a>';\n\t\tfeatures.isHTMLDocument = !!document.getElementById(id);\n\t} catch (e){}\n\n\tif (features.isHTMLDocument){\n\n\t\ttestNode.style.display = 'none';\n\n\t\t// IE returns comment nodes for getElementsByTagName('*') for some documents\n\t\ttestNode.appendChild(document.createComment(''));\n\t\tstarSelectsComments = (testNode.getElementsByTagName('*').length > 1);\n\n\t\t// IE returns closed nodes (EG:\"</foo>\") for getElementsByTagName('*') for some documents\n\t\ttry {\n\t\t\ttestNode.innerHTML = 'foo</foo>';\n\t\t\tselected = testNode.getElementsByTagName('*');\n\t\t\tstarSelectsClosed = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');\n\t\t} catch (e){};\n\n\t\tfeatures.brokenStarGEBTN = starSelectsComments || starSelectsClosed;\n\n\t\t// IE returns elements with the name instead of just id for getElementsById for some documents\n\t\ttry {\n\t\t\ttestNode.innerHTML = '<a name=\"'+ id +'\"></a><b id=\"'+ id +'\"></b>';\n\t\t\tfeatures.idGetsName = document.getElementById(id) === testNode.firstChild;\n\t\t} catch (e){}\n\n\t\tif (testNode.getElementsByClassName){\n\n\t\t\t// Safari 3.2 getElementsByClassName caches results\n\t\t\ttry {\n\t\t\t\ttestNode.innerHTML = '<a class=\"f\"></a><a class=\"b\"></a>';\n\t\t\t\ttestNode.getElementsByClassName('b').length;\n\t\t\t\ttestNode.firstChild.className = 'b';\n\t\t\t\tcachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2);\n\t\t\t} catch (e){};\n\n\t\t\t// Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one\n\t\t\ttry {\n\t\t\t\ttestNode.innerHTML = '<a class=\"a\"></a><a class=\"f b a\"></a>';\n\t\t\t\tbrokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2);\n\t\t\t} catch (e){}\n\n\t\t\tfeatures.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN;\n\t\t}\n\n\t\tif (testNode.querySelectorAll){\n\t\t\t// IE 8 returns closed nodes (EG:\"</foo>\") for querySelectorAll('*') for some documents\n\t\t\ttry {\n\t\t\t\ttestNode.innerHTML = 'foo</foo>';\n\t\t\t\tselected = testNode.querySelectorAll('*');\n\t\t\t\tfeatures.starSelectsClosedQSA = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');\n\t\t\t} catch (e){}\n\n\t\t\t// Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode\n\t\t\ttry {\n\t\t\t\ttestNode.innerHTML = '<a class=\"MiX\"></a>';\n\t\t\t\tfeatures.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiX').length;\n\t\t\t} catch (e){}\n\n\t\t\t// Webkit and Opera dont return selected options on querySelectorAll\n\t\t\ttry {\n\t\t\t\ttestNode.innerHTML = '<select><option selected=\"selected\">a</option></select>';\n\t\t\t\tfeatures.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0);\n\t\t\t} catch (e){};\n\n\t\t\t// IE returns incorrect results for attr[*^$]=\"\" selectors on querySelectorAll\n\t\t\ttry {\n\t\t\t\ttestNode.innerHTML = '<a class=\"\"></a>';\n\t\t\t\tfeatures.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=\"\"]').length != 0);\n\t\t\t} catch (e){}\n\n\t\t}\n\n\t\t// IE6-7, if a form has an input of id x, form.getAttribute(x) returns a reference to the input\n\t\ttry {\n\t\t\ttestNode.innerHTML = '<form action=\"s\"><input id=\"action\"/></form>';\n\t\t\tbrokenFormAttributeGetter = (testNode.firstChild.getAttribute('action') != 's');\n\t\t} catch (e){}\n\n\t\t// native matchesSelector function\n\n\t\tfeatures.nativeMatchesSelector = root.matches || /*root.msMatchesSelector ||*/ root.mozMatchesSelector || root.webkitMatchesSelector;\n\t\tif (features.nativeMatchesSelector) try {\n\t\t\t// if matchesSelector trows errors on incorrect sintaxes we can use it\n\t\t\tfeatures.nativeMatchesSelector.call(root, ':slick');\n\t\t\tfeatures.nativeMatchesSelector = null;\n\t\t} catch (e){}\n\n\t}\n\n\ttry {\n\t\troot.slick_expando = 1;\n\t\tdelete root.slick_expando;\n\t\tfeatures.getUID = this.getUIDHTML;\n\t} catch (e){\n\t\tfeatures.getUID = this.getUIDXML;\n\t}\n\n\ttestRoot.removeChild(testNode);\n\ttestNode = selected = testRoot = null;\n\n\t// getAttribute\n\n\tfeatures.getAttribute = (features.isHTMLDocument && brokenFormAttributeGetter) ? function(node, name){\n\t\tvar method = this.attributeGetters[name];\n\t\tif (method) return method.call(node);\n\t\tvar attributeNode = node.getAttributeNode(name);\n\t\treturn (attributeNode) ? attributeNode.nodeValue : null;\n\t} : function(node, name){\n\t\tvar method = this.attributeGetters[name];\n\t\treturn (method) ? method.call(node) : node.getAttribute(name);\n\t};\n\n\t// hasAttribute\n\n\tfeatures.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute){\n\t\treturn node.hasAttribute(attribute);\n\t} : function(node, attribute){\n\t\tnode = node.getAttributeNode(attribute);\n\t\treturn !!(node && (node.specified || node.nodeValue));\n\t};\n\n\t// contains\n\t// FIXME: Add specs: local.contains should be different for xml and html documents?\n\tvar nativeRootContains = root && this.isNativeCode(root.contains),\n\t\tnativeDocumentContains = document && this.isNativeCode(document.contains);\n\n\tfeatures.contains = (nativeRootContains && nativeDocumentContains) ? function(context, node){\n\t\treturn context.contains(node);\n\t} : (nativeRootContains && !nativeDocumentContains) ? function(context, node){\n\t\t// IE8 does not have .contains on document.\n\t\treturn context === node || ((context === document) ? document.documentElement : context).contains(node);\n\t} : (root && root.compareDocumentPosition) ? function(context, node){\n\t\treturn context === node || !!(context.compareDocumentPosition(node) & 16);\n\t} : function(context, node){\n\t\tif (node) do {\n\t\t\tif (node === context) return true;\n\t\t} while ((node = node.parentNode));\n\t\treturn false;\n\t};\n\n\t// document order sorting\n\t// credits to Sizzle (http://sizzlejs.com/)\n\n\tfeatures.documentSorter = (root.compareDocumentPosition) ? function(a, b){\n\t\tif (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0;\n\t\treturn a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;\n\t} : ('sourceIndex' in root) ? function(a, b){\n\t\tif (!a.sourceIndex || !b.sourceIndex) return 0;\n\t\treturn a.sourceIndex - b.sourceIndex;\n\t} : (document.createRange) ? function(a, b){\n\t\tif (!a.ownerDocument || !b.ownerDocument) return 0;\n\t\tvar aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();\n\t\taRange.setStart(a, 0);\n\t\taRange.setEnd(a, 0);\n\t\tbRange.setStart(b, 0);\n\t\tbRange.setEnd(b, 0);\n\t\treturn aRange.compareBoundaryPoints(Range.START_TO_END, bRange);\n\t} : null;\n\n\troot = null;\n\n\tfor (feature in features){\n\t\tthis[feature] = features[feature];\n\t}\n};\n\n// Main Method\n\nvar reSimpleSelector = /^([#.]?)((?:[\\w-]+|\\*))$/,\n\treEmptyAttribute = /\\[.+[*$^]=(?:\"\"|'')?\\]/,\n\tqsaFailExpCache = {};\n\nlocal.search = function(context, expression, append, first){\n\n\tvar found = this.found = (first) ? null : (append || []);\n\n\tif (!context) return found;\n\telse if (context.navigator) context = context.document; // Convert the node from a window to a document\n\telse if (!context.nodeType) return found;\n\n\t// setup\n\n\tvar parsed, i, node, nodes,\n\t\tuniques = this.uniques = {},\n\t\thasOthers = !!(append && append.length),\n\t\tcontextIsDocument = (context.nodeType == 9);\n\n\tif (this.document !== (contextIsDocument ? context : context.ownerDocument)) this.setDocument(context);\n\n\t// avoid duplicating items already in the append array\n\tif (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])] = true;\n\n\t// expression checks\n\n\tif (typeof expression == 'string'){ // expression is a string\n\n\t\t/*<simple-selectors-override>*/\n\t\tvar simpleSelector = expression.match(reSimpleSelector);\n\t\tsimpleSelectors: if (simpleSelector){\n\n\t\t\tvar symbol = simpleSelector[1],\n\t\t\t\tname = simpleSelector[2];\n\n\t\t\tif (!symbol){\n\n\t\t\t\tif (name == '*' && this.brokenStarGEBTN) break simpleSelectors;\n\t\t\t\tnodes = context.getElementsByTagName(name);\n\t\t\t\tif (first) return nodes[0] || null;\n\t\t\t\tfor (i = 0; node = nodes[i++];){\n\t\t\t\t\tif (!(hasOthers && uniques[this.getUID(node)])) found.push(node);\n\t\t\t\t}\n\n\t\t\t} else if (symbol == '#'){\n\n\t\t\t\tif (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors;\n\t\t\t\tnode = context.getElementById(name);\n\t\t\t\tif (!node) return found;\n\t\t\t\tif (this.idGetsName && node.getAttributeNode('id').nodeValue != name) break simpleSelectors;\n\t\t\t\tif (first) return node || null;\n\t\t\t\tif (!(hasOthers && uniques[this.getUID(node)])) found.push(node);\n\n\t\t\t} else if (symbol == '.'){\n\n\t\t\t\tif (!this.isHTMLDocument || ((!context.getElementsByClassName || this.brokenGEBCN) && context.querySelectorAll)) break simpleSelectors;\n\t\t\t\tif (context.getElementsByClassName && !this.brokenGEBCN){\n\t\t\t\t\tnodes = context.getElementsByClassName(name);\n\t\t\t\t\tif (first) return nodes[0] || null;\n\t\t\t\t\tfor (i = 0; node = nodes[i++];){\n\t\t\t\t\t\tif (!(hasOthers && uniques[this.getUID(node)])) found.push(node);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tvar matchClass = new RegExp('(^|\\\\s)'+ Slick.escapeRegExp(name) +'(\\\\s|$)');\n\t\t\t\t\tnodes = context.getElementsByTagName('*');\n\t\t\t\t\tfor (i = 0; node = nodes[i++];){\n\t\t\t\t\t\tclassName = node.className;\n\t\t\t\t\t\tif (!(className && matchClass.test(className))) continue;\n\t\t\t\t\t\tif (first) return node;\n\t\t\t\t\t\tif (!(hasOthers && uniques[this.getUID(node)])) found.push(node);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif (hasOthers) this.sort(found);\n\t\t\treturn (first) ? null : found;\n\n\t\t}\n\t\t/*</simple-selectors-override>*/\n\n\t\t/*<query-selector-override>*/\n\t\tquerySelector: if (context.querySelectorAll){\n\n\t\t\tif (!this.isHTMLDocument\n\t\t\t\t|| qsaFailExpCache[expression]\n\t\t\t\t//TODO: only skip when expression is actually mixed case\n\t\t\t\t|| this.brokenMixedCaseQSA\n\t\t\t\t|| (this.brokenCheckedQSA && expression.indexOf(':checked') > -1)\n\t\t\t\t|| (this.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression))\n\t\t\t\t|| (!contextIsDocument //Abort when !contextIsDocument and...\n\t\t\t\t\t//  there are multiple expressions in the selector\n\t\t\t\t\t//  since we currently only fix non-document rooted QSA for single expression selectors\n\t\t\t\t\t&& expression.indexOf(',') > -1\n\t\t\t\t)\n\t\t\t\t|| Slick.disableQSA\n\t\t\t) break querySelector;\n\n\t\t\tvar _expression = expression, _context = context, currentId;\n\t\t\tif (!contextIsDocument){\n\t\t\t\t// non-document rooted QSA\n\t\t\t\t// credits to Andrew Dupont\n\t\t\t\tcurrentId = _context.getAttribute('id'), slickid = 'slickid__';\n\t\t\t\t_context.setAttribute('id', slickid);\n\t\t\t\t_expression = '#' + slickid + ' ' + _expression;\n\t\t\t\tcontext = _context.parentNode;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tif (first) return context.querySelector(_expression) || null;\n\t\t\t\telse nodes = context.querySelectorAll(_expression);\n\t\t\t} catch (e){\n\t\t\t\tqsaFailExpCache[expression] = 1;\n\t\t\t\tbreak querySelector;\n\t\t\t} finally {\n\t\t\t\tif (!contextIsDocument){\n\t\t\t\t\tif (currentId) _context.setAttribute('id', currentId);\n\t\t\t\t\telse _context.removeAttribute('id');\n\t\t\t\t\tcontext = _context;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){\n\t\t\t\tif (node.nodeName > '@' && !(hasOthers && uniques[this.getUID(node)])) found.push(node);\n\t\t\t} else for (i = 0; node = nodes[i++];){\n\t\t\t\tif (!(hasOthers && uniques[this.getUID(node)])) found.push(node);\n\t\t\t}\n\n\t\t\tif (hasOthers) this.sort(found);\n\t\t\treturn found;\n\n\t\t}\n\t\t/*</query-selector-override>*/\n\n\t\tparsed = this.Slick.parse(expression);\n\t\tif (!parsed.length) return found;\n\t} else if (expression == null){ // there is no expression\n\t\treturn found;\n\t} else if (expression.Slick){ // expression is a parsed Slick object\n\t\tparsed = expression;\n\t} else if (this.contains(context.documentElement || context, expression)){ // expression is a node\n\t\t(found) ? found.push(expression) : found = expression;\n\t\treturn found;\n\t} else { // other junk\n\t\treturn found;\n\t}\n\n\t/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/\n\n\t// cache elements for the nth selectors\n\n\tthis.posNTH = {};\n\tthis.posNTHLast = {};\n\tthis.posNTHType = {};\n\tthis.posNTHTypeLast = {};\n\n\t/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/\n\n\t// if append is null and there is only a single selector with one expression use pushArray, else use pushUID\n\tthis.push = (!hasOthers && (first || (parsed.length == 1 && parsed.expressions[0].length == 1))) ? this.pushArray : this.pushUID;\n\n\tif (found == null) found = [];\n\n\t// default engine\n\n\tvar j, m, n;\n\tvar combinator, tag, id, classList, classes, attributes, pseudos;\n\tvar currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions;\n\n\tsearch: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0; (currentBit = currentExpression[j]); j++){\n\n\t\tcombinator = 'combinator:' + currentBit.combinator;\n\t\tif (!this[combinator]) continue search;\n\n\t\ttag        = (this.isXMLDocument) ? currentBit.tag : currentBit.tag.toUpperCase();\n\t\tid         = currentBit.id;\n\t\tclassList  = currentBit.classList;\n\t\tclasses    = currentBit.classes;\n\t\tattributes = currentBit.attributes;\n\t\tpseudos    = currentBit.pseudos;\n\t\tlastBit    = (j === (currentExpression.length - 1));\n\n\t\tthis.bitUniques = {};\n\n\t\tif (lastBit){\n\t\t\tthis.uniques = uniques;\n\t\t\tthis.found = found;\n\t\t} else {\n\t\t\tthis.uniques = {};\n\t\t\tthis.found = [];\n\t\t}\n\n\t\tif (j === 0){\n\t\t\tthis[combinator](context, tag, id, classes, attributes, pseudos, classList);\n\t\t\tif (first && lastBit && found.length) break search;\n\t\t} else {\n\t\t\tif (first && lastBit) for (m = 0, n = currentItems.length; m < n; m++){\n\t\t\t\tthis[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);\n\t\t\t\tif (found.length) break search;\n\t\t\t} else for (m = 0, n = currentItems.length; m < n; m++) this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);\n\t\t}\n\n\t\tcurrentItems = this.found;\n\t}\n\n\t// should sort if there are nodes in append and if you pass multiple expressions.\n\tif (hasOthers || (parsed.expressions.length > 1)) this.sort(found);\n\n\treturn (first) ? (found[0] || null) : found;\n};\n\n// Utils\n\nlocal.uidx = 1;\nlocal.uidk = 'slick-uniqueid';\n\nlocal.getUIDXML = function(node){\n\tvar uid = node.getAttribute(this.uidk);\n\tif (!uid){\n\t\tuid = this.uidx++;\n\t\tnode.setAttribute(this.uidk, uid);\n\t}\n\treturn uid;\n};\n\nlocal.getUIDHTML = function(node){\n\treturn node.uniqueNumber || (node.uniqueNumber = this.uidx++);\n};\n\n// sort based on the setDocument documentSorter method.\n\nlocal.sort = function(results){\n\tif (!this.documentSorter) return results;\n\tresults.sort(this.documentSorter);\n\treturn results;\n};\n\n/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/\n\nlocal.cacheNTH = {};\n\nlocal.matchNTH = /^([+-]?\\d*)?([a-z]+)?([+-]\\d+)?$/;\n\nlocal.parseNTHArgument = function(argument){\n\tvar parsed = argument.match(this.matchNTH);\n\tif (!parsed) return false;\n\tvar special = parsed[2] || false;\n\tvar a = parsed[1] || 1;\n\tif (a == '-') a = -1;\n\tvar b = +parsed[3] || 0;\n\tparsed =\n\t\t(special == 'n')\t? {a: a, b: b} :\n\t\t(special == 'odd')\t? {a: 2, b: 1} :\n\t\t(special == 'even')\t? {a: 2, b: 0} : {a: 0, b: a};\n\n\treturn (this.cacheNTH[argument] = parsed);\n};\n\nlocal.createNTHPseudo = function(child, sibling, positions, ofType){\n\treturn function(node, argument){\n\t\tvar uid = this.getUID(node);\n\t\tif (!this[positions][uid]){\n\t\t\tvar parent = node.parentNode;\n\t\t\tif (!parent) return false;\n\t\t\tvar el = parent[child], count = 1;\n\t\t\tif (ofType){\n\t\t\t\tvar nodeName = node.nodeName;\n\t\t\t\tdo {\n\t\t\t\t\tif (el.nodeName != nodeName) continue;\n\t\t\t\t\tthis[positions][this.getUID(el)] = count++;\n\t\t\t\t} while ((el = el[sibling]));\n\t\t\t} else {\n\t\t\t\tdo {\n\t\t\t\t\tif (el.nodeType != 1) continue;\n\t\t\t\t\tthis[positions][this.getUID(el)] = count++;\n\t\t\t\t} while ((el = el[sibling]));\n\t\t\t}\n\t\t}\n\t\targument = argument || 'n';\n\t\tvar parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument);\n\t\tif (!parsed) return false;\n\t\tvar a = parsed.a, b = parsed.b, pos = this[positions][uid];\n\t\tif (a == 0) return b == pos;\n\t\tif (a > 0){\n\t\t\tif (pos < b) return false;\n\t\t} else {\n\t\t\tif (b < pos) return false;\n\t\t}\n\t\treturn ((pos - b) % a) == 0;\n\t};\n};\n\n/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/\n\nlocal.pushArray = function(node, tag, id, classes, attributes, pseudos){\n\tif (this.matchSelector(node, tag, id, classes, attributes, pseudos)) this.found.push(node);\n};\n\nlocal.pushUID = function(node, tag, id, classes, attributes, pseudos){\n\tvar uid = this.getUID(node);\n\tif (!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos)){\n\t\tthis.uniques[uid] = true;\n\t\tthis.found.push(node);\n\t}\n};\n\nlocal.matchNode = function(node, selector){\n\tif (this.isHTMLDocument && this.nativeMatchesSelector){\n\t\ttry {\n\t\t\treturn this.nativeMatchesSelector.call(node, selector.replace(/\\[([^=]+)=\\s*([^'\"\\]]+?)\\s*\\]/g, '[$1=\"$2\"]'));\n\t\t} catch (matchError){}\n\t}\n\n\tvar parsed = this.Slick.parse(selector);\n\tif (!parsed) return true;\n\n\t// simple (single) selectors\n\tvar expressions = parsed.expressions, simpleExpCounter = 0, i, currentExpression;\n\tfor (i = 0; (currentExpression = expressions[i]); i++){\n\t\tif (currentExpression.length == 1){\n\t\t\tvar exp = currentExpression[0];\n\t\t\tif (this.matchSelector(node, (this.isXMLDocument) ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos)) return true;\n\t\t\tsimpleExpCounter++;\n\t\t}\n\t}\n\n\tif (simpleExpCounter == parsed.length) return false;\n\n\tvar nodes = this.search(this.document, parsed), item;\n\tfor (i = 0; item = nodes[i++];){\n\t\tif (item === node) return true;\n\t}\n\treturn false;\n};\n\nlocal.matchPseudo = function(node, name, argument){\n\tvar pseudoName = 'pseudo:' + name;\n\tif (this[pseudoName]) return this[pseudoName](node, argument);\n\tvar attribute = this.getAttribute(node, name);\n\treturn (argument) ? argument == attribute : !!attribute;\n};\n\nlocal.matchSelector = function(node, tag, id, classes, attributes, pseudos){\n\tif (tag){\n\t\tvar nodeName = (this.isXMLDocument) ? node.nodeName : node.nodeName.toUpperCase();\n\t\tif (tag == '*'){\n\t\t\tif (nodeName < '@') return false; // Fix for comment nodes and closed nodes\n\t\t} else {\n\t\t\tif (nodeName != tag) return false;\n\t\t}\n\t}\n\n\tif (id && node.getAttribute('id') != id) return false;\n\n\tvar i, part, cls;\n\tif (classes) for (i = classes.length; i--;){\n\t\tcls = this.getAttribute(node, 'class');\n\t\tif (!(cls && classes[i].regexp.test(cls))) return false;\n\t}\n\tif (attributes) for (i = attributes.length; i--;){\n\t\tpart = attributes[i];\n\t\tif (part.operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return false;\n\t}\n\tif (pseudos) for (i = pseudos.length; i--;){\n\t\tpart = pseudos[i];\n\t\tif (!this.matchPseudo(node, part.key, part.value)) return false;\n\t}\n\treturn true;\n};\n\nvar combinators = {\n\n\t' ': function(node, tag, id, classes, attributes, pseudos, classList){ // all child nodes, any level\n\n\t\tvar i, item, children;\n\n\t\tif (this.isHTMLDocument){\n\t\t\tgetById: if (id){\n\t\t\t\titem = this.document.getElementById(id);\n\t\t\t\tif ((!item && node.all) || (this.idGetsName && item && item.getAttributeNode('id').nodeValue != id)){\n\t\t\t\t\t// all[id] returns all the elements with that name or id inside node\n\t\t\t\t\t// if theres just one it will return the element, else it will be a collection\n\t\t\t\t\tchildren = node.all[id];\n\t\t\t\t\tif (!children) return;\n\t\t\t\t\tif (!children[0]) children = [children];\n\t\t\t\t\tfor (i = 0; item = children[i++];){\n\t\t\t\t\t\tvar idNode = item.getAttributeNode('id');\n\t\t\t\t\t\tif (idNode && idNode.nodeValue == id){\n\t\t\t\t\t\t\tthis.push(item, tag, null, classes, attributes, pseudos);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!item){\n\t\t\t\t\t// if the context is in the dom we return, else we will try GEBTN, breaking the getById label\n\t\t\t\t\tif (this.contains(this.root, node)) return;\n\t\t\t\t\telse break getById;\n\t\t\t\t} else if (this.document !== node && !this.contains(node, item)) return;\n\t\t\t\tthis.push(item, tag, null, classes, attributes, pseudos);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgetByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN){\n\t\t\t\tchildren = node.getElementsByClassName(classList.join(' '));\n\t\t\t\tif (!(children && children.length)) break getByClass;\n\t\t\t\tfor (i = 0; item = children[i++];) this.push(item, tag, id, null, attributes, pseudos);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tgetByTag: {\n\t\t\tchildren = node.getElementsByTagName(tag);\n\t\t\tif (!(children && children.length)) break getByTag;\n\t\t\tif (!this.brokenStarGEBTN) tag = null;\n\t\t\tfor (i = 0; item = children[i++];) this.push(item, tag, id, classes, attributes, pseudos);\n\t\t}\n\t},\n\n\t'>': function(node, tag, id, classes, attributes, pseudos){ // direct children\n\t\tif ((node = node.firstChild)) do {\n\t\t\tif (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);\n\t\t} while ((node = node.nextSibling));\n\t},\n\n\t'+': function(node, tag, id, classes, attributes, pseudos){ // next sibling\n\t\twhile ((node = node.nextSibling)) if (node.nodeType == 1){\n\t\t\tthis.push(node, tag, id, classes, attributes, pseudos);\n\t\t\tbreak;\n\t\t}\n\t},\n\n\t'^': function(node, tag, id, classes, attributes, pseudos){ // first child\n\t\tnode = node.firstChild;\n\t\tif (node){\n\t\t\tif (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);\n\t\t\telse this['combinator:+'](node, tag, id, classes, attributes, pseudos);\n\t\t}\n\t},\n\n\t'~': function(node, tag, id, classes, attributes, pseudos){ // next siblings\n\t\twhile ((node = node.nextSibling)){\n\t\t\tif (node.nodeType != 1) continue;\n\t\t\tvar uid = this.getUID(node);\n\t\t\tif (this.bitUniques[uid]) break;\n\t\t\tthis.bitUniques[uid] = true;\n\t\t\tthis.push(node, tag, id, classes, attributes, pseudos);\n\t\t}\n\t},\n\n\t'++': function(node, tag, id, classes, attributes, pseudos){ // next sibling and previous sibling\n\t\tthis['combinator:+'](node, tag, id, classes, attributes, pseudos);\n\t\tthis['combinator:!+'](node, tag, id, classes, attributes, pseudos);\n\t},\n\n\t'~~': function(node, tag, id, classes, attributes, pseudos){ // next siblings and previous siblings\n\t\tthis['combinator:~'](node, tag, id, classes, attributes, pseudos);\n\t\tthis['combinator:!~'](node, tag, id, classes, attributes, pseudos);\n\t},\n\n\t'!': function(node, tag, id, classes, attributes, pseudos){ // all parent nodes up to document\n\t\twhile ((node = node.parentNode)) if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);\n\t},\n\n\t'!>': function(node, tag, id, classes, attributes, pseudos){ // direct parent (one level)\n\t\tnode = node.parentNode;\n\t\tif (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);\n\t},\n\n\t'!+': function(node, tag, id, classes, attributes, pseudos){ // previous sibling\n\t\twhile ((node = node.previousSibling)) if (node.nodeType == 1){\n\t\t\tthis.push(node, tag, id, classes, attributes, pseudos);\n\t\t\tbreak;\n\t\t}\n\t},\n\n\t'!^': function(node, tag, id, classes, attributes, pseudos){ // last child\n\t\tnode = node.lastChild;\n\t\tif (node){\n\t\t\tif (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);\n\t\t\telse this['combinator:!+'](node, tag, id, classes, attributes, pseudos);\n\t\t}\n\t},\n\n\t'!~': function(node, tag, id, classes, attributes, pseudos){ // previous siblings\n\t\twhile ((node = node.previousSibling)){\n\t\t\tif (node.nodeType != 1) continue;\n\t\t\tvar uid = this.getUID(node);\n\t\t\tif (this.bitUniques[uid]) break;\n\t\t\tthis.bitUniques[uid] = true;\n\t\t\tthis.push(node, tag, id, classes, attributes, pseudos);\n\t\t}\n\t}\n\n};\n\nfor (var c in combinators) local['combinator:' + c] = combinators[c];\n\nvar pseudos = {\n\n\t/*<pseudo-selectors>*/\n\n\t'empty': function(node){\n\t\tvar child = node.firstChild;\n\t\treturn !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length;\n\t},\n\n\t'not': function(node, expression){\n\t\treturn !this.matchNode(node, expression);\n\t},\n\n\t'contains': function(node, text){\n\t\treturn (node.innerText || node.textContent || '').indexOf(text) > -1;\n\t},\n\n\t'first-child': function(node){\n\t\twhile ((node = node.previousSibling)) if (node.nodeType == 1) return false;\n\t\treturn true;\n\t},\n\n\t'last-child': function(node){\n\t\twhile ((node = node.nextSibling)) if (node.nodeType == 1) return false;\n\t\treturn true;\n\t},\n\n\t'only-child': function(node){\n\t\tvar prev = node;\n\t\twhile ((prev = prev.previousSibling)) if (prev.nodeType == 1) return false;\n\t\tvar next = node;\n\t\twhile ((next = next.nextSibling)) if (next.nodeType == 1) return false;\n\t\treturn true;\n\t},\n\n\t/*<nth-pseudo-selectors>*/\n\n\t'nth-child': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTH'),\n\n\t'nth-last-child': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHLast'),\n\n\t'nth-of-type': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTHType', true),\n\n\t'nth-last-of-type': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHTypeLast', true),\n\n\t'index': function(node, index){\n\t\treturn this['pseudo:nth-child'](node, '' + (index + 1));\n\t},\n\n\t'even': function(node){\n\t\treturn this['pseudo:nth-child'](node, '2n');\n\t},\n\n\t'odd': function(node){\n\t\treturn this['pseudo:nth-child'](node, '2n+1');\n\t},\n\n\t/*</nth-pseudo-selectors>*/\n\n\t/*<of-type-pseudo-selectors>*/\n\n\t'first-of-type': function(node){\n\t\tvar nodeName = node.nodeName;\n\t\twhile ((node = node.previousSibling)) if (node.nodeName == nodeName) return false;\n\t\treturn true;\n\t},\n\n\t'last-of-type': function(node){\n\t\tvar nodeName = node.nodeName;\n\t\twhile ((node = node.nextSibling)) if (node.nodeName == nodeName) return false;\n\t\treturn true;\n\t},\n\n\t'only-of-type': function(node){\n\t\tvar prev = node, nodeName = node.nodeName;\n\t\twhile ((prev = prev.previousSibling)) if (prev.nodeName == nodeName) return false;\n\t\tvar next = node;\n\t\twhile ((next = next.nextSibling)) if (next.nodeName == nodeName) return false;\n\t\treturn true;\n\t},\n\n\t/*</of-type-pseudo-selectors>*/\n\n\t// custom pseudos\n\n\t'enabled': function(node){\n\t\treturn !node.disabled;\n\t},\n\n\t'disabled': function(node){\n\t\treturn node.disabled;\n\t},\n\n\t'checked': function(node){\n\t\treturn node.checked || node.selected;\n\t},\n\n\t'focus': function(node){\n\t\treturn this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, 'tabindex'));\n\t},\n\n\t'root': function(node){\n\t\treturn (node === this.root);\n\t},\n\n\t'selected': function(node){\n\t\treturn node.selected;\n\t}\n\n\t/*</pseudo-selectors>*/\n};\n\nfor (var p in pseudos) local['pseudo:' + p] = pseudos[p];\n\n// attributes methods\n\nvar attributeGetters = local.attributeGetters = {\n\n\t'for': function(){\n\t\treturn ('htmlFor' in this) ? this.htmlFor : this.getAttribute('for');\n\t},\n\n\t'href': function(){\n\t\treturn ('href' in this) ? this.getAttribute('href', 2) : this.getAttribute('href');\n\t},\n\n\t'style': function(){\n\t\treturn (this.style) ? this.style.cssText : this.getAttribute('style');\n\t},\n\n\t'tabindex': function(){\n\t\tvar attributeNode = this.getAttributeNode('tabindex');\n\t\treturn (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null;\n\t},\n\n\t'type': function(){\n\t\treturn this.getAttribute('type');\n\t},\n\n\t'maxlength': function(){\n\t\tvar attributeNode = this.getAttributeNode('maxLength');\n\t\treturn (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null;\n\t}\n\n};\n\nattributeGetters.MAXLENGTH = attributeGetters.maxLength = attributeGetters.maxlength;\n\n// Slick\n\nvar Slick = local.Slick = (this.Slick || {});\n\nSlick.version = '1.1.7';\n\n// Slick finder\n\nSlick.search = function(context, expression, append){\n\treturn local.search(context, expression, append);\n};\n\nSlick.find = function(context, expression){\n\treturn local.search(context, expression, null, true);\n};\n\n// Slick containment checker\n\nSlick.contains = function(container, node){\n\tlocal.setDocument(container);\n\treturn local.contains(container, node);\n};\n\n// Slick attribute getter\n\nSlick.getAttribute = function(node, name){\n\tlocal.setDocument(node);\n\treturn local.getAttribute(node, name);\n};\n\nSlick.hasAttribute = function(node, name){\n\tlocal.setDocument(node);\n\treturn local.hasAttribute(node, name);\n};\n\n// Slick matcher\n\nSlick.match = function(node, selector){\n\tif (!(node && selector)) return false;\n\tif (!selector || selector === node) return true;\n\tlocal.setDocument(node);\n\treturn local.matchNode(node, selector);\n};\n\n// Slick attribute accessor\n\nSlick.defineAttributeGetter = function(name, fn){\n\tlocal.attributeGetters[name] = fn;\n\treturn this;\n};\n\nSlick.lookupAttributeGetter = function(name){\n\treturn local.attributeGetters[name];\n};\n\n// Slick pseudo accessor\n\nSlick.definePseudo = function(name, fn){\n\tlocal['pseudo:' + name] = function(node, argument){\n\t\treturn fn.call(node, argument);\n\t};\n\treturn this;\n};\n\nSlick.lookupPseudo = function(name){\n\tvar pseudo = local['pseudo:' + name];\n\tif (pseudo) return function(argument){\n\t\treturn pseudo.call(this, argument);\n\t};\n\treturn null;\n};\n\n// Slick overrides accessor\n\nSlick.override = function(regexp, fn){\n\tlocal.override(regexp, fn);\n\treturn this;\n};\n\nSlick.isXML = local.isXML;\n\nSlick.uidOf = function(node){\n\treturn local.getUIDHTML(node);\n};\n\nif (!this.Slick) this.Slick = Slick;\n\n}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);\n\n/*\n---\n\nname: Element\n\ndescription: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements.\n\nlicense: MIT-style license.\n\nrequires: [Window, Document, Array, String, Function, Object, Number, Slick.Parser, Slick.Finder]\n\nprovides: [Element, Elements, $, $$, IFrame, Selectors]\n\n...\n*/\n\nvar Element = this.Element = function(tag, props){\n\tvar konstructor = Element.Constructors[tag];\n\tif (konstructor) return konstructor(props);\n\tif (typeof tag != 'string') return document.id(tag).set(props);\n\n\tif (!props) props = {};\n\n\tif (!(/^[\\w-]+$/).test(tag)){\n\t\tvar parsed = Slick.parse(tag).expressions[0][0];\n\t\ttag = (parsed.tag == '*') ? 'div' : parsed.tag;\n\t\tif (parsed.id && props.id == null) props.id = parsed.id;\n\n\t\tvar attributes = parsed.attributes;\n\t\tif (attributes) for (var attr, i = 0, l = attributes.length; i < l; i++){\n\t\t\tattr = attributes[i];\n\t\t\tif (props[attr.key] != null) continue;\n\n\t\t\tif (attr.value != null && attr.operator == '=') props[attr.key] = attr.value;\n\t\t\telse if (!attr.value && !attr.operator) props[attr.key] = true;\n\t\t}\n\n\t\tif (parsed.classList && props['class'] == null) props['class'] = parsed.classList.join(' ');\n\t}\n\n\treturn document.newElement(tag, props);\n};\n\n\nif (Browser.Element){\n\tElement.prototype = Browser.Element.prototype;\n\t// IE8 and IE9 require the wrapping.\n\tElement.prototype._fireEvent = (function(fireEvent){\n\t\treturn function(type, event){\n\t\t\treturn fireEvent.call(this, type, event);\n\t\t};\n\t})(Element.prototype.fireEvent);\n}\n\nnew Type('Element', Element).mirror(function(name){\n\tif (Array.prototype[name]) return;\n\n\tvar obj = {};\n\tobj[name] = function(){\n\t\tvar results = [], args = arguments, elements = true;\n\t\tfor (var i = 0, l = this.length; i < l; i++){\n\t\t\tvar element = this[i], result = results[i] = element[name].apply(element, args);\n\t\t\telements = (elements && typeOf(result) == 'element');\n\t\t}\n\t\treturn (elements) ? new Elements(results) : results;\n\t};\n\n\tElements.implement(obj);\n});\n\nif (!Browser.Element){\n\tElement.parent = Object;\n\n\tElement.Prototype = {\n\t\t'$constructor': Element,\n\t\t'$family': Function.convert('element').hide()\n\t};\n\n\tElement.mirror(function(name, method){\n\t\tElement.Prototype[name] = method;\n\t});\n}\n\nElement.Constructors = {};\n\n\n\nvar IFrame = new Type('IFrame', function(){\n\tvar params = Array.link(arguments, {\n\t\tproperties: Type.isObject,\n\t\tiframe: function(obj){\n\t\t\treturn (obj != null);\n\t\t}\n\t});\n\n\tvar props = params.properties || {}, iframe;\n\tif (params.iframe) iframe = document.id(params.iframe);\n\tvar onload = props.onload || function(){};\n\tdelete props.onload;\n\tprops.id = props.name = [props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + String.uniqueID()].pick();\n\tiframe = new Element(iframe || 'iframe', props);\n\n\tvar onLoad = function(){\n\t\tonload.call(iframe.contentWindow);\n\t};\n\n\tif (window.frames[props.id]) onLoad();\n\telse iframe.addListener('load', onLoad);\n\treturn iframe;\n});\n\nvar Elements = this.Elements = function(nodes){\n\tif (nodes && nodes.length){\n\t\tvar uniques = {}, node;\n\t\tfor (var i = 0; node = nodes[i++];){\n\t\t\tvar uid = Slick.uidOf(node);\n\t\t\tif (!uniques[uid]){\n\t\t\t\tuniques[uid] = true;\n\t\t\t\tthis.push(node);\n\t\t\t}\n\t\t}\n\t}\n};\n\nElements.prototype = {length: 0};\nElements.parent = Array;\n\nnew Type('Elements', Elements).implement({\n\n\tfilter: function(filter, bind){\n\t\tif (!filter) return this;\n\t\treturn new Elements(Array.filter(this, (typeOf(filter) == 'string') ? function(item){\n\t\t\treturn item.match(filter);\n\t\t} : filter, bind));\n\t}.protect(),\n\n\tpush: function(){\n\t\tvar length = this.length;\n\t\tfor (var i = 0, l = arguments.length; i < l; i++){\n\t\t\tvar item = document.id(arguments[i]);\n\t\t\tif (item) this[length++] = item;\n\t\t}\n\t\treturn (this.length = length);\n\t}.protect(),\n\n\tunshift: function(){\n\t\tvar items = [];\n\t\tfor (var i = 0, l = arguments.length; i < l; i++){\n\t\t\tvar item = document.id(arguments[i]);\n\t\t\tif (item) items.push(item);\n\t\t}\n\t\treturn Array.prototype.unshift.apply(this, items);\n\t}.protect(),\n\n\tconcat: function(){\n\t\tvar newElements = new Elements(this);\n\t\tfor (var i = 0, l = arguments.length; i < l; i++){\n\t\t\tvar item = arguments[i];\n\t\t\tif (Type.isEnumerable(item)) newElements.append(item);\n\t\t\telse newElements.push(item);\n\t\t}\n\t\treturn newElements;\n\t}.protect(),\n\n\tappend: function(collection){\n\t\tfor (var i = 0, l = collection.length; i < l; i++) this.push(collection[i]);\n\t\treturn this;\n\t}.protect(),\n\n\tempty: function(){\n\t\twhile (this.length) delete this[--this.length];\n\t\treturn this;\n\t}.protect()\n\n});\n\n\n\n(function(){\n\n// FF, IE\nvar splice = Array.prototype.splice, object = {'0': 0, '1': 1, length: 2};\n\nsplice.call(object, 1, 1);\nif (object[1] == 1) Elements.implement('splice', function(){\n\tvar length = this.length;\n\tvar result = splice.apply(this, arguments);\n\twhile (length >= this.length) delete this[length--];\n\treturn result;\n}.protect());\n\nArray.forEachMethod(function(method, name){\n\tElements.implement(name, method);\n});\n\nArray.mirror(Elements);\n\n/*<ltIE8>*/\nvar createElementAcceptsHTML;\ntry {\n\tcreateElementAcceptsHTML = (document.createElement('<input name=x>').name == 'x');\n} catch (e){}\n\nvar escapeQuotes = function(html){\n\treturn ('' + html).replace(/&/g, '&amp;').replace(/\"/g, '&quot;');\n};\n/*</ltIE8>*/\n\n/*<ltIE9>*/\n// #2479 - IE8 Cannot set HTML of style element\nvar canChangeStyleHTML = (function(){\n\tvar div = document.createElement('style'),\n\t\tflag = false;\n\ttry {\n\t\tdiv.innerHTML = '#justTesing{margin: 0px;}';\n\t\tflag = !!div.innerHTML;\n\t} catch (e){}\n\treturn flag;\n})();\n/*</ltIE9>*/\n\nDocument.implement({\n\n\tnewElement: function(tag, props){\n\t\tif (props){\n\t\t\tif (props.checked != null) props.defaultChecked = props.checked;\n\t\t\tif ((props.type == 'checkbox' || props.type == 'radio') && props.value == null) props.value = 'on';\n\t\t\t/*<ltIE9>*/ // IE needs the type to be set before changing content of style element\n\t\t\tif (!canChangeStyleHTML && tag == 'style'){\n\t\t\t\tvar styleElement = document.createElement('style');\n\t\t\t\tstyleElement.setAttribute('type', 'text/css');\n\t\t\t\tif (props.type) delete props.type;\n\t\t\t\treturn this.id(styleElement).set(props);\n\t\t\t}\n\t\t\t/*</ltIE9>*/\n\t\t\t/*<ltIE8>*/// Fix for readonly name and type properties in IE < 8\n\t\t\tif (createElementAcceptsHTML){\n\t\t\t\ttag = '<' + tag;\n\t\t\t\tif (props.name) tag += ' name=\"' + escapeQuotes(props.name) + '\"';\n\t\t\t\tif (props.type) tag += ' type=\"' + escapeQuotes(props.type) + '\"';\n\t\t\t\ttag += '>';\n\t\t\t\tdelete props.name;\n\t\t\t\tdelete props.type;\n\t\t\t}\n\t\t\t/*</ltIE8>*/\n\t\t}\n\t\treturn this.id(this.createElement(tag)).set(props);\n\t}\n\n});\n\n})();\n\n(function(){\n\nSlick.uidOf(window);\nSlick.uidOf(document);\n\nDocument.implement({\n\n\tnewTextNode: function(text){\n\t\treturn this.createTextNode(text);\n\t},\n\n\tgetDocument: function(){\n\t\treturn this;\n\t},\n\n\tgetWindow: function(){\n\t\treturn this.window;\n\t},\n\n\tid: (function(){\n\n\t\tvar types = {\n\n\t\t\tstring: function(id, nocash, doc){\n\t\t\t\tid = Slick.find(doc, '#' + id.replace(/(\\W)/g, '\\\\$1'));\n\t\t\t\treturn (id) ? types.element(id, nocash) : null;\n\t\t\t},\n\n\t\t\telement: function(el, nocash){\n\t\t\t\tSlick.uidOf(el);\n\t\t\t\tif (!nocash && !el.$family && !(/^(?:object|embed)$/i).test(el.tagName)){\n\t\t\t\t\tvar fireEvent = el.fireEvent;\n\t\t\t\t\t// wrapping needed in IE7, or else crash\n\t\t\t\t\tel._fireEvent = function(type, event){\n\t\t\t\t\t\treturn fireEvent(type, event);\n\t\t\t\t\t};\n\t\t\t\t\tObject.append(el, Element.Prototype);\n\t\t\t\t}\n\t\t\t\treturn el;\n\t\t\t},\n\n\t\t\tobject: function(obj, nocash, doc){\n\t\t\t\tif (obj.toElement) return types.element(obj.toElement(doc), nocash);\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t};\n\n\t\ttypes.textnode = types.whitespace = types.window = types.document = function(zero){\n\t\t\treturn zero;\n\t\t};\n\n\t\treturn function(el, nocash, doc){\n\t\t\tif (el && el.$family && el.uniqueNumber) return el;\n\t\t\tvar type = typeOf(el);\n\t\t\treturn (types[type]) ? types[type](el, nocash, doc || document) : null;\n\t\t};\n\n\t})()\n\n});\n\nif (window.$ == null) Window.implement('$', function(el, nc){\n\treturn document.id(el, nc, this.document);\n});\n\nWindow.implement({\n\n\tgetDocument: function(){\n\t\treturn this.document;\n\t},\n\n\tgetWindow: function(){\n\t\treturn this;\n\t}\n\n});\n\n[Document, Element].invoke('implement', {\n\n\tgetElements: function(expression){\n\t\treturn Slick.search(this, expression, new Elements);\n\t},\n\n\tgetElement: function(expression){\n\t\treturn document.id(Slick.find(this, expression));\n\t}\n\n});\n\nvar contains = {contains: function(element){\n\treturn Slick.contains(this, element);\n}};\n\nif (!document.contains) Document.implement(contains);\nif (!document.createElement('div').contains) Element.implement(contains);\n\n\n\n// tree walking\n\nvar injectCombinator = function(expression, combinator){\n\tif (!expression) return combinator;\n\n\texpression = Object.clone(Slick.parse(expression));\n\n\tvar expressions = expression.expressions;\n\tfor (var i = expressions.length; i--;)\n\t\texpressions[i][0].combinator = combinator;\n\n\treturn expression;\n};\n\nObject.forEach({\n\tgetNext: '~',\n\tgetPrevious: '!~',\n\tgetParent: '!'\n}, function(combinator, method){\n\tElement.implement(method, function(expression){\n\t\treturn this.getElement(injectCombinator(expression, combinator));\n\t});\n});\n\nObject.forEach({\n\tgetAllNext: '~',\n\tgetAllPrevious: '!~',\n\tgetSiblings: '~~',\n\tgetChildren: '>',\n\tgetParents: '!'\n}, function(combinator, method){\n\tElement.implement(method, function(expression){\n\t\treturn this.getElements(injectCombinator(expression, combinator));\n\t});\n});\n\nElement.implement({\n\n\tgetFirst: function(expression){\n\t\treturn document.id(Slick.search(this, injectCombinator(expression, '>'))[0]);\n\t},\n\n\tgetLast: function(expression){\n\t\treturn document.id(Slick.search(this, injectCombinator(expression, '>')).getLast());\n\t},\n\n\tgetWindow: function(){\n\t\treturn this.ownerDocument.window;\n\t},\n\n\tgetDocument: function(){\n\t\treturn this.ownerDocument;\n\t},\n\n\tgetElementById: function(id){\n\t\treturn document.id(Slick.find(this, '#' + ('' + id).replace(/(\\W)/g, '\\\\$1')));\n\t},\n\n\tmatch: function(expression){\n\t\treturn !expression || Slick.match(this, expression);\n\t}\n\n});\n\n\n\nif (window.$$ == null) Window.implement('$$', function(selector){\n\tif (arguments.length == 1){\n\t\tif (typeof selector == 'string') return Slick.search(this.document, selector, new Elements);\n\t\telse if (Type.isEnumerable(selector)) return new Elements(selector);\n\t}\n\treturn new Elements(arguments);\n});\n\n// Inserters\n\nvar inserters = {\n\n\tbefore: function(context, element){\n\t\tvar parent = element.parentNode;\n\t\tif (parent) parent.insertBefore(context, element);\n\t},\n\n\tafter: function(context, element){\n\t\tvar parent = element.parentNode;\n\t\tif (parent) parent.insertBefore(context, element.nextSibling);\n\t},\n\n\tbottom: function(context, element){\n\t\telement.appendChild(context);\n\t},\n\n\ttop: function(context, element){\n\t\telement.insertBefore(context, element.firstChild);\n\t}\n\n};\n\ninserters.inside = inserters.bottom;\n\n\n\n// getProperty / setProperty\n\nvar propertyGetters = {}, propertySetters = {};\n\n// properties\n\nvar properties = {};\nArray.forEach([\n\t'type', 'value', 'defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan',\n\t'frameBorder', 'rowSpan', 'tabIndex', 'useMap'\n], function(property){\n\tproperties[property.toLowerCase()] = property;\n});\n\nproperties.html = 'innerHTML';\nproperties.text = (document.createElement('div').textContent == null) ? 'innerText': 'textContent';\n\nObject.forEach(properties, function(real, key){\n\tpropertySetters[key] = function(node, value){\n\t\tnode[real] = value;\n\t};\n\tpropertyGetters[key] = function(node){\n\t\treturn node[real];\n\t};\n});\n\n/*<ltIE9>*/\npropertySetters.text = (function(){\n\treturn function(node, value){\n\t\tif (node.get('tag') == 'style') node.set('html', value);\n\t\telse node[properties.text] = value;\n\t};\n})(propertySetters.text);\n\npropertyGetters.text = (function(getter){\n\treturn function(node){\n\t\treturn (node.get('tag') == 'style') ? node.innerHTML : getter(node);\n\t};\n})(propertyGetters.text);\n/*</ltIE9>*/\n\n// Booleans\n\nvar bools = [\n\t'compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked',\n\t'disabled', 'readOnly', 'multiple', 'selected', 'noresize',\n\t'defer', 'defaultChecked', 'autofocus', 'controls', 'autoplay',\n\t'loop'\n];\n\nvar booleans = {};\nArray.forEach(bools, function(bool){\n\tvar lower = bool.toLowerCase();\n\tbooleans[lower] = bool;\n\tpropertySetters[lower] = function(node, value){\n\t\tnode[bool] = !!value;\n\t};\n\tpropertyGetters[lower] = function(node){\n\t\treturn !!node[bool];\n\t};\n});\n\n// Special cases\n\nObject.append(propertySetters, {\n\n\t'class': function(node, value){\n\t\t('className' in node) ? node.className = (value || '') : node.setAttribute('class', value);\n\t},\n\n\t'for': function(node, value){\n\t\t('htmlFor' in node) ? node.htmlFor = value : node.setAttribute('for', value);\n\t},\n\n\t'style': function(node, value){\n\t\t(node.style) ? node.style.cssText = value : node.setAttribute('style', value);\n\t},\n\n\t'value': function(node, value){\n\t\tnode.value = (value != null) ? value : '';\n\t}\n\n});\n\npropertyGetters['class'] = function(node){\n\treturn ('className' in node) ? node.className || null : node.getAttribute('class');\n};\n\n/* <webkit> */\nvar el = document.createElement('button');\n// IE sets type as readonly and throws\ntry { el.type = 'button'; } catch (e){}\nif (el.type != 'button') propertySetters.type = function(node, value){\n\tnode.setAttribute('type', value);\n};\nel = null;\n/* </webkit> */\n\n/*<IE>*/\n\n/*<ltIE9>*/\n// #2479 - IE8 Cannot set HTML of style element\nvar canChangeStyleHTML = (function(){\n\tvar div = document.createElement('style'),\n\t\tflag = false;\n\ttry {\n\t\tdiv.innerHTML = '#justTesing{margin: 0px;}';\n\t\tflag = !!div.innerHTML;\n\t} catch (e){}\n\treturn flag;\n})();\n/*</ltIE9>*/\n\nvar input = document.createElement('input'), volatileInputValue, html5InputSupport;\n\n// #2178\ninput.value = 't';\ninput.type = 'submit';\nvolatileInputValue = input.value != 't';\n\n// #2443 - IE throws \"Invalid Argument\" when trying to use html5 input types\ntry {\n\tinput.value = '';\n\tinput.type = 'email';\n\thtml5InputSupport = input.type == 'email';\n} catch (e){}\n\ninput = null;\n\nif (volatileInputValue || !html5InputSupport) propertySetters.type = function(node, type){\n\ttry {\n\t\tvar value = node.value;\n\t\tnode.type = type;\n\t\tnode.value = value;\n\t} catch (e){}\n};\n/*</IE>*/\n\n/* getProperty, setProperty */\n\n/* <ltIE9> */\nvar pollutesGetAttribute = (function(div){\n\tdiv.random = 'attribute';\n\treturn (div.getAttribute('random') == 'attribute');\n})(document.createElement('div'));\n\nvar hasCloneBug = (function(test){\n\ttest.innerHTML = '<object><param name=\"should_fix\" value=\"the unknown\" /></object>';\n\treturn test.cloneNode(true).firstChild.childNodes.length != 1;\n})(document.createElement('div'));\n/* </ltIE9> */\n\nvar hasClassList = !!document.createElement('div').classList;\n\nvar classes = function(className){\n\tvar classNames = (className || '').clean().split(' '), uniques = {};\n\treturn classNames.filter(function(className){\n\t\tif (className !== '' && !uniques[className]) return uniques[className] = className;\n\t});\n};\n\nvar addToClassList = function(name){\n\tthis.classList.add(name);\n};\n\nvar removeFromClassList = function(name){\n\tthis.classList.remove(name);\n};\n\nElement.implement({\n\n\tsetProperty: function(name, value){\n\t\tvar setter = propertySetters[name.toLowerCase()];\n\t\tif (setter){\n\t\t\tsetter(this, value);\n\t\t} else {\n\t\t\t/* <ltIE9> */\n\t\t\tvar attributeWhiteList;\n\t\t\tif (pollutesGetAttribute) attributeWhiteList = this.retrieve('$attributeWhiteList', {});\n\t\t\t/* </ltIE9> */\n\n\t\t\tif (value == null){\n\t\t\t\tthis.removeAttribute(name);\n\t\t\t\t/* <ltIE9> */\n\t\t\t\tif (pollutesGetAttribute) delete attributeWhiteList[name];\n\t\t\t\t/* </ltIE9> */\n\t\t\t} else {\n\t\t\t\tthis.setAttribute(name, '' + value);\n\t\t\t\t/* <ltIE9> */\n\t\t\t\tif (pollutesGetAttribute) attributeWhiteList[name] = true;\n\t\t\t\t/* </ltIE9> */\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\tsetProperties: function(attributes){\n\t\tfor (var attribute in attributes) this.setProperty(attribute, attributes[attribute]);\n\t\treturn this;\n\t},\n\n\tgetProperty: function(name){\n\t\tvar getter = propertyGetters[name.toLowerCase()];\n\t\tif (getter) return getter(this);\n\t\t/* <ltIE9> */\n\t\tif (pollutesGetAttribute){\n\t\t\tvar attr = this.getAttributeNode(name), attributeWhiteList = this.retrieve('$attributeWhiteList', {});\n\t\t\tif (!attr) return null;\n\t\t\tif (attr.expando && !attributeWhiteList[name]){\n\t\t\t\tvar outer = this.outerHTML;\n\t\t\t\t// segment by the opening tag and find mention of attribute name\n\t\t\t\tif (outer.substr(0, outer.search(/\\/?['\"]?>(?![^<]*<['\"])/)).indexOf(name) < 0) return null;\n\t\t\t\tattributeWhiteList[name] = true;\n\t\t\t}\n\t\t}\n\t\t/* </ltIE9> */\n\t\tvar result = Slick.getAttribute(this, name);\n\t\treturn (!result && !Slick.hasAttribute(this, name)) ? null : result;\n\t},\n\n\tgetProperties: function(){\n\t\tvar args = Array.convert(arguments);\n\t\treturn args.map(this.getProperty, this).associate(args);\n\t},\n\n\tremoveProperty: function(name){\n\t\treturn this.setProperty(name, null);\n\t},\n\n\tremoveProperties: function(){\n\t\tArray.each(arguments, this.removeProperty, this);\n\t\treturn this;\n\t},\n\n\tset: function(prop, value){\n\t\tvar property = Element.Properties[prop];\n\t\t(property && property.set) ? property.set.call(this, value) : this.setProperty(prop, value);\n\t}.overloadSetter(),\n\n\tget: function(prop){\n\t\tvar property = Element.Properties[prop];\n\t\treturn (property && property.get) ? property.get.apply(this) : this.getProperty(prop);\n\t}.overloadGetter(),\n\n\terase: function(prop){\n\t\tvar property = Element.Properties[prop];\n\t\t(property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop);\n\t\treturn this;\n\t},\n\n\thasClass: hasClassList ? function(className){\n\t\treturn this.classList.contains(className);\n\t} : function(className){\n\t\treturn classes(this.className).contains(className);\n\t},\n\n\taddClass: hasClassList ? function(className){\n\t\tclasses(className).forEach(addToClassList, this);\n\t\treturn this;\n\t} : function(className){\n\t\tthis.className = classes(className + ' ' + this.className).join(' ');\n\t\treturn this;\n\t},\n\n\tremoveClass: hasClassList ? function(className){\n\t\tclasses(className).forEach(removeFromClassList, this);\n\t\treturn this;\n\t} : function(className){\n\t\tvar classNames = classes(this.className);\n\t\tclasses(className).forEach(classNames.erase, classNames);\n\t\tthis.className = classNames.join(' ');\n\t\treturn this;\n\t},\n\n\ttoggleClass: function(className, force){\n\t\tif (force == null) force = !this.hasClass(className);\n\t\treturn (force) ? this.addClass(className) : this.removeClass(className);\n\t},\n\n\tadopt: function(){\n\t\tvar parent = this, fragment, elements = Array.flatten(arguments), length = elements.length;\n\t\tif (length > 1) parent = fragment = document.createDocumentFragment();\n\n\t\tfor (var i = 0; i < length; i++){\n\t\t\tvar element = document.id(elements[i], true);\n\t\t\tif (element) parent.appendChild(element);\n\t\t}\n\n\t\tif (fragment) this.appendChild(fragment);\n\n\t\treturn this;\n\t},\n\n\tappendText: function(text, where){\n\t\treturn this.grab(this.getDocument().newTextNode(text), where);\n\t},\n\n\tgrab: function(el, where){\n\t\tinserters[where || 'bottom'](document.id(el, true), this);\n\t\treturn this;\n\t},\n\n\tinject: function(el, where){\n\t\tinserters[where || 'bottom'](this, document.id(el, true));\n\t\treturn this;\n\t},\n\n\treplaces: function(el){\n\t\tel = document.id(el, true);\n\t\tel.parentNode.replaceChild(this, el);\n\t\treturn this;\n\t},\n\n\twraps: function(el, where){\n\t\tel = document.id(el, true);\n\t\treturn this.replaces(el).grab(el, where);\n\t},\n\n\tgetSelected: function(){\n\t\tthis.selectedIndex; // Safari 3.2.1\n\t\treturn new Elements(Array.convert(this.options).filter(function(option){\n\t\t\treturn option.selected;\n\t\t}));\n\t},\n\n\ttoQueryString: function(){\n\t\tvar queryString = [];\n\t\tthis.getElements('input, select, textarea').each(function(el){\n\t\t\tvar type = el.type;\n\t\t\tif (!el.name || el.disabled || type == 'submit' || type == 'reset' || type == 'file' || type == 'image') return;\n\n\t\t\tvar value = (el.get('tag') == 'select') ? el.getSelected().map(function(opt){\n\t\t\t\t// IE\n\t\t\t\treturn document.id(opt).get('value');\n\t\t\t}) : ((type == 'radio' || type == 'checkbox') && !el.checked) ? null : el.get('value');\n\n\t\t\tArray.convert(value).each(function(val){\n\t\t\t\tif (typeof val != 'undefined') queryString.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(val));\n\t\t\t});\n\t\t});\n\t\treturn queryString.join('&');\n\t}\n\n});\n\n\n// appendHTML\n\nvar appendInserters = {\n\tbefore: 'beforeBegin',\n\tafter: 'afterEnd',\n\tbottom: 'beforeEnd',\n\ttop: 'afterBegin',\n\tinside: 'beforeEnd'\n};\n\nElement.implement('appendHTML', ('insertAdjacentHTML' in document.createElement('div')) ? function(html, where){\n\tthis.insertAdjacentHTML(appendInserters[where || 'bottom'], html);\n\treturn this;\n} : function(html, where){\n\tvar temp = new Element('div', {html: html}),\n\t\tchildren = temp.childNodes,\n\t\tfragment = temp.firstChild;\n\n\tif (!fragment) return this;\n\tif (children.length > 1){\n\t\tfragment = document.createDocumentFragment();\n\t\tfor (var i = 0, l = children.length; i < l; i++){\n\t\t\tfragment.appendChild(children[i]);\n\t\t}\n\t}\n\n\tinserters[where || 'bottom'](fragment, this);\n\treturn this;\n});\n\nvar collected = {}, storage = {};\n\nvar get = function(uid){\n\treturn (storage[uid] || (storage[uid] = {}));\n};\n\nvar clean = function(item){\n\tvar uid = item.uniqueNumber;\n\tif (item.removeEvents) item.removeEvents();\n\tif (item.clearAttributes) item.clearAttributes();\n\tif (uid != null){\n\t\tdelete collected[uid];\n\t\tdelete storage[uid];\n\t}\n\treturn item;\n};\n\nvar formProps = {input: 'checked', option: 'selected', textarea: 'value'};\n\nElement.implement({\n\n\tdestroy: function(){\n\t\tvar children = clean(this).getElementsByTagName('*');\n\t\tArray.each(children, clean);\n\t\tElement.dispose(this);\n\t\treturn null;\n\t},\n\n\tempty: function(){\n\t\tArray.convert(this.childNodes).each(Element.dispose);\n\t\treturn this;\n\t},\n\n\tdispose: function(){\n\t\treturn (this.parentNode) ? this.parentNode.removeChild(this) : this;\n\t},\n\n\tclone: function(contents, keepid){\n\t\tcontents = contents !== false;\n\t\tvar clone = this.cloneNode(contents), ce = [clone], te = [this], i;\n\n\t\tif (contents){\n\t\t\tce.append(Array.convert(clone.getElementsByTagName('*')));\n\t\t\tte.append(Array.convert(this.getElementsByTagName('*')));\n\t\t}\n\n\t\tfor (i = ce.length; i--;){\n\t\t\tvar node = ce[i], element = te[i];\n\t\t\tif (!keepid) node.removeAttribute('id');\n\t\t\t/*<ltIE9>*/\n\t\t\tif (node.clearAttributes){\n\t\t\t\tnode.clearAttributes();\n\t\t\t\tnode.mergeAttributes(element);\n\t\t\t\tnode.removeAttribute('uniqueNumber');\n\t\t\t\tif (node.options){\n\t\t\t\t\tvar no = node.options, eo = element.options;\n\t\t\t\t\tfor (var j = no.length; j--;) no[j].selected = eo[j].selected;\n\t\t\t\t}\n\t\t\t}\n\t\t\t/*</ltIE9>*/\n\t\t\tvar prop = formProps[element.tagName.toLowerCase()];\n\t\t\tif (prop && element[prop]) node[prop] = element[prop];\n\t\t}\n\n\t\t/*<ltIE9>*/\n\t\tif (hasCloneBug){\n\t\t\tvar co = clone.getElementsByTagName('object'), to = this.getElementsByTagName('object');\n\t\t\tfor (i = co.length; i--;) co[i].outerHTML = to[i].outerHTML;\n\t\t}\n\t\t/*</ltIE9>*/\n\t\treturn document.id(clone);\n\t}\n\n});\n\n[Element, Window, Document].invoke('implement', {\n\n\taddListener: function(type, fn){\n\t\tif (window.attachEvent && !window.addEventListener){\n\t\t\tcollected[Slick.uidOf(this)] = this;\n\t\t}\n\t\tif (this.addEventListener) this.addEventListener(type, fn, !!arguments[2]);\n\t\telse this.attachEvent('on' + type, fn);\n\t\treturn this;\n\t},\n\n\tremoveListener: function(type, fn){\n\t\tif (this.removeEventListener) this.removeEventListener(type, fn, !!arguments[2]);\n\t\telse this.detachEvent('on' + type, fn);\n\t\treturn this;\n\t},\n\n\tretrieve: function(property, dflt){\n\t\tvar storage = get(Slick.uidOf(this)), prop = storage[property];\n\t\tif (dflt != null && prop == null) prop = storage[property] = dflt;\n\t\treturn prop != null ? prop : null;\n\t},\n\n\tstore: function(property, value){\n\t\tvar storage = get(Slick.uidOf(this));\n\t\tstorage[property] = value;\n\t\treturn this;\n\t},\n\n\teliminate: function(property){\n\t\tvar storage = get(Slick.uidOf(this));\n\t\tdelete storage[property];\n\t\treturn this;\n\t}\n\n});\n\n/*<ltIE9>*/\nif (window.attachEvent && !window.addEventListener){\n\tvar gc = function(){\n\t\tObject.each(collected, clean);\n\t\tif (window.CollectGarbage) CollectGarbage();\n\t\twindow.removeListener('unload', gc);\n\t};\n\twindow.addListener('unload', gc);\n}\n/*</ltIE9>*/\n\nElement.Properties = {};\n\n\n\nElement.Properties.style = {\n\n\tset: function(style){\n\t\tthis.style.cssText = style;\n\t},\n\n\tget: function(){\n\t\treturn this.style.cssText;\n\t},\n\n\terase: function(){\n\t\tthis.style.cssText = '';\n\t}\n\n};\n\nElement.Properties.tag = {\n\n\tget: function(){\n\t\treturn this.tagName.toLowerCase();\n\t}\n\n};\n\nElement.Properties.html = {\n\n\tset: function(html){\n\t\tif (html == null) html = '';\n\t\telse if (typeOf(html) == 'array') html = html.join('');\n\n\t\t/*<ltIE9>*/\n\t\tif (this.styleSheet && !canChangeStyleHTML) this.styleSheet.cssText = html;\n\t\telse /*</ltIE9>*/this.innerHTML = html;\n\t},\n\terase: function(){\n\t\tthis.set('html', '');\n\t}\n\n};\n\nvar supportsHTML5Elements = true, supportsTableInnerHTML = true, supportsTRInnerHTML = true;\n\n/*<ltIE9>*/\n// technique by jdbarlett - http://jdbartlett.com/innershiv/\nvar div = document.createElement('div');\nvar fragment;\ndiv.innerHTML = '<nav></nav>';\nsupportsHTML5Elements = (div.childNodes.length == 1);\nif (!supportsHTML5Elements){\n\tvar tags = 'abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video'.split(' ');\n\tfragment = document.createDocumentFragment(), l = tags.length;\n\twhile (l--) fragment.createElement(tags[l]);\n}\ndiv = null;\n/*</ltIE9>*/\n\n/*<IE>*/\nsupportsTableInnerHTML = Function.attempt(function(){\n\tvar table = document.createElement('table');\n\ttable.innerHTML = '<tr><td></td></tr>';\n\treturn true;\n});\n\n/*<ltFF4>*/\nvar tr = document.createElement('tr'), html = '<td></td>';\ntr.innerHTML = html;\nsupportsTRInnerHTML = (tr.innerHTML == html);\ntr = null;\n/*</ltFF4>*/\n\nif (!supportsTableInnerHTML || !supportsTRInnerHTML || !supportsHTML5Elements){\n\n\tElement.Properties.html.set = (function(set){\n\n\t\tvar translations = {\n\t\t\ttable: [1, '<table>', '</table>'],\n\t\t\tselect: [1, '<select>', '</select>'],\n\t\t\ttbody: [2, '<table><tbody>', '</tbody></table>'],\n\t\t\ttr: [3, '<table><tbody><tr>', '</tr></tbody></table>']\n\t\t};\n\n\t\ttranslations.thead = translations.tfoot = translations.tbody;\n\n\t\treturn function(html){\n\n\t\t\t/*<ltIE9>*/\n\t\t\tif (this.styleSheet) return set.call(this, html);\n\t\t\t/*</ltIE9>*/\n\t\t\tvar wrap = translations[this.get('tag')];\n\t\t\tif (!wrap && !supportsHTML5Elements) wrap = [0, '', ''];\n\t\t\tif (!wrap) return set.call(this, html);\n\n\t\t\tvar level = wrap[0], wrapper = document.createElement('div'), target = wrapper;\n\t\t\tif (!supportsHTML5Elements) fragment.appendChild(wrapper);\n\t\t\twrapper.innerHTML = [wrap[1], html, wrap[2]].flatten().join('');\n\t\t\twhile (level--) target = target.firstChild;\n\t\t\tthis.empty().adopt(target.childNodes);\n\t\t\tif (!supportsHTML5Elements) fragment.removeChild(wrapper);\n\t\t\twrapper = null;\n\t\t};\n\n\t})(Element.Properties.html.set);\n}\n/*</IE>*/\n\n/*<ltIE9>*/\nvar testForm = document.createElement('form');\ntestForm.innerHTML = '<select><option>s</option></select>';\n\nif (testForm.firstChild.value != 's') Element.Properties.value = {\n\n\tset: function(value){\n\t\tvar tag = this.get('tag');\n\t\tif (tag != 'select') return this.setProperty('value', value);\n\t\tvar options = this.getElements('option');\n\t\tvalue = String(value);\n\t\tfor (var i = 0; i < options.length; i++){\n\t\t\tvar option = options[i],\n\t\t\t\tattr = option.getAttributeNode('value'),\n\t\t\t\toptionValue = (attr && attr.specified) ? option.value : option.get('text');\n\t\t\tif (optionValue === value) return option.selected = true;\n\t\t}\n\t},\n\n\tget: function(){\n\t\tvar option = this, tag = option.get('tag');\n\n\t\tif (tag != 'select' && tag != 'option') return this.getProperty('value');\n\n\t\tif (tag == 'select' && !(option = option.getSelected()[0])) return '';\n\n\t\tvar attr = option.getAttributeNode('value');\n\t\treturn (attr && attr.specified) ? option.value : option.get('text');\n\t}\n\n};\ntestForm = null;\n/*</ltIE9>*/\n\n/*<IE>*/\nif (document.createElement('div').getAttributeNode('id')) Element.Properties.id = {\n\tset: function(id){\n\t\tthis.id = this.getAttributeNode('id').value = id;\n\t},\n\tget: function(){\n\t\treturn this.id || null;\n\t},\n\terase: function(){\n\t\tthis.id = this.getAttributeNode('id').value = '';\n\t}\n};\n/*</IE>*/\n\n})();\n\n/*\n---\n\nname: Event\n\ndescription: Contains the Event Type, to make the event object cross-browser.\n\nlicense: MIT-style license.\n\nrequires: [Window, Document, Array, Function, String, Object]\n\nprovides: Event\n\n...\n*/\n\n(function(){\n\nvar _keys = {};\nvar normalizeWheelSpeed = function(event){\n\tvar normalized;\n\tif (event.wheelDelta){\n\t\tnormalized = event.wheelDelta % 120 == 0 ? event.wheelDelta / 120 : event.wheelDelta / 12;\n\t} else {\n\t\tvar rawAmount = event.deltaY || event.detail || 0;\n\t\tnormalized = -(rawAmount % 3 == 0 ? rawAmount / 3 : rawAmount * 10);\n\t}\n\treturn normalized;\n};\n\nvar DOMEvent = this.DOMEvent = new Type('DOMEvent', function(event, win){\n\tif (!win) win = window;\n\tevent = event || win.event;\n\tif (event.$extended) return event;\n\tthis.event = event;\n\tthis.$extended = true;\n\tthis.shift = event.shiftKey;\n\tthis.control = event.ctrlKey;\n\tthis.alt = event.altKey;\n\tthis.meta = event.metaKey;\n\tvar type = this.type = event.type;\n\tvar target = event.target || event.srcElement;\n\twhile (target && target.nodeType == 3) target = target.parentNode;\n\tthis.target = document.id(target);\n\n\tif (type.indexOf('key') == 0){\n\t\tvar code = this.code = (event.which || event.keyCode);\n\t\tif (!this.shift || type != 'keypress') this.key = _keys[code];\n\t\tif (type == 'keydown' || type == 'keyup'){\n\t\t\tif (code > 111 && code < 124) this.key = 'f' + (code - 111);\n\t\t\telse if (code > 95 && code < 106) this.key = code - 96;\n\t\t}\n\t\tif (this.key == null) this.key = String.fromCharCode(code).toLowerCase();\n\t} else if (type == 'click' || type == 'dblclick' || type == 'contextmenu' || type == 'wheel' || type == 'DOMMouseScroll' || type.indexOf('mouse') == 0){\n\t\tvar doc = win.document;\n\t\tdoc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;\n\t\tthis.page = {\n\t\t\tx: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft,\n\t\t\ty: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop\n\t\t};\n\t\tthis.client = {\n\t\t\tx: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX,\n\t\t\ty: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY\n\t\t};\n\t\tif (type == 'DOMMouseScroll' || type == 'wheel' || type == 'mousewheel') this.wheel = normalizeWheelSpeed(event);\n\t\tthis.rightClick = (event.which == 3 || event.button == 2);\n\t\tif (type == 'mouseover' || type == 'mouseout' || type == 'mouseenter' || type == 'mouseleave'){\n\t\t\tvar overTarget = type == 'mouseover' || type == 'mouseenter';\n\t\t\tvar related = event.relatedTarget || event[(overTarget ? 'from' : 'to') + 'Element'];\n\t\t\twhile (related && related.nodeType == 3) related = related.parentNode;\n\t\t\tthis.relatedTarget = document.id(related);\n\t\t}\n\t} else if (type.indexOf('touch') == 0 || type.indexOf('gesture') == 0){\n\t\tthis.rotation = event.rotation;\n\t\tthis.scale = event.scale;\n\t\tthis.targetTouches = event.targetTouches;\n\t\tthis.changedTouches = event.changedTouches;\n\t\tvar touches = this.touches = event.touches;\n\t\tif (touches && touches[0]){\n\t\t\tvar touch = touches[0];\n\t\t\tthis.page = {x: touch.pageX, y: touch.pageY};\n\t\t\tthis.client = {x: touch.clientX, y: touch.clientY};\n\t\t}\n\t}\n\n\tif (!this.client) this.client = {};\n\tif (!this.page) this.page = {};\n});\n\nDOMEvent.implement({\n\n\tstop: function(){\n\t\treturn this.preventDefault().stopPropagation();\n\t},\n\n\tstopPropagation: function(){\n\t\tif (this.event.stopPropagation) this.event.stopPropagation();\n\t\telse this.event.cancelBubble = true;\n\t\treturn this;\n\t},\n\n\tpreventDefault: function(){\n\t\tif (this.event.preventDefault) this.event.preventDefault();\n\t\telse this.event.returnValue = false;\n\t\treturn this;\n\t}\n\n});\n\nDOMEvent.defineKey = function(code, key){\n\t_keys[code] = key;\n\treturn this;\n};\n\nDOMEvent.defineKeys = DOMEvent.defineKey.overloadSetter(true);\n\nDOMEvent.defineKeys({\n\t'38': 'up', '40': 'down', '37': 'left', '39': 'right',\n\t'27': 'esc', '32': 'space', '8': 'backspace', '9': 'tab',\n\t'46': 'delete', '13': 'enter'\n});\n\n})();\n\n\n\n\n\n/*\n---\n\nname: Element.Event\n\ndescription: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events, if necessary.\n\nlicense: MIT-style license.\n\nrequires: [Element, Event]\n\nprovides: Element.Event\n\n...\n*/\n\n(function(){\n\nElement.Properties.events = {set: function(events){\n\tthis.addEvents(events);\n}};\n\n[Element, Window, Document].invoke('implement', {\n\n\taddEvent: function(type, fn){\n\t\tvar events = this.retrieve('events', {});\n\t\tif (!events[type]) events[type] = {keys: [], values: []};\n\t\tif (events[type].keys.contains(fn)) return this;\n\t\tevents[type].keys.push(fn);\n\t\tvar realType = type,\n\t\t\tcustom = Element.Events[type],\n\t\t\tcondition = fn,\n\t\t\tself = this;\n\t\tif (custom){\n\t\t\tif (custom.onAdd) custom.onAdd.call(this, fn, type);\n\t\t\tif (custom.condition){\n\t\t\t\tcondition = function(event){\n\t\t\t\t\tif (custom.condition.call(this, event, type)) return fn.call(this, event);\n\t\t\t\t\treturn true;\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (custom.base) realType = Function.convert(custom.base).call(this, type);\n\t\t}\n\t\tvar defn = function(){\n\t\t\treturn fn.call(self);\n\t\t};\n\t\tvar nativeEvent = Element.NativeEvents[realType];\n\t\tif (nativeEvent){\n\t\t\tif (nativeEvent == 2){\n\t\t\t\tdefn = function(event){\n\t\t\t\t\tevent = new DOMEvent(event, self.getWindow());\n\t\t\t\t\tif (condition.call(self, event) === false) event.stop();\n\t\t\t\t};\n\t\t\t}\n\t\t\tthis.addListener(realType, defn, arguments[2]);\n\t\t}\n\t\tevents[type].values.push(defn);\n\t\treturn this;\n\t},\n\n\tremoveEvent: function(type, fn){\n\t\tvar events = this.retrieve('events');\n\t\tif (!events || !events[type]) return this;\n\t\tvar list = events[type];\n\t\tvar index = list.keys.indexOf(fn);\n\t\tif (index == -1) return this;\n\t\tvar value = list.values[index];\n\t\tdelete list.keys[index];\n\t\tdelete list.values[index];\n\t\tvar custom = Element.Events[type];\n\t\tif (custom){\n\t\t\tif (custom.onRemove) custom.onRemove.call(this, fn, type);\n\t\t\tif (custom.base) type = Function.convert(custom.base).call(this, type);\n\t\t}\n\t\treturn (Element.NativeEvents[type]) ? this.removeListener(type, value, arguments[2]) : this;\n\t},\n\n\taddEvents: function(events){\n\t\tfor (var event in events) this.addEvent(event, events[event]);\n\t\treturn this;\n\t},\n\n\tremoveEvents: function(events){\n\t\tvar type;\n\t\tif (typeOf(events) == 'object'){\n\t\t\tfor (type in events) this.removeEvent(type, events[type]);\n\t\t\treturn this;\n\t\t}\n\t\tvar attached = this.retrieve('events');\n\t\tif (!attached) return this;\n\t\tif (!events){\n\t\t\tfor (type in attached) this.removeEvents(type);\n\t\t\tthis.eliminate('events');\n\t\t} else if (attached[events]){\n\t\t\tattached[events].keys.each(function(fn){\n\t\t\t\tthis.removeEvent(events, fn);\n\t\t\t}, this);\n\t\t\tdelete attached[events];\n\t\t}\n\t\treturn this;\n\t},\n\n\tfireEvent: function(type, args, delay){\n\t\tvar events = this.retrieve('events');\n\t\tif (!events || !events[type]) return this;\n\t\targs = Array.convert(args);\n\n\t\tevents[type].keys.each(function(fn){\n\t\t\tif (delay) fn.delay(delay, this, args);\n\t\t\telse fn.apply(this, args);\n\t\t}, this);\n\t\treturn this;\n\t},\n\n\tcloneEvents: function(from, type){\n\t\tfrom = document.id(from);\n\t\tvar events = from.retrieve('events');\n\t\tif (!events) return this;\n\t\tif (!type){\n\t\t\tfor (var eventType in events) this.cloneEvents(from, eventType);\n\t\t} else if (events[type]){\n\t\t\tevents[type].keys.each(function(fn){\n\t\t\t\tthis.addEvent(type, fn);\n\t\t\t}, this);\n\t\t}\n\t\treturn this;\n\t}\n\n});\n\nElement.NativeEvents = {\n\tclick: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons\n\twheel: 2, mousewheel: 2, DOMMouseScroll: 2, //mouse wheel\n\tmouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement\n\tkeydown: 2, keypress: 2, keyup: 2, //keyboard\n\torientationchange: 2, // mobile\n\ttouchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch\n\tgesturestart: 2, gesturechange: 2, gestureend: 2, // gesture\n\tfocus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, paste: 2, input: 2, //form elements\n\tload: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window\n\thashchange: 1, popstate: 2, pageshow: 2, pagehide: 2, // history\n\terror: 1, abort: 1, scroll: 1, message: 2 //misc\n};\n\nElement.Events = {\n\tmousewheel: {\n\t\tbase: 'onwheel' in document ? 'wheel' : 'onmousewheel' in document ? 'mousewheel' : 'DOMMouseScroll'\n\t}\n};\n\nvar check = function(event){\n\tvar related = event.relatedTarget;\n\tif (related == null) return true;\n\tif (!related) return false;\n\treturn (related != this && related.prefix != 'xul' && typeOf(this) != 'document' && !this.contains(related));\n};\n\nif ('onmouseenter' in document.documentElement){\n\tElement.NativeEvents.mouseenter = Element.NativeEvents.mouseleave = 2;\n\tElement.MouseenterCheck = check;\n} else {\n\tElement.Events.mouseenter = {\n\t\tbase: 'mouseover',\n\t\tcondition: check\n\t};\n\n\tElement.Events.mouseleave = {\n\t\tbase: 'mouseout',\n\t\tcondition: check\n\t};\n}\n\n/*<ltIE9>*/\nif (!window.addEventListener){\n\tElement.NativeEvents.propertychange = 2;\n\tElement.Events.change = {\n\t\tbase: function(){\n\t\t\tvar type = this.type;\n\t\t\treturn (this.get('tag') == 'input' && (type == 'radio' || type == 'checkbox')) ? 'propertychange' : 'change';\n\t\t},\n\t\tcondition: function(event){\n\t\t\treturn event.type != 'propertychange' || event.event.propertyName == 'checked';\n\t\t}\n\t};\n}\n/*</ltIE9>*/\n\n\n\n})();\n\n/*\n---\n\nname: Element.Delegation\n\ndescription: Extends the Element native object to include the delegate method for more efficient event management.\n\nlicense: MIT-style license.\n\nrequires: [Element.Event]\n\nprovides: [Element.Delegation]\n\n...\n*/\n\n(function(){\n\nvar eventListenerSupport = !!window.addEventListener;\n\nElement.NativeEvents.focusin = Element.NativeEvents.focusout = 2;\n\nvar bubbleUp = function(self, match, fn, event, target){\n\twhile (target && target != self){\n\t\tif (match(target, event)) return fn.call(target, event, target);\n\t\ttarget = document.id(target.parentNode);\n\t}\n};\n\nvar map = {\n\tmouseenter: {\n\t\tbase: 'mouseover',\n\t\tcondition: Element.MouseenterCheck\n\t},\n\tmouseleave: {\n\t\tbase: 'mouseout',\n\t\tcondition: Element.MouseenterCheck\n\t},\n\tfocus: {\n\t\tbase: 'focus' + (eventListenerSupport ? '' : 'in'),\n\t\tcapture: true\n\t},\n\tblur: {\n\t\tbase: eventListenerSupport ? 'blur' : 'focusout',\n\t\tcapture: true\n\t}\n};\n\n/*<ltIE9>*/\nvar _key = '$delegation:';\nvar formObserver = function(type){\n\n\treturn {\n\n\t\tbase: 'focusin',\n\n\t\tremove: function(self, uid){\n\t\t\tvar list = self.retrieve(_key + type + 'listeners', {})[uid];\n\t\t\tif (list && list.forms) for (var i = list.forms.length; i--;){\n\t\t\t\t// the form may have been destroyed, so it won't have the\n\t\t\t\t// removeEvent method anymore. In that case the event was\n\t\t\t\t// removed as well.\n\t\t\t\tif (list.forms[i].removeEvent) list.forms[i].removeEvent(type, list.fns[i]);\n\t\t\t}\n\t\t},\n\n\t\tlisten: function(self, match, fn, event, target, uid){\n\t\t\tvar form = (target.get('tag') == 'form') ? target : event.target.getParent('form');\n\t\t\tif (!form) return;\n\n\t\t\tvar listeners = self.retrieve(_key + type + 'listeners', {}),\n\t\t\t\tlistener = listeners[uid] || {forms: [], fns: []},\n\t\t\t\tforms = listener.forms, fns = listener.fns;\n\n\t\t\tif (forms.indexOf(form) != -1) return;\n\t\t\tforms.push(form);\n\n\t\t\tvar _fn = function(event){\n\t\t\t\tbubbleUp(self, match, fn, event, target);\n\t\t\t};\n\t\t\tform.addEvent(type, _fn);\n\t\t\tfns.push(_fn);\n\n\t\t\tlisteners[uid] = listener;\n\t\t\tself.store(_key + type + 'listeners', listeners);\n\t\t}\n\t};\n};\n\nvar inputObserver = function(type){\n\treturn {\n\t\tbase: 'focusin',\n\t\tlisten: function(self, match, fn, event, target){\n\t\t\tvar events = {blur: function(){\n\t\t\t\tthis.removeEvents(events);\n\t\t\t}};\n\t\t\tevents[type] = function(event){\n\t\t\t\tbubbleUp(self, match, fn, event, target);\n\t\t\t};\n\t\t\tevent.target.addEvents(events);\n\t\t}\n\t};\n};\n\nif (!eventListenerSupport) Object.append(map, {\n\tsubmit: formObserver('submit'),\n\treset: formObserver('reset'),\n\tchange: inputObserver('change'),\n\tselect: inputObserver('select')\n});\n/*</ltIE9>*/\n\nvar proto = Element.prototype,\n\taddEvent = proto.addEvent,\n\tremoveEvent = proto.removeEvent;\n\nvar relay = function(old, method){\n\treturn function(type, fn, useCapture){\n\t\tif (type.indexOf(':relay') == -1) return old.call(this, type, fn, useCapture);\n\t\tvar parsed = Slick.parse(type).expressions[0][0];\n\t\tif (parsed.pseudos[0].key != 'relay') return old.call(this, type, fn, useCapture);\n\t\tvar newType = parsed.tag;\n\t\tparsed.pseudos.slice(1).each(function(pseudo){\n\t\t\tnewType += ':' + pseudo.key + (pseudo.value ? '(' + pseudo.value + ')' : '');\n\t\t});\n\t\told.call(this, type, fn);\n\t\treturn method.call(this, newType, parsed.pseudos[0].value, fn);\n\t};\n};\n\nvar delegation = {\n\n\taddEvent: function(type, match, fn){\n\t\tvar storage = this.retrieve('$delegates', {}), stored = storage[type];\n\t\tif (stored) for (var _uid in stored){\n\t\t\tif (stored[_uid].fn == fn && stored[_uid].match == match) return this;\n\t\t}\n\n\t\tvar _type = type, _match = match, _fn = fn, _map = map[type] || {};\n\t\ttype = _map.base || _type;\n\n\t\tmatch = function(target){\n\t\t\treturn Slick.match(target, _match);\n\t\t};\n\n\t\tvar elementEvent = Element.Events[_type];\n\t\tif (_map.condition || elementEvent && elementEvent.condition){\n\t\t\tvar __match = match, condition = _map.condition || elementEvent.condition;\n\t\t\tmatch = function(target, event){\n\t\t\t\treturn __match(target, event) && condition.call(target, event, type);\n\t\t\t};\n\t\t}\n\n\t\tvar self = this, uid = String.uniqueID();\n\t\tvar delegator = _map.listen ? function(event, target){\n\t\t\tif (!target && event && event.target) target = event.target;\n\t\t\tif (target) _map.listen(self, match, fn, event, target, uid);\n\t\t} : function(event, target){\n\t\t\tif (!target && event && event.target) target = event.target;\n\t\t\tif (target) bubbleUp(self, match, fn, event, target);\n\t\t};\n\n\t\tif (!stored) stored = {};\n\t\tstored[uid] = {\n\t\t\tmatch: _match,\n\t\t\tfn: _fn,\n\t\t\tdelegator: delegator\n\t\t};\n\t\tstorage[_type] = stored;\n\t\treturn addEvent.call(this, type, delegator, _map.capture);\n\t},\n\n\tremoveEvent: function(type, match, fn, _uid){\n\t\tvar storage = this.retrieve('$delegates', {}), stored = storage[type];\n\t\tif (!stored) return this;\n\n\t\tif (_uid){\n\t\t\tvar _type = type, delegator = stored[_uid].delegator, _map = map[type] || {};\n\t\t\ttype = _map.base || _type;\n\t\t\tif (_map.remove) _map.remove(this, _uid);\n\t\t\tdelete stored[_uid];\n\t\t\tstorage[_type] = stored;\n\t\t\treturn removeEvent.call(this, type, delegator, _map.capture);\n\t\t}\n\n\t\tvar __uid, s;\n\t\tif (fn) for (__uid in stored){\n\t\t\ts = stored[__uid];\n\t\t\tif (s.match == match && s.fn == fn) return delegation.removeEvent.call(this, type, match, fn, __uid);\n\t\t} else for (__uid in stored){\n\t\t\ts = stored[__uid];\n\t\t\tif (s.match == match) delegation.removeEvent.call(this, type, match, s.fn, __uid);\n\t\t}\n\t\treturn this;\n\t}\n\n};\n\n[Element, Window, Document].invoke('implement', {\n\taddEvent: relay(addEvent, delegation.addEvent),\n\tremoveEvent: relay(removeEvent, delegation.removeEvent)\n});\n\n})();\n\n/*\n---\n\nname: Element.Style\n\ndescription: Contains methods for interacting with the styles of Elements in a fashionable way.\n\nlicense: MIT-style license.\n\nrequires: Element\n\nprovides: Element.Style\n\n...\n*/\n\n(function(){\n\nvar html = document.html, el;\n\n//<ltIE9>\n// Check for oldIE, which does not remove styles when they're set to null\nel = document.createElement('div');\nel.style.color = 'red';\nel.style.color = null;\nvar doesNotRemoveStyles = el.style.color == 'red';\n\n// check for oldIE, which returns border* shorthand styles in the wrong order (color-width-style instead of width-style-color)\nvar border = '1px solid #123abc';\nel.style.border = border;\nvar returnsBordersInWrongOrder = el.style.border != border;\nel = null;\n//</ltIE9>\n\nvar hasGetComputedStyle = !!window.getComputedStyle,\n\tsupportBorderRadius = document.createElement('div').style.borderRadius != null;\n\nElement.Properties.styles = {set: function(styles){\n\tthis.setStyles(styles);\n}};\n\nvar hasOpacity = (html.style.opacity != null),\n\thasFilter = (html.style.filter != null),\n\treAlpha = /alpha\\(opacity=([\\d.]+)\\)/i;\n\nvar setVisibility = function(element, opacity){\n\telement.store('$opacity', opacity);\n\telement.style.visibility = opacity > 0 || opacity == null ? 'visible' : 'hidden';\n};\n\n//<ltIE9>\nvar setFilter = function(element, regexp, value){\n\tvar style = element.style,\n\t\tfilter = style.filter || element.getComputedStyle('filter') || '';\n\tstyle.filter = (regexp.test(filter) ? filter.replace(regexp, value) : filter + ' ' + value).trim();\n\tif (!style.filter) style.removeAttribute('filter');\n};\n//</ltIE9>\n\nvar setOpacity = (hasOpacity ? function(element, opacity){\n\telement.style.opacity = opacity;\n} : (hasFilter ? function(element, opacity){\n\tif (!element.currentStyle || !element.currentStyle.hasLayout) element.style.zoom = 1;\n\tif (opacity == null || opacity == 1){\n\t\tsetFilter(element, reAlpha, '');\n\t\tif (opacity == 1 && getOpacity(element) != 1) setFilter(element, reAlpha, 'alpha(opacity=100)');\n\t} else {\n\t\tsetFilter(element, reAlpha, 'alpha(opacity=' + (opacity * 100).limit(0, 100).round() + ')');\n\t}\n} : setVisibility));\n\nvar getOpacity = (hasOpacity ? function(element){\n\tvar opacity = element.style.opacity || element.getComputedStyle('opacity');\n\treturn (opacity == '') ? 1 : opacity.toFloat();\n} : (hasFilter ? function(element){\n\tvar filter = (element.style.filter || element.getComputedStyle('filter')),\n\t\topacity;\n\tif (filter) opacity = filter.match(reAlpha);\n\treturn (opacity == null || filter == null) ? 1 : (opacity[1] / 100);\n} : function(element){\n\tvar opacity = element.retrieve('$opacity');\n\tif (opacity == null) opacity = (element.style.visibility == 'hidden' ? 0 : 1);\n\treturn opacity;\n}));\n\nvar floatName = (html.style.cssFloat == null) ? 'styleFloat' : 'cssFloat',\n\tnamedPositions = {left: '0%', top: '0%', center: '50%', right: '100%', bottom: '100%'},\n\thasBackgroundPositionXY = (html.style.backgroundPositionX != null),\n\tprefixPattern = /^-(ms)-/;\n\nvar camelCase = function(property){\n\treturn property.replace(prefixPattern, '$1-').camelCase();\n};\n\n//<ltIE9>\nvar removeStyle = function(style, property){\n\tif (property == 'backgroundPosition'){\n\t\tstyle.removeAttribute(property + 'X');\n\t\tproperty += 'Y';\n\t}\n\tstyle.removeAttribute(property);\n};\n//</ltIE9>\n\nElement.implement({\n\n\tgetComputedStyle: function(property){\n\t\tif (!hasGetComputedStyle && this.currentStyle) return this.currentStyle[camelCase(property)];\n\t\tvar defaultView = Element.getDocument(this).defaultView,\n\t\t\tcomputed = defaultView ? defaultView.getComputedStyle(this, null) : null;\n\t\treturn (computed) ? computed.getPropertyValue((property == floatName) ? 'float' : property.hyphenate()) : '';\n\t},\n\n\tsetStyle: function(property, value){\n\t\tif (property == 'opacity'){\n\t\t\tif (value != null) value = parseFloat(value);\n\t\t\tsetOpacity(this, value);\n\t\t\treturn this;\n\t\t}\n\t\tproperty = camelCase(property == 'float' ? floatName : property);\n\t\tif (typeOf(value) != 'string'){\n\t\t\tvar map = (Element.Styles[property] || '@').split(' ');\n\t\t\tvalue = Array.convert(value).map(function(val, i){\n\t\t\t\tif (!map[i]) return '';\n\t\t\t\treturn (typeOf(val) == 'number') ? map[i].replace('@', Math.round(val)) : val;\n\t\t\t}).join(' ');\n\t\t} else if (value == String(Number(value))){\n\t\t\tvalue = Math.round(value);\n\t\t}\n\t\tthis.style[property] = value;\n\t\t//<ltIE9>\n\t\tif ((value == '' || value == null) && doesNotRemoveStyles && this.style.removeAttribute){\n\t\t\tremoveStyle(this.style, property);\n\t\t}\n\t\t//</ltIE9>\n\t\treturn this;\n\t},\n\n\tgetStyle: function(property){\n\t\tif (property == 'opacity') return getOpacity(this);\n\t\tproperty = camelCase(property == 'float' ? floatName : property);\n\t\tif (supportBorderRadius && property.indexOf('borderRadius') != -1){\n\t\t\treturn ['borderTopLeftRadius', 'borderTopRightRadius', 'borderBottomRightRadius', 'borderBottomLeftRadius'].map(function(corner){\n\t\t\t\treturn this.style[corner] || '0px';\n\t\t\t}, this).join(' ');\n\t\t}\n\t\tvar result = this.style[property];\n\t\tif (!result || property == 'zIndex'){\n\t\t\tif (Element.ShortStyles.hasOwnProperty(property)){\n\t\t\t\tresult = [];\n\t\t\t\tfor (var s in Element.ShortStyles[property]) result.push(this.getStyle(s));\n\t\t\t\treturn result.join(' ');\n\t\t\t}\n\t\t\tresult = this.getComputedStyle(property);\n\t\t}\n\t\tif (hasBackgroundPositionXY && /^backgroundPosition[XY]?$/.test(property)){\n\t\t\treturn result.replace(/(top|right|bottom|left)/g, function(position){\n\t\t\t\treturn namedPositions[position];\n\t\t\t}) || '0px';\n\t\t}\n\t\tif (!result && property == 'backgroundPosition') return '0px 0px';\n\t\tif (result){\n\t\t\tresult = String(result);\n\t\t\tvar color = result.match(/rgba?\\([\\d\\s,]+\\)/);\n\t\t\tif (color) result = result.replace(color[0], color[0].rgbToHex());\n\t\t}\n\t\tif (!hasGetComputedStyle && !this.style[property]){\n\t\t\tif ((/^(height|width)$/).test(property) && !(/px$/.test(result))){\n\t\t\t\tvar values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0;\n\t\t\t\tvalues.each(function(value){\n\t\t\t\t\tsize += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt();\n\t\t\t\t}, this);\n\t\t\t\treturn this['offset' + property.capitalize()] - size + 'px';\n\t\t\t}\n\t\t\tif ((/^border(.+)Width|margin|padding/).test(property) && isNaN(parseFloat(result))){\n\t\t\t\treturn '0px';\n\t\t\t}\n\t\t}\n\t\t//<ltIE9>\n\t\tif (returnsBordersInWrongOrder && /^border(Top|Right|Bottom|Left)?$/.test(property) && /^#/.test(result)){\n\t\t\treturn result.replace(/^(.+)\\s(.+)\\s(.+)$/, '$2 $3 $1');\n\t\t}\n\t\t//</ltIE9>\n\n\t\treturn result;\n\t},\n\n\tsetStyles: function(styles){\n\t\tfor (var style in styles) this.setStyle(style, styles[style]);\n\t\treturn this;\n\t},\n\n\tgetStyles: function(){\n\t\tvar result = {};\n\t\tArray.flatten(arguments).each(function(key){\n\t\t\tresult[key] = this.getStyle(key);\n\t\t}, this);\n\t\treturn result;\n\t}\n\n});\n\nElement.Styles = {\n\tleft: '@px', top: '@px', bottom: '@px', right: '@px',\n\twidth: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px',\n\tbackgroundColor: 'rgb(@, @, @)', backgroundSize: '@px', backgroundPosition: '@px @px', color: 'rgb(@, @, @)',\n\tfontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)',\n\tmargin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)',\n\tborderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)',\n\tzIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@', borderRadius: '@px @px @px @px'\n};\n\n\n\n\n\nElement.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}};\n\n['Top', 'Right', 'Bottom', 'Left'].each(function(direction){\n\tvar Short = Element.ShortStyles;\n\tvar All = Element.Styles;\n\t['margin', 'padding'].each(function(style){\n\t\tvar sd = style + direction;\n\t\tShort[style][sd] = All[sd] = '@px';\n\t});\n\tvar bd = 'border' + direction;\n\tShort.border[bd] = All[bd] = '@px @ rgb(@, @, @)';\n\tvar bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color';\n\tShort[bd] = {};\n\tShort.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px';\n\tShort.borderStyle[bds] = Short[bd][bds] = All[bds] = '@';\n\tShort.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)';\n});\n\nif (hasBackgroundPositionXY) Element.ShortStyles.backgroundPosition = {backgroundPositionX: '@', backgroundPositionY: '@'};\n})();\n\n/*\n---\n\nname: Element.Dimensions\n\ndescription: Contains methods to work with size, scroll, or positioning of Elements and the window object.\n\nlicense: MIT-style license.\n\ncredits:\n  - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html).\n  - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html).\n\nrequires: [Element, Element.Style]\n\nprovides: [Element.Dimensions]\n\n...\n*/\n\n(function(){\n\nvar element = document.createElement('div'),\n\tchild = document.createElement('div');\nelement.style.height = '0';\nelement.appendChild(child);\nvar brokenOffsetParent = (child.offsetParent === element);\nelement = child = null;\n\nvar heightComponents = ['height', 'paddingTop', 'paddingBottom', 'borderTopWidth', 'borderBottomWidth'],\n\twidthComponents = ['width', 'paddingLeft', 'paddingRight', 'borderLeftWidth', 'borderRightWidth'];\n\nvar svgCalculateSize = function(el){\n\n\tvar gCS = window.getComputedStyle(el),\n\t\tbounds = {x: 0, y: 0};\n\n\theightComponents.each(function(css){\n\t\tbounds.y += parseFloat(gCS[css]);\n\t});\n\twidthComponents.each(function(css){\n\t\tbounds.x += parseFloat(gCS[css]);\n\t});\n\treturn bounds;\n};\n\nvar isOffset = function(el){\n\treturn styleString(el, 'position') != 'static' || isBody(el);\n};\n\nvar isOffsetStatic = function(el){\n\treturn isOffset(el) || (/^(?:table|td|th)$/i).test(el.tagName);\n};\n\nElement.implement({\n\n\tscrollTo: function(x, y){\n\t\tif (isBody(this)){\n\t\t\tthis.getWindow().scrollTo(x, y);\n\t\t} else {\n\t\t\tthis.scrollLeft = x;\n\t\t\tthis.scrollTop = y;\n\t\t}\n\t\treturn this;\n\t},\n\n\tgetSize: function(){\n\t\tif (isBody(this)) return this.getWindow().getSize();\n\n\t\t//<ltIE9>\n\t\t// This if clause is because IE8- cannot calculate getBoundingClientRect of elements with visibility hidden.\n\t\tif (!window.getComputedStyle) return {x: this.offsetWidth, y: this.offsetHeight};\n\t\t//</ltIE9>\n\n\t\t// This svg section under, calling `svgCalculateSize()`, can be removed when FF fixed the svg size bug.\n\t\t// Bug info: https://bugzilla.mozilla.org/show_bug.cgi?id=530985\n\t\tif (this.get('tag') == 'svg') return svgCalculateSize(this);\n\n\t\ttry {\n\t\t\tvar bounds = this.getBoundingClientRect();\n\t\t\treturn {x: bounds.width, y: bounds.height};\n\t\t} catch (e){\n\t\t\treturn {x: 0, y: 0};\n\t\t}\n\t},\n\n\tgetScrollSize: function(){\n\t\tif (isBody(this)) return this.getWindow().getScrollSize();\n\t\treturn {x: this.scrollWidth, y: this.scrollHeight};\n\t},\n\n\tgetScroll: function(){\n\t\tif (isBody(this)) return this.getWindow().getScroll();\n\t\treturn {x: this.scrollLeft, y: this.scrollTop};\n\t},\n\n\tgetScrolls: function(){\n\t\tvar element = this.parentNode, position = {x: 0, y: 0};\n\t\twhile (element && !isBody(element)){\n\t\t\tposition.x += element.scrollLeft;\n\t\t\tposition.y += element.scrollTop;\n\t\t\telement = element.parentNode;\n\t\t}\n\t\treturn position;\n\t},\n\n\tgetOffsetParent: brokenOffsetParent ? function(){\n\t\tvar element = this;\n\t\tif (isBody(element) || styleString(element, 'position') == 'fixed') return null;\n\n\t\tvar isOffsetCheck = (styleString(element, 'position') == 'static') ? isOffsetStatic : isOffset;\n\t\twhile ((element = element.parentNode)){\n\t\t\tif (isOffsetCheck(element)) return element;\n\t\t}\n\t\treturn null;\n\t} : function(){\n\t\tvar element = this;\n\t\tif (isBody(element) || styleString(element, 'position') == 'fixed') return null;\n\n\t\ttry {\n\t\t\treturn element.offsetParent;\n\t\t} catch (e){}\n\t\treturn null;\n\t},\n\n\tgetOffsets: function(){\n\t\tvar hasGetBoundingClientRect = this.getBoundingClientRect;\n\n\t\tif (hasGetBoundingClientRect){\n\t\t\tvar bound = this.getBoundingClientRect(),\n\t\t\t\thtml = document.id(this.getDocument().documentElement),\n\t\t\t\thtmlScroll = html.getScroll(),\n\t\t\t\telemScrolls = this.getScrolls(),\n\t\t\t\tisFixed = (styleString(this, 'position') == 'fixed');\n\n\t\t\treturn {\n\t\t\t\tx: bound.left.toFloat() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft,\n\t\t\t\ty: bound.top.toFloat() + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop\n\t\t\t};\n\t\t}\n\n\t\tvar element = this, position = {x: 0, y: 0};\n\t\tif (isBody(this)) return position;\n\n\t\twhile (element && !isBody(element)){\n\t\t\tposition.x += element.offsetLeft;\n\t\t\tposition.y += element.offsetTop;\n\n\t\t\telement = element.offsetParent;\n\t\t}\n\n\t\treturn position;\n\t},\n\n\tgetPosition: function(relative){\n\t\tvar offset = this.getOffsets(),\n\t\t\tscroll = this.getScrolls();\n\t\tvar position = {\n\t\t\tx: offset.x - scroll.x,\n\t\t\ty: offset.y - scroll.y\n\t\t};\n\n\t\tif (relative && (relative = document.id(relative))){\n\t\t\tvar relativePosition = relative.getPosition();\n\t\t\treturn {x: position.x - relativePosition.x - leftBorder(relative), y: position.y - relativePosition.y - topBorder(relative)};\n\t\t}\n\t\treturn position;\n\t},\n\n\tgetCoordinates: function(element){\n\t\tif (isBody(this)) return this.getWindow().getCoordinates();\n\t\tvar position = this.getPosition(element),\n\t\t\tsize = this.getSize();\n\t\tvar obj = {\n\t\t\tleft: position.x,\n\t\t\ttop: position.y,\n\t\t\twidth: size.x,\n\t\t\theight: size.y\n\t\t};\n\t\tobj.right = obj.left + obj.width;\n\t\tobj.bottom = obj.top + obj.height;\n\t\treturn obj;\n\t},\n\n\tcomputePosition: function(obj){\n\t\treturn {\n\t\t\tleft: obj.x - styleNumber(this, 'margin-left'),\n\t\t\ttop: obj.y - styleNumber(this, 'margin-top')\n\t\t};\n\t},\n\n\tsetPosition: function(obj){\n\t\treturn this.setStyles(this.computePosition(obj));\n\t}\n\n});\n\n\n[Document, Window].invoke('implement', {\n\n\tgetSize: function(){\n\t\tvar doc = getCompatElement(this);\n\t\treturn {x: doc.clientWidth, y: doc.clientHeight};\n\t},\n\n\tgetScroll: function(){\n\t\tvar win = this.getWindow(), doc = getCompatElement(this);\n\t\treturn {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop};\n\t},\n\n\tgetScrollSize: function(){\n\t\tvar doc = getCompatElement(this),\n\t\t\tmin = this.getSize(),\n\t\t\tbody = this.getDocument().body;\n\n\t\treturn {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)};\n\t},\n\n\tgetPosition: function(){\n\t\treturn {x: 0, y: 0};\n\t},\n\n\tgetCoordinates: function(){\n\t\tvar size = this.getSize();\n\t\treturn {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x};\n\t}\n\n});\n\n// private methods\n\nvar styleString = Element.getComputedStyle;\n\nfunction styleNumber(element, style){\n\treturn styleString(element, style).toInt() || 0;\n}\n\n\n\nfunction topBorder(element){\n\treturn styleNumber(element, 'border-top-width');\n}\n\nfunction leftBorder(element){\n\treturn styleNumber(element, 'border-left-width');\n}\n\nfunction isBody(element){\n\treturn (/^(?:body|html)$/i).test(element.tagName);\n}\n\nfunction getCompatElement(element){\n\tvar doc = element.getDocument();\n\treturn (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;\n}\n\n})();\n\n//aliases\nElement.alias({position: 'setPosition'}); //compatability\n\n[Window, Document, Element].invoke('implement', {\n\n\tgetHeight: function(){\n\t\treturn this.getSize().y;\n\t},\n\n\tgetWidth: function(){\n\t\treturn this.getSize().x;\n\t},\n\n\tgetScrollTop: function(){\n\t\treturn this.getScroll().y;\n\t},\n\n\tgetScrollLeft: function(){\n\t\treturn this.getScroll().x;\n\t},\n\n\tgetScrollHeight: function(){\n\t\treturn this.getScrollSize().y;\n\t},\n\n\tgetScrollWidth: function(){\n\t\treturn this.getScrollSize().x;\n\t},\n\n\tgetTop: function(){\n\t\treturn this.getPosition().y;\n\t},\n\n\tgetLeft: function(){\n\t\treturn this.getPosition().x;\n\t}\n\n});\n\n/*\n---\n\nname: Fx\n\ndescription: Contains the basic animation logic to be extended by all other Fx Classes.\n\nlicense: MIT-style license.\n\nrequires: [Chain, Events, Options, Class.Thenable]\n\nprovides: Fx\n\n...\n*/\n\n(function(){\n\nvar Fx = this.Fx = new Class({\n\n\tImplements: [Chain, Events, Options, Class.Thenable],\n\n\toptions: {\n\t\t/*\n\t\tonStart: nil,\n\t\tonCancel: nil,\n\t\tonComplete: nil,\n\t\t*/\n\t\tfps: 60,\n\t\tunit: false,\n\t\tduration: 500,\n\t\tframes: null,\n\t\tframeSkip: true,\n\t\tlink: 'ignore'\n\t},\n\n\tinitialize: function(options){\n\t\tthis.subject = this.subject || this;\n\t\tthis.setOptions(options);\n\t},\n\n\tgetTransition: function(){\n\t\treturn function(p){\n\t\t\treturn -(Math.cos(Math.PI * p) - 1) / 2;\n\t\t};\n\t},\n\n\tstep: function(now){\n\t\tif (this.options.frameSkip){\n\t\t\tvar diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval;\n\t\t\tthis.time = now;\n\t\t\tthis.frame += frames;\n\t\t} else {\n\t\t\tthis.frame++;\n\t\t}\n\n\t\tif (this.frame < this.frames){\n\t\t\tvar delta = this.transition(this.frame / this.frames);\n\t\t\tthis.set(this.compute(this.from, this.to, delta));\n\t\t} else {\n\t\t\tthis.frame = this.frames;\n\t\t\tthis.set(this.compute(this.from, this.to, 1));\n\t\t\tthis.stop();\n\t\t}\n\t},\n\n\tset: function(now){\n\t\treturn now;\n\t},\n\n\tcompute: function(from, to, delta){\n\t\treturn Fx.compute(from, to, delta);\n\t},\n\n\tcheck: function(){\n\t\tif (!this.isRunning()) return true;\n\t\tswitch (this.options.link){\n\t\t\tcase 'cancel': this.cancel(); return true;\n\t\t\tcase 'chain': this.chain(this.caller.pass(arguments, this)); return false;\n\t\t}\n\t\treturn false;\n\t},\n\n\tstart: function(from, to){\n\t\tif (!this.check(from, to)) return this;\n\t\tthis.from = from;\n\t\tthis.to = to;\n\t\tthis.frame = (this.options.frameSkip) ? 0 : -1;\n\t\tthis.time = null;\n\t\tthis.transition = this.getTransition();\n\t\tvar frames = this.options.frames, fps = this.options.fps, duration = this.options.duration;\n\t\tthis.duration = Fx.Durations[duration] || duration.toInt();\n\t\tthis.frameInterval = 1000 / fps;\n\t\tthis.frames = frames || Math.round(this.duration / this.frameInterval);\n\t\tif (this.getThenableState() !== 'pending'){\n\t\t\tthis.resetThenable(this.subject);\n\t\t}\n\t\tthis.fireEvent('start', this.subject);\n\t\tpushInstance.call(this, fps);\n\t\treturn this;\n\t},\n\n\tstop: function(){\n\t\tif (this.isRunning()){\n\t\t\tthis.time = null;\n\t\t\tpullInstance.call(this, this.options.fps);\n\t\t\tif (this.frames == this.frame){\n\t\t\t\tthis.fireEvent('complete', this.subject);\n\t\t\t\tif (!this.callChain()) this.fireEvent('chainComplete', this.subject);\n\t\t\t} else {\n\t\t\t\tthis.fireEvent('stop', this.subject);\n\t\t\t}\n\t\t\tthis.resolve(this.subject === this ? null : this.subject);\n\t\t}\n\t\treturn this;\n\t},\n\n\tcancel: function(){\n\t\tif (this.isRunning()){\n\t\t\tthis.time = null;\n\t\t\tpullInstance.call(this, this.options.fps);\n\t\t\tthis.frame = this.frames;\n\t\t\tthis.fireEvent('cancel', this.subject).clearChain();\n\t\t\tthis.reject(this.subject);\n\t\t}\n\t\treturn this;\n\t},\n\n\tpause: function(){\n\t\tif (this.isRunning()){\n\t\t\tthis.time = null;\n\t\t\tpullInstance.call(this, this.options.fps);\n\t\t}\n\t\treturn this;\n\t},\n\n\tresume: function(){\n\t\tif (this.isPaused()) pushInstance.call(this, this.options.fps);\n\t\treturn this;\n\t},\n\n\tisRunning: function(){\n\t\tvar list = instances[this.options.fps];\n\t\treturn list && list.contains(this);\n\t},\n\n\tisPaused: function(){\n\t\treturn (this.frame < this.frames) && !this.isRunning();\n\t}\n\n});\n\nFx.compute = function(from, to, delta){\n\treturn (to - from) * delta + from;\n};\n\nFx.Durations = {'short': 250, 'normal': 500, 'long': 1000};\n\n// global timers\n\nvar instances = {}, timers = {};\n\nvar loop = function(){\n\tvar now = Date.now();\n\tfor (var i = this.length; i--;){\n\t\tvar instance = this[i];\n\t\tif (instance) instance.step(now);\n\t}\n};\n\nvar pushInstance = function(fps){\n\tvar list = instances[fps] || (instances[fps] = []);\n\tlist.push(this);\n\tif (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps), list);\n};\n\nvar pullInstance = function(fps){\n\tvar list = instances[fps];\n\tif (list){\n\t\tlist.erase(this);\n\t\tif (!list.length && timers[fps]){\n\t\t\tdelete instances[fps];\n\t\t\ttimers[fps] = clearInterval(timers[fps]);\n\t\t}\n\t}\n};\n\n})();\n\n/*\n---\n\nname: Fx.CSS\n\ndescription: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements.\n\nlicense: MIT-style license.\n\nrequires: [Fx, Element.Style]\n\nprovides: Fx.CSS\n\n...\n*/\n\nFx.CSS = new Class({\n\n\tExtends: Fx,\n\n\t//prepares the base from/to object\n\n\tprepare: function(element, property, values){\n\t\tvalues = Array.convert(values);\n\t\tvar from = values[0], to = values[1];\n\t\tif (to == null){\n\t\t\tto = from;\n\t\t\tfrom = element.getStyle(property);\n\t\t\tvar unit = this.options.unit;\n\t\t\t// adapted from: https://github.com/ryanmorr/fx/blob/master/fx.js#L299\n\t\t\tif (unit && from && typeof from == 'string' && from.slice(-unit.length) != unit && parseFloat(from) != 0){\n\t\t\t\telement.setStyle(property, to + unit);\n\t\t\t\tvar value = element.getComputedStyle(property);\n\t\t\t\t// IE and Opera support pixelLeft or pixelWidth\n\t\t\t\tif (!(/px$/.test(value))){\n\t\t\t\t\tvalue = element.style[('pixel-' + property).camelCase()];\n\t\t\t\t\tif (value == null){\n\t\t\t\t\t\t// adapted from Dean Edwards' http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\t\t\t\t\t\tvar left = element.style.left;\n\t\t\t\t\t\telement.style.left = to + unit;\n\t\t\t\t\t\tvalue = element.style.pixelLeft;\n\t\t\t\t\t\telement.style.left = left;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfrom = (to || 1) / (parseFloat(value) || 1) * (parseFloat(from) || 0);\n\t\t\t\telement.setStyle(property, from + unit);\n\t\t\t}\n\t\t}\n\t\treturn {from: this.parse(from), to: this.parse(to)};\n\t},\n\n\t//parses a value into an array\n\n\tparse: function(value){\n\t\tvalue = Function.convert(value)();\n\t\tvalue = (typeof value == 'string') ? value.split(' ') : Array.convert(value);\n\t\treturn value.map(function(val){\n\t\t\tval = String(val);\n\t\t\tvar found = false;\n\t\t\tObject.each(Fx.CSS.Parsers, function(parser){\n\t\t\t\tif (found) return;\n\t\t\t\tvar parsed = parser.parse(val);\n\t\t\t\tif (parsed || parsed === 0) found = {value: parsed, parser: parser};\n\t\t\t});\n\t\t\tfound = found || {value: val, parser: Fx.CSS.Parsers.String};\n\t\t\treturn found;\n\t\t});\n\t},\n\n\t//computes by a from and to prepared objects, using their parsers.\n\n\tcompute: function(from, to, delta){\n\t\tvar computed = [];\n\t\t(Math.min(from.length, to.length)).times(function(i){\n\t\t\tcomputed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser});\n\t\t});\n\t\tcomputed.$family = Function.convert('fx:css:value');\n\t\treturn computed;\n\t},\n\n\t//serves the value as settable\n\n\tserve: function(value, unit){\n\t\tif (typeOf(value) != 'fx:css:value') value = this.parse(value);\n\t\tvar returned = [];\n\t\tvalue.each(function(bit){\n\t\t\treturned = returned.concat(bit.parser.serve(bit.value, unit));\n\t\t});\n\t\treturn returned;\n\t},\n\n\t//renders the change to an element\n\n\trender: function(element, property, value, unit){\n\t\telement.setStyle(property, this.serve(value, unit));\n\t},\n\n\t//searches inside the page css to find the values for a selector\n\n\tsearch: function(selector){\n\t\tif (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector];\n\t\tvar to = {}, selectorTest = new RegExp('^' + selector.escapeRegExp() + '$');\n\n\t\tvar searchStyles = function(rules){\n\t\t\tArray.each(rules, function(rule){\n\t\t\t\tif (rule.media){\n\t\t\t\t\tsearchStyles(rule.rules || rule.cssRules);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!rule.style) return;\n\t\t\t\tvar selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\\w+/, function(m){\n\t\t\t\t\treturn m.toLowerCase();\n\t\t\t\t}) : null;\n\t\t\t\tif (!selectorText || !selectorTest.test(selectorText)) return;\n\t\t\t\tObject.each(Element.Styles, function(value, style){\n\t\t\t\t\tif (!rule.style[style] || Element.ShortStyles[style]) return;\n\t\t\t\t\tvalue = String(rule.style[style]);\n\t\t\t\t\tto[style] = ((/^rgb/).test(value)) ? value.rgbToHex() : value;\n\t\t\t\t});\n\t\t\t});\n\t\t};\n\n\t\tArray.each(document.styleSheets, function(sheet){\n\t\t\tvar href = sheet.href;\n\t\t\tif (href && href.indexOf('://') > -1 && href.indexOf(document.domain) == -1) return;\n\t\t\tvar rules = sheet.rules || sheet.cssRules;\n\t\t\tsearchStyles(rules);\n\t\t});\n\t\treturn Fx.CSS.Cache[selector] = to;\n\t}\n\n});\n\nFx.CSS.Cache = {};\n\nFx.CSS.Parsers = {\n\n\tColor: {\n\t\tparse: function(value){\n\t\t\tif (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true);\n\t\t\treturn ((value = value.match(/(\\d+),\\s*(\\d+),\\s*(\\d+)/))) ? [value[1], value[2], value[3]] : false;\n\t\t},\n\t\tcompute: function(from, to, delta){\n\t\t\treturn from.map(function(value, i){\n\t\t\t\treturn Math.round(Fx.compute(from[i], to[i], delta));\n\t\t\t});\n\t\t},\n\t\tserve: function(value){\n\t\t\treturn value.map(Number);\n\t\t}\n\t},\n\n\tNumber: {\n\t\tparse: parseFloat,\n\t\tcompute: Fx.compute,\n\t\tserve: function(value, unit){\n\t\t\treturn (unit) ? value + unit : value;\n\t\t}\n\t},\n\n\tString: {\n\t\tparse: Function.convert(false),\n\t\tcompute: function(zero, one){\n\t\t\treturn one;\n\t\t},\n\t\tserve: function(zero){\n\t\t\treturn zero;\n\t\t}\n\t}\n\n};\n\n\n\n/*\n---\n\nname: Fx.Morph\n\ndescription: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules.\n\nlicense: MIT-style license.\n\nrequires: Fx.CSS\n\nprovides: Fx.Morph\n\n...\n*/\n\nFx.Morph = new Class({\n\n\tExtends: Fx.CSS,\n\n\tinitialize: function(element, options){\n\t\tthis.element = this.subject = document.id(element);\n\t\tthis.parent(options);\n\t},\n\n\tset: function(now){\n\t\tif (typeof now == 'string') now = this.search(now);\n\t\tfor (var p in now) this.render(this.element, p, now[p], this.options.unit);\n\t\treturn this;\n\t},\n\n\tcompute: function(from, to, delta){\n\t\tvar now = {};\n\t\tfor (var p in from) now[p] = this.parent(from[p], to[p], delta);\n\t\treturn now;\n\t},\n\n\tstart: function(properties){\n\t\tif (!this.check(properties)) return this;\n\t\tif (typeof properties == 'string') properties = this.search(properties);\n\t\tvar from = {}, to = {};\n\t\tfor (var p in properties){\n\t\t\tvar parsed = this.prepare(this.element, p, properties[p]);\n\t\t\tfrom[p] = parsed.from;\n\t\t\tto[p] = parsed.to;\n\t\t}\n\t\treturn this.parent(from, to);\n\t}\n\n});\n\nElement.Properties.morph = {\n\n\tset: function(options){\n\t\tthis.get('morph').cancel().setOptions(options);\n\t\treturn this;\n\t},\n\n\tget: function(){\n\t\tvar morph = this.retrieve('morph');\n\t\tif (!morph){\n\t\t\tmorph = new Fx.Morph(this, {link: 'cancel'});\n\t\t\tthis.store('morph', morph);\n\t\t}\n\t\treturn morph;\n\t}\n\n};\n\nElement.implement({\n\n\tmorph: function(props){\n\t\tthis.get('morph').start(props);\n\t\treturn this;\n\t}\n\n});\n\n/*\n---\n\nname: Fx.Transitions\n\ndescription: Contains a set of advanced transitions to be used with any of the Fx Classes.\n\nlicense: MIT-style license.\n\ncredits:\n  - Easing Equations by Robert Penner, <http://www.robertpenner.com/easing/>, modified and optimized to be used with MooTools.\n\nrequires: Fx\n\nprovides: Fx.Transitions\n\n...\n*/\n\nFx.implement({\n\n\tgetTransition: function(){\n\t\tvar trans = this.options.transition || Fx.Transitions.Sine.easeInOut;\n\t\tif (typeof trans == 'string'){\n\t\t\tvar data = trans.split(':');\n\t\t\ttrans = Fx.Transitions;\n\t\t\ttrans = trans[data[0]] || trans[data[0].capitalize()];\n\t\t\tif (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')];\n\t\t}\n\t\treturn trans;\n\t}\n\n});\n\nFx.Transition = function(transition, params){\n\tparams = Array.convert(params);\n\tvar easeIn = function(pos){\n\t\treturn transition(pos, params);\n\t};\n\treturn Object.append(easeIn, {\n\t\teaseIn: easeIn,\n\t\teaseOut: function(pos){\n\t\t\treturn 1 - transition(1 - pos, params);\n\t\t},\n\t\teaseInOut: function(pos){\n\t\t\treturn (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2 * (1 - pos), params))) / 2;\n\t\t}\n\t});\n};\n\nFx.Transitions = {\n\n\tlinear: function(zero){\n\t\treturn zero;\n\t}\n\n};\n\n\n\nFx.Transitions.extend = function(transitions){\n\tfor (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]);\n};\n\nFx.Transitions.extend({\n\n\tPow: function(p, x){\n\t\treturn Math.pow(p, x && x[0] || 6);\n\t},\n\n\tExpo: function(p){\n\t\treturn Math.pow(2, 8 * (p - 1));\n\t},\n\n\tCirc: function(p){\n\t\treturn 1 - Math.sin(Math.acos(p));\n\t},\n\n\tSine: function(p){\n\t\treturn 1 - Math.cos(p * Math.PI / 2);\n\t},\n\n\tBack: function(p, x){\n\t\tx = x && x[0] || 1.618;\n\t\treturn Math.pow(p, 2) * ((x + 1) * p - x);\n\t},\n\n\tBounce: function(p){\n\t\tvar value;\n\t\tfor (var a = 0, b = 1; 1; a += b, b /= 2){\n\t\t\tif (p >= (7 - 4 * a) / 11){\n\t\t\t\tvalue = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t},\n\n\tElastic: function(p, x){\n\t\treturn Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3);\n\t}\n\n});\n\n['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){\n\tFx.Transitions[transition] = new Fx.Transition(function(p){\n\t\treturn Math.pow(p, i + 2);\n\t});\n});\n\n/*\n---\n\nname: Fx.Tween\n\ndescription: Formerly Fx.Style, effect to transition any CSS property for an element.\n\nlicense: MIT-style license.\n\nrequires: Fx.CSS\n\nprovides: [Fx.Tween, Element.fade, Element.highlight]\n\n...\n*/\n\nFx.Tween = new Class({\n\n\tExtends: Fx.CSS,\n\n\tinitialize: function(element, options){\n\t\tthis.element = this.subject = document.id(element);\n\t\tthis.parent(options);\n\t},\n\n\tset: function(property, now){\n\t\tif (arguments.length == 1){\n\t\t\tnow = property;\n\t\t\tproperty = this.property || this.options.property;\n\t\t}\n\t\tthis.render(this.element, property, now, this.options.unit);\n\t\treturn this;\n\t},\n\n\tstart: function(property, from, to){\n\t\tif (!this.check(property, from, to)) return this;\n\t\tvar args = Array.flatten(arguments);\n\t\tthis.property = this.options.property || args.shift();\n\t\tvar parsed = this.prepare(this.element, this.property, args);\n\t\treturn this.parent(parsed.from, parsed.to);\n\t}\n\n});\n\nElement.Properties.tween = {\n\n\tset: function(options){\n\t\tthis.get('tween').cancel().setOptions(options);\n\t\treturn this;\n\t},\n\n\tget: function(){\n\t\tvar tween = this.retrieve('tween');\n\t\tif (!tween){\n\t\t\ttween = new Fx.Tween(this, {link: 'cancel'});\n\t\t\tthis.store('tween', tween);\n\t\t}\n\t\treturn tween;\n\t}\n\n};\n\nElement.implement({\n\n\ttween: function(property, from, to){\n\t\tthis.get('tween').start(property, from, to);\n\t\treturn this;\n\t},\n\n\tfade: function(){\n\t\tvar fade = this.get('tween'), method, args = ['opacity'].append(arguments), toggle;\n\t\tif (args[1] == null) args[1] = 'toggle';\n\t\tswitch (args[1]){\n\t\t\tcase 'in': method = 'start'; args[1] = 1; break;\n\t\t\tcase 'out': method = 'start'; args[1] = 0; break;\n\t\t\tcase 'show': method = 'set'; args[1] = 1; break;\n\t\t\tcase 'hide': method = 'set'; args[1] = 0; break;\n\t\t\tcase 'toggle':\n\t\t\t\tvar flag = this.retrieve('fade:flag', this.getStyle('opacity') == 1);\n\t\t\t\tmethod = 'start';\n\t\t\t\targs[1] = flag ? 0 : 1;\n\t\t\t\tthis.store('fade:flag', !flag);\n\t\t\t\ttoggle = true;\n\t\t\t\tbreak;\n\t\t\tdefault: method = 'start';\n\t\t}\n\t\tif (!toggle) this.eliminate('fade:flag');\n\t\tfade[method].apply(fade, args);\n\t\tvar to = args[args.length - 1];\n\n\t\tif (method == 'set'){\n\t\t\tthis.setStyle('visibility', to == 0 ? 'hidden' : 'visible');\n\t\t} else if (to != 0){\n\t\t\tif (fade.$chain.length){\n\t\t\t\tfade.chain(function(){\n\t\t\t\t\tthis.element.setStyle('visibility', 'visible');\n\t\t\t\t\tthis.callChain();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.setStyle('visibility', 'visible');\n\t\t\t}\n\t\t} else {\n\t\t\tfade.chain(function(){\n\t\t\t\tif (this.element.getStyle('opacity')) return;\n\t\t\t\tthis.element.setStyle('visibility', 'hidden');\n\t\t\t\tthis.callChain();\n\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t},\n\n\thighlight: function(start, end){\n\t\tif (!end){\n\t\t\tend = this.retrieve('highlight:original', this.getStyle('background-color'));\n\t\t\tend = (end == 'transparent') ? '#fff' : end;\n\t\t}\n\t\tvar tween = this.get('tween');\n\t\ttween.start('background-color', start || '#ffff88', end).chain(function(){\n\t\t\tthis.setStyle('background-color', this.retrieve('highlight:original'));\n\t\t\ttween.callChain();\n\t\t}.bind(this));\n\t\treturn this;\n\t}\n\n});\n\n/*\n---\n\nname: Request\n\ndescription: Powerful all purpose Request Class. Uses XMLHTTPRequest.\n\nlicense: MIT-style license.\n\nrequires: [Object, Element, Chain, Events, Options, Class.Thenable, Browser]\n\nprovides: Request\n\n...\n*/\n\n(function(){\n\nvar empty = function(){},\n\tprogressSupport = ('onprogress' in new Browser.Request);\n\nvar Request = this.Request = new Class({\n\n\tImplements: [Chain, Events, Options, Class.Thenable],\n\n\toptions: {/*\n\t\tonRequest: function(){},\n\t\tonLoadstart: function(event, xhr){},\n\t\tonProgress: function(event, xhr){},\n\t\tonComplete: function(){},\n\t\tonCancel: function(){},\n\t\tonSuccess: function(responseText, responseXML){},\n\t\tonFailure: function(xhr){},\n\t\tonException: function(headerName, value){},\n\t\tonTimeout: function(){},\n\t\tuser: '',\n\t\tpassword: '',\n\t\twithCredentials: false,*/\n\t\turl: '',\n\t\tdata: '',\n\t\theaders: {\n\t\t\t'X-Requested-With': 'XMLHttpRequest',\n\t\t\t'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'\n\t\t},\n\t\tasync: true,\n\t\tformat: false,\n\t\tmethod: 'post',\n\t\tlink: 'ignore',\n\t\tisSuccess: null,\n\t\temulation: true,\n\t\turlEncoded: true,\n\t\tencoding: 'utf-8',\n\t\tevalScripts: false,\n\t\tevalResponse: false,\n\t\ttimeout: 0,\n\t\tnoCache: false\n\t},\n\n\tinitialize: function(options){\n\t\tthis.xhr = new Browser.Request();\n\t\tthis.setOptions(options);\n\t\tthis.headers = this.options.headers;\n\t},\n\n\tonStateChange: function(){\n\t\tvar xhr = this.xhr;\n\t\tif (xhr.readyState != 4 || !this.running) return;\n\t\tthis.running = false;\n\t\tthis.status = 0;\n\t\tFunction.attempt(function(){\n\t\t\tvar status = xhr.status;\n\t\t\tthis.status = (status == 1223) ? 204 : status;\n\t\t}.bind(this));\n\t\txhr.onreadystatechange = empty;\n\t\tif (progressSupport) xhr.onprogress = xhr.onloadstart = empty;\n\t\tif (this.timer){\n\t\t\tclearTimeout(this.timer);\n\t\t\tdelete this.timer;\n\t\t}\n\n\t\tthis.response = {text: this.xhr.responseText || '', xml: this.xhr.responseXML};\n\t\tif (this.options.isSuccess.call(this, this.status))\n\t\t\tthis.success(this.response.text, this.response.xml);\n\t\telse\n\t\t\tthis.failure();\n\t},\n\n\tisSuccess: function(){\n\t\tvar status = this.status;\n\t\treturn (status >= 200 && status < 300);\n\t},\n\n\tisRunning: function(){\n\t\treturn !!this.running;\n\t},\n\n\tprocessScripts: function(text){\n\t\tif (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return Browser.exec(text);\n\t\treturn text.stripScripts(this.options.evalScripts);\n\t},\n\n\tsuccess: function(text, xml){\n\t\tthis.onSuccess(this.processScripts(text), xml);\n\t\tthis.resolve({text: text, xml: xml});\n\t},\n\n\tonSuccess: function(){\n\t\tthis.fireEvent('complete', arguments).fireEvent('success', arguments).callChain();\n\t},\n\n\tfailure: function(){\n\t\tthis.onFailure();\n\t\tthis.reject({reason: 'failure', xhr: this.xhr});\n\t},\n\n\tonFailure: function(){\n\t\tthis.fireEvent('complete').fireEvent('failure', this.xhr);\n\t},\n\n\tloadstart: function(event){\n\t\tthis.fireEvent('loadstart', [event, this.xhr]);\n\t},\n\n\tprogress: function(event){\n\t\tthis.fireEvent('progress', [event, this.xhr]);\n\t},\n\n\ttimeout: function(){\n\t\tthis.fireEvent('timeout', this.xhr);\n\t\tthis.reject({reason: 'timeout', xhr: this.xhr});\n\t},\n\n\tsetHeader: function(name, value){\n\t\tthis.headers[name] = value;\n\t\treturn this;\n\t},\n\n\tgetHeader: function(name){\n\t\treturn Function.attempt(function(){\n\t\t\treturn this.xhr.getResponseHeader(name);\n\t\t}.bind(this));\n\t},\n\n\tcheck: function(){\n\t\tif (!this.running) return true;\n\t\tswitch (this.options.link){\n\t\t\tcase 'cancel': this.cancel(); return true;\n\t\t\tcase 'chain': this.chain(this.caller.pass(arguments, this)); return false;\n\t\t}\n\t\treturn false;\n\t},\n\n\tsend: function(options){\n\t\tif (!this.check(options)) return this;\n\n\t\tthis.options.isSuccess = this.options.isSuccess || this.isSuccess;\n\t\tthis.running = true;\n\n\t\tvar type = typeOf(options);\n\t\tif (type == 'string' || type == 'element') options = {data: options};\n\n\t\tvar old = this.options;\n\t\toptions = Object.append({data: old.data, url: old.url, method: old.method}, options);\n\t\tvar data = options.data, url = String(options.url), method = options.method.toLowerCase();\n\n\t\tswitch (typeOf(data)){\n\t\t\tcase 'element': data = document.id(data).toQueryString(); break;\n\t\t\tcase 'object': case 'hash': data = Object.toQueryString(data);\n\t\t}\n\n\t\tif (this.options.format){\n\t\t\tvar format = 'format=' + this.options.format;\n\t\t\tdata = (data) ? format + '&' + data : format;\n\t\t}\n\n\t\tif (this.options.emulation && !['get', 'post'].contains(method)){\n\t\t\tvar _method = '_method=' + method;\n\t\t\tdata = (data) ? _method + '&' + data : _method;\n\t\t\tmethod = 'post';\n\t\t}\n\n\t\tif (this.options.urlEncoded && ['post', 'put'].contains(method)){\n\t\t\tvar encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : '';\n\t\t\tthis.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding;\n\t\t}\n\n\t\tif (!url) url = document.location.pathname;\n\n\t\tvar trimPosition = url.lastIndexOf('/');\n\t\tif (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition);\n\n\t\tif (this.options.noCache)\n\t\t\turl += (url.indexOf('?') > -1 ? '&' : '?') + String.uniqueID();\n\n\t\tif (data && (method == 'get' || method == 'delete')){\n\t\t\turl += (url.indexOf('?') > -1 ? '&' : '?') + data;\n\t\t\tdata = null;\n\t\t}\n\n\t\tvar xhr = this.xhr;\n\t\tif (progressSupport){\n\t\t\txhr.onloadstart = this.loadstart.bind(this);\n\t\t\txhr.onprogress = this.progress.bind(this);\n\t\t}\n\n\t\txhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password);\n\t\tif ((this.options.withCredentials) && 'withCredentials' in xhr) xhr.withCredentials = true;\n\n\t\txhr.onreadystatechange = this.onStateChange.bind(this);\n\n\t\tObject.each(this.headers, function(value, key){\n\t\t\ttry {\n\t\t\t\txhr.setRequestHeader(key, value);\n\t\t\t} catch (e){\n\t\t\t\tthis.fireEvent('exception', [key, value]);\n\t\t\t\tthis.reject({reason: 'exception', xhr: xhr, exception: e});\n\t\t\t}\n\t\t}, this);\n\n\t\tif (this.getThenableState() !== 'pending'){\n\t\t\tthis.resetThenable({reason: 'send'});\n\t\t}\n\t\tthis.fireEvent('request');\n\t\txhr.send(data);\n\t\tif (!this.options.async) this.onStateChange();\n\t\telse if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this);\n\t\treturn this;\n\t},\n\n\tcancel: function(){\n\t\tif (!this.running) return this;\n\t\tthis.running = false;\n\t\tvar xhr = this.xhr;\n\t\txhr.abort();\n\t\tif (this.timer){\n\t\t\tclearTimeout(this.timer);\n\t\t\tdelete this.timer;\n\t\t}\n\t\txhr.onreadystatechange = empty;\n\t\tif (progressSupport) xhr.onprogress = xhr.onloadstart = empty;\n\t\tthis.xhr = new Browser.Request();\n\t\tthis.fireEvent('cancel');\n\t\tthis.reject({reason: 'cancel', xhr: xhr});\n\t\treturn this;\n\t}\n\n});\n\nvar methods = {};\n['get', 'post', 'put', 'delete', 'patch', 'head', 'GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD'].each(function(method){\n\tmethods[method] = function(data){\n\t\tvar object = {\n\t\t\tmethod: method\n\t\t};\n\t\tif (data != null) object.data = data;\n\t\treturn this.send(object);\n\t};\n});\n\nRequest.implement(methods);\n\nElement.Properties.send = {\n\n\tset: function(options){\n\t\tvar send = this.get('send').cancel();\n\t\tsend.setOptions(options);\n\t\treturn this;\n\t},\n\n\tget: function(){\n\t\tvar send = this.retrieve('send');\n\t\tif (!send){\n\t\t\tsend = new Request({\n\t\t\t\tdata: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action')\n\t\t\t});\n\t\t\tthis.store('send', send);\n\t\t}\n\t\treturn send;\n\t}\n\n};\n\nElement.implement({\n\n\tsend: function(url){\n\t\tvar sender = this.get('send');\n\t\tsender.send({data: this, url: url || sender.options.url});\n\t\treturn this;\n\t}\n\n});\n\n})();\n\n/*\n---\n\nname: Request.HTML\n\ndescription: Extends the basic Request Class with additional methods for interacting with HTML responses.\n\nlicense: MIT-style license.\n\nrequires: [Element, Request]\n\nprovides: Request.HTML\n\n...\n*/\n\nRequest.HTML = new Class({\n\n\tExtends: Request,\n\n\toptions: {\n\t\tupdate: false,\n\t\tappend: false,\n\t\tevalScripts: true,\n\t\tfilter: false,\n\t\theaders: {\n\t\t\tAccept: 'text/html, application/xml, text/xml, */*'\n\t\t}\n\t},\n\n\tsuccess: function(text){\n\t\tvar options = this.options, response = this.response;\n\n\t\tresponse.html = text.stripScripts(function(script){\n\t\t\tresponse.javascript = script;\n\t\t});\n\n\t\tvar match = response.html.match(/<body[^>]*>([\\s\\S]*?)<\\/body>/i);\n\t\tif (match) response.html = match[1];\n\t\tvar temp = new Element('div').set('html', response.html);\n\n\t\tresponse.tree = temp.childNodes;\n\t\tresponse.elements = temp.getElements(options.filter || '*');\n\n\t\tif (options.filter) response.tree = response.elements;\n\t\tif (options.update){\n\t\t\tvar update = document.id(options.update).empty();\n\t\t\tif (options.filter) update.adopt(response.elements);\n\t\t\telse update.set('html', response.html);\n\t\t} else if (options.append){\n\t\t\tvar append = document.id(options.append);\n\t\t\tif (options.filter) response.elements.reverse().inject(append);\n\t\t\telse append.adopt(temp.getChildren());\n\t\t}\n\t\tif (options.evalScripts) Browser.exec(response.javascript);\n\n\t\tthis.onSuccess(response.tree, response.elements, response.html, response.javascript);\n\t\tthis.resolve({tree: response.tree, elements: response.elements, html: response.html, javascript: response.javascript});\n\t}\n\n});\n\nElement.Properties.load = {\n\n\tset: function(options){\n\t\tvar load = this.get('load').cancel();\n\t\tload.setOptions(options);\n\t\treturn this;\n\t},\n\n\tget: function(){\n\t\tvar load = this.retrieve('load');\n\t\tif (!load){\n\t\t\tload = new Request.HTML({data: this, link: 'cancel', update: this, method: 'get'});\n\t\t\tthis.store('load', load);\n\t\t}\n\t\treturn load;\n\t}\n\n};\n\nElement.implement({\n\n\tload: function(){\n\t\tthis.get('load').send(Array.link(arguments, {data: Type.isObject, url: Type.isString}));\n\t\treturn this;\n\t}\n\n});\n\n/*\n---\n\nname: JSON\n\ndescription: JSON encoder and decoder.\n\nlicense: MIT-style license.\n\nSeeAlso: <http://www.json.org/>\n\nrequires: [Array, String, Number, Function]\n\nprovides: JSON\n\n...\n*/\n\nif (typeof JSON == 'undefined') this.JSON = {};\n\n\n\n(function(){\n\nvar special = {'\\b': '\\\\b', '\\t': '\\\\t', '\\n': '\\\\n', '\\f': '\\\\f', '\\r': '\\\\r', '\"' : '\\\\\"', '\\\\': '\\\\\\\\'};\n\nvar escape = function(chr){\n\treturn special[chr] || '\\\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4);\n};\n\nJSON.validate = function(string){\n\tstring = string.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').\n\t\t\t\t\treplace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']').\n\t\t\t\t\treplace(/(?:^|:|,)(?:\\s*\\[)+/g, '');\n\n\treturn (/^[\\],:{}\\s]*$/).test(string);\n};\n\nJSON.encode = JSON.stringify ? function(obj){\n\treturn JSON.stringify(obj);\n} : function(obj){\n\tif (obj && obj.toJSON) obj = obj.toJSON();\n\n\tswitch (typeOf(obj)){\n\t\tcase 'string':\n\t\t\treturn '\"' + obj.replace(/[\\x00-\\x1f\\\\\"]/g, escape) + '\"';\n\t\tcase 'array':\n\t\t\treturn '[' + obj.map(JSON.encode).clean() + ']';\n\t\tcase 'object': case 'hash':\n\t\t\tvar string = [];\n\t\t\tObject.each(obj, function(value, key){\n\t\t\t\tvar json = JSON.encode(value);\n\t\t\t\tif (json) string.push(JSON.encode(key) + ':' + json);\n\t\t\t});\n\t\t\treturn '{' + string + '}';\n\t\tcase 'number': case 'boolean': return '' + obj;\n\t\tcase 'null': return 'null';\n\t}\n\n\treturn null;\n};\n\nJSON.secure = true;\n\n\nJSON.decode = function(string, secure){\n\tif (!string || typeOf(string) != 'string') return null;\n\n\tif (secure == null) secure = JSON.secure;\n\tif (secure){\n\t\tif (JSON.parse) return JSON.parse(string);\n\t\tif (!JSON.validate(string)) throw new Error('JSON could not decode the input; security is enabled and the value is not secure.');\n\t}\n\n\treturn eval('(' + string + ')');\n};\n\n})();\n\n/*\n---\n\nname: Request.JSON\n\ndescription: Extends the basic Request Class with additional methods for sending and receiving JSON data.\n\nlicense: MIT-style license.\n\nrequires: [Request, JSON]\n\nprovides: Request.JSON\n\n...\n*/\n\nRequest.JSON = new Class({\n\n\tExtends: Request,\n\n\toptions: {\n\t\t/*onError: function(text, error){},*/\n\t\tsecure: true\n\t},\n\n\tinitialize: function(options){\n\t\tthis.parent(options);\n\t\tObject.append(this.headers, {\n\t\t\t'Accept': 'application/json',\n\t\t\t'X-Request': 'JSON'\n\t\t});\n\t},\n\n\tsuccess: function(text){\n\t\tvar json;\n\t\ttry {\n\t\t\tjson = this.response.json = JSON.decode(text, this.options.secure);\n\t\t} catch (error){\n\t\t\tthis.fireEvent('error', [text, error]);\n\t\t\treturn;\n\t\t}\n\t\tif (json == null){\n\t\t\tthis.failure();\n\t\t} else {\n\t\t\tthis.onSuccess(json, text);\n\t\t\tthis.resolve({json: json, text: text});\n\t\t}\n\t}\n\n});\n\n/*\n---\n\nname: Cookie\n\ndescription: Class for creating, reading, and deleting browser Cookies.\n\nlicense: MIT-style license.\n\ncredits:\n  - Based on the functions by Peter-Paul Koch (http://quirksmode.org).\n\nrequires: [Options, Browser]\n\nprovides: Cookie\n\n...\n*/\n\nvar Cookie = new Class({\n\n\tImplements: Options,\n\n\toptions: {\n\t\tpath: '/',\n\t\tdomain: false,\n\t\tduration: false,\n\t\tsecure: false,\n\t\tdocument: document,\n\t\tencode: true,\n\t\thttpOnly: false\n\t},\n\n\tinitialize: function(key, options){\n\t\tthis.key = key;\n\t\tthis.setOptions(options);\n\t},\n\n\twrite: function(value){\n\t\tif (this.options.encode) value = encodeURIComponent(value);\n\t\tif (this.options.domain) value += '; domain=' + this.options.domain;\n\t\tif (this.options.path) value += '; path=' + this.options.path;\n\t\tif (this.options.duration){\n\t\t\tvar date = new Date();\n\t\t\tdate.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);\n\t\t\tvalue += '; expires=' + date.toGMTString();\n\t\t}\n\t\tif (this.options.secure) value += '; secure';\n\t\tif (this.options.httpOnly) value += '; HttpOnly';\n\t\tthis.options.document.cookie = this.key + '=' + value;\n\t\treturn this;\n\t},\n\n\tread: function(){\n\t\tvar value = this.options.document.cookie.match('(?:^|;)\\\\s*' + this.key.escapeRegExp() + '=([^;]*)');\n\t\treturn (value) ? decodeURIComponent(value[1]) : null;\n\t},\n\n\tdispose: function(){\n\t\tnew Cookie(this.key, Object.merge({}, this.options, {duration: -1})).write('');\n\t\treturn this;\n\t}\n\n});\n\nCookie.write = function(key, value, options){\n\treturn new Cookie(key, options).write(value);\n};\n\nCookie.read = function(key){\n\treturn new Cookie(key).read();\n};\n\nCookie.dispose = function(key, options){\n\treturn new Cookie(key, options).dispose();\n};\n\n/*\n---\n\nname: DOMReady\n\ndescription: Contains the custom event domready.\n\nlicense: MIT-style license.\n\nrequires: [Browser, Element, Element.Event]\n\nprovides: [DOMReady, DomReady]\n\n...\n*/\n\n(function(window, document){\n\nvar ready,\n\tloaded,\n\tchecks = [],\n\tshouldPoll,\n\ttimer,\n\ttestElement = document.createElement('div');\n\nvar domready = function(){\n\tclearTimeout(timer);\n\tif (!ready){\n\t\tBrowser.loaded = ready = true;\n\t\tdocument.removeListener('DOMContentLoaded', domready).removeListener('readystatechange', check);\n\t\tdocument.fireEvent('domready');\n\t\twindow.fireEvent('domready');\n\t}\n\t// cleanup scope vars\n\tdocument = window = testElement = null;\n};\n\nvar check = function(){\n\tfor (var i = checks.length; i--;) if (checks[i]()){\n\t\tdomready();\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nvar poll = function(){\n\tclearTimeout(timer);\n\tif (!check()) timer = setTimeout(poll, 10);\n};\n\ndocument.addListener('DOMContentLoaded', domready);\n\n/*<ltIE8>*/\n// doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/\n// testElement.doScroll() throws when the DOM is not ready, only in the top window\nvar doScrollWorks = function(){\n\ttry {\n\t\ttestElement.doScroll();\n\t\treturn true;\n\t} catch (e){}\n\treturn false;\n};\n// If doScroll works already, it can't be used to determine domready\n//   e.g. in an iframe\nif (testElement.doScroll && !doScrollWorks()){\n\tchecks.push(doScrollWorks);\n\tshouldPoll = true;\n}\n/*</ltIE8>*/\n\nif (document.readyState) checks.push(function(){\n\tvar state = document.readyState;\n\treturn (state == 'loaded' || state == 'complete');\n});\n\nif ('onreadystatechange' in document) document.addListener('readystatechange', check);\nelse shouldPoll = true;\n\nif (shouldPoll) poll();\n\nElement.Events.domready = {\n\tonAdd: function(fn){\n\t\tif (ready) fn.call(this);\n\t}\n};\n\n// Make sure that domready fires before load\nElement.Events.load = {\n\tbase: 'load',\n\tonAdd: function(fn){\n\t\tif (loaded && this == window) fn.call(this);\n\t},\n\tcondition: function(){\n\t\tif (this == window){\n\t\t\tdomready();\n\t\t\tdelete Element.Events.load;\n\t\t}\n\t\treturn true;\n\t}\n};\n\n// This is based on the custom load event\nwindow.addEvent('load', function(){\n\tloaded = true;\n});\n\n})(window, document);\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/html-css/button-with-fallback.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Button example</title>\n    <link href=\"style.css\" rel=\"stylesheet\" type=\"text/css\">\n  </head>\n  <body>\n      <button>Press me</button>\n  </body>\n</html>"
  },
  {
    "path": "tools-testing/cross-browser-testing/html-css/forms-test.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Forms test</title>\n    <style>\n      label {\n        float: left;\n        width: 30%;\n        text-align: right;\n      }\n\n      input {\n        float: right;\n        width: 65%;\n      }\n\n      label, input {\n        margin-bottom: 20px;\n      }\n\n      div {\n        clear: both;\n        margin: 10px;\n      }\n\n      body {\n        width: 400px;\n        margin: 0 auto;\n      }\n    </style>\n  </head>\n  <body>\n    <form>\n      <div>\n        <label for=\"date\">Enter a date:</label>\n        <input id=\"date\" type=\"date\">\n      </div>\n      <div>\n        <label for=\"time\">Enter a time:</label>\n        <input id=\"time\" type=\"time\">\n      </div>\n    </form>\n  </body>\n</html>"
  },
  {
    "path": "tools-testing/cross-browser-testing/html-css/selectivizr-example-start.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Selectivizr example</title>\n     \n    <style>\n\n    p:first-child {\n      background: red;\n      color: white;\n      font-size: 3em;\n      text-align: center;\n    }\n\n    </style>\n    \n  </head>\n  <body>\n    <p>Selectivizr example</p>\n\n    <p>Selectivizr example</p>\n  </body>\n</html>"
  },
  {
    "path": "tools-testing/cross-browser-testing/html-css/selectivizr-example.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Selectivizr example</title>\n    <script type=\"text/javascript\" src=\"MooTools-Core-1.6.0.js\"></script>\n    <!--[if (gte IE 6)&(lte IE 8)]>\n      <script type=\"text/javascript\" src=\"selectivizr-min.js\"></script>\n    <![endif]--> \n    <style>\n\n    p:first-child {\n      background: red;\n      color: white;\n      font-size: 3em;\n      text-align: center;\n    }\n\n    </style>\n    \n  </head>\n  <body>\n    <p>Selectivizr example</p>\n\n    <p>Selectivizr example</p>\n  </body>\n</html>"
  },
  {
    "path": "tools-testing/cross-browser-testing/html-css/selectivizr-min.js",
    "content": "/*!\n * selectivizr v1.0.2 - (c) Keith Clark, freely distributable under the terms of the MIT license.\n * selectivizr.com\n */\n(function(j){function A(a){return a.replace(B,h).replace(C,function(a,d,b){for(var a=b.split(\",\"),b=0,e=a.length;b<e;b++){var s=D(a[b].replace(E,h).replace(F,h))+o,l=[];a[b]=s.replace(G,function(a,b,c,d,e){if(b){if(l.length>0){var a=l,f,e=s.substring(0,e).replace(H,i);if(e==i||e.charAt(e.length-1)==o)e+=\"*\";try{f=t(e)}catch(k){}if(f){e=0;for(c=f.length;e<c;e++){for(var d=f[e],h=d.className,j=0,m=a.length;j<m;j++){var g=a[j];if(!RegExp(\"(^|\\\\s)\"+g.className+\"(\\\\s|$)\").test(d.className)&&g.b&&(g.b===!0||g.b(d)===!0))h=u(h,g.className,!0)}d.className=h}}l=[]}return b}else{if(b=c?I(c):!v||v.test(d)?{className:w(d),b:!0}:null)return l.push(b),\".\"+b.className;return a}})}return d+a.join(\",\")})}function I(a){var c=!0,d=w(a.slice(1)),b=a.substring(0,5)==\":not(\",e,f;b&&(a=a.slice(5,-1));var l=a.indexOf(\"(\");l>-1&&(a=a.substring(0,l));if(a.charAt(0)==\":\")switch(a.slice(1)){case \"root\":c=function(a){return b?a!=p:a==p};break;case \"target\":if(m==8){c=function(a){function c(){var d=location.hash,e=d.slice(1);return b?d==i||a.id!=e:d!=i&&a.id==e}k(j,\"hashchange\",function(){g(a,d,c())});return c()};break}return!1;case \"checked\":c=function(a){J.test(a.type)&&k(a,\"propertychange\",function(){event.propertyName==\"checked\"&&g(a,d,a.checked!==b)});return a.checked!==b};break;case \"disabled\":b=!b;case \"enabled\":c=function(c){if(K.test(c.tagName))return k(c,\"propertychange\",function(){event.propertyName==\"$disabled\"&&g(c,d,c.a===b)}),q.push(c),c.a=c.disabled,c.disabled===b;return a==\":enabled\"?b:!b};break;case \"focus\":e=\"focus\",f=\"blur\";case \"hover\":e||(e=\"mouseenter\",f=\"mouseleave\");c=function(a){k(a,b?f:e,function(){g(a,d,!0)});k(a,b?e:f,function(){g(a,d,!1)});return b};break;default:if(!L.test(a))return!1}return{className:d,b:c}}function w(a){return M+\"-\"+(m==6&&N?O++:a.replace(P,function(a){return a.charCodeAt(0)}))}function D(a){return a.replace(x,h).replace(Q,o)}function g(a,c,d){var b=a.className,c=u(b,c,d);if(c!=b)a.className=c,a.parentNode.className+=i}function u(a,c,d){var b=RegExp(\"(^|\\\\s)\"+c+\"(\\\\s|$)\"),e=b.test(a);return d?e?a:a+o+c:e?a.replace(b,h).replace(x,h):a}function k(a,c,d){a.attachEvent(\"on\"+c,d)}function r(a,c){if(/^https?:\\/\\//i.test(a))return c.substring(0,c.indexOf(\"/\",8))==a.substring(0,a.indexOf(\"/\",8))?a:null;if(a.charAt(0)==\"/\")return c.substring(0,c.indexOf(\"/\",8))+a;var d=c.split(/[?#]/)[0];a.charAt(0)!=\"?\"&&d.charAt(d.length-1)!=\"/\"&&(d=d.substring(0,d.lastIndexOf(\"/\")+1));return d+a}function y(a){if(a)return n.open(\"GET\",a,!1),n.send(),(n.status==200?n.responseText:i).replace(R,i).replace(S,function(c,d,b,e,f){return y(r(b||f,a))}).replace(T,function(c,d,b){d=d||i;return\" url(\"+d+r(b,a)+d+\") \"});return i}function U(){var a,c;a=f.getElementsByTagName(\"BASE\");for(var d=a.length>0?a[0].href:f.location.href,b=0;b<f.styleSheets.length;b++)if(c=f.styleSheets[b],c.href!=i&&(a=r(c.href,d)))c.cssText=A(y(a));q.length>0&&setInterval(function(){for(var a=0,c=q.length;a<c;a++){var b=q[a];if(b.disabled!==b.a)b.disabled?(b.disabled=!1,b.a=!0,b.disabled=!0):b.a=b.disabled}},250)}if(!/*@cc_on!@*/true){var f=document,p=f.documentElement,n=function(){if(j.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject(\"Microsoft.XMLHTTP\")}catch(a){return null}}(),m=/MSIE (\\d+)/.exec(navigator.userAgent)[1];if(!(f.compatMode!=\"CSS1Compat\"||m<6||m>8||!n)){var z={NW:\"*.Dom.select\",MooTools:\"$$\",DOMAssistant:\"*.$\",Prototype:\"$$\",YAHOO:\"*.util.Selector.query\",Sizzle:\"*\",jQuery:\"*\",dojo:\"*.query\"},t,q=[],O=0,N=!0,M=\"slvzr\",R=/(\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\/)\\s*/g,S=/@import\\s*(?:(?:(?:url\\(\\s*(['\"]?)(.*)\\1)\\s*\\))|(?:(['\"])(.*)\\3))[^;]*;/g,T=/\\burl\\(\\s*([\"']?)(?!data:)([^\"')]+)\\1\\s*\\)/g,L=/^:(empty|(first|last|only|nth(-last)?)-(child|of-type))$/,B=/:(:first-(?:line|letter))/g,C=/(^|})\\s*([^\\{]*?[\\[:][^{]+)/g,G=/([ +~>])|(:[a-z-]+(?:\\(.*?\\)+)?)|(\\[.*?\\])/g,H=/(:not\\()?:(hover|enabled|disabled|focus|checked|target|active|visited|first-line|first-letter)\\)?/g,P=/[^\\w-]/g,K=/^(INPUT|SELECT|TEXTAREA|BUTTON)$/,J=/^(checkbox|radio)$/,v=m>6?/[\\$\\^*]=(['\"])\\1/:null,E=/([(\\[+~])\\s+/g,F=/\\s+([)\\]+~])/g,Q=/\\s+/g,x=/^\\s*((?:[\\S\\s]*\\S)?)\\s*$/,i=\"\",o=\" \",h=\"$1\";(function(a,c){function d(){try{p.doScroll(\"left\")}catch(a){setTimeout(d,50);return}b(\"poll\")}function b(d){if(!(d.type==\"readystatechange\"&&f.readyState!=\"complete\")&&((d.type==\"load\"?a:f).detachEvent(\"on\"+d.type,b,!1),!e&&(e=!0)))c.call(a,d.type||d)}var e=!1,g=!0;if(f.readyState==\"complete\")c.call(a,i);else{if(f.createEventObject&&p.doScroll){try{g=!a.frameElement}catch(h){}g&&d()}k(f,\"readystatechange\",b);k(a,\"load\",b)}})(j,function(){for(var a in z){var c,d,b=j;if(j[a]){for(c=z[a].replace(\"*\",a).split(\".\");(d=c.shift())&&(b=b[d]););if(typeof b==\"function\"){t=b;U();break}}}})}}})(this);"
  },
  {
    "path": "tools-testing/cross-browser-testing/html-css/style.css",
    "content": "html {\n  font-family: sans-serif;\n}\n\nbutton {\n  width: 150px;\n  margin: auto;\n  line-height: 2;\n  font-size: 1.1rem;\n  text-align: center;\n  color: white;\n  text-shadow: 1px 1px 1px black;\n  border-radius: 20px / 15px;\n  border: none;\n  cursor: pointer;\n\n  background-color: #ff0000;\n  background-color: rgba(255,0,0,1);\n  box-shadow: inset 1px 1px 3px rgba(255,255,255,0.4),\n              inset -1px -1px 3px rgba(0,0,0,0.4);\n}\n\nbutton:hover {\n  background-color: rgba(255,0,0,0.5);\n}\n\nbutton:active {\n  box-shadow: inset 1px 1px 3px rgba(0,0,0,0.4),\n              inset -1px -1px 3px rgba(255,255,255,0.4);\n}\n\nbody {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n}\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/.eslintrc.js",
    "content": "module.exports = {\n    \"extends\": \"google\",\n    \"installedESLint\": true\n};"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/arrow-function.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n\n    <title>Arrow function example</title>\n\n  </head>\n\n  <body>\n    <script>\n      let array = ['Chris', 'Bob', 'Mark', 'Paul'];\n\n      // Old style syntax\n      //\n      // array.forEach(function(e, i, a) {\n      //    var elem = document.createElement('p');\n      //    elem.textContent = (i + 1) + '. ' + e;\n      //    document.body.appendChild(elem);\n      // });\n\n      // Arrow function syntax\n      array.forEach((e, i, a) => {\n         const elem = document.createElement('p');\n         elem.textContent = (i + 1) + '. ' + e;\n         document.body.appendChild(elem);\n      });\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/bad-for-loop.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Bad for loop</title>\n  </head>\n  <body>\n    <script>\n      for(var i = 1; i <= 10; i++) {\n        const para = document.createElement('p');\n        para.textContent = 'This is paragraph ' + i + '.';\n        document.body.appendChild(para);\n        para.onclick = function() {\n          alert('Hello from paragraph ' + i + '!');\n        }\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/broken-js-test.js",
    "content": "for(let i = 1; i <= 10; i++) {\n  const para = document.createElement('p');\n  para.textContent = 'This is paragraph ' + i + '.';\n  document.body.appendChild(para);\n  addHandler(para, i);\n}\n\nfunction addHandler(para, i) {\n  para.onclick = function() {\n    alert('Hello from paragraph ' + i + '!');\n  }\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/es6-promise.js",
    "content": "/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license   Licensed under MIT license\n *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version   4.0.5\n */\n\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    (global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n  return typeof x === 'function' || typeof x === 'object' && x !== null;\n}\n\nfunction isFunction(x) {\n  return typeof x === 'function';\n}\n\nvar _isArray = undefined;\nif (!Array.isArray) {\n  _isArray = function (x) {\n    return Object.prototype.toString.call(x) === '[object Array]';\n  };\n} else {\n  _isArray = Array.isArray;\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = undefined;\nvar customSchedulerFn = undefined;\n\nvar asap = function asap(callback, arg) {\n  queue[len] = callback;\n  queue[len + 1] = arg;\n  len += 2;\n  if (len === 2) {\n    // If len is 2, that means that we need to schedule an async flush.\n    // If additional callbacks are queued before the queue is flushed, they\n    // will be processed by this flush that we are scheduling.\n    if (customSchedulerFn) {\n      customSchedulerFn(flush);\n    } else {\n      scheduleFlush();\n    }\n  }\n};\n\nfunction setScheduler(scheduleFn) {\n  customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n  asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n  // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n  // see https://github.com/cujojs/when/issues/410 for details\n  return function () {\n    return process.nextTick(flush);\n  };\n}\n\n// vertx\nfunction useVertxTimer() {\n  if (typeof vertxNext !== 'undefined') {\n    return function () {\n      vertxNext(flush);\n    };\n  }\n\n  return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n  var iterations = 0;\n  var observer = new BrowserMutationObserver(flush);\n  var node = document.createTextNode('');\n  observer.observe(node, { characterData: true });\n\n  return function () {\n    node.data = iterations = ++iterations % 2;\n  };\n}\n\n// web worker\nfunction useMessageChannel() {\n  var channel = new MessageChannel();\n  channel.port1.onmessage = flush;\n  return function () {\n    return channel.port2.postMessage(0);\n  };\n}\n\nfunction useSetTimeout() {\n  // Store setTimeout reference so es6-promise will be unaffected by\n  // other code modifying setTimeout (like sinon.useFakeTimers())\n  var globalSetTimeout = setTimeout;\n  return function () {\n    return globalSetTimeout(flush, 1);\n  };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n  for (var i = 0; i < len; i += 2) {\n    var callback = queue[i];\n    var arg = queue[i + 1];\n\n    callback(arg);\n\n    queue[i] = undefined;\n    queue[i + 1] = undefined;\n  }\n\n  len = 0;\n}\n\nfunction attemptVertx() {\n  try {\n    var r = require;\n    var vertx = r('vertx');\n    vertxNext = vertx.runOnLoop || vertx.runOnContext;\n    return useVertxTimer();\n  } catch (e) {\n    return useSetTimeout();\n  }\n}\n\nvar scheduleFlush = undefined;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n  scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n  scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n  scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n  scheduleFlush = attemptVertx();\n} else {\n  scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n  var _arguments = arguments;\n\n  var parent = this;\n\n  var child = new this.constructor(noop);\n\n  if (child[PROMISE_ID] === undefined) {\n    makePromise(child);\n  }\n\n  var _state = parent._state;\n\n  if (_state) {\n    (function () {\n      var callback = _arguments[_state - 1];\n      asap(function () {\n        return invokeCallback(_state, child, callback, parent._result);\n      });\n    })();\n  } else {\n    subscribe(parent, child, onFulfillment, onRejection);\n  }\n\n  return child;\n}\n\n/**\n  `Promise.resolve` returns a promise that will become resolved with the\n  passed `value`. It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    resolve(1);\n  });\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.resolve(1);\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  @method resolve\n  @static\n  @param {Any} value value that the returned promise will be resolved with\n  Useful for tooling.\n  @return {Promise} a promise that will become fulfilled with the given\n  `value`\n*/\nfunction resolve(object) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (object && typeof object === 'object' && object.constructor === Constructor) {\n    return object;\n  }\n\n  var promise = new Constructor(noop);\n  _resolve(promise, object);\n  return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(16);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction selfFulfillment() {\n  return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n  return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction getThen(promise) {\n  try {\n    return promise.then;\n  } catch (error) {\n    GET_THEN_ERROR.error = error;\n    return GET_THEN_ERROR;\n  }\n}\n\nfunction tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n  try {\n    then.call(value, fulfillmentHandler, rejectionHandler);\n  } catch (e) {\n    return e;\n  }\n}\n\nfunction handleForeignThenable(promise, thenable, then) {\n  asap(function (promise) {\n    var sealed = false;\n    var error = tryThen(then, thenable, function (value) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n      if (thenable !== value) {\n        _resolve(promise, value);\n      } else {\n        fulfill(promise, value);\n      }\n    }, function (reason) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n\n      _reject(promise, reason);\n    }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n    if (!sealed && error) {\n      sealed = true;\n      _reject(promise, error);\n    }\n  }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n  if (thenable._state === FULFILLED) {\n    fulfill(promise, thenable._result);\n  } else if (thenable._state === REJECTED) {\n    _reject(promise, thenable._result);\n  } else {\n    subscribe(thenable, undefined, function (value) {\n      return _resolve(promise, value);\n    }, function (reason) {\n      return _reject(promise, reason);\n    });\n  }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$) {\n  if (maybeThenable.constructor === promise.constructor && then$$ === then && maybeThenable.constructor.resolve === resolve) {\n    handleOwnThenable(promise, maybeThenable);\n  } else {\n    if (then$$ === GET_THEN_ERROR) {\n      _reject(promise, GET_THEN_ERROR.error);\n    } else if (then$$ === undefined) {\n      fulfill(promise, maybeThenable);\n    } else if (isFunction(then$$)) {\n      handleForeignThenable(promise, maybeThenable, then$$);\n    } else {\n      fulfill(promise, maybeThenable);\n    }\n  }\n}\n\nfunction _resolve(promise, value) {\n  if (promise === value) {\n    _reject(promise, selfFulfillment());\n  } else if (objectOrFunction(value)) {\n    handleMaybeThenable(promise, value, getThen(value));\n  } else {\n    fulfill(promise, value);\n  }\n}\n\nfunction publishRejection(promise) {\n  if (promise._onerror) {\n    promise._onerror(promise._result);\n  }\n\n  publish(promise);\n}\n\nfunction fulfill(promise, value) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n\n  promise._result = value;\n  promise._state = FULFILLED;\n\n  if (promise._subscribers.length !== 0) {\n    asap(publish, promise);\n  }\n}\n\nfunction _reject(promise, reason) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n  promise._state = REJECTED;\n  promise._result = reason;\n\n  asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n  var _subscribers = parent._subscribers;\n  var length = _subscribers.length;\n\n  parent._onerror = null;\n\n  _subscribers[length] = child;\n  _subscribers[length + FULFILLED] = onFulfillment;\n  _subscribers[length + REJECTED] = onRejection;\n\n  if (length === 0 && parent._state) {\n    asap(publish, parent);\n  }\n}\n\nfunction publish(promise) {\n  var subscribers = promise._subscribers;\n  var settled = promise._state;\n\n  if (subscribers.length === 0) {\n    return;\n  }\n\n  var child = undefined,\n      callback = undefined,\n      detail = promise._result;\n\n  for (var i = 0; i < subscribers.length; i += 3) {\n    child = subscribers[i];\n    callback = subscribers[i + settled];\n\n    if (child) {\n      invokeCallback(settled, child, callback, detail);\n    } else {\n      callback(detail);\n    }\n  }\n\n  promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n  this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n  try {\n    return callback(detail);\n  } catch (e) {\n    TRY_CATCH_ERROR.error = e;\n    return TRY_CATCH_ERROR;\n  }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n  var hasCallback = isFunction(callback),\n      value = undefined,\n      error = undefined,\n      succeeded = undefined,\n      failed = undefined;\n\n  if (hasCallback) {\n    value = tryCatch(callback, detail);\n\n    if (value === TRY_CATCH_ERROR) {\n      failed = true;\n      error = value.error;\n      value = null;\n    } else {\n      succeeded = true;\n    }\n\n    if (promise === value) {\n      _reject(promise, cannotReturnOwn());\n      return;\n    }\n  } else {\n    value = detail;\n    succeeded = true;\n  }\n\n  if (promise._state !== PENDING) {\n    // noop\n  } else if (hasCallback && succeeded) {\n      _resolve(promise, value);\n    } else if (failed) {\n      _reject(promise, error);\n    } else if (settled === FULFILLED) {\n      fulfill(promise, value);\n    } else if (settled === REJECTED) {\n      _reject(promise, value);\n    }\n}\n\nfunction initializePromise(promise, resolver) {\n  try {\n    resolver(function resolvePromise(value) {\n      _resolve(promise, value);\n    }, function rejectPromise(reason) {\n      _reject(promise, reason);\n    });\n  } catch (e) {\n    _reject(promise, e);\n  }\n}\n\nvar id = 0;\nfunction nextId() {\n  return id++;\n}\n\nfunction makePromise(promise) {\n  promise[PROMISE_ID] = id++;\n  promise._state = undefined;\n  promise._result = undefined;\n  promise._subscribers = [];\n}\n\nfunction Enumerator(Constructor, input) {\n  this._instanceConstructor = Constructor;\n  this.promise = new Constructor(noop);\n\n  if (!this.promise[PROMISE_ID]) {\n    makePromise(this.promise);\n  }\n\n  if (isArray(input)) {\n    this._input = input;\n    this.length = input.length;\n    this._remaining = input.length;\n\n    this._result = new Array(this.length);\n\n    if (this.length === 0) {\n      fulfill(this.promise, this._result);\n    } else {\n      this.length = this.length || 0;\n      this._enumerate();\n      if (this._remaining === 0) {\n        fulfill(this.promise, this._result);\n      }\n    }\n  } else {\n    _reject(this.promise, validationError());\n  }\n}\n\nfunction validationError() {\n  return new Error('Array Methods must be provided an Array');\n};\n\nEnumerator.prototype._enumerate = function () {\n  var length = this.length;\n  var _input = this._input;\n\n  for (var i = 0; this._state === PENDING && i < length; i++) {\n    this._eachEntry(_input[i], i);\n  }\n};\n\nEnumerator.prototype._eachEntry = function (entry, i) {\n  var c = this._instanceConstructor;\n  var resolve$$ = c.resolve;\n\n  if (resolve$$ === resolve) {\n    var _then = getThen(entry);\n\n    if (_then === then && entry._state !== PENDING) {\n      this._settledAt(entry._state, i, entry._result);\n    } else if (typeof _then !== 'function') {\n      this._remaining--;\n      this._result[i] = entry;\n    } else if (c === Promise) {\n      var promise = new c(noop);\n      handleMaybeThenable(promise, entry, _then);\n      this._willSettleAt(promise, i);\n    } else {\n      this._willSettleAt(new c(function (resolve$$) {\n        return resolve$$(entry);\n      }), i);\n    }\n  } else {\n    this._willSettleAt(resolve$$(entry), i);\n  }\n};\n\nEnumerator.prototype._settledAt = function (state, i, value) {\n  var promise = this.promise;\n\n  if (promise._state === PENDING) {\n    this._remaining--;\n\n    if (state === REJECTED) {\n      _reject(promise, value);\n    } else {\n      this._result[i] = value;\n    }\n  }\n\n  if (this._remaining === 0) {\n    fulfill(promise, this._result);\n  }\n};\n\nEnumerator.prototype._willSettleAt = function (promise, i) {\n  var enumerator = this;\n\n  subscribe(promise, undefined, function (value) {\n    return enumerator._settledAt(FULFILLED, i, value);\n  }, function (reason) {\n    return enumerator._settledAt(REJECTED, i, reason);\n  });\n};\n\n/**\n  `Promise.all` accepts an array of promises, and returns a new promise which\n  is fulfilled with an array of fulfillment values for the passed promises, or\n  rejected with the reason of the first passed promise to be rejected. It casts all\n  elements of the passed iterable to promises as it runs this algorithm.\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = resolve(2);\n  let promise3 = resolve(3);\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // The array here would be [ 1, 2, 3 ];\n  });\n  ```\n\n  If any of the `promises` given to `all` are rejected, the first promise\n  that is rejected will be given as an argument to the returned promises's\n  rejection handler. For example:\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = reject(new Error(\"2\"));\n  let promise3 = reject(new Error(\"3\"));\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // Code here never runs because there are rejected promises!\n  }, function(error) {\n    // error.message === \"2\"\n  });\n  ```\n\n  @method all\n  @static\n  @param {Array} entries array of promises\n  @param {String} label optional string for labeling the promise.\n  Useful for tooling.\n  @return {Promise} promise that is fulfilled when all `promises` have been\n  fulfilled, or rejected if any of them become rejected.\n  @static\n*/\nfunction all(entries) {\n  return new Enumerator(this, entries).promise;\n}\n\n/**\n  `Promise.race` returns a new promise which is settled in the same way as the\n  first passed promise to settle.\n\n  Example:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 2');\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // result === 'promise 2' because it was resolved before promise1\n    // was resolved.\n  });\n  ```\n\n  `Promise.race` is deterministic in that only the state of the first\n  settled promise matters. For example, even if other promises given to the\n  `promises` array argument are resolved, but the first settled promise has\n  become rejected before the other promises became fulfilled, the returned\n  promise will become rejected:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      reject(new Error('promise 2'));\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // Code here never runs\n  }, function(reason){\n    // reason.message === 'promise 2' because promise 2 became rejected before\n    // promise 1 became fulfilled\n  });\n  ```\n\n  An example real-world use case is implementing timeouts:\n\n  ```javascript\n  Promise.race([ajax('foo.json'), timeout(5000)])\n  ```\n\n  @method race\n  @static\n  @param {Array} promises array of promises to observe\n  Useful for tooling.\n  @return {Promise} a promise which settles in the same way as the first passed\n  promise to settle.\n*/\nfunction race(entries) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (!isArray(entries)) {\n    return new Constructor(function (_, reject) {\n      return reject(new TypeError('You must pass an array to race.'));\n    });\n  } else {\n    return new Constructor(function (resolve, reject) {\n      var length = entries.length;\n      for (var i = 0; i < length; i++) {\n        Constructor.resolve(entries[i]).then(resolve, reject);\n      }\n    });\n  }\n}\n\n/**\n  `Promise.reject` returns a promise rejected with the passed `reason`.\n  It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    reject(new Error('WHOOPS'));\n  });\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.reject(new Error('WHOOPS'));\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  @method reject\n  @static\n  @param {Any} reason value that the returned promise will be rejected with.\n  Useful for tooling.\n  @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject(reason) {\n  /*jshint validthis:true */\n  var Constructor = this;\n  var promise = new Constructor(noop);\n  _reject(promise, reason);\n  return promise;\n}\n\nfunction needsResolver() {\n  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n  throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n  Promise objects represent the eventual result of an asynchronous operation. The\n  primary way of interacting with a promise is through its `then` method, which\n  registers callbacks to receive either a promise's eventual value or the reason\n  why the promise cannot be fulfilled.\n\n  Terminology\n  -----------\n\n  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n  - `thenable` is an object or function that defines a `then` method.\n  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n  - `exception` is a value that is thrown using the throw statement.\n  - `reason` is a value that indicates why a promise was rejected.\n  - `settled` the final resting state of a promise, fulfilled or rejected.\n\n  A promise can be in one of three states: pending, fulfilled, or rejected.\n\n  Promises that are fulfilled have a fulfillment value and are in the fulfilled\n  state.  Promises that are rejected have a rejection reason and are in the\n  rejected state.  A fulfillment value is never a thenable.\n\n  Promises can also be said to *resolve* a value.  If this value is also a\n  promise, then the original promise's settled state will match the value's\n  settled state.  So a promise that *resolves* a promise that rejects will\n  itself reject, and a promise that *resolves* a promise that fulfills will\n  itself fulfill.\n\n\n  Basic Usage:\n  ------------\n\n  ```js\n  let promise = new Promise(function(resolve, reject) {\n    // on success\n    resolve(value);\n\n    // on failure\n    reject(reason);\n  });\n\n  promise.then(function(value) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Advanced Usage:\n  ---------------\n\n  Promises shine when abstracting away asynchronous interactions such as\n  `XMLHttpRequest`s.\n\n  ```js\n  function getJSON(url) {\n    return new Promise(function(resolve, reject){\n      let xhr = new XMLHttpRequest();\n\n      xhr.open('GET', url);\n      xhr.onreadystatechange = handler;\n      xhr.responseType = 'json';\n      xhr.setRequestHeader('Accept', 'application/json');\n      xhr.send();\n\n      function handler() {\n        if (this.readyState === this.DONE) {\n          if (this.status === 200) {\n            resolve(this.response);\n          } else {\n            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n          }\n        }\n      };\n    });\n  }\n\n  getJSON('/posts.json').then(function(json) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Unlike callbacks, promises are great composable primitives.\n\n  ```js\n  Promise.all([\n    getJSON('/posts'),\n    getJSON('/comments')\n  ]).then(function(values){\n    values[0] // => postsJSON\n    values[1] // => commentsJSON\n\n    return values;\n  });\n  ```\n\n  @class Promise\n  @param {function} resolver\n  Useful for tooling.\n  @constructor\n*/\nfunction Promise(resolver) {\n  this[PROMISE_ID] = nextId();\n  this._result = this._state = undefined;\n  this._subscribers = [];\n\n  if (noop !== resolver) {\n    typeof resolver !== 'function' && needsResolver();\n    this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n  }\n}\n\nPromise.all = all;\nPromise.race = race;\nPromise.resolve = resolve;\nPromise.reject = reject;\nPromise._setScheduler = setScheduler;\nPromise._setAsap = setAsap;\nPromise._asap = asap;\n\nPromise.prototype = {\n  constructor: Promise,\n\n  /**\n    The primary way of interacting with a promise is through its `then` method,\n    which registers callbacks to receive either a promise's eventual value or the\n    reason why the promise cannot be fulfilled.\n  \n    ```js\n    findUser().then(function(user){\n      // user is available\n    }, function(reason){\n      // user is unavailable, and you are given the reason why\n    });\n    ```\n  \n    Chaining\n    --------\n  \n    The return value of `then` is itself a promise.  This second, 'downstream'\n    promise is resolved with the return value of the first promise's fulfillment\n    or rejection handler, or rejected if the handler throws an exception.\n  \n    ```js\n    findUser().then(function (user) {\n      return user.name;\n    }, function (reason) {\n      return 'default name';\n    }).then(function (userName) {\n      // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n      // will be `'default name'`\n    });\n  \n    findUser().then(function (user) {\n      throw new Error('Found user, but still unhappy');\n    }, function (reason) {\n      throw new Error('`findUser` rejected and we're unhappy');\n    }).then(function (value) {\n      // never reached\n    }, function (reason) {\n      // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n      // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n    });\n    ```\n    If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n  \n    ```js\n    findUser().then(function (user) {\n      throw new PedagogicalException('Upstream error');\n    }).then(function (value) {\n      // never reached\n    }).then(function (value) {\n      // never reached\n    }, function (reason) {\n      // The `PedgagocialException` is propagated all the way down to here\n    });\n    ```\n  \n    Assimilation\n    ------------\n  \n    Sometimes the value you want to propagate to a downstream promise can only be\n    retrieved asynchronously. This can be achieved by returning a promise in the\n    fulfillment or rejection handler. The downstream promise will then be pending\n    until the returned promise is settled. This is called *assimilation*.\n  \n    ```js\n    findUser().then(function (user) {\n      return findCommentsByAuthor(user);\n    }).then(function (comments) {\n      // The user's comments are now available\n    });\n    ```\n  \n    If the assimliated promise rejects, then the downstream promise will also reject.\n  \n    ```js\n    findUser().then(function (user) {\n      return findCommentsByAuthor(user);\n    }).then(function (comments) {\n      // If `findCommentsByAuthor` fulfills, we'll have the value here\n    }, function (reason) {\n      // If `findCommentsByAuthor` rejects, we'll have the reason here\n    });\n    ```\n  \n    Simple Example\n    --------------\n  \n    Synchronous Example\n  \n    ```javascript\n    let result;\n  \n    try {\n      result = findResult();\n      // success\n    } catch(reason) {\n      // failure\n    }\n    ```\n  \n    Errback Example\n  \n    ```js\n    findResult(function(result, err){\n      if (err) {\n        // failure\n      } else {\n        // success\n      }\n    });\n    ```\n  \n    Promise Example;\n  \n    ```javascript\n    findResult().then(function(result){\n      // success\n    }, function(reason){\n      // failure\n    });\n    ```\n  \n    Advanced Example\n    --------------\n  \n    Synchronous Example\n  \n    ```javascript\n    let author, books;\n  \n    try {\n      author = findAuthor();\n      books  = findBooksByAuthor(author);\n      // success\n    } catch(reason) {\n      // failure\n    }\n    ```\n  \n    Errback Example\n  \n    ```js\n  \n    function foundBooks(books) {\n  \n    }\n  \n    function failure(reason) {\n  \n    }\n  \n    findAuthor(function(author, err){\n      if (err) {\n        failure(err);\n        // failure\n      } else {\n        try {\n          findBoooksByAuthor(author, function(books, err) {\n            if (err) {\n              failure(err);\n            } else {\n              try {\n                foundBooks(books);\n              } catch(reason) {\n                failure(reason);\n              }\n            }\n          });\n        } catch(error) {\n          failure(err);\n        }\n        // success\n      }\n    });\n    ```\n  \n    Promise Example;\n  \n    ```javascript\n    findAuthor().\n      then(findBooksByAuthor).\n      then(function(books){\n        // found books\n    }).catch(function(reason){\n      // something went wrong\n    });\n    ```\n  \n    @method then\n    @param {Function} onFulfilled\n    @param {Function} onRejected\n    Useful for tooling.\n    @return {Promise}\n  */\n  then: then,\n\n  /**\n    `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n    as the catch block of a try/catch statement.\n  \n    ```js\n    function findAuthor(){\n      throw new Error('couldn't find that author');\n    }\n  \n    // synchronous\n    try {\n      findAuthor();\n    } catch(reason) {\n      // something went wrong\n    }\n  \n    // async with promises\n    findAuthor().catch(function(reason){\n      // something went wrong\n    });\n    ```\n  \n    @method catch\n    @param {Function} onRejection\n    Useful for tooling.\n    @return {Promise}\n  */\n  'catch': function _catch(onRejection) {\n    return this.then(null, onRejection);\n  }\n};\n\nfunction polyfill() {\n    var local = undefined;\n\n    if (typeof global !== 'undefined') {\n        local = global;\n    } else if (typeof self !== 'undefined') {\n        local = self;\n    } else {\n        try {\n            local = Function('return this')();\n        } catch (e) {\n            throw new Error('polyfill failed because global object is unavailable in this environment');\n        }\n    }\n\n    var P = local.Promise;\n\n    if (P) {\n        var promiseToString = null;\n        try {\n            promiseToString = Object.prototype.toString.call(P.resolve());\n        } catch (e) {\n            // silently ignored\n        }\n\n        if (promiseToString === '[object Promise]' && !P.cast) {\n            return;\n        }\n    }\n\n    local.Promise = Promise;\n}\n\n// Strange compat..\nPromise.polyfill = polyfill;\nPromise.Promise = Promise;\n\nreturn Promise;\n\n})));\n//# sourceMappingURL=es6-promise.map"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/fetch-broken/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n\n    <title>Our superheroes</title>\n\n    <link\n      href=\"https://fonts.googleapis.com/css?family=Faster+One\"\n      rel=\"stylesheet\"\n    />\n    <link rel=\"stylesheet\" href=\"style.css\" />\n    <script src=\"script.js\" defer></script>\n  </head>\n\n  <body>\n    <header></header>\n\n    <section></section>\n  </body>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/fetch-broken/script.js",
    "content": "const header = document.querySelector(\"header\");\nconst section = document.querySelector(\"section\");\n\nconst requestURL =\n  \"https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json\";\n\nconst response = fetch(requestURL);\npopulateHeader(response);\nshowHeroes(response);\n\nfunction populateHeader(jsonObj) {\n  const h1 = document.createElement(\"h1\");\n  h1.textContent = jsonObj[\"squadName\"];\n  header.appendChild(h1);\n\n  const para = document.createElement(\"p\");\n  para.textContent = `Hometown: ${jsonObj[\"homeTown\"]} // Formed: ${jsonObj[\"formed\"]}`;\n  header.appendChild(para);\n}\n\nfunction showHeroes(jsonObj) {\n  const heroes = jsonObj[\"members\"];\n\n  for (const hero of heroes) {\n    const article = document.createElement(\"article\");\n    const h2 = document.createElement(\"h2\");\n    const para1 = document.createElement(\"p\");\n    const para2 = document.createElement(\"p\");\n    const para3 = document.createElement(\"p\");\n    const list = document.createElement(\"ul\");\n\n    h2.textContent = hero.name;\n    para1.textContent = `Secret identity: ${hero.secretIdentity}`;\n    para2.textContent = `Age: ${hero.age}`;\n    para3.textContent = \"Superpowers:\";\n\n    const superPowers = hero.powers;\n    for (const superPower of superPowers) {\n      const listItem = document.createElement(\"li\");\n      listItem.textContent = superPower;\n      list.appendChild(listItem);\n    }\n\n    article.appendChild(h2);\n    article.appendChild(para1);\n    article.appendChild(para2);\n    article.appendChild(para3);\n    article.appendChild(list);\n\n    section.appendChild(article);\n  }\n}\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/fetch-broken/style.css",
    "content": "/* || general styles */\n\nhtml {\n  font-family: \"helvetica neue\", helvetica, arial, sans-serif;\n}\n\nbody {\n  width: 800px;\n  margin: 0 auto;\n}\n\nh1,\nh2 {\n  font-family: \"Faster One\", cursive;\n}\n\n/* header styles */\n\nh1 {\n  font-size: 4rem;\n  text-align: center;\n}\n\nheader p {\n  font-size: 1.3rem;\n  font-weight: bold;\n  text-align: center;\n}\n\n/* section styles */\n\nsection article {\n  width: 33%;\n  float: left;\n}\n\nsection p {\n  margin: 5px 0;\n}\n\nsection ul {\n  margin-top: 0;\n}\n\nh2 {\n  font-size: 2.5rem;\n  letter-spacing: -5px;\n  margin-bottom: 10px;\n}\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/fetch-fixed/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n\n    <title>Our superheroes</title>\n\n    <link\n      href=\"https://fonts.googleapis.com/css?family=Faster+One\"\n      rel=\"stylesheet\"\n    />\n    <link rel=\"stylesheet\" href=\"style.css\" />\n    <script src=\"script.js\" defer></script>\n  </head>\n\n  <body>\n    <header></header>\n\n    <section></section>\n  </body>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/fetch-fixed/script.js",
    "content": "const header = document.querySelector(\"header\");\nconst section = document.querySelector(\"section\");\n\nconst requestURL =\n  \"https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json\";\n\nfetch(requestURL)\n  .then((response) => response.json())\n  .then((json) => {\n    populateHeader(json);\n    showHeroes(json);\n  });\n\nfunction populateHeader(jsonObj) {\n  const h1 = document.createElement(\"h1\");\n  h1.textContent = jsonObj[\"squadName\"];\n  header.appendChild(h1);\n\n  const para = document.createElement(\"p\");\n  para.textContent = `Hometown: ${jsonObj[\"homeTown\"]} // Formed: ${jsonObj[\"formed\"]}`;\n  header.appendChild(para);\n}\n\nfunction showHeroes(jsonObj) {\n  const heroes = jsonObj[\"members\"];\n\n  for (const hero of heroes) {\n    const article = document.createElement(\"article\");\n    const h2 = document.createElement(\"h2\");\n    const para1 = document.createElement(\"p\");\n    const para2 = document.createElement(\"p\");\n    const para3 = document.createElement(\"p\");\n    const list = document.createElement(\"ul\");\n\n    h2.textContent = hero.name;\n    para1.textContent = `Secret identity: ${hero.secretIdentity}`;\n    para2.textContent = `Age: ${hero.age}`;\n    para3.textContent = \"Superpowers:\";\n\n    const superPowers = hero.powers;\n    for (const superPower of superPowers) {\n      const listItem = document.createElement(\"li\");\n      listItem.textContent = superPower;\n      list.appendChild(listItem);\n    }\n\n    article.appendChild(h2);\n    article.appendChild(para1);\n    article.appendChild(para2);\n    article.appendChild(para3);\n    article.appendChild(list);\n\n    section.appendChild(article);\n  }\n}\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/fetch-fixed/style.css",
    "content": "/* || general styles */\n\nhtml {\n  font-family: \"helvetica neue\", helvetica, arial, sans-serif;\n}\n\nbody {\n  width: 800px;\n  margin: 0 auto;\n}\n\nh1,\nh2 {\n  font-family: \"Faster One\", cursive;\n}\n\n/* header styles */\n\nh1 {\n  font-size: 4rem;\n  text-align: center;\n}\n\nheader p {\n  font-size: 1.3rem;\n  font-weight: bold;\n  text-align: center;\n}\n\n/* section styles */\n\nsection article {\n  width: 33%;\n  float: left;\n}\n\nsection p {\n  margin: 5px 0;\n}\n\nsection ul {\n  margin-top: 0;\n}\n\nh2 {\n  font-size: 2.5rem;\n  letter-spacing: -5px;\n  margin-bottom: 10px;\n}\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/fetch-polyfill-finished.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n\n    <title>Fetch polyfill example</title>\n\n    <link rel=\"stylesheet\" href=\"\" />\n  </head>\n\n  <body>\n    <h1>Fetch basic example</h1>\n\n    <img src=\"\" class=\"my-image\" alt=\"A flower\" />\n\n    <!-- Minified version of `es6-promise-auto` below. -->\n    <script src=\"https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.min.js\"></script>\n    <script src=\"https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.auto.min.js\"></script>\n    <script src=\"fetch.js\"></script>\n    <script>\n      var myImage = document.querySelector(\".my-image\");\n\n      fetch(\"flowers.jpg\").then(function (response) {\n        response.blob().then(function (myBlob) {\n          var objectURL = URL.createObjectURL(myBlob);\n          myImage.src = objectURL;\n        });\n      });\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/fetch-polyfill-only-when-needed.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n\n    <title>Fetch polyfill example</title>\n\n    <link rel=\"stylesheet\" href=\"\" />\n  </head>\n\n  <body>\n    <h1>Fetch basic example</h1>\n\n    <img src=\"\" class=\"my-image\" alt=\"A flower\" />\n\n    <script>\n      if (browserSupportsAllFeatures()) {\n        main();\n      } else {\n        loadScript(\"polyfills.js\", main);\n      }\n\n      function main(err) {\n        const myImage = document.querySelector(\".my-image\");\n\n        fetch(\"flowers.jpg\").then(function (response) {\n          response.blob().then(function (myBlob) {\n            let objectURL = URL.createObjectURL(myBlob);\n            myImage.src = objectURL;\n          });\n        });\n      }\n\n      function browserSupportsAllFeatures() {\n        return window.Promise && window.fetch;\n      }\n\n      function loadScript(src, done) {\n        const js = document.createElement(\"script\");\n        js.src = src;\n        js.onload = function () {\n          done();\n        };\n        js.onerror = function () {\n          done(new Error(\"Failed to load script \" + src));\n        };\n        document.head.appendChild(js);\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/fetch-polyfill.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width\" />\n\n    <title>Fetch polyfill example</title>\n\n    <link rel=\"stylesheet\" href=\"\" />\n  </head>\n\n  <body>\n    <h1>Fetch basic example</h1>\n\n    <img src=\"\" class=\"my-image\" alt=\"A flower\" />\n  </body>\n\n  <script></script>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/fetch.js",
    "content": "(function(self) {\n  'use strict';\n\n  if (self.fetch) {\n    return\n  }\n\n  var support = {\n    searchParams: 'URLSearchParams' in self,\n    iterable: 'Symbol' in self && 'iterator' in Symbol,\n    blob: 'FileReader' in self && 'Blob' in self && (function() {\n      try {\n        new Blob()\n        return true\n      } catch(e) {\n        return false\n      }\n    })(),\n    formData: 'FormData' in self,\n    arrayBuffer: 'ArrayBuffer' in self\n  }\n\n  function normalizeName(name) {\n    if (typeof name !== 'string') {\n      name = String(name)\n    }\n    if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n      throw new TypeError('Invalid character in header field name')\n    }\n    return name.toLowerCase()\n  }\n\n  function normalizeValue(value) {\n    if (typeof value !== 'string') {\n      value = String(value)\n    }\n    return value\n  }\n\n  // Build a destructive iterator for the value list\n  function iteratorFor(items) {\n    var iterator = {\n      next: function() {\n        var value = items.shift()\n        return {done: value === undefined, value: value}\n      }\n    }\n\n    if (support.iterable) {\n      iterator[Symbol.iterator] = function() {\n        return iterator\n      }\n    }\n\n    return iterator\n  }\n\n  function Headers(headers) {\n    this.map = {}\n\n    if (headers instanceof Headers) {\n      headers.forEach(function(value, name) {\n        this.append(name, value)\n      }, this)\n\n    } else if (headers) {\n      Object.getOwnPropertyNames(headers).forEach(function(name) {\n        this.append(name, headers[name])\n      }, this)\n    }\n  }\n\n  Headers.prototype.append = function(name, value) {\n    name = normalizeName(name)\n    value = normalizeValue(value)\n    var list = this.map[name]\n    if (!list) {\n      list = []\n      this.map[name] = list\n    }\n    list.push(value)\n  }\n\n  Headers.prototype['delete'] = function(name) {\n    delete this.map[normalizeName(name)]\n  }\n\n  Headers.prototype.get = function(name) {\n    var values = this.map[normalizeName(name)]\n    return values ? values[0] : null\n  }\n\n  Headers.prototype.getAll = function(name) {\n    return this.map[normalizeName(name)] || []\n  }\n\n  Headers.prototype.has = function(name) {\n    return this.map.hasOwnProperty(normalizeName(name))\n  }\n\n  Headers.prototype.set = function(name, value) {\n    this.map[normalizeName(name)] = [normalizeValue(value)]\n  }\n\n  Headers.prototype.forEach = function(callback, thisArg) {\n    Object.getOwnPropertyNames(this.map).forEach(function(name) {\n      this.map[name].forEach(function(value) {\n        callback.call(thisArg, value, name, this)\n      }, this)\n    }, this)\n  }\n\n  Headers.prototype.keys = function() {\n    var items = []\n    this.forEach(function(value, name) { items.push(name) })\n    return iteratorFor(items)\n  }\n\n  Headers.prototype.values = function() {\n    var items = []\n    this.forEach(function(value) { items.push(value) })\n    return iteratorFor(items)\n  }\n\n  Headers.prototype.entries = function() {\n    var items = []\n    this.forEach(function(value, name) { items.push([name, value]) })\n    return iteratorFor(items)\n  }\n\n  if (support.iterable) {\n    Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n  }\n\n  function consumed(body) {\n    if (body.bodyUsed) {\n      return Promise.reject(new TypeError('Already read'))\n    }\n    body.bodyUsed = true\n  }\n\n  function fileReaderReady(reader) {\n    return new Promise(function(resolve, reject) {\n      reader.onload = function() {\n        resolve(reader.result)\n      }\n      reader.onerror = function() {\n        reject(reader.error)\n      }\n    })\n  }\n\n  function readBlobAsArrayBuffer(blob) {\n    var reader = new FileReader()\n    reader.readAsArrayBuffer(blob)\n    return fileReaderReady(reader)\n  }\n\n  function readBlobAsText(blob) {\n    var reader = new FileReader()\n    reader.readAsText(blob)\n    return fileReaderReady(reader)\n  }\n\n  function Body() {\n    this.bodyUsed = false\n\n    this._initBody = function(body) {\n      this._bodyInit = body\n      if (typeof body === 'string') {\n        this._bodyText = body\n      } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n        this._bodyBlob = body\n      } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n        this._bodyFormData = body\n      } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n        this._bodyText = body.toString()\n      } else if (!body) {\n        this._bodyText = ''\n      } else if (support.arrayBuffer && ArrayBuffer.prototype.isPrototypeOf(body)) {\n        // Only support ArrayBuffers for POST method.\n        // Receiving ArrayBuffers happens via Blobs, instead.\n      } else {\n        throw new Error('unsupported BodyInit type')\n      }\n\n      if (!this.headers.get('content-type')) {\n        if (typeof body === 'string') {\n          this.headers.set('content-type', 'text/plain;charset=UTF-8')\n        } else if (this._bodyBlob && this._bodyBlob.type) {\n          this.headers.set('content-type', this._bodyBlob.type)\n        } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n          this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n        }\n      }\n    }\n\n    if (support.blob) {\n      this.blob = function() {\n        var rejected = consumed(this)\n        if (rejected) {\n          return rejected\n        }\n\n        if (this._bodyBlob) {\n          return Promise.resolve(this._bodyBlob)\n        } else if (this._bodyFormData) {\n          throw new Error('could not read FormData body as blob')\n        } else {\n          return Promise.resolve(new Blob([this._bodyText]))\n        }\n      }\n\n      this.arrayBuffer = function() {\n        return this.blob().then(readBlobAsArrayBuffer)\n      }\n\n      this.text = function() {\n        var rejected = consumed(this)\n        if (rejected) {\n          return rejected\n        }\n\n        if (this._bodyBlob) {\n          return readBlobAsText(this._bodyBlob)\n        } else if (this._bodyFormData) {\n          throw new Error('could not read FormData body as text')\n        } else {\n          return Promise.resolve(this._bodyText)\n        }\n      }\n    } else {\n      this.text = function() {\n        var rejected = consumed(this)\n        return rejected ? rejected : Promise.resolve(this._bodyText)\n      }\n    }\n\n    if (support.formData) {\n      this.formData = function() {\n        return this.text().then(decode)\n      }\n    }\n\n    this.json = function() {\n      return this.text().then(JSON.parse)\n    }\n\n    return this\n  }\n\n  // HTTP methods whose capitalization should be normalized\n  var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n  function normalizeMethod(method) {\n    var upcased = method.toUpperCase()\n    return (methods.indexOf(upcased) > -1) ? upcased : method\n  }\n\n  function Request(input, options) {\n    options = options || {}\n    var body = options.body\n    if (Request.prototype.isPrototypeOf(input)) {\n      if (input.bodyUsed) {\n        throw new TypeError('Already read')\n      }\n      this.url = input.url\n      this.credentials = input.credentials\n      if (!options.headers) {\n        this.headers = new Headers(input.headers)\n      }\n      this.method = input.method\n      this.mode = input.mode\n      if (!body) {\n        body = input._bodyInit\n        input.bodyUsed = true\n      }\n    } else {\n      this.url = input\n    }\n\n    this.credentials = options.credentials || this.credentials || 'omit'\n    if (options.headers || !this.headers) {\n      this.headers = new Headers(options.headers)\n    }\n    this.method = normalizeMethod(options.method || this.method || 'GET')\n    this.mode = options.mode || this.mode || null\n    this.referrer = null\n\n    if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n      throw new TypeError('Body not allowed for GET or HEAD requests')\n    }\n    this._initBody(body)\n  }\n\n  Request.prototype.clone = function() {\n    return new Request(this)\n  }\n\n  function decode(body) {\n    var form = new FormData()\n    body.trim().split('&').forEach(function(bytes) {\n      if (bytes) {\n        var split = bytes.split('=')\n        var name = split.shift().replace(/\\+/g, ' ')\n        var value = split.join('=').replace(/\\+/g, ' ')\n        form.append(decodeURIComponent(name), decodeURIComponent(value))\n      }\n    })\n    return form\n  }\n\n  function headers(xhr) {\n    var head = new Headers()\n    var pairs = (xhr.getAllResponseHeaders() || '').trim().split('\\n')\n    pairs.forEach(function(header) {\n      var split = header.trim().split(':')\n      var key = split.shift().trim()\n      var value = split.join(':').trim()\n      head.append(key, value)\n    })\n    return head\n  }\n\n  Body.call(Request.prototype)\n\n  function Response(bodyInit, options) {\n    if (!options) {\n      options = {}\n    }\n\n    this.type = 'default'\n    this.status = options.status\n    this.ok = this.status >= 200 && this.status < 300\n    this.statusText = options.statusText\n    this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers)\n    this.url = options.url || ''\n    this._initBody(bodyInit)\n  }\n\n  Body.call(Response.prototype)\n\n  Response.prototype.clone = function() {\n    return new Response(this._bodyInit, {\n      status: this.status,\n      statusText: this.statusText,\n      headers: new Headers(this.headers),\n      url: this.url\n    })\n  }\n\n  Response.error = function() {\n    var response = new Response(null, {status: 0, statusText: ''})\n    response.type = 'error'\n    return response\n  }\n\n  var redirectStatuses = [301, 302, 303, 307, 308]\n\n  Response.redirect = function(url, status) {\n    if (redirectStatuses.indexOf(status) === -1) {\n      throw new RangeError('Invalid status code')\n    }\n\n    return new Response(null, {status: status, headers: {location: url}})\n  }\n\n  self.Headers = Headers\n  self.Request = Request\n  self.Response = Response\n\n  self.fetch = function(input, init) {\n    return new Promise(function(resolve, reject) {\n      var request\n      if (Request.prototype.isPrototypeOf(input) && !init) {\n        request = input\n      } else {\n        request = new Request(input, init)\n      }\n\n      var xhr = new XMLHttpRequest()\n\n      function responseURL() {\n        if ('responseURL' in xhr) {\n          return xhr.responseURL\n        }\n\n        // Avoid security warnings on getResponseHeader when not allowed by CORS\n        if (/^X-Request-URL:/mi.test(xhr.getAllResponseHeaders())) {\n          return xhr.getResponseHeader('X-Request-URL')\n        }\n\n        return\n      }\n\n      xhr.onload = function() {\n        var options = {\n          status: xhr.status,\n          statusText: xhr.statusText,\n          headers: headers(xhr),\n          url: responseURL()\n        }\n        var body = 'response' in xhr ? xhr.response : xhr.responseText\n        resolve(new Response(body, options))\n      }\n\n      xhr.onerror = function() {\n        reject(new TypeError('Network request failed'))\n      }\n\n      xhr.ontimeout = function() {\n        reject(new TypeError('Network request failed'))\n      }\n\n      xhr.open(request.method, request.url, true)\n\n      if (request.credentials === 'include') {\n        xhr.withCredentials = true\n      }\n\n      if ('responseType' in xhr && support.blob) {\n        xhr.responseType = 'blob'\n      }\n\n      request.headers.forEach(function(value, name) {\n        xhr.setRequestHeader(name, value)\n      })\n\n      xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n    })\n  }\n  self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/good-for-loop.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width\">\n    <title>Good for loop</title>\n  </head>\n  <body>\n    <script>\n      for(let i = 1; i <= 10; i++) {\n        const para = document.createElement('p');\n        para.textContent = 'This is paragraph ' + i + '.';\n        document.body.appendChild(para);\n        addHandler(para, i);\n      }\n\n      function addHandler(para, i) {\n        para.onclick = function() {\n          alert('Hello from paragraph ' + i + '!');\n        }\n      }\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/polyfills.js",
    "content": "/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license   Licensed under MIT license\n *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version   4.0.5\n */\n\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    (global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n  return typeof x === 'function' || typeof x === 'object' && x !== null;\n}\n\nfunction isFunction(x) {\n  return typeof x === 'function';\n}\n\nlet _isArray = undefined;\nif (!Array.isArray) {\n  _isArray = function (x) {\n    return Object.prototype.toString.call(x) === '[object Array]';\n  };\n} else {\n  _isArray = Array.isArray;\n}\n\nlet isArray = _isArray;\n\nlet len = 0;\nlet vertxNext = undefined;\nlet customSchedulerFn = undefined;\n\nlet asap = function asap(callback, arg) {\n  queue[len] = callback;\n  queue[len + 1] = arg;\n  len += 2;\n  if (len === 2) {\n    // If len is 2, that means that we need to schedule an async flush.\n    // If additional callbacks are queued before the queue is flushed, they\n    // will be processed by this flush that we are scheduling.\n    if (customSchedulerFn) {\n      customSchedulerFn(flush);\n    } else {\n      scheduleFlush();\n    }\n  }\n};\n\nfunction setScheduler(scheduleFn) {\n  customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n  asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n  // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n  // see https://github.com/cujojs/when/issues/410 for details\n  return function () {\n    return process.nextTick(flush);\n  };\n}\n\n// vertx\nfunction useVertxTimer() {\n  if (typeof vertxNext !== 'undefined') {\n    return function () {\n      vertxNext(flush);\n    };\n  }\n\n  return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n  var iterations = 0;\n  var observer = new BrowserMutationObserver(flush);\n  var node = document.createTextNode('');\n  observer.observe(node, { characterData: true });\n\n  return function () {\n    node.data = iterations = ++iterations % 2;\n  };\n}\n\n// web worker\nfunction useMessageChannel() {\n  var channel = new MessageChannel();\n  channel.port1.onmessage = flush;\n  return function () {\n    return channel.port2.postMessage(0);\n  };\n}\n\nfunction useSetTimeout() {\n  // Store setTimeout reference so es6-promise will be unaffected by\n  // other code modifying setTimeout (like sinon.useFakeTimers())\n  var globalSetTimeout = setTimeout;\n  return function () {\n    return globalSetTimeout(flush, 1);\n  };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n  for (var i = 0; i < len; i += 2) {\n    var callback = queue[i];\n    var arg = queue[i + 1];\n\n    callback(arg);\n\n    queue[i] = undefined;\n    queue[i + 1] = undefined;\n  }\n\n  len = 0;\n}\n\nfunction attemptVertx() {\n  try {\n    var r = require;\n    var vertx = r('vertx');\n    vertxNext = vertx.runOnLoop || vertx.runOnContext;\n    return useVertxTimer();\n  } catch (e) {\n    return useSetTimeout();\n  }\n}\n\nvar scheduleFlush = undefined;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n  scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n  scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n  scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n  scheduleFlush = attemptVertx();\n} else {\n  scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n  var _arguments = arguments;\n\n  var parent = this;\n\n  var child = new this.constructor(noop);\n\n  if (child[PROMISE_ID] === undefined) {\n    makePromise(child);\n  }\n\n  var _state = parent._state;\n\n  if (_state) {\n    (function () {\n      var callback = _arguments[_state - 1];\n      asap(function () {\n        return invokeCallback(_state, child, callback, parent._result);\n      });\n    })();\n  } else {\n    subscribe(parent, child, onFulfillment, onRejection);\n  }\n\n  return child;\n}\n\n/**\n  `Promise.resolve` returns a promise that will become resolved with the\n  passed `value`. It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    resolve(1);\n  });\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.resolve(1);\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  @method resolve\n  @static\n  @param {Any} value value that the returned promise will be resolved with\n  Useful for tooling.\n  @return {Promise} a promise that will become fulfilled with the given\n  `value`\n*/\nfunction resolve(object) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (object && typeof object === 'object' && object.constructor === Constructor) {\n    return object;\n  }\n\n  var promise = new Constructor(noop);\n  _resolve(promise, object);\n  return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(16);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction selfFulfillment() {\n  return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n  return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction getThen(promise) {\n  try {\n    return promise.then;\n  } catch (error) {\n    GET_THEN_ERROR.error = error;\n    return GET_THEN_ERROR;\n  }\n}\n\nfunction tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n  try {\n    then.call(value, fulfillmentHandler, rejectionHandler);\n  } catch (e) {\n    return e;\n  }\n}\n\nfunction handleForeignThenable(promise, thenable, then) {\n  asap(function (promise) {\n    var sealed = false;\n    var error = tryThen(then, thenable, function (value) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n      if (thenable !== value) {\n        _resolve(promise, value);\n      } else {\n        fulfill(promise, value);\n      }\n    }, function (reason) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n\n      _reject(promise, reason);\n    }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n    if (!sealed && error) {\n      sealed = true;\n      _reject(promise, error);\n    }\n  }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n  if (thenable._state === FULFILLED) {\n    fulfill(promise, thenable._result);\n  } else if (thenable._state === REJECTED) {\n    _reject(promise, thenable._result);\n  } else {\n    subscribe(thenable, undefined, function (value) {\n      return _resolve(promise, value);\n    }, function (reason) {\n      return _reject(promise, reason);\n    });\n  }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$) {\n  if (maybeThenable.constructor === promise.constructor && then$$ === then && maybeThenable.constructor.resolve === resolve) {\n    handleOwnThenable(promise, maybeThenable);\n  } else {\n    if (then$$ === GET_THEN_ERROR) {\n      _reject(promise, GET_THEN_ERROR.error);\n    } else if (then$$ === undefined) {\n      fulfill(promise, maybeThenable);\n    } else if (isFunction(then$$)) {\n      handleForeignThenable(promise, maybeThenable, then$$);\n    } else {\n      fulfill(promise, maybeThenable);\n    }\n  }\n}\n\nfunction _resolve(promise, value) {\n  if (promise === value) {\n    _reject(promise, selfFulfillment());\n  } else if (objectOrFunction(value)) {\n    handleMaybeThenable(promise, value, getThen(value));\n  } else {\n    fulfill(promise, value);\n  }\n}\n\nfunction publishRejection(promise) {\n  if (promise._onerror) {\n    promise._onerror(promise._result);\n  }\n\n  publish(promise);\n}\n\nfunction fulfill(promise, value) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n\n  promise._result = value;\n  promise._state = FULFILLED;\n\n  if (promise._subscribers.length !== 0) {\n    asap(publish, promise);\n  }\n}\n\nfunction _reject(promise, reason) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n  promise._state = REJECTED;\n  promise._result = reason;\n\n  asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n  var _subscribers = parent._subscribers;\n  var length = _subscribers.length;\n\n  parent._onerror = null;\n\n  _subscribers[length] = child;\n  _subscribers[length + FULFILLED] = onFulfillment;\n  _subscribers[length + REJECTED] = onRejection;\n\n  if (length === 0 && parent._state) {\n    asap(publish, parent);\n  }\n}\n\nfunction publish(promise) {\n  var subscribers = promise._subscribers;\n  var settled = promise._state;\n\n  if (subscribers.length === 0) {\n    return;\n  }\n\n  var child = undefined,\n      callback = undefined,\n      detail = promise._result;\n\n  for (var i = 0; i < subscribers.length; i += 3) {\n    child = subscribers[i];\n    callback = subscribers[i + settled];\n\n    if (child) {\n      invokeCallback(settled, child, callback, detail);\n    } else {\n      callback(detail);\n    }\n  }\n\n  promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n  this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n  try {\n    return callback(detail);\n  } catch (e) {\n    TRY_CATCH_ERROR.error = e;\n    return TRY_CATCH_ERROR;\n  }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n  var hasCallback = isFunction(callback),\n      value = undefined,\n      error = undefined,\n      succeeded = undefined,\n      failed = undefined;\n\n  if (hasCallback) {\n    value = tryCatch(callback, detail);\n\n    if (value === TRY_CATCH_ERROR) {\n      failed = true;\n      error = value.error;\n      value = null;\n    } else {\n      succeeded = true;\n    }\n\n    if (promise === value) {\n      _reject(promise, cannotReturnOwn());\n      return;\n    }\n  } else {\n    value = detail;\n    succeeded = true;\n  }\n\n  if (promise._state !== PENDING) {\n    // noop\n  } else if (hasCallback && succeeded) {\n      _resolve(promise, value);\n    } else if (failed) {\n      _reject(promise, error);\n    } else if (settled === FULFILLED) {\n      fulfill(promise, value);\n    } else if (settled === REJECTED) {\n      _reject(promise, value);\n    }\n}\n\nfunction initializePromise(promise, resolver) {\n  try {\n    resolver(function resolvePromise(value) {\n      _resolve(promise, value);\n    }, function rejectPromise(reason) {\n      _reject(promise, reason);\n    });\n  } catch (e) {\n    _reject(promise, e);\n  }\n}\n\nvar id = 0;\nfunction nextId() {\n  return id++;\n}\n\nfunction makePromise(promise) {\n  promise[PROMISE_ID] = id++;\n  promise._state = undefined;\n  promise._result = undefined;\n  promise._subscribers = [];\n}\n\nfunction Enumerator(Constructor, input) {\n  this._instanceConstructor = Constructor;\n  this.promise = new Constructor(noop);\n\n  if (!this.promise[PROMISE_ID]) {\n    makePromise(this.promise);\n  }\n\n  if (isArray(input)) {\n    this._input = input;\n    this.length = input.length;\n    this._remaining = input.length;\n\n    this._result = new Array(this.length);\n\n    if (this.length === 0) {\n      fulfill(this.promise, this._result);\n    } else {\n      this.length = this.length || 0;\n      this._enumerate();\n      if (this._remaining === 0) {\n        fulfill(this.promise, this._result);\n      }\n    }\n  } else {\n    _reject(this.promise, validationError());\n  }\n}\n\nfunction validationError() {\n  return new Error('Array Methods must be provided an Array');\n};\n\nEnumerator.prototype._enumerate = function () {\n  var length = this.length;\n  var _input = this._input;\n\n  for (var i = 0; this._state === PENDING && i < length; i++) {\n    this._eachEntry(_input[i], i);\n  }\n};\n\nEnumerator.prototype._eachEntry = function (entry, i) {\n  var c = this._instanceConstructor;\n  var resolve$$ = c.resolve;\n\n  if (resolve$$ === resolve) {\n    var _then = getThen(entry);\n\n    if (_then === then && entry._state !== PENDING) {\n      this._settledAt(entry._state, i, entry._result);\n    } else if (typeof _then !== 'function') {\n      this._remaining--;\n      this._result[i] = entry;\n    } else if (c === Promise) {\n      var promise = new c(noop);\n      handleMaybeThenable(promise, entry, _then);\n      this._willSettleAt(promise, i);\n    } else {\n      this._willSettleAt(new c(function (resolve$$) {\n        return resolve$$(entry);\n      }), i);\n    }\n  } else {\n    this._willSettleAt(resolve$$(entry), i);\n  }\n};\n\nEnumerator.prototype._settledAt = function (state, i, value) {\n  var promise = this.promise;\n\n  if (promise._state === PENDING) {\n    this._remaining--;\n\n    if (state === REJECTED) {\n      _reject(promise, value);\n    } else {\n      this._result[i] = value;\n    }\n  }\n\n  if (this._remaining === 0) {\n    fulfill(promise, this._result);\n  }\n};\n\nEnumerator.prototype._willSettleAt = function (promise, i) {\n  var enumerator = this;\n\n  subscribe(promise, undefined, function (value) {\n    return enumerator._settledAt(FULFILLED, i, value);\n  }, function (reason) {\n    return enumerator._settledAt(REJECTED, i, reason);\n  });\n};\n\n/**\n  `Promise.all` accepts an array of promises, and returns a new promise which\n  is fulfilled with an array of fulfillment values for the passed promises, or\n  rejected with the reason of the first passed promise to be rejected. It casts all\n  elements of the passed iterable to promises as it runs this algorithm.\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = resolve(2);\n  let promise3 = resolve(3);\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // The array here would be [ 1, 2, 3 ];\n  });\n  ```\n\n  If any of the `promises` given to `all` are rejected, the first promise\n  that is rejected will be given as an argument to the returned promises's\n  rejection handler. For example:\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = reject(new Error(\"2\"));\n  let promise3 = reject(new Error(\"3\"));\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // Code here never runs because there are rejected promises!\n  }, function(error) {\n    // error.message === \"2\"\n  });\n  ```\n\n  @method all\n  @static\n  @param {Array} entries array of promises\n  @param {String} label optional string for labeling the promise.\n  Useful for tooling.\n  @return {Promise} promise that is fulfilled when all `promises` have been\n  fulfilled, or rejected if any of them become rejected.\n  @static\n*/\nfunction all(entries) {\n  return new Enumerator(this, entries).promise;\n}\n\n/**\n  `Promise.race` returns a new promise which is settled in the same way as the\n  first passed promise to settle.\n\n  Example:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 2');\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // result === 'promise 2' because it was resolved before promise1\n    // was resolved.\n  });\n  ```\n\n  `Promise.race` is deterministic in that only the state of the first\n  settled promise matters. For example, even if other promises given to the\n  `promises` array argument are resolved, but the first settled promise has\n  become rejected before the other promises became fulfilled, the returned\n  promise will become rejected:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      reject(new Error('promise 2'));\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // Code here never runs\n  }, function(reason){\n    // reason.message === 'promise 2' because promise 2 became rejected before\n    // promise 1 became fulfilled\n  });\n  ```\n\n  An example real-world use case is implementing timeouts:\n\n  ```javascript\n  Promise.race([ajax('foo.json'), timeout(5000)])\n  ```\n\n  @method race\n  @static\n  @param {Array} promises array of promises to observe\n  Useful for tooling.\n  @return {Promise} a promise which settles in the same way as the first passed\n  promise to settle.\n*/\nfunction race(entries) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (!isArray(entries)) {\n    return new Constructor(function (_, reject) {\n      return reject(new TypeError('You must pass an array to race.'));\n    });\n  } else {\n    return new Constructor(function (resolve, reject) {\n      var length = entries.length;\n      for (var i = 0; i < length; i++) {\n        Constructor.resolve(entries[i]).then(resolve, reject);\n      }\n    });\n  }\n}\n\n/**\n  `Promise.reject` returns a promise rejected with the passed `reason`.\n  It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    reject(new Error('WHOOPS'));\n  });\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.reject(new Error('WHOOPS'));\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  @method reject\n  @static\n  @param {Any} reason value that the returned promise will be rejected with.\n  Useful for tooling.\n  @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject(reason) {\n  /*jshint validthis:true */\n  var Constructor = this;\n  var promise = new Constructor(noop);\n  _reject(promise, reason);\n  return promise;\n}\n\nfunction needsResolver() {\n  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n  throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n  Promise objects represent the eventual result of an asynchronous operation. The\n  primary way of interacting with a promise is through its `then` method, which\n  registers callbacks to receive either a promise's eventual value or the reason\n  why the promise cannot be fulfilled.\n\n  Terminology\n  -----------\n\n  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n  - `thenable` is an object or function that defines a `then` method.\n  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n  - `exception` is a value that is thrown using the throw statement.\n  - `reason` is a value that indicates why a promise was rejected.\n  - `settled` the final resting state of a promise, fulfilled or rejected.\n\n  A promise can be in one of three states: pending, fulfilled, or rejected.\n\n  Promises that are fulfilled have a fulfillment value and are in the fulfilled\n  state.  Promises that are rejected have a rejection reason and are in the\n  rejected state.  A fulfillment value is never a thenable.\n\n  Promises can also be said to *resolve* a value.  If this value is also a\n  promise, then the original promise's settled state will match the value's\n  settled state.  So a promise that *resolves* a promise that rejects will\n  itself reject, and a promise that *resolves* a promise that fulfills will\n  itself fulfill.\n\n\n  Basic Usage:\n  ------------\n\n  ```js\n  let promise = new Promise(function(resolve, reject) {\n    // on success\n    resolve(value);\n\n    // on failure\n    reject(reason);\n  });\n\n  promise.then(function(value) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Advanced Usage:\n  ---------------\n\n  Promises shine when abstracting away asynchronous interactions such as\n  `XMLHttpRequest`s.\n\n  ```js\n  function getJSON(url) {\n    return new Promise(function(resolve, reject){\n      let xhr = new XMLHttpRequest();\n\n      xhr.open('GET', url);\n      xhr.onreadystatechange = handler;\n      xhr.responseType = 'json';\n      xhr.setRequestHeader('Accept', 'application/json');\n      xhr.send();\n\n      function handler() {\n        if (this.readyState === this.DONE) {\n          if (this.status === 200) {\n            resolve(this.response);\n          } else {\n            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n          }\n        }\n      };\n    });\n  }\n\n  getJSON('/posts.json').then(function(json) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Unlike callbacks, promises are great composable primitives.\n\n  ```js\n  Promise.all([\n    getJSON('/posts'),\n    getJSON('/comments')\n  ]).then(function(values){\n    values[0] // => postsJSON\n    values[1] // => commentsJSON\n\n    return values;\n  });\n  ```\n\n  @class Promise\n  @param {function} resolver\n  Useful for tooling.\n  @constructor\n*/\nfunction Promise(resolver) {\n  this[PROMISE_ID] = nextId();\n  this._result = this._state = undefined;\n  this._subscribers = [];\n\n  if (noop !== resolver) {\n    typeof resolver !== 'function' && needsResolver();\n    this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n  }\n}\n\nPromise.all = all;\nPromise.race = race;\nPromise.resolve = resolve;\nPromise.reject = reject;\nPromise._setScheduler = setScheduler;\nPromise._setAsap = setAsap;\nPromise._asap = asap;\n\nPromise.prototype = {\n  constructor: Promise,\n\n  /**\n    The primary way of interacting with a promise is through its `then` method,\n    which registers callbacks to receive either a promise's eventual value or the\n    reason why the promise cannot be fulfilled.\n\n    ```js\n    findUser().then(function(user){\n      // user is available\n    }, function(reason){\n      // user is unavailable, and you are given the reason why\n    });\n    ```\n\n    Chaining\n    --------\n\n    The return value of `then` is itself a promise.  This second, 'downstream'\n    promise is resolved with the return value of the first promise's fulfillment\n    or rejection handler, or rejected if the handler throws an exception.\n\n    ```js\n    findUser().then(function (user) {\n      return user.name;\n    }, function (reason) {\n      return 'default name';\n    }).then(function (userName) {\n      // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n      // will be `'default name'`\n    });\n\n    findUser().then(function (user) {\n      throw new Error('Found user, but still unhappy');\n    }, function (reason) {\n      throw new Error('`findUser` rejected and we're unhappy');\n    }).then(function (value) {\n      // never reached\n    }, function (reason) {\n      // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n      // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n    });\n    ```\n    If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n\n    ```js\n    findUser().then(function (user) {\n      throw new PedagogicalException('Upstream error');\n    }).then(function (value) {\n      // never reached\n    }).then(function (value) {\n      // never reached\n    }, function (reason) {\n      // The `PedgagocialException` is propagated all the way down to here\n    });\n    ```\n\n    Assimilation\n    ------------\n\n    Sometimes the value you want to propagate to a downstream promise can only be\n    retrieved asynchronously. This can be achieved by returning a promise in the\n    fulfillment or rejection handler. The downstream promise will then be pending\n    until the returned promise is settled. This is called *assimilation*.\n\n    ```js\n    findUser().then(function (user) {\n      return findCommentsByAuthor(user);\n    }).then(function (comments) {\n      // The user's comments are now available\n    });\n    ```\n\n    If the assimliated promise rejects, then the downstream promise will also reject.\n\n    ```js\n    findUser().then(function (user) {\n      return findCommentsByAuthor(user);\n    }).then(function (comments) {\n      // If `findCommentsByAuthor` fulfills, we'll have the value here\n    }, function (reason) {\n      // If `findCommentsByAuthor` rejects, we'll have the reason here\n    });\n    ```\n\n    Simple Example\n    --------------\n\n    Synchronous Example\n\n    ```javascript\n    let result;\n\n    try {\n      result = findResult();\n      // success\n    } catch(reason) {\n      // failure\n    }\n    ```\n\n    Errback Example\n\n    ```js\n    findResult(function(result, err){\n      if (err) {\n        // failure\n      } else {\n        // success\n      }\n    });\n    ```\n\n    Promise Example;\n\n    ```javascript\n    findResult().then(function(result){\n      // success\n    }, function(reason){\n      // failure\n    });\n    ```\n\n    Advanced Example\n    --------------\n\n    Synchronous Example\n\n    ```javascript\n    let author, books;\n\n    try {\n      author = findAuthor();\n      books  = findBooksByAuthor(author);\n      // success\n    } catch(reason) {\n      // failure\n    }\n    ```\n\n    Errback Example\n\n    ```js\n\n    function foundBooks(books) {\n\n    }\n\n    function failure(reason) {\n\n    }\n\n    findAuthor(function(author, err){\n      if (err) {\n        failure(err);\n        // failure\n      } else {\n        try {\n          findBoooksByAuthor(author, function(books, err) {\n            if (err) {\n              failure(err);\n            } else {\n              try {\n                foundBooks(books);\n              } catch(reason) {\n                failure(reason);\n              }\n            }\n          });\n        } catch(error) {\n          failure(err);\n        }\n        // success\n      }\n    });\n    ```\n\n    Promise Example;\n\n    ```javascript\n    findAuthor().\n      then(findBooksByAuthor).\n      then(function(books){\n        // found books\n    }).catch(function(reason){\n      // something went wrong\n    });\n    ```\n\n    @method then\n    @param {Function} onFulfilled\n    @param {Function} onRejected\n    Useful for tooling.\n    @return {Promise}\n  */\n  then: then,\n\n  /**\n    `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n    as the catch block of a try/catch statement.\n\n    ```js\n    function findAuthor(){\n      throw new Error('couldn't find that author');\n    }\n\n    // synchronous\n    try {\n      findAuthor();\n    } catch(reason) {\n      // something went wrong\n    }\n\n    // async with promises\n    findAuthor().catch(function(reason){\n      // something went wrong\n    });\n    ```\n\n    @method catch\n    @param {Function} onRejection\n    Useful for tooling.\n    @return {Promise}\n  */\n  'catch': function _catch(onRejection) {\n    return this.then(null, onRejection);\n  }\n};\n\nfunction polyfill() {\n    var local = undefined;\n\n    if (typeof global !== 'undefined') {\n        local = global;\n    } else if (typeof self !== 'undefined') {\n        local = self;\n    } else {\n        try {\n            local = Function('return this')();\n        } catch (e) {\n            throw new Error('polyfill failed because global object is unavailable in this environment');\n        }\n    }\n\n    var P = local.Promise;\n\n    if (P) {\n        var promiseToString = null;\n        try {\n            promiseToString = Object.prototype.toString.call(P.resolve());\n        } catch (e) {\n            // silently ignored\n        }\n\n        if (promiseToString === '[object Promise]' && !P.cast) {\n            return;\n        }\n    }\n\n    local.Promise = Promise;\n}\n\n// Strange compat..\nPromise.polyfill = polyfill;\nPromise.Promise = Promise;\n\nreturn Promise;\n\n})));\n//# sourceMappingURL=es6-promise.map\n\n\n\n\n(function(self) {\n  'use strict';\n\n  if (self.fetch) {\n    return\n  }\n\n  var support = {\n    searchParams: 'URLSearchParams' in self,\n    iterable: 'Symbol' in self && 'iterator' in Symbol,\n    blob: 'FileReader' in self && 'Blob' in self && (function() {\n      try {\n        new Blob()\n        return true\n      } catch(e) {\n        return false\n      }\n    })(),\n    formData: 'FormData' in self,\n    arrayBuffer: 'ArrayBuffer' in self\n  }\n\n  function normalizeName(name) {\n    if (typeof name !== 'string') {\n      name = String(name)\n    }\n    if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n      throw new TypeError('Invalid character in header field name')\n    }\n    return name.toLowerCase()\n  }\n\n  function normalizeValue(value) {\n    if (typeof value !== 'string') {\n      value = String(value)\n    }\n    return value\n  }\n\n  // Build a destructive iterator for the value list\n  function iteratorFor(items) {\n    var iterator = {\n      next: function() {\n        var value = items.shift()\n        return {done: value === undefined, value: value}\n      }\n    }\n\n    if (support.iterable) {\n      iterator[Symbol.iterator] = function() {\n        return iterator\n      }\n    }\n\n    return iterator\n  }\n\n  function Headers(headers) {\n    this.map = {}\n\n    if (headers instanceof Headers) {\n      headers.forEach(function(value, name) {\n        this.append(name, value)\n      }, this)\n\n    } else if (headers) {\n      Object.getOwnPropertyNames(headers).forEach(function(name) {\n        this.append(name, headers[name])\n      }, this)\n    }\n  }\n\n  Headers.prototype.append = function(name, value) {\n    name = normalizeName(name)\n    value = normalizeValue(value)\n    var list = this.map[name]\n    if (!list) {\n      list = []\n      this.map[name] = list\n    }\n    list.push(value)\n  }\n\n  Headers.prototype['delete'] = function(name) {\n    delete this.map[normalizeName(name)]\n  }\n\n  Headers.prototype.get = function(name) {\n    var values = this.map[normalizeName(name)]\n    return values ? values[0] : null\n  }\n\n  Headers.prototype.getAll = function(name) {\n    return this.map[normalizeName(name)] || []\n  }\n\n  Headers.prototype.has = function(name) {\n    return this.map.hasOwnProperty(normalizeName(name))\n  }\n\n  Headers.prototype.set = function(name, value) {\n    this.map[normalizeName(name)] = [normalizeValue(value)]\n  }\n\n  Headers.prototype.forEach = function(callback, thisArg) {\n    Object.getOwnPropertyNames(this.map).forEach(function(name) {\n      this.map[name].forEach(function(value) {\n        callback.call(thisArg, value, name, this)\n      }, this)\n    }, this)\n  }\n\n  Headers.prototype.keys = function() {\n    var items = []\n    this.forEach(function(value, name) { items.push(name) })\n    return iteratorFor(items)\n  }\n\n  Headers.prototype.values = function() {\n    var items = []\n    this.forEach(function(value) { items.push(value) })\n    return iteratorFor(items)\n  }\n\n  Headers.prototype.entries = function() {\n    var items = []\n    this.forEach(function(value, name) { items.push([name, value]) })\n    return iteratorFor(items)\n  }\n\n  if (support.iterable) {\n    Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n  }\n\n  function consumed(body) {\n    if (body.bodyUsed) {\n      return Promise.reject(new TypeError('Already read'))\n    }\n    body.bodyUsed = true\n  }\n\n  function fileReaderReady(reader) {\n    return new Promise(function(resolve, reject) {\n      reader.onload = function() {\n        resolve(reader.result)\n      }\n      reader.onerror = function() {\n        reject(reader.error)\n      }\n    })\n  }\n\n  function readBlobAsArrayBuffer(blob) {\n    var reader = new FileReader()\n    reader.readAsArrayBuffer(blob)\n    return fileReaderReady(reader)\n  }\n\n  function readBlobAsText(blob) {\n    var reader = new FileReader()\n    reader.readAsText(blob)\n    return fileReaderReady(reader)\n  }\n\n  function Body() {\n    this.bodyUsed = false\n\n    this._initBody = function(body) {\n      this._bodyInit = body\n      if (typeof body === 'string') {\n        this._bodyText = body\n      } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n        this._bodyBlob = body\n      } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n        this._bodyFormData = body\n      } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n        this._bodyText = body.toString()\n      } else if (!body) {\n        this._bodyText = ''\n      } else if (support.arrayBuffer && ArrayBuffer.prototype.isPrototypeOf(body)) {\n        // Only support ArrayBuffers for POST method.\n        // Receiving ArrayBuffers happens via Blobs, instead.\n      } else {\n        throw new Error('unsupported BodyInit type')\n      }\n\n      if (!this.headers.get('content-type')) {\n        if (typeof body === 'string') {\n          this.headers.set('content-type', 'text/plain;charset=UTF-8')\n        } else if (this._bodyBlob && this._bodyBlob.type) {\n          this.headers.set('content-type', this._bodyBlob.type)\n        } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n          this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n        }\n      }\n    }\n\n    if (support.blob) {\n      this.blob = function() {\n        var rejected = consumed(this)\n        if (rejected) {\n          return rejected\n        }\n\n        if (this._bodyBlob) {\n          return Promise.resolve(this._bodyBlob)\n        } else if (this._bodyFormData) {\n          throw new Error('could not read FormData body as blob')\n        } else {\n          return Promise.resolve(new Blob([this._bodyText]))\n        }\n      }\n\n      this.arrayBuffer = function() {\n        return this.blob().then(readBlobAsArrayBuffer)\n      }\n\n      this.text = function() {\n        var rejected = consumed(this)\n        if (rejected) {\n          return rejected\n        }\n\n        if (this._bodyBlob) {\n          return readBlobAsText(this._bodyBlob)\n        } else if (this._bodyFormData) {\n          throw new Error('could not read FormData body as text')\n        } else {\n          return Promise.resolve(this._bodyText)\n        }\n      }\n    } else {\n      this.text = function() {\n        var rejected = consumed(this)\n        return rejected ? rejected : Promise.resolve(this._bodyText)\n      }\n    }\n\n    if (support.formData) {\n      this.formData = function() {\n        return this.text().then(decode)\n      }\n    }\n\n    this.json = function() {\n      return this.text().then(JSON.parse)\n    }\n\n    return this\n  }\n\n  // HTTP methods whose capitalization should be normalized\n  var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n  function normalizeMethod(method) {\n    var upcased = method.toUpperCase()\n    return (methods.indexOf(upcased) > -1) ? upcased : method\n  }\n\n  function Request(input, options) {\n    options = options || {}\n    var body = options.body\n    if (Request.prototype.isPrototypeOf(input)) {\n      if (input.bodyUsed) {\n        throw new TypeError('Already read')\n      }\n      this.url = input.url\n      this.credentials = input.credentials\n      if (!options.headers) {\n        this.headers = new Headers(input.headers)\n      }\n      this.method = input.method\n      this.mode = input.mode\n      if (!body) {\n        body = input._bodyInit\n        input.bodyUsed = true\n      }\n    } else {\n      this.url = input\n    }\n\n    this.credentials = options.credentials || this.credentials || 'omit'\n    if (options.headers || !this.headers) {\n      this.headers = new Headers(options.headers)\n    }\n    this.method = normalizeMethod(options.method || this.method || 'GET')\n    this.mode = options.mode || this.mode || null\n    this.referrer = null\n\n    if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n      throw new TypeError('Body not allowed for GET or HEAD requests')\n    }\n    this._initBody(body)\n  }\n\n  Request.prototype.clone = function() {\n    return new Request(this)\n  }\n\n  function decode(body) {\n    var form = new FormData()\n    body.trim().split('&').forEach(function(bytes) {\n      if (bytes) {\n        var split = bytes.split('=')\n        var name = split.shift().replace(/\\+/g, ' ')\n        var value = split.join('=').replace(/\\+/g, ' ')\n        form.append(decodeURIComponent(name), decodeURIComponent(value))\n      }\n    })\n    return form\n  }\n\n  function headers(xhr) {\n    var head = new Headers()\n    var pairs = (xhr.getAllResponseHeaders() || '').trim().split('\\n')\n    pairs.forEach(function(header) {\n      var split = header.trim().split(':')\n      var key = split.shift().trim()\n      var value = split.join(':').trim()\n      head.append(key, value)\n    })\n    return head\n  }\n\n  Body.call(Request.prototype)\n\n  function Response(bodyInit, options) {\n    if (!options) {\n      options = {}\n    }\n\n    this.type = 'default'\n    this.status = options.status\n    this.ok = this.status >= 200 && this.status < 300\n    this.statusText = options.statusText\n    this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers)\n    this.url = options.url || ''\n    this._initBody(bodyInit)\n  }\n\n  Body.call(Response.prototype)\n\n  Response.prototype.clone = function() {\n    return new Response(this._bodyInit, {\n      status: this.status,\n      statusText: this.statusText,\n      headers: new Headers(this.headers),\n      url: this.url\n    })\n  }\n\n  Response.error = function() {\n    var response = new Response(null, {status: 0, statusText: ''})\n    response.type = 'error'\n    return response\n  }\n\n  var redirectStatuses = [301, 302, 303, 307, 308]\n\n  Response.redirect = function(url, status) {\n    if (redirectStatuses.indexOf(status) === -1) {\n      throw new RangeError('Invalid status code')\n    }\n\n    return new Response(null, {status: status, headers: {location: url}})\n  }\n\n  self.Headers = Headers\n  self.Request = Request\n  self.Response = Response\n\n  self.fetch = function(input, init) {\n    return new Promise(function(resolve, reject) {\n      var request\n      if (Request.prototype.isPrototypeOf(input) && !init) {\n        request = input\n      } else {\n        request = new Request(input, init)\n      }\n\n      var xhr = new XMLHttpRequest()\n\n      function responseURL() {\n        if ('responseURL' in xhr) {\n          return xhr.responseURL\n        }\n\n        // Avoid security warnings on getResponseHeader when not allowed by CORS\n        if (/^X-Request-URL:/mi.test(xhr.getAllResponseHeaders())) {\n          return xhr.getResponseHeader('X-Request-URL')\n        }\n\n        return\n      }\n\n      xhr.onload = function() {\n        var options = {\n          status: xhr.status,\n          statusText: xhr.statusText,\n          headers: headers(xhr),\n          url: responseURL()\n        }\n        var body = 'response' in xhr ? xhr.response : xhr.responseText\n        resolve(new Response(body, options))\n      }\n\n      xhr.onerror = function() {\n        reject(new TypeError('Network request failed'))\n      }\n\n      xhr.ontimeout = function() {\n        reject(new TypeError('Network request failed'))\n      }\n\n      xhr.open(request.method, request.url, true)\n\n      if (request.credentials === 'include') {\n        xhr.withCredentials = true\n      }\n\n      if ('responseType' in xhr && support.blob) {\n        xhr.responseType = 'blob'\n      }\n\n      request.headers.forEach(function(value, name) {\n        xhr.setRequestHeader(name, value)\n      })\n\n      xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n    })\n  }\n  self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/javascript/style.css",
    "content": "/* || general styles */\n\nhtml {\n  font-family: 'helvetica neue', helvetica, arial, sans-serif;\n}\n\nbody {\n  width: 800px;\n  margin: 0 auto;\n}\n\nh1, h2 {\n  font-family: 'Faster One', cursive;\n}\n\n/* header styles */\n\nh1 {\n  font-size: 4rem;\n  text-align: center;\n}\n\nheader p {\n  font-size: 1.3rem;\n  font-weight: bold;\n  text-align: center;\n}\n\n/* section styles */\n\nsection article {\n  width: 33%;\n  float: left;\n}\n\nsection p {\n  margin: 5px 0;\n}\n\nsection ul {\n  margin-top: 0;\n}\n\nh2 {\n  font-size: 2.5rem;\n  letter-spacing: -5px;\n  margin-bottom: 10px;\n}"
  },
  {
    "path": "tools-testing/cross-browser-testing/selenium/bstack_google_test.js",
    "content": "const request = require('request'); // require request to use the REST API\nlet webdriver = require('selenium-webdriver'),\n    By = webdriver.By,\n    until = webdriver.until;\n\n// Input capabilities\nlet capabilities = {\n   'browserName' : 'Firefox',\n   'browser_version' : '56.0 beta',\n   'os' : 'OS X',\n   'os_version' : 'Sierra',\n   'resolution' : '1280x1024',\n   'browserstack.user' : 'chrismills4',\n   'browserstack.key' : 'DoDmjvSzK5eLSmAtVwi4',\n   'browserstack.debug' : 'true',\n   'build' : 'First build',\n   'project' : 'Google test 2' // split up into projects\n};\n\nlet driver = new webdriver.Builder().\n  usingServer('http://hub-cloud.browserstack.com/wd/hub').\n  withCapabilities(capabilities).\n  build();\n\n// obtain session ID\nlet sessionId;\n\ndriver.session_.then(function(sessionData) {\n  sessionId = sessionData.id_;\n});\n\ndriver.get('http://www.google.com');\ndriver.findElement(By.name('q')).sendKeys('webdriver');\n\ndriver.sleep(1000).then(function() {\n  driver.findElement(By.name('q')).sendKeys(webdriver.Key.TAB);\n});\n\ndriver.findElement(By.name('btnK')).click();\n\ndriver.sleep(2000).then(function() {\n  driver.getTitle().then(function(title) {\n    if(title === 'webdriver - Google Search') {\n      console.log('Test passed');\n      request({uri: \"https://chrismills4:DoDmjvSzK5eLSmAtVwi4@www.browserstack.com/automate/sessions/\" + sessionId + \".json\", method:\"PUT\", form:{\"status\":\"passed\",\"reason\":\"Google results showed correct title\"}});\n    } else {\n      console.log('Test failed');\n      request({uri: \"https://chrismills4:DoDmjvSzK5eLSmAtVwi4@www.browserstack.com/automate/sessions/\" + sessionId + \".json\", method:\"PUT\", form:{\"status\":\"failed\",\"reason\":\"Google results showed wrong title\"}});\n    }\n  });\n});\n\ndriver.quit();\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/selenium/google_test.js",
    "content": "const webdriver = require('selenium-webdriver'),\n    By = webdriver.By,\n    until = webdriver.until;\n\nlet driver = new webdriver.Builder()\n    .forBrowser('firefox')\n    .build();\n\ndriver.get('https://www.google.com');\ndriver.findElement(By.name('q')).sendKeys('webdriver');\n\ndriver.sleep(1000).then(function() {\n  driver.findElement(By.name('q')).sendKeys(webdriver.Key.TAB);\n});\n\ndriver.findElement(By.name('btnK')).click();\n\ndriver.sleep(2000).then(function() {\n  driver.getTitle().then(function(title) {\n    if(title === 'webdriver - Google Search') {\n      console.log('Test passed');\n    } else {\n      console.log('Test failed');\n    }\n  });\n});\n\ndriver.quit();\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/selenium/google_test_multiple.js",
    "content": "const webdriver = require('selenium-webdriver'),\n    By = webdriver.By,\n    until = webdriver.until;\n\nlet driver_fx = new webdriver.Builder()\n    .forBrowser('firefox')\n    .build();\n\nlet driver_chr = new webdriver.Builder()\n    .forBrowser('chrome')\n    .build();\n\nsearchTest(driver_fx);\nsearchTest(driver_chr);\n\nfunction searchTest(driver) {\n  driver.get('https://www.google.com');\n  driver.findElement(By.name('q')).sendKeys('webdriver');\n\n  driver.sleep(1000).then(function() {\n    driver.findElement(By.name('q')).sendKeys(webdriver.Key.TAB);\n  });\n\n  driver.findElement(By.name('btnK')).click();\n\n  driver.sleep(2000).then(function() {\n    driver.getTitle().then(function(title) {\n      if(title === 'webdriver - Google Search') {\n        console.log('Test passed');\n      } else {\n        console.log('Test failed');\n      }\n    });\n  });\n\n  driver.quit();\n}\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/selenium/google_test_remote.js",
    "content": "const webdriver = require('selenium-webdriver'),\n    By = webdriver.By,\n    until = webdriver.until;\n\nlet driver = new webdriver.Builder()\n    .forBrowser('firefox')\n    .usingServer('http://localhost:4444/wd/hub')\n    .build();\n\ndriver.get('http://www.google.com');\ndriver.findElement(By.name('q')).sendKeys('webdriver');\n\ndriver.sleep(1000).then(function() {\n  driver.findElement(By.name('q')).sendKeys(webdriver.Key.TAB);\n});\n\ndriver.findElement(By.name('btnK')).click();\n\ndriver.sleep(2000).then(function() {\n  driver.getTitle().then(function(title) {\n    if(title === 'webdriver - Google Search') {\n      console.log('Test passed');\n    } else {\n      console.log('Test failed');\n    }\n  });\n});\n\ndriver.quit();\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/selenium/mocha_test.js",
    "content": "\"use strict\";\n\nconst assert = require(\"assert\");\n\nconst { Builder, Capabilities, By } = require(\"selenium-webdriver\");\n\ndescribe(\"Alert\", () => {\n  it(\"should have the correct text content - this is from the first button\", (done) => {\n    let driver = new Builder()\n      .withCapabilities(Capabilities.firefox())\n      .build();\n\n    driver\n      .get(\n        \"http://mdn.github.io/learning-area/tools-testing/cross-browser-testing/accessibility/native-keyboard-accessibility.html\"\n      )\n      .then(() => driver.findElement(By.css(\"button:nth-of-type(1)\")))\n      .then((button) => button.click())\n      .then(() => driver.switchTo().alert())\n      .then((alert) => alert.getText())\n      .then((text) => assert.equal(text, \"This is from the first button\"))\n      .then(() => driver.quit())\n      .then(done)\n      .catch((err) => done(err));\n  });\n});\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/selenium/quick_test.js",
    "content": "const webdriver = require('selenium-webdriver'),\n    By = webdriver.By,\n    until = webdriver.until;\n\nlet driver = new webdriver.Builder()\n    .forBrowser('firefox')\n    .build();\n\ndriver.get('http://mdn.github.io/learning-area/tools-testing/cross-browser-testing/accessibility/native-keyboard-accessibility.html');\n\nconst button = driver.findElement(By.css('button:nth-of-type(1)'));\n\nbutton.click();\n\nconst alert = driver.switchTo().alert();\n\nalert.getText().then(function(text) {\n  console.log('Alert text is \\'' + text + '\\'');\n});\n\nalert.accept();\n\nconst input = driver.findElement(By.id('input1'));\n\ndriver.sleep(2000).then(function() {\n  input.sendKeys('Filling in my form');\n  input.getAttribute(\"value\").then(function(value) {\n    if(value !== '') {\n      console.log('Form input editable');\n    }\n  });\n});\n\ndriver.quit();\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/selenium/sauce_google_test.js",
    "content": "const webdriver = require('selenium-webdriver'),\n    By = webdriver.By,\n    until = webdriver.until,\n    username = \"YOUR-USER-NAME\",\n    accessKey = \"YOUR-ACCESS-KEY\";\n\nlet SauceLabs = require('saucelabs');\n\nlet saucelabs = new SauceLabs({\n    username : \"YOUR-USER-NAME\",\n    password : \"YOUR-ACCESS-KEY\"\n});\n\nlet driver = new webdriver.Builder().\n    withCapabilities({\n      'browserName': 'chrome',\n      'platform': 'Windows XP',\n      'version': '43.0',\n      'username': username,\n      'accessKey': accessKey\n    }).\n    usingServer(\"https://\" + username + \":\" + accessKey +\n          \"@ondemand.saucelabs.com:443/wd/hub\").\n    build();\n\ndriver.getSession().then(function (sessionid){\n      driver.sessionID = sessionid.id_;\n});\n\ndriver.get('http://www.google.com');\ndriver.findElement(By.name('q')).sendKeys('webdriver');\n\ndriver.sleep(1000).then(function() {\n  driver.findElement(By.name('q')).sendKeys(webdriver.Key.TAB);\n});\n\ndriver.findElement(By.name('btnK')).click();\n\ndriver.sleep(2000).then(function() {\n  driver.getTitle().then(function(title) {\n    if(title === 'webdriver - Google Search') {\n      console.log('Test passed');\n      let testPassed = true;\n    } else {\n      console.log('Test failed');\n      let testPassed = false;\n    }\n\n    saucelabs.updateJob(driver.sessionID, {\n      name: 'Google search results page title test',\n      passed: testPassed\n    }, function(err,res) {\n\n    });\n  });\n});\n\ndriver.quit();\n"
  },
  {
    "path": "tools-testing/cross-browser-testing/strategies/hidden-info-panel.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en-US\">\n  <head>\n\t<meta charset=\"utf-8\">\n\t<title>Hidden info panel</title>\n\n  <style>\n    html {\n      font-family: sans-serif;\n    }\n\n    /* || Checkbox hack to control information box display */\n\n    label[for=\"toggle\"] {\n      font-size: 3rem;\n      position: absolute;\n      top: 4px;\n      right: 5px;\n      z-index: 1;\n      cursor: pointer;\n    }\n\n    input[type=\"checkbox\"] {\n       position: absolute;\n       top: -100px;\n    }\n\n    /* information box styling */\n\n    aside {\n      background-color: #a60000;\n      background: linear-gradient(to top left, #ff0000, #a60000);\n      color: white;\n      font-size: 1.4em;\n      text-shadow: 2px 2px 2px black;\n\n      width: 340px;\n      height: 98%;\n      padding: 10px 1%;\n\n      position: fixed;\n      top: 0;\n      right: -370px;\n\n      transition: 0.6s all;\n    }\n\n    /* Second part of the checkbox hack — the checked state */\n\n    input[type=checkbox]:checked + aside {\n      right: 0px;\n    }\n  </style>\n\n  </head>\n<body>\n\n\n  <label for=\"toggle\">❔</label>\n  <input type=\"checkbox\" id=\"toggle\">\n  <aside>\n    <h2>Information</h2>\n\n    <p>Some very important information about your app:</p>\n\n    <ol>\n      <li>It has a really cool slide-out information box.</li>\n      <li>This information box uses a combination of fixed positioning and a CSS transition for the smooth sliding.</li>\n      <li>It also uses a cool technique called the <a href=\"https://css-tricks.com/the-checkbox-hack/\">checkbox hack</a>.</li>\n      <li>This allows you to create a nice \"toggle on/toggle off\" UI effect without using any JavaScript, which will work in IE9 and above (the smooth transition will work in IE10 and above.)</li>\n\n    </ol>\n\n  </aside>\n</body>\n</html>\n"
  }
]