diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml
new file mode 100644
index 000000000..8a7cc1d75
--- /dev/null
+++ b/.github/workflows/documentation.yml
@@ -0,0 +1,44 @@
+# This workflow will create documentation and publish to Github pages. For now it does this in my (Bundabrg) repo when in a specific branch
+
+name: documentation
+on: [push]
+
+jobs:
+ documentation:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Setup Python
+ uses: actions/setup-python@v1
+ with:
+ python-version: '3.6'
+ architecture: 'x64'
+
+ - name: Cache dependencies
+ uses: actions/cache@v1
+ with:
+ path: ~/.cache/pip
+ key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
+ restore-keys: |
+ ${{ runner.os }}-pip-
+
+ - name: Install dependencies
+ run: |
+ python3 -m pip install --upgrade pip
+ python3 -m pip install -r ./requirements.txt
+
+ - run: mkdocs build
+
+ - name: Deploy to Github Pages
+ if: github.ref == 'refs/heads/feature/plugins'
+ uses: peaceiris/actions-gh-pages@v3
+ with:
+ deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
+ publish_dir: ./build/docs
+
+ - name: Upload Artifact
+ uses: actions/upload-artifact@v1
+ with:
+ name: documentation
+ path: build/docs
diff --git a/docs/contributing.md b/docs/contributing.md
new file mode 100644
index 000000000..cb6220464
--- /dev/null
+++ b/docs/contributing.md
@@ -0,0 +1,64 @@
+# Contributing
+
+Here are some ways that you can help contribute to this project.
+
+## New ideas or Bug Reports
+
+Need something? Found a bug? Or just have a brilliant idea? Head to the [Issues](https://github.com/GeyserMC/Geyser/issues) and create a new one.
+
+Please feel free to reach out to us on [Discord](http://discord.geysermc.org/) if
+you're interested in helping out with Geyser.
+
+## Contributing Code
+
+If you know Java then take a look at open issues and create a pull request.
+
+Do the following to build the code:
+
+```shell
+git clone https://github.com/GeyserMC/Geyser
+cd EduSupport
+git submodule update --init --recursive
+mvn clean install
+```
+
+## Contributing Documentation
+
+If you can help improve the documentation it would be highly appreciated. Have a look under the `docs` folder for the existing documentation.
+
+The documentation is built using `mkdocs`. You can set up a hot-build dev environment that will auto-refresh changes as they are made.
+
+### Requirements
+
+* python3
+* pip3
+* npm (only if changing themes)
+
+Install dependencies by running:
+
+```shell
+pip3 install -r requirements.txt
+```
+
+!!! note
+ It's recommended to use a `virtualenv` so that you don't pollute your system environment.
+
+### Dev Environment
+
+To start a http document server on `http://127.0.0.1:8000` execute:
+
+```shell
+mkdocs serve
+```
+
+### Change PDF Theme
+
+Edit the PDF theme under `docs/theme/pdf`. Rebuild by doing the following:
+
+```shell
+cd docs/theme/pdf
+npm install
+npm run build-compressed
+```
+
+This will update `pdf.css` under `docs/css/pdf.css`. Rebuilding the docs will now use the new theme.
diff --git a/docs/css/mkpdf.css b/docs/css/mkpdf.css
new file mode 100644
index 000000000..9e303c134
--- /dev/null
+++ b/docs/css/mkpdf.css
@@ -0,0 +1,9 @@
+@import "https://use.fontawesome.com/releases/v5.8.1/css/all.css";
+
+a.pdf-download-btn{
+ font-size: .8rem;
+}
+
+a.pdf-download-btn small{
+ display: none;
+}
diff --git a/docs/css/pdf.css b/docs/css/pdf.css
new file mode 100644
index 000000000..f113c3834
--- /dev/null
+++ b/docs/css/pdf.css
@@ -0,0 +1 @@
+@import "https://fonts.googleapis.com/icon?family=Material+Icons";article .footnote-backref,article .critic.comment::before,article summary::after,article .task-list-control .task-list-indicator::before{font-family:"Material Icons";font-style:normal;font-variant:normal;font-weight:normal;line-height:1;text-transform:none;white-space:nowrap;speak:none;word-wrap:normal;direction:ltr}article .admonition,article details{box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 1px 5px 0 rgba(0,0,0,0.12),0 3px 1px -2px rgba(0,0,0,0.2);position:relative;margin:1.5625em 0;padding:0 .6rem;border-left:.2rem solid #448aff;border-radius:.1rem;font-size:.8rem;overflow:auto}[dir="rtl"] article .admonition,[dir="rtl"] article details{border-right:.2rem solid #448aff;border-left:none}html article .admonition>:last-child,html article details>:last-child{margin-bottom:.6rem}article .admonition .admonition,article details .admonition,article .admonition details,article details details{margin:1em 0}article .admonition>.admonition-title,article details>.admonition-title,article .admonition>summary,article details>summary{margin:0 -.6rem;padding:.4rem .6rem .4rem .5rem;border-bottom:.05rem solid rgba(68,138,255,0.1);background-color:rgba(68,138,255,0.1);font-weight:700}[dir="rtl"] article .admonition>.admonition-title,[dir="rtl"] article details>.admonition-title,[dir="rtl"] article .admonition>summary,[dir="rtl"] article details>summary{padding:.4rem 2rem .4rem .6rem}article .admonition>.admonition-title:last-child,article details>.admonition-title:last-child,article .admonition>summary:last-child,article details>summary:last-child{margin-bottom:0}article .admonition.summary,article details.summary,article .admonition.tldr,article details.tldr,article .admonition.abstract,article details.abstract{border-left-color:#00b0ff}[dir="rtl"] article .admonition.summary,[dir="rtl"] article details.summary,[dir="rtl"] article .admonition.tldr,[dir="rtl"] article details.tldr,[dir="rtl"] article .admonition.abstract,[dir="rtl"] article details.abstract{border-right-color:#00b0ff}article .admonition.summary>.admonition-title,article details.summary>.admonition-title,article .admonition.tldr>.admonition-title,article details.tldr>.admonition-title,article .admonition.summary>summary,article details.summary>summary,article .admonition.tldr>summary,article details.tldr>summary,article .admonition.abstract>.admonition-title,article details.abstract>.admonition-title,article .admonition.abstract>summary,article details.abstract>summary{border-bottom-color:rgba(0,176,255,0.1);background-color:rgba(0,176,255,0.1)}article .admonition.todo,article details.todo,article .admonition.info,article details.info{border-left-color:#00b8d4}[dir="rtl"] article .admonition.todo,[dir="rtl"] article details.todo,[dir="rtl"] article .admonition.info,[dir="rtl"] article details.info{border-right-color:#00b8d4}article .admonition.todo>.admonition-title,article details.todo>.admonition-title,article .admonition.todo>summary,article details.todo>summary,article .admonition.info>.admonition-title,article details.info>.admonition-title,article .admonition.info>summary,article details.info>summary{border-bottom-color:rgba(0,184,212,0.1);background-color:rgba(0,184,212,0.1)}article .admonition.hint,article details.hint,article .admonition.important,article details.important,article .admonition.tip,article details.tip{border-left-color:#00bfa5}[dir="rtl"] article .admonition.hint,[dir="rtl"] article details.hint,[dir="rtl"] article .admonition.important,[dir="rtl"] article details.important,[dir="rtl"] article .admonition.tip,[dir="rtl"] article details.tip{border-right-color:#00bfa5}article .admonition.hint>.admonition-title,article details.hint>.admonition-title,article .admonition.important>.admonition-title,article details.important>.admonition-title,article .admonition.hint>summary,article details.hint>summary,article .admonition.important>summary,article details.important>summary,article .admonition.tip>.admonition-title,article details.tip>.admonition-title,article .admonition.tip>summary,article details.tip>summary{border-bottom-color:rgba(0,191,165,0.1);background-color:rgba(0,191,165,0.1)}article .admonition.check,article details.check,article .admonition.done,article details.done,article .admonition.success,article details.success{border-left-color:#00c853}[dir="rtl"] article .admonition.check,[dir="rtl"] article details.check,[dir="rtl"] article .admonition.done,[dir="rtl"] article details.done,[dir="rtl"] article .admonition.success,[dir="rtl"] article details.success{border-right-color:#00c853}article .admonition.check>.admonition-title,article details.check>.admonition-title,article .admonition.done>.admonition-title,article details.done>.admonition-title,article .admonition.check>summary,article details.check>summary,article .admonition.done>summary,article details.done>summary,article .admonition.success>.admonition-title,article details.success>.admonition-title,article .admonition.success>summary,article details.success>summary{border-bottom-color:rgba(0,200,83,0.1);background-color:rgba(0,200,83,0.1)}article .admonition.help,article details.help,article .admonition.faq,article details.faq,article .admonition.question,article details.question{border-left-color:#64dd17}[dir="rtl"] article .admonition.help,[dir="rtl"] article details.help,[dir="rtl"] article .admonition.faq,[dir="rtl"] article details.faq,[dir="rtl"] article .admonition.question,[dir="rtl"] article details.question{border-right-color:#64dd17}article .admonition.help>.admonition-title,article details.help>.admonition-title,article .admonition.faq>.admonition-title,article details.faq>.admonition-title,article .admonition.help>summary,article details.help>summary,article .admonition.faq>summary,article details.faq>summary,article .admonition.question>.admonition-title,article details.question>.admonition-title,article .admonition.question>summary,article details.question>summary{border-bottom-color:rgba(100,221,23,0.1);background-color:rgba(100,221,23,0.1)}article .admonition.caution,article details.caution,article .admonition.attention,article details.attention,article .admonition.warning,article details.warning{border-left-color:#ff9100}[dir="rtl"] article .admonition.caution,[dir="rtl"] article details.caution,[dir="rtl"] article .admonition.attention,[dir="rtl"] article details.attention,[dir="rtl"] article .admonition.warning,[dir="rtl"] article details.warning{border-right-color:#ff9100}article .admonition.caution>.admonition-title,article details.caution>.admonition-title,article .admonition.attention>.admonition-title,article details.attention>.admonition-title,article .admonition.caution>summary,article details.caution>summary,article .admonition.attention>summary,article details.attention>summary,article .admonition.warning>.admonition-title,article details.warning>.admonition-title,article .admonition.warning>summary,article details.warning>summary{border-bottom-color:rgba(255,145,0,0.1);background-color:rgba(255,145,0,0.1)}article .admonition.fail,article details.fail,article .admonition.missing,article details.missing,article .admonition.failure,article details.failure{border-left-color:#ff5252}[dir="rtl"] article .admonition.fail,[dir="rtl"] article details.fail,[dir="rtl"] article .admonition.missing,[dir="rtl"] article details.missing,[dir="rtl"] article .admonition.failure,[dir="rtl"] article details.failure{border-right-color:#ff5252}article .admonition.fail>.admonition-title,article details.fail>.admonition-title,article .admonition.missing>.admonition-title,article details.missing>.admonition-title,article .admonition.fail>summary,article details.fail>summary,article .admonition.missing>summary,article details.missing>summary,article .admonition.failure>.admonition-title,article details.failure>.admonition-title,article .admonition.failure>summary,article details.failure>summary{border-bottom-color:rgba(255,82,82,0.1);background-color:rgba(255,82,82,0.1)}article .admonition.error,article details.error,article .admonition.danger,article details.danger{border-left-color:#ff1744}[dir="rtl"] article .admonition.error,[dir="rtl"] article details.error,[dir="rtl"] article .admonition.danger,[dir="rtl"] article details.danger{border-right-color:#ff1744}article .admonition.error>.admonition-title,article details.error>.admonition-title,article .admonition.error>summary,article details.error>summary,article .admonition.danger>.admonition-title,article details.danger>.admonition-title,article .admonition.danger>summary,article details.danger>summary{border-bottom-color:rgba(255,23,68,0.1);background-color:rgba(255,23,68,0.1)}article .admonition.bug,article details.bug{border-left-color:#f50057}[dir="rtl"] article .admonition.bug,[dir="rtl"] article details.bug{border-right-color:#f50057}article .admonition.bug>.admonition-title,article details.bug>.admonition-title,article .admonition.bug>summary,article details.bug>summary{border-bottom-color:rgba(245,0,87,0.1);background-color:rgba(245,0,87,0.1)}article .admonition.example,article details.example{border-left-color:#651fff}[dir="rtl"] article .admonition.example,[dir="rtl"] article details.example{border-right-color:#651fff}article .admonition.example>.admonition-title,article details.example>.admonition-title,article .admonition.example>summary,article details.example>summary{border-bottom-color:rgba(101,31,255,0.1);background-color:rgba(101,31,255,0.1)}article .admonition.cite,article details.cite,article .admonition.quote,article details.quote{border-left-color:#9e9e9e}[dir="rtl"] article .admonition.cite,[dir="rtl"] article details.cite,[dir="rtl"] article .admonition.quote,[dir="rtl"] article details.quote{border-right-color:#9e9e9e}article .admonition.cite>.admonition-title,article details.cite>.admonition-title,article .admonition.cite>summary,article details.cite>summary,article .admonition.quote>.admonition-title,article details.quote>.admonition-title,article .admonition.quote>summary,article details.quote>summary{border-bottom-color:rgba(158,158,158,0.1);background-color:rgba(158,158,158,0.1)}.codehilite .o,article .highlight .o{color:inherit}.codehilite .ow,article .highlight .ow{color:inherit}.codehilite .ge,article .highlight .ge{color:#000}.codehilite .gr,article .highlight .gr{color:#a00}.codehilite .gh,article .highlight .gh{color:#999}.codehilite .go,article .highlight .go{color:#888}.codehilite .gp,article .highlight .gp{color:#555}.codehilite .gs,article .highlight .gs{color:inherit}.codehilite .gu,article .highlight .gu{color:#aaa}.codehilite .gt,article .highlight .gt{color:#a00}.codehilite .gd,article .highlight .gd{background-color:#fdd}.codehilite .gi,article .highlight .gi{background-color:#dfd}.codehilite .k,article .highlight .k{color:#3B78E7}.codehilite .kc,article .highlight .kc{color:#A71D5D}.codehilite .kd,article .highlight .kd{color:#3B78E7}.codehilite .kn,article .highlight .kn{color:#3B78E7}.codehilite .kp,article .highlight .kp{color:#A71D5D}.codehilite .kr,article .highlight .kr{color:#3E61A2}.codehilite .kt,article .highlight .kt{color:#3E61A2}.codehilite .c,article .highlight .c{color:#999}.codehilite .cm,article .highlight .cm{color:#999}.codehilite .cp,article .highlight .cp{color:#666}.codehilite .c1,article .highlight .c1{color:#999}.codehilite .ch,article .highlight .ch{color:#999}.codehilite .cs,article .highlight .cs{color:#999}.codehilite .na,article .highlight .na{color:#C2185B}.codehilite .nb,article .highlight .nb{color:#C2185B}.codehilite .bp,article .highlight .bp{color:#3E61A2}.codehilite .nc,article .highlight .nc{color:#C2185B}.codehilite .no,article .highlight .no{color:#3E61A2}.codehilite .nd,article .highlight .nd{color:#666}.codehilite .ni,article .highlight .ni{color:#666}.codehilite .ne,article .highlight .ne{color:#C2185B}.codehilite .nf,article .highlight .nf{color:#C2185B}.codehilite .nl,article .highlight .nl{color:#3B5179}.codehilite .nn,article .highlight .nn{color:#EC407A}.codehilite .nt,article .highlight .nt{color:#3B78E7}.codehilite .nv,article .highlight .nv{color:#3E61A2}.codehilite .vc,article .highlight .vc{color:#3E61A2}.codehilite .vg,article .highlight .vg{color:#3E61A2}.codehilite .vi,article .highlight .vi{color:#3E61A2}.codehilite .nx,article .highlight .nx{color:#EC407A}.codehilite .m,article .highlight .m{color:#E74C3C}.codehilite .mf,article .highlight .mf{color:#E74C3C}.codehilite .mh,article .highlight .mh{color:#E74C3C}.codehilite .mi,article .highlight .mi{color:#E74C3C}.codehilite .il,article .highlight .il{color:#E74C3C}.codehilite .mo,article .highlight .mo{color:#E74C3C}.codehilite .s,article .highlight .s{color:#0D904F}.codehilite .sb,article .highlight .sb{color:#0D904F}.codehilite .sc,article .highlight .sc{color:#0D904F}.codehilite .sd,article .highlight .sd{color:#999}.codehilite .s2,article .highlight .s2{color:#0D904F}.codehilite .se,article .highlight .se{color:#183691}.codehilite .sh,article .highlight .sh{color:#183691}.codehilite .si,article .highlight .si{color:#183691}.codehilite .sx,article .highlight .sx{color:#183691}.codehilite .sr,article .highlight .sr{color:#009926}.codehilite .s1,article .highlight .s1{color:#0D904F}.codehilite .ss,article .highlight .ss{color:#0D904F}.codehilite .err,article .highlight .err{color:#A61717}.codehilite .w,article .highlight .w{color:rgba(0,0,0,0)}.codehilite .hll,article .highlight .hll{display:block;margin:0 -.6rem;padding:0 .6rem;background-color:rgba(255,235,59,0.5)}@media only screen and (max-width: 44.9375em){.codehilite .hll,article .highlight .hll{margin:0 -.8rem;padding:0 .8rem}}article .codehilite,article .highlight{position:relative;margin:1em 0;padding:0;border-radius:.1rem;background-color:rgba(236,236,236,0.5);color:#37474F;line-height:1.4;-webkit-overflow-scrolling:touch}article .codehilite pre,article .highlight pre,article .codehilite code,article .highlight code{display:block;margin:0;padding:.525rem .6rem;background-color:transparent;overflow:auto;vertical-align:top}article .codehilite pre::-webkit-scrollbar,article .highlight pre::-webkit-scrollbar,article .codehilite code::-webkit-scrollbar,article .highlight code::-webkit-scrollbar{width:.2rem;height:.2rem}article .codehilite pre::-webkit-scrollbar-thumb,article .highlight pre::-webkit-scrollbar-thumb,article .codehilite code::-webkit-scrollbar-thumb,article .highlight code::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0.26)}article .codehilite pre::-webkit-scrollbar-thumb:hover,article .highlight pre::-webkit-scrollbar-thumb:hover,article .codehilite code::-webkit-scrollbar-thumb:hover,article .highlight code::-webkit-scrollbar-thumb:hover{background-color:#536dfe}article pre.codehilite,article pre.highlight{overflow:visible}article pre.codehilite code,article pre.highlight code{display:block;padding:.525rem .6rem;overflow:auto}article .codehilitetable,article .highlighttable{display:block;margin:1em 0;border-radius:0.2em;font-size:1rem;overflow:hidden}article .codehilitetable tbody,article .highlighttable tbody,article .codehilitetable td,article .highlighttable td{display:block;padding:0}article .codehilitetable tr,article .highlighttable tr{display:flex}article .codehilitetable .codehilite,article .highlighttable .codehilite,article .codehilitetable .highlight,article .highlighttable .highlight,article .codehilitetable .linenodiv,article .highlighttable .linenodiv{margin:0;border-radius:0}article .codehilitetable .linenodiv,article .highlighttable .linenodiv{padding:.525rem .6rem}article .codehilitetable .linenos,article .highlighttable .linenos{background-color:rgba(0,0,0,0.07);color:rgba(0,0,0,0.26);user-select:none}article .codehilitetable .linenos pre,article .highlighttable .linenos pre{margin:0;padding:0;background-color:transparent;color:inherit;text-align:right}article .codehilitetable .code,article .highlighttable .code{flex:1;overflow:hidden}@media only screen and (max-width: 44.9375em){article>.codehilite,article>.highlight{margin:1em -.8rem;border-radius:0}article>.codehilite pre,article>.highlight pre,article>.codehilite code,article>.highlight code{padding:.525rem .8rem}}article>.codehilitetable,article>.highlighttable{box-shadow:none}@media only screen and (max-width: 44.9375em){article>.codehilitetable,article>.highlighttable{margin:1em -.8rem;border-radius:0}article>.codehilitetable .codehilite>pre,article>.highlighttable .codehilite>pre,article>.codehilitetable .highlight>pre,article>.highlighttable .highlight>pre,article>.codehilitetable .codehilite>code,article>.highlighttable .codehilite>code,article>.codehilitetable .highlight>code,article>.highlighttable .highlight>code,article>.codehilitetable .linenodiv,article>.highlighttable .linenodiv{padding:.5rem .8rem}}article [id^="fnref:"]{display:inline-block}article [id^="fnref:"]:target{margin-top:-3.8rem;padding-top:3.8rem;pointer-events:none}article [id^="fn:"]::before{display:none;height:0;content:""}article [id^="fn:"]:target::before{display:block;margin-top:-3.5rem;padding-top:3.5rem;pointer-events:none}article .footnote{color:rgba(0,0,0,0.54);font-size:.8rem}article .footnote ol{margin-left:0}article .footnote li{transition:color 0.25s}article .footnote li:target{color:rgba(0,0,0,0.87)}article .footnote li :first-child{margin-top:0}article .footnote li:hover .footnote-backref,article .footnote li:target .footnote-backref{transform:translateX(0);opacity:1}article .footnote li:hover .footnote-backref:hover,article .footnote li:target .footnote-backref{color:#536dfe}article .footnote-ref{display:inline-block;pointer-events:initial}article .footnote-ref::before{display:inline;margin:0 0.2em;border-left:.05rem solid rgba(0,0,0,0.26);font-size:1.25em;content:"";vertical-align:-.25rem}article .footnote-backref{display:inline-block;transform:translateX(.25rem);transition:transform 0.25s 0.125s, color 0.25s, opacity 0.125s 0.125s;color:rgba(0,0,0,0.26);font-size:0;opacity:0;vertical-align:text-bottom}[dir="rtl"] article .footnote-backref{transform:translateX(-.25rem)}article .footnote-backref::before{display:inline-block;font-size:.8rem;content:"\E31B"}[dir="rtl"] article .footnote-backref::before{transform:scaleX(-1)}article .MJXc-display{margin:0.75em 0;padding:0.75em 0;overflow:auto;-webkit-overflow-scrolling:touch}@media only screen and (max-width: 44.9375em){article>p>.MJXc-display{margin:0.75em -.8rem;padding:0.25em .8rem}}article .MathJax_CHTML{outline:0}article del.critic,article ins.critic,article .critic.comment{margin:0 0.25em;padding:0.0625em 0;border-radius:.1rem;box-decoration-break:clone}article del.critic{background-color:#fdd;box-shadow:0.25em 0 0 #fdd,-0.25em 0 0 #fdd}article ins.critic{background-color:#dfd;box-shadow:0.25em 0 0 #dfd,-0.25em 0 0 #dfd}article .critic.comment{background-color:rgba(236,236,236,0.5);color:#37474F;box-shadow:0.25em 0 0 rgba(236,236,236,0.5),-0.25em 0 0 rgba(236,236,236,0.5)}article .critic.comment::before{padding-right:0.125em;color:rgba(0,0,0,0.26);content:"\E0B7";vertical-align:-0.125em}article .critic.block{display:block;margin:1em 0;padding-right:.8rem;padding-left:.8rem;box-shadow:none}article .critic.block :first-child{margin-top:0.5em}article .critic.block :last-child{margin-bottom:0.5em}article details{display:block;padding-top:0}article details[open]>summary::after{transform:rotate(180deg)}article details:not([open]){padding-bottom:0}article details:not([open])>summary{border-bottom:none}article details summary{padding-right:2rem}[dir="rtl"] article details summary{padding-left:2rem}.no-details article details:not([open])>*{display:none}.no-details article details:not([open]) summary{display:block}article summary{display:block;outline:none;cursor:pointer}article summary::-webkit-details-marker{display:none}article summary::after{position:absolute;top:.4rem;right:.6rem;color:rgba(0,0,0,0.26);font-size:1rem;content:"\E313"}[dir="rtl"] article summary::after{right:initial;left:.6rem}article .emojione{width:1rem;vertical-align:text-top}article code.codehilite,article code.highlight{margin:0 0.29412em;padding:0.07353em 0}article .superfences-content{display:none;order:99;width:100%;background-color:#fff}article .superfences-content>*{margin:0;border-radius:0}article .superfences-tabs{display:flex;position:relative;flex-wrap:wrap;margin:1em 0;border:.05rem solid rgba(0,0,0,0.07);border-radius:0.2em}article .superfences-tabs>input{display:none}article .superfences-tabs>input:checked+label{font-weight:700}article .superfences-tabs>input:checked+label+.superfences-content{display:block}article .superfences-tabs>label{width:auto;padding:.6rem;transition:color 0.125s;font-size:.8rem;cursor:pointer}html article .superfences-tabs>label:hover{color:#536dfe}@media only screen and (max-width: 44.9375em){article>.superfences-tabs{margin:1em -.8rem;border:0;border-top:.05rem solid rgba(0,0,0,0.07);border-radius:0}article>.superfences-tabs pre,article>.superfences-tabs code{padding:.525rem .8rem}}article .task-list-item{position:relative;list-style-type:none}article .task-list-item [type="checkbox"]{position:absolute;top:0.45em;left:-2em}[dir="rtl"] article .task-list-item [type="checkbox"]{right:-2em;left:initial}article .task-list-control .task-list-indicator::before{position:absolute;top:0.15em;left:-1.25em;color:rgba(0,0,0,0.26);font-size:1.25em;content:"\E835";vertical-align:-0.25em}[dir="rtl"] article .task-list-control .task-list-indicator::before{right:-1.25em;left:initial}article .task-list-control [type="checkbox"]:checked+.task-list-indicator::before{content:"\E834"}article .task-list-control [type="checkbox"]{opacity:0;z-index:-1}@font-face{font-family:Fira Sans;font-weight:400;src:url(FiraSans-Regular.otf)}@font-face{font-family:Fira Sans;font-style:italic;font-weight:400;src:url(FiraSans-Italic.otf)}@font-face{font-family:Fira Sans;font-weight:300;src:url(FiraSans-Light.otf)}@font-face{font-family:Fira Sans;font-style:italic;font-weight:300;src:url(FiraSans-LightItalic.otf)}@font-face{font-family:Fira Sans;font-weight:bold;src:url(FiraSans-Bold.otf)}@page{@top-left{background:#3f51b5;content:counter(page);height:1cm;color:#fff;text-align:center;width:1cm}@top-center{background:#3f51b5;content:'';display:block;height:.05cm;opacity:.5;width:100%}@top-right{content:string(heading);font-size:9pt;height:1cm;vertical-align:middle;width:100%}@bottom-right{content:string(copyright);font-size:9pt;height:1cm;vertical-align:middle;width:100%}}@page :blank{@top-left{background:none;content:''}@top-center{content:none}@top-right{content:none}@bottom-right{content:none}}@page no-chapter{@top-left{background:none;content:none}@top-center{content:none}@top-right{content:none}@bottom-right{content:none}}@page :first{background:url(../img/logo.png) no-repeat center;background-size:auto;margin:0;counter-reset:page -1}html{color:#393939;font-family:Fira Sans, helvetica, arial;font-size:11pt;font-weight:300;line-height:1.5}html article#doc-cover h1#doc-title{color:#3f51b5;font-size:38pt;margin:5cm 2cm 0 2cm;page:no-chapter;width:100%}html body article#doc-cover{break-after:right;align-content:space-between;display:flex;flex-wrap:wrap;margin:0;height:297mm}html body article#doc-cover address{background:#3f51b5;flex:1;color:#fff;margin:0 -2cm;padding:1cm 0;font-style:normal;white-space:pre-wrap}html body article#doc-cover address:last-of-type{padding-right:3cm;text-align:right}html body article#doc-cover address:first-of-type{padding-left:3cm}html body article#doc-cover address p{margin:0;padding:0}html body article#doc-cover address p#copyright{string-set:copyright content()}@page chapter{background:#3f51b5;margin:0;@top-left{content:none}@top-center{content:none}@top-right{content:none}}.html iframe,html img,.html svg{max-width:100%;margin-top:5px}html body h1{color:#3f51b5;string-set:heading content()}html body h2,html body h3,html body h4{color:black;font-weight:400}html body h2{font-size:20pt}html body h3{font-weight:300;font-size:15pt}html body h4{font-size:13pt}html body article{break-before:always}html body article video source::before{content:attr(src)}html body article video[src]::before{content:attr(data-title) " https://mkpdfs.comwes.eu" attr(src)}h2,h3,h4,h5{margin-bottom:0.1em}html body article h1 a.external-link::after,html body article h2 a.external-link::after,html body article h3 a.external-link::after,html body article h4 a.external-link::after,html body article h5 a.external-link::after,html body article h6 a.external-link::after{content:none}html body article a{color:#3f51b5;text-decoration:none}html body article a.external-link::after{content:" (" attr(href) ")";font-style:italic}html body article table{border-spacing:0;border-collapse:collapse}html body article table tr{border-bottom:1px solid #888}html body article table tr td{padding:4px 7px}html body article#contents{break-before:right;break-after:left;page:no-chapter}html body article#contents h2{font-size:20pt;font-weight:400;margin-bottom:3cm}html body article#contents h3{font-weight:500;margin:3em 0 1em}html body article#contents h3::before{background:#3f51b5;content:'';display:block;height:.08cm;margin-bottom:.25cm;width:2cm}html body article#contents ul{list-style:none;padding-left:.5cm}html body article#contents ul li{border-top:.25pt solid #c1c1c1;margin:.15cm 0;padding-top:.15cm}html body article#contents ul li::before{color:#3f51b5;content:'• ';font-size:40pt;line-height:16pt;vertical-align:bottom}html body article#contents ul li a{color:inherit;text-decoration:inherit}html body article#contents>ul{list-style:none;padding-left:0}html body article#contents div h4 a::after,html body article#contents ul li a::after{color:#3f51b5;content:target-counter(attr(href), page);float:right}html body article#contents div h4{margin:.15cm 0;padding-top:0;padding-bottom:0}html body article#contents div h4 a{color:inherit}html body article p{text-align:justify}
diff --git a/docs/css/version_select.css b/docs/css/version_select.css
new file mode 100644
index 000000000..aaf972599
--- /dev/null
+++ b/docs/css/version_select.css
@@ -0,0 +1,12 @@
+#version-selector {
+ float: right;
+ display: flex;
+ align-items: center;
+ margin: 0 10px;
+}
+
+#version-selector > select {
+ width: auto;
+ height: auto;
+ padding: 1px;
+}
diff --git a/docs/events.md b/docs/events.md
new file mode 100644
index 000000000..8df1a6cb1
--- /dev/null
+++ b/docs/events.md
@@ -0,0 +1,98 @@
+# Events
+
+Geyser has an Event Manager that allows one to listen to or trigger an event easily. Events can be easily defined
+either by defining a method to be an event handler or by providing a lambda. Each event handler will be executed
+in turn based upon their priority.
+
+## Triggering an Event
+
+An event is derived from either `GeyserEvent` or `CancellableGeyserEvent`.
+
+!!! example
+ ```java
+ public class MyCustomEvent extends GeyserEvent {
+ }
+ ```
+
+The event is triggered through the `triggerEvent` method of the Event Manager.
+
+!!! example
+ ```java
+ eventManager.triggerEvent(new MyCustomEvent());
+ ```
+
+## Listening to an Event
+
+There are two ways to listen for an event. One can either create an event handler method or one can create an anonymous
+lamda to be executed when the event is triggered.
+
+
+### Class Event Handler
+
+An event handler method is a method that is annotated with `@Event`. The class it belongs to must also be registered
+with the event manager.
+
+!!! example
+ ```java
+ public class MyClass {
+
+ @Event
+ public void onEnable(EventContext ctx, MyCustomEvent event) {
+ System.err.println("Hello World");
+ }
+ }
+
+ ...
+
+ GeyserConnecter.getInstance().getEventManager.registerEvents(new MyClass());
+ ```
+
+!!! important
+ Plugins should use the `registerEvents` method inherited from `GeyserPlugin`.
+
+The `@Event` annotation has the following optional parameters:
+
+* **priority** - Integer from 0 - 100. Default `50`. Event Handlers are executed in order from lowest to highest priority.
+* **ignoreCancelled** - Boolean. Default `true`. If true then if an event is cancelled the handler will not be executed.
+
+The `EventContext` will be discussed later. `EnableEvent` is an event and is also discussed later.
+
+### Anonymous Lambda
+
+An event can be hooked through the `on` method of the EventManager provided with an anonymous function. This allows
+code to be placed logically close to where it is related in the code instead of having to set up a separate class and
+method listeners.
+
+!!! example
+ ```java
+ GeyserConnector.getInstance().getEventManager().on(MyCustomEvent.class, (ctx, event) -> {
+ System.err.println("Hello World");
+ });
+ ```
+
+!!! important
+ Plugins should use the `on` method inherited from `GeyserPlugin`.
+
+This method takes 2 optional parameters specifying the priority of the event and if the handler should ignore cancelled events.
+
+
+### Event Context
+
+The event handler receives an EventContext in addition to the Event class. The EventContext holds anything related to the
+EventHandler itself and presently only allows an EventHandler to `unregister` itself.
+
+
+## Events
+
+Geyser has the following predefined Events.
+
+### DisableEvent
+
+Triggered when a Plugin is disabled.
+
+### EnableEvent
+**cancellable**
+
+Triggered when a Plugin is enabled. If cancelled then the plugin will be unloaded and no `DisableEvent` will be triggered.
+
+
diff --git a/docs/img/favicon.ico b/docs/img/favicon.ico
new file mode 100644
index 000000000..5ec0a732a
Binary files /dev/null and b/docs/img/favicon.ico differ
diff --git a/docs/img/header_logo.png b/docs/img/header_logo.png
new file mode 100644
index 000000000..2e29d638b
Binary files /dev/null and b/docs/img/header_logo.png differ
diff --git a/docs/img/title.png b/docs/img/title.png
new file mode 100644
index 000000000..e0a39b145
Binary files /dev/null and b/docs/img/title.png differ
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 000000000..ede585263
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,32 @@
+
+
+Geyser is a bridge between Minecraft: Bedrock Edition and Minecraft: Java Edition, closing the gap from those wanting to play true cross-platform.
+
+Geyser is an open collaboration project by CubeCraft Games.
+
+## What is Geyser?
+Geyser is a proxy, bridging the gap between Minecraft: Bedrock Edition and Minecraft: Java Edition servers.
+The ultimate goal of this project is to allow Minecraft: Bedrock Edition users to join Minecraft: Java Edition servers as seamlessly as possible. **Please note, this project is still a work in progress and should not be used on production. Expect bugs!**
+
+Special thanks to the DragonProxy project for being a trailblazer in protocol translation and for all the team members who have now joined us here!
+
+!!! note
+ Currently supporting Minecraft Bedrock v1.14.6(0) and Minecraft Java v1.15.2.
+
+## Setting Up
+Take a look [here](https://github.com/GeyserMC/Geyser/wiki#Setup) for how to set up Geyser.
+
+[](https://www.youtube.com/watch?v=U7dZZ8w7Gi4)
+
+## Links:
+- Website: https://geysermc.org
+- Docs: https://github.com/GeyserMC/Geyser/wiki
+- Download: http://ci.geysermc.org
+- Discord: http://discord.geysermc.org/
+- Donate: https://patreon.com/GeyserMC
+
+## Libraries Used:
+- [NukkitX Bedrock Protocol Library](https://github.com/NukkitX/Protocol)
+- [Steveice10's Java Protocol Library](https://github.com/Steveice10/MCProtocolLib)
+- [TerminalConsoleAppender](https://github.com/Minecrell/TerminalConsoleAppender)
+- [Simple Logging Facade for Java (slf4j)](https://github.com/qos-ch/slf4j)
diff --git a/docs/js/version_select.js b/docs/js/version_select.js
new file mode 100644
index 000000000..5ff76f1a3
--- /dev/null
+++ b/docs/js/version_select.js
@@ -0,0 +1,47 @@
+window.addEventListener("DOMContentLoaded", function() {
+ var BASE_URL = window.location.origin + "/" + window.location.pathname.split("/")[1];
+ var CURRENT_VERSION = window.location.pathname.split("/")[3];
+ var CURRENT_LANGUAGE = window.location.pathname.split("/")[2];
+
+ function makeSelect(options, selected) {
+ var select = document.createElement("select");
+ select.classList.add("form-control");
+
+ options.forEach(function(i) {
+ var option = new Option(i.text, i.value, undefined,
+ i.value === selected);
+ select.add(option);
+ });
+
+ return select;
+ }
+
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", BASE_URL + "/versions.json");
+ xhr.onload = function() {
+ var versions = JSON.parse(this.responseText);
+
+ var realVersion = versions.find(function(i) {
+ return i.version === CURRENT_VERSION ||
+ i.aliases.includes(CURRENT_VERSION);
+ }).version;
+
+ var select = makeSelect(versions.map(function(i) {
+ return {text: i.title, value: i.version};
+ }), realVersion);
+ select.addEventListener("change", function(event) {
+ window.location.href = BASE_URL + "/" + CURRENT_LANGUAGE + "/" + this.value;
+ });
+
+ var container = document.createElement("div");
+ container.id = "version-selector";
+ container.appendChild(select);
+
+ var title = document.querySelector("nav.md-header-nav");
+ var height = window.getComputedStyle(title).getPropertyValue("height");
+ container.style.height = height;
+
+ title.appendChild(container);
+ };
+ xhr.send();
+});
\ No newline at end of file
diff --git a/docs/plugins.md b/docs/plugins.md
new file mode 100644
index 000000000..534e9f840
--- /dev/null
+++ b/docs/plugins.md
@@ -0,0 +1,108 @@
+# Plugins
+
+Geyser provides support for third party plugins which can be placed into a `plugins` folder under the Geyser data folder.
+
+Plugins provide a way to extend the features of Geyser without needing to deal with the Geyser code. It is hoped that
+developers will be able to create plugins that would be of use to others.
+
+This page describes how to write a plugin.
+
+## Maven
+
+Add the following to the relevant section of your `pom.xml`
+
+```xml
+
+
+
+ bundabrg-repo
+ https://repo.worldguard.com.au/repository/maven-public
+
+ true
+
+
+ true
+
+
+
+
+
+
+
+ org.geysermc
+ connector
+ 1.0-SNAPSHOT
+ provided
+
+
+```
+
+!!! info
+ Plugin support is presently only available through a feature branch and thus there will be references to a third party
+ maven repository that holds a build of this branch. This will change in the future.
+
+
+## Example Plugin
+
+```java
+ @Plugin(
+ name = "ExamplePlugin",
+ version = "1.1.0-dev",
+ authors = {"bundabrg"},
+ description = "Provides an example plugin"
+ )
+ public class MyPlugin extends GeyserPlugin {
+ public MyPlugin(PluginManager pluginManager, PluginClassLoader pluginClassLoader) {
+ super(pluginManager, pluginClassLoader);
+ }
+
+ @Event
+ public void onEnable(EventContext ctx, EnableEvent event) {
+ System.err.println("I'm alive");
+
+ // Register another class with event handlers
+ registerEvents(new MyAdditionalClass());
+
+ // Example of lambda event hook
+ on(DisableEvent.class, (ctx, event) -> {
+ System.err.println("I'm also dead");
+ }, PRIORITY.HIGH);
+ }
+
+ @Event
+ public void onDisable(EventContext ctx, DisableEvent event) {
+ System.err.println("I'm dead");
+ }
+
+ }
+```
+
+## Plugin EntryPoint
+
+A plugin must at a minimum define a class that extends `GeyserPlugin` and be annotated with `@Plugin`. The annotation
+provides details about the plugin such as its version and author(s).
+
+The following fields are available for `@Plugin`:
+
+* **name** - Name of the plugin. Used in the logs.
+* **version** - Version of the plugin.
+* **authors** - A list of authors
+* **description** - A short description of the plugin
+* **global** - Should the plugin make its classes available to other plugins (default: true)
+
+## Plugin Events
+
+A plugin will generally hook into several events and provides its own event registration inherited from `GeyserPlugin`.
+
+A plugin class will look for any methods annotated with `@Event` and will treat them as Event Handlers, using reflection
+to determine which event is being trapped. In the previous example the plugin has trapped both the `EnableEvent` and `DisableEvent`.
+
+Please refer to [events](events.md) for more information about the event system.
+
+!!! note
+ There is no need to register the plugin class for events as it will be registered by default.
+
+!!! note
+ The plugin class itself provides many of the registration methods found in the Event Manager to track which events belong to the plugin. You
+ should use the plugins own registration methods in preference to those in the Event Manger. This includes
+ `registerEvents` and `on`.
diff --git a/docs/theme/pdf/.gitignore b/docs/theme/pdf/.gitignore
new file mode 100644
index 000000000..c7a001aab
--- /dev/null
+++ b/docs/theme/pdf/.gitignore
@@ -0,0 +1,11 @@
+*.tgz
+.yarn-integrity
+
+pids
+*.pid
+*.seed
+*.pid.lock
+report.css
+node_modules/
+jspm_packages/
+.npm
diff --git a/docs/theme/pdf/FiraSans-Bold.otf b/docs/theme/pdf/FiraSans-Bold.otf
new file mode 100644
index 000000000..78cc4620a
Binary files /dev/null and b/docs/theme/pdf/FiraSans-Bold.otf differ
diff --git a/docs/theme/pdf/FiraSans-Italic.otf b/docs/theme/pdf/FiraSans-Italic.otf
new file mode 100644
index 000000000..92c347246
Binary files /dev/null and b/docs/theme/pdf/FiraSans-Italic.otf differ
diff --git a/docs/theme/pdf/FiraSans-Light.otf b/docs/theme/pdf/FiraSans-Light.otf
new file mode 100644
index 000000000..609d864ec
Binary files /dev/null and b/docs/theme/pdf/FiraSans-Light.otf differ
diff --git a/docs/theme/pdf/FiraSans-LightItalic.otf b/docs/theme/pdf/FiraSans-LightItalic.otf
new file mode 100644
index 000000000..735f9d3cd
Binary files /dev/null and b/docs/theme/pdf/FiraSans-LightItalic.otf differ
diff --git a/docs/theme/pdf/FiraSans-Regular.otf b/docs/theme/pdf/FiraSans-Regular.otf
new file mode 100644
index 000000000..8d20d7237
Binary files /dev/null and b/docs/theme/pdf/FiraSans-Regular.otf differ
diff --git a/docs/theme/pdf/LICENSE b/docs/theme/pdf/LICENSE
new file mode 100644
index 000000000..14e864749
--- /dev/null
+++ b/docs/theme/pdf/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 Gerry Ntabuhashe
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/theme/pdf/README.md b/docs/theme/pdf/README.md
new file mode 100644
index 000000000..fb803c034
--- /dev/null
+++ b/docs/theme/pdf/README.md
@@ -0,0 +1,2 @@
+# mkpdfs-design-sample
+An mkpdfs design sample to customize the layout of generated pdfs
diff --git a/docs/theme/pdf/fonts/font-awesome.css b/docs/theme/pdf/fonts/font-awesome.css
new file mode 100644
index 000000000..b569bb4d9
--- /dev/null
+++ b/docs/theme/pdf/fonts/font-awesome.css
@@ -0,0 +1,2930 @@
+/*!
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+
+@font-face {
+ font-family: FontAwesome;
+ font-style: normal;
+ font-weight: 400;
+ src: url("specimen/FontAwesome.woff2") format("woff2"),
+ url("specimen/FontAwesome.woff") format("woff"),
+ url("specimen/FontAwesome.ttf") format("truetype");
+}
+
+/* stylelint-disable */
+
+.fa {
+ display: inline-block;
+ font: normal normal normal 14px/1 FontAwesome;
+ font-size: inherit;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale
+}
+
+.fa-lg {
+ font-size: 1.33333333em;
+ line-height: .75em;
+ vertical-align: -15%
+}
+
+.fa-2x {
+ font-size: 2em
+}
+
+.fa-3x {
+ font-size: 3em
+}
+
+.fa-4x {
+ font-size: 4em
+}
+
+.fa-5x {
+ font-size: 5em
+}
+
+.fa-fw {
+ width: 1.28571429em;
+ text-align: center
+}
+
+.fa-ul {
+ padding-left: 0;
+ margin-left: 2.14285714em;
+ list-style-type: none
+}
+
+.fa-ul>li {
+ position: relative
+}
+
+.fa-li {
+ position: absolute;
+ left: -2.14285714em;
+ width: 2.14285714em;
+ top: .14285714em;
+ text-align: center
+}
+
+.fa-li.fa-lg {
+ left: -1.85714286em
+}
+
+.fa-border {
+ padding: .2em .25em .15em;
+ border: solid .08em #eee;
+ border-radius: .1em
+}
+
+.fa-pull-left {
+ float: left
+}
+
+.fa-pull-right {
+ float: right
+}
+
+.fa.fa-pull-left {
+ margin-right: .3em
+}
+
+.fa.fa-pull-right {
+ margin-left: .3em
+}
+
+.pull-right {
+ float: right
+}
+
+.pull-left {
+ float: left
+}
+
+.fa.pull-left {
+ margin-right: .3em
+}
+
+.fa.pull-right {
+ margin-left: .3em
+}
+
+.fa-spin {
+ -webkit-animation: fa-spin 2s infinite linear;
+ animation: fa-spin 2s infinite linear
+}
+
+.fa-pulse {
+ -webkit-animation: fa-spin 1s infinite steps(8);
+ animation: fa-spin 1s infinite steps(8)
+}
+
+@-webkit-keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg)
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg)
+ }
+}
+
+@keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg)
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg)
+ }
+}
+
+.fa-rotate-90 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg)
+}
+
+.fa-rotate-180 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
+ -webkit-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ transform: rotate(180deg)
+}
+
+.fa-rotate-270 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
+ -webkit-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ transform: rotate(270deg)
+}
+
+.fa-flip-horizontal {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
+ -webkit-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ transform: scale(-1, 1)
+}
+
+.fa-flip-vertical {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
+ -webkit-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ transform: scale(1, -1)
+}
+
+:root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270, :root .fa-flip-horizontal, :root .fa-flip-vertical {
+ filter: none
+}
+
+.fa-stack {
+ position: relative;
+ display: inline-block;
+ width: 2em;
+ height: 2em;
+ line-height: 2em;
+ vertical-align: middle
+}
+
+.fa-stack-1x, .fa-stack-2x {
+ position: absolute;
+ left: 0;
+ width: 100%;
+ text-align: center
+}
+
+.fa-stack-1x {
+ line-height: inherit
+}
+
+.fa-stack-2x {
+ font-size: 2em
+}
+
+.fa-inverse {
+ color: #fff
+}
+
+.fa-glass:before {
+ content: "\f000"
+}
+
+.fa-music:before {
+ content: "\f001"
+}
+
+.fa-search:before {
+ content: "\f002"
+}
+
+.fa-envelope-o:before {
+ content: "\f003"
+}
+
+.fa-heart:before {
+ content: "\f004"
+}
+
+.fa-star:before {
+ content: "\f005"
+}
+
+.fa-star-o:before {
+ content: "\f006"
+}
+
+.fa-user:before {
+ content: "\f007"
+}
+
+.fa-film:before {
+ content: "\f008"
+}
+
+.fa-th-large:before {
+ content: "\f009"
+}
+
+.fa-th:before {
+ content: "\f00a"
+}
+
+.fa-th-list:before {
+ content: "\f00b"
+}
+
+.fa-check:before {
+ content: "\f00c"
+}
+
+.fa-remove:before, .fa-close:before, .fa-times:before {
+ content: "\f00d"
+}
+
+.fa-search-plus:before {
+ content: "\f00e"
+}
+
+.fa-search-minus:before {
+ content: "\f010"
+}
+
+.fa-power-off:before {
+ content: "\f011"
+}
+
+.fa-signal:before {
+ content: "\f012"
+}
+
+.fa-gear:before, .fa-cog:before {
+ content: "\f013"
+}
+
+.fa-trash-o:before {
+ content: "\f014"
+}
+
+.fa-home:before {
+ content: "\f015"
+}
+
+.fa-file-o:before {
+ content: "\f016"
+}
+
+.fa-clock-o:before {
+ content: "\f017"
+}
+
+.fa-road:before {
+ content: "\f018"
+}
+
+.fa-download:before {
+ content: "\f019"
+}
+
+.fa-arrow-circle-o-down:before {
+ content: "\f01a"
+}
+
+.fa-arrow-circle-o-up:before {
+ content: "\f01b"
+}
+
+.fa-inbox:before {
+ content: "\f01c"
+}
+
+.fa-play-circle-o:before {
+ content: "\f01d"
+}
+
+.fa-rotate-right:before, .fa-repeat:before {
+ content: "\f01e"
+}
+
+.fa-refresh:before {
+ content: "\f021"
+}
+
+.fa-list-alt:before {
+ content: "\f022"
+}
+
+.fa-lock:before {
+ content: "\f023"
+}
+
+.fa-flag:before {
+ content: "\f024"
+}
+
+.fa-headphones:before {
+ content: "\f025"
+}
+
+.fa-volume-off:before {
+ content: "\f026"
+}
+
+.fa-volume-down:before {
+ content: "\f027"
+}
+
+.fa-volume-up:before {
+ content: "\f028"
+}
+
+.fa-qrcode:before {
+ content: "\f029"
+}
+
+.fa-barcode:before {
+ content: "\f02a"
+}
+
+.fa-tag:before {
+ content: "\f02b"
+}
+
+.fa-tags:before {
+ content: "\f02c"
+}
+
+.fa-book:before {
+ content: "\f02d"
+}
+
+.fa-bookmark:before {
+ content: "\f02e"
+}
+
+.fa-print:before {
+ content: "\f02f"
+}
+
+.fa-camera:before {
+ content: "\f030"
+}
+
+.fa-font:before {
+ content: "\f031"
+}
+
+.fa-bold:before {
+ content: "\f032"
+}
+
+.fa-italic:before {
+ content: "\f033"
+}
+
+.fa-text-height:before {
+ content: "\f034"
+}
+
+.fa-text-width:before {
+ content: "\f035"
+}
+
+.fa-align-left:before {
+ content: "\f036"
+}
+
+.fa-align-center:before {
+ content: "\f037"
+}
+
+.fa-align-right:before {
+ content: "\f038"
+}
+
+.fa-align-justify:before {
+ content: "\f039"
+}
+
+.fa-list:before {
+ content: "\f03a"
+}
+
+.fa-dedent:before, .fa-outdent:before {
+ content: "\f03b"
+}
+
+.fa-indent:before {
+ content: "\f03c"
+}
+
+.fa-video-camera:before {
+ content: "\f03d"
+}
+
+.fa-photo:before, .fa-image:before, .fa-picture-o:before {
+ content: "\f03e"
+}
+
+.fa-pencil:before {
+ content: "\f040"
+}
+
+.fa-map-marker:before {
+ content: "\f041"
+}
+
+.fa-adjust:before {
+ content: "\f042"
+}
+
+.fa-tint:before {
+ content: "\f043"
+}
+
+.fa-edit:before, .fa-pencil-square-o:before {
+ content: "\f044"
+}
+
+.fa-share-square-o:before {
+ content: "\f045"
+}
+
+.fa-check-square-o:before {
+ content: "\f046"
+}
+
+.fa-arrows:before {
+ content: "\f047"
+}
+
+.fa-step-backward:before {
+ content: "\f048"
+}
+
+.fa-fast-backward:before {
+ content: "\f049"
+}
+
+.fa-backward:before {
+ content: "\f04a"
+}
+
+.fa-play:before {
+ content: "\f04b"
+}
+
+.fa-pause:before {
+ content: "\f04c"
+}
+
+.fa-stop:before {
+ content: "\f04d"
+}
+
+.fa-forward:before {
+ content: "\f04e"
+}
+
+.fa-fast-forward:before {
+ content: "\f050"
+}
+
+.fa-step-forward:before {
+ content: "\f051"
+}
+
+.fa-eject:before {
+ content: "\f052"
+}
+
+.fa-chevron-left:before {
+ content: "\f053"
+}
+
+.fa-chevron-right:before {
+ content: "\f054"
+}
+
+.fa-plus-circle:before {
+ content: "\f055"
+}
+
+.fa-minus-circle:before {
+ content: "\f056"
+}
+
+.fa-times-circle:before {
+ content: "\f057"
+}
+
+.fa-check-circle:before {
+ content: "\f058"
+}
+
+.fa-question-circle:before {
+ content: "\f059"
+}
+
+.fa-info-circle:before {
+ content: "\f05a"
+}
+
+.fa-crosshairs:before {
+ content: "\f05b"
+}
+
+.fa-times-circle-o:before {
+ content: "\f05c"
+}
+
+.fa-check-circle-o:before {
+ content: "\f05d"
+}
+
+.fa-ban:before {
+ content: "\f05e"
+}
+
+.fa-arrow-left:before {
+ content: "\f060"
+}
+
+.fa-arrow-right:before {
+ content: "\f061"
+}
+
+.fa-arrow-up:before {
+ content: "\f062"
+}
+
+.fa-arrow-down:before {
+ content: "\f063"
+}
+
+.fa-mail-forward:before, .fa-share:before {
+ content: "\f064"
+}
+
+.fa-expand:before {
+ content: "\f065"
+}
+
+.fa-compress:before {
+ content: "\f066"
+}
+
+.fa-plus:before {
+ content: "\f067"
+}
+
+.fa-minus:before {
+ content: "\f068"
+}
+
+.fa-asterisk:before {
+ content: "\f069"
+}
+
+.fa-exclamation-circle:before {
+ content: "\f06a"
+}
+
+.fa-gift:before {
+ content: "\f06b"
+}
+
+.fa-leaf:before {
+ content: "\f06c"
+}
+
+.fa-fire:before {
+ content: "\f06d"
+}
+
+.fa-eye:before {
+ content: "\f06e"
+}
+
+.fa-eye-slash:before {
+ content: "\f070"
+}
+
+.fa-warning:before, .fa-exclamation-triangle:before {
+ content: "\f071"
+}
+
+.fa-plane:before {
+ content: "\f072"
+}
+
+.fa-calendar:before {
+ content: "\f073"
+}
+
+.fa-random:before {
+ content: "\f074"
+}
+
+.fa-comment:before {
+ content: "\f075"
+}
+
+.fa-magnet:before {
+ content: "\f076"
+}
+
+.fa-chevron-up:before {
+ content: "\f077"
+}
+
+.fa-chevron-down:before {
+ content: "\f078"
+}
+
+.fa-retweet:before {
+ content: "\f079"
+}
+
+.fa-shopping-cart:before {
+ content: "\f07a"
+}
+
+.fa-folder:before {
+ content: "\f07b"
+}
+
+.fa-folder-open:before {
+ content: "\f07c"
+}
+
+.fa-arrows-v:before {
+ content: "\f07d"
+}
+
+.fa-arrows-h:before {
+ content: "\f07e"
+}
+
+.fa-bar-chart-o:before, .fa-bar-chart:before {
+ content: "\f080"
+}
+
+.fa-twitter-square:before {
+ content: "\f081"
+}
+
+.fa-facebook-square:before {
+ content: "\f082"
+}
+
+.fa-camera-retro:before {
+ content: "\f083"
+}
+
+.fa-key:before {
+ content: "\f084"
+}
+
+.fa-gears:before, .fa-cogs:before {
+ content: "\f085"
+}
+
+.fa-comments:before {
+ content: "\f086"
+}
+
+.fa-thumbs-o-up:before {
+ content: "\f087"
+}
+
+.fa-thumbs-o-down:before {
+ content: "\f088"
+}
+
+.fa-star-half:before {
+ content: "\f089"
+}
+
+.fa-heart-o:before {
+ content: "\f08a"
+}
+
+.fa-sign-out:before {
+ content: "\f08b"
+}
+
+.fa-linkedin-square:before {
+ content: "\f08c"
+}
+
+.fa-thumb-tack:before {
+ content: "\f08d"
+}
+
+.fa-external-link:before {
+ content: "\f08e"
+}
+
+.fa-sign-in:before {
+ content: "\f090"
+}
+
+.fa-trophy:before {
+ content: "\f091"
+}
+
+.fa-github-square:before {
+ content: "\f092"
+}
+
+.fa-upload:before {
+ content: "\f093"
+}
+
+.fa-lemon-o:before {
+ content: "\f094"
+}
+
+.fa-phone:before {
+ content: "\f095"
+}
+
+.fa-square-o:before {
+ content: "\f096"
+}
+
+.fa-bookmark-o:before {
+ content: "\f097"
+}
+
+.fa-phone-square:before {
+ content: "\f098"
+}
+
+.fa-twitter:before {
+ content: "\f099"
+}
+
+.fa-facebook-f:before, .fa-facebook:before {
+ content: "\f09a"
+}
+
+.fa-github:before {
+ content: "\f09b"
+}
+
+.fa-unlock:before {
+ content: "\f09c"
+}
+
+.fa-credit-card:before {
+ content: "\f09d"
+}
+
+.fa-feed:before, .fa-rss:before {
+ content: "\f09e"
+}
+
+.fa-hdd-o:before {
+ content: "\f0a0"
+}
+
+.fa-bullhorn:before {
+ content: "\f0a1"
+}
+
+.fa-bell:before {
+ content: "\f0f3"
+}
+
+.fa-certificate:before {
+ content: "\f0a3"
+}
+
+.fa-hand-o-right:before {
+ content: "\f0a4"
+}
+
+.fa-hand-o-left:before {
+ content: "\f0a5"
+}
+
+.fa-hand-o-up:before {
+ content: "\f0a6"
+}
+
+.fa-hand-o-down:before {
+ content: "\f0a7"
+}
+
+.fa-arrow-circle-left:before {
+ content: "\f0a8"
+}
+
+.fa-arrow-circle-right:before {
+ content: "\f0a9"
+}
+
+.fa-arrow-circle-up:before {
+ content: "\f0aa"
+}
+
+.fa-arrow-circle-down:before {
+ content: "\f0ab"
+}
+
+.fa-globe:before {
+ content: "\f0ac"
+}
+
+.fa-wrench:before {
+ content: "\f0ad"
+}
+
+.fa-tasks:before {
+ content: "\f0ae"
+}
+
+.fa-filter:before {
+ content: "\f0b0"
+}
+
+.fa-briefcase:before {
+ content: "\f0b1"
+}
+
+.fa-arrows-alt:before {
+ content: "\f0b2"
+}
+
+.fa-group:before, .fa-users:before {
+ content: "\f0c0"
+}
+
+.fa-chain:before, .fa-link:before {
+ content: "\f0c1"
+}
+
+.fa-cloud:before {
+ content: "\f0c2"
+}
+
+.fa-flask:before {
+ content: "\f0c3"
+}
+
+.fa-cut:before, .fa-scissors:before {
+ content: "\f0c4"
+}
+
+.fa-copy:before, .fa-files-o:before {
+ content: "\f0c5"
+}
+
+.fa-paperclip:before {
+ content: "\f0c6"
+}
+
+.fa-save:before, .fa-floppy-o:before {
+ content: "\f0c7"
+}
+
+.fa-square:before {
+ content: "\f0c8"
+}
+
+.fa-navicon:before, .fa-reorder:before, .fa-bars:before {
+ content: "\f0c9"
+}
+
+.fa-list-ul:before {
+ content: "\f0ca"
+}
+
+.fa-list-ol:before {
+ content: "\f0cb"
+}
+
+.fa-strikethrough:before {
+ content: "\f0cc"
+}
+
+.fa-underline:before {
+ content: "\f0cd"
+}
+
+.fa-table:before {
+ content: "\f0ce"
+}
+
+.fa-magic:before {
+ content: "\f0d0"
+}
+
+.fa-truck:before {
+ content: "\f0d1"
+}
+
+.fa-pinterest:before {
+ content: "\f0d2"
+}
+
+.fa-pinterest-square:before {
+ content: "\f0d3"
+}
+
+.fa-google-plus-square:before {
+ content: "\f0d4"
+}
+
+.fa-google-plus:before {
+ content: "\f0d5"
+}
+
+.fa-money:before {
+ content: "\f0d6"
+}
+
+.fa-caret-down:before {
+ content: "\f0d7"
+}
+
+.fa-caret-up:before {
+ content: "\f0d8"
+}
+
+.fa-caret-left:before {
+ content: "\f0d9"
+}
+
+.fa-caret-right:before {
+ content: "\f0da"
+}
+
+.fa-columns:before {
+ content: "\f0db"
+}
+
+.fa-unsorted:before, .fa-sort:before {
+ content: "\f0dc"
+}
+
+.fa-sort-down:before, .fa-sort-desc:before {
+ content: "\f0dd"
+}
+
+.fa-sort-up:before, .fa-sort-asc:before {
+ content: "\f0de"
+}
+
+.fa-envelope:before {
+ content: "\f0e0"
+}
+
+.fa-linkedin:before {
+ content: "\f0e1"
+}
+
+.fa-rotate-left:before, .fa-undo:before {
+ content: "\f0e2"
+}
+
+.fa-legal:before, .fa-gavel:before {
+ content: "\f0e3"
+}
+
+.fa-dashboard:before, .fa-tachometer:before {
+ content: "\f0e4"
+}
+
+.fa-comment-o:before {
+ content: "\f0e5"
+}
+
+.fa-comments-o:before {
+ content: "\f0e6"
+}
+
+.fa-flash:before, .fa-bolt:before {
+ content: "\f0e7"
+}
+
+.fa-sitemap:before {
+ content: "\f0e8"
+}
+
+.fa-umbrella:before {
+ content: "\f0e9"
+}
+
+.fa-paste:before, .fa-clipboard:before {
+ content: "\f0ea"
+}
+
+.fa-lightbulb-o:before {
+ content: "\f0eb"
+}
+
+.fa-exchange:before {
+ content: "\f0ec"
+}
+
+.fa-cloud-download:before {
+ content: "\f0ed"
+}
+
+.fa-cloud-upload:before {
+ content: "\f0ee"
+}
+
+.fa-user-md:before {
+ content: "\f0f0"
+}
+
+.fa-stethoscope:before {
+ content: "\f0f1"
+}
+
+.fa-suitcase:before {
+ content: "\f0f2"
+}
+
+.fa-bell-o:before {
+ content: "\f0a2"
+}
+
+.fa-coffee:before {
+ content: "\f0f4"
+}
+
+.fa-cutlery:before {
+ content: "\f0f5"
+}
+
+.fa-file-text-o:before {
+ content: "\f0f6"
+}
+
+.fa-building-o:before {
+ content: "\f0f7"
+}
+
+.fa-hospital-o:before {
+ content: "\f0f8"
+}
+
+.fa-ambulance:before {
+ content: "\f0f9"
+}
+
+.fa-medkit:before {
+ content: "\f0fa"
+}
+
+.fa-fighter-jet:before {
+ content: "\f0fb"
+}
+
+.fa-beer:before {
+ content: "\f0fc"
+}
+
+.fa-h-square:before {
+ content: "\f0fd"
+}
+
+.fa-plus-square:before {
+ content: "\f0fe"
+}
+
+.fa-angle-double-left:before {
+ content: "\f100"
+}
+
+.fa-angle-double-right:before {
+ content: "\f101"
+}
+
+.fa-angle-double-up:before {
+ content: "\f102"
+}
+
+.fa-angle-double-down:before {
+ content: "\f103"
+}
+
+.fa-angle-left:before {
+ content: "\f104"
+}
+
+.fa-angle-right:before {
+ content: "\f105"
+}
+
+.fa-angle-up:before {
+ content: "\f106"
+}
+
+.fa-angle-down:before {
+ content: "\f107"
+}
+
+.fa-desktop:before {
+ content: "\f108"
+}
+
+.fa-laptop:before {
+ content: "\f109"
+}
+
+.fa-tablet:before {
+ content: "\f10a"
+}
+
+.fa-mobile-phone:before, .fa-mobile:before {
+ content: "\f10b"
+}
+
+.fa-circle-o:before {
+ content: "\f10c"
+}
+
+.fa-quote-left:before {
+ content: "\f10d"
+}
+
+.fa-quote-right:before {
+ content: "\f10e"
+}
+
+.fa-spinner:before {
+ content: "\f110"
+}
+
+.fa-circle:before {
+ content: "\f111"
+}
+
+.fa-mail-reply:before, .fa-reply:before {
+ content: "\f112"
+}
+
+.fa-github-alt:before {
+ content: "\f113"
+}
+
+.fa-folder-o:before {
+ content: "\f114"
+}
+
+.fa-folder-open-o:before {
+ content: "\f115"
+}
+
+.fa-smile-o:before {
+ content: "\f118"
+}
+
+.fa-frown-o:before {
+ content: "\f119"
+}
+
+.fa-meh-o:before {
+ content: "\f11a"
+}
+
+.fa-gamepad:before {
+ content: "\f11b"
+}
+
+.fa-keyboard-o:before {
+ content: "\f11c"
+}
+
+.fa-flag-o:before {
+ content: "\f11d"
+}
+
+.fa-flag-checkered:before {
+ content: "\f11e"
+}
+
+.fa-terminal:before {
+ content: "\f120"
+}
+
+.fa-code:before {
+ content: "\f121"
+}
+
+.fa-mail-reply-all:before, .fa-reply-all:before {
+ content: "\f122"
+}
+
+.fa-star-half-empty:before, .fa-star-half-full:before, .fa-star-half-o:before {
+ content: "\f123"
+}
+
+.fa-location-arrow:before {
+ content: "\f124"
+}
+
+.fa-crop:before {
+ content: "\f125"
+}
+
+.fa-code-fork:before {
+ content: "\f126"
+}
+
+.fa-unlink:before, .fa-chain-broken:before {
+ content: "\f127"
+}
+
+.fa-question:before {
+ content: "\f128"
+}
+
+.fa-info:before {
+ content: "\f129"
+}
+
+.fa-exclamation:before {
+ content: "\f12a"
+}
+
+.fa-superscript:before {
+ content: "\f12b"
+}
+
+.fa-subscript:before {
+ content: "\f12c"
+}
+
+.fa-eraser:before {
+ content: "\f12d"
+}
+
+.fa-puzzle-piece:before {
+ content: "\f12e"
+}
+
+.fa-microphone:before {
+ content: "\f130"
+}
+
+.fa-microphone-slash:before {
+ content: "\f131"
+}
+
+.fa-shield:before {
+ content: "\f132"
+}
+
+.fa-calendar-o:before {
+ content: "\f133"
+}
+
+.fa-fire-extinguisher:before {
+ content: "\f134"
+}
+
+.fa-rocket:before {
+ content: "\f135"
+}
+
+.fa-maxcdn:before {
+ content: "\f136"
+}
+
+.fa-chevron-circle-left:before {
+ content: "\f137"
+}
+
+.fa-chevron-circle-right:before {
+ content: "\f138"
+}
+
+.fa-chevron-circle-up:before {
+ content: "\f139"
+}
+
+.fa-chevron-circle-down:before {
+ content: "\f13a"
+}
+
+.fa-html5:before {
+ content: "\f13b"
+}
+
+.fa-css3:before {
+ content: "\f13c"
+}
+
+.fa-anchor:before {
+ content: "\f13d"
+}
+
+.fa-unlock-alt:before {
+ content: "\f13e"
+}
+
+.fa-bullseye:before {
+ content: "\f140"
+}
+
+.fa-ellipsis-h:before {
+ content: "\f141"
+}
+
+.fa-ellipsis-v:before {
+ content: "\f142"
+}
+
+.fa-rss-square:before {
+ content: "\f143"
+}
+
+.fa-play-circle:before {
+ content: "\f144"
+}
+
+.fa-ticket:before {
+ content: "\f145"
+}
+
+.fa-minus-square:before {
+ content: "\f146"
+}
+
+.fa-minus-square-o:before {
+ content: "\f147"
+}
+
+.fa-level-up:before {
+ content: "\f148"
+}
+
+.fa-level-down:before {
+ content: "\f149"
+}
+
+.fa-check-square:before {
+ content: "\f14a"
+}
+
+.fa-pencil-square:before {
+ content: "\f14b"
+}
+
+.fa-external-link-square:before {
+ content: "\f14c"
+}
+
+.fa-share-square:before {
+ content: "\f14d"
+}
+
+.fa-compass:before {
+ content: "\f14e"
+}
+
+.fa-toggle-down:before, .fa-caret-square-o-down:before {
+ content: "\f150"
+}
+
+.fa-toggle-up:before, .fa-caret-square-o-up:before {
+ content: "\f151"
+}
+
+.fa-toggle-right:before, .fa-caret-square-o-right:before {
+ content: "\f152"
+}
+
+.fa-euro:before, .fa-eur:before {
+ content: "\f153"
+}
+
+.fa-gbp:before {
+ content: "\f154"
+}
+
+.fa-dollar:before, .fa-usd:before {
+ content: "\f155"
+}
+
+.fa-rupee:before, .fa-inr:before {
+ content: "\f156"
+}
+
+.fa-cny:before, .fa-rmb:before, .fa-yen:before, .fa-jpy:before {
+ content: "\f157"
+}
+
+.fa-ruble:before, .fa-rouble:before, .fa-rub:before {
+ content: "\f158"
+}
+
+.fa-won:before, .fa-krw:before {
+ content: "\f159"
+}
+
+.fa-bitcoin:before, .fa-btc:before {
+ content: "\f15a"
+}
+
+.fa-file:before {
+ content: "\f15b"
+}
+
+.fa-file-text:before {
+ content: "\f15c"
+}
+
+.fa-sort-alpha-asc:before {
+ content: "\f15d"
+}
+
+.fa-sort-alpha-desc:before {
+ content: "\f15e"
+}
+
+.fa-sort-amount-asc:before {
+ content: "\f160"
+}
+
+.fa-sort-amount-desc:before {
+ content: "\f161"
+}
+
+.fa-sort-numeric-asc:before {
+ content: "\f162"
+}
+
+.fa-sort-numeric-desc:before {
+ content: "\f163"
+}
+
+.fa-thumbs-up:before {
+ content: "\f164"
+}
+
+.fa-thumbs-down:before {
+ content: "\f165"
+}
+
+.fa-youtube-square:before {
+ content: "\f166"
+}
+
+.fa-youtube:before {
+ content: "\f167"
+}
+
+.fa-xing:before {
+ content: "\f168"
+}
+
+.fa-xing-square:before {
+ content: "\f169"
+}
+
+.fa-youtube-play:before {
+ content: "\f16a"
+}
+
+.fa-dropbox:before {
+ content: "\f16b"
+}
+
+.fa-stack-overflow:before {
+ content: "\f16c"
+}
+
+.fa-instagram:before {
+ content: "\f16d"
+}
+
+.fa-flickr:before {
+ content: "\f16e"
+}
+
+.fa-adn:before {
+ content: "\f170"
+}
+
+.fa-bitbucket:before {
+ content: "\f171"
+}
+
+.fa-bitbucket-square:before {
+ content: "\f172"
+}
+
+.fa-tumblr:before {
+ content: "\f173"
+}
+
+.fa-tumblr-square:before {
+ content: "\f174"
+}
+
+.fa-long-arrow-down:before {
+ content: "\f175"
+}
+
+.fa-long-arrow-up:before {
+ content: "\f176"
+}
+
+.fa-long-arrow-left:before {
+ content: "\f177"
+}
+
+.fa-long-arrow-right:before {
+ content: "\f178"
+}
+
+.fa-apple:before {
+ content: "\f179"
+}
+
+.fa-windows:before {
+ content: "\f17a"
+}
+
+.fa-android:before {
+ content: "\f17b"
+}
+
+.fa-linux:before {
+ content: "\f17c"
+}
+
+.fa-dribbble:before {
+ content: "\f17d"
+}
+
+.fa-skype:before {
+ content: "\f17e"
+}
+
+.fa-foursquare:before {
+ content: "\f180"
+}
+
+.fa-trello:before {
+ content: "\f181"
+}
+
+.fa-female:before {
+ content: "\f182"
+}
+
+.fa-male:before {
+ content: "\f183"
+}
+
+.fa-gittip:before, .fa-gratipay:before {
+ content: "\f184"
+}
+
+.fa-sun-o:before {
+ content: "\f185"
+}
+
+.fa-moon-o:before {
+ content: "\f186"
+}
+
+.fa-archive:before {
+ content: "\f187"
+}
+
+.fa-bug:before {
+ content: "\f188"
+}
+
+.fa-vk:before {
+ content: "\f189"
+}
+
+.fa-weibo:before {
+ content: "\f18a"
+}
+
+.fa-renren:before {
+ content: "\f18b"
+}
+
+.fa-pagelines:before {
+ content: "\f18c"
+}
+
+.fa-stack-exchange:before {
+ content: "\f18d"
+}
+
+.fa-arrow-circle-o-right:before {
+ content: "\f18e"
+}
+
+.fa-arrow-circle-o-left:before {
+ content: "\f190"
+}
+
+.fa-toggle-left:before, .fa-caret-square-o-left:before {
+ content: "\f191"
+}
+
+.fa-dot-circle-o:before {
+ content: "\f192"
+}
+
+.fa-wheelchair:before {
+ content: "\f193"
+}
+
+.fa-vimeo-square:before {
+ content: "\f194"
+}
+
+.fa-turkish-lira:before, .fa-try:before {
+ content: "\f195"
+}
+
+.fa-plus-square-o:before {
+ content: "\f196"
+}
+
+.fa-space-shuttle:before {
+ content: "\f197"
+}
+
+.fa-slack:before {
+ content: "\f198"
+}
+
+.fa-envelope-square:before {
+ content: "\f199"
+}
+
+.fa-wordpress:before {
+ content: "\f19a"
+}
+
+.fa-openid:before {
+ content: "\f19b"
+}
+
+.fa-institution:before, .fa-bank:before, .fa-university:before {
+ content: "\f19c"
+}
+
+.fa-mortar-board:before, .fa-graduation-cap:before {
+ content: "\f19d"
+}
+
+.fa-yahoo:before {
+ content: "\f19e"
+}
+
+.fa-google:before {
+ content: "\f1a0"
+}
+
+.fa-reddit:before {
+ content: "\f1a1"
+}
+
+.fa-reddit-square:before {
+ content: "\f1a2"
+}
+
+.fa-stumbleupon-circle:before {
+ content: "\f1a3"
+}
+
+.fa-stumbleupon:before {
+ content: "\f1a4"
+}
+
+.fa-delicious:before {
+ content: "\f1a5"
+}
+
+.fa-digg:before {
+ content: "\f1a6"
+}
+
+.fa-pied-piper-pp:before {
+ content: "\f1a7"
+}
+
+.fa-pied-piper-alt:before {
+ content: "\f1a8"
+}
+
+.fa-drupal:before {
+ content: "\f1a9"
+}
+
+.fa-joomla:before {
+ content: "\f1aa"
+}
+
+.fa-language:before {
+ content: "\f1ab"
+}
+
+.fa-fax:before {
+ content: "\f1ac"
+}
+
+.fa-building:before {
+ content: "\f1ad"
+}
+
+.fa-child:before {
+ content: "\f1ae"
+}
+
+.fa-paw:before {
+ content: "\f1b0"
+}
+
+.fa-spoon:before {
+ content: "\f1b1"
+}
+
+.fa-cube:before {
+ content: "\f1b2"
+}
+
+.fa-cubes:before {
+ content: "\f1b3"
+}
+
+.fa-behance:before {
+ content: "\f1b4"
+}
+
+.fa-behance-square:before {
+ content: "\f1b5"
+}
+
+.fa-steam:before {
+ content: "\f1b6"
+}
+
+.fa-steam-square:before {
+ content: "\f1b7"
+}
+
+.fa-recycle:before {
+ content: "\f1b8"
+}
+
+.fa-automobile:before, .fa-car:before {
+ content: "\f1b9"
+}
+
+.fa-cab:before, .fa-taxi:before {
+ content: "\f1ba"
+}
+
+.fa-tree:before {
+ content: "\f1bb"
+}
+
+.fa-spotify:before {
+ content: "\f1bc"
+}
+
+.fa-deviantart:before {
+ content: "\f1bd"
+}
+
+.fa-soundcloud:before {
+ content: "\f1be"
+}
+
+.fa-database:before {
+ content: "\f1c0"
+}
+
+.fa-file-pdf-o:before {
+ content: "\f1c1"
+}
+
+.fa-file-word-o:before {
+ content: "\f1c2"
+}
+
+.fa-file-excel-o:before {
+ content: "\f1c3"
+}
+
+.fa-file-powerpoint-o:before {
+ content: "\f1c4"
+}
+
+.fa-file-photo-o:before, .fa-file-picture-o:before, .fa-file-image-o:before {
+ content: "\f1c5"
+}
+
+.fa-file-zip-o:before, .fa-file-archive-o:before {
+ content: "\f1c6"
+}
+
+.fa-file-sound-o:before, .fa-file-audio-o:before {
+ content: "\f1c7"
+}
+
+.fa-file-movie-o:before, .fa-file-video-o:before {
+ content: "\f1c8"
+}
+
+.fa-file-code-o:before {
+ content: "\f1c9"
+}
+
+.fa-vine:before {
+ content: "\f1ca"
+}
+
+.fa-codepen:before {
+ content: "\f1cb"
+}
+
+.fa-jsfiddle:before {
+ content: "\f1cc"
+}
+
+.fa-life-bouy:before, .fa-life-buoy:before, .fa-life-saver:before, .fa-support:before, .fa-life-ring:before {
+ content: "\f1cd"
+}
+
+.fa-circle-o-notch:before {
+ content: "\f1ce"
+}
+
+.fa-ra:before, .fa-resistance:before, .fa-rebel:before {
+ content: "\f1d0"
+}
+
+.fa-ge:before, .fa-empire:before {
+ content: "\f1d1"
+}
+
+.fa-git-square:before {
+ content: "\f1d2"
+}
+
+.fa-git:before {
+ content: "\f1d3"
+}
+
+.fa-y-combinator-square:before, .fa-yc-square:before, .fa-hacker-news:before {
+ content: "\f1d4"
+}
+
+.fa-tencent-weibo:before {
+ content: "\f1d5"
+}
+
+.fa-qq:before {
+ content: "\f1d6"
+}
+
+.fa-wechat:before, .fa-weixin:before {
+ content: "\f1d7"
+}
+
+.fa-send:before, .fa-paper-plane:before {
+ content: "\f1d8"
+}
+
+.fa-send-o:before, .fa-paper-plane-o:before {
+ content: "\f1d9"
+}
+
+.fa-history:before {
+ content: "\f1da"
+}
+
+.fa-circle-thin:before {
+ content: "\f1db"
+}
+
+.fa-header:before {
+ content: "\f1dc"
+}
+
+.fa-paragraph:before {
+ content: "\f1dd"
+}
+
+.fa-sliders:before {
+ content: "\f1de"
+}
+
+.fa-share-alt:before {
+ content: "\f1e0"
+}
+
+.fa-share-alt-square:before {
+ content: "\f1e1"
+}
+
+.fa-bomb:before {
+ content: "\f1e2"
+}
+
+.fa-soccer-ball-o:before, .fa-futbol-o:before {
+ content: "\f1e3"
+}
+
+.fa-tty:before {
+ content: "\f1e4"
+}
+
+.fa-binoculars:before {
+ content: "\f1e5"
+}
+
+.fa-plug:before {
+ content: "\f1e6"
+}
+
+.fa-slideshare:before {
+ content: "\f1e7"
+}
+
+.fa-twitch:before {
+ content: "\f1e8"
+}
+
+.fa-yelp:before {
+ content: "\f1e9"
+}
+
+.fa-newspaper-o:before {
+ content: "\f1ea"
+}
+
+.fa-wifi:before {
+ content: "\f1eb"
+}
+
+.fa-calculator:before {
+ content: "\f1ec"
+}
+
+.fa-paypal:before {
+ content: "\f1ed"
+}
+
+.fa-google-wallet:before {
+ content: "\f1ee"
+}
+
+.fa-cc-visa:before {
+ content: "\f1f0"
+}
+
+.fa-cc-mastercard:before {
+ content: "\f1f1"
+}
+
+.fa-cc-discover:before {
+ content: "\f1f2"
+}
+
+.fa-cc-amex:before {
+ content: "\f1f3"
+}
+
+.fa-cc-paypal:before {
+ content: "\f1f4"
+}
+
+.fa-cc-stripe:before {
+ content: "\f1f5"
+}
+
+.fa-bell-slash:before {
+ content: "\f1f6"
+}
+
+.fa-bell-slash-o:before {
+ content: "\f1f7"
+}
+
+.fa-trash:before {
+ content: "\f1f8"
+}
+
+.fa-copyright:before {
+ content: "\f1f9"
+}
+
+.fa-at:before {
+ content: "\f1fa"
+}
+
+.fa-eyedropper:before {
+ content: "\f1fb"
+}
+
+.fa-paint-brush:before {
+ content: "\f1fc"
+}
+
+.fa-birthday-cake:before {
+ content: "\f1fd"
+}
+
+.fa-area-chart:before {
+ content: "\f1fe"
+}
+
+.fa-pie-chart:before {
+ content: "\f200"
+}
+
+.fa-line-chart:before {
+ content: "\f201"
+}
+
+.fa-lastfm:before {
+ content: "\f202"
+}
+
+.fa-lastfm-square:before {
+ content: "\f203"
+}
+
+.fa-toggle-off:before {
+ content: "\f204"
+}
+
+.fa-toggle-on:before {
+ content: "\f205"
+}
+
+.fa-bicycle:before {
+ content: "\f206"
+}
+
+.fa-bus:before {
+ content: "\f207"
+}
+
+.fa-ioxhost:before {
+ content: "\f208"
+}
+
+.fa-angellist:before {
+ content: "\f209"
+}
+
+.fa-cc:before {
+ content: "\f20a"
+}
+
+.fa-shekel:before, .fa-sheqel:before, .fa-ils:before {
+ content: "\f20b"
+}
+
+.fa-meanpath:before {
+ content: "\f20c"
+}
+
+.fa-buysellads:before {
+ content: "\f20d"
+}
+
+.fa-connectdevelop:before {
+ content: "\f20e"
+}
+
+.fa-dashcube:before {
+ content: "\f210"
+}
+
+.fa-forumbee:before {
+ content: "\f211"
+}
+
+.fa-leanpub:before {
+ content: "\f212"
+}
+
+.fa-sellsy:before {
+ content: "\f213"
+}
+
+.fa-shirtsinbulk:before {
+ content: "\f214"
+}
+
+.fa-simplybuilt:before {
+ content: "\f215"
+}
+
+.fa-skyatlas:before {
+ content: "\f216"
+}
+
+.fa-cart-plus:before {
+ content: "\f217"
+}
+
+.fa-cart-arrow-down:before {
+ content: "\f218"
+}
+
+.fa-diamond:before {
+ content: "\f219"
+}
+
+.fa-ship:before {
+ content: "\f21a"
+}
+
+.fa-user-secret:before {
+ content: "\f21b"
+}
+
+.fa-motorcycle:before {
+ content: "\f21c"
+}
+
+.fa-street-view:before {
+ content: "\f21d"
+}
+
+.fa-heartbeat:before {
+ content: "\f21e"
+}
+
+.fa-venus:before {
+ content: "\f221"
+}
+
+.fa-mars:before {
+ content: "\f222"
+}
+
+.fa-mercury:before {
+ content: "\f223"
+}
+
+.fa-intersex:before, .fa-transgender:before {
+ content: "\f224"
+}
+
+.fa-transgender-alt:before {
+ content: "\f225"
+}
+
+.fa-venus-double:before {
+ content: "\f226"
+}
+
+.fa-mars-double:before {
+ content: "\f227"
+}
+
+.fa-venus-mars:before {
+ content: "\f228"
+}
+
+.fa-mars-stroke:before {
+ content: "\f229"
+}
+
+.fa-mars-stroke-v:before {
+ content: "\f22a"
+}
+
+.fa-mars-stroke-h:before {
+ content: "\f22b"
+}
+
+.fa-neuter:before {
+ content: "\f22c"
+}
+
+.fa-genderless:before {
+ content: "\f22d"
+}
+
+.fa-facebook-official:before {
+ content: "\f230"
+}
+
+.fa-pinterest-p:before {
+ content: "\f231"
+}
+
+.fa-whatsapp:before {
+ content: "\f232"
+}
+
+.fa-server:before {
+ content: "\f233"
+}
+
+.fa-user-plus:before {
+ content: "\f234"
+}
+
+.fa-user-times:before {
+ content: "\f235"
+}
+
+.fa-hotel:before, .fa-bed:before {
+ content: "\f236"
+}
+
+.fa-viacoin:before {
+ content: "\f237"
+}
+
+.fa-train:before {
+ content: "\f238"
+}
+
+.fa-subway:before {
+ content: "\f239"
+}
+
+.fa-medium:before {
+ content: "\f23a"
+}
+
+.fa-yc:before, .fa-y-combinator:before {
+ content: "\f23b"
+}
+
+.fa-optin-monster:before {
+ content: "\f23c"
+}
+
+.fa-opencart:before {
+ content: "\f23d"
+}
+
+.fa-expeditedssl:before {
+ content: "\f23e"
+}
+
+.fa-battery-4:before, .fa-battery:before, .fa-battery-full:before {
+ content: "\f240"
+}
+
+.fa-battery-3:before, .fa-battery-three-quarters:before {
+ content: "\f241"
+}
+
+.fa-battery-2:before, .fa-battery-half:before {
+ content: "\f242"
+}
+
+.fa-battery-1:before, .fa-battery-quarter:before {
+ content: "\f243"
+}
+
+.fa-battery-0:before, .fa-battery-empty:before {
+ content: "\f244"
+}
+
+.fa-mouse-pointer:before {
+ content: "\f245"
+}
+
+.fa-i-cursor:before {
+ content: "\f246"
+}
+
+.fa-object-group:before {
+ content: "\f247"
+}
+
+.fa-object-ungroup:before {
+ content: "\f248"
+}
+
+.fa-sticky-note:before {
+ content: "\f249"
+}
+
+.fa-sticky-note-o:before {
+ content: "\f24a"
+}
+
+.fa-cc-jcb:before {
+ content: "\f24b"
+}
+
+.fa-cc-diners-club:before {
+ content: "\f24c"
+}
+
+.fa-clone:before {
+ content: "\f24d"
+}
+
+.fa-balance-scale:before {
+ content: "\f24e"
+}
+
+.fa-hourglass-o:before {
+ content: "\f250"
+}
+
+.fa-hourglass-1:before, .fa-hourglass-start:before {
+ content: "\f251"
+}
+
+.fa-hourglass-2:before, .fa-hourglass-half:before {
+ content: "\f252"
+}
+
+.fa-hourglass-3:before, .fa-hourglass-end:before {
+ content: "\f253"
+}
+
+.fa-hourglass:before {
+ content: "\f254"
+}
+
+.fa-hand-grab-o:before, .fa-hand-rock-o:before {
+ content: "\f255"
+}
+
+.fa-hand-stop-o:before, .fa-hand-paper-o:before {
+ content: "\f256"
+}
+
+.fa-hand-scissors-o:before {
+ content: "\f257"
+}
+
+.fa-hand-lizard-o:before {
+ content: "\f258"
+}
+
+.fa-hand-spock-o:before {
+ content: "\f259"
+}
+
+.fa-hand-pointer-o:before {
+ content: "\f25a"
+}
+
+.fa-hand-peace-o:before {
+ content: "\f25b"
+}
+
+.fa-trademark:before {
+ content: "\f25c"
+}
+
+.fa-registered:before {
+ content: "\f25d"
+}
+
+.fa-creative-commons:before {
+ content: "\f25e"
+}
+
+.fa-gg:before {
+ content: "\f260"
+}
+
+.fa-gg-circle:before {
+ content: "\f261"
+}
+
+.fa-tripadvisor:before {
+ content: "\f262"
+}
+
+.fa-odnoklassniki:before {
+ content: "\f263"
+}
+
+.fa-odnoklassniki-square:before {
+ content: "\f264"
+}
+
+.fa-get-pocket:before {
+ content: "\f265"
+}
+
+.fa-wikipedia-w:before {
+ content: "\f266"
+}
+
+.fa-safari:before {
+ content: "\f267"
+}
+
+.fa-chrome:before {
+ content: "\f268"
+}
+
+.fa-firefox:before {
+ content: "\f269"
+}
+
+.fa-opera:before {
+ content: "\f26a"
+}
+
+.fa-internet-explorer:before {
+ content: "\f26b"
+}
+
+.fa-tv:before, .fa-television:before {
+ content: "\f26c"
+}
+
+.fa-contao:before {
+ content: "\f26d"
+}
+
+.fa-500px:before {
+ content: "\f26e"
+}
+
+.fa-amazon:before {
+ content: "\f270"
+}
+
+.fa-calendar-plus-o:before {
+ content: "\f271"
+}
+
+.fa-calendar-minus-o:before {
+ content: "\f272"
+}
+
+.fa-calendar-times-o:before {
+ content: "\f273"
+}
+
+.fa-calendar-check-o:before {
+ content: "\f274"
+}
+
+.fa-industry:before {
+ content: "\f275"
+}
+
+.fa-map-pin:before {
+ content: "\f276"
+}
+
+.fa-map-signs:before {
+ content: "\f277"
+}
+
+.fa-map-o:before {
+ content: "\f278"
+}
+
+.fa-map:before {
+ content: "\f279"
+}
+
+.fa-commenting:before {
+ content: "\f27a"
+}
+
+.fa-commenting-o:before {
+ content: "\f27b"
+}
+
+.fa-houzz:before {
+ content: "\f27c"
+}
+
+.fa-vimeo:before {
+ content: "\f27d"
+}
+
+.fa-black-tie:before {
+ content: "\f27e"
+}
+
+.fa-fonticons:before {
+ content: "\f280"
+}
+
+.fa-reddit-alien:before {
+ content: "\f281"
+}
+
+.fa-edge:before {
+ content: "\f282"
+}
+
+.fa-credit-card-alt:before {
+ content: "\f283"
+}
+
+.fa-codiepie:before {
+ content: "\f284"
+}
+
+.fa-modx:before {
+ content: "\f285"
+}
+
+.fa-fort-awesome:before {
+ content: "\f286"
+}
+
+.fa-usb:before {
+ content: "\f287"
+}
+
+.fa-product-hunt:before {
+ content: "\f288"
+}
+
+.fa-mixcloud:before {
+ content: "\f289"
+}
+
+.fa-scribd:before {
+ content: "\f28a"
+}
+
+.fa-pause-circle:before {
+ content: "\f28b"
+}
+
+.fa-pause-circle-o:before {
+ content: "\f28c"
+}
+
+.fa-stop-circle:before {
+ content: "\f28d"
+}
+
+.fa-stop-circle-o:before {
+ content: "\f28e"
+}
+
+.fa-shopping-bag:before {
+ content: "\f290"
+}
+
+.fa-shopping-basket:before {
+ content: "\f291"
+}
+
+.fa-hashtag:before {
+ content: "\f292"
+}
+
+.fa-bluetooth:before {
+ content: "\f293"
+}
+
+.fa-bluetooth-b:before {
+ content: "\f294"
+}
+
+.fa-percent:before {
+ content: "\f295"
+}
+
+.fa-gitlab:before {
+ content: "\f296"
+}
+
+.fa-wpbeginner:before {
+ content: "\f297"
+}
+
+.fa-wpforms:before {
+ content: "\f298"
+}
+
+.fa-envira:before {
+ content: "\f299"
+}
+
+.fa-universal-access:before {
+ content: "\f29a"
+}
+
+.fa-wheelchair-alt:before {
+ content: "\f29b"
+}
+
+.fa-question-circle-o:before {
+ content: "\f29c"
+}
+
+.fa-blind:before {
+ content: "\f29d"
+}
+
+.fa-audio-description:before {
+ content: "\f29e"
+}
+
+.fa-volume-control-phone:before {
+ content: "\f2a0"
+}
+
+.fa-braille:before {
+ content: "\f2a1"
+}
+
+.fa-assistive-listening-systems:before {
+ content: "\f2a2"
+}
+
+.fa-asl-interpreting:before, .fa-american-sign-language-interpreting:before {
+ content: "\f2a3"
+}
+
+.fa-deafness:before, .fa-hard-of-hearing:before, .fa-deaf:before {
+ content: "\f2a4"
+}
+
+.fa-glide:before {
+ content: "\f2a5"
+}
+
+.fa-glide-g:before {
+ content: "\f2a6"
+}
+
+.fa-signing:before, .fa-sign-language:before {
+ content: "\f2a7"
+}
+
+.fa-low-vision:before {
+ content: "\f2a8"
+}
+
+.fa-viadeo:before {
+ content: "\f2a9"
+}
+
+.fa-viadeo-square:before {
+ content: "\f2aa"
+}
+
+.fa-snapchat:before {
+ content: "\f2ab"
+}
+
+.fa-snapchat-ghost:before {
+ content: "\f2ac"
+}
+
+.fa-snapchat-square:before {
+ content: "\f2ad"
+}
+
+.fa-pied-piper:before {
+ content: "\f2ae"
+}
+
+.fa-first-order:before {
+ content: "\f2b0"
+}
+
+.fa-yoast:before {
+ content: "\f2b1"
+}
+
+.fa-themeisle:before {
+ content: "\f2b2"
+}
+
+.fa-google-plus-circle:before, .fa-google-plus-official:before {
+ content: "\f2b3"
+}
+
+.fa-fa:before, .fa-font-awesome:before {
+ content: "\f2b4"
+}
+
+.fa-handshake-o:before {
+ content: "\f2b5"
+}
+
+.fa-envelope-open:before {
+ content: "\f2b6"
+}
+
+.fa-envelope-open-o:before {
+ content: "\f2b7"
+}
+
+.fa-linode:before {
+ content: "\f2b8"
+}
+
+.fa-address-book:before {
+ content: "\f2b9"
+}
+
+.fa-address-book-o:before {
+ content: "\f2ba"
+}
+
+.fa-vcard:before, .fa-address-card:before {
+ content: "\f2bb"
+}
+
+.fa-vcard-o:before, .fa-address-card-o:before {
+ content: "\f2bc"
+}
+
+.fa-user-circle:before {
+ content: "\f2bd"
+}
+
+.fa-user-circle-o:before {
+ content: "\f2be"
+}
+
+.fa-user-o:before {
+ content: "\f2c0"
+}
+
+.fa-id-badge:before {
+ content: "\f2c1"
+}
+
+.fa-drivers-license:before, .fa-id-card:before {
+ content: "\f2c2"
+}
+
+.fa-drivers-license-o:before, .fa-id-card-o:before {
+ content: "\f2c3"
+}
+
+.fa-quora:before {
+ content: "\f2c4"
+}
+
+.fa-free-code-camp:before {
+ content: "\f2c5"
+}
+
+.fa-telegram:before {
+ content: "\f2c6"
+}
+
+.fa-thermometer-4:before, .fa-thermometer:before, .fa-thermometer-full:before {
+ content: "\f2c7"
+}
+
+.fa-thermometer-3:before, .fa-thermometer-three-quarters:before {
+ content: "\f2c8"
+}
+
+.fa-thermometer-2:before, .fa-thermometer-half:before {
+ content: "\f2c9"
+}
+
+.fa-thermometer-1:before, .fa-thermometer-quarter:before {
+ content: "\f2ca"
+}
+
+.fa-thermometer-0:before, .fa-thermometer-empty:before {
+ content: "\f2cb"
+}
+
+.fa-shower:before {
+ content: "\f2cc"
+}
+
+.fa-bathtub:before, .fa-s15:before, .fa-bath:before {
+ content: "\f2cd"
+}
+
+.fa-podcast:before {
+ content: "\f2ce"
+}
+
+.fa-window-maximize:before {
+ content: "\f2d0"
+}
+
+.fa-window-minimize:before {
+ content: "\f2d1"
+}
+
+.fa-window-restore:before {
+ content: "\f2d2"
+}
+
+.fa-times-rectangle:before, .fa-window-close:before {
+ content: "\f2d3"
+}
+
+.fa-times-rectangle-o:before, .fa-window-close-o:before {
+ content: "\f2d4"
+}
+
+.fa-bandcamp:before {
+ content: "\f2d5"
+}
+
+.fa-grav:before {
+ content: "\f2d6"
+}
+
+.fa-etsy:before {
+ content: "\f2d7"
+}
+
+.fa-imdb:before {
+ content: "\f2d8"
+}
+
+.fa-ravelry:before {
+ content: "\f2d9"
+}
+
+.fa-eercast:before {
+ content: "\f2da"
+}
+
+.fa-microchip:before {
+ content: "\f2db"
+}
+
+.fa-snowflake-o:before {
+ content: "\f2dc"
+}
+
+.fa-superpowers:before {
+ content: "\f2dd"
+}
+
+.fa-wpexplorer:before {
+ content: "\f2de"
+}
+
+.fa-meetup:before {
+ content: "\f2e0"
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0
+}
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto
+}
diff --git a/docs/theme/pdf/fonts/material-icons.css b/docs/theme/pdf/fonts/material-icons.css
new file mode 100644
index 000000000..aa116394c
--- /dev/null
+++ b/docs/theme/pdf/fonts/material-icons.css
@@ -0,0 +1,24 @@
+/*!
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE
+ * DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+ * SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING PERMISSIONS AND
+ * LIMITATIONS UNDER THE LICENSE.
+ */
+
+@font-face {
+ font-family: "Material Icons";
+ font-style: normal;
+ font-weight: 400;
+ src: local("Material Icons"),
+ local("MaterialIcons-Regular"),
+ url("specimen/MaterialIcons-Regular.woff2") format("woff2"),
+ url("specimen/MaterialIcons-Regular.woff") format("woff"),
+ url("specimen/MaterialIcons-Regular.ttf") format("truetype");
+}
diff --git a/docs/theme/pdf/fonts/specimen/FontAwesome.ttf b/docs/theme/pdf/fonts/specimen/FontAwesome.ttf
new file mode 100644
index 000000000..35acda2fa
Binary files /dev/null and b/docs/theme/pdf/fonts/specimen/FontAwesome.ttf differ
diff --git a/docs/theme/pdf/fonts/specimen/FontAwesome.woff b/docs/theme/pdf/fonts/specimen/FontAwesome.woff
new file mode 100644
index 000000000..400014a4b
Binary files /dev/null and b/docs/theme/pdf/fonts/specimen/FontAwesome.woff differ
diff --git a/docs/theme/pdf/fonts/specimen/FontAwesome.woff2 b/docs/theme/pdf/fonts/specimen/FontAwesome.woff2
new file mode 100644
index 000000000..4d13fc604
Binary files /dev/null and b/docs/theme/pdf/fonts/specimen/FontAwesome.woff2 differ
diff --git a/docs/theme/pdf/fonts/specimen/MaterialIcons-Regular.ttf b/docs/theme/pdf/fonts/specimen/MaterialIcons-Regular.ttf
new file mode 100644
index 000000000..7015564ad
Binary files /dev/null and b/docs/theme/pdf/fonts/specimen/MaterialIcons-Regular.ttf differ
diff --git a/docs/theme/pdf/fonts/specimen/MaterialIcons-Regular.woff b/docs/theme/pdf/fonts/specimen/MaterialIcons-Regular.woff
new file mode 100644
index 000000000..b648a3eea
Binary files /dev/null and b/docs/theme/pdf/fonts/specimen/MaterialIcons-Regular.woff differ
diff --git a/docs/theme/pdf/fonts/specimen/MaterialIcons-Regular.woff2 b/docs/theme/pdf/fonts/specimen/MaterialIcons-Regular.woff2
new file mode 100644
index 000000000..9fa211252
Binary files /dev/null and b/docs/theme/pdf/fonts/specimen/MaterialIcons-Regular.woff2 differ
diff --git a/docs/theme/pdf/package-lock.json b/docs/theme/pdf/package-lock.json
new file mode 100644
index 000000000..f19306f23
--- /dev/null
+++ b/docs/theme/pdf/package-lock.json
@@ -0,0 +1,1505 @@
+{
+ "name": "mkpdfs-design-sample",
+ "version": "1.0.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true
+ },
+ "ajv": {
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
+ "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "2.0.1",
+ "fast-json-stable-stringify": "2.0.0",
+ "json-schema-traverse": "0.4.1",
+ "uri-js": "4.2.2"
+ }
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+ "dev": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
+ "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+ "dev": true,
+ "requires": {
+ "delegates": "1.0.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true
+ },
+ "asn1": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": "2.1.2"
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ },
+ "async-foreach": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
+ "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "dev": true,
+ "requires": {
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "block-stream": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+ "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "2.1.1",
+ "map-obj": "1.0.1"
+ }
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wrap-ansi": "2.1.0"
+ }
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
+ "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
+ "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "4.1.5",
+ "which": "1.3.1"
+ }
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "requires": {
+ "array-find-index": "1.0.2"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+ "dev": true
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "dev": true,
+ "requires": {
+ "jsbn": "0.1.1",
+ "safer-buffer": "2.1.2"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "0.2.1"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+ "dev": true
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "2.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dev": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.7",
+ "mime-types": "2.1.22"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fstream": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
+ "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.15",
+ "inherits": "2.0.3",
+ "mkdirp": "0.5.1",
+ "rimraf": "2.6.3"
+ }
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+ "dev": true,
+ "requires": {
+ "aproba": "1.2.0",
+ "console-control-strings": "1.1.0",
+ "has-unicode": "2.0.1",
+ "object-assign": "4.1.1",
+ "signal-exit": "3.0.2",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wide-align": "1.1.3"
+ }
+ },
+ "gaze": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
+ "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
+ "dev": true,
+ "requires": {
+ "globule": "1.2.1"
+ }
+ },
+ "get-caller-file": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globule": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
+ "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.3",
+ "lodash": "4.17.15",
+ "minimatch": "3.0.4"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.15",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
+ "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
+ "dev": true
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+ "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+ "dev": true,
+ "requires": {
+ "ajv": "6.10.0",
+ "har-schema": "2.0.0"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+ "dev": true
+ },
+ "hosted-git-info": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
+ "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
+ "dev": true
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.16.1"
+ }
+ },
+ "in-publish": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
+ "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+ "dev": true
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "js-base64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz",
+ "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==",
+ "dev": true
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "dev": true
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ }
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "dev": true,
+ "requires": {
+ "invert-kv": "1.0.0"
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.15",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "strip-bom": "2.0.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.15",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+ "dev": true
+ },
+ "lodash.assign": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
+ "dev": true
+ },
+ "lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+ "dev": true
+ },
+ "lodash.mergewith": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
+ "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
+ "dev": true
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "0.4.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ }
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
+ "material-design-color": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/material-design-color/-/material-design-color-2.3.2.tgz",
+ "integrity": "sha1-6K+VjYUqh0e/shHkjOEoK9qRiBU=",
+ "dev": true
+ },
+ "material-shadows": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/material-shadows/-/material-shadows-3.0.1.tgz",
+ "integrity": "sha1-WGrRKxZzYKjk6Je/dTDLaazqURA=",
+ "dev": true
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "2.1.0",
+ "decamelize": "1.2.0",
+ "loud-rejection": "1.6.0",
+ "map-obj": "1.0.1",
+ "minimist": "1.2.0",
+ "normalize-package-data": "2.5.0",
+ "object-assign": "4.1.1",
+ "read-pkg-up": "1.0.1",
+ "redent": "1.0.0",
+ "trim-newlines": "1.0.0"
+ }
+ },
+ "mime-db": {
+ "version": "1.38.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz",
+ "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.22",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz",
+ "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.38.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ }
+ }
+ },
+ "modularscale-sass": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/modularscale-sass/-/modularscale-sass-3.0.8.tgz",
+ "integrity": "sha512-NOO6NLXPiVG8T/ZkXImxSj1YtvzF37suAGxc9ty0pmQrU998fmJqR6kNqs+HmFqOjeCRJ3roBfA9Arohta2sBQ==",
+ "dev": true
+ },
+ "nan": {
+ "version": "2.13.2",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz",
+ "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==",
+ "dev": true
+ },
+ "node-gyp": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
+ "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
+ "dev": true,
+ "requires": {
+ "fstream": "1.0.12",
+ "glob": "7.1.3",
+ "graceful-fs": "4.1.15",
+ "mkdirp": "0.5.1",
+ "nopt": "3.0.6",
+ "npmlog": "4.1.2",
+ "osenv": "0.1.5",
+ "request": "2.88.0",
+ "rimraf": "2.6.3",
+ "semver": "5.3.0",
+ "tar": "2.2.2",
+ "which": "1.3.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+ "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+ "dev": true
+ }
+ }
+ },
+ "node-sass": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.11.0.tgz",
+ "integrity": "sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==",
+ "dev": true,
+ "requires": {
+ "async-foreach": "0.1.3",
+ "chalk": "1.1.3",
+ "cross-spawn": "3.0.1",
+ "gaze": "1.1.3",
+ "get-stdin": "4.0.1",
+ "glob": "7.1.3",
+ "in-publish": "2.0.0",
+ "lodash.assign": "4.2.0",
+ "lodash.clonedeep": "4.5.0",
+ "lodash.mergewith": "4.6.2",
+ "meow": "3.7.0",
+ "mkdirp": "0.5.1",
+ "nan": "2.13.2",
+ "node-gyp": "3.8.0",
+ "npmlog": "4.1.2",
+ "request": "2.88.0",
+ "sass-graph": "2.2.4",
+ "stdout-stream": "1.4.1",
+ "true-case-path": "1.0.3"
+ }
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1.1.1"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "2.7.1",
+ "resolve": "1.10.0",
+ "semver": "5.7.0",
+ "validate-npm-package-license": "3.0.4"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+ "dev": true,
+ "requires": {
+ "are-we-there-yet": "1.1.5",
+ "console-control-strings": "1.1.0",
+ "gauge": "2.7.4",
+ "set-blocking": "2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true
+ },
+ "os-locale": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+ "dev": true,
+ "requires": {
+ "lcid": "1.0.0"
+ }
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "1.3.2"
+ }
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.15",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
+ "dev": true
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "psl": {
+ "version": "1.1.31",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
+ "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "1.1.0",
+ "normalize-package-data": "2.5.0",
+ "path-type": "1.1.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "1.1.2",
+ "read-pkg": "1.1.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "2.1.0",
+ "strip-indent": "1.0.1"
+ }
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "request": {
+ "version": "2.88.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+ "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "0.7.0",
+ "aws4": "1.8.0",
+ "caseless": "0.12.0",
+ "combined-stream": "1.0.7",
+ "extend": "3.0.2",
+ "forever-agent": "0.6.1",
+ "form-data": "2.3.3",
+ "har-validator": "5.1.3",
+ "http-signature": "1.2.0",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.22",
+ "oauth-sign": "0.9.0",
+ "performance-now": "2.1.0",
+ "qs": "6.5.2",
+ "safe-buffer": "5.1.2",
+ "tough-cookie": "2.4.3",
+ "tunnel-agent": "0.6.0",
+ "uuid": "3.3.2"
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz",
+ "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.6"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.3"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "sass-graph": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
+ "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.3",
+ "lodash": "4.17.15",
+ "scss-tokenizer": "0.2.3",
+ "yargs": "7.1.0"
+ }
+ },
+ "scss-tokenizer": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
+ "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
+ "dev": true,
+ "requires": {
+ "js-base64": "2.5.1",
+ "source-map": "0.4.4"
+ }
+ },
+ "semver": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+ "dev": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "dev": true,
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ },
+ "spdx-correct": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
+ "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
+ "dev": true,
+ "requires": {
+ "spdx-expression-parse": "3.0.0",
+ "spdx-license-ids": "3.0.4"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
+ "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "2.2.0",
+ "spdx-license-ids": "3.0.4"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz",
+ "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==",
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+ "dev": true,
+ "requires": {
+ "asn1": "0.2.4",
+ "assert-plus": "1.0.0",
+ "bcrypt-pbkdf": "1.0.2",
+ "dashdash": "1.14.1",
+ "ecc-jsbn": "0.1.2",
+ "getpass": "0.1.7",
+ "jsbn": "0.1.1",
+ "safer-buffer": "2.1.2",
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "stdout-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
+ "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "tar": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
+ "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
+ "dev": true,
+ "requires": {
+ "block-stream": "0.0.9",
+ "fstream": "1.0.12",
+ "inherits": "2.0.3"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "dev": true,
+ "requires": {
+ "psl": "1.1.31",
+ "punycode": "1.4.1"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ }
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
+ "true-case-path": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
+ "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.3"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true
+ },
+ "uri-js": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.1"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "uuid": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+ "dev": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "3.1.0",
+ "spdx-expression-parse": "3.0.0"
+ }
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "1.3.0"
+ }
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+ "dev": true
+ },
+ "wide-align": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+ "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
+ "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
+ "dev": true,
+ "requires": {
+ "camelcase": "3.0.0",
+ "cliui": "3.2.0",
+ "decamelize": "1.2.0",
+ "get-caller-file": "1.0.3",
+ "os-locale": "1.4.0",
+ "read-pkg-up": "1.0.1",
+ "require-directory": "2.1.1",
+ "require-main-filename": "1.0.1",
+ "set-blocking": "2.0.0",
+ "string-width": "1.0.2",
+ "which-module": "1.0.0",
+ "y18n": "3.2.1",
+ "yargs-parser": "5.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+ "dev": true
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
+ "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
+ "dev": true,
+ "requires": {
+ "camelcase": "3.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+ "dev": true
+ }
+ }
+ }
+ }
+}
diff --git a/docs/theme/pdf/package.json b/docs/theme/pdf/package.json
new file mode 100644
index 000000000..c54cc1dfd
--- /dev/null
+++ b/docs/theme/pdf/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "mkpdfs-design-sample",
+ "version": "1.0.0",
+ "description": "The default mkpdfs design to use when generating the pdf report. This style will only be used for the pdf, not to be use for the webversion of the documentation as it can conflict with other themes.",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1",
+ "build": "node-sass report.scss ../../css/pdf.css",
+ "build-compressed": "node-sass report.scss ../../css/pdf.css --output-style compressed"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/comwes/mkpdfs-design-sample"
+ },
+ "keywords": [
+ "mkdocs",
+ "documentation",
+ "pdf",
+ "markdown",
+ "plugin"
+ ],
+ "devDependencies": {
+ "material-design-color": "^2.3.2",
+ "material-shadows": "^3.0.1",
+ "modularscale-sass": "^3.0.8",
+ "node-sass": "^4.11.0"
+ },
+ "author": {
+ "name": "Comwes, Gerry Ntabuhashe",
+ "email": "public@comwes.eu, gnt@comwes.eu",
+ "url": "https://comwes.eu, https://mkpdfs.comwes.eu"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/comwes/mkpdfs-design-sample/issues"
+ },
+ "homepage": "https://github.com/comwes/mkpdfs-design-sample#readme"
+}
diff --git a/docs/theme/pdf/report.scss b/docs/theme/pdf/report.scss
new file mode 100644
index 000000000..5500bacae
--- /dev/null
+++ b/docs/theme/pdf/report.scss
@@ -0,0 +1,323 @@
+@import "https://fonts.googleapis.com/icon?family=Material+Icons";
+
+@import "stylesheets/extensions.scss";
+
+$bgColor: rgb(63, 81, 181);
+$bgTextColor: #fff;
+
+
+@font-face {
+ font-family: Fira Sans;
+ font-weight: 400;
+ src: url(FiraSans-Regular.otf);
+}
+
+
+@font-face {
+ font-family: Fira Sans;
+ font-style: italic;
+ font-weight: 400;
+ src: url(FiraSans-Italic.otf);
+}
+
+
+@font-face {
+ font-family: Fira Sans;
+ font-weight: 300;
+ src: url(FiraSans-Light.otf);
+}
+
+
+@font-face {
+ font-family: Fira Sans;
+ font-style: italic;
+ font-weight: 300;
+ src: url(FiraSans-LightItalic.otf);
+}
+
+
+@font-face {
+ font-family: Fira Sans;
+ font-weight: bold;
+ src: url(FiraSans-Bold.otf);
+}
+
+
+@page {
+ @top-left {
+ background: $bgColor;
+ content: counter(page);
+ height: 1cm;
+ color: $bgTextColor;
+ text-align: center;
+ width: 1cm;
+ }
+
+ @top-center {
+ background: $bgColor;
+ content: '';
+ display: block;
+ height: .05cm;
+ opacity: .5;
+ width: 100%;
+ }
+
+ @top-right {
+ content: string(heading);
+ font-size: 9pt;
+ height: 1cm;
+ vertical-align: middle;
+ width: 100%;
+ }
+
+ @bottom-right {
+ content: string(copyright);
+ font-size: 9pt;
+ height: 1cm;
+ vertical-align: middle;
+ width: 100%;
+ }
+}
+
+
+@page :blank {
+ @top-left {
+ background: none;
+ content: '';
+ }
+
+ @top-center {
+ content: none;
+ }
+
+ @top-right {
+ content: none;
+ }
+
+ @bottom-right {
+ content: none;
+ }
+}
+
+
+@page no-chapter {
+ @top-left {
+ background: none;
+ content: none;
+ }
+
+ @top-center {
+ content: none;
+ }
+
+ @top-right {
+ content: none;
+ }
+
+ @bottom-right {
+ content: none;
+ }
+}
+
+
+@page :first {
+ background: url(../img/logo.png) no-repeat center;
+ background-size: auto;
+ margin: 0;
+ counter-reset: page -1;
+}
+
+
+html {
+ article#doc-cover h1#doc-title {
+ color: $bgColor;
+ font-size: 38pt;
+ margin: 5cm 2cm 0 2cm;
+ page: no-chapter;
+ width: 100%;
+ }
+ body article#doc-cover {
+ break-after: right;
+ align-content: space-between;
+ display: flex;
+ flex-wrap: wrap;
+ margin: 0;
+ height: 297mm;
+ address {
+ background: $bgColor;
+ flex: 1;
+ color: $bgTextColor;
+ margin: 0 -2cm;
+ padding: 1cm 0;
+ font-style: normal;
+ white-space: pre-wrap;
+ &:last-of-type {
+ padding-right: 3cm;
+ text-align: right;
+ }
+ &:first-of-type {
+ padding-left: 3cm;
+ }
+ p{
+ margin: 0;
+ padding: 0;
+ }
+ p#copyright {
+ string-set: copyright content();
+ }
+ }
+ }
+ color: #393939;
+ font-family: Fira Sans, helvetica, arial;
+ font-size: 11pt;
+ font-weight: 300;
+ line-height: 1.5;
+}
+
+@page chapter {
+ background: $bgColor;
+ margin: 0;
+ @top-left {
+ content: none;
+ }
+
+ @top-center {
+ content: none;
+ }
+
+ @top-right {
+ content: none;
+ }
+}
+
+
+.html iframe, html img, .html svg {
+ max-width: 100%;
+ margin-top: 5px;
+}
+
+html body {
+ h1 {
+ color: $bgColor;
+ string-set: heading content();
+ }
+ h2, h3, h4 {
+ color: black;
+ font-weight: 400;
+ }
+ h2 {
+ font-size: 20pt;
+ }
+ h3 {
+ font-weight: 300;
+ font-size: 15pt;
+ }
+ h4 {
+ font-size: 13pt;
+ }
+ article {
+ break-before: always;
+ video {
+ source::before {
+ content: attr(src);
+ }
+ &[src]::before {
+ content: attr(data-title) " https://mkpdfs.comwes.eu" attr(src);
+ }
+ }
+ }
+}
+
+h2, h3, h4, h5 {
+ margin-bottom: 0.1em;
+}
+
+html body article {
+ h1, h2, h3, h4, h5, h6 {
+ a {
+ &.external-link::after {
+ content: none;
+ }
+ }
+ }
+ a {
+ color: $bgColor;
+ text-decoration: none;
+ &.external-link::after {
+ content: " (" attr(href) ")";
+ font-style: italic;
+ }
+ }
+ table {
+ border-spacing: 0;
+ border-collapse: collapse;
+ tr {
+ border-bottom: 1px solid #888;
+ td {
+ padding: 4px 7px;
+ }
+ }
+ }
+ contents {
+ break-before: right;
+ break-after: left;
+ page: no-chapter;
+ h2 {
+ font-size: 20pt;
+ font-weight: 400;
+ margin-bottom: 3cm;
+ }
+ h3 {
+ font-weight: 500;
+ margin: 3em 0 1em;
+ &::before {
+ background: $bgColor;
+ content: '';
+ display: block;
+ height: .08cm;
+ margin-bottom: .25cm;
+ width: 2cm;
+ }
+ }
+ ul {
+ list-style: none;
+ padding-left: .5cm;
+ li {
+ border-top: .25pt solid #c1c1c1;
+ margin: .15cm 0;
+ padding-top: .15cm;
+ &::before {
+ color: $bgColor;
+ content: '• ';
+ font-size: 40pt;
+ line-height: 16pt;
+ vertical-align: bottom;
+ }
+ a {
+ color: inherit;
+ text-decoration: inherit;
+ }
+ }
+ }
+ > ul {
+ list-style: none;
+ padding-left: 0;
+ }
+ div h4 a::after, ul li a::after {
+ color: $bgColor;
+ content: target-counter(attr(href), page);
+ float: right;
+ }
+ div h4 {
+ margin: .15cm 0;
+ padding-top: 0;
+ padding-bottom: 0;
+ a {
+ color: inherit;
+ }
+ }
+ }
+ p {
+ text-align: justify;
+ }
+}
diff --git a/docs/theme/pdf/stylesheets/_config.scss b/docs/theme/pdf/stylesheets/_config.scss
new file mode 100644
index 000000000..1e5226b9c
--- /dev/null
+++ b/docs/theme/pdf/stylesheets/_config.scss
@@ -0,0 +1,93 @@
+////
+/// Copyright (c) 2016-2019 Martin Donath
+///
+/// Permission is hereby granted, free of charge, to any person obtaining a
+/// copy of this software and associated documentation files (the "Software"),
+/// to deal in the Software without restriction, including without limitation
+/// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+/// and/or sell copies of the Software, and to permit persons to whom the
+/// Software is furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+/// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+/// DEALINGS
+////
+
+// ----------------------------------------------------------------------------
+// Variables: typography
+// ----------------------------------------------------------------------------
+
+// Modular typographic scale
+$ms-base: px2rem(20px);
+$ms-ratio: $major-third;
+
+// ----------------------------------------------------------------------------
+// Variables: breakpoints
+// ----------------------------------------------------------------------------
+
+// stylelint-disable unit-whitelist
+
+// Device-specific breakpoints
+$break-devices: (
+ mobile: (
+ portrait: px2em(220px) px2em(479px),
+ landscape: px2em(480px) px2em(719px)
+ ),
+ tablet: (
+ portrait: px2em(720px) px2em(959px),
+ landscape: px2em(960px) px2em(1219px)
+ ),
+ screen: (
+ small: px2em(1220px) px2em(1599px),
+ medium: px2em(1600px) px2em(1999px),
+ large: px2em(2000px)
+ )
+);
+
+// stylelint-enable unit-whitelist
+
+// ----------------------------------------------------------------------------
+// Variables: base colors
+// ----------------------------------------------------------------------------
+
+// Primary and accent colors
+$md-color-primary: $clr-indigo-500 !default;
+$md-color-accent: $clr-indigo-a200 !default;
+
+// Shades of black
+$md-color-black: hsla(0, 0%, 0%, 0.87) !default;
+$md-color-black--light: hsla(0, 0%, 0%, 0.54) !default;
+$md-color-black--lighter: hsla(0, 0%, 0%, 0.26) !default;
+$md-color-black--lightest: hsla(0, 0%, 0%, 0.07) !default;
+$md-color-black--transparent: hsla(0, 0%, 0%, 0) !default;
+
+// Shades of white
+$md-color-white: hsla(0, 0%, 100%, 1) !default;
+$md-color-white--light: hsla(0, 0%, 100%, 0.7) !default;
+$md-color-white--lighter: hsla(0, 0%, 100%, 0.3) !default;
+$md-color-white--lightest: hsla(0, 0%, 100%, 0.12) !default;
+$md-color-white--transparent: hsla(0, 0%, 100%, 0) !default;
+
+// ----------------------------------------------------------------------------
+// Variables: sizing and spacing
+// ----------------------------------------------------------------------------
+
+// Icons
+$md-icon-size: $ms-base * 1.5;
+$md-icon-padding: $ms-base * 0.5;
+$md-icon-margin: $ms-base * 0.25;
+
+// Code blocks
+$md-code-background: hsla(0, 0%, 92.5%, 0.5);
+$md-code-color: #37474F;
+
+// Keystrokes
+$md-keyboard-background: #FCFCFC;
+$md-keyboard-color: #555555;
diff --git a/docs/theme/pdf/stylesheets/_extensions.scss b/docs/theme/pdf/stylesheets/_extensions.scss
new file mode 100644
index 000000000..f821d5df5
--- /dev/null
+++ b/docs/theme/pdf/stylesheets/_extensions.scss
@@ -0,0 +1,48 @@
+////
+/// Copyright (c) 2016-2019 Martin Donath
+///
+/// Permission is hereby granted, free of charge, to any person obtaining a
+/// copy of this software and associated documentation files (the "Software"),
+/// to deal in the Software without restriction, including without limitation
+/// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+/// and/or sell copies of the Software, and to permit persons to whom the
+/// Software is furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+/// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+/// DEALINGS
+////
+
+// ----------------------------------------------------------------------------
+// Dependencies
+// ----------------------------------------------------------------------------
+
+@import "../node_modules/modularscale-sass/stylesheets/modularscale";
+@import "../node_modules/material-design-color/material-color";
+@import "../node_modules/material-shadows/material-shadows";
+
+@import "helpers/break";
+@import "helpers/px2em";
+
+@import "config";
+
+@import "base/icons";
+
+@import "extensions/admonition";
+@import "extensions/codehilite";
+@import "extensions/footnotes";
+
+@import "extensions/pymdown/arithmatex";
+@import "extensions/pymdown/critic";
+@import "extensions/pymdown/details";
+@import "extensions/pymdown/emoji";
+@import "extensions/pymdown/inlinehilite";
+@import "extensions/pymdown/superfences";
+@import "extensions/pymdown/tasklist";
diff --git a/docs/theme/pdf/stylesheets/base/.stylelintrc b/docs/theme/pdf/stylesheets/base/.stylelintrc
new file mode 100644
index 000000000..422ff2c6f
--- /dev/null
+++ b/docs/theme/pdf/stylesheets/base/.stylelintrc
@@ -0,0 +1,7 @@
+{
+ "extends": "../../../../.stylelintrc",
+ "rules": {
+ "font-weight-notation": null,
+ "property-no-vendor-prefix": null
+ }
+}
diff --git a/docs/theme/pdf/stylesheets/base/_icons.scss b/docs/theme/pdf/stylesheets/base/_icons.scss
new file mode 100644
index 000000000..b6fb98e37
--- /dev/null
+++ b/docs/theme/pdf/stylesheets/base/_icons.scss
@@ -0,0 +1,50 @@
+////
+/// Copyright (c) 2016-2019 Martin Donath
+///
+/// Permission is hereby granted, free of charge, to any person obtaining a
+/// copy of this software and associated documentation files (the "Software"),
+/// to deal in the Software without restriction, including without limitation
+/// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+/// and/or sell copies of the Software, and to permit persons to whom the
+/// Software is furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+/// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+/// DEALINGS
+////
+
+// stylelint-disable font-family-no-missing-generic-family-keyword
+
+// ----------------------------------------------------------------------------
+// Rules
+// ----------------------------------------------------------------------------
+
+// Icon placeholders
+%md-icon {
+ font-family: "Material Icons";
+ font-style: normal;
+ font-variant: normal;
+ font-weight: normal;
+ line-height: 1;
+ text-transform: none;
+ white-space: nowrap;
+ speak: none;
+ word-wrap: normal;
+ direction: ltr;
+
+ // Icon rendered as button
+ &__button {
+ display: inline-block;
+ margin: $md-icon-margin;
+ padding: $md-icon-padding;
+ font-size: $md-icon-size;
+ cursor: pointer;
+ }
+}
diff --git a/docs/theme/pdf/stylesheets/extensions/_admonition.scss b/docs/theme/pdf/stylesheets/extensions/_admonition.scss
new file mode 100644
index 000000000..92123d348
--- /dev/null
+++ b/docs/theme/pdf/stylesheets/extensions/_admonition.scss
@@ -0,0 +1,120 @@
+////
+/// Copyright (c) 2016-2019 Martin Donath
+///
+/// Permission is hereby granted, free of charge, to any person obtaining a
+/// copy of this software and associated documentation files (the "Software"),
+/// to deal in the Software without restriction, including without limitation
+/// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+/// and/or sell copies of the Software, and to permit persons to whom the
+/// Software is furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+/// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+/// DEALINGS
+////
+
+// ----------------------------------------------------------------------------
+// Rules
+// ----------------------------------------------------------------------------
+
+// Scoped in typesetted content to match specificity of regular content
+article {
+
+ // Admonition extension
+ .admonition {
+ @include z-depth(2);
+
+ position: relative;
+ margin: 1.5625em 0;
+ padding: 0 px2rem(12px);
+ border-left: px2rem(4px) solid $clr-blue-a200;
+ border-radius: px2rem(2px);
+ font-size: ms(-1);
+ overflow: auto;
+
+ // Adjust for RTL languages
+ [dir="rtl"] & {
+ border-right: px2rem(4px) solid $clr-blue-a200;
+ border-left: none;
+ }
+
+ // Adjust spacing on last element
+ html & > :last-child {
+ margin-bottom: px2rem(12px);
+ }
+
+ // Adjust margin for nested admonition blocks
+ .admonition {
+ margin: 1em 0;
+ }
+
+ // Title
+ > .admonition-title {
+ margin: 0 px2rem(-12px);
+ padding: px2rem(8px) px2rem(12px) px2rem(8px) px2rem(10px);
+ border-bottom: px2rem(1px) solid transparentize($clr-blue-a200, 0.9);
+ background-color: transparentize($clr-blue-a200, 0.9);
+ font-weight: 700;
+
+ // Adjust for RTL languages
+ [dir="rtl"] & {
+ padding: px2rem(8px) px2rem(40px) px2rem(8px) px2rem(12px);
+ }
+
+ // Reset spacing, if title is the only element
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ // Build representational classes
+ @each $names, $appearance in (
+ abstract summary tldr: $clr-light-blue-a400 "\E8D2", // subject
+ info todo: $clr-cyan-a700 "\E88E", // info
+ tip hint important : $clr-teal-a700 "\E80E", // whatshot
+ success check done: $clr-green-a700 "\E876", // done
+ question help faq: $clr-light-green-a700 "\E887", // help
+ warning caution attention: $clr-orange-a400 "\E002", // warning
+ failure fail missing: $clr-red-a200 "\E14C", // clear
+ danger error: $clr-red-a400 "\E3E7", // flash_on
+ bug: $clr-pink-a400 "\E868", // bug_report
+ example: $clr-deep-purple-a400 "\E242", // format_list_numbered
+ quote cite: $clr-grey "\E244" // format_quote
+ ) {
+ $tint: nth($appearance, 1);
+
+ // Define base class
+ &%#{nth($names, 1)},
+ &.#{nth($names, 1)} {
+ border-left-color: $tint;
+
+ // Adjust for RTL languages
+ [dir="rtl"] & {
+ border-right-color: $tint;
+ }
+
+ // Title
+ > .admonition-title {
+ border-bottom-color: transparentize($tint, 0.9);
+ background-color: transparentize($tint, 0.9);
+ }
+ }
+
+ // Define synonyms for base class
+ @if length($names) > 1 {
+ @for $n from 2 through length($names) {
+ &.#{nth($names, $n)} {
+ @extend .admonition%#{nth($names, 1)};
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/docs/theme/pdf/stylesheets/extensions/_codehilite.scss b/docs/theme/pdf/stylesheets/extensions/_codehilite.scss
new file mode 100644
index 000000000..c45f7c972
--- /dev/null
+++ b/docs/theme/pdf/stylesheets/extensions/_codehilite.scss
@@ -0,0 +1,373 @@
+////
+/// Copyright (c) 2016-2019 Martin Donath
+///
+/// Permission is hereby granted, free of charge, to any person obtaining a
+/// copy of this software and associated documentation files (the "Software"),
+/// to deal in the Software without restriction, including without limitation
+/// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+/// and/or sell copies of the Software, and to permit persons to whom the
+/// Software is furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+/// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+/// DEALINGS
+////
+
+// ----------------------------------------------------------------------------
+// Variables
+// ----------------------------------------------------------------------------
+
+// Operators
+$codehilite-operator: inherit;
+$codehilite-operator-word: inherit;
+
+// Generics
+$codehilite-generic-emph: #000000;
+$codehilite-generic-error: #AA0000;
+$codehilite-generic-heading: #999999;
+$codehilite-generic-output: #888888;
+$codehilite-generic-prompt: #555555;
+$codehilite-generic-strong: inherit;
+$codehilite-generic-subheading: #AAAAAA;
+$codehilite-generic-traceback: #AA0000;
+
+// Diffs
+$codehilite-diff-deleted: #FFDDDD;
+$codehilite-diff-inserted: #DDFFDD;
+
+// Keywords
+$codehilite-keyword: #3B78E7;
+$codehilite-keyword-constant: #A71D5D;
+$codehilite-keyword-declaration: #3B78E7;
+$codehilite-keyword-namespace: #3B78E7;
+$codehilite-keyword-pseudo: #A71D5D;
+$codehilite-keyword-reserved: #3E61A2;
+$codehilite-keyword-type: #3E61A2;
+
+// Comments
+$codehilite-comment: #999999;
+$codehilite-comment-multiline: #999999;
+$codehilite-comment-preproc: #666666;
+$codehilite-comment-single: #999999;
+$codehilite-comment-shebang: #999999;
+$codehilite-comment-special: #999999;
+
+// Names
+$codehilite-name-attribute: #C2185B;
+$codehilite-name-builtin: #C2185B;
+$codehilite-name-builtin-pseudo: #3E61A2;
+$codehilite-name-class: #C2185B;
+$codehilite-name-constant: #3E61A2;
+$codehilite-name-decorator: #666666;
+$codehilite-name-entity: #666666;
+$codehilite-name-exception: #C2185B;
+$codehilite-name-function: #C2185B;
+$codehilite-name-label: #3B5179;
+$codehilite-name-namespace: #EC407A;
+$codehilite-name-tag: #3B78E7;
+$codehilite-name-variable: #3E61A2;
+$codehilite-name-variable-class: #3E61A2;
+$codehilite-name-variable-instance: #3E61A2;
+$codehilite-name-variable-global: #3E61A2;
+$codehilite-name-extension: #EC407A;
+
+// Numbers
+$codehilite-literal-number: #E74C3C;
+$codehilite-literal-number-float: #E74C3C;
+$codehilite-literal-number-hex: #E74C3C;
+$codehilite-literal-number-integer: #E74C3C;
+$codehilite-literal-number-integer-long: #E74C3C;
+$codehilite-literal-number-oct: #E74C3C;
+
+// Strings
+$codehilite-literal-string: #0D904F;
+$codehilite-literal-string-backticks: #0D904F;
+$codehilite-literal-string-char: #0D904F;
+$codehilite-literal-string-doc: #999999;
+$codehilite-literal-string-double: #0D904F;
+$codehilite-literal-string-escape: #183691;
+$codehilite-literal-string-heredoc: #183691;
+$codehilite-literal-string-interpol: #183691;
+$codehilite-literal-string-other: #183691;
+$codehilite-literal-string-regex: #009926;
+$codehilite-literal-string-single: #0D904F;
+$codehilite-literal-string-symbol: #0D904F;
+
+// Miscellaneous
+$codehilite-error: #A61717;
+$codehilite-whitespace: transparent;
+
+// ----------------------------------------------------------------------------
+// Rules: syntax highlighting
+// ----------------------------------------------------------------------------
+
+// Codehilite extension
+.codehilite {
+
+ // Operators
+ .o { color: $codehilite-operator; }
+ .ow { color: $codehilite-operator-word; }
+
+ // Generics
+ .ge { color: $codehilite-generic-emph; }
+ .gr { color: $codehilite-generic-error; }
+ .gh { color: $codehilite-generic-heading; }
+ .go { color: $codehilite-generic-output; }
+ .gp { color: $codehilite-generic-prompt; }
+ .gs { color: $codehilite-generic-strong; }
+ .gu { color: $codehilite-generic-subheading; }
+ .gt { color: $codehilite-generic-traceback; }
+
+ // Diffs
+ .gd { background-color: $codehilite-diff-deleted; }
+ .gi { background-color: $codehilite-diff-inserted; }
+
+ // Keywords
+ .k { color: $codehilite-keyword; }
+ .kc { color: $codehilite-keyword-constant; }
+ .kd { color: $codehilite-keyword-declaration; }
+ .kn { color: $codehilite-keyword-namespace; }
+ .kp { color: $codehilite-keyword-pseudo; }
+ .kr { color: $codehilite-keyword-reserved; }
+ .kt { color: $codehilite-keyword-type; }
+
+ // Comments
+ .c { color: $codehilite-comment; }
+ .cm { color: $codehilite-comment-multiline; }
+ .cp { color: $codehilite-comment-preproc; }
+ .c1 { color: $codehilite-comment-single; }
+ .ch { color: $codehilite-comment-shebang; }
+ .cs { color: $codehilite-comment-special; }
+
+ // Names
+ .na { color: $codehilite-name-attribute; }
+ .nb { color: $codehilite-name-builtin; }
+ .bp { color: $codehilite-name-builtin-pseudo; }
+ .nc { color: $codehilite-name-class; }
+ .no { color: $codehilite-name-constant; }
+ .nd { color: $codehilite-name-entity; }
+ .ni { color: $codehilite-name-entity; }
+ .ne { color: $codehilite-name-exception; }
+ .nf { color: $codehilite-name-function; }
+ .nl { color: $codehilite-name-label; }
+ .nn { color: $codehilite-name-namespace; }
+ .nt { color: $codehilite-name-tag; }
+ .nv { color: $codehilite-name-variable; }
+ .vc { color: $codehilite-name-variable-class; }
+ .vg { color: $codehilite-name-variable-global; }
+ .vi { color: $codehilite-name-variable-instance; }
+ .nx { color: $codehilite-name-extension; }
+
+ // Numbers
+ .m { color: $codehilite-literal-number; }
+ .mf { color: $codehilite-literal-number-float; }
+ .mh { color: $codehilite-literal-number-hex; }
+ .mi { color: $codehilite-literal-number-integer; }
+ .il { color: $codehilite-literal-number-integer-long; }
+ .mo { color: $codehilite-literal-number-oct; }
+
+ // Strings
+ .s { color: $codehilite-literal-string; }
+ .sb { color: $codehilite-literal-string-backticks; }
+ .sc { color: $codehilite-literal-string-char; }
+ .sd { color: $codehilite-literal-string-doc; }
+ .s2 { color: $codehilite-literal-string-double; }
+ .se { color: $codehilite-literal-string-escape; }
+ .sh { color: $codehilite-literal-string-heredoc; }
+ .si { color: $codehilite-literal-string-interpol; }
+ .sx { color: $codehilite-literal-string-other; }
+ .sr { color: $codehilite-literal-string-regex; }
+ .s1 { color: $codehilite-literal-string-single; }
+ .ss { color: $codehilite-literal-string-symbol; }
+
+ // Miscellaneous
+ .err { color: $codehilite-error; }
+ .w { color: $codehilite-whitespace; }
+
+ // Highlighted lines
+ .hll {
+ display: block;
+ margin: 0 px2rem(-12px);
+ padding: 0 px2rem(12px);
+ background-color: transparentize($clr-yellow-500, 0.5);
+
+ // [mobile -]: Stretch to whole width
+ @include break-to-device(mobile) {
+ margin: 0 px2rem(-16px);
+ padding: 0 px2rem(16px);
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------
+// Rules: layout
+// ----------------------------------------------------------------------------
+
+// Scoped in typesetted content to match specificity of regular content
+article {
+
+ // If code blocks are wrapped with codehilite, the styles must be adjusted
+ // so the marker stretches to the whole width and the padding is respected
+ .codehilite {
+ position: relative;
+ margin: 1em 0;
+ padding: 0;
+ border-radius: px2rem(2px);
+ background-color: $md-code-background;
+ color: $md-code-color;
+ line-height: 1.4;
+ -webkit-overflow-scrolling: touch;
+
+ // Actual container with code, overflowing
+ pre,
+ code {
+ display: block;
+ margin: 0;
+ padding: px2rem(10.5px) px2rem(12px);
+ background-color: transparent;
+ overflow: auto;
+ vertical-align: top;
+
+ // Override native scrollbar styles
+ &::-webkit-scrollbar {
+ width: px2rem(4px);
+ height: px2rem(4px);
+ }
+
+ // Style scrollbar thumb
+ &::-webkit-scrollbar-thumb {
+ background-color: $md-color-black--lighter;
+
+ // Hovered scrollbar thumb
+ &:hover {
+ background-color: $md-color-accent;
+ }
+ }
+ }
+ }
+
+ // If not using Pygments, code will be under pre > code
+ pre.codehilite {
+ overflow: visible;
+
+ // Actual container with code, overflowing
+ code {
+ display: block;
+ padding: px2rem(10.5px) px2rem(12px);
+ overflow: auto;
+ }
+ }
+
+ // Block with line numbers
+ .codehilitetable {
+ display: block;
+ margin: 1em 0;
+ border-radius: 0.2em;
+ font-size: ms(0);
+ overflow: hidden;
+
+ // Set table elements to block layout, because otherwise the whole flexbox
+ // hacking won't work correctly
+ tbody,
+ td {
+ display: block;
+ padding: 0;
+ }
+
+ // We need to use flexbox layout, because otherwise it's not possible to
+ // make the code container scroll while keeping the line numbers static
+ tr {
+ display: flex;
+ }
+
+ // The pre tags are nested inside a table, so we need to remove the
+ // margin because it collapses below all the overflows
+ .codehilite,
+ .linenodiv {
+ margin: 0;
+ border-radius: 0;
+ }
+
+ // Add spacing to line number container
+ .linenodiv {
+ padding: px2rem(10.5px) px2rem(12px);
+ }
+
+ // Disable user selection, so code can be easily copied without
+ // accidentally also copying the line numbers
+ .linenos {
+ background-color: $md-color-black--lightest;
+ color: $md-color-black--lighter;
+ user-select: none;
+
+ // Reset spacings
+ pre {
+ margin: 0;
+ padding: 0;
+ background-color: transparent;
+ color: inherit;
+ text-align: right;
+ }
+ }
+
+ // The table cell containing the code container wrapper and code should
+ // stretch horizontally to the remaining space
+ .code {
+ flex: 1;
+ overflow: hidden;
+ }
+ }
+
+ // Full-width container
+ > .codehilite {
+
+ // [mobile -]: Stretch to whole width
+ @include break-to-device(mobile) {
+ margin: 1em px2rem(-16px);
+ border-radius: 0;
+
+ // Actual container with code, overflowing
+ pre,
+ code {
+ padding: px2rem(10.5px) px2rem(16px);
+ }
+ }
+ }
+
+ // Full-width container on top-level
+ > .codehilitetable {
+ box-shadow: none;
+
+ // [mobile -]: Stretch to whole width
+ @include break-to-device(mobile) {
+ margin: 1em px2rem(-16px);
+ border-radius: 0;
+
+ // Increase spacing
+ .codehilite > pre,
+ .codehilite > code,
+ .linenodiv {
+ padding: px2rem(10px) px2rem(16px);
+ }
+ }
+ }
+
+ // When pymdownx.superfences is enabled but codehilite is disabled,
+ // pymdownx.highlight will be used. When this happens, the outer
+ // container and tables get this class names by default.
+ .highlight {
+ @extend .codehilite;
+ }
+
+ // Same as above, but for code blocks with line numbers enabled
+ .highlighttable {
+ @extend .codehilitetable;
+ }
+}
diff --git a/docs/theme/pdf/stylesheets/extensions/_footnotes.scss b/docs/theme/pdf/stylesheets/extensions/_footnotes.scss
new file mode 100644
index 000000000..68ecd6cee
--- /dev/null
+++ b/docs/theme/pdf/stylesheets/extensions/_footnotes.scss
@@ -0,0 +1,149 @@
+////
+/// Copyright (c) 2016-2019 Martin Donath
+///
+/// Permission is hereby granted, free of charge, to any person obtaining a
+/// copy of this software and associated documentation files (the "Software"),
+/// to deal in the Software without restriction, including without limitation
+/// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+/// and/or sell copies of the Software, and to permit persons to whom the
+/// Software is furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+/// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+/// DEALINGS
+////
+
+// ----------------------------------------------------------------------------
+// Rules
+// ----------------------------------------------------------------------------
+
+// Scoped in typesetted content to match specificity of regular content
+article {
+
+ // All footnote references
+ [id^="fnref:"] {
+ display: inline-block;
+
+ // Targeted anchor
+ &:target {
+ margin-top: -1 * px2rem(48px + 12px + 16px);
+ padding-top: px2rem(48px + 12px + 16px);
+ pointer-events: none;
+ }
+ }
+
+ // All footnote back references
+ [id^="fn:"] {
+
+ // Add spacing to anchor for offset
+ &::before {
+ display: none;
+ height: 0;
+ content: "";
+ }
+
+ // Targeted anchor
+ &:target::before {
+ display: block;
+ margin-top: -1 * px2rem(48px + 12px + 10px);
+ padding-top: px2rem(48px + 12px + 10px);
+ pointer-events: none;
+ }
+ }
+
+ // Footnotes extension
+ .footnote {
+ color: $md-color-black--light;
+ font-size: ms(-1);
+
+ // Remove additional spacing on footnotes
+ ol {
+ margin-left: 0;
+ }
+
+ // Footnote
+ li {
+ transition: color 0.25s;
+
+ // Darken color for targeted footnote
+ &:target {
+ color: $md-color-black;
+ }
+
+ // Remove spacing on first element
+ :first-child {
+ margin-top: 0;
+ }
+
+ // Make back references visible on hover
+ &:hover .footnote-backref,
+ &:target .footnote-backref {
+ transform: translateX(0);
+ opacity: 1;
+ }
+
+ // Active or targeted back reference
+ &:hover .footnote-backref:hover,
+ &:target .footnote-backref {
+ color: $md-color-accent;
+ }
+ }
+ }
+
+ // Footnote reference
+ .footnote-ref {
+ display: inline-block;
+ pointer-events: initial;
+
+ // Render a thin line before footnote
+ &::before {
+ display: inline;
+ margin: 0 0.2em;
+ border-left: px2rem(1px) solid $md-color-black--lighter;
+ font-size: 1.25em;
+ content: "";
+ vertical-align: px2rem(-5px);
+ }
+ }
+
+ // Footnote back reference
+ .footnote-backref {
+ @extend %md-icon;
+
+ display: inline-block;
+ transform: translateX(px2rem(5px));
+ transition:
+ transform 0.25s 0.125s,
+ color 0.25s,
+ opacity 0.125s 0.125s;
+ color: $md-color-black--lighter;
+ // Hack: remove Unicode arrow for icon
+ font-size: 0;
+ opacity: 0;
+ vertical-align: text-bottom;
+
+ // Adjust for RTL languages
+ [dir="rtl"] & {
+ transform: translateX(px2rem(-5px));
+ }
+
+ // Back reference icon
+ &::before {
+ display: inline-block;
+ font-size: px2rem(16px);
+ content: "\E31B"; // keyboard_return
+
+ // Adjust for RTL languages
+ [dir="rtl"] & {
+ transform: scaleX(-1)
+ }
+ }
+ }
+}
diff --git a/docs/theme/pdf/stylesheets/extensions/pymdown/_arithmatex.scss b/docs/theme/pdf/stylesheets/extensions/pymdown/_arithmatex.scss
new file mode 100644
index 000000000..b39dd2989
--- /dev/null
+++ b/docs/theme/pdf/stylesheets/extensions/pymdown/_arithmatex.scss
@@ -0,0 +1,54 @@
+////
+/// Copyright (c) 2016-2019 Martin Donath
+///
+/// Permission is hereby granted, free of charge, to any person obtaining a
+/// copy of this software and associated documentation files (the "Software"),
+/// to deal in the Software without restriction, including without limitation
+/// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+/// and/or sell copies of the Software, and to permit persons to whom the
+/// Software is furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+/// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+/// DEALINGS
+////
+
+// stylelint-disable selector-class-pattern
+
+// ----------------------------------------------------------------------------
+// Rules
+// ----------------------------------------------------------------------------
+
+// Scoped in typesetted content to match specificity of regular content
+article {
+
+ // MathJax integration - add padding to omit vertical scrollbar
+ .MJXc-display {
+ margin: 0.75em 0;
+ padding: 0.75em 0;
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+
+ // Stretch top-level containers
+ > p > .MJXc-display {
+
+ // [mobile -]: Stretch to whole width
+ @include break-to-device(mobile) {
+ margin: 0.75em px2rem(-16px);
+ padding: 0.25em px2rem(16px);
+ }
+ }
+
+ // Remove outline on tab index
+ .MathJax_CHTML {
+ outline: 0;
+ }
+}
diff --git a/docs/theme/pdf/stylesheets/extensions/pymdown/_critic.scss b/docs/theme/pdf/stylesheets/extensions/pymdown/_critic.scss
new file mode 100644
index 000000000..e77266686
--- /dev/null
+++ b/docs/theme/pdf/stylesheets/extensions/pymdown/_critic.scss
@@ -0,0 +1,93 @@
+////
+/// Copyright (c) 2016-2019 Martin Donath
+///
+/// Permission is hereby granted, free of charge, to any person obtaining a
+/// copy of this software and associated documentation files (the "Software"),
+/// to deal in the Software without restriction, including without limitation
+/// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+/// and/or sell copies of the Software, and to permit persons to whom the
+/// Software is furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+/// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+/// DEALINGS
+////
+
+// ----------------------------------------------------------------------------
+// Rules
+// ----------------------------------------------------------------------------
+
+// Scoped in typesetted content to match specificity of regular content
+article {
+
+ // Deletions, additions and comments
+ del.critic,
+ ins.critic,
+ .critic.comment {
+ margin: 0 0.25em;
+ padding: 0.0625em 0;
+ border-radius: px2rem(2px);
+ box-decoration-break: clone;
+ }
+
+ // Deletion
+ del.critic {
+ background-color: $codehilite-diff-deleted; // TODO: dependent on order of inclusion
+ box-shadow:
+ +0.25em 0 0 $codehilite-diff-deleted,
+ -0.25em 0 0 $codehilite-diff-deleted;
+ }
+
+ // Addition
+ ins.critic {
+ background-color: $codehilite-diff-inserted; // TODO: dependent on order of inclusion
+ box-shadow:
+ +0.25em 0 0 $codehilite-diff-inserted,
+ -0.25em 0 0 $codehilite-diff-inserted;
+ }
+
+ // Comment
+ .critic.comment {
+ background-color: $md-code-background; // TODO: rename, centralize somehow
+ color: $md-code-color;
+ box-shadow:
+ +0.25em 0 0 $md-code-background,
+ -0.25em 0 0 $md-code-background;
+
+ // Icon
+ &::before {
+ @extend %md-icon;
+
+ padding-right: 0.125em;
+ color: $md-color-black--lighter;
+ content: "\E0B7"; // chat
+ vertical-align: -0.125em;
+ }
+ }
+
+ // Block
+ .critic.block {
+ display: block;
+ margin: 1em 0;
+ padding-right: px2rem(16px);
+ padding-left: px2rem(16px);
+ box-shadow: none;
+
+ // Decrease spacing on first element
+ :first-child {
+ margin-top: 0.5em;
+ }
+
+ // Decrease spacing on last element
+ :last-child {
+ margin-bottom: 0.5em;
+ }
+ }
+}
diff --git a/docs/theme/pdf/stylesheets/extensions/pymdown/_details.scss b/docs/theme/pdf/stylesheets/extensions/pymdown/_details.scss
new file mode 100644
index 000000000..cfbeb261c
--- /dev/null
+++ b/docs/theme/pdf/stylesheets/extensions/pymdown/_details.scss
@@ -0,0 +1,109 @@
+////
+/// Copyright (c) 2016-2019 Martin Donath
+///
+/// Permission is hereby granted, free of charge, to any person obtaining a
+/// copy of this software and associated documentation files (the "Software"),
+/// to deal in the Software without restriction, including without limitation
+/// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+/// and/or sell copies of the Software, and to permit persons to whom the
+/// Software is furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+/// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+/// DEALINGS
+////
+
+// ----------------------------------------------------------------------------
+// Rules
+// ----------------------------------------------------------------------------
+
+// Scoped in typesetted content to match specificity of regular content
+article {
+
+ // Details extension
+ details {
+ @extend .admonition;
+
+ display: block;
+ padding-top: 0;
+
+ // Rotate title icon
+ &[open] > summary::after {
+ transform: rotate(180deg);
+ }
+
+ // Remove bottom spacing
+ &:not([open]) {
+ padding-bottom: 0;
+
+ // Remove bottom border if block is closed
+ > summary {
+ border-bottom: none;
+ }
+ }
+
+ // Increase spacing to the right - scoped here for higher specificity
+ summary {
+ padding-right: px2rem(40px);
+
+ // Adjust for RTL languages
+ [dir="rtl"] & {
+ padding-left: px2rem(40px);
+ }
+ }
+
+ // Manually hide and show, if browser doesn't support details
+ .no-details &:not([open]) {
+
+ // Hide all nested tags ...
+ > * {
+ display: none;
+ }
+
+ // ... but show title
+ summary {
+ display: block;
+ }
+ }
+ }
+
+ // Title
+ summary {
+ @extend .admonition-title;
+
+ // Hack: set to block, so Firefox doesn't render marker
+ display: block;
+ outline: none;
+ cursor: pointer;
+
+ // Remove default details marker
+ &::-webkit-details-marker {
+ display: none;
+ }
+
+ // Icon
+ &::after {
+ @extend %md-icon;
+
+ position: absolute;
+ top: px2rem(8px);
+ right: px2rem(12px);
+ color: $md-color-black--lighter;
+ font-size: px2rem(20px);
+ content: "\E313"; // keyboard_arrow_down
+
+ // Adjust for RTL languages
+ [dir="rtl"] & {
+ right: initial;
+ left: px2rem(12px);
+ }
+ }
+ }
+}
diff --git a/docs/theme/pdf/stylesheets/extensions/pymdown/_emoji.scss b/docs/theme/pdf/stylesheets/extensions/pymdown/_emoji.scss
new file mode 100644
index 000000000..9b1de1d47
--- /dev/null
+++ b/docs/theme/pdf/stylesheets/extensions/pymdown/_emoji.scss
@@ -0,0 +1,35 @@
+////
+/// Copyright (c) 2016-2019 Martin Donath
+///
+/// Permission is hereby granted, free of charge, to any person obtaining a
+/// copy of this software and associated documentation files (the "Software"),
+/// to deal in the Software without restriction, including without limitation
+/// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+/// and/or sell copies of the Software, and to permit persons to whom the
+/// Software is furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+/// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+/// DEALINGS
+////
+
+// ----------------------------------------------------------------------------
+// Rules
+// ----------------------------------------------------------------------------
+
+// Scoped in typesetted content to match specificity of regular content
+article {
+
+ // Correct alignment of emojis
+ .emojione {
+ width: px2rem(20px);
+ vertical-align: text-top;
+ }
+}
diff --git a/docs/theme/pdf/stylesheets/extensions/pymdown/_inlinehilite.scss b/docs/theme/pdf/stylesheets/extensions/pymdown/_inlinehilite.scss
new file mode 100644
index 000000000..ac35a97c8
--- /dev/null
+++ b/docs/theme/pdf/stylesheets/extensions/pymdown/_inlinehilite.scss
@@ -0,0 +1,37 @@
+////
+/// Copyright (c) 2016-2019 Martin Donath
+///
+/// Permission is hereby granted, free of charge, to any person obtaining a
+/// copy of this software and associated documentation files (the "Software"),
+/// to deal in the Software without restriction, including without limitation
+/// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+/// and/or sell copies of the Software, and to permit persons to whom the
+/// Software is furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+/// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+/// DEALINGS
+////
+
+// ----------------------------------------------------------------------------
+// Rules
+// ----------------------------------------------------------------------------
+
+// Scoped in typesetted content to match specificity of regular content
+article {
+
+ // Qualified class selector to distinguish inline code from code blocks
+ code.codehilite {
+ $correct: 1 / 0.85;
+
+ margin: 0 0.25em * $correct;
+ padding: 0.0625em * $correct 0;
+ }
+}
diff --git a/docs/theme/pdf/stylesheets/extensions/pymdown/_superfences.scss b/docs/theme/pdf/stylesheets/extensions/pymdown/_superfences.scss
new file mode 100644
index 000000000..9f7696997
--- /dev/null
+++ b/docs/theme/pdf/stylesheets/extensions/pymdown/_superfences.scss
@@ -0,0 +1,100 @@
+////
+/// Copyright (c) 2016-2019 Martin Donath
+///
+/// Permission is hereby granted, free of charge, to any person obtaining a
+/// copy of this software and associated documentation files (the "Software"),
+/// to deal in the Software without restriction, including without limitation
+/// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+/// and/or sell copies of the Software, and to permit persons to whom the
+/// Software is furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+/// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+/// DEALINGS
+////
+
+// ----------------------------------------------------------------------------
+// Rules
+// ----------------------------------------------------------------------------
+
+// Scoped in typesetted content to match specificity of regular content
+article {
+
+ // Tabbed code block content
+ .superfences-content {
+ display: none;
+ order: 99;
+ width: 100%;
+ background-color: $md-color-white;
+
+ // Actual content
+ > * {
+ margin: 0;
+ border-radius: 0
+ }
+ }
+
+ // Tabbed code block container
+ .superfences-tabs {
+ display: flex;
+ position: relative;
+ flex-wrap: wrap;
+ margin: 1em 0;
+ border: px2rem(1px) solid $md-color-black--lightest;
+ border-radius: 0.2em;
+
+ // Hide radio buttons
+ > input {
+ display: none;
+
+ // Active tab label
+ &:checked + label {
+ font-weight: 700;
+
+ // Show code tab content
+ & + .superfences-content {
+ display: block;
+ }
+ }
+ }
+
+ // Tab label
+ > label {
+ width: auto;
+ padding: px2rem(12px);
+ transition: color 0.125s;
+ font-size: ms(-1);
+ cursor: pointer;
+
+ // Hovered tab label
+ html &:hover {
+ color: $md-color-accent;
+ }
+ }
+ }
+
+ // Full-width container on top-level
+ > .superfences-tabs {
+
+ // [mobile -]: Stretch to whole width
+ @include break-to-device(mobile) {
+ margin: 1em px2rem(-16px);
+ border: 0;
+ border-top: px2rem(1px) solid $md-color-black--lightest;
+ border-radius: 0;
+
+ // Actual container with code, overflowing
+ pre,
+ code {
+ padding: px2rem(10.5px) px2rem(16px);
+ }
+ }
+ }
+}
diff --git a/docs/theme/pdf/stylesheets/extensions/pymdown/_tasklist.scss b/docs/theme/pdf/stylesheets/extensions/pymdown/_tasklist.scss
new file mode 100644
index 000000000..de4a0ea1a
--- /dev/null
+++ b/docs/theme/pdf/stylesheets/extensions/pymdown/_tasklist.scss
@@ -0,0 +1,83 @@
+////
+/// Copyright (c) 2016-2019 Martin Donath
+///
+/// Permission is hereby granted, free of charge, to any person obtaining a
+/// copy of this software and associated documentation files (the "Software"),
+/// to deal in the Software without restriction, including without limitation
+/// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+/// and/or sell copies of the Software, and to permit persons to whom the
+/// Software is furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+/// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+/// DEALINGS
+////
+
+// ----------------------------------------------------------------------------
+// Rules
+// ----------------------------------------------------------------------------
+
+// Scoped in typesetted content to match specificity of regular content
+article {
+
+ // Remove list icon on task items
+ .task-list-item {
+ position: relative;
+ list-style-type: none;
+
+ // Make checkbox items align with normal list items, but position
+ // everything in ems for correct layout at smaller font sizes
+ [type="checkbox"] {
+ position: absolute;
+ top: 0.45em;
+ left: -2em;
+
+ // Adjust for RTL languages
+ [dir="rtl"] & {
+ right: -2em;
+ left: initial;
+ }
+ }
+ }
+
+ // Wrapper for list controls, in case custom checkboxes are enabled
+ .task-list-control {
+
+ // Checkbox icon in unchecked state
+ .task-list-indicator::before {
+ @extend %md-icon;
+
+ position: absolute;
+ top: 0.15em;
+ left: -1.25em;
+ color: $md-color-black--lighter;
+ font-size: 1.25em;
+ content: "\E835"; // check_box_outline_blank
+ vertical-align: -0.25em;
+
+ // Adjust for RTL languages
+ [dir="rtl"] & {
+ right: -1.25em;
+ left: initial;
+ }
+ }
+
+ // Checkbox icon in checked state
+ [type="checkbox"]:checked + .task-list-indicator::before {
+ content: "\E834"; // check_box
+ }
+
+ // Hide original checkbox behind icon
+ [type="checkbox"] {
+ opacity: 0;
+ z-index: -1;
+ }
+ }
+}
diff --git a/docs/theme/pdf/stylesheets/helpers/_break.scss b/docs/theme/pdf/stylesheets/helpers/_break.scss
new file mode 100644
index 000000000..a5db7324d
--- /dev/null
+++ b/docs/theme/pdf/stylesheets/helpers/_break.scss
@@ -0,0 +1,250 @@
+////
+/// Copyright (c) 2016-2019 Martin Donath
+///
+/// Permission is hereby granted, free of charge, to any person obtaining a
+/// copy of this software and associated documentation files (the "Software"),
+/// to deal in the Software without restriction, including without limitation
+/// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+/// and/or sell copies of the Software, and to permit persons to whom the
+/// Software is furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+/// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+/// DEALINGS
+////
+
+// ----------------------------------------------------------------------------
+// Variables
+// ----------------------------------------------------------------------------
+
+///
+/// Device-specific breakpoints
+///
+/// @example
+/// $break-devices: (
+/// mobile: (
+/// portrait: 220px 479px,
+/// landscape: 480px 719px
+/// ),
+/// tablet: (
+/// portrait: 720px 959px,
+/// landscape: 960px 1219px
+/// ),
+/// screen: (
+/// small: 1220px 1599px,
+/// medium: 1600px 1999px,
+/// large: 2000px
+/// )
+/// );
+///
+/// @group helpers
+/// @access private
+/// @type Map
+///
+$break-devices: () !default;
+
+// ----------------------------------------------------------------------------
+// Helpers
+// ----------------------------------------------------------------------------
+
+///
+/// Choose minimum and maximum device widths
+///
+/// @group helpers
+/// @access private
+/// @param {Map} $devices Map of devices
+/// @return {List} Minimum and maximum width
+///
+@function break-select-min-max($devices) {
+ $min: 1000000;
+ $max: 0;
+ @each $key, $value in $devices {
+ @while type-of($value) == map {
+ $value: break-select-min-max($value);
+ }
+ @if type-of($value) == list {
+ @each $number in $value {
+ @if type-of($number) == number {
+ $min: min($number, $min);
+ @if $max != null {
+ $max: max($number, $max);
+ }
+ } @else {
+ @error "Invalid number: #{$number}";
+ }
+ }
+ } @elseif type-of($value) == number {
+ $min: min($value, $min);
+ $max: null;
+ } @else {
+ @error "Invalid value: #{$value}";
+ }
+ }
+ @return $min, $max;
+}
+
+///
+/// Select minimum and maximum widths for a device breakpoint
+///
+/// @group helpers
+/// @access private
+/// @param {String} $device Device
+/// @return {List} Minimum and maximum width
+///
+@function break-select-device($device) {
+ $current: $break-devices;
+ @for $n from 1 through length($device) {
+ @if type-of($current) == map {
+ $current: map-get($current, nth($device, $n));
+ } @else {
+ @error "Invalid device map: #{$devices}";
+ }
+ }
+ @if type-of($current) == list or type-of($current) == number {
+ $current: (default: $current);
+ }
+ @return break-select-min-max($current);
+}
+
+// ----------------------------------------------------------------------------
+// Mixins
+// ----------------------------------------------------------------------------
+
+///
+/// A minimum-maximum media query breakpoint
+///
+/// @group helpers
+/// @access public
+/// @param {Number|List} $breakpoint Number or number pair
+///
+@mixin break-at($breakpoint) {
+ @if type-of($breakpoint) == number {
+ @media only screen and (min-width: $breakpoint) {
+ @content;
+ }
+ } @elseif type-of($breakpoint) == list {
+ $min: nth($breakpoint, 1);
+ $max: nth($breakpoint, 2);
+ @if type-of($min) == number and type-of($max) == number {
+ @media only screen and (min-width: $min) and (max-width: $max) {
+ @content;
+ }
+ } @else {
+ @error "Invalid breakpoint: #{$breakpoint}";
+ }
+ } @else {
+ @error "Invalid breakpoint: #{$breakpoint}";
+ }
+}
+
+///
+/// An orientation media query breakpoint
+///
+/// @group helpers
+/// @access public
+/// @param {String} $breakpoint Orientation
+///
+@mixin break-at-orientation($breakpoint) {
+ @if type-of($breakpoint) == string {
+ @media only screen and (orientation: $breakpoint) {
+ @content;
+ }
+ } @else {
+ @error "Invalid breakpoint: #{$breakpoint}";
+ }
+}
+
+///
+/// A maximum-aspect-ratio media query breakpoint
+///
+/// @group helpers
+/// @access public
+/// @param {Number} $breakpoint Ratio
+///
+@mixin break-at-ratio($breakpoint) {
+ @if type-of($breakpoint) == number {
+ @media only screen and (max-aspect-ratio: $breakpoint) {
+ @content;
+ }
+ } @else {
+ @error "Invalid breakpoint: #{$breakpoint}";
+ }
+}
+
+///
+/// A minimum-maximum media query device breakpoint
+///
+/// @group helpers
+/// @access public
+/// @param {String|List} $breakpoint Device
+///
+@mixin break-at-device($device) {
+ @if type-of($device) == string {
+ $device: $device,;
+ }
+ @if type-of($device) == list {
+ $breakpoint: break-select-device($device);
+ @if nth($breakpoint, 2) != null {
+ $min: nth($breakpoint, 1);
+ $max: nth($breakpoint, 2);
+ @media only screen and (min-width: $min) and (max-width: $max) {
+ @content;
+ }
+ } @else {
+ @error "Invalid device: #{$device}";
+ }
+ } @else {
+ @error "Invalid device: #{$device}";
+ }
+}
+
+///
+/// A minimum media query device breakpoint
+///
+/// @group helpers
+/// @access public
+/// @param {String|List} $breakpoint Device
+///
+@mixin break-from-device($device) {
+ @if type-of($device) == string {
+ $device: $device,;
+ }
+ @if type-of($device) == list {
+ $breakpoint: break-select-device($device);
+ $min: nth($breakpoint, 1);
+ @media only screen and (min-width: $min) {
+ @content;
+ }
+ } @else {
+ @error "Invalid device: #{$device}";
+ }
+}
+
+///
+/// A maximum media query device breakpoint
+///
+/// @group helpers
+/// @access public
+/// @param {String|List} $breakpoint Device
+///
+@mixin break-to-device($device) {
+ @if type-of($device) == string {
+ $device: $device,;
+ }
+ @if type-of($device) == list {
+ $breakpoint: break-select-device($device);
+ $max: nth($breakpoint, 2);
+ @media only screen and (max-width: $max) {
+ @content;
+ }
+ } @else {
+ @error "Invalid device: #{$device}";
+ }
+}
diff --git a/docs/theme/pdf/stylesheets/helpers/_px2em.scss b/docs/theme/pdf/stylesheets/helpers/_px2em.scss
new file mode 100644
index 000000000..0647c09ab
--- /dev/null
+++ b/docs/theme/pdf/stylesheets/helpers/_px2em.scss
@@ -0,0 +1,69 @@
+////
+/// Copyright (c) 2016-2019 Martin Donath
+///
+/// Permission is hereby granted, free of charge, to any person obtaining a
+/// copy of this software and associated documentation files (the "Software"),
+/// to deal in the Software without restriction, including without limitation
+/// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+/// and/or sell copies of the Software, and to permit persons to whom the
+/// Software is furnished to do so, subject to the following conditions:
+///
+/// The above copyright notice and this permission notice shall be included in
+/// all copies or substantial portions of the Software.
+///
+/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+/// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+/// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+/// DEALINGS
+////
+
+// stylelint-disable unit-whitelist
+
+// ----------------------------------------------------------------------------
+// Helpers
+// ----------------------------------------------------------------------------
+
+///
+/// Convert font size in px to em.
+///
+/// @group helpers
+/// @access public
+/// @param {Number} $size Font size in px
+/// @param {Number} $base Base font size
+/// @return {Number} Font size in em
+///
+@function px2em($size, $base: 16px) {
+ @if unit($size) == px {
+ @if unit($base) == px {
+ @return ($size / $base) * 1em;
+ } @else {
+ @error "Invalid base: #{$base} - unit must be 'px'";
+ }
+ } @else {
+ @error "Invalid size: #{$size} - unit must be 'px'";
+ }
+}
+
+///
+/// Convert font size in px to rem.
+///
+/// @group helpers
+/// @access public
+/// @param {Number} $size Font size in px
+/// @param {Number} $base Base font size
+/// @return {Number} Font size in rem
+///
+@function px2rem($size, $base: 20px) {
+ @if unit($size) == px {
+ @if unit($base) == px {
+ @return ($size / $base) * 1.0rem;
+ } @else {
+ @error "Invalid base: #{$base} - unit must be 'px'";
+ }
+ } @else {
+ @error "Invalid size: #{$size} - unit must be 'px'";
+ }
+}
diff --git a/mkdocs.yml b/mkdocs.yml
new file mode 100644
index 000000000..6ef1d4b22
--- /dev/null
+++ b/mkdocs.yml
@@ -0,0 +1,80 @@
+site_name: GeyserMC
+site_author: Geyser Devs
+site_url: https://github.com/GeyserMC/Geyser
+site_dir: build/docs
+repo_name: GeyserMC/Geyser
+repo_url: https://github.com/GeyserMC/Geyser
+#edit_uri: ""
+copyright: 'Copyright (C) 2020 GeyserMC Developers'
+
+extra_css:
+ - 'css/mkpdf.css'
+# - 'css/version_select.css'
+
+#extra_javascript:
+# - 'js/version_select.js'
+
+# More info on this theme: https://squidfunk.github.io/mkdocs-material
+theme:
+ name: 'material'
+ logo: 'img/header_logo.png'
+ favicon: 'img/favicon.ico'
+ palette:
+ primary: 'indigo'
+ accent: 'indigo'
+ features:
+ - instant
+
+
+
+# See the following for docs on these extensions: https://squidfunk.github.io/mkdocs-material/extensions
+markdown_extensions:
+ - codehilite:
+ linenums: true
+ - admonition
+ - pymdownx.arithmatex
+ - pymdownx.betterem:
+ smart_enable: all
+ - pymdownx.caret
+ - pymdownx.critic
+ - pymdownx.details
+ - pymdownx.emoji:
+ emoji_generator: !!python/name:pymdownx.emoji.to_svg
+ - pymdownx.inlinehilite
+ - pymdownx.magiclink
+ - pymdownx.mark
+ - pymdownx.smartsymbols
+ - pymdownx.superfences
+ - pymdownx.tasklist:
+ custom_checkbox: true
+ - pymdownx.tilde
+ - toc:
+ permalink: true
+# - footnotes
+# - metadata
+
+# Bundie's Tip: Disable mkpdfs whilst using `mkdocs serve` on a local machine
+plugins:
+ - search
+ - exclude:
+ glob:
+ - 'theme/*'
+ - git-revision-date-localized:
+ type: timeago
+ - mkpdfs:
+ author: GeyserMC Developers
+ toc_title: Table of contents
+ output_path: pdf/documentation.pdf
+ design: docs/css/pdf.css
+
+# Discord not yet supported but it will be soon
+#extra:
+# social:
+# - type: discord
+# link: https://discord.gg/blahblah
+
+nav:
+ - Introduction: index.md
+ - Events: events.md
+ - Plugins: plugins.md
+ - Contributing: contributing.md
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 000000000..be0912049
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,7 @@
+mkdocs==1.1
+mkdocs-exclude==1.0.2
+mkdocs-material==5.1.3
+#mkpdfs-mkdocs==1.0.1
+git+https://github.com/jwaschkau/mkpdfs-mkdocs-plugin.git@fix/string-types
+mkdocs-git-revision-date-localized-plugin==0.5.0
+