diff --git a/.gitignore b/.gitignore index fbe05fc..62bf725 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,10 @@ -bower_components/ +_site +.DS_Store +.jekyll +.jekyll-metadata +.bundle +.sass-cache +Gemfile +Gemfile.lock +node_modules +package.json diff --git a/404.md b/404.md new file mode 100644 index 0000000..493cf18 --- /dev/null +++ b/404.md @@ -0,0 +1,8 @@ +--- +layout: page +title: 404 - Page not found +--- + +Sorry, we can't find that page that you're looking for. You can try again by going [back to the homepage]({{ site.baseurl }}/). + +[Constructocat by https://github.com/jasoncostello]({{ site.baseurl }}/) diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..40e6030 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2015 Barry Clark + +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. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..5d9e420 --- /dev/null +++ b/README.md @@ -0,0 +1,120 @@ +> March, 2016: If you're on an old version of Jekyll Now and run into a) build warnings or b) syntax highlighting issues caused by [Jekyll 3 and GitHub Pages updates](https://github.com/blog/2100-github-pages-now-faster-and-simpler-with-jekyll-3-0), just :sparkles:[update your _config.yml](https://github.com/barryclark/jekyll-now/pull/445/files):sparkles: and you'll be set! + +# Jekyll Now + +**Jekyll** is a static site generator that's perfect for GitHub hosted blogs ([Jekyll Repository](https://github.com/jekyll/jekyll)) + +**Jekyll Now** makes it easier to create your Jekyll blog, by eliminating a lot of the up front setup. + +- You don't need to touch the command line +- You don't need to install/configure ruby, rvm/rbenv, ruby gems :relaxed: +- You don't need to install runtime dependencies like markdown processors, Pygments, etc +- If you're on Windows, this will make setting up Jekyll a lot easier +- It's easy to try out, you can just delete your forked repository if you don't like it + +In a few minutes you'll be set up with a minimal, responsive blog like the one below giving you more time to spend on writing epic blog posts! + +![Jekyll Now Theme Screenshot](/images/jekyll-now-theme-screenshot.jpg "Jekyll Now Theme Screenshot") + +## Quick Start + +### Step 1) Fork Jekyll Now to your User Repository + +Fork this repo, then rename the repository to yourgithubusername.github.io. + +Your Jekyll blog will often be viewable immediately at (if it's not, you can often force it to build by completing step 2) + +![Step 1](/images/step1.gif "Step 1") + +### Step 2) Customize and view your site + +Enter your site name, description, avatar and many other options by editing the _config.yml file. You can easily turn on Google Analytics tracking, Disqus commenting and social icons here too. + +Making a change to _config.yml (or any file in your repository) will force GitHub Pages to rebuild your site with jekyll. Your rebuilt site will be viewable a few seconds later at - if not, give it ten minutes as GitHub suggests and it'll appear soon + +> There are 3 different ways that you can make changes to your blog's files: + +> 1. Edit files within your new username.github.io repository in the browser at GitHub.com (shown below). +> 2. Use a third party GitHub content editor, like [Prose by Development Seed](http://prose.io). It's optimized for use with Jekyll making markdown editing, writing drafts, and uploading images really easy. +> 3. Clone down your repository and make updates locally, then push them to your GitHub repository. + +![_config.yml](/images/config.png "_config.yml") + +### Step 3) Publish your first blog post + +Edit `/_posts/2014-3-3-Hello-World.md` to publish your first blog post. This [Markdown Cheatsheet](http://www.jekyllnow.com/Markdown-Style-Guide/) might come in handy. + +![First Post](/images/first-post.png "First Post") + +> You can add additional posts in the browser on GitHub.com too! Just hit the + icon in `/_posts/` to create new content. Just make sure to include the [front-matter](http://jekyllrb.com/docs/frontmatter/) block at the top of each new blog post and make sure the post's filename is in this format: year-month-day-title.md + +## Local Development + +1. Install Jekyll and plug-ins in one fell swoop. `gem install github-pages` This mirrors the plug-ins used by GitHub Pages on your local machine including Jekyll, Sass, etc. +2. Clone down your fork `git clone https://github.com/yourusername/yourusername.github.io.git` +3. Serve the site and watch for markup/sass changes `jekyll serve` +4. View your website at http://127.0.0.1:4000/ +5. Commit any changes and push everything to the master branch of your GitHub user repository. GitHub Pages will then rebuild and serve your website. + +## Moar! + +I've created a more detailed walkthrough, [**Build A Blog With Jekyll And GitHub Pages**](http://www.smashingmagazine.com/2014/08/01/build-blog-jekyll-github-pages/) over at the Smashing Magazine website. Check it out if you'd like a more detailed walkthrough and some background on Jekyll. :metal: + +It covers: + +- A more detailed walkthrough of setting up your Jekyll blog +- Common issues that you might encounter while using Jekyll +- Importing from Wordpress, using your own domain name, and blogging in your favorite editor +- Theming in Jekyll, with Liquid templating examples +- A quick look at Jekyll 2.0’s new features, including Sass/Coffeescript support and Collections + +## Jekyll Now Features + +✓ Command-line free _fork-first workflow_, using GitHub.com to create, customize and post to your blog +✓ Fully responsive and mobile optimized base theme (**[Theme Demo](http://jekyllnow.com)**) +✓ Sass/Coffeescript support using Jekyll 2.0 +✓ Free hosting on your GitHub Pages user site +✓ Markdown blogging +✓ Syntax highlighting +✓ Disqus commenting +✓ Google Analytics integration +✓ SVG social icons for your footer +✓ 3 http requests, including your avatar + +✘ No installing dependencies +✘ No need to set up local development +✘ No configuring plugins +✘ No need to spend time on theming +✘ More time to code other things ... wait ✓! + +## Questions? + +[Open an Issue](https://github.com/barryclark/jekyll-now/issues/new) and let's chat! + +## Other forkable themes + +You can use the [Quick Start](https://github.com/barryclark/jekyll-now#quick-start) workflow with other themes that are set up to be forked too! Here are some of my favorites: + +- [Hyde](https://github.com/poole/hyde) by MDO +- [Lanyon](https://github.com/poole/lanyon) by MDO +- [mojombo.github.io](https://github.com/mojombo/mojombo.github.io) by Tom Preston-Werner +- [Left](https://github.com/holman/left) by Zach Holman +- [Minimal Mistakes](https://github.com/mmistakes/minimal-mistakes) by Michael Rose +- [Skinny Bones](https://github.com/mmistakes/skinny-bones-jekyll) by Michael Rose + +## Credits + +- [Jekyll](https://github.com/jekyll/jekyll) - Thanks to its creators, contributors and maintainers. +- [SVG icons](https://github.com/neilorangepeel/Free-Social-Icons) - Thanks, Neil Orange Peel. They're beautiful. +- [Solarized Light Pygments](https://gist.github.com/edwardhotchkiss/2005058) - Thanks, Edward. +- [Joel Glovier](http://joelglovier.com/writing/) - Great Jekyll articles. I used Joel's feed.xml in this repository. +- [David Furnes](https://github.com/dfurnes), [Jon Uy](https://github.com/jonuy), [Luke Patton](https://github.com/lkpttn) - Thanks for the design/code reviews. +- [Bart Kiers](https://github.com/bkiers), [Florian Simon](https://github.com/vermluh), [Henry Stanley](https://github.com/henryaj), [Hun Jae Lee](https://github.com/hunjaelee), [Javier Cejudo](https://github.com/javiercejudo), [Peter Etelej](https://github.com/etelej), [Ben Abbott](https://github.com/jaminscript), [Ray Nicholus](https://github.com/rnicholus), [Erin Grand](https://github.com/eringrand), [Léo Colombaro](https://github.com/LeoColomb), [Dean Attali](https://github.com/daattali), [Clayton Errington](https://github.com/cjerrington), [Colton Fitzgerald](https://github.com/coltonfitzgerald), [Trace Mayer](https://github.com/sunnankar) - Thanks for your [fantastic contributions](https://github.com/barryclark/jekyll-now/commits/master) to the project! + +## Contributing + +Issues and Pull Requests are greatly appreciated. If you've never contributed to an open source project before I'm more than happy to walk you through how to create a pull request. + +You can start by [opening an issue](https://github.com/barryclark/jekyll-now/issues/new) describing the problem that you're looking to resolve and we'll go from there. + +I want to keep Jekyll Now as minimal as possible. Every line of code should be one that's useful to 90% of the people using it. Please bear that in mind when submitting feature requests. If it's not something that most people will use, it probably won't get merged. :guardsman: diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..68bc066 --- /dev/null +++ b/_config.yml @@ -0,0 +1,86 @@ +# +# This file contains configuration flags to customize your site +# + +# Name of your site (displayed in the header) +name: _wilhelmsen + +# Short bio or description (displayed in the header) +description: fpvz and stuffz + +# URL of your avatar or profile pic (you could use your GitHub profile pic) +avatar: https://raw.githubusercontent.com/jgeiger/jgeiger.github.io/master/images/gopher_cookie.jpg + +# +# Flags below are optional +# + +# Includes an icon in the footer for each username you enter +footer-links: + dribbble: + email: + facebook: + flickr: + github: + instagram: + linkedin: + pinterest: + rss: # just type anything here for a working RSS icon + twitter: + stackoverflow: # your stackoverflow profile, e.g. "users/50476/bart-kiers" + youtube: channel/UCQGYhJ6fMuR49mdRRiUIIdA # channel/ or user/ + googleplus: # anything in your profile username that comes after plus.google.com/ + + +# Enter your Disqus shortname (not your username) to enable commenting on posts +# You can find your shortname on the Settings page of your Disqus account +disqus: + +# Enter your Google Analytics web tracking code (e.g. UA-2110908-2) to activate tracking +google_analytics: + +# Your website URL (e.g. http://barryclark.github.io or http://www.barryclark.co) +# Used for Sitemap.xml and your RSS feed +url: + +# If you're hosting your site at a Project repository on GitHub pages +# (http://yourusername.github.io/repository-name) +# and NOT your User repository (http://yourusername.github.io) +# then add in the baseurl here, like this: "/repository-name" +baseurl: "" + +# +# !! You don't need to change any of the configuration flags below !! +# + +permalink: /:title/ + +# The release of Jekyll Now that you're using +version: v1.2.0 + +# Jekyll 3 now only supports Kramdown for Markdown +kramdown: + # Use GitHub flavored markdown, including triple backtick fenced code blocks + input: GFM + # Jekyll 3 and GitHub Pages now only support rouge for syntax highlighting + syntax_highlighter: rouge + syntax_highlighter_opts: + # Use existing pygments syntax highlighting css + css_class: 'highlight' + +# Set the Sass partials directory, as we're using @imports +sass: + style: :expanded # You might prefer to minify using :compressed + +# Use the following plug-ins +gems: + - jekyll-sitemap # Create a sitemap using the official Jekyll sitemap gem + - jekyll-feed # Create an Atom feed using the official Jekyll feed gem + +# Exclude these files from your production _site +exclude: + - Gemfile + - Gemfile.lock + - LICENSE + - README.md + - CNAME diff --git a/_includes/analytics.html b/_includes/analytics.html new file mode 100644 index 0000000..5f346ae --- /dev/null +++ b/_includes/analytics.html @@ -0,0 +1,16 @@ +{% if site.google_analytics %} + + + +{% endif %} diff --git a/_includes/disqus.html b/_includes/disqus.html new file mode 100644 index 0000000..c4b4d23 --- /dev/null +++ b/_includes/disqus.html @@ -0,0 +1,17 @@ +{% if site.disqus %} +
+
+ + +
+{% endif %} \ No newline at end of file diff --git a/_includes/meta.html b/_includes/meta.html new file mode 100644 index 0000000..b8f4a33 --- /dev/null +++ b/_includes/meta.html @@ -0,0 +1,18 @@ + + + + + + {% if page.excerpt %} + + + {% else %} + + + {% endif %} + + + {% if page.title %} + + + {% endif %} \ No newline at end of file diff --git a/_includes/svg-icons.html b/_includes/svg-icons.html new file mode 100644 index 0000000..7a64482 --- /dev/null +++ b/_includes/svg-icons.html @@ -0,0 +1,13 @@ +{% if site.footer-links.dribbble %}{% endif %} +{% if site.footer-links.email %}{% endif %} +{% if site.footer-links.facebook %}{% endif %} +{% if site.footer-links.flickr %}{% endif %} +{% if site.footer-links.github %}{% endif %} +{% if site.footer-links.instagram %}{% endif %} +{% if site.footer-links.linkedin %}{% endif %} +{% if site.footer-links.pinterest %}{% endif %} +{% if site.footer-links.rss %}{% endif %} +{% if site.footer-links.twitter %}{% endif %} +{% if site.footer-links.stackoverflow %}{% endif %} +{% if site.footer-links.youtube %}{% endif %} +{% if site.footer-links.googleplus %}{% endif %} \ No newline at end of file diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..b2939c0 --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,51 @@ + + + + {% if page.title %}{{ page.title }} – {% endif %}{{ site.name }} – {{ site.description }} + + {% include meta.html %} + + + + + + + + + + +
+
+
+ + +
+

{{ site.name }}

+

{{ site.description }}

+
+ + +
+
+
+ +
+ {{ content }} +
+ + + + {% include analytics.html %} + + diff --git a/_layouts/page.html b/_layouts/page.html new file mode 100644 index 0000000..c8f0164 --- /dev/null +++ b/_layouts/page.html @@ -0,0 +1,12 @@ +--- +layout: default +--- + +
+ +

{{ page.title }}

+ +
+ {{ content }} +
+
diff --git a/_layouts/post.html b/_layouts/post.html new file mode 100644 index 0000000..d27c480 --- /dev/null +++ b/_layouts/post.html @@ -0,0 +1,17 @@ +--- +layout: default +--- + +
+

{{ page.title }}

+ +
+ {{ content }} +
+ +
+ Written on {{ page.date | date: "%B %e, %Y" }} +
+ + {% include disqus.html %} +
diff --git a/_posts/2017-6-3-Hello-doods.md b/_posts/2017-6-3-Hello-doods.md new file mode 100644 index 0000000..31b200c --- /dev/null +++ b/_posts/2017-6-3-Hello-doods.md @@ -0,0 +1,11 @@ +--- +layout: post +title: Testing first post +--- + +This is a post. + +It is not a long post. + + +Nevertheless, it is my post. diff --git a/_sass/_highlights.scss b/_sass/_highlights.scss new file mode 100644 index 0000000..57c7b72 --- /dev/null +++ b/_sass/_highlights.scss @@ -0,0 +1,84 @@ + +.highlight { + background-color: #efefef; + padding: 7px 7px 7px 10px; + border: 1px solid #ddd; + -moz-box-shadow: 3px 3px rgba(0,0,0,0.1); + -webkit-box-shadow: 3px 3px rgba(0,0,0,0.1); + box-shadow: 3px 3px rgba(0,0,0,0.1); + margin: 20px 0 20px 0; + overflow: scroll; +} + +code { + font-family:'Bitstream Vera Sans Mono','Courier', monospace; +} + +.highlight .c { color: #586E75 } /* Comment */ +.highlight .err { color: #93A1A1 } /* Error */ +.highlight .g { color: #93A1A1 } /* Generic */ +.highlight .k { color: #859900 } /* Keyword */ +.highlight .l { color: #93A1A1 } /* Literal */ +.highlight .n { color: #93A1A1 } /* Name */ +.highlight .o { color: #859900 } /* Operator */ +.highlight .x { color: #CB4B16 } /* Other */ +.highlight .p { color: #93A1A1 } /* Punctuation */ +.highlight .cm { color: #586E75 } /* Comment.Multiline */ +.highlight .cp { color: #859900 } /* Comment.Preproc */ +.highlight .c1 { color: #586E75 } /* Comment.Single */ +.highlight .cs { color: #859900 } /* Comment.Special */ +.highlight .gd { color: #2AA198 } /* Generic.Deleted */ +.highlight .ge { color: #93A1A1; font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #DC322F } /* Generic.Error */ +.highlight .gh { color: #CB4B16 } /* Generic.Heading */ +.highlight .gi { color: #859900 } /* Generic.Inserted */ +.highlight .go { color: #93A1A1 } /* Generic.Output */ +.highlight .gp { color: #93A1A1 } /* Generic.Prompt */ +.highlight .gs { color: #93A1A1; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #CB4B16 } /* Generic.Subheading */ +.highlight .gt { color: #93A1A1 } /* Generic.Traceback */ +.highlight .kc { color: #CB4B16 } /* Keyword.Constant */ +.highlight .kd { color: #268BD2 } /* Keyword.Declaration */ +.highlight .kn { color: #859900 } /* Keyword.Namespace */ +.highlight .kp { color: #859900 } /* Keyword.Pseudo */ +.highlight .kr { color: #268BD2 } /* Keyword.Reserved */ +.highlight .kt { color: #DC322F } /* Keyword.Type */ +.highlight .ld { color: #93A1A1 } /* Literal.Date */ +.highlight .m { color: #2AA198 } /* Literal.Number */ +.highlight .s { color: #2AA198 } /* Literal.String */ +.highlight .na { color: #93A1A1 } /* Name.Attribute */ +.highlight .nb { color: #B58900 } /* Name.Builtin */ +.highlight .nc { color: #268BD2 } /* Name.Class */ +.highlight .no { color: #CB4B16 } /* Name.Constant */ +.highlight .nd { color: #268BD2 } /* Name.Decorator */ +.highlight .ni { color: #CB4B16 } /* Name.Entity */ +.highlight .ne { color: #CB4B16 } /* Name.Exception */ +.highlight .nf { color: #268BD2 } /* Name.Function */ +.highlight .nl { color: #93A1A1 } /* Name.Label */ +.highlight .nn { color: #93A1A1 } /* Name.Namespace */ +.highlight .nx { color: #555 } /* Name.Other */ +.highlight .py { color: #93A1A1 } /* Name.Property */ +.highlight .nt { color: #268BD2 } /* Name.Tag */ +.highlight .nv { color: #268BD2 } /* Name.Variable */ +.highlight .ow { color: #859900 } /* Operator.Word */ +.highlight .w { color: #93A1A1 } /* Text.Whitespace */ +.highlight .mf { color: #2AA198 } /* Literal.Number.Float */ +.highlight .mh { color: #2AA198 } /* Literal.Number.Hex */ +.highlight .mi { color: #2AA198 } /* Literal.Number.Integer */ +.highlight .mo { color: #2AA198 } /* Literal.Number.Oct */ +.highlight .sb { color: #586E75 } /* Literal.String.Backtick */ +.highlight .sc { color: #2AA198 } /* Literal.String.Char */ +.highlight .sd { color: #93A1A1 } /* Literal.String.Doc */ +.highlight .s2 { color: #2AA198 } /* Literal.String.Double */ +.highlight .se { color: #CB4B16 } /* Literal.String.Escape */ +.highlight .sh { color: #93A1A1 } /* Literal.String.Heredoc */ +.highlight .si { color: #2AA198 } /* Literal.String.Interpol */ +.highlight .sx { color: #2AA198 } /* Literal.String.Other */ +.highlight .sr { color: #DC322F } /* Literal.String.Regex */ +.highlight .s1 { color: #2AA198 } /* Literal.String.Single */ +.highlight .ss { color: #2AA198 } /* Literal.String.Symbol */ +.highlight .bp { color: #268BD2 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #268BD2 } /* Name.Variable.Class */ +.highlight .vg { color: #268BD2 } /* Name.Variable.Global */ +.highlight .vi { color: #268BD2 } /* Name.Variable.Instance */ +.highlight .il { color: #2AA198 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_sass/_reset.scss b/_sass/_reset.scss new file mode 100644 index 0000000..120eebf --- /dev/null +++ b/_sass/_reset.scss @@ -0,0 +1,53 @@ + +/***************/ +/* MEYER RESET */ +/***************/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +// HTML5 display-role reset for older browsers +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +// Apply a natural box layout model to all elements +// from: http://www.paulirish.com/2012/box-sizing-border-box-ftw/ +*, *:before, *:after { + -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; +} diff --git a/_sass/_svg-icons.scss b/_sass/_svg-icons.scss new file mode 100644 index 0000000..a62ab2a --- /dev/null +++ b/_sass/_svg-icons.scss @@ -0,0 +1,20 @@ +.svg-icon { + width: 40px; + height: 40px; + display: inline-block; + + &.dribbble { background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNjAgNjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPjxwYXRoIGQ9Ik0wLjIyNDU4MDY4OCwzMCBDMC4yMjQ1ODA2ODgsMTMuNDMxNDU2NyAxMy40NTQ5NDEsMCAyOS43NzU0MTkzLDAgQzQ2LjA5NTg5NzYsMCA1OS4zMjYyNTc5LDEzLjQzMTQ1NjcgNTkuMzI2MjU3OSwzMCBDNTkuMzI2MjU3OSw0Ni41Njg1NDMzIDQ2LjA5NTg5NzYsNjAgMjkuNzc1NDE5Myw2MCBDMTMuNDU0OTQxLDYwIDAuMjI0NTgwNjg4LDQ2LjU2ODU0MzMgMC4yMjQ1ODA2ODgsMzAgWiBNMC4yMjQ1ODA2ODgsMzAiIGZpbGw9IiNFQTRDODkiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD48cGF0aCBkPSJNNDYuODIwMTQwMiwyOS44MzA2MzA3IEM0Ni44MjAxNDAyLDMwLjk5MTA2NjIgNDYuNzAzOTM4MSwzMi4xNDk4OTIgNDYuNDc1Njk1OCwzMy4yNzk0NzczIEM0Ni4yNTMxMzQ4LDM0LjM4MjIzNjMgNDUuOTIzNDg4MSwzNS40NjQ4NzU3IDQ1LjQ5MTY0NDQsMzYuNDk5ODMxNCBDNDUuMDY5NzA5OSwzNy41MTY0NzgzIDQ0LjU0NjM3MSwzOC40OTYxNzIgNDMuOTM0ODQwMiwzOS40MDk4MDYyIEM0My4zMzI0MjU4LDQwLjMxNzY3MjcgNDIuNjM4NDUwMiw0MS4xNjk0MDUzIDQxLjg3NjEwMSw0MS45NDU4MjM0IEM0MS4xMTIxMDAzLDQyLjcxODg4ODEgNDAuMjcxNDY4Myw0My40MjI0NzI5IDM5LjM3ODkxMiw0NC4wMzc1MzEyIEMzOC40NzczMDUzLDQ0LjY1NDkzNjcgMzcuNTEyMjc5Niw0NS4xODYyMzAxIDM2LjUxMTcxMjgsNDUuNjE3MTkzNCBDMzUuNDkyMjUyNSw0Ni4wNTM5MjQ0IDM0LjQyNDg5NzUsNDYuMzg4NTgxNSAzMy4zNDExNTk0LDQ2LjYxNDQ1ODMgQzMyLjIyODYxODUsNDYuODQ3MTA4OCAzMS4wODQ2MzIzLDQ2Ljk2NTg4MTkgMjkuOTQxNTcwOSw0Ni45NjU4ODE5IEMyOC43OTc2NTA4LDQ2Ljk2NTg4MTkgMjcuNjUzNzMwNyw0Ni44NDcxMDg4IDI2LjU0Mjc3NTIsNDYuNjE0NDU4MyBDMjUuNDU3Mzg1NSw0Ni4zODg1ODE1IDI0LjM5MDA5NjcsNDYuMDUzOTI0NCAyMy4zNzE0MjkxLDQ1LjYxNzE5MzQgQzIyLjM3MDkyODQsNDUuMTg2MjMwMSAyMS40MDQ5Nzc4LDQ0LjY1NDkzNjcgMjAuNTAzMzcxMSw0NC4wMzc1MzEyIEMxOS42MTA4MTQ4LDQzLjQyMjU0IDE4Ljc3MDE4MjgsNDIuNzE4ODg4MSAxOC4wMDc4MzM2LDQxLjk0NTgyMzQgQzE3LjI0NDY5MTcsNDEuMTY5NDA1MyAxNi41NTA3MTYxLDQwLjMxNzY3MjcgMTUuOTQ3NDQyOSwzOS40MDk4MDYyIEMxNS4zMzkyMTUxLDM4LjQ5NjE3MiAxNC44MTUwMTc1LDM3LjUxNjQxMTIgMTQuMzkxNDMxNCwzNi40OTk4MzE0IEMxMy45NTk1MjE2LDM1LjQ2NDg3NTcgMTMuNjI5MDgyMywzNC4zODIxNjkyIDEzLjQwNTcyODUsMzMuMjc5NDc3MyBDMTMuMTc5OTMwNCwzMi4xNDk4OTIgMTMuMDY0NTIxMSwzMC45OTEwNjYyIDEzLjA2NDUyMTEsMjkuODMwNjMwNyBDMTMuMDY0NTIxMSwyOC42NjkzMjM1IDEzLjE3OTg2NDQsMjcuNTA4MDE2MiAxMy40MDU3OTQ1LDI2LjM4MDkxMjMgQzEzLjYyOTE0ODMsMjUuMjc4MTUzMyAxMy45NTk1ODc3LDI0LjE5MzgzNzMgMTQuMzkxNDk3NSwyMy4xNjA1NTgyIEMxNC44MTUwODM1LDIyLjE0MzE3MzYgMTUuMzM5MjgxMiwyMS4xNjI2MDggMTUuOTQ3NTA5LDIwLjI0ODkwNjggQzE2LjU1MDc4MjIsMTkuMzQwMzAyNSAxNy4yNDQ3NTc3LDE4LjQ5MDE3OTUgMTguMDA3ODk5NiwxNy43MTI4ODk2IEMxOC43NzAyNDg4LDE2LjkzOTc1NzggMTkuNjEwODgwOCwxNi4yMzc4NDk2IDIwLjUwMzQzNzEsMTUuNjIzNzMwMyBDMjEuNDA1MDQzOCwxNS4wMDM3MDkyIDIyLjM3MDk5NDQsMTQuNDcyNDgyOCAyMy4zNzE0OTUxLDE0LjA0MDcxNDcgQzI0LjM5MDE2MjcsMTMuNjAzMDQ0OSAyNS40NTczODU1LDEzLjI2NzU4MjkgMjYuNTQyODQxMywxMy4wNDMzODI4IEMyNy42NTM3OTY3LDEyLjgxMjQ3NiAyOC43OTc3MTY5LDEyLjY5NTMxMjUgMjkuOTQxNjM3LDEyLjY5NTMxMjUgQzMxLjA4NDY5ODMsMTIuNjk1MzEyNSAzMi4yMjg2MTg1LDEyLjgxMjQ3NiAzMy4zNDEyMjU1LDEzLjA0MzM4MjggQzM0LjQyNDk2MzYsMTMuMjY3NjUgMzUuNDkyMjUyNSwxMy42MDMxMTIgMzYuNTExNzc4OSwxNC4wNDA3MTQ3IEMzNy41MTIyNzk2LDE0LjQ3MjQxNTggMzguNDc3MzcxNCwxNS4wMDM3MDkyIDM5LjM3ODk3ODEsMTUuNjIzNzMwMyBDNDAuMjcxNTM0NCwxNi4yMzc4NDk2IDQxLjExMjIzMjQsMTYuOTM5NzU3OCA0MS44NzYxNjcxLDE3LjcxMjg4OTYgQzQyLjYzODUxNjMsMTguNDkwMTc5NSA0My4zMzI0OTE4LDE5LjM0MDMwMjUgNDMuOTM0OTA2MiwyMC4yNDg5MDY4IEM0NC41NDYzNzEsMjEuMTYyNjA4IDQ1LjA2OTcwOTksMjIuMTQzMjQwNyA0NS40OTE2NDQ0LDIzLjE2MDU1ODIgQzQ1LjkyMzQ4ODEsMjQuMTkzODM3MyA0Ni4yNTMxMzQ4LDI1LjI3ODE1MzMgNDYuNDc1Njk1OCwyNi4zODA5MTIzIEM0Ni43MDM5MzgxLDI3LjUwODAxNjIgNDYuODIwMTQwMiwyOC42NjkzMjM1IDQ2LjgyMDE0MDIsMjkuODMwNjMwNyBaIE0yMy43OTE3MTIsMTYuNTk1MTA3OSBDMTkuNzcyMjY5LDE4LjUyMjAzNTYgMTYuNzcyMzUyMywyMi4yODIwNjY0IDE1LjgzNjkyMjEsMjYuODEzNTUyMyBDMTYuMjE2OTA3NiwyNi44MTY5MDU2IDIyLjIyMzM0NzEsMjYuODkzODk2OCAyOS4xNDM3NDY4LDI1LjAyNzE5NCBDMjYuNjQ5MDY4MSwyMC41Mjc0OTcxIDIzLjk4Mzc1MjcsMTYuODU1Mzg5MyAyMy43OTE3MTIsMTYuNTk1MTA3OSBaIE0zMC4zMzc5Mzk3LDI3LjI4MDQ2MjcgQzIyLjkxNjQ2MzgsMjkuNTM2MDc4OCAxNS43OTQ5MDcsMjkuMzczNzgwMSAxNS41Mzk0NDc0LDI5LjM2Mzc4NzMgQzE1LjUzNTI4NTUsMjkuNTIxMDU2MSAxNS41Mjc4ODY2LDI5LjY3MzI5NDkgMTUuNTI3ODg2NiwyOS44MzA2MzA3IEMxNS41Mjc4ODY2LDMzLjU4OTc4OTYgMTYuOTI0ODIyMSwzNy4wMTY4Mzk5IDE5LjIyMDkyMDEsMzkuNjA4MTE5MSBDMTkuMjE1OTY1NCwzOS42MDA1NDA2IDIzLjE2MDQyODgsMzIuNDk2Mjg1NiAzMC45Mzg3Njg2LDI5Ljk0Mjc2NDMgQzMxLjEyNjY0NzQsMjkuODc5MTg2MiAzMS4zMTc4OTUzLDI5LjgyMjI0NzUgMzEuNTA3NDI1NiwyOS43NjcwNTI2IEMzMS4xNDU2NzMsMjguOTM1NDM5NiAzMC43NTA4MjM3LDI4LjEwMjA4MjkgMzAuMzM3OTM5NywyNy4yODA0NjI3IFogTTM5LjQ2MDU2NCwxOC44NDgzMDk2IEMzNi45MjI5NDU0LDE2LjU3NjY2NDkgMzMuNTkwOTM3OCwxNS4xOTg3MzU4IDI5Ljk0MTU3MDksMTUuMTk4NzM1OCBDMjguNzcwNDMzNSwxNS4xOTg3MzU4IDI3LjYzMzkxMjIsMTUuMzQyNjU4NSAyNi41NDUyMTk1LDE1LjYwODcwNzYgQzI2Ljc2MTEwODMsMTUuOTAzMjU5NSAyOS40Njg1MDQ5LDE5LjU0OTQ4IDMxLjkzMzUyMTksMjQuMTQ0NDc3IEMzNy4zNzIxNjMyLDIyLjA3NDU2NTUgMzkuNDI1MDg5LDE4LjkwMTgyNzkgMzkuNDYwNTY0LDE4Ljg0ODMwOTYgWiBNMzIuNDg5ODI1NCwzMi4xOTE3NDA5IEMzMi40NTc3MTk2LDMyLjIwMjUzODUgMzIuNDI1NjEzNywzMi4yMTE4NjA2IDMyLjM5NDIzNDUsMzIuMjIzNTMgQzIzLjg4OTkyNDgsMzUuMjMzMzIxNiAyMS4xMTI3MjcyLDQxLjI5ODkxNTEgMjEuMDgyNjc5Myw0MS4zNjUxMjg2IEMyMy41Mjk2NDYyLDQzLjI5Njk5MzIgMjYuNTk4Nzk1Myw0NC40NjI1MjU2IDI5Ljk0MTU3MDksNDQuNDYyNTI1NiBDMzEuOTM3NjE3OCw0NC40NjI1MjU2IDMzLjgzODkzMjUsNDQuMDQ5OTM4MyAzNS41Njg4MTc3LDQzLjMwMjg5NSBDMzUuMzU1MzczMSw0Mi4wMjQ0MjQyIDM0LjUxODA0NDIsMzcuNTQzMTcwNCAzMi40ODk4MjU0LDMyLjE5MTc0MDkgWiBNMzcuOTk2MDQ3Niw0MS45NjU4NzYgQzQxLjIzMjQ2NDMsMzkuNzQ4Njg4NSA0My41MzEwMDY1LDM2LjIyNzk0NzYgNDQuMTcyMTk5LDMyLjE0OTgyNDkgQzQzLjg3NTUxNywzMi4wNTI3ODExIDM5Ljg0MjkyNzcsMzAuNzU2NzM5MSAzNS4xOTA1NDk4LDMxLjUxMzk3NjMgQzM3LjA4MTE2MjUsMzYuNzg4NDgxNiAzNy44NDkzMjUxLDQxLjA4NDAzMDkgMzcuOTk2MDQ3Niw0MS45NjU4NzYgWiBNMzMuMDQyODkxOSwyNi4zMjQ5MTI2IEMzMy4zNzc0MjcxLDI3LjAyMjcyOTggMzMuNzAxMzkyNSwyNy43MzI5NTQxIDM0LjAwMDUxODgsMjguNDQ2NzMyOSBDMzQuMTA2ODc3NywyOC43MDI3ODkyIDM0LjIxMDcyNjMsMjguOTUzODE1NiAzNC4zMTIwNjQ2LDI5LjIwNDc3NDkgQzM5LjI2MzU2ODcsMjguNTcyMjEyNSA0NC4xNDE3NDQ2LDI5LjYzNjQ3NTkgNDQuMzUwMzAwNiwyOS42Nzk5MzQ0IEM0NC4zMTczMzYsMjYuMjExMTAyMyA0My4wOTUwNjcsMjMuMDI3NTAwMSA0MS4wNzI2NjE2LDIwLjUzNTA3NTUgQzQxLjA0NTQ0NDMsMjAuNTc0MzA4OSAzOC43MzM2ODk4LDIzLjk2NTQxMiAzMy4wNDI4OTE5LDI2LjMyNDkxMjYgWiBNMzMuMDQyODkxOSwyNi4zMjQ5MTI2IiBpZD0iUGF0aCIgZmlsbD0iI0ZGRkZGRiIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPjxwYXRoIGQ9Ik01OS4zMjYyNTc5LDMwIEM1OS4zMjYyNTc5LDQ2LjU2ODU0MzMgNDYuMDk1ODk3Niw2MCAyOS43NzU0MTkzLDYwIEMyMy43MjI1NDA1LDYwIDE4LjA5NDcwNTEsNTguMTUyNTEzNCAxMy40MDkzMjQ0LDU0Ljk4Mjc3NTQgTDQ3LjI2OTU0NTgsNS44MTk0MTEwMyBDNTQuNTgxNDQzOCwxMS4yODA2NTAzIDU5LjMyNjI1NzksMjAuMDc3Nzk3MyA1OS4zMjYyNTc5LDMwIFogTTU5LjMyNjI1NzksMzAiIGlkPSJyZWZsZWMiIGZpbGwtb3BhY2l0eT0iMC4wOCIgZmlsbD0iIzAwMDAwMCIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPjwvc3ZnPgo=); } + &.email { background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNjAgNjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPg0KICAgIDxwYXRoIGQ9Ik0wLjIyNDU4MDY4OCwzMCBDMC4yMjQ1ODA2ODgsMTMuNDMxNDU2NyAxMy40NTQ5NDEsMCAyOS43NzU0MTkzLDAgQzQ2LjA5NTg5NzYsMCA1OS4zMjYyNTc5LDEzLjQzMTQ1NjcgNTkuMzI2MjU3OSwzMCBDNTkuMzI2MjU3OSw0Ni41Njg1NDMzIDQ2LjA5NTg5NzYsNjAgMjkuNzc1NDE5Myw2MCBDMTMuNDU0OTQxLDYwIDAuMjI0NTgwNjg4LDQ2LjU2ODU0MzMgMC4yMjQ1ODA2ODgsMzAgWiBNMC4yMjQ1ODA2ODgsMzAiIGZpbGw9IiNGRkZGRkYiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4NCiAgICA8cGF0aCBkPSJNMzUuMDM4NDMyNCwzMS42Mzg0MDA2IEw0Ny4yMTMxMTQ4LDQwLjU3NjQyNjQgTDQ3LjIxMzExNDgsMjAgTDM1LjAzODQzMjQsMzEuNjM4NDAwNiBaIE0xMy43NzA0OTE4LDIwIEwxMy43NzA0OTE4LDQwLjU3NjQyNjQgTDI1Ljk0NDkxMjksMzEuNjM3MTQ5MSBMMTMuNzcwNDkxOCwyMCBaIE0zMC40OTE4MDMzLDM1Ljk4NDQ4OTEgTDI3LjU4NTEwMzcsMzMuMjA2NTIxNyBMMTMuNzcwNDkxOCw0MiBMNDcuMjEzMTE0OCw0MiBMMzMuMzk4MTc2MiwzMy4yMDY1MjE3IEwzMC40OTE4MDMzLDM1Ljk4NDQ4OTEgWiBNNDYuMjA5ODM2MSwyMCBMMTQuNzczNzcwNSwyMCBMMzAuNDkxODAzMywzMi40NTQ5MzA0IEw0Ni4yMDk4MzYxLDIwIFogTTQ2LjIwOTgzNjEsMjAiIGlkPSJTaGFwZSIgZmlsbD0iIzMzMzMzMyIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPg0KICAgIDxwYXRoIGQ9Ik01OS4zMjYyNTc5LDMwIEM1OS4zMjYyNTc5LDQ2LjU2ODU0MzMgNDYuMDk1ODk3Niw2MCAyOS43NzU0MTkzLDYwIEMyMy43MjI1NDA1LDYwIDE4LjA5NDcwNTEsNTguMTUyNTEzNCAxMy40MDkzMjQ0LDU0Ljk4Mjc3NTQgTDQ3LjI2OTU0NTgsNS44MTk0MTEwMyBDNTQuNTgxNDQzOCwxMS4yODA2NTAzIDU5LjMyNjI1NzksMjAuMDc3Nzk3MyA1OS4zMjYyNTc5LDMwIFogTTU5LjMyNjI1NzksMzAiIGlkPSJyZWZsZWMiIGZpbGwtb3BhY2l0eT0iMC4wOCIgZmlsbD0iIzAwMDAwMCIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPg0KPC9zdmc+); } + &.facebook { background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNjAgNjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPg0KICAgIDxwYXRoIGQ9Ik0wLjExMjI5MDM0NCwzMCBDMC4xMTIyOTAzNDQsMTMuNDMxNDU2NyAxMy4zNDI2NTA2LDAgMjkuNjYzMTI5LDAgQzQ1Ljk4MzYwNzMsMCA1OS4yMTM5Njc2LDEzLjQzMTQ1NjcgNTkuMjEzOTY3NiwzMCBDNTkuMjEzOTY3Niw0Ni41Njg1NDMzIDQ1Ljk4MzYwNzMsNjAgMjkuNjYzMTI5LDYwIEMxMy4zNDI2NTA2LDYwIDAuMTEyMjkwMzQ0LDQ2LjU2ODU0MzMgMC4xMTIyOTAzNDQsMzAgWiBNMC4xMTIyOTAzNDQsMzAiIGZpbGw9IiMzQjU5OTgiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4NCgk8cGF0aCBkPSJNMzIuMTM0MTQ1Nyw0Ni4zMTk2NzI5IEwzMi4xMzQxNDU3LDI5Ljk5ODA4OTEgTDM2LjU2NTc1NjUsMjkuOTk4MDg5MSBMMzcuMTUzMDQwNiwyNC4zNzM1ODA5IEwzMi4xMzQxNDU3LDI0LjM3MzU4MDkgTDMyLjE0MTY3NSwyMS41NTg0NjA0IEMzMi4xNDE2NzUsMjAuMDkxNTAyIDMyLjI3ODc3MDcsMTkuMzA1NDcyMiAzNC4zNTEyMDYsMTkuMzA1NDcyMiBMMzcuMTIxNjY4NiwxOS4zMDU0NzIyIEwzNy4xMjE2Njg2LDEzLjY4MDMyNzEgTDMyLjY4OTQzMDQsMTMuNjgwMzI3MSBDMjcuMzY1NTk5NSwxMy42ODAzMjcxIDI1LjQ5MTc0OSwxNi40MDg4MTg3IDI1LjQ5MTc0OSwyMC45OTcyODM1IEwyNS40OTE3NDksMjQuMzc0MjE3OSBMMjIuMTczMjE3MywyNC4zNzQyMTc5IEwyMi4xNzMyMTczLDI5Ljk5ODcyNiBMMjUuNDkxNzQ5LDI5Ljk5ODcyNiBMMjUuNDkxNzQ5LDQ2LjMxOTY3MjkgTDMyLjEzNDE0NTcsNDYuMzE5NjcyOSBaIE0zMi4xMzQxNDU3LDQ2LjMxOTY3MjkiIGlkPSJQYXRoIiBmaWxsPSIjRkZGRkZGIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+DQoJPHBhdGggZD0iTTU5LjIxMzk2NzYsMzAgQzU5LjIxMzk2NzYsNDYuNTY4NTQzMyA0NS45ODM2MDczLDYwIDI5LjY2MzEyOSw2MCBDMjMuNjEwMjUwMiw2MCAxNy45ODI0MTQ3LDU4LjE1MjUxMzQgMTMuMjk3MDM0MSw1NC45ODI3NzU0IEw0Ny4xNTcyNTU0LDUuODE5NDExMDMgQzU0LjQ2OTE1MzQsMTEuMjgwNjUwMyA1OS4yMTM5Njc2LDIwLjA3Nzc5NzMgNTkuMjEzOTY3NiwzMCBaIE01OS4yMTM5Njc2LDMwIiBpZD0icmVmbGVjIiBmaWxsLW9wYWNpdHk9IjAuMDgiIGZpbGw9IiMwMDAwMDAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4NCjwvc3ZnPg==); } + &.flickr { background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNjAgNjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPg0KICAgIDxwYXRoIGQ9Ik0wLjMzNjg3MTAzMiwyOS41MDgxOTY3IEMwLjMzNjg3MTAzMiwxMy4yMTEyNjg5IDEzLjU2NzIzMTMsMCAyOS44ODc3MDk3LDAgQzQ2LjIwODE4OCwwIDU5LjQzODU0ODMsMTMuMjExMjY4OSA1OS40Mzg1NDgzLDI5LjUwODE5NjcgQzU5LjQzODU0ODMsNDUuODA1MTI0NiA0Ni4yMDgxODgsNTkuMDE2MzkzNCAyOS44ODc3MDk3LDU5LjAxNjM5MzQgQzEzLjU2NzIzMTMsNTkuMDE2MzkzNCAwLjMzNjg3MTAzMiw0NS44MDUxMjQ2IDAuMzM2ODcxMDMyLDI5LjUwODE5NjcgWiBNMC4zMzY4NzEwMzIsMjkuNTA4MTk2NyIgZmlsbD0iI0ZGMDA4NCIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPg0KICAgIDxwYXRoIGQ9Ik0yMi40OTk5NzM1LDIzLjYwNjU1NzQgQzE4Ljk2Mzc2MzUsMjMuNjA2NTU3NCAxNi4wOTczMTgzLDI2LjQ2ODgwMTcgMTYuMDk3MzE4MywyOS45OTk5NDcyIEMxNi4wOTczMTgzLDMzLjUzMTE0NTUgMTguOTYzNzYzNSwzNi4zOTMzODk4IDIyLjQ5OTk3MzUsMzYuMzkzNDQyNiBDMjYuMDM2MjM2NSwzNi4zOTM0NDI2IDI4LjkwMjY4MTcsMzMuNTMxMTQ1NSAyOC45MDI2ODE3LDI5Ljk5OTk0NzIgQzI4LjkwMjY4MTcsMjYuNDY4ODAxNyAyNi4wMzYyODk0LDIzLjYwNjUwNDUgMjIuNDk5OTczNSwyMy42MDY1NTc0IFogTTIyLjQ5OTk3MzUsMjMuNjA2NTU3NCIgaWQ9IlBhdGgiIGZpbGw9IiNGRkZGRkYiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4NCiAgICA8cGF0aCBkPSJNMzEuODU3NzY1NiwyOS45OTk5NDcyIEMzMS44NTc3NjU2LDMzLjUzMTE0NTUgMzQuNzI0MjEwOCwzNi4zOTM0NDI2IDM4LjI2MDQyMDgsMzYuMzkzNDQyNiBDNDEuNzk2NzM2NiwzNi4zOTM0NDI2IDQ0LjY2MzEyOSwzMy41MzExNDU1IDQ0LjY2MzEyOSwyOS45OTk5NDcyIEM0NC42NjMxMjksMjYuNDY4ODU0NSA0MS43OTY2ODM3LDIzLjYwNjU1NzQgMzguMjYwNDIwOCwyMy42MDY1NTc0IEMzNC43MjQxNTc5LDIzLjYwNjU1NzQgMzEuODU3NzY1NiwyNi40Njg4NTQ1IDMxLjg1Nzc2NTYsMjkuOTk5OTQ3MiBaIE0zMy44MjY0MDAxLDMwIEMzMy44MjY0MDAxLDI3LjU1NTQ2MDggMzUuODA4MDkwNCwyNS41NzM3NzA1IDM4LjI1MjYyOTYsMjUuNTczNzcwNSBDNDAuNjk3MTY4OCwyNS41NzM3NzA1IDQyLjY3ODg1OTEsMjcuNTU1NDYwOCA0Mi42Nzg4NTkxLDMwIEM0Mi42Nzg4NTkxLDMyLjQ0NDUzOTIgNDAuNjk3MTY4OCwzNC40MjYyMjk1IDM4LjI1MjYyOTYsMzQuNDI2MjI5NSBDMzUuODA4MDkwNCwzNC40MjYyMjk1IDMzLjgyNjQwMDEsMzIuNDQ0NTM5MiAzMy44MjY0MDAxLDMwIFogTTMzLjgyNjQwMDEsMzAiIGlkPSJQYXRoIiBmaWxsPSIjRkZGRkZGIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+DQogICAgPHBhdGggZD0iTTU5LjIxMzk2NzYsMjkuNjg1ODI1MiBDNTkuMjEzOTY3Niw0NS45ODI3NTMxIDQ1Ljk4MzYwNzMsNTkuMTk0MDIxOSAyOS42NjMxMjksNTkuMTk0MDIxOSBDMjMuNjEwMjUwMiw1OS4xOTQwMjE5IDE3Ljk4MjQxNDcsNTcuMzc2ODIyIDEzLjI5NzAzNDEsNTQuMjU5MDQ2OSBMNDcuMTU3MjU1NCw1LjkwMTYzOTM0IEM1NC40NjkxNTM0LDExLjI3MzM1MDEgNTkuMjEzOTY3NiwxOS45MjYyODE2IDU5LjIxMzk2NzYsMjkuNjg1ODI1MiBaIE01OS4yMTM5Njc2LDI5LjY4NTgyNTIiIGlkPSJyZWZsZWMiIGZpbGwtb3BhY2l0eT0iMC4wOCIgZmlsbD0iIzAwMDAwMCIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPg0KPC9zdmc+); } + &.github { background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNjAgNjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPg0KICAgIDxwYXRoIGQ9Ik0wLjMzNjg3MTAzMiwzMCBDMC4zMzY4NzEwMzIsMTMuNDMxNDU2NyAxMy41NjcyMzEzLDAgMjkuODg3NzA5NywwIEM0Ni4yMDgxODgsMCA1OS40Mzg1NDgzLDEzLjQzMTQ1NjcgNTkuNDM4NTQ4MywzMCBDNTkuNDM4NTQ4Myw0Ni41Njg1NDMzIDQ2LjIwODE4OCw2MCAyOS44ODc3MDk3LDYwIEMxMy41NjcyMzEzLDYwIDAuMzM2ODcxMDMyLDQ2LjU2ODU0MzMgMC4zMzY4NzEwMzIsMzAgWiBNMC4zMzY4NzEwMzIsMzAiIGlkPSJHaXRodWIiIGZpbGw9IiMzMzMzMzMiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4NCiAgICA8cGF0aCBkPSJNMTguMjE4NDI0NSwzMS45MzU1NTY2IEMxOS42MDY4NTA2LDM0LjQ1MDc5MDIgMjIuMjg0NTI5NSwzNi4wMTU2NzY0IDI2LjgwMDcyODcsMzYuNDQ4NTE3MyBDMjYuMTU2MTAyMywzNi45MzY1MzM1IDI1LjM4MTc4NzcsMzcuODYzMDk4NCAyNS4yNzQ5ODU3LDM4LjkzNDI2MDcgQzI0LjQ2NDQzNDgsMzkuNDU3NDc0OSAyMi44MzQ3NTA2LDM5LjYyOTY2IDIxLjU2NzQzMDMsMzkuMjMxMDY1OSBDMTkuNzkxODQ2OSwzOC42NzE3MDIzIDE5LjExMTkzNzcsMzUuMTY0MjY0MiAxNi40NTMzMzA2LDM1LjY2MzY5NTkgQzE1Ljg3NzM2MjYsMzUuNzcyMTQ0IDE1Ljk5MTc5MzMsMzYuMTUwNzYwOSAxNi40ODk1NjcsMzYuNDcyMjk5OCBDMTcuMzAwMTE3OSwzNi45OTU1MTQxIDE4LjA2Mjk4OTQsMzcuNjUwMDA3NSAxOC42NTEzNTQxLDM5LjA0MzY2IEMxOS4xMDMzNTU0LDQwLjExMzg3MSAyMC4wNTMxMzA0LDQyLjAyNTk4MTMgMjMuMDU2OTM2OSw0Mi4wMjU5ODEzIEMyNC4yNDg5MjM2LDQyLjAyNTk4MTMgMjUuMDg0MjY3OSw0MS44ODMyODY1IDI1LjA4NDI2NzksNDEuODgzMjg2NSBDMjUuMDg0MjY3OSw0MS44ODMyODY1IDI1LjEwNzE1NCw0NC42MTQ0NjQ5IDI1LjEwNzE1NCw0NS42NzYxMTQyIEMyNS4xMDcxNTQsNDYuOTAwNDM1NSAyMy40NTA3NjkzLDQ3LjI0NTc1NjkgMjMuNDUwNzY5Myw0Ny44MzQ2MTA4IEMyMy40NTA3NjkzLDQ4LjA2NzY3OSAyMy45OTkwODMyLDQ4LjA4OTU1ODggMjQuNDM5NjQxNSw0OC4wODk1NTg4IEMyNS4zMTAyNjg1LDQ4LjA4OTU1ODggMjcuMTIyMDg4Myw0Ny4zNjQ2NjkzIDI3LjEyMjA4ODMsNDYuMDkxODMxNyBDMjcuMTIyMDg4Myw0NS4wODA2MDEyIDI3LjEzODI5OTMsNDEuNjgwNjU5OSAyNy4xMzgyOTkzLDQxLjA4NjA5ODIgQzI3LjEzODI5OTMsMzkuNzg1NjczIDI3LjgzNzI4MDMsMzkuMzczNzYwNyAyNy44MzcyODAzLDM5LjM3Mzc2MDcgQzI3LjgzNzI4MDMsMzkuMzczNzYwNyAyNy45MjQwNTcsNDYuMzE1Mzg2OSAyNy42NzA0MDIyLDQ3LjI0NTc1NjkgQzI3LjM3Mjg4MjMsNDguMzM5NzUwNCAyNi44MzYwMTE1LDQ4LjE4NDY4ODcgMjYuODM2MDExNSw0OC42NzI3MDQ5IEMyNi44MzYwMTE1LDQ5LjM5ODU0NTggMjkuMDE2ODcwNCw0OC44NTA1OTc4IDI5LjczOTY5MTEsNDcuMjU3MTcyNSBDMzAuMjk4NDk0NSw0Ni4wMTY2NzkxIDMwLjA1NDM3NTYsMzkuMjA3MjgzNCAzMC4wNTQzNzU2LDM5LjIwNzI4MzQgTDMwLjY1MDM2OSwzOS4xOTQ5MTY1IEMzMC42NTAzNjksMzkuMTk0OTE2NSAzMC42ODM3NDQ2LDQyLjMxMjMyMjIgMzAuNjYzNzE5Miw0My43MzczNjc1IEMzMC42NDI3NDAyLDQ1LjIxMjgzMTcgMzAuNTQyNjEzNCw0Ny4wNzkyNzk3IDMxLjQyMDg2OTIsNDcuOTU5MjMwOSBDMzEuOTk3NzkwNyw0OC41Mzc2MjA1IDMzLjg2ODczMyw0OS41NTI2NTYyIDMzLjg2ODczMyw0OC42MjUxNCBDMzMuODY4NzMzLDQ4LjA4NTc1MzYgMzIuODQzNjI0NSw0Ny42NDI0NDg1IDMyLjg0MzYyNDUsNDYuMTgzMTU2NCBMMzIuODQzNjI0NSwzOS40Njg4OTA1IEMzMy42NjE4MDQyLDM5LjQ2ODg5MDUgMzMuNTM4NzkxMSw0MS42NzY4NTQ3IDMzLjUzODc5MTEsNDEuNjc2ODU0NyBMMzMuNTk4ODY3Myw0NS43Nzg4NTQ0IEMzMy41OTg4NjczLDQ1Ljc3ODg1NDQgMzMuNDE4NjM4OSw0Ny4yNzMzNDQ2IDM1LjIxOTAxNTYsNDcuODk5Mjk5MSBDMzUuODU0MTA2MSw0OC4xMjA5NTE3IDM3LjIxMzkyNDUsNDguMTgwODgzNSAzNy4yNzc4MTUsNDcuODA4OTI1NyBDMzcuMzQxNzA1NSw0Ny40MzYwMTY3IDM1LjY0MDUwMjEsNDYuODgxNDA5NiAzNS42MjUyNDQ2LDQ1LjcyMzY3OTEgQzM1LjYxNTcwODgsNDUuMDE3ODE1NSAzNS42NTY3MTMxLDQ0LjYwNTkwMzIgMzUuNjU2NzEzMSw0MS41Mzc5NjUxIEMzNS42NTY3MTMxLDM4LjQ3MDAyNyAzNS4yNDM4MDg5LDM3LjMzNjA3OSAzMy44MDQ4NDI2LDM2LjQzMjM0NTMgQzM4LjI0NTcwODIsMzUuOTc2NjczMiA0MC45OTM5NTI3LDM0Ljg4MDY4MiA0Mi4zMzM3NDU4LDMxLjk0NTA2OTUgQzQyLjQzODM2MTksMzEuOTQ4NDk2NiA0Mi44NzkxNDkxLDMwLjU3Mzc3NDIgNDIuODIxOTgzNSwzMC41NzQyNDgyIEM0My4xMjIzNjQyLDI5LjQ2NTk4NTMgNDMuMjg0NDc0NCwyOC4xNTUwOTU3IDQzLjMxNjg5NjQsMjYuNjAyNTc2NCBDNDMuMzA5MjY3NywyMi4zOTMwNzk5IDQxLjI4OTU2NTQsMjAuOTA0Mjk3NSA0MC45MDE0NTQ2LDIwLjIwNTA5MyBDNDEuNDczNjA4MiwxNy4wMTgyNDI1IDQwLjgwNjA5NTYsMTUuNTY3NTEyMSA0MC40OTYxNzkxLDE1LjA2OTk4MjkgQzM5LjM1MTg3MTksMTQuNjYzNzc4NCAzNi41MTQ5NDM1LDE2LjExNDUwODggMzQuOTY1MzYwOCwxNy4xMzcxNTQ4IEMzMi40MzgzNDksMTYuMzk5ODk4NCAyNy4wOTgyNDg2LDE2LjQ3MTI0NTggMjUuMDk1NzEwOSwxNy4zMjc0MTQ2IEMyMS40MDA1NTIyLDE0LjY4NzU2MDggMTkuNDQ1Njk0LDE1LjA5MTg2MjggMTkuNDQ1Njk0LDE1LjA5MTg2MjggQzE5LjQ0NTY5NCwxNS4wOTE4NjI4IDE4LjE4MjE4ODEsMTcuMzUxMTk3IDE5LjExMTkzNzcsMjAuNjU2OTU5OCBDMTcuODk2MTExMywyMi4yMDI4MjAxIDE2Ljk5MDIwMTQsMjMuMjk2ODEzNiAxNi45OTAyMDE0LDI2LjE5NjM3MTggQzE2Ljk5MDIwMTQsMjcuODI5NzUxNiAxNy4xODI4MjY0LDI5LjI5MTg5NzYgMTcuNjE3NjYzMiwzMC41Njg1NDA0IEMxNy41NjQzNTc3LDMwLjU2ODQwOTMgMTguMjAwODQ5MywzMS45MzU5Nzc3IDE4LjIxODQyNDUsMzEuOTM1NTU2NiBaIE0xOC4yMTg0MjQ1LDMxLjkzNTU1NjYiIGlkPSJQYXRoIiBmaWxsPSIjRkZGRkZGIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+DQogICAgPHBhdGggZD0iTTU5LjQzODU0ODMsMzAgQzU5LjQzODU0ODMsNDYuNTY4NTQzMyA0Ni4yMDgxODgsNjAgMjkuODg3NzA5Nyw2MCBDMjMuODM0ODMwOCw2MCAxOC4yMDY5OTU0LDU4LjE1MjUxMzQgMTMuNTIxNjE0OCw1NC45ODI3NzU0IEw0Ny4zODE4MzYxLDUuODE5NDExMDMgQzU0LjY5MzczNDEsMTEuMjgwNjUwMyA1OS40Mzg1NDgzLDIwLjA3Nzc5NzMgNTkuNDM4NTQ4MywzMCBaIE01OS40Mzg1NDgzLDMwIiBpZD0icmVmbGVjIiBmaWxsLW9wYWNpdHk9IjAuMDgiIGZpbGw9IiMwMDAwMDAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4NCjwvc3ZnPg==); } + &.instagram { background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjQwcHgiIGhlaWdodD0iNDBweCIgdmlld0JveD0iMCAwIDYwIDYwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KICAgIDx0aXRsZT5JbnN0YWdyYW08L3RpdGxlPgogICAgPGRlc2NyaXB0aW9uPkNyZWF0ZWQgd2l0aCBTa2V0Y2ggKGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCk8L2Rlc2NyaXB0aW9uPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CiAgICAgICAgPGcgaWQ9Ikluc3RhZ3JhbSIgc2tldGNoOnR5cGU9Ik1TQXJ0Ym9hcmRHcm91cCI+CiAgICAgICAgICAgIDxnIHNrZXRjaDp0eXBlPSJNU0xheWVyR3JvdXAiPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTAuNzg2MDMyNDA4LDMwIEMwLjc4NjAzMjQwOCwxMy40MzE0NTY3IDE0LjAxNjM5MjcsMCAzMC4zMzY4NzEsMCBDNDYuNjU3MzQ5NCwwIDU5Ljg4NzcwOTcsMTMuNDMxNDU2NyA1OS44ODc3MDk3LDMwIEM1OS44ODc3MDk3LDQ2LjU2ODU0MzMgNDYuNjU3MzQ5NCw2MCAzMC4zMzY4NzEsNjAgQzE0LjAxNjM5MjcsNjAgMC43ODYwMzI0MDgsNDYuNTY4NTQzMyAwLjc4NjAzMjQwOCwzMCBaIE0wLjc4NjAzMjQwOCwzMCIgZmlsbD0iIzUxN0ZBNCIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTQyLjgyNjkyMzEsNDUuMTcxNzkxNyBDNDQuMDU0MTA5Myw0NC45MDczNzc3IDQ1LjA1Njg4MzQsNDMuODY4MDE2OSA0NS4yOTY3NDI2LDQyLjYxNDc3MjcgQzQ1LjMyMjQ4NzcsNDIuNDc5Mjk4NiA0NS4zNDEzNjc1LDQyLjM0MTY0NjQgNDUuMzYzMjUwOSw0Mi4yMDU3MzY3IEw0NS4zNjMyNTA5LDE3Ljc5NDI2MzMgQzQ1LjM0MjIyNTcsMTcuNjYwNTMxNiA0NS4zMjQyMDQxLDE3LjUyNjM2NDMgNDUuMjk4NDU4OSwxNy4zOTMwNjgzIEM0NS4wMzU0MjkxLDE2LjAyNTY5NDcgNDMuOTI0NTI1MywxNC45NjQ1NTM2IDQyLjU2MDQ2MDYsMTQuNzc1MDY0MSBDNDIuNTAzODIxMywxNC43Njc2NTg4IDQyLjQ0ODQ2OTIsMTQuNzU1MDI2MSA0Mi4zOTI2ODgsMTQuNzQ1MDA3MSBMMTguMjgxMDU0MSwxNC43NDUwMDcxIEMxOC4xMzU1OTM5LDE0Ljc3MTU3OTIgMTcuOTg5Mjc1NSwxNC43OTE2MTcyIDE3Ljg0NTk2MDgsMTQuODI0NzIzNCBDMTYuNTE0NTA2NywxNS4xMzI2OTgzIDE1LjUyOTMyNTEsMTYuMjIxMjgyNyAxNS4zMzk2NjksMTcuNTkwODM0MyBDMTUuMzMxOTQ1NSwxNy42NDc4OTkgMTUuMzIwMzYwMSwxNy43MDQ1MjggMTUuMzEwNDkxMiwxNy43NjE1OTI3IEwxNS4zMTA0OTEyLDQyLjIzOTcxNDEgQzE1LjMzNzk1MjcsNDIuMzk0NzkwNiAxNS4zNTk4MzYxLDQyLjU1MTE3MzkgMTUuMzk0MTYzLDQyLjcwNTM3OTEgQzE1LjY4ODUxNiw0NC4wMjcwMTM5IDE2Ljc5OTg0ODksNDUuMDUxNTYzOSAxOC4xMjE4NjMxLDQ1LjIyNDA2NDcgQzE4LjE4NTc5Nyw0NS4yMzE5MDU2IDE4LjI1MDE1OTksNDUuMjQ0NTM4MyAxOC4zMTQwOTM3LDQ1LjI1NDk5MjkgTDQyLjM1OTY0ODQsNDUuMjU0OTkyOSBDNDIuNTE1ODM1Nyw0NS4yMjc5ODUyIDQyLjY3MjQ1MjEsNDUuMjA1NzY5MiA0Mi44MjY5MjMxLDQ1LjE3MTc5MTcgWiBNMTguNTYxNjc2NCwyNy4xOTgxNjkyIEMxOC41NjE2NzY0LDMxLjcxMzI0NjMgMTguNTYxMjQ3MywzNi4yMjgzMjM1IDE4LjU2MjEwNTUsNDAuNzQzNDAwNiBDMTguNTYyMTA1NSw0MS4zOTI4OTIyIDE5LjExNjA1NTYsNDEuOTUxMzQxNiAxOS43NTU4MjI5LDQxLjk1MTM0MTYgQzI2LjgwODI4MTcsNDEuOTUxNzc3MiAzMy44NjAzMTE0LDQxLjk1MTc3NzIgNDAuOTEyNzcwMSw0MS45NTEzNDE2IEM0MS41NTg1NDQ3LDQxLjk1MTM0MTYgNDIuMTA5NDkxMiw0MS4zOTM3NjM0IDQyLjEwOTQ5MTIsNDAuNzM5NDgwMSBDNDIuMTA5OTIwMywzNi4yMjk2MzAzIDQyLjEwOTQ5MTIsMzEuNzIwMjE2MSA0Mi4xMDk0OTEyLDI3LjIxMDgwMTggTDQyLjEwOTQ5MTIsMjcuMTE3MTQ2MSBMMzkuMjQwNjIxNywyNy4xMTcxNDYxIEMzOS42NDU2Nzg5LDI4LjQzMTM3NTUgMzkuNzcwMTEzOSwyOS43NjgyNTY1IDM5LjYxMTM1MiwzMS4xMzA4Mzg0IEMzOS40NTE3MzIsMzIuNDkzODU1OSAzOS4wMTkyMTMzLDMzLjc2MjM0NjUgMzguMzE0NjUzOSwzNC45MzM2OTY0IEMzNy42MDk2NjU1LDM2LjEwNjM1MzIgMzYuNjk1NzEyMSwzNy4wNzc3NTkxIDM1LjU3NjY1NTcsMzcuODUwOTYzMyBDMzIuNjc2MDMzOCwzOS44NTY1MDI3IDI4Ljg1NzE2NzcsNDAuMDMyOTIzOSAyNS43NzkzMzMzLDM4LjI3OTE2NiBDMjQuMjIzNDY3MiwzNy4zOTM1NzQ5IDIzLjAwMTg1OTEsMzYuMTU4NjI2MiAyMi4xNTAxMjMyLDM0LjU2NzM1MDEgQzIwLjg3OTU5OTQsMzIuMTkyODUwOCAyMC42NzY2NDE2LDI5LjcwMDczNzMgMjEuNDIxOTY0MiwyNy4xMTQ5NjgxIEMyMC40NzAyNTEyLDI3LjExNTgzOTMgMTkuNTIyNDAwMSwyNy4xMTU4MzkzIDE4LjU2MTY3NjQsMjcuMTE1ODM5MyBMMTguNTYxNjc2NCwyNy4xOTgxNjkyIFogTTI0LjI0NzQ5NiwyOS45MDYzNDQzIEMyNC4xOTk0MzgzLDMzLjM2NTUwNzYgMjYuOTI3MTM4NSwzNi4xMDc2NiAzMC4xOTcyMDM1LDM2LjE3OTA5OTggQzMzLjU5OTg1NjEsMzYuMjUzMTUzMSAzNi4zNTIwMTQyLDMzLjQ5MzE0MDcgMzYuNDIzNjcxNiwzMC4xMzYzNDUzIEMzNi40OTcwNDUzLDI2LjY3NDU2ODQgMzMuNzQ2NjAzNSwyMy44MTUyMzczIDMwLjMzNzA4NTYsMjMuODE3NDE1NCBDMjcuMDAzOTQ0OSwyMy44MTUyMzczIDI0LjI5NDI2NjQsMjYuNTM3Nzg3NSAyNC4yNDc0OTYsMjkuOTA2MzQ0MyBaIE00MC45NTQzOTE1LDIyLjU2OTgzNCBDNDEuNTkwNzI2MSwyMi41NTM3MTY1IDQyLjEwOTA2MjEsMjIuMDAwMDU4NyA0Mi4xMDkwNjIxLDIxLjM1MzE4MDggQzQyLjEwOTQ5MTIsMjAuMzkwMDUxNSA0Mi4xMDk0OTEyLDE5LjQyNjQ4NjUgNDIuMTA5MDYyMSwxOC40NjMzNTcyIEM0Mi4xMDkwNjIxLDE3Ljc3MjQ4MjkgNDEuNTcwNTU5MSwxNy4yMjI3NDU2IDQwLjg5MDg4NjcsMTcuMjIyMzA5OSBDMzkuOTQ0NzUxOSwxNy4yMjE4NzQzIDM4Ljk5ODYxNzEsMTcuMjIxNDM4NyAzOC4wNTIwNTMyLDE3LjIyMjMwOTkgQzM3LjM3NDA5NzIsMTcuMjIzMTgxMiAzNi44MzM4Nzc5LDE3Ljc3NDIyNTMgMzYuODMzNDQ4OCwxOC40NjUwOTk2IEMzNi44MzMwMTk3LDE5LjQxOTk1MjQgMzYuODMwNDQ1MiwyMC4zNzQ4MDUyIDM2LjgzNjg4MTUsMjEuMzMwMDkzNiBDMzYuODM3NzM5NiwyMS40NzI1Mzc0IDM2Ljg2NDM0MywyMS42MjA2NDQxIDM2LjkwODk2NzksMjEuNzU1NjgyNiBDMzcuMDc4ODg2LDIyLjI2NDAzNzIgMzcuNTM3NTc5LDIyLjU3NTkzMjUgMzguMDk5MjUyNywyMi41Nzg1NDYyIEMzOC41NTU4MDAzLDIyLjU3OTQxNzQgMzkuMDEyMzQ3OSwyMi41NzgxMTA2IDM5LjQ2OTMyNDUsMjIuNTc4MTEwNiBDMzkuOTYzNjMxNywyMi41NzI0NDc3IDQwLjQ1OTY1NTIsMjIuNTgyMDMxIDQwLjk1NDM5MTUsMjIuNTY5ODM0IFogTTQwLjk1NDM5MTUsMjIuNTY5ODM0IiBpZD0iUGF0aCIgZmlsbD0iI0ZGRkZGRiIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTU5Ljg4NzcwOTcsMzAgQzU5Ljg4NzcwOTcsNDYuNTY4NTQzMyA0Ni42NTczNDk0LDYwIDMwLjMzNjg3MSw2MCBDMjQuMjgzOTkyMiw2MCAxOC42NTYxNTY4LDU4LjE1MjUxMzQgMTMuOTcwNzc2MSw1NC45ODI3NzU0IEw0Ny44MzA5OTc1LDUuODE5NDExMDMgQzU1LjE0Mjg5NTUsMTEuMjgwNjUwMyA1OS44ODc3MDk3LDIwLjA3Nzc5NzMgNTkuODg3NzA5NywzMCBaIE01OS44ODc3MDk3LDMwIiBpZD0icmVmbGVjIiBmaWxsLW9wYWNpdHk9IjAuMDgiIGZpbGw9IiMwMDAwMDAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+); } + &.linkedin { background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNjAgNjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPg0KICAgIDxwYXRoIGQ9Ik0wLjQ0OTE2MTM3NiwzMCBDMC40NDkxNjEzNzYsMTMuNDMxNDU2NyAxMy42Nzk1MjE3LDAgMzAsMCBDNDYuMzIwNDc4MywwIDU5LjU1MDgzODYsMTMuNDMxNDU2NyA1OS41NTA4Mzg2LDMwIEM1OS41NTA4Mzg2LDQ2LjU2ODU0MzMgNDYuMzIwNDc4Myw2MCAzMCw2MCBDMTMuNjc5NTIxNyw2MCAwLjQ0OTE2MTM3Niw0Ni41Njg1NDMzIDAuNDQ5MTYxMzc2LDMwIFogTTAuNDQ5MTYxMzc2LDMwIiBmaWxsPSIjMDA3QkI2IiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+DQogICAgPHBhdGggZD0iTTIyLjQ2ODAzOTIsMjMuNzA5ODE0NCBMMTUuNzgwODM2NiwyMy43MDk4MTQ0IEwxNS43ODA4MzY2LDQ0LjEzNjk1MzcgTDIyLjQ2ODAzOTIsNDQuMTM2OTUzNyBMMjIuNDY4MDM5MiwyMy43MDk4MTQ0IFogTTIyLjQ2ODAzOTIsMjMuNzA5ODE0NCIgaWQ9IlBhdGgiIGZpbGw9IiNGRkZGRkYiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4NCiAgICA8cGF0aCBkPSJNMjIuOTA4NDc1MywxNy4zOTA4NzYxIEMyMi44NjUwNzI3LDE1LjM4ODAwODEgMjEuNDU2MjkxNywxMy44NjI1MDQgMTkuMTY4NjQxOCwxMy44NjI1MDQgQzE2Ljg4MDk5MTgsMTMuODYyNTA0IDE1LjM4NTQwNTcsMTUuMzg4MDA4MSAxNS4zODU0MDU3LDE3LjM5MDg3NjEgQzE1LjM4NTQwNTcsMTkuMzUyMjU3OSAxNi44MzY3ODgsMjAuOTIxNjg4NiAxOS4wODE4MzY2LDIwLjkyMTY4ODYgTDE5LjEyNDU3MTQsMjAuOTIxNjg4NiBDMjEuNDU2MjkxNywyMC45MjE2ODg2IDIyLjkwODQ3NTMsMTkuMzUyMjU3OSAyMi45MDg0NzUzLDE3LjM5MDg3NjEgWiBNMjIuOTA4NDc1MywxNy4zOTA4NzYxIiBpZD0iUGF0aCIgZmlsbD0iI0ZGRkZGRiIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPg0KICAgIDxwYXRoIGQ9Ik00Ni41ODQ2NTAyLDMyLjQyNDY1NjMgQzQ2LjU4NDY1MDIsMjYuMTUwMzIyNiA0My4yODU2NTM0LDIzLjIzMDE0NTYgMzguODg1MTY1OCwyMy4yMzAxNDU2IEMzNS4zMzQ3MDExLDIzLjIzMDE0NTYgMzMuNzQ1MDk4MywyNS4yMTI4MTI4IDMyLjg1NzU0ODksMjYuNjAzNjg5NiBMMzIuODU3NTQ4OSwyMy43MTAzNTY3IEwyNi4xNjk1NDQ5LDIzLjcxMDM1NjcgQzI2LjI1NzY4NTYsMjUuNjI3MTMzOCAyNi4xNjk1NDQ5LDQ0LjEzNzQ5NiAyNi4xNjk1NDQ5LDQ0LjEzNzQ5NiBMMzIuODU3NTQ4OSw0NC4xMzc0OTYgTDMyLjg1NzU0ODksMzIuNzI5Mjk2MSBDMzIuODU3NTQ4OSwzMi4xMTg3OTYzIDMyLjkwMDk1MTQsMzEuNTA5Nzg3NyAzMy4wNzc3NjY5LDMxLjA3MjY4OTggQzMzLjU2MTA3MTMsMjkuODUzMDQ1OCAzNC42NjE0OTM3LDI4LjU5MDI4ODUgMzYuNTA4OTc0NywyOC41OTAyODg1IEMzOC45Mjk3NzAzLDI4LjU5MDI4ODUgMzkuODk3NDQ3NiwzMC40NjM0MTAxIDM5Ljg5NzQ0NzYsMzMuMjA4NDIyNiBMMzkuODk3NDQ3Niw0NC4xMzY5NTM3IEw0Ni41ODQzODMyLDQ0LjEzNjk1MzcgTDQ2LjU4NDY1MDIsMzIuNDI0NjU2MyBaIE00Ni41ODQ2NTAyLDMyLjQyNDY1NjMiIGlkPSJQYXRoIiBmaWxsPSIjRkZGRkZGIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+DQogICAgPHBhdGggZD0iTTU5LjU1MDgzODYsMzAgQzU5LjU1MDgzODYsNDYuNTY4NTQzMyA0Ni4zMjA0NzgzLDYwIDMwLDYwIEMyMy45NDcxMjEyLDYwIDE4LjMxOTI4NTgsNTguMTUyNTEzNCAxMy42MzM5MDUxLDU0Ljk4Mjc3NTQgTDQ3LjQ5NDEyNjQsNS44MTk0MTEwMyBDNTQuODA2MDI0NSwxMS4yODA2NTAzIDU5LjU1MDgzODYsMjAuMDc3Nzk3MyA1OS41NTA4Mzg2LDMwIFogTTU5LjU1MDgzODYsMzAiIGlkPSJyZWZsZWMiIGZpbGwtb3BhY2l0eT0iMC4wOCIgZmlsbD0iIzAwMDAwMCIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPg0KPC9zdmc+); } + &.pinterest { background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNjAgNjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPg0KICAgIDxwYXRoIGQ9Ik0wLjg4MzgzMzY3NSwzMCBDMC44ODM4MzM2NzUsMTMuNDMxNDU2NyAxMy45MDA4MDExLDAgMjkuOTU4MDQ1OSwwIEM0Ni4wMTUyOTA3LDAgNTkuMDMyMjU4MSwxMy40MzE0NTY3IDU5LjAzMjI1ODEsMzAgQzU5LjAzMjI1ODEsNDYuNTY4NTQzMyA0Ni4wMTUyOTA3LDYwIDI5Ljk1ODA0NTksNjAgQzEzLjkwMDgwMTEsNjAgMC44ODM4MzM2NzUsNDYuNTY4NTQzMyAwLjg4MzgzMzY3NSwzMCBaIE0wLjg4MzgzMzY3NSwzMCIgZmlsbD0iI0NCMjAyNyIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPg0KICAgIDxwYXRoIGQ9Ik0xNy41ODY5MTY1LDI1LjY1NjQ4OTQgQzE3LjU4NjkxNjUsMjguOTU5MDYxOCAxOC43OTg2ODUxLDMxLjg5NzE2OTggMjEuMzk3Njk0MSwzMi45OTIwNTU5IEMyMS44MjM4Njk2LDMzLjE3MTgzNTYgMjIuMjA1NjA4NywzMi45OTgyNDA1IDIyLjMyOTIwMzcsMzIuNTExMzYzOCBDMjIuNDE1MTgyOSwzMi4xNzQ0MTAxIDIyLjYxODU1NjYsMzEuMzI0MzQ4NSAyMi43MDkyODk0LDMwLjk3MDMzMzkgQzIyLjgzMzkxNzksMzAuNDg4Nzg4OCAyMi43ODU1NTQ2LDMwLjMxOTg4NTQgMjIuNDQxNjM4LDI5LjkwMDE4NjIgQzIxLjY5MjIxNCwyOC45ODgwNjU0IDIxLjIxMzMzNSwyNy44MDcyMzQ4IDIxLjIxMzMzNSwyNi4xMzQ2MjI0IEMyMS4yMTMzMzUsMjEuMjgyMDYzMSAyNC43MzE4NjYyLDE2LjkzNzkyIDMwLjM3NTQ4NzcsMTYuOTM3OTIgQzM1LjM3MjgxODgsMTYuOTM3OTIgMzguMTE4MzY0NCwyMC4wODg2NSAzOC4xMTgzNjQ0LDI0LjI5NjUxODggQzM4LjExODM2NDQsMjkuODMzMDA4NyAzNS43NDM4MTA2LDM0LjUwNTc4ODIgMzIuMjE4NjY1NiwzNC41MDU3ODgyIEMzMC4yNzE5NDA3LDM0LjUwNTc4ODIgMjguODE0NjM1NSwzMi44NDQ0Nzg3IDI5LjI4MTczMzcsMzAuODA2OTc1NCBDMjkuODQxMDExNSwyOC4zNzQ1MTEyIDMwLjkyNDQzMTQsMjUuNzQ5MjU4MyAzMC45MjQ0MzE0LDIzLjk5MzQ3MzggQzMwLjkyNDQzMTQsMjIuNDIxNzM0MiAzMC4xMDY4MDI4LDIxLjExMDgxMzkgMjguNDE0NzA4NCwyMS4xMTA4MTM5IEMyNi40MjQ1ODA2LDIxLjExMDgxMzkgMjQuODI1OTA1OCwyMy4yMzUxMTQ4IDI0LjgyNTkwNTgsMjYuMDgwODgwNCBDMjQuODI1OTA1OCwyNy44OTMzOTI1IDI1LjQxOTQ5MjYsMjkuMTE5MjIxNCAyNS40MTk0OTI2LDI5LjExOTIyMTQgQzI1LjQxOTQ5MjYsMjkuMTE5MjIxNCAyMy4zODI4NjE2LDM4LjAyMzExNTMgMjMuMDI1OTI0MiwzOS41ODI0ODU2IEMyMi4zMTQ5NDI4LDQyLjY4ODAwNDEgMjIuOTE5MDcwMyw0Ni40OTQ5NDA3IDIyLjk3MDEyMDQsNDYuODc5NDUxOCBDMjMuMDAwMDg5MSw0Ny4xMDcyMTU0IDIzLjI4Mzg2MTYsNDcuMTYxMzgzOSAyMy40MTI0MTcsNDYuOTg5MjgxNiBDMjMuNTk1OTQ5NCw0Ni43NDIxMTEyIDI1Ljk2NjE2MjksNDMuNzIyNzUwNCAyNi43NzIwMTA3LDQwLjcwNTczNTYgQzI2Ljk5OTk3OTUsMzkuODUxNDA4OCAyOC4wODA5MTkyLDM1LjQyNzcxOSAyOC4wODA5MTkyLDM1LjQyNzcxOSBDMjguNzI3NDE2MiwzNi43MDAyNTIzIDMwLjYxNzA5NzMsMzcuODIxMTU2NCAzMi42MjY2NTMyLDM3LjgyMTE1NjQgQzM4LjYwODgxNzYsMzcuODIxMTU2NCA0Mi42Njc0MDUyLDMyLjE5MzgxNjkgNDIuNjY3NDA1MiwyNC42NjE0MDk4IEM0Mi42Njc0MDUyLDE4Ljk2NTgyNjYgMzcuOTkyMDgyNSwxMy42NjEzNjU2IDMwLjg4NjE5NTUsMTMuNjYxMzY1NiBDMjIuMDQ0ODExMiwxMy42NjEzNjU2IDE3LjU4NjkxNjUsMjAuMjAyMTA1MyAxNy41ODY5MTY1LDI1LjY1NjQ4OTQgWiBNMTcuNTg2OTE2NSwyNS42NTY0ODk0IiBpZD0iUGF0aCIgZmlsbD0iI0ZGRkZGRiIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPg0KICAgIDxwYXRoIGQ9Ik01OS4wMzIyNTgxLDMwIEM1OS4wMzIyNTgxLDQ2LjU2ODU0MzMgNDYuMDE1MjkwNyw2MCAyOS45NTgwNDU5LDYwIEMyNC4wMDI3OTQxLDYwIDE4LjQ2NTczMDIsNTguMTUyNTEzNCAxMy44NTU5MjAzLDU0Ljk4Mjc3NTQgTDQ3LjE3MDAwOSw1LjgxOTQxMTAzIEM1NC4zNjM5NzMyLDExLjI4MDY1MDMgNTkuMDMyMjU4MSwyMC4wNzc3OTczIDU5LjAzMjI1ODEsMzAgWiBNNTkuMDMyMjU4MSwzMCIgaWQ9InJlZmxlYyIgZmlsbC1vcGFjaXR5PSIwLjA4IiBmaWxsPSIjMDAwMDAwIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+DQo8L3N2Zz4=); } + &.rss { background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNjAgNjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPg0KICAgIDxwYXRoIGQ9Ik0wLjExMjI5MDM0NCwzMCBDMC4xMTIyOTAzNDQsMTMuNDMxNDU2NyAxMy4zNDI2NTA2LDAgMjkuNjYzMTI5LDAgQzQ1Ljk4MzYwNzMsMCA1OS4yMTM5Njc2LDEzLjQzMTQ1NjcgNTkuMjEzOTY3NiwzMCBDNTkuMjEzOTY3Niw0Ni41Njg1NDMzIDQ1Ljk4MzYwNzMsNjAgMjkuNjYzMTI5LDYwIEMxMy4zNDI2NTA2LDYwIDAuMTEyMjkwMzQ0LDQ2LjU2ODU0MzMgMC4xMTIyOTAzNDQsMzAgWiBNMC4xMTIyOTAzNDQsMzAiIGZpbGw9IiNFMThGMDAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4NCiAgICA8cGF0aCBkPSJNMjYuNTE0Nzc1NSwzOC43NTcxMjk2IEMyNi41MTQ3NzU1LDM2LjgxOTI5MzQgMjQuOTU3NTAyMSwzNS4yMjkxNjU2IDIzLjAyOTcwNDcsMzUuMjI5MTY1NiBDMjEuMTA5NDMzMSwzNS4yMjkxNjU2IDE5LjU0OTI3NzUsMzYuODE5MjkzNCAxOS41NDkyNzc1LDM4Ljc1NzEyOTYgQzE5LjU0OTI3NzUsNDAuNzA1MjA2OCAyMS4xMDk0MzMxLDQyLjI3NzYxNiAyMy4wMjk3MDQ3LDQyLjI3NzYxNiBDMjQuOTU3NDIyLDQyLjI3NzYxNiAyNi41MTQ2OTU0LDQwLjcwNTI4ODEgMjYuNTE0Nzc1NSwzOC43NTcxMjk2IFogTTM2LjgwNzU0MzMsNDIuMjcwMDU3MSBDMzYuODA3NTQzMywzMi42MDU1ODQ3IDI5LjA2MjY0OCwyNC43NDQyNzA1IDE5LjU0OTI3NzUsMjQuNzQ0MjcwNSBMMTkuNTQ5Mjc3NSwyOS44MzE4MDE3IEMyMi44MTI4OTg2LDI5LjgzMTgwMTcgMjUuODgxNzMwMywzMS4xMjcyMTQ1IDI4LjE5MjA2MDksMzMuNDc0MDQyOSBDMzAuNDk5OTg5NSwzNS44MTU5MTMzIDMxLjc3MzI4NTMsMzguOTQ1NDUxMyAzMS43NzMyODUzLDQyLjI3MDEzODQgTDM2LjgwNzU0MzMsNDIuMjcwMDU3MSBaIE00NS42ODcxNDgyLDQyLjI2NzUzNzUgQzQ1LjY4NzE0ODIsMjcuNjM0Njg3OCAzMy45NjA0MDE0LDE1LjcyMjM4NCAxOS41NDkyNzc1LDE1LjcyMjM4NCBMMTkuNTQ5Mjc3NSwyMC44MTIzNTM1IEMzMS4xODY5MTYsMjAuODEyMzUzNSA0MC42NjA0OTYsMzAuNDM4ODY5IDQwLjY2MDQ5Niw0Mi4yNjczNzQ5IEw0NS42ODcxNDgyLDQyLjI2NzUzNzUgWiBNNDUuNjg3MTQ4Miw0Mi4yNjc1Mzc1IiBpZD0iUGF0aCIgZmlsbD0iI0ZGRkZGRiIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPg0KICAgIDxwYXRoIGQ9Ik01OS4yMTM5Njc2LDMwIEM1OS4yMTM5Njc2LDQ2LjU2ODU0MzMgNDUuOTgzNjA3Myw2MCAyOS42NjMxMjksNjAgQzIzLjYxMDI1MDIsNjAgMTcuOTgyNDE0Nyw1OC4xNTI1MTM0IDEzLjI5NzAzNDEsNTQuOTgyNzc1NCBMNDcuMTU3MjU1NCw1LjgxOTQxMTAzIEM1NC40NjkxNTM0LDExLjI4MDY1MDMgNTkuMjEzOTY3NiwyMC4wNzc3OTczIDU5LjIxMzk2NzYsMzAgWiBNNTkuMjEzOTY3NiwzMCIgaWQ9InJlZmxlYyIgZmlsbC1vcGFjaXR5PSIwLjA4IiBmaWxsPSIjMDAwMDAwIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+DQo8L3N2Zz4=); } + &.stackoverflow { background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+DQogIDxwYXRoIGZpbGw9IiM5MTkxOTEiIGQ9Im03LjI5NDA3NSwyMy4xMTAxODhsMi4zODU4NjQsMC4wMjMyMzdsLTAuMDgzMTc3LDEwLjU1MjY3OWwxNS44NzgyMjEsMGwwLC0xMC41MTQ1MDVsMi41MTQwNSwwbDAsMTMuMDc3NDFsLTIwLjcwNzg0MywwbDAuMDEyODksLTEzLjEzODgxNWwtMC4wMDAwMDUsLTAuMDAwMDA2eiIvPg0KICA8cmVjdCBmaWxsPSIjOTE5MTkxIiB5PSIyOS4zNDg4NjIiIHg9IjExLjE4NDU4MiIgaGVpZ2h0PSIyLjYyODYyNiIgd2lkdGg9IjEyLjQzNzkzOCIvPg0KICA8cmVjdCBmaWxsPSIjYTc4YjY4IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjUzOTU3MzM0MTAzMDQ3MTcsMC4wNTE3MjY2OTg0ODM5OTIwNCwtMC4wNTIwNzU4NjQ3ODAwMzI1MiwwLjUzNTk1NTUyNjQxMDg2NjUsMy42NjExNDE2NjQ4Njc4MzI1LDEuNDA2NzI1NTcyNzY2NjYxNCkgIiB5PSI0MS41MjQzNDciIHg9IjE4LjQ5MTI1IiBoZWlnaHQ9IjUuMDAzOTIzIiB3aWR0aD0iMjMuMDY2ODY0Ii8+DQogIDxyZWN0IGZpbGw9IiNjMTk2NTMiIHRyYW5zZm9ybT0ibWF0cml4KDAuNTIxNjk5ODY3NjIzODk1OCwwLjE0NjI1NTg2MDkyMjc4OTkyLC0wLjE0NzI0MzExOTMxNjAyNDIsMC41MTgyMDE4OTM4Mjc1NDE2LDMuNjYxMTQxNjY0ODY3ODMyNSwxLjQwNjcyNTU3Mjc2NjY2MTQpICIgeT0iMjcuNDM4NTE1IiB4PSIyNC45MDcwNzYiIGhlaWdodD0iNS4wMDM5MjMiIHdpZHRoPSIyMy4wNjY4NjQiLz4NCiAgPHJlY3QgZmlsbD0iI2Q0OGMyOCIgdHJhbnNmb3JtPSJtYXRyaXgoMC40NjQwMDkwMjQ0MjYxMjE2LDAuMjc4MzgzMDczOTI4ODQ3NSwtMC4yODAyNjIyMTkzMTUxMzUzLDAuNDYwODk3ODY1MDk5NzY5OTMsMy42NjExNDE2NjQ4Njc4MzI1LDEuNDA2NzI1NTcyNzY2NjYxNCkgIiB5PSI3LjQ2MTA5MiIgeD0iMzAuMDg5Mzk2IiBoZWlnaHQ9IjUuMDAzOTIzIiB3aWR0aD0iMjMuMDY2ODY0Ii8+DQogIDxyZWN0IGZpbGw9IiNmZTg5MDgiIHRyYW5zZm9ybT0ibWF0cml4KDAuMzE1NzIyMjcwMDE0MzMwNCwwLjQzNzY5MzU2MDg5OTk2MDIsLTAuNDQwNjQ4MDg2MjAxOTY2NCwwLjMxMzYwNTM2NjYwNjg4NzM3LDMuNjYxMTQxNjY0ODY3ODMyNSwxLjQwNjcyNTU3Mjc2NjY2MTQpICIgeT0iLTIwLjM0MzgwMyIgeD0iMjguNDg4MzAzIiBoZWlnaHQ9IjUuMDAzOTIzIiB3aWR0aD0iMjMuMDY2ODY0Ii8+DQogIDxyZWN0IGZpbGw9IiNmZjdhMTUiIHRyYW5zZm9ybT0ibWF0cml4KDAuMDg5MzQwMjMwNDgyMTY3NiwwLjUzMTA4MjgzMzM4NDMxNzksLTAuNTM0NjY3NzU2MjgyMTI5OSwwLjA4ODc0MTIwODMxNTI0NTg1LDMuNjYxMTQxNjY0ODY3ODMyNSwxLjQwNjcyNTU3Mjc2NjY2MTQpICIgeT0iLTQ3LjA0NTkyNyIgeD0iMTQuMTU4MjAzIiBoZWlnaHQ9IjUuMDAzOTIzIiB3aWR0aD0iMjMuMDY2ODY0Ii8+DQo8L3N2Zz4NCg==); } + &.twitter { background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNjAgNjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPg0KICAgIDxwYXRoIGQ9Ik0wLDMwIEMwLDEzLjQzMTQ1NjcgMTMuNDUwODY2MywwIDMwLjA0MzM1MjYsMCBDNDYuNjM1ODM4OSwwIDYwLjA4NjcwNTIsMTMuNDMxNDU2NyA2MC4wODY3MDUyLDMwIEM2MC4wODY3MDUyLDQ2LjU2ODU0MzMgNDYuNjM1ODM4OSw2MCAzMC4wNDMzNTI2LDYwIEMxMy40NTA4NjYzLDYwIDAsNDYuNTY4NTQzMyAwLDMwIFogTTAsMzAiIGZpbGw9IiM0MDk5RkYiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4NCiAgICA8cGF0aCBkPSJNMjkuMjk5NzY3NSwyMy44ODc5Nzc2IEwyOS4zNjI3MjA2LDI0LjkyNjA0NTMgTDI4LjMxMzUwMTYsMjQuNzk4OTM1IEMyNC40OTQzNDQ1LDI0LjMxMTY3ODcgMjEuMTU3ODI4MSwyMi42NTkyNDQ0IDE4LjMyNDkzNjgsMTkuODg0MDAyMyBMMTYuOTM5OTY3NywxOC41MDY5NzM3IEwxNi41ODMyMzMzLDE5LjUyMzg1NjMgQzE1LjgyNzc5NTYsMjEuNzkwNjU3MiAxNi4zMTA0MzYzLDI0LjE4NDU2ODQgMTcuODg0MjY0OCwyNS43OTQ2MzI1IEMxOC43MjM2NCwyNi42ODQ0MDQ4IDE4LjUzNDc4MDYsMjYuODExNTE1MiAxNy4wODY4NTg0LDI2LjI4MTg4ODggQzE2LjU4MzIzMzMsMjYuMTEyNDA4MyAxNi4xNDI1NjEzLDI1Ljk4NTI5OCAxNi4xMDA1OTI1LDI2LjA0ODg1MzIgQzE1Ljk1MzcwMTksMjYuMTk3MTQ4NiAxNi40NTczMjcsMjguMTI0OTg4NSAxNi44NTYwMzAyLDI4Ljg4NzY1MDUgQzE3LjQwMTYyNDEsMjkuOTQ2OTAzMyAxOC41MTM3OTYyLDMwLjk4NDk3MDkgMTkuNzMwODkwMiwzMS41OTkzMzc1IEwyMC43NTkxMjQ4LDMyLjA4NjU5MzggTDE5LjU0MjAzMDgsMzIuMTA3Nzc4OCBDMTguMzY2OTA1NSwzMi4xMDc3Nzg4IDE4LjMyNDkzNjgsMzIuMTI4OTYzOSAxOC40NTA4NDMxLDMyLjU3Mzg1IEMxOC44NzA1MzA3LDMzLjk1MDg3ODYgMjAuNTI4Mjk2NywzNS40MTI2NDc0IDIyLjM3NDkyMjEsMzYuMDQ4MTk5IEwyMy42NzU5NTM2LDM2LjQ5MzA4NTIgTDIyLjU0Mjc5NzEsMzcuMTcxMDA2OSBDMjAuODY0MDQ2NywzOC4xNDU1MTk0IDE4Ljg5MTUxNSwzOC42OTYzMzA5IDE2LjkxODk4MzMsMzguNzM4NzAxIEMxNS45NzQ2ODYyLDM4Ljc1OTg4NiAxNS4xOTgyNjQyLDM4Ljg0NDYyNjIgMTUuMTk4MjY0MiwzOC45MDgxODE0IEMxNS4xOTgyNjQyLDM5LjEyMDAzMTkgMTcuNzU4MzU4NSw0MC4zMDYzOTUgMTkuMjQ4MjQ5NSw0MC43NzI0NjYyIEMyMy43MTc5MjI0LDQyLjE0OTQ5NDggMjkuMDI2OTcwNSw0MS41NTYzMTMyIDMzLjAxNDAwMjcsMzkuMjA0NzcyMiBDMzUuODQ2ODk0LDM3LjUzMTE1MjggMzguNjc5Nzg1MywzNC4yMDUwOTkzIDQwLjAwMTgwMTIsMzAuOTg0OTcwOSBDNDAuNzE1MjcwMSwyOS4yNjg5ODE1IDQxLjQyODczOSwyNi4xMzM1OTM0IDQxLjQyODczOSwyNC42Mjk0NTQ1IEM0MS40Mjg3MzksMjMuNjU0OTQyIDQxLjQ5MTY5MjIsMjMuNTI3ODMxNyA0Mi42NjY4MTc0LDIyLjM2MjY1MzcgQzQzLjM1OTMwMiwyMS42ODQ3MzE5IDQ0LjAwOTgxNzgsMjAuOTQzMjU1IDQ0LjEzNTcyNCwyMC43MzE0MDQ0IEM0NC4zNDU1Njc4LDIwLjMyODg4ODQgNDQuMzI0NTgzNSwyMC4zMjg4ODg0IDQzLjI1NDM4MDEsMjAuNjg5MDM0MyBDNDEuNDcwNzA3OCwyMS4zMjQ1ODYgNDEuMjE4ODk1MiwyMS4yMzk4NDU4IDQyLjEwMDIzOTIsMjAuMjg2NTE4MyBDNDIuNzUwNzU1LDE5LjYwODU5NjUgNDMuNTI3MTc3LDE4LjM3OTg2MzQgNDMuNTI3MTc3LDE4LjAxOTcxNzQgQzQzLjUyNzE3NywxNy45NTYxNjIzIDQzLjIxMjQxMTMsMTguMDYyMDg3NiA0Mi44NTU2NzY5LDE4LjI1Mjc1MyBDNDIuNDc3OTU4LDE4LjQ2NDYwMzYgNDEuNjM4NTgyOCwxOC43ODIzNzk0IDQxLjAwOTA1MTQsMTguOTczMDQ0OSBMMzkuODc1ODk0OSwxOS4zMzMxOTA4IEwzOC44NDc2NjAzLDE4LjYzNDA4NCBDMzguMjgxMDgyLDE4LjI1Mjc1MyAzNy40ODM2NzU2LDE3LjgyOTA1MiAzNy4wNjM5ODgsMTcuNzAxOTQxNiBDMzUuOTkzNzg0NiwxNy40MDUzNTA5IDM0LjM1NzAwMywxNy40NDc3MjEgMzMuMzkxNzIxNSwxNy43ODY2ODE4IEMzMC43Njg2NzQsMTguNzQwMDA5MyAyOS4xMTA5MDgsMjEuMTk3NDc1NyAyOS4yOTk3Njc1LDIzLjg4Nzk3NzYgWiBNMjkuMjk5NzY3NSwyMy44ODc5Nzc2IiBpZD0iUGF0aCIgZmlsbD0iI0ZGRkZGRiIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPg0KICAgIDxwYXRoIGQ9Ik02MC4wODY3MDUyLDMwIEM2MC4wODY3MDUyLDQ2LjU2ODU0MzMgNDYuNjM1ODM4OSw2MCAzMC4wNDMzNTI2LDYwIEMyMy44ODk1OTI1LDYwIDE4LjE2Nzk1OTgsNTguMTUyNTEzNCAxMy40MDQ0ODk1LDU0Ljk4Mjc3NTQgTDQ3LjgyOTA0NzgsNS44MTk0MTEwMyBDNTUuMjYyODEwOCwxMS4yODA2NTAzIDYwLjA4NjcwNTIsMjAuMDc3Nzk3MyA2MC4wODY3MDUyLDMwIFogTTYwLjA4NjcwNTIsMzAiIGlkPSJyZWZsZWMiIGZpbGwtb3BhY2l0eT0iMC4wOCIgZmlsbD0iIzAwMDAwMCIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPg0KPC9zdmc+); } + &.youtube { background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjQwcHgiIGhlaWdodD0iNDBweCIgdmlld0JveD0iMCAwIDYwIDYwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KICAgIDx0aXRsZT5Zb3VUdWJlPC90aXRsZT4KICAgIDxkZXNjcmlwdGlvbj5DcmVhdGVkIHdpdGggU2tldGNoIChodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gpPC9kZXNjcmlwdGlvbj4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgogICAgICAgIDxnIGlkPSJZb3VUdWJlIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KICAgICAgICAgICAgPGcgaWQ9IllvdXR1YmUiIHNrZXRjaDp0eXBlPSJNU0xheWVyR3JvdXAiPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTAuNDQ5MTYxMzc2LDMwIEMwLjQ0OTE2MTM3NiwxMy40MzE0NTY3IDEzLjY3OTUyMTcsMCAzMCwwIEM0Ni4zMjA0NzgzLDAgNTkuNTUwODM4NiwxMy40MzE0NTY3IDU5LjU1MDgzODYsMzAgQzU5LjU1MDgzODYsNDYuNTY4NTQzMyA0Ni4zMjA0NzgzLDYwIDMwLDYwIEMxMy42Nzk1MjE3LDYwIDAuNDQ5MTYxMzc2LDQ2LjU2ODU0MzMgMC40NDkxNjEzNzYsMzAgWiBNMC40NDkxNjEzNzYsMzAiIGlkPSJZb3VUdWJlIiBmaWxsPSIjQ0QzMzJEIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNDMuMzA1NTgwMiwzMC40MjgzMTI1IEM0NC43MjMxODAyLDMxLjg2MjM1MTYgNDQuNzM4NTE1OCwzOC45NDE4NTM1IDQ0LjczODUxNTgsMzguOTgyNzU1OSBDNDQuNzM4NTE1OCwzOC45ODI3NTU5IDQ0LjcyNzAzMTYsNDYuMDk5MTEzMyA0My4zMDU1ODAyLDQ3LjUzODEzODcgQzQxLjg5Mzg2MjQsNDguOTY5MTQyNiAyOS45OTQzMjc5LDQ5IDI5Ljk5NDMyNzksNDkgQzI5Ljk5NDMyNzksNDkgMTguMDk2NDc0LDQ4Ljk2OTE0MjYgMTYuNjgxMDQ0OSw0Ny41MzgyMTA5IEMxNS4yNjU0NzU3LDQ2LjEwNDA5OTYgMTUuMjYxNTU0MiwzOS4wMzY0NDkyIDE1LjI2MTU1NDIsMzguOTgyNzU1OSBDMTUuMjYxNTU0MiwzOC45NDE5OTggMTUuMjY1NDA1NywzMS44NjIzNTE2IDE2LjY4MTA0NDksMzAuNDI4MzEyNSBDMTguMDk2NjE0MSwyOC45OTY0NDE0IDI5Ljk5NDMyNzksMjguOTc3MzYzMyAyOS45OTQzMjc5LDI4Ljk3ODQ0NzMgQzI5Ljk5NDMyNzksMjguOTc3MzYzMyA0MS44OTM4NjI0LDI4Ljk5NjQ0MTQgNDMuMzA1NTgwMiwzMC40MjgzMTI1IFogTTIyLjAzNjY3OTIsNDQuODgzODk0NSBMMjAuMDk4MzY4Myw0NC44ODM4OTQ1IEwyMC4wOTgzNjgzLDM0LjU5OTA1MDggTDE4LjA5NDUxMzMsMzQuNTk5MDUwOCBMMTguMDk0NTEzMywzMi44NTE1MjM0IEwyNC4wNDA0NjQyLDMyLjg1MTUyMzQgTDI0LjA0MDUzNDIsMzQuNTk5MDUwOCBMMjIuMDM2Njc5MiwzNC41OTkwNTA4IEwyMi4wMzY2NzkyLDQ0Ljg4Mzg5NDUgWiBNMjcuOTg4MzcyMiw0My45MDc3MzA1IEMyNy42NjgyODQ4LDQ0LjI2OTkyNTggMjcuMzQwMzU0NSw0NC41NDM1OTU3IDI2Ljk5NTE5NzksNDQuNzMwNzYzNyBDMjYuNjUxODYyLDQ0LjkyMTkwNjMgMjYuMzIwMDgwMyw0NS4wMTMzMjIzIDI1Ljk5NjA3MTQsNDUuMDEzMzIyMyBDMjUuNTk2Nzg1LDQ1LjAxMzMyMjMgMjUuMzAxNjk2OCw0NC44ODM5NjY4IDI1LjA5NzM2MTgsNDQuNjE3Mzc4OSBDMjQuODk4Njk5LDQ0LjM1MTUxMzcgMjQuNzk2NDYxNSw0My45NTg2MDU1IDI0Ljc5NjQ2MTUsNDMuNDI4MTAzNSBMMjQuNzk2NDYxNSwzNi4wMDYxMzQ4IEwyNi41MTQ5NjE4LDM2LjAwNjEzNDggTDI2LjUxNDk2MTgsNDIuODE1MDc0MiBDMjYuNTE0OTYxOCw0My4wMjYwMTc2IDI2LjU1MTU4NTIsNDMuMTc3MjY5NSAyNi42MjExMjA3LDQzLjI3MDc4MTIgQzI2LjY5NjMyODMsNDMuMzY2MzE2NCAyNi44MTM5NzE0LDQzLjQxMjEzMjggMjYuOTc0MDUwMSw0My40MTIxMzI4IEMyNy4wOTk0NjYxLDQzLjQxMjEzMjggMjcuMjYxNDM1Niw0My4zNDk0MDYzIDI3LjQ1NDI4NjMsNDMuMjI1MDM3MSBDMjcuNjQ5MDk3Nyw0My4wOTk1ODQgMjcuODI0NTgyMSw0Mi45NDIzMzQgMjcuOTg4NDQyMiw0Mi43NTAzMjQyIEwyNy45ODg0NDIyLDM2LjAwNjI3OTMgTDI5LjcwNjg3MjUsMzYuMDA2Mjc5MyBMMjkuNzA2ODAyNSw0NC44ODM5NjY4IEwyNy45ODgzNzIyLDQ0Ljg4Mzk2NjggTDI3Ljk4ODM3MjIsNDMuOTA3NzMwNSBaIE0zNC4zNzAzNzMsNDQuOTk2MjY3NiBDMzQuMDMyODQ5Miw0NC45OTYyNjc2IDMzLjczMzgzOTUsNDQuOTMzNzU3OCAzMy40NzE1MjMzLDQ0LjgwNDMzMDEgQzMzLjIwOTM0NzEsNDQuNjc1MDQ2OSAzMi45NjA0MDU4LDQ0LjQ3NTk1NTEgMzIuNzM2ODEzOCw0NC4yMDMzNjkxIEwzMi43MzY4MTM4LDQ0Ljg4Mzk2NjggTDMwLjk5OTE5NjUsNDQuODgzOTY2OCBMMzAuOTk5MTk2NSwzMi44NTE1MjM0IEwzMi43MzY4MTM4LDMyLjg1MTUyMzQgTDMyLjczNjgxMzgsMzYuNzI1NjExMyBDMzIuOTcwMTM5NCwzNi40NTY4NTU1IDMzLjIxNTA4OTIsMzYuMjQ4ODc1IDMzLjQ3MzU1NCwzNi4xMDk2OTE0IEMzMy43MzU3MzAyLDM1Ljk2ODQxMjEgMzQuMDAwMTQ3MiwzNS44OTg2NzU4IDM0LjI2NjEwNDcsMzUuODk4Njc1OCBDMzQuODExOTU0OSwzNS44OTg2NzU4IDM1LjIyNjY0NywzNi4wODc3OTQ5IDM1LjUxMjA3MTcsMzYuNDY0MDA5OCBDMzUuODAxMzQ3OCwzNi44NDMxMTUyIDM1Ljk0NDEzMDIsMzcuMzk3MzkyNiAzNS45NDQxMzAyLDM4LjEyMzg3ODkgTDM1Ljk0NDEzMDIsNDMuMDQ5ODY1MiBDMzUuOTQzOTkwMSw0My42Nzc3MDkgMzUuODA4ODQwNiw0NC4xNTk0MzE2IDM1LjUzOTAzMTYsNDQuNDk0ODg4NyBDMzUuMjcwOTczMyw0NC44MzExNDA2IDM0Ljg3OTUyOTcsNDQuOTk2MjY3NiAzNC4zNzAzNzMsNDQuOTk2MjY3NiBaIE0zOC42MTcwMTA1LDQyLjMzMDM4ODcgQzM4LjYxNzAxMDUsNDIuNzk4MTY0MSAzOC42NzMxMDExLDQzLjEyMTU1MjcgMzguNzg0NzkyMSw0My4zMDM2NjIxIEMzOC45MDA0NzQ1LDQzLjQ4Mzc0OCAzOS4wOTMzMjUyLDQzLjU3MjQ5MDIgMzkuMzY3MjY1Nyw0My41NzI0OTAyIEMzOS42NTI1NTA0LDQzLjU3MjQ5MDIgMzkuODUxMjgzMiw0My40OTU3NDQxIDM5Ljk2NTA3NSw0My4zNDI1NDEgQzQwLjA3Njk3Niw0My4xODkyNjU2IDQwLjEzNjcwNzksNDIuODUyOTQxNCA0MC4xMzY3MDc5LDQyLjMzMDM4ODcgTDQwLjEzNjcwNzksNDEuOTI1NDEyMSBMNDEuOTA1Mjc2Niw0MS45MjU0MTIxIEw0MS45MDUyNzY2LDQyLjM4MTI2MzcgQzQxLjkwNTI3NjYsNDMuMjkxODgyOCA0MS42OTEwNjgsNDMuOTc3NDY2OCA0MS4yNTcyNTg5LDQ0LjQ0MDE4MzYgQzQwLjgyOTE5MTksNDQuODk3OTg2MyA0MC4xODQ4ODU2LDQ1LjEyNTc2NzYgMzkuMzI4NjgxNiw0NS4xMjU3Njc2IEMzOC41NTkwOTkzLDQ1LjEyNTc2NzYgMzcuOTUxNTU2NSw0NC44ODM4OTQ1IDM3LjUwOTkwNDUsNDQuMzk0Mjk0OSBDMzcuMDY4MTEyNCw0My45MDc4MDI3IDM2Ljg0NDM4MDQsNDMuMjM2ODg4NyAzNi44NDQzODA0LDQyLjM4MTE5MTQgTDM2Ljg0NDM4MDQsMzguMzk0NTg1OSBDMzYuODQ0MzgwNCwzNy42MjczNDE4IDM3LjA4OTMzMDIsMzYuOTk2MzkwNiAzNy41NzUzNzg1LDM2LjUxMjcxNjggQzM4LjA2MTI4NjcsMzYuMDI4MTAzNSAzOC42ODYxOTU5LDM1Ljc4NjMwMjcgMzkuNDU3NzM4OSwzNS43ODYzMDI3IEM0MC4yNDQ1NDc1LDM1Ljc4NjMwMjcgNDAuODUwMTk5NiwzNi4wMTExMjExIDQxLjI3MjUyNDUsMzYuNDU5OTYyOSBDNDEuNjk0ODQ5NCwzNi45MDc3MjA3IDQxLjkwNTIwNjYsMzcuNTUyNjE5MSA0MS45MDUyMDY2LDM4LjM5NDU4NTkgTDQxLjkwNTIwNjYsNDAuNjU3NTExNyBMMzguNjE3MDEwNSw0MC42NTc1ODQgTDM4LjYxNzAxMDUsNDIuMzMwMzg4NyBaIE0zMy45OTIzMDQzLDM3LjUzODY3MTkgQzM0LjExMzY1ODgsMzcuNjkzODI2MiAzNC4xNzM1MzA4LDM3LjkyMTY3OTcgMzQuMTczNTMwOCwzOC4yMjEyOTMgTDM0LjE3MzUzMDgsNDIuODA1MDI5MyBDMzQuMTczNTMwOCw0My4wOTA1NTA4IDM0LjEyMTQzMTcsNDMuMjkxNTkzOCAzNC4wMjMyNTU2LDQzLjQxNjAzNTIgQzMzLjkyNDkzOTYsNDMuNTQzNDM5NSAzMy43NzA1MzMsNDMuNjA2MTY2IDMzLjU2MDMxNTgsNDMuNjA2MTY2IEMzMy40MTM4MjIxLDQzLjYwNjE2NiAzMy4yNzY5MjE5LDQzLjU3MjIwMTIgMzMuMTQ1NjIzNyw0My41MDk2MTkxIEMzMy4wMTI2NDUsNDMuNDQ3ODMyIDMyLjg3NTYwNDcsNDMuMzM5MzYxMyAzMi43MzY4MTM4LDQzLjE5NjEzMDkgTDMyLjczNjgxMzgsMzcuNjY1MTM2NyBDMzIuODU0Mzg2OSwzNy41NDI3MTg4IDMyLjk3MjAzMDEsMzcuNDUyMTY5OSAzMy4wOTE1NjM5LDM3LjM5NDM1NzQgQzMzLjIxMTIzNzgsMzcuMzM0NjY2IDMzLjMzMjY2MjQsMzcuMzA3NzgzMiAzMy40NTYwNDc2LDM3LjMwNzc4MzIgQzMzLjY4NzQxMjUsMzcuMzA3NzgzMiAzMy44NjY4ODgzLDM3LjM4NTM5NjUgMzMuOTkyMzA0MywzNy41Mzg2NzE5IFogTTM4Ljc5NDUyNTYsMzcuNTg0NDg4MyBDMzguNjc0OTkxOCwzNy43Mzk1NzAzIDM4LjYxNzE1MDYsMzguMDA4MzI2MiAzOC42MTcxNTA2LDM4LjM3OTYyNyBMMzguNjE3MTUwNiwzOS4yNzYyMjY2IEw0MC4xMzY5MTgsMzkuMjc2MjI2NiBMNDAuMTM2OTE4LDM4LjM3OTYyNyBDNDAuMTM2OTE4LDM4LjAwODM5ODQgNDAuMDc1MjI1NCwzNy43Mzk3ODcxIDM5Ljk1NTU1MTUsMzcuNTg0NDg4MyBDMzkuODM5ODY5MSwzNy40MTgyMDUxIDM5LjY0NTEyNzYsMzcuMzM5NjUyMyAzOS4zODQ3MDIxLDM3LjMzOTY1MjMgQzM5LjExMDkwMTcsMzcuMzM5NjUyMyAzOC45MTQxOTk1LDM3LjQxODIwNTEgMzguNzk0NTI1NiwzNy41ODQ0ODgzIFogTTM4Ljc5NDUyNTYsMzcuNTg0NDg4MyIgaWQ9IlBhdGgiIGZpbGw9IiNGRkZGRkYiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xOS4xOTc4MzgsMTIgTDIxLjc5MTcyOTQsMjAuMDAzMDU2NiBMMjEuNzkxNzI5NCwyNS4yNTQ1MjczIEwyMy45NzEyMDg4LDI1LjI1NDUyNzMgTDIzLjk3MTIwODgsMTkuNzU1MjU3OCBMMjYuNTA3MjU4OSwxMiBMMjQuMjkxMjI2MSwxMiBMMjIuOTQ1MTkyNCwxNy4yOTgyMjY2IEwyMi44MDgyMjIyLDE3LjI5ODIyNjYgTDIxLjM5MjU4MywxMiBMMTkuMTk3ODM4LDEyIFogTTI5LjU0Njc5MzgsMTUuMjI5NDA2MyBDMzAuMzQ3MTE3MywxNS4yMjk0MDYzIDMxLjAwNDg2ODYsMTUuNDY2MTQ4NCAzMS41MTc4NzY3LDE1LjkzOTkyMTkgQzMyLjAyNjk2MzQsMTYuNDEyNjExMyAzMi4yODM1Mzc2LDE3LjAyMjYwNTUgMzIuMjgzNTM3NiwxNy43NjgwMjU0IEwzMi4yODM1Mzc2LDIyLjgxOTM5MjYgQzMyLjI4MzUzNzYsMjMuNjU1Mjg5MSAzMi4wMzI4NDU2LDI0LjMxMDE2MDIgMzEuNTMzMzUyNCwyNC43ODY4OTY1IEMzMS4wMjc5NzcsMjUuMjYyNTQ4OCAzMC4zMzk0ODQ1LDI1LjUwMTQ1OSAyOS40NTgxNDEzLDI1LjUwMTQ1OSBDMjguNjEzNDIxNCwyNS41MDE0NTkgMjcuOTM0NTkyNSwyNS4yNTQ1OTk2IDI3LjQyNTM2NTcsMjQuNzY1MTQ0NSBDMjYuOTIwMDYwMywyNC4yNzM0NDkyIDI2LjY2MzYyNjMsMjMuNjExNzEyOSAyNi42NjM2MjYzLDIyLjc4MDgwMjcgTDI2LjY2MzQ4NjIsMTcuNzEzMjQ4IEMyNi42NjM0ODYyLDE2Ljk1Mzk1MzEgMjYuOTIzODQxNywxNi4zNTA4OTY1IDI3LjQ0NjUxMzQsMTUuOTAzMDY2NCBDMjcuOTY3Mjk0NCwxNS40NTQyMjQ2IDI4LjY2OTIzMTksMTUuMjI5NDA2MyAyOS41NDY3OTM4LDE1LjIyOTQwNjMgWiBNMjkuNDU0MTQ5OCwyMy44MDc0ODA1IEMyOS43MTY1MzYsMjMuODA3NDgwNSAyOS45MjI4MzE3LDIzLjczMTk2MjkgMzAuMDc5MDU5LDIzLjU4MzYwMTYgQzMwLjIzMzQ2NTYsMjMuNDMyMjc3MyAzMC4zMTA2MzM5LDIzLjIyNjM5MjYgMzAuMzEwNjMzOSwyMi45NjU1ODU5IEwzMC4zMTA2MzM5LDE3LjYzODUyNTQgQzMwLjMxMDYzMzksMTcuNDI0NjkxNCAzMC4yMzE0MzQ5LDE3LjI1MjQ4MjQgMzAuMDczMzE2OSwxNy4xMjAwOTE4IEMyOS45MTUxOTg5LDE2Ljk4ODc4NTIgMjkuNzA4ODMzMiwxNi45MjQwMzUyIDI5LjQ1NDE0OTgsMTYuOTI0MDM1MiBDMjkuMjE2OTcyOCwxNi45MjQwMzUyIDI5LjAyNjA4MjgsMTYuOTg4Nzg1MiAyOC44Nzc1NTgzLDE3LjEyMDA5MTggQzI4LjczMDk5NDYsMTcuMjUyNDgyNCAyOC42NTU3ODcsMTcuNDI0NTQ2OSAyOC42NTU3ODcsMTcuNjM4NTI1NCBMMjguNjU1Nzg3LDIyLjk2NTY1ODIgQzI4LjY1NTcxNjksMjMuMjMzMzMwMSAyOC43MjcwNzMxLDIzLjQzOTI4NzEgMjguODYzOTczMywyMy41ODc1NzYyIEMyOS4wMDA5NDM2LDIzLjczNDg1MzUgMjkuMTk3NzE1NywyMy44MDc0ODA1IDI5LjQ1NDE0OTgsMjMuODA3NDgwNSBaIE0zNy40NDA2NDkxLDI1LjI1NDU5OTYgTDM3LjQ0MDY0OTEsMjQuMTc0ODc4OSBDMzcuMDg3NjQ5NiwyNC41NzE5MDYzIDM2LjcxNTUzMzEsMjQuODc3NTE3NiAzNi4zMjc3MzA5LDI1LjA4NDQxNDEgQzM1Ljk0MjAyOTQsMjUuMjkyMzk0NSAzNS41Njc4MTIyLDI1LjM5NjAyMzQgMzUuMjA1MTQ5MSwyNS4zOTYwMjM0IEMzNC43NTM5NzM3LDI1LjM5NjAyMzQgMzQuNDIwMjMxMiwyNS4yNDk2ODU1IDM0LjE5Mjc4NzgsMjQuOTU5MTA1NSBDMzMuOTY3MDk1LDI0LjY2NzUxMzcgMzMuODUzMzAzMywyNC4yMzE2Nzk3IDMzLjg1MzMwMzMsMjMuNjQ4NDIzOCBMMzMuODUzMzAzMywxNS40NzYxMjExIEwzNS43ODU3MzIxLDE1LjQ3NjEyMTEgTDM1Ljc4NTczMjEsMjIuOTcyNTk1NyBDMzUuNzg1NzMyMSwyMy4yMDQ0OTYxIDM1LjgzMDE5ODQsMjMuMzcxNjQ2NSAzNS45MTExNDgxLDIzLjQ3NTEzMDkgQzM1Ljk5MDIwNzEsMjMuNTc4NzU5OCAzNi4xMjMyNTU5LDIzLjYzMTM2OTEgMzYuMzA0NjIyNCwyMy42MzEzNjkxIEMzNi40NDUzNzQsMjMuNjMxMzY5MSAzNi42MjY3NDA1LDIzLjU2MTc3NzMgMzYuODQ0NTkwNSwyMy40MjU0MTIxIEMzNy4wNjA1NDk3LDIzLjI4ODEwNzQgMzcuMjYxMTczMiwyMy4xMTI3OTEgMzcuNDQwNTA5LDIyLjg5Nzk0NTMgTDM3LjQ0MDUwOSwxNS40NzYxMjExIEwzOS4zNzY5OTkzLDE1LjQ3NjEyMTEgTDM5LjM3Njk5OTMsMjUuMjU0NTk5NiBMMzcuNDQwNjQ5MSwyNS4yNTQ1OTk2IFogTTM3LjQ0MDY0OTEsMjUuMjU0NTk5NiIgaWQ9IlBhdGgiIGZpbGw9IiNGRkZGRkYiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik01OS41NTA4Mzg2LDMwIEM1OS41NTA4Mzg2LDQ2LjU2ODU0MzMgNDYuMzIwNDc4Myw2MCAzMCw2MCBDMjMuOTQ3MTIxMiw2MCAxOC4zMTkyODU4LDU4LjE1MjUxMzQgMTMuNjMzOTA1MSw1NC45ODI3NzU0IEw0Ny40OTQxMjY0LDUuODE5NDExMDMgQzU0LjgwNjAyNDUsMTEuMjgwNjUwMyA1OS41NTA4Mzg2LDIwLjA3Nzc5NzMgNTkuNTUwODM4NiwzMCBaIE01OS41NTA4Mzg2LDMwIiBpZD0icmVmbGVjIiBmaWxsLW9wYWNpdHk9IjAuMDgiIGZpbGw9IiMwMDAwMDAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+); } + &.googleplus { background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjQwcHgiIGhlaWdodD0iNDBweCIgdmlld0JveD0iMCAwIDYwIDYwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KICAgIDx0aXRsZT5Hb29nbGUgKzwvdGl0bGU+CiAgICA8ZGVzY3JpcHRpb24+Q3JlYXRlZCB3aXRoIFNrZXRjaCAoaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoKTwvZGVzY3JpcHRpb24+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBza2V0Y2g6dHlwZT0iTVNQYWdlIj4KICAgICAgICA8ZyBpZD0iR29vZ2xlLSsiIHNrZXRjaDp0eXBlPSJNU0FydGJvYXJkR3JvdXAiPgogICAgICAgICAgICA8ZyBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLjExMjI5MDM0NCwyOS41MDgxOTY3IEMwLjExMjI5MDM0NCwxMy4yMTEyNjg5IDEzLjM0MjY1MDYsMCAyOS42NjMxMjksMCBDNDUuOTgzNjA3MywwIDU5LjIxMzk2NzYsMTMuMjExMjY4OSA1OS4yMTM5Njc2LDI5LjUwODE5NjcgQzU5LjIxMzk2NzYsNDUuODA1MTI0NiA0NS45ODM2MDczLDU5LjAxNjM5MzQgMjkuNjYzMTI5LDU5LjAxNjM5MzQgQzEzLjM0MjY1MDYsNTkuMDE2MzkzNCAwLjExMjI5MDM0NCw0NS44MDUxMjQ2IDAuMTEyMjkwMzQ0LDI5LjUwODE5NjcgWiBNMC4xMTIyOTAzNDQsMjkuNTA4MTk2NyIgZmlsbD0iI0QzNDgzNiIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTU4LjI5NTc2NzIsMjIuNzE1NzA0OSBMNTEuMzA3NTkxNSwyMi43MTU3MDQ5IEw1MS4zMDc1OTE1LDMwLjQ2OTIwNzkgTDQ4LjAxMzY2MjMsMzAuNDY5MjA3OSBMNDguMDEzNjYyMywyMi43MTU3MDQ5IEw0MC4zMjc4Njg5LDIyLjcxNTcwNDkgTDQwLjMyNzg2ODksMTkuNDg4NjU5IEw0OC4wMTM2NjIzLDE5LjQ4ODY1OSBMNDguMDEzNjYyMywxMS44MDMyNzg3IEw1MS4zMDc1OTE1LDExLjgwMzI3ODcgTDUxLjMwNzU5MTUsMTkuNDg4NjU5IEw1Ny4xNzUyNDk2LDE5LjQ4ODY1OSBDNTcuNjA4NjI1NiwyMC41MzUzODMzIDU3Ljk4MzUwNDMsMjEuNjEyNDcyNiA1OC4yOTU3NjcyLDIyLjcxNTcwNDkgWiBNNTguMjk1NzY3MiwyMi43MTU3MDQ5IiBpZD0iU2hhcGUiIGZpbGw9IiNGRkZGRkYiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik04LjIzMDMzODgzLDQ4LjYwNTA4MTEgQzkuMDU2NjMyNTQsNDcuMjE3NTUzNiAxMC4zMzc4NjM5LDQ1Ljg1MzQgMTIuMjM1OTMwOCw0NC43MzIzODI4IEMxNi41MTg2MjMxLDQyLjExMjA5MjEgMjIuMjg2NjQyMSw0MS43NjYwMTU5IDI1LjQwNTgyODMsNDEuNTY4MjU4MSBDMjQuNDQwMzY1OSw0MC4zMzIyNzE5IDIzLjMyNjM3MDgsMzkuMDIyMTI2NSAyMy4zMjYzNzA4LDM2Ljg3MTUxMDUgQzIzLjMyNjM3MDgsMzUuNzA5NjgzNSAyMy42NzI5NDcxLDM1LjAxNzUzMTIgMjQuMDE5NTIzMywzNC4yMDE3ODAzIEMyMy4yNTIxMDQ1LDM0LjI3NTkzOTUgMjIuNTA5NDQxMSwzNC4zNTAwOTg2IDIxLjgxNjI4ODYsMzQuMzUwMDk4NiBDMTQuNTEzNDMxOSwzNC4zNTAwOTg2IDEwLjM3OTI3MjMsMjguOTExNzU5MyAxMC4zNzkyNzIzLDIzLjU0NzU3OTEgQzEwLjM3OTI3MjMsMjAuMzgzNDU0NCAxMS44Mzk4NDM3LDE2Ljg2ODMwOTYgMTQuNzg1NzQxOCwxNC4zMjQ2NSBDMTguNzIxODU3OCwxMS4wOTM3ODIgMjMuNDAwNjM3MiwxMC41NDI1MzIxIDI3LjExMzk1NDIsMTAuNTQyNTMyMSBMNDEuMjk4ODI1LDEwLjU0MjUzMjEgTDM2Ljg5MjM1NTUsMTMuMDE2OTc2NSBMMzIuNjM0NDE4NywxMy4wMTY5NzY1IEMzNC4yMTg3NjczLDE0LjMyNDY1IDM3LjUxMTI0MTcsMTcuMDc1OTU1MyAzNy41MTEyNDE3LDIyLjMxMTU5MjkgQzM3LjUxMTI0MTcsMjcuNDAzODU2MSAzNC42MTQ4NTQ0LDI5LjgwMTY2OTQgMzEuNzQzMjIyNiwzMi4wNzU4ODQgQzMwLjgyNzI3MTEsMzIuOTY1Nzk0MSAyOS44MTIyOTc4LDMzLjkyOTg2MzMgMjkuODEyMjk3OCwzNS40Mzc3NjY1IEMyOS44MTIyOTc4LDM2Ljk0NTY2OTcgMzAuODI3MjcxMSwzNy43ODYxNDAzIDMxLjU5NDY5LDM4LjQwNDEzMzQgTDM0LjA3MDIzNDYsNDAuMzMyMjcxOSBDMzcuMTE1MTU0NSw0Mi44NTM2ODM4IDM5Ljg2MzAwOTEsNDUuMjAyMDU3NiAzOS44NjMwMDkxLDQ5Ljk0ODI0NDcgQzM5Ljg2MzAwOTEsNTMuMDc4MTc5MiAzOC40MDAyNTI5LDU2LjIxOTY2MDMgMzUuNTUwMTgxMSw1OC42MzA1MzAyIEMzNC4wMTY3MDEyLDU4Ljg4MDE3NzUgMzIuNDQzNTc1Myw1OS4wMTE5NjcxIDMwLjg0MDQzMjQsNTkuMDE2MjgzOSBDMzMuNzM0NDYwMyw1Ny43NDg2MzExIDM1LjIzMzc0MDYsNTUuNDI5MjU1NiAzNS4yMzM3NDA2LDUyLjY0MjY5NDYgQzM1LjIzMzc0MDYsNDkuMTMyNDkzOCAzMi45ODA5OTUsNDcuMjc4NTE0NSAyNy43MzI4NDAzLDQzLjU0NTgzNjEgQzI3LjE4ODIyMDUsNDMuNDk2Mzk2NiAyNi44NDE2NDQyLDQzLjQ5NjM5NjYgMjYuMTQ4NDkxNyw0My40OTYzOTY2IEMyNS41Mjk2MDU2LDQzLjQ5NjM5NjYgMjEuODE2Mjg4Niw0My42MTk5OTUzIDE4LjkxOTkwMTQsNDQuNTg0MDY0NSBDMTcuNDA5ODE5MSw0NS4xMjc4OTg0IDEzLjAwMzM0OTcsNDYuNzg0MTIgMTMuMDAzMzQ5Nyw1MS42Nzg2MjU0IEMxMy4wMDMzNDk3LDUyLjIxMDUzODQgMTMuMDYwMDU2Myw1Mi43MjYyMzA4IDEzLjE3MDY5NTEsNTMuMjIyOTAwMSBDNS45MTIzMTMsNDcuODQ2Mjg5OCA5LjA1NjYzMjU5LDQ4LjYwNTA4MjQgOC4yMzAzMzg4Myw0OC42MDUwODExIFogTTMxLjQ0NjE1NzMsMjUuNDc1NzE3NiBDMzEuNDQ2MTU3MywyMC41MDcwNTMgMjguNTAwMjU5MiwxMi44MTE4MDI4IDIyLjc4MTc1MSwxMi44MTE4MDI4IEMyMC45OTkzNTg5LDEyLjgxMTgwMjggMTkuMDY4NDM0LDEzLjcwNjY1NjggMTcuOTU0NDM5LDE1LjA4MzU0NTUgQzE2Ljc5MDkzMywxNi41MjcxNzc0IDE2LjQ0NDM1NjcsMTguMzgxMTU2NyAxNi40NDQzNTY3LDIwLjE2MDk3NjkgQzE2LjQ0NDM1NjcsMjQuNzgzNTY1MyAxOS4xMTc5NDQ5LDMyLjQyMTk2MDEgMjUuMDU5MjUyMSwzMi40MjE5NjAxIEMyNi43NjczNzc5LDMyLjQyMTk2MDEgMjguNjI0MDM2NCwzMS41ODE0ODk1IDI5LjczODAzMTUsMzAuNDkzODIxNiBDMzEuMzIyMzgwMSwyOC45MTE3NTkzIDMxLjQ0NjE1NzMsMjYuNzExNzAzOCAzMS40NDYxNTczLDI1LjQ3NTcxNzYgWiBNMzEuNDQ2MTU3MywyNS40NzU3MTc2IiBpZD0iUGF0aCIgZmlsbD0iI0ZGRkZGRiIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTU5LjI3OTM3MzcsMjkuNjg1ODI1MiBDNTkuMjc5MzczNyw0NS45ODI3NTMxIDQ2LjA0OTAxMzQsNTkuMTk0MDIxOSAyOS43Mjg1MzUxLDU5LjE5NDAyMTkgQzIzLjY3NTY1NjMsNTkuMTk0MDIxOSAxOC4wNDc4MjA4LDU3LjM3NjgyMiAxMy4zNjI0NDAyLDU0LjI1OTA0NjkgTDQ3LjIyMjY2MTUsNS45MDE2MzkzNCBDNTQuNTM0NTU5NSwxMS4yNzMzNTAxIDU5LjI3OTM3MzcsMTkuOTI2MjgxNiA1OS4yNzkzNzM3LDI5LjY4NTgyNTIgWiBNNTkuMjc5MzczNywyOS42ODU4MjUyIiBpZD0icmVmbGVjIiBmaWxsLW9wYWNpdHk9IjAuMDgiIGZpbGw9IiMwMDAwMDAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+); } + +} diff --git a/_sass/_variables.scss b/_sass/_variables.scss new file mode 100644 index 0000000..e56c1c5 --- /dev/null +++ b/_sass/_variables.scss @@ -0,0 +1,27 @@ + +// +// VARIABLES +// + +// Colors +$blue: #4183C4; + +// Grays +$black: #000; +$darkerGray: #222; +$darkGray: #333; +$gray: #666; +$lightGray: #eee; +$white: #fff; + +// Font stacks +$helvetica: Helvetica, Arial, sans-serif; +$helveticaNeue: "Helvetica Neue", Helvetica, Arial, sans-serif; +$georgia: Georgia, serif; + +// Mobile breakpoints +@mixin mobile { + @media screen and (max-width: 640px) { + @content; + } +} \ No newline at end of file diff --git a/about.md b/about.md new file mode 100644 index 0000000..f6cf9b2 --- /dev/null +++ b/about.md @@ -0,0 +1,15 @@ +--- +layout: page +title: About +permalink: /about/ +--- + +Christian Wilhelmsen - super awesome great dude + +### More Information + +I like cake, and people. I don't eat people, just cake. + +### Contact me + +[my@email.com](mailto:please@dont.com) diff --git a/images/404.jpg b/images/404.jpg new file mode 100644 index 0000000..166a17e Binary files /dev/null and b/images/404.jpg differ diff --git a/images/config.png b/images/config.png new file mode 100644 index 0000000..bdaa9c2 Binary files /dev/null and b/images/config.png differ diff --git a/images/first-post.png b/images/first-post.png new file mode 100644 index 0000000..e6edcc1 Binary files /dev/null and b/images/first-post.png differ diff --git a/images/jekyll-logo.png b/images/jekyll-logo.png new file mode 100644 index 0000000..66c09a6 Binary files /dev/null and b/images/jekyll-logo.png differ diff --git a/images/jekyll-now-theme-screenshot.jpg b/images/jekyll-now-theme-screenshot.jpg new file mode 100644 index 0000000..fa73e71 Binary files /dev/null and b/images/jekyll-now-theme-screenshot.jpg differ diff --git a/images/step1.gif b/images/step1.gif new file mode 100644 index 0000000..cac6988 Binary files /dev/null and b/images/step1.gif differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..5e0cb3e --- /dev/null +++ b/index.html @@ -0,0 +1,18 @@ +--- +layout: default +--- + +
+ {% for post in site.posts %} + + {% endfor %} +
\ No newline at end of file diff --git a/style.scss b/style.scss new file mode 100644 index 0000000..3915a90 --- /dev/null +++ b/style.scss @@ -0,0 +1,289 @@ +--- +--- + +// +// IMPORTS +// + +@import "reset"; +@import "variables"; +// Syntax highlighting @import is at the bottom of this file + +/**************/ +/* BASE RULES */ +/**************/ + +html { + font-size: 100%; +} + +body { + background: $white; + font: 18px/1.4 $helvetica; + color: $darkGray; +} + +.container { + margin: 0 auto; + max-width: 740px; + padding: 0 10px; + width: 100%; +} + +h1, h2, h3, h4, h5, h6 { + font-family: $helveticaNeue; + color: $darkerGray; + font-weight: bold; + + line-height: 1.7; + margin: 1em 0 15px; + padding: 0; + + @include mobile { + line-height: 1.4; + } +} + +h1 { + font-size: 30px; + a { + color: inherit; + } +} + +h2 { + font-size: 24px; +} + +h3 { + font-size: 20px; +} + +h4 { + font-size: 18px; + color: $gray; +} + +p { + margin: 15px 0; +} + +a { + color: $blue; + text-decoration: none; + cursor: pointer; + &:hover, &:active { + color: $blue; + } +} + +ul, ol { + margin: 15px 0; + padding-left: 30px; +} + +ul { + list-style-type: disc; +} + +ol { + list-style-type: decimal; +} + +ol ul, ul ol, ul ul, ol ol { + margin: 0; +} + +ul ul, ol ul { + list-style-type: circle; +} + +em, i { + font-style: italic; +} + +strong, b { + font-weight: bold; +} + +img { + max-width: 100%; +} + +// Fixes images in popup boxes from Google Translate +.gmnoprint img { + max-width: none; +} + +.date { + font-style: italic; + color: $gray; +} + +// Specify the color of the selection +::-moz-selection { + color: $black; + background: $lightGray; +} +::selection { + color: $black; + background: $lightGray; +} + +// Nicolas Gallagher's micro clearfix hack +// http://nicolasgallagher.com/micro-clearfix-hack/ +.clearfix:before, +.clearfix:after { + content: " "; + display: table; +} + +.clearfix:after { + clear: both; +} + +/*********************/ +/* LAYOUT / SECTIONS */ +/*********************/ + +// +// .masthead +// + +.wrapper-masthead { + margin-bottom: 50px; +} + +.masthead { + padding: 20px 0; + border-bottom: 1px solid $lightGray; + + @include mobile { + text-align: center; + } +} + +.site-avatar { + float: left; + width: 70px; + height: 70px; + margin-right: 15px; + + @include mobile { + float: none; + display: block; + margin: 0 auto; + } + + img { + border-radius: 5px; + } +} + +.site-info { + float: left; + + @include mobile { + float: none; + display: block; + margin: 0 auto; + } +} + +.site-name { + margin: 0; + color: $darkGray; + cursor: pointer; + font-family: $helveticaNeue; + font-weight: 300; + font-size: 28px; + letter-spacing: 1px; +} + +.site-description { + margin: -5px 0 0 0; + color: $gray; + font-size: 16px; + + @include mobile { + margin: 3px 0; + } +} + +nav { + float: right; + margin-top: 23px; // @TODO: Vertically middle align + font-family: $helveticaNeue; + font-size: 18px; + + @include mobile { + float: none; + margin-top: 9px; + display: block; + font-size: 16px; + } + + a { + margin-left: 20px; + color: $darkGray; + text-align: right; + font-weight: 300; + letter-spacing: 1px; + + @include mobile { + margin: 0 10px; + color: $blue; + } + } +} + +// +// .main +// + +.posts > .post { + padding-bottom: 2em; + border-bottom: 1px solid $lightGray; +} + +.posts > .post:last-child { + padding-bottom: 1em; + border-bottom: none; +} + +.post { + blockquote { + margin: 1.8em .8em; + border-left: 2px solid $gray; + padding: 0.1em 1em; + color: $gray; + font-size: 22px; + font-style: italic; + } + + .comments { + margin-top: 10px; + } + + .read-more { + text-transform: uppercase; + font-size: 15px; + } +} + +.wrapper-footer { + margin-top: 50px; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + background-color: $lightGray; +} + +footer { + padding: 20px 0; + text-align: center; +} + +// Settled on moving the import of syntax highlighting to the bottom of the CSS +// ... Otherwise it really bloats up the top of the CSS file and makes it difficult to find the start +@import "highlights"; +@import "svg-icons"; diff --git a/tdk/README.md b/tdk/README.md new file mode 100644 index 0000000..6a24298 --- /dev/null +++ b/tdk/README.md @@ -0,0 +1,6 @@ +### TDK Simulator Results + +Trying to create a nice way to parse [FPV Event result list](http://dronesimulation.co.uk/events/evlbs.pl) for TDK members. If you are registered +with a [TDK] tag, you will automatically be listed here. + +To see the list in action, visit https://chriswils.github.io/tdk_board.html diff --git a/tdk/images/TDK-LEADERBOARD-LOGO.jpg b/tdk/images/TDK-LEADERBOARD-LOGO.jpg new file mode 100644 index 0000000..90a68cc Binary files /dev/null and b/tdk/images/TDK-LEADERBOARD-LOGO.jpg differ diff --git a/tdk/tdk_board.html b/tdk/tdk_board.html new file mode 100644 index 0000000..d85019a --- /dev/null +++ b/tdk/tdk_board.html @@ -0,0 +1,284 @@ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ Finding all tracks, please wait. +
+
+ + + +
+ + + +
+ + + +
+ + + + + diff --git a/tdk_board.html b/tdk_board.html deleted file mode 100644 index 92b3df6..0000000 --- a/tdk_board.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - -

TDK Leaderboard

-
- Loading data, please wait... -
- - diff --git a/weather_station/custom.css b/weather_station/custom.css deleted file mode 100644 index 746a770..0000000 --- a/weather_station/custom.css +++ /dev/null @@ -1,121 +0,0 @@ -.gi-2x{font-size: 2em;} -.gi-3x{font-size: 3em;} -.gi-4x{font-size: 4em;} -.gi-5x{font-size: 5em;} - -.text-1-25x{font-size: 1.25em;} -.text-2x{font-size: 2em;} -.text-3x{font-size: 3em;} -.text-4x{font-size: 4em;} -.text-5x{font-size: 5em;} - -body{ - background-color: #eee; -} - -.page-header { - padding-top: 0px; -} - -.panel-default>.panel-heading { - color: #0080b7; - background-color: #fff; - border-color: #eee; - padding: 40px 15px 20px 15px; -} - -.panel-default>.panel-heading-small { - color: #0080b7; - background-color: #fff; - border-color: #eee; - padding: 20px 15px 20px 15px; -} - - -.panel-body { - color: #0080b7; - background-color: #fff; - border-color: #0080b7; -} - -.panel-body-small { - color: #0080b7; - background-color: #fff; - border-color: #0080b7; -} - -.panel-footer { - background-color: #fff; - border-color: #eee; -} - -.panel-footer-small { - background-color: #fff; - border-color: #eee; - color: #fff; - height: 40px; -} - -.navbar { - border-radius: 0px; */ -} - -.navbar-default { - background-color: #fff; - border-color: #e7e7e7; -} - -.btn-panel-nordic { - color: #fff; - background-color: #6dcff6; - border-color: #eee; -} - -.panel-icon-color { - color: #6dcff6; -} - -.btn { - border-radius: 0px; -} - -.align { - display: inline-block; -} - -.whole-width { - width: 100%; - text-align: center; -} - -.black { - color: #000; -} - -.grey { - color: #888; -} - -.primary-blue { - color: #009cde; -} - -.secondary-orange { - color: #f26721; -} - -.secondary-light-blue { - color: #6dcff6; -} - -.secondary-dark-blue { - color: #0080b7; -} - -.input-group { - position: relative; - display: table; - border-collapse: separate; - margin-bottom: 10px; -} - diff --git a/weather_station/environment.html b/weather_station/environment.html deleted file mode 100644 index 0af83d7..0000000 --- a/weather_station/environment.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - Environment - - - - - - - - - - - - - - - - -
- -
-
-
-
- -

eCO2

-
-
-
- 0 -
-
- ppm -
-
- -
-
-
-
-
- -

TVOC

-
-
-
- 0 -
-
- ppb -
-
- -
-
-
-
-
- -

Color

-
-
- RGB -
- -
-
-
-
- - -
-

-    
- - - - - - -
-
-

Nordic Semiconductor © 2016

-
-
- - diff --git a/weather_station/ie-row-fix.js b/weather_station/ie-row-fix.js deleted file mode 100644 index 141ba4f..0000000 --- a/weather_station/ie-row-fix.js +++ /dev/null @@ -1,41 +0,0 @@ -/* fix so that rows that have a ton of columns clear the first item in each row. */ -jQuery(document).ready(function($) { - var resizeTimer = null, $doc = $(document); - function rowPolyfill() { - var w = $doc.width(); - jQuery('.multi-columns-row > [class^="col-"]').removeClass('first-in-row'); - if (w > 1200) { - jQuery('.multi-columns-row > .col-lg-6:nth-child(2n + 3)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-lg-4:nth-child(3n + 4)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-lg-3:nth-child(4n + 5)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-lg-2:nth-child(6n + 7)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-lg-1:nth-child(12n + 13)').addClass('first-in-row'); - } else if (w >= 992) { - jQuery('.multi-columns-row > .col-md-6:nth-child(2n + 3)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-md-4:nth-child(3n + 4)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-md-3:nth-child(4n + 5)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-md-2:nth-child(6n + 7)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-md-1:nth-child(12n + 13)').addClass('first-in-row'); - } else if (w >= 768) { - jQuery('.multi-columns-row > .col-sm-6:nth-child(2n + 3)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-sm-4:nth-child(3n + 4)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-sm-3:nth-child(4n + 5)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-sm-2:nth-child(6n + 7)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-sm-1:nth-child(12n + 13)').addClass('first-in-row'); - } else { - jQuery('.multi-columns-row > .col-xs-6:nth-child(2n + 3)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-xs-4:nth-child(3n + 4)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-xs-3:nth-child(4n + 5)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-xs-2:nth-child(6n + 7)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-xs-1:nth-child(12n + 13)').addClass('first-in-row'); - } - } - rowPolyfill(); - - $(window).on('resize', function() { - if (resizeTimer !== null) { - clearTimeout(resizeTimer); - } - resizeTimer = setTimeout(rowPolyfill, 400); - }); -}); \ No newline at end of file diff --git a/weather_station/images/nordic_icon_144.png b/weather_station/images/nordic_icon_144.png deleted file mode 100644 index 5064943..0000000 --- a/weather_station/images/nordic_icon_144.png +++ /dev/null @@ -1,666 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - ketile.github.io/nordic_icon_144.png at master · ketile/ketile.github.io - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Skip to content - - - - - - - - - - - - - - -
- -
-
- - -
-
-
- -
-
- - - -
    - -
  • -
    - -
    - - - - Watch - - - - -
    - -
    -
    -
    -
  • - -
  • - -
    - -
    - - -
    -
    - - -
    - -
  • - -
  • -
    - -
    - -
  • -
- -

- - /ketile.github.io - - - - - -

- -
- -
- -
-
- - - - - - - -
- -
- - - -
- -
- - Find file - - -
- -
- - -
- Fetching contributors… -
- -
- - Cannot retrieve contributors at this time -
-
-
-
-
- -
- Raw - History -
- - - - - -
- -
- -
- 11.8 KB -
-
- - - -
-
- nordic_icon_144.png -
-
- -
- - - - -
- -
- - -
-
- -
- - - - - - - - - -
- - - Something went wrong with that request. Please try again. -
- - - - - - - - - - - - - - - diff --git a/weather_station/images/nordic_icon_40h.png b/weather_station/images/nordic_icon_40h.png deleted file mode 100644 index 9af97d8..0000000 Binary files a/weather_station/images/nordic_icon_40h.png and /dev/null differ diff --git a/weather_station/images/nordic_icon_50h.png b/weather_station/images/nordic_icon_50h.png deleted file mode 100644 index 28de1e4..0000000 Binary files a/weather_station/images/nordic_icon_50h.png and /dev/null differ diff --git a/weather_station/index.html b/weather_station/index.html deleted file mode 100644 index ddf9f6d..0000000 --- a/weather_station/index.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - Responsive UI - - - - - - - - - - - - - -
- -
-
-
-
- -

Thermometer

-
-
- Measure temperature with this nift little piece of technolology. Here is some more text to increase the height of the column. -
- -
-
-
-
-
- -

Barometer

-
-
- Measure height above sea level. -
- -
-
-
-
-
- -

Accelerometer

-
-
- Measure linear accelerations. -
- -
-
-
-
-
- -

Gyroscope

-
-
- Measure 3D orientation. -
- -
-
-
-
-
- -

Hygrometer

-
-
- Measure humidity. -
- -
-
-
-
-
- -

Compass

-
-
- Measure magnetic north. -
- -
-
-
-
-
-
-

Nordic Semiconductor © 2016

-
-
- - \ No newline at end of file diff --git a/weather_station/javascript/cloud.js b/weather_station/javascript/cloud.js deleted file mode 100644 index f9ad2cd..0000000 --- a/weather_station/javascript/cloud.js +++ /dev/null @@ -1,54 +0,0 @@ -'use strict' - -var publicKey = "ZGRzj8o0nxHwLLdxXrZR"; -var privateKey = "2mNWaXMJ75hMAA1VxRje"; -var interval; - -function sendCloudData() { - log('> sendCloudData()') - // create object - var xhttp = new XMLHttpRequest(); - - // callback will only fire if message was received successfully - xhttp.onreadystatechange = function() { - if (xhttp.readyState == 4 && xhttp.status == 200) { - log('XHTTP response: ' + xhttp.responseText); - - // Parse JSON reponse - var response = JSON.parse(xhttp.responseText); - log('JSON response: ' + response.message); - } - }; - - // populate the data for the request. the ".json" part specifies that we want the response as json. - var message = "https://data.sparkfun.com/input/" - + publicKey - + ".json" - + "?private_key=" - + privateKey - + "&temperature=" - + temperatureString - + "&humidity=" - + humidityString - + "&pressure=" - + pressureString - + "&latitude=" - + latitudeString - + "&longitude=" - + longitudeString; - - xhttp.open("GET", message, true); - - // send the request - xhttp.send(); -} - -function startCloudLogging(){ - interval = setInterval(sendCloudData, 10000); - log("> startCloudLogging()"); -} - -function stopCloudLogging(){ - clearInterval(interval) - log("> stopCloudLogging()"); -} \ No newline at end of file diff --git a/weather_station/javascript/environment.js b/weather_station/javascript/environment.js deleted file mode 100644 index 7e5fc8c..0000000 --- a/weather_station/javascript/environment.js +++ /dev/null @@ -1,241 +0,0 @@ -'use strict' - -/* BLE Configuration Service - deviceNameCharacteristicUUID - write/write without response - max 10 byte - ascii string - advertisingParamCharacteristicUUID - write/write without response - 3 bytes - uint16_t adv interval in ms - uint8_t adv timeout in s - appearanceCharacteristicUUID - write/write without response - 2 bytes - uint16_t appearance - connectionParamCharacteristicUUID - write/write without response - 8 bytes - uint16_t min conn interval - uint16_t max conn interval - uint16_t slave latency - uint16_t supervision timeout -*/ -var configurationServiceUUID = 'ef680001-9b35-4933-9b10-52ffa9740042'; -var deviceNameCharacteristicUUID = 'ef680002-9b35-4933-9b10-52ffa9740042'; -var advertisingParamCharacteristicUUID = 'ef680003-9b35-4933-9b10-52ffa9740042'; -var appearanceCharacteristicUUID = 'ef680004-9b35-4933-9b10-52ffa9740042'; -var connectionParamCharacteristicUUID = 'ef680005-9b35-4933-9b10-52ffa9740042'; - -/* Weather Station Service - temperatureCharacteristicUUID - notify/read - 2 bytes - uint8_t integer - uint8_t decimal - pressureCharacteristicUUID - notify/read - 5 bytes - int32_t integer - uint8_t decimal - humidityCharacteristicUUID - notify/read - 1 byte - uint8_t - configurationCharacteristicUUID - write/write without response - 7 bytes - uint16_t temp interval in ms - uint16_t pressure interval in ms - uint16_t humidity interval in ms - uint8_t pressure mode (0=barometer, 1=altimeter) -*/ -var weatherStationServiceUUID = '20080001-e36f-4648-91c6-9e86ead38764'; -var temperatureCharacteristicUUID = '20080002-e36f-4648-91c6-9e86ead38764'; -var pressureCharacteristicUUID = '20080003-e36f-4648-91c6-9e86ead38764'; -var humidityCharacteristicUUID = '20080004-e36f-4648-91c6-9e86ead38764'; -var gasCharacteristicUUID = '20080005-e36f-4648-91c6-9e86ead38764'; -var colorCharacteristicUUID = '20080006-e36f-4648-91c6-9e86ead38764'; -var configurationCharacteristicUUID = '20080007-e36f-4648-91c6-9e86ead38764'; - -/* User Interface Service - ledCharacteristicUUID - write/read - 4 bytes - uint32_t - LED ID - Red - Green - Blue (LSB) - buttonCharacteristicUUID - write/read - 2 bytes - uint16_t - Button 2 state - Button 1 state (LSB) -*/ -var userInterfaceServiceUUID = 'C7AE0001-3266-4A5C-859F-0F4799146BB5'; -var ledCharacteristicUUID = 'C7AE0002-3266-4A5C-859F-0F4799146BB5'; -var buttonCharacteristicUUID = 'C7AE0003-3266-4A5C-859F-0F4799146BB5'; - -var bleDevice; -var bleServer; -var bleService; -var tempBleService; -var gasChar; -var temperatureChar; -var pressureChar; -var humidityChar; -var colorChar; - -window.onload = function(){ - document.querySelector('#connect').addEventListener('click', getAll); - document.querySelector('#disconnect').addEventListener('click', stopAll); -}; - -function log(text) { - document.querySelector('#log').textContent += text + '\n'; - console.log(text); -} - -function getAll() { - if (!navigator.bluetooth) { - log('Web Bluetooth API is not available.\n' + - 'Please make sure the Web Bluetooth flag is enabled.'); - return; - } - log('Requesting Bluetooth Device...'); - navigator.bluetooth.requestDevice({filters: [ - {services: [configurationServiceUUID]}, - {services: [weatherStationServiceUUID]} - ] - }) - //.then(device => device.connectGATT()) - .then(device => device.gatt.connect()) - .then(server => { - bleServer = server; - log('Got bleServer'); - return server.getPrimaryService(weatherStationServiceUUID); - }) - .then(service => { - log('Got bleService'); - bleService = service; - return Promise.all([ - service.getCharacteristic(temperatureCharacteristicUUID) - .then(handleTemperature), - service.getCharacteristic(humidityCharacteristicUUID) - .then(handleHumidity), - service.getCharacteristic(pressureCharacteristicUUID) - .then(handlePressure), - service.getCharacteristic(gasCharacteristicUUID) - .then(handleGas), - service.getCharacteristic(colorCharacteristicUUID) - .then(handleColor) - ]) - }) - .catch(error => { - log('> getAll() ' + error); - }); -} - -function handlePressure(characteristic){ - log('> handlePressure()'); - pressureChar = characteristic; - //characteristic.addEventListener('characteristicvaluechanged',handleNotifyPressure); - //return characteristic.startNotifications(); -} - -function handleTemperature(characteristic){ - log('> handleTemperature()'); - temperatureChar = characteristic; - //temperatureChar.addEventListener('characteristicvaluechanged',handleNotifyTemperature); - //return temperatureChar.startNotifications(); -} - -function handleHumidity(characteristic){ - log('> handleHumidity()'); - humidityChar = characteristic; - //characteristic.addEventListener('characteristicvaluechanged',handleNotifyHumidity); - //return characteristic.startNotifications(); -} - -function handleGas(characteristic){ - log('> handleGas()'); - gasChar = characteristic; - gasChar.addEventListener('characteristicvaluechanged',handleNotifyGas); - return gasChar.startNotifications(); -} - -function handleColor(characteristic){ - log('> handleColor()'); - colorChar = characteristic; - colorChar.addEventListener('characteristicvaluechanged',handleNotifyColor); - return colorChar.startNotifications(); -} - -function stopAll() { - log('> stopAll()') - gasChar.stopNotifications().then(() => { - log('> Gas notification stopped'); - gasChar.removeEventListener('characteristicvaluechanged',handleNotifyGas) - log('> Gas notification handler removed'); - }); - colorChar.stopNotifications().then(() => { - log('> Gas notification stopped'); - colorChar.removeEventListener('characteristicvaluechanged',handleNotifyColor) - log('> Gas notification handler removed'); - }) - .then(disconnect) - .catch(error => { - log('> stopAll() ' + error); - }); - disconnect(); -} - -function disconnect() { - log('Disconnecting from Bluetooth Device...'); - if (bleServer.connected) - { - bleServer.disconnect(); - log('Bluetooth Device connected: ' + bleServer.connected); - } - else - { - log('Bluetooth Device is already disconnected'); - } -} - -function handleNotifyColor(event) { - let value = event.target.value; - value = value.buffer ? value : new DataView(value); - - let r = (value.getUint8(1) << 8) + value.getUint8(0) ; - //log('red: ' + red); - let g = (value.getUint8(3) << 8) + value.getUint8(2) ; - //log('green: ' + green); - let b = (value.getUint8(5) << 8) + value.getUint8(4) ; - //log('blue: ' + blue); - let c = (value.getUint8(7) << 8) + value.getUint8(6) ; - //log('clear: ' + clear); - - let r_ratio = r / (r+g+b) - let g_ratio = g / (r+g+b) - let b_ratio = b / (r+g+b) - - let r_8 = r_ratio * 255.0 * 3 * (c / 400) - if (r_8 > 255) - { - r_8 = 255 - } - let g_8 = g_ratio * 255.0 * 3 * (c / 400) - if (g_8 > 255) - { - g_8 = 255l - } - let b_8 = b_ratio * 255.0 * 3 * (c / 400) - if (b_8 > 255) - { - b_8 = 255 - } - let rgb_str = "rgb("+r_8.toFixed(0)+","+g_8.toFixed(0)+","+b_8.toFixed(0)+")"; - log('r ' + r_8 + ' - g ' + g_8 + ' - b ' + b_8 + ' - ' + rgb_str); - - document.getElementById("rgbc_reading").style.color = rgb_str; - document.getElementById("rgbc_reading").innerHTML = 'RGB'; -} - -function handleNotifyGas(event) { - let value = event.target.value; - value = value.buffer ? value : new DataView(value); - let eco2_ppm = (value.getUint8(1) << 8) + value.getUint8(0) ; - log('eCO2 is ' + eco2_ppm + 'ppm'); - document.getElementById("eco2_reading").innerHTML = eco2_ppm + ' '; - - let tvoc_ppb = (value.getUint8(3) << 8) + value.getUint8(2); - log('TVOC is ' + tvoc_ppb + 'ppb'); - document.getElementById("tvoc_reading").innerHTML = tvoc_ppb + ' '; -} - -function handleNotifyTemperature(event) { - let value = event.target.value; - value = value.buffer ? value : new DataView(value); - let temperature_int = value.getUint8(0); - let temperature_dec = value.getUint8(1); - log('Temperature is ' + temperature_int + '.' + temperature_dec + 'C'); - //document.getElementById("temperature_reading").innerHTML = temperature_int + '.' + temperature_dec + '°C'; -} - -function handleNotifyHumidity(event) { - let value = event.target.value; - value = value.buffer ? value : new DataView(value); - let humidity_int = value.getUint8(0); - log('Humidity is ' + humidity_int + '%'); - //document.getElementById("humidity_reading").innerHTML = humidity_int +"%"; -} - -function handleNotifyPressure(event) { - let value = event.target.value; - value = value.buffer ? value : new DataView(value); - let pressure_integer = value.getInt32(0, true); - let pressure_decimal = value.getUint8(4); - let pressure_pascal = pressure_integer + pressure_decimal / 1000; - let pressure_hpascal = pressure_pascal / 100; - log('Pressure is ' + pressure_hpascal + 'hPa'); - //document.getElementById("pressure_reading").innerHTML = pressure_hpascal.toFixed(3) + 'hPa'; -} diff --git a/weather_station/javascript/geolocation.js b/weather_station/javascript/geolocation.js deleted file mode 100644 index 54a4dab..0000000 --- a/weather_station/javascript/geolocation.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict' - -var latitudeString = 0; -var longitudeString = 0; - -//window.onload = getGeolocation(); -window.addEventListener("load", getGeolocation); - -function getGeolocation(){ - if (navigator.geolocation) { - navigator.geolocation.getCurrentPosition(showPosition, showError); - log('Geolocation supported!'); - } else { - log('Geolocation is not supported by this browser!'); - } -} - -function showPosition(position) { - log('Latitude: ' + position.coords.latitude + - ' Longitude: ' + position.coords.longitude); - latitudeString = position.coords.latitude; - longitudeString = position.coords.longitude; -} - -function showError(error) { - switch(error.code) { - case error.PERMISSION_DENIED: - log("User denied the request for Geolocation."); - break; - case error.POSITION_UNAVAILABLE: - log("Location information is unavailable."); - break; - case error.TIMEOUT: - log("The request to get user location timed out."); - break; - case error.UNKNOWN_ERROR: - log("An unknown error occurred."); - break; - } -} \ No newline at end of file diff --git a/weather_station/javascript/sensors.js b/weather_station/javascript/sensors.js deleted file mode 100644 index 5379e17..0000000 --- a/weather_station/javascript/sensors.js +++ /dev/null @@ -1,261 +0,0 @@ -'use strict' - -/* BLE Configuration Service - deviceNameCharacteristicUUID - write/write without response - max 10 byte - ascii string - advertisingParamCharacteristicUUID - write/write without response - 3 bytes - uint16_t adv interval in ms - uint8_t adv timeout in s - appearanceCharacteristicUUID - write/write without response - 2 bytes - uint16_t appearance - connectionParamCharacteristicUUID - write/write without response - 8 bytes - uint16_t min conn interval - uint16_t max conn interval - uint16_t slave latency - uint16_t supervision timeout -*/ -var configurationServiceUUID = 'ef680001-9b35-4933-9b10-52ffa9740042'; -var deviceNameCharacteristicUUID = 'ef680002-9b35-4933-9b10-52ffa9740042'; -var advertisingParamCharacteristicUUID = 'ef680003-9b35-4933-9b10-52ffa9740042'; -var appearanceCharacteristicUUID = 'ef680004-9b35-4933-9b10-52ffa9740042'; -var connectionParamCharacteristicUUID = 'ef680005-9b35-4933-9b10-52ffa9740042'; - -/* Weather Station Service - temperatureCharacteristicUUID - notify/read - 2 bytes - uint8_t integer - uint8_t decimal - pressureCharacteristicUUID - notify/read - 5 bytes - int32_t integer - uint8_t decimal - humidityCharacteristicUUID - notify/read - 1 byte - uint8_t - configurationCharacteristicUUID - write/write without response - 7 bytes - uint16_t temp interval in ms - uint16_t pressure interval in ms - uint16_t humidity interval in ms - uint8_t pressure mode (0=barometer, 1=altimeter) -*/ -var weatherStationServiceUUID = '20080001-e36f-4648-91c6-9e86ead38764'; -var temperatureCharacteristicUUID = '20080002-e36f-4648-91c6-9e86ead38764'; -var pressureCharacteristicUUID = '20080003-e36f-4648-91c6-9e86ead38764'; -var humidityCharacteristicUUID = '20080004-e36f-4648-91c6-9e86ead38764'; -var gasCharacteristicUUID = '20080005-e36f-4648-91c6-9e86ead38764'; -var colorCharacteristicUUID = '20080006-e36f-4648-91c6-9e86ead38764'; -var configurationCharacteristicUUID = '20080007-e36f-4648-91c6-9e86ead38764'; - -/* User Interface Service - ledCharacteristicUUID - write/read - 4 bytes - uint32_t - LED ID - Red - Green - Blue (LSB) - buttonCharacteristicUUID - write/read - 2 bytes - uint16_t - Button 2 state - Button 1 state (LSB) -*/ -var userInterfaceServiceUUID = 'C7AE0001-3266-4A5C-859F-0F4799146BB5'; -var ledCharacteristicUUID = 'C7AE0002-3266-4A5C-859F-0F4799146BB5'; -var buttonCharacteristicUUID = 'C7AE0003-3266-4A5C-859F-0F4799146BB5'; - -var bleDevice; -var bleServer; -var bleService; -var gasChar; -var temperatureChar; -var pressureChar; -var humidityChar; -var colorChar; - -window.onload = function(){ - document.querySelector('#connect').addEventListener('click', getAll); - document.querySelector('#disconnect').addEventListener('click', stopAll); -}; - -function log(text) { - document.querySelector('#log').textContent += text + '\n'; - console.log(text); -} - -function getAll() { - if (!navigator.bluetooth) { - log('Web Bluetooth API is not available.\n' + - 'Please make sure the Web Bluetooth flag is enabled.'); - return; - } - log('Requesting Bluetooth Device...'); - navigator.bluetooth.requestDevice({filters: [ - {services: [configurationServiceUUID]}, - {services: [weatherStationServiceUUID]} - ] - }) - //.then(device => device.connectGATT()) - .then(device => device.gatt.connect()) - .then(server => { - bleServer = server; - log('Got bleServer'); - return server.getPrimaryService(weatherStationServiceUUID); - }) - .then(service => { - log('Got bleService'); - bleService = service; - return Promise.all([ - service.getCharacteristic(temperatureCharacteristicUUID) - .then(handleTemperature), - service.getCharacteristic(humidityCharacteristicUUID) - .then(handleHumidity), - service.getCharacteristic(pressureCharacteristicUUID) - .then(handlePressure), - service.getCharacteristic(gasCharacteristicUUID) - .then(handleGas), - service.getCharacteristic(colorCharacteristicUUID) - .then(handleColor) - ]); - }) - .catch(error => { - log('> getAll() ' + error); - }); -} - -function handlePressure(characteristic){ - log('> handlePressure() - addEventListener'); - pressureChar = characteristic; - pressureChar.addEventListener('characteristicvaluechanged',handleNotifyPressure); - log('> handlePressure() - startNotifications'); - return pressureChar.startNotifications(); -} - -function handleTemperature(characteristic){ - log('> handleTemperature() - addEventListener'); - temperatureChar = characteristic; - temperatureChar.addEventListener('characteristicvaluechanged',handleNotifyTemperature); - log('> handleTemperature() - startNotifications'); - return temperatureChar.startNotifications(); -} - -function handleHumidity(characteristic){ - log('> handleHumidity() - addEventListener'); - humidityChar = characteristic; - humidityChar.addEventListener('characteristicvaluechanged',handleNotifyHumidity); - log('> handleHumidity() - startNotifications'); - return humidityChar.startNotifications(); -} - -function handleGas(characteristic){ - log('> handleGas() - addEventListener'); - gasChar = characteristic; - gasChar.addEventListener('characteristicvaluechanged',handleNotifyGas); - log('> handleGas() - startNotifications'); - return gasChar.startNotifications(); -} - -function handleColor(characteristic){ - log('> handleColor() - addEventListener'); - colorChar = characteristic; - colorChar.addEventListener('characteristicvaluechanged',handleNotifyColor); - log('> handleColor() - startNotifications'); - return colorChar.startNotifications(); -} - -function stopAll() { - log('> stopAll()'); - - gasChar.stopNotifications().then(() => { - log('> Gas notification stopped'); - gasChar.removeEventListener('characteristicvaluechanged',handleNotifyGas); - log('> Gas notification handler removed'); - }); - colorChar.stopNotifications().then(() => { - log('> Color notification stopped'); - colorChar.removeEventListener('characteristicvaluechanged',handleNotifyColor); - log('> Color notification handler removed'); - }); - temperatureChar.stopNotifications().then(() => { - log('> Temp notification stopped'); - temperatureChar.removeEventListener('characteristicvaluechanged',handleNotifyTemperature); - log('> Temp notification handler removed'); - }); - humidityChar.stopNotifications().then(() => { - log('> Humid notification stopped'); - humidityChar.removeEventListener('characteristicvaluechanged',handleNotifyHumidity); - log('> Humid notification handler removed'); - }); - pressureChar.stopNotifications().then(() => { - log('> Pressure notification stopped'); - pressureChar.removeEventListener('characteristicvaluechanged',handleNotifyPressure); - log('> Pressure notification handler removed'); - }) - .then(disconnect) - .catch(error => { - log('> stopAll() ' + error); - }); - disconnect(); -} - -function disconnect() { - log('Disconnecting from Bluetooth Device...'); - if (bleServer.connected) - { - bleServer.disconnect(); - log('Bluetooth Device connected: ' + bleServer.connected); - } - else - { - log('Bluetooth Device is already disconnected'); - } -} - -function handleNotifyColor(event) { - let value = event.target.value; - value = value.buffer ? value : new DataView(value); - - let r = (value.getUint8(1) << 8) + value.getUint8(0) ; - //log('red: ' + red); - let g = (value.getUint8(3) << 8) + value.getUint8(2) ; - //log('green: ' + green); - let b = (value.getUint8(5) << 8) + value.getUint8(4) ; - //log('blue: ' + blue); - let c = (value.getUint8(7) << 8) + value.getUint8(6) ; - //log('clear: ' + clear); - - let r_ratio = r / (r+g+b); - let g_ratio = g / (r+g+b); - let b_ratio = b / (r+g+b); - - let r_8 = r_ratio * 255.0 * 3 * (c / 400); - if (r_8 > 255) - { - r_8 = 255; - } - let g_8 = g_ratio * 255.0 * 3 * (c / 400); - if (g_8 > 255) - { - g_8 = 255; - } - let b_8 = b_ratio * 255.0 * 3 * (c / 400); - if (b_8 > 255) - { - b_8 = 255; - } - let rgb_str = "rgb("+r_8.toFixed(0)+","+g_8.toFixed(0)+","+b_8.toFixed(0)+")"; - log('r ' + r_8 + ' - g ' + g_8 + ' - b ' + b_8 + ' - ' + rgb_str); - - document.getElementById("rgbc_reading").style.color = rgb_str; - document.getElementById("rgbc_reading").innerHTML = 'RGB'; -} - -function handleNotifyGas(event) { - let value = event.target.value; - value = value.buffer ? value : new DataView(value); - let eco2_ppm = (value.getUint8(1) << 8) + value.getUint8(0) ; - log('eCO2 is ' + eco2_ppm + 'ppm'); - document.getElementById("eco2_reading").innerHTML = eco2_ppm + ' '; - - let tvoc_ppb = (value.getUint8(3) << 8) + value.getUint8(2); - log('TVOC is ' + tvoc_ppb + 'ppb'); - document.getElementById("tvoc_reading").innerHTML = tvoc_ppb + ' '; -} - -function handleNotifyTemperature(event) { - let value = event.target.value; - value = value.buffer ? value : new DataView(value); - let temperature_int = value.getUint8(0); - let temperature_dec = value.getUint8(1); - log('Temperature is ' + temperature_int + '.' + temperature_dec + 'C'); - document.getElementById("temperature_reading").innerHTML = temperature_int + '.' + temperature_dec + ' '; -} - -function handleNotifyHumidity(event) { - let value = event.target.value; - value = value.buffer ? value : new DataView(value); - let humidity_int = value.getUint8(0); - log('Humidity is ' + humidity_int + '%'); - document.getElementById("humidity_reading").innerHTML = humidity_int +" "; -} - -function handleNotifyPressure(event) { - let value = event.target.value; - value = value.buffer ? value : new DataView(value); - let pressure_integer = value.getInt32(0, true); - let pressure_decimal = value.getUint8(4); - let pressure_pascal = pressure_integer + pressure_decimal / 1000; - let pressure_hpascal = pressure_pascal / 100; - log('Pressure is ' + pressure_hpascal + 'hPa'); - document.getElementById("pressure_reading").innerHTML = pressure_hpascal.toFixed(3) + ' '; -} diff --git a/weather_station/javascript/weather_station.js b/weather_station/javascript/weather_station.js deleted file mode 100644 index a85c469..0000000 --- a/weather_station/javascript/weather_station.js +++ /dev/null @@ -1,444 +0,0 @@ -'use strict' - -/* BLE Configuration Service - deviceNameCharacteristicUUID - write/write without response - max 10 byte - ascii string - advertisingParamCharacteristicUUID - write/write without response - 3 bytes - uint16_t adv interval in ms - uint8_t adv timeout in s - appearanceCharacteristicUUID - write/write without response - 2 bytes - uint16_t appearance - connectionParamCharacteristicUUID - write/write without response - 8 bytes - uint16_t min conn interval - uint16_t max conn interval - uint16_t slave latency - uint16_t supervision timeout -*/ -var configurationServiceUUID = 'ef680001-9b35-4933-9b10-52ffa9740042'; -var deviceNameCharacteristicUUID = 'ef680002-9b35-4933-9b10-52ffa9740042'; -var advertisingParamCharacteristicUUID = 'ef680003-9b35-4933-9b10-52ffa9740042'; -var appearanceCharacteristicUUID = 'ef680004-9b35-4933-9b10-52ffa9740042'; -var connectionParamCharacteristicUUID = 'ef680005-9b35-4933-9b10-52ffa9740042'; - -/* Weather Station Service - temperatureCharacteristicUUID - notify/read - 2 bytes - uint8_t integer - uint8_t decimal - pressureCharacteristicUUID - notify/read - 5 bytes - int32_t integer - uint8_t decimal - humidityCharacteristicUUID - notify/read - 1 byte - uint8_t - configurationCharacteristicUUID - write/write without response - 7 bytes - uint16_t temp interval in ms - uint16_t pressure interval in ms - uint16_t humidity interval in ms - uint8_t pressure mode (0=barometer, 1=altimeter) -*/ -var weatherStationServiceUUID = '20080001-e36f-4648-91c6-9e86ead38764'; -//var temperatureCharacteristicUUID = '20080002-e36f-4648-91c6-9e86ead38764'; -//var pressureCharacteristicUUID = '20080003-e36f-4648-91c6-9e86ead38764'; -//var humidityCharacteristicUUID = '20080004-e36f-4648-91c6-9e86ead38764'; -var configurationCharacteristicUUID = '20080005-e36f-4648-91c6-9e86ead38764'; -var demoCharacteristicUUID = '20080002-e36f-4648-91c6-9e86ead38764'; - -/* User Interface Service - ledCharacteristicUUID - write/read - 4 bytes - uint32_t - LED ID - Red - Green - Blue (LSB) - buttonCharacteristicUUID - write/read - 2 bytes - uint16_t - Button 2 state - Button 1 state (LSB) -*/ -var userInterfaceServiceUUID = 'C7AE0001-3266-4A5C-859F-0F4799146BB5'; -var ledCharacteristicUUID = 'C7AE0002-3266-4A5C-859F-0F4799146BB5'; -var buttonCharacteristicUUID = 'C7AE0003-3266-4A5C-859F-0F4799146BB5'; - -/* Default values for weather station configuration*/ -var weatherStationConfig = { - pressureInterval:1000, - temperatureInterval:1000, - humidityInterval:1000, - pressureMode:0 -}; - -var isConnecting = false; -var isConnected = false; -var sInterval; -var sTimeout; -var humidity; -var temperature; -var pressure; -var bleDevice; -var bleServer; -var bleService; -var pressureChar; -var humidityChar; -var temperatureChar; -var pressureString; -var humidityString; -var temperatureString; -//var myCharacteristic; - -window.onload = function(){ - document.querySelector('#connect').addEventListener('click', getAll); - document.querySelector('#disconnect').addEventListener('click', stopAll); - document.querySelector('#load-configuration').addEventListener('click', loadConfiguration); - document.querySelector('#apply-configuration').addEventListener('click', applyConfiguration); -}; - -function applyConfiguration(){ - log('> applyConfiguration()'); - log(weatherStationConfig); - - let pInterval = parseFloat(document.getElementById("pressure-interval").value); - log(pInterval); - let tInterval = document.getElementById("temperature-interval").value; - log(tInterval); - let hInterval = document.getElementById("humidity-interval").value; - log(hInterval); - let pMode; - - // get the checked button toggle - let temp = $("input[name='options']:checked").val(); - if(temp == 'barometer'){ - pMode = 0; - } - else{ - pMode = 1; - } - - if (!navigator.bluetooth) { - log('Web Bluetooth API is not available.\n' + - 'Please make sure the Web Bluetooth flag is enabled.'); - return; - } - log('Requesting Bluetooth Device...'); - navigator.bluetooth.requestDevice({filters: [ - {services: [configurationServiceUUID]}, - {services: [weatherStationServiceUUID]} - ] - }) - .then(device => { - log(device); - return device.connectGATT(); - }) - .then(server => { - log(server); - return server.getPrimaryService(weatherStationServiceUUID); - }) - .then(service => { - log(service); - return service.getCharacteristic(configurationCharacteristicUUID); - }) - .then(characteristic => { - log(characteristic); - let data2 = new Uint8Array([0,1,0,1,0,1,1]); - log(data2); - for(let i = 0; i<7; i++){ - log(data2[i]); - } - let data = new Uint8Array(7); - data[0] = tInterval & 0xff; - data[1] = (tInterval >> 8) & 0xff; - data[2] = pInterval & 0xff; - data[3] = (pInterval >> 8) & 0xff; - data[4] = hInterval & 0xff; - data[5] = (hInterval >> 8) & 0xff; - data[6] = pMode; - - log('data: ' + data); - for(let i = 0; i<7; i++){ - log(i + ': ' + data[i]); - } - return characteristic.writeValue(data); - }) - .then(value => { - log('This data was sent: ' + value); - return value; - }) - .catch(error => { - log('> applyConfiguration() ' + error); - }); -} - - -function loadConfiguration(){ - log('> loadConfiguration()'); - log(weatherStationConfig); - log(weatherStationConfig.pressureInterval); - if (!navigator.bluetooth) { - log('Web Bluetooth API is not available.\n' + - 'Please make sure the Web Bluetooth flag is enabled.'); - return; - } - log('Requesting Bluetooth Device...'); - - navigator.bluetooth.requestDevice({filters: [ - {services: [configurationServiceUUID]}, - {services: [weatherStationServiceUUID]} - ] - }) - .then(device => { - log(device); - return device.connectGATT(); - }) - .then(server => { - log(server); - return server.getPrimaryService(weatherStationServiceUUID); -}) - .then(service => { - log(service); - - bleService.getCharacteristic(configurationCharacteristicUUID) - }) - .then(characteristic => { - log(characteristic); - return characteristic.readValue(); - }) - .then(value => { - log(value); - let temp = value.buffer ? value : new DataView(value); - log(temp); - return handleConfiguration(value); - }) - .catch(error => { - log('> loadConfiguration() ' + error); - }); -} - -function handleConfiguration(value){ - value = value.buffer ? value : new DataView(value); - weatherStationConfig.temperatureInterval = value.getUint8(0) | ((value.getUint8(1) << 8 )&0xff00); - weatherStationConfig.pressureInterval = value.getUint8(2) | ((value.getUint8(3) << 8 )&0xff00); - weatherStationConfig.humidityInterval = value.getUint8(4) | ((value.getUint8(5) << 8 )&0xff00); - weatherStationConfig.pressureMode = value.getUint8(6); - log('weatherStationConfig.temperatureInterval: ' + weatherStationConfig.temperatureInterval); - log('weatherStationConfig.pressureInterval: ' + weatherStationConfig.pressureInterval); - log('weatherStationConfig.humidityInterval: ' + weatherStationConfig.humidityInterval); - log('weatherStationConfig.pressureMode: ' + weatherStationConfig.pressureMode); - document.getElementById("pressure-interval").value = weatherStationConfig.pressureInterval; - document.getElementById("humidity-interval").value = weatherStationConfig.humidityInterval; - document.getElementById("temperature-interval").value = weatherStationConfig.temperatureInterval; - - if(weatherStationConfig.pressureMode == 0){ - $('#pressure-barometer').toggleClass('active'); - } - else{ - $('#pressure-altimeter').toggleClass('active'); - } -} - -function log(text) { - document.querySelector('#log').textContent += text + '\n'; - console.log(text); -} - -function setConnecting(connecting) { - isConnecting = connecting; - if (connecting) { - document.querySelector('#connect').style.display = "none"; - } - else { - document.querySelector('#connect').style.display = "float"; - } -} - -function setConnected(connected) { - isConnected = connected; - if (connected) { - document.querySelector('#connect').style.display = "none"; - document.querySelector('#disconnect').style.display = "float"; - } - else { - document.querySelector('#connect').style.display = "float"; - document.querySelector('#disconnect').style.display = "none"; - sServer.disconnect(); - } -} - -function getAll() { - if (!navigator.bluetooth) { - log('Web Bluetooth API is not available.\n' + - 'Please make sure the Web Bluetooth flag is enabled.'); - return; - } - log('Requesting Bluetooth Device...'); - navigator.bluetooth.requestDevice({filters: [ - {services: [configurationServiceUUID]}, - {services: [weatherStationServiceUUID]} - ] - }) - .then(device => device.connectGATT()) - .then(server => { - bleServer = server; - log('Got bleServer'); - return server.getPrimaryService(weatherStationServiceUUID); - }) - .then(service => { - log('Got bleService'); - bleService = service; - return service.getCharacteristic(demoCharacteristicUUID) - }) - .then( characteristic => { - log('Got demoCharacteristic'); - temperatureChar = characteristic; - return characteristic.startNotifications(); - }) - .then(() => { - temperatureChar.addEventListener('characteristicvaluechanged',handleNotifyTemperature); - }) - - /** Works in Chrome OS not on Android - .then(() => bleService.getCharacteristic(pressureCharacteristicUUID)) - .then( characteristic => { - log('Got pressureCharacteristic'); - pressureChar = characteristic; - return pressureChar.startNotifications(); - }) - .then(() => { - pressureChar.addEventListener('characteristicvaluechanged',handleNotifyPressure); - }) - .then(() => bleService.getCharacteristic(humidityCharacteristicUUID)) - .then( characteristic => { - log('Got humidityCharacteristic'); - humidityChar = characteristic; - return humidityChar.startNotifications(); - }) - .then(() => { - humidityChar.addEventListener('characteristicvaluechanged',handleNotifyHumidity); - }) - .then(() => bleService.getCharacteristic(temperatureCharacteristicUUID)) - .then( characteristic => { - log('Got temperatureCharacteristic'); - temperatureChar = characteristic; - return temperatureChar.startNotifications(); - }) - .then(() => { - temperatureChar.addEventListener('characteristicvaluechanged',handleNotifyTemperature); - }) - **/ - - /** Works in Chrome OS not on Android - return Promise.all([ - service.getCharacteristic(pressureCharacteristicUUID) - .then(handlePressure), - service.getCharacteristic(humidityCharacteristicUUID) - .then(handleHumidity), - service.getCharacteristic(temperatureCharacteristicUUID) - .then(handleTemperature) - ]) - **/ - - .then(startCloudLogging()) - .catch(error => { - log('> getAll() ' + error); - }); -} - -/* -function handlePressure(characteristic){ - log('> handlePressure()'); - pressureChar = characteristic; - characteristic.addEventListener('characteristicvaluechanged',handleNotifyPressure); - return characteristic.startNotifications(); -} - -function handleTemperature(characteristic){ - log('> handleTemperature()'); - temperatureChar = characteristic; - characteristic.addEventListener('characteristicvaluechanged',handleNotifyTemperature); - return characteristic.startNotifications(); -} - -function handleHumidity(characteristic){ - log('> handleHumidity()'); - humidityChar = characteristic; - characteristic.addEventListener('characteristicvaluechanged',handleNotifyHumidity); - return characteristic.startNotifications(); -}*/ - - -function stopAll() { - log('> stopAll()') - /* - if (pressureChar) { - pressureChar.stopNotifications().then(() => { - pressureChar.removeEventListener('characteristicvaluechanged',handleNotifyPressure); - log('> Pressure notifications stopped'); - }); - } - if (humidityChar) { - humidityChar.stopNotifications().then(() => { - humidityChar.removeEventListener('characteristicvaluechanged', handleNotifyHumidity); - log('> Humidity notifications stopped'); - }); - } - */ - if (temperatureChar) { - temperatureChar.stopNotifications().then(() => { - temperatureChar.removeEventListener('characteristicvaluechanged',handleNotifyTemperature); - log('> Temperature notifications stopped'); - }); - } - stopCloudLogging(); - // Disconnect only for Chrome OS 50+ - //log('Disconnecting from Bluetooth Device...'); - //if (bleServer) { - // if (bleServer.connected) { - // bleServer.disconnect(); - // log('Bluetooth Device connected: ' + bleServer.connected); - // } else { - // log('Bluetooth Device is already disconnected'); - // } -} - -/* -function handleNotifyHumidity(event) { - let value = event.target.value; - value = value.buffer ? value : new DataView(value); - let humidity_int = value.getUint8(0); - humidityString = humidity_int.toString(); - log('Humidity is ' + humidity_int + '%'); - document.getElementById("humidity_reading").innerHTML = humidity_int +"%"; -}*/ - -function handleNotifyTemperature(event) { - let value = event.target.value; - value = value.buffer ? value : new DataView(value); - let temperature_int = value.getUint8(0); - let temperature_dec = value.getUint8(1); - temperatureString = temperature_int.toString() + '.' + temperature_dec.toString(); - log('Temperature is ' + temperature_int + '.' + temperature_dec + 'C'); - document.getElementById("temperature_reading").innerHTML = temperature_int + '.' + temperature_dec + '°C'; - - let pressure_integer = value.getInt32(2, true); - let pressure_decimal = value.getUint8(6); - let pressure_pascal = pressure_integer + pressure_decimal / 1000; - let pressure_hpascal = pressure_pascal / 100; - pressureString = pressure_hpascal.toString(); - log('Pressure is ' + pressure_hpascal + 'hPa'); - document.getElementById("pressure_reading").innerHTML = pressure_hpascal.toFixed(3) + 'hPa'; - - let humidity_int = value.getUint8(7); - humidityString = humidity_int.toString(); - log('Humidity is ' + humidity_int + '%'); - document.getElementById("humidity_reading").innerHTML = humidity_int +"%"; -} - -/* -function handleNotifyPressure(event) { - let value = event.target.value; - value = value.buffer ? value : new DataView(value); - let pressure_pascal = value.getInt32(0, true); - let pressure_kpascal = pressure_pascal / 1000; - let pressure_decimal = value.getUint8(4); - pressureString = pressure_kpascal.toString(); - log('Pressure is ' + pressure_pascal + 'Pa'); - document.getElementById("pressure_reading").innerHTML = pressure_pascal + 'Pa'; -} -*/ - -// Swap byte order of 32bit value -function swap32(val) { - return ((val & 0xFF) << 24) - | ((val & 0xFF00) << 8) - | ((val >> 8) & 0xFF00) - | ((val >> 24) & 0xFF); -} - -function stop(event) { - log("stop(" + event + ")"); - try { - sCharacteristic.writeValue(new Uint8Array([0, 0, 0, 0, 0, 0])); - event.preventDefault(); - } catch (error) { - log(error); - } -} - -function disconnectDevice(){ - document.querySelector('#connect').style.display = "block"; - document.querySelector('#disconnect').style.display = "none"; - sServer.disconnect(); - log("Disconnected."); -} diff --git a/weather_station/multi-columns-row.css b/weather_station/multi-columns-row.css deleted file mode 100644 index c83a5f8..0000000 --- a/weather_station/multi-columns-row.css +++ /dev/null @@ -1,57 +0,0 @@ -/* clear first in row in ie 8 or lower */ -.multi-columns-row .first-in-row { - clear: left; -} - -/* clear the first in row for any block that has the class "multi-columns-row" */ -.multi-columns-row .col-xs-6:nth-child(2n + 3) { clear: left; } -.multi-columns-row .col-xs-4:nth-child(3n + 4) { clear: left; } -.multi-columns-row .col-xs-3:nth-child(4n + 5) { clear: left; } -.multi-columns-row .col-xs-2:nth-child(6n + 7) { clear: left; } -.multi-columns-row .col-xs-1:nth-child(12n + 13) { clear: left; } - -@media (min-width: 768px) { - /* reset previous grid */ - .multi-columns-row .col-xs-6:nth-child(2n + 3) { clear: none; } - .multi-columns-row .col-xs-4:nth-child(3n + 4) { clear: none; } - .multi-columns-row .col-xs-3:nth-child(4n + 5) { clear: none; } - .multi-columns-row .col-xs-2:nth-child(6n + 7) { clear: none; } - .multi-columns-row .col-xs-1:nth-child(12n + 13) { clear: none; } - - /* clear first in row for small columns */ - .multi-columns-row .col-sm-6:nth-child(2n + 3) { clear: left; } - .multi-columns-row .col-sm-4:nth-child(3n + 4) { clear: left; } - .multi-columns-row .col-sm-3:nth-child(4n + 5) { clear: left; } - .multi-columns-row .col-sm-2:nth-child(6n + 7) { clear: left; } - .multi-columns-row .col-sm-1:nth-child(12n + 13) { clear: left; } -} -@media (min-width: 992px) { - /* reset previous grid */ - .multi-columns-row .col-sm-6:nth-child(2n + 3) { clear: none; } - .multi-columns-row .col-sm-4:nth-child(3n + 4) { clear: none; } - .multi-columns-row .col-sm-3:nth-child(4n + 5) { clear: none; } - .multi-columns-row .col-sm-2:nth-child(6n + 7) { clear: none; } - .multi-columns-row .col-sm-1:nth-child(12n + 13) { clear: none; } - - /* clear first in row for medium columns */ - .multi-columns-row .col-md-6:nth-child(2n + 3) { clear: left; } - .multi-columns-row .col-md-4:nth-child(3n + 4) { clear: left; } - .multi-columns-row .col-md-3:nth-child(4n + 5) { clear: left; } - .multi-columns-row .col-md-2:nth-child(6n + 7) { clear: left; } - .multi-columns-row .col-md-1:nth-child(12n + 13) { clear: left; } -} -@media (min-width: 1200px) { - /* reset previous grid */ - .multi-columns-row .col-md-6:nth-child(2n + 3) { clear: none; } - .multi-columns-row .col-md-4:nth-child(3n + 4) { clear: none; } - .multi-columns-row .col-md-3:nth-child(4n + 5) { clear: none; } - .multi-columns-row .col-md-2:nth-child(6n + 7) { clear: none; } - .multi-columns-row .col-md-1:nth-child(12n + 13) { clear: none; } - - /* clear first in row for large columns */ - .multi-columns-row .col-lg-6:nth-child(2n + 3) { clear: left; } - .multi-columns-row .col-lg-4:nth-child(3n + 4) { clear: left; } - .multi-columns-row .col-lg-3:nth-child(4n + 5) { clear: left; } - .multi-columns-row .col-lg-2:nth-child(6n + 7) { clear: left; } - .multi-columns-row .col-lg-1:nth-child(12n + 13) { clear: left; } -} \ No newline at end of file diff --git a/weather_station/sensors.html b/weather_station/sensors.html deleted file mode 100644 index 64441b8..0000000 --- a/weather_station/sensors.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - Sensors - - - - - - - - - - - - - - - - -
- -
- -
-
-
- -

Temperature

-
-
-
- 0 -
-
- °C -
-
- -
-
- -
-
-
- -

Pressure

-
-
-
- 0 -
-
- hPa -
-
- -
-
- -
-
-
- -

Humidity

-
-
-
- 0 -
-
- % -
-
- -
-
-
-
- -
-
-
- -

eCO2

-
-
-
- 0 -
-
- ppm -
-
- -
-
- -
-
-
- -

TVOC

-
-
-
- 0 -
-
- ppb -
-
- -
-
- -
-
-
- -

Color

-
-
- RGB -
- -
-
-
-
- - -
-

-    
- - - - - - -
-
-

Nordic Semiconductor © 2016

-
-
- - diff --git a/weather_station/sticky-footer-navbar.css b/weather_station/sticky-footer-navbar.css deleted file mode 100644 index d8eeea5..0000000 --- a/weather_station/sticky-footer-navbar.css +++ /dev/null @@ -1,39 +0,0 @@ -/* Sticky footer styles --------------------------------------------------- */ -html { - position: relative; - min-height: 100%; -} -body { - /* Margin bottom by footer height */ - margin-bottom: 60px; -} -.footer { - position: absolute; - bottom: 0; - width: 100%; - /* Set the fixed height of the footer here */ - height: 60px; - background-color: #f5f5f5; -} - - -/* Custom page CSS --------------------------------------------------- */ -/* Not required for template or sticky footer method. */ - -body > .container { - padding: 60px 15px 0; -} -.container .text-muted { - margin: 20px 0; -} - -.footer > .container { - padding-right: 15px; - padding-left: 15px; -} - -code { - font-size: 80%; -} \ No newline at end of file diff --git a/weather_station/weather_station.html b/weather_station/weather_station.html deleted file mode 100644 index 77483a2..0000000 --- a/weather_station/weather_station.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - Weather Station - - - - - - - - - - - - - - - - -
- -
-
-
-
- -

Temperature

-
-
- 0°C -
- -
-
-
-
-
- -

Pressure

-
-
- 0Pa -
- -
-
-
-
-
- -

Humidity

-
-
- 0% -
- -
-
-
-
- - -
-

-    
- - - - - - -
-
-

Nordic Semiconductor © 2016

-
-
- - diff --git a/weather_station1/custom.css b/weather_station1/custom.css deleted file mode 100644 index 361b019..0000000 --- a/weather_station1/custom.css +++ /dev/null @@ -1,109 +0,0 @@ -.gi-2x{font-size: 2em;} -.gi-3x{font-size: 3em;} -.gi-4x{font-size: 4em;} -.gi-5x{font-size: 5em;} - -.text-1-25x{font-size: 1.25em;} -.text-2x{font-size: 2em;} -.text-3x{font-size: 3em;} -.text-4x{font-size: 4em;} -.text-5x{font-size: 5em;} - -body{ - background-color: #eee; -} - -.page-header { - padding-top: 0px; -} - -.panel-default>.panel-heading { - color: #0080b7; - background-color: #fff; - border-color: #eee; - padding: 40px 15px 20px 15px; -} - -.panel-default>.panel-heading-small { - color: #0080b7; - background-color: #fff; - border-color: #eee; - padding: 20px 15px 20px 15px; -} - - -.panel-body { - color: #0080b7; - background-color: #fff; - border-color: #0080b7; -} - -.panel-body-small { - color: #0080b7; - background-color: #fff; - border-color: #0080b7; -} - -.panel-footer { - background-color: #fff; - border-color: #eee; -} - -.panel-footer-small { - background-color: #fff; - border-color: #eee; - color: #fff; - height: 40px; -} - -.navbar { - border-radius: 0px; */ -} - -.navbar-default { - background-color: #fff; - border-color: #e7e7e7; -} - -.btn-panel-nordic { - color: #fff; - background-color: #6dcff6; - border-color: #eee; -} - -.panel-icon-color { - color: #6dcff6; -} - -.btn { - border-radius: 0px; -} - - -.black { - color: #000; -} - -.primary-blue { - color: #009cde; -} - -.secondary-orange { - color: #f26721; -} - -.secondary-light-blue { - color: #6dcff6; -} - -.secondary-dark-blue { - color: #0080b7; -} - -.input-group { - position: relative; - display: table; - border-collapse: separate; - margin-bottom: 10px; -} - diff --git a/weather_station1/ie-row-fix.js b/weather_station1/ie-row-fix.js deleted file mode 100644 index 141ba4f..0000000 --- a/weather_station1/ie-row-fix.js +++ /dev/null @@ -1,41 +0,0 @@ -/* fix so that rows that have a ton of columns clear the first item in each row. */ -jQuery(document).ready(function($) { - var resizeTimer = null, $doc = $(document); - function rowPolyfill() { - var w = $doc.width(); - jQuery('.multi-columns-row > [class^="col-"]').removeClass('first-in-row'); - if (w > 1200) { - jQuery('.multi-columns-row > .col-lg-6:nth-child(2n + 3)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-lg-4:nth-child(3n + 4)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-lg-3:nth-child(4n + 5)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-lg-2:nth-child(6n + 7)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-lg-1:nth-child(12n + 13)').addClass('first-in-row'); - } else if (w >= 992) { - jQuery('.multi-columns-row > .col-md-6:nth-child(2n + 3)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-md-4:nth-child(3n + 4)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-md-3:nth-child(4n + 5)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-md-2:nth-child(6n + 7)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-md-1:nth-child(12n + 13)').addClass('first-in-row'); - } else if (w >= 768) { - jQuery('.multi-columns-row > .col-sm-6:nth-child(2n + 3)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-sm-4:nth-child(3n + 4)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-sm-3:nth-child(4n + 5)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-sm-2:nth-child(6n + 7)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-sm-1:nth-child(12n + 13)').addClass('first-in-row'); - } else { - jQuery('.multi-columns-row > .col-xs-6:nth-child(2n + 3)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-xs-4:nth-child(3n + 4)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-xs-3:nth-child(4n + 5)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-xs-2:nth-child(6n + 7)').addClass('first-in-row'); - jQuery('.multi-columns-row > .col-xs-1:nth-child(12n + 13)').addClass('first-in-row'); - } - } - rowPolyfill(); - - $(window).on('resize', function() { - if (resizeTimer !== null) { - clearTimeout(resizeTimer); - } - resizeTimer = setTimeout(rowPolyfill, 400); - }); -}); \ No newline at end of file diff --git a/weather_station1/images/nordic_icon_40h.png b/weather_station1/images/nordic_icon_40h.png deleted file mode 100644 index 9af97d8..0000000 Binary files a/weather_station1/images/nordic_icon_40h.png and /dev/null differ diff --git a/weather_station1/images/nordic_icon_50h.png b/weather_station1/images/nordic_icon_50h.png deleted file mode 100644 index 28de1e4..0000000 Binary files a/weather_station1/images/nordic_icon_50h.png and /dev/null differ diff --git a/weather_station1/index.html b/weather_station1/index.html deleted file mode 100644 index ddf9f6d..0000000 --- a/weather_station1/index.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - Responsive UI - - - - - - - - - - - - - -
- -
-
-
-
- -

Thermometer

-
-
- Measure temperature with this nift little piece of technolology. Here is some more text to increase the height of the column. -
- -
-
-
-
-
- -

Barometer

-
-
- Measure height above sea level. -
- -
-
-
-
-
- -

Accelerometer

-
-
- Measure linear accelerations. -
- -
-
-
-
-
- -

Gyroscope

-
-
- Measure 3D orientation. -
- -
-
-
-
-
- -

Hygrometer

-
-
- Measure humidity. -
- -
-
-
-
-
- -

Compass

-
-
- Measure magnetic north. -
- -
-
-
-
-
-
-

Nordic Semiconductor © 2016

-
-
- - \ No newline at end of file diff --git a/weather_station1/javascript/cloud.js b/weather_station1/javascript/cloud.js deleted file mode 100644 index f9ad2cd..0000000 --- a/weather_station1/javascript/cloud.js +++ /dev/null @@ -1,54 +0,0 @@ -'use strict' - -var publicKey = "ZGRzj8o0nxHwLLdxXrZR"; -var privateKey = "2mNWaXMJ75hMAA1VxRje"; -var interval; - -function sendCloudData() { - log('> sendCloudData()') - // create object - var xhttp = new XMLHttpRequest(); - - // callback will only fire if message was received successfully - xhttp.onreadystatechange = function() { - if (xhttp.readyState == 4 && xhttp.status == 200) { - log('XHTTP response: ' + xhttp.responseText); - - // Parse JSON reponse - var response = JSON.parse(xhttp.responseText); - log('JSON response: ' + response.message); - } - }; - - // populate the data for the request. the ".json" part specifies that we want the response as json. - var message = "https://data.sparkfun.com/input/" - + publicKey - + ".json" - + "?private_key=" - + privateKey - + "&temperature=" - + temperatureString - + "&humidity=" - + humidityString - + "&pressure=" - + pressureString - + "&latitude=" - + latitudeString - + "&longitude=" - + longitudeString; - - xhttp.open("GET", message, true); - - // send the request - xhttp.send(); -} - -function startCloudLogging(){ - interval = setInterval(sendCloudData, 10000); - log("> startCloudLogging()"); -} - -function stopCloudLogging(){ - clearInterval(interval) - log("> stopCloudLogging()"); -} \ No newline at end of file diff --git a/weather_station1/javascript/geolocation.js b/weather_station1/javascript/geolocation.js deleted file mode 100644 index 54a4dab..0000000 --- a/weather_station1/javascript/geolocation.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict' - -var latitudeString = 0; -var longitudeString = 0; - -//window.onload = getGeolocation(); -window.addEventListener("load", getGeolocation); - -function getGeolocation(){ - if (navigator.geolocation) { - navigator.geolocation.getCurrentPosition(showPosition, showError); - log('Geolocation supported!'); - } else { - log('Geolocation is not supported by this browser!'); - } -} - -function showPosition(position) { - log('Latitude: ' + position.coords.latitude + - ' Longitude: ' + position.coords.longitude); - latitudeString = position.coords.latitude; - longitudeString = position.coords.longitude; -} - -function showError(error) { - switch(error.code) { - case error.PERMISSION_DENIED: - log("User denied the request for Geolocation."); - break; - case error.POSITION_UNAVAILABLE: - log("Location information is unavailable."); - break; - case error.TIMEOUT: - log("The request to get user location timed out."); - break; - case error.UNKNOWN_ERROR: - log("An unknown error occurred."); - break; - } -} \ No newline at end of file diff --git a/weather_station1/javascript/weather_station.js b/weather_station1/javascript/weather_station.js deleted file mode 100644 index af4a435..0000000 --- a/weather_station1/javascript/weather_station.js +++ /dev/null @@ -1,416 +0,0 @@ -'use strict' - -/* BLE Configuration Service - deviceNameCharacteristicUUID - write/write without response - max 10 byte - ascii string - advertisingParamCharacteristicUUID - write/write without response - 3 bytes - uint16_t adv interval in ms - uint8_t adv timeout in s - appearanceCharacteristicUUID - write/write without response - 2 bytes - uint16_t appearance - connectionParamCharacteristicUUID - write/write without response - 8 bytes - uint16_t min conn interval - uint16_t max conn interval - uint16_t slave latency - uint16_t supervision timeout -*/ -var configurationServiceUUID = 'ef680001-9b35-4933-9b10-52ffa9740042'; -var deviceNameCharacteristicUUID = 'ef680002-9b35-4933-9b10-52ffa9740042'; -var advertisingParamCharacteristicUUID = 'ef680003-9b35-4933-9b10-52ffa9740042'; -var appearanceCharacteristicUUID = 'ef680004-9b35-4933-9b10-52ffa9740042'; -var connectionParamCharacteristicUUID = 'ef680005-9b35-4933-9b10-52ffa9740042'; - -/* Weather Station Service - temperatureCharacteristicUUID - notify/read - 2 bytes - uint8_t integer - uint8_t decimal - pressureCharacteristicUUID - notify/read - 5 bytes - int32_t integer - uint8_t decimal - humidityCharacteristicUUID - notify/read - 1 byte - uint8_t - configurationCharacteristicUUID - write/write without response - 7 bytes - uint16_t temp interval in ms - uint16_t pressure interval in ms - uint16_t humidity interval in ms - uint8_t pressure mode (0=barometer, 1=altimeter) -*/ -var weatherStationServiceUUID = '20080001-e36f-4648-91c6-9e86ead38764'; -var temperatureCharacteristicUUID = '20080002-e36f-4648-91c6-9e86ead38764'; -var pressureCharacteristicUUID = '20080003-e36f-4648-91c6-9e86ead38764'; -var humidityCharacteristicUUID = '20080004-e36f-4648-91c6-9e86ead38764'; -var configurationCharacteristicUUID = '20080005-e36f-4648-91c6-9e86ead38764'; -var demoCharacteristicUUID = '20080006-e36f-4648-91c6-9e86ead38764'; - -/* User Interface Service - ledCharacteristicUUID - write/read - 4 bytes - uint32_t - LED ID - Red - Green - Blue (LSB) - buttonCharacteristicUUID - write/read - 2 bytes - uint16_t - Button 2 state - Button 1 state (LSB) -*/ -var userInterfaceServiceUUID = 'C7AE0001-3266-4A5C-859F-0F4799146BB5'; -var ledCharacteristicUUID = 'C7AE0002-3266-4A5C-859F-0F4799146BB5'; -var buttonCharacteristicUUID = 'C7AE0003-3266-4A5C-859F-0F4799146BB5'; - -/* Default values for weather station configuration*/ -var weatherStationConfig = { - pressureInterval:1000, - temperatureInterval:1000, - humidityInterval:1000, - pressureMode:0 -}; - -var isConnecting = false; -var isConnected = false; -var sInterval; -var sTimeout; -var humidity; -var temperature; -var pressure; -var bleDevice; -var bleServer; -var bleService; -var pressureChar; -var humidityChar; -var temperatureChar; -var pressureString; -var humidityString; -var temperatureString; -var myCharacteristic; - -window.onload = function(){ - document.querySelector('#connect').addEventListener('click', getAll); - document.querySelector('#disconnect').addEventListener('click', stopAll); - document.querySelector('#load-configuration').addEventListener('click', loadConfiguration); - document.querySelector('#apply-configuration').addEventListener('click', applyConfiguration); -}; - -function applyConfiguration(){ - log('> applyConfiguration()'); - log(weatherStationConfig); - - let pInterval = parseFloat(document.getElementById("pressure-interval").value); - log(pInterval); - let tInterval = document.getElementById("temperature-interval").value; - log(tInterval); - let hInterval = document.getElementById("humidity-interval").value; - log(hInterval); - let pMode; - - // get the checked button toggle - let temp = $("input[name='options']:checked").val(); - if(temp == 'barometer'){ - pMode = 0; - } - else{ - pMode = 1; - } - - if (!navigator.bluetooth) { - log('Web Bluetooth API is not available.\n' + - 'Please make sure the Web Bluetooth flag is enabled.'); - return; - } - log('Requesting Bluetooth Device...'); - navigator.bluetooth.requestDevice({filters: [{services: [configurationServiceUUID]}]}) - .then(device => { - log(device); - return device.connectGATT(); - }) - .then(server => { - log(server); - return server.getPrimaryService(weatherStationServiceUUID); - }) - .then(service => { - log(service); - return service.getCharacteristic(configurationCharacteristicUUID); - }) - .then(characteristic => { - log(characteristic); - let data2 = new Uint8Array([0,1,0,1,0,1,1]); - log(data2); - for(let i = 0; i<7; i++){ - log(data2[i]); - } - let data = new Uint8Array(7); - data[0] = tInterval & 0xff; - data[1] = (tInterval >> 8) & 0xff; - data[2] = pInterval & 0xff; - data[3] = (pInterval >> 8) & 0xff; - data[4] = hInterval & 0xff; - data[5] = (hInterval >> 8) & 0xff; - data[6] = pMode; - - log('data: ' + data); - for(let i = 0; i<7; i++){ - log(i + ': ' + data[i]); - } - return characteristic.writeValue(data); - }) - .then(value => { - log('This data was sent: ' + value); - return value; - }) - .catch(error => { - log('> applyConfiguration() ' + error); - }); -} - - -function loadConfiguration(){ - log('> loadConfiguration()'); - log(weatherStationConfig); - log(weatherStationConfig.pressureInterval); - if (!navigator.bluetooth) { - log('Web Bluetooth API is not available.\n' + - 'Please make sure the Web Bluetooth flag is enabled.'); - return; - } - log('Requesting Bluetooth Device...'); - navigator.bluetooth.requestDevice({filters: [{services: [configurationServiceUUID]}]}) - .then(device => { - log(device); - return device.connectGATT(); - }) - .then(server => { - log(server); - return server.getPrimaryService(weatherStationServiceUUID); - }) - .then(service => { - log(service); - return service.getCharacteristic(configurationCharacteristicUUID); - }) - .then(characteristic => { - log(characteristic); - return characteristic.readValue(); - }) - .then(value => { - log(value); - let temp = value.buffer ? value : new DataView(value); - log(temp); - return handleConfiguration(value); - }) - .catch(error => { - log('> loadConfiguration() ' + error); - }); -} - -function handleConfiguration(value){ - value = value.buffer ? value : new DataView(value); - weatherStationConfig.temperatureInterval = value.getUint8(0) | ((value.getUint8(1) << 8 )&0xff00); - weatherStationConfig.pressureInterval = value.getUint8(2) | ((value.getUint8(3) << 8 )&0xff00); - weatherStationConfig.humidityInterval = value.getUint8(4) | ((value.getUint8(5) << 8 )&0xff00); - weatherStationConfig.pressureMode = value.getUint8(6); - log('weatherStationConfig.temperatureInterval: ' + weatherStationConfig.temperatureInterval); - log('weatherStationConfig.pressureInterval: ' + weatherStationConfig.pressureInterval); - log('weatherStationConfig.humidityInterval: ' + weatherStationConfig.humidityInterval); - log('weatherStationConfig.pressureMode: ' + weatherStationConfig.pressureMode); - document.getElementById("pressure-interval").value = weatherStationConfig.pressureInterval; - document.getElementById("humidity-interval").value = weatherStationConfig.humidityInterval; - document.getElementById("temperature-interval").value = weatherStationConfig.temperatureInterval; - - if(weatherStationConfig.pressureMode == 0){ - $('#pressure-barometer').toggleClass('active'); - } - else{ - $('#pressure-altimeter').toggleClass('active'); - } -} - -function log(text) { - document.querySelector('#log').textContent += text + '\n'; - console.log(text); -} - -function setConnecting(connecting) { - isConnecting = connecting; - if (connecting) { - document.querySelector('#connect').style.display = "none"; - } - else { - document.querySelector('#connect').style.display = "float"; - } -} - -function setConnected(connected) { - isConnected = connected; - if (connected) { - document.querySelector('#connect').style.display = "none"; - document.querySelector('#disconnect').style.display = "float"; - } - else { - document.querySelector('#connect').style.display = "float"; - document.querySelector('#disconnect').style.display = "none"; - sServer.disconnect(); - } -} - -function getAll() { - if (!navigator.bluetooth) { - log('Web Bluetooth API is not available.\n' + - 'Please make sure the Web Bluetooth flag is enabled.'); - return; - } - log('Requesting Bluetooth Device...'); - navigator.bluetooth.requestDevice({filters: [ - {services: [configurationServiceUUID]}, - {services: [weatherStationServiceUUID]} - ] - }) - .then(device => device.connectGATT()) - .then(server => { - bleServer = server; - log('Got bleServer'); - return server.getPrimaryService(weatherStationServiceUUID); - }) - .then(service => { - log('Got bleService'); - bleService = service; - }) - /* - .then(() => bleService.getCharacteristic(demoCharacteristicUUID)) - .then( characteristic => { - log('Got demoCharacteristic'); - temperatureChar = characteristic; - return temperatureChar.startNotifications(); - }) - .then(() => { - temperatureChar.addEventListener('characteristicvaluechanged',handleNotifyTemperature); - }) - */ - .then(() => bleService.getCharacteristic(pressureCharacteristicUUID)) - .then( characteristic => { - log('Got pressureCharacteristic'); - pressureChar = characteristic; - return pressureChar.startNotifications(); - }) - .then(() => { - pressureChar.addEventListener('characteristicvaluechanged',handleNotifyPressure); - }) - .then(() => bleService.getCharacteristic(humidityCharacteristicUUID)) - .then( characteristic => { - log('Got humidityCharacteristic'); - humidityChar = characteristic; - return humidityChar.startNotifications(); - }) - .then(() => { - humidityChar.addEventListener('characteristicvaluechanged',handleNotifyHumidity); - }) - .then(() => bleService.getCharacteristic(temperatureCharacteristicUUID)) - .then( characteristic => { - log('Got temperatureCharacteristic'); - temperatureChar = characteristic; - return temperatureChar.startNotifications(); - }) - .then(() => { - temperatureChar.addEventListener('characteristicvaluechanged',handleNotifyTemperature); - }) - - /** Works in Chrome OS not on Android - return Promise.all([ - service.getCharacteristic(pressureCharacteristicUUID) - .then(handlePressure), - service.getCharacteristic(humidityCharacteristicUUID) - .then(handleHumidity), - service.getCharacteristic(temperatureCharacteristicUUID) - .then(handleTemperature) - ]) - **/ - - .then(startCloudLogging()) - .catch(error => { - log('> getAll() ' + error); - }); -} - -/* -function handlePressure(characteristic){ - log('> handlePressure()'); - pressureChar = characteristic; - characteristic.addEventListener('characteristicvaluechanged',handleNotifyPressure); - return characteristic.startNotifications(); -} - -function handleTemperature(characteristic){ - log('> handleTemperature()'); - temperatureChar = characteristic; - characteristic.addEventListener('characteristicvaluechanged',handleNotifyTemperature); - return characteristic.startNotifications(); -} - -function handleHumidity(characteristic){ - log('> handleHumidity()'); - humidityChar = characteristic; - characteristic.addEventListener('characteristicvaluechanged',handleNotifyHumidity); - return characteristic.startNotifications(); -}*/ - - -function stopAll() { - log('> stopAll()') - - if (pressureChar) { - pressureChar.stopNotifications().then(() => { - pressureChar.removeEventListener('characteristicvaluechanged',handleNotifyPressure); - log('> Pressure notifications stopped'); - }); - } - if (humidityChar) { - humidityChar.stopNotifications().then(() => { - humidityChar.removeEventListener('characteristicvaluechanged', handleNotifyHumidity); - log('> Humidity notifications stopped'); - }); - } - if (temperatureChar) { - temperatureChar.stopNotifications().then(() => { - temperatureChar.removeEventListener('characteristicvaluechanged',handleNotifyTemperature); - log('> Temperature notifications stopped'); - }); - } - stopCloudLogging(); - // Disconnect only for Chrome OS 50+ - //log('Disconnecting from Bluetooth Device...'); - //if (bleServer) { - // if (bleServer.connected) { - // bleServer.disconnect(); - // log('Bluetooth Device connected: ' + bleServer.connected); - // } else { - // log('Bluetooth Device is already disconnected'); - // } -} - -function handleNotifyHumidity(event) { - let value = event.target.value; - value = value.buffer ? value : new DataView(value); - let humidity_int = value.getUint8(0); - humidityString = humidity_int.toString(); - log('Humidity is ' + humidity_int + '%'); - document.getElementById("humidity_reading").innerHTML = humidity_int +"%"; -} - -function handleNotifyTemperature(event) { - let value = event.target.value; - value = value.buffer ? value : new DataView(value); - let temperature_int = value.getUint8(0); - let temperature_dec = value.getUint8(1); - temperatureString = temperature_int.toString() + '.' + temperature_dec.toString(); - log('Temperature is ' + temperature_int + '.' + temperature_dec + 'C'); - document.getElementById("temperature_reading").innerHTML = temperature_int + '.' + temperature_dec + '°C'; -} - -function handleNotifyPressure(event) { - let value = event.target.value; - value = value.buffer ? value : new DataView(value); - let pressure_pascal = value.getInt32(0, true); - let pressure_kpascal = pressure_pascal / 1000; - let pressure_decimal = value.getUint8(4); - pressureString = pressure_kpascal.toString(); - log('Pressure is ' + pressure_pascal + 'Pa'); - document.getElementById("pressure_reading").innerHTML = pressure_pascal + 'Pa'; -} - -// Swap byte order of 32bit value -function swap32(val) { - return ((val & 0xFF) << 24) - | ((val & 0xFF00) << 8) - | ((val >> 8) & 0xFF00) - | ((val >> 24) & 0xFF); -} - -function stop(event) { - log("stop(" + event + ")"); - try { - sCharacteristic.writeValue(new Uint8Array([0, 0, 0, 0, 0, 0])); - event.preventDefault(); - } catch (error) { - log(error); - } -} - -function disconnectDevice(){ - document.querySelector('#connect').style.display = "block"; - document.querySelector('#disconnect').style.display = "none"; - sServer.disconnect(); - log("Disconnected."); -} diff --git a/weather_station1/multi-columns-row.css b/weather_station1/multi-columns-row.css deleted file mode 100644 index c83a5f8..0000000 --- a/weather_station1/multi-columns-row.css +++ /dev/null @@ -1,57 +0,0 @@ -/* clear first in row in ie 8 or lower */ -.multi-columns-row .first-in-row { - clear: left; -} - -/* clear the first in row for any block that has the class "multi-columns-row" */ -.multi-columns-row .col-xs-6:nth-child(2n + 3) { clear: left; } -.multi-columns-row .col-xs-4:nth-child(3n + 4) { clear: left; } -.multi-columns-row .col-xs-3:nth-child(4n + 5) { clear: left; } -.multi-columns-row .col-xs-2:nth-child(6n + 7) { clear: left; } -.multi-columns-row .col-xs-1:nth-child(12n + 13) { clear: left; } - -@media (min-width: 768px) { - /* reset previous grid */ - .multi-columns-row .col-xs-6:nth-child(2n + 3) { clear: none; } - .multi-columns-row .col-xs-4:nth-child(3n + 4) { clear: none; } - .multi-columns-row .col-xs-3:nth-child(4n + 5) { clear: none; } - .multi-columns-row .col-xs-2:nth-child(6n + 7) { clear: none; } - .multi-columns-row .col-xs-1:nth-child(12n + 13) { clear: none; } - - /* clear first in row for small columns */ - .multi-columns-row .col-sm-6:nth-child(2n + 3) { clear: left; } - .multi-columns-row .col-sm-4:nth-child(3n + 4) { clear: left; } - .multi-columns-row .col-sm-3:nth-child(4n + 5) { clear: left; } - .multi-columns-row .col-sm-2:nth-child(6n + 7) { clear: left; } - .multi-columns-row .col-sm-1:nth-child(12n + 13) { clear: left; } -} -@media (min-width: 992px) { - /* reset previous grid */ - .multi-columns-row .col-sm-6:nth-child(2n + 3) { clear: none; } - .multi-columns-row .col-sm-4:nth-child(3n + 4) { clear: none; } - .multi-columns-row .col-sm-3:nth-child(4n + 5) { clear: none; } - .multi-columns-row .col-sm-2:nth-child(6n + 7) { clear: none; } - .multi-columns-row .col-sm-1:nth-child(12n + 13) { clear: none; } - - /* clear first in row for medium columns */ - .multi-columns-row .col-md-6:nth-child(2n + 3) { clear: left; } - .multi-columns-row .col-md-4:nth-child(3n + 4) { clear: left; } - .multi-columns-row .col-md-3:nth-child(4n + 5) { clear: left; } - .multi-columns-row .col-md-2:nth-child(6n + 7) { clear: left; } - .multi-columns-row .col-md-1:nth-child(12n + 13) { clear: left; } -} -@media (min-width: 1200px) { - /* reset previous grid */ - .multi-columns-row .col-md-6:nth-child(2n + 3) { clear: none; } - .multi-columns-row .col-md-4:nth-child(3n + 4) { clear: none; } - .multi-columns-row .col-md-3:nth-child(4n + 5) { clear: none; } - .multi-columns-row .col-md-2:nth-child(6n + 7) { clear: none; } - .multi-columns-row .col-md-1:nth-child(12n + 13) { clear: none; } - - /* clear first in row for large columns */ - .multi-columns-row .col-lg-6:nth-child(2n + 3) { clear: left; } - .multi-columns-row .col-lg-4:nth-child(3n + 4) { clear: left; } - .multi-columns-row .col-lg-3:nth-child(4n + 5) { clear: left; } - .multi-columns-row .col-lg-2:nth-child(6n + 7) { clear: left; } - .multi-columns-row .col-lg-1:nth-child(12n + 13) { clear: left; } -} \ No newline at end of file diff --git a/weather_station1/sticky-footer-navbar.css b/weather_station1/sticky-footer-navbar.css deleted file mode 100644 index d8eeea5..0000000 --- a/weather_station1/sticky-footer-navbar.css +++ /dev/null @@ -1,39 +0,0 @@ -/* Sticky footer styles --------------------------------------------------- */ -html { - position: relative; - min-height: 100%; -} -body { - /* Margin bottom by footer height */ - margin-bottom: 60px; -} -.footer { - position: absolute; - bottom: 0; - width: 100%; - /* Set the fixed height of the footer here */ - height: 60px; - background-color: #f5f5f5; -} - - -/* Custom page CSS --------------------------------------------------- */ -/* Not required for template or sticky footer method. */ - -body > .container { - padding: 60px 15px 0; -} -.container .text-muted { - margin: 20px 0; -} - -.footer > .container { - padding-right: 15px; - padding-left: 15px; -} - -code { - font-size: 80%; -} \ No newline at end of file diff --git a/weather_station1/weather_station.html b/weather_station1/weather_station.html deleted file mode 100644 index 77483a2..0000000 --- a/weather_station1/weather_station.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - Weather Station - - - - - - - - - - - - - - - - -
- -
-
-
-
- -

Temperature

-
-
- 0°C -
- -
-
-
-
-
- -

Pressure

-
-
- 0Pa -
- -
-
-
-
-
- -

Humidity

-
-
- 0% -
- -
-
-
-
- - -
-

-    
- - - - - - - - -