[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: \"[BUG] \"\nlabels: bug\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Desktop (please complete the following information):**\n - OS: [e.g. iOS]\n - Browser [e.g. chrome, safari]\n - Version [e.g. 22]\n\n**Smartphone (please complete the following information):**\n - Device: [e.g. iPhone6]\n - OS: [e.g. iOS8.1]\n - Browser [e.g. stock browser, safari]\n - Version [e.g. 22]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/content-feature-request.md",
    "content": "---\nname: Content Feature request\nabout: Suggest an idea for this project\ntitle: \"[CONTENT] \"\nlabels: 'content request'\nassignees: ''\n\n---\n\n**Is your content request driven by a specific need or issue? Please elaborate.**\nA clear and concise explanation of the issue or need prompting your request. For example, \"I often find it challenging when...\"\n\n**What specific content are you hoping to see added?**\nDescribe clearly and precisely what content you would like to see included.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: \"[FEATURE] \"\nlabels: 'feature request'\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n.jekyll-cache/\n.jekyll-metadata\n.sass-cache/\nGemfile.lock\n_site/\nvendor/\n"
  },
  {
    "path": "404.html",
    "content": "---\nlayout: default\n---\n\n<div class=\"d-flex h-100 align-items-center\">\n  <div class=\"container text-center\">\n    <h1>404</h1>\n\n    <p><strong>Page not found :(</strong></p>\n    <p>The requested page could not be found.</p>\n  </div>\n</div>\n"
  },
  {
    "path": "CNAME",
    "content": "www.hacker101.com"
  },
  {
    "path": "Gemfile",
    "content": "source \"https://rubygems.org\"\n\ngem \"github-pages\", group: :jekyll_plugins\n\ngem \"webrick\", \"~> 1.8\"\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright © 2020 HackerOne Inc.\nThis work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License:\n\nAttribution-NonCommercial-ShareAlike 4.0 International\n\n=======================================================================\n\nCreative Commons Corporation (\"Creative Commons\") is not a law firm and\ndoes not provide legal services or legal advice. Distribution of\nCreative Commons public licenses does not create a lawyer-client or\nother relationship. Creative Commons makes its licenses and related\ninformation available on an \"as-is\" basis. Creative Commons gives no\nwarranties regarding its licenses, any material licensed under their\nterms and conditions, or any related information. Creative Commons\ndisclaims all liability for damages resulting from their use to the\nfullest extent possible.\n\nUsing Creative Commons Public Licenses\n\nCreative Commons public licenses provide a standard set of terms and\nconditions that creators and other rights holders may use to share\noriginal works of authorship and other material subject to copyright\nand certain other rights specified in the public license below. The\nfollowing considerations are for informational purposes only, are not\nexhaustive, and do not form part of our licenses.\n\n     Considerations for licensors: Our public licenses are\n     intended for use by those authorized to give the public\n     permission to use material in ways otherwise restricted by\n     copyright and certain other rights. Our licenses are\n     irrevocable. Licensors should read and understand the terms\n     and conditions of the license they choose before applying it.\n     Licensors should also secure all rights necessary before\n     applying our licenses so that the public can reuse the\n     material as expected. Licensors should clearly mark any\n     material not subject to the license. This includes other CC-\n     licensed material, or material used under an exception or\n     limitation to copyright. More considerations for licensors:\n\twiki.creativecommons.org/Considerations_for_licensors\n\n     Considerations for the public: By using one of our public\n     licenses, a licensor grants the public permission to use the\n     licensed material under specified terms and conditions. If\n     the licensor's permission is not necessary for any reason--for\n     example, because of any applicable exception or limitation to\n     copyright--then that use is not regulated by the license. Our\n     licenses grant only permissions under copyright and certain\n     other rights that a licensor has authority to grant. Use of\n     the licensed material may still be restricted for other\n     reasons, including because others have copyright or other\n     rights in the material. A licensor may make special requests,\n     such as asking that all changes be marked or described.\n     Although not required by our licenses, you are encouraged to\n     respect those requests where reasonable. More_considerations\n     for the public: \n\twiki.creativecommons.org/Considerations_for_licensees\n\n=======================================================================\n\nCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International\nPublic License\n\nBy exercising the Licensed Rights (defined below), You accept and agree\nto be bound by the terms and conditions of this Creative Commons\nAttribution-NonCommercial-ShareAlike 4.0 International Public License\n(\"Public License\"). To the extent this Public License may be\ninterpreted as a contract, You are granted the Licensed Rights in\nconsideration of Your acceptance of these terms and conditions, and the\nLicensor grants You such rights in consideration of benefits the\nLicensor receives from making the Licensed Material available under\nthese terms and conditions.\n\n\nSection 1 -- Definitions.\n\n  a. Adapted Material means material subject to Copyright and Similar\n     Rights that is derived from or based upon the Licensed Material\n     and in which the Licensed Material is translated, altered,\n     arranged, transformed, or otherwise modified in a manner requiring\n     permission under the Copyright and Similar Rights held by the\n     Licensor. For purposes of this Public License, where the Licensed\n     Material is a musical work, performance, or sound recording,\n     Adapted Material is always produced where the Licensed Material is\n     synched in timed relation with a moving image.\n\n  b. Adapter's License means the license You apply to Your Copyright\n     and Similar Rights in Your contributions to Adapted Material in\n     accordance with the terms and conditions of this Public License.\n\n  c. BY-NC-SA Compatible License means a license listed at\n     creativecommons.org/compatiblelicenses, approved by Creative\n     Commons as essentially the equivalent of this Public License.\n\n  d. Copyright and Similar Rights means copyright and/or similar rights\n     closely related to copyright including, without limitation,\n     performance, broadcast, sound recording, and Sui Generis Database\n     Rights, without regard to how the rights are labeled or\n     categorized. For purposes of this Public License, the rights\n     specified in Section 2(b)(1)-(2) are not Copyright and Similar\n     Rights.\n\n  e. Effective Technological Measures means those measures that, in the\n     absence of proper authority, may not be circumvented under laws\n     fulfilling obligations under Article 11 of the WIPO Copyright\n     Treaty adopted on December 20, 1996, and/or similar international\n     agreements.\n\n  f. Exceptions and Limitations means fair use, fair dealing, and/or\n     any other exception or limitation to Copyright and Similar Rights\n     that applies to Your use of the Licensed Material.\n\n  g. License Elements means the license attributes listed in the name\n     of a Creative Commons Public License. The License Elements of this\n     Public License are Attribution, NonCommercial, and ShareAlike.\n\n  h. Licensed Material means the artistic or literary work, database,\n     or other material to which the Licensor applied this Public\n     License.\n\n  i. Licensed Rights means the rights granted to You subject to the\n     terms and conditions of this Public License, which are limited to\n     all Copyright and Similar Rights that apply to Your use of the\n     Licensed Material and that the Licensor has authority to license.\n\n  j. Licensor means the individual(s) or entity(ies) granting rights\n     under this Public License.\n\n  k. NonCommercial means not primarily intended for or directed towards\n     commercial advantage or monetary compensation. For purposes of\n     this Public License, the exchange of the Licensed Material for\n     other material subject to Copyright and Similar Rights by digital\n     file-sharing or similar means is NonCommercial provided there is\n     no payment of monetary compensation in connection with the\n     exchange.\n\n  l. Share means to provide material to the public by any means or\n     process that requires permission under the Licensed Rights, such\n     as reproduction, public display, public performance, distribution,\n     dissemination, communication, or importation, and to make material\n     available to the public including in ways that members of the\n     public may access the material from a place and at a time\n     individually chosen by them.\n\n  m. Sui Generis Database Rights means rights other than copyright\n     resulting from Directive 96/9/EC of the European Parliament and of\n     the Council of 11 March 1996 on the legal protection of databases,\n     as amended and/or succeeded, as well as other essentially\n     equivalent rights anywhere in the world.\n\n  n. You means the individual or entity exercising the Licensed Rights\n     under this Public License. Your has a corresponding meaning.\n\n\nSection 2 -- Scope.\n\n  a. License grant.\n\n       1. Subject to the terms and conditions of this Public License,\n          the Licensor hereby grants You a worldwide, royalty-free,\n          non-sublicensable, non-exclusive, irrevocable license to\n          exercise the Licensed Rights in the Licensed Material to:\n\n            a. reproduce and Share the Licensed Material, in whole or\n               in part, for NonCommercial purposes only; and\n\n            b. produce, reproduce, and Share Adapted Material for\n               NonCommercial purposes only.\n\n       2. Exceptions and Limitations. For the avoidance of doubt, where\n          Exceptions and Limitations apply to Your use, this Public\n          License does not apply, and You do not need to comply with\n          its terms and conditions.\n\n       3. Term. The term of this Public License is specified in Section\n          6(a).\n\n       4. Media and formats; technical modifications allowed. The\n          Licensor authorizes You to exercise the Licensed Rights in\n          all media and formats whether now known or hereafter created,\n          and to make technical modifications necessary to do so. The\n          Licensor waives and/or agrees not to assert any right or\n          authority to forbid You from making technical modifications\n          necessary to exercise the Licensed Rights, including\n          technical modifications necessary to circumvent Effective\n          Technological Measures. For purposes of this Public License,\n          simply making modifications authorized by this Section 2(a)\n          (4) never produces Adapted Material.\n\n       5. Downstream recipients.\n\n            a. Offer from the Licensor -- Licensed Material. Every\n               recipient of the Licensed Material automatically\n               receives an offer from the Licensor to exercise the\n               Licensed Rights under the terms and conditions of this\n               Public License.\n\n            b. Additional offer from the Licensor -- Adapted Material.\n               Every recipient of Adapted Material from You\n               automatically receives an offer from the Licensor to\n               exercise the Licensed Rights in the Adapted Material\n               under the conditions of the Adapter's License You apply.\n\n            c. No downstream restrictions. You may not offer or impose\n               any additional or different terms or conditions on, or\n               apply any Effective Technological Measures to, the\n               Licensed Material if doing so restricts exercise of the\n               Licensed Rights by any recipient of the Licensed\n               Material.\n\n       6. No endorsement. Nothing in this Public License constitutes or\n          may be construed as permission to assert or imply that You\n          are, or that Your use of the Licensed Material is, connected\n          with, or sponsored, endorsed, or granted official status by,\n          the Licensor or others designated to receive attribution as\n          provided in Section 3(a)(1)(A)(i).\n\n  b. Other rights.\n\n       1. Moral rights, such as the right of integrity, are not\n          licensed under this Public License, nor are publicity,\n          privacy, and/or other similar personality rights; however, to\n          the extent possible, the Licensor waives and/or agrees not to\n          assert any such rights held by the Licensor to the limited\n          extent necessary to allow You to exercise the Licensed\n          Rights, but not otherwise.\n\n       2. Patent and trademark rights are not licensed under this\n          Public License.\n\n       3. To the extent possible, the Licensor waives any right to\n          collect royalties from You for the exercise of the Licensed\n          Rights, whether directly or through a collecting society\n          under any voluntary or waivable statutory or compulsory\n          licensing scheme. In all other cases the Licensor expressly\n          reserves any right to collect such royalties, including when\n          the Licensed Material is used other than for NonCommercial\n          purposes.\n\n\nSection 3 -- License Conditions.\n\nYour exercise of the Licensed Rights is expressly made subject to the\nfollowing conditions.\n\n  a. Attribution.\n\n       1. If You Share the Licensed Material (including in modified\n          form), You must:\n\n            a. retain the following if it is supplied by the Licensor\n               with the Licensed Material:\n\n                 i. identification of the creator(s) of the Licensed\n                    Material and any others designated to receive\n                    attribution, in any reasonable manner requested by\n                    the Licensor (including by pseudonym if\n                    designated);\n\n                ii. a copyright notice;\n\n               iii. a notice that refers to this Public License;\n\n                iv. a notice that refers to the disclaimer of\n                    warranties;\n\n                 v. a URI or hyperlink to the Licensed Material to the\n                    extent reasonably practicable;\n\n            b. indicate if You modified the Licensed Material and\n               retain an indication of any previous modifications; and\n\n            c. indicate the Licensed Material is licensed under this\n               Public License, and include the text of, or the URI or\n               hyperlink to, this Public License.\n\n       2. You may satisfy the conditions in Section 3(a)(1) in any\n          reasonable manner based on the medium, means, and context in\n          which You Share the Licensed Material. For example, it may be\n          reasonable to satisfy the conditions by providing a URI or\n          hyperlink to a resource that includes the required\n          information.\n       3. If requested by the Licensor, You must remove any of the\n          information required by Section 3(a)(1)(A) to the extent\n          reasonably practicable.\n\n  b. ShareAlike.\n\n     In addition to the conditions in Section 3(a), if You Share\n     Adapted Material You produce, the following conditions also apply.\n\n       1. The Adapter's License You apply must be a Creative Commons\n          license with the same License Elements, this version or\n          later, or a BY-NC-SA Compatible License.\n\n       2. You must include the text of, or the URI or hyperlink to, the\n          Adapter's License You apply. You may satisfy this condition\n          in any reasonable manner based on the medium, means, and\n          context in which You Share Adapted Material.\n\n       3. You may not offer or impose any additional or different terms\n          or conditions on, or apply any Effective Technological\n          Measures to, Adapted Material that restrict exercise of the\n          rights granted under the Adapter's License You apply.\n\n\nSection 4 -- Sui Generis Database Rights.\n\nWhere the Licensed Rights include Sui Generis Database Rights that\napply to Your use of the Licensed Material:\n\n  a. for the avoidance of doubt, Section 2(a)(1) grants You the right\n     to extract, reuse, reproduce, and Share all or a substantial\n     portion of the contents of the database for NonCommercial purposes\n     only;\n\n  b. if You include all or a substantial portion of the database\n     contents in a database in which You have Sui Generis Database\n     Rights, then the database in which You have Sui Generis Database\n     Rights (but not its individual contents) is Adapted Material,\n     including for purposes of Section 3(b); and\n\n  c. You must comply with the conditions in Section 3(a) if You Share\n     all or a substantial portion of the contents of the database.\n\nFor the avoidance of doubt, this Section 4 supplements and does not\nreplace Your obligations under this Public License where the Licensed\nRights include other Copyright and Similar Rights.\n\n\nSection 5 -- Disclaimer of Warranties and Limitation of Liability.\n\n  a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE\n     EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS\n     AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF\n     ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,\n     IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,\n     WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR\n     PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,\n     ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT\n     KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT\n     ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.\n\n  b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE\n     TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,\n     NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,\n     INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,\n     COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR\n     USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN\n     ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR\n     DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR\n     IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.\n\n  c. The disclaimer of warranties and limitation of liability provided\n     above shall be interpreted in a manner that, to the extent\n     possible, most closely approximates an absolute disclaimer and\n     waiver of all liability.\n\n\nSection 6 -- Term and Termination.\n\n  a. This Public License applies for the term of the Copyright and\n     Similar Rights licensed here. However, if You fail to comply with\n     this Public License, then Your rights under this Public License\n     terminate automatically.\n\n  b. Where Your right to use the Licensed Material has terminated under\n     Section 6(a), it reinstates:\n\n       1. automatically as of the date the violation is cured, provided\n          it is cured within 30 days of Your discovery of the\n          violation; or\n\n       2. upon express reinstatement by the Licensor.\n\n     For the avoidance of doubt, this Section 6(b) does not affect any\n     right the Licensor may have to seek remedies for Your violations\n     of this Public License.\n\n  c. For the avoidance of doubt, the Licensor may also offer the\n     Licensed Material under separate terms or conditions or stop\n     distributing the Licensed Material at any time; however, doing so\n     will not terminate this Public License.\n\n  d. Sections 1, 5, 6, 7, and 8 survive termination of this Public\n     License.\n\n\nSection 7 -- Other Terms and Conditions.\n\n  a. The Licensor shall not be bound by any additional or different\n     terms or conditions communicated by You unless expressly agreed.\n\n  b. Any arrangements, understandings, or agreements regarding the\n     Licensed Material not stated herein are separate from and\n     independent of the terms and conditions of this Public License.\n\n\nSection 8 -- Interpretation.\n\n  a. For the avoidance of doubt, this Public License does not, and\n     shall not be interpreted to, reduce, limit, restrict, or impose\n     conditions on any use of the Licensed Material that could lawfully\n     be made without permission under this Public License.\n\n  b. To the extent possible, if any provision of this Public License is\n     deemed unenforceable, it shall be automatically reformed to the\n     minimum extent necessary to make it enforceable. If the provision\n     cannot be reformed, it shall be severed from this Public License\n     without affecting the enforceability of the remaining terms and\n     conditions.\n\n  c. No term or condition of this Public License will be waived and no\n     failure to comply consented to unless expressly agreed to by the\n     Licensor.\n\n  d. Nothing in this Public License constitutes or may be interpreted\n     as a limitation upon, or waiver of, any privileges and immunities\n     that apply to the Licensor or You, including from the legal\n     processes of any jurisdiction or authority.\n\n=======================================================================\n\nCreative Commons is not a party to its public\nlicenses. Notwithstanding, Creative Commons may elect to apply one of\nits public licenses to material it publishes and in those instances\nwill be considered the “Licensor.” The text of the Creative Commons\npublic licenses is dedicated to the public domain under the CC0 Public\nDomain Dedication. Except for the limited purpose of indicating that\nmaterial is shared under a Creative Commons public license or as\notherwise permitted by the Creative Commons policies published at\ncreativecommons.org/policies, Creative Commons does not authorize the\nuse of the trademark \"Creative Commons\" or any other trademark or logo\nof Creative Commons without its prior written consent including,\nwithout limitation, in connection with any unauthorized modifications\nto any of its public licenses or any other arrangements,\nunderstandings, or agreements concerning use of licensed material. For\nthe avoidance of doubt, this paragraph does not form part of the\npublic licenses.\n\nCreative Commons may be contacted at creativecommons.org.\n"
  },
  {
    "path": "README.md",
    "content": "# Hacker101\n\n[Hacker101](https://www.hacker101.com/) is a free class for web security.\nWhether you're a programmer with an interest in bug bounties or a seasoned\nsecurity professional, Hacker101 has something to teach you.\n\n## Getting Started\n\n### Prerequisites\n\n- Ruby\n  - Suggestion: use [`rbenv`](https://github.com/rbenv/rbenv)\n- `bundler`\n  - Run `gem install bundler`, if needed\n\n### Installing\n\nClone this repo:\n\n```\ngit clone https://github.com/Hacker0x01/hacker101.git\n```\n\nIn the project directory, run:\n\n```\nbundle install\n```\n\nBuild the site and spin up the server:\n\n```\nbundle exec jekyll serve\n```\n\nBrowse to [http://localhost:4000](http://localhost:4000)\n\n\n## Contributing\n\nIssues and pull requests are welcome on [GitHub](\nhttps://github.com/Hacker0x01/hacker101)!\n"
  },
  {
    "path": "_config.yml",
    "content": "title: Hacker101\nemail: support@hackerone.com\ndescription: >-\n  Hacker101 is a free class for web security. Whether you're a programmer with\n  an interest in bug bounties or a seasoned security professional, Hacker101\n  has something to teach you.\nauthor:\n  name: HackerOne\n  twitter: Hacker0x01\ngoogle_analytics: UA-49905813-8\nmarkdown: kramdown\nurl: https://www.hacker101.com\ntwitter:\n  username: Hacker0x01\nfacebook:\n  app_id: 345444188982280\ngithub:\n  username: Hacker0x01\nsocial:\n  links:\n    - https://twitter.com/Hacker0x01\n    - https://www.facebook.com/Hacker0x01\n    - https://www.linkedin.com/company/hackerone\n    - https://github.com/Hacker0x01\n\nplugins:\n  - jekyll-redirect-from\n  - jekyll-seo-tag\n  - jekyll-sitemap\n\n# A list of the pages to display in the navigation bar\nheader_pages:\n\ncollections:\n  resources:\n\nexclude:\n  [\n    .bundle,\n    .gitignore,\n    CNAME,\n    Gemfile,\n    Gemfile.lock,\n    LICENSE,\n    node_modules,\n    README.md,\n    update_bootstrap.sh,\n    vendor,\n  ]\n\n\n"
  },
  {
    "path": "_includes/footer.html",
    "content": "<footer class=\"flex-shrink-0 bg-dark py-3\">\n  <div class=\"container d-flex justify-content-between\">\n    <a href=\"https://www.hackerone.com/start-hacking\" class=\"text-light d-flex align-items-center\">\n      <img src=\"/assets/logo_h1.png\" alt=\"Start hacking on HackerOne\" width=\"16\" height=\"30\" class=\"mr-3\">\n      Powered by HackerOne\n    </a>\n    <div>\n      <a href=\"{{ site.github.repository_url }}/edit/master/{{ page.path }}\"\n        class=\"text-light mr-2 d-none d-md-inline\">\n        Edit this page\n      </a>\n      <a href=\"{{ site.github.repository_url }}\">\n        <img src=\"/assets/github.png\" alt=\"Contribute on GitHub\" width=\"30\" height=\"30\" class=\"mr-3\">\n      </a>\n      <a href=\"https://twitter.com/Hacker0x01\">\n        <img src=\"/assets/twitter.png\" alt=\"Follow us on Twitter\" width=\"30\" height=\"30\">\n      </a>\n    </div>\n  </div>\n</footer>\n"
  },
  {
    "path": "_includes/head.html",
    "content": "<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, user-scalable=yes, initial-scale=1\">\n  <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n  {%- seo -%}\n  <link rel=\"icon\" type=\"image/png\" href=\"{{ \"/assets/images/favicon.png\" | relative_url }}\" />\n  <link rel=\"stylesheet\" href=\"{{ \"/assets/css/main.css\" | relative_url }}\">\n  <link rel=\"preload\" href=\"{{ \"/assets/fonts/effra-light.woff\" | relative_url }}\" as=\"font\" type=\"font/woff\" crossorigin>\n  <link rel=\"preload\" href=\"{{ \"/assets/fonts/effra-regular.woff\" | relative_url }}\" as=\"font\" type=\"font/woff\" crossorigin>\n  <link rel=\"preload\" href=\"{{ \"/assets/fonts/effra-medium.woff\" | relative_url }}\" as=\"font\" type=\"font/woff\" crossorigin>\n  <script src=\"{{ \"/assets/javascript/bootstrap/jquery.min.js\" | relative_url }}\"></script>\n  <script src=\"{{ \"/assets/javascript/bootstrap/bootstrap.bundle.min.js\" | relative_url }}\"></script>\n</head>\n"
  },
  {
    "path": "_includes/header.html",
    "content": "<header class=\"flex-shrink-0\">\n  <nav class=\"navbar navbar-expand-lg navbar-dark bg-dark\">\n    <div class=\"container\">\n      <a href=\"{{ \"/\" | relative_url }}\" class=\"navbar-brand\" rel=\"author\">\n        <img src=\"/assets/Hacker101_logo.png\" alt=\"View Hacker101 homepage\" height=\"30\">\n      </a>\n\n      {%- assign page_paths = site.header_pages -%}\n\n      <button class=\"navbar-toggler p-0 border-0\" type=\"button\" data-toggle=\"collapse\" data-target=\"#navbarSupportedContent\"\n        aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n        <ul class=\"navbar-nav mr-auto\">\n          <li class=\"nav-item\">\n            <a href=\"{{ \"/start-here\" | relative_url }}\" class=\"nav-link text-light\">\n              Getting Started\n            </a>\n          </li>\n          <li class=\"nav-item\">\n            <a href=\"{{ \"/videos\" | relative_url }}\" class=\"nav-link text-light\">\n              Videos\n            </a>\n          </li>\n          <li class=\"nav-item\">\n            <a href=\"https://ctf.hacker101.com/\" target=\"_blank\" class=\"nav-link text-light\">\n              CTF\n            </a>\n          </li>\n          <li class=\"nav-item\">\n            <a href=\"{{ \"/resources\" | relative_url }}\" class=\"nav-link text-light\">\n              Resources\n            </a>\n          </li>\n          <li class=\"nav-item\">\n            <a href=\"{{ \"/discord\" | relative_url }}\" class=\"nav-link text-light\">\n              Discord\n            </a>\n          </li>\n        </ul>\n        <ul class=\"navbar-nav ml-auto\">\n          <a href=\"#\" id=\"mode-light\" title=\"Toggle dark mode\" class=\"mode-toggle d-none\">\n            <img src=\"/assets/images/icons/dark-mode.svg\" alt=\"Toggle dark mode\" width=\"20\" height=\"20\"/>\n          </a>\n          <a href=\"#\" id=\"mode-dark\" title=\"Toggle light mode\" class=\"mode-toggle\">\n            <img src=\"/assets/images/icons/light-mode.svg\" alt=\"Toggle light mode\" width=\"20\" height=\"20\"/>\n          </a>\n        </ul>\n      </div>\n    </div>\n  </nav>\n</header>\n"
  },
  {
    "path": "_includes/resources_sidebar.html",
    "content": "<ul>\n  {% for resource in site.resources %}\n    <li>\n      <a href=\"/resources#{{ resource.title | url_encode }}\">{{ resource.title }}</a>\n    </li>\n  {% endfor %}\n</ul>\n"
  },
  {
    "path": "_layouts/default.html",
    "content": "<!DOCTYPE html>\n<html class=\"bg-dark\" lang=\"{{ page.lang | default: site.lang | default: \"en\" }}\">\n\n  {%- include head.html -%}\n\n  <body class=\"d-flex flex-column vh-100\">\n\n    {%- include header.html -%}\n\n    <main role=\"main\" class=\"flex-grow-1 bg-black text-light\">\n      {{ content }}\n    </main>\n\n    {%- include footer.html -%}\n\n    <script async src=\"https://www.googletagmanager.com/gtag/js?id={{ site.google_analytics }}\"></script>\n    <script>\n      window.dataLayer = window.dataLayer || [];\n      function gtag(){dataLayer.push(arguments);}\n      gtag('js', new Date());\n\n      gtag('config', '{{ site.google_analytics }}');\n    </script>\n    <script async src=\"/assets/javascript/dark-mode.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "_layouts/home.html",
    "content": "---\nlayout: default\n---\n\n<div>\n\n  {%- if page.title -%}\n  <header>\n    <h1>{{ page.title }}</h1>\n  </header>\n  {%- endif -%}\n\n  <section>\n    {{ content }}\n  </section>\n\n  {%- if site.posts.size > 0 -%}\n    <p class=\"h4\">{{ page.list_title | default: \"Posts\" }}</p>\n    <ul class=\"list-unstyled\">\n      {%- for post in site.posts -%}\n      <li>\n        <span class=\"text-muted\">\n          {%- assign date_format = \"%b %-d, %Y\" -%}\n          {{ post.date | date: date_format }}\n        </span>\n        <p class=\"h5\">\n          <a href=\"{{ post.url | relative_url }}\">\n            {{ post.title | escape }}\n          </a>\n        </p>\n        {%- if site.show_excerpts -%}\n          {{ post.excerpt }}\n        {%- endif -%}\n      </li>\n      {%- endfor -%}\n    </ul>\n\n    <p class=\"rss-subscribe\">subscribe <a href=\"{{ \"/feed.xml\" | relative_url }}\">via RSS</a></p>\n  {%- endif -%}\n\n</div>\n"
  },
  {
    "path": "_layouts/page.html",
    "content": "---\nlayout: default\n---\n\n<div class=\"container py-4\">\n  <div class=\"row\">\n    <div class=\"col-lg-8\">\n      <article>\n        {%- if page.title -%}\n          <div class=\"row\">\n            <header class=\"col-md-12 mb-4\">\n              <h1 class=\"text-uppercase\">{{ page.title | escape }}</h1>\n              <span class=\"h3 font-weight-light text-uppercase\">{{ page.subtitle | escape }}</span>\n            </header>\n          </div>\n        {%- endif -%}\n\n        <section>\n          {{ content }}\n        </section>\n\n        {% if page.video_src %}\n          <h2 id=\"video\">Video</h2>\n          <div class=\"embed-responsive embed-responsive-16by9\">\n            {% if page.video_src contains \"?\" %}\n              {% assign symbol = \"&\" %}\n            {% else %}\n              {% assign symbol = \"?\" %}\n            {% endif %}\n            <iframe\n              id=\"ytplayer\"\n              type=\"text/html\"\n              src=\"{{ page.video_src }}{{ symbol }}rel=0&autoplay=0&origin={{ site.url }}\"\n              frameborder=\"0\"\n              allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\"\n              allowfullscreen\n            ></iframe>\n          </div>\n        {% endif %}\n        {% if page.previous_url or page.next_url %}\n          <hr />\n          {% if page.cta_description %}\n            <div class=\"mb-3\">\n              {{ page.cta_description }}\n            </div>\n          {% endif %}\n          {% if page.previous_url %}\n            <a href=\"{{ page.previous_url }}\" class=\"btn btn-outline-primary float-left\">\n              {{ page.previous_text | default: \"Previous video\" }}\n            </a>\n          {% endif %}\n          {% if page.next_url %}\n            <a href=\"{{ page.next_url }}\" class=\"btn btn-primary float-right\">\n              {{ page.next_text | default: \"Next video\" }}\n            </a>\n          {% endif %}\n        {% endif %}\n      </article>\n    </div>\n    {% if page.sidebar %}\n      <div class=\"col-lg-4\" id=\"sidebar\">\n        <section>\n          {% for section in page.sidebar %}\n            {% if section.title %}\n              <div class=\"h5\">{{ section.title }}</div>\n            {% endif %}\n            {% if section.subtitle %}\n              <div class=\"h6\">{{ section.subtitle }}</div>\n            {% endif %}\n            {% if section.links %}\n              <ul>\n                {% for link in section.links %}\n                <li>\n                  <a href={{ link.url }}>{{ link.text }}</a>\n                  {% if link.updated %}\n                    <span class=\"badge badge-pill badge-secondary\">Updated!</span>\n                  {% endif %}\n                </li>\n                {% endfor %}\n              </ul>\n            {% endif %}\n            {% if section.resources %}\n              {% include resources_sidebar.html %}\n            {% endif %}\n          {% endfor %}\n        </section>\n      </div>\n    {% endif %}\n  </div>\n</div>\n"
  },
  {
    "path": "_layouts/post.html",
    "content": "---\nlayout: default\n---\n<article>\n\n  <header>\n    <h1>{{ page.title | escape }}</h1>\n    <p class=\"text-muted\">\n      <time datetime=\"{{ page.date | date_to_xmlschema }}\">\n        {%- assign date_format = \"%b %-d, %Y\" -%}\n        {{ page.date | date: date_format }}\n      </time>\n      {%- if page.author -%}\n        • {{ page.author }}\n      {%- endif -%}\n    </p>\n  </header>\n\n  <section>\n    {{ content }}\n  </section>\n\n</article>\n"
  },
  {
    "path": "_resources/00_what_is_hacker101.md",
    "content": "---\ntitle: What is Hacker101?\n---\n\nHacker101 is a free educational resource developed by [HackerOne](https://www.hackerone.com/) to grow and empower the hacker community at large.  We have video lessons and curated resources to help you learn the concepts of hacking and a <a href=\"https://ctf.hacker101.com/\" target=\"_blank\">Capture the Flag</a> where you can turn that theory into practice.\n"
  },
  {
    "path": "_resources/01_what_is_hacker101_ctf.md",
    "content": "---\ntitle: What is the Hacker101 CTF?\n---\n\nThe <a href=\"https://ctf.hacker101.com/\" target=\"_blank\">Hacker101 CTF</a> -- or Capture the Flag -- is a game where you hack through levels to find bits of data called flags.  These flags mark your progress and allow you to receive invitations to private programs on [HackerOne](https://www.hackerone.com/), where you can use your newly-learned skills.\n"
  },
  {
    "path": "_resources/02_how_do_i_start.md",
    "content": "---\ntitle: I'm new to all of this; how do I get started?\n---\n\nCongratulations on taking the first step to becoming a hacker! We recommend starting with our [Hacker101 for Newcomers](/playlists/newcomers) and [Burp Suite](/playlists/burp_suite) playlists. Once you've completed that, start working through the <a href=\"https://ctf.hacker101.com/\" target=\"_blank\">Hacker101 CTF</a> and watching the other [video lessons](/videos) as you need them. While there are no prerequisites for Hacker101, strictly speaking, there are things you can learn to accelerate your hacking education. Note that you don't need to know all of this -- or any -- to get started. Here's a curated list of resources:\n\n* Programming\n    * [JavaScript](https://javascript.info/): This is the language used on the majority of web pages. Understanding it is useful for bug hunting because many bugs actually stem from JS code.\n    * [Python](https://docs.python.org/3/tutorial/): Commonly used for automating various activities during testing, as well as being useful for general programming.\n    * [SQL](https://sqlbolt.com/): Used by most applications for accessing and manipulating data. Knowledge of SQL will help in discovering and exploiting critical SQL Injection vulnerabilities.\n\n* Networking\n    * [Terminology guide](https://www.digitalocean.com/community/tutorials/an-introduction-to-networking-terminology-interfaces-and-protocols): You'll hear many terms from IP address to port to DNS. This guide will help you understand that.\n    * [Common Port Numbers](https://www.utilizewindows.com/list-of-common-network-port-numbers/): A useful list of common port numbers and the associated services.\n\n* Linux\n    * [Setting up your own web server](https://www.linux.com/training-tutorials/easy-lamp-server-installation): While not security-related in itself, this will teach you many of the commands and concepts you need to know to become a great hacker.\n    * [Setting up Kali Linux on Virtualbox](https://linuxconfig.org/how-to-install-kali-linux-on-virtualbox): Kali is a hacking-oriented Linux distribution, used by many bug hunters. This guide will help you set it up in a virtual machine.\n    * [Command Line Guide](https://lifehacker.com/a-command-line-primer-for-beginners-5633909?IR=T): You'll end up using many command-line tools as a hacker, so a familiarity with its structure and use is valuable.\n"
  },
  {
    "path": "_resources/03_how_do_i_do_bug_bounties.md",
    "content": "---\ntitle: I've been hacking for a while now; how do I get into bug bounties?\n---\n\nWe recommend <a href=\"https://hackerone.com/users/sign_up\" target=\"_blank\">signing up</a> for a HackerOne account and checking out our extensive programs. Additionally, you can earn invitations to private programs on HackerOne via the <a href=\"https://ctf.hacker101.com/\" target=\"_blank\">Hacker101 CTF</a>. This gets you into programs with fewer hackers, often making it easier to find interesting and impactful bugs.\n"
  },
  {
    "path": "_resources/04_programming_languages.md",
    "content": "---\ntitle: Programming languages\n---\n\nProgramming is an important part of being a successful hacker. This isn't a comprehensive list of programming languages and nearly any can be used for most hacking tasks, especially on the web, but rather a list of languages we find especially useful or notable.\n\n* Python and Ruby: Useful for automation and quick testing and analysis, particularly for web hacking.\n* JavaScript: Can be used for the same tasks as Python and Ruby (albeit with fewer relevant libraries), but mostly useful to know for analysis of code on the web, as well as exploitation.\n* Objective-C and Swift: The ability to read these will be essential if you plan to do source code review of iOS applications.\n* Java and Kotlin: The ability to read these will be essential if you plan to do source code review of Android applications. Java is produced by decompilers for Android applications, which allows you to read code (roughly) equivalent to the original source, even when you only have a compiled application.\n* AArch64 assembly: For advanced embedded and mobile hacking, understanding the very lowest level of abstraction is essential.\n"
  },
  {
    "path": "_resources/05_web_hacking_tools.md",
    "content": "---\ntitle: Web hacking tools\n---\n\nThis is a curated list of web hacking tools and is not intended to be comprehensive; rather, we want to highlight the tools we find especially useful.\n\n* [Altdns](https://github.com/infosec-au/altdns): Altdns is a DNS recon tool that allows for the discovery of subdomains that conform to patterns. Altdns takes in words that could be present in subdomains under a domain (such as test, dev, staging), as well as a list of known subdomains.\n* [Amass](https://github.com/OWASP/Amass): The OWASP Amass Project performs network mapping of attack surfaces and external asset discovery using open source information gathering and active reconnaissance techniques.\n* [Aquatone](https://github.com/michenriksen/aquatone): Aquatone is a tool for visual inspection of websites across a large number of hosts, which provides a convenient overview of HTTP-based attack surface.\n* [BBHT](https://github.com/nahamsec/bbht): Bug Bounty Hunting Tools is a script to install the most popular tools used while looking for vulnerabilities for a bug bounty program.\n* [Burp Suite](https://portswigger.net/burp): This is the most popular proxy in web hacking circles due to its cross-platform nature and extensive featureset. See [our playlist](/playlists/burp_suite) to make the most of it. Also see our \"Burp Suite Plugins\" list for useful plugins to use.\n* [chaos](https://chaos.projectdiscovery.io): Chaos actively scans and maintains internet-wide assets' data. This project is meant to enhance research and analyze changes around DNS for better insights.\n* [Commit-stream](https://github.com/x1sec/commit-stream): Commit-stream extracts commit logs from the Github event API,  exposing the author details (name and email address) associated with Github repositories in real time.\n* [Dirb](https://github.com/v0re/dirb): DIRB is a web content scanner. It launches a dictionary based attack against a web server and analyzes the response.\n* [Dirsearch](https://github.com/maurosoria/dirsearch): a simple command line tool designed to brute force directories and files in websites.\n* [Dngrep](https://github.com/erbbysam/DNSGrep): A utility for quickly searching presorted DNS names. Built around the Rapid7 rdns & fdns dataset.\n* [Dnscan](https://github.com/rbsec/dnscan): dnscan is a python wordlist-based DNS subdomain scanner\n* [Dnsgen](https://github.com/ProjectAnte/dnsgen): This tool generates a combination of domain names from the provided input. Combinations are created based on wordlist. Custom words are extracted per execution.\n* [Dnsprobe](https://github.com/projectdiscovery/dnsprobe): DNSProbe is a tool built on top of retryabledns that allows you to perform multiple dns queries of your choice with a list of user supplied resolvers.\n* [EyeWitnees](https://github.com/FortyNorthSecurity/EyeWitness): EyeWitness is designed to take screenshots of websites, provide some server header info, and identify any default credentials. EyeWitness is designed to run on Kali Linux. It will auto detect the file you give it with the -f flag as either being a text file with URLs on each new line, nmap xml output, or nessus xml output. The --timeout flag is completely optional, and lets you provide the max time to wait when trying to render and screenshot a web page.\n* [Ffuf](https://github.com/ffuf/ffuf): A fast web fuzzer written in Go.\n* [Findomain](https://github.com/Findomain/Findomain): Findomain offers a dedicated monitoring service hosted in Amazon (only the local version is free), that allows you to monitor your target domains and send alerts to Discord and Slack webhooks or Telegram chats when new subdomains are found.\n* [Gau](https://github.com/lc/gau): getallurls (gau) fetches known URLs from AlienVault's Open Threat Exchange, the Wayback Machine, and Common Crawl for any given domain. Inspired by Tomnomnom's waybackurls.\n* [gitGraber](https://github.com/hisxo/gitGraber): gitGraber is a tool developed in Python3 to monitor GitHub to search and find sensitive data in real time for different online services.\n* [Httprobe](https://github.com/tomnomnom/httprobe): Takes a list of domains and probes for working http and https servers.\n* [Jok3r](https://hub.docker.com/r/koutto/jok3r/): Jok3r is a framework that helps penetration testers with network infrastructure and web security assessments. Its goal is to automate as much as possible in order to quickly identify and exploit \"low-hanging fruit\" and \"quick win\" vulnerabilities on most common TCP/UDP services and most common web technologies (servers, CMS, languages...).\n* [JSParser](https://github.com/nahamsec/JSParser): A python 2.7 script using Tornado and JSBeautifier to parse relative URLs from JavaScript files. This is especially useful for discovering AJAX requests when performing security research or bug bounty hunting.\n* [Knockpy](https://github.com/guelfoweb/knock): Knockpy is a python tool designed to enumerate subdomains on a target domain through a word list. It is designed to scan for a DNS zone transfer and bypass the wildcard DNS record automatically, if it is enabled. Knockpy now supports queries to VirusTotal subdomains, you can set the API_KEY within the config.json file.\n* [lazyrecon](https://github.com/nahamsec/lazyrecon): This is an assembled collection of tools for performing recon.\n* [lazys3](https://github.com/nahamsec/lazys3): A Ruby script to brute-force for AWS s3 buckets using different permutations.\n* [Masscan](https://github.com/robertdavidgraham/masscan): This is an Internet-scale port scanner. It can scan the entire Internet in under 6 minutes, transmitting 10 million packets per second, all from a single machine.\n* [Massdns](https://github.com/blechschmidt/massdns): MassDNS is a simple high-performance DNS stub resolver targeting those who seek to resolve a massive amount of domain names in the order of millions or even billions. Without special configuration, MassDNS is capable of resolving over 350,000 names per second using publicly available resolvers.\n* [Meg](https://github.com/tomnomnom/meg): Meg is a tool for fetching lots of URLs without taking a toll on the servers. It can be used to fetch many paths for many hosts, or fetching a single path for all hosts before moving on to the next path and repeating.\n* [mitmproxy](https://mitmproxy.org/): This is an open-source proxy written in Python. Not recommended for beginners, but this can be a powerful tool.\n* [Naabu](https://github.com/projectdiscovery/naabu): naabu is a port scanning tool written in Go that allows you to enumerate valid ports for hosts in a fast and reliable manner. It is a really simple tool that does fast SYN scans on the host/list of hosts and lists all ports that return a reply.\n* [Nikto2](https://cirt.net/Nikto2): Like DirBuster, but also does some basic checks for known vulnerabilities.\n* [Nuclei](https://github.com/projectdiscovery/nuclei): Nuclei is a fast tool for configurable targeted scanning based on templates offering massive extensibility and ease of use.\n* [OWASP Zed](https://www.zaproxy.org/): OWASP Zed Attack Proxy (ZAP) is an open source tool which is offered by OWASP (Open Web Application Security Project), for penetration testing of your website/web application. It helps you find the security vulnerabilities in your application.\n* [Recon_profile](https://github.com/nahamsec/recon_profile): This tool is to help create easy aliases to run via an SSH/terminal. \n* [Recon-ng](https://github.com/lanmaster53/recon-ng): Recon-ng is a full-featured reconnaissance framework designed with the goal of providing a powerful environment to conduct open source, web-based reconnaissance quickly and thoroughly.\n* [Shhgit](https://github.com/eth0izzle/shhgit): Shhgit finds secrets and sensitive files across GitHub code and Gists committed in nearly real-time by listening to the GitHub Events API.\n* [Shuffledns](https://github.com/projectdiscovery/shuffledns): shuffleDNS is a wrapper around massdns written in go that allows you to enumerate valid subdomains using active bruteforce, as well as resolve subdomains with wildcard handling and easy input-output support.\n* [sqlmap](https://sqlmap.org/): This allows for easy discovery and exploitation of SQL injection vulnerabilities. It **will not** catch every bug or even be able to exploit some known SQLi bugs. What it will do is make your life much easier in the 80% of cases it will work for.\n* [SSL Labs Server Test](https://www.ssllabs.com/ssltest/): This is an easy to use webapp for testing the SSL configuration of web servers.\n* [Subfinder](https://github.com/projectdiscovery/subfinder): subfinder is a subdomain discovery tool that discovers valid subdomains for websites by using passive online sources. It has a simple modular architecture and is optimized for speed. subfinder is built for doing one thing only - passive subdomain enumeration, and it does that very well.\n* [Subjack](https://github.com/haccer/subjack): Subjack is a Subdomain Takeover tool written in Go designed to scan a list of subdomains concurrently and identify ones that are able to be hijacked. With Go's speed and efficiency, this tool really stands out when it comes to mass-testing. Always double check the results manually to rule out false positives.\n* [Sublert](https://github.com/yassineaboukir/sublert): Sublert is a security and reconnaissance tool that was written in Python to leverage certificate transparency for the sole purpose of monitoring new subdomains deployed by specific organizations and an issued TLS/SSL certificate. The tool is supposed to be scheduled to run periodically at fixed times, dates, or intervals (Ideally each day). New identified subdomains will be sent to Slack workspace with a notification push. Furthermore, the tool performs DNS resolution to determine working subdomains.\n* [Sublist3r](https://github.com/aboul3la/Sublist3r): Sublist3r is a python tool designed to enumerate subdomains of websites using OSINT. It helps penetration testers and bug hunters collect and gather subdomains for the domain they are targeting. Sublist3r enumerates subdomains using many search engines such as Google, Yahoo, Bing, Baidu and Ask. Sublist3r also enumerates subdomains using Netcraft, Virustotal, ThreatCrowd, DNSdumpster and ReverseDNS.\n* [Teh_s3_bucketeers](https://github.com/tomdev/teh_s3_bucketeers): Teh_s3_bucketeers is a security tool to discover S3 buckets on Amazon's AWS platform.\n* [Unfurl](https://github.com/JLospinoso/unfurl): Unfurl is a tool that analyzes large collections of URLs and estimates their entropies to sift out URLs that might be vulnerable to attack.\n* [Virtual-host-discovery](https://github.com/jobertabma/virtual-host-discovery): This is a basic HTTP scanner that enumerates virtual hosts on a given IP address. During recon, this might help expand the target by detecting old or deprecated code. It may also reveal hidden hosts that are statically mapped in the developer's /etc/hosts file.\n* [Waybackurls](https://github.com/tomnomnom/waybackurls): Accept line-delimited domains on stdin, fetch known URLs from the Wayback Machine for \\*.domain and output them on stdout.\n* [Webscreenshot](https://github.com/maaaaz/webscreenshot): A simple script to screenshot a list of websites, based on the url-to-image PhantomJS script.\n* [Wfuzz](https://github.com/xmendez/wfuzz): Wfuzz has been created to facilitate the task in web applications assessments and it is based on a simple concept: it replaces any reference to the FUZZ keyword by the value of a given payload.\n* [Whatweb](https://github.com/urbanadventurer/WhatWeb): WhatWeb recognises web technologies including content management systems (CMS), blogging platforms, statistic/analytics packages, JavaScript libraries, web servers, and embedded devices. WhatWeb has over 1800 plugins, each to recognise something different. WhatWeb also identifies version numbers, email addresses, account IDs, web framework modules, SQL errors, and more.\n* [Wpscan](https://github.com/wpscanteam/wpscan): WPScan is a free (for non-commercial use) black box WordPress security scanner written for security professionals and bloggers to test the security of their sites.\n* [nmmapper](https://www.nmmapper.com/sys/tools/subdomainfinder/): A Collection of 8 subdomain finders hosted online for quick usage, this include, sublist3r, amass, findomain,knocky,anubis subdomain finder, dnscan, nmap subrute,lepu subdomain and even waybackurl.\n"
  },
  {
    "path": "_resources/06_burp_suite_plugins.md",
    "content": "---\ntitle: Burp Suite plugins\n---\n\n[Burp Suite](https://portswigger.net/burp): The quintessential web app hacking tool. Once you hit 500 reputation on HackerOne, you are eligible for a free 3-month license of Burp Suite Pro!\n\nThis is a curated list of Burp plugins and is not intended to be comprehensive; rather, we want to highlight the plugins we find especially useful.\n\n* [ActiveScan++](https://portswigger.net/bappstore/3123d5b5f25c4128894d97ea1acc4976): ActiveScan++ extends Burp Suite's active and passive scanning capabilities. Designed to add minimal network overhead, it identifies application behavior that may be of interest to advanced testers.\n* [Autorepeater Burp](https://github.com/nccgroup/AutoRepeater): Automated HTTP request repeating with Burp Suite.\n* [Autorize Burp](https://portswigger.net/bappstore/f9bbac8c4acf4aefa4d7dc92a991af2f): Autorize is an extension aimed at helping the penetration tester to detect authorization vulnerabilities —one of the more time-consuming tasks in a web application penetration test.\n* [BurpSentinel](https://github.com/dobin/BurpSentinel): With BurpSentinel it is possible for the penetration tester to quickly and easily send a lot of malicious requests to parameters of a HTTP request. Not only that, but it also shows a lot of information of the HTTP responses, corresponding to the attack requests. It's easy to find low-hanging fruit and hidden vulnerabilities like this, and it also allows the tester to focus on more important stuff!\n* [Flow](https://portswigger.net/bappstore/ee1c45f4cc084304b2af4b7e92c0a49d): This extension provides a Proxy history-like view along with search filter capabilities for all Burp tools.\n* [Headless Burp](https://portswigger.net/bappstore/d54b11f7af3c4dfeb6b81fb5db72e381): This extension allows you to run Burp Suite's Spider and Scanner tools in headless mode via the command-line.\n* [Logger++](https://portswigger.net/bappstore/470b7057b86f41c396a97903377f3d81): Logger++ is a multi-threaded logging extension for Burp Suite. In addition to logging requests and responses from all Burp Suite tools, the extension allows advanced filters to be defined to highlight interesting entries or filter logs to only those which match the filter.\n* [WSDL Wizard](https://portswigger.net/bappstore/ef2f3f1a593d417987bb2ddded760aee): This extension scans a target server for WSDL files. After performing normal mapping of an application's content, right click on the relevant target in the site map, and choose \"Scan for WSDL files\" from the context menu. The extension will search the already discovered contents for URLs with the .wsdl file extension, and guess the locations of any additional WSDL files based on the file names known to be in use. The results of the scanning appear within the extension's output tab in the Burp Extender tool.\n"
  },
  {
    "path": "_resources/07_mobile_hacking_tools.md",
    "content": "---\ntitle: Mobile hacking tools\n---\n\nThis is a curated list of mobile hacking tools and is not intended to be comprehensive; rather, we want to highlight the tools we find especially useful.\n\n* [dex2jar](https://github.com/pxb1988/dex2jar): Converts dex code (Android bytecode) into Java JAR files for manipulation or decompilation.\n* [dotPeek](https://www.jetbrains.com/decompiler/): A .NET decompiler, for use with Xamarin Android applications.\n* [Frida \"Universal\" SSL Unpinner](https://gist.github.com/teknogeek/4dc35fb3801bd7f13e5f0da5b784c725): Universal unpinner.\n* [Frida](https://frida.re/): This is an instrumentation system allowing injection of JavaScript or native libraries into arbitrary mobile applications on iOS and Android. In essence, it makes it painless to change, enhance, or disable functionality in applications.\n* [Genymotion](https://www.genymotion.com/): Cross-platform Android emulator for developers & QA engineers. Develop & automate your tests to deliver best quality apps.\n* [Jadx](https://github.com/skylot/jadx): Jadx is a dex to Java decompiler. The command line and GUI tools for producing Java source code from Android Dex and Apk files.\n* [JD-GUI](https://java-decompiler.github.io/): This is a Java decompiler, useful after dex2jar for easy analysis of Android apps.\n* [MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF): An automated, all-in-one mobile application (Android/iOS/Windows) pen-testing, malware analysis and security assessment framework capable of performing static and dynamic analysis.\n* [Online Decompiler](https://www.decompiler.com/): APK, JAR and .NET online decompiler.\n* [Radare2](https://rada.re/n/): A free/libre toolchain for easing several low level tasks, such as forensics, software reverse engineering, exploiting, debugging, etc. It is composed by a large number of libraries (which are extended with plugins) and programs that can be automated with almost any programming language.\n"
  },
  {
    "path": "_resources/08_android_hacking_tools.md",
    "content": "---\ntitle: Android hacking tools\n---\n\nThis is a curated list of Android hacking tools and is not intended to be comprehensive; rather, we want to highlight the tools we find especially useful.\n\n### Videos\n- [Hacker101 - Android Quickstart](https://www.youtube.com/watch?v=y0O3sCX9ftM)\n- [Hacker101 - Mobile Hacking Crash Course](https://www.youtube.com/watch?v=hKF89TXttnw)\n- [Hacker101: Common Android Bugs Pt. 1](https://www.youtube.com/watch?v=sQ_34dI_geU)\n- [Hacker101: Common Android Bugs Pt. 2](https://www.youtube.com/watch?v=tt1f4pcI0jo)\n- [Android Pentesting Video Playlist](https://www.youtube.com/playlist?list=PLgnrksnL_Rn09gGTTLgi-FL7HxPOoDk3R)\n- [Low Competition Bug Hunting (What to Learn) - ft. #AndroidHackingMonth](https://www.youtube.com/watch?v=Pkd_j31Jtfc)\n\n### Blog Posts\n- [#Androidhackingmonth: Introduction to Android Hacking by @0xteknogeek](https://www.hackerone.com/blog/androidhackingmonth-intro-to-android-hacking)\n- [QA with Android Hacker: Bagipro](https://www.hackerone.com/blog/AndroidHackingMonth-qa-with-bagipro)\n- [Hacking SMS API Service Provider of a Company - Android App Static Security Analysis](https://blog.securitybreached.org/2020/02/19/hacking-sms-api-service-provider-of-a-company-android-app-static-security-analysis-bug-bounty-poc/)\n- [Getting Started in Android Apps Pen-testing (Part-1)](https://blog.securitybreached.org/2020/03/17/getting-started-in-android-apps-pentesting/)\n\n### Example Reports\n- [Periscope android app deeplink leads to CSRF in follow action](https://hackerone.com/reports/583987)\n- [Twitter lite(Android): Vulnerable to local file steal, Javascript injection, Open redirect](https://hackerone.com/reports/499348)\n- [Golden techniques to bypass host validations in Android apps](https://hackerone.com/reports/431002)\n- [SQL Injection found in NextCloud Android App Content Provider](https://hackerone.com/reports/291764)\n- [Quora Android - Possible to steal arbitrary files from mobile device](https://hackerone.com/reports/258460)\n- [Opening arbitrary URLs/XSS in SAMLAuthActivity](https://hackerone.com/reports/283058)\n- [Access of Android protected components via embedded intent](https://hackerone.com/reports/200427)\n\n### Other Resources\n- [The Mobile Hacking CheatSheet](https://github.com/randorisec/MobileHackingCheatSheet)\n- [Mobile App Pentest Cheatsheet](https://github.com/tanprathan/MobileApp-Pentest-Cheatsheet)\n- [Awesome Mobile Security](https://github.com/vaib25vicky/awesome-mobile-security)\n- [Mobile Penetration Testing Kit](https://www.eshlomo.us/mobile-penetration-testing-kit/)\n- [Periscope android app deeplink leads to CSRF in follow action](https://hackerone.com/reports/583987)\n\n### Practice Labs\n- [Damn Insecure and vulnerable App for Android](https://github.com/payatu/diva-android)\n- [InjuredAndroid](https://github.com/B3nac/InjuredAndroid)\n- [Android-InsecureBankv2](https://github.com/dineshshetty/Android-InsecureBankv2)\n"
  },
  {
    "path": "_resources/09_desktop_hacking_tools.md",
    "content": "---\ntitle: Desktop / embedded hacking tools\n---\n\nThis is a curated list of hacking tools for native applications and embedded devices and is not intended to be comprehensive; rather, we want to highlight the tools we find especially useful.\n\n* [american fuzzy lop](https://lcamtuf.coredump.cx/afl/): AFL is an extremely powerful fuzzer, enabling detection of complicated bugs in many applications and libraries.\n* [Binary Ninja](https://binary.ninja/): Another low-cost alternative to IDA. Its API is perhaps the most powerful of the three for automating analysis of code.\n* [Binwalk](https://github.com/ReFirmLabs/binwalk): Used for firmware analysis and extraction. This is primarily useful for embedded Linux devices.\n* [dotPeek](https://www.jetbrains.com/decompiler/): A powerful decompiler for .NET assemblies.\n* [GNU strings](https://en.wikipedia.org/wiki/Strings_(Unix)): Finds strings in arbitrary binaries. While not strictly for reverse-engineering, it is among the most useful tools around.\n* [Hopper](https://www.hopperapp.com/): This is a fantastic, low-cost disassembler and decompiler that runs on macOS and Linux. While it's no replacement for IDA, it is a great choice for most applications.\n* [HxD](https://mh-nexus.de/en/hxd/) (Windows) [0xED](https://www.suavetech.com/0xed/) (macOS): These are graphical hex editors, useful for analysis and manipulation of files and block devices.\n* [IDA Pro and Hex-Rays Decompiler](https://hex-rays.com/ida-pro/): IDA is the absolute gold standard for disassemblers and its decompiler plugins are the gold standard for decompilation. It is a wonderful tool with support for nearly every obscure platform and an extensive (if confusing) SDK to add nearly any feature you can imagine. However, its price makes it difficult to justify.\n* [PE Explorer](http://www.heaventools.com/overview.htm): This is a great tool for analyzing the PE binaries used on Windows. It allows for exploration of the structures of the executable itself, as well as resources.\n* [PEiD](https://www.aldeid.com/wiki/PEiD): Tool for detecting cryptors, packers, and encryption routines in Windows PE binaries.\n* [QEMU](https://www.qemu.org/): An emulator and virtual machine supporting a large number of systems/architectures. This makes it useful for things like running embedded firmware, but also includes [debugging facilities](https://en.wikibooks.org/wiki/QEMU/Debugging_with_QEMU) that make it an optimal tool for hacking. Can be combined with AFL for fuzzing of binaries that aren't for your native architecture.\n* [Radare2](https://rada.re/n/radare2.html): This is a set of tools for doing analysis of binaries. It includes everything from disassembly to debugging and more.\n* [Unicorn Engine](https://www.unicorn-engine.org/): This is a library rather than a standalone tool, but it makes writing quick emulators a breeze. Particularly useful for reverse-engineering.\n"
  },
  {
    "path": "_resources/10_exploitation_resources.md",
    "content": "---\ntitle: Exploitation resources\n---\n\nThis is a curated list of exploitation resources and is not intended to be comprehensive; rather, we want to highlight the tools we find especially useful.\n\n* [NoSQLMap](https://github.com/codingo/NoSQLMap): NoSQLMap is an open source Python tool designed to audit for, as well as automate injection attacks, and exploit default configuration weaknesses in NoSQL databases and web applications using NoSQL to disclose or clone data from the database.\n* [Retire.JS](https://addons.mozilla.org/en-US/firefox/addon/retire-js/): Scanning website for vulnerable js libraries.\n* [Spiderfoot](https://github.com/smicallef/spiderfoot): SpiderFoot is an open source intelligence (OSINT) automation tool. It integrates with just about every data source available, and automates OSINT collection so that you can focus on data analysis.\n* [sqlmap](https://sqlmap.org/): sqlmap is an open source penetration testing tool that automates the process of detecting and exploiting SQL injection flaws and taking over database servers. It comes with a powerful detection engine, many niche features for the ultimate penetration tester, and a broad range of switches including: database fingerprinting, over data fetching from the database, accessing the underlying file system, and executing commands on the operating system via out-of-band connections.\n* [SQLNinja](http://sqlninja.sourceforge.net/): Sqlninja is a tool targeted to exploit SQL Injection vulnerabilities on a web application that uses Microsoft SQL Server as its back-end.\n* [SSRFTest](https://github.com/daeken/SSRFTest): SSRF testing tool.\n* [XSS Hunter](https://xsshunter.com/): XSS Hunter allows you to find all kinds of cross-site scripting vulnerabilities, including the often-missed blind XSS. The service works by hosting specialized XSS probes which, upon firing, scan the page and send information about the vulnerable page to the XSS Hunter service.\n* [Ysoserial](https://github.com/frohoff/ysoserial): A proof-of-concept tool for generating payloads that exploit unsafe Java object deserialization.\n"
  },
  {
    "path": "_resources/11_scanners_frameworks.md",
    "content": "---\ntitle: Scanners / frameworks\n---\n\nThis is a curated list of scanners and frameworks and is not intended to be comprehensive; rather, we want to highlight the tools we find especially useful.\n\n* [Canvas](https://www.immunityinc.com/products/canvas/): CANVAS offers hundreds of exploits, an automated exploitation system, and a comprehensive, reliable exploit development framework to penetration testers and security professionals worldwide.\n* [IronWASP](https://resources.infosecinstitute.com/topic/ironwasp-part-1-2): IronWASP (Iron Web Application Advanced Security testing Platform) is an open source tool used for web application vulnerability testing. It is designed in such a way that users having the right knowledge can create their own scanners using this as a framework. IronWASP is built using Python and Ruby and users having knowledge of them would be able to make full use of the platform. However, IronWASP provides a lot of features that are simple to understand.\n* [Lazyrecon](https://github.com/nahamsec/lazyrecon): LazyRecon is a script written in Bash, intended to automate the tedious tasks of reconnaissance and information gathering. The information is organized in an html report at the end, which helps you identify next steps.\n* [Maltego](https://www.maltego.com/): Maltego is an open source intelligence (OSINT) and graphical link analysis tool for gathering and connecting information for investigative tasks.\n* [Metasploit](https://www.metasploit.com/): Metasploit is an open source penetration testing framework.\n* [Nikto](https://cirt.net/Nikto2): Nikto is an Open Source (GPL) web server scanner which performs comprehensive tests against web servers for multiple items, including over 6700 potentially dangerous files/programs, checks for outdated versions of over 1250 servers, and version specific problems on over 270 servers.\n* [Nmap](https://nmap.org/): Nmap (\"Network Mapper\") is a free and open source (license) utility for network discovery and security auditing.\n* [OpenVAS](https://www.openvas.org/): OpenVAS is a full-featured vulnerability scanner. Its capabilities include unauthenticated testing, authenticated testing, various high level and low level Internet and industrial protocols, performance tuning for large-scale scans and a powerful internal programming language to implement any type of vulnerability test.\n* [Osmedeus](https://github.com/j3ssie/Osmedeus): Osmedeus allows you to automatically run the collection of awesome tools for reconnaissance and vulnerability scanning against the target.\n* [Reconness](https://github.com/reconness/reconness): ReconNess helps you to run and keep all your #recon in the same place allowing you to focus only on the potentially vulnerable targets without distraction and without requiring a lot of bash skill, or programming skill in general.\n* [Sn1per](https://github.com/1N3/Sn1per): Sn1per Community Edition is an automated scanner that can be used during a penetration test to enumerate and scan for vulnerabilities. Sn1per Professional is Xero Security's premium reporting addon for Professional Penetration Testers, Bug Bounty Researchers and Corporate Security teams to manage large environments and pentest scopes.\n* [Wapiti](https://wapiti.sourceforge.io/): Wapiti allows you to audit the security of your websites or web applications. It performs \"black-box\" scans (it does not study the source code) of the web application by crawling the web pages of the deployed webapp, looking for scripts and forms where it can inject data.\n"
  },
  {
    "path": "_resources/12_datasets_freemium_services.md",
    "content": "---\ntitle: Datasets / freemium services\n---\n\nThis is a curated list of datasets and freemium services and is not intended to be comprehensive; rather, we want to highlight the tools we find especially useful.\n\n* [C99.nl](https://api.c99.nl/): Subdomain Finder is a scanner that scans an entire domain to find as many subdomains as possible.\n* [Censys](https://censys.io/): Censys scans the most ports and houses the biggest certificate database in the world, and provides the most up-to-date,  thorough view of your known and unknown assets.\n* [Payloads All The Things](https://github.com/swisskyrepo/PayloadsAllTheThings): A list of useful payloads and bypasses for Web Application Security. Feel free to improve with your payloads and techniques.\n* [Rapid7 Forward DNS (FDNS)](https://opendata.rapid7.com/sonar.fdns_v2/): This dataset contains the responses to DNS requests for all forward DNS names known by Rapid7's Project Sonar.\n* [Seclists](https://github.com/danielmiessler/SecLists): SecLists is the security tester's companion. It's a collection of multiple types of lists used during security assessments, collected in one place. List types include usernames, passwords, URLs, sensitive data patterns, fuzzing payloads, web shells, and many more. The goal is to enable a security tester to pull this repository onto a new testing box and have access to every type of list that may be needed.\n* [Shodan](https://www.shodan.io/): Shodan provides a public API that allows other tools to access all of Shodan's data. Integrations are available for Nmap, Metasploit, Maltego, FOCA, Chrome, Firefox and many more.\n"
  },
  {
    "path": "_resources/13_misc_hacking_tools.md",
    "content": "---\ntitle: Miscellaneous hacking tools\n---\n\nThis is a curated list of miscellaneous hacking tools and is not intended to be comprehensive; rather, we want to highlight the tools we find especially useful.\n\n* [Altair](https://altair.sirmuel.design/): Altair GraphQL Client helps you debug GraphQL queries and implementations - taking care of the hard part so you can focus on actually getting things done.\n* [BuiltWith](https://addons.mozilla.org/en-US/firefox/addon/builtwith/): BuiltWith's goal is to help developers, researchers and designers find out what technologies web pages are using, which may help them decide what technologies to implement themselves.\n* [Ettercap](https://www.ettercap-project.org/): Ettercap is a comprehensive suite which features sniffing of live connections, content filtering, and support for active and passive dissection of many protocols, including multiple features for network and host analysis.\n* [Foxyproxy](https://addons.mozilla.org/en-US/firefox/addon/foxyproxy-standard/): FoxyProxy is an advanced proxy management tool that completely replaces Firefox's limited proxying capabilities. For a simpler tool and less advanced configuration options, please use FoxyProxy Basic.\n* [John the Ripper](https://www.openwall.com/john/): John the Ripper is free and Open Source software, distributed primarily in a source code form.\n* [Swiftness X](https://github.com/ehrishirajsharma/SwiftnessX): A note taking tool for BB and pentesting.\n* [THC Hydra](https://github.com/vanhauser-thc/thc-hydra): This tool is a proof-of-concept code, designed to give researchers and security consultants the possibility to show how easy it would be to gain unauthorized access from remote to a system.\n* [Transformations](https://transformations.jobertabma.nl/): Transformations makes it easier to detect common data obscurities, which may uncover security vulnerabilities or give insight into bypassing defenses.\n* [Wappalyzer](https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/): Wappalyzer is a browser extension that uncovers the technologies used on websites. It detects content management systems, eCommerce platforms, web servers, JavaScript frameworks, analytics tools and many more.\n* [Wireshark](https://www.wireshark.org/): Wireshark® is a network protocol analyzer that lets you capture and interactively browse the traffic running on a computer network. \n"
  },
  {
    "path": "_sass/_bootstrap_customization.scss",
    "content": "// Buttons\n\n@each $color, $value in $theme-colors {\n  .btn-#{$color} {\n    &:focus,\n    &.focus {\n      box-shadow: 0 0 $btn-focus-width rgba(theme-color($color), 0.85);\n    }\n\n    &:not(:disabled):not(.disabled):active,\n    &:not(:disabled):not(.disabled).active {\n      &:focus {\n        box-shadow: 0 0 $btn-focus-width rgba(theme-color($color), 0.85);\n      }\n    }\n  }\n}\n\n@each $color, $value in $theme-colors {\n  .btn-outline-#{$color} {\n    &:hover {\n      background: rgba(0, 0, 0, 0.02);\n      color: theme-color($color);\n    }\n\n    &:focus,\n    &.focus {\n      box-shadow: 0 0 $btn-focus-width rgba(theme-color($color), 0.85);\n    }\n\n    &:not(:disabled):not(.disabled):active,\n    &:not(:disabled):not(.disabled).active {\n      background: rgba(0, 0, 0, 0.04);\n      color: theme-color($color);\n\n      &:focus {\n        box-shadow: 0 0 $btn-focus-width rgba(theme-color($color), 0.85);\n      }\n    }\n  }\n\n  .bg-black {\n    .btn-outline-#{$color} {\n      &:hover {\n        background: rgba(255, 255, 255, 0.05);\n      }\n\n      &:not(:disabled):not(.disabled):active,\n      &:not(:disabled):not(.disabled).active {\n        background: rgba(255, 255, 255, 0.1);\n      }\n    }\n\n    .btn-outline-secondary {\n      color: $white;\n      border-color: $white;\n    }\n  }\n}\n\n.mode-toggle:hover {\n  filter:\n    brightness(0)\n    saturate(100%)\n    invert(91%)\n    sepia(23%)\n    saturate(6279%)\n    hue-rotate(335deg)\n    brightness(105%)\n    contrast(91%);\n}\n\n.bg-white {\n  background-color: $white !important;\n\n  a:not(.btn) {\n    color: $blue;\n\n    &:hover {\n      color: $blue-500;\n    }\n\n    &:active {\n      color: $blue-600;\n    }\n  }\n}\n\n.bg-black {\n  background-color: $black !important;\n\n  a:not(.btn) {\n    color: $blue-500;\n\n    &:hover {\n      color: $blue;\n    }\n\n    &:active {\n      color: $blue-300;\n    }\n  }\n}\n\n.bg-lighter {\n  background-color: $gray-300 !important;\n}\n\n.bg-darker {\n  background-color: $gray-850 !important;\n}\n\n@include media-breakpoint-down(md) {\n  #sidebar {\n    border-top: $border-width solid $black;\n    margin-top: 1em;\n    padding-top: 0.75em;\n  }\n\n  .bg-black {\n    #sidebar {\n      border-top: $border-width solid $gray-800;\n    }\n  }\n}\n\n@include media-breakpoint-up(lg) {\n  #sidebar {\n    border-left: $border-width solid $black;\n  }\n\n  .bg-black {\n    #sidebar {\n      border-left: $border-width solid $gray-800;\n    }\n  }\n}\n\narticle {\n  img {\n    width: 100%;\n  }\n}\n\nmain {\n  code {\n    color: $gray-200;\n    background-color: $gray-800;\n    border-radius: 0.25em;\n    border: $border-width solid $gray-500;\n    padding: 0.1em;\n  }\n\n  h2,\n  h3 {\n    &not:first-child {\n      margin-top: 0.75em;\n    }\n  }\n\n  hr {\n    border-radius: 1px;\n    border-width: 0;\n    height: 2px;\n    color: gray;\n    background-color: gray;\n  }\n}\n"
  },
  {
    "path": "_sass/_syntax-highlighting.scss",
    "content": "// Syntax highlighting styles, can be modified to match the theme\n\n\n.highlight {\n\n  color: #111;\n\n  pre {\n    margin: 0;\n    padding: 8px 12px;\n    background: #eef;\n    border: 1px solid #e8e8e8;\n  }\n\n  .c     { color: #998; font-style: italic } // Comment\n  .err   { color: #a61717; background-color: #e3d2d2 } // Error\n  .k     { font-weight: bold } // Keyword\n  .o     { font-weight: bold } // Operator\n  .cm    { color: #998; font-style: italic } // Comment.Multiline\n  .cp    { color: #999; font-weight: bold } // Comment.Preproc\n  .c1    { color: #998; font-style: italic } // Comment.Single\n  .cs    { color: #999; font-weight: bold; font-style: italic } // Comment.Special\n  .gd    { color: #000; background-color: #fdd } // Generic.Deleted\n  .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific\n  .ge    { font-style: italic } // Generic.Emph\n  .gr    { color: #a00 } // Generic.Error\n  .gh    { color: #999 } // Generic.Heading\n  .gi    { color: #000; background-color: #dfd } // Generic.Inserted\n  .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific\n  .go    { color: #888 } // Generic.Output\n  .gp    { color: #555 } // Generic.Prompt\n  .gs    { font-weight: bold } // Generic.Strong\n  .gu    { color: #aaa } // Generic.Subheading\n  .gt    { color: #a00 } // Generic.Traceback\n  .kc    { font-weight: bold } // Keyword.Constant\n  .kd    { font-weight: bold } // Keyword.Declaration\n  .kp    { font-weight: bold } // Keyword.Pseudo\n  .kr    { font-weight: bold } // Keyword.Reserved\n  .kt    { color: #458; font-weight: bold } // Keyword.Type\n  .m     { color: #099 } // Literal.Number\n  .s     { color: #d14 } // Literal.String\n  .na    { color: #008080 } // Name.Attribute\n  .nb    { color: #0086B3 } // Name.Builtin\n  .nc    { color: #458; font-weight: bold } // Name.Class\n  .no    { color: #008080 } // Name.Constant\n  .ni    { color: #800080 } // Name.Entity\n  .ne    { color: #900; font-weight: bold } // Name.Exception\n  .nf    { color: #900; font-weight: bold } // Name.Function\n  .nn    { color: #555 } // Name.Namespace\n  .nt    { color: #000080 } // Name.Tag\n  .nv    { color: #008080 } // Name.Variable\n  .ow    { font-weight: bold } // Operator.Word\n  .w     { color: #bbb } // Text.Whitespace\n  .mf    { color: #099 } // Literal.Number.Float\n  .mh    { color: #099 } // Literal.Number.Hex\n  .mi    { color: #099 } // Literal.Number.Integer\n  .mo    { color: #099 } // Literal.Number.Oct\n  .sb    { color: #d14 } // Literal.String.Backtick\n  .sc    { color: #d14 } // Literal.String.Char\n  .sd    { color: #d14 } // Literal.String.Doc\n  .s2    { color: #d14 } // Literal.String.Double\n  .se    { color: #d14 } // Literal.String.Escape\n  .sh    { color: #d14 } // Literal.String.Heredoc\n  .si    { color: #d14 } // Literal.String.Interpol\n  .sx    { color: #d14 } // Literal.String.Other\n  .sr    { color: #009926 } // Literal.String.Regex\n  .s1    { color: #d14 } // Literal.String.Single\n  .ss    { color: #990073 } // Literal.String.Symbol\n  .bp    { color: #999 } // Name.Builtin.Pseudo\n  .vc    { color: #008080 } // Name.Variable.Class\n  .vg    { color: #008080 } // Name.Variable.Global\n  .vi    { color: #008080 } // Name.Variable.Instance\n  .il    { color: #099 } // Literal.Number.Integer.Long\n}\n"
  },
  {
    "path": "_sass/_variables.scss",
    "content": "// Brand Colors\n$blue-300: #124ddb;\n$blue: #2d68f4;\n$blue-500: #477eff;\n$blue-600: #7aa2ff;\n$indigo: #6610f2;\n$purple: #6f42c1;\n$pink: #e10e71;\n$red: #df2935;\n$orange: #ff6f22;\n$yellow: #f3b234;\n$green: #02c996;\n$teal: #20c997;\n$cyan: #5bc0de;\n$white: #ffffff;\n$gray-100: #f9f9f9;\n$gray-200: #f5f5f5;\n$gray-300: #e9e9e9;\n$gray-400: #c4c4c4;\n$gray-500: #9e9e9e;\n$gray-600: #868e96;\n$gray-700: #585858;\n$gray-800: #3e3e3e;\n$gray-850: #303030;\n$gray-900: #232323;\n$black: #171717;\n$grays: (\n  \"100\": $gray-100,\n  \"200\": $gray-200,\n  \"300\": $gray-300,\n  \"400\": $gray-400,\n  \"500\": $gray-500,\n  \"600\": $gray-600,\n  \"700\": $gray-700,\n  \"800\": $gray-800,\n  \"850\": $gray-850,\n  \"900\": $gray-900\n);\n$theme-colors: (\n  \"primary\": $pink,\n  \"secondary\": $blue,\n  \"success\": $green,\n  \"info\": $cyan,\n  \"warning\": $yellow,\n  \"danger\": $red,\n  \"light\": $gray-300,\n  \"dark\": $gray-900\n);\n$colors: (\n  \"blue\": $blue,\n  \"indigo\": $indigo,\n  \"purple\": $purple,\n  \"pink\": $pink,\n  \"red\": $red,\n  \"orange\": $orange,\n  \"yellow\": $yellow,\n  \"green\": $green,\n  \"teal\": $teal,\n  \"cyan\": $cyan,\n  \"white\": $white,\n  \"gray\": $gray-600,\n  \"gray-dark\": $gray-800\n);\n$theme-color-interval: 8%;\n\n// Spacing\n$spacer: 1rem;\n$spacers: (\n  0: 0,\n  1: (\n    $spacer * 0.25\n  ),\n  2: (\n    $spacer * 0.5\n  ),\n  3: $spacer,\n  4: (\n    $spacer * 1.5\n  ),\n  5: (\n    $spacer * 3\n  )\n);\n$sizes: (\n  25: 25%,\n  50: 50%,\n  75: 75%,\n  100: 100%\n);\n\n// Options\n$enable-rounded: true;\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-transitions: true;\n$enable-hover-media-query: false;\n$enable-grid-classes: true;\n$enable-print-styles: true;\n\n$yiq-contrasted-threshold: 170 !default;\n\n// Body\n$body-bg: $white;\n$body-color: $gray-900;\n\n// Links\n$link-color: theme-color(\"primary\");\n$link-decoration: none;\n$link-hover-color: darken($link-color, 15%);\n$link-hover-decoration: underline;\n\n// Grid\n$grid-breakpoints: (\n  xs: 0,\n  sm: 576px,\n  md: 768px,\n  lg: 992px,\n  xl: 1200px\n);\n$container-max-widths: (\n  sm: 540px,\n  md: 720px,\n  lg: 960px,\n  xl: 1140px\n);\n$grid-columns: 12;\n$grid-gutter-width: 30px;\n\n// Components\n$line-height-lg: 1.5;\n$line-height-sm: 1.5;\n$border-width: 1px;\n$border-radius: 0.25rem;\n$border-radius-lg: 0.5rem;\n$border-radius-sm: 0.2rem;\n$component-active-color: $white;\n$component-active-bg: theme-color(\"primary\");\n$caret-width: 0.3em;\n$transition-base: all 0.2s ease-in-out;\n$transition-fade: opacity 0.15s linear;\n$transition-collapse: height 0.35s ease;\n\n// Fonts\n@font-face {\n  font-family: \"Effra\";\n  font-weight: 300;\n  font-style: normal;\n  src: url(\"../fonts/effra-light.woff\") format(\"woff\");\n  font-display: swap;\n}\n\n@font-face {\n  font-family: \"Effra\";\n  font-weight: 400;\n  font-style: normal;\n  src: url(\"../fonts/effra-regular.woff\") format(\"woff\");\n  font-display: swap;\n}\n\n@font-face {\n  font-family: \"Effra\";\n  font-weight: 500;\n  font-style: normal;\n  src: url(\"../fonts/effra-medium.woff\") format(\"woff\");\n  font-display: swap;\n}\n\n@font-face {\n  font-family: \"Effra\";\n  font-weight: 600;\n  font-style: normal;\n  src: url(\"../fonts/effra-medium.woff\") format(\"woff\");\n  font-display: swap;\n}\n\n$font-family-sans-serif: \"Effra\", -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n  Roboto, Oxygen, Ubuntu, Cantarell, \"Open Sans\", \"Helvetica Neue\", sans-serif;\n$font-family-monospace: Consolas, \"Liberation Mono\", Courier, monospace;\n$font-family-base: $font-family-sans-serif;\n$font-size-base: 1rem;\n$font-size-lg: 1.25rem;\n$font-size-sm: 0.875rem;\n$font-weight-normal: normal;\n$font-weight-bold: bold;\n$font-weight-base: $font-weight-normal;\n$line-height-base: 1.5;\n$h1-font-size: 2.5rem;\n$h2-font-size: 2rem;\n$h3-font-size: 1.75rem;\n$h4-font-size: 1.5rem;\n$h5-font-size: 1.25rem;\n$h6-font-size: 1rem;\n$headings-margin-bottom: ($spacer / 2);\n$headings-font-family: inherit;\n$headings-font-weight: 500;\n$headings-line-height: 1.1;\n$headings-color: inherit;\n$display1-size: 6rem;\n$display2-size: 5.5rem;\n$display3-size: 4.5rem;\n$display4-size: 3.5rem;\n$display1-weight: 300;\n$display2-weight: 300;\n$display3-weight: 300;\n$display4-weight: 300;\n$display-line-height: $headings-line-height;\n$lead-font-size: 1.25rem;\n$lead-font-weight: 300;\n$small-font-size: 80%;\n$text-muted: $gray-600;\n$blockquote-small-color: $gray-600;\n$blockquote-font-size: ($font-size-base * 1.25);\n$hr-border-color: rgba($black, 0.1);\n$hr-border-width: $border-width;\n$mark-padding: 0.2em;\n$dt-font-weight: $font-weight-bold;\n$kbd-box-shadow: inset 0 -0.1rem 0 rgba($black, 0.25);\n$nested-kbd-font-weight: $font-weight-bold;\n$list-inline-padding: 0.5rem;\n$mark-bg: #fcf8e3;\n\n// Buttons\n$input-btn-padding-y: 0.5rem;\n$input-btn-padding-x: 1.5rem;\n$input-btn-line-height: 1.25;\n$input-btn-padding-y-sm: 0.25rem;\n$input-btn-padding-x-sm: 0.75rem;\n$input-btn-line-height-sm: 1.5;\n$input-btn-padding-y-lg: 0.75rem;\n$input-btn-padding-x-lg: 2.25rem;\n$input-btn-line-height-lg: 1.5;\n$input-btn-focus-width: 6px !default;\n$btn-font-weight: $font-weight-normal;\n$btn-box-shadow: inset 0 1px 0 rgba($white, 0.15), 0 1px 1px rgba($black, 0.075);\n$btn-focus-box-shadow: 0 0 6px rgba(theme-color(\"primary\"), 0.25);\n$btn-active-box-shadow: none;\n$btn-link-disabled-color: $gray-600;\n$btn-block-spacing-y: 0.5rem;\n$btn-border-radius: $border-radius;\n$btn-border-radius-lg: $border-radius-lg;\n$btn-border-radius-sm: $border-radius-sm;\n$btn-transition: all 0.15s ease-in-out;\n\n// Forms\n$input-bg: $white;\n$input-disabled-bg: $gray-200;\n$input-color: $gray-700;\n$input-border-color: rgba($black, 0.15);\n$input-btn-border-width: $border-width;\n$input-box-shadow: inset 0 0 6px rgba($black, 0.075);\n$input-border-radius: $border-radius;\n$input-border-radius-lg: $border-radius-lg;\n$input-border-radius-sm: $border-radius-sm;\n$input-focus-bg: $input-bg;\n$input-focus-border-color: lighten(theme-color(\"primary\"), 25%);\n$input-focus-box-shadow: $input-box-shadow, $btn-focus-box-shadow;\n$input-focus-color: $input-color;\n$input-placeholder-color: $gray-600;\n$input-height-border: $input-btn-border-width * 2;\n$input-height-inner: ($font-size-base * $input-btn-line-height) +\n  ($input-btn-padding-y * 2);\n$input-height: calc(#{$input-height-inner} + #{$input-height-border});\n$input-height-inner-sm: ($font-size-sm * $input-btn-line-height-sm) +\n  ($input-btn-padding-y-sm * 2);\n$input-height-sm: calc(#{$input-height-inner-sm} + #{$input-height-border});\n$input-height-inner-lg: ($font-size-sm * $input-btn-line-height-lg) +\n  ($input-btn-padding-y-lg * 2);\n$input-height-lg: calc(#{$input-height-inner-lg} + #{$input-height-border});\n$input-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n$form-text-margin-top: 0.25rem;\n$form-check-margin-bottom: 0.5rem;\n$form-check-input-gutter: 1.25rem;\n$form-check-input-margin-y: 0.25rem;\n$form-check-input-margin-x: 0.25rem;\n$form-check-inline-margin-x: 0.75rem;\n$form-group-margin-bottom: 1rem;\n$input-group-addon-bg: $gray-200;\n$input-group-addon-border-color: $input-border-color;\n$custom-control-gutter: 1.5rem;\n$custom-control-spacer-y: 0.25rem;\n$custom-control-spacer-x: 1rem;\n$custom-control-indicator-size: 1rem;\n$custom-control-indicator-bg: #ddd;\n$custom-control-indicator-bg-size: 50% 50%;\n$custom-control-indicator-box-shadow: inset 0 0.25rem 0.25rem rgba($black, 0.1);\n$custom-control-indicator-disabled-bg: $gray-200;\n$custom-control-description-disabled-color: $gray-600;\n$custom-control-indicator-checked-color: $white;\n$custom-control-indicator-checked-bg: theme-color(\"primary\");\n$custom-control-indicator-checked-box-shadow: none;\n$custom-control-indicator-focus-box-shadow: 0 0 0 1px $body-bg,\n  0 0 0 3px theme-color(\"primary\");\n$custom-control-indicator-active-color: $white;\n$custom-control-indicator-active-bg: lighten(theme-color(\"primary\"), 35%);\n$custom-control-indicator-active-box-shadow: none;\n$custom-checkbox-indicator-border-radius: $border-radius;\n$custom-checkbox-indicator-indeterminate-bg: theme-color(\"primary\");\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color;\n$custom-checkbox-indicator-indeterminate-box-shadow: none;\n$custom-radio-indicator-border-radius: 50%;\n$custom-select-padding-y: 0.375rem;\n$custom-select-padding-x: 0.75rem;\n$custom-select-height: $input-height;\n$custom-select-indicator-padding: 1rem;\n$custom-select-line-height: $input-btn-line-height;\n$custom-select-color: $input-color;\n$custom-select-disabled-color: $gray-600;\n$custom-select-bg: $white;\n$custom-select-disabled-bg: $gray-200;\n$custom-select-bg-size: 8px 10px;\n$custom-select-indicator-color: #333;\n$custom-select-border-width: $input-btn-border-width;\n$custom-select-border-color: $input-border-color;\n$custom-select-border-radius: $border-radius;\n$custom-select-focus-border-color: lighten(theme-color(\"primary\"), 25%);\n$custom-select-focus-box-shadow: inset 0 1px 2px rgba($black, 0.075),\n  0 0 5px rgba($custom-select-focus-border-color, 0.5);\n$custom-select-font-size-sm: 75%;\n$custom-select-height-sm: $input-height-sm;\n$custom-file-height: 2.5rem;\n$custom-file-width: 14rem;\n$custom-file-focus-box-shadow: 0 0 0 0.075rem $white,\n  0 0 0 0.2rem theme-color(\"primary\");\n$custom-file-padding-y: 1rem;\n$custom-file-padding-x: 0.5rem;\n$custom-file-line-height: 1.5;\n$custom-file-color: $gray-700;\n$custom-file-bg: $white;\n$custom-file-border-width: $border-width;\n$custom-file-border-color: $input-border-color;\n$custom-file-border-radius: $border-radius;\n$custom-file-box-shadow: inset 0 0.2rem 0.4rem rgba($black, 0.05);\n$custom-file-button-color: $custom-file-color;\n$custom-file-button-bg: $gray-200;\n$custom-file-text: (\n  en: \"Browse\"\n);\n$form-feedback-valid-color: theme-color(\"success\");\n$form-feedback-invalid-color: theme-color(\"danger\");\n\n// Dropdown\n$dropdown-min-width: 10rem;\n$dropdown-padding-y: 0.5rem;\n$dropdown-spacer: 0.125rem;\n$dropdown-bg: $white;\n$dropdown-border-color: rgba($black, 0.15);\n$dropdown-border-width: $border-width;\n$dropdown-divider-bg: $gray-200;\n$dropdown-box-shadow: 0 0.5rem 1rem rgba($black, 0.175);\n$dropdown-link-color: $gray-900;\n$dropdown-link-hover-color: darken($gray-900, 5%);\n$dropdown-link-hover-bg: $gray-100;\n$dropdown-link-active-color: $component-active-color;\n$dropdown-link-active-bg: $component-active-bg;\n$dropdown-link-disabled-color: $gray-600;\n$dropdown-item-padding-y: 0.25rem;\n$dropdown-item-padding-x: 1.5rem;\n$dropdown-header-color: $gray-600;\n\n$dropdown-link-active-color: $dropdown-link-hover-color !default;\n$dropdown-link-active-bg: $dropdown-link-hover-bg !default;\n\n// Navs\n$nav-link-padding-y: 0.5rem;\n$nav-link-padding-x: 1rem;\n$nav-link-disabled-color: $gray-600;\n$nav-tabs-border-color: #ddd;\n$nav-tabs-border-width: $border-width;\n$nav-tabs-border-radius: $border-radius;\n$nav-tabs-link-hover-border-color: $gray-200;\n$nav-tabs-link-active-color: $gray-700;\n$nav-tabs-link-active-bg: $body-bg;\n$nav-tabs-link-active-border-color: #ddd;\n$nav-pills-border-radius: $border-radius;\n$nav-pills-link-active-color: $component-active-color;\n$nav-pills-link-active-bg: $component-active-bg;\n\n// Navbar\n$navbar-padding-y: ($spacer / 2);\n$navbar-padding-x: $spacer;\n$navbar-brand-font-size: $font-size-lg;\n$nav-link-height: $navbar-brand-font-size * $line-height-base;\n$navbar-brand-height: (\n  $font-size-base * $line-height-base + $nav-link-padding-y * 2\n);\n$navbar-brand-padding-y: ($navbar-brand-height - $nav-link-height) / 2;\n$navbar-toggler-padding-y: 0.25rem;\n$navbar-toggler-padding-x: 0.75rem;\n$navbar-toggler-font-size: $font-size-lg;\n$navbar-toggler-border-radius: $btn-border-radius;\n$navbar-dark-color: rgba($white, 0.5);\n$navbar-dark-hover-color: rgba($white, 0.75);\n$navbar-dark-active-color: rgba($white, 1);\n$navbar-dark-disabled-color: rgba($white, 0.25);\n$navbar-dark-toggler-border-color: rgba($white, 0.1);\n$navbar-light-color: rgba($black, 0.5);\n$navbar-light-hover-color: rgba($black, 0.7);\n$navbar-light-active-color: rgba($black, 0.9);\n$navbar-light-disabled-color: rgba($black, 0.3);\n$navbar-light-toggler-border-color: rgba($black, 0.1);\n\n// Tables\n$table-cell-padding: 0.75rem;\n$table-cell-padding-sm: 0.3rem;\n$table-bg: transparent;\n$table-accent-bg: rgba($black, 0.05);\n$table-hover-bg: rgba($black, 0.075);\n$table-active-bg: $table-hover-bg;\n$table-border-width: $border-width;\n$table-border-color: $gray-200;\n$table-head-bg: $gray-200;\n$table-head-color: $gray-700;\n$table-inverse-bg: $gray-900;\n$table-inverse-accent-bg: rgba($white, 0.05);\n$table-inverse-hover-bg: rgba($white, 0.075);\n$table-inverse-border-color: lighten($gray-900, 7.5%);\n$table-inverse-color: $body-bg;\n\n// Z Index\n$zindex-dropdown: 1000;\n$zindex-sticky: 1020;\n$zindex-fixed: 1030;\n$zindex-modal-backdrop: 1040;\n$zindex-modal: 1050;\n$zindex-popover: 1060;\n$zindex-tooltip: 1070;\n\n// Pagination\n$pagination-padding-y: 0.5rem;\n$pagination-padding-x: 0.75rem;\n$pagination-padding-y-sm: 0.25rem;\n$pagination-padding-x-sm: 0.5rem;\n$pagination-padding-y-lg: 0.75rem;\n$pagination-padding-x-lg: 1.5rem;\n$pagination-line-height: 1.25;\n$pagination-color: $link-color;\n$pagination-bg: $white;\n$pagination-border-width: $border-width;\n$pagination-border-color: #ddd;\n$pagination-hover-color: $link-hover-color;\n$pagination-hover-bg: $gray-200;\n$pagination-hover-border-color: #ddd;\n$pagination-active-color: $white;\n$pagination-active-bg: theme-color(\"primary\");\n$pagination-active-border-color: theme-color(\"primary\");\n$pagination-disabled-color: $gray-600;\n$pagination-disabled-bg: $white;\n$pagination-disabled-border-color: #ddd;\n\n// Jumbotron\n$jumbotron-padding: 2rem;\n$jumbotron-bg: $gray-200;\n\n// Cards\n$card-spacer-y: 0.75rem;\n$card-spacer-x: 1.25rem;\n$card-border-width: 1px;\n$card-border-radius: $border-radius;\n$card-border-color: rgba($black, 0.125);\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width});\n$card-cap-bg: rgba($black, 0.03);\n$card-bg: $white;\n$card-img-overlay-padding: 1.25rem;\n$card-deck-margin: ($grid-gutter-width / 2);\n$card-columns-count: 3;\n$card-columns-gap: 1.25rem;\n$card-columns-margin: $card-spacer-y;\n\n// Tooltip\n$tooltip-max-width: 200px;\n$tooltip-color: $white;\n$tooltip-bg: $black;\n$tooltip-opacity: 0.9;\n$tooltip-padding-y: 3px;\n$tooltip-padding-x: 8px;\n$tooltip-margin: 0;\n$tooltip-arrow-width: 5px;\n$tooltip-arrow-height: 5px;\n$tooltip-arrow-color: $tooltip-bg;\n\n// Popovers\n$popover-inner-padding: 1px;\n$popover-bg: $white;\n$popover-max-width: 276px;\n$popover-border-width: $border-width;\n$popover-border-color: rgba($black, 0.2);\n$popover-box-shadow: 0 5px 10px rgba($black, 0.2);\n$popover-header-bg: darken($popover-bg, 3%);\n$popover-header-color: $headings-color;\n$popover-header-padding-y: 8px;\n$popover-header-padding-x: 14px;\n$popover-body-color: $body-color;\n$popover-body-padding-y: 9px;\n$popover-body-padding-x: 14px;\n$popover-arrow-width: 10px;\n$popover-arrow-height: 5px;\n$popover-arrow-color: $popover-bg;\n$popover-arrow-outer-width: ($popover-arrow-width + 1px);\n$popover-arrow-outer-color: fade-in($popover-border-color, 0.05);\n\n// Badges\n$badge-color: $white;\n$badge-font-size: 75%;\n$badge-font-weight: $font-weight-bold;\n$badge-padding-y: 0.25em;\n$badge-padding-x: 0.4em;\n$badge-pill-padding-x: 0.6em;\n$badge-pill-border-radius: 10rem;\n\n// Toasts\n\n$toast-background-color: lighten($body-bg, 5%) !default;\n$toast-border-color: rgba(0, 0, 0, 0.2) !default;\n\n$toast-header-color: $body-color !default;\n$toast-header-background-color: $toast-background-color !default;\n$toast-header-border-color: $toast-border-color !default;\n\n// Modals\n$modal-inner-padding: 1rem;\n$modal-dialog-margin: 0.5rem;\n$modal-dialog-margin-y-sm-up: 1.75rem;\n$modal-title-line-height: $line-height-base;\n$modal-content-bg: $white;\n$modal-content-border-color: rgba($black, 0.2);\n$modal-content-border-width: $border-width;\n$modal-content-box-shadow-xs: 0 3px 9px rgba($black, 0.5);\n$modal-content-box-shadow-sm-up: 0 5px 15px rgba($black, 0.5);\n$modal-backdrop-bg: $black;\n$modal-backdrop-opacity: 0.5;\n$modal-header-border-color: $gray-200;\n$modal-footer-border-color: $modal-header-border-color;\n$modal-header-border-width: $modal-content-border-width;\n$modal-footer-border-width: $modal-header-border-width;\n$modal-header-padding: 15px;\n$modal-lg: 800px;\n$modal-md: 500px;\n$modal-sm: 300px;\n$modal-transition: transform 0.3s ease-out;\n\n// Alerts\n$alert-padding-y: 0.75rem;\n$alert-padding-x: 1.25rem;\n$alert-margin-bottom: 1rem;\n$alert-border-radius: $border-radius;\n$alert-link-font-weight: $font-weight-bold;\n$alert-border-width: $border-width;\n\n// Progress bars\n$progress-height: 1rem;\n$progress-font-size: 0.75rem;\n$progress-bg: $gray-200;\n$progress-border-radius: $border-radius;\n$progress-box-shadow: inset 0 0.1rem 0.1rem rgba($black, 0.1);\n$progress-bar-color: $white;\n$progress-bar-bg: theme-color(\"primary\");\n$progress-bar-animation-timing: 1s linear infinite;\n$progress-bar-transition: width 0.6s ease;\n\n// List group\n$list-group-bg: $white;\n$list-group-border-color: rgba($black, 0.125);\n$list-group-border-width: $border-width;\n$list-group-border-radius: $border-radius;\n$list-group-item-padding-y: 0.75rem;\n$list-group-item-padding-x: 1.25rem;\n$list-group-hover-bg: $gray-100;\n$list-group-active-color: $component-active-color;\n$list-group-active-bg: $component-active-bg;\n$list-group-active-border-color: $list-group-active-bg;\n$list-group-disabled-color: $gray-600;\n$list-group-disabled-bg: $list-group-bg;\n$list-group-action-color: $gray-700;\n$list-group-action-hover-color: $list-group-action-color;\n$list-group-action-active-color: $body-color;\n$list-group-action-active-bg: $gray-200;\n\n// Image thumbnails\n$thumbnail-padding: 0.25rem;\n$thumbnail-bg: $body-bg;\n$thumbnail-border-width: $border-width;\n$thumbnail-border-color: #ddd;\n$thumbnail-border-radius: $border-radius;\n$thumbnail-box-shadow: 0 1px 2px rgba($black, 0.075);\n$thumbnail-transition: all 0.2s ease-in-out;\n\n// Figures\n$figure-caption-font-size: 90%;\n$figure-caption-color: $gray-600;\n\n// Breadcrumbs\n$breadcrumb-padding-y: 0.75rem;\n$breadcrumb-padding-x: 1rem;\n$breadcrumb-item-padding: 0.5rem;\n$breadcrumb-bg: $gray-200;\n$breadcrumb-divider-color: $gray-600;\n$breadcrumb-active-color: $gray-600;\n$breadcrumb-divider: \"/\";\n\n// Carousel\n$carousel-control-color: $white;\n$carousel-control-width: 15%;\n$carousel-control-opacity: 0.5;\n$carousel-indicator-width: 30px;\n$carousel-indicator-height: 3px;\n$carousel-indicator-spacer: 3px;\n$carousel-indicator-active-bg: $white;\n$carousel-caption-width: 70%;\n$carousel-caption-color: $white;\n$carousel-control-icon-width: 20px;\n$carousel-transition: transform 0.6s ease;\n\n// Close\n$close-font-size: $font-size-base * 1.5;\n$close-font-weight: $font-weight-bold;\n$close-color: $black;\n$close-text-shadow: 0 1px 0 $white;\n\n// Code\n$code-font-size: 90%;\n$code-padding-y: 0.2rem;\n$code-padding-x: 0.4rem;\n$code-color: #bd4147;\n$code-bg: $gray-100;\n$kbd-color: $white;\n$kbd-bg: $gray-900;\n$pre-color: $gray-900;\n$pre-scrollable-max-height: 340px;\n\n// Options\n$enable-rounded: true;\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-transitions: true;\n$enable-hover-media-query: false;\n$enable-grid-classes: true;\n$enable-print-styles: true;\n"
  },
  {
    "path": "_sass/bootstrap/__DO_NOT_MODIFY",
    "content": ""
  },
  {
    "path": "_sass/bootstrap/_alert.scss",
    "content": "//\n// Base styles\n//\n\n.alert {\n  position: relative;\n  padding: $alert-padding-y $alert-padding-x;\n  margin-bottom: $alert-margin-bottom;\n  border: $alert-border-width solid transparent;\n  @include border-radius($alert-border-radius);\n}\n\n// Headings for larger alerts\n.alert-heading {\n  // Specified to prevent conflicts of changing $headings-color\n  color: inherit;\n}\n\n// Provide class for links that match alerts\n.alert-link {\n  font-weight: $alert-link-font-weight;\n}\n\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissible {\n  padding-right: $close-font-size + $alert-padding-x * 2;\n\n  // Adjust close link position\n  .close {\n    position: absolute;\n    top: 0;\n    right: 0;\n    z-index: 2;\n    padding: $alert-padding-y $alert-padding-x;\n    color: inherit;\n  }\n}\n\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n@each $color, $value in $theme-colors {\n  .alert-#{$color} {\n    @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level));\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/_badge.scss",
    "content": "// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badge {\n  display: inline-block;\n  padding: $badge-padding-y $badge-padding-x;\n  @include font-size($badge-font-size);\n  font-weight: $badge-font-weight;\n  line-height: 1;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  @include border-radius($badge-border-radius);\n  @include transition($badge-transition);\n\n  @at-root a#{&} {\n    @include hover-focus() {\n      text-decoration: none;\n    }\n  }\n\n  // Empty badges collapse automatically\n  &:empty {\n    display: none;\n  }\n}\n\n// Quick fix for badges in buttons\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\n// Pill badges\n//\n// Make them extra rounded with a modifier to replace v3's badges.\n\n.badge-pill {\n  padding-right: $badge-pill-padding-x;\n  padding-left: $badge-pill-padding-x;\n  @include border-radius($badge-pill-border-radius);\n}\n\n// Colors\n//\n// Contextual variations (linked badges get darker on :hover).\n\n@each $color, $value in $theme-colors {\n  .badge-#{$color} {\n    @include badge-variant($value);\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/_breadcrumb.scss",
    "content": ".breadcrumb {\n  display: flex;\n  flex-wrap: wrap;\n  padding: $breadcrumb-padding-y $breadcrumb-padding-x;\n  margin-bottom: $breadcrumb-margin-bottom;\n  @include font-size($breadcrumb-font-size);\n  list-style: none;\n  background-color: $breadcrumb-bg;\n  @include border-radius($breadcrumb-border-radius);\n}\n\n.breadcrumb-item {\n  // The separator between breadcrumbs (by default, a forward-slash: \"/\")\n  + .breadcrumb-item {\n    padding-left: $breadcrumb-item-padding;\n\n    &::before {\n      float: left; // Suppress inline spacings and underlining of the separator\n      padding-right: $breadcrumb-item-padding;\n      color: $breadcrumb-divider-color;\n      content: escape-svg($breadcrumb-divider);\n    }\n  }\n\n  // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built\n  // without `<ul>`s. The `::before` pseudo-element generates an element\n  // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.\n  //\n  // To trick IE into suppressing the underline, we give the pseudo-element an\n  // underline and then immediately remove it.\n  + .breadcrumb-item:hover::before {\n    text-decoration: underline;\n  }\n  // stylelint-disable-next-line no-duplicate-selectors\n  + .breadcrumb-item:hover::before {\n    text-decoration: none;\n  }\n\n  &.active {\n    color: $breadcrumb-active-color;\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/_button-group.scss",
    "content": "// stylelint-disable selector-no-qualifying-type\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-flex;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n\n  > .btn {\n    position: relative;\n    flex: 1 1 auto;\n\n    // Bring the hover, focused, and \"active\" buttons to the front to overlay\n    // the borders properly\n    @include hover() {\n      z-index: 1;\n    }\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 1;\n    }\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-start;\n\n  .input-group {\n    width: auto;\n  }\n}\n\n.btn-group {\n  // Prevent double borders when buttons are next to each other\n  > .btn:not(:first-child),\n  > .btn-group:not(:first-child) {\n    margin-left: -$btn-border-width;\n  }\n\n  // Reset rounded corners\n  > .btn:not(:last-child):not(.dropdown-toggle),\n  > .btn-group:not(:last-child) > .btn {\n    @include border-right-radius(0);\n  }\n\n  > .btn:not(:first-child),\n  > .btn-group:not(:first-child) > .btn {\n    @include border-left-radius(0);\n  }\n}\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n//\n// Split button dropdowns\n//\n\n.dropdown-toggle-split {\n  padding-right: $btn-padding-x * .75;\n  padding-left: $btn-padding-x * .75;\n\n  &::after,\n  .dropup &::after,\n  .dropright &::after {\n    margin-left: 0;\n  }\n\n  .dropleft &::before {\n    margin-right: 0;\n  }\n}\n\n.btn-sm + .dropdown-toggle-split {\n  padding-right: $btn-padding-x-sm * .75;\n  padding-left: $btn-padding-x-sm * .75;\n}\n\n.btn-lg + .dropdown-toggle-split {\n  padding-right: $btn-padding-x-lg * .75;\n  padding-left: $btn-padding-x-lg * .75;\n}\n\n\n// The clickable button for toggling the menu\n// Set the same inset shadow as the :active state\n.btn-group.show .dropdown-toggle {\n  @include box-shadow($btn-active-box-shadow);\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    @include box-shadow(none);\n  }\n}\n\n\n//\n// Vertical button groups\n//\n\n.btn-group-vertical {\n  flex-direction: column;\n  align-items: flex-start;\n  justify-content: center;\n\n  > .btn,\n  > .btn-group {\n    width: 100%;\n  }\n\n  > .btn:not(:first-child),\n  > .btn-group:not(:first-child) {\n    margin-top: -$btn-border-width;\n  }\n\n  // Reset rounded corners\n  > .btn:not(:last-child):not(.dropdown-toggle),\n  > .btn-group:not(:last-child) > .btn {\n    @include border-bottom-radius(0);\n  }\n\n  > .btn:not(:first-child),\n  > .btn-group:not(:first-child) > .btn {\n    @include border-top-radius(0);\n  }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n.btn-group-toggle {\n  > .btn,\n  > .btn-group > .btn {\n    margin-bottom: 0; // Override default `<label>` value\n\n    input[type=\"radio\"],\n    input[type=\"checkbox\"] {\n      position: absolute;\n      clip: rect(0, 0, 0, 0);\n      pointer-events: none;\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/_buttons.scss",
    "content": "// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.btn {\n  display: inline-block;\n  font-family: $btn-font-family;\n  font-weight: $btn-font-weight;\n  color: $body-color;\n  text-align: center;\n  text-decoration: if($link-decoration == none, null, none);\n  white-space: $btn-white-space;\n  vertical-align: middle;\n  user-select: none;\n  background-color: transparent;\n  border: $btn-border-width solid transparent;\n  @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius);\n  @include transition($btn-transition);\n\n  @include hover() {\n    color: $body-color;\n    text-decoration: none;\n  }\n\n  &:focus,\n  &.focus {\n    outline: 0;\n    box-shadow: $btn-focus-box-shadow;\n  }\n\n  // Disabled comes first so active can properly restyle\n  &.disabled,\n  &:disabled {\n    opacity: $btn-disabled-opacity;\n    @include box-shadow(none);\n  }\n\n  &:not(:disabled):not(.disabled) {\n    cursor: if($enable-pointer-cursor-for-buttons, pointer, null);\n\n    &:active,\n    &.active {\n      @include box-shadow($btn-active-box-shadow);\n\n      &:focus {\n        @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);\n      }\n    }\n  }\n}\n\n// Future-proof disabling of clicks on `<a>` elements\na.btn.disabled,\nfieldset:disabled a.btn {\n  pointer-events: none;\n}\n\n\n//\n// Alternate buttons\n//\n\n@each $color, $value in $theme-colors {\n  .btn-#{$color} {\n    @include button-variant($value, $value);\n  }\n}\n\n@each $color, $value in $theme-colors {\n  .btn-outline-#{$color} {\n    @include button-outline-variant($value);\n  }\n}\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n  font-weight: $font-weight-normal;\n  color: $link-color;\n  text-decoration: $link-decoration;\n\n  @include hover() {\n    color: $link-hover-color;\n    text-decoration: $link-hover-decoration;\n  }\n\n  &:focus,\n  &.focus {\n    text-decoration: $link-hover-decoration;\n  }\n\n  &:disabled,\n  &.disabled {\n    color: $btn-link-disabled-color;\n    pointer-events: none;\n  }\n\n  // No need for an active state here\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-lg {\n  @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n  @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);\n}\n\n\n//\n// Block button\n//\n\n.btn-block {\n  display: block;\n  width: 100%;\n\n  // Vertically space out multiple block buttons\n  + .btn-block {\n    margin-top: $btn-block-spacing-y;\n  }\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/_card.scss",
    "content": "//\n// Base styles\n//\n\n.card {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106\n  height: $card-height;\n  word-wrap: break-word;\n  background-color: $card-bg;\n  background-clip: border-box;\n  border: $card-border-width solid $card-border-color;\n  @include border-radius($card-border-radius);\n\n  > hr {\n    margin-right: 0;\n    margin-left: 0;\n  }\n\n  > .list-group {\n    border-top: inherit;\n    border-bottom: inherit;\n\n    &:first-child {\n      border-top-width: 0;\n      @include border-top-radius($card-inner-border-radius);\n    }\n\n    &:last-child  {\n      border-bottom-width: 0;\n      @include border-bottom-radius($card-inner-border-radius);\n    }\n  }\n\n  // Due to specificity of the above selector (`.card > .list-group`), we must\n  // use a child selector here to prevent double borders.\n  > .card-header + .list-group,\n  > .list-group + .card-footer {\n    border-top: 0;\n  }\n}\n\n.card-body {\n  // Enable `flex-grow: 1` for decks and groups so that card blocks take up\n  // as much space as possible, ensuring footers are aligned to the bottom.\n  flex: 1 1 auto;\n  // Workaround for the image size bug in IE\n  // See: https://github.com/twbs/bootstrap/pull/28855\n  min-height: 1px;\n  padding: $card-spacer-x;\n  color: $card-color;\n}\n\n.card-title {\n  margin-bottom: $card-spacer-y;\n}\n\n.card-subtitle {\n  margin-top: -$card-spacer-y / 2;\n  margin-bottom: 0;\n}\n\n.card-text:last-child {\n  margin-bottom: 0;\n}\n\n.card-link {\n  @include hover() {\n    text-decoration: none;\n  }\n\n  + .card-link {\n    margin-left: $card-spacer-x;\n  }\n}\n\n//\n// Optional textual caps\n//\n\n.card-header {\n  padding: $card-spacer-y $card-spacer-x;\n  margin-bottom: 0; // Removes the default margin-bottom of <hN>\n  color: $card-cap-color;\n  background-color: $card-cap-bg;\n  border-bottom: $card-border-width solid $card-border-color;\n\n  &:first-child {\n    @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);\n  }\n}\n\n.card-footer {\n  padding: $card-spacer-y $card-spacer-x;\n  color: $card-cap-color;\n  background-color: $card-cap-bg;\n  border-top: $card-border-width solid $card-border-color;\n\n  &:last-child {\n    @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);\n  }\n}\n\n\n//\n// Header navs\n//\n\n.card-header-tabs {\n  margin-right: -$card-spacer-x / 2;\n  margin-bottom: -$card-spacer-y;\n  margin-left: -$card-spacer-x / 2;\n  border-bottom: 0;\n}\n\n.card-header-pills {\n  margin-right: -$card-spacer-x / 2;\n  margin-left: -$card-spacer-x / 2;\n}\n\n// Card image\n.card-img-overlay {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  padding: $card-img-overlay-padding;\n  @include border-radius($card-inner-border-radius);\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n  flex-shrink: 0; // For IE: https://github.com/twbs/bootstrap/issues/29396\n  width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n}\n\n.card-img,\n.card-img-top {\n  @include border-top-radius($card-inner-border-radius);\n}\n\n.card-img,\n.card-img-bottom {\n  @include border-bottom-radius($card-inner-border-radius);\n}\n\n\n// Card deck\n\n.card-deck {\n  .card {\n    margin-bottom: $card-deck-margin;\n  }\n\n  @include media-breakpoint-up(sm) {\n    display: flex;\n    flex-flow: row wrap;\n    margin-right: -$card-deck-margin;\n    margin-left: -$card-deck-margin;\n\n    .card {\n      // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n      flex: 1 0 0%;\n      margin-right: $card-deck-margin;\n      margin-bottom: 0; // Override the default\n      margin-left: $card-deck-margin;\n    }\n  }\n}\n\n\n//\n// Card groups\n//\n\n.card-group {\n  // The child selector allows nested `.card` within `.card-group`\n  // to display properly.\n  > .card {\n    margin-bottom: $card-group-margin;\n  }\n\n  @include media-breakpoint-up(sm) {\n    display: flex;\n    flex-flow: row wrap;\n    // The child selector allows nested `.card` within `.card-group`\n    // to display properly.\n    > .card {\n      // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n      flex: 1 0 0%;\n      margin-bottom: 0;\n\n      + .card {\n        margin-left: 0;\n        border-left: 0;\n      }\n\n      // Handle rounded corners\n      @if $enable-rounded {\n        &:not(:last-child) {\n          @include border-right-radius(0);\n\n          .card-img-top,\n          .card-header {\n            // stylelint-disable-next-line property-disallowed-list\n            border-top-right-radius: 0;\n          }\n          .card-img-bottom,\n          .card-footer {\n            // stylelint-disable-next-line property-disallowed-list\n            border-bottom-right-radius: 0;\n          }\n        }\n\n        &:not(:first-child) {\n          @include border-left-radius(0);\n\n          .card-img-top,\n          .card-header {\n            // stylelint-disable-next-line property-disallowed-list\n            border-top-left-radius: 0;\n          }\n          .card-img-bottom,\n          .card-footer {\n            // stylelint-disable-next-line property-disallowed-list\n            border-bottom-left-radius: 0;\n          }\n        }\n      }\n    }\n  }\n}\n\n\n//\n// Columns\n//\n\n.card-columns {\n  .card {\n    margin-bottom: $card-columns-margin;\n  }\n\n  @include media-breakpoint-up(sm) {\n    column-count: $card-columns-count;\n    column-gap: $card-columns-gap;\n    orphans: 1;\n    widows: 1;\n\n    .card {\n      display: inline-block; // Don't let them vertically span multiple columns\n      width: 100%; // Don't let their width change\n    }\n  }\n}\n\n\n//\n// Accordion\n//\n\n.accordion {\n  overflow-anchor: none;\n\n  > .card {\n    overflow: hidden;\n\n    &:not(:last-of-type) {\n      border-bottom: 0;\n      @include border-bottom-radius(0);\n    }\n\n    &:not(:first-of-type) {\n      @include border-top-radius(0);\n    }\n\n    > .card-header {\n      @include border-radius(0);\n      margin-bottom: -$card-border-width;\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/_carousel.scss",
    "content": "// Notes on the classes:\n//\n// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)\n//    even when their scroll action started on a carousel, but for compatibility (with Firefox)\n//    we're preventing all actions instead\n// 2. The .carousel-item-left and .carousel-item-right is used to indicate where\n//    the active slide is heading.\n// 3. .active.carousel-item is the current slide.\n// 4. .active.carousel-item-left and .active.carousel-item-right is the current\n//    slide in its in-transition state. Only one of these occurs at a time.\n// 5. .carousel-item-next.carousel-item-left and .carousel-item-prev.carousel-item-right\n//    is the upcoming slide in transition.\n\n.carousel {\n  position: relative;\n}\n\n.carousel.pointer-event {\n  touch-action: pan-y;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n  @include clearfix();\n}\n\n.carousel-item {\n  position: relative;\n  display: none;\n  float: left;\n  width: 100%;\n  margin-right: -100%;\n  backface-visibility: hidden;\n  @include transition($carousel-transition);\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n  display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n  transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n  transform: translateX(-100%);\n}\n\n\n//\n// Alternate transitions\n//\n\n.carousel-fade {\n  .carousel-item {\n    opacity: 0;\n    transition-property: opacity;\n    transform: none;\n  }\n\n  .carousel-item.active,\n  .carousel-item-next.carousel-item-left,\n  .carousel-item-prev.carousel-item-right {\n    z-index: 1;\n    opacity: 1;\n  }\n\n  .active.carousel-item-left,\n  .active.carousel-item-right {\n    z-index: 0;\n    opacity: 0;\n    @include transition(opacity 0s $carousel-transition-duration);\n  }\n}\n\n\n//\n// Left/right controls for nav\n//\n\n.carousel-control-prev,\n.carousel-control-next {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  z-index: 1;\n  // Use flex for alignment (1-3)\n  display: flex; // 1. allow flex styles\n  align-items: center; // 2. vertically center contents\n  justify-content: center; // 3. horizontally center contents\n  width: $carousel-control-width;\n  color: $carousel-control-color;\n  text-align: center;\n  opacity: $carousel-control-opacity;\n  @include transition($carousel-control-transition);\n\n  // Hover/focus state\n  @include hover-focus() {\n    color: $carousel-control-color;\n    text-decoration: none;\n    outline: 0;\n    opacity: $carousel-control-hover-opacity;\n  }\n}\n.carousel-control-prev {\n  left: 0;\n  @if $enable-gradients {\n    background-image: linear-gradient(90deg, rgba($black, .25), rgba($black, .001));\n  }\n}\n.carousel-control-next {\n  right: 0;\n  @if $enable-gradients {\n    background-image: linear-gradient(270deg, rgba($black, .25), rgba($black, .001));\n  }\n}\n\n// Icons for within\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n  display: inline-block;\n  width: $carousel-control-icon-width;\n  height: $carousel-control-icon-width;\n  background: 50% / 100% 100% no-repeat;\n}\n.carousel-control-prev-icon {\n  background-image: escape-svg($carousel-control-prev-icon-bg);\n}\n.carousel-control-next-icon {\n  background-image: escape-svg($carousel-control-next-icon-bg);\n}\n\n\n// Optional indicator pips\n//\n// Add an ordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 15;\n  display: flex;\n  justify-content: center;\n  padding-left: 0; // override <ol> default\n  // Use the .carousel-control's width as margin so we don't overlay those\n  margin-right: $carousel-control-width;\n  margin-left: $carousel-control-width;\n  list-style: none;\n\n  li {\n    box-sizing: content-box;\n    flex: 0 1 auto;\n    width: $carousel-indicator-width;\n    height: $carousel-indicator-height;\n    margin-right: $carousel-indicator-spacer;\n    margin-left: $carousel-indicator-spacer;\n    text-indent: -999px;\n    cursor: pointer;\n    background-color: $carousel-indicator-active-bg;\n    background-clip: padding-box;\n    // Use transparent borders to increase the hit area by 10px on top and bottom.\n    border-top: $carousel-indicator-hit-area-height solid transparent;\n    border-bottom: $carousel-indicator-hit-area-height solid transparent;\n    opacity: .5;\n    @include transition($carousel-indicator-transition);\n  }\n\n  .active {\n    opacity: 1;\n  }\n}\n\n\n// Optional captions\n//\n//\n\n.carousel-caption {\n  position: absolute;\n  right: (100% - $carousel-caption-width) / 2;\n  bottom: 20px;\n  left: (100% - $carousel-caption-width) / 2;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: $carousel-caption-color;\n  text-align: center;\n}\n"
  },
  {
    "path": "_sass/bootstrap/_close.scss",
    "content": ".close {\n  float: right;\n  @include font-size($close-font-size);\n  font-weight: $close-font-weight;\n  line-height: 1;\n  color: $close-color;\n  text-shadow: $close-text-shadow;\n  opacity: .5;\n\n  // Override <a>'s hover style\n  @include hover() {\n    color: $close-color;\n    text-decoration: none;\n  }\n\n  &:not(:disabled):not(.disabled) {\n    @include hover-focus() {\n      opacity: .75;\n    }\n  }\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n// stylelint-disable-next-line selector-no-qualifying-type\nbutton.close {\n  padding: 0;\n  background-color: transparent;\n  border: 0;\n}\n\n// Future-proof disabling of clicks on `<a>` elements\n\n// stylelint-disable-next-line selector-no-qualifying-type\na.close.disabled {\n  pointer-events: none;\n}\n"
  },
  {
    "path": "_sass/bootstrap/_code.scss",
    "content": "// Inline code\ncode {\n  @include font-size($code-font-size);\n  color: $code-color;\n  word-wrap: break-word;\n\n  // Streamline the style when inside anchors to avoid broken underline and more\n  a > & {\n    color: inherit;\n  }\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: $kbd-padding-y $kbd-padding-x;\n  @include font-size($kbd-font-size);\n  color: $kbd-color;\n  background-color: $kbd-bg;\n  @include border-radius($border-radius-sm);\n  @include box-shadow($kbd-box-shadow);\n\n  kbd {\n    padding: 0;\n    @include font-size(100%);\n    font-weight: $nested-kbd-font-weight;\n    @include box-shadow(none);\n  }\n}\n\n// Blocks of code\npre {\n  display: block;\n  @include font-size($code-font-size);\n  color: $pre-color;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    @include font-size(inherit);\n    color: inherit;\n    word-break: normal;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: $pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n"
  },
  {
    "path": "_sass/bootstrap/_custom-forms.scss",
    "content": "// Embedded icons from Open Iconic.\n// Released under MIT and copyright 2014 Waybury.\n// https://useiconic.com/open\n\n\n// Checkboxes and radios\n//\n// Base class takes care of all the key behavioral aspects.\n\n.custom-control {\n  position: relative;\n  z-index: 1;\n  display: block;\n  min-height: $font-size-base * $line-height-base;\n  padding-left: $custom-control-gutter + $custom-control-indicator-size;\n  color-adjust: exact; // Keep themed appearance for print\n}\n\n.custom-control-inline {\n  display: inline-flex;\n  margin-right: $custom-control-spacer-x;\n}\n\n.custom-control-input {\n  position: absolute;\n  left: 0;\n  z-index: -1; // Put the input behind the label so it doesn't overlay text\n  width: $custom-control-indicator-size;\n  height: ($font-size-base * $line-height-base + $custom-control-indicator-size) / 2;\n  opacity: 0;\n\n  &:checked ~ .custom-control-label::before {\n    color: $custom-control-indicator-checked-color;\n    border-color: $custom-control-indicator-checked-border-color;\n    @include gradient-bg($custom-control-indicator-checked-bg);\n    @include box-shadow($custom-control-indicator-checked-box-shadow);\n  }\n\n  &:focus ~ .custom-control-label::before {\n    // the mixin is not used here to make sure there is feedback\n    @if $enable-shadows {\n      box-shadow: $input-box-shadow, $custom-control-indicator-focus-box-shadow;\n    } @else {\n      box-shadow: $custom-control-indicator-focus-box-shadow;\n    }\n  }\n\n  &:focus:not(:checked) ~ .custom-control-label::before {\n    border-color: $custom-control-indicator-focus-border-color;\n  }\n\n  &:not(:disabled):active ~ .custom-control-label::before {\n    color: $custom-control-indicator-active-color;\n    background-color: $custom-control-indicator-active-bg;\n    border-color: $custom-control-indicator-active-border-color;\n    @include box-shadow($custom-control-indicator-active-box-shadow);\n  }\n\n  // Use [disabled] and :disabled to work around https://github.com/twbs/bootstrap/issues/28247\n  &[disabled],\n  &:disabled {\n    ~ .custom-control-label {\n      color: $custom-control-label-disabled-color;\n\n      &::before {\n        background-color: $custom-control-indicator-disabled-bg;\n      }\n    }\n  }\n}\n\n// Custom control indicators\n//\n// Build the custom controls out of pseudo-elements.\n\n.custom-control-label {\n  position: relative;\n  margin-bottom: 0;\n  color: $custom-control-label-color;\n  vertical-align: top;\n  cursor: $custom-control-cursor;\n\n  // Background-color and (when enabled) gradient\n  &::before {\n    position: absolute;\n    top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\n    left: -($custom-control-gutter + $custom-control-indicator-size);\n    display: block;\n    width: $custom-control-indicator-size;\n    height: $custom-control-indicator-size;\n    pointer-events: none;\n    content: \"\";\n    background-color: $custom-control-indicator-bg;\n    border: $custom-control-indicator-border-color solid $custom-control-indicator-border-width;\n    @include box-shadow($custom-control-indicator-box-shadow);\n  }\n\n  // Foreground (icon)\n  &::after {\n    position: absolute;\n    top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;\n    left: -($custom-control-gutter + $custom-control-indicator-size);\n    display: block;\n    width: $custom-control-indicator-size;\n    height: $custom-control-indicator-size;\n    content: \"\";\n    background: 50% / #{$custom-control-indicator-bg-size} no-repeat;\n  }\n}\n\n\n// Checkboxes\n//\n// Tweak just a few things for checkboxes.\n\n.custom-checkbox {\n  .custom-control-label::before {\n    @include border-radius($custom-checkbox-indicator-border-radius);\n  }\n\n  .custom-control-input:checked ~ .custom-control-label {\n    &::after {\n      background-image: escape-svg($custom-checkbox-indicator-icon-checked);\n    }\n  }\n\n  .custom-control-input:indeterminate ~ .custom-control-label {\n    &::before {\n      border-color: $custom-checkbox-indicator-indeterminate-border-color;\n      @include gradient-bg($custom-checkbox-indicator-indeterminate-bg);\n      @include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);\n    }\n    &::after {\n      background-image: escape-svg($custom-checkbox-indicator-icon-indeterminate);\n    }\n  }\n\n  .custom-control-input:disabled {\n    &:checked ~ .custom-control-label::before {\n      @include gradient-bg($custom-control-indicator-checked-disabled-bg);\n    }\n    &:indeterminate ~ .custom-control-label::before {\n      @include gradient-bg($custom-control-indicator-checked-disabled-bg);\n    }\n  }\n}\n\n// Radios\n//\n// Tweak just a few things for radios.\n\n.custom-radio {\n  .custom-control-label::before {\n    // stylelint-disable-next-line property-disallowed-list\n    border-radius: $custom-radio-indicator-border-radius;\n  }\n\n  .custom-control-input:checked ~ .custom-control-label {\n    &::after {\n      background-image: escape-svg($custom-radio-indicator-icon-checked);\n    }\n  }\n\n  .custom-control-input:disabled {\n    &:checked ~ .custom-control-label::before {\n      @include gradient-bg($custom-control-indicator-checked-disabled-bg);\n    }\n  }\n}\n\n\n// switches\n//\n// Tweak a few things for switches\n\n.custom-switch {\n  padding-left: $custom-switch-width + $custom-control-gutter;\n\n  .custom-control-label {\n    &::before {\n      left: -($custom-switch-width + $custom-control-gutter);\n      width: $custom-switch-width;\n      pointer-events: all;\n      // stylelint-disable-next-line property-disallowed-list\n      border-radius: $custom-switch-indicator-border-radius;\n    }\n\n    &::after {\n      top: add(($font-size-base * $line-height-base - $custom-control-indicator-size) / 2, $custom-control-indicator-border-width * 2);\n      left: add(-($custom-switch-width + $custom-control-gutter), $custom-control-indicator-border-width * 2);\n      width: $custom-switch-indicator-size;\n      height: $custom-switch-indicator-size;\n      background-color: $custom-control-indicator-border-color;\n      // stylelint-disable-next-line property-disallowed-list\n      border-radius: $custom-switch-indicator-border-radius;\n      @include transition(transform .15s ease-in-out, $custom-forms-transition);\n    }\n  }\n\n  .custom-control-input:checked ~ .custom-control-label {\n    &::after {\n      background-color: $custom-control-indicator-bg;\n      transform: translateX($custom-switch-width - $custom-control-indicator-size);\n    }\n  }\n\n  .custom-control-input:disabled {\n    &:checked ~ .custom-control-label::before {\n      @include gradient-bg($custom-control-indicator-checked-disabled-bg);\n    }\n  }\n}\n\n\n// Select\n//\n// Replaces the browser default select with a custom one, mostly pulled from\n// https://primer.github.io/.\n//\n\n.custom-select {\n  display: inline-block;\n  width: 100%;\n  height: $custom-select-height;\n  padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;\n  font-family: $custom-select-font-family;\n  @include font-size($custom-select-font-size);\n  font-weight: $custom-select-font-weight;\n  line-height: $custom-select-line-height;\n  color: $custom-select-color;\n  vertical-align: middle;\n  background: $custom-select-bg $custom-select-background;\n  border: $custom-select-border-width solid $custom-select-border-color;\n  @include border-radius($custom-select-border-radius, 0);\n  @include box-shadow($custom-select-box-shadow);\n  appearance: none;\n\n  &:focus {\n    border-color: $custom-select-focus-border-color;\n    outline: 0;\n    @if $enable-shadows {\n      @include box-shadow($custom-select-box-shadow, $custom-select-focus-box-shadow);\n    } @else {\n      // Avoid using mixin so we can pass custom focus shadow properly\n      box-shadow: $custom-select-focus-box-shadow;\n    }\n\n    &::-ms-value {\n      // For visual consistency with other platforms/browsers,\n      // suppress the default white text on blue background highlight given to\n      // the selected option text when the (still closed) <select> receives focus\n      // in IE and (under certain conditions) Edge.\n      // See https://github.com/twbs/bootstrap/issues/19398.\n      color: $input-color;\n      background-color: $input-bg;\n    }\n  }\n\n  &[multiple],\n  &[size]:not([size=\"1\"]) {\n    height: auto;\n    padding-right: $custom-select-padding-x;\n    background-image: none;\n  }\n\n  &:disabled {\n    color: $custom-select-disabled-color;\n    background-color: $custom-select-disabled-bg;\n  }\n\n  // Hides the default caret in IE11\n  &::-ms-expand {\n    display: none;\n  }\n\n  // Remove outline from select box in FF\n  &:-moz-focusring {\n    color: transparent;\n    text-shadow: 0 0 0 $custom-select-color;\n  }\n}\n\n.custom-select-sm {\n  height: $custom-select-height-sm;\n  padding-top: $custom-select-padding-y-sm;\n  padding-bottom: $custom-select-padding-y-sm;\n  padding-left: $custom-select-padding-x-sm;\n  @include font-size($custom-select-font-size-sm);\n}\n\n.custom-select-lg {\n  height: $custom-select-height-lg;\n  padding-top: $custom-select-padding-y-lg;\n  padding-bottom: $custom-select-padding-y-lg;\n  padding-left: $custom-select-padding-x-lg;\n  @include font-size($custom-select-font-size-lg);\n}\n\n\n// File\n//\n// Custom file input.\n\n.custom-file {\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  height: $custom-file-height;\n  margin-bottom: 0;\n}\n\n.custom-file-input {\n  position: relative;\n  z-index: 2;\n  width: 100%;\n  height: $custom-file-height;\n  margin: 0;\n  overflow: hidden;\n  opacity: 0;\n\n  &:focus ~ .custom-file-label {\n    border-color: $custom-file-focus-border-color;\n    box-shadow: $custom-file-focus-box-shadow;\n  }\n\n  // Use [disabled] and :disabled to work around https://github.com/twbs/bootstrap/issues/28247\n  &[disabled] ~ .custom-file-label,\n  &:disabled ~ .custom-file-label {\n    background-color: $custom-file-disabled-bg;\n  }\n\n  @each $lang, $value in $custom-file-text {\n    &:lang(#{$lang}) ~ .custom-file-label::after {\n      content: $value;\n    }\n  }\n\n  ~ .custom-file-label[data-browse]::after {\n    content: attr(data-browse);\n  }\n}\n\n.custom-file-label {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1;\n  height: $custom-file-height;\n  padding: $custom-file-padding-y $custom-file-padding-x;\n  overflow: hidden;\n  font-family: $custom-file-font-family;\n  font-weight: $custom-file-font-weight;\n  line-height: $custom-file-line-height;\n  color: $custom-file-color;\n  background-color: $custom-file-bg;\n  border: $custom-file-border-width solid $custom-file-border-color;\n  @include border-radius($custom-file-border-radius);\n  @include box-shadow($custom-file-box-shadow);\n\n  &::after {\n    position: absolute;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    z-index: 3;\n    display: block;\n    height: $custom-file-height-inner;\n    padding: $custom-file-padding-y $custom-file-padding-x;\n    line-height: $custom-file-line-height;\n    color: $custom-file-button-color;\n    content: \"Browse\";\n    @include gradient-bg($custom-file-button-bg);\n    border-left: inherit;\n    @include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);\n  }\n}\n\n// Range\n//\n// Style range inputs the same across browsers. Vendor-specific rules for pseudo\n// elements cannot be mixed. As such, there are no shared styles for focus or\n// active states on prefixed selectors.\n\n.custom-range {\n  width: 100%;\n  height: add($custom-range-thumb-height, $custom-range-thumb-focus-box-shadow-width * 2);\n  padding: 0; // Need to reset padding\n  background-color: transparent;\n  appearance: none;\n\n  &:focus {\n    outline: 0;\n\n    // Pseudo-elements must be split across multiple rulesets to have an effect.\n    // No box-shadow() mixin for focus accessibility.\n    &::-webkit-slider-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }\n    &::-moz-range-thumb     { box-shadow: $custom-range-thumb-focus-box-shadow; }\n    &::-ms-thumb            { box-shadow: $custom-range-thumb-focus-box-shadow; }\n  }\n\n  &::-moz-focus-outer {\n    border: 0;\n  }\n\n  &::-webkit-slider-thumb {\n    width: $custom-range-thumb-width;\n    height: $custom-range-thumb-height;\n    margin-top: ($custom-range-track-height - $custom-range-thumb-height) / 2; // Webkit specific\n    @include gradient-bg($custom-range-thumb-bg);\n    border: $custom-range-thumb-border;\n    @include border-radius($custom-range-thumb-border-radius);\n    @include box-shadow($custom-range-thumb-box-shadow);\n    @include transition($custom-forms-transition);\n    appearance: none;\n\n    &:active {\n      @include gradient-bg($custom-range-thumb-active-bg);\n    }\n  }\n\n  &::-webkit-slider-runnable-track {\n    width: $custom-range-track-width;\n    height: $custom-range-track-height;\n    color: transparent; // Why?\n    cursor: $custom-range-track-cursor;\n    background-color: $custom-range-track-bg;\n    border-color: transparent;\n    @include border-radius($custom-range-track-border-radius);\n    @include box-shadow($custom-range-track-box-shadow);\n  }\n\n  &::-moz-range-thumb {\n    width: $custom-range-thumb-width;\n    height: $custom-range-thumb-height;\n    @include gradient-bg($custom-range-thumb-bg);\n    border: $custom-range-thumb-border;\n    @include border-radius($custom-range-thumb-border-radius);\n    @include box-shadow($custom-range-thumb-box-shadow);\n    @include transition($custom-forms-transition);\n    appearance: none;\n\n    &:active {\n      @include gradient-bg($custom-range-thumb-active-bg);\n    }\n  }\n\n  &::-moz-range-track {\n    width: $custom-range-track-width;\n    height: $custom-range-track-height;\n    color: transparent;\n    cursor: $custom-range-track-cursor;\n    background-color: $custom-range-track-bg;\n    border-color: transparent; // Firefox specific?\n    @include border-radius($custom-range-track-border-radius);\n    @include box-shadow($custom-range-track-box-shadow);\n  }\n\n  &::-ms-thumb {\n    width: $custom-range-thumb-width;\n    height: $custom-range-thumb-height;\n    margin-top: 0; // Edge specific\n    margin-right: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.\n    margin-left: $custom-range-thumb-focus-box-shadow-width;  // Workaround that overflowed box-shadow is hidden.\n    @include gradient-bg($custom-range-thumb-bg);\n    border: $custom-range-thumb-border;\n    @include border-radius($custom-range-thumb-border-radius);\n    @include box-shadow($custom-range-thumb-box-shadow);\n    @include transition($custom-forms-transition);\n    appearance: none;\n\n    &:active {\n      @include gradient-bg($custom-range-thumb-active-bg);\n    }\n  }\n\n  &::-ms-track {\n    width: $custom-range-track-width;\n    height: $custom-range-track-height;\n    color: transparent;\n    cursor: $custom-range-track-cursor;\n    background-color: transparent;\n    border-color: transparent;\n    border-width: $custom-range-thumb-height / 2;\n    @include box-shadow($custom-range-track-box-shadow);\n  }\n\n  &::-ms-fill-lower {\n    background-color: $custom-range-track-bg;\n    @include border-radius($custom-range-track-border-radius);\n  }\n\n  &::-ms-fill-upper {\n    margin-right: 15px; // arbitrary?\n    background-color: $custom-range-track-bg;\n    @include border-radius($custom-range-track-border-radius);\n  }\n\n  &:disabled {\n    &::-webkit-slider-thumb {\n      background-color: $custom-range-thumb-disabled-bg;\n    }\n\n    &::-webkit-slider-runnable-track {\n      cursor: default;\n    }\n\n    &::-moz-range-thumb {\n      background-color: $custom-range-thumb-disabled-bg;\n    }\n\n    &::-moz-range-track {\n      cursor: default;\n    }\n\n    &::-ms-thumb {\n      background-color: $custom-range-thumb-disabled-bg;\n    }\n  }\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n  @include transition($custom-forms-transition);\n}\n"
  },
  {
    "path": "_sass/bootstrap/_dropdown.scss",
    "content": "// The dropdown wrapper (`<div>`)\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n  position: relative;\n}\n\n.dropdown-toggle {\n  white-space: nowrap;\n\n  // Generate the caret automatically\n  @include caret();\n}\n\n// The dropdown menu\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: $zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: $dropdown-min-width;\n  padding: $dropdown-padding-y $dropdown-padding-x;\n  margin: $dropdown-spacer 0 0; // override default ul\n  @include font-size($dropdown-font-size);\n  color: $dropdown-color;\n  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n  list-style: none;\n  background-color: $dropdown-bg;\n  background-clip: padding-box;\n  border: $dropdown-border-width solid $dropdown-border-color;\n  @include border-radius($dropdown-border-radius);\n  @include box-shadow($dropdown-box-shadow);\n}\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n  @include media-breakpoint-up($breakpoint) {\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n    .dropdown-menu#{$infix}-left {\n      right: auto;\n      left: 0;\n    }\n\n    .dropdown-menu#{$infix}-right {\n      right: 0;\n      left: auto;\n    }\n  }\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-top: 0;\n    margin-bottom: $dropdown-spacer;\n  }\n\n  .dropdown-toggle {\n    @include caret(up);\n  }\n}\n\n.dropright {\n  .dropdown-menu {\n    top: 0;\n    right: auto;\n    left: 100%;\n    margin-top: 0;\n    margin-left: $dropdown-spacer;\n  }\n\n  .dropdown-toggle {\n    @include caret(right);\n    &::after {\n      vertical-align: 0;\n    }\n  }\n}\n\n.dropleft {\n  .dropdown-menu {\n    top: 0;\n    right: 100%;\n    left: auto;\n    margin-top: 0;\n    margin-right: $dropdown-spacer;\n  }\n\n  .dropdown-toggle {\n    @include caret(left);\n    &::before {\n      vertical-align: 0;\n    }\n  }\n}\n\n// When Popper is enabled, reset the basic dropdown position\n// stylelint-disable-next-line no-duplicate-selectors\n.dropdown-menu {\n  &[x-placement^=\"top\"],\n  &[x-placement^=\"right\"],\n  &[x-placement^=\"bottom\"],\n  &[x-placement^=\"left\"] {\n    right: auto;\n    bottom: auto;\n  }\n}\n\n// Dividers (basically an `<hr>`) within the dropdown\n.dropdown-divider {\n  @include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y, true);\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `<button>`-specific styles are denoted with `// For <button>s`\n.dropdown-item {\n  display: block;\n  width: 100%; // For `<button>`s\n  padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n  clear: both;\n  font-weight: $font-weight-normal;\n  color: $dropdown-link-color;\n  text-align: inherit; // For `<button>`s\n  text-decoration: if($link-decoration == none, null, none);\n  white-space: nowrap; // prevent links from randomly breaking onto new lines\n  background-color: transparent; // For `<button>`s\n  border: 0; // For `<button>`s\n\n  // Prevent dropdown overflow if there's no padding\n  // See https://github.com/twbs/bootstrap/pull/27703\n  @if $dropdown-padding-y == 0 {\n    &:first-child {\n      @include border-top-radius($dropdown-inner-border-radius);\n    }\n\n    &:last-child {\n      @include border-bottom-radius($dropdown-inner-border-radius);\n    }\n  }\n\n  @include hover-focus() {\n    color: $dropdown-link-hover-color;\n    text-decoration: none;\n    @include gradient-bg($dropdown-link-hover-bg);\n  }\n\n  &.active,\n  &:active {\n    color: $dropdown-link-active-color;\n    text-decoration: none;\n    @include gradient-bg($dropdown-link-active-bg);\n  }\n\n  &.disabled,\n  &:disabled {\n    color: $dropdown-link-disabled-color;\n    pointer-events: none;\n    background-color: transparent;\n    // Remove CSS gradients if they're enabled\n    @if $enable-gradients {\n      background-image: none;\n    }\n  }\n}\n\n.dropdown-menu.show {\n  display: block;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: $dropdown-header-padding;\n  margin-bottom: 0; // for use with heading elements\n  @include font-size($font-size-sm);\n  color: $dropdown-header-color;\n  white-space: nowrap; // as with > li > a\n}\n\n// Dropdown text\n.dropdown-item-text {\n  display: block;\n  padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n  color: $dropdown-link-color;\n}\n"
  },
  {
    "path": "_sass/bootstrap/_forms.scss",
    "content": "// stylelint-disable selector-no-qualifying-type\n\n//\n// Textual form controls\n//\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: $input-height;\n  padding: $input-padding-y $input-padding-x;\n  font-family: $input-font-family;\n  @include font-size($input-font-size);\n  font-weight: $input-font-weight;\n  line-height: $input-line-height;\n  color: $input-color;\n  background-color: $input-bg;\n  background-clip: padding-box;\n  border: $input-border-width solid $input-border-color;\n\n  // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.\n  @include border-radius($input-border-radius, 0);\n\n  @include box-shadow($input-box-shadow);\n  @include transition($input-transition);\n\n  // Unstyle the caret on `<select>`s in IE10+.\n  &::-ms-expand {\n    background-color: transparent;\n    border: 0;\n  }\n\n  // Remove select outline from select box in FF\n  &:-moz-focusring {\n    color: transparent;\n    text-shadow: 0 0 0 $input-color;\n  }\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  @include form-control-focus($ignore-warning: true);\n\n  // Placeholder\n  &::placeholder {\n    color: $input-placeholder-color;\n    // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.\n    opacity: 1;\n  }\n\n  // Disabled and read-only inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &:disabled,\n  &[readonly] {\n    background-color: $input-disabled-bg;\n    // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.\n    opacity: 1;\n  }\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  &.form-control {\n    appearance: none; // Fix appearance for date inputs in Safari\n  }\n}\n\nselect.form-control {\n  &:focus::-ms-value {\n    // Suppress the nested default white text on blue background highlight given to\n    // the selected option text when the (still closed) <select> receives focus\n    // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to\n    // match the appearance of the native widget.\n    // See https://github.com/twbs/bootstrap/issues/19398.\n    color: $input-color;\n    background-color: $input-bg;\n  }\n}\n\n// Make file inputs better match text inputs by forcing them to new lines.\n.form-control-file,\n.form-control-range {\n  display: block;\n  width: 100%;\n}\n\n\n//\n// Labels\n//\n\n// For use with horizontal and inline forms, when you need the label (or legend)\n// text to align with the form controls.\n.col-form-label {\n  padding-top: add($input-padding-y, $input-border-width);\n  padding-bottom: add($input-padding-y, $input-border-width);\n  margin-bottom: 0; // Override the `<label>/<legend>` default\n  @include font-size(inherit); // Override the `<legend>` default\n  line-height: $input-line-height;\n}\n\n.col-form-label-lg {\n  padding-top: add($input-padding-y-lg, $input-border-width);\n  padding-bottom: add($input-padding-y-lg, $input-border-width);\n  @include font-size($input-font-size-lg);\n  line-height: $input-line-height-lg;\n}\n\n.col-form-label-sm {\n  padding-top: add($input-padding-y-sm, $input-border-width);\n  padding-bottom: add($input-padding-y-sm, $input-border-width);\n  @include font-size($input-font-size-sm);\n  line-height: $input-line-height-sm;\n}\n\n\n// Readonly controls as plain text\n//\n// Apply class to a readonly input to make it appear like regular plain\n// text (without any border, background color, focus indicator)\n\n.form-control-plaintext {\n  display: block;\n  width: 100%;\n  padding: $input-padding-y 0;\n  margin-bottom: 0; // match inputs if this class comes on inputs with default margins\n  @include font-size($input-font-size);\n  line-height: $input-line-height;\n  color: $input-plaintext-color;\n  background-color: transparent;\n  border: solid transparent;\n  border-width: $input-border-width 0;\n\n  &.form-control-sm,\n  &.form-control-lg {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// Repeated in `_input_group.scss` to avoid Sass extend issues.\n\n.form-control-sm {\n  height: $input-height-sm;\n  padding: $input-padding-y-sm $input-padding-x-sm;\n  @include font-size($input-font-size-sm);\n  line-height: $input-line-height-sm;\n  @include border-radius($input-border-radius-sm);\n}\n\n.form-control-lg {\n  height: $input-height-lg;\n  padding: $input-padding-y-lg $input-padding-x-lg;\n  @include font-size($input-font-size-lg);\n  line-height: $input-line-height-lg;\n  @include border-radius($input-border-radius-lg);\n}\n\n// stylelint-disable-next-line no-duplicate-selectors\nselect.form-control {\n  &[size],\n  &[multiple] {\n    height: auto;\n  }\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: $form-group-margin-bottom;\n}\n\n.form-text {\n  display: block;\n  margin-top: $form-text-margin-top;\n}\n\n\n// Form grid\n//\n// Special replacement for our grid system's `.row` for tighter form layouts.\n\n.form-row {\n  display: flex;\n  flex-wrap: wrap;\n  margin-right: -$form-grid-gutter-width / 2;\n  margin-left: -$form-grid-gutter-width / 2;\n\n  > .col,\n  > [class*=\"col-\"] {\n    padding-right: $form-grid-gutter-width / 2;\n    padding-left: $form-grid-gutter-width / 2;\n  }\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.form-check {\n  position: relative;\n  display: block;\n  padding-left: $form-check-input-gutter;\n}\n\n.form-check-input {\n  position: absolute;\n  margin-top: $form-check-input-margin-y;\n  margin-left: -$form-check-input-gutter;\n\n  // Use [disabled] and :disabled for workaround https://github.com/twbs/bootstrap/issues/28247\n  &[disabled] ~ .form-check-label,\n  &:disabled ~ .form-check-label {\n    color: $text-muted;\n  }\n}\n\n.form-check-label {\n  margin-bottom: 0; // Override default `<label>` bottom margin\n}\n\n.form-check-inline {\n  display: inline-flex;\n  align-items: center;\n  padding-left: 0; // Override base .form-check\n  margin-right: $form-check-inline-margin-x;\n\n  // Undo .form-check-input defaults and add some `margin-right`.\n  .form-check-input {\n    position: static;\n    margin-top: 0;\n    margin-right: $form-check-inline-input-margin-x;\n    margin-left: 0;\n  }\n}\n\n\n// Form validation\n//\n// Provide feedback to users when form field values are valid or invalid. Works\n// primarily for client-side validation via scoped `:invalid` and `:valid`\n// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for\n// server side validation.\n\n@each $state, $data in $form-validation-states {\n  @include form-validation-state($state, map-get($data, color), map-get($data, icon));\n}\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n\n.form-inline {\n  display: flex;\n  flex-flow: row wrap;\n  align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)\n\n  // Because we use flex, the initial sizing of checkboxes is collapsed and\n  // doesn't occupy the full-width (which is what we want for xs grid tier),\n  // so we force that here.\n  .form-check {\n    width: 100%;\n  }\n\n  // Kick in the inline\n  @include media-breakpoint-up(sm) {\n    label {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      margin-bottom: 0;\n    }\n\n    // Inline-block all the things for \"inline\"\n    .form-group {\n      display: flex;\n      flex: 0 0 auto;\n      flex-flow: row wrap;\n      align-items: center;\n      margin-bottom: 0;\n    }\n\n    // Allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\n      vertical-align: middle;\n    }\n\n    // Make static controls behave like regular ones\n    .form-control-plaintext {\n      display: inline-block;\n    }\n\n    .input-group,\n    .custom-select {\n      width: auto;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match.\n    .form-check {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: auto;\n      padding-left: 0;\n    }\n    .form-check-input {\n      position: relative;\n      flex-shrink: 0;\n      margin-top: 0;\n      margin-right: $form-check-input-margin-x;\n      margin-left: 0;\n    }\n\n    .custom-control {\n      align-items: center;\n      justify-content: center;\n    }\n    .custom-control-label {\n      margin-bottom: 0;\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/_functions.scss",
    "content": "// Bootstrap functions\n//\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\n\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n  $prev-key: null;\n  $prev-num: null;\n  @each $key, $num in $map {\n    @if $prev-num == null or unit($num) == \"%\" or unit($prev-num) == \"%\" {\n      // Do nothing\n    } @else if not comparable($prev-num, $num) {\n      @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n    } @else if $prev-num >= $num {\n      @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n    }\n    $prev-key: $key;\n    $prev-num: $num;\n  }\n}\n\n// Starts at zero\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map, $map-name: \"$grid-breakpoints\") {\n  @if length($map) > 0 {\n    $values: map-values($map);\n    $first-value: nth($values, 1);\n    @if $first-value != 0 {\n      @warn \"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\";\n    }\n  }\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Hugo Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n  $index: str-index($string, $search);\n\n  @if $index {\n    @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n  }\n\n  @return $string;\n}\n\n// See https://codepen.io/kevinweber/pen/dXWoRw\n//\n// Requires the use of quotes around data URIs.\n\n@function escape-svg($string) {\n  @if str-index($string, \"data:image/svg+xml\") {\n    @each $char, $encoded in $escaped-characters {\n      // Do not escape the url brackets\n      @if str-index($string, \"url(\") == 1 {\n        $string: url(\"#{str-replace(str-slice($string, 6, -3), $char, $encoded)}\");\n      } @else {\n        $string: str-replace($string, $char, $encoded);\n      }\n    }\n  }\n\n  @return $string;\n}\n\n// Color contrast\n@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {\n  $r: red($color);\n  $g: green($color);\n  $b: blue($color);\n\n  $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;\n\n  @if ($yiq >= $yiq-contrasted-threshold) {\n    @return $dark;\n  } @else {\n    @return $light;\n  }\n}\n\n// Retrieve color Sass maps\n@function color($key: \"blue\") {\n  @return map-get($colors, $key);\n}\n\n@function theme-color($key: \"primary\") {\n  @return map-get($theme-colors, $key);\n}\n\n@function gray($key: \"100\") {\n  @return map-get($grays, $key);\n}\n\n// Request a theme color level\n@function theme-color-level($color-name: \"primary\", $level: 0) {\n  $color: theme-color($color-name);\n  $color-base: if($level > 0, $black, $white);\n  $level: abs($level);\n\n  @return mix($color-base, $color, $level * $theme-color-interval);\n}\n\n// Return valid calc\n@function add($value1, $value2, $return-calc: true) {\n  @if $value1 == null {\n    @return $value2;\n  }\n\n  @if $value2 == null {\n    @return $value1;\n  }\n\n  @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n    @return $value1 + $value2;\n  }\n\n  @return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(\" + \") + $value2);\n}\n\n@function subtract($value1, $value2, $return-calc: true) {\n  @if $value1 == null and $value2 == null {\n    @return null;\n  }\n\n  @if $value1 == null {\n    @return -$value2;\n  }\n\n  @if $value2 == null {\n    @return $value1;\n  }\n\n  @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n    @return $value1 - $value2;\n  }\n\n  @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(\" - \") + $value2);\n}\n"
  },
  {
    "path": "_sass/bootstrap/_grid.scss",
    "content": "// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n  // Single container class with breakpoint max-widths\n  .container,\n  // 100% wide container at all breakpoints\n  .container-fluid {\n    @include make-container();\n  }\n\n  // Responsive containers that are 100% wide until a breakpoint\n  @each $breakpoint, $container-max-width in $container-max-widths {\n    .container-#{$breakpoint} {\n      @extend .container-fluid;\n    }\n\n    @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n      %responsive-container-#{$breakpoint} {\n        max-width: $container-max-width;\n      }\n\n      // Extend each breakpoint which is smaller or equal to the current breakpoint\n      $extend-breakpoint: true;\n\n      @each $name, $width in $grid-breakpoints {\n        @if ($extend-breakpoint) {\n          .container#{breakpoint-infix($name, $grid-breakpoints)} {\n            @extend %responsive-container-#{$breakpoint};\n          }\n\n          // Once the current breakpoint is reached, stop extending\n          @if ($breakpoint == $name) {\n            $extend-breakpoint: false;\n          }\n        }\n      }\n    }\n  }\n}\n\n\n// Row\n//\n// Rows contain your columns.\n\n@if $enable-grid-classes {\n  .row {\n    @include make-row();\n  }\n\n  // Remove the negative margin from default .row, then the horizontal padding\n  // from all immediate children columns (to prevent runaway style inheritance).\n  .no-gutters {\n    margin-right: 0;\n    margin-left: 0;\n\n    > .col,\n    > [class*=\"col-\"] {\n      padding-right: 0;\n      padding-left: 0;\n    }\n  }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n  @include make-grid-columns();\n}\n"
  },
  {
    "path": "_sass/bootstrap/_images.scss",
    "content": "// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n  @include img-fluid();\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n  padding: $thumbnail-padding;\n  background-color: $thumbnail-bg;\n  border: $thumbnail-border-width solid $thumbnail-border-color;\n  @include border-radius($thumbnail-border-radius);\n  @include box-shadow($thumbnail-box-shadow);\n\n  // Keep them at most 100% wide\n  @include img-fluid();\n}\n\n//\n// Figures\n//\n\n.figure {\n  // Ensures the caption's text aligns with the image.\n  display: inline-block;\n}\n\n.figure-img {\n  margin-bottom: $spacer / 2;\n  line-height: 1;\n}\n\n.figure-caption {\n  @include font-size($figure-caption-font-size);\n  color: $figure-caption-color;\n}\n"
  },
  {
    "path": "_sass/bootstrap/_input-group.scss",
    "content": "// stylelint-disable selector-no-qualifying-type\n\n//\n// Base styles\n//\n\n.input-group {\n  position: relative;\n  display: flex;\n  flex-wrap: wrap; // For form validation feedback\n  align-items: stretch;\n  width: 100%;\n\n  > .form-control,\n  > .form-control-plaintext,\n  > .custom-select,\n  > .custom-file {\n    position: relative; // For focus state's z-index\n    flex: 1 1 auto;\n    width: 1%;\n    min-width: 0; // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size\n    margin-bottom: 0;\n\n    + .form-control,\n    + .custom-select,\n    + .custom-file {\n      margin-left: -$input-border-width;\n    }\n  }\n\n  // Bring the \"active\" form control to the top of surrounding elements\n  > .form-control:focus,\n  > .custom-select:focus,\n  > .custom-file .custom-file-input:focus ~ .custom-file-label {\n    z-index: 3;\n  }\n\n  // Bring the custom file input above the label\n  > .custom-file .custom-file-input:focus {\n    z-index: 4;\n  }\n\n  > .form-control,\n  > .custom-select {\n    &:not(:first-child) { @include border-left-radius(0); }\n  }\n\n  // Custom file inputs have more complex markup, thus requiring different\n  // border-radius overrides.\n  > .custom-file {\n    display: flex;\n    align-items: center;\n\n    &:not(:last-child) .custom-file-label,\n    &:not(:first-child) .custom-file-label { @include border-left-radius(0); }\n  }\n\n  &:not(.has-validation) {\n    > .form-control:not(:last-child),\n    > .custom-select:not(:last-child),\n    > .custom-file:not(:last-child) .custom-file-label::after {\n      @include border-right-radius(0);\n    }\n  }\n\n  &.has-validation {\n    > .form-control:nth-last-child(n + 3),\n    > .custom-select:nth-last-child(n + 3),\n    > .custom-file:nth-last-child(n + 3) .custom-file-label::after {\n      @include border-right-radius(0);\n    }\n  }\n}\n\n\n// Prepend and append\n//\n// While it requires one extra layer of HTML for each, dedicated prepend and\n// append elements allow us to 1) be less clever, 2) simplify our selectors, and\n// 3) support HTML5 form validation.\n\n.input-group-prepend,\n.input-group-append {\n  display: flex;\n\n  // Ensure buttons are always above inputs for more visually pleasing borders.\n  // This isn't needed for `.input-group-text` since it shares the same border-color\n  // as our inputs.\n  .btn {\n    position: relative;\n    z-index: 2;\n\n    &:focus {\n      z-index: 3;\n    }\n  }\n\n  .btn + .btn,\n  .btn + .input-group-text,\n  .input-group-text + .input-group-text,\n  .input-group-text + .btn {\n    margin-left: -$input-border-width;\n  }\n}\n\n.input-group-prepend { margin-right: -$input-border-width; }\n.input-group-append { margin-left: -$input-border-width; }\n\n\n// Textual addons\n//\n// Serves as a catch-all element for any text or radio/checkbox input you wish\n// to prepend or append to an input.\n\n.input-group-text {\n  display: flex;\n  align-items: center;\n  padding: $input-padding-y $input-padding-x;\n  margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom\n  @include font-size($input-font-size); // Match inputs\n  font-weight: $font-weight-normal;\n  line-height: $input-line-height;\n  color: $input-group-addon-color;\n  text-align: center;\n  white-space: nowrap;\n  background-color: $input-group-addon-bg;\n  border: $input-border-width solid $input-group-addon-border-color;\n  @include border-radius($input-border-radius);\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n\n// Sizing\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n  height: $input-height-lg;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n  padding: $input-padding-y-lg $input-padding-x-lg;\n  @include font-size($input-font-size-lg);\n  line-height: $input-line-height-lg;\n  @include border-radius($input-border-radius-lg);\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n  height: $input-height-sm;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n  padding: $input-padding-y-sm $input-padding-x-sm;\n  @include font-size($input-font-size-sm);\n  line-height: $input-line-height-sm;\n  @include border-radius($input-border-radius-sm);\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n  padding-right: $custom-select-padding-x + $custom-select-indicator-padding;\n}\n\n\n// Prepend and append rounded corners\n//\n// These rulesets must come after the sizing ones to properly override sm and lg\n// border-radius values when extending. They're more specific than we'd like\n// with the `.input-group >` part, but without it, we cannot override the sizing.\n\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .btn,\n.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .input-group-text,\n.input-group.has-validation > .input-group-append:nth-last-child(n + 3) > .btn,\n.input-group.has-validation > .input-group-append:nth-last-child(n + 3) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n  @include border-right-radius(0);\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n  @include border-left-radius(0);\n}\n"
  },
  {
    "path": "_sass/bootstrap/_jumbotron.scss",
    "content": ".jumbotron {\n  padding: $jumbotron-padding ($jumbotron-padding / 2);\n  margin-bottom: $jumbotron-padding;\n  color: $jumbotron-color;\n  background-color: $jumbotron-bg;\n  @include border-radius($border-radius-lg);\n\n  @include media-breakpoint-up(sm) {\n    padding: ($jumbotron-padding * 2) $jumbotron-padding;\n  }\n}\n\n.jumbotron-fluid {\n  padding-right: 0;\n  padding-left: 0;\n  @include border-radius(0);\n}\n"
  },
  {
    "path": "_sass/bootstrap/_list-group.scss",
    "content": "// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n  display: flex;\n  flex-direction: column;\n\n  // No need to set list-style: none; since .list-group-item is block level\n  padding-left: 0; // reset padding because ul and ol\n  margin-bottom: 0;\n  @include border-radius($list-group-border-radius);\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive\n// list items. Includes an extra `.active` modifier class for selected items.\n\n.list-group-item-action {\n  width: 100%; // For `<button>`s (anchors become 100% by default though)\n  color: $list-group-action-color;\n  text-align: inherit; // For `<button>`s (anchors inherit)\n\n  // Hover state\n  @include hover-focus() {\n    z-index: 1; // Place hover/focus items above their siblings for proper border styling\n    color: $list-group-action-hover-color;\n    text-decoration: none;\n    background-color: $list-group-hover-bg;\n  }\n\n  &:active {\n    color: $list-group-action-active-color;\n    background-color: $list-group-action-active-bg;\n  }\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: $list-group-item-padding-y $list-group-item-padding-x;\n  color: $list-group-color;\n  text-decoration: if($link-decoration == none, null, none);\n  background-color: $list-group-bg;\n  border: $list-group-border-width solid $list-group-border-color;\n\n  &:first-child {\n    @include border-top-radius(inherit);\n  }\n\n  &:last-child {\n    @include border-bottom-radius(inherit);\n  }\n\n  &.disabled,\n  &:disabled {\n    color: $list-group-disabled-color;\n    pointer-events: none;\n    background-color: $list-group-disabled-bg;\n  }\n\n  // Include both here for `<a>`s and `<button>`s\n  &.active {\n    z-index: 2; // Place active items above their siblings for proper border styling\n    color: $list-group-active-color;\n    background-color: $list-group-active-bg;\n    border-color: $list-group-active-border-color;\n  }\n\n  & + & {\n    border-top-width: 0;\n\n    &.active {\n      margin-top: -$list-group-border-width;\n      border-top-width: $list-group-border-width;\n    }\n  }\n}\n\n\n// Horizontal\n//\n// Change the layout of list group items from vertical (default) to horizontal.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n  @include media-breakpoint-up($breakpoint) {\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n    .list-group-horizontal#{$infix} {\n      flex-direction: row;\n\n      > .list-group-item {\n        &:first-child {\n          @include border-bottom-left-radius($list-group-border-radius);\n          @include border-top-right-radius(0);\n        }\n\n        &:last-child {\n          @include border-top-right-radius($list-group-border-radius);\n          @include border-bottom-left-radius(0);\n        }\n\n        &.active {\n          margin-top: 0;\n        }\n\n        + .list-group-item {\n          border-top-width: $list-group-border-width;\n          border-left-width: 0;\n\n          &.active {\n            margin-left: -$list-group-border-width;\n            border-left-width: $list-group-border-width;\n          }\n        }\n      }\n    }\n  }\n}\n\n\n// Flush list items\n//\n// Remove borders and border-radius to keep list group items edge-to-edge. Most\n// useful within other components (e.g., cards).\n\n.list-group-flush {\n  @include border-radius(0);\n\n  > .list-group-item {\n    border-width: 0 0 $list-group-border-width;\n\n    &:last-child {\n      border-bottom-width: 0;\n    }\n  }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@each $color, $value in $theme-colors {\n  @include list-group-item-variant($color, theme-color-level($color, -9), theme-color-level($color, 6));\n}\n"
  },
  {
    "path": "_sass/bootstrap/_media.scss",
    "content": ".media {\n  display: flex;\n  align-items: flex-start;\n}\n\n.media-body {\n  flex: 1;\n}\n"
  },
  {
    "path": "_sass/bootstrap/_mixins.scss",
    "content": "// Toggles\n//\n// Used in conjunction with global variables to enable certain theme features.\n\n// Vendor\n@import \"vendor/rfs\";\n\n// Deprecate\n@import \"mixins/deprecate\";\n\n// Utilities\n@import \"mixins/breakpoints\";\n@import \"mixins/hover\";\n@import \"mixins/image\";\n@import \"mixins/badge\";\n@import \"mixins/resize\";\n@import \"mixins/screen-reader\";\n@import \"mixins/size\";\n@import \"mixins/reset-text\";\n@import \"mixins/text-emphasis\";\n@import \"mixins/text-hide\";\n@import \"mixins/text-truncate\";\n@import \"mixins/visibility\";\n\n// Components\n@import \"mixins/alert\";\n@import \"mixins/buttons\";\n@import \"mixins/caret\";\n@import \"mixins/pagination\";\n@import \"mixins/lists\";\n@import \"mixins/list-group\";\n@import \"mixins/nav-divider\";\n@import \"mixins/forms\";\n@import \"mixins/table-row\";\n\n// Skins\n@import \"mixins/background-variant\";\n@import \"mixins/border-radius\";\n@import \"mixins/box-shadow\";\n@import \"mixins/gradients\";\n@import \"mixins/transition\";\n\n// Layout\n@import \"mixins/clearfix\";\n@import \"mixins/grid-framework\";\n@import \"mixins/grid\";\n@import \"mixins/float\";\n"
  },
  {
    "path": "_sass/bootstrap/_modal.scss",
    "content": "// .modal-open      - body class for killing the scroll\n// .modal           - container to scroll within\n// .modal-dialog    - positioning shell for the actual modal\n// .modal-content   - actual modal w/ bg and corners and stuff\n\n\n.modal-open {\n  // Kill the scroll on the body\n  overflow: hidden;\n\n  .modal {\n    overflow-x: hidden;\n    overflow-y: auto;\n  }\n}\n\n// Container that the modal scrolls within\n.modal {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: $zindex-modal;\n  display: none;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  // Prevent Chrome on Windows from adding a focus outline. For details, see\n  // https://github.com/twbs/bootstrap/pull/10951.\n  outline: 0;\n  // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a\n  // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342\n  // See also https://github.com/twbs/bootstrap/issues/17695\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: $modal-dialog-margin;\n  // allow clicks to pass through for custom click handling to close modal\n  pointer-events: none;\n\n  // When fading in the modal, animate it to slide down\n  .modal.fade & {\n    @include transition($modal-transition);\n    transform: $modal-fade-transform;\n  }\n  .modal.show & {\n    transform: $modal-show-transform;\n  }\n\n  // When trying to close, animate focus to scale\n  .modal.modal-static & {\n    transform: $modal-scale-transform;\n  }\n}\n\n.modal-dialog-scrollable {\n  display: flex; // IE10/11\n  max-height: subtract(100%, $modal-dialog-margin * 2);\n\n  .modal-content {\n    max-height: subtract(100vh, $modal-dialog-margin * 2); // IE10/11\n    overflow: hidden;\n  }\n\n  .modal-header,\n  .modal-footer {\n    flex-shrink: 0;\n  }\n\n  .modal-body {\n    overflow-y: auto;\n  }\n}\n\n.modal-dialog-centered {\n  display: flex;\n  align-items: center;\n  min-height: subtract(100%, $modal-dialog-margin * 2);\n\n  // Ensure `modal-dialog-centered` extends the full height of the view (IE10/11)\n  &::before {\n    display: block; // IE10\n    height: subtract(100vh, $modal-dialog-margin * 2);\n    height: min-content; // Reset height to 0 except on IE\n    content: \"\";\n  }\n\n  // Ensure `.modal-body` shows scrollbar (IE10/11)\n  &.modal-dialog-scrollable {\n    flex-direction: column;\n    justify-content: center;\n    height: 100%;\n\n    .modal-content {\n      max-height: none;\n    }\n\n    &::before {\n      content: none;\n    }\n  }\n}\n\n// Actual modal\n.modal-content {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`\n  // counteract the pointer-events: none; in the .modal-dialog\n  color: $modal-content-color;\n  pointer-events: auto;\n  background-color: $modal-content-bg;\n  background-clip: padding-box;\n  border: $modal-content-border-width solid $modal-content-border-color;\n  @include border-radius($modal-content-border-radius);\n  @include box-shadow($modal-content-box-shadow-xs);\n  // Remove focus outline from opened modal\n  outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: $zindex-modal-backdrop;\n  width: 100vw;\n  height: 100vh;\n  background-color: $modal-backdrop-bg;\n\n  // Fade for backdrop\n  &.fade { opacity: 0; }\n  &.show { opacity: $modal-backdrop-opacity; }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n  display: flex;\n  align-items: flex-start; // so the close btn always stays on the upper right corner\n  justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends\n  padding: $modal-header-padding;\n  border-bottom: $modal-header-border-width solid $modal-header-border-color;\n  @include border-top-radius($modal-content-inner-border-radius);\n\n  .close {\n    padding: $modal-header-padding;\n    // auto on the left force icon to the right even when there is no .modal-title\n    margin: (-$modal-header-padding-y) (-$modal-header-padding-x) (-$modal-header-padding-y) auto;\n  }\n}\n\n// Title text within header\n.modal-title {\n  margin-bottom: 0;\n  line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n  position: relative;\n  // Enable `flex-grow: 1` so that the body take up as much space as possible\n  // when there should be a fixed height on `.modal-dialog`.\n  flex: 1 1 auto;\n  padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center; // vertically center\n  justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items\n  padding: $modal-inner-padding - $modal-footer-margin-between / 2;\n  border-top: $modal-footer-border-width solid $modal-footer-border-color;\n  @include border-bottom-radius($modal-content-inner-border-radius);\n\n  // Place margin between footer elements\n  // This solution is far from ideal because of the universal selector usage,\n  // but is needed to fix https://github.com/twbs/bootstrap/issues/24800\n  > * {\n    margin: $modal-footer-margin-between / 2;\n  }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n// Scale up the modal\n@include media-breakpoint-up(sm) {\n  // Automatically set modal's width for larger viewports\n  .modal-dialog {\n    max-width: $modal-md;\n    margin: $modal-dialog-margin-y-sm-up auto;\n  }\n\n  .modal-dialog-scrollable {\n    max-height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);\n\n    .modal-content {\n      max-height: subtract(100vh, $modal-dialog-margin-y-sm-up * 2);\n    }\n  }\n\n  .modal-dialog-centered {\n    min-height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);\n\n    &::before {\n      height: subtract(100vh, $modal-dialog-margin-y-sm-up * 2);\n      height: min-content;\n    }\n  }\n\n  .modal-content {\n    @include box-shadow($modal-content-box-shadow-sm-up);\n  }\n\n  .modal-sm { max-width: $modal-sm; }\n}\n\n@include media-breakpoint-up(lg) {\n  .modal-lg,\n  .modal-xl {\n    max-width: $modal-lg;\n  }\n}\n\n@include media-breakpoint-up(xl) {\n  .modal-xl { max-width: $modal-xl; }\n}\n"
  },
  {
    "path": "_sass/bootstrap/_nav.scss",
    "content": "// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// `<nav>`s, `<ul>`s or `<ol>`s.\n\n.nav {\n  display: flex;\n  flex-wrap: wrap;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav-link {\n  display: block;\n  padding: $nav-link-padding-y $nav-link-padding-x;\n  text-decoration: if($link-decoration == none, null, none);\n\n  @include hover-focus() {\n    text-decoration: none;\n  }\n\n  // Disabled state lightens text\n  &.disabled {\n    color: $nav-link-disabled-color;\n    pointer-events: none;\n    cursor: default;\n  }\n}\n\n//\n// Tabs\n//\n\n.nav-tabs {\n  border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;\n\n  .nav-link {\n    margin-bottom: -$nav-tabs-border-width;\n    border: $nav-tabs-border-width solid transparent;\n    @include border-top-radius($nav-tabs-border-radius);\n\n    @include hover-focus() {\n      border-color: $nav-tabs-link-hover-border-color;\n    }\n\n    &.disabled {\n      color: $nav-link-disabled-color;\n      background-color: transparent;\n      border-color: transparent;\n    }\n  }\n\n  .nav-link.active,\n  .nav-item.show .nav-link {\n    color: $nav-tabs-link-active-color;\n    background-color: $nav-tabs-link-active-bg;\n    border-color: $nav-tabs-link-active-border-color;\n  }\n\n  .dropdown-menu {\n    // Make dropdown border overlap tab border\n    margin-top: -$nav-tabs-border-width;\n    // Remove the top rounded corners here since there is a hard edge above the menu\n    @include border-top-radius(0);\n  }\n}\n\n\n//\n// Pills\n//\n\n.nav-pills {\n  .nav-link {\n    @include border-radius($nav-pills-border-radius);\n  }\n\n  .nav-link.active,\n  .show > .nav-link {\n    color: $nav-pills-link-active-color;\n    background-color: $nav-pills-link-active-bg;\n  }\n}\n\n\n//\n// Justified variants\n//\n\n.nav-fill {\n  > .nav-link,\n  .nav-item {\n    flex: 1 1 auto;\n    text-align: center;\n  }\n}\n\n.nav-justified {\n  > .nav-link,\n  .nav-item {\n    flex-basis: 0;\n    flex-grow: 1;\n    text-align: center;\n  }\n}\n\n\n// Tabbable tabs\n//\n// Hide tabbable panes to start, show them when `.active`\n\n.tab-content {\n  > .tab-pane {\n    display: none;\n  }\n  > .active {\n    display: block;\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/_navbar.scss",
    "content": "// Contents\n//\n// Navbar\n// Navbar brand\n// Navbar nav\n// Navbar text\n// Navbar divider\n// Responsive navbar\n// Navbar position\n// Navbar themes\n\n\n// Navbar\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  display: flex;\n  flex-wrap: wrap; // allow us to do the line break for collapsing content\n  align-items: center;\n  justify-content: space-between; // space out brand from logo\n  padding: $navbar-padding-y $navbar-padding-x;\n\n  // Because flex properties aren't inherited, we need to redeclare these first\n  // few properties so that content nested within behave properly.\n  %container-flex-properties {\n    display: flex;\n    flex-wrap: wrap;\n    align-items: center;\n    justify-content: space-between;\n  }\n\n  .container,\n  .container-fluid {\n    @extend %container-flex-properties;\n  }\n\n  @each $breakpoint, $container-max-width in $container-max-widths {\n    > .container#{breakpoint-infix($breakpoint, $container-max-widths)} {\n      @extend %container-flex-properties;\n    }\n  }\n}\n\n\n// Navbar brand\n//\n// Used for brand, project, or site names.\n\n.navbar-brand {\n  display: inline-block;\n  padding-top: $navbar-brand-padding-y;\n  padding-bottom: $navbar-brand-padding-y;\n  margin-right: $navbar-padding-x;\n  @include font-size($navbar-brand-font-size);\n  line-height: inherit;\n  white-space: nowrap;\n\n  @include hover-focus() {\n    text-decoration: none;\n  }\n}\n\n\n// Navbar nav\n//\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\n\n.navbar-nav {\n  display: flex;\n  flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n\n  .nav-link {\n    padding-right: 0;\n    padding-left: 0;\n  }\n\n  .dropdown-menu {\n    position: static;\n    float: none;\n  }\n}\n\n\n// Navbar text\n//\n//\n\n.navbar-text {\n  display: inline-block;\n  padding-top: $nav-link-padding-y;\n  padding-bottom: $nav-link-padding-y;\n}\n\n\n// Responsive navbar\n//\n// Custom styles for responsive collapsing and toggling of navbar contents.\n// Powered by the collapse Bootstrap JavaScript plugin.\n\n// When collapsed, prevent the toggleable navbar contents from appearing in\n// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`\n// on the `.navbar` parent.\n.navbar-collapse {\n  flex-basis: 100%;\n  flex-grow: 1;\n  // For always expanded or extra full navbars, ensure content aligns itself\n  // properly vertically. Can be easily overridden with flex utilities.\n  align-items: center;\n}\n\n// Button for toggling the navbar when in its collapsed state\n.navbar-toggler {\n  padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;\n  @include font-size($navbar-toggler-font-size);\n  line-height: 1;\n  background-color: transparent; // remove default button style\n  border: $border-width solid transparent; // remove default button style\n  @include border-radius($navbar-toggler-border-radius);\n\n  @include hover-focus() {\n    text-decoration: none;\n  }\n}\n\n// Keep as a separate element so folks can easily override it with another icon\n// or image file as needed.\n.navbar-toggler-icon {\n  display: inline-block;\n  width: 1.5em;\n  height: 1.5em;\n  vertical-align: middle;\n  content: \"\";\n  background: 50% / 100% 100% no-repeat;\n}\n\n.navbar-nav-scroll {\n  max-height: $navbar-nav-scroll-max-height;\n  overflow-y: auto;\n}\n\n// Generate series of `.navbar-expand-*` responsive classes for configuring\n// where your navbar collapses.\n.navbar-expand {\n  @each $breakpoint in map-keys($grid-breakpoints) {\n    $next: breakpoint-next($breakpoint, $grid-breakpoints);\n    $infix: breakpoint-infix($next, $grid-breakpoints);\n\n    &#{$infix} {\n      @include media-breakpoint-down($breakpoint) {\n        %container-navbar-expand-#{$breakpoint} {\n          padding-right: 0;\n          padding-left: 0;\n        }\n\n        > .container,\n        > .container-fluid {\n          @extend %container-navbar-expand-#{$breakpoint};\n        }\n\n        @each $size, $container-max-width in $container-max-widths {\n          > .container#{breakpoint-infix($size, $container-max-widths)} {\n            @extend %container-navbar-expand-#{$breakpoint};\n          }\n        }\n      }\n\n      @include media-breakpoint-up($next) {\n        flex-flow: row nowrap;\n        justify-content: flex-start;\n\n        .navbar-nav {\n          flex-direction: row;\n\n          .dropdown-menu {\n            position: absolute;\n          }\n\n          .nav-link {\n            padding-right: $navbar-nav-link-padding-x;\n            padding-left: $navbar-nav-link-padding-x;\n          }\n        }\n\n        // For nesting containers, have to redeclare for alignment purposes\n        %container-nesting-#{$breakpoint} {\n          flex-wrap: nowrap;\n        }\n\n        > .container,\n        > .container-fluid {\n          @extend %container-nesting-#{$breakpoint};\n        }\n\n        @each $size, $container-max-width in $container-max-widths {\n          > .container#{breakpoint-infix($size, $container-max-widths)} {\n            @extend %container-nesting-#{$breakpoint};\n          }\n        }\n\n        .navbar-nav-scroll {\n          overflow: visible;\n        }\n\n        .navbar-collapse {\n          display: flex !important; // stylelint-disable-line declaration-no-important\n\n          // Changes flex-bases to auto because of an IE10 bug\n          flex-basis: auto;\n        }\n\n        .navbar-toggler {\n          display: none;\n        }\n      }\n    }\n  }\n}\n\n\n// Navbar themes\n//\n// Styles for switching between navbars with light or dark background.\n\n// Dark links against a light background\n.navbar-light {\n  .navbar-brand {\n    color: $navbar-light-brand-color;\n\n    @include hover-focus() {\n      color: $navbar-light-brand-hover-color;\n    }\n  }\n\n  .navbar-nav {\n    .nav-link {\n      color: $navbar-light-color;\n\n      @include hover-focus() {\n        color: $navbar-light-hover-color;\n      }\n\n      &.disabled {\n        color: $navbar-light-disabled-color;\n      }\n    }\n\n    .show > .nav-link,\n    .active > .nav-link,\n    .nav-link.show,\n    .nav-link.active {\n      color: $navbar-light-active-color;\n    }\n  }\n\n  .navbar-toggler {\n    color: $navbar-light-color;\n    border-color: $navbar-light-toggler-border-color;\n  }\n\n  .navbar-toggler-icon {\n    background-image: escape-svg($navbar-light-toggler-icon-bg);\n  }\n\n  .navbar-text {\n    color: $navbar-light-color;\n    a {\n      color: $navbar-light-active-color;\n\n      @include hover-focus() {\n        color: $navbar-light-active-color;\n      }\n    }\n  }\n}\n\n// White links against a dark background\n.navbar-dark {\n  .navbar-brand {\n    color: $navbar-dark-brand-color;\n\n    @include hover-focus() {\n      color: $navbar-dark-brand-hover-color;\n    }\n  }\n\n  .navbar-nav {\n    .nav-link {\n      color: $navbar-dark-color;\n\n      @include hover-focus() {\n        color: $navbar-dark-hover-color;\n      }\n\n      &.disabled {\n        color: $navbar-dark-disabled-color;\n      }\n    }\n\n    .show > .nav-link,\n    .active > .nav-link,\n    .nav-link.show,\n    .nav-link.active {\n      color: $navbar-dark-active-color;\n    }\n  }\n\n  .navbar-toggler {\n    color: $navbar-dark-color;\n    border-color: $navbar-dark-toggler-border-color;\n  }\n\n  .navbar-toggler-icon {\n    background-image: escape-svg($navbar-dark-toggler-icon-bg);\n  }\n\n  .navbar-text {\n    color: $navbar-dark-color;\n    a {\n      color: $navbar-dark-active-color;\n\n      @include hover-focus() {\n        color: $navbar-dark-active-color;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/_pagination.scss",
    "content": ".pagination {\n  display: flex;\n  @include list-unstyled();\n  @include border-radius();\n}\n\n.page-link {\n  position: relative;\n  display: block;\n  padding: $pagination-padding-y $pagination-padding-x;\n  margin-left: -$pagination-border-width;\n  line-height: $pagination-line-height;\n  color: $pagination-color;\n  text-decoration: if($link-decoration == none, null, none);\n  background-color: $pagination-bg;\n  border: $pagination-border-width solid $pagination-border-color;\n\n  &:hover {\n    z-index: 2;\n    color: $pagination-hover-color;\n    text-decoration: none;\n    background-color: $pagination-hover-bg;\n    border-color: $pagination-hover-border-color;\n  }\n\n  &:focus {\n    z-index: 3;\n    outline: $pagination-focus-outline;\n    box-shadow: $pagination-focus-box-shadow;\n  }\n}\n\n.page-item {\n  &:first-child {\n    .page-link {\n      margin-left: 0;\n      @include border-left-radius($border-radius);\n    }\n  }\n  &:last-child {\n    .page-link {\n      @include border-right-radius($border-radius);\n    }\n  }\n\n  &.active .page-link {\n    z-index: 3;\n    color: $pagination-active-color;\n    background-color: $pagination-active-bg;\n    border-color: $pagination-active-border-color;\n  }\n\n  &.disabled .page-link {\n    color: $pagination-disabled-color;\n    pointer-events: none;\n    // Opinionated: remove the \"hand\" cursor set previously for .page-link\n    cursor: auto;\n    background-color: $pagination-disabled-bg;\n    border-color: $pagination-disabled-border-color;\n  }\n}\n\n\n//\n// Sizing\n//\n\n.pagination-lg {\n  @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $pagination-border-radius-lg);\n}\n\n.pagination-sm {\n  @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $pagination-border-radius-sm);\n}\n"
  },
  {
    "path": "_sass/bootstrap/_popover.scss",
    "content": ".popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: $zindex-popover;\n  display: block;\n  max-width: $popover-max-width;\n  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n  // So reset our font and text properties to avoid inheriting weird values.\n  @include reset-text();\n  @include font-size($popover-font-size);\n  // Allow breaking very long words so they don't overflow the popover's bounds\n  word-wrap: break-word;\n  background-color: $popover-bg;\n  background-clip: padding-box;\n  border: $popover-border-width solid $popover-border-color;\n  @include border-radius($popover-border-radius);\n  @include box-shadow($popover-box-shadow);\n\n  .arrow {\n    position: absolute;\n    display: block;\n    width: $popover-arrow-width;\n    height: $popover-arrow-height;\n    margin: 0 $popover-border-radius;\n\n    &::before,\n    &::after {\n      position: absolute;\n      display: block;\n      content: \"\";\n      border-color: transparent;\n      border-style: solid;\n    }\n  }\n}\n\n.bs-popover-top {\n  margin-bottom: $popover-arrow-height;\n\n  > .arrow {\n    bottom: subtract(-$popover-arrow-height, $popover-border-width);\n\n    &::before {\n      bottom: 0;\n      border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\n      border-top-color: $popover-arrow-outer-color;\n    }\n\n    &::after {\n      bottom: $popover-border-width;\n      border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;\n      border-top-color: $popover-arrow-color;\n    }\n  }\n}\n\n.bs-popover-right {\n  margin-left: $popover-arrow-height;\n\n  > .arrow {\n    left: subtract(-$popover-arrow-height, $popover-border-width);\n    width: $popover-arrow-height;\n    height: $popover-arrow-width;\n    margin: $popover-border-radius 0; // make sure the arrow does not touch the popover's rounded corners\n\n    &::before {\n      left: 0;\n      border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\n      border-right-color: $popover-arrow-outer-color;\n    }\n\n    &::after {\n      left: $popover-border-width;\n      border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;\n      border-right-color: $popover-arrow-color;\n    }\n  }\n}\n\n.bs-popover-bottom {\n  margin-top: $popover-arrow-height;\n\n  > .arrow {\n    top: subtract(-$popover-arrow-height, $popover-border-width);\n\n    &::before {\n      top: 0;\n      border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\n      border-bottom-color: $popover-arrow-outer-color;\n    }\n\n    &::after {\n      top: $popover-border-width;\n      border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);\n      border-bottom-color: $popover-arrow-color;\n    }\n  }\n\n  // This will remove the popover-header's border just below the arrow\n  .popover-header::before {\n    position: absolute;\n    top: 0;\n    left: 50%;\n    display: block;\n    width: $popover-arrow-width;\n    margin-left: -$popover-arrow-width / 2;\n    content: \"\";\n    border-bottom: $popover-border-width solid $popover-header-bg;\n  }\n}\n\n.bs-popover-left {\n  margin-right: $popover-arrow-height;\n\n  > .arrow {\n    right: subtract(-$popover-arrow-height, $popover-border-width);\n    width: $popover-arrow-height;\n    height: $popover-arrow-width;\n    margin: $popover-border-radius 0; // make sure the arrow does not touch the popover's rounded corners\n\n    &::before {\n      right: 0;\n      border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\n      border-left-color: $popover-arrow-outer-color;\n    }\n\n    &::after {\n      right: $popover-border-width;\n      border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;\n      border-left-color: $popover-arrow-color;\n    }\n  }\n}\n\n.bs-popover-auto {\n  &[x-placement^=\"top\"] {\n    @extend .bs-popover-top;\n  }\n  &[x-placement^=\"right\"] {\n    @extend .bs-popover-right;\n  }\n  &[x-placement^=\"bottom\"] {\n    @extend .bs-popover-bottom;\n  }\n  &[x-placement^=\"left\"] {\n    @extend .bs-popover-left;\n  }\n}\n\n\n// Offset the popover to account for the popover arrow\n.popover-header {\n  padding: $popover-header-padding-y $popover-header-padding-x;\n  margin-bottom: 0; // Reset the default from Reboot\n  @include font-size($font-size-base);\n  color: $popover-header-color;\n  background-color: $popover-header-bg;\n  border-bottom: $popover-border-width solid darken($popover-header-bg, 5%);\n  @include border-top-radius($popover-inner-border-radius);\n\n  &:empty {\n    display: none;\n  }\n}\n\n.popover-body {\n  padding: $popover-body-padding-y $popover-body-padding-x;\n  color: $popover-body-color;\n}\n"
  },
  {
    "path": "_sass/bootstrap/_print.scss",
    "content": "// stylelint-disable declaration-no-important, selector-no-qualifying-type\n\n// Source: https://github.com/h5bp/main.css/blob/master/src/_print.css\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request:\n// https://www.phpied.com/delay-loading-your-print-css/\n// ==========================================================================\n\n@if $enable-print-styles {\n  @media print {\n    *,\n    *::before,\n    *::after {\n      // Bootstrap specific; comment out `color` and `background`\n      //color: $black !important; // Black prints faster\n      text-shadow: none !important;\n      //background: transparent !important;\n      box-shadow: none !important;\n    }\n\n    a {\n      &:not(.btn) {\n        text-decoration: underline;\n      }\n    }\n\n    // Bootstrap specific; comment the following selector out\n    //a[href]::after {\n    //  content: \" (\" attr(href) \")\";\n    //}\n\n    abbr[title]::after {\n      content: \" (\" attr(title) \")\";\n    }\n\n    // Bootstrap specific; comment the following selector out\n    //\n    // Don't show links that are fragment identifiers,\n    // or use the `javascript:` pseudo protocol\n    //\n\n    //a[href^=\"#\"]::after,\n    //a[href^=\"javascript:\"]::after {\n    // content: \"\";\n    //}\n\n    pre {\n      white-space: pre-wrap !important;\n    }\n    pre,\n    blockquote {\n      border: $border-width solid $gray-500; // Bootstrap custom code; using `$border-width` instead of 1px\n      page-break-inside: avoid;\n    }\n\n    //\n    // Printing Tables:\n    // https://web.archive.org/web/20180815150934/http://css-discuss.incutio.com/wiki/Printing_Tables\n    //\n\n    thead {\n      display: table-header-group;\n    }\n\n    tr,\n    img {\n      page-break-inside: avoid;\n    }\n\n    p,\n    h2,\n    h3 {\n      orphans: 3;\n      widows: 3;\n    }\n\n    h2,\n    h3 {\n      page-break-after: avoid;\n    }\n\n    // Bootstrap specific changes start\n\n    // Specify a size and min-width to make printing closer across browsers.\n    // We don't set margin here because it breaks `size` in Chrome. We also\n    // don't use `!important` on `size` as it breaks in Chrome.\n    @page {\n      size: $print-page-size;\n    }\n    body {\n      min-width: $print-body-min-width !important;\n    }\n    .container {\n      min-width: $print-body-min-width !important;\n    }\n\n    // Bootstrap components\n    .navbar {\n      display: none;\n    }\n    .badge {\n      border: $border-width solid $black;\n    }\n\n    .table {\n      border-collapse: collapse !important;\n\n      td,\n      th {\n        background-color: $white !important;\n      }\n    }\n\n    .table-bordered {\n      th,\n      td {\n        border: 1px solid $gray-300 !important;\n      }\n    }\n\n    .table-dark {\n      color: inherit;\n\n      th,\n      td,\n      thead th,\n      tbody + tbody {\n        border-color: $table-border-color;\n      }\n    }\n\n    .table .thead-dark th {\n      color: inherit;\n      border-color: $table-border-color;\n    }\n\n    // Bootstrap specific changes end\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/_progress.scss",
    "content": "// Disable animation if transitions are disabled\n@if $enable-transitions {\n  @keyframes progress-bar-stripes {\n    from { background-position: $progress-height 0; }\n    to { background-position: 0 0; }\n  }\n}\n\n.progress {\n  display: flex;\n  height: $progress-height;\n  overflow: hidden; // force rounded corners by cropping it\n  line-height: 0;\n  @include font-size($progress-font-size);\n  background-color: $progress-bg;\n  @include border-radius($progress-border-radius);\n  @include box-shadow($progress-box-shadow);\n}\n\n.progress-bar {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  overflow: hidden;\n  color: $progress-bar-color;\n  text-align: center;\n  white-space: nowrap;\n  background-color: $progress-bar-bg;\n  @include transition($progress-bar-transition);\n}\n\n.progress-bar-striped {\n  @include gradient-striped();\n  background-size: $progress-height $progress-height;\n}\n\n@if $enable-transitions {\n  .progress-bar-animated {\n    animation: $progress-bar-animation-timing progress-bar-stripes;\n\n    @if $enable-prefers-reduced-motion-media-query {\n      @media (prefers-reduced-motion: reduce) {\n        animation: none;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/_reboot.scss",
    "content": "// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box; // 1\n}\n\nhtml {\n  font-family: sans-serif; // 2\n  line-height: 1.15; // 3\n  -webkit-text-size-adjust: 100%; // 4\n  -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n  display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n//    the `inherit` value on things like `<th>` elements.\n\nbody {\n  margin: 0; // 1\n  font-family: $font-family-base;\n  @include font-size($font-size-base);\n  font-weight: $font-weight-base;\n  line-height: $line-height-base;\n  color: $body-color;\n  text-align: left; // 3\n  background-color: $body-bg; // 2\n}\n\n// Future-proof rule: in browsers that support :focus-visible, suppress the focus outline\n// on elements that programmatically receive focus but wouldn't normally show a visible\n// focus outline. In general, this would mean that the outline is only applied if the\n// interaction that led to the element receiving programmatic focus was a keyboard interaction,\n// or the browser has somehow determined that the user is primarily a keyboard user and/or\n// wants focus outlines to always be presented.\n//\n// See https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible\n// and https://developer.paciellogroup.com/blog/2018/03/focus-visible-and-backwards-compatibility/\n[tabindex=\"-1\"]:focus:not(:focus-visible) {\n  outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n  box-sizing: content-box; // 1\n  height: 0; // 1\n  overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n  margin-top: 0;\n  margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n  text-decoration: underline; // 2\n  text-decoration: underline dotted; // 2\n  cursor: help; // 3\n  border-bottom: 0; // 4\n  text-decoration-skip-ink: none; // 5\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: $dt-font-weight;\n}\n\ndd {\n  margin-bottom: .5rem;\n  margin-left: 0; // Undo browser default\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n  @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n  position: relative;\n  @include font-size(75%);\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n  color: $link-color;\n  text-decoration: $link-decoration;\n  background-color: transparent; // Remove the gray background on active links in IE 10.\n\n  @include hover() {\n    color: $link-hover-color;\n    text-decoration: $link-hover-decoration;\n  }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n  color: inherit;\n  text-decoration: none;\n\n  @include hover() {\n    color: inherit;\n    text-decoration: none;\n  }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: $font-family-monospace;\n  @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n  // Remove browser default top margin\n  margin-top: 0;\n  // Reset browser default of `1em` to use `rem`s\n  margin-bottom: 1rem;\n  // Don't allow content to break outside\n  overflow: auto;\n  // Disable auto-hiding scrollbar in IE & legacy Edge to avoid overlap,\n  // making it impossible to interact with the content\n  -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n  // Apply a consistent margin strategy (matches our type styles).\n  margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n  vertical-align: middle;\n  border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n  // Workaround for the SVG overflow bug in IE10/11 is still required.\n  // See https://github.com/twbs/bootstrap/issues/26878\n  overflow: hidden;\n  vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n  border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n  padding-top: $table-cell-padding;\n  padding-bottom: $table-cell-padding;\n  color: $table-caption-color;\n  text-align: left;\n  caption-side: bottom;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `<td>` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n  font-weight: $table-th-font-weight; // 1\n  text-align: inherit; // 2\n  text-align: -webkit-match-parent; // 3\n}\n\n\n//\n// Forms\n//\n\nlabel {\n  // Allow labels to use `margin` for spacing.\n  display: inline-block;\n  margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n  // stylelint-disable-next-line property-disallowed-list\n  border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n  outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0; // Remove the margin in Firefox and Safari\n  font-family: inherit;\n  @include font-size(inherit);\n  line-height: inherit;\n}\n\nbutton,\ninput {\n  overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n  text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Set the cursor for non-`<button>` buttons\n//\n// Details at https://github.com/twbs/bootstrap/pull/30562\n[role=\"button\"] {\n  cursor: pointer;\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n  word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n//    controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n  button,\n  [type=\"button\"],\n  [type=\"reset\"],\n  [type=\"submit\"] {\n    &:not(:disabled) {\n      cursor: pointer;\n    }\n  }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n  padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ntextarea {\n  overflow: auto; // Remove the default vertical scrollbar in IE.\n  // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n  resize: vertical;\n}\n\nfieldset {\n  // Browsers set a default `min-width: min-content;` on fieldsets,\n  // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n  // So we reset that to ensure fieldsets behave more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359\n  // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n  min-width: 0;\n  // Reset the default outline behavior of fieldsets so they don't affect page layout.\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n  display: block;\n  width: 100%;\n  max-width: 100%; // 1\n  padding: 0;\n  margin-bottom: .5rem;\n  @include font-size(1.5rem);\n  line-height: inherit;\n  color: inherit; // 2\n  white-space: normal; // 1\n}\n\nprogress {\n  vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n[type=\"search\"] {\n  // This overrides the extra rounded corners on search inputs in iOS so that our\n  // `.form-control` class can properly style them. Note that this cannot simply\n  // be added to `.form-control` as it's not specific enough. For details, see\n  // https://github.com/twbs/bootstrap/issues/11586.\n  outline-offset: -2px; // 2. Correct the outline style in Safari.\n  -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n  font: inherit; // 2\n  -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n  display: inline-block;\n}\n\nsummary {\n  display: list-item; // Add the correct display in all browsers\n  cursor: pointer;\n}\n\ntemplate {\n  display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n  display: none !important;\n}\n"
  },
  {
    "path": "_sass/bootstrap/_root.scss",
    "content": ":root {\n  // Custom variable values only support SassScript inside `#{}`.\n  @each $color, $value in $colors {\n    --#{$color}: #{$value};\n  }\n\n  @each $color, $value in $theme-colors {\n    --#{$color}: #{$value};\n  }\n\n  @each $bp, $value in $grid-breakpoints {\n    --breakpoint-#{$bp}: #{$value};\n  }\n\n  // Use `inspect` for lists so that quoted items keep the quotes.\n  // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n  --font-family-sans-serif: #{inspect($font-family-sans-serif)};\n  --font-family-monospace: #{inspect($font-family-monospace)};\n}\n"
  },
  {
    "path": "_sass/bootstrap/_spinners.scss",
    "content": "//\n// Rotating border\n//\n\n@keyframes spinner-border {\n  to { transform: rotate(360deg); }\n}\n\n.spinner-border {\n  display: inline-block;\n  width: $spinner-width;\n  height: $spinner-height;\n  vertical-align: text-bottom;\n  border: $spinner-border-width solid currentColor;\n  border-right-color: transparent;\n  // stylelint-disable-next-line property-disallowed-list\n  border-radius: 50%;\n  animation: .75s linear infinite spinner-border;\n}\n\n.spinner-border-sm {\n  width: $spinner-width-sm;\n  height: $spinner-height-sm;\n  border-width: $spinner-border-width-sm;\n}\n\n//\n// Growing circle\n//\n\n@keyframes spinner-grow {\n  0% {\n    transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n    transform: none;\n  }\n}\n\n.spinner-grow {\n  display: inline-block;\n  width: $spinner-width;\n  height: $spinner-height;\n  vertical-align: text-bottom;\n  background-color: currentColor;\n  // stylelint-disable-next-line property-disallowed-list\n  border-radius: 50%;\n  opacity: 0;\n  animation: .75s linear infinite spinner-grow;\n}\n\n.spinner-grow-sm {\n  width: $spinner-width-sm;\n  height: $spinner-height-sm;\n}\n\n@if $enable-prefers-reduced-motion-media-query {\n  @media (prefers-reduced-motion: reduce) {\n    .spinner-border,\n    .spinner-grow {\n      animation-duration: 1.5s;\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/_tables.scss",
    "content": "//\n// Basic Bootstrap table\n//\n\n.table {\n  width: 100%;\n  margin-bottom: $spacer;\n  color: $table-color;\n  background-color: $table-bg; // Reset for nesting within parents with `background-color`.\n\n  th,\n  td {\n    padding: $table-cell-padding;\n    vertical-align: top;\n    border-top: $table-border-width solid $table-border-color;\n  }\n\n  thead th {\n    vertical-align: bottom;\n    border-bottom: (2 * $table-border-width) solid $table-border-color;\n  }\n\n  tbody + tbody {\n    border-top: (2 * $table-border-width) solid $table-border-color;\n  }\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n  th,\n  td {\n    padding: $table-cell-padding-sm;\n  }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n\n.table-bordered {\n  border: $table-border-width solid $table-border-color;\n\n  th,\n  td {\n    border: $table-border-width solid $table-border-color;\n  }\n\n  thead {\n    th,\n    td {\n      border-bottom-width: 2 * $table-border-width;\n    }\n  }\n}\n\n.table-borderless {\n  th,\n  td,\n  thead th,\n  tbody + tbody {\n    border: 0;\n  }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  tbody tr:nth-of-type(#{$table-striped-order}) {\n    background-color: $table-accent-bg;\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  tbody tr {\n    @include hover() {\n      color: $table-hover-color;\n      background-color: $table-hover-bg;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n@each $color, $value in $theme-colors {\n  @include table-row-variant($color, theme-color-level($color, $table-bg-level), theme-color-level($color, $table-border-level));\n}\n\n@include table-row-variant(active, $table-active-bg);\n\n\n// Dark styles\n//\n// Same table markup, but inverted color scheme: dark background and light text.\n\n// stylelint-disable-next-line no-duplicate-selectors\n.table {\n  .thead-dark {\n    th {\n      color: $table-dark-color;\n      background-color: $table-dark-bg;\n      border-color: $table-dark-border-color;\n    }\n  }\n\n  .thead-light {\n    th {\n      color: $table-head-color;\n      background-color: $table-head-bg;\n      border-color: $table-border-color;\n    }\n  }\n}\n\n.table-dark {\n  color: $table-dark-color;\n  background-color: $table-dark-bg;\n\n  th,\n  td,\n  thead th {\n    border-color: $table-dark-border-color;\n  }\n\n  &.table-bordered {\n    border: 0;\n  }\n\n  &.table-striped {\n    tbody tr:nth-of-type(#{$table-striped-order}) {\n      background-color: $table-dark-accent-bg;\n    }\n  }\n\n  &.table-hover {\n    tbody tr {\n      @include hover() {\n        color: $table-dark-hover-color;\n        background-color: $table-dark-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n.table-responsive {\n  @each $breakpoint in map-keys($grid-breakpoints) {\n    $next: breakpoint-next($breakpoint, $grid-breakpoints);\n    $infix: breakpoint-infix($next, $grid-breakpoints);\n\n    &#{$infix} {\n      @include media-breakpoint-down($breakpoint) {\n        display: block;\n        width: 100%;\n        overflow-x: auto;\n        -webkit-overflow-scrolling: touch;\n\n        // Prevent double border on horizontal scroll due to use of `display: block;`\n        > .table-bordered {\n          border: 0;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/_toasts.scss",
    "content": ".toast {\n  // Prevents from shrinking in IE11, when in a flex container\n  // See https://github.com/twbs/bootstrap/issues/28341\n  flex-basis: $toast-max-width;\n  max-width: $toast-max-width;\n  @include font-size($toast-font-size);\n  color: $toast-color;\n  background-color: $toast-background-color;\n  background-clip: padding-box;\n  border: $toast-border-width solid $toast-border-color;\n  box-shadow: $toast-box-shadow;\n  opacity: 0;\n  @include border-radius($toast-border-radius);\n\n  &:not(:last-child) {\n    margin-bottom: $toast-padding-x;\n  }\n\n  &.showing {\n    opacity: 1;\n  }\n\n  &.show {\n    display: block;\n    opacity: 1;\n  }\n\n  &.hide {\n    display: none;\n  }\n}\n\n.toast-header {\n  display: flex;\n  align-items: center;\n  padding: $toast-padding-y $toast-padding-x;\n  color: $toast-header-color;\n  background-color: $toast-header-background-color;\n  background-clip: padding-box;\n  border-bottom: $toast-border-width solid $toast-header-border-color;\n  @include border-top-radius(subtract($toast-border-radius, $toast-border-width));\n}\n\n.toast-body {\n  padding: $toast-padding-x; // apply to both vertical and horizontal\n}\n"
  },
  {
    "path": "_sass/bootstrap/_tooltip.scss",
    "content": "// Base class\n.tooltip {\n  position: absolute;\n  z-index: $zindex-tooltip;\n  display: block;\n  margin: $tooltip-margin;\n  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n  // So reset our font and text properties to avoid inheriting weird values.\n  @include reset-text();\n  @include font-size($tooltip-font-size);\n  // Allow breaking very long words so they don't overflow the tooltip's bounds\n  word-wrap: break-word;\n  opacity: 0;\n\n  &.show { opacity: $tooltip-opacity; }\n\n  .arrow {\n    position: absolute;\n    display: block;\n    width: $tooltip-arrow-width;\n    height: $tooltip-arrow-height;\n\n    &::before {\n      position: absolute;\n      content: \"\";\n      border-color: transparent;\n      border-style: solid;\n    }\n  }\n}\n\n.bs-tooltip-top {\n  padding: $tooltip-arrow-height 0;\n\n  .arrow {\n    bottom: 0;\n\n    &::before {\n      top: 0;\n      border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\n      border-top-color: $tooltip-arrow-color;\n    }\n  }\n}\n\n.bs-tooltip-right {\n  padding: 0 $tooltip-arrow-height;\n\n  .arrow {\n    left: 0;\n    width: $tooltip-arrow-height;\n    height: $tooltip-arrow-width;\n\n    &::before {\n      right: 0;\n      border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;\n      border-right-color: $tooltip-arrow-color;\n    }\n  }\n}\n\n.bs-tooltip-bottom {\n  padding: $tooltip-arrow-height 0;\n\n  .arrow {\n    top: 0;\n\n    &::before {\n      bottom: 0;\n      border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\n      border-bottom-color: $tooltip-arrow-color;\n    }\n  }\n}\n\n.bs-tooltip-left {\n  padding: 0 $tooltip-arrow-height;\n\n  .arrow {\n    right: 0;\n    width: $tooltip-arrow-height;\n    height: $tooltip-arrow-width;\n\n    &::before {\n      left: 0;\n      border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;\n      border-left-color: $tooltip-arrow-color;\n    }\n  }\n}\n\n.bs-tooltip-auto {\n  &[x-placement^=\"top\"] {\n    @extend .bs-tooltip-top;\n  }\n  &[x-placement^=\"right\"] {\n    @extend .bs-tooltip-right;\n  }\n  &[x-placement^=\"bottom\"] {\n    @extend .bs-tooltip-bottom;\n  }\n  &[x-placement^=\"left\"] {\n    @extend .bs-tooltip-left;\n  }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n  max-width: $tooltip-max-width;\n  padding: $tooltip-padding-y $tooltip-padding-x;\n  color: $tooltip-color;\n  text-align: center;\n  background-color: $tooltip-bg;\n  @include border-radius($tooltip-border-radius);\n}\n"
  },
  {
    "path": "_sass/bootstrap/_transitions.scss",
    "content": ".fade {\n  @include transition($transition-fade);\n\n  &:not(.show) {\n    opacity: 0;\n  }\n}\n\n.collapse {\n  &:not(.show) {\n    display: none;\n  }\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  @include transition($transition-collapse);\n}\n"
  },
  {
    "path": "_sass/bootstrap/_type.scss",
    "content": "// stylelint-disable selector-list-comma-newline-after\n\n//\n// Headings\n//\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  margin-bottom: $headings-margin-bottom;\n  font-family: $headings-font-family;\n  font-weight: $headings-font-weight;\n  line-height: $headings-line-height;\n  color: $headings-color;\n}\n\nh1, .h1 { @include font-size($h1-font-size); }\nh2, .h2 { @include font-size($h2-font-size); }\nh3, .h3 { @include font-size($h3-font-size); }\nh4, .h4 { @include font-size($h4-font-size); }\nh5, .h5 { @include font-size($h5-font-size); }\nh6, .h6 { @include font-size($h6-font-size); }\n\n.lead {\n  @include font-size($lead-font-size);\n  font-weight: $lead-font-weight;\n}\n\n// Type display classes\n.display-1 {\n  @include font-size($display1-size);\n  font-weight: $display1-weight;\n  line-height: $display-line-height;\n}\n.display-2 {\n  @include font-size($display2-size);\n  font-weight: $display2-weight;\n  line-height: $display-line-height;\n}\n.display-3 {\n  @include font-size($display3-size);\n  font-weight: $display3-weight;\n  line-height: $display-line-height;\n}\n.display-4 {\n  @include font-size($display4-size);\n  font-weight: $display4-weight;\n  line-height: $display-line-height;\n}\n\n\n//\n// Horizontal rules\n//\n\nhr {\n  margin-top: $hr-margin-y;\n  margin-bottom: $hr-margin-y;\n  border: 0;\n  border-top: $hr-border-width solid $hr-border-color;\n}\n\n\n//\n// Emphasis\n//\n\nsmall,\n.small {\n  @include font-size($small-font-size);\n  font-weight: $font-weight-normal;\n}\n\nmark,\n.mark {\n  padding: $mark-padding;\n  background-color: $mark-bg;\n}\n\n\n//\n// Lists\n//\n\n.list-unstyled {\n  @include list-unstyled();\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n  @include list-unstyled();\n}\n.list-inline-item {\n  display: inline-block;\n\n  &:not(:last-child) {\n    margin-right: $list-inline-padding;\n  }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n  @include font-size(90%);\n  text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n  margin-bottom: $spacer;\n  @include font-size($blockquote-font-size);\n}\n\n.blockquote-footer {\n  display: block;\n  @include font-size($blockquote-small-font-size);\n  color: $blockquote-small-color;\n\n  &::before {\n    content: \"\\2014\\00A0\"; // em dash, nbsp\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/_utilities.scss",
    "content": "@import \"utilities/align\";\n@import \"utilities/background\";\n@import \"utilities/borders\";\n@import \"utilities/clearfix\";\n@import \"utilities/display\";\n@import \"utilities/embed\";\n@import \"utilities/flex\";\n@import \"utilities/float\";\n@import \"utilities/interactions\";\n@import \"utilities/overflow\";\n@import \"utilities/position\";\n@import \"utilities/screenreaders\";\n@import \"utilities/shadows\";\n@import \"utilities/sizing\";\n@import \"utilities/spacing\";\n@import \"utilities/stretched-link\";\n@import \"utilities/text\";\n@import \"utilities/visibility\";\n"
  },
  {
    "path": "_sass/bootstrap/_variables.scss",
    "content": "// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white:    #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black:    #000 !default;\n\n$grays: () !default;\n$grays: map-merge(\n  (\n    \"100\": $gray-100,\n    \"200\": $gray-200,\n    \"300\": $gray-300,\n    \"400\": $gray-400,\n    \"500\": $gray-500,\n    \"600\": $gray-600,\n    \"700\": $gray-700,\n    \"800\": $gray-800,\n    \"900\": $gray-900\n  ),\n  $grays\n);\n\n$blue:    #007bff !default;\n$indigo:  #6610f2 !default;\n$purple:  #6f42c1 !default;\n$pink:    #e83e8c !default;\n$red:     #dc3545 !default;\n$orange:  #fd7e14 !default;\n$yellow:  #ffc107 !default;\n$green:   #28a745 !default;\n$teal:    #20c997 !default;\n$cyan:    #17a2b8 !default;\n\n$colors: () !default;\n$colors: map-merge(\n  (\n    \"blue\":       $blue,\n    \"indigo\":     $indigo,\n    \"purple\":     $purple,\n    \"pink\":       $pink,\n    \"red\":        $red,\n    \"orange\":     $orange,\n    \"yellow\":     $yellow,\n    \"green\":      $green,\n    \"teal\":       $teal,\n    \"cyan\":       $cyan,\n    \"white\":      $white,\n    \"gray\":       $gray-600,\n    \"gray-dark\":  $gray-800\n  ),\n  $colors\n);\n\n$primary:       $blue !default;\n$secondary:     $gray-600 !default;\n$success:       $green !default;\n$info:          $cyan !default;\n$warning:       $yellow !default;\n$danger:        $red !default;\n$light:         $gray-100 !default;\n$dark:          $gray-800 !default;\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n  (\n    \"primary\":    $primary,\n    \"secondary\":  $secondary,\n    \"success\":    $success,\n    \"info\":       $info,\n    \"warning\":    $warning,\n    \"danger\":     $danger,\n    \"light\":      $light,\n    \"dark\":       $dark\n  ),\n  $theme-colors\n);\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval:      8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold:  150 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark:             $gray-900 !default;\n$yiq-text-light:            $white !default;\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n  (\"<\", \"%3c\"),\n  (\">\", \"%3e\"),\n  (\"#\", \"%23\"),\n  (\"(\", \"%28\"),\n  (\")\", \"%29\"),\n) !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret:                                true !default;\n$enable-rounded:                              true !default;\n$enable-shadows:                              false !default;\n$enable-gradients:                            false !default;\n$enable-transitions:                          true !default;\n$enable-prefers-reduced-motion-media-query:   true !default;\n$enable-hover-media-query:                    false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes:                         true !default;\n$enable-pointer-cursor-for-buttons:           true !default;\n$enable-print-styles:                         true !default;\n$enable-responsive-font-sizes:                false !default;\n$enable-validation-icons:                     true !default;\n$enable-deprecation-messages:                 true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: () !default;\n$spacers: map-merge(\n  (\n    0: 0,\n    1: ($spacer * .25),\n    2: ($spacer * .5),\n    3: $spacer,\n    4: ($spacer * 1.5),\n    5: ($spacer * 3)\n  ),\n  $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n$sizes: map-merge(\n  (\n    25: 25%,\n    50: 50%,\n    75: 75%,\n    100: 100%,\n    auto: auto\n  ),\n  $sizes\n);\n\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg:                   $white !default;\n$body-color:                $gray-900 !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color:                              theme-color(\"primary\") !default;\n$link-decoration:                         none !default;\n$link-hover-color:                        darken($link-color, 15%) !default;\n$link-hover-decoration:                   underline !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom:   1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n  xs: 0,\n  sm: 576px,\n  md: 768px,\n  lg: 992px,\n  xl: 1200px\n) !default;\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n  sm: 540px,\n  md: 720px,\n  lg: 960px,\n  xl: 1140px\n) !default;\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns:                12 !default;\n$grid-gutter-width:           30px !default;\n$grid-row-columns:            6 !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg:              1.5 !default;\n$line-height-sm:              1.5 !default;\n\n$border-width:                1px !default;\n$border-color:                $gray-300 !default;\n\n$border-radius:               .25rem !default;\n$border-radius-lg:            .3rem !default;\n$border-radius-sm:            .2rem !default;\n\n$rounded-pill:                50rem !default;\n\n$box-shadow-sm:               0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow:                  0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg:               0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color:      $white !default;\n$component-active-bg:         theme-color(\"primary\") !default;\n\n$caret-width:                 .3em !default;\n$caret-vertical-align:        $caret-width * .85 !default;\n$caret-spacing:               $caret-width * .85 !default;\n\n$transition-base:             all .2s ease-in-out !default;\n$transition-fade:             opacity .15s linear !default;\n$transition-collapse:         height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n$embed-responsive-aspect-ratios: join(\n  (\n    (21 9),\n    (16 9),\n    (4 3),\n    (1 1),\n  ),\n  $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif:      -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace:       SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base:            $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base:              1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg:                $font-size-base * 1.25 !default;\n$font-size-sm:                $font-size-base * .875 !default;\n\n$font-weight-lighter:         lighter !default;\n$font-weight-light:           300 !default;\n$font-weight-normal:          400 !default;\n$font-weight-bold:            600 !default;\n$font-weight-bolder:          bolder !default;\n\n$font-weight-base:            $font-weight-normal !default;\n$line-height-base:            1.5 !default;\n\n$h1-font-size:                $font-size-base * 2.5 !default;\n$h2-font-size:                $font-size-base * 2 !default;\n$h3-font-size:                $font-size-base * 1.75 !default;\n$h4-font-size:                $font-size-base * 1.5 !default;\n$h5-font-size:                $font-size-base * 1.25 !default;\n$h6-font-size:                $font-size-base !default;\n\n$headings-margin-bottom:      $spacer / 2 !default;\n$headings-font-family:        null !default;\n$headings-font-weight:        500 !default;\n$headings-line-height:        1.2 !default;\n$headings-color:              null !default;\n\n$display1-size:               6rem !default;\n$display2-size:               5.5rem !default;\n$display3-size:               4.5rem !default;\n$display4-size:               3.5rem !default;\n\n$display1-weight:             300 !default;\n$display2-weight:             300 !default;\n$display3-weight:             300 !default;\n$display4-weight:             300 !default;\n$display-line-height:         $headings-line-height !default;\n\n$lead-font-size:              $font-size-base * 1.25 !default;\n$lead-font-weight:            300 !default;\n\n$small-font-size:             80% !default;\n\n$text-muted:                  $gray-600 !default;\n\n$blockquote-small-color:      $gray-600 !default;\n$blockquote-small-font-size:  $small-font-size !default;\n$blockquote-font-size:        $font-size-base * 1.25 !default;\n\n$hr-border-color:             rgba($black, .1) !default;\n$hr-border-width:             $border-width !default;\n\n$mark-padding:                .2em !default;\n\n$dt-font-weight:              $font-weight-bold !default;\n\n$kbd-box-shadow:              inset 0 -.1rem 0 rgba($black, .25) !default;\n$nested-kbd-font-weight:      $font-weight-bold !default;\n\n$list-inline-padding:         .5rem !default;\n\n$mark-bg:                     #fcf8e3 !default;\n\n$hr-margin-y:                 $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding:          .75rem !default;\n$table-cell-padding-sm:       .3rem !default;\n\n$table-color:                 $body-color !default;\n$table-bg:                    null !default;\n$table-accent-bg:             rgba($black, .05) !default;\n$table-hover-color:           $table-color !default;\n$table-hover-bg:              rgba($black, .075) !default;\n$table-active-bg:             $table-hover-bg !default;\n\n$table-border-width:          $border-width !default;\n$table-border-color:          $border-color !default;\n\n$table-head-bg:               $gray-200 !default;\n$table-head-color:            $gray-700 !default;\n$table-th-font-weight:        null !default;\n\n$table-dark-color:            $white !default;\n$table-dark-bg:               $gray-800 !default;\n$table-dark-accent-bg:        rgba($white, .05) !default;\n$table-dark-hover-color:      $table-dark-color !default;\n$table-dark-hover-bg:         rgba($white, .075) !default;\n$table-dark-border-color:     lighten($table-dark-bg, 7.5%) !default;\n\n$table-striped-order:         odd !default;\n\n$table-caption-color:         $text-muted !default;\n\n$table-bg-level:              -9 !default;\n$table-border-level:          -6 !default;\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y:         .375rem !default;\n$input-btn-padding-x:         .75rem !default;\n$input-btn-font-family:       null !default;\n$input-btn-font-size:         $font-size-base !default;\n$input-btn-line-height:       $line-height-base !default;\n\n$input-btn-focus-width:       .2rem !default;\n$input-btn-focus-color:       rgba($component-active-bg, .25) !default;\n$input-btn-focus-box-shadow:  0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm:      .25rem !default;\n$input-btn-padding-x-sm:      .5rem !default;\n$input-btn-font-size-sm:      $font-size-sm !default;\n$input-btn-line-height-sm:    $line-height-sm !default;\n\n$input-btn-padding-y-lg:      .5rem !default;\n$input-btn-padding-x-lg:      1rem !default;\n$input-btn-font-size-lg:      $font-size-lg !default;\n$input-btn-line-height-lg:    $line-height-lg !default;\n\n$input-btn-border-width:      $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y:               $input-btn-padding-y !default;\n$btn-padding-x:               $input-btn-padding-x !default;\n$btn-font-family:             $input-btn-font-family !default;\n$btn-font-size:               $input-btn-font-size !default;\n$btn-line-height:             $input-btn-line-height !default;\n$btn-white-space:             null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm:            $input-btn-padding-y-sm !default;\n$btn-padding-x-sm:            $input-btn-padding-x-sm !default;\n$btn-font-size-sm:            $input-btn-font-size-sm !default;\n$btn-line-height-sm:          $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg:            $input-btn-padding-y-lg !default;\n$btn-padding-x-lg:            $input-btn-padding-x-lg !default;\n$btn-font-size-lg:            $input-btn-font-size-lg !default;\n$btn-line-height-lg:          $input-btn-line-height-lg !default;\n\n$btn-border-width:            $input-btn-border-width !default;\n\n$btn-font-weight:             $font-weight-normal !default;\n$btn-box-shadow:              inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width:             $input-btn-focus-width !default;\n$btn-focus-box-shadow:        $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity:        .65 !default;\n$btn-active-box-shadow:       inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-disabled-color:     $gray-600 !default;\n\n$btn-block-spacing-y:         .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius:           $border-radius !default;\n$btn-border-radius-lg:        $border-radius-lg !default;\n$btn-border-radius-sm:        $border-radius-sm !default;\n\n$btn-transition:              color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom:                   .5rem !default;\n\n$input-padding-y:                       $input-btn-padding-y !default;\n$input-padding-x:                       $input-btn-padding-x !default;\n$input-font-family:                     $input-btn-font-family !default;\n$input-font-size:                       $input-btn-font-size !default;\n$input-font-weight:                     $font-weight-base !default;\n$input-line-height:                     $input-btn-line-height !default;\n\n$input-padding-y-sm:                    $input-btn-padding-y-sm !default;\n$input-padding-x-sm:                    $input-btn-padding-x-sm !default;\n$input-font-size-sm:                    $input-btn-font-size-sm !default;\n$input-line-height-sm:                  $input-btn-line-height-sm !default;\n\n$input-padding-y-lg:                    $input-btn-padding-y-lg !default;\n$input-padding-x-lg:                    $input-btn-padding-x-lg !default;\n$input-font-size-lg:                    $input-btn-font-size-lg !default;\n$input-line-height-lg:                  $input-btn-line-height-lg !default;\n\n$input-bg:                              $white !default;\n$input-disabled-bg:                     $gray-200 !default;\n\n$input-color:                           $gray-700 !default;\n$input-border-color:                    $gray-400 !default;\n$input-border-width:                    $input-btn-border-width !default;\n$input-box-shadow:                      inset 0 1px 1px rgba($black, .075) !default;\n\n$input-border-radius:                   $border-radius !default;\n$input-border-radius-lg:                $border-radius-lg !default;\n$input-border-radius-sm:                $border-radius-sm !default;\n\n$input-focus-bg:                        $input-bg !default;\n$input-focus-border-color:              lighten($component-active-bg, 25%) !default;\n$input-focus-color:                     $input-color !default;\n$input-focus-width:                     $input-btn-focus-width !default;\n$input-focus-box-shadow:                $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color:               $gray-600 !default;\n$input-plaintext-color:                 $body-color !default;\n\n$input-height-border:                   $input-border-width * 2 !default;\n\n$input-height-inner:                    add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half:               add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter:            add($input-line-height * .25em, $input-padding-y / 2) !default;\n\n$input-height:                          add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm:                       add($input-line-height-sm * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg:                       add($input-line-height-lg * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition:                      border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top:                  .25rem !default;\n\n$form-check-input-gutter:               1.25rem !default;\n$form-check-input-margin-y:             .3rem !default;\n$form-check-input-margin-x:             .25rem !default;\n\n$form-check-inline-margin-x:            .75rem !default;\n$form-check-inline-input-margin-x:      .3125rem !default;\n\n$form-grid-gutter-width:                10px !default;\n$form-group-margin-bottom:              1rem !default;\n\n$input-group-addon-color:               $input-color !default;\n$input-group-addon-bg:                  $gray-200 !default;\n$input-group-addon-border-color:        $input-border-color !default;\n\n$custom-forms-transition:               background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter:                 .5rem !default;\n$custom-control-spacer-x:               1rem !default;\n$custom-control-cursor:                 null !default;\n\n$custom-control-indicator-size:         1rem !default;\n$custom-control-indicator-bg:           $input-bg !default;\n\n$custom-control-indicator-bg-size:      50% 50% !default;\n$custom-control-indicator-box-shadow:   $input-box-shadow !default;\n$custom-control-indicator-border-color: $gray-500 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-label-color:            null !default;\n\n$custom-control-indicator-disabled-bg:          $input-disabled-bg !default;\n$custom-control-label-disabled-color:           $gray-600 !default;\n\n$custom-control-indicator-checked-color:        $component-active-color !default;\n$custom-control-indicator-checked-bg:           $component-active-bg !default;\n$custom-control-indicator-checked-disabled-bg:  rgba(theme-color(\"primary\"), .5) !default;\n$custom-control-indicator-checked-box-shadow:   null !default;\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\n\n$custom-control-indicator-focus-box-shadow:     $input-focus-box-shadow !default;\n$custom-control-indicator-focus-border-color:   $input-focus-border-color !default;\n\n$custom-control-indicator-active-color:         $component-active-color !default;\n$custom-control-indicator-active-bg:            lighten($component-active-bg, 35%) !default;\n$custom-control-indicator-active-box-shadow:    null !default;\n$custom-control-indicator-active-border-color:  $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius:       $border-radius !default;\n$custom-checkbox-indicator-icon-checked:        url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'><path fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/></svg>\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg:           $component-active-bg !default;\n$custom-checkbox-indicator-indeterminate-color:        $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate:         url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'><path stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/></svg>\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow:   null !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius:          50% !default;\n$custom-radio-indicator-icon-checked:           url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'><circle r='3' fill='#{$custom-control-indicator-checked-color}'/></svg>\") !default;\n\n$custom-switch-width:                           $custom-control-indicator-size * 1.75 !default;\n$custom-switch-indicator-border-radius:         $custom-control-indicator-size / 2 !default;\n$custom-switch-indicator-size:                  subtract($custom-control-indicator-size, $custom-control-indicator-border-width * 4) !default;\n\n$custom-select-padding-y:           $input-padding-y !default;\n$custom-select-padding-x:           $input-padding-x !default;\n$custom-select-font-family:         $input-font-family !default;\n$custom-select-font-size:           $input-font-size !default;\n$custom-select-height:              $input-height !default;\n$custom-select-indicator-padding:   1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight:         $input-font-weight !default;\n$custom-select-line-height:         $input-line-height !default;\n$custom-select-color:               $input-color !default;\n$custom-select-disabled-color:      $gray-600 !default;\n$custom-select-bg:                  $input-bg !default;\n$custom-select-disabled-bg:         $gray-200 !default;\n$custom-select-bg-size:             8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color:     $gray-800 !default;\n$custom-select-indicator:           url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'><path fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/></svg>\") !default;\n$custom-select-background:          escape-svg($custom-select-indicator) right $custom-select-padding-x center / $custom-select-bg-size no-repeat !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: add(1em * .75, (2 * $custom-select-padding-y * .75) + $custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-position:      center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size:          $input-height-inner-half $input-height-inner-half !default;\n\n$custom-select-border-width:        $input-border-width !default;\n$custom-select-border-color:        $input-border-color !default;\n$custom-select-border-radius:       $border-radius !default;\n$custom-select-box-shadow:          inset 0 1px 2px rgba($black, .075) !default;\n\n$custom-select-focus-border-color:  $input-focus-border-color !default;\n$custom-select-focus-width:         $input-focus-width !default;\n$custom-select-focus-box-shadow:    0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\n\n$custom-select-padding-y-sm:        $input-padding-y-sm !default;\n$custom-select-padding-x-sm:        $input-padding-x-sm !default;\n$custom-select-font-size-sm:        $input-font-size-sm !default;\n$custom-select-height-sm:           $input-height-sm !default;\n\n$custom-select-padding-y-lg:        $input-padding-y-lg !default;\n$custom-select-padding-x-lg:        $input-padding-x-lg !default;\n$custom-select-font-size-lg:        $input-font-size-lg !default;\n$custom-select-height-lg:           $input-height-lg !default;\n\n$custom-range-track-width:          100% !default;\n$custom-range-track-height:         .5rem !default;\n$custom-range-track-cursor:         pointer !default;\n$custom-range-track-bg:             $gray-300 !default;\n$custom-range-track-border-radius:  1rem !default;\n$custom-range-track-box-shadow:     inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width:                   1rem !default;\n$custom-range-thumb-height:                  $custom-range-thumb-width !default;\n$custom-range-thumb-bg:                      $component-active-bg !default;\n$custom-range-thumb-border:                  0 !default;\n$custom-range-thumb-border-radius:           1rem !default;\n$custom-range-thumb-box-shadow:              0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow:        0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$custom-range-thumb-focus-box-shadow-width:  $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg:               lighten($component-active-bg, 35%) !default;\n$custom-range-thumb-disabled-bg:             $gray-500 !default;\n\n$custom-file-height:                $input-height !default;\n$custom-file-height-inner:          $input-height-inner !default;\n$custom-file-focus-border-color:    $input-focus-border-color !default;\n$custom-file-focus-box-shadow:      $input-focus-box-shadow !default;\n$custom-file-disabled-bg:           $input-disabled-bg !default;\n\n$custom-file-padding-y:             $input-padding-y !default;\n$custom-file-padding-x:             $input-padding-x !default;\n$custom-file-line-height:           $input-line-height !default;\n$custom-file-font-family:           $input-font-family !default;\n$custom-file-font-weight:           $input-font-weight !default;\n$custom-file-color:                 $input-color !default;\n$custom-file-bg:                    $input-bg !default;\n$custom-file-border-width:          $input-border-width !default;\n$custom-file-border-color:          $input-border-color !default;\n$custom-file-border-radius:         $input-border-radius !default;\n$custom-file-box-shadow:            $input-box-shadow !default;\n$custom-file-button-color:          $custom-file-color !default;\n$custom-file-button-bg:             $input-group-addon-bg !default;\n$custom-file-text: (\n  en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top:          $form-text-margin-top !default;\n$form-feedback-font-size:           $small-font-size !default;\n$form-feedback-valid-color:         theme-color(\"success\") !default;\n$form-feedback-invalid-color:       theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color:    $form-feedback-valid-color !default;\n$form-feedback-icon-valid:          url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'><path fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/></svg>\") !default;\n$form-feedback-icon-invalid-color:  $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid:        url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='#{$form-feedback-icon-invalid-color}' viewBox='0 0 12 12'><circle cx='6' cy='6' r='4.5'/><path stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/><circle cx='6' cy='8.2' r='.6' fill='#{$form-feedback-icon-invalid-color}' stroke='none'/></svg>\") !default;\n\n$form-validation-states: () !default;\n$form-validation-states: map-merge(\n  (\n    \"valid\": (\n      \"color\": $form-feedback-valid-color,\n      \"icon\": $form-feedback-icon-valid\n    ),\n    \"invalid\": (\n      \"color\": $form-feedback-invalid-color,\n      \"icon\": $form-feedback-icon-invalid\n    ),\n  ),\n  $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown:                   1000 !default;\n$zindex-sticky:                     1020 !default;\n$zindex-fixed:                      1030 !default;\n$zindex-modal-backdrop:             1040 !default;\n$zindex-modal:                      1050 !default;\n$zindex-popover:                    1060 !default;\n$zindex-tooltip:                    1070 !default;\n\n\n// Navs\n\n$nav-link-padding-y:                .5rem !default;\n$nav-link-padding-x:                1rem !default;\n$nav-link-disabled-color:           $gray-600 !default;\n\n$nav-tabs-border-color:             $gray-300 !default;\n$nav-tabs-border-width:             $border-width !default;\n$nav-tabs-border-radius:            $border-radius !default;\n$nav-tabs-link-hover-border-color:  $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color:        $gray-700 !default;\n$nav-tabs-link-active-bg:           $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius:           $border-radius !default;\n$nav-pills-link-active-color:       $component-active-color !default;\n$nav-pills-link-active-bg:          $component-active-bg !default;\n\n$nav-divider-color:                 $gray-200 !default;\n$nav-divider-margin-y:              $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y:                  $spacer / 2 !default;\n$navbar-padding-x:                  $spacer !default;\n\n$navbar-nav-link-padding-x:         .5rem !default;\n\n$navbar-brand-font-size:            $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height:                   $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height:               $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y:            ($nav-link-height - $navbar-brand-height) / 2 !default;\n\n$navbar-toggler-padding-y:          .25rem !default;\n$navbar-toggler-padding-x:          .75rem !default;\n$navbar-toggler-font-size:          $font-size-lg !default;\n$navbar-toggler-border-radius:      $btn-border-radius !default;\n\n$navbar-nav-scroll-max-height:      75vh !default;\n\n$navbar-dark-color:                 rgba($white, .5) !default;\n$navbar-dark-hover-color:           rgba($white, .75) !default;\n$navbar-dark-active-color:          $white !default;\n$navbar-dark-disabled-color:        rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg:       url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'><path stroke='#{$navbar-dark-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>\") !default;\n$navbar-dark-toggler-border-color:  rgba($white, .1) !default;\n\n$navbar-light-color:                rgba($black, .5) !default;\n$navbar-light-hover-color:          rgba($black, .7) !default;\n$navbar-light-active-color:         rgba($black, .9) !default;\n$navbar-light-disabled-color:       rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg:      url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'><path stroke='#{$navbar-light-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color:                $navbar-light-active-color !default;\n$navbar-light-brand-hover-color:          $navbar-light-active-color !default;\n$navbar-dark-brand-color:                 $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color:           $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width:                10rem !default;\n$dropdown-padding-x:                0 !default;\n$dropdown-padding-y:                .5rem !default;\n$dropdown-spacer:                   .125rem !default;\n$dropdown-font-size:                $font-size-base !default;\n$dropdown-color:                    $body-color !default;\n$dropdown-bg:                       $white !default;\n$dropdown-border-color:             rgba($black, .15) !default;\n$dropdown-border-radius:            $border-radius !default;\n$dropdown-border-width:             $border-width !default;\n$dropdown-inner-border-radius:      subtract($dropdown-border-radius, $dropdown-border-width) !default;\n$dropdown-divider-bg:               $gray-200 !default;\n$dropdown-divider-margin-y:         $nav-divider-margin-y !default;\n$dropdown-box-shadow:               0 .5rem 1rem rgba($black, .175) !default;\n\n$dropdown-link-color:               $gray-900 !default;\n$dropdown-link-hover-color:         darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg:            $gray-200 !default;\n\n$dropdown-link-active-color:        $component-active-color !default;\n$dropdown-link-active-bg:           $component-active-bg !default;\n\n$dropdown-link-disabled-color:      $gray-500 !default;\n\n$dropdown-item-padding-y:           .25rem !default;\n$dropdown-item-padding-x:           1.5rem !default;\n\n$dropdown-header-color:             $gray-600 !default;\n$dropdown-header-padding:           $dropdown-padding-y $dropdown-item-padding-x !default;\n\n\n// Pagination\n\n$pagination-padding-y:              .5rem !default;\n$pagination-padding-x:              .75rem !default;\n$pagination-padding-y-sm:           .25rem !default;\n$pagination-padding-x-sm:           .5rem !default;\n$pagination-padding-y-lg:           .75rem !default;\n$pagination-padding-x-lg:           1.5rem !default;\n$pagination-line-height:            1.25 !default;\n\n$pagination-color:                  $link-color !default;\n$pagination-bg:                     $white !default;\n$pagination-border-width:           $border-width !default;\n$pagination-border-color:           $gray-300 !default;\n\n$pagination-focus-box-shadow:       $input-btn-focus-box-shadow !default;\n$pagination-focus-outline:          0 !default;\n\n$pagination-hover-color:            $link-hover-color !default;\n$pagination-hover-bg:               $gray-200 !default;\n$pagination-hover-border-color:     $gray-300 !default;\n\n$pagination-active-color:           $component-active-color !default;\n$pagination-active-bg:              $component-active-bg !default;\n$pagination-active-border-color:    $pagination-active-bg !default;\n\n$pagination-disabled-color:         $gray-600 !default;\n$pagination-disabled-bg:            $white !default;\n$pagination-disabled-border-color:  $gray-300 !default;\n\n$pagination-border-radius-sm:       $border-radius-sm !default;\n$pagination-border-radius-lg:       $border-radius-lg !default;\n\n// Jumbotron\n\n$jumbotron-padding:                 2rem !default;\n$jumbotron-color:                   null !default;\n$jumbotron-bg:                      $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y:                     .75rem !default;\n$card-spacer-x:                     1.25rem !default;\n$card-border-width:                 $border-width !default;\n$card-border-radius:                $border-radius !default;\n$card-border-color:                 rgba($black, .125) !default;\n$card-inner-border-radius:          subtract($card-border-radius, $card-border-width) !default;\n$card-cap-bg:                       rgba($black, .03) !default;\n$card-cap-color:                    null !default;\n$card-height:                       null !default;\n$card-color:                        null !default;\n$card-bg:                           $white !default;\n\n$card-img-overlay-padding:          1.25rem !default;\n\n$card-group-margin:                 $grid-gutter-width / 2 !default;\n$card-deck-margin:                  $card-group-margin !default;\n\n$card-columns-count:                3 !default;\n$card-columns-gap:                  1.25rem !default;\n$card-columns-margin:               $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-font-size:                 $font-size-sm !default;\n$tooltip-max-width:                 200px !default;\n$tooltip-color:                     $white !default;\n$tooltip-bg:                        $black !default;\n$tooltip-border-radius:             $border-radius !default;\n$tooltip-opacity:                   .9 !default;\n$tooltip-padding-y:                 .25rem !default;\n$tooltip-padding-x:                 .5rem !default;\n$tooltip-margin:                    0 !default;\n\n$tooltip-arrow-width:               .8rem !default;\n$tooltip-arrow-height:              .4rem !default;\n$tooltip-arrow-color:               $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y:     $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x:     $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size:     $tooltip-font-size !default;\n$form-feedback-tooltip-line-height:   $line-height-base !default;\n$form-feedback-tooltip-opacity:       $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size:                 $font-size-sm !default;\n$popover-bg:                        $white !default;\n$popover-max-width:                 276px !default;\n$popover-border-width:              $border-width !default;\n$popover-border-color:              rgba($black, .2) !default;\n$popover-border-radius:             $border-radius-lg !default;\n$popover-inner-border-radius:       subtract($popover-border-radius, $popover-border-width) !default;\n$popover-box-shadow:                0 .25rem .5rem rgba($black, .2) !default;\n\n$popover-header-bg:                 darken($popover-bg, 3%) !default;\n$popover-header-color:              $headings-color !default;\n$popover-header-padding-y:          .5rem !default;\n$popover-header-padding-x:          .75rem !default;\n\n$popover-body-color:                $body-color !default;\n$popover-body-padding-y:            $popover-header-padding-y !default;\n$popover-body-padding-x:            $popover-header-padding-x !default;\n\n$popover-arrow-width:               1rem !default;\n$popover-arrow-height:              .5rem !default;\n$popover-arrow-color:               $popover-bg !default;\n\n$popover-arrow-outer-color:         fade-in($popover-border-color, .05) !default;\n\n\n// Toasts\n\n$toast-max-width:                   350px !default;\n$toast-padding-x:                   .75rem !default;\n$toast-padding-y:                   .25rem !default;\n$toast-font-size:                   .875rem !default;\n$toast-color:                       null !default;\n$toast-background-color:            rgba($white, .85) !default;\n$toast-border-width:                1px !default;\n$toast-border-color:                rgba(0, 0, 0, .1) !default;\n$toast-border-radius:               .25rem !default;\n$toast-box-shadow:                  0 .25rem .75rem rgba($black, .1) !default;\n\n$toast-header-color:                $gray-600 !default;\n$toast-header-background-color:     rgba($white, .85) !default;\n$toast-header-border-color:         rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size:                   75% !default;\n$badge-font-weight:                 $font-weight-bold !default;\n$badge-padding-y:                   .25em !default;\n$badge-padding-x:                   .4em !default;\n$badge-border-radius:               $border-radius !default;\n\n$badge-transition:                  $btn-transition !default;\n$badge-focus-width:                 $input-btn-focus-width !default;\n\n$badge-pill-padding-x:              .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius:          10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding:               1rem !default;\n\n// Margin between elements in footer, must be lower than or equal to 2 * $modal-inner-padding\n$modal-footer-margin-between:       .5rem !default;\n\n$modal-dialog-margin:               .5rem !default;\n$modal-dialog-margin-y-sm-up:       1.75rem !default;\n\n$modal-title-line-height:           $line-height-base !default;\n\n$modal-content-color:               null !default;\n$modal-content-bg:                  $white !default;\n$modal-content-border-color:        rgba($black, .2) !default;\n$modal-content-border-width:        $border-width !default;\n$modal-content-border-radius:       $border-radius-lg !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs:       0 .25rem .5rem rgba($black, .5) !default;\n$modal-content-box-shadow-sm-up:    0 .5rem 1rem rgba($black, .5) !default;\n\n$modal-backdrop-bg:                 $black !default;\n$modal-backdrop-opacity:            .5 !default;\n$modal-header-border-color:         $border-color !default;\n$modal-footer-border-color:         $modal-header-border-color !default;\n$modal-header-border-width:         $modal-content-border-width !default;\n$modal-footer-border-width:         $modal-header-border-width !default;\n$modal-header-padding-y:            1rem !default;\n$modal-header-padding-x:            1rem !default;\n$modal-header-padding:              $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl:                          1140px !default;\n$modal-lg:                          800px !default;\n$modal-md:                          500px !default;\n$modal-sm:                          300px !default;\n\n$modal-fade-transform:              translate(0, -50px) !default;\n$modal-show-transform:              none !default;\n$modal-transition:                  transform .3s ease-out !default;\n$modal-scale-transform:             scale(1.02) !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y:                   .75rem !default;\n$alert-padding-x:                   1.25rem !default;\n$alert-margin-bottom:               1rem !default;\n$alert-border-radius:               $border-radius !default;\n$alert-link-font-weight:            $font-weight-bold !default;\n$alert-border-width:                $border-width !default;\n\n$alert-bg-level:                    -10 !default;\n$alert-border-level:                -9 !default;\n$alert-color-level:                 6 !default;\n\n\n// Progress bars\n\n$progress-height:                   1rem !default;\n$progress-font-size:                $font-size-base * .75 !default;\n$progress-bg:                       $gray-200 !default;\n$progress-border-radius:            $border-radius !default;\n$progress-box-shadow:               inset 0 .1rem .1rem rgba($black, .1) !default;\n$progress-bar-color:                $white !default;\n$progress-bar-bg:                   theme-color(\"primary\") !default;\n$progress-bar-animation-timing:     1s linear infinite !default;\n$progress-bar-transition:           width .6s ease !default;\n\n\n// List group\n\n$list-group-color:                  null !default;\n$list-group-bg:                     $white !default;\n$list-group-border-color:           rgba($black, .125) !default;\n$list-group-border-width:           $border-width !default;\n$list-group-border-radius:          $border-radius !default;\n\n$list-group-item-padding-y:         .75rem !default;\n$list-group-item-padding-x:         1.25rem !default;\n\n$list-group-hover-bg:               $gray-100 !default;\n$list-group-active-color:           $component-active-color !default;\n$list-group-active-bg:              $component-active-bg !default;\n$list-group-active-border-color:    $list-group-active-bg !default;\n\n$list-group-disabled-color:         $gray-600 !default;\n$list-group-disabled-bg:            $list-group-bg !default;\n\n$list-group-action-color:           $gray-700 !default;\n$list-group-action-hover-color:     $list-group-action-color !default;\n\n$list-group-action-active-color:    $body-color !default;\n$list-group-action-active-bg:       $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding:                 .25rem !default;\n$thumbnail-bg:                      $body-bg !default;\n$thumbnail-border-width:            $border-width !default;\n$thumbnail-border-color:            $gray-300 !default;\n$thumbnail-border-radius:           $border-radius !default;\n$thumbnail-box-shadow:              0 1px 2px rgba($black, .075) !default;\n\n\n// Figures\n\n$figure-caption-font-size:          90% !default;\n$figure-caption-color:              $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-font-size:              null !default;\n\n$breadcrumb-padding-y:              .75rem !default;\n$breadcrumb-padding-x:              1rem !default;\n$breadcrumb-item-padding:           .5rem !default;\n\n$breadcrumb-margin-bottom:          1rem !default;\n\n$breadcrumb-bg:                     $gray-200 !default;\n$breadcrumb-divider-color:          $gray-600 !default;\n$breadcrumb-active-color:           $gray-600 !default;\n$breadcrumb-divider:                quote(\"/\") !default;\n\n$breadcrumb-border-radius:          $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color:             $white !default;\n$carousel-control-width:             15% !default;\n$carousel-control-opacity:           .5 !default;\n$carousel-control-hover-opacity:     .9 !default;\n$carousel-control-transition:        opacity .15s ease !default;\n\n$carousel-indicator-width:           30px !default;\n$carousel-indicator-height:          3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer:          3px !default;\n$carousel-indicator-active-bg:       $white !default;\n$carousel-indicator-transition:      opacity .6s ease !default;\n\n$carousel-caption-width:             70% !default;\n$carousel-caption-color:             $white !default;\n\n$carousel-control-icon-width:        20px !default;\n\n$carousel-control-prev-icon-bg:      url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' width='8' height='8' viewBox='0 0 8 8'><path d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/></svg>\") !default;\n$carousel-control-next-icon-bg:      url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' width='8' height='8' viewBox='0 0 8 8'><path d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/></svg>\") !default;\n\n$carousel-transition-duration:       .6s !default;\n$carousel-transition:                transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width:         2rem !default;\n$spinner-height:        $spinner-width !default;\n$spinner-border-width:  .25em !default;\n\n$spinner-width-sm:        1rem !default;\n$spinner-height-sm:       $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size:                   $font-size-base * 1.5 !default;\n$close-font-weight:                 $font-weight-bold !default;\n$close-color:                       $black !default;\n$close-text-shadow:                 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size:                    87.5% !default;\n$code-color:                        $pink !default;\n\n$kbd-padding-y:                     .2rem !default;\n$kbd-padding-x:                     .4rem !default;\n$kbd-font-size:                     $code-font-size !default;\n$kbd-color:                         $white !default;\n$kbd-bg:                            $gray-900 !default;\n\n$pre-color:                         $gray-900 !default;\n$pre-scrollable-max-height:         340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n$user-selects: all, auto, none !default;\n\n\n// Printing\n\n$print-page-size:                   a3 !default;\n$print-body-min-width:              map-get($grid-breakpoints, \"lg\") !default;\n"
  },
  {
    "path": "_sass/bootstrap/bootstrap-grid.scss",
    "content": "/*!\n * Bootstrap Grid v4.6.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\nhtml {\n  box-sizing: border-box;\n  -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: inherit;\n}\n\n@import \"functions\";\n@import \"variables\";\n\n@import \"mixins/deprecate\";\n@import \"mixins/breakpoints\";\n@import \"mixins/grid-framework\";\n@import \"mixins/grid\";\n\n@import \"grid\";\n@import \"utilities/display\";\n@import \"utilities/flex\";\n@import \"utilities/spacing\";\n"
  },
  {
    "path": "_sass/bootstrap/bootstrap-reboot.scss",
    "content": "/*!\n * Bootstrap Reboot v4.6.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"reboot\";\n"
  },
  {
    "path": "_sass/bootstrap/bootstrap.scss",
    "content": "/*!\n * Bootstrap v4.6.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"utilities\";\n@import \"print\";\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_alert.scss",
    "content": "@mixin alert-variant($background, $border, $color) {\n  color: $color;\n  @include gradient-bg($background);\n  border-color: $border;\n\n  hr {\n    border-top-color: darken($border, 5%);\n  }\n\n  .alert-link {\n    color: darken($color, 10%);\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_background-variant.scss",
    "content": "// stylelint-disable declaration-no-important\n\n// Contextual backgrounds\n\n@mixin bg-variant($parent, $color, $ignore-warning: false) {\n  #{$parent} {\n    background-color: $color !important;\n  }\n  a#{$parent},\n  button#{$parent} {\n    @include hover-focus() {\n      background-color: darken($color, 10%) !important;\n    }\n  }\n  @include deprecate(\"The `bg-variant` mixin\", \"v4.4.0\", \"v5\", $ignore-warning);\n}\n\n@mixin bg-gradient-variant($parent, $color, $ignore-warning: false) {\n  #{$parent} {\n    background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;\n  }\n  @include deprecate(\"The `bg-gradient-variant` mixin\", \"v4.5.0\", \"v5\", $ignore-warning);\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_badge.scss",
    "content": "@mixin badge-variant($bg) {\n  color: color-yiq($bg);\n  background-color: $bg;\n\n  @at-root a#{&} {\n    @include hover-focus() {\n      color: color-yiq($bg);\n      background-color: darken($bg, 10%);\n    }\n\n    &:focus,\n    &.focus {\n      outline: 0;\n      box-shadow: 0 0 0 $badge-focus-width rgba($bg, .5);\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_border-radius.scss",
    "content": "// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative values with 0\n@function valid-radius($radius) {\n  $return: ();\n  @each $value in $radius {\n    @if type-of($value) == number {\n      $return: append($return, max($value, 0));\n    } @else {\n      $return: append($return, $value);\n    }\n  }\n  @return $return;\n}\n\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n  @if $enable-rounded {\n    border-radius: valid-radius($radius);\n  }\n  @else if $fallback-border-radius != false {\n    border-radius: $fallback-border-radius;\n  }\n}\n\n@mixin border-top-radius($radius) {\n  @if $enable-rounded {\n    border-top-left-radius: valid-radius($radius);\n    border-top-right-radius: valid-radius($radius);\n  }\n}\n\n@mixin border-right-radius($radius) {\n  @if $enable-rounded {\n    border-top-right-radius: valid-radius($radius);\n    border-bottom-right-radius: valid-radius($radius);\n  }\n}\n\n@mixin border-bottom-radius($radius) {\n  @if $enable-rounded {\n    border-bottom-right-radius: valid-radius($radius);\n    border-bottom-left-radius: valid-radius($radius);\n  }\n}\n\n@mixin border-left-radius($radius) {\n  @if $enable-rounded {\n    border-top-left-radius: valid-radius($radius);\n    border-bottom-left-radius: valid-radius($radius);\n  }\n}\n\n@mixin border-top-left-radius($radius) {\n  @if $enable-rounded {\n    border-top-left-radius: valid-radius($radius);\n  }\n}\n\n@mixin border-top-right-radius($radius) {\n  @if $enable-rounded {\n    border-top-right-radius: valid-radius($radius);\n  }\n}\n\n@mixin border-bottom-right-radius($radius) {\n  @if $enable-rounded {\n    border-bottom-right-radius: valid-radius($radius);\n  }\n}\n\n@mixin border-bottom-left-radius($radius) {\n  @if $enable-rounded {\n    border-bottom-left-radius: valid-radius($radius);\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_box-shadow.scss",
    "content": "@mixin box-shadow($shadow...) {\n  @if $enable-shadows {\n    $result: ();\n\n    @if (length($shadow) == 1) {\n      // We can pass `@include box-shadow(none);`\n      $result: $shadow;\n    } @else {\n      // Filter to avoid invalid properties for example `box-shadow: none, 1px 1px black;`\n      @for $i from 1 through length($shadow) {\n        @if nth($shadow, $i) != \"none\" {\n          $result: append($result, nth($shadow, $i), \"comma\");\n        }\n      }\n    }\n    @if (length($result) > 0) {\n      box-shadow: $result;\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_breakpoints.scss",
    "content": "// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n//    (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n//    >> breakpoint-next(sm)\n//    md\n//    >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n//    md\n//    >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n//    md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n  $n: index($breakpoint-names, $name);\n  @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n//    >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n//    576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n  $min: map-get($breakpoints, $name);\n  @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n//    >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n//    767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n  $next: breakpoint-next($name, $breakpoints);\n  @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n//    >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n//    \"\"  (Returns a blank string)\n//    >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n//    \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n  @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n  $min: breakpoint-min($name, $breakpoints);\n  @if $min {\n    @media (min-width: $min) {\n      @content;\n    }\n  } @else {\n    @content;\n  }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n  $max: breakpoint-max($name, $breakpoints);\n  @if $max {\n    @media (max-width: $max) {\n      @content;\n    }\n  } @else {\n    @content;\n  }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n  $min: breakpoint-min($lower, $breakpoints);\n  $max: breakpoint-max($upper, $breakpoints);\n\n  @if $min != null and $max != null {\n    @media (min-width: $min) and (max-width: $max) {\n      @content;\n    }\n  } @else if $max == null {\n    @include media-breakpoint-up($lower, $breakpoints) {\n      @content;\n    }\n  } @else if $min == null {\n    @include media-breakpoint-down($upper, $breakpoints) {\n      @content;\n    }\n  }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n  $min: breakpoint-min($name, $breakpoints);\n  $max: breakpoint-max($name, $breakpoints);\n\n  @if $min != null and $max != null {\n    @media (min-width: $min) and (max-width: $max) {\n      @content;\n    }\n  } @else if $max == null {\n    @include media-breakpoint-up($name, $breakpoints) {\n      @content;\n    }\n  } @else if $min == null {\n    @include media-breakpoint-down($name, $breakpoints) {\n      @content;\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_buttons.scss",
    "content": "// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%)) {\n  color: color-yiq($background);\n  @include gradient-bg($background);\n  border-color: $border;\n  @include box-shadow($btn-box-shadow);\n\n  @include hover() {\n    color: color-yiq($hover-background);\n    @include gradient-bg($hover-background);\n    border-color: $hover-border;\n  }\n\n  &:focus,\n  &.focus {\n    color: color-yiq($hover-background);\n    @include gradient-bg($hover-background);\n    border-color: $hover-border;\n    @if $enable-shadows {\n      @include box-shadow($btn-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5));\n    } @else {\n      // Avoid using mixin so we can pass custom focus shadow properly\n      box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n    }\n  }\n\n  // Disabled comes first so active can properly restyle\n  &.disabled,\n  &:disabled {\n    color: color-yiq($background);\n    background-color: $background;\n    border-color: $border;\n    // Remove CSS gradients if they're enabled\n    @if $enable-gradients {\n      background-image: none;\n    }\n  }\n\n  &:not(:disabled):not(.disabled):active,\n  &:not(:disabled):not(.disabled).active,\n  .show > &.dropdown-toggle {\n    color: color-yiq($active-background);\n    background-color: $active-background;\n    @if $enable-gradients {\n      background-image: none; // Remove the gradient for the pressed/active state\n    }\n    border-color: $active-border;\n\n    &:focus {\n      @if $enable-shadows and $btn-active-box-shadow != none {\n        @include box-shadow($btn-active-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5));\n      } @else {\n        // Avoid using mixin so we can pass custom focus shadow properly\n        box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);\n      }\n    }\n  }\n}\n\n@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) {\n  color: $color;\n  border-color: $color;\n\n  @include hover() {\n    color: $color-hover;\n    background-color: $active-background;\n    border-color: $active-border;\n  }\n\n  &:focus,\n  &.focus {\n    box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n  }\n\n  &.disabled,\n  &:disabled {\n    color: $color;\n    background-color: transparent;\n  }\n\n  &:not(:disabled):not(.disabled):active,\n  &:not(:disabled):not(.disabled).active,\n  .show > &.dropdown-toggle {\n    color: color-yiq($active-background);\n    background-color: $active-background;\n    border-color: $active-border;\n\n    &:focus {\n      @if $enable-shadows and $btn-active-box-shadow != none {\n        @include box-shadow($btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5));\n      } @else {\n        // Avoid using mixin so we can pass custom focus shadow properly\n        box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);\n      }\n    }\n  }\n}\n\n// Button sizes\n@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n  padding: $padding-y $padding-x;\n  @include font-size($font-size);\n  line-height: $line-height;\n  // Manually declare to provide an override to the browser default\n  @include border-radius($border-radius, 0);\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_caret.scss",
    "content": "@mixin caret-down() {\n  border-top: $caret-width solid;\n  border-right: $caret-width solid transparent;\n  border-bottom: 0;\n  border-left: $caret-width solid transparent;\n}\n\n@mixin caret-up() {\n  border-top: 0;\n  border-right: $caret-width solid transparent;\n  border-bottom: $caret-width solid;\n  border-left: $caret-width solid transparent;\n}\n\n@mixin caret-right() {\n  border-top: $caret-width solid transparent;\n  border-right: 0;\n  border-bottom: $caret-width solid transparent;\n  border-left: $caret-width solid;\n}\n\n@mixin caret-left() {\n  border-top: $caret-width solid transparent;\n  border-right: $caret-width solid;\n  border-bottom: $caret-width solid transparent;\n}\n\n@mixin caret($direction: down) {\n  @if $enable-caret {\n    &::after {\n      display: inline-block;\n      margin-left: $caret-spacing;\n      vertical-align: $caret-vertical-align;\n      content: \"\";\n      @if $direction == down {\n        @include caret-down();\n      } @else if $direction == up {\n        @include caret-up();\n      } @else if $direction == right {\n        @include caret-right();\n      }\n    }\n\n    @if $direction == left {\n      &::after {\n        display: none;\n      }\n\n      &::before {\n        display: inline-block;\n        margin-right: $caret-spacing;\n        vertical-align: $caret-vertical-align;\n        content: \"\";\n        @include caret-left();\n      }\n    }\n\n    &:empty::after {\n      margin-left: 0;\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_clearfix.scss",
    "content": "@mixin clearfix() {\n  &::after {\n    display: block;\n    clear: both;\n    content: \"\";\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_deprecate.scss",
    "content": "// Deprecate mixin\n//\n// This mixin can be used to deprecate mixins or functions.\n// `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to\n// some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap)\n@mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) {\n  @if ($enable-deprecation-messages != false and $ignore-warning != true) {\n    @warn \"#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}.\";\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_float.scss",
    "content": "// stylelint-disable declaration-no-important\n\n@mixin float-left() {\n  float: left !important;\n  @include deprecate(\"The `float-left` mixin\", \"v4.3.0\", \"v5\");\n}\n@mixin float-right() {\n  float: right !important;\n  @include deprecate(\"The `float-right` mixin\", \"v4.3.0\", \"v5\");\n}\n@mixin float-none() {\n  float: none !important;\n  @include deprecate(\"The `float-none` mixin\", \"v4.3.0\", \"v5\");\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_forms.scss",
    "content": "// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `$input-focus-border-color` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n@mixin form-control-focus($ignore-warning: false) {\n  &:focus {\n    color: $input-focus-color;\n    background-color: $input-focus-bg;\n    border-color: $input-focus-border-color;\n    outline: 0;\n    @if $enable-shadows {\n      @include box-shadow($input-box-shadow, $input-focus-box-shadow);\n    } @else {\n      // Avoid using mixin so we can pass custom focus shadow properly\n      box-shadow: $input-focus-box-shadow;\n    }\n  }\n  @include deprecate(\"The `form-control-focus()` mixin\", \"v4.4.0\", \"v5\", $ignore-warning);\n}\n\n// This mixin uses an `if()` technique to be compatible with Dart Sass\n// See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details\n@mixin form-validation-state-selector($state) {\n  @if ($state == \"valid\" or $state == \"invalid\") {\n    .was-validated #{if(&, \"&\", \"\")}:#{$state},\n    #{if(&, \"&\", \"\")}.is-#{$state} {\n      @content;\n    }\n  } @else {\n    #{if(&, \"&\", \"\")}.is-#{$state} {\n      @content;\n    }\n  }\n}\n\n@mixin form-validation-state($state, $color, $icon) {\n  .#{$state}-feedback {\n    display: none;\n    width: 100%;\n    margin-top: $form-feedback-margin-top;\n    @include font-size($form-feedback-font-size);\n    color: $color;\n  }\n\n  .#{$state}-tooltip {\n    position: absolute;\n    top: 100%;\n    left: 0;\n    z-index: 5;\n    display: none;\n    max-width: 100%; // Contain to parent when possible\n    padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\n    margin-top: .1rem;\n    @include font-size($form-feedback-tooltip-font-size);\n    line-height: $form-feedback-tooltip-line-height;\n    color: color-yiq($color);\n    background-color: rgba($color, $form-feedback-tooltip-opacity);\n    @include border-radius($form-feedback-tooltip-border-radius);\n\n    // See https://github.com/twbs/bootstrap/pull/31557\n    // Align tooltip to form elements\n    .form-row > .col > &,\n    .form-row > [class*=\"col-\"] > & {\n      left: $form-grid-gutter-width / 2;\n    }\n  }\n\n  @include form-validation-state-selector($state) {\n    ~ .#{$state}-feedback,\n    ~ .#{$state}-tooltip {\n      display: block;\n    }\n  }\n\n  .form-control {\n    @include form-validation-state-selector($state) {\n      border-color: $color;\n\n      @if $enable-validation-icons {\n        padding-right: $input-height-inner;\n        background-image: escape-svg($icon);\n        background-repeat: no-repeat;\n        background-position: right $input-height-inner-quarter center;\n        background-size: $input-height-inner-half $input-height-inner-half;\n      }\n\n      &:focus {\n        border-color: $color;\n        box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n      }\n    }\n  }\n\n  // stylelint-disable-next-line selector-no-qualifying-type\n  textarea.form-control {\n    @include form-validation-state-selector($state) {\n      @if $enable-validation-icons {\n        padding-right: $input-height-inner;\n        background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\n      }\n    }\n  }\n\n  .custom-select {\n    @include form-validation-state-selector($state) {\n      border-color: $color;\n\n      @if $enable-validation-icons {\n        padding-right: $custom-select-feedback-icon-padding-right;\n        background: $custom-select-background, $custom-select-bg escape-svg($icon) $custom-select-feedback-icon-position / $custom-select-feedback-icon-size no-repeat;\n      }\n\n      &:focus {\n        border-color: $color;\n        box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n      }\n    }\n  }\n\n  .form-check-input {\n    @include form-validation-state-selector($state) {\n      ~ .form-check-label {\n        color: $color;\n      }\n\n      ~ .#{$state}-feedback,\n      ~ .#{$state}-tooltip {\n        display: block;\n      }\n    }\n  }\n\n  .custom-control-input {\n    @include form-validation-state-selector($state) {\n      ~ .custom-control-label {\n        color: $color;\n\n        &::before {\n          border-color: $color;\n        }\n      }\n\n      &:checked {\n        ~ .custom-control-label::before {\n          border-color: lighten($color, 10%);\n          @include gradient-bg(lighten($color, 10%));\n        }\n      }\n\n      &:focus {\n        ~ .custom-control-label::before {\n          box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n        }\n\n        &:not(:checked) ~ .custom-control-label::before {\n          border-color: $color;\n        }\n      }\n    }\n  }\n\n  // custom file\n  .custom-file-input {\n    @include form-validation-state-selector($state) {\n      ~ .custom-file-label {\n        border-color: $color;\n      }\n\n      &:focus {\n        ~ .custom-file-label {\n          border-color: $color;\n          box-shadow: 0 0 0 $input-focus-width rgba($color, .25);\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_gradients.scss",
    "content": "// Gradients\n\n@mixin gradient-bg($color) {\n  @if $enable-gradients {\n    background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x;\n  } @else {\n    background-color: $color;\n  }\n}\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n  background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n  background-repeat: repeat-x;\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n  background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n  background-repeat: repeat-x;\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n  background-image: linear-gradient($deg, $start-color, $end-color);\n  background-repeat: repeat-x;\n}\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n  background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n  background-repeat: no-repeat;\n}\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n  background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-repeat: no-repeat;\n}\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n  background-image: radial-gradient(circle, $inner-color, $outer-color);\n  background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n  background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_grid-framework.scss",
    "content": "// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n  // Common properties for all breakpoints\n  %grid-column {\n    position: relative;\n    width: 100%;\n    padding-right: $gutter / 2;\n    padding-left: $gutter / 2;\n  }\n\n  @each $breakpoint in map-keys($breakpoints) {\n    $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n    @if $columns > 0 {\n      // Allow columns to stretch full width below their breakpoints\n      @for $i from 1 through $columns {\n        .col#{$infix}-#{$i} {\n          @extend %grid-column;\n        }\n      }\n    }\n\n    .col#{$infix},\n    .col#{$infix}-auto {\n      @extend %grid-column;\n    }\n\n    @include media-breakpoint-up($breakpoint, $breakpoints) {\n      // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n      .col#{$infix} {\n        flex-basis: 0;\n        flex-grow: 1;\n        max-width: 100%;\n      }\n\n      @if $grid-row-columns > 0 {\n        @for $i from 1 through $grid-row-columns {\n          .row-cols#{$infix}-#{$i} {\n            @include row-cols($i);\n          }\n        }\n      }\n\n      .col#{$infix}-auto {\n        @include make-col-auto();\n      }\n\n      @if $columns > 0 {\n        @for $i from 1 through $columns {\n          .col#{$infix}-#{$i} {\n            @include make-col($i, $columns);\n          }\n        }\n      }\n\n      .order#{$infix}-first { order: -1; }\n\n      .order#{$infix}-last { order: $columns + 1; }\n\n      @for $i from 0 through $columns {\n        .order#{$infix}-#{$i} { order: $i; }\n      }\n\n      @if $columns > 0 {\n        // `$columns - 1` because offsetting by the width of an entire row isn't possible\n        @for $i from 0 through ($columns - 1) {\n          @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n            .offset#{$infix}-#{$i} {\n              @include make-col-offset($i, $columns);\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_grid.scss",
    "content": "/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container($gutter: $grid-gutter-width) {\n  width: 100%;\n  padding-right: $gutter / 2;\n  padding-left: $gutter / 2;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@mixin make-row($gutter: $grid-gutter-width) {\n  display: flex;\n  flex-wrap: wrap;\n  margin-right: -$gutter / 2;\n  margin-left: -$gutter / 2;\n}\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n  @each $breakpoint, $container-max-width in $max-widths {\n    @include media-breakpoint-up($breakpoint, $breakpoints) {\n      max-width: $container-max-width;\n    }\n  }\n  @include deprecate(\"The `make-container-max-widths` mixin\", \"v4.5.2\", \"v5\");\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n  position: relative;\n  // Prevent columns from becoming too narrow when at smaller grid tiers by\n  // always setting `width: 100%;`. This works because we use `flex` values\n  // later on to override this initial width.\n  width: 100%;\n  padding-right: $gutter / 2;\n  padding-left: $gutter / 2;\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n  flex: 0 0 percentage($size / $columns);\n  // Add a `max-width` to ensure content within each column does not blow out\n  // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n  // do not appear to require this.\n  max-width: percentage($size / $columns);\n}\n\n@mixin make-col-auto() {\n  flex: 0 0 auto;\n  width: auto;\n  max-width: 100%; // Reset earlier grid tiers\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n  $num: $size / $columns;\n  margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// numberof columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n  > * {\n    flex: 0 0 100% / $count;\n    max-width: 100% / $count;\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_hover.scss",
    "content": "// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover() {\n  &:hover { @content; }\n}\n\n@mixin hover-focus() {\n  &:hover,\n  &:focus {\n    @content;\n  }\n}\n\n@mixin plain-hover-focus() {\n  &,\n  &:hover,\n  &:focus {\n    @content;\n  }\n}\n\n@mixin hover-focus-active() {\n  &:hover,\n  &:focus,\n  &:active {\n    @content;\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_image.scss",
    "content": "// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid() {\n  // Part 1: Set a maximum relative to the parent\n  max-width: 100%;\n  // Part 2: Override the height to auto, otherwise images will be stretched\n  // when setting a width and height attribute on the img element.\n  height: auto;\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size.\n\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n  background-image: url($file-1x);\n\n  // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,\n  // but doesn't convert dppx=>dpi.\n  // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.\n  // Compatibility info: https://caniuse.com/css-media-resolution\n  @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx\n    only screen and (min-resolution: 2dppx) { // Standardized\n    background-image: url($file-2x);\n    background-size: $width-1x $height-1x;\n  }\n  @include deprecate(\"`img-retina()`\", \"v4.3.0\", \"v5\");\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_list-group.scss",
    "content": "// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n  .list-group-item-#{$state} {\n    color: $color;\n    background-color: $background;\n\n    &.list-group-item-action {\n      @include hover-focus() {\n        color: $color;\n        background-color: darken($background, 5%);\n      }\n\n      &.active {\n        color: $white;\n        background-color: $color;\n        border-color: $color;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_lists.scss",
    "content": "// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled() {\n  padding-left: 0;\n  list-style: none;\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_nav-divider.scss",
    "content": "// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y, $ignore-warning: false) {\n  height: 0;\n  margin: $margin-y 0;\n  overflow: hidden;\n  border-top: 1px solid $color;\n  @include deprecate(\"The `nav-divider()` mixin\", \"v4.4.0\", \"v5\", $ignore-warning);\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_pagination.scss",
    "content": "// Pagination\n\n@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n  .page-link {\n    padding: $padding-y $padding-x;\n    @include font-size($font-size);\n    line-height: $line-height;\n  }\n\n  .page-item {\n    &:first-child {\n      .page-link {\n        @include border-left-radius($border-radius);\n      }\n    }\n    &:last-child {\n      .page-link {\n        @include border-right-radius($border-radius);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_reset-text.scss",
    "content": "@mixin reset-text() {\n  font-family: $font-family-base;\n  // We deliberately do NOT reset font-size or word-wrap.\n  font-style: normal;\n  font-weight: $font-weight-normal;\n  line-height: $line-height-base;\n  text-align: left; // Fallback for where `start` is not supported\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_resize.scss",
    "content": "// Resize anything\n\n@mixin resizable($direction) {\n  overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`\n  resize: $direction; // Options: horizontal, vertical, both\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_screen-reader.scss",
    "content": "// Only display content to screen readers\n//\n// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/\n// See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin sr-only() {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px; // Fix for https://github.com/twbs/bootstrap/issues/25686\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n//\n// Credit: HTML5 Boilerplate\n\n@mixin sr-only-focusable() {\n  &:active,\n  &:focus {\n    position: static;\n    width: auto;\n    height: auto;\n    overflow: visible;\n    clip: auto;\n    white-space: normal;\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_size.scss",
    "content": "// Sizing shortcuts\n\n@mixin size($width, $height: $width) {\n  width: $width;\n  height: $height;\n  @include deprecate(\"`size()`\", \"v4.3.0\", \"v5\");\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_table-row.scss",
    "content": "// Tables\n\n@mixin table-row-variant($state, $background, $border: null) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table-#{$state} {\n    &,\n    > th,\n    > td {\n      background-color: $background;\n    }\n\n    @if $border != null {\n      th,\n      td,\n      thead th,\n      tbody + tbody {\n        border-color: $border;\n      }\n    }\n  }\n\n  // Hover states for `.table-hover`\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\n  .table-hover {\n    $hover-background: darken($background, 5%);\n\n    .table-#{$state} {\n      @include hover() {\n        background-color: $hover-background;\n\n        > td,\n        > th {\n          background-color: $hover-background;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_text-emphasis.scss",
    "content": "// stylelint-disable declaration-no-important\n\n// Typography\n\n@mixin text-emphasis-variant($parent, $color, $ignore-warning: false) {\n  #{$parent} {\n    color: $color !important;\n  }\n  @if $emphasized-link-hover-darken-percentage != 0 {\n    a#{$parent} {\n      @include hover-focus() {\n        color: darken($color, $emphasized-link-hover-darken-percentage) !important;\n      }\n    }\n  }\n  @include deprecate(\"`text-emphasis-variant()`\", \"v4.4.0\", \"v5\", $ignore-warning);\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_text-hide.scss",
    "content": "// CSS image replacement\n@mixin text-hide($ignore-warning: false) {\n  // stylelint-disable-next-line font-family-no-missing-generic-family-keyword\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n\n  @include deprecate(\"`text-hide()`\", \"v4.1.0\", \"v5\", $ignore-warning);\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_text-truncate.scss",
    "content": "// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_transition.scss",
    "content": "// stylelint-disable property-disallowed-list\n@mixin transition($transition...) {\n  @if length($transition) == 0 {\n    $transition: $transition-base;\n  }\n\n  @if length($transition) > 1 {\n    @each $value in $transition {\n      @if $value == null or $value == none {\n        @warn \"The keyword 'none' or 'null' must be used as a single argument.\";\n      }\n    }\n  }\n\n  @if $enable-transitions {\n    @if nth($transition, 1) != null {\n      transition: $transition;\n    }\n\n    @if $enable-prefers-reduced-motion-media-query and nth($transition, 1) != null and nth($transition, 1) != none {\n      @media (prefers-reduced-motion: reduce) {\n        transition: none;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/mixins/_visibility.scss",
    "content": "// stylelint-disable declaration-no-important\n\n// Visibility\n\n@mixin invisible($visibility) {\n  visibility: $visibility !important;\n  @include deprecate(\"`invisible()`\", \"v4.3.0\", \"v5\");\n}\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_align.scss",
    "content": "// stylelint-disable declaration-no-important\n\n.align-baseline    { vertical-align: baseline !important; } // Browser default\n.align-top         { vertical-align: top !important; }\n.align-middle      { vertical-align: middle !important; }\n.align-bottom      { vertical-align: bottom !important; }\n.align-text-bottom { vertical-align: text-bottom !important; }\n.align-text-top    { vertical-align: text-top !important; }\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_background.scss",
    "content": "// stylelint-disable declaration-no-important\n\n@each $color, $value in $theme-colors {\n  @include bg-variant(\".bg-#{$color}\", $value, true);\n}\n\n@if $enable-gradients {\n  @each $color, $value in $theme-colors {\n    @include bg-gradient-variant(\".bg-gradient-#{$color}\", $value, true);\n  }\n}\n\n.bg-transparent {\n  background-color: transparent !important;\n}\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_borders.scss",
    "content": "// stylelint-disable property-disallowed-list, declaration-no-important\n\n//\n// Border\n//\n\n.border         { border: $border-width solid $border-color !important; }\n.border-top     { border-top: $border-width solid $border-color !important; }\n.border-right   { border-right: $border-width solid $border-color !important; }\n.border-bottom  { border-bottom: $border-width solid $border-color !important; }\n.border-left    { border-left: $border-width solid $border-color !important; }\n\n.border-0        { border: 0 !important; }\n.border-top-0    { border-top: 0 !important; }\n.border-right-0  { border-right: 0 !important; }\n.border-bottom-0 { border-bottom: 0 !important; }\n.border-left-0   { border-left: 0 !important; }\n\n@each $color, $value in $theme-colors {\n  .border-#{$color} {\n    border-color: $value !important;\n  }\n}\n\n.border-white {\n  border-color: $white !important;\n}\n\n//\n// Border-radius\n//\n\n.rounded-sm {\n  border-radius: $border-radius-sm !important;\n}\n\n.rounded {\n  border-radius: $border-radius !important;\n}\n\n.rounded-top {\n  border-top-left-radius: $border-radius !important;\n  border-top-right-radius: $border-radius !important;\n}\n\n.rounded-right {\n  border-top-right-radius: $border-radius !important;\n  border-bottom-right-radius: $border-radius !important;\n}\n\n.rounded-bottom {\n  border-bottom-right-radius: $border-radius !important;\n  border-bottom-left-radius: $border-radius !important;\n}\n\n.rounded-left {\n  border-top-left-radius: $border-radius !important;\n  border-bottom-left-radius: $border-radius !important;\n}\n\n.rounded-lg {\n  border-radius: $border-radius-lg !important;\n}\n\n.rounded-circle {\n  border-radius: 50% !important;\n}\n\n.rounded-pill {\n  border-radius: $rounded-pill !important;\n}\n\n.rounded-0 {\n  border-radius: 0 !important;\n}\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_clearfix.scss",
    "content": ".clearfix {\n  @include clearfix();\n}\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_display.scss",
    "content": "// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n  @include media-breakpoint-up($breakpoint) {\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n    @each $value in $displays {\n      .d#{$infix}-#{$value} { display: $value !important; }\n    }\n  }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n  @each $value in $displays {\n    .d-print-#{$value} { display: $value !important; }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_embed.scss",
    "content": "// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  width: 100%;\n  padding: 0;\n  overflow: hidden;\n\n  &::before {\n    display: block;\n    content: \"\";\n  }\n\n  .embed-responsive-item,\n  iframe,\n  embed,\n  object,\n  video {\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    border: 0;\n  }\n}\n\n@each $embed-responsive-aspect-ratio in $embed-responsive-aspect-ratios {\n  $embed-responsive-aspect-ratio-x: nth($embed-responsive-aspect-ratio, 1);\n  $embed-responsive-aspect-ratio-y: nth($embed-responsive-aspect-ratio, 2);\n\n  .embed-responsive-#{$embed-responsive-aspect-ratio-x}by#{$embed-responsive-aspect-ratio-y} {\n    &::before {\n      padding-top: percentage($embed-responsive-aspect-ratio-y / $embed-responsive-aspect-ratio-x);\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_flex.scss",
    "content": "// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n  @include media-breakpoint-up($breakpoint) {\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n    .flex#{$infix}-row            { flex-direction: row !important; }\n    .flex#{$infix}-column         { flex-direction: column !important; }\n    .flex#{$infix}-row-reverse    { flex-direction: row-reverse !important; }\n    .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n    .flex#{$infix}-wrap         { flex-wrap: wrap !important; }\n    .flex#{$infix}-nowrap       { flex-wrap: nowrap !important; }\n    .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n    .flex#{$infix}-fill         { flex: 1 1 auto !important; }\n    .flex#{$infix}-grow-0       { flex-grow: 0 !important; }\n    .flex#{$infix}-grow-1       { flex-grow: 1 !important; }\n    .flex#{$infix}-shrink-0     { flex-shrink: 0 !important; }\n    .flex#{$infix}-shrink-1     { flex-shrink: 1 !important; }\n\n    .justify-content#{$infix}-start   { justify-content: flex-start !important; }\n    .justify-content#{$infix}-end     { justify-content: flex-end !important; }\n    .justify-content#{$infix}-center  { justify-content: center !important; }\n    .justify-content#{$infix}-between { justify-content: space-between !important; }\n    .justify-content#{$infix}-around  { justify-content: space-around !important; }\n\n    .align-items#{$infix}-start    { align-items: flex-start !important; }\n    .align-items#{$infix}-end      { align-items: flex-end !important; }\n    .align-items#{$infix}-center   { align-items: center !important; }\n    .align-items#{$infix}-baseline { align-items: baseline !important; }\n    .align-items#{$infix}-stretch  { align-items: stretch !important; }\n\n    .align-content#{$infix}-start   { align-content: flex-start !important; }\n    .align-content#{$infix}-end     { align-content: flex-end !important; }\n    .align-content#{$infix}-center  { align-content: center !important; }\n    .align-content#{$infix}-between { align-content: space-between !important; }\n    .align-content#{$infix}-around  { align-content: space-around !important; }\n    .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n    .align-self#{$infix}-auto     { align-self: auto !important; }\n    .align-self#{$infix}-start    { align-self: flex-start !important; }\n    .align-self#{$infix}-end      { align-self: flex-end !important; }\n    .align-self#{$infix}-center   { align-self: center !important; }\n    .align-self#{$infix}-baseline { align-self: baseline !important; }\n    .align-self#{$infix}-stretch  { align-self: stretch !important; }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_float.scss",
    "content": "// stylelint-disable declaration-no-important\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n  @include media-breakpoint-up($breakpoint) {\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n    .float#{$infix}-left  { float: left !important; }\n    .float#{$infix}-right { float: right !important; }\n    .float#{$infix}-none  { float: none !important; }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_interactions.scss",
    "content": "// stylelint-disable declaration-no-important\n\n@each $value in $user-selects {\n  .user-select-#{$value} { user-select: $value !important; }\n}\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_overflow.scss",
    "content": "// stylelint-disable declaration-no-important\n\n@each $value in $overflows {\n  .overflow-#{$value} { overflow: $value !important; }\n}\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_position.scss",
    "content": "// stylelint-disable declaration-no-important\n\n// Common values\n@each $position in $positions {\n  .position-#{$position} { position: $position !important; }\n}\n\n// Shorthand\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: $zindex-fixed;\n}\n\n.fixed-bottom {\n  position: fixed;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: $zindex-fixed;\n}\n\n.sticky-top {\n  @supports (position: sticky) {\n    position: sticky;\n    top: 0;\n    z-index: $zindex-sticky;\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_screenreaders.scss",
    "content": "//\n// Screenreaders\n//\n\n.sr-only {\n  @include sr-only();\n}\n\n.sr-only-focusable {\n  @include sr-only-focusable();\n}\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_shadows.scss",
    "content": "// stylelint-disable declaration-no-important\n\n.shadow-sm { box-shadow: $box-shadow-sm !important; }\n.shadow { box-shadow: $box-shadow !important; }\n.shadow-lg { box-shadow: $box-shadow-lg !important; }\n.shadow-none { box-shadow: none !important; }\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_sizing.scss",
    "content": "// stylelint-disable declaration-no-important\n\n// Width and height\n\n@each $prop, $abbrev in (width: w, height: h) {\n  @each $size, $length in $sizes {\n    .#{$abbrev}-#{$size} { #{$prop}: $length !important; }\n  }\n}\n\n.mw-100 { max-width: 100% !important; }\n.mh-100 { max-height: 100% !important; }\n\n// Viewport additional helpers\n\n.min-vw-100 { min-width: 100vw !important; }\n.min-vh-100 { min-height: 100vh !important; }\n\n.vw-100 { width: 100vw !important; }\n.vh-100 { height: 100vh !important; }\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_spacing.scss",
    "content": "// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n  @include media-breakpoint-up($breakpoint) {\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n    @each $prop, $abbrev in (margin: m, padding: p) {\n      @each $size, $length in $spacers {\n        .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n        .#{$abbrev}t#{$infix}-#{$size},\n        .#{$abbrev}y#{$infix}-#{$size} {\n          #{$prop}-top: $length !important;\n        }\n        .#{$abbrev}r#{$infix}-#{$size},\n        .#{$abbrev}x#{$infix}-#{$size} {\n          #{$prop}-right: $length !important;\n        }\n        .#{$abbrev}b#{$infix}-#{$size},\n        .#{$abbrev}y#{$infix}-#{$size} {\n          #{$prop}-bottom: $length !important;\n        }\n        .#{$abbrev}l#{$infix}-#{$size},\n        .#{$abbrev}x#{$infix}-#{$size} {\n          #{$prop}-left: $length !important;\n        }\n      }\n    }\n\n    // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\n    @each $size, $length in $spacers {\n      @if $size != 0 {\n        .m#{$infix}-n#{$size} { margin: -$length !important; }\n        .mt#{$infix}-n#{$size},\n        .my#{$infix}-n#{$size} {\n          margin-top: -$length !important;\n        }\n        .mr#{$infix}-n#{$size},\n        .mx#{$infix}-n#{$size} {\n          margin-right: -$length !important;\n        }\n        .mb#{$infix}-n#{$size},\n        .my#{$infix}-n#{$size} {\n          margin-bottom: -$length !important;\n        }\n        .ml#{$infix}-n#{$size},\n        .mx#{$infix}-n#{$size} {\n          margin-left: -$length !important;\n        }\n      }\n    }\n\n    // Some special margin utils\n    .m#{$infix}-auto { margin: auto !important; }\n    .mt#{$infix}-auto,\n    .my#{$infix}-auto {\n      margin-top: auto !important;\n    }\n    .mr#{$infix}-auto,\n    .mx#{$infix}-auto {\n      margin-right: auto !important;\n    }\n    .mb#{$infix}-auto,\n    .my#{$infix}-auto {\n      margin-bottom: auto !important;\n    }\n    .ml#{$infix}-auto,\n    .mx#{$infix}-auto {\n      margin-left: auto !important;\n    }\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_stretched-link.scss",
    "content": "//\n// Stretched link\n//\n\n.stretched-link {\n  &::after {\n    position: absolute;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    z-index: 1;\n    // Just in case `pointer-events: none` is set on a parent\n    pointer-events: auto;\n    content: \"\";\n    // IE10 bugfix, see https://stackoverflow.com/questions/16947967/ie10-hover-pseudo-class-doesnt-work-without-background-color\n    background-color: rgba(0, 0, 0, 0);\n  }\n}\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_text.scss",
    "content": "// stylelint-disable declaration-no-important\n\n//\n// Text\n//\n\n.text-monospace { font-family: $font-family-monospace !important; }\n\n// Alignment\n\n.text-justify  { text-align: justify !important; }\n.text-wrap     { white-space: normal !important; }\n.text-nowrap   { white-space: nowrap !important; }\n.text-truncate { @include text-truncate(); }\n\n// Responsive alignment\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n  @include media-breakpoint-up($breakpoint) {\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n    .text#{$infix}-left   { text-align: left !important; }\n    .text#{$infix}-right  { text-align: right !important; }\n    .text#{$infix}-center { text-align: center !important; }\n  }\n}\n\n// Transformation\n\n.text-lowercase  { text-transform: lowercase !important; }\n.text-uppercase  { text-transform: uppercase !important; }\n.text-capitalize { text-transform: capitalize !important; }\n\n// Weight and italics\n\n.font-weight-light   { font-weight: $font-weight-light !important; }\n.font-weight-lighter { font-weight: $font-weight-lighter !important; }\n.font-weight-normal  { font-weight: $font-weight-normal !important; }\n.font-weight-bold    { font-weight: $font-weight-bold !important; }\n.font-weight-bolder  { font-weight: $font-weight-bolder !important; }\n.font-italic         { font-style: italic !important; }\n\n// Contextual colors\n\n.text-white { color: $white !important; }\n\n@each $color, $value in $theme-colors {\n  @include text-emphasis-variant(\".text-#{$color}\", $value, true);\n}\n\n.text-body { color: $body-color !important; }\n.text-muted { color: $text-muted !important; }\n\n.text-black-50 { color: rgba($black, .5) !important; }\n.text-white-50 { color: rgba($white, .5) !important; }\n\n// Misc\n\n.text-hide {\n  @include text-hide($ignore-warning: true);\n}\n\n.text-decoration-none { text-decoration: none !important; }\n\n.text-break {\n  word-break: break-word !important; // Deprecated, but avoids issues with flex containers\n  word-wrap: break-word !important; // Used instead of `overflow-wrap` for IE & Edge Legacy\n}\n\n// Reset\n\n.text-reset { color: inherit !important; }\n"
  },
  {
    "path": "_sass/bootstrap/utilities/_visibility.scss",
    "content": "// stylelint-disable declaration-no-important\n\n//\n// Visibility utilities\n//\n\n.visible {\n  visibility: visible !important;\n}\n\n.invisible {\n  visibility: hidden !important;\n}\n"
  },
  {
    "path": "_sass/bootstrap-4-jekyll/_bootstrap-4-jekyll.scss",
    "content": "// Some CSS to ease the integration between Jekyll and Bootstrap 4.\n// It is not recommended to edit this file.\n\n.page-content {\n  img {\n    max-width: 100%;\n  }\n}\n"
  },
  {
    "path": "announcements.md",
    "content": "---\nlayout: page\ntitle: Announcements \n---\n\n# Hacky Holidays 2021!\n\n![Grinsh Networks](./assets/grinch.png)\nThe Grinch has gone hi-tech this year with the intentions of ruining the holidays and we need you to infiltrate his network and take him down! \n\nFor the next twelve days, starting at 12pm PT on Friday, December 10, 2021, the Grinch Networks will be releasing new functionality to their [website](https://hackyholidays.h1ctf.com/). Once you have found each flag, you will need to submit and validate it on Hacker101's [CTF platform](https://ctf.hacker101.com/ctf). At the end of the 12th challenge and once you have solved them all, you must submit a full writeup [here](hackerone.com/h1-ctf).\n\n## Prizes and Awards\n\nIn the spirit of the holidays, all participants (anyone who submits at least a flag) will get added to HackerOne’s priority invitation queue to receive an invite to  private bug bounty program on HackerOne. In addition to every CTF flag you find, you’ll automatically receive points on Hacker101 so you could earn additional invites (one invite for every 26 points). Remember, some flags may weigh more than others! \n\nIn addition to private program invitations, we have **$7,000**  in crash prizes up for grabs! So make sure to submit your write up by December 23, 2021 by 2:00 PM Pacific Time! \n\n- Our favorite report will also receive an invite to HackerOne's next live hacking event\n- $2,000 for the first person to solve all challenges and submit a write up\n- $1,000 for the most creative write up\n- $1,000 for the first person to submit a 0 or no interaction (automated script) report\n- Mistery bonuses (**$100-$500**)\n- All winners will receive HackerOne swag\n- Portswigger's Burp Suite Certified Practitioner Certificaion for up to 25 people\n\n**In addition to the $2,000 awarded to the first person to solve this challenge, we'll be rewarding $250 to the first 10 hackers to solve the entire challenge as well.**\n\nWe welcome collaboration and teamwork, but we ask you to not share any hints, flags or write ups until the end of the competition.\n\nPlease take a moment to review [this page](https://hackerone.com/h1-ctf) for all additional announcements, rules and important information. \n\nHappy hacking and have a hacky holiday \n\n\\- The community team at HackerOne\n\n\n"
  },
  {
    "path": "assets/css/main.scss",
    "content": "---\n# Only the main Sass file needs front matter (the dashes are enough)\n---\n\n@import \"bootstrap/functions\";\n@import \"variables\";\n@import \"bootstrap/bootstrap\";\n@import \"syntax-highlighting\";\n@import \"bootstrap-4-jekyll/bootstrap-4-jekyll\";\n@import \"bootstrap_customization\";\n"
  },
  {
    "path": "assets/javascript/bootstrap/__DO_NOT_MODIFY",
    "content": ""
  },
  {
    "path": "assets/javascript/dark-mode.js",
    "content": "$(document).ready(function() {\n  var darkModeOff = localStorage.getItem('darkModeOff');\n\n  var toggleDarkMode = function() {\n    $(\"#mode-light,#mode-dark\").toggleClass(\"d-none\");\n\n    $(\"main.bg-white,main.bg-black,main .bg-white,main .bg-black\").toggleClass(\"bg-black text-light bg-white\");\n    $(\"main .bg-light,main .bg-dark\").toggleClass(\"bg-dark text-light bg-light\");\n    $(\"main .bg-lighter,main .bg-darker\").toggleClass(\"bg-darker text-light bg-lighter\");\n  };\n\n  if (darkModeOff) {\n    toggleDarkMode();\n  }\n\n  $(\".mode-toggle\").click(function(event) {\n    toggleDarkMode();\n\n    if (localStorage.getItem('darkModeOff')) {\n      localStorage.clear();\n    } else {\n      localStorage.setItem('darkModeOff', true);\n    }\n  })\n});\n"
  },
  {
    "path": "conferences/hacktivitycon2020/0tomvh.md",
    "content": "---\nlayout: page\ntitle: How I got from 0 to MVH\nvideo_src: https://www.youtube-nocookie.com/embed/M48hOtExUII\n---\n\nAbout the Speaker \n-----------------\nSTÖK is a hacker, content creator, and creative with 25 years as a professional in Information Technology. STÖK is not only dedicated to bring excellent content and share new techniques to the red-team and bounty community but also strives to inspire the next generation of hackers to enter the infosec space.\n\nAbstract\n-----------------\nSTÖK gets asked \"How do I get started in bug bounties?\" every day, and it's been like that since the first day he began his own bounty journey about 2 years ago. In 2020, there are so many different paths to choose, and it can be really overwhelming for someone that wants to break into the hacking space. Should you focus on VDPs? Should you do CTFs? Should you spend your time doing recon? Should you automate stuff? Or should you go app deep? There is no right or wrong way to do it, but the most important thing is to simply take action, and simply just start hacking.\n"
  },
  {
    "path": "conferences/hacktivitycon2020/beyondscope.md",
    "content": "---\nlayout: page\ntitle: Beyond the Borders of Scope\nvideo_src: https://www.youtube-nocookie.com/embed/ZV7Xz8p12fo\n---\n\nSpeaker \n-----------------\nJr0ch17 has been in the security industry for about 3 years now, mostly working as a pentester while getting industry certifications like OSCP and GWAPT. Since March 2020, he decided to give a shot to doing bug bounty full time. As a hobby, he likes to play hockey and to hack.\n\nAbstract\n-----------------\nIn this session, I'm going to talk about a somewhat controversial topic in bug bounty: looking at out-of-scope assets. This is not about doing actual hacking on those out-of-scope assets, it's about doing recon on them in special ways in order to find bugs on the in-scope assets. The recon that I do uses a few techniques/tricks that I've been doing for a while which have resulted me in finding some bugs in programs' core applications. As a matter of fact, with the help of that recon, I have never gotten a single duplicate yet so it definitely is an unexplored area. I will go through each technique or trick and show an example of a bug I've found. Some as simple as a reflected XSS (actually not that simple) and some with higher impact like RCE and information disclosure.\n"
  },
  {
    "path": "conferences/hacktivitycon2020/burnouts.md",
    "content": "---\nlayout: page\ntitle: How to Deal with Burnouts\nvideo_src: https://www.youtube-nocookie.com/embed/I6eUy4XIYrY\n---\n\nAbout the Speaker  \n-----------------\nChloe Messdaghi is the VP of Strategy at Point3 Security. She is a security researcher advocate who strongly believes that information security is a humanitarian issue. Besides her passion to keep people safe and empowered online & offline, she is driven to fight for hacker rights. She is the founder of WeAreHackerz (formally known as WomenHackerz) & the President and cofounder of Women of Security (WoSEC), podcaster for ITSP Magazine's The Uncommon Journey, and runs the Hacker Book Club.\n\nAbstract\n-----------------\nHave you ever felt like no matter how much sleep you get, you feel exhausted? Struggle to concentrate? Having trouble balancing work and personal life? Or perhaps feel your work is your life? Then this talk is for you. Burnout. We all go through it at one point. It feels like you are low on battery and it can cause impact emotionally and physically. In this talk, we will cover burnout, how to overcome it, and how to prevent it from happening.\n"
  },
  {
    "path": "conferences/hacktivitycon2020/carivi.md",
    "content": "---\nlayout: page\ntitle: From an 'IVI in a box' to a 'CAR in a box'\nvideo_src: https://www.youtube-nocookie.com/embed/e_7PklFoJe8\n---\n\nAbout the Speaker  \n-----------------\nDetails of the car hack on my own vehicle in 2017 and then how I 1st created an 'IVI in a box' and then PD0 'Car in a box'. Some hints and tips on how not to break your own car!\n\nAbstract\n-----------------\nNetwork / security architect that has a passion for car hacking, found vulnerabilities in his own car and also private Car bug bounties. Now runs Car Hacking Village UK and is part of the team behind CHV at defcon\n"
  },
  {
    "path": "conferences/hacktivitycon2020/codeql.md",
    "content": "---\nlayout: page\ntitle: Discover vulnerabilities with CodeQL\nvideo_src: https://www.youtube-nocookie.com/embed/NygVkQKmGwI\n---\n\nAbout the Speaker  \n-----------------\nBoik Su is currently in CyCraft as a security researcher focusing on web security and threat hunting. He has received some awards from CTFs, been the speaker at various security conferences like ROOTCON 13, OWASP Global AppSec - DC, AVTokyo, NanoSec, and others like OSCON and Taiwan Modern Web. He is also the lecturer at HITCON Training and National Center for Cyber Security Technology in Taiwan.\n\nAbstract\n-----------------\nThis talks is an introduction to CodeQL and its practical functionality. In this talk, Boik will showcase some vulnerabilities that he has found through utilizing CodeQL's powerful static and taint analysis. There's even one flaw that could lead to RCE! Consequently, the audience will understand the concepts of static analysis, taint analysis, data flow analysis, and so on after the talk.\n"
  },
  {
    "path": "conferences/hacktivitycon2020/exploiting_email_systems.md",
    "content": "---\nlayout: page\ntitle: You've Got Pwned\nsubtitle: Exploiting E-mail Systems\nvideo_src: https://www.youtube-nocookie.com/embed/Bpnc1-g3fMk\nredirect_from:\n  - /conferences/hacktivitycon/exploiting-email-systems\n---\n\nAbout the Speaker  \n-----------------\nInti De Ceukelaire is a Belgian ethical hacker and bug bounty hunter. He has made national headlines numerous times with his security awareness stunts, reaching from manipulating the twitter account of US President Donald Trump to publishing fake news on the Vactican's website. As an ethical hacker, Inti hunts down security vulnerabilities in companies like Facebook, Google, Dropbox and the US Department of Defense. In 2018, Inti was awarded the ‚ÄòMost Valuable Hacker' award at HackerOne's annual flagship live hacking event.\n\nAbstract\n-----------------\nE-mail security is more than spam and phishing attacks. In this talk, I will outline a couple of common technical attacks involving e-mails and show some real-world examples from bug bounty programs.\n"
  },
  {
    "path": "conferences/hacktivitycon2020/gitlab.md",
    "content": "---\nlayout: page\ntitle: The journey of finding and exploiting a bug in GitLab\nvideo_src: https://www.youtube-nocookie.com/embed/jBPYfN_uuRw\n---\n\nAbout the Speaker  \n-----------------\nWilliam Bowling (@vakzz) is a full time Software Developer and long time CTF player, based out of Australia, who recently started trying his hand at Bug Bounties in his free time. When not hacking, he likes to go walking with the family and playing little known sports such as underwater hockey.\n\nAbstract\n-----------------\nA short talk about how vakzz got started doing Bug Bounties and a look at the process he went through to find a critical issue in GitLab.\n"
  },
  {
    "path": "conferences/hacktivitycon2020/grafanassrf.md",
    "content": "---\nlayout: page\ntitle:  Graphing Out Internal Networks with CVE-2020-13379 (Unauthed Grafana SSRF)\nvideo_src: https://www.youtube-nocookie.com/embed/NWHOmYbLrZ0\n---\n\nAbout the Speaker  \n-----------------\nJustin Gardner is a full-time bug bounty hunter based near Tokyo, Japan. His focus in the security space is on web vulnerabilities and automated reconnaissance as pertains to bug bounty hunting. Before bug bounty hunting full-time, Justin was held various roles in IT ranging from software developer to IT architect, as well as consulting as a penetration tester with SynerComm for 2 years. Outside of security, Justin loves Jesus, spending time with his wife Mariah, volleyball, learning languages, and Brazilian jiu-jitsu.\n\nAbstract\n-----------------\nThis talk outlines the experience of discovering a full-read unauthed SSRF vulnerability in a product used by thousands of companies in their DMZs. There will be 3 main sections of this talk: the discovery, the exploitation, and the results. \n\nStarting with the discovery of this bug, we'll discuss some methodology of looking at open-source software for security vulnerabilities and how this led to the discovery of CVE-2020-13379. Included in this section will be defining your goals for what kind of impact you wish to achieve, identifying areas of interest, and perseverance (also known as going down the rabbit hole). \n\nFrom there, we'll dive into a demo of the bug. This will include a working PoC for CVE-2020-13379, an exploitation kit that will assist in full exploitation, and a summary of some useful escalation techniques. We will also discuss what it looks like to use this bug against companies who host Grafana instances in the DMZ or in the internal network. \n\nTo bring it all around, we'll talk about the experience of reporting this bug to different vendors and mass-exploitation across bug bounty programs. This will include some lessons learned from mass-exploitation, some awesome collaboration with very skilled hackers, and some great interactions with programs.\n"
  },
  {
    "path": "conferences/hacktivitycon2020/keynote.md",
    "content": "---\nlayout: page\ntitle:  Keynote\nvideo_src: https://www.youtube-nocookie.com/embed/F_W3mV-EC9w\n---\n\nAbout the Speaker  \n-----------------\nGeorgia Weidman is a serial entrepreneur, penetration tester, security researcher, speaker, trainer, mentor, and author. Her work in smartphone exploitation received a DARPA Cyber Fast Track grant and has been featured internationally in print and on television. Georgia is the author of Penetration Testing: A Hands-On Introduction to Hacking. She's presented or conducted training around the world including Blackhat / DEF CON, RSA, NSA, and West Point. \n\n\nAbstract\n-----------------\nThis is the story of how a 14-year-old high school dropout ended up paired talking about iPhones with Tim Cook on the national news. How a technical practitioner whose only knowledge of business came from the Facebook movie became a funded startup founder by walking into a glass door on her first day at a startup accelerator. How that weird kid with funny hats ended up with government research funding but didn’t know what an invoice was to get the money. How the girl who everyone thought was just a member’s girlfriend at the local hacker meeting gave her first talk at Shmoocon and filled the room by offering free beer at 9am from a little red wagon. Through a series of vignettes, Georgia will discuss how she got here and how you can too!\n"
  },
  {
    "path": "conferences/hacktivitycon2020/offsec_panel.md",
    "content": "---\nlayout: page\ntitle: Breaking Down Offensive Security Certifications\nvideo_src: \n---\n\nPanelists\n-----------------\n- Busra Demir \n- Andreea Druga\n- Monika Talekar\n- Rana Khalil\n\nAbstract\n-----------------\nCertifications have become a big part of the infosec industry and they have helped individuals learn about complicated topics and helped with their professional careers. During this session, our panelists will discuss what it takes to be a certified professional as well as additional resources available to those looking to enroll in their next certification"
  },
  {
    "path": "conferences/hacktivitycon2020/parse.md",
    "content": "---\nlayout: page\ntitle:  The problem with Parse\nsubtitle: A low-code server that endangers over 64,000,000 users\nvideo_src: https://www.youtube-nocookie.com/embed/pKjGlo2TkSk\n---\n\n\nAbout the Speaker  \n---\nhealdb is a 23 year old MS CS student and currently in his last semester at RIT. He has been participating in bug bounty programs for the past three years and has been making infosec content on his blog. Healdb loves bug bounties, and has been able to pay for his entire CS MS degree with the proceeds from his findings!\n\nAbstract\n---\nLow-code server platforms provide a necessary service in that they allow all developers regardless of skill the ability to create content and mobile applications. Unfortunately, these low-code solutions also put user data security at risk, because they follow the path of most convenience instead of ensuring that the application will be secure. This talk will focus specifically on the low-code server called \"Parse\". The Parse Platform is a popular web server similar to Firebase that allows mobile application developers to spin up a fully-fledged backend with API support within a very short amount of time and with very little programming experience. In just a few days of scanning the most popular Google Play applications, I was able to discover several vulnerable Parse instances that potentially endanger the data of a collective 64,000,000 users. In this talk, I will give an overview of the many security issues inherent in the Parse platform, as well as give recommendations to both developers and the maintainers of the Parse Platform for how to improve their security posture.\n"
  },
  {
    "path": "conferences/hacktivitycon2020/pentester_blueprint.md",
    "content": "---\nlayout: page\ntitle: The Pentester Blueprint\nsubtitle: A Guide to Becoming a Pentester\nvideo_src: https://www.youtube-nocookie.com/embed/NPuwI7rd4xg\nredirect_from:\n  - /conferences/hacktivitycon/pentester-plueprint\n---\n\nAbout the Speaker  \n-----------------\nPhillip Wylie is the Senior Red Team Lead for a global consumer products company, Adjunct Instructor at Richland College, and The Pwn School Project founder. Phillip has over 22 years of experience with the last 8 years spent as a pentester. Phillip has a passion for mentoring and education. His passion motivated him to start teaching and founding The Pwn School Project a monthly educational meetup focusing on cybersecurity and ethical hacking. Phillip teaches Ethical Hacking and Web Application Pentesting at Richland College in Dallas, TX. Phillip is a co-host for The Uncommon Journey podcast. Phillip holds the following certifications; CISSP, NSA-IAM, OSCP, GWAPT.\n\nAbstract\n-----------------\nPentesting or ethical hacking as it is more commonly known has become a much sought-after job by people in IT, InfoSec, or those just trying to get into the industry. In this presentation, Phillip Wylie shares the blueprint for becoming a pentester. The presentation combines Phillip’s experience as a pentester and ethical hacking instructor to give attendees a guide on how to pursue a career as a pentester. Phillip shares what has worked for his students and people that he has mentored over his years as a pentester. This presentation covers the knowledge and skills needed to become a pentester as well as the steps to achieve them.\n"
  },
  {
    "path": "conferences/hacktivitycon2020/penteststories.md",
    "content": "---\nlayout: page\ntitle:  Pentest Story Time\nsubtitle: My Favorite Hacks From the Past Year\nvideo_src: https://www.youtube-nocookie.com/embed/WOXtXRRp4LI\n---\n\nAbout the Speaker  \n-----------------\nHeath Adams (aka The Cyber Mentor) is the CEO and founder of TCM Security. Outside of TCM Security, he is an online cybersecurity instructor on platforms such as Udemy, YouTube, and Twitch, teaching his students penetration testing methods and tactics. Heath is also a military veteran, having served in the US Army Reserves, and helped co-found VetSec, a 501c3 dedicated to military members in cybersecurity. When Heath is not at work, he enjoys spending time with his wife, Amber, and their five animal \"children.\" He is an avid runner, musician, trivia nerd, and sports fan.\n\nAbstract\n-----------------\n\"This talk covers a few of my favorite stories from the past year and will demonstrate different ways that I managed to \"\"own\"\" an organization during a pentest engagement.  Stories include:\n\nNo MFA? Thanks! - This story discusses how I obtained domain admin access as an external attacker, teaching some key lessons along the way.\nIPv6 FTW! - This story discusses how IPv6 can be abused in internal networks and easily allow for complete domain compromise.\nYou Spent How Much on Security? - This story discusses how I obtained domain controller access on an organization that was doing *almost* everything right and spending a lot of money to do so.\nDigging Deep - This story discusses how I managed to take down an internal network when no apparent exploit existed.\"\n"
  },
  {
    "path": "conferences/hacktivitycon2020/tbhm.md",
    "content": "---\nlayout: page\ntitle:  The Bug Hunter's Methodology v4\nsubtitle: Recon Edition\nvideo_src: https://www.youtube-nocookie.com/embed/qLTe6Z10vj8\n---\n\nAbout the Speaker  \n-----------------\nJason is the Head of Security for a leading videogame production company. Previously he was VP of Trust and Security at Bugcrowd and currently holds the 29th all-time ranked researcher position. Before joining Bugcrowd Jason was the Director of Penetration Testing for HP Fortify and also held the #1 rank on the Bugcrowd leaderboard for two years. He is a hacker and bug hunter through and through and specializes in recon and web application analysis. He has also held positions doing mobile penetration testing, network/infrastructure security assessments, and static analysis. Jason lives in Colorado with his wife and three children. \n\nAbstract\n-----------------\nThe Bug Hunter's Methodology is an ongoing yearly installment on the newest tools and techniques for bug hunters and red teamers. This version explores both common and lesser-known techniques to find assets for a target. The topics discussed will look at finding a targets main seed domains, subdomains, IP space, and discuss cutting edge tools and automation for each topic. By the end of this session a bug hunter or redteamer we will be able to discover and multiply their attack surface. We also discuss several vulnerabilities and misconfigurations related to the recon phase of assessment.\n"
  },
  {
    "path": "conferences/hacktivitycon2020/waf.md",
    "content": "---\nlayout: page\ntitle: WAF Bypass In Depth\nvideo_src: https://www.youtube-nocookie.com/embed/zhkCf8tldbk\n---\n\nAbout the Speaker \n-----------------\nRobert Chen (@notdeghost) is a 17-year-old CTF player with redpwn, bug hunter, software developer, and full-time high school student. He participates in CTFs and various bug bounty programs in his free time. \n \nPhilip Papurt (@ginkoid) is a 16-year-old security researcher, CTF player with redpwn, intern at Emvoice, and high school sophomore. After high school, Philip is interested in pursuing a career in cybersecurity.\n\nAbstract\n-----------------\nAs WAFs grow in complexity, they become increasingly resilient to attacks. However, although the level of determination required has greatly risen in recent years, WAFs are always bypassable. We will provide practical insight into how WAFs operate and introduce novel bypass techniques that can make it a piece of cake to demonstrate the impact of cross-site scripting (XSS) vulnerabilities when behind WAFs. Reflected XSS is a valid vulnerability regardless of the presence of a WAF.\n"
  },
  {
    "path": "conferences/hacktivitycon2020/web_cache_deception.md",
    "content": "---\nlayout: page\ntitle: Cached and Confused\nsubtitle: Web Cache Deception in the Wild\nvideo_src: https://www.youtube-nocookie.com/embed/czDfMWBsIKw\nredirect_from:\n  - /conferences/hacktivitycon/web-cache-deception\n---\n\nAbout the Speaker \n-----------------\nSeyed Ali Mirheidari has over a decade experience of leading penetration tests, vulnerability management and vulnerability assessments of broad technologies including web, network, mobile, and IoT. He is currently a Lead Information Security Consultant at Denim Group conducting network and application penetration testing engagements for Fortune 100 and other enterprise clients. He has a broad experience in building custom exploits for penetration tests and hands-on experience in intrusion detection in large enterprise environments. Ali invests extensive research time gaining an in-depth understanding of complex security implications in underlying protocols. His research leads to implementing new techniques to discover and exploit well-hidden web application flaws. \n  \n Sajjad is a security software engineer, focused on fighting Android Malware with focus on detecting JavaScript abuse in hybrid Android apps. His research is concerned with improving the security of computer systems through application of secure design principles and integration of defensive techniques such as attack detection, prevention, and recovery. Some domains he is active in are large-scale web security/privacy measurement, program analysis, and Malware detection. In his spare time, he is a CTF player and has authored several technical CTF writeups.\n\nAbstract\n-----------------\nWeb Cache Deception (WCD) has been introduced in 2017 by Omer Gil, where an intruder lures a caching server to mistakenly store private information publicly and as a result obtains unauthorized access to cached data. In this talk, we will introduce new exploitation techniques based on the semantic disconnect among different framework-independent web technologies (e.g., browsers, CDNs, web servers) which results in different URL path interpretations. We coined the term \"Path Confusion\" to represent this disagreement and we will present the effectiveness of this technique on WCD attack. In February 2020, our related research was voted and led to an award as the top web hacking technique of 2019 by PortSwigger.\n \nWe explore WCD as an instance of the path confusion class of attacks, and demonstrate that variations on the path confusion technique make it possible to exploit sites that are otherwise not impacted by the original attack. Our findings show that many popular sites remain vulnerable three years after the public disclosure of WCD. To further elucidate the seriousness of path confusion, we will also present the large scale analysis results of WCD attack on high profile sites. We present a semi-automated path confusion crawler which detects hundreds of sites that are still vulnerable to WCD only with specific types of path confusion techniques. \n \nWe conclude the talk with explaining why path confusion is so complicated to remediate while shedding light on potential areas that researchers and bughunters can apply new attack vectors through different path confusion techniques.\n"
  },
  {
    "path": "conferences/hacktivitycon2021/bugbountyfor5years.md",
    "content": "---\nlayout: page\ntitle: Hacking on Bug Bounties for Five Years\nvideo_src: https://www.youtube-nocookie.com/embed/iG7-c0YbhbM/\n---\n\nAbout the Speaker \n-----------------\nShubham Shah is the co-founder and CTO of Assetnote, a platform for continuous monitoring of your external attack surface. Shubham is a prolific bug bounty hunter in the top 50 hackers on HackerOne globally and is first place on the HackerOne leaderboard for Australia. He has presented at various industry events including Kiwicon, BSides Canberra and 44Con.                            \n\nAbstract\n-----------------\nBug bounties have become an established process in organisations with a mature security posture. Over the last five years, we have been submitting vulnerabilities to companies in almost every industry. By participating in bug bounties over such a long period of time, there has been an evolution in the skills, reporting and payouts. There is a broad perception in bounties that there is a secret to unlock to be successful and only a handful of individuals are capable of that success. This presentation will break down why that is not the case. we will walk through all of my favourite bugs that we have found in the last five years, explaining step by step what led to the discoveries. We will discuss some of the lessons we have learned from our participation, and how you can replicate our success."
  },
  {
    "path": "conferences/hacktivitycon2021/ctfdev.md",
    "content": "---\nlayout: page\ntitle: Developing CTFs\nsubtitle: Writing and hosting intentionally vulnerable applications\nvideo_src: https://www.youtube-nocookie.com/embed/XZKdS8Vug2o\n---\n\n\nAbout the Speaker \n-----------------\nMatt Ehrnschwender, a CTF player and developer for CTF4Hire. Work with John Hammond and a team of individuals to host Capture The Flag events. Developed challenges for 7 CTFs with this team along with 10 CTFs either alone or with other individuals. Expertise in cloud infrastructure, software development, application security, mobile security and systems engineering.\n\nAbstract\n-----------------\nThis talk will include information regarding hosting Capture The Flag competitions. This topic will mainly focus on standing up the necessary infrastructure to accommodate for providing services to a large number of individuals. The talk will also go into detail on how to develop intentionally vulnerable applications while also ensuring that the vulnerabilities do not have any unintentional side effects which would allow players to maliciously attack other players and the infrastructure."
  },
  {
    "path": "conferences/hacktivitycon2021/haptyc.md",
    "content": "---\nlayout: page\ntitle: Haptyc\nsubtitle: A Library for Building Microfuzzers in Turbo Intruder\nvideo_src: https://www.youtube-nocookie.com/embed/-0EKtM4wz2o\n\n---\n\nAbout the Speaker \n-----------------\nEvan Custodio has a background in Computer Engineering where he has 12 years experience in building hardware security architectures on FPGAs. In the last 2 years he has focused on bug bounties, web application pentesting, hardware systems pentesting and security research.\n                       \n\nAbstract\n-----------------\nWhen James Kettle introduced Turbo Intruder back in 2019 the goal was always speed. When one compares Turbo Intruder to traditional Intruder several features are noticeably absent. Firstly, the ability to define multiple user-defined positions. Secondly, the ability to orchestrate battering ram and cluster bomb style of attacks. Lastly, the ability to mutate user-defined positions and to perform all of this using elegant and modular python code. Hyptyc is a python library and testing framework whose mission is to add these capabilities into Turbo Intruder so that it is at 90% feature parity to traditional Intruder. By allowing hackers to define “Haptyc transform tags” as a pseudo-markup for their requests, they can create positions in Turbo Intruder and develop code on how they would like to mutate these positions per request. Because Haptyc transforms are modular and generic in nature this also makes each implementation portable and re-usable across different HTTP requests which reduces the amount of request-specific spaghetti code inside python. Beginner hackers who don’t understand python can use Haptyc examples as-is to perform powerful fuzzing attacks. Advanced hackers familiar with python and Turbo Intruder can develop very powerful sophisticated fuzzers with this framework"
  },
  {
    "path": "conferences/hacktivitycon2021/infosec_insecure_risky.md",
    "content": "---\nlayout: page\ntitle: InfoSec - A broken industry that keeps it insecure and risky\nvideo_src: https://www.youtube-nocookie.com/embed/Lw6EcvUnZBA\n---\n\nAbout the Speaker \n-----------------\nChloé Messdaghi is a changemaker who focuses on innovating tech and information security sectors to meet today and tomorrow demands. For over 10 years, she has accelerated startups through solutions that empower organizations, products, and people to stand out from the crowd. Her work has earned her many distinctions, including being listed as one of the Business Insider’s 50 Power Players of Cybersecurity.Chloé is a trusted source for national and sector reporters and editors, as well as her research, op-eds, and commentary have been featured in numerous outlets, from Forbes and Business Insider to Bloomberg, and TechRepublic. She is a seasoned public speaker at major conferences, conventions, forums, and corporate events organized by industry associations and Fortune 500 companies. She serves or has served on several advisory groups, boards of directors, and nonprofit boards of trustees.\n                       \n\nAbstract\n-----------------\nDid you notice a shift in your mental health and/or your colleagues? Burnout was at an all time last year due to the surreal 2020. As we approach the end of the pandemic, hopefully, we recognize how critical mental health plays when accomplishing goals and productivity output within security. Collectively, we have acknowledged that there's a fine balance between hacking and personal life. Majority of the time, they cross over because how our industry functions. This talk dives into the factors that lead to burnout among security professionals in infosec, especially bug bounty hunters, and how to do better."
  },
  {
    "path": "conferences/hacktivitycon2021/keynote.md",
    "content": "---\nlayout: page\ntitle: Launching an InfoSec Career\nvideo_src: https://www.youtube-nocookie.com/embed/Rwkx8yzY6IU\n---\n\n\nAbstract\n-----------------\nAspiring cybersecurity professionals often ask Vickie: \"How do I get started in cybersecurity?\". Security is a fun and exciting field to be in. But there seems to be no clearcut path to get into the security career of your dreams. The truth is that cybersecurity is a diverse field, and there is no one way to get into the industry. Some people get their start with CTFs, some launch successful careers by mastering bug bounties, and some switch to security after working as developers. There are many paths you can take. But regardless of which direction you choose, there are a few important things to keep in mind while you launch your career in infosec. In this talk, Vickie will share her experience getting into infosec, and some lessons she has learned along the way that will be useful for anyone trying to get into infosec. "
  },
  {
    "path": "conferences/hacktivitycon2021/networking_security_tiktok.md",
    "content": "---\nlayout: page\ntitle: Introducing Networking and Security through TikTok\nvideo_src: https://www.youtube-nocookie.com/embed/XRnxnFImI7Y\n---\n\nAbout the Speaker \n-----------------\nSerena is a Network Engineer who specializes in Data Center Compute and Virtualization. She is most known for her content on TikTok and Twitter as Shenetworks. Her content focuses on networking and security for beginners which has included popular videos on bug bounties, switch spoofing, VLAN hopping, and passing the Security+ certification in 24 hours. She is based in Dallas, Texas, and is an active member in Dallas Hacker Association, and DC 214.                                  \n\n\nAbstract\n-----------------\nThis talk will discuss how Serena uses TikTok and short form content to introduce networking and security concepts to a broader audience with the help of the TikTok algorithm and quickly growing user base."
  },
  {
    "path": "conferences/hacktivitycon2021/offsec_panel.md",
    "content": "---\nlayout: page\ntitle: Breaking Down Offsec Certifications\nvideo_src: https://www.youtube-nocookie.com/embed/Ir1CIn393Uk\n---\n\nPanelists\n-----------------\n- Busra Demir \n- Andreea Druga\n- Monika Talekar\n- Rana Khalil\n\nAbstract\n-----------------\nCertifications have become a big part of the infosec industry and they have helped individuals learn about complicated topics and helped with their professional careers. During this session, our panelists will discuss what it takes to be a certified professional as well as additional resources available to those looking to enroll in their next certification"
  },
  {
    "path": "conferences/hacktivitycon2021/trufflehog.md",
    "content": "---\nlayout: page\ntitle: TruffleHog Chrome Extension\nsubtitle: Open CORS in SAAS API's lead to leaky keys on web pages\nvideo_src: https://www.youtube-nocookie.com/embed/0KQe3scSPCc\n---\n\nAbout the Speaker \n-----------------\nDylan has been involved in the infosec community for a few years now. He's open sourced a number of popular tools including Trufflehog, and has spoken at a few conferences including but not limited to, Kiwicon, BsidesSF, Defcon/Blackhat, Torcon, and others.                           \n\nAbstract\n-----------------\nThis talk is open sourcing a chrome extension that helps you find API keys buried on the page. Dylan will also have a few fun examples of keys he has found, and walk folks through how to use the tool."
  },
  {
    "path": "conferences/hacktivitycon2021/vulnerability_research.md",
    "content": "---\nlayout: page\ntitle: All Your (Data)base Are Belong To Us\nsubtitle: Getting Started in Vulnerability Research with Code Execution Bugs in Office Applications\nvideo_src: https://www.youtube-nocookie.com/embed/bQASqoBkV4Q\n---\n\nAbout the Speaker \n-----------------\nEugene Lim (spaceraccoon) is a security researcher and white hat hacker. He has worked on several bug bounty programs, including Starbucks, Grab, and Salesforce, and was ranked #2 globally out of more than 600,000 hackers on the Hackerone moving leaderboard. In 2019, he won the Most Valuable Hacker award at the H1-213 live hacking event in Los Angeles organized by Hackerone, the US Air Force, the UK Ministry of Defense, and Verizon Media.\n                       \n\nAbstract\n-----------------\nModern office applications support a wide variety of file formats, some of which have been around for decades. Parsing and processing these formats can often lead to trouble. This talk will demonstrate how you can get started in software vulnerability research by walking you through my journey in discovering and exploiting zero-days in office applications. Along the way, we will explore simple approaches to vulnerability research such as fuzzing, source code review, and reverse-engineering. The talk is targeted at researchers who are curious about binary exploitation and assumes minimal background knowledge.\n"
  },
  {
    "path": "discord.html",
    "content": "<meta http-equiv=\"refresh\" content=\"0; URL='https://discord.gg/32ZNZVN'\" />\nRedirecting to Discord. If you're not automatically redirected, <a href=\"https://discord.gg/32ZNZVN\">click here</a>.\n"
  },
  {
    "path": "index.md",
    "content": "---\nlayout: default\ntitle: Home\n---\n\n<div class=\"container\">\n  <div class=\"row\">\n    <div class=\"col-md-6 py-4 align-self-center\">\n      <h1>\n        LEARN TO HACK\n      </h1>\n      <p class=\"lead my-3\">\n        Hacker101 is a free class for web security. Whether you&#8217;re a\n        programmer with an interest in bug bounties or a seasoned security\n        professional, Hacker101 has something to teach you.\n      </p>\n      <a class=\"btn btn-primary\" href=\"/start-here\">\n        Start hacking!\n      </a>\n    </div>\n    <div class=\"col-md-5 offset-md-1 py-4\">\n      <img src=\"/assets/learn-to-hack.jpg\" alt=\"Hackers collaborating\" class=\"img-fluid float-right rounded-lg\" height=\"400\" />\n    </div>\n  </div>\n</div>\n<div class=\"container-fluid bg-darker text-light\">\n  <div class=\"container\">\n    <div class=\"row\">\n      <div class=\"col-md-5 py-4\">\n        <h2 class=\"my-2 d-flex align-items-center\">\n          <img src=\"/assets/flag.svg\" alt=\"Flag\" class=\"mr-2\" height=\"60\">\n          <span class=\"align-middle my-2\">Capture the Flag</span>\n        </h2>\n        <p class=\"lead my-3\">\n          Put your skills into practice with CTF levels inspired by the real world\n        </p>\n        <a href=\"https://ctf.hacker101.com/\" target=\"_blank\" class=\"btn btn-outline-secondary\">\n          Check out CTF\n        </a>\n      </div>\n      <div class=\"col-md-5 offset-md-1 py-4\">\n        <h2 class=\"my-2 d-flex align-items-center\">\n          <img src=\"/assets/speaker.svg\" alt=\"Speaker\" class=\"mr-2\" height=\"60\">\n          <span class=\"align-middle my-2\">Video Lessons</span>\n        </h2>\n        <p class=\"lead my-3\">\n          Learn to hack with our free video lessons, guides, and resources\n        </p>\n        <a href=\"/videos\" class=\"btn btn-outline-secondary\">\n          Explore free classes\n        </a>\n      </div>\n    </div>\n  </div>\n</div>\n"
  },
  {
    "path": "playlists/burp_suite.md",
    "content": "---\nlayout: page\ntitle: Burp Suite Playlist\nvideo_src: https://www.youtube-nocookie.com/embed/videoseries?list=PLxhvVyxYRviajtnHaICLg_ZcY47TpgGjR\n---\n\nIn this playlist we cover Portswigger's [Burp Suite](https://portswigger.net/burp) proxy -- from setup through advanced usage -- including a special guest video lesson by [James Kettle](https://twitter.com/albinowax) of Portswigger.\n\nIncluded Lessons\n-----------------\n\n- [Burp 101 - Getting Started](../sessions/burp101.md)\n- [Burp 201 - Maximizing Burp](../sessions/burp201.md)\n- [Burp 301 - Burp Hacks for Bounty Hunters](../sessions/burp301.md)\n"
  },
  {
    "path": "playlists/cryptography.md",
    "content": "---\nlayout: page\ntitle: Cryptography Playlist\nvideo_src: https://www.youtube-nocookie.com/embed/videoseries?list=PLxhvVyxYRviYPIlYxEFpzI6-rQkkvNgM1\n---\n\nIn this playlist we cover the basics of cryptography and how it breaks in the real world, as well as how to securely store passwords.\n\nIncluded Lessons\n-----------------\n\n- [Crypto Crash Course](../sessions/crypto_crash_course.md)\n- [Crypto Attacks](../sessions/crypto_attacks.md)\n- [Crypto Wrap-Up](../sessions/crypto_wrap_up.md)\n- [Secure Password Storage](../sessions/password_storage.md)\n"
  },
  {
    "path": "playlists/hacktivitycon.md",
    "content": "---\nlayout: page\ntitle: h@cktivitycon\n---\n\nh@cktivitycon is a HackerOne hosted hacker conference built by the community for the community. h@cktivitycon is a place for hackers to learn, share, and meet friends. Hear talks and panelists exploring offensive hacking techniques, recon skills, target selection and more.\n\n## Talks\n---\n\n### h@cktivitycon 2021\n\n- [Keynote: Launching an InfoSec Career](/conferences/hacktivitycon2021/keynote)\n- [Breaking Down OffSec Certifications](/conferences/hacktivitycon2021/offsec_panel)\n- [All Your (Data)base Are Belong To Us](/conferences/hacktivitycon2021/vulnerability_research)\n- [Developing CTFs: Writing and Hosting Intentionally Vulnerable Applications](/conferences/hacktivitycon2021/ctfdev)\n- [InfoSec: A broken industry that keeps it insecure and risky](/conferences/hacktivitycon2021/infosec_insecure_risky)\n- [TruffleHog Chrome Extension](/conferences/hacktivitycon2021/trufflehog)\n- [Introducing Networking and Security Through TikTok](/conferences/hacktivitycon2021/networking_security_tiktok)\n- [Haptyc: A Library for Building Microfuzzers in Turbo Intruder](/conferences/hacktivitycon2021/haptyc)\n- [Hacking on Bug Bounties for Five Years](/conferences/hacktivitycon2021/bugbountyfor5years)\n\n### h@cktivitycon 2020\n\n- [Keynote by Georgia Weidman](/conferences/hacktivitycon2020/keynote)\n- [How I got from 0 to MVH](/conferences/hacktivitycon2020/0tomvh)\n- [The Pentester Blueprint: A Guide to Becoming a Pentester](/conferences/hacktivitycon2020/pentester_blueprint)\n- [The Bug Hunter's Methodology v4: Recon Edition](/conferences/hacktivitycon2020/tbhm)\n- [Dealing with Burnouts](/conferences/hacktivitycon2020/burnouts)\n- [Graphing Out Internal Networks with CVE-2020-13379 (Unauthed Grafana SSRF)](/conferences/hacktivitycon2020/grafanassrf)\n- [From an 'IVI in a box' to a 'CAR in a box'](/conferences/hacktivitycon2020/carivi)\n- [WAF Bypass In Depth](/conferences/hacktivitycon2020/waf)\n- [Pentest Story Time: My Favorite Hacks From the Past Year](/conferences/hacktivitycon2020/penteststories)\n- [Beyond the Borders of Scope](/conferences/hacktivitycon2020/beyondscope)\n- [The problem with Parse: A low-code server that endangers over 64,000,000 users](/conferences/hacktivitycon2020/parse)\n- [Cached and Confused: Web Cache Deception in the Wild](/conferences/hacktivitycon2020/web_cache_deception)\n- [You've got pwned: exploiting e-mail systems](/conferences/hacktivitycon2020/exploiting_email_systems)\n- [The journey of finding and exploiting a bug in GitLab](/conferences/hacktivitycon2020/gitlab)\n- [Discover vulnerabilities with CodeQL](/conferences/hacktivitycon2020/codeql)\n"
  },
  {
    "path": "playlists/mentorshipmondays.md",
    "content": "---\nlayout: page\ntitle: Mentorship Mondays\nsidebar:\n  - title: \"Season 01\"\n    links:\n      - text: \"Introducing 2021 HackerOne Elite\"\n        url: /sessions/mm/s01/h1-elite\n      - text: \"Hacking with the Government\"\n        url: /sessions/mm/s01/hackthegovt\n      - text: \"Understanding Shodan\"\n        url: /sessions/mm/s01/howtoshodan\n      - text: \"CTF vs Bug Bounty\"\n        url: /sessions/mm/s01/ctf_vs_bugbounty\n      - text: \"Mobile Hacking\"\n        url: /sessions/mm/s01/mobile_hacking\n      - text: \"How to Pentest\"\n        url: /sessions/mm/s01/how_to_pentest\n      - text: \"Mental Health for Hackers\"\n        url: /sessions/mm/s01/mentalhealth\n  - title: \"Season 02\"\n    links:\n      - text: \"Getting Started in Bug Bounties\"\n        url: /sessions/mm/s02/getting_started\n      - text: \"Meet Chris Evans, HackerOne's Chief Hacking Officer\"\n        url: /sessions/mm/s02/h1_CHO\n      - text: \"How to Communicate and Write a Report\"\n        url: /sessions/mm/s02/how_to_write_reports\n      - text: \"Industry Certifications\"\n        url: \"/sessions/mm/s02/industry_certificates\"\n      - text: \"Starting a Career in Bug Bounty\"\n        url: \"/sessions/mm/s02/starting_a_career\"        \n      - text: \"How to Pick and Approach a Target\"\n        url: \"/sessions/mm/s02/how_to_pick_a_target\"        \n---\n\nMentorship Mondays is a series of live streams hosted by HackerOne's community team to help connect the hacker community to industry experts and help them develop skills to further their bug bounty and personal careers. We go live every Monday at 9:00 AM PT! \n\n![MentorshipMonday](../assets/mm/Announcement.png)\n\n\n<a class=\"btn btn-primary\" href=\"https://twitch.tv/HackerOneTV\">\n  Watch us Live on Twitch!\n</a>\n"
  },
  {
    "path": "playlists/misc.md",
    "content": "---\nlayout: page\ntitle: Miscellaneous Playlist\n---\n\nIn this playlist we cover a number of different topics that didn't make it into their own playlist.\n\nIncluded Lessons\n-----------------\n- [Threat Modeling](/sessions/threat_modeling)\n- [Secure Architecture Review](/sessions/secure_architecture)\n- [Native Code Crash Course](/sessions/native_code_crash_course)\n"
  },
  {
    "path": "playlists/mobile_hacking.md",
    "content": "---\nlayout: page\ntitle: Mobile Hacking\n---\n\nThis learning track is dedicated to learning the most popular mobile vulnerabilities in both Android and iOS applications. The Android hacking content was created by [Daeken](https://twitter.com/daeken) and recorded by [NahamSec](https://twitter.com/NahamSec) and the iOS module was done by [Dawn Isabel](https://twitter.com/dawnisabel), Mobile Security Research Engineer at NowSecure!\n\n<div class=\"h4\">Learn the Basics</div>\n<ul>\n  <li>\n    <a href=\"../sessions/mobile_crash_course\">Mobile Hacking Crash Course</a>\n  </li>\n</ul>\n\n<div class=\"row\">\n  <div class=\"col-md-6\">\n    <h2>Android Hacking</h2>\n\n    <hr />\n\n    <ul>\n      <li>\n        <a href=\"../sessions/android/quickstart\">Android Quickstart</a>\n      </li>\n      <li>\n        <a href=\"../sessions/android/common_android_bugs_1\">Common Android Bugs (Part 1)</a>\n      </li>\n      <li>\n        <a href=\"../sessions/android/common_android_bugs_2\">Common Android Bugs (Part 2)</a>\n      </li>\n    </ul>\n\n    <div class=\"h4\">Workshops</div>\n\n    <ul>\n      <li>\n        <a href=\"../sessions/android/hacking_workshop_b3nac\">Android Hacking Workshop by B3nac</a>\n      </li>\n    </ul>\n  </div>\n\n  <div class=\"col-md-6\">\n    <h2>iOS Hacking</h2>\n\n    <hr />\n\n    <ul>\n      <li>\n        <a href=\"../sessions/iOS/ios_quickstart\">iOS Quickstart</a>\n      </li>\n      <li>\n        <a href=\"../sessions/iOS/application_basics\">iOS Application Basics</a>\n        <span class=\"badge badge-pill badge-secondary\">New!</span>\n      </li>\n      <li>\n        <a href=\"../sessions/iOS/filesystem\">Filesystems</a>\n        <span class=\"badge badge-pill badge-secondary\">New!</span>\n      </li>\n      <li>\n        <a href=\"../sessions/iOS/interapp_communication\">Inter-app Communication</a>\n        <span class=\"badge badge-pill badge-secondary\">New!</span>\n      </li>\n      <li>\n        <a href=\"../sessions/iOS/app_transport\">App Transport</a>\n        <span class=\"badge badge-pill badge-secondary\">New!</span>\n      </li>\n      <li>\n        <a href=\"../sessions/iOS/webviews\">WebViews</a>\n        <span class=\"badge badge-pill badge-secondary\">New!</span>\n      </li>\n    </ul>\n  </div>\n</div>\n"
  },
  {
    "path": "playlists/newcomers.md",
    "content": "---\nlayout: page\ntitle: Newcomers Playlist\nvideo_src: https://www.youtube-nocookie.com/embed/videoseries?list=PLxhvVyxYRviZsAKXZEbmfsVMZp3s0KaVE\n---\n\nIn this playlist we cover everything you need to know to dive into Hacker101.  We recommend starting with this playlist if you're new to hacking or want a refresher on web hacking basics.\n\nIncluded Lessons\n-----------------\n\n- [Introduction](../sessions/introduction.md)\n- [The Web in Depth](../sessions/web_in_depth.md)\n- [Writing Good Reports](../sessions/good_reports.md)\n"
  },
  {
    "path": "playlists/pentesting_series.md",
    "content": "---\nlayout: page\ntitle: Pentesting Basics\nredirect_from:\n  - /playlists/pentesting_basics\n---\n\nIn collaboration with [@thecybermentor](https://twitter.com/thecybermentor), who runs one of the most successful courses on Udemy for learning pentesting, we are proud to release the full 4-part series for you starting today. Check out the quick overview of the 4 modules below. \n\n\n## Who is this content for?\n- Hackers looking to get started in Pentesting\n- Hackers that are doing Bug Bounty and want to move into Pentesting.\n\n## Included Lessons\n- [A Starters Guide to Pentesting with OWASP](/sessions/pentest_owasp)\n- [Pentesting vs Bug Bounty](/sessions/pentest_vs_bug_bounty)\n- [Pentesting Resources](/sessions/pentest_resources)\n- [Pentest Reporting and Best Practices](/sessions/pentest_reporting)\n"
  },
  {
    "path": "playlists/playlists.html",
    "content": "---\nlayout: page\ntitle: Playlists\npermalink: /playlists/\n---\n\n{% for child_page in site.pages %}\n    {% assign target_dir = 'playlists/' %}\n    {% if child_page.path contains target_dir and child_page.path != page.path %}\n        <li>\n            <a href=\"{{ child_page.url | relative_url }}\">{{ child_page.title }}</a>\n        </li>\n    {% endif %}\n{% endfor %}"
  },
  {
    "path": "playlists/web_hacking.md",
    "content": "---\nlayout: page\ntitle: Web Hacking\n---\n\nThis learning track is dedicated to learning the most popular web application vulnerabilities.\n\nLessons\n-----\n\n- [XSS and Authorization](/sessions/xss)\n- [JavaScript for Hackers](/sessions/javascript_for_hackers)\n  <span class=\"badge badge-pill badge-secondary\">New!</span>\n- [SQL Injection and Friends](/sessions/sqli)\n- [Session Fixation](/sessions/session_fixation)\n- [Clickjacking](/sessions/clickjacking)\n- [File Inclusion Bugs](/sessions/file_inclusion)\n- [File Upload Bugs](/sessions/file_uploads)\n- [Null Termination Bugs](/sessions/null_termination)\n- [Unchecked Redirects](/sessions/unchecked_redirects)\n- [Password Storage](/sessions/password_storage)\n- [Server-Side Request Forgery](/sessions/ssrf)\n- [Source Code Review](/sessions/source_review)\n- [XML External Entities](/sessions/xxe)\n- [Cookie Tampering Techniques](/sessions/cookie_tampering)\n"
  },
  {
    "path": "resources/articles/asking_for_help.md",
    "content": "---\nlayout: page\ntitle: How and When to Ask for More Help\nsidebar:\n  - title: Suggested Articles\n    links:\n      - text: Understanding the HackerOne Code of Conduct\n        url: /resources/articles/code_of_conduct\n      - text: How to Write a Good Report and Use the CVSS Calculator\n        url: /resources/articles/writing_a_report_and_cvss\n---\n\nIn our last articles, [“How to Write a Good Report and Use the CVSS Calculator”](/resources/articles/writing_a_report_and_cvss) and [“Understanding HackerOne's Code of Conduct\"](/resources/articles/code_of_conduct), we showed why professionalism and great communication is important in order to become successful on the HackerOne platform. In this article, we are going to look at five tips to improve your communication with triage and security teams.\n\n## Direct Communication on the Report\nAs we discussed in “How to write a good report”, it’s very important to write a clear and concise report when submitting a vulnerability to HackerOne. This will help the receiving team to reproduce your submission quickly and will help them understand your submission. However, we understand that some vulnerabilities may be more complex than others, especially since you are communicating in writing (as opposed to a video or phone call where it’s easier to explain things).\n\nFirst and foremost, always give the triage or security teams enough time to validate or answer any additional questions you may have. We typically recommend hackers to take a look at the response efficiency metrics shown on the right hand side of the program’s policy page. This will give you an estimate on how long the team typically takes to get back to a submission. Please do not spam reports for updates within a short period of time. You can always contact Mediation if you do not hear back from a member of the team within a reasonable amount of time.\n\nIf you are following up with additional details or have a question for the receiving party, always make sure to tag the user in your comments (@username), so they get a notification that you have asked for their help directly.\n\n\nAs highlighted in our code of conduct, we also recommend to only use official channels, like the submission itself, or the email address (if any), provided within the policy page. This will help the security teams to keep track of their tasks or follow ups and minimizes the number of notifications they need to get back to.\n\nIf you are not a native English speaker, try your best to respond to any questions or inquiries the security team may have for you and use tools like Google Translate to make this easier. If all fails, you are always welcome to also comment using your native language in hopes that someone on the receiving side will be able to translate or find someone that could help them, especially since HackerOne and their customers work with the global security community from different countries!\n\n### Emphatic Capitalization & Punctuation\nBehave professionally (this includes using respectful language on reports, refraining from spamming reports for updates, and avoiding the use of emphatic capitalization & punctuation). For example instead of these:\n\n🚫 Update NOW!!! PLEASE! <br>\n🚫 WTF. This sucks. <br>\n\nTry these:\n\n✅ Would it be possible to get an update please?<br>\n✅ I disagree with this. Can you please clarify or have another look? <br>\n\n## Requesting Mediation\nHackerOne offers mediation to help facilitate any miscommunication, concerns or disagreements between customers and hackers. Before requesting mediation, we highly recommend asking all relevant questions via the submission, to give the security or triage team a chance to explain their thought process. But let’s explore some of these scenarios and how to approach them.\n\n### Severity\nIf your submissions severity was changed to a severity that you do not agree with, we recommend to first explain why you had set your severity the way you had it set and explaining your thought process. In this case, using the CVSS calculator and explaining each of your decisions will help the receiving team understand your perspective and may help them reconsider their decision or they may have some insight or additional information you may be missing. For example, help the security team understand why you had selected confidentiality as high rather than low? Why was the attack complexity set to low rather than high? What can be achieved with this vulnerability that may have not been clear via your original CVSS calculation?\n\n\n### Bounty\nBounty amounts are usually assigned based on the impact and severity of the vulnerability report. If a bounty assigned to your submission doesn’t match what is described in the program’s policy, we recommend asking the security team for additional information to clarify their decision before requesting mediation.\n\nBefore asking a program to reevaluate their bounty decision or requesting mediation, consider the following:\n- Does the bounty amount match what is described in the program’s policy?\n- Have you and the receiving team agreed on the severity of the submission?\n- Did you follow the program’s policy and scope before submitting your report?\n- Are there any extreme conditions or requirements \tin order for your proof of concept to be fully exploited?\n\nLast but not least, when responding to a misunderstanding, make sure you assume good intent and trust that the security team is there to help you and they are doing their best to assess and evaluate your submission before requesting mediation, and never take these decisions personally.\n\n## HackerOne Support\nHackerOne also offers support for both its customers and hackers around the world. You can always email us directly via [support@hackerone.com](mailto:support@hackerone.com) if you have some questions. This includes any questions in regards to the program, its policy, scope clarification, out of scope assets or vulnerability types, or any additional questions for our triage, program management, and customer teams.\n"
  },
  {
    "path": "resources/articles/code_of_conduct.md",
    "content": "---\nlayout: page\ntitle: Understanding the HackerOne Code of Conduct\nsidebar:\n  - title: Suggested Articles\n    links:\n      - text: How to Write a Good Report and Use the CVSS Calculator\n        url: /resources/articles/writing_a_report_and_cvss\n      - text: How and When to Ask for More Help\n        url: /resources/articles/asking_for_help\n---\n\n## What is a Code of Conduct?\n\nA Code of Conduct is a document that establishes expectations for behavior from members of a community. Adopting and enforcing a Code of Conduct creates a positive atmosphere for our community and their interaction with program team members and HackerOne staff. A Code of Conduct empowers us to facilitate healthy and constructive community behavior.\n\n## Why do we have a Code of Conduct?\n\nBy having a Code of Conduct, we are encouraging the behavior we want to see in the world. Concrete enforcement guidelines helps to ensure that any violation of the Code of Conduct is treated fairly and consistently across all members of our community. The goal of our Code of Conduct is to help protect you, our hackers in addition to all members of the HackerOne Community including our customers and HackerOne employees.\n\n## What is in our Code of Conduct?\nIn HackerOne, we consider the Code of Conduct to be a minimum standard of behaviour we want to see in our platform. It is very important for hackers to avoid breaking the Code. \n\nOur current Code of Conduct covers the following:\n\n- Behave professionally\n- Under any circumstances, do not disclose private program details \n- Only contact security teams through approved and official channels\n- Unsafe testing / service degradation is not allowed\n- No abusive language is tolerated on the HackerOne platform \n- No duplicate account abuse or reputation farming\n- No misuse or theft of intellectual property\n- Do not disclose report information, confidential information or personal data without express written authorization\n- No extortion or blackmail\n- No unauthorized impersonation / social engineering\n- The use of illegal or counterfeit software is not allowed\n\n\nWe encourage you to read the full [Code of Conduct](https://www.hackerone.com/policies/code-of-conduct) and if you have more questions, please don’t hesitate to read the [Frequently Asked Question](https://www.hackerone.com/policies/faq) section. We also recommend reading all Rules of Engagement published in our [policies page](https://www.hackerone.com/policies/).\n\n## How does this benefit hackers? \n\nBy setting up minimum standards of community behavior, we can help hackers avoid foreseeable mistakes and to work better with programs. Building a better relationship with programs can also help hackers with their professional careers. Reinforcing valuable soft skills improves communication and interactions with security teams, and it is beneficial for everyone. We are proud to say that hackers have been employed by companies who run programs on HackerOne. These hackers established professionalism and technical capability and are great examples of what’s possible.\n\nBy having a Code of Conduct, we aim to have all hackers and members of the community to be treated fairly and equally, while being held liable by the same standards.\n\n\n## How does this benefit customers?\n\nCustomers expect a professional  and respectful interaction while working with hackers. The Code of Conduct provides specific guidelines to know what to expect and what is acceptable in terms of communication and engagement. \n\nIf an individual seems hostile or unwelcoming, even if it’s just one person whose behavior is being tolerated, it will impact a program’s perception of the larger hacker community. A minimum standard of behavior helps ensure that HackerOne can continue to connect world class hackers with world class programs. \n\nIt’s not always easy to adopt or enforce a Code of Conduct, but fostering a welcoming environment will help our community grow. Because of this, we have publicized an enforcement matrix which outlines the actions we’ll take against any violations to our Code of Conduct. \n\n## Why is it important to be in good standing with Code of Conduct?\n\nRespecting the Code of Conduct will have direct impact on several different aspects of the  HackerOne platform, including but not limited to program or challenge invitations, live hacking event participation, HackerOne Clear, and consideration for other engagements like HackerOne Pentest or Ambassador consideration. Any violation of the Code of Conduct will have direct consequences that will affect the above items. \n\nWhen considering hackers for many initiatives that HackerOne runs or supports, we will look at the historic behavior and Code of Conduct violations that may have occurred in the past before inviting participants.\n\nThe Code of Conduct was created to protect you! The more professional you are in your interactions and reports, the more likely you will be to build a positive relationship with program teams and HackerOne staff. Becoming a valuable partner in the bug remediation process can have incredibly positive effects on your success in the community as well as your professional career.\n\n## What happens if a hacker breaks a part of CoC?\n\nIf a complaint is received from a program, team member, another hacker, or if HackerOne observes something that appears to violate the Code of Conduct and/or existent rules of engagement, HackerOne will in all cases:\n\n- Assume good intent: HackerOne trusts that Hackers will want to do the right thing.\nInvestigate fully so HackerOne understands what did (and did not) happen. HackerOne will speak to all parties involved, where appropriate, and attempt to provide a neutral viewpoint.\n\n- Repercussions: If HackerOne determines the Hacker has violated the Code of Conduct and/or any Rules of Engagement, there will be disciplinary actions depending on the severity and HackerOne’s assessment of intent. Repercussions depend on the severity of the violation and can include temporary bans or permanent bans from HackerOne programs, HackerOne Clear and Clear programs, HackerOne Pentest and/or the platform.\n\n- Statutory timeline of warnings: When a warning is issued in accordance with the Code of Conduct, HackerOne considers that warning to be applicable for 12 months. Warnings which are over 12 months old expire and are not typically assessed when reviewing the severity of new enforcement actions.\n"
  },
  {
    "path": "resources/articles/writing_a_report_and_cvss.md",
    "content": "---\nlayout: page\ntitle: How to Write a Good Report and Use the CVSS Calculator\nsidebar:\n  - title: Examples of Good Reports\n  - subtitle: \"Server-side Vulnerabilities\"\n    links:\n      - text: SSRF in Exchange leads to ROOT access in all instances\n        url: https://hackerone.com/reports/341876\n      - text: \"Remote Code Execution in Slack desktop apps + bonus\"\n        url: https://hackerone.com/reports/783877\n      - text: SSRF vulnerability on proxy.duckduckgo.com (access to metadata server on AWS)\n        url: https://hackerone.com/reports/395521\n  - subtitle: Insecure Direct Object Reference\n    links:\n      - text: A staff member with no permissions can edit Store Customer Email\n        url: https://hackerone.com/reports/980511\n  - subtitle: Open Redirect & XSS\n    links:\n      - text: XSS while logging using Google\n        url: https://hackerone.com/reports/691611\n      - text: \"Cross-site Scripting (XSS) on HackerOne careers page\"\n        url: https://hackerone.com/reports/474656\n  - title: Suggested Articles\n    links:\n      - text: How and When to Ask for More Help\n        url: /resources/articles/asking_for_help\n      - text: Understanding the HackerOne Code of Conduct\n        url: /resources/articles/code_of_conduct\n---\n\n## Introduction\n\nWhen you are submitting a vulnerability report to a company, it is very important to be able to communicate your findings in a clear and concise manner, where the security or triage team receiving your report are able to reproduce it as quickly as possible.\n\nA well-written report, consists of:\n- A title describing the vulnerable site, endpoint, and the vulnerability type\n- CWE & CVSS score describing the criticality of the vulnerability\n- Clear reproduction steps\n- An impact statement\n\n\nIncluding the above information will improve readability and reproduction speed. Length of a report is not something to aim for. The goal is to keep it short and to the point while including all the details necessary to help the triage/security team reproduce your report as fast as possible.\n\nReadability and proper formatting also plays a big role in reproducing your submission. The better it’s presented and structured the easier and faster the security team on the receiving end will be able to reproduce it. HackerOne allows hackers to use [Markdown](https://docs.hackerone.com/programs/using-markdown.html) while submitting a new report within the platform. We highly encourage you to get familiar with markdown as much as possible, especially with greetings [lists](https://docs.hackerone.com/programs/using-markdown.html#attachment-references), using [links](https://docs.hackerone.com/programs/using-markdown.html#attachment-references), and [embedding attachments](https://docs.hackerone.com/programs/using-markdown.html#attachment-references) and [code](https://docs.hackerone.com/programs/using-markdown.html#attachment-references).\n\nNow that we have gotten that out of the way, let’s jump right into it!\n\n## Creating a Report Title\n\nA good title helps security teams prioritize reports as they are making their way through their inbox. For example, a security team may prioritize a Remote Code Execution in their production site over a low impact CSRF on a marketing website. In addition to helping with prioritization, a good title helps security teams identify and search for possible duplicates faster because they are giving them all the information needed within the title of your report.\n\n- The best way to come up with a title is to ask yourself “How do I describe this vulnerability in 140 characters or less”.  Include either the functionality or the vulnerable asset or endpoint, as well as the vulnerability type and its impact.\n\nLet’s look at a few examples of good report title:\n\n- Stored XSS in profile.php via user’s signature on app.acme.org leads to account takeover when emailing other users\n- [Reflected XSS on https://e.mail.ru/compose/ via Body parameter](https://hackerone.com/reports/1000363)\n- [Remote Code Execution on kitcrm using bulk customer update of Priority Products](https://hackerone.com/reports/422944)\n- [Admin Command Injection via username in user_archive ExportCsvFile](https://hackerone.com/reports/214022)\n\n## What is CWE & CVSS and how they work together\n\nCommon Weakness Enumeration (CWE) is a community-developed list of common software security weaknesses. It serves as a common language, a measuring stick for software security tools, and as a baseline for weakness identification, mitigation, and prevention efforts. When it comes to picking the right Common Weakness Enumeration (CWE), this should be based on the initial vulnerability you have discovered. This will also indirectly help you understand the impact of the vulnerability as well as its CVSS.\n\nWhen it comes down to selecting the severity of your vulnerability submission,use CVSS (or Common Vulnerability Scoring System) to communicate why you have chosen this particular severity for your submission.\n\n![CVSS Calculator](/assets/images/articles/CVSScalc.png)\n\n### How to use the CVSS Calculator\n\nCVSS is broken down into 8 different metrics. In this section, we’ll explore each one and how to pick the right choice when filing a submission on HackerOne.\n\n#### Attack Vector\nThis metric tells the security team how this vulnerability can be exploited. The Score increases the more remote (logically, and physically) an attacker can be in order to exploit the vulnerable component. Describing deeply the 4 scenarios, we can have: a Remote attack when the exploit can be delivered over the Internet, an Adjacent attack vector when the malicious actor is inside the same intranet of the victim, a Local scenario is when the issue lies at operating system accounts level, and finally a Physical attack vector is when you can physically access the victim's device.\n\n#### Attack Complexity\nAttack Complexity describes the conditions beyond your control that must be met in order for the vulnerability to be exploited. For example, does it require additional information about the target such as unguessable IDs, a certain configuration or settings, valid credentials (e.g. for MFA issues), or some other conditions in order for your exploit to work?\n\n#### Privileges Required  \nThis metric indicates the type of privileges an attacker must achieve before successfully exploiting the vulnerability. This Score increases as fewer privileges are required. For example, if the vulnerable component is within an admin panel, we recommend setting the requirement to “High” versus a vulnerability where you need to be invited to an organization by an admin (where as self registration is not possible) we recommend privileges to be as low.\n\n#### User Interaction\n\nThis metric captures the requirement for a user, other than the attacker, to participate in the successful compromise of the vulnerable component. This metric determines whether the vulnerability can be exploited solely at the will of the attacker, or whether a separate user (or user-initiated process) must participate in some manner. The Score is highest when no user interaction is required since it increases a further step in the exploitability of the attack.\n\n#### Scope\nDoes a successful attack impact a component other than the vulnerable component? If so, the Score increases and the Confidentiality, Integrity and Authentication metrics should be scored relative to the impacted component.\n\n#### Confidentiality\nThis metric measures the impact on the confidentiality of the information resources managed by a software due to a successfully exploited vulnerability. Confidentiality refers to limiting information access and disclosure to only authorized users, as well as preventing access by, or disclosure to, unauthorized. In the context of bug bounties, think of this as how sensitive is the data which is exposed due to this vulnerability.\n\n#### Integrity\nThis metric measures the impact to the integrity of a successfully exploited vulnerability. Integrity refers to the trustworthiness and veracity of information.\n\n#### Availability\nThis metric measures the impact to the availability of the impacted component resulting from a successfully exploited vulnerability. It refers to the loss of availability of the impacted component itself, such as a networked service (e.g., web, database, email). Since availability refers to the accessibility of information resources, attacks that consume network bandwidth, processor cycles, or disk space all impact the availability of an impacted component.\n\n### Examples\n#### Stored XSS from authenticated user to an unauthenticated user\n\n- **Attack Vector:** `Network` as the attack can be done over the Internet<br>\n- **Attack Complexity:** `Low` as there are no particular premises needed for this attack to be successful<br>\n- **Privileges Required:** `None` if the attacker can deliver the payload as unauthenticated. Or we can set it to `Low` if the attacker needs to be authenticated in order to deliver the payload<br>\n- **User Interaction:** `Required` in case the user has to do some non-basic interaction with the website in order to trigger the payload (like clicking a link). `None` in case the victim needs to visit the homepage or do very trivial interactions with the website <br>\n- **Scope:** `Changed` since the vulnerable component is the web server and the impacted component is the browser <br>\n- **Confidentiality:** `Low` - if access to the DOM is granted. `None`, if there is no access to the DOM <br>\n- **Integrity:** `Low` since XSS can always cause defacement <br>\n- **Availability:** `None` because the application can still be used by the victims\n\n\n#### Stored XSS from an admin to a user\n\n- **Attack Vector:** `Network` as the attack can be done over the Internet<br>\n- **Attack Complexity:** `Low` as there are no particular premises needed for this attack to be successful<br>\n- **Privileges Required:** `High` because the attackers needs to be an admin in order for this vulnerability to be exploited <br>\n- **User Interaction:** `Required` in case the user has to do some non-basic interaction with the website in order to trigger the payload (like clicking a link). `None` in case the victim needs to visit the homepage or do very trivial interactions with the website <br>\n- **Scope:** `Changed` since the vulnerable component is the web server and the impacted component is the browser<br>\n- **Confidentiality:** `Low` if access to the DOM is granted, `None` if there is no access to the DOM <br>\n- **Integrity:** `Low` the XSS can always cause defacement<br>\n- **Availability:** `None` because the application can still be used by the victims\n\n#### IDOR with access to read and modify personally identifiable information (PII)\n\n- **Attack Vector:** `Network` as the attack can be done over the Internet <br>\n- **Attack Complexity:** `High` if they are UUIDs or high-entropy IDs. `Low` if they are sequential IDs <br>\n- **Privileges Required:**  `Low` the attacker needs to be logged in to perform the attack <br>\n- **User Interaction:** `None` as this is solely a server side issue <br>\n- **Scope:** `Unchanged` the impacted and the vulnerable component are the same i.e. the web server <br>\n- **Confidentiality:**  `High` because it gives access to PII <br>\n- **Integrity:** `High` because the attacker can delete/modify data <br>\n- **Availability:** `None` because the application can still be used by the victims <br>\n\n\n#### Full-response SSRF vs Blind SSRF\n\n- **Attack Vector:** `Network` as the attack can be done over the Internet<br>\n- **Attack Complexity:**  `Low` since the attack is normally straight-forward<br>\n- **Privileges Required:**  `Low/High` according to the level of privilege of the account linked to the vulnerable functionality<br>\n- **User Interaction:** `None` as this is solely a server side issue<br>\n- **Scope:** `Unchanged` - in case of local port scanning as the impacted component remains the web server. `Changed` if AWS or local file exfil is possible since the impacted component is the cloud infrastructure<br>\n- **Confidentiality:** `Low/High` depending on the type of information shown. `None:` in case of Blind SSRF (no output)<br>\n- **Integrity:** `High` in case AWS are leaked as it could lead to RCE. `Low` in case the attacker can only access the intranet or the AWS<br>\n- **Availability:** `None` because the application can still be used even if this has been fully exploited (this does not include some edge cases where SSRF can take down a service)<br>\n\n## Reproduction Steps\nThe reproduction steps are one of (if not the) most important part of your submission. The better and more concise the steps, the easier it will be for the receiving team to reproduce and triage your submission. Before starting this part of your submission, think of how you can help a friend reproduce this vulnerability on the target site, without any prior knowledge or experience with the application. So in other words, how can you help someone that’s never used this application, replicate your vulnerability by following your reproduction steps. Our recommendation is to use the following structure to write your submission:\n\n- Description / Introduction\n- Working proof of concept\n- HTTP request\n\t- Please make sure to submit this as text and not as a screenshot so the triage team can copy/paste the required information\n- HTTP Response or the DOM (if needed)\n- Impact Statement\n\nWhen writing your proof of concept, make sure to include every step necessary from the beginning all the way to the end where the vulnerability is fully exploited. Ask yourself the following questionScope:\n- \"Does this require the user to be authenticated? If so, where do they sign up?\". Make sure you include a link to it.\n- \"How can the security team receiving the vulnerability, access the vulnerable component?\". While it’s great to directly link to the vulnerable component, It’s always recommended to describe what menus to navigate through, in order to avoid any complications. We recommend including links as well as how to navigate to the particular functionality.\n- \"What additional information can I include to make sure they are able to reproduce this issue\". This is very important, especially if you are having a hard time reproducing a vulnerability on your own because of some conditions or issues on the website.\n\nAs you can see in [SSRF in Exchange leads to ROOT access in all instances](https://hackerone.com/reports/341876), [0xacb](https://hackerone.com/0xacb) has included the smallest bit of details from logging and creating a new store, how to access the required exchange app, HTTP request using curl, as well as the response to show the outcome of each request.\n\n## Impact Statement\nThe impact statement is a great place to help the security team understand the worst case that could happen if your vulnerability was fully exploited. When filling out this portion of your submission, always ask yourself “if this bug were exploited, what could happen?”. Often, because we are communicating via text, things may not be as clear as we think we are. Take advantage of this part of the submission process to communicate the impact of your vulnerability!\n\n\n## Conclusion\nWriting a good report saves time for everybody. If the report is well written, it will decrease the time to triage and bounty in comparison to a report that may need more information in order to be validated.\n"
  },
  {
    "path": "resources/hackerone_threat_model.md",
    "content": "---\nlayout: page\ntitle: Example HackerOne Threat Model\n---\n\nAccess levels:\n\n- Unauthenticated\n\nEntrypoints [non-static]:\n\n- Hacktivity: <https://hackerone.com/hacktivity>\n- Report: <https://hackerone.com/reports/228648>\n- Program policy: <https://hackerone.com/security>\n- Program hacktivity: <https://hackerone.com/security/hacktivity>\n- Program thanks: <https://hackerone.com/security/thanks>\n- Program updates: <https://hackerone.com/security/updates>\n- HackerOne Response contact: <https://www.hackerone.com/product/response#contact>\n- HackerOne Challenge contact: <https://www.hackerone.com/product/challenge#contact>\n- HackerOne Bounty contact: <https://www.hackerone.com/product/bounty#contact>\n- HackerOne Clear contact: <https://www.hackerone.com/product/clear#contact>\n- Sales contact: <https://www.hackerone.com/contact>\n- Leaderboard: <https://hackerone.com/leaderboard/all-time>\n- Program Directory: <https://hackerone.com/directory/programs>\n- Blog: <https://www.hackerone.com/blog>\n- User signup: <https://hackerone.com/users/sign_up>\n- Forgot password: <https://hackerone.com/users/password/new>\n- Press: <https://www.hackerone.com/press>\n\nTarget assets:\n\n- User credentials and PII\n- Private program names\n- Confidential bug reports\n- Database credentials\n\nTop priority:\n\n- Hacktivity (global and program), Program Directory\n- Sign-in\n- Sign-up forms\n- Forgot password\n- Contact forms\n"
  },
  {
    "path": "resources.md",
    "content": "---\nlayout: page\ntitle: Resources\nsidebar:\n  - title: Jump to\n    resources: true\n---\n\n{% for resource in site.resources %}\n  <h2 id=\"{{ resource.title | url_encode }}\">{{ resource.title }}</h2>\n\n  {{ resource.content }}\n{% endfor %}\n"
  },
  {
    "path": "sessions/android/common_android_bugs_1.md",
    "content": "---\nlayout: page\ntitle: Common Android Bugs (Part 1)\nvideo_src: https://www.youtube-nocookie.com/embed/sQ_34dI_geU\nprevious_url: quickstart\nnext_text: Watch part 2\nnext_url: common_android_bugs_2\nredirect_from:\n  - /sessions/common_android_bugs\n---\n\nThese videos build strongly on the Android Quickstart and [Mobile Hacking Crash Course](/sessions/mobile_crash_course) videos released previously, so make sure to give those a watch if you haven’t yet or want a refresher.\n\nWhat you'll learn\n-----------------\n\n- Android activities \n- Intents\n- Cross-app scripting\n- Custom permissions\n"
  },
  {
    "path": "sessions/android/common_android_bugs_2.md",
    "content": "---\nlayout: page\ntitle: Common Android Bugs\nvideo_src: https://www.youtube-nocookie.com/embed/tt1f4pcI0jo\nprevious_url: common_android_bugs_1\nnext_url: ../iOS/ios_quickstart\n---\n\nThese videos build strongly on the Android Quickstart and [Mobile Hacking Crash Course](/sessions/mobile_crash_course) and [Common Android Bugs (Part 1)](/sessions/mobile_crash_course) videos, so make sure to give those a watch if you haven’t yet or want a refresher.\n\nWhat you'll learn\n-----------------\n\n- Path traversal \n- Embedded secrets\n- Some common OAuth issues.\n"
  },
  {
    "path": "sessions/android/hacking_workshop_b3nac.md",
    "content": "---\nlayout: page\ntitle: Android Hacking Workshop by b3nac\nvideo_src: https://www.youtube-nocookie.com/embed/lhRXV9LZ7bY\nredirect_from: \n  - /sessions/android-hacking-b3nac\n---\n\nCheck out this exclusive workshop hosted by [b3nac](https://twitter.com/b3nac), where he walks viewers through his approach when it comes down to Android hacking. He also demosntrate a handful of different technique using his vulnerable mobile application [\"Injured Android\"](https://github.com/B3nac/InjuredAndroid).\n"
  },
  {
    "path": "sessions/android/quickstart.md",
    "content": "---\nlayout: page\ntitle: Android Quickstart\nvideo_src: https://www.youtube-nocookie.com/embed/y0O3sCX9ftM\nprevious_url: ../mobile_crash_course\nnext_url: common_android_bugs_1\nredirect_from:\n  - /sessions/android_quickstart\n---\n\nIn this session -- the second in a series of three on mobile hacking -- we discuss the structure of Android applications, recommended tools, setup details, and some handy tips for hacking Android apps.\n\nWhat you'll learn\n-----------------\n\n- Structure of Android apps\n\t- APK container\n\t- Dex files\n\t- Resources\n\t- Manifest\n- Tools\n\t- [Android Studio](https://developer.android.com/studio)\n\t- Android Emulator\n\t- [Genymotion](https://www.genymotion.com/)\n\t- [apktool](https://ibotpeaches.github.io/Apktool/)\n\t- [dex2jar](https://github.com/pxb1988/dex2jar)\n\t- [JD-GUI](https://java-decompiler.github.io/)\n\t- [Frida](https://frida.re/)\n- Setting up your proxy\n\t- Instructions for emulator\n\t- Instructions for physical devices\n\t- Installing the CA certificate\n- Rooting\n\t- WARNING: Do not do this on any device with important data\n- Decompilation\n\t- dex2jar + JD-GUI make a great pair\n\t- Decompile the whole thing to a directory and use an external editor\n- Testing tips\n\t- Use `adb logcat` to view system and application logs\n\t- [Disable certificate pinning](https://www.netspi.com/blog/technical/mobile-application-penetration-testing/four-ways-bypass-android-ssl-verification-certificate-pinning)\n\t- Look at intent filters\n\t\t- [Great example report](https://hackerone.com/reports/283063)\n"
  },
  {
    "path": "sessions/burp101.md",
    "content": "---\nlayout: page\ntitle: Burp 101\nsubtitle: Getting Started\nvideo_src: https://www.youtube-nocookie.com/embed/LSqC9qgEMi0\nnext_url: burp201\n---\n\nThis is the first in a series of 3 sessions on Burp Suite.  In this session we'll talk about how to get started with Burp and to make the most of its powerful tools.\n\nWhat you'll learn\n-----------------\n\n- Getting Burp Proxy\n- Setting up Firefox to proxy through Burp\n- UI overview\n\t- Target\n\t- Proxy\n\t- Spider\n\t- Intruder\n\t- Repeater\n\t- Sequencer\n\t- Decoder\n\t- Comparer\n- Target deep dive\n\t- Using the site map\n\t- Setting up your scope\n- Proxy deep dive\n\t- Using the HTTP history and filtering\n\t- Intercepting requests and responses\n\t- Match and replace\n\t- Unhiding hidden form fields\n- Using Repeater\n\t- Sending requests from proxy history\n\t- Manipulating requests\n\t\t- Identifying XSS with ease\n- Using Decoder\n\t- Decoding data from a request\n\t- Encoding and hashing data\n"
  },
  {
    "path": "sessions/burp201.md",
    "content": "---\nlayout: page\ntitle: Burp 201\nsubtitle: Maximizing Burp\nvideo_src: https://www.youtube-nocookie.com/embed/bHTxJIC_jGI\nprevious_url: burp101\nnext_url: burp301\n---\n\nThis is the second in a series of 3 sessions on Burp Suite.  In this session we'll talk about how you can use some advanced features of Burp to make your life easier and find better bugs.\n\nWhat you'll learn\n-----------------\n\n- Using Intruder\n\t- Types of attacks\n\t- Discovering and exploiting indirect object references\n\t- Automatically extracting data\n\t- Finding valid usernames\n\t- Exploiting blind SQLi\n- Using Scanner\n\t- Actively scanning pages of interest\n\t- Triaging findings\n\t- Customization\n- Searching Burp history\n- Advanced Proxy functionality\n\t- CSRF proof of concept generation\n\t- Invisible proxying\n\t- Client-side certificates\n"
  },
  {
    "path": "sessions/burp301.md",
    "content": "---\nlayout: page\ntitle: Burp 301\nsubtitle: Burp Hacks for Bounty Hunters\nvideo_src: https://www.youtube-nocookie.com/embed/boHIjDHGmIo\nprevious_url: burp201\n---\n\nThis is the final video in a series of 3 sessions on Burp Suite.  In this session we'll talk about how to get the absolute most out of Burp Suite as a bug bounty hunter.\n\nWhat you'll learn\n-----------------\n\n- Repeater\n\t- Workflow techniques\n\t- Crazy stuff?\n- Intruder\n\t- Increasing ease of use\n\t- Reducing manual work\n\t- Useful extensions\n- Scanner\n\t- Finding bugs in a bounty context\n\t- Avoiding performance issues and pointless scans\n- Performance\n\t- Minimizing RAM and processor loads\n\t- Shrinking project files on disk\n- What to do when things go wrong\n"
  },
  {
    "path": "sessions/clickjacking.md",
    "content": "---\nlayout: page\ntitle: Clickjacking\nvideo_src: https://www.youtube-nocookie.com/embed/jcp5t8PsMsY\n---\n\nIn this session we'll talk about clickjacking, an attack that can trick victims into performing actions surreptitiously.\n\nWhat you'll learn\n-----------------\n\n- Clickjacking\n\t- What it is\n\t- How it works\n\t- How to defend against it\n"
  },
  {
    "path": "sessions/cookie_tampering.md",
    "content": "---\nlayout: page\ntitle: Cookie Tampering Techniques\nvideo_src: https://www.youtube-nocookie.com/embed/rH61-9ovYd4\n---\n\nIn this quick session, we'll discuss some techniques for tampering with cookies.\n\nWhat you'll learn\n-----------------\n\n- Manipulating cookies in the browser\n- Manipulating cookies in requests\n- Checking for cookie flags\n- Common data encodings\n- Manipulations\n"
  },
  {
    "path": "sessions/crypto_attacks.md",
    "content": "---\nlayout: page\ntitle: Crypto Attacks\nvideo_src: https://www.youtube-nocookie.com/embed/jtcpREJLN1Y\n---\n\nThis is the second in a series of 3 sessions on practical cryptography.  In this session we'll talk about a number of practical attacks you can use on cryptosystems in the real world.\n\nWhat you'll learn\n-----------------\n\n- Stream cipher key reuse\n- ECB block reordering\n- ECB decryption\n- Padding and padding oracles\n- Hash length extension\n"
  },
  {
    "path": "sessions/crypto_crash_course.md",
    "content": "---\nlayout: page\ntitle: Crypto Crash Course\nvideo_src: https://www.youtube-nocookie.com/embed/NTpzmPML42E\n---\n\nThis is the first in a series of 3 sessions on practical cryptography.  In this session we'll talk about many of the key concepts in cryptography.\n\nWhat you'll learn\n-----------------\n\n- XOR and its importance for cryptography\n- One-time pads\n- Types of ciphers\n\t- Symmetric\n\t\t- Stream\n\t\t- Block\n\t- Asymmetric\n- Block cipher modes\n\t- ECB (Electronic Codebook)\n\t- CBC (Cipher Block Chaining)\n- Hashes\n- MACs (Message Authentication Codes)\n\t- HMAC (Hash-based MAC)\n"
  },
  {
    "path": "sessions/crypto_wrap_up.md",
    "content": "---\nlayout: page\ntitle: Crypto Wrap-Up\nvideo_src: https://www.youtube-nocookie.com/embed/Zj6Z4QMzObE\nredirect_from:\n  - /sessions/crypto_wrap-up\n---\n\nThis is the last in a series of 3 sessions on practical cryptography.  In this session we'll talk about some tips and tricks.\n\nWhat you'll learn\n-----------------\n\n- ECB mode\n\t- Detection\n\t- Determining block size\n\t- Determining data offset\n- Detecting and exploiting padding oracles\n\t- [Padbuster](https://github.com/AonCyberLabs/PadBuster)\n- General advice\n- [Cryptopals challenges](https://cryptopals.com/) will take you to the next level\n"
  },
  {
    "path": "sessions/docker_hacking.md",
    "content": "---\nlayout: page\ntitle: Docker Hacking \nvideo_src: https://www.youtube-nocookie.com/embed/XiLfEU9wK-w\n---\n\nAbout This Video\n----------------\nThis module was created in partnership with [Alex Chapman](https://twitter.com/ajxchapman). In this video you'll learn the basics of Docker. \n\n\nWhat you'll learn\n-----------------\nIntroduction to Docker \n- Container Security\n-- Namespaces - Isolating\n- Userns-remap\n- CGroups - Restricting\n- Capabilities - Control\n- Seccomp / Apparmour - Control\n\nEscaping containers\n- Published Vulnerabilities\n-- Kernel bugs\n- Runtime bugs\n- Host volume mounts\n- Privileged containers\n- Dockerd / Containerd access\n- Docker.sock\n- Containerd.sock\n- Docker network 2375/tcp, 2376/tcp\n\n"
  },
  {
    "path": "sessions/file_inclusion.md",
    "content": "---\nlayout: page\ntitle: File Inclusion Bugs\nvideo_src: https://www.youtube-nocookie.com/embed/ehp9TdmXWr0\n---\n\nIn this session we'll talk about local and remote file inclusion bugs.\n\nWhat you'll learn\n-----------------\n\n- File inclusion\n\t- LFI (Local File Inclusion)\n\t- RFI (Remote File Inclusion)\n\t- Detection\n\t- Exploitation\n\t- Mitigation\n"
  },
  {
    "path": "sessions/file_uploads.md",
    "content": "---\nlayout: page\ntitle: File Upload Bugs\nvideo_src: https://www.youtube-nocookie.com/embed/xpCLMz3efUw\n---\n\nIn this session we'll talk about bugs relating to file uploads, a broad but critical category of vulnerabilities.\n\nWhat you'll learn\n-----------------\n\n- File uploads\n\t- How multipart POSTs work\n\t- Filename-based attacks\n\t- MIME type attacks\n\t- Hiding data in PNG files\n\t- Mitigation\n"
  },
  {
    "path": "sessions/good_reports.md",
    "content": "---\nlayout: page\ntitle: Writing Good Reports\nvideo_src: https://www.youtube-nocookie.com/embed/z60CFFFyZWE\n---\n\nIn this session we'll talk about what makes a good report, how to write your own, and how to avoid common pitfalls.\n\nWhat you'll learn\n-----------------\n\n- The importance of writing good reports\n- The key features of a good report\n- Determining the impact of vulnerabilities\n"
  },
  {
    "path": "sessions/iOS/app_transport.md",
    "content": "---\nlayout: page\ntitle: iOS Hacking - App Transport Basics\nvideo_src: https://www.youtube-nocookie.com/embed/-TMHx-LLOGE\nprevious_url: interapp_communication\nnext_url: webviews\n---\n\nA critical part of every mobile hacker’s process is determining what network APIs and endpoints the application uses.  In the fourth module of our iOS application hacking series, you’ll learn how to configure your iOS device to send traffic to a proxy for further analysis - even when the application uses certificate pinning.  We’ll also review the minimum standards enforced by iOS for transport security and how applications can bypass those built-in protections.  \n"
  },
  {
    "path": "sessions/iOS/application_basics.md",
    "content": "---\nlayout: page\ntitle: iOS Hacking - Application Basics\nvideo_src: https://www.youtube-nocookie.com/embed/VQTQ0VaIXF0\nprevious_url: ios_quickstart\nnext_url: filesystem\n---\n\nIn the first video in our iOS application hacking series, we’ll look at the basics of the application package.  You’ll learn how an IPA file is structured, the parts of the Mach-O binary format, and simple steps you can take to ascertain the application’s functionality.\n"
  },
  {
    "path": "sessions/iOS/filesystem.md",
    "content": "---\nlayout: page\ntitle: iOS Hacking - Filesystem Basics\nvideo_src: https://www.youtube-nocookie.com/embed/voYFTRoH4CU\nprevious_url: application_basics\nnext_url: interapp_communication\n---\n\nAnalyzing an iOS application goes beyond looking at the IPA file.  To get the full picture, you also need to understand how it interacts with the filesystem and what data it stores there.  In the second video in our iOS application hacking series, we’ll explore some common methods that applications use to store data and how to recognize and analyze the artifacts they leave behind.  We’ll also cover iOS data protection and demonstrate how to examine file protection attributes using runtime instrumentation.\n"
  },
  {
    "path": "sessions/iOS/interapp_communication.md",
    "content": "---\nlayout: page\ntitle: iOS Hacking - Inter-app Communication\nvideo_src: https://www.youtube-nocookie.com/embed/zld8VuihCCQ\nprevious_url: filesystem\nnext_url: app_transport\n---\n\niOS applications have various reasons to communicate with each other - for deep linking, third-party authentication, and simply sharing data.  In the third video in our iOS application hacking series, we’ll take a look at widely-used mechanisms for inter-app communication and how they can be abused when deployed insecurely.  We’ll focus on an in-depth look at the iOS pasteboard, URL schemes, and universal links, and demonstrate how to use Frida to trace and test this functionality.\n"
  },
  {
    "path": "sessions/iOS/ios_quickstart.md",
    "content": "---\nlayout: page\ntitle: iOS Quickstart\nvideo_src: https://www.youtube-nocookie.com/embed/c4M8sd9lcFU\nprevious_url: ../android/common_android_bugs_2\nnext_url: application_basics\n---\n\nIn this session -- the third and final in a series on mobile hacking -- we discuss the structure of iOS applications, key differences between testing on iOS and Android, recommended tools, setup details, and some handy tips for hacking iOS apps.\n\nWhat you'll learn\n-----------------\n\n- Structure of iOS apps\n\t- IPA container\n\t- Encryption\n\t- Info.plist\n- Differences in testing iOS vs Android\n\t- Simulator vs Emulator\n\t- Native code vs Dalvik\n- Tools\n\t- Xcode\n\t- [bfinject](https://github.com/BishopFox/bfinject)\n\t- [cycript](http://www.cycript.org/)\n\t- [Frida](https://frida.re/)\n\t- [Cydia Impactor](http://www.cydiaimpactor.com/)\n\t- [Hopper](https://www.hopperapp.com/)\n\t- [SSL Kill Switch 2](https://github.com/nabla-c0d3/ssl-kill-switch2)\n\t- [Burp Suite Mobile Assistant](https://portswigger.net/burp/documentation/desktop/tools/mobile-assistant)\n- Setting up your proxy\n\t- Instructions for Simulator\n\t- Instructions for physical devices\n\t- Installing the CA certificate\n- Jailbreaking\n\t- WARNING: Do not do this on any device with important data\n- Testing tips\n\t- Use bfinject to decrypt IPAs\n\t- Disable cert pinning with SSL Kill Switch 2 or Burp Suite Mobile Assistant\n\t- Install iPad-only apps on other devices with an Info.plist modification\n\t- Basic memory corruption bug hunting\n\t- Look at custom URL schemes\n"
  },
  {
    "path": "sessions/iOS/webviews.md",
    "content": "---\nlayout: page\ntitle: iOS Hacking - Webviews\nvideo_src: https://www.youtube-nocookie.com/embed/7Ozn9t7tp88\ncta_description: Congratulations! You have completed the Hacker101 iOS learning track! Now take this quiz and put your new skills to test!\nprevious_url: app_transport\nnext_text: Take the iOS quiz\nnext_url: https://docs.google.com/forms/d/1HYzUGPx1AW85utk9q7ORSPWPCHMGJPCdOBmEH9QwgZM/\n---\n\nThe final video in our iOS application hacking series focuses on the complex world of iOS webviews.  You’ll learn about the history of webview insecurity on iOS and how newer webview classes offer improved security when used correctly.  We’ll also demonstrate how to trace webview activity at runtime using frida-trace and customize our trace output to capture the specifics of a webview’s behavior.\n"
  },
  {
    "path": "sessions/introduction.md",
    "content": "---\nlayout: page\ntitle: Introduction\nvideo_src: https://www.youtube-nocookie.com/embed/zPYfT9azdK8\n---\n\nIn this session we talk about the class and introduce the instructor, Cody Brocious, then jump into the mind of a breaker and talk about how you can take the things you learn in this class and apply them to real situations.\n\nWhat you'll learn\n-----------------\n\n- Required tools\n- Thinking like a breaker\n- Attacker-defender imbalance\n- Lightweight threat assessment and prioritization\n- How to write good bug reports\n- Reflected XSS (Cross-Site Scripting)\n\n[Next: the web in depth](https://www.hacker101.com/sessions/web_in_depth.html)\n"
  },
  {
    "path": "sessions/javascript_for_hackers.md",
    "content": "---\nlayout: page\ntitle: JavaScript for Hackers\nvideo_src: https://www.youtube-nocookie.com/embed/FTeE3OrTNoA\n---\n\nCheck out this exclusive video from [STÖK](https://twitter.com/STOKFredrik) where he learns how to use Chrome dev tools, read JavaScript, and look for vulnerabilities in the DOM with [TomNomNom](https://twitter.com/tomnomnom).\n\nAbout STÖK\n----------\nSTÖK creates educational cybersecurity-related video content for the bug bounty community. Inspiring hackers to level up their BUG BOUNTY game to become a better pentesters, bug hunters and redteamers. STÖK also travels the world, hacks some of the most hardened companies out there and vlogs about the #bountylife.\n"
  },
  {
    "path": "sessions/mm/s01/ctf_vs_bugbounty.md",
    "content": "---\nlayout: page\ntitle: CTF vs Bug Bounty \nsidebar:\n  - title: \"Season 01\"\n    links:\n      - text: \"Introducing 2021 HackerOne Elite\"\n        url: /sessions/mm/s01/h1-elite\n      - text: \"Hacking with the Government\"\n        url: /sessions/mm/s01/hackthegovt\n      - text: \"How to Shodan\"\n        url: /sessions/mm/s01/howtoshodan\n      - text: \"Mobile Hacking\"\n        url: /sessions/mm/s01/mobile_hacking\n      - text: \"How to Pentest\"\n        url: /sessions/mm/s01/how_to_pentest\n      - text: \"Mental Health for Hackers\"\n        url: /sessions/mm/s01/mentalhealth\nprevious_url: howtoshodan\nnext_url: mobile_hacking\nvideo_src: https://www.youtube-nocookie.com/embed/leU8gPxX2bs\n---\n\nIn this episode, we met with Adam Langley and Niru Ragupathy to learn more about their creative process and to learn how participating in CTFs may help hackers get started with hacking and bug bounty! Hosted by [@NahamSec](https://twitter.com/NahamSec) and [@Arl_rose](https://twitter.com/arl_rose).\n\nGuests\n-----------------\n\n- [Adam Langley](https://twitter.com/adamtlangley)\n- [Niru Ragupathy](https://twitter.com/itsc0rg1)\n"
  },
  {
    "path": "sessions/mm/s01/h1-elite.md",
    "content": "---\nlayout: page\ntitle: Introducing 2021 HackerOne Elite\nsidebar:\n  - title: \"More from Season 01\"\n    links:\n      - text: \"Hacking the Government\"\n        url: /sessions/mm/s01/hackthegovt\n      - text: \"Understanding Shodan\"\n        url: /sessions/mm/s01/howtoshodan\n      - text: \"CTF vs Bug Bounty\"\n        url: /sessions/mm/s01/ctf_vs_bugbounty\n      - text: \"Mobile Hacking\"\n        url: /sessions/mm/s01/mobile_hacking\n      - text: \"How to Pentest\"\n        url: /sessions/mm/s01/hacktivitycon\n      - text: \"Mental Health for Hackers\"\n        url: /sessions/mm/s01/mentalhealth\n\nvideo_src: https://www.youtube-nocookie.com/embed/alf64qFhqwU\nnext_url: hackthegovt\n---\n\nIn this episode, we introduce the newest members of HackerOne Elite and ask them how to get started in bug bounty and hacking! Hosted by [@NahamSec](https://twitter.com/NahamSec) and [@Arl_rose](https://twitter.com/arl_rose).\n\nGuests\n-----------------\n\n- [mayonaise](https://twitter.com/colston3000)\n- [cdl](https://twitter.com/hacker_)\n- [daeken](https://twitter.com/daeken)\n- [inhibitor181](https://twitter.com/inhibitor181)\n- [spaceraccoon](https://twitter.com/spaceraccoon)\n\n"
  },
  {
    "path": "sessions/mm/s01/hackthegovt.md",
    "content": "---\nlayout: page\ntitle: Hacking with the Government\nsidebar:\n  - title: \"More from Season 01\"\n    links:\n      - text: \"Introducing 2021 HackerOne Elite\"\n        url: /sessions/mm/s01/h1-elite\n      - text: \"Understanding Shodan\"\n        url: /sessions/mm/s01/howtoshodan\n      - text: \"CTF vs Bug Bounty\"\n        url: /sessions/mm/s01/ctf_vs_bugbounty\n      - text: \"Mobile Hacking\"\n        url: /sessions/mm/s01/mobile_hacking\n      - text: \"How to Pentest\"\n        url: /sessions/mm/s01/how_to_pentest\n      - text: \"Mental Health for Hackers\"\n        url: /sessions/mm/s01/mentalhealth\n\nprevious_url: h1-elite\nnext_url: howtoshodan\nvideo_src: https://www.youtube-nocookie.com/embed/tmtBy5ozqxo\n---\n\nIn this episode we take a look at HackerOne’s federal initiatives and activity in the DoD space. It was an opportunity to demonstrate HackerOne as a tool that can be useful to military personnel transitioning to careers in the civilian world, while also tying in other initiatives that serve the veteran cyber community! Hosted by [@NickZaj](https://twitter.com/NicZaj) and [@Arl_rose](https://twitter.com/arl_rose).\n\n"
  },
  {
    "path": "sessions/mm/s01/how_to_pentest.md",
    "content": "---\nlayout: page\ntitle: Breaking Into Pentesting\nsidebar:\n  - title: \"Season 01\"\n    links:\n      - text: \"Introducing 2021 HackerOne Elite\"\n        url: /sessions/mm/s01/h1-elite\n      - text: \"Hacking with the Government\"\n        url: /sessions/mm/s01/hackthegovt\n      - text: \"Understanding Shodan\"\n        url: /sessions/mm/s01/howtoshodan\n      - text: \"CTF vs Bug Bounty\"\n        url: /sessions/mm/s01/ctf_vs_bugbounty\n      - text: \"Mobile Hacking\"\n        url: /sessions/mm/s01/mobile_hacking\n      - text: \"Mental Health for Hackers\"\n        url: /sessions/mm/s01/mentalhealth\nprevious_url: mobile_hacking\nnext_url: mentalhealth\nvideo_src: https://www.youtube-nocookie.com/embed/QecaJ95HF0o\n---\n\nWe had the pleasure to speak with @TheCyberMentor and @PhillipWylie and asked all of our questions about how to get into pentesting! We had the chance to discuss online resources, learning platforms and certifications for people with different backgrounds and experience levels. Hosted by [@NahamSec](https://twitter.com/NahamSec) and [@Arl_rose](https://twitter.com/arl_rose).\n\nGuests\n-----------------\n\n- [Heath Adams](https://twitter.com/TheCyberMentor)\n- [Phillip Wylie](https://twitter.com/PhillipWylie)\n"
  },
  {
    "path": "sessions/mm/s01/howtoshodan.md",
    "content": "---\nlayout: page\ntitle: How to Shodan (with @achillean)\nsidebar:\n  - title: \"Season 01\"\n    links:\n      - text: \"Introducing 2021 HackerOne Elite\"\n        url: /sessions/mm/s01/h1-elite\n      - text: \"Hacking with the Government\"\n        url: /sessions/mm/s01/hackthegovt\n      - text: \"How to Shodan\"\n        url: /sessions/mm/s01/howtoshodan\n      - text: \"CTF vs Bug Bounty\"\n        url: /sessions/mm/s01/ctf_vs_bugbounty\n      - text: \"Mobile Hacking\"\n        url: /sessions/mm/s01/mobile_hacking\n      - text: \"How to Pentest\"\n        url: /sessions/mm/s01/how_to_pentest\n      - text: \"Mental Health for Hackers\"\n        url: /sessions/mm/s01/mentalhealth\nprevious_url: hackthegovt\nnext_url: ctf_vs_bugbounty\nvideo_src: https://www.youtube-nocookie.com/embed/XmXK0AR1KU8\n---\n\nIn this episode, we chatted with [John Matherly](@achillean) to understand how and why Shodan was created! Hosted by [@NahamSec](https://twitter.com/NahamSec) and [@NickZaj](https://twitter.com/NickZaj).\n\nGuests\n-----------------\n\n- [John Matherly](https://twitter.com/achillean)\n"
  },
  {
    "path": "sessions/mm/s01/mentalhealth.md",
    "content": "---\nlayout: page\ntitle: Mental Health for Hackers\nsidebar:\n  - title: \"Season 01\"\n    links:\n      - text: \"Introducing 2021 HackerOne Elite\"\n        url: /sessions/mm/s01/h1-elite\n      - text: \"Hacking with the Government\"\n        url: /sessions/mm/s01/hackthegovt\n      - text: \"Understanding Shodan\"\n        url: /sessions/mm/s01/howtoshodan\n      - text: \"CTF vs Bug Bounty\"\n        url: /sessions/mm/s01/ctf_vs_bugbounty\n      - text: \"Mobile Hacking\"\n        url: /sessions/mm/s01/mobile_hacking\n      - text: \"How to Pentest\"\n        url: /sessions/mm/s01/how_to_pentest\n\nprevious_url: how_to_pentest\nvideo_src: https://www.youtube-nocookie.com/embed/2IpBE0qBhSc\n---\n\nRegardless of experience level, burn out and imposter syndrome seem to be common amongst people in any industry. In this episode, we are joined by Chloe Messdaghi and Pamela Greenberg to discuss the importance of mental health and how to overcome stress, anxiety, imposter syndrome or burn outs. Hosted by [@NahamSec](https://twitter.com/NahamSec) and [N1col3Rose](https://twitter.com/N1col3Rose).\n\nGuests\n-----------------\n\n- [Chloe Messdaghi](https://twitter.com/chloemessdaghi)\n- Pamela Greenberg\n"
  },
  {
    "path": "sessions/mm/s01/mobile_hacking.md",
    "content": "---\nlayout: page\ntitle: Mobile Hacking\nsidebar:\n  - title: \"Season 01\"\n    links:\n      - text: \"Introducing 2021 HackerOne Elite\"\n    links:\n      - text: \"Introducing 2021 HackerOne Elite\"\n        url: /sessions/mm/s01/h1-elite\n      - text: \"Hacking with the Government\"\n        url: /sessions/mm/s01/hackthegovt\n      - text: \"Understanding Shodan\"\n        url: /sessions/mm/s01/howtoshodan\n      - text: \"CTF vs Bug Bounty\"\n        url: /sessions/mm/s01/ctf_vs_bugbounty\n      - text: \"How to Pentest\"\n        url: /sessions/mm/s01/how_to_pentest\n      - text: \"Mental Health for Hackers\"\n        url: /sessions/mm/s01/mentalhealth\nprevious_url: ctf_vs_bugbounty\nnext_url: how_to_pentest\nvideo_src: https://www.youtube-nocookie.com/embed/eF2CqYEiw5k\n---\n\nIn this episode, we were joined by Joel Margolis and Dawn Isabel to learn about how to get started with hacking Android and iOS applications! Hosted by [@NahamSec](https://twitter.com/NahamSec) and [@Arl_rose](https://twitter.com/arl_rose).\n\nGuests\n-----------------\n\n- [Dawn Isabel](https://twitter.com/dawnisabel)\n- [Joel Margolis](https://twitter.com/0xteknogeek)\n"
  },
  {
    "path": "sessions/mm/s02/getting_started.md",
    "content": "---\nlayout: page\ntitle: Getting Started in Bug Bounties\nsidebar:\n  - title: \"Season 02\"\n    links:\n      - text: \"Meet Chris Evans, HackerOne's Chief Hacking Officer\"\n        url: /sessions/mm/s02/h1_CHO\n      - text: \"How to Communicate and Write a Report\"\n        url: /sessions/mm/s02/how_to_write_reports\n      - text: \"Industry Certifications\"\n        url: \"/sessions/mm/s02/industry_certificates\"\n      - text: \"Starting a Career in Bug Bounty\"\n        url: \"/sessions/mm/s02/starting_a_career\"        \n      - text: \"How to Pick and Approach a Target\"\n        url: \"/sessions/mm/s02/how_to_pick_a_target\"   \nnext_url: h1_CHO\nvideo_src: https://www.youtube-nocookie.com/embed/A8mBBC7W7z8\n---\n\nIn this episode, we met with Adam Langley and Niru Ragupathy to learn more about their creative process and to learn how participating in CTFs may help hackers get started with hacking and bug bounty! Hosted by [@NahamSec](https://twitter.com/NahamSec) and [@Arl_rose](https://twitter.com/arl_rose).\n\nGuests\n-----------------\n- [Vickie Li](https://twitter.com/vickieli7)\n- [Farah Hawa](https://twitter.com/Farah_Hawaa) \n"
  },
  {
    "path": "sessions/mm/s02/h1_CHO.md",
    "content": "---\nlayout: page\ntitle: Meet Chris Evans, HackerOne's Chief Hacking Officer\nsidebar:\n  - title: \"Season 02\"\n    links:\n      - text: \"Getting Started in Bug Bounties\"\n        url: /sessions/mm/s02/getting_started\n      - text: \"How to Communicate and Write a Report\"\n        url: /sessions/mm/s02/how_to_write_reports\n      - text: \"Industry Certifications\"\n        url: \"/sessions/mm/s02/industry_certificates\"\n      - text: \"Starting a Career in Bug Bounty\"\n        url: \"/sessions/mm/s02/starting_a_career\"        \n      - text: \"How to Pick and Approach a Target\"\n        url: \"/sessions/mm/s02/how_to_pick_a_target\"   \nprevious_url: getting_started\nnext_url: starting_a_career\nvideo_src: https://www.youtube-nocookie.com/embed/ZyqyiZRSaAc\n---\n\nIn this episode, we welcome Chris Evans, CISO and Chief Hacking Officer at HackerOne. We will discuss security research, what it takes for big corporations to launch a bug bounty program - from working with internal stakeholders such as executive or legal teams to creating a process to remedy and fix vulnerabilities. \n\nGuests\n-----------------\n\n- [Chris Evans](https://twitter.com/scarybeasts), CISO and Chief Hacking Officer at HackerOne."
  },
  {
    "path": "sessions/mm/s02/how_to_pick_a_target.md",
    "content": "---\nlayout: page\ntitle: How to Pick and Approach a Target\nsidebar:\n  - title: \"Season 02\"\n    links:\n      - text: \"Getting Started in Bug Bounties\"\n        url: /sessions/mm/s02/getting_started\n      - text: \"Meet Chris Evans, HackerOne's Chief Hacking Officer\"\n        url: /sessions/mm/s02/h1_CHO\n      - text: \"How to Communicate and Write a Report\"\n        url: /sessions/mm/s02/how_to_write_reports\n      - text: \"Industry Certifications\"\n        url: \"/sessions/mm/s02/industry_certificates\"\n      - text: \"Starting a Career in Bug Bounty\"\n        url: \"/sessions/mm/s02/starting_a_career\"        \nprevious_url: industry_certificates\nvideo_src: https://www.youtube-nocookie.com/embed/ix8yFSJbEHY\n---\n\nIn this episode, we chat with zlz and Rhynorater and learn about how they pick the targets they hack on. Is it solely monteray or does the brand and the scope size play a role in making these decisions? Hosted by [@NahamSec](https://twitter.com/NahamSec) and [@Arl_rose](https://twitter.com/arl_rose).\n\nGuests\n-----------------\n\n- [Sam Curry](https://twitter.com/samwcyo)\n- [Justin Gardner](https://twitter.com/rhynorater)\n"
  },
  {
    "path": "sessions/mm/s02/how_to_write_reports.md",
    "content": "---\nlayout: page\ntitle: How to Communicate and Write a Report\nsidebar:\n  - title: \"Season 02\"\n    links:\n      - text: \"Getting Started in Bug Bounties\"\n        url: /sessions/mm/s02/getting_started\n      - text: \"Meet Chris Evans, HackerOne's Chief Hacking Officer\"\n        url: /sessions/mm/s02/h1_CHO\n      - text: \"Industry Certifications\"\n        url: \"/sessions/mm/s02/industry_certificates\"\n      - text: \"Starting a Career in Bug Bounty\"\n        url: \"/sessions/mm/s02/starting_a_career\"        \n      - text: \"How to Pick and Approach a Target\"\n        url: \"/sessions/mm/s02/how_to_pick_a_target\"   \nprevious_url: h1_CHO\nnext_url: industry_certificates\nvideo_src: https://www.youtube-nocookie.com/embed/thaCeWE112w\n---\n\nWhen you are submitting a vulnerability report to a company, it is very important to be able to communicate your findings in a clear and concise manner, where the security or triage team receiving your report are able to reproduce it as quickly as possible. In this episode, we have invited former Hackeronies Patrik and Yassine to talk about how to write a report and when/how to ask for help. Hosted by [@NahamSec](https://twitter.com/NahamSec) and [@Arl_rose](https://twitter.com/arl_rose).\n\nGuests\n-----------------\n\n- [Yassine Aboukir](twitter.com/yassineaboukir)\n- [Roni Carta](twitter.com/0xlupin)"
  },
  {
    "path": "sessions/mm/s02/industry_certificates.md",
    "content": "---\nlayout: page\ntitle: Industry Certificates\nsidebar:\n  - title: \"Season 02\"\n    links:\n      - text: \"Getting Started in Bug Bounties\"\n        url: /sessions/mm/s02/getting_started\n      - text: \"Meet Chris Evans, HackerOne's Chief Hacking Officer\"\n        url: /sessions/mm/s02/h1_CHO\n      - text: \"How to Communicate and Write a Report\"\n        url: /sessions/mm/s02/how_to_write_reports\n      - text: \"Starting a Career in Bug Bounty\"\n        url: \"/sessions/mm/s02/starting_a_career\"        \n      - text: \"How to Pick and Approach a Target\"\n        url: \"/sessions/mm/s02/how_to_pick_a_target\"   \nprevious_url: starting_a_career\nnext_url: how_to_pick_a_target\nvideo_src: https://www.youtube-nocookie.com/embed/4PqVncwiznY\n---\n\nIn this episode, we chatted with Busra Demir and John Hammond to talk about different infosec certifications. We asked them how they select the right certifications, how they prepare for it, and how to leverage them for different jobs! \n\nGuests\n-----------------\n- [Busra Demir](https://twitter.com/areyou1or0)\n- [John Hammond](https://twitter.com/_JohnHammond)\n"
  },
  {
    "path": "sessions/mm/s02/starting_a_career.md",
    "content": "---\nlayout: page\ntitle: Starting a Career in Bug Bounty \nsidebar:\n  - title: \"Season 02\"\n    links:\n      - text: \"Getting Started in Bug Bounties\"\n        url: /sessions/mm/s02/getting_started\n      - text: \"Meet Chris Evans, HackerOne's Chief Hacking Officer\"\n        url: /sessions/mm/s02/h1_CHO\n      - text: \"How to Communicate and Write a Report\"\n        url: /sessions/mm/s02/how_to_write_reports\n      - text: \"Industry Certifications\"\n        url: \"/sessions/mm/s02/industry_certificates\"  \n      - text: \"How to Pick and Approach a Target\"\n        url: \"/sessions/mm/s02/how_to_pick_a_target\"   \nprevious_url: h1_CHO\nnext_url: how_to_write_reports\nvideo_src: https://www.youtube-nocookie.com/embed/5ptIyYWPe5Q\n---\n\nGuests\n-----------------\n\n- [Douglas Day](https://twitter.com/the_arch_angel) \n- [Pete Yaworsk](https://twitter.com/yaworski)\n- [Eugene Lim](https://twitter.com/spaceraccoon) \n\n\n"
  },
  {
    "path": "sessions/mobile_crash_course.md",
    "content": "---\nlayout: page\ntitle: Mobile Hacking Crash Course\nvideo_src: https://www.youtube-nocookie.com/embed/hKF89TXttnw\nnext_url: android/quickstart\n---\n\nIn this session -- the first in a series of three on mobile hacking -- we begin with some fundamentals of mobile apps and discuss testing methodology.\n\nWhat you'll learn\n-----------------\n\n- Why learning to hack mobile apps is worthwhile\n- Types of applications\n\t- Pure native\n\t- Hybrid\n\t- Web wrappers\n- Popular hybrid app framework quirks\n- Languages to learn\n- How to select a target\n- Basics of setting up proxy for mobile\n- Testing methodology starting point\n\t- Standard web bugs\n\t- Credential storage bugs\n\t- Insecure connections\n\t- Embedded secrets\n\t- Session token oddities\n\t- Debug/dev interfaces\n\t- Insecure data storage\n\t- Insufficient crypto\n\t- Confidential data in app switcher\n"
  },
  {
    "path": "sessions/native_code_crash_course.md",
    "content": "---\nlayout: page\ntitle: Native Code Crash Course\nvideo_src: https://www.youtube-nocookie.com/embed/NeeCfLNyTwo\n---\n\nIn this session we're diving head-first into understanding and hacking native code.  This is an extremely advanced topic, but by the time you are done with this video, you will have a great head start on the subject.  You'll learn about the fundamentals of how computers work, several types of memory corruption bugs, the protections in use by modern systems, and how to bypass some of these protections.\n\nWhat you'll learn\n-----------------\n\n- Intro\n\t- What is native code?\n\t- Breadth not depth\n- System Architecture Crash Course\n\t- Registers\n\t- Memory\n\t\t- Physical\n\t\t- Virtual\n\t\t\t- Page tables\n\t- Stack\n\t- Endianness\n\t- Instructions\n\t- Program Counter\n\t- Calls\n\t- Syscalls\n\t- Shared Libraries\n- Tools\n\t- Debuggers\n\t- Disassemblers\n\t- Decompilers\n\t- Hex editors\n\t- Assemblers\n- Bugs\n\t- Buffer overflows\n\t- Out of bounds writes\n\t- Use After Free\n- Protections\n\t- Stack canaries\n\t- NX\n\t- W^X\n\t- ASLR\n- Bypassing Protections\n\t- JS is an attacker's best friend\n\t- Information leaks (ASLR)\n\t- ROP\n\nResources\n---------\n\n- Computing Fundamentals\n\t- Assembly\n\t\t- [x86 Guide](https://www.cs.virginia.edu/~evans/cs216/guides/x86.html)\n\t\t- [x86 Instruction Encoding References](http://sandpile.org/)\n\t\t- [ARM Guide](https://www.coranac.com/tonc/text/asm.htm)\n\t\t- [x86-64 Cheat Sheet](https://cs.brown.edu/courses/cs033/docs/guides/x64_cheatsheet.pdf)\n\t- [Kernel Resources](https://wiki.osdev.org/Expanded_Main_Page)\n\t- [Memory Management](https://wiki.osdev.org/Memory_management)\n\t- [CPU Cache](https://en.wikipedia.org/wiki/CPU_cache)\n\t- [Shared Library Loading Process](https://amir.rachum.com/blog/2016/09/17/shared-libraries/)\n\t- Binary File Formats\n\t\t- [ELF](http://www.skyfree.org/linux/references/ELF_Format.pdf)\n\t\t- [PE](https://docs.microsoft.com/en-us/windows/desktop/debug/pe-format)\n\t\t- [Mach-O](https://lowlevelbits.org/parsing-mach-o-files/)\n\t- [Becoming a Full-Stack Reverse-Engineer](https://www.youtube.com/watch?v=9vKG8-TnawY)\n- Tools\n\t- Debuggers\n\t\t- [GDB](https://www.gnu.org/software/gdb/)\n\t\t- [LLDB](https://lldb.llvm.org/)\n\t\t- [WinDbg](https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-tools)\n\t\t- [OllyDbg](http://www.ollydbg.de/)\n\t- Disassemblers/Decompilers\n\t\t- [IDA Pro](https://hex-rays.com/ida-pro/)\n\t\t- [Hopper](https://www.hopperapp.com/)\n\t\t- [Binary Ninja](https://binary.ninja/)\n\t\t- [Ghidra](https://www.nsa.gov/resources/everyone/ghidra/)\n\t- Hex Editors\n\t\t- [0xED](https://www.suavetech.com/0xed/)\n\t\t- [HxD](https://mh-nexus.de/en/hxd/)\n\t- Assemblers\n\t\t- [Online Assembler and Disassembler](http://shell-storm.org/online/Online-Assembler-and-Disassembler/)\n\t\t- [GNU Assembler](https://en.wikipedia.org/wiki/GNU_Assembler)\n\t\t- [Netwide Assembler (nasm)](https://en.wikipedia.org/wiki/Netwide_Assembler)\n\t- ROP Gadget Hunters\n\t\t- [ROPgadget](https://github.com/JonathanSalwan/ROPgadget)\n\t\t- [Ropper](https://github.com/sashs/Ropper)\n\t- Emulators\n\t\t- [QEMU](https://www.qemu.org/)\n\t\t- [Unicorn](https://www.unicorn-engine.org/)\n\t- Fuzzers\n\t\t- [afl](https://lcamtuf.coredump.cx/afl/)\n\t\t- [libFuzzer](https://llvm.org/docs/LibFuzzer.html)\n\t- Instrumentation\n\t\t- [Valgrind](http://valgrind.org/)\n\t\t- [Pin](https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool)\n\t- Executable Lifters\n\t\t- [McSema](https://github.com/trailofbits/mcsema)\n- Bugs\n\t- Buffer Overflows\n\t\t- [Smashing The Stack For Fun And Profit](http://phrack.org/issues/49/14.html)\n\t- Out of Bounds Writes\n\t\t- [Analyzing and Reproducing the EOS Out-of-Bound Write Vulnerability in nodeos](https://medium.com/@peckshield/reproducing-the-eos-out-of-bound-write-vulnerability-in-nodeos-6a0487070ced)\n\t- Use After Free\n\t\t- [An Introduction to Use After Free Vulnerabilities](https://www.purehacking.com/blog/lloyd-simon/an-introduction-to-use-after-free-vulnerabilities)\n\t\t- [What do Nintendo Switch and iOS 9.3 have in common? CVE-2016-4657 walk-through](https://www.youtube.com/watch?v=xkdPjbaLngE&feature=youtu.be)\n\t- Speculative Execution Bugs\n\t\t- [Meltdown and Spectre, explained](https://medium.com/@mattklein123/meltdown-spectre-explained-6bc8634cc0c2)\n- Protections\n\t- [Canaries](https://en.wikipedia.org/wiki/Buffer_overflow_protection#Canaries)\n\t- [NX bit](https://en.wikipedia.org/wiki/NX_bit)\n\t- [W^X](https://en.wikipedia.org/wiki/W%5EX)\n\t- [How do ASLR and DEP work?](https://security.stackexchange.com/questions/18556/how-do-aslr-and-dep-work)\n\t- [Pointer Authentication on ARMv8.3](https://www.qualcomm.com/media/documents/files/whitepaper-pointer-authentication-on-armv8-3.pdf)\n- Bypassing Protections\n\t- [The info leak era on software exploitation](https://media.blackhat.com/bh-us-12/Briefings/Serna/BH_US_12_Serna_Leak_Era_Slides.pdf)\n\t- [return-into-lib(c)](http://phrack.org/issues/58/4.html)\n\t- [Introduction to return oriented programming (ROP)](http://codearcana.com/posts/2013/05/28/introduction-to-return-oriented-programming-rop.html)\n\t- [Jump-Oriented Programming: A New Class of Code-Reuse Attacks](https://www.comp.nus.edu.sg/~liangzk/papers/asiaccs11.pdf)\n\t- [Examining Pointer Authentication on the iPhone XS](https://googleprojectzero.blogspot.com/2019/02/examining-pointer-authentication-on.html)\n- JavaScript Engine Exploitation Resources\n\t- [Attacking JavaScript Engines](http://www.phrack.org/papers/attacking_javascript_engines.html)\n\t- [Heap Feng Shui in JavaScript](https://www.blackhat.com/presentations/bh-europe-07/Sotirov/Presentation/bh-eu-07-sotirov-apr19.pdf)\n\t- [JIT spraying and mitigations](https://www.piotrbania.com/all/articles/pbania-jit-mitigations2010.pdf)\n\t- [SoK: Make JIT-Spray Great Again](https://www.usenix.org/system/files/conference/woot18/woot18-paper-gawlik.pdf)\n- Reports\n\t- [Controlled address leak due to type confusion - ASLR bypass](https://hackerone.com/reports/207321) ($100 bounty)\n\t- [Adobe Flash Player Out-of-Bound Read/Write Vulnerability](https://hackerone.com/reports/31408) ($5000 bounty)\n\t- [RCE on Steam Client via buffer overflow in Server Info](https://hackerone.com/reports/470520) ($18000 bounty)\n\t- [heap-buffer-overflow in S_pack_rec](https://hackerone.com/reports/354650) ($1000 bounty)\n\t- [Nintendo Switch nvservices Info Leak](https://daeken.svbtle.com/nintendo-switch-nvservices-info-leak)\n\t- [Buffer overflow in HTTP parse_hostinfo(), parse_userinfo() and parse_scheme()](https://hackerone.com/reports/174069) ($1000 bounty)\n\t- [Use After Free in Flash MessageChannel.send can cause arbitrary code execution](https://hackerone.com/reports/47234) ($7500 bounty)\n\t- [Virtually Unlimited Memory: Escaping the Chrome Sandbox](https://googleprojectzero.blogspot.com/2019/04/virtually-unlimited-memory-escaping.html)\n\t- [Splitting atoms in XNU](https://googleprojectzero.blogspot.com/2019/04/splitting-atoms-in-xnu.html)\n\t- [voucher_swap: Exploiting MIG reference counting in iOS 12](https://googleprojectzero.blogspot.com/2019/01/voucherswap-exploiting-mig-reference.html)\n\t- [Technical Analysis of the Pegasus Exploits on iOS](https://info.lookout.com/rs/051-ESQ-475/images/pegasus-exploits-technical-details.pdf)\n"
  },
  {
    "path": "sessions/null_termination.md",
    "content": "---\nlayout: page\ntitle: Null Termination Bugs\nvideo_src: https://www.youtube-nocookie.com/embed/xCcVjgTbycM\n---\n\nIn this session we'll talk about null termination bugs.  This is an obscure but occasionally critical type of vulnerability.\n\nWhat you'll learn\n-----------------\n\n- Null Terminators\n\t- What they are\n\t- Why they're relevant to web security\n\t- How to test for null termination bugs\n\t- How to exploit these bugs\n"
  },
  {
    "path": "sessions/password_storage.md",
    "content": "---\nlayout: page\ntitle: Password Storage\nvideo_src: https://www.youtube-nocookie.com/embed/xZ5cxxllgP8\n---\n\nIn this session we'll discuss methods of securely storing passwords and what to watch out for.\n\nWhat you'll learn\n-----------------\n\n- Use Bcrypt (or Scrypt)\n- Goals for password security\n- Never use a bare hash (e.g. MD5, SHA1)\n\t- They're too fast\n- If you can't use those, use PBKDF2 and slow it way down\n"
  },
  {
    "path": "sessions/pentest_owasp.md",
    "content": "---\nlayout: page\ntitle: A Starters Guide to Pentesting with OWASP\nvideo_src: https://www.youtube-nocookie.com/embed/AO_sqXb-gKE\nnext_url: pentest_vs_bug_bounty\n---\n\nWhat is OWASP and what is the OWASP Top 10? This is a quick review of the top 10 categories and types of vulnerabilities. Concludes with a detailed testing guide walkthrough.\n"
  },
  {
    "path": "sessions/pentest_reporting.md",
    "content": "---\nlayout: page\ntitle: Pentest Reporting and Best Practices\nvideo_src: https://www.youtube-nocookie.com/embed/6QIrXgPGJhM\nprevious_url: pentest_resources\n---\n\nJoin [@thecybermentor](https://twitter.com/thecybermentor) as he does a step by step walkthrough of how to write a quality pentest report. See the explanation of the typical sections of a pentest report, how to effectively articulate all the details about the pentest being performed and tips on how to write technical material that can also be easily digested by higher level CISO, and other Executive types.\n"
  },
  {
    "path": "sessions/pentest_resources.md",
    "content": "---\nlayout: page\ntitle: Pentest Resources\nvideo_src: https://www.youtube-nocookie.com/embed/VL2bgatmIkc\nprevious_url: pentest_vs_bug_bounty\nnext_url: pentest_reporting\n---\n\nGet a guided walkthrough of various top resources to learn more in your pentesting journey and where to practice your skills. Material also reviews some top tier Infosec certifications that are available today and which ones to focus on and why.  \n"
  },
  {
    "path": "sessions/pentest_vs_bug_bounty.md",
    "content": "---\nlayout: page\ntitle: Pentesting vs Bug Bounty\nsubtitle: How is it different? How is it the same?\nvideo_src: https://www.youtube-nocookie.com/embed/AO_NoVxt2ss\nprevious_url: pentest_owasp\nnext_url: pentest_resources\n---\n\nDifference in types of vulnerabilities that are reported in bug bounty, vs pentest. Learn the difference of how impact is prized in bug bounty hunting and how methodology-driven testing is prioritized in pentesting. Reviews a key difference in the vulnerabilities you would submit in a pentest that you may not ever submit in a bug bounty engagement (such as missing headers or weak ciphers). At the end, there is a live demo where [@thecybermentor](https://twitter.com/thecybermentor) reviews a vulnerable application.\n"
  },
  {
    "path": "sessions/secure_architecture.md",
    "content": "---\nlayout: page\ntitle: Secure Architecture Review\nvideo_src: https://www.youtube-nocookie.com/embed/qkfmj6WJBwA\n---\n\nIn this quick session, we'll discuss some basic techniques for secure architecture review.\n\nWhat you'll learn\n-----------------\n\n- What it is\n- Basic structure for performing architecture reviews\n- Key focus areas\n\t- Maximize isolation\n\t- Securely store data, e.g. passwords\n\t- The principle of least privilege\n\t- Auditability\n"
  },
  {
    "path": "sessions/session_fixation.md",
    "content": "---\nlayout: page\ntitle: Session Fixation\nvideo_src: https://www.youtube-nocookie.com/embed/tkSmaMlSQ9E\n---\n\nIn this session we'll discuss session fixation attacks.  These allow an attacker to take over a victim's session and gain access to their account.\n\nWhat you'll learn\n-----------------\n\n- Session Fixation\n\t- What it is\n\t- Detection\n\t- Mitigation\n"
  },
  {
    "path": "sessions/sessions.html",
    "content": "---\nlayout: page\ntitle: Sessions\npermalink: /sessions/\n---\n\n{% for child_page in site.pages %}\n    {% assign target_dir = 'sessions/' %}\n    {% if child_page.path contains target_dir and child_page.path != page.path %}\n        <li>\n            <a href=\"{{ child_page.url | relative_url }}\">{{ child_page.title }}</a>\n        </li>\n    {% endif %}\n{% endfor %}\n"
  },
  {
    "path": "sessions/source_review.md",
    "content": "---\nlayout: page\ntitle: Source Code Review\nvideo_src: https://www.youtube-nocookie.com/embed/i4fd2Va3Jtg\n---\n\nIn this quick session, we'll review static analysis tools, techniques for manual review, and tips and tricks to get you through even the largest source code reviews.\n\nWhat you'll learn\n-----------------\n\n- Managing expectations\n\t- Metrics\n\t- Manual vs automated review\n- Tools review\n- Issues with static analysis tools\n- Division of labor\n- Tips and tricks\n"
  },
  {
    "path": "sessions/sqli.md",
    "content": "---\nlayout: page\ntitle: SQL Injection and Friends\nvideo_src: https://www.youtube-nocookie.com/embed/bIB3Hi6KeZU\n---\n\nIn this session we'll talk about several of the most important vulnerabilities: SQL injection, command injection, and directory traversal.\n\nWhat you'll learn\n-----------------\n\n- Directory traversal\n\t- What it is\n\t- Exploitation\n\t- Mitigation\n- Command injection\n\t- What it is\n\t- Real-world scenario\n\t- Exploitation\n\t- Mitigation\n- SQLi (SQL Injection)\n\t- How it works\n\t- Basic exploitation\n\t- Mitigation\n- Blind SQLi\n\t- What it is\n\t- The types of blind SQLi\n\t- Exploiting blind\n"
  },
  {
    "path": "sessions/ssrf.md",
    "content": "---\nlayout: page\ntitle: Server-Side Request Forgery\nvideo_src: https://www.youtube-nocookie.com/embed/66ni2BTIjS8\n---\n\nIn this session we'll talk about server-side request forgery.  This is when an attacker controls the target of HTTP(S) requests coming from the server.\n\nWhat you'll learn\n-----------------\n\n- SSRF\n\t- File accesses\n\t- Firewall bypass\n\t- Port scanning\n\t- Mitigation\n"
  },
  {
    "path": "sessions/threat_modeling.md",
    "content": "---\nlayout: page\ntitle: Threat Modeling\nvideo_src: https://www.youtube-nocookie.com/embed/6DI7RIXUTg8\nsidebar:\n  - title: Resources\n    links:\n      - text: Example HackerOne threat model\n        url: /resources/hackerone_threat_model\n      - text: OWASP Threat Modeling guide\n        url: https://www.owasp.org/index.php/Application_Threat_Modeling\n---\n\nIn this session we'll talk about threat modeling, a process to determine which threats are important to an application and find points where defenses might be lacking.\n\nWhat you'll learn\n-----------------\n\n- \"Heavy-weight\" threat modeling\n\t- How to do it\n\t- Why it isn't a good fit for bug bounty hunters\n- Light-weight threat modeling\n\t- How to do it\n\t- Why it's simple and effective\n"
  },
  {
    "path": "sessions/unchecked_redirects.md",
    "content": "---\nlayout: page\ntitle: Unchecked Redirects\nvideo_src: https://www.youtube-nocookie.com/embed/AEushmkXRpE\n---\n\nIn this session we'll discuss unchecked redirects.  These make it easy to mask phishing attempts and can even allow violation of authorization constraints.\n\nWhat you'll learn\n-----------------\n\n- Unchecked Redirects\n\t- What they are\n\t- Detection\n\t- Exploitation\n\t- Mitigation\n"
  },
  {
    "path": "sessions/web_in_depth.md",
    "content": "---\nlayout: page\ntitle: The Web In Depth\nvideo_src: https://www.youtube-nocookie.com/embed/DWBUQiaN5ZM\n---\n\nIn this session we'll talk about how the web works from a security perspective.\n\nWhat you'll learn\n-----------------\n\n- HTTP basics\n- Cookie security\n- HTML parsing\n- MIME sniffing\n- Encoding sniffing\n- Same-Origin Policy\n- CSRF (Cross-Site Request Forgery)\n\n[Next: writing good reports](https://www.hacker101.com/sessions/good_reports.html)\n"
  },
  {
    "path": "sessions/xss.md",
    "content": "---\nlayout: page\ntitle: XSS and Authorization\nvideo_src: https://www.youtube-nocookie.com/embed/HGaFCcWM57U\n---\n\nIn this session we'll discuss cross-site scripting, an extremely prevalent vulnerability, along with authorization failures.\n\nWhat you'll learn\n-----------------\n\n- XSS (Cross-Site Scripting)\n\t- Types of XSS\n\t\t- Stored\n\t\t- Reflected\n\t\t- DOM\n\t- Detection\n\t- Exploitation\n\t- Mitigation\n- Authorization bypasses and forced browsing\n\t- Detection\n\t- Exploitation\n\t- Mitigation\n"
  },
  {
    "path": "sessions/xxe.md",
    "content": "---\nlayout: page\ntitle: XML External Entities\nvideo_src: https://www.youtube-nocookie.com/embed/8NX3Z97ckAQ\n---\n\nIn this quick session, we'll discuss XXE (XML External Entity) attacks.  \n\nWhat you'll learn\n-----------------\n\n- How XML entity definitions work\n- How to use these definitions for XXE attacks\n- The real-world impact of these bugs\n"
  },
  {
    "path": "start-here.md",
    "content": "---\nlayout: page\ntitle: Getting Started\nsidebar:\n  - title: Report Writing, Communication Tips, and Community Guidelines\n    links:\n      - text: \"Understanding HackerOne's Code of Conduct\"\n        url: /resources/articles/code_of_conduct\n      - text: \"How to Write a Good Report and Use the CVSS Calculator\"\n        url: /resources/articles/writing_a_report_and_cvss\n      - text: \"How and When to Ask for More Help\"\n        url: /resources/articles/asking_for_help\n  - title: Suggested Material\n    links:\n      - text: \"Hacktivity\"\n        url: https://hackerone.com/hacktivity\n      - text: \"Introducing Hacker101 CTF\"\n        url: https://www.hackerone.com/blog/Introducing-Hacker101-CTF\n      - text: \"Hacker101: Find Flags, Get Private Invitations\"\n        url: /playlists/burp_suite\n      - text: \"Pentest Series\"\n        url: /playlists/pentesting_series\n      - text: \"Web Hacking\"\n        url: /playlists/web_hacking\n      - text: \"Mobile Hacking\"\n        url: /playlists/mobile_hacking\n---\n\nWelcome to Hacker101! For those new to bug bounties and web hacking, we recommend starting with our [Newcomers Playlist](/playlists/newcomers). This playlist covers fundamental aspects such as web application basics, cultivating a hacker mindset, and crafting effective reports.\n\nIn addition to the Newcomers Playlist, we advise getting yourself familiar with [Burp Suite](/playlists/burp_suite), mastering the essentials of [Web Hacking](/playlists/web_hacking), and reviewing the _\"Report Writing, Communication Tips, and Community Guidelines\"_ section on this page to effectively engage with triage and security teams.\n\nA large collection of hacking tools, like web, desktop, and mobile tools, scanners, datasets, and other valuable resources can be found on the [Resources](/resources) page. Be sure to check them out and get familiar with them.\n\nHacker101 also offers Capture the Flag (CTF) levels to practice what you've learned and increase your skills. When reaching a total of 26 points in the CTF, you become eligible for [invitations to private programs](https://docs.hackerone.com/hackers/invitations.html#gatsby-focus-wrapper). Whether you’re a new hacker or you’re just new to our platform, this is a great way for you to dive into the deep end from day one. Join in on the fun on <a href=\"https://ctf.hacker101.com/\" target=\"_blank\">Hacker101 CTF</a>!\n\nGood luck, and happy hacking!\n"
  },
  {
    "path": "update_bootstrap.sh",
    "content": "#! /bin/sh\n\n# A useful script to download the latest version of bootstrap and jquery\n\nrm -rf node_modules package-lock.json\nnpm install bootstrap@4 jquery@3\n\nrm -rf _sass/bootstrap\nmkdir -p _sass/bootstrap\ncp -r node_modules/bootstrap/scss/* _sass/bootstrap\ntouch _sass/bootstrap/__DO_NOT_MODIFY\n\nrm -rf assets/javascript/bootstrap\nmkdir -p assets/javascript/bootstrap\ncp node_modules/bootstrap/dist/js/bootstrap.bundle.min.* assets/javascript/bootstrap/\ncp node_modules/jquery/dist/jquery.min.* assets/javascript/bootstrap/\ntouch assets/javascript/bootstrap/__DO_NOT_MODIFY\n"
  },
  {
    "path": "videos.md",
    "content": "---\nlayout: page\ntitle: Video Lessons\nvideo_src: https://www.youtube-nocookie.com/embed/FTeE3OrTNoA\nsidebar:\n  - title: \"Learning Tracks\"\n    links:\n      - text: \"Hacker101 for Newcomers\"\n        url: /playlists/newcomers\n      - text: \"Burp Suite\"\n        url: /playlists/burp_suite\n      - text: \"Pentest Series\"\n        url: /playlists/pentesting_series\n      - text: \"Web Hacking\"\n        url: /playlists/web_hacking\n      - text: \"Mentorship Mondays\"\n        url: /playlists/mentorshipmondays\n      - text: \"Mobile Hacking\"\n        url: /playlists/mobile_hacking\n        updated: true\n      - text: \"h@cktivitycon\"\n        url: /playlists/hacktivitycon\n      - text: \"Cryptography\"\n        url: /playlists/cryptography\n      - text: \"Miscellaneous\"\n        url: /playlists/misc\n  - title: \"Hacker101's Picks\"\n    links:\n      - text: \"A Starter's Guide to Pentesting with OWASP\"\n        url: /sessions/pentest_owasp\n      - text: \"JavaScript for Hackers\"\n        url: /sessions/javascript_for_hackers\n      - text: \"Server-Side Request Forgery\"\n        url: /sessions/ssrf\n      - text: \"Mobile Hacking Crash Course\"\n        url: /sessions/mobile_crash_course\n      - text: Introduction to Docker Hacking\n        url: /sessions/docker_hacking\n---\n\nExplore the \"Learning Tracks\" section on this page to dive deep into various topics. Within these tracks, you'll find instructional videos aimed to broaden your hacker skill set. For detailed insights into the content of each session, click on its respective title and get started.\n\n<a class=\"btn btn-primary\" href=\"/start-here\">\n  Not sure where to start? Click here!\n</a>\n\n## Featured Lesson\nCheck out [JavaScript for Hackers by STÖK](/sessions/javascript_for_hackers)!\n"
  }
]