diff --git a/lect12-gsea/lect12-gsea.html b/lect12-gsea/lect12-gsea.html index e3e3789..c765460 100644 --- a/lect12-gsea/lect12-gsea.html +++ b/lect12-gsea/lect12-gsea.html @@ -1,13 +1,13 @@
- - - - - - - - + + + + + + + + @@ -16,8 +16,8 @@ - - + + - - - - - - - + + + + + + + \n\t\n\n\t\n\n\t\t element after existing one
+ code.parentNode.appendChild(fragmentBlock);
+
+ // Each new element is highlighted based on the new attributes value
+ highlightCodeBlock(fragmentBlock);
+
+ if (typeof fragmentIndex === "number") {
+ fragmentBlock.setAttribute(kFragmentIndex, fragmentIndex);
+ fragmentIndex += 1;
+ } else {
+ fragmentBlock.removeAttribute(kFragmentIndex);
+ }
+
+ // Scroll highlights into view as we step through them
+ fragmentBlock.addEventListener(
+ "visible",
+ scrollHighlightedLineIntoView.bind(
+ this,
+ fragmentBlock,
+ scrollState
+ )
+ );
+ fragmentBlock.addEventListener(
+ "hidden",
+ scrollHighlightedLineIntoView.bind(
+ this,
+ fragmentBlock.previousSibling,
+ scrollState
+ )
+ );
+ }
+ );
+ code.removeAttribute(kFragmentIndex);
+ code.setAttribute(
+ kCodeLineNumbersAttr,
+ joinLineNumbers([highlightSteps[0]])
+ );
+ }
+
+ // Scroll the first highlight into view when the slide becomes visible.
+ const slide =
+ typeof code.closest === "function"
+ ? code.closest("section:not(.stack)")
+ : null;
+ if (slide) {
+ const scrollFirstHighlightIntoView = function () {
+ scrollHighlightedLineIntoView(code, scrollState, true);
+ slide.removeEventListener(
+ "visible",
+ scrollFirstHighlightIntoView
+ );
+ };
+ slide.addEventListener("visible", scrollFirstHighlightIntoView);
+ }
+
+ highlightCodeBlock(code);
+ });
+ }
+ }
+ });
+ }
+
+ function highlightCodeBlock(codeBlock) {
+ const highlightSteps = splitLineNumbers(
+ codeBlock.getAttribute(kCodeLineNumbersAttr)
+ );
+
+ if (highlightSteps.length) {
+ // If we have at least one step, we generate fragments
+ highlightSteps[0].forEach((highlight) => {
+ // Add expected class on for reveal CSS
+ codeBlock.parentNode.classList.add("code-wrapper");
+
+ // Select lines to highlight
+ spanToHighlight = [];
+ if (typeof highlight.last === "number") {
+ spanToHighlight = [].slice.call(
+ codeBlock.querySelectorAll(
+ ":scope > span:nth-child(n+" +
+ highlight.first +
+ "):nth-child(-n+" +
+ highlight.last +
+ ")"
+ )
+ );
+ } else if (typeof highlight.first === "number") {
+ spanToHighlight = [].slice.call(
+ codeBlock.querySelectorAll(
+ ":scope > span:nth-child(" + highlight.first + ")"
+ )
+ );
+ }
+ if (spanToHighlight.length) {
+ // Add a class on and to select line to highlight
+ spanToHighlight.forEach((span) =>
+ span.classList.add("highlight-line")
+ );
+ codeBlock.classList.add("has-line-highlights");
+ }
+ });
+ }
+ }
+
+ /**
+ * Animates scrolling to the first highlighted line
+ * in the given code block.
+ */
+ function scrollHighlightedLineIntoView(block, scrollState, skipAnimation) {
+ window.cancelAnimationFrame(scrollState.animationFrameID);
+
+ // Match the scroll position of the currently visible
+ // code block
+ if (scrollState.currentBlock) {
+ block.scrollTop = scrollState.currentBlock.scrollTop;
+ }
+
+ // Remember the current code block so that we can match
+ // its scroll position when showing/hiding fragments
+ scrollState.currentBlock = block;
+
+ const highlightBounds = getHighlightedLineBounds(block);
+ let viewportHeight = block.offsetHeight;
+
+ // Subtract padding from the viewport height
+ const blockStyles = window.getComputedStyle(block);
+ viewportHeight -=
+ parseInt(blockStyles.paddingTop) + parseInt(blockStyles.paddingBottom);
+
+ // Scroll position which centers all highlights
+ const startTop = block.scrollTop;
+ let targetTop =
+ highlightBounds.top +
+ (Math.min(highlightBounds.bottom - highlightBounds.top, viewportHeight) -
+ viewportHeight) /
+ 2;
+
+ // Make sure the scroll target is within bounds
+ targetTop = Math.max(
+ Math.min(targetTop, block.scrollHeight - viewportHeight),
+ 0
+ );
+
+ if (skipAnimation === true || startTop === targetTop) {
+ block.scrollTop = targetTop;
+ } else {
+ // Don't attempt to scroll if there is no overflow
+ if (block.scrollHeight <= viewportHeight) return;
+
+ let time = 0;
+
+ const animate = function () {
+ time = Math.min(time + 0.02, 1);
+
+ // Update our eased scroll position
+ block.scrollTop =
+ startTop + (targetTop - startTop) * easeInOutQuart(time);
+
+ // Keep animating unless we've reached the end
+ if (time < 1) {
+ scrollState.animationFrameID = requestAnimationFrame(animate);
+ }
+ };
+
+ animate();
+ }
+ }
+
+ function getHighlightedLineBounds(block) {
+ const highlightedLines = block.querySelectorAll(".highlight-line");
+ if (highlightedLines.length === 0) {
+ return { top: 0, bottom: 0 };
+ } else {
+ const firstHighlight = highlightedLines[0];
+ const lastHighlight = highlightedLines[highlightedLines.length - 1];
+
+ return {
+ top: firstHighlight.offsetTop,
+ bottom: lastHighlight.offsetTop + lastHighlight.offsetHeight,
+ };
+ }
+ }
+
+ /**
+ * The easing function used when scrolling.
+ */
+ function easeInOutQuart(t) {
+ // easeInOutQuart
+ return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;
+ }
+
+ function splitLineNumbers(lineNumbersAttr) {
+ // remove space
+ lineNumbersAttr = lineNumbersAttr.replace("/s/g", "");
+ // seperate steps (for fragment)
+ lineNumbersAttr = lineNumbersAttr.split(delimiters.step);
+
+ // for each step, calculate first and last line, if any
+ return lineNumbersAttr.map((highlights) => {
+ // detect lines
+ const lines = highlights.split(delimiters.line);
+ return lines.map((range) => {
+ if (/^[\d-]+$/.test(range)) {
+ range = range.split(delimiters.lineRange);
+ const firstLine = parseInt(range[0], 10);
+ const lastLine = range[1] ? parseInt(range[1], 10) : undefined;
+ return {
+ first: firstLine,
+ last: lastLine,
+ };
+ } else {
+ return {};
+ }
+ });
+ });
+ }
+
+ function joinLineNumbers(splittedLineNumbers) {
+ return splittedLineNumbers
+ .map(function (highlights) {
+ return highlights
+ .map(function (highlight) {
+ // Line range
+ if (typeof highlight.last === "number") {
+ return highlight.first + delimiters.lineRange + highlight.last;
+ }
+ // Single line
+ else if (typeof highlight.first === "number") {
+ return highlight.first;
+ }
+ // All lines
+ else {
+ return "";
+ }
+ })
+ .join(delimiters.line);
+ })
+ .join(delimiters.step);
+ }
+
+ return {
+ id: "quarto-line-highlight",
+ init: function (deck) {
+ initQuartoLineHighlight(deck);
+
+ // If we're printing to PDF, scroll the code highlights of
+ // all blocks in the deck into view at once
+ deck.on("pdf-ready", function () {
+ [].slice
+ .call(
+ deck
+ .getRevealElement()
+ .querySelectorAll(
+ "pre code[data-code-line-numbers].current-fragment"
+ )
+ )
+ .forEach(function (block) {
+ scrollHighlightedLineIntoView(block, {}, true);
+ });
+ });
+ },
+ };
+};
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/quarto-line-highlight/plugin.yml b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/quarto-line-highlight/plugin.yml
new file mode 100644
index 0000000..ca20686
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/quarto-line-highlight/plugin.yml
@@ -0,0 +1,4 @@
+# adapted from https://github.com/hakimel/reveal.js/tree/master/plugin/highlight
+name: QuartoLineHighlight
+script: line-highlight.js
+stylesheet: line-highlight.css
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/quarto-support/footer.css b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/quarto-support/footer.css
new file mode 100644
index 0000000..390d5b3
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/quarto-support/footer.css
@@ -0,0 +1,110 @@
+.reveal .slide-logo {
+ display: block;
+ position: fixed;
+ bottom: 0;
+ right: 12px;
+ max-height: 2.2rem;
+ height: 100%;
+ width: auto;
+ z-index: 2;
+}
+
+.reveal .footer {
+ display: block;
+ position: fixed;
+ bottom: 18px;
+ width: 100%;
+ margin: 0 auto;
+ text-align: center;
+ font-size: 18px;
+ z-index: 2;
+}
+
+.reveal .footer > * {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.reveal .slide .footer {
+ display: none;
+}
+
+.reveal .slide-number {
+ bottom: 10px;
+ right: 10px;
+ font-size: 16px;
+ background-color: transparent;
+}
+
+.reveal.has-logo .slide-number {
+ bottom: initial;
+ top: 8px;
+ right: 8px;
+}
+
+.reveal .slide-number .slide-number-delimiter {
+ margin: 0;
+}
+
+.reveal .slide-menu-button {
+ left: 8px;
+ bottom: 8px;
+}
+
+.reveal .slide-chalkboard-buttons {
+ position: fixed;
+ left: 12px;
+ bottom: 8px;
+ z-index: 30;
+ font-size: 24px;
+}
+
+.reveal .slide-chalkboard-buttons.slide-menu-offset {
+ left: 54px;
+}
+
+.reveal .slide-chalkboard-buttons > span {
+ margin-right: 14px;
+ cursor: pointer;
+}
+
+@media screen and (max-width: 800px) {
+ .reveal .slide-logo {
+ max-height: 1.1rem;
+ bottom: -2px;
+ right: 10px;
+ }
+ .reveal .footer {
+ font-size: 14px;
+ bottom: 12px;
+ }
+ .reveal .slide-number {
+ font-size: 12px;
+ bottom: 7px;
+ }
+ .reveal .slide-menu-button .fas::before {
+ height: 1.3rem;
+ width: 1.3rem;
+ vertical-align: -0.125em;
+ background-size: 1.3rem 1.3rem;
+ }
+
+ .reveal .slide-chalkboard-buttons .fas::before {
+ height: 0.95rem;
+ width: 0.95rem;
+ background-size: 0.95rem 0.95rem;
+ vertical-align: -0em;
+ }
+
+ .reveal .slide-chalkboard-buttons.slide-menu-offset {
+ left: 36px;
+ }
+ .reveal .slide-chalkboard-buttons > span {
+ margin-right: 9px;
+ }
+}
+
+html.print-pdf .reveal .slide-menu-button,
+html.print-pdf .reveal .slide-chalkboard-buttons {
+ display: none;
+}
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/quarto-support/plugin.yml b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/quarto-support/plugin.yml
new file mode 100644
index 0000000..546956e
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/quarto-support/plugin.yml
@@ -0,0 +1,5 @@
+name: QuartoSupport
+script: support.js
+stylesheet: footer.css
+config:
+ smaller: false
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/quarto-support/support.js b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/quarto-support/support.js
new file mode 100644
index 0000000..9adc921
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/quarto-support/support.js
@@ -0,0 +1,290 @@
+// catch all plugin for various quarto features
+window.QuartoSupport = function () {
+ function isPrintView() {
+ return /print-pdf/gi.test(window.location.search);
+ }
+
+ // implement controlsAudo
+ function controlsAuto(deck) {
+ const config = deck.getConfig();
+ if (config.controlsAuto === true) {
+ const iframe = window.location !== window.parent.location;
+ const localhost =
+ window.location.hostname === "localhost" ||
+ window.location.hostname === "127.0.0.1";
+ deck.configure({
+ controls:
+ (iframe && !localhost) ||
+ (deck.hasVerticalSlides() && config.navigationMode !== "linear"),
+ });
+ }
+ }
+
+ // helper to provide event handlers for all links in a container
+ function handleLinkClickEvents(deck, container) {
+ Array.from(container.querySelectorAll("a")).forEach((el) => {
+ const url = el.getAttribute("href");
+ if (/^(http|www)/gi.test(url)) {
+ el.addEventListener(
+ "click",
+ (ev) => {
+ const fullscreen = !!window.document.fullscreen;
+ const dataPreviewLink = el.getAttribute("data-preview-link");
+
+ // if there is a local specifcation then use that
+ if (dataPreviewLink) {
+ if (
+ dataPreviewLink === "true" ||
+ (dataPreviewLink === "auto" && fullscreen)
+ ) {
+ ev.preventDefault();
+ deck.showPreview(url);
+ return false;
+ }
+ } else {
+ const previewLinks = !!deck.getConfig().previewLinks;
+ const previewLinksAuto =
+ deck.getConfig().previewLinksAuto === true;
+ if (previewLinks == true || (previewLinksAuto && fullscreen)) {
+ ev.preventDefault();
+ deck.showPreview(url);
+ return false;
+ }
+ }
+
+ // if the deck is in an iframe we want to open it externally
+ // (don't do this when in vscode though as it has its own
+ // handler for opening links externally that will be play)
+ const iframe = window.location !== window.parent.location;
+ if (
+ iframe &&
+ !window.location.search.includes("quartoPreviewReqId=")
+ ) {
+ ev.preventDefault();
+ ev.stopImmediatePropagation();
+ window.open(url, "_blank");
+ return false;
+ }
+
+ // if the user has set data-preview-link to "auto" we need to handle the event
+ // (because reveal will interpret "auto" as true)
+ if (dataPreviewLink === "auto") {
+ ev.preventDefault();
+ ev.stopImmediatePropagation();
+ const target =
+ el.getAttribute("target") ||
+ (ev.ctrlKey || ev.metaKey ? "_blank" : "");
+ if (target) {
+ window.open(url, target);
+ } else {
+ window.location.href = url;
+ }
+ return false;
+ }
+ },
+ false
+ );
+ }
+ });
+ }
+
+ // implement previewLinksAuto
+ function previewLinksAuto(deck) {
+ handleLinkClickEvents(deck, deck.getRevealElement());
+ }
+
+ // apply styles
+ function applyGlobalStyles(deck) {
+ if (deck.getConfig()["smaller"] === true) {
+ const revealParent = deck.getRevealElement();
+ revealParent.classList.add("smaller");
+ }
+ }
+
+ // add logo image
+ function addLogoImage(deck) {
+ const revealParent = deck.getRevealElement();
+ const logoImg = document.querySelector(".slide-logo");
+ if (logoImg) {
+ revealParent.appendChild(logoImg);
+ revealParent.classList.add("has-logo");
+ }
+ }
+
+ // add footer text
+ function addFooter(deck) {
+ const revealParent = deck.getRevealElement();
+ const defaultFooterDiv = document.querySelector(".footer-default");
+ if (defaultFooterDiv) {
+ revealParent.appendChild(defaultFooterDiv);
+ handleLinkClickEvents(deck, defaultFooterDiv);
+ if (!isPrintView()) {
+ deck.on("slidechanged", function (ev) {
+ const prevSlideFooter = document.querySelector(
+ ".reveal > .footer:not(.footer-default)"
+ );
+ if (prevSlideFooter) {
+ prevSlideFooter.remove();
+ }
+ const currentSlideFooter = ev.currentSlide.querySelector(".footer");
+ if (currentSlideFooter) {
+ defaultFooterDiv.style.display = "none";
+ const slideFooter = currentSlideFooter.cloneNode(true);
+ handleLinkClickEvents(deck, slideFooter);
+ deck.getRevealElement().appendChild(slideFooter);
+ } else {
+ defaultFooterDiv.style.display = "block";
+ }
+ });
+ }
+ }
+ }
+
+ // add chalkboard buttons
+ function addChalkboardButtons(deck) {
+ const chalkboard = deck.getPlugin("RevealChalkboard");
+ if (chalkboard && !isPrintView()) {
+ const revealParent = deck.getRevealElement();
+ const chalkboardDiv = document.createElement("div");
+ chalkboardDiv.classList.add("slide-chalkboard-buttons");
+ if (document.querySelector(".slide-menu-button")) {
+ chalkboardDiv.classList.add("slide-menu-offset");
+ }
+ // add buttons
+ const buttons = [
+ {
+ icon: "easel2",
+ title: "Toggle Chalkboard (b)",
+ onclick: chalkboard.toggleChalkboard,
+ },
+ {
+ icon: "brush",
+ title: "Toggle Notes Canvas (c)",
+ onclick: chalkboard.toggleNotesCanvas,
+ },
+ ];
+ buttons.forEach(function (button) {
+ const span = document.createElement("span");
+ span.title = button.title;
+ const icon = document.createElement("i");
+ icon.classList.add("fas");
+ icon.classList.add("fa-" + button.icon);
+ span.appendChild(icon);
+ span.onclick = function (event) {
+ event.preventDefault();
+ button.onclick();
+ };
+ chalkboardDiv.appendChild(span);
+ });
+ revealParent.appendChild(chalkboardDiv);
+ const config = deck.getConfig();
+ if (!config.chalkboard.buttons) {
+ chalkboardDiv.classList.add("hidden");
+ }
+
+ // show and hide chalkboard buttons on slidechange
+ deck.on("slidechanged", function (ev) {
+ const config = deck.getConfig();
+ let buttons = !!config.chalkboard.buttons;
+ const slideButtons = ev.currentSlide.getAttribute(
+ "data-chalkboard-buttons"
+ );
+ if (slideButtons) {
+ if (slideButtons === "true" || slideButtons === "1") {
+ buttons = true;
+ } else if (slideButtons === "false" || slideButtons === "0") {
+ buttons = false;
+ }
+ }
+ if (buttons) {
+ chalkboardDiv.classList.remove("hidden");
+ } else {
+ chalkboardDiv.classList.add("hidden");
+ }
+ });
+ }
+ }
+
+ function handleTabbyClicks() {
+ const tabs = document.querySelectorAll(".panel-tabset-tabby > li > a");
+ for (let i = 0; i < tabs.length; i++) {
+ const tab = tabs[i];
+ tab.onclick = function (ev) {
+ ev.preventDefault();
+ ev.stopPropagation();
+ return false;
+ };
+ }
+ }
+
+ function fixupForPrint(deck) {
+ if (isPrintView()) {
+ const slides = deck.getSlides();
+ slides.forEach(function (slide) {
+ slide.removeAttribute("data-auto-animate");
+ });
+ window.document.querySelectorAll(".hljs").forEach(function (el) {
+ el.classList.remove("hljs");
+ });
+ window.document.querySelectorAll(".hljs-ln-code").forEach(function (el) {
+ el.classList.remove("hljs-ln-code");
+ });
+ }
+ }
+
+ function handleSlideChanges(deck) {
+ // dispatch for htmlwidgets
+ const fireSlideEnter = () => {
+ const event = window.document.createEvent("Event");
+ event.initEvent("slideenter", true, true);
+ window.document.dispatchEvent(event);
+ };
+
+ const fireSlideChanged = (previousSlide, currentSlide) => {
+ fireSlideEnter();
+
+ // dispatch for shiny
+ if (window.jQuery) {
+ if (previousSlide) {
+ window.jQuery(previousSlide).trigger("hidden");
+ }
+ if (currentSlide) {
+ window.jQuery(currentSlide).trigger("shown");
+ }
+ }
+ };
+
+ // fire slideEnter for tabby tab activations (for htmlwidget resize behavior)
+ document.addEventListener("tabby", fireSlideEnter, false);
+
+ deck.on("slidechanged", function (event) {
+ fireSlideChanged(event.previousSlide, event.currentSlide);
+ });
+ }
+
+ function workaroundMermaidDistance(deck) {
+ if (window.document.querySelector("pre.mermaid-js")) {
+ const slideCount = deck.getTotalSlides();
+ deck.configure({
+ mobileViewDistance: slideCount,
+ viewDistance: slideCount,
+ });
+ }
+ }
+
+ return {
+ id: "quarto-support",
+ init: function (deck) {
+ controlsAuto(deck);
+ previewLinksAuto(deck);
+ fixupForPrint(deck);
+ applyGlobalStyles(deck);
+ addLogoImage(deck);
+ addFooter(deck);
+ addChalkboardButtons(deck);
+ handleTabbyClicks();
+ handleSlideChanges(deck);
+ workaroundMermaidDistance(deck);
+ },
+ };
+};
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/README.md b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/README.md
new file mode 100644
index 0000000..7391a00
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/README.md
@@ -0,0 +1,160 @@
+# Chalkboard
+
+With this plugin you can add a chalkboard to reveal.js. The plugin provides two possibilities to include handwritten notes to your presentation:
+
+- you can make notes directly on the slides, e.g. to comment on certain aspects,
+- you can open a chalkboard or whiteboard on which you can make notes.
+
+The main use case in mind when implementing the plugin is classroom usage in which you may want to explain some course content and quickly need to make some notes.
+
+The plugin records all drawings made so that they can be play backed using the `autoSlide` feature or the `audio-slideshow` plugin.
+
+[Check out the live demo](https://rajgoel.github.io/reveal.js-demos/chalkboard-demo.html)
+
+The chalkboard effect is based on [Chalkboard](https://github.com/mmoustafa/Chalkboard) by Mohamed Moustafa.
+
+## Installation
+
+Copy the file `plugin.js` and the `img` directory into the plugin folder of your reveal.js presentation, i.e. `plugin/chalkboard` and load the plugin as shown below.
+
+```html
+
+
+
+
+```
+
+The following stylesheet
+```html
+
+
+```
+has to be included to the `head` section of you HTML-file.
+
+
+In order to include buttons for opening and closing the notes canvas or the chalkboard you should make sure that `font-awesome` is available. The easiest way is to include
+```
+
+```
+to the ```head``` section of you HTML-file.
+
+## Usage
+
+### Mouse or touch
+- Click on the pen symbols at the bottom left to toggle the notes canvas or chalkboard
+- Click on the color picker at the left to change the color (the color picker is only visible if the notes canvas or chalkboard is active)
+- Click on the up/down arrows on the left to the switch among multiple chalkboardd (the up/down arrows are only available for the chlakboard)
+- Click the left mouse button and drag to write on notes canvas or chalkboard
+- Click the right mouse button and drag to wipe away previous drawings
+- Touch and move to write on notes canvas or chalkboard
+- Touch and hold for half a second, then move to wipe away previous drawings
+
+### Keyboard
+- Press the 'BACKSPACE' key to delete all chalkboard drawings
+- Press the 'DEL' key to clear the notes canvas or chalkboard
+- Press the 'c' key to toggle the notes canvas
+- Press the 'b' key to toggle the chalkboard
+- Press the 'd' key to download drawings
+- Press the 'x' key to cycle colors forward
+- Press the 'y' key to cycle colors backward
+
+## Playback
+
+If the `autoSlide` feature is set or if the `audio-slideshow` plugin is used, pre-recorded chalkboard drawings can be played. The slideshow plays back the user interaction with the chalkboard in the same way as it was conducted when recording the data.
+
+## Multiplexing
+
+The plugin supports multiplexing via the [`multiplex` plugin](https://github.com/reveal/multiplex) or the [`seminar` plugin](https://github.com/rajgoel/reveal.js-plugins/tree/master/seminar).
+
+## PDF-Export
+
+If the slideshow is opened in [print mode](https://revealjs.com/pdf-export/), the chalkboard drawings in the session storage (see `storage` option - print version must be opened in the same tab or window as the original slideshow) or provided in a file (see `src` option) are included in the PDF-file. Each drawing on the chalkboard is added after the slide that was shown when opening the chalkboard. Drawings on the notes canvas are not included in the PDF-file.
+
+
+## Configuration
+
+The plugin has several configuration options:
+
+- ```boardmarkerWidth```: an integer, the drawing width of the boardmarker; larger values draw thicker lines.
+- ```chalkWidth```: an integer, the drawing width of the chalk; larger values draw thicker lines.
+- ```chalkEffect```: a float in the range ```[0.0, 1.0]```, the intesity of the chalk effect on the chalk board. Full effect (default) ```1.0```, no effect ```0.0```.
+- ```storage```: Optional variable name for session storage of drawings.
+- ```src```: Optional filename for pre-recorded drawings.
+- ```readOnly```: Configuation option allowing to prevent changes to existing drawings. If set to ```true``` no changes can be made, if set to false ```false``` changes can be made, if unset or set to ```undefined``` no changes to the drawings can be made after returning to a slide or fragment for which drawings had been recorded before. In any case the recorded drawings for a slide or fragment can be cleared by pressing the 'DEL' key (i.e. by using the ```RevealChalkboard.clear()``` function).
+- ```transition```: Gives the duration (in milliseconds) of the transition for a slide change, so that the notes canvas is drawn after the transition is completed.
+- ```theme```: Can be set to either ```"chalkboard"``` or ```"whiteboard"```.
+
+The following configuration options allow to change the appearance of the notes canvas and the chalkboard. All of these options require two values, the first gives the value for the notes canvas, the second for the chalkboard.
+
+- ```background```: The first value expects a (semi-)transparent color which is used to provide visual feedback that the notes canvas is enabled, the second value expects a filename to a background image for the chalkboard.
+- ```grid```: By default whiteboard and chalkboard themes include a grid pattern on the background. This pattern can be modified by setting the color, the distance between lines, and the line width, e.g. ```{ color: 'rgb(127,127,255,0.1)', distance: 40, width: 2}```. Alternatively, the grid can be removed by setting the value to ```false```.
+- ```eraser```: An image path and radius for the eraser.
+- ```boardmarkers```: A list of boardmarkers with given color and cursor.
+- ```chalks```: A list of chalks with given color and cursor.
+- ```rememberColor```: Whether to remember the last selected color for the slide canvas or the board.
+
+All of the configurations are optional and the default values shown below are used if the options are not provided.
+
+```javascript
+Reveal.initialize({
+ // ...
+ chalkboard: {
+ boardmarkerWidth: 3,
+ chalkWidth: 7,
+ chalkEffect: 1.0,
+ storage: null,
+ src: null,
+ readOnly: undefined,
+ transition: 800,
+ theme: "chalkboard",
+ background: [ 'rgba(127,127,127,.1)' , path + 'img/blackboard.png' ],
+ grid: { color: 'rgb(50,50,10,0.5)', distance: 80, width: 2},
+ eraser: { src: path + 'img/sponge.png', radius: 20},
+ boardmarkers : [
+ { color: 'rgba(100,100,100,1)', cursor: 'url(' + path + 'img/boardmarker-black.png), auto'},
+ { color: 'rgba(30,144,255, 1)', cursor: 'url(' + path + 'img/boardmarker-blue.png), auto'},
+ { color: 'rgba(220,20,60,1)', cursor: 'url(' + path + 'img/boardmarker-red.png), auto'},
+ { color: 'rgba(50,205,50,1)', cursor: 'url(' + path + 'img/boardmarker-green.png), auto'},
+ { color: 'rgba(255,140,0,1)', cursor: 'url(' + path + 'img/boardmarker-orange.png), auto'},
+ { color: 'rgba(150,0,20150,1)', cursor: 'url(' + path + 'img/boardmarker-purple.png), auto'},
+ { color: 'rgba(255,220,0,1)', cursor: 'url(' + path + 'img/boardmarker-yellow.png), auto'}
+ ],
+ chalks: [
+ { color: 'rgba(255,255,255,0.5)', cursor: 'url(' + path + 'img/chalk-white.png), auto'},
+ { color: 'rgba(96, 154, 244, 0.5)', cursor: 'url(' + path + 'img/chalk-blue.png), auto'},
+ { color: 'rgba(237, 20, 28, 0.5)', cursor: 'url(' + path + 'img/chalk-red.png), auto'},
+ { color: 'rgba(20, 237, 28, 0.5)', cursor: 'url(' + path + 'img/chalk-green.png), auto'},
+ { color: 'rgba(220, 133, 41, 0.5)', cursor: 'url(' + path + 'img/chalk-orange.png), auto'},
+ { color: 'rgba(220,0,220,0.5)', cursor: 'url(' + path + 'img/chalk-purple.png), auto'},
+ { color: 'rgba(255,220,0,0.5)', cursor: 'url(' + path + 'img/chalk-yellow.png), auto'}
+ ]
+ },
+ customcontrols: {
+ controls: [
+ { icon: '',
+ title: 'Toggle chalkboard (B)',
+ action: 'RevealChalkboard.toggleChalkboard();'
+ },
+ { icon: '',
+ title: 'Toggle notes canvas (C)',
+ action: 'RevealChalkboard.toggleNotesCanvas();'
+ }
+ ]
+ },
+ // ...
+
+});
+```
+
+
+## License
+
+MIT licensed
+
+Copyright (C) 2021 Asvin Goel
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/LICENSE.txt b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/LICENSE.txt
new file mode 100644
index 0000000..28c1c4b
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/LICENSE.txt
@@ -0,0 +1,34 @@
+Font Awesome Free License
+-------------------------
+
+Font Awesome Free is free, open source, and GPL friendly. You can use it for
+commercial projects, open source projects, or really almost whatever you want.
+Full Font Awesome Free license: https://fontawesome.com/license.
+
+# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/)
+In the Font Awesome Free download, the CC BY 4.0 license applies to all icons
+packaged as SVG and JS file types.
+
+# Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL)
+In the Font Awesome Free download, the SIL OLF license applies to all icons
+packaged as web and desktop font files.
+
+# Code: MIT License (https://opensource.org/licenses/MIT)
+In the Font Awesome Free download, the MIT license applies to all non-font and
+non-icon files.
+
+# Attribution
+Attribution is required by MIT, SIL OLF, and CC BY licenses. Downloaded Font
+Awesome Free files already contain embedded comments with sufficient
+attribution, so you shouldn't need to do anything additional when using these
+files normally.
+
+We've kept attribution comments terse, so we ask that you do not actively work
+to remove them from files, especially code. They're a great way for folks to
+learn about Font Awesome.
+
+# Brand Icons
+All brand icons are trademarks of their respective owners. The use of these
+trademarks does not indicate endorsement of the trademark holder by Font
+Awesome, nor vice versa. **Please do not use brand logos for any purpose except
+to represent the company, product, or service to which they refer.**
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/all.css b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/all.css
new file mode 100644
index 0000000..7fec2e3
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/all.css
@@ -0,0 +1,5 @@
+/*!
+ * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:a 2s infinite linear}.fa-pulse{animation:a 1s infinite steps(8)}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-open:before{content:"\f518"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-concierge-bell:before{content:"\f562"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-diagnoses:before{content:"\f470"}.fa-dice:before{content:"\f522"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-old-republic:before{content:"\f510"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-r-project:before{content:"\f4f7"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skull:before{content:"\f54c"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toolbox:before{content:"\f552"}.fa-tooth:before{content:"\f5c9"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-moving:before{content:"\f4df"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}
\ No newline at end of file
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/brands.css b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/brands.css
new file mode 100644
index 0000000..2d9e4c6
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/brands.css
@@ -0,0 +1,5 @@
+/*!
+ * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}
\ No newline at end of file
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/fontawesome.css b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/fontawesome.css
new file mode 100644
index 0000000..68b26ef
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/fontawesome.css
@@ -0,0 +1,5 @@
+/*!
+ * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:a 2s infinite linear}.fa-pulse{animation:a 1s infinite steps(8)}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-open:before{content:"\f518"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-concierge-bell:before{content:"\f562"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-diagnoses:before{content:"\f470"}.fa-dice:before{content:"\f522"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-old-republic:before{content:"\f510"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-r-project:before{content:"\f4f7"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skull:before{content:"\f54c"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toolbox:before{content:"\f552"}.fa-tooth:before{content:"\f5c9"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-moving:before{content:"\f4df"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}
\ No newline at end of file
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/regular.css b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/regular.css
new file mode 100644
index 0000000..02b22fa
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/regular.css
@@ -0,0 +1,5 @@
+/*!
+ * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:"Font Awesome 5 Free";font-weight:400}
\ No newline at end of file
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/solid.css b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/solid.css
new file mode 100644
index 0000000..aed56a2
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/solid.css
@@ -0,0 +1,5 @@
+/*!
+ * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900}
\ No newline at end of file
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/svg-with-js.css b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/svg-with-js.css
new file mode 100644
index 0000000..504203d
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/svg-with-js.css
@@ -0,0 +1,5 @@
+/*!
+ * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+.svg-inline--fa,svg:not(:root).svg-inline--fa{overflow:visible}.svg-inline--fa{display:inline-block;font-size:inherit;height:1em;vertical-align:-.125em}.svg-inline--fa.fa-lg{vertical-align:-.225em}.svg-inline--fa.fa-w-1{width:.0625em}.svg-inline--fa.fa-w-2{width:.125em}.svg-inline--fa.fa-w-3{width:.1875em}.svg-inline--fa.fa-w-4{width:.25em}.svg-inline--fa.fa-w-5{width:.3125em}.svg-inline--fa.fa-w-6{width:.375em}.svg-inline--fa.fa-w-7{width:.4375em}.svg-inline--fa.fa-w-8{width:.5em}.svg-inline--fa.fa-w-9{width:.5625em}.svg-inline--fa.fa-w-10{width:.625em}.svg-inline--fa.fa-w-11{width:.6875em}.svg-inline--fa.fa-w-12{width:.75em}.svg-inline--fa.fa-w-13{width:.8125em}.svg-inline--fa.fa-w-14{width:.875em}.svg-inline--fa.fa-w-15{width:.9375em}.svg-inline--fa.fa-w-16{width:1em}.svg-inline--fa.fa-w-17{width:1.0625em}.svg-inline--fa.fa-w-18{width:1.125em}.svg-inline--fa.fa-w-19{width:1.1875em}.svg-inline--fa.fa-w-20{width:1.25em}.svg-inline--fa.fa-pull-left{margin-right:.3em;width:auto}.svg-inline--fa.fa-pull-right{margin-left:.3em;width:auto}.svg-inline--fa.fa-border{height:1.5em}.svg-inline--fa.fa-li{width:2em}.svg-inline--fa.fa-fw{width:1.25em}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-.125em;width:1em}.fa-layers svg.svg-inline--fa{transform-origin:center center}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers-text{left:50%;top:50%;transform:translate(-50%,-50%);transform-origin:center center}.fa-layers-counter{background-color:#ff253a;border-radius:1em;box-sizing:border-box;color:#fff;height:1.5em;line-height:1;max-width:5em;min-width:1.5em;overflow:hidden;padding:.25em;right:0;text-overflow:ellipsis;top:0;transform:scale(.25);transform-origin:top right}.fa-layers-bottom-right{bottom:0;right:0;top:auto;transform:scale(.25);transform-origin:bottom right}.fa-layers-bottom-left{bottom:0;left:0;right:auto;top:auto;transform:scale(.25);transform-origin:bottom left}.fa-layers-top-right{right:0;top:0;transform:scale(.25);transform-origin:top right}.fa-layers-top-left{left:0;right:auto;top:0;transform:scale(.25);transform-origin:top left}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:a 2s infinite linear}.fa-pulse{animation:a 1s infinite steps(8)}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;position:relative;width:2em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.svg-inline--fa.fa-stack-1x{height:1em;width:1em}.svg-inline--fa.fa-stack-2x{height:2em;width:2em}.fa-inverse{color:#fff}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}
\ No newline at end of file
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/v4-shims.css b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/v4-shims.css
new file mode 100644
index 0000000..b10f655
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/v4-shims.css
@@ -0,0 +1,2170 @@
+/*!
+ * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+.fa.fa-glass:before {
+ content: "\f000"; }
+
+.fa.fa-meetup {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-star-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-star-o:before {
+ content: "\f005"; }
+
+.fa.fa-remove:before {
+ content: "\f00d"; }
+
+.fa.fa-close:before {
+ content: "\f00d"; }
+
+.fa.fa-gear:before {
+ content: "\f013"; }
+
+.fa.fa-trash-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-trash-o:before {
+ content: "\f2ed"; }
+
+.fa.fa-file-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-file-o:before {
+ content: "\f15b"; }
+
+.fa.fa-clock-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-clock-o:before {
+ content: "\f017"; }
+
+.fa.fa-arrow-circle-o-down {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-arrow-circle-o-down:before {
+ content: "\f358"; }
+
+.fa.fa-arrow-circle-o-up {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-arrow-circle-o-up:before {
+ content: "\f35b"; }
+
+.fa.fa-play-circle-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-play-circle-o:before {
+ content: "\f144"; }
+
+.fa.fa-repeat:before {
+ content: "\f01e"; }
+
+.fa.fa-rotate-right:before {
+ content: "\f01e"; }
+
+.fa.fa-refresh:before {
+ content: "\f021"; }
+
+.fa.fa-list-alt {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-dedent:before {
+ content: "\f03b"; }
+
+.fa.fa-video-camera:before {
+ content: "\f03d"; }
+
+.fa.fa-picture-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-picture-o:before {
+ content: "\f03e"; }
+
+.fa.fa-photo {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-photo:before {
+ content: "\f03e"; }
+
+.fa.fa-image {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-image:before {
+ content: "\f03e"; }
+
+.fa.fa-pencil:before {
+ content: "\f303"; }
+
+.fa.fa-map-marker:before {
+ content: "\f3c5"; }
+
+.fa.fa-pencil-square-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-pencil-square-o:before {
+ content: "\f044"; }
+
+.fa.fa-share-square-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-share-square-o:before {
+ content: "\f14d"; }
+
+.fa.fa-check-square-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-check-square-o:before {
+ content: "\f14a"; }
+
+.fa.fa-arrows:before {
+ content: "\f0b2"; }
+
+.fa.fa-times-circle-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-times-circle-o:before {
+ content: "\f057"; }
+
+.fa.fa-check-circle-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-check-circle-o:before {
+ content: "\f058"; }
+
+.fa.fa-mail-forward:before {
+ content: "\f064"; }
+
+.fa.fa-eye {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-eye-slash {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-warning:before {
+ content: "\f071"; }
+
+.fa.fa-calendar:before {
+ content: "\f073"; }
+
+.fa.fa-arrows-v:before {
+ content: "\f338"; }
+
+.fa.fa-arrows-h:before {
+ content: "\f337"; }
+
+.fa.fa-bar-chart {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-bar-chart:before {
+ content: "\f080"; }
+
+.fa.fa-bar-chart-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-bar-chart-o:before {
+ content: "\f080"; }
+
+.fa.fa-twitter-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-facebook-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-gears:before {
+ content: "\f085"; }
+
+.fa.fa-thumbs-o-up {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-thumbs-o-up:before {
+ content: "\f164"; }
+
+.fa.fa-thumbs-o-down {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-thumbs-o-down:before {
+ content: "\f165"; }
+
+.fa.fa-heart-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-heart-o:before {
+ content: "\f004"; }
+
+.fa.fa-sign-out:before {
+ content: "\f2f5"; }
+
+.fa.fa-linkedin-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-linkedin-square:before {
+ content: "\f08c"; }
+
+.fa.fa-thumb-tack:before {
+ content: "\f08d"; }
+
+.fa.fa-external-link:before {
+ content: "\f35d"; }
+
+.fa.fa-sign-in:before {
+ content: "\f2f6"; }
+
+.fa.fa-github-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-lemon-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-lemon-o:before {
+ content: "\f094"; }
+
+.fa.fa-square-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-square-o:before {
+ content: "\f0c8"; }
+
+.fa.fa-bookmark-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-bookmark-o:before {
+ content: "\f02e"; }
+
+.fa.fa-twitter {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-facebook {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-facebook:before {
+ content: "\f39e"; }
+
+.fa.fa-facebook-f {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-facebook-f:before {
+ content: "\f39e"; }
+
+.fa.fa-github {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-credit-card {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-feed:before {
+ content: "\f09e"; }
+
+.fa.fa-hdd-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-hdd-o:before {
+ content: "\f0a0"; }
+
+.fa.fa-hand-o-right {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-o-right:before {
+ content: "\f0a4"; }
+
+.fa.fa-hand-o-left {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-o-left:before {
+ content: "\f0a5"; }
+
+.fa.fa-hand-o-up {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-o-up:before {
+ content: "\f0a6"; }
+
+.fa.fa-hand-o-down {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-o-down:before {
+ content: "\f0a7"; }
+
+.fa.fa-arrows-alt:before {
+ content: "\f31e"; }
+
+.fa.fa-group:before {
+ content: "\f0c0"; }
+
+.fa.fa-chain:before {
+ content: "\f0c1"; }
+
+.fa.fa-scissors:before {
+ content: "\f0c4"; }
+
+.fa.fa-files-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-files-o:before {
+ content: "\f0c5"; }
+
+.fa.fa-floppy-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-floppy-o:before {
+ content: "\f0c7"; }
+
+.fa.fa-navicon:before {
+ content: "\f0c9"; }
+
+.fa.fa-reorder:before {
+ content: "\f0c9"; }
+
+.fa.fa-pinterest {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-pinterest-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-google-plus-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-google-plus {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-google-plus:before {
+ content: "\f0d5"; }
+
+.fa.fa-money {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-money:before {
+ content: "\f3d1"; }
+
+.fa.fa-unsorted:before {
+ content: "\f0dc"; }
+
+.fa.fa-sort-desc:before {
+ content: "\f0dd"; }
+
+.fa.fa-sort-asc:before {
+ content: "\f0de"; }
+
+.fa.fa-linkedin {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-linkedin:before {
+ content: "\f0e1"; }
+
+.fa.fa-rotate-left:before {
+ content: "\f0e2"; }
+
+.fa.fa-legal:before {
+ content: "\f0e3"; }
+
+.fa.fa-tachometer:before {
+ content: "\f3fd"; }
+
+.fa.fa-dashboard:before {
+ content: "\f3fd"; }
+
+.fa.fa-comment-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-comment-o:before {
+ content: "\f075"; }
+
+.fa.fa-comments-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-comments-o:before {
+ content: "\f086"; }
+
+.fa.fa-flash:before {
+ content: "\f0e7"; }
+
+.fa.fa-clipboard {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-paste {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-paste:before {
+ content: "\f328"; }
+
+.fa.fa-lightbulb-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-lightbulb-o:before {
+ content: "\f0eb"; }
+
+.fa.fa-exchange:before {
+ content: "\f362"; }
+
+.fa.fa-cloud-download:before {
+ content: "\f381"; }
+
+.fa.fa-cloud-upload:before {
+ content: "\f382"; }
+
+.fa.fa-bell-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-bell-o:before {
+ content: "\f0f3"; }
+
+.fa.fa-cutlery:before {
+ content: "\f2e7"; }
+
+.fa.fa-file-text-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-file-text-o:before {
+ content: "\f15c"; }
+
+.fa.fa-building-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-building-o:before {
+ content: "\f1ad"; }
+
+.fa.fa-hospital-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-hospital-o:before {
+ content: "\f0f8"; }
+
+.fa.fa-tablet:before {
+ content: "\f3fa"; }
+
+.fa.fa-mobile:before {
+ content: "\f3cd"; }
+
+.fa.fa-mobile-phone:before {
+ content: "\f3cd"; }
+
+.fa.fa-circle-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-circle-o:before {
+ content: "\f111"; }
+
+.fa.fa-mail-reply:before {
+ content: "\f3e5"; }
+
+.fa.fa-github-alt {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-folder-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-folder-o:before {
+ content: "\f07b"; }
+
+.fa.fa-folder-open-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-folder-open-o:before {
+ content: "\f07c"; }
+
+.fa.fa-smile-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-smile-o:before {
+ content: "\f118"; }
+
+.fa.fa-frown-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-frown-o:before {
+ content: "\f119"; }
+
+.fa.fa-meh-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-meh-o:before {
+ content: "\f11a"; }
+
+.fa.fa-keyboard-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-keyboard-o:before {
+ content: "\f11c"; }
+
+.fa.fa-flag-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-flag-o:before {
+ content: "\f024"; }
+
+.fa.fa-mail-reply-all:before {
+ content: "\f122"; }
+
+.fa.fa-star-half-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-star-half-o:before {
+ content: "\f089"; }
+
+.fa.fa-star-half-empty {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-star-half-empty:before {
+ content: "\f089"; }
+
+.fa.fa-star-half-full {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-star-half-full:before {
+ content: "\f089"; }
+
+.fa.fa-code-fork:before {
+ content: "\f126"; }
+
+.fa.fa-chain-broken:before {
+ content: "\f127"; }
+
+.fa.fa-shield:before {
+ content: "\f3ed"; }
+
+.fa.fa-calendar-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-calendar-o:before {
+ content: "\f133"; }
+
+.fa.fa-maxcdn {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-html5 {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-css3 {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-ticket:before {
+ content: "\f3ff"; }
+
+.fa.fa-minus-square-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-minus-square-o:before {
+ content: "\f146"; }
+
+.fa.fa-level-up:before {
+ content: "\f3bf"; }
+
+.fa.fa-level-down:before {
+ content: "\f3be"; }
+
+.fa.fa-pencil-square:before {
+ content: "\f14b"; }
+
+.fa.fa-external-link-square:before {
+ content: "\f360"; }
+
+.fa.fa-compass {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-caret-square-o-down {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-caret-square-o-down:before {
+ content: "\f150"; }
+
+.fa.fa-toggle-down {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-toggle-down:before {
+ content: "\f150"; }
+
+.fa.fa-caret-square-o-up {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-caret-square-o-up:before {
+ content: "\f151"; }
+
+.fa.fa-toggle-up {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-toggle-up:before {
+ content: "\f151"; }
+
+.fa.fa-caret-square-o-right {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-caret-square-o-right:before {
+ content: "\f152"; }
+
+.fa.fa-toggle-right {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-toggle-right:before {
+ content: "\f152"; }
+
+.fa.fa-eur:before {
+ content: "\f153"; }
+
+.fa.fa-euro:before {
+ content: "\f153"; }
+
+.fa.fa-gbp:before {
+ content: "\f154"; }
+
+.fa.fa-usd:before {
+ content: "\f155"; }
+
+.fa.fa-dollar:before {
+ content: "\f155"; }
+
+.fa.fa-inr:before {
+ content: "\f156"; }
+
+.fa.fa-rupee:before {
+ content: "\f156"; }
+
+.fa.fa-jpy:before {
+ content: "\f157"; }
+
+.fa.fa-cny:before {
+ content: "\f157"; }
+
+.fa.fa-rmb:before {
+ content: "\f157"; }
+
+.fa.fa-yen:before {
+ content: "\f157"; }
+
+.fa.fa-rub:before {
+ content: "\f158"; }
+
+.fa.fa-ruble:before {
+ content: "\f158"; }
+
+.fa.fa-rouble:before {
+ content: "\f158"; }
+
+.fa.fa-krw:before {
+ content: "\f159"; }
+
+.fa.fa-won:before {
+ content: "\f159"; }
+
+.fa.fa-btc {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-bitcoin {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-bitcoin:before {
+ content: "\f15a"; }
+
+.fa.fa-file-text:before {
+ content: "\f15c"; }
+
+.fa.fa-sort-alpha-asc:before {
+ content: "\f15d"; }
+
+.fa.fa-sort-alpha-desc:before {
+ content: "\f15e"; }
+
+.fa.fa-sort-amount-asc:before {
+ content: "\f160"; }
+
+.fa.fa-sort-amount-desc:before {
+ content: "\f161"; }
+
+.fa.fa-sort-numeric-asc:before {
+ content: "\f162"; }
+
+.fa.fa-sort-numeric-desc:before {
+ content: "\f163"; }
+
+.fa.fa-youtube-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-youtube {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-xing {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-xing-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-youtube-play {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-youtube-play:before {
+ content: "\f167"; }
+
+.fa.fa-dropbox {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-stack-overflow {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-instagram {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-flickr {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-adn {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-bitbucket {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-bitbucket-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-bitbucket-square:before {
+ content: "\f171"; }
+
+.fa.fa-tumblr {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-tumblr-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-long-arrow-down:before {
+ content: "\f309"; }
+
+.fa.fa-long-arrow-up:before {
+ content: "\f30c"; }
+
+.fa.fa-long-arrow-left:before {
+ content: "\f30a"; }
+
+.fa.fa-long-arrow-right:before {
+ content: "\f30b"; }
+
+.fa.fa-apple {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-windows {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-android {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-linux {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-dribbble {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-skype {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-foursquare {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-trello {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-gratipay {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-gittip {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-gittip:before {
+ content: "\f184"; }
+
+.fa.fa-sun-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-sun-o:before {
+ content: "\f185"; }
+
+.fa.fa-moon-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-moon-o:before {
+ content: "\f186"; }
+
+.fa.fa-vk {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-weibo {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-renren {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-pagelines {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-stack-exchange {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-arrow-circle-o-right {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-arrow-circle-o-right:before {
+ content: "\f35a"; }
+
+.fa.fa-arrow-circle-o-left {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-arrow-circle-o-left:before {
+ content: "\f359"; }
+
+.fa.fa-caret-square-o-left {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-caret-square-o-left:before {
+ content: "\f191"; }
+
+.fa.fa-toggle-left {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-toggle-left:before {
+ content: "\f191"; }
+
+.fa.fa-dot-circle-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-dot-circle-o:before {
+ content: "\f192"; }
+
+.fa.fa-vimeo-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-try:before {
+ content: "\f195"; }
+
+.fa.fa-turkish-lira:before {
+ content: "\f195"; }
+
+.fa.fa-plus-square-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-plus-square-o:before {
+ content: "\f0fe"; }
+
+.fa.fa-slack {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-wordpress {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-openid {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-institution:before {
+ content: "\f19c"; }
+
+.fa.fa-bank:before {
+ content: "\f19c"; }
+
+.fa.fa-mortar-board:before {
+ content: "\f19d"; }
+
+.fa.fa-yahoo {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-google {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-reddit {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-reddit-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-stumbleupon-circle {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-stumbleupon {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-delicious {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-digg {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-pied-piper-pp {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-pied-piper-alt {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-drupal {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-joomla {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-spoon:before {
+ content: "\f2e5"; }
+
+.fa.fa-behance {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-behance-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-steam {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-steam-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-automobile:before {
+ content: "\f1b9"; }
+
+.fa.fa-cab:before {
+ content: "\f1ba"; }
+
+.fa.fa-envelope-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-envelope-o:before {
+ content: "\f0e0"; }
+
+.fa.fa-deviantart {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-soundcloud {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-file-pdf-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-file-pdf-o:before {
+ content: "\f1c1"; }
+
+.fa.fa-file-word-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-file-word-o:before {
+ content: "\f1c2"; }
+
+.fa.fa-file-excel-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-file-excel-o:before {
+ content: "\f1c3"; }
+
+.fa.fa-file-powerpoint-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-file-powerpoint-o:before {
+ content: "\f1c4"; }
+
+.fa.fa-file-image-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-file-image-o:before {
+ content: "\f1c5"; }
+
+.fa.fa-file-photo-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-file-photo-o:before {
+ content: "\f1c5"; }
+
+.fa.fa-file-picture-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-file-picture-o:before {
+ content: "\f1c5"; }
+
+.fa.fa-file-archive-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-file-archive-o:before {
+ content: "\f1c6"; }
+
+.fa.fa-file-zip-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-file-zip-o:before {
+ content: "\f1c6"; }
+
+.fa.fa-file-audio-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-file-audio-o:before {
+ content: "\f1c7"; }
+
+.fa.fa-file-sound-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-file-sound-o:before {
+ content: "\f1c7"; }
+
+.fa.fa-file-video-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-file-video-o:before {
+ content: "\f1c8"; }
+
+.fa.fa-file-movie-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-file-movie-o:before {
+ content: "\f1c8"; }
+
+.fa.fa-file-code-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-file-code-o:before {
+ content: "\f1c9"; }
+
+.fa.fa-vine {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-codepen {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-jsfiddle {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-life-ring {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-life-bouy {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-life-bouy:before {
+ content: "\f1cd"; }
+
+.fa.fa-life-buoy {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-life-buoy:before {
+ content: "\f1cd"; }
+
+.fa.fa-life-saver {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-life-saver:before {
+ content: "\f1cd"; }
+
+.fa.fa-support {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-support:before {
+ content: "\f1cd"; }
+
+.fa.fa-circle-o-notch:before {
+ content: "\f1ce"; }
+
+.fa.fa-rebel {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-ra {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-ra:before {
+ content: "\f1d0"; }
+
+.fa.fa-resistance {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-resistance:before {
+ content: "\f1d0"; }
+
+.fa.fa-empire {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-ge {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-ge:before {
+ content: "\f1d1"; }
+
+.fa.fa-git-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-git {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-hacker-news {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-y-combinator-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-y-combinator-square:before {
+ content: "\f1d4"; }
+
+.fa.fa-yc-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-yc-square:before {
+ content: "\f1d4"; }
+
+.fa.fa-tencent-weibo {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-qq {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-weixin {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-wechat {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-wechat:before {
+ content: "\f1d7"; }
+
+.fa.fa-send:before {
+ content: "\f1d8"; }
+
+.fa.fa-paper-plane-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-paper-plane-o:before {
+ content: "\f1d8"; }
+
+.fa.fa-send-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-send-o:before {
+ content: "\f1d8"; }
+
+.fa.fa-circle-thin {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-circle-thin:before {
+ content: "\f111"; }
+
+.fa.fa-header:before {
+ content: "\f1dc"; }
+
+.fa.fa-sliders:before {
+ content: "\f1de"; }
+
+.fa.fa-futbol-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-futbol-o:before {
+ content: "\f1e3"; }
+
+.fa.fa-soccer-ball-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-soccer-ball-o:before {
+ content: "\f1e3"; }
+
+.fa.fa-slideshare {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-twitch {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-yelp {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-newspaper-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-newspaper-o:before {
+ content: "\f1ea"; }
+
+.fa.fa-paypal {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-google-wallet {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-cc-visa {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-cc-mastercard {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-cc-discover {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-cc-amex {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-cc-paypal {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-cc-stripe {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-bell-slash-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-bell-slash-o:before {
+ content: "\f1f6"; }
+
+.fa.fa-trash:before {
+ content: "\f2ed"; }
+
+.fa.fa-copyright {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-eyedropper:before {
+ content: "\f1fb"; }
+
+.fa.fa-area-chart:before {
+ content: "\f1fe"; }
+
+.fa.fa-pie-chart:before {
+ content: "\f200"; }
+
+.fa.fa-line-chart:before {
+ content: "\f201"; }
+
+.fa.fa-lastfm {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-lastfm-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-ioxhost {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-angellist {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-cc {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-cc:before {
+ content: "\f20a"; }
+
+.fa.fa-ils:before {
+ content: "\f20b"; }
+
+.fa.fa-shekel:before {
+ content: "\f20b"; }
+
+.fa.fa-sheqel:before {
+ content: "\f20b"; }
+
+.fa.fa-meanpath {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-meanpath:before {
+ content: "\f2b4"; }
+
+.fa.fa-buysellads {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-connectdevelop {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-dashcube {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-forumbee {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-leanpub {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-sellsy {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-shirtsinbulk {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-simplybuilt {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-skyatlas {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-diamond {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-diamond:before {
+ content: "\f3a5"; }
+
+.fa.fa-intersex:before {
+ content: "\f224"; }
+
+.fa.fa-facebook-official {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-facebook-official:before {
+ content: "\f09a"; }
+
+.fa.fa-pinterest-p {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-whatsapp {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-hotel:before {
+ content: "\f236"; }
+
+.fa.fa-viacoin {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-medium {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-y-combinator {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-yc {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-yc:before {
+ content: "\f23b"; }
+
+.fa.fa-optin-monster {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-opencart {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-expeditedssl {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-battery-4:before {
+ content: "\f240"; }
+
+.fa.fa-battery:before {
+ content: "\f240"; }
+
+.fa.fa-battery-3:before {
+ content: "\f241"; }
+
+.fa.fa-battery-2:before {
+ content: "\f242"; }
+
+.fa.fa-battery-1:before {
+ content: "\f243"; }
+
+.fa.fa-battery-0:before {
+ content: "\f244"; }
+
+.fa.fa-object-group {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-object-ungroup {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-sticky-note-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-sticky-note-o:before {
+ content: "\f249"; }
+
+.fa.fa-cc-jcb {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-cc-diners-club {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-clone {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-hourglass-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-hourglass-o:before {
+ content: "\f254"; }
+
+.fa.fa-hourglass-1:before {
+ content: "\f251"; }
+
+.fa.fa-hourglass-2:before {
+ content: "\f252"; }
+
+.fa.fa-hourglass-3:before {
+ content: "\f253"; }
+
+.fa.fa-hand-rock-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-rock-o:before {
+ content: "\f255"; }
+
+.fa.fa-hand-grab-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-grab-o:before {
+ content: "\f255"; }
+
+.fa.fa-hand-paper-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-paper-o:before {
+ content: "\f256"; }
+
+.fa.fa-hand-stop-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-stop-o:before {
+ content: "\f256"; }
+
+.fa.fa-hand-scissors-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-scissors-o:before {
+ content: "\f257"; }
+
+.fa.fa-hand-lizard-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-lizard-o:before {
+ content: "\f258"; }
+
+.fa.fa-hand-spock-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-spock-o:before {
+ content: "\f259"; }
+
+.fa.fa-hand-pointer-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-pointer-o:before {
+ content: "\f25a"; }
+
+.fa.fa-hand-peace-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-hand-peace-o:before {
+ content: "\f25b"; }
+
+.fa.fa-registered {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-creative-commons {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-gg {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-gg-circle {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-tripadvisor {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-odnoklassniki {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-odnoklassniki-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-get-pocket {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-wikipedia-w {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-safari {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-chrome {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-firefox {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-opera {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-internet-explorer {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-television:before {
+ content: "\f26c"; }
+
+.fa.fa-contao {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-500px {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-amazon {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-calendar-plus-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-calendar-plus-o:before {
+ content: "\f271"; }
+
+.fa.fa-calendar-minus-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-calendar-minus-o:before {
+ content: "\f272"; }
+
+.fa.fa-calendar-times-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-calendar-times-o:before {
+ content: "\f273"; }
+
+.fa.fa-calendar-check-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-calendar-check-o:before {
+ content: "\f274"; }
+
+.fa.fa-map-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-map-o:before {
+ content: "\f279"; }
+
+.fa.fa-commenting {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-commenting:before {
+ content: "\f4ad"; }
+
+.fa.fa-commenting-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-commenting-o:before {
+ content: "\f4ad"; }
+
+.fa.fa-houzz {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-vimeo {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-vimeo:before {
+ content: "\f27d"; }
+
+.fa.fa-black-tie {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-fonticons {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-reddit-alien {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-edge {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-credit-card-alt:before {
+ content: "\f09d"; }
+
+.fa.fa-codiepie {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-modx {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-fort-awesome {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-usb {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-product-hunt {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-mixcloud {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-scribd {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-pause-circle-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-pause-circle-o:before {
+ content: "\f28b"; }
+
+.fa.fa-stop-circle-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-stop-circle-o:before {
+ content: "\f28d"; }
+
+.fa.fa-bluetooth {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-bluetooth-b {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-gitlab {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-wpbeginner {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-wpforms {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-envira {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-wheelchair-alt {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-wheelchair-alt:before {
+ content: "\f368"; }
+
+.fa.fa-question-circle-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-question-circle-o:before {
+ content: "\f059"; }
+
+.fa.fa-volume-control-phone:before {
+ content: "\f2a0"; }
+
+.fa.fa-asl-interpreting:before {
+ content: "\f2a3"; }
+
+.fa.fa-deafness:before {
+ content: "\f2a4"; }
+
+.fa.fa-hard-of-hearing:before {
+ content: "\f2a4"; }
+
+.fa.fa-glide {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-glide-g {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-signing:before {
+ content: "\f2a7"; }
+
+.fa.fa-viadeo {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-viadeo-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-snapchat {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-snapchat-ghost {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-snapchat-square {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-pied-piper {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-first-order {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-yoast {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-themeisle {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-google-plus-official {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-google-plus-official:before {
+ content: "\f2b3"; }
+
+.fa.fa-google-plus-circle {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-google-plus-circle:before {
+ content: "\f2b3"; }
+
+.fa.fa-font-awesome {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-fa {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-fa:before {
+ content: "\f2b4"; }
+
+.fa.fa-handshake-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-handshake-o:before {
+ content: "\f2b5"; }
+
+.fa.fa-envelope-open-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-envelope-open-o:before {
+ content: "\f2b6"; }
+
+.fa.fa-linode {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-address-book-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-address-book-o:before {
+ content: "\f2b9"; }
+
+.fa.fa-vcard:before {
+ content: "\f2bb"; }
+
+.fa.fa-address-card-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-address-card-o:before {
+ content: "\f2bb"; }
+
+.fa.fa-vcard-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-vcard-o:before {
+ content: "\f2bb"; }
+
+.fa.fa-user-circle-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-user-circle-o:before {
+ content: "\f2bd"; }
+
+.fa.fa-user-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-user-o:before {
+ content: "\f007"; }
+
+.fa.fa-id-badge {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-drivers-license:before {
+ content: "\f2c2"; }
+
+.fa.fa-id-card-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-id-card-o:before {
+ content: "\f2c2"; }
+
+.fa.fa-drivers-license-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-drivers-license-o:before {
+ content: "\f2c2"; }
+
+.fa.fa-quora {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-free-code-camp {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-telegram {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-thermometer-4:before {
+ content: "\f2c7"; }
+
+.fa.fa-thermometer:before {
+ content: "\f2c7"; }
+
+.fa.fa-thermometer-3:before {
+ content: "\f2c8"; }
+
+.fa.fa-thermometer-2:before {
+ content: "\f2c9"; }
+
+.fa.fa-thermometer-1:before {
+ content: "\f2ca"; }
+
+.fa.fa-thermometer-0:before {
+ content: "\f2cb"; }
+
+.fa.fa-bathtub:before {
+ content: "\f2cd"; }
+
+.fa.fa-s15:before {
+ content: "\f2cd"; }
+
+.fa.fa-window-maximize {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-window-restore {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-times-rectangle:before {
+ content: "\f410"; }
+
+.fa.fa-window-close-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-window-close-o:before {
+ content: "\f410"; }
+
+.fa.fa-times-rectangle-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-times-rectangle-o:before {
+ content: "\f410"; }
+
+.fa.fa-bandcamp {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-grav {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-etsy {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-imdb {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-ravelry {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-eercast {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-eercast:before {
+ content: "\f2da"; }
+
+.fa.fa-snowflake-o {
+ font-family: 'Font Awesome 5 Free';
+ font-weight: 400; }
+
+.fa.fa-snowflake-o:before {
+ content: "\f2dc"; }
+
+.fa.fa-superpowers {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-wpexplorer {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
+
+.fa.fa-spotify {
+ font-family: 'Font Awesome 5 Brands';
+ font-weight: 400; }
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/v4-shims.min.css b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/v4-shims.min.css
new file mode 100644
index 0000000..a47c8e2
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/v4-shims.min.css
@@ -0,0 +1,5 @@
+/*!
+ * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+.fa.fa-glass:before{content:"\f000"}.fa.fa-meetup{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-star-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-o:before{content:"\f005"}.fa.fa-close:before,.fa.fa-remove:before{content:"\f00d"}.fa.fa-gear:before{content:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-trash-o:before{content:"\f2ed"}.fa.fa-file-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-o:before{content:"\f15b"}.fa.fa-clock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-clock-o:before{content:"\f017"}.fa.fa-arrow-circle-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-down:before{content:"\f358"}.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-up:before{content:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-play-circle-o:before{content:"\f144"}.fa.fa-repeat:before,.fa.fa-rotate-right:before{content:"\f01e"}.fa.fa-refresh:before{content:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dedent:before{content:"\f03b"}.fa.fa-video-camera:before{content:"\f03d"}.fa.fa-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-picture-o:before{content:"\f03e"}.fa.fa-photo{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-photo:before{content:"\f03e"}.fa.fa-image{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-image:before{content:"\f03e"}.fa.fa-pencil:before{content:"\f303"}.fa.fa-map-marker:before{content:"\f3c5"}.fa.fa-pencil-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pencil-square-o:before{content:"\f044"}.fa.fa-share-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-share-square-o:before{content:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-square-o:before{content:"\f14a"}.fa.fa-arrows:before{content:"\f0b2"}.fa.fa-times-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-circle-o:before{content:"\f057"}.fa.fa-check-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-circle-o:before{content:"\f058"}.fa.fa-mail-forward:before{content:"\f064"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-warning:before{content:"\f071"}.fa.fa-calendar:before{content:"\f073"}.fa.fa-arrows-v:before{content:"\f338"}.fa.fa-arrows-h:before{content:"\f337"}.fa.fa-bar-chart{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart:before{content:"\f080"}.fa.fa-bar-chart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart-o:before{content:"\f080"}.fa.fa-facebook-square,.fa.fa-twitter-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gears:before{content:"\f085"}.fa.fa-thumbs-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-up:before{content:"\f164"}.fa.fa-thumbs-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-down:before{content:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-heart-o:before{content:"\f004"}.fa.fa-sign-out:before{content:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin-square:before{content:"\f08c"}.fa.fa-thumb-tack:before{content:"\f08d"}.fa.fa-external-link:before{content:"\f35d"}.fa.fa-sign-in:before{content:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-lemon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lemon-o:before{content:"\f094"}.fa.fa-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-square-o:before{content:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bookmark-o:before{content:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook:before{content:"\f39e"}.fa.fa-facebook-f{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-f:before{content:"\f39e"}.fa.fa-github{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-feed:before{content:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hdd-o:before{content:"\f0a0"}.fa.fa-hand-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-right:before{content:"\f0a4"}.fa.fa-hand-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-left:before{content:"\f0a5"}.fa.fa-hand-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-up:before{content:"\f0a6"}.fa.fa-hand-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-down:before{content:"\f0a7"}.fa.fa-arrows-alt:before{content:"\f31e"}.fa.fa-group:before{content:"\f0c0"}.fa.fa-chain:before{content:"\f0c1"}.fa.fa-scissors:before{content:"\f0c4"}.fa.fa-files-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-files-o:before{content:"\f0c5"}.fa.fa-floppy-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-floppy-o:before{content:"\f0c7"}.fa.fa-navicon:before,.fa.fa-reorder:before{content:"\f0c9"}.fa.fa-google-plus,.fa.fa-google-plus-square,.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus:before{content:"\f0d5"}.fa.fa-money{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-money:before{content:"\f3d1"}.fa.fa-unsorted:before{content:"\f0dc"}.fa.fa-sort-desc:before{content:"\f0dd"}.fa.fa-sort-asc:before{content:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin:before{content:"\f0e1"}.fa.fa-rotate-left:before{content:"\f0e2"}.fa.fa-legal:before{content:"\f0e3"}.fa.fa-dashboard:before,.fa.fa-tachometer:before{content:"\f3fd"}.fa.fa-comment-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comment-o:before{content:"\f075"}.fa.fa-comments-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comments-o:before{content:"\f086"}.fa.fa-flash:before{content:"\f0e7"}.fa.fa-clipboard,.fa.fa-paste{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paste:before{content:"\f328"}.fa.fa-lightbulb-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lightbulb-o:before{content:"\f0eb"}.fa.fa-exchange:before{content:"\f362"}.fa.fa-cloud-download:before{content:"\f381"}.fa.fa-cloud-upload:before{content:"\f382"}.fa.fa-bell-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-o:before{content:"\f0f3"}.fa.fa-cutlery:before{content:"\f2e7"}.fa.fa-file-text-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-text-o:before{content:"\f15c"}.fa.fa-building-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-building-o:before{content:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hospital-o:before{content:"\f0f8"}.fa.fa-tablet:before{content:"\f3fa"}.fa.fa-mobile-phone:before,.fa.fa-mobile:before{content:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-o:before{content:"\f111"}.fa.fa-mail-reply:before{content:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-folder-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-o:before{content:"\f07b"}.fa.fa-folder-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-open-o:before{content:"\f07c"}.fa.fa-smile-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-smile-o:before{content:"\f118"}.fa.fa-frown-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-frown-o:before{content:"\f119"}.fa.fa-meh-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-meh-o:before{content:"\f11a"}.fa.fa-keyboard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-keyboard-o:before{content:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-flag-o:before{content:"\f024"}.fa.fa-mail-reply-all:before{content:"\f122"}.fa.fa-star-half-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-o:before{content:"\f089"}.fa.fa-star-half-empty{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-empty:before{content:"\f089"}.fa.fa-star-half-full{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-full:before{content:"\f089"}.fa.fa-code-fork:before{content:"\f126"}.fa.fa-chain-broken:before{content:"\f127"}.fa.fa-shield:before{content:"\f3ed"}.fa.fa-calendar-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-o:before{content:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ticket:before{content:"\f3ff"}.fa.fa-minus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-minus-square-o:before{content:"\f146"}.fa.fa-level-up:before{content:"\f3bf"}.fa.fa-level-down:before{content:"\f3be"}.fa.fa-pencil-square:before{content:"\f14b"}.fa.fa-external-link-square:before{content:"\f360"}.fa.fa-compass{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down:before{content:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-down:before{content:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-up:before{content:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-up:before{content:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-right:before{content:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-right:before{content:"\f152"}.fa.fa-eur:before,.fa.fa-euro:before{content:"\f153"}.fa.fa-gbp:before{content:"\f154"}.fa.fa-dollar:before,.fa.fa-usd:before{content:"\f155"}.fa.fa-inr:before,.fa.fa-rupee:before{content:"\f156"}.fa.fa-cny:before,.fa.fa-jpy:before,.fa.fa-rmb:before,.fa.fa-yen:before{content:"\f157"}.fa.fa-rouble:before,.fa.fa-rub:before,.fa.fa-ruble:before{content:"\f158"}.fa.fa-krw:before,.fa.fa-won:before{content:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitcoin:before{content:"\f15a"}.fa.fa-file-text:before{content:"\f15c"}.fa.fa-sort-alpha-asc:before{content:"\f15d"}.fa.fa-sort-alpha-desc:before{content:"\f15e"}.fa.fa-sort-amount-asc:before{content:"\f160"}.fa.fa-sort-amount-desc:before{content:"\f161"}.fa.fa-sort-numeric-asc:before{content:"\f162"}.fa.fa-sort-numeric-desc:before{content:"\f163"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube,.fa.fa-youtube-play,.fa.fa-youtube-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-youtube-play:before{content:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitbucket-square:before{content:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-long-arrow-down:before{content:"\f309"}.fa.fa-long-arrow-up:before{content:"\f30c"}.fa.fa-long-arrow-left:before{content:"\f30a"}.fa.fa-long-arrow-right:before{content:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gittip:before{content:"\f184"}.fa.fa-sun-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sun-o:before{content:"\f185"}.fa.fa-moon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-moon-o:before{content:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-right:before{content:"\f35a"}.fa.fa-arrow-circle-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-left:before{content:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-left:before{content:"\f191"}.fa.fa-toggle-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-left:before{content:"\f191"}.fa.fa-dot-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dot-circle-o:before{content:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-try:before,.fa.fa-turkish-lira:before{content:"\f195"}.fa.fa-plus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-plus-square-o:before{content:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bank:before,.fa.fa-institution:before{content:"\f19c"}.fa.fa-mortar-board:before{content:"\f19d"}.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-google,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle,.fa.fa-yahoo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-spoon:before{content:"\f2e5"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-automobile:before{content:"\f1b9"}.fa.fa-cab:before{content:"\f1ba"}.fa.fa-envelope-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-o:before{content:"\f0e0"}.fa.fa-deviantart,.fa.fa-soundcloud{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-file-pdf-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-pdf-o:before{content:"\f1c1"}.fa.fa-file-word-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-word-o:before{content:"\f1c2"}.fa.fa-file-excel-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-excel-o:before{content:"\f1c3"}.fa.fa-file-powerpoint-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-powerpoint-o:before{content:"\f1c4"}.fa.fa-file-image-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-image-o:before{content:"\f1c5"}.fa.fa-file-photo-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-photo-o:before{content:"\f1c5"}.fa.fa-file-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-picture-o:before{content:"\f1c5"}.fa.fa-file-archive-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-archive-o:before{content:"\f1c6"}.fa.fa-file-zip-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-zip-o:before{content:"\f1c6"}.fa.fa-file-audio-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-audio-o:before{content:"\f1c7"}.fa.fa-file-sound-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-sound-o:before{content:"\f1c7"}.fa.fa-file-video-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-video-o:before{content:"\f1c8"}.fa.fa-file-movie-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-movie-o:before{content:"\f1c8"}.fa.fa-file-code-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-code-o:before{content:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-life-bouy,.fa.fa-life-ring{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-bouy:before{content:"\f1cd"}.fa.fa-life-buoy{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-buoy:before{content:"\f1cd"}.fa.fa-life-saver{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-saver:before{content:"\f1cd"}.fa.fa-support{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-support:before{content:"\f1cd"}.fa.fa-circle-o-notch:before{content:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ra:before{content:"\f1d0"}.fa.fa-resistance{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-resistance:before{content:"\f1d0"}.fa.fa-empire,.fa.fa-ge{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ge:before{content:"\f1d1"}.fa.fa-git,.fa.fa-git-square,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-y-combinator-square:before{content:"\f1d4"}.fa.fa-yc-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc-square:before{content:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wechat:before{content:"\f1d7"}.fa.fa-send:before{content:"\f1d8"}.fa.fa-paper-plane-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paper-plane-o:before{content:"\f1d8"}.fa.fa-send-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-send-o:before{content:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-thin:before{content:"\f111"}.fa.fa-header:before{content:"\f1dc"}.fa.fa-sliders:before{content:"\f1de"}.fa.fa-futbol-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-futbol-o:before{content:"\f1e3"}.fa.fa-soccer-ball-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-soccer-ball-o:before{content:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-newspaper-o:before{content:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-slash-o:before{content:"\f1f6"}.fa.fa-trash:before{content:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-eyedropper:before{content:"\f1fb"}.fa.fa-area-chart:before{content:"\f1fe"}.fa.fa-pie-chart:before{content:"\f200"}.fa.fa-line-chart:before{content:"\f201"}.fa.fa-angellist,.fa.fa-ioxhost,.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-cc:before{content:"\f20a"}.fa.fa-ils:before,.fa.fa-shekel:before,.fa.fa-sheqel:before{content:"\f20b"}.fa.fa-meanpath{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-meanpath:before{content:"\f2b4"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-diamond:before{content:"\f3a5"}.fa.fa-intersex:before{content:"\f224"}.fa.fa-facebook-official{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-official:before{content:"\f09a"}.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-hotel:before{content:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc:before{content:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-battery-4:before,.fa.fa-battery:before{content:"\f240"}.fa.fa-battery-3:before{content:"\f241"}.fa.fa-battery-2:before{content:"\f242"}.fa.fa-battery-1:before{content:"\f243"}.fa.fa-battery-0:before{content:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sticky-note-o:before{content:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-clone,.fa.fa-hourglass-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hourglass-o:before{content:"\f254"}.fa.fa-hourglass-1:before{content:"\f251"}.fa.fa-hourglass-2:before{content:"\f252"}.fa.fa-hourglass-3:before{content:"\f253"}.fa.fa-hand-rock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-rock-o:before{content:"\f255"}.fa.fa-hand-grab-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-grab-o:before{content:"\f255"}.fa.fa-hand-paper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-paper-o:before{content:"\f256"}.fa.fa-hand-stop-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-stop-o:before{content:"\f256"}.fa.fa-hand-scissors-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-scissors-o:before{content:"\f257"}.fa.fa-hand-lizard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-lizard-o:before{content:"\f258"}.fa.fa-hand-spock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-spock-o:before{content:"\f259"}.fa.fa-hand-pointer-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-pointer-o:before{content:"\f25a"}.fa.fa-hand-peace-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-peace-o:before{content:"\f25b"}.fa.fa-registered{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-chrome,.fa.fa-creative-commons,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-internet-explorer,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square,.fa.fa-opera,.fa.fa-safari,.fa.fa-tripadvisor,.fa.fa-wikipedia-w{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-television:before{content:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-calendar-plus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-plus-o:before{content:"\f271"}.fa.fa-calendar-minus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-minus-o:before{content:"\f272"}.fa.fa-calendar-times-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-times-o:before{content:"\f273"}.fa.fa-calendar-check-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-check-o:before{content:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-map-o:before{content:"\f279"}.fa.fa-commenting{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-commenting:before{content:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-commenting-o:before{content:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-vimeo:before{content:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card-alt:before{content:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-pause-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pause-circle-o:before{content:"\f28b"}.fa.fa-stop-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-stop-circle-o:before{content:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wheelchair-alt:before{content:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-question-circle-o:before{content:"\f059"}.fa.fa-volume-control-phone:before{content:"\f2a0"}.fa.fa-asl-interpreting:before{content:"\f2a3"}.fa.fa-deafness:before,.fa.fa-hard-of-hearing:before{content:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-signing:before{content:"\f2a7"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-snapchat,.fa.fa-snapchat-ghost,.fa.fa-snapchat-square,.fa.fa-themeisle,.fa.fa-viadeo,.fa.fa-viadeo-square,.fa.fa-yoast{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-official:before{content:"\f2b3"}.fa.fa-google-plus-circle{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-circle:before{content:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-fa:before{content:"\f2b4"}.fa.fa-handshake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-handshake-o:before{content:"\f2b5"}.fa.fa-envelope-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-open-o:before{content:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-book-o:before{content:"\f2b9"}.fa.fa-vcard:before{content:"\f2bb"}.fa.fa-address-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-card-o:before{content:"\f2bb"}.fa.fa-vcard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-vcard-o:before{content:"\f2bb"}.fa.fa-user-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-circle-o:before{content:"\f2bd"}.fa.fa-user-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-o:before{content:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license:before{content:"\f2c2"}.fa.fa-id-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-id-card-o:before{content:"\f2c2"}.fa.fa-drivers-license-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license-o:before{content:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-thermometer-4:before,.fa.fa-thermometer:before{content:"\f2c7"}.fa.fa-thermometer-3:before{content:"\f2c8"}.fa.fa-thermometer-2:before{content:"\f2c9"}.fa.fa-thermometer-1:before{content:"\f2ca"}.fa.fa-thermometer-0:before{content:"\f2cb"}.fa.fa-bathtub:before,.fa.fa-s15:before{content:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle:before{content:"\f410"}.fa.fa-window-close-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-window-close-o:before{content:"\f410"}.fa.fa-times-rectangle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle-o:before{content:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-eercast:before{content:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-snowflake-o:before{content:"\f2dc"}.fa.fa-spotify,.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 5 Brands";font-weight:400}
\ No newline at end of file
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.eot b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.eot
new file mode 100644
index 0000000..f8e4818
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.eot differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.svg b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.svg
new file mode 100644
index 0000000..68eb65a
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.svg
@@ -0,0 +1,1127 @@
+
+
+
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.ttf b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.ttf
new file mode 100644
index 0000000..2b00dae
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.ttf differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.woff b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.woff
new file mode 100644
index 0000000..9e4b7e1
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.woff differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.woff2 b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.woff2
new file mode 100644
index 0000000..b9e58c5
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.woff2 differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.eot b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.eot
new file mode 100644
index 0000000..5217c95
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.eot differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.svg b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.svg
new file mode 100644
index 0000000..5f49543
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.svg
@@ -0,0 +1,467 @@
+
+
+
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.ttf b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.ttf
new file mode 100644
index 0000000..cefbd50
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.ttf differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.woff b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.woff
new file mode 100644
index 0000000..954b059
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.woff differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.woff2 b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.woff2
new file mode 100644
index 0000000..bd35950
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.woff2 differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.eot b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.eot
new file mode 100644
index 0000000..cc691d6
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.eot differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.svg b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.svg
new file mode 100644
index 0000000..1534b64
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.svg
@@ -0,0 +1,2231 @@
+
+
+
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.ttf b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.ttf
new file mode 100644
index 0000000..618136a
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.ttf differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.woff b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.woff
new file mode 100644
index 0000000..af47657
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.woff differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.woff2 b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.woff2
new file mode 100644
index 0000000..9ef566a
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.woff2 differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/blackboard.png b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/blackboard.png
new file mode 100644
index 0000000..50a2f64
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/blackboard.png differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-black.png b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-black.png
new file mode 100644
index 0000000..170b520
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-black.png differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-blue.png b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-blue.png
new file mode 100644
index 0000000..32f3ff8
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-blue.png differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-green.png b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-green.png
new file mode 100644
index 0000000..28a4221
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-green.png differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-orange.png b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-orange.png
new file mode 100644
index 0000000..7e8c2d2
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-orange.png differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-purple.png b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-purple.png
new file mode 100644
index 0000000..637066c
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-purple.png differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-red.png b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-red.png
new file mode 100644
index 0000000..713d6cd
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-red.png differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-yellow.png b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-yellow.png
new file mode 100644
index 0000000..23e87f5
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-yellow.png differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-blue.png b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-blue.png
new file mode 100644
index 0000000..f70c299
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-blue.png differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-green.png b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-green.png
new file mode 100644
index 0000000..39f3b20
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-green.png differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-orange.png b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-orange.png
new file mode 100644
index 0000000..488c847
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-orange.png differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-purple.png b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-purple.png
new file mode 100644
index 0000000..5bd29fb
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-purple.png differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-red.png b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-red.png
new file mode 100644
index 0000000..18d4dc7
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-red.png differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-white.png b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-white.png
new file mode 100644
index 0000000..fed89a3
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-white.png differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-yellow.png b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-yellow.png
new file mode 100644
index 0000000..0186bec
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-yellow.png differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/sponge.png b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/sponge.png
new file mode 100644
index 0000000..cbfb269
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/sponge.png differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/whiteboard.png b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/whiteboard.png
new file mode 100644
index 0000000..dbf570a
Binary files /dev/null and b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/img/whiteboard.png differ
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/plugin.js b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/plugin.js
new file mode 100644
index 0000000..76b736e
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/plugin.js
@@ -0,0 +1,1976 @@
+/*****************************************************************
+ ** Author: Asvin Goel, goel@telematique.eu
+ **
+ ** A plugin for reveal.js adding a chalkboard.
+ **
+ ** Version: 2.1.0
+ **
+ ** License: MIT license (see LICENSE.md)
+ **
+ ** Credits:
+ ** Chalkboard effect by Mohamed Moustafa https://github.com/mmoustafa/Chalkboard
+ ** Multi color support initially added by Kurt Rinnert https://github.com/rinnert
+ ** Compatibility with reveal.js v4 by Hakim El Hattab https://github.com/hakimel
+ ******************************************************************/
+
+window.RevealChalkboard = window.RevealChalkboard || {
+ id: 'RevealChalkboard',
+ init: function ( deck ) {
+ initChalkboard( deck );
+ },
+ configure: function ( config ) {
+ configure( config );
+ },
+ toggleNotesCanvas: function () {
+ toggleNotesCanvas();
+ },
+ toggleChalkboard: function () {
+ toggleChalkboard();
+ },
+ colorIndex: function () {
+ colorIndex();
+ },
+ colorNext: function () {
+ colorNext();
+ },
+ colorPrev: function () {
+ colorPrev();
+ },
+ clear: function () {
+ clear();
+ },
+ reset: function () {
+ reset();
+ },
+ resetAll: function () {
+ resetAll();
+ },
+ updateStorage: function () {
+ updateStorage();
+ },
+ getData: function () {
+ return getData();
+ },
+ download: function () {
+ download();
+ },
+};
+
+function scriptPath() {
+ // obtain plugin path from the script element
+ var src;
+ if ( document.currentScript ) {
+ src = document.currentScript.src;
+ } else {
+ var sel = document.querySelector( 'script[src$="/chalkboard/plugin.js"]' )
+ if ( sel ) {
+ src = sel.src;
+ }
+ }
+ var path = ( src === undefined ) ? "" : src.slice( 0, src.lastIndexOf( "/" ) + 1 );
+//console.log("Path: " + path);
+ return path;
+}
+var path = scriptPath();
+
+const initChalkboard = function ( Reveal ) {
+//console.warn(path);
+ /* Feature detection for passive event handling*/
+ var passiveSupported = false;
+
+ try {
+ window.addEventListener( 'test', null, Object.defineProperty( {}, 'passive', {
+ get: function () {
+ passiveSupported = true;
+ }
+ } ) );
+ } catch ( err ) {}
+
+
+/*****************************************************************
+ ** Configuration
+ ******************************************************************/
+ var background, pen, draw, color;
+ var grid = false;
+ var boardmarkerWidth = 3;
+ var chalkWidth = 7;
+ var chalkEffect = 1.0;
+ var rememberColor = [ true, false ];
+ var eraser = {
+ src: path + 'img/sponge.png',
+ radius: 20
+ };
+ var boardmarkers = [ {
+ color: 'rgba(100,100,100,1)',
+ cursor: 'url(' + path + 'img/boardmarker-black.png), auto'
+ },
+ {
+ color: 'rgba(30,144,255, 1)',
+ cursor: 'url(' + path + 'img/boardmarker-blue.png), auto'
+ },
+ {
+ color: 'rgba(220,20,60,1)',
+ cursor: 'url(' + path + 'img/boardmarker-red.png), auto'
+ },
+ {
+ color: 'rgba(50,205,50,1)',
+ cursor: 'url(' + path + 'img/boardmarker-green.png), auto'
+ },
+ {
+ color: 'rgba(255,140,0,1)',
+ cursor: 'url(' + path + 'img/boardmarker-orange.png), auto'
+ },
+ {
+ color: 'rgba(150,0,20150,1)',
+ cursor: 'url(' + path + 'img/boardmarker-purple.png), auto'
+ },
+ {
+ color: 'rgba(255,220,0,1)',
+ cursor: 'url(' + path + 'img/boardmarker-yellow.png), auto'
+ }
+ ];
+ var chalks = [ {
+ color: 'rgba(255,255,255,0.5)',
+ cursor: 'url(' + path + 'img/chalk-white.png), auto'
+ },
+ {
+ color: 'rgba(96, 154, 244, 0.5)',
+ cursor: 'url(' + path + 'img/chalk-blue.png), auto'
+ },
+ {
+ color: 'rgba(237, 20, 28, 0.5)',
+ cursor: 'url(' + path + 'img/chalk-red.png), auto'
+ },
+ {
+ color: 'rgba(20, 237, 28, 0.5)',
+ cursor: 'url(' + path + 'img/chalk-green.png), auto'
+ },
+ {
+ color: 'rgba(220, 133, 41, 0.5)',
+ cursor: 'url(' + path + 'img/chalk-orange.png), auto'
+ },
+ {
+ color: 'rgba(220,0,220,0.5)',
+ cursor: 'url(' + path + 'img/chalk-purple.png), auto'
+ },
+ {
+ color: 'rgba(255,220,0,0.5)',
+ cursor: 'url(' + path + 'img/chalk-yellow.png), auto'
+ }
+ ];
+ var keyBindings = {
+ toggleNotesCanvas: {
+ keyCode: 67,
+ key: 'C',
+ description: 'Toggle notes canvas'
+ },
+ toggleChalkboard: {
+ keyCode: 66,
+ key: 'B',
+ description: 'Toggle chalkboard'
+ },
+ clear: {
+ keyCode: 46,
+ key: 'DEL',
+ description: 'Clear drawings on slide'
+ },
+/*
+ reset: {
+ keyCode: 173,
+ key: '-',
+ description: 'Reset drawings on slide'
+ },
+*/
+ resetAll: {
+ keyCode: 8,
+ key: 'BACKSPACE',
+ description: 'Reset all drawings'
+ },
+ colorNext: {
+ keyCode: 88,
+ key: 'X',
+ description: 'Next color'
+ },
+ colorPrev: {
+ keyCode: 89,
+ key: 'Y',
+ description: 'Previous color'
+ },
+ download: {
+ keyCode: 68,
+ key: 'D',
+ description: 'Download drawings'
+ }
+ };
+
+
+ var theme = 'chalkboard';
+ var color = [ 0, 0 ];
+ var toggleChalkboardButton = false;
+ var toggleNotesButton = false;
+ var colorButtons = true;
+ var boardHandle = true;
+ var transition = 800;
+
+ var readOnly = false;
+ var messageType = 'broadcast';
+
+ var config = configure( Reveal.getConfig().chalkboard || {} );
+ if ( config.keyBindings ) {
+ for ( var key in config.keyBindings ) {
+ keyBindings[ key ] = config.keyBindings[ key ];
+ };
+ }
+
+ function configure( config ) {
+
+ if ( config.boardmarkerWidth || config.penWidth ) boardmarkerWidth = config.boardmarkerWidth || config.penWidth;
+ if ( config.chalkWidth ) chalkWidth = config.chalkWidth;
+ if ( config.chalkEffect ) chalkEffect = config.chalkEffect;
+ if ( config.rememberColor ) rememberColor = config.rememberColor;
+ if ( config.eraser ) eraser = config.eraser;
+ if ( config.boardmarkers ) boardmarkers = config.boardmarkers;
+ if ( config.chalks ) chalks = config.chalks;
+
+ if ( config.theme ) theme = config.theme;
+ switch ( theme ) {
+ case 'whiteboard':
+ background = [ 'rgba(127,127,127,.1)', path + 'img/whiteboard.png' ];
+ draw = [ drawWithBoardmarker, drawWithBoardmarker ];
+ pens = [ boardmarkers, boardmarkers ];
+ grid = {
+ color: 'rgb(127,127,255,0.1)',
+ distance: 40,
+ width: 2
+ };
+ break;
+ case 'chalkboard':
+ default:
+ background = [ 'rgba(127,127,127,.1)', path + 'img/blackboard.png' ];
+ draw = [ drawWithBoardmarker, drawWithChalk ];
+ pens = [ boardmarkers, chalks ];
+ grid = {
+ color: 'rgb(50,50,10,0.5)',
+ distance: 80,
+ width: 2
+ };
+ }
+
+ if ( config.background ) background = config.background;
+ if ( config.grid != undefined ) grid = config.grid;
+
+ if ( config.toggleChalkboardButton != undefined ) toggleChalkboardButton = config.toggleChalkboardButton;
+ if ( config.toggleNotesButton != undefined ) toggleNotesButton = config.toggleNotesButton;
+ if ( config.colorButtons != undefined ) colorButtons = config.colorButtons;
+ if ( config.boardHandle != undefined ) boardHandle = config.boardHandle;
+ if ( config.transition ) transition = config.transition;
+
+ if ( config.readOnly != undefined ) readOnly = config.readOnly;
+ if ( config.messageType ) messageType = config.messageType;
+
+ if ( drawingCanvas && ( config.theme || config.background || config.grid ) ) {
+ var canvas = document.getElementById( drawingCanvas[ 1 ].id );
+ canvas.style.background = 'url("' + background[ 1 ] + '") repeat';
+ clearCanvas( 1 );
+ drawGrid();
+ }
+
+ return config;
+ }
+/*****************************************************************
+ ** Setup
+ ******************************************************************/
+
+ function whenReady( callback ) {
+ // wait for markdown to be parsed and code to be highlighted
+ if ( !document.querySelector( 'section[data-markdown]:not([data-markdown-parsed])' )
+ && !document.querySelector( 'code[data-line-numbers*="|"]')
+ ) {
+ callback();
+ } else {
+ console.log( "Wait for markdown to be parsed and code to be highlighted" );
+ setTimeout( whenReady, 500, callback )
+ }
+ }
+
+ function whenLoaded( callback ) {
+ // wait for drawings to be loaded and markdown to be parsed
+ if ( loaded !== null ) {
+ callback();
+ } else {
+ console.log( "Wait for drawings to be loaded" );
+ setTimeout( whenLoaded, 500, callback )
+ }
+ }
+
+ if ( toggleChalkboardButton ) {
+console.warn( "toggleChalkboardButton is deprecated, use customcontrols plugin instead!" );
+//console.log("toggleChalkboardButton")
+ var button = document.createElement( 'div' );
+ button.className = "chalkboard-button";
+ button.id = "toggle-chalkboard";
+ button.style.visibility = "visible";
+ button.style.position = "absolute";
+ button.style.zIndex = 30;
+ button.style.fontSize = "24px";
+
+ button.style.left = toggleChalkboardButton.left || "30px";
+ button.style.bottom = toggleChalkboardButton.bottom || "30px";
+ button.style.top = toggleChalkboardButton.top || "auto";
+ button.style.right = toggleChalkboardButton.right || "auto";
+
+ button.innerHTML = ''
+ document.querySelector( ".reveal" ).appendChild( button );
+ }
+ if ( toggleNotesButton ) {
+console.warn( "toggleNotesButton is deprecated, use customcontrols plugin instead!" );
+//console.log("toggleNotesButton")
+ var button = document.createElement( 'div' );
+ button.className = "chalkboard-button";
+ button.id = "toggle-notes";
+ button.style.position = "absolute";
+ button.style.zIndex = 30;
+ button.style.fontSize = "24px";
+
+ button.style.left = toggleNotesButton.left || "70px";
+ button.style.bottom = toggleNotesButton.bottom || "30px";
+ button.style.top = toggleNotesButton.top || "auto";
+ button.style.right = toggleNotesButton.right || "auto";
+
+ button.innerHTML = ''
+ document.querySelector( ".reveal" ).appendChild( button );
+ }
+
+ var drawingCanvas = [ {
+ id: 'notescanvas'
+ }, {
+ id: 'chalkboard'
+ } ];
+ setupDrawingCanvas( 0 );
+ setupDrawingCanvas( 1 );
+
+ var mode = 0; // 0: notes canvas, 1: chalkboard
+ var board = 0; // board index (only for chalkboard)
+
+ var mouseX = 0;
+ var mouseY = 0;
+ var lastX = null;
+ var lastY = null;
+
+ var drawing = false;
+ var erasing = false;
+
+ var slideStart = Date.now();
+ var slideIndices = {
+ h: 0,
+ v: 0
+ };
+
+ var timeouts = [
+ [],
+ []
+ ];
+ var touchTimeout = null;
+ var slidechangeTimeout = null;
+ var updateStorageTimeout = null;
+ var playback = false;
+
+ function createPalette( colors, length ) {
+ if ( length === true || length > colors.length ) {
+ length = colors.length;
+ }
+ var palette = document.createElement( 'div' );
+ palette.classList.add( 'palette' );
+ var list = document.createElement( 'ul' );
+ // color pickers
+ for ( var i = 0; i < length; i++ ) {
+ var colorButton = document.createElement( 'li' );
+ colorButton.setAttribute( 'data-color', i );
+ colorButton.innerHTML = '';
+ colorButton.style.color = colors[ i ].color;
+ colorButton.addEventListener( 'click', function ( e ) {
+ var element = e.target;
+ while ( !element.hasAttribute( 'data-color' ) ) {
+ element = element.parentElement;
+ }
+ colorIndex( parseInt( element.getAttribute( 'data-color' ) ) );
+ } );
+ colorButton.addEventListener( 'touchstart', function ( e ) {
+ var element = e.target;
+ while ( !element.hasAttribute( 'data-color' ) ) {
+ element = element.parentElement;
+ }
+ colorIndex( parseInt( element.getAttribute( 'data-color' ) ) );
+ } );
+ list.appendChild( colorButton );
+ }
+ palette.appendChild( list );
+ return palette;
+ };
+
+ function switchBoard( boardIdx ) {
+ selectBoard( boardIdx, true );
+ // broadcast
+ var message = new CustomEvent( messageType );
+ message.content = {
+ sender: 'chalkboard-plugin',
+ type: 'selectboard',
+ timestamp: Date.now() - slideStart,
+ mode,
+ board
+ };
+ document.dispatchEvent( message );
+ }
+
+ function setupDrawingCanvas( id ) {
+ var container = document.createElement( 'div' );
+ container.id = drawingCanvas[ id ].id;
+ container.classList.add( 'overlay' );
+ container.setAttribute( 'data-prevent-swipe', 'true' );
+ container.oncontextmenu = function () {
+ return false;
+ }
+ container.style.cursor = pens[ id ][ color[ id ] ].cursor;
+
+ drawingCanvas[ id ].width = window.innerWidth;
+ drawingCanvas[ id ].height = window.innerHeight;
+ drawingCanvas[ id ].scale = 1;
+ drawingCanvas[ id ].xOffset = 0;
+ drawingCanvas[ id ].yOffset = 0;
+
+ if ( id == "0" ) {
+ container.style.background = 'rgba(0,0,0,0)';
+ container.style.zIndex = 24;
+ container.style.opacity = 1;
+ container.style.visibility = 'visible';
+ container.style.pointerEvents = 'none';
+
+ var slides = document.querySelector( '.slides' );
+ var aspectRatio = Reveal.getConfig().width / Reveal.getConfig().height;
+ if ( drawingCanvas[ id ].width > drawingCanvas[ id ].height * aspectRatio ) {
+ drawingCanvas[ id ].xOffset = ( drawingCanvas[ id ].width - drawingCanvas[ id ].height * aspectRatio ) / 2;
+ } else if ( drawingCanvas[ id ].height > drawingCanvas[ id ].width / aspectRatio ) {
+ drawingCanvas[ id ].yOffset = ( drawingCanvas[ id ].height - drawingCanvas[ id ].width / aspectRatio ) / 2;
+ }
+
+ if ( colorButtons ) {
+ var palette = createPalette( boardmarkers, colorButtons );
+ palette.style.visibility = 'hidden'; // only show palette in drawing mode
+ container.appendChild( palette );
+ }
+ } else {
+ container.style.background = 'url("' + background[ id ] + '") repeat';
+ container.style.zIndex = 26;
+ container.style.opacity = 0;
+ container.style.visibility = 'hidden';
+
+ if ( colorButtons ) {
+ var palette = createPalette( chalks, colorButtons );
+ container.appendChild( palette );
+ }
+ if ( boardHandle ) {
+ var handle = document.createElement( 'div' );
+ handle.classList.add( 'boardhandle' );
+ handle.innerHTML = '';
+ handle.querySelector( '#previousboard' ).addEventListener( 'click', function ( e ) {
+ e.preventDefault();
+ switchBoard( board - 1 );
+ } );
+ handle.querySelector( '#nextboard' ).addEventListener( 'click', function ( e ) {
+ e.preventDefault();
+ switchBoard( board + 1 );
+ } );
+ handle.querySelector( '#previousboard' ).addEventListener( 'touchstart', function ( e ) {
+ e.preventDefault();
+ switchBoard( board - 1 );
+ } );
+ handle.querySelector( '#nextboard' ).addEventListener( 'touchstart', function ( e ) {
+ e.preventDefault();
+ switchBoard( board + 1 );
+ } );
+
+ container.appendChild( handle );
+ }
+ }
+
+
+ var sponge = document.createElement( 'img' );
+ sponge.src = eraser.src;
+ sponge.id = 'sponge';
+ sponge.style.visibility = 'hidden';
+ sponge.style.position = 'absolute';
+ container.appendChild( sponge );
+ drawingCanvas[ id ].sponge = sponge;
+
+ var canvas = document.createElement( 'canvas' );
+ canvas.width = drawingCanvas[ id ].width;
+ canvas.height = drawingCanvas[ id ].height;
+ canvas.setAttribute( 'data-chalkboard', id );
+ canvas.style.cursor = pens[ id ][ color[ id ] ].cursor;
+ container.appendChild( canvas );
+ drawingCanvas[ id ].canvas = canvas;
+
+ drawingCanvas[ id ].context = canvas.getContext( '2d' );
+
+ setupCanvasEvents( container );
+
+ document.querySelector( '.reveal' ).appendChild( container );
+ drawingCanvas[ id ].container = container;
+ }
+
+
+/*****************************************************************
+ ** Storage
+ ******************************************************************/
+
+ var storage = [ {
+ width: Reveal.getConfig().width,
+ height: Reveal.getConfig().height,
+ data: []
+ },
+ {
+ width: Reveal.getConfig().width,
+ height: Reveal.getConfig().height,
+ data: []
+ }
+ ];
+
+ var loaded = null;
+
+ if ( config.storage ) {
+ // Get chalkboard drawings from session storage
+ loaded = initStorage( sessionStorage.getItem( config.storage ) );
+ }
+
+ if ( !loaded && config.src != null ) {
+ // Get chalkboard drawings from the given file
+ loadData( config.src );
+ }
+
+ /**
+ * Initialize storage.
+ */
+ function initStorage( json ) {
+ var success = false;
+ try {
+ var data = JSON.parse( json );
+ for ( var id = 0; id < data.length; id++ ) {
+ if ( drawingCanvas[ id ].width != data[ id ].width || drawingCanvas[ id ].height != data[ id ].height ) {
+ drawingCanvas[ id ].scale = Math.min( drawingCanvas[ id ].width / data[ id ].width, drawingCanvas[ id ].height / data[ id ].height );
+ drawingCanvas[ id ].xOffset = ( drawingCanvas[ id ].width - data[ id ].width * drawingCanvas[ id ].scale ) / 2;
+ drawingCanvas[ id ].yOffset = ( drawingCanvas[ id ].height - data[ id ].height * drawingCanvas[ id ].scale ) / 2;
+ }
+ if ( config.readOnly ) {
+ drawingCanvas[ id ].container.style.cursor = 'default';
+ drawingCanvas[ id ].canvas.style.cursor = 'default';
+ }
+ }
+ success = true;
+ storage = data;
+ } catch ( err ) {
+ console.warn( "Cannot initialise storage!" );
+ }
+ return success;
+ }
+
+
+ /**
+ * Load data.
+ */
+ function loadData( filename ) {
+ var xhr = new XMLHttpRequest();
+ xhr.onload = function () {
+ if ( xhr.readyState === 4 && xhr.status != 404 ) {
+ loaded = initStorage( xhr.responseText );
+ updateStorage();
+ console.log( "Drawings loaded from file" );
+ } else {
+ config.readOnly = undefined;
+ readOnly = undefined;
+ console.warn( 'Failed to get file ' + filename + '. ReadyState: ' + xhr.readyState + ', Status: ' + xhr.status );
+ loaded = false;
+ }
+ };
+
+ xhr.open( 'GET', filename, true );
+ try {
+ xhr.send();
+ } catch ( error ) {
+ config.readOnly = undefined;
+ readOnly = undefined;
+ console.warn( 'Failed to get file ' + filename + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + error );
+ loaded = false;
+ }
+ }
+
+
+ function storageChanged( now ) {
+ if ( !now ) {
+ // create or update timer
+ if ( updateStorageTimeout ) {
+ clearTimeout( updateStorageTimeout );
+ }
+ updateStorageTimeout = setTimeout( storageChanged, 1000, true);
+ }
+ else {
+// console.log("Update storage", updateStorageTimeout, Date.now());
+ updateStorage();
+ updateStorageTimeout = null;
+ }
+ }
+
+ function updateStorage() {
+ var json = JSON.stringify( storage )
+ if ( config.storage ) {
+ sessionStorage.setItem( config.storage, json )
+ }
+ return json;
+ }
+
+ function recordEvent( event ) {
+//console.log(event);
+ event.time = Date.now() - slideStart;
+ if ( mode == 1 ) event.board = board;
+ var slideData = getSlideData();
+ var i = slideData.events.length;
+ while ( i > 0 && event.time < slideData.events[ i - 1 ].time ) {
+ i--;
+ }
+ slideData.events.splice( i, 0, event );
+ slideData.duration = Math.max( slideData.duration, Date.now() - slideStart ) + 1;
+
+ storageChanged();
+ }
+
+ /**
+ * Get data as json string.
+ */
+ function getData() {
+ // cleanup slide data without events
+ for ( var id = 0; id < 2; id++ ) {
+ for ( var i = storage[ id ].data.length - 1; i >= 0; i-- ) {
+ if ( storage[ id ].data[ i ].events.length == 0 ) {
+ storage[ id ].data.splice( i, 1 );
+ }
+ }
+ }
+
+ return updateStorage();
+ }
+
+ /**
+ * Download data.
+ */
+ function downloadData() {
+ var a = document.createElement( 'a' );
+ document.body.appendChild( a );
+ try {
+ a.download = 'chalkboard.json';
+ var blob = new Blob( [ getData() ], {
+ type: 'application/json'
+ } );
+ a.href = window.URL.createObjectURL( blob );
+ } catch ( error ) {
+ a.innerHTML += ' (' + error + ')';
+ }
+ a.click();
+ document.body.removeChild( a );
+ }
+
+ /**
+ * Returns data object for the slide with the given indices.
+ */
+ function getSlideData( indices, id ) {
+ if ( id == undefined ) id = mode;
+ if ( !indices ) indices = slideIndices;
+ var data;
+ for ( var i = 0; i < storage[ id ].data.length; i++ ) {
+ if ( storage[ id ].data[ i ].slide.h === indices.h && storage[ id ].data[ i ].slide.v === indices.v && storage[ id ].data[ i ].slide.f === indices.f ) {
+ data = storage[ id ].data[ i ];
+ return data;
+ }
+ }
+ var page = Number( Reveal.getCurrentSlide().getAttribute('data-pdf-page-number') );
+//console.log( indices, Reveal.getCurrentSlide() );
+ storage[ id ].data.push( {
+ slide: indices,
+ page,
+ events: [],
+ duration: 0
+ } );
+ data = storage[ id ].data[ storage[ id ].data.length - 1 ];
+ return data;
+ }
+
+ /**
+ * Returns maximum duration of slide playback for both modes
+ */
+ function getSlideDuration( indices ) {
+ if ( !indices ) indices = slideIndices;
+ var duration = 0;
+ for ( var id = 0; id < 2; id++ ) {
+ for ( var i = 0; i < storage[ id ].data.length; i++ ) {
+ if ( storage[ id ].data[ i ].slide.h === indices.h && storage[ id ].data[ i ].slide.v === indices.v && storage[ id ].data[ i ].slide.f === indices.f ) {
+ duration = Math.max( duration, storage[ id ].data[ i ].duration );
+ break;
+ }
+ }
+ }
+//console.log( duration );
+ return duration;
+ }
+
+/*****************************************************************
+ ** Print
+ ******************************************************************/
+ var printMode = ( /print-pdf/gi ).test( window.location.search );
+//console.log("createPrintout" + printMode)
+
+ function addPageNumbers() {
+ // determine page number for printouts with fragments serialised
+ var slides = Reveal.getSlides();
+ var page = 0;
+ for ( var i=0; i < slides.length; i++) {
+ slides[i].setAttribute('data-pdf-page-number',page.toString());
+ // add number of fragments without fragment indices
+ var count = slides[i].querySelectorAll('.fragment:not([data-fragment-index])').length;
+ var fragments = slides[i].querySelectorAll('.fragment[data-fragment-index]');
+ for ( var j=0; j < fragments.length; j++) {
+ // increasenumber of fragments by highest fragment index (which start at 0)
+ if ( Number(fragments[j].getAttribute('data-fragment-index')) + 1 > count ) {
+ count = Number(fragments[j].getAttribute('data-fragment-index')) + 1;
+ }
+ }
+//console.log(count,fragments.length,( slides[i].querySelector('h1,h2,h3,h4')||{}).innerHTML, page);
+ page += count + 1;
+ }
+ }
+
+ function createPrintout() {
+ //console.warn(Reveal.getTotalSlides(),Reveal.getSlidesElement());
+ if ( storage[ 1 ].data.length == 0 ) return;
+ console.log( 'Create printout(s) for ' + storage[ 1 ].data.length + " slides" );
+ drawingCanvas[ 0 ].container.style.opacity = 0; // do not print notes canvas
+ drawingCanvas[ 0 ].container.style.visibility = 'hidden';
+
+ var patImg = new Image();
+ patImg.onload = function () {
+ var slides = Reveal.getSlides();
+//console.log(slides);
+ for ( var i = storage[ 1 ].data.length - 1; i >= 0; i-- ) {
+ console.log( 'Create printout for slide ' + storage[ 1 ].data[ i ].slide.h + '.' + storage[ 1 ].data[ i ].slide.v );
+ var slideData = getSlideData( storage[ 1 ].data[ i ].slide, 1 );
+ var drawings = createDrawings( slideData, patImg );
+//console.log("Page:", storage[ 1 ].data[ i ].page );
+//console.log("Slide:", slides[storage[ 1 ].data[ i ].page] );
+ addDrawings( slides[storage[ 1 ].data[ i ].page], drawings );
+
+ }
+// Reveal.sync();
+ };
+ patImg.src = background[ 1 ];
+ }
+
+
+ function cloneCanvas( oldCanvas ) {
+ //create a new canvas
+ var newCanvas = document.createElement( 'canvas' );
+ var context = newCanvas.getContext( '2d' );
+ //set dimensions
+ newCanvas.width = oldCanvas.width;
+ newCanvas.height = oldCanvas.height;
+ //apply the old canvas to the new one
+ context.drawImage( oldCanvas, 0, 0 );
+ //return the new canvas
+ return newCanvas;
+ }
+
+ function getCanvas( template, container, board ) {
+ var idx = container.findIndex( element => element.board === board );
+ if ( idx === -1 ) {
+ var canvas = cloneCanvas( template );
+ if ( !container.length ) {
+ idx = 0;
+ container.push( {
+ board,
+ canvas
+ } );
+ } else if ( board < container[ 0 ].board ) {
+ idx = 0;
+ container.unshift( {
+ board,
+ canvas
+ } );
+ } else if ( board > container[ container.length - 1 ].board ) {
+ idx = container.length;
+ container.push( {
+ board,
+ canvas
+ } );
+ }
+ }
+
+ return container[ idx ].canvas;
+ }
+
+ function createDrawings( slideData, patImg ) {
+ var width = Reveal.getConfig().width;
+ var height = Reveal.getConfig().height;
+ var scale = 1;
+ var xOffset = 0;
+ var yOffset = 0;
+ if ( width != storage[ 1 ].width || height != storage[ 1 ].height ) {
+ scale = Math.min( width / storage[ 1 ].width, height / storage[ 1 ].height );
+ xOffset = ( width - storage[ 1 ].width * scale ) / 2;
+ yOffset = ( height - storage[ 1 ].height * scale ) / 2;
+ }
+ mode = 1;
+ board = 0;
+// console.log( 'Create printout(s) for slide ', slideData );
+
+ var drawings = [];
+ var template = document.createElement( 'canvas' );
+ template.width = width;
+ template.height = height;
+
+ var imgCtx = template.getContext( '2d' );
+ imgCtx.fillStyle = imgCtx.createPattern( patImg, 'repeat' );
+ imgCtx.rect( 0, 0, width, height );
+ imgCtx.fill();
+
+ for ( var j = 0; j < slideData.events.length; j++ ) {
+ switch ( slideData.events[ j ].type ) {
+ case 'draw':
+ draw[ 1 ]( getCanvas( template, drawings, board ).getContext( '2d' ),
+ xOffset + slideData.events[ j ].x1 * scale,
+ yOffset + slideData.events[ j ].y1 * scale,
+ xOffset + slideData.events[ j ].x2 * scale,
+ yOffset + slideData.events[ j ].y2 * scale,
+ yOffset + slideData.events[ j ].color
+ );
+ break;
+ case 'erase':
+ eraseWithSponge( getCanvas( template, drawings, board ).getContext( '2d' ),
+ xOffset + slideData.events[ j ].x * scale,
+ yOffset + slideData.events[ j ].y * scale
+ );
+ break;
+ case 'selectboard':
+ selectBoard( slideData.events[ j ].board );
+ break;
+ case 'clear':
+ getCanvas( template, drawings, board ).getContext( '2d' ).clearRect( 0, 0, width, height );
+ getCanvas( template, drawings, board ).getContext( '2d' ).fill();
+ break;
+ default:
+ break;
+ }
+ }
+
+ drawings = drawings.sort( ( a, b ) => a.board > b.board && 1 || -1 );
+
+ mode = 0;
+
+ return drawings;
+ }
+
+ function addDrawings( slide, drawings ) {
+ var parent = slide.parentElement.parentElement;
+ var nextSlide = slide.parentElement.nextElementSibling;
+
+ for ( var i = 0; i < drawings.length; i++ ) {
+ var newPDFPage = document.createElement( 'div' );
+ newPDFPage.classList.add( 'pdf-page' );
+ newPDFPage.style.height = Reveal.getConfig().height;
+ newPDFPage.append( drawings[ i ].canvas );
+//console.log("Add drawing", newPDFPage);
+ if ( nextSlide != null ) {
+ parent.insertBefore( newPDFPage, nextSlide );
+ } else {
+ parent.append( newPDFPage );
+ }
+ }
+ }
+
+ /*****************************************************************
+ ** Drawings
+ ******************************************************************/
+
+ function drawWithBoardmarker( context, fromX, fromY, toX, toY, colorIdx ) {
+ if ( colorIdx == undefined ) colorIdx = color[ mode ];
+ context.lineWidth = boardmarkerWidth;
+ context.lineCap = 'round';
+ context.strokeStyle = boardmarkers[ colorIdx ].color;
+ context.beginPath();
+ context.moveTo( fromX, fromY );
+ context.lineTo( toX, toY );
+ context.stroke();
+ }
+
+ function drawWithChalk( context, fromX, fromY, toX, toY, colorIdx ) {
+ if ( colorIdx == undefined ) colorIdx = color[ mode ];
+ var brushDiameter = chalkWidth;
+ context.lineWidth = brushDiameter;
+ context.lineCap = 'round';
+ context.fillStyle = chalks[ colorIdx ].color; // 'rgba(255,255,255,0.5)';
+ context.strokeStyle = chalks[ colorIdx ].color;
+ /*var opacity = Math.min(0.8, Math.max(0,color[1].replace(/^.*,(.+)\)/,'$1') - 0.1)) + Math.random()*0.2;*/
+ var opacity = 1.0;
+ context.strokeStyle = context.strokeStyle.replace( /[\d\.]+\)$/g, opacity + ')' );
+ context.beginPath();
+ context.moveTo( fromX, fromY );
+ context.lineTo( toX, toY );
+ context.stroke();
+ // Chalk Effect
+ var length = Math.round( Math.sqrt( Math.pow( toX - fromX, 2 ) + Math.pow( toY - fromY, 2 ) ) / ( 5 / brushDiameter ) );
+ var xUnit = ( toX - fromX ) / length;
+ var yUnit = ( toY - fromY ) / length;
+ for ( var i = 0; i < length; i++ ) {
+ if ( chalkEffect > ( Math.random() * 0.9 ) ) {
+ var xCurrent = fromX + ( i * xUnit );
+ var yCurrent = fromY + ( i * yUnit );
+ var xRandom = xCurrent + ( Math.random() - 0.5 ) * brushDiameter * 1.2;
+ var yRandom = yCurrent + ( Math.random() - 0.5 ) * brushDiameter * 1.2;
+ context.clearRect( xRandom, yRandom, Math.random() * 2 + 2, Math.random() + 1 );
+ }
+ }
+ }
+
+ function eraseWithSponge( context, x, y ) {
+ context.save();
+ context.beginPath();
+ context.arc( x, y, eraser.radius, 0, 2 * Math.PI, false );
+ context.clip();
+ context.clearRect( x - eraser.radius - 1, y - eraser.radius - 1, eraser.radius * 2 + 2, eraser.radius * 2 + 2 );
+ context.restore();
+ if ( mode == 1 && grid ) {
+ redrawGrid( x, y, eraser.radius );
+ }
+ }
+
+
+ /**
+ * Show an overlay for the chalkboard.
+ */
+ function showChalkboard() {
+//console.log("showChalkboard");
+ clearTimeout( touchTimeout );
+ touchTimeout = null;
+ drawingCanvas[ 0 ].sponge.style.visibility = 'hidden'; // make sure that the sponge from touch events is hidden
+ drawingCanvas[ 1 ].sponge.style.visibility = 'hidden'; // make sure that the sponge from touch events is hidden
+ drawingCanvas[ 1 ].container.style.opacity = 1;
+ drawingCanvas[ 1 ].container.style.visibility = 'visible';
+ mode = 1;
+ }
+
+
+ /**
+ * Closes open chalkboard.
+ */
+ function closeChalkboard() {
+ clearTimeout( touchTimeout );
+ touchTimeout = null;
+ drawingCanvas[ 0 ].sponge.style.visibility = 'hidden'; // make sure that the sponge from touch events is hidden
+ drawingCanvas[ 1 ].sponge.style.visibility = 'hidden'; // make sure that the sponge from touch events is hidden
+ drawingCanvas[ 1 ].container.style.opacity = 0;
+ drawingCanvas[ 1 ].container.style.visibility = 'hidden';
+ lastX = null;
+ lastY = null;
+ mode = 0;
+ }
+
+ /**
+ * Clear current canvas.
+ */
+ function clearCanvas( id ) {
+ if ( id == 0 ) clearTimeout( slidechangeTimeout );
+ drawingCanvas[ id ].context.clearRect( 0, 0, drawingCanvas[ id ].width, drawingCanvas[ id ].height );
+ if ( id == 1 && grid ) drawGrid();
+ }
+
+ /**
+ * Draw grid on background
+ */
+ function drawGrid() {
+ var context = drawingCanvas[ 1 ].context;
+
+ drawingCanvas[ 1 ].scale = Math.min( drawingCanvas[ 1 ].width / storage[ 1 ].width, drawingCanvas[ 1 ].height / storage[ 1 ].height );
+ drawingCanvas[ 1 ].xOffset = ( drawingCanvas[ 1 ].width - storage[ 1 ].width * drawingCanvas[ 1 ].scale ) / 2;
+ drawingCanvas[ 1 ].yOffset = ( drawingCanvas[ 1 ].height - storage[ 1 ].height * drawingCanvas[ 1 ].scale ) / 2;
+
+ var scale = drawingCanvas[ 1 ].scale;
+ var xOffset = drawingCanvas[ 1 ].xOffset;
+ var yOffset = drawingCanvas[ 1 ].yOffset;
+
+ var distance = grid.distance * scale;
+
+ var fromX = drawingCanvas[ 1 ].width / 2 - distance / 2 - Math.floor( ( drawingCanvas[ 1 ].width - distance ) / 2 / distance ) * distance;
+ for ( var x = fromX; x < drawingCanvas[ 1 ].width; x += distance ) {
+ context.beginPath();
+ context.lineWidth = grid.width * scale;
+ context.lineCap = 'round';
+ context.fillStyle = grid.color;
+ context.strokeStyle = grid.color;
+ context.moveTo( x, 0 );
+ context.lineTo( x, drawingCanvas[ 1 ].height );
+ context.stroke();
+ }
+ var fromY = drawingCanvas[ 1 ].height / 2 - distance / 2 - Math.floor( ( drawingCanvas[ 1 ].height - distance ) / 2 / distance ) * distance;
+
+ for ( var y = fromY; y < drawingCanvas[ 1 ].height; y += distance ) {
+ context.beginPath();
+ context.lineWidth = grid.width * scale;
+ context.lineCap = 'round';
+ context.fillStyle = grid.color;
+ context.strokeStyle = grid.color;
+ context.moveTo( 0, y );
+ context.lineTo( drawingCanvas[ 1 ].width, y );
+ context.stroke();
+ }
+ }
+
+ function redrawGrid( centerX, centerY, diameter ) {
+ var context = drawingCanvas[ 1 ].context;
+
+ drawingCanvas[ 1 ].scale = Math.min( drawingCanvas[ 1 ].width / storage[ 1 ].width, drawingCanvas[ 1 ].height / storage[ 1 ].height );
+ drawingCanvas[ 1 ].xOffset = ( drawingCanvas[ 1 ].width - storage[ 1 ].width * drawingCanvas[ 1 ].scale ) / 2;
+ drawingCanvas[ 1 ].yOffset = ( drawingCanvas[ 1 ].height - storage[ 1 ].height * drawingCanvas[ 1 ].scale ) / 2;
+
+ var scale = drawingCanvas[ 1 ].scale;
+ var xOffset = drawingCanvas[ 1 ].xOffset;
+ var yOffset = drawingCanvas[ 1 ].yOffset;
+
+ var distance = grid.distance * scale;
+
+ var fromX = drawingCanvas[ 1 ].width / 2 - distance / 2 - Math.floor( ( drawingCanvas[ 1 ].width - distance ) / 2 / distance ) * distance;
+
+ for ( var x = fromX + distance * Math.ceil( ( centerX - diameter - fromX ) / distance ); x <= fromX + distance * Math.floor( ( centerX + diameter - fromX ) / distance ); x += distance ) {
+ context.beginPath();
+ context.lineWidth = grid.width * scale;
+ context.lineCap = 'round';
+ context.fillStyle = grid.color;
+ context.strokeStyle = grid.color;
+ context.moveTo( x, centerY - Math.sqrt( diameter * diameter - ( centerX - x ) * ( centerX - x ) ) );
+ context.lineTo( x, centerY + Math.sqrt( diameter * diameter - ( centerX - x ) * ( centerX - x ) ) );
+ context.stroke();
+ }
+ var fromY = drawingCanvas[ 1 ].height / 2 - distance / 2 - Math.floor( ( drawingCanvas[ 1 ].height - distance ) / 2 / distance ) * distance;
+ for ( var y = fromY + distance * Math.ceil( ( centerY - diameter - fromY ) / distance ); y <= fromY + distance * Math.floor( ( centerY + diameter - fromY ) / distance ); y += distance ) {
+ context.beginPath();
+ context.lineWidth = grid.width * scale;
+ context.lineCap = 'round';
+ context.fillStyle = grid.color;
+ context.strokeStyle = grid.color;
+ context.moveTo( centerX - Math.sqrt( diameter * diameter - ( centerY - y ) * ( centerY - y ) ), y );
+ context.lineTo( centerX + Math.sqrt( diameter * diameter - ( centerY - y ) * ( centerY - y ) ), y );
+ context.stroke();
+ }
+ }
+
+ /**
+ * Set the color
+ */
+ function setColor( index, record ) {
+ // protect against out of bounds (this could happen when
+ // replaying events recorded with different color settings).
+ if ( index >= pens[ mode ].length ) index = 0;
+ color[ mode ] = index;
+ drawingCanvas[ mode ].canvas.style.cursor = pens[ mode ][ color[ mode ] ].cursor;
+ }
+
+ /**
+ * Set the board
+ */
+ function selectBoard( boardIdx, record ) {
+//console.log("Set board",boardIdx);
+ if ( board == boardIdx ) return;
+
+ board = boardIdx;
+ redrawChalkboard( boardIdx );
+ if ( record ) {
+ recordEvent( { type: 'selectboard' } );
+ }
+ }
+
+ function redrawChalkboard( boardIdx ) {
+ clearCanvas( 1 );
+ var slideData = getSlideData( slideIndices, 1 );
+ var index = 0;
+ var play = ( boardIdx == 0 );
+ while ( index < slideData.events.length && slideData.events[ index ].time < Date.now() - slideStart ) {
+ if ( boardIdx == slideData.events[ index ].board ) {
+ playEvent( 1, slideData.events[ index ], Date.now() - slideStart );
+ }
+
+ index++;
+ }
+ }
+
+
+ /**
+ * Forward cycle color
+ */
+ function cycleColorNext() {
+ color[ mode ] = ( color[ mode ] + 1 ) % pens[ mode ].length;
+ return color[ mode ];
+ }
+
+ /**
+ * Backward cycle color
+ */
+ function cycleColorPrev() {
+ color[ mode ] = ( color[ mode ] + ( pens[ mode ].length - 1 ) ) % pens[ mode ].length;
+ return color[ mode ];
+ }
+
+/*****************************************************************
+ ** Broadcast
+ ******************************************************************/
+
+ var eventQueue = [];
+
+ document.addEventListener( 'received', function ( message ) {
+ if ( message.content && message.content.sender == 'chalkboard-plugin' ) {
+ // add message to queue
+ eventQueue.push( message );
+ console.log( JSON.stringify( message ) );
+ }
+ if ( eventQueue.length == 1 ) processQueue();
+ } );
+
+ function processQueue() {
+ // take first message from queue
+ var message = eventQueue.shift();
+
+ // synchronize time with seminar host
+ slideStart = Date.now() - message.content.timestamp;
+ // set status
+ if ( mode < message.content.mode ) {
+ // open chalkboard
+ showChalkboard();
+ } else if ( mode > message.content.mode ) {
+ // close chalkboard
+ closeChalkboard();
+ }
+ if ( board != message.content.board ) {
+ board = message.content.board;
+ redrawChalkboard( board );
+ };
+
+ switch ( message.content.type ) {
+ case 'showChalkboard':
+ showChalkboard();
+ break;
+ case 'closeChalkboard':
+ closeChalkboard();
+ break;
+ case 'erase':
+ erasePoint( message.content.x, message.content.y );
+ break;
+ case 'draw':
+ drawSegment( message.content.fromX, message.content.fromY, message.content.toX, message.content.toY, message.content.color );
+ break;
+ case 'clear':
+ clearSlide();
+ break;
+ case 'selectboard':
+ selectBoard( message.content.board, true );
+ break;
+ case 'resetSlide':
+ resetSlideDrawings();
+ break;
+ case 'init':
+ storage = message.content.storage;
+ for ( var id = 0; id < 2; id++ ) {
+ drawingCanvas[ id ].scale = Math.min( drawingCanvas[ id ].width / storage[ id ].width, drawingCanvas[ id ].height / storage[ id ].height );
+ drawingCanvas[ id ].xOffset = ( drawingCanvas[ id ].width - storage[ id ].width * drawingCanvas[ id ].scale ) / 2;
+ drawingCanvas[ id ].yOffset = ( drawingCanvas[ id ].height - storage[ id ].height * drawingCanvas[ id ].scale ) / 2;
+ }
+ clearCanvas( 0 );
+ clearCanvas( 1 );
+ if ( !playback ) {
+ slidechangeTimeout = setTimeout( startPlayback, transition, getSlideDuration(), 0 );
+ }
+ if ( mode == 1 && message.content.mode == 0 ) {
+ setTimeout( closeChalkboard, transition + 50 );
+ }
+ if ( mode == 0 && message.content.mode == 1 ) {
+ setTimeout( showChalkboard, transition + 50 );
+ }
+ mode = message.content.mode;
+ board = message.content.board;
+ break;
+ default:
+ break;
+ }
+
+ // continue with next message if queued
+ if ( eventQueue.length > 0 ) {
+ processQueue();
+ } else {
+ storageChanged();
+ }
+ }
+
+ document.addEventListener( 'welcome', function ( user ) {
+ // broadcast storage
+ var message = new CustomEvent( messageType );
+ message.content = {
+ sender: 'chalkboard-plugin',
+ recipient: user.id,
+ type: 'init',
+ timestamp: Date.now() - slideStart,
+ storage: storage,
+ mode,
+ board
+ };
+ document.dispatchEvent( message );
+ } );
+
+ /*****************************************************************
+ ** Playback
+ ******************************************************************/
+
+ document.addEventListener( 'seekplayback', function ( event ) {
+//console.log('event seekplayback ' + event.timestamp);
+ stopPlayback();
+ if ( !playback || event.timestamp == 0 ) {
+ // in other cases startplayback fires after seeked
+ startPlayback( event.timestamp );
+ }
+ //console.log('seeked');
+ } );
+
+
+ document.addEventListener( 'startplayback', function ( event ) {
+//console.log('event startplayback ' + event.timestamp);
+ stopPlayback();
+ playback = true;
+ startPlayback( event.timestamp );
+ } );
+
+ document.addEventListener( 'stopplayback', function ( event ) {
+//console.log('event stopplayback ' + (Date.now() - slideStart) );
+ playback = false;
+ stopPlayback();
+ } );
+
+ document.addEventListener( 'startrecording', function ( event ) {
+//console.log('event startrecording ' + event.timestamp);
+ startRecording();
+ } );
+
+
+ function startRecording() {
+ resetSlide( true );
+ slideStart = Date.now();
+ }
+
+ function startPlayback( timestamp, finalMode ) {
+//console.log("playback " + timestamp );
+ slideStart = Date.now() - timestamp;
+ closeChalkboard();
+ mode = 0;
+ board = 0;
+ for ( var id = 0; id < 2; id++ ) {
+ clearCanvas( id );
+ var slideData = getSlideData( slideIndices, id );
+//console.log( timestamp +" / " + JSON.stringify(slideData));
+ var index = 0;
+ while ( index < slideData.events.length && slideData.events[ index ].time < ( Date.now() - slideStart ) ) {
+ playEvent( id, slideData.events[ index ], timestamp );
+ index++;
+ }
+
+ while ( playback && index < slideData.events.length ) {
+ timeouts[ id ].push( setTimeout( playEvent, slideData.events[ index ].time - ( Date.now() - slideStart ), id, slideData.events[ index ], timestamp ) );
+ index++;
+ }
+ }
+//console.log("Mode: " + finalMode + "/" + mode );
+ if ( finalMode != undefined ) {
+ mode = finalMode;
+ }
+ if ( mode == 1 ) showChalkboard();
+//console.log("playback (ok)");
+
+ };
+
+ function stopPlayback() {
+//console.log("stopPlayback");
+//console.log("Timeouts: " + timeouts[0].length + "/"+ timeouts[1].length);
+ for ( var id = 0; id < 2; id++ ) {
+ for ( var i = 0; i < timeouts[ id ].length; i++ ) {
+ clearTimeout( timeouts[ id ][ i ] );
+ }
+ timeouts[ id ] = [];
+ }
+ };
+
+ function playEvent( id, event, timestamp ) {
+//console.log( timestamp +" / " + JSON.stringify(event));
+//console.log( id + ": " + timestamp +" / " + event.time +" / " + event.type +" / " + mode );
+ switch ( event.type ) {
+ case 'open':
+ if ( timestamp <= event.time ) {
+ showChalkboard();
+ } else {
+ mode = 1;
+ }
+
+ break;
+ case 'close':
+ if ( timestamp < event.time ) {
+ closeChalkboard();
+ } else {
+ mode = 0;
+ }
+ break;
+ case 'clear':
+ clearCanvas( id );
+ break;
+ case 'selectboard':
+ selectBoard( event.board );
+ break;
+ case 'draw':
+ drawLine( id, event, timestamp );
+ break;
+ case 'erase':
+ eraseCircle( id, event, timestamp );
+ break;
+ }
+ };
+
+ function drawLine( id, event, timestamp ) {
+ var ctx = drawingCanvas[ id ].context;
+ var scale = drawingCanvas[ id ].scale;
+ var xOffset = drawingCanvas[ id ].xOffset;
+ var yOffset = drawingCanvas[ id ].yOffset;
+ draw[ id ]( ctx, xOffset + event.x1 * scale, yOffset + event.y1 * scale, xOffset + event.x2 * scale, yOffset + event.y2 * scale, event.color );
+ };
+
+ function eraseCircle( id, event, timestamp ) {
+ var ctx = drawingCanvas[ id ].context;
+ var scale = drawingCanvas[ id ].scale;
+ var xOffset = drawingCanvas[ id ].xOffset;
+ var yOffset = drawingCanvas[ id ].yOffset;
+
+ eraseWithSponge( ctx, xOffset + event.x * scale, yOffset + event.y * scale );
+ };
+
+ function startErasing( x, y ) {
+ drawing = false;
+ erasing = true;
+ drawingCanvas[ mode ].sponge.style.visibility = 'visible';
+ erasePoint( x, y );
+ }
+
+ function erasePoint( x, y ) {
+ var ctx = drawingCanvas[ mode ].context;
+ var scale = drawingCanvas[ mode ].scale;
+ var xOffset = drawingCanvas[ mode ].xOffset;
+ var yOffset = drawingCanvas[ mode ].yOffset;
+
+ // move sponge image
+ drawingCanvas[ mode ].sponge.style.left = ( x * scale + xOffset - eraser.radius ) + 'px';
+ drawingCanvas[ mode ].sponge.style.top = ( y * scale + yOffset - 2 * eraser.radius ) + 'px';
+
+ recordEvent( {
+ type: 'erase',
+ x,
+ y
+ } );
+
+ if (
+ x * scale + xOffset > 0 &&
+ y * scale + yOffset > 0 &&
+ x * scale + xOffset < drawingCanvas[ mode ].width &&
+ y * scale + yOffset < drawingCanvas[ mode ].height
+ ) {
+ eraseWithSponge( ctx, x * scale + xOffset, y * scale + yOffset );
+ }
+ }
+
+ function stopErasing() {
+ erasing = false;
+ // hide sponge
+ drawingCanvas[ mode ].sponge.style.visibility = 'hidden';
+ }
+
+ function startDrawing( x, y ) {
+ drawing = true;
+
+ var ctx = drawingCanvas[ mode ].context;
+ var scale = drawingCanvas[ mode ].scale;
+ var xOffset = drawingCanvas[ mode ].xOffset;
+ var yOffset = drawingCanvas[ mode ].yOffset;
+ lastX = x * scale + xOffset;
+ lastY = y * scale + yOffset;
+ }
+
+ function drawSegment( fromX, fromY, toX, toY, colorIdx ) {
+ var ctx = drawingCanvas[ mode ].context;
+ var scale = drawingCanvas[ mode ].scale;
+ var xOffset = drawingCanvas[ mode ].xOffset;
+ var yOffset = drawingCanvas[ mode ].yOffset;
+
+ recordEvent( {
+ type: 'draw',
+ color: colorIdx,
+ x1: fromX,
+ y1: fromY,
+ x2: toX,
+ y2: toY
+ } );
+
+ if (
+ fromX * scale + xOffset > 0 &&
+ fromY * scale + yOffset > 0 &&
+ fromX * scale + xOffset < drawingCanvas[ mode ].width &&
+ fromY * scale + yOffset < drawingCanvas[ mode ].height &&
+ toX * scale + xOffset > 0 &&
+ toY * scale + yOffset > 0 &&
+ toX * scale + xOffset < drawingCanvas[ mode ].width &&
+ toY * scale + yOffset < drawingCanvas[ mode ].height
+ ) {
+ draw[ mode ]( ctx, fromX * scale + xOffset, fromY * scale + yOffset, toX * scale + xOffset, toY * scale + yOffset, colorIdx );
+ }
+ }
+
+ function stopDrawing() {
+ drawing = false;
+ }
+
+
+/*****************************************************************
+ ** User interface
+ ******************************************************************/
+
+ function setupCanvasEvents( canvas ) {
+// TODO: check all touchevents
+ canvas.addEventListener( 'touchstart', function ( evt ) {
+ evt.preventDefault();
+//console.log("Touch start");
+ if ( !readOnly && evt.target.getAttribute( 'data-chalkboard' ) == mode ) {
+ var scale = drawingCanvas[ mode ].scale;
+ var xOffset = drawingCanvas[ mode ].xOffset;
+ var yOffset = drawingCanvas[ mode ].yOffset;
+
+ var touch = evt.touches[ 0 ];
+ mouseX = touch.pageX;
+ mouseY = touch.pageY;
+ startDrawing( ( mouseX - xOffset ) / scale, ( mouseY - yOffset ) / scale );
+ touchTimeout = setTimeout( startErasing, 500, ( mouseX - xOffset ) / scale, ( mouseY - yOffset ) / scale );
+ }
+ }, passiveSupported ? {
+ passive: false
+ } : false );
+
+ canvas.addEventListener( 'touchmove', function ( evt ) {
+ evt.preventDefault();
+//console.log("Touch move");
+ clearTimeout( touchTimeout );
+ touchTimeout = null;
+ if ( drawing || erasing ) {
+ var scale = drawingCanvas[ mode ].scale;
+ var xOffset = drawingCanvas[ mode ].xOffset;
+ var yOffset = drawingCanvas[ mode ].yOffset;
+
+ var touch = evt.touches[ 0 ];
+ mouseX = touch.pageX;
+ mouseY = touch.pageY;
+ if ( mouseY < drawingCanvas[ mode ].height && mouseX < drawingCanvas[ mode ].width ) {
+ // move sponge
+ if ( event.type == 'erase' ) {
+ drawingCanvas[ mode ].sponge.style.left = ( mouseX - eraser.radius ) + 'px';
+ drawingCanvas[ mode ].sponge.style.top = ( mouseY - eraser.radius ) + 'px';
+ }
+ }
+
+ if ( drawing ) {
+ drawSegment( ( lastX - xOffset ) / scale, ( lastY - yOffset ) / scale, ( mouseX - xOffset ) / scale, ( mouseY - yOffset ) / scale, color[ mode ] );
+ // broadcast
+ var message = new CustomEvent( messageType );
+ message.content = {
+ sender: 'chalkboard-plugin',
+ type: 'draw',
+ timestamp: Date.now() - slideStart,
+ mode,
+ board,
+ fromX: ( lastX - xOffset ) / scale,
+ fromY: ( lastY - yOffset ) / scale,
+ toX: ( mouseX - xOffset ) / scale,
+ toY: ( mouseY - yOffset ) / scale,
+ color: color[ mode ]
+ };
+ document.dispatchEvent( message );
+
+ lastX = mouseX;
+ lastY = mouseY;
+ } else {
+ erasePoint( ( mouseX - xOffset ) / scale, ( mouseY - yOffset ) / scale );
+ // broadcast
+ var message = new CustomEvent( messageType );
+ message.content = {
+ sender: 'chalkboard-plugin',
+ type: 'erase',
+ timestamp: Date.now() - slideStart,
+ mode,
+ board,
+ x: ( mouseX - xOffset ) / scale,
+ y: ( mouseY - yOffset ) / scale
+ };
+ document.dispatchEvent( message );
+ }
+
+ }
+ }, false );
+
+
+ canvas.addEventListener( 'touchend', function ( evt ) {
+ evt.preventDefault();
+ clearTimeout( touchTimeout );
+ touchTimeout = null;
+ // hide sponge image
+ drawingCanvas[ mode ].sponge.style.visibility = 'hidden';
+ stopDrawing();
+ }, false );
+
+ canvas.addEventListener( 'mousedown', function ( evt ) {
+ evt.preventDefault();
+ if ( !readOnly && evt.target.getAttribute( 'data-chalkboard' ) == mode ) {
+//console.log( "mousedown: " + evt.button );
+ var scale = drawingCanvas[ mode ].scale;
+ var xOffset = drawingCanvas[ mode ].xOffset;
+ var yOffset = drawingCanvas[ mode ].yOffset;
+
+ mouseX = evt.pageX;
+ mouseY = evt.pageY;
+
+ if ( evt.button == 2 || evt.button == 1 ) {
+ startErasing( ( mouseX - xOffset ) / scale, ( mouseY - yOffset ) / scale );
+ // broadcast
+ var message = new CustomEvent( messageType );
+ message.content = {
+ sender: 'chalkboard-plugin',
+ type: 'erase',
+ timestamp: Date.now() - slideStart,
+ mode,
+ board,
+ x: ( mouseX - xOffset ) / scale,
+ y: ( mouseY - yOffset ) / scale
+ };
+ document.dispatchEvent( message );
+ } else {
+ startDrawing( ( mouseX - xOffset ) / scale, ( mouseY - yOffset ) / scale );
+ }
+ }
+ } );
+
+ canvas.addEventListener( 'mousemove', function ( evt ) {
+ evt.preventDefault();
+//console.log("Mouse move");
+ if ( drawing || erasing ) {
+ var scale = drawingCanvas[ mode ].scale;
+ var xOffset = drawingCanvas[ mode ].xOffset;
+ var yOffset = drawingCanvas[ mode ].yOffset;
+
+ mouseX = evt.pageX;
+ mouseY = evt.pageY;
+
+ if ( drawing ) {
+ drawSegment( ( lastX - xOffset ) / scale, ( lastY - yOffset ) / scale, ( mouseX - xOffset ) / scale, ( mouseY - yOffset ) / scale, color[ mode ] );
+ // broadcast
+ var message = new CustomEvent( messageType );
+ message.content = {
+ sender: 'chalkboard-plugin',
+ type: 'draw',
+ timestamp: Date.now() - slideStart,
+ mode,
+ board,
+ fromX: ( lastX - xOffset ) / scale,
+ fromY: ( lastY - yOffset ) / scale,
+ toX: ( mouseX - xOffset ) / scale,
+ toY: ( mouseY - yOffset ) / scale,
+ color: color[ mode ]
+ };
+ document.dispatchEvent( message );
+
+ lastX = mouseX;
+ lastY = mouseY;
+ } else {
+ erasePoint( ( mouseX - xOffset ) / scale, ( mouseY - yOffset ) / scale );
+ // broadcast
+ var message = new CustomEvent( messageType );
+ message.content = {
+ sender: 'chalkboard-plugin',
+ type: 'erase',
+ timestamp: Date.now() - slideStart,
+ mode,
+ board,
+ x: ( mouseX - xOffset ) / scale,
+ y: ( mouseY - yOffset ) / scale
+ };
+ document.dispatchEvent( message );
+ }
+
+ }
+ } );
+
+
+ canvas.addEventListener( 'mouseup', function ( evt ) {
+ evt.preventDefault();
+ drawingCanvas[ mode ].canvas.style.cursor = pens[ mode ][ color[ mode ] ].cursor;
+ if ( drawing || erasing ) {
+ stopDrawing();
+ stopErasing();
+ }
+ } );
+ }
+
+ function resize() {
+//console.log("resize");
+ // Resize the canvas and draw everything again
+ var timestamp = Date.now() - slideStart;
+ if ( !playback ) {
+ timestamp = getSlideDuration();
+ }
+
+//console.log( drawingCanvas[0].scale + "/" + drawingCanvas[0].xOffset + "/" +drawingCanvas[0].yOffset );
+ for ( var id = 0; id < 2; id++ ) {
+ drawingCanvas[ id ].width = window.innerWidth;
+ drawingCanvas[ id ].height = window.innerHeight;
+ drawingCanvas[ id ].canvas.width = drawingCanvas[ id ].width;
+ drawingCanvas[ id ].canvas.height = drawingCanvas[ id ].height;
+ drawingCanvas[ id ].context.canvas.width = drawingCanvas[ id ].width;
+ drawingCanvas[ id ].context.canvas.height = drawingCanvas[ id ].height;
+
+ drawingCanvas[ id ].scale = Math.min( drawingCanvas[ id ].width / storage[ id ].width, drawingCanvas[ id ].height / storage[ id ].height );
+ drawingCanvas[ id ].xOffset = ( drawingCanvas[ id ].width - storage[ id ].width * drawingCanvas[ id ].scale ) / 2;
+ drawingCanvas[ id ].yOffset = ( drawingCanvas[ id ].height - storage[ id ].height * drawingCanvas[ id ].scale ) / 2;
+//console.log( drawingCanvas[id].scale + "/" + drawingCanvas[id].xOffset + "/" +drawingCanvas[id].yOffset );
+ }
+//console.log( window.innerWidth + "/" + window.innerHeight);
+ startPlayback( timestamp, mode, true );
+ }
+
+ Reveal.addEventListener( 'pdf-ready', function ( evt ) {
+// console.log( "Create printouts when ready" );
+ whenLoaded( createPrintout );
+ });
+
+ Reveal.addEventListener( 'ready', function ( evt ) {
+//console.log('ready');
+ if ( !printMode ) {
+ window.addEventListener( 'resize', resize );
+
+ slideStart = Date.now() - getSlideDuration();
+ slideIndices = Reveal.getIndices();
+ if ( !playback ) {
+ startPlayback( getSlideDuration(), 0 );
+ }
+ if ( Reveal.isAutoSliding() ) {
+ var event = new CustomEvent( 'startplayback' );
+ event.timestamp = 0;
+ document.dispatchEvent( event );
+ }
+ updateStorage();
+ whenReady( addPageNumbers );
+ }
+ } );
+ Reveal.addEventListener( 'slidechanged', function ( evt ) {
+// clearTimeout( slidechangeTimeout );
+//console.log('slidechanged');
+ if ( !printMode ) {
+ slideStart = Date.now() - getSlideDuration();
+ slideIndices = Reveal.getIndices();
+ closeChalkboard();
+ board = 0;
+ clearCanvas( 0 );
+ clearCanvas( 1 );
+ if ( !playback ) {
+ slidechangeTimeout = setTimeout( startPlayback, transition, getSlideDuration(), 0 );
+ }
+ if ( Reveal.isAutoSliding() ) {
+ var event = new CustomEvent( 'startplayback' );
+ event.timestamp = 0;
+ document.dispatchEvent( event );
+ }
+ }
+ } );
+ Reveal.addEventListener( 'fragmentshown', function ( evt ) {
+// clearTimeout( slidechangeTimeout );
+//console.log('fragmentshown');
+ if ( !printMode ) {
+ slideStart = Date.now() - getSlideDuration();
+ slideIndices = Reveal.getIndices();
+ closeChalkboard();
+ board = 0;
+ clearCanvas( 0 );
+ clearCanvas( 1 );
+ if ( Reveal.isAutoSliding() ) {
+ var event = new CustomEvent( 'startplayback' );
+ event.timestamp = 0;
+ document.dispatchEvent( event );
+ } else if ( !playback ) {
+ startPlayback( getSlideDuration(), 0 );
+// closeChalkboard();
+ }
+ }
+ } );
+ Reveal.addEventListener( 'fragmenthidden', function ( evt ) {
+// clearTimeout( slidechangeTimeout );
+//console.log('fragmenthidden');
+ if ( !printMode ) {
+ slideStart = Date.now() - getSlideDuration();
+ slideIndices = Reveal.getIndices();
+ closeChalkboard();
+ board = 0;
+ clearCanvas( 0 );
+ clearCanvas( 1 );
+ if ( Reveal.isAutoSliding() ) {
+ document.dispatchEvent( new CustomEvent( 'stopplayback' ) );
+ } else if ( !playback ) {
+ startPlayback( getSlideDuration() );
+ closeChalkboard();
+ }
+ }
+ } );
+
+ Reveal.addEventListener( 'autoslideresumed', function ( evt ) {
+//console.log('autoslideresumed');
+ var event = new CustomEvent( 'startplayback' );
+ event.timestamp = 0;
+ document.dispatchEvent( event );
+ } );
+ Reveal.addEventListener( 'autoslidepaused', function ( evt ) {
+//console.log('autoslidepaused');
+ document.dispatchEvent( new CustomEvent( 'stopplayback' ) );
+
+ // advance to end of slide
+// closeChalkboard();
+ startPlayback( getSlideDuration(), 0 );
+ } );
+
+ function toggleNotesCanvas() {
+ if ( !readOnly ) {
+ if ( mode == 1 ) {
+ toggleChalkboard();
+ notescanvas.style.background = background[ 0 ]; //'rgba(255,0,0,0.5)';
+ notescanvas.style.pointerEvents = 'auto';
+ }
+ else {
+ if ( notescanvas.style.pointerEvents != 'none' ) {
+ // hide notes canvas
+ if ( colorButtons ) {
+ notescanvas.querySelector( '.palette' ).style.visibility = 'hidden';
+ }
+ notescanvas.style.background = 'rgba(0,0,0,0)';
+ notescanvas.style.pointerEvents = 'none';
+ }
+ else {
+ // show notes canvas
+ if ( colorButtons ) {
+ notescanvas.querySelector( '.palette' ).style.visibility = 'visible';
+ }
+ notescanvas.style.background = background[ 0 ]; //'rgba(255,0,0,0.5)';
+ notescanvas.style.pointerEvents = 'auto';
+
+ var idx = 0;
+ if ( color[ mode ] ) {
+ idx = color[ mode ];
+ }
+
+ setColor( idx, true );
+ }
+ }
+ }
+ };
+
+ function toggleChalkboard() {
+//console.log("toggleChalkboard " + mode);
+ if ( mode == 1 ) {
+ if ( !readOnly ) {
+ recordEvent( { type: 'close' } );
+ }
+ closeChalkboard();
+
+ // broadcast
+ var message = new CustomEvent( messageType );
+ message.content = {
+ sender: 'chalkboard-plugin',
+ type: 'closeChalkboard',
+ timestamp: Date.now() - slideStart,
+ mode: 0,
+ board
+ };
+ document.dispatchEvent( message );
+
+
+ } else {
+ showChalkboard();
+ if ( !readOnly ) {
+ recordEvent( { type: 'open' } );
+ // broadcast
+ var message = new CustomEvent( messageType );
+ message.content = {
+ sender: 'chalkboard-plugin',
+ type: 'showChalkboard',
+ timestamp: Date.now() - slideStart,
+ mode: 1,
+ board
+ };
+ document.dispatchEvent( message );
+
+ var idx = 0;
+
+ if ( rememberColor[ mode ] ) {
+ idx = color[ mode ];
+ }
+
+ setColor( idx, true );
+ }
+ }
+ };
+
+ function clearSlide() {
+ recordEvent( { type: 'clear' } );
+ clearCanvas( mode );
+ }
+
+ function clear() {
+ if ( !readOnly ) {
+ clearSlide();
+ // broadcast
+ var message = new CustomEvent( messageType );
+ message.content = {
+ sender: 'chalkboard-plugin',
+ type: 'clear',
+ timestamp: Date.now() - slideStart,
+ mode,
+ board
+ };
+ document.dispatchEvent( message );
+ }
+ };
+
+ function colorIndex( idx ) {
+ if ( !readOnly ) {
+ setColor( idx, true );
+ }
+ }
+
+ function colorNext() {
+ if ( !readOnly ) {
+ let idx = cycleColorNext();
+ setColor( idx, true );
+ }
+ }
+
+ function colorPrev() {
+ if ( !readOnly ) {
+ let idx = cycleColorPrev();
+ setColor( idx, true );
+ }
+ }
+
+ function resetSlideDrawings() {
+ slideStart = Date.now();
+ closeChalkboard();
+
+ clearCanvas( 0 );
+ clearCanvas( 1 );
+
+ mode = 1;
+ var slideData = getSlideData();
+ slideData.duration = 0;
+ slideData.events = [];
+ mode = 0;
+ var slideData = getSlideData();
+ slideData.duration = 0;
+ slideData.events = [];
+
+ updateStorage();
+ }
+
+ function resetSlide( force ) {
+ var ok = force || confirm( "Please confirm to delete chalkboard drawings on this slide!" );
+ if ( ok ) {
+//console.log("resetSlide ");
+ stopPlayback();
+ resetSlideDrawings();
+ // broadcast
+ var message = new CustomEvent( messageType );
+ message.content = {
+ sender: 'chalkboard-plugin',
+ type: 'resetSlide',
+ timestamp: Date.now() - slideStart,
+ mode,
+ board
+ };
+ document.dispatchEvent( message );
+ }
+ };
+
+ function resetStorage( force ) {
+ var ok = force || confirm( "Please confirm to delete all chalkboard drawings!" );
+ if ( ok ) {
+ stopPlayback();
+ slideStart = Date.now();
+ clearCanvas( 0 );
+ clearCanvas( 1 );
+ if ( mode == 1 ) {
+ closeChalkboard();
+ }
+
+ storage = [ {
+ width: Reveal.getConfig().width,
+ height: Reveal.getConfig().height,
+ data: []
+ },
+ {
+ width: Reveal.getConfig().width,
+ height: Reveal.getConfig().height,
+ data: []
+ }
+ ];
+
+ if ( config.storage ) {
+ sessionStorage.setItem( config.storage, null )
+ }
+ // broadcast
+ var message = new CustomEvent( messageType );
+ message.content = {
+ sender: 'chalkboard-plugin',
+ type: 'init',
+ timestamp: Date.now() - slideStart,
+ storage,
+ mode,
+ board
+ };
+ document.dispatchEvent( message );
+ }
+ };
+
+ this.toggleNotesCanvas = toggleNotesCanvas;
+ this.toggleChalkboard = toggleChalkboard;
+ this.colorIndex = colorIndex;
+ this.colorNext = colorNext;
+ this.colorPrev = colorPrev;
+ this.clear = clear;
+ this.reset = resetSlide;
+ this.resetAll = resetStorage;
+ this.download = downloadData;
+ this.updateStorage = updateStorage;
+ this.getData = getData;
+ this.configure = configure;
+
+
+ for ( var key in keyBindings ) {
+ if ( keyBindings[ key ] ) {
+ Reveal.addKeyBinding( keyBindings[ key ], RevealChalkboard[ key ] );
+ }
+ };
+
+ return this;
+};
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/plugin.yml b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/plugin.yml
new file mode 100644
index 0000000..b0568c2
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/plugin.yml
@@ -0,0 +1,7 @@
+name: RevealChalkboard
+script: plugin.js
+stylesheet: ["font-awesome/css/all.css", "style.css"]
+self-contained: false
+config:
+ chalkboard:
+ buttons: true
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/style.css b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/style.css
new file mode 100644
index 0000000..08765e7
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-chalkboard/style.css
@@ -0,0 +1,44 @@
+div.palette, div.boardhandle {
+ position: absolute;
+/*
+ height: 260px;
+ margin: -130px 0 0 0px;
+*/
+ top: 50%;
+ transform: translateY(-50%);
+ font-size: 24px;
+ border-radius: 10px;
+ border-top: 4px solid #222;
+ border-right: 4px solid #222;
+ border-bottom: 4px solid #222;
+ background: black;
+ transition: transform 0.3s;
+}
+
+div.palette {
+ left: -10px;
+ padding-left:10px;
+}
+
+div.boardhandle {
+ right: -10px;
+ padding-right:10px;
+}
+
+div.palette > ul,
+div.boardhandle > ul {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+
+div.palette > ul > li,
+div.boardhandle > ul > li {
+ margin: 10px;
+}
+
+@media print {
+ div.palette, div.boardhandle, .chalkboard-button {
+ display: none!important;
+ }
+}
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-menu/menu.css b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-menu/menu.css
new file mode 100644
index 0000000..5a300fd
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-menu/menu.css
@@ -0,0 +1,346 @@
+.slide-menu-wrapper {
+ font-family: 'Source Sans Pro', Helvetica, sans-serif;
+}
+
+.slide-menu-wrapper .slide-menu {
+ background-color: #333;
+ z-index: 200;
+ position: fixed;
+ top: 0;
+ width: 300px;
+ height: 100%;
+ /*overflow-y: scroll;*/
+ transition: transform 0.3s;
+ font-size: 16px;
+ font-weight: normal;
+}
+
+.slide-menu-wrapper .slide-menu.slide-menu--wide {
+ width: 500px;
+}
+
+.slide-menu-wrapper .slide-menu.slide-menu--third {
+ width: 33%;
+}
+
+.slide-menu-wrapper .slide-menu.slide-menu--half {
+ width: 50%;
+}
+
+.slide-menu-wrapper .slide-menu.slide-menu--full {
+ width: 95%;
+}
+
+/*
+ * Slides menu
+ */
+
+.slide-menu-wrapper .slide-menu-items {
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ border-bottom: solid 1px #555;
+}
+
+.slide-menu-wrapper .slide-menu-item,
+.slide-menu-wrapper .slide-menu-item-vertical {
+ display: block;
+ text-align: left;
+ padding: 10px 18px;
+ color: #aaa;
+ cursor: pointer;
+}
+
+.slide-menu-wrapper .slide-menu-item-vertical {
+ padding-left: 30px;
+}
+
+.slide-menu-wrapper .slide-menu--wide .slide-menu-item-vertical,
+.slide-menu-wrapper .slide-menu--third .slide-menu-item-vertical,
+.slide-menu-wrapper .slide-menu--half .slide-menu-item-vertical,
+.slide-menu-wrapper .slide-menu--full .slide-menu-item-vertical,
+.slide-menu-wrapper .slide-menu--custom .slide-menu-item-vertical {
+ padding-left: 50px;
+}
+
+.slide-menu-wrapper .slide-menu-item {
+ border-top: solid 1px #555;
+}
+
+.slide-menu-wrapper .active-menu-panel li.selected {
+ background-color: #222;
+ color: white;
+}
+
+.slide-menu-wrapper .active-menu-panel li.active {
+ color: #eee;
+}
+
+.slide-menu-wrapper .slide-menu-item.no-title .slide-menu-item-title,
+.slide-menu-wrapper .slide-menu-item-vertical.no-title .slide-menu-item-title {
+ font-style: italic;
+}
+
+.slide-menu-wrapper .slide-menu-item-number {
+ color: #999;
+ padding-right: 6px;
+}
+
+.slide-menu-wrapper .slide-menu-item i.far,
+.slide-menu-wrapper .slide-menu-item i.fas,
+.slide-menu-wrapper .slide-menu-item-vertical i.far,
+.slide-menu-wrapper .slide-menu-item-vertical i.fas,
+.slide-menu-wrapper .slide-menu-item svg.svg-inline--fa,
+.slide-menu-wrapper .slide-menu-item-vertical svg.svg-inline--fa {
+ padding-right: 12px;
+ display: none;
+}
+
+.slide-menu-wrapper .slide-menu-item.past i.fas.past,
+.slide-menu-wrapper .slide-menu-item-vertical.past i.fas.past,
+.slide-menu-wrapper .slide-menu-item.active i.fas.active,
+.slide-menu-wrapper .slide-menu-item-vertical.active i.fas.active,
+.slide-menu-wrapper .slide-menu-item.future i.far.future,
+.slide-menu-wrapper .slide-menu-item-vertical.future i.far.future,
+.slide-menu-wrapper .slide-menu-item.past svg.svg-inline--fa.past,
+.slide-menu-wrapper .slide-menu-item-vertical.past svg.svg-inline--fa.past,
+.slide-menu-wrapper .slide-menu-item.active svg.svg-inline--fa.active,
+.slide-menu-wrapper .slide-menu-item-vertical.active svg.svg-inline--fa.active,
+.slide-menu-wrapper .slide-menu-item.future svg.svg-inline--fa.future,
+.slide-menu-wrapper .slide-menu-item-vertical.future svg.svg-inline--fa.future {
+ display: inline-block;
+}
+
+.slide-menu-wrapper .slide-menu-item.past i.fas.past,
+.slide-menu-wrapper .slide-menu-item-vertical.past i.fas.past,
+.slide-menu-wrapper .slide-menu-item.future i.far.future,
+.slide-menu-wrapper .slide-menu-item-vertical.future i.far.future,
+.slide-menu-wrapper .slide-menu-item.past svg.svg-inline--fa.past,
+.slide-menu-wrapper .slide-menu-item-vertical.past svg.svg-inline--fa.past,
+.slide-menu-wrapper .slide-menu-item.future svg.svg-inline--fa.future,
+.slide-menu-wrapper .slide-menu-item-vertical.future svg.svg-inline--fa.future {
+ opacity: 0.4;
+}
+
+.slide-menu-wrapper .slide-menu-item.active i.fas.active,
+.slide-menu-wrapper .slide-menu-item-vertical.active i.fas.active,
+.slide-menu-wrapper .slide-menu-item.active svg.svg-inline--fa.active,
+.slide-menu-wrapper .slide-menu-item-vertical.active svg.svg-inline--fa.active {
+ opacity: 0.8;
+}
+
+.slide-menu-wrapper .slide-menu--left {
+ left: 0;
+ -webkit-transform: translateX(-100%);
+ -ms-transform: translateX(-100%);
+ transform: translateX(-100%);
+}
+
+.slide-menu-wrapper .slide-menu--left.active {
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+}
+
+.slide-menu-wrapper .slide-menu--right {
+ right: 0;
+ -webkit-transform: translateX(100%);
+ -ms-transform: translateX(100%);
+ transform: translateX(100%);
+}
+
+.slide-menu-wrapper .slide-menu--right.active {
+ -webkit-transform: translateX(0);
+ -ms-transform: translateX(0);
+ transform: translateX(0);
+}
+
+.slide-menu-wrapper {
+ transition: transform 0.3s;
+}
+
+/*
+ * Toolbar
+ */
+.slide-menu-wrapper .slide-menu-toolbar {
+ height: 60px;
+ width: 100%;
+ font-size: 12px;
+ display: table;
+ table-layout: fixed; /* ensures equal width */
+ margin: 0;
+ padding: 0;
+ border-bottom: solid 2px #666;
+}
+
+.slide-menu-wrapper .slide-menu-toolbar > li {
+ display: table-cell;
+ line-height: 150%;
+ text-align: center;
+ vertical-align: middle;
+ cursor: pointer;
+ color: #aaa;
+ border-radius: 3px;
+}
+
+.slide-menu-wrapper .slide-menu-toolbar > li.toolbar-panel-button i,
+.slide-menu-wrapper
+ .slide-menu-toolbar
+ > li.toolbar-panel-button
+ svg.svg-inline--fa {
+ font-size: 1.7em;
+}
+
+.slide-menu-wrapper .slide-menu-toolbar > li.active-toolbar-button {
+ color: white;
+ text-shadow: 0 1px black;
+ text-decoration: underline;
+}
+
+.slide-menu-toolbar > li.toolbar-panel-button:hover {
+ color: white;
+}
+
+.slide-menu-toolbar
+ > li.toolbar-panel-button:hover
+ span.slide-menu-toolbar-label,
+.slide-menu-wrapper
+ .slide-menu-toolbar
+ > li.active-toolbar-button
+ span.slide-menu-toolbar-label {
+ visibility: visible;
+}
+
+/*
+ * Panels
+ */
+.slide-menu-wrapper .slide-menu-panel {
+ position: absolute;
+ width: 100%;
+ visibility: hidden;
+ height: calc(100% - 60px);
+ overflow-x: hidden;
+ overflow-y: auto;
+ color: #aaa;
+}
+
+.slide-menu-wrapper .slide-menu-panel.active-menu-panel {
+ visibility: visible;
+}
+
+.slide-menu-wrapper .slide-menu-panel h1,
+.slide-menu-wrapper .slide-menu-panel h2,
+.slide-menu-wrapper .slide-menu-panel h3,
+.slide-menu-wrapper .slide-menu-panel h4,
+.slide-menu-wrapper .slide-menu-panel h5,
+.slide-menu-wrapper .slide-menu-panel h6 {
+ margin: 20px 0 10px 0;
+ color: #fff;
+ line-height: 1.2;
+ letter-spacing: normal;
+ text-shadow: none;
+}
+
+.slide-menu-wrapper .slide-menu-panel h1 {
+ font-size: 1.6em;
+}
+.slide-menu-wrapper .slide-menu-panel h2 {
+ font-size: 1.4em;
+}
+.slide-menu-wrapper .slide-menu-panel h3 {
+ font-size: 1.3em;
+}
+.slide-menu-wrapper .slide-menu-panel h4 {
+ font-size: 1.1em;
+}
+.slide-menu-wrapper .slide-menu-panel h5 {
+ font-size: 1em;
+}
+.slide-menu-wrapper .slide-menu-panel h6 {
+ font-size: 0.9em;
+}
+
+.slide-menu-wrapper .slide-menu-panel p {
+ margin: 10px 0 5px 0;
+}
+
+.slide-menu-wrapper .slide-menu-panel a {
+ color: #ccc;
+ text-decoration: underline;
+}
+
+.slide-menu-wrapper .slide-menu-panel a:hover {
+ color: white;
+}
+
+.slide-menu-wrapper .slide-menu-item a {
+ text-decoration: none;
+}
+
+.slide-menu-wrapper .slide-menu-custom-panel {
+ width: calc(100% - 20px);
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+.slide-menu-wrapper .slide-menu-custom-panel .slide-menu-items {
+ width: calc(100% + 20px);
+ margin-left: -10px;
+ margin-right: 10px;
+}
+
+/*
+ * Theme and Transitions buttons
+ */
+
+.slide-menu-wrapper div[data-panel='Themes'] li,
+.slide-menu-wrapper div[data-panel='Transitions'] li {
+ display: block;
+ text-align: left;
+ cursor: pointer;
+ color: #848484;
+}
+
+/*
+ * Menu controls
+ */
+.reveal .slide-menu-button {
+ position: fixed;
+ left: 30px;
+ bottom: 30px;
+ z-index: 30;
+ font-size: 24px;
+}
+
+/*
+ * Menu overlay
+ */
+
+.slide-menu-wrapper .slide-menu-overlay {
+ position: fixed;
+ z-index: 199;
+ top: 0;
+ left: 0;
+ overflow: hidden;
+ width: 0;
+ height: 0;
+ background-color: #000;
+ opacity: 0;
+ transition: opacity 0.3s, width 0s 0.3s, height 0s 0.3s;
+}
+
+.slide-menu-wrapper .slide-menu-overlay.active {
+ width: 100%;
+ height: 100%;
+ opacity: 0.7;
+ transition: opacity 0.3s;
+}
+
+/*
+ * Hide menu for pdf printing
+ */
+body.print-pdf .slide-menu-wrapper .slide-menu,
+body.print-pdf .reveal .slide-menu-button,
+body.print-pdf .slide-menu-wrapper .slide-menu-overlay {
+ display: none;
+}
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-menu/menu.js b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-menu/menu.js
new file mode 100644
index 0000000..5369df3
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-menu/menu.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).RevealMenu=t()}(this,(function(){"use strict";var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e,t,n){return e(n={path:t,exports:{},require:function(e,t){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==t&&n.path)}},n.exports),n.exports}var n=function(e){return e&&e.Math==Math&&e},r=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||Function("return this")(),i=function(e){try{return!!e()}catch(e){return!0}},a=!i((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),o={}.propertyIsEnumerable,s=Object.getOwnPropertyDescriptor,l={f:s&&!o.call({1:2},1)?function(e){var t=s(this,e);return!!t&&t.enumerable}:o},c=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},u={}.toString,f=function(e){return u.call(e).slice(8,-1)},d="".split,p=i((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==f(e)?d.call(e,""):Object(e)}:Object,h=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},m=function(e){return p(h(e))},v=function(e){return"object"==typeof e?null!==e:"function"==typeof e},g=function(e,t){if(!v(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!v(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!v(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!v(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")},y={}.hasOwnProperty,b=function(e,t){return y.call(e,t)},S=r.document,E=v(S)&&v(S.createElement),x=!a&&!i((function(){return 7!=Object.defineProperty((e="div",E?S.createElement(e):{}),"a",{get:function(){return 7}}).a;var e})),w=Object.getOwnPropertyDescriptor,L={f:a?w:function(e,t){if(e=m(e),t=g(t,!0),x)try{return w(e,t)}catch(e){}if(b(e,t))return c(!l.f.call(e,t),e[t])}},T=function(e){if(!v(e))throw TypeError(String(e)+" is not an object");return e},C=Object.defineProperty,O={f:a?C:function(e,t,n){if(T(e),t=g(t,!0),T(n),x)try{return C(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},A=a?function(e,t,n){return O.f(e,t,c(1,n))}:function(e,t,n){return e[t]=n,e},k=function(e,t){try{A(r,e,t)}catch(n){r[e]=t}return t},I=r["__core-js_shared__"]||k("__core-js_shared__",{}),P=Function.toString;"function"!=typeof I.inspectSource&&(I.inspectSource=function(e){return P.call(e)});var M,R,j,N,_=I.inspectSource,F=r.WeakMap,W="function"==typeof F&&/native code/.test(_(F)),H=t((function(e){(e.exports=function(e,t){return I[e]||(I[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.6.5",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),U=0,$=Math.random(),D=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++U+$).toString(36)},q=H("keys"),B={},G=r.WeakMap;if(W){var V=new G,K=V.get,z=V.has,X=V.set;M=function(e,t){return X.call(V,e,t),t},R=function(e){return K.call(V,e)||{}},j=function(e){return z.call(V,e)}}else{var Y=q[N="state"]||(q[N]=D(N));B[Y]=!0,M=function(e,t){return A(e,Y,t),t},R=function(e){return b(e,Y)?e[Y]:{}},j=function(e){return b(e,Y)}}var J={set:M,get:R,has:j,enforce:function(e){return j(e)?R(e):M(e,{})},getterFor:function(e){return function(t){var n;if(!v(t)||(n=R(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},Z=t((function(e){var t=J.get,n=J.enforce,i=String(String).split("String");(e.exports=function(e,t,a,o){var s=!!o&&!!o.unsafe,l=!!o&&!!o.enumerable,c=!!o&&!!o.noTargetGet;"function"==typeof a&&("string"!=typeof t||b(a,"name")||A(a,"name",t),n(a).source=i.join("string"==typeof t?t:"")),e!==r?(s?!c&&e[t]&&(l=!0):delete e[t],l?e[t]=a:A(e,t,a)):l?e[t]=a:k(t,a)})(Function.prototype,"toString",(function(){return"function"==typeof this&&t(this).source||_(this)}))})),Q=r,ee=function(e){return"function"==typeof e?e:void 0},te=function(e,t){return arguments.length<2?ee(Q[e])||ee(r[e]):Q[e]&&Q[e][t]||r[e]&&r[e][t]},ne=Math.ceil,re=Math.floor,ie=function(e){return isNaN(e=+e)?0:(e>0?re:ne)(e)},ae=Math.min,oe=function(e){return e>0?ae(ie(e),9007199254740991):0},se=Math.max,le=Math.min,ce=function(e,t){var n=ie(e);return n<0?se(n+t,0):le(n,t)},ue=function(e){return function(t,n,r){var i,a=m(t),o=oe(a.length),s=ce(r,o);if(e&&n!=n){for(;o>s;)if((i=a[s++])!=i)return!0}else for(;o>s;s++)if((e||s in a)&&a[s]===n)return e||s||0;return!e&&-1}},fe={includes:ue(!0),indexOf:ue(!1)},de=fe.indexOf,pe=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"].concat("length","prototype"),he={f:Object.getOwnPropertyNames||function(e){return function(e,t){var n,r=m(e),i=0,a=[];for(n in r)!b(B,n)&&b(r,n)&&a.push(n);for(;t.length>i;)b(r,n=t[i++])&&(~de(a,n)||a.push(n));return a}(e,pe)}},me={f:Object.getOwnPropertySymbols},ve=te("Reflect","ownKeys")||function(e){var t=he.f(T(e)),n=me.f;return n?t.concat(n(e)):t},ge=function(e,t){for(var n=ve(t),r=O.f,i=L.f,a=0;ay;y++)if((o||y in m)&&(d=v(f=m[y],y,h),e))if(t)S[y]=d;else if(d)switch(e){case 3:return!0;case 5:return f;case 6:return y;case 2:We.call(S,f)}else if(i)return!1;return a?-1:r||i?i:S}},Ue={forEach:He(0),map:He(1),filter:He(2),some:He(3),every:He(4),find:He(5),findIndex:He(6)},$e=function(e,t){var n=[][e];return!!n&&i((function(){n.call(null,t||function(){throw 1},1)}))},De=Object.defineProperty,qe={},Be=function(e){throw e},Ge=function(e,t){if(b(qe,e))return qe[e];t||(t={});var n=[][e],r=!!b(t,"ACCESSORS")&&t.ACCESSORS,o=b(t,0)?t[0]:Be,s=b(t,1)?t[1]:void 0;return qe[e]=!!n&&!i((function(){if(r&&!a)return!0;var e={length:-1};r?De(e,1,{enumerable:!0,get:Be}):e[1]=1,n.call(e,o,s)}))},Ve=Ue.every,Ke=$e("every"),ze=Ge("every");Ce({target:"Array",proto:!0,forced:!Ke||!ze},{every:function(e){return Ve(this,e,arguments.length>1?arguments[1]:void 0)}});var Xe,Ye,Je=te("navigator","userAgent")||"",Ze=r.process,Qe=Ze&&Ze.versions,et=Qe&&Qe.v8;et?Ye=(Xe=et.split("."))[0]+Xe[1]:Je&&(!(Xe=Je.match(/Edge\/(\d+)/))||Xe[1]>=74)&&(Xe=Je.match(/Chrome\/(\d+)/))&&(Ye=Xe[1]);var tt=Ye&&+Ye,nt=Ne("species"),rt=function(e){return tt>=51||!i((function(){var t=[];return(t.constructor={})[nt]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},it=Ue.filter,at=rt("filter"),ot=Ge("filter");Ce({target:"Array",proto:!0,forced:!at||!ot},{filter:function(e){return it(this,e,arguments.length>1?arguments[1]:void 0)}});var st=Ue.forEach,lt=$e("forEach"),ct=Ge("forEach"),ut=lt&&ct?[].forEach:function(e){return st(this,e,arguments.length>1?arguments[1]:void 0)};Ce({target:"Array",proto:!0,forced:[].forEach!=ut},{forEach:ut});var ft=fe.indexOf,dt=[].indexOf,pt=!!dt&&1/[1].indexOf(1,-0)<0,ht=$e("indexOf"),mt=Ge("indexOf",{ACCESSORS:!0,1:0});Ce({target:"Array",proto:!0,forced:pt||!ht||!mt},{indexOf:function(e){return pt?dt.apply(this,arguments)||0:ft(this,e,arguments.length>1?arguments[1]:void 0)}}),Ce({target:"Array",stat:!0},{isArray:ke});var vt=[].join,gt=p!=Object,yt=$e("join",",");Ce({target:"Array",proto:!0,forced:gt||!yt},{join:function(e){return vt.call(m(this),void 0===e?",":e)}});var bt=Math.min,St=[].lastIndexOf,Et=!!St&&1/[1].lastIndexOf(1,-0)<0,xt=$e("lastIndexOf"),wt=Ge("indexOf",{ACCESSORS:!0,1:0}),Lt=Et||!xt||!wt?function(e){if(Et)return St.apply(this,arguments)||0;var t=m(this),n=oe(t.length),r=n-1;for(arguments.length>1&&(r=bt(r,ie(arguments[1]))),r<0&&(r=n+r);r>=0;r--)if(r in t&&t[r]===e)return r||0;return-1}:St;Ce({target:"Array",proto:!0,forced:Lt!==[].lastIndexOf},{lastIndexOf:Lt});var Tt=Ue.map,Ct=rt("map"),Ot=Ge("map");Ce({target:"Array",proto:!0,forced:!Ct||!Ot},{map:function(e){return Tt(this,e,arguments.length>1?arguments[1]:void 0)}});var At=function(e,t,n){var r=g(t);r in e?O.f(e,r,c(0,n)):e[r]=n},kt=rt("slice"),It=Ge("slice",{ACCESSORS:!0,0:0,1:2}),Pt=Ne("species"),Mt=[].slice,Rt=Math.max;Ce({target:"Array",proto:!0,forced:!kt||!It},{slice:function(e,t){var n,r,i,a=m(this),o=oe(a.length),s=ce(e,o),l=ce(void 0===t?o:t,o);if(ke(a)&&("function"!=typeof(n=a.constructor)||n!==Array&&!ke(n.prototype)?v(n)&&null===(n=n[Pt])&&(n=void 0):n=void 0,n===Array||void 0===n))return Mt.call(a,s,l);for(r=new(void 0===n?Array:n)(Rt(l-s,0)),i=0;s>>0||(Qt.test(n)?16:10))}:Zt;Ce({global:!0,forced:parseInt!=en},{parseInt:en});var tn=function(){var e=T(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t};function nn(e,t){return RegExp(e,t)}var rn,an,on={UNSUPPORTED_Y:i((function(){var e=nn("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),BROKEN_CARET:i((function(){var e=nn("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},sn=RegExp.prototype.exec,ln=String.prototype.replace,cn=sn,un=(rn=/a/,an=/b*/g,sn.call(rn,"a"),sn.call(an,"a"),0!==rn.lastIndex||0!==an.lastIndex),fn=on.UNSUPPORTED_Y||on.BROKEN_CARET,dn=void 0!==/()??/.exec("")[1];(un||dn||fn)&&(cn=function(e){var t,n,r,i,a=this,o=fn&&a.sticky,s=tn.call(a),l=a.source,c=0,u=e;return o&&(-1===(s=s.replace("y","")).indexOf("g")&&(s+="g"),u=String(e).slice(a.lastIndex),a.lastIndex>0&&(!a.multiline||a.multiline&&"\n"!==e[a.lastIndex-1])&&(l="(?: "+l+")",u=" "+u,c++),n=new RegExp("^(?:"+l+")",s)),dn&&(n=new RegExp("^"+l+"$(?!\\s)",s)),un&&(t=a.lastIndex),r=sn.call(o?n:a,u),o?r?(r.input=r.input.slice(c),r[0]=r[0].slice(c),r.index=a.lastIndex,a.lastIndex+=r[0].length):a.lastIndex=0:un&&r&&(a.lastIndex=a.global?r.index+r[0].length:t),dn&&r&&r.length>1&&ln.call(r[0],n,(function(){for(i=1;i1?arguments[1]:void 0,r=oe(t.length),i=void 0===n?r:xn(oe(n),r),a=String(e);return En?En.call(t,a,i):t.slice(i-a.length,i)===a}});var Ln=Ne("species"),Tn=!i((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")})),Cn="$0"==="a".replace(/./,"$0"),On=Ne("replace"),An=!!/./[On]&&""===/./[On]("a","$0"),kn=!i((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]})),In=function(e,t,n,r){var a=Ne(e),o=!i((function(){var t={};return t[a]=function(){return 7},7!=""[e](t)})),s=o&&!i((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[Ln]=function(){return n},n.flags="",n[a]=/./[a]),n.exec=function(){return t=!0,null},n[a](""),!t}));if(!o||!s||"replace"===e&&(!Tn||!Cn||An)||"split"===e&&!kn){var l=/./[a],c=n(a,""[e],(function(e,t,n,r,i){return t.exec===pn?o&&!i?{done:!0,value:l.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),{REPLACE_KEEPS_$0:Cn,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:An}),u=c[0],f=c[1];Z(String.prototype,e,u),Z(RegExp.prototype,a,2==t?function(e,t){return f.call(e,this,t)}:function(e){return f.call(e,this)})}r&&A(RegExp.prototype[a],"sham",!0)},Pn=function(e){return function(t,n){var r,i,a=String(h(t)),o=ie(n),s=a.length;return o<0||o>=s?e?"":void 0:(r=a.charCodeAt(o))<55296||r>56319||o+1===s||(i=a.charCodeAt(o+1))<56320||i>57343?e?a.charAt(o):r:e?a.slice(o,o+2):i-56320+(r-55296<<10)+65536}},Mn={codeAt:Pn(!1),charAt:Pn(!0)}.charAt,Rn=function(e,t,n){return t+(n?Mn(e,t).length:1)},jn=function(e,t){var n=e.exec;if("function"==typeof n){var r=n.call(e,t);if("object"!=typeof r)throw TypeError("RegExp exec method returned something other than an Object or null");return r}if("RegExp"!==f(e))throw TypeError("RegExp#exec called on incompatible receiver");return pn.call(e,t)},Nn=Math.max,_n=Math.min,Fn=Math.floor,Wn=/\$([$&'`]|\d\d?|<[^>]*>)/g,Hn=/\$([$&'`]|\d\d?)/g;In("replace",2,(function(e,t,n,r){var i=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,a=r.REPLACE_KEEPS_$0,o=i?"$":"$0";return[function(n,r){var i=h(this),a=null==n?void 0:n[e];return void 0!==a?a.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!i&&a||"string"==typeof r&&-1===r.indexOf(o)){var l=n(t,e,this,r);if(l.done)return l.value}var c=T(e),u=String(this),f="function"==typeof r;f||(r=String(r));var d=c.global;if(d){var p=c.unicode;c.lastIndex=0}for(var h=[];;){var m=jn(c,u);if(null===m)break;if(h.push(m),!d)break;""===String(m[0])&&(c.lastIndex=Rn(u,oe(c.lastIndex),p))}for(var v,g="",y=0,b=0;b=y&&(g+=u.slice(y,E)+O,y=E+S.length)}return g+u.slice(y)}];function s(e,n,r,i,a,o){var s=r+e.length,l=i.length,c=Hn;return void 0!==a&&(a=Ae(a),c=Wn),t.call(o,c,(function(t,o){var c;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,r);case"'":return n.slice(s);case"<":c=a[o.slice(1,-1)];break;default:var u=+o;if(0===u)return t;if(u>l){var f=Fn(u/10);return 0===f?t:f<=l?void 0===i[f-1]?o.charAt(1):i[f-1]+o.charAt(1):t}c=i[u-1]}return void 0===c?"":c}))}}));var Un=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};In("search",1,(function(e,t,n){return[function(t){var n=h(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var i=T(e),a=String(this),o=i.lastIndex;Un(o,0)||(i.lastIndex=0);var s=jn(i,a);return Un(i.lastIndex,o)||(i.lastIndex=o),null===s?-1:s.index}]}));var $n=Ne("species"),Dn=[].push,qn=Math.min,Bn=!i((function(){return!RegExp(4294967295,"y")}));In("split",2,(function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(h(this)),i=void 0===n?4294967295:n>>>0;if(0===i)return[];if(void 0===e)return[r];if(!vn(e))return t.call(r,e,i);for(var a,o,s,l=[],c=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),u=0,f=new RegExp(e.source,c+"g");(a=pn.call(f,r))&&!((o=f.lastIndex)>u&&(l.push(r.slice(u,a.index)),a.length>1&&a.index=i));)f.lastIndex===a.index&&f.lastIndex++;return u===r.length?!s&&f.test("")||l.push(""):l.push(r.slice(u)),l.length>i?l.slice(0,i):l}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=h(this),a=null==t?void 0:t[e];return void 0!==a?a.call(t,i,n):r.call(String(i),t,n)},function(e,i){var a=n(r,e,this,i,r!==t);if(a.done)return a.value;var o=T(e),s=String(this),l=function(e,t){var n,r=T(e).constructor;return void 0===r||null==(n=T(r)[$n])?t:Oe(n)}(o,RegExp),c=o.unicode,u=(o.ignoreCase?"i":"")+(o.multiline?"m":"")+(o.unicode?"u":"")+(Bn?"y":"g"),f=new l(Bn?o:"^(?:"+o.source+")",u),d=void 0===i?4294967295:i>>>0;if(0===d)return[];if(0===s.length)return null===jn(f,s)?[s]:[];for(var p=0,h=0,m=[];h1?arguments[1]:void 0,t.length)),r=String(e);return Vn?Vn.call(t,r,n):t.slice(n,n+r.length)===r}});var Xn,Yn=Kt.trim;Ce({target:"String",proto:!0,forced:(Xn="trim",i((function(){return!!Dt[Xn]()||"
"!="
"[Xn]()||Dt[Xn].name!==Xn})))},{trim:function(){return Yn(this)}});for(var Jn in{CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}){var Zn=r[Jn],Qn=Zn&&Zn.prototype;if(Qn&&Qn.forEach!==ut)try{A(Qn,"forEach",ut)}catch(e){Qn.forEach=ut}}var er=[].slice,tr=function(e){return function(t,n){var r=arguments.length>2,i=r?er.call(arguments,2):void 0;return e(r?function(){("function"==typeof t?t:Function(t)).apply(this,i)}:t,n)}};Ce({global:!0,bind:!0,forced:/MSIE .\./.test(Je)},{setTimeout:tr(r.setTimeout),setInterval:tr(r.setInterval)});return String.prototype.startsWith||(String.prototype.startsWith=function(e,t){return this.substr(t||0,e.length)===e}),String.prototype.endsWith||(String.prototype.endsWith=function(e,t){return(void 0===t||t>this.length)&&(t=this.length),this.substring(t-e.length,t)===e}),function(){var e,t,n,r,i=(e=/(msie) ([\w.]+)/.exec(window.navigator.userAgent.toLowerCase()))&&"msie"===e[1]?parseFloat(e[2]):null,a=!1;function o(e){(r=e.menu||{}).path=r.path||function(){var e;if(document.querySelector('script[src$="menu.js"]')){var t=document.querySelector('script[src$="menu.js"]');t&&(e=t.src.slice(0,-7))}else e=("undefined"==typeof document?new(require("url").URL)("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("menu.js",document.baseURI).href).slice(0,("undefined"==typeof document?new(require("url").URL)("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("menu.js",document.baseURI).href).lastIndexOf("/")+1);return e}()||"plugin/menu/",r.path.endsWith("/")||(r.path+="/"),void 0===r.side&&(r.side="left"),void 0===r.numbers&&(r.numbers=!1),"string"!=typeof r.titleSelector&&(r.titleSelector="h1, h2, h3, h4, h5"),void 0===r.hideMissingTitles&&(r.hideMissingTitles=!1),void 0===r.useTextContentForMissingTitles&&(r.useTextContentForMissingTitles=!1),void 0===r.markers&&(r.markers=!0),"string"!=typeof r.themesPath&&(r.themesPath="dist/theme/"),r.themesPath.endsWith("/")||(r.themesPath+="/"),O("link#theme")||(r.themes=!1),!0===r.themes?r.themes=[{name:"Black",theme:r.themesPath+"black.css"},{name:"White",theme:r.themesPath+"white.css"},{name:"League",theme:r.themesPath+"league.css"},{name:"Sky",theme:r.themesPath+"sky.css"},{name:"Beige",theme:r.themesPath+"beige.css"},{name:"Simple",theme:r.themesPath+"simple.css"},{name:"Serif",theme:r.themesPath+"serif.css"},{name:"Blood",theme:r.themesPath+"blood.css"},{name:"Night",theme:r.themesPath+"night.css"},{name:"Moon",theme:r.themesPath+"moon.css"},{name:"Solarized",theme:r.themesPath+"solarized.css"}]:Array.isArray(r.themes)||(r.themes=!1),void 0===r.transitions&&(r.transitions=!1),!0===r.transitions?r.transitions=["None","Fade","Slide","Convex","Concave","Zoom"]:!1===r.transitions||Array.isArray(r.transitions)&&r.transitions.every((function(e){return"string"==typeof e}))||(console.error("reveal.js-menu error: transitions config value must be 'true' or an array of strings, eg ['None', 'Fade', 'Slide')"),r.transitions=!1),i&&i<=9&&(r.transitions=!1),void 0===r.openButton&&(r.openButton=!0),void 0===r.openSlideNumber&&(r.openSlideNumber=!1),void 0===r.keyboard&&(r.keyboard=!0),void 0===r.sticky&&(r.sticky=!1),void 0===r.autoOpen&&(r.autoOpen=!0),void 0===r.delayInit&&(r.delayInit=!1),void 0===r.openOnInit&&(r.openOnInit=!1)}var s=!0;function l(){s=!1}function c(){O("nav.slide-menu").addEventListener("mousemove",(function e(t){O("nav.slide-menu").removeEventListener("mousemove",e),s=!0}))}function u(e){var t=function(e){for(var t=0,n=0;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t+=e.offsetLeft-e.scrollLeft,n+=e.offsetTop-e.scrollTop,e=e.offsetParent;return{top:n,left:t}}(e).top-e.offsetParent.offsetTop;if(t<0)return-t;var n=e.offsetParent.offsetHeight-(e.offsetTop-e.offsetParent.scrollTop+e.offsetHeight);return n<0?n:0}function f(e){var t=u(e);t&&(l(),e.scrollIntoView(t>0),c())}function d(e){l(),e.offsetParent.scrollTop=e.offsetTop,c()}function p(e){l(),e.offsetParent.scrollTop=e.offsetTop-e.offsetParent.offsetHeight+e.offsetHeight,c()}function h(e){e.classList.add("selected"),f(e),r.sticky&&r.autoOpen&&E(e)}function m(e){if(b())switch(e.stopImmediatePropagation(),e.keyCode){case 72:case 37:!function(){var e=parseInt(O(".active-toolbar-button").getAttribute("data-button"))-1;e<0&&(e=T-1);S(null,O('.toolbar-panel-button[data-button="'+e+'"]').getAttribute("data-panel"))}();break;case 76:case 39:l=(parseInt(O(".active-toolbar-button").getAttribute("data-button"))+1)%T,S(null,O('.toolbar-panel-button[data-button="'+l+'"]').getAttribute("data-panel"));break;case 75:case 38:if(s=O(".active-menu-panel .slide-menu-items li.selected")||O(".active-menu-panel .slide-menu-items li.active"))A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),h(O('.active-menu-panel .slide-menu-items li[data-item="'+(parseInt(s.getAttribute("data-item"))-1)+'"]')||s);else(o=O(".active-menu-panel .slide-menu-items li.slide-menu-item"))&&h(o);break;case 74:case 40:if(s=O(".active-menu-panel .slide-menu-items li.selected")||O(".active-menu-panel .slide-menu-items li.active"))A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),h(O('.active-menu-panel .slide-menu-items li[data-item="'+(parseInt(s.getAttribute("data-item"))+1)+'"]')||s);else(o=O(".active-menu-panel .slide-menu-items li.slide-menu-item"))&&h(o);break;case 33:case 85:var t=A(".active-menu-panel .slide-menu-items li").filter((function(e){return u(e)>0})),n=A(".active-menu-panel .slide-menu-items li").filter((function(e){return 0==u(e)})),r=t.length>0&&Math.abs(u(t[t.length-1]))0&&(p(r),r=(n=A(".active-menu-panel .slide-menu-items li").filter((function(e){return 0==u(e)})))[0]==r?t[t.length-1]:n[0]),A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),h(r),d(r));break;case 34:case 68:n=A(".active-menu-panel .slide-menu-items li").filter((function(e){return 0==u(e)}));var i=A(".active-menu-panel .slide-menu-items li").filter((function(e){return u(e)<0})),a=i.length>0&&Math.abs(u(i[0]))0&&(d(a),a=(n=A(".active-menu-panel .slide-menu-items li").filter((function(e){return 0==u(e)})))[n.length-1]==a?i[0]:n[n.length-1]),A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),h(a),p(a));break;case 36:A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),(o=O(".active-menu-panel .slide-menu-items li:first-of-type"))&&(o.classList.add("selected"),f(o));break;case 35:var o;A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),(o=O(".active-menu-panel .slide-menu-items:last-of-type li:last-of-type"))&&(o.classList.add("selected"),f(o));break;case 32:case 13:var s;(s=O(".active-menu-panel .slide-menu-items li.selected"))&&E(s,!0);break;case 27:g(null,!0)}var l}function v(e){(e&&e.preventDefault(),b())||(O("body").classList.add("slide-menu-active"),O(".reveal").classList.add("has-"+r.effect+"-"+r.side),O(".slide-menu").classList.add("active"),O(".slide-menu-overlay").classList.add("active"),r.themes&&(A('div[data-panel="Themes"] li').forEach((function(e){e.classList.remove("active")})),A('li[data-theme="'+O("link#theme").getAttribute("href")+'"]').forEach((function(e){e.classList.add("active")}))),r.transitions&&(A('div[data-panel="Transitions"] li').forEach((function(e){e.classList.remove("active")})),A('li[data-transition="'+n.transition+'"]').forEach((function(e){e.classList.add("active")}))),A(".slide-menu-panel li.active").forEach((function(e){e.classList.add("selected"),f(e)})))}function g(e,t){e&&e.preventDefault(),r.sticky&&!t||(O("body").classList.remove("slide-menu-active"),O(".reveal").classList.remove("has-"+r.effect+"-"+r.side),O(".slide-menu").classList.remove("active"),O(".slide-menu-overlay").classList.remove("active"),A(".slide-menu-panel li.selected").forEach((function(e){e.classList.remove("selected")})))}function y(e){b()?g(e,!0):v(e)}function b(){return O("body").classList.contains("slide-menu-active")}function S(e,t){v(e);var n=t;"string"!=typeof t&&(n=e.currentTarget.getAttribute("data-panel")),O(".slide-menu-toolbar > li.active-toolbar-button").classList.remove("active-toolbar-button"),O('li[data-panel="'+n+'"]').classList.add("active-toolbar-button"),O(".slide-menu-panel.active-menu-panel").classList.remove("active-menu-panel"),O('div[data-panel="'+n+'"]').classList.add("active-menu-panel")}function E(e,n){var i=parseInt(e.getAttribute("data-slide-h")),a=parseInt(e.getAttribute("data-slide-v")),o=e.getAttribute("data-theme"),s=e.getAttribute("data-highlight-theme"),l=e.getAttribute("data-transition");isNaN(i)||isNaN(a)||t.slide(i,a),o&&I("theme",o),s&&I("highlight-theme",s),l&&t.configure({transition:l});var c=O("a",e);c&&(n||!r.sticky||r.autoOpen&&c.href.startsWith("#")||c.href.startsWith(window.location.origin+window.location.pathname+"#"))&&c.click(),g()}function x(e){"A"!==e.target.nodeName&&e.preventDefault(),E(e.currentTarget)}function w(){var e=t.getState();A("li.slide-menu-item, li.slide-menu-item-vertical").forEach((function(t){t.classList.remove("past"),t.classList.remove("active"),t.classList.remove("future");var n=parseInt(t.getAttribute("data-slide-h")),r=parseInt(t.getAttribute("data-slide-v"));n",s.appendChild(k("br"),O("i",s)),s.appendChild(k("span",{class:"slide-menu-toolbar-label"},e),O("i",s)),s.onclick=i,d.appendChild(s),s},i=function(e,i,a,o,s){function l(e,t){if(""===e)return null;var n=t?O(e,i):O(e);return n?n.textContent:null}var c=i.getAttribute("data-menu-title")||l(".menu-title",i)||l(r.titleSelector,i);if(!c&&r.useTextContentForMissingTitles&&(c=i.textContent.trim())&&(c=c.split("\n").map((function(e){return e.trim()})).join(" ").trim().replace(/^(.{16}[^\s]*).*/,"$1").replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")+"..."),!c){if(r.hideMissingTitles)return"";e+=" no-title",c="Slide "+(a+1)}var u=k("li",{class:e,"data-item":a,"data-slide-h":o,"data-slide-v":void 0===s?0:s});if(r.markers&&(u.appendChild(k("i",{class:"fas fa-check-circle fa-fw past"})),u.appendChild(k("i",{class:"fas fa-arrow-alt-circle-right fa-fw active"})),u.appendChild(k("i",{class:"far fa-circle fa-fw future"}))),r.numbers){var f=[],d="h.v";switch("string"==typeof r.numbers?d=r.numbers:"string"==typeof n.slideNumber&&(d=n.slideNumber),d){case"c":f.push(a+1);break;case"c/t":f.push(a+1,"/",t.getTotalSlides());break;case"h/v":f.push(o+1),"number"!=typeof s||isNaN(s)||f.push("/",s+1);break;default:f.push(o+1),"number"!=typeof s||isNaN(s)||f.push(".",s+1)}u.appendChild(k("span",{class:"slide-menu-item-number"},f.join("")+". "))}return u.appendChild(k("span",{class:"slide-menu-item-title"},c)),u},o=function(e){s&&(A(".active-menu-panel .slide-menu-items li.selected").forEach((function(e){e.classList.remove("selected")})),e.currentTarget.classList.add("selected"))},l=O(".reveal").parentElement,c=k("div",{class:"slide-menu-wrapper"});l.appendChild(c);var u=k("nav",{class:"slide-menu slide-menu--"+r.side});"string"==typeof r.width&&(-1!=["normal","wide","third","half","full"].indexOf(r.width)?u.classList.add("slide-menu--"+r.width):(u.classList.add("slide-menu--custom"),u.style.width=r.width)),c.appendChild(u),L();var f=k("div",{class:"slide-menu-overlay"});c.appendChild(f),f.onclick=function(){g(null,!0)};var d=k("ol",{class:"slide-menu-toolbar"});O(".slide-menu").appendChild(d),e("Slides","Slides","fa-images","fas",S,!0),r.custom&&r.custom.forEach((function(t,n,r){e(t.title,"Custom"+n,t.icon,null,S)})),r.themes&&e("Themes","Themes","fa-adjust","fas",S),r.transitions&&e("Transitions","Transitions","fa-sticky-note","fas",S);var p=k("li",{id:"close",class:"toolbar-panel-button"});if(p.appendChild(k("i",{class:"fas fa-times"})),p.appendChild(k("br")),p.appendChild(k("span",{class:"slide-menu-toolbar-label"},"Close")),p.onclick=function(){g(null,!0)},d.appendChild(p),function e(){if(document.querySelector("section[data-markdown]:not([data-markdown-parsed])"))setTimeout(e,100);else{var t=k("div",{"data-panel":"Slides",class:"slide-menu-panel active-menu-panel"});t.appendChild(k("ul",{class:"slide-menu-items"})),u.appendChild(t);var n=O('.slide-menu-panel[data-panel="Slides"] > .slide-menu-items'),r=0;A(".slides > section").forEach((function(e,t){var a=A("section",e);if(a.length>0)a.forEach((function(e,a){var o=i(0===a?"slide-menu-item":"slide-menu-item-vertical",e,r,t,a);o&&n.appendChild(o),r++}));else{var o=i("slide-menu-item",e,r,t);o&&n.appendChild(o),r++}})),A(".slide-menu-item, .slide-menu-item-vertical").forEach((function(e){e.onclick=x})),w()}}(),t.addEventListener("slidechanged",w),r.custom){var h=function(){this.status>=200&&this.status<300?(this.panel.innerHTML=this.responseText,C(this.panel)):I(this)},E=function(){I(this)},C=function(e){A("ul.slide-menu-items li.slide-menu-item",e).forEach((function(e,t){e.setAttribute("data-item",t+1),e.onclick=x,e.addEventListener("mouseenter",o)}))},I=function(e){var t="ERROR: The attempt to fetch "+e.responseURL+" failed with HTTP status "+e.status+" ("+e.statusText+").
Remember that you need to serve the presentation HTML from a HTTP server.
";e.panel.innerHTML=t};r.custom.forEach((function(e,t,n){var r=k("div",{"data-panel":"Custom"+t,class:"slide-menu-panel slide-menu-custom-panel"});e.content?(r.innerHTML=e.content,C(r)):e.src&&function(e,t){var n=new XMLHttpRequest;n.panel=e,n.arguments=Array.prototype.slice.call(arguments,2),n.onload=h,n.onerror=E,n.open("get",t,!0),n.send(null)}(r,e.src),u.appendChild(r)}))}if(r.themes){var P=k("div",{class:"slide-menu-panel","data-panel":"Themes"});u.appendChild(P);var M=k("ul",{class:"slide-menu-items"});P.appendChild(M),r.themes.forEach((function(e,t){var n={class:"slide-menu-item","data-item":""+(t+1)};e.theme&&(n["data-theme"]=e.theme),e.highlightTheme&&(n["data-highlight-theme"]=e.highlightTheme);var r=k("li",n,e.name);M.appendChild(r),r.onclick=x}))}if(r.transitions){P=k("div",{class:"slide-menu-panel","data-panel":"Transitions"});u.appendChild(P);M=k("ul",{class:"slide-menu-items"});P.appendChild(M),r.transitions.forEach((function(e,t){var n=k("li",{class:"slide-menu-item","data-transition":e.toLowerCase(),"data-item":""+(t+1)},e);M.appendChild(n),n.onclick=x}))}if(r.openButton){var R=k("div",{class:"slide-menu-button"}),j=k("a",{href:"#"});j.appendChild(k("i",{class:"fas fa-bars"})),R.appendChild(j),O(".reveal").appendChild(R),R.onclick=v}if(r.openSlideNumber)O("div.slide-number").onclick=v;A(".slide-menu-panel .slide-menu-items li").forEach((function(e){e.addEventListener("mouseenter",o)}))}if(r.keyboard){if(document.addEventListener("keydown",m,!1),window.addEventListener("message",(function(e){var t;try{t=JSON.parse(e.data)}catch(e){}t&&"triggerKey"===t.method&&m({keyCode:t.args[0],stopImmediatePropagation:function(){}})})),n.keyboardCondition&&"function"==typeof n.keyboardCondition){var N=n.keyboardCondition;n.keyboardCondition=function(e){return N(e)&&(!b()||77==e.keyCode)}}else n.keyboardCondition=function(e){return!b()||77==e.keyCode};t.addKeyBinding({keyCode:77,key:"M",description:"Toggle menu"},y)}r.openOnInit&&v(),a=!0}function O(e,t){return t||(t=document),t.querySelector(e)}function A(e,t){return t||(t=document),Array.prototype.slice.call(t.querySelectorAll(e))}function k(e,t,n){var r=document.createElement(e);return t&&Object.getOwnPropertyNames(t).forEach((function(e){r.setAttribute(e,t[e])})),n&&(r.innerHTML=n),r}function I(e,t){var n=O("link#"+e),r=n.parentElement,i=n.nextElementSibling;n.remove();var a=n.cloneNode();a.setAttribute("href",t),a.onload=function(){L()},r.insertBefore(a,i)}function P(e,t,n){n.call()}function M(){var e,a,o,s=!i||i>=9;t.isSpeakerNotes()&&window.location.search.endsWith("controls=false")&&(s=!1),s&&(r.delayInit||C(),e="menu-ready",(o=document.createEvent("HTMLEvents",1,2)).initEvent(e,!0,!0),function(e,t){for(var n in t)e[n]=t[n]}(o,a),document.querySelector(".reveal").dispatchEvent(o),n.postMessageEvents&&window.parent!==window.self&&window.parent.postMessage(JSON.stringify({namespace:"reveal",eventName:e,state:t.getState()}),"*"))}return{id:"menu",init:function(e){o(n=(t=e).getConfig()),P(r.path+"menu.css","stylesheet",(function(){void 0===r.loadIcons||r.loadIcons?P(r.path+"font-awesome/css/all.css","stylesheet",M):M()}))},toggle:y,openMenu:v,closeMenu:g,openPanel:S,isOpen:b,initialiseMenu:C,isMenuInitialised:function(){return a}}}}));
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-menu/plugin.yml b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-menu/plugin.yml
new file mode 100644
index 0000000..3f4b90a
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-menu/plugin.yml
@@ -0,0 +1,9 @@
+name: RevealMenu
+script: [menu.js, quarto-menu.js]
+stylesheet: [menu.css, quarto-menu.css]
+config:
+ menu:
+ side: "left"
+ useTextContentForMissingTitles: true
+ markers: false
+ loadIcons: false
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-menu/quarto-menu.css b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-menu/quarto-menu.css
new file mode 100644
index 0000000..eec145c
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-menu/quarto-menu.css
@@ -0,0 +1,68 @@
+.slide-menu-wrapper .slide-tool-item {
+ display: block;
+ text-align: left;
+ padding: 10px 18px;
+ color: #aaa;
+ cursor: pointer;
+ border-top: solid 1px #555;
+}
+
+.slide-menu-wrapper .slide-tool-item a {
+ text-decoration: none;
+}
+
+.slide-menu-wrapper .slide-tool-item kbd {
+ font-family: monospace;
+ margin-right: 10px;
+ padding: 3px 8px;
+ color: inherit;
+ border: 1px solid;
+ border-radius: 5px;
+ border-color: #555;
+}
+
+.slide-menu-wrapper .slide-menu-toolbar > li.active-toolbar-button {
+ text-decoration: none;
+}
+
+.reveal .slide-menu-button {
+ left: 8px;
+ bottom: 8px;
+}
+
+.reveal .slide-menu-button .fas::before,
+.reveal .slide-chalkboard-buttons .fas::before,
+.slide-menu-wrapper .slide-menu-toolbar .fas::before {
+ display: inline-block;
+ height: 2.2rem;
+ width: 2.2rem;
+ content: "";
+ vertical-align: -0.125em;
+ background-repeat: no-repeat;
+ background-size: 2.2rem 2.2rem;
+}
+
+.reveal .slide-chalkboard-buttons .fas::before {
+ height: 1.45rem;
+ width: 1.45rem;
+ background-size: 1.45rem 1.45rem;
+ vertical-align: 0.1em;
+}
+
+.slide-menu-wrapper .slide-menu-toolbar .fas::before {
+ height: 1.8rem;
+ width: 1.8rem;
+ background-size: 1.8rem 1.8rem;
+}
+
+.slide-menu-wrapper .slide-menu-toolbar .fa-images::before {
+ background-image: url('data:image/svg+xml,');
+}
+
+.slide-menu-wrapper .slide-menu-toolbar .fa-gear::before {
+ background-image: url('data:image/svg+xml,');
+}
+
+.slide-menu-wrapper .slide-menu-toolbar .fa-times::before {
+ background-image: url('data:image/svg+xml,');
+}
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-menu/quarto-menu.js b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-menu/quarto-menu.js
new file mode 100644
index 0000000..9674053
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/reveal-menu/quarto-menu.js
@@ -0,0 +1,43 @@
+window.revealMenuToolHandler = function (handler) {
+ return function (event) {
+ event.preventDefault();
+ handler();
+ Reveal.getPlugin("menu").closeMenu();
+ };
+};
+
+window.RevealMenuToolHandlers = {
+ fullscreen: revealMenuToolHandler(function () {
+ const element = document.documentElement;
+ const requestMethod =
+ element.requestFullscreen ||
+ element.webkitRequestFullscreen ||
+ element.webkitRequestFullScreen ||
+ element.mozRequestFullScreen ||
+ element.msRequestFullscreen;
+ if (requestMethod) {
+ requestMethod.apply(element);
+ }
+ }),
+ speakerMode: revealMenuToolHandler(function () {
+ Reveal.getPlugin("notes").open();
+ }),
+ keyboardHelp: revealMenuToolHandler(function () {
+ Reveal.toggleHelp(true);
+ }),
+ overview: revealMenuToolHandler(function () {
+ Reveal.toggleOverview(true);
+ }),
+ toggleChalkboard: revealMenuToolHandler(function () {
+ RevealChalkboard.toggleChalkboard();
+ }),
+ toggleNotesCanvas: revealMenuToolHandler(function () {
+ RevealChalkboard.toggleNotesCanvas();
+ }),
+ downloadDrawings: revealMenuToolHandler(function () {
+ RevealChalkboard.download();
+ }),
+ togglePdfExport: revealMenuToolHandler(function () {
+ PdfExport.togglePdfExport();
+ }),
+};
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/search/plugin.js b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/search/plugin.js
new file mode 100644
index 0000000..5d09ce6
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/search/plugin.js
@@ -0,0 +1,243 @@
+/*!
+ * Handles finding a text string anywhere in the slides and showing the next occurrence to the user
+ * by navigatating to that slide and highlighting it.
+ *
+ * @author Jon Snyder , February 2013
+ */
+
+const Plugin = () => {
+
+ // The reveal.js instance this plugin is attached to
+ let deck;
+
+ let searchElement;
+ let searchButton;
+ let searchInput;
+
+ let matchedSlides;
+ let currentMatchedIndex;
+ let searchboxDirty;
+ let hilitor;
+
+ function render() {
+
+ searchElement = document.createElement( 'div' );
+ searchElement.classList.add( 'searchbox' );
+ searchElement.style.position = 'absolute';
+ searchElement.style.top = '10px';
+ searchElement.style.right = '10px';
+ searchElement.style.zIndex = 10;
+
+ //embedded base64 search icon Designed by Sketchdock - http://www.sketchdock.com/:
+ searchElement.innerHTML = `
+ `;
+
+ searchInput = searchElement.querySelector( '.searchinput' );
+ searchInput.style.width = '240px';
+ searchInput.style.fontSize = '14px';
+ searchInput.style.padding = '4px 6px';
+ searchInput.style.color = '#000';
+ searchInput.style.background = '#fff';
+ searchInput.style.borderRadius = '2px';
+ searchInput.style.border = '0';
+ searchInput.style.outline = '0';
+ searchInput.style.boxShadow = '0 2px 18px rgba(0, 0, 0, 0.2)';
+ searchInput.style['-webkit-appearance'] = 'none';
+
+ deck.getRevealElement().appendChild( searchElement );
+
+ // searchButton.addEventListener( 'click', function(event) {
+ // doSearch();
+ // }, false );
+
+ searchInput.addEventListener( 'keyup', function( event ) {
+ switch (event.keyCode) {
+ case 13:
+ event.preventDefault();
+ doSearch();
+ searchboxDirty = false;
+ break;
+ default:
+ searchboxDirty = true;
+ }
+ }, false );
+
+ closeSearch();
+
+ }
+
+ function openSearch() {
+ if( !searchElement ) render();
+
+ searchElement.style.display = 'inline';
+ searchInput.focus();
+ searchInput.select();
+ }
+
+ function closeSearch() {
+ if( !searchElement ) render();
+
+ searchElement.style.display = 'none';
+ if(hilitor) hilitor.remove();
+ }
+
+ function toggleSearch() {
+ if( !searchElement ) render();
+
+ if (searchElement.style.display !== 'inline') {
+ openSearch();
+ }
+ else {
+ closeSearch();
+ }
+ }
+
+ function doSearch() {
+ //if there's been a change in the search term, perform a new search:
+ if (searchboxDirty) {
+ var searchstring = searchInput.value;
+
+ if (searchstring === '') {
+ if(hilitor) hilitor.remove();
+ matchedSlides = null;
+ }
+ else {
+ //find the keyword amongst the slides
+ hilitor = new Hilitor("slidecontent");
+ matchedSlides = hilitor.apply(searchstring);
+ currentMatchedIndex = 0;
+ }
+ }
+
+ if (matchedSlides) {
+ //navigate to the next slide that has the keyword, wrapping to the first if necessary
+ if (matchedSlides.length && (matchedSlides.length <= currentMatchedIndex)) {
+ currentMatchedIndex = 0;
+ }
+ if (matchedSlides.length > currentMatchedIndex) {
+ deck.slide(matchedSlides[currentMatchedIndex].h, matchedSlides[currentMatchedIndex].v);
+ currentMatchedIndex++;
+ }
+ }
+ }
+
+ // Original JavaScript code by Chirp Internet: www.chirp.com.au
+ // Please acknowledge use of this code by including this header.
+ // 2/2013 jon: modified regex to display any match, not restricted to word boundaries.
+ function Hilitor(id, tag) {
+
+ var targetNode = document.getElementById(id) || document.body;
+ var hiliteTag = tag || "EM";
+ var skipTags = new RegExp("^(?:" + hiliteTag + "|SCRIPT|FORM)$");
+ var colors = ["#ff6", "#a0ffff", "#9f9", "#f99", "#f6f"];
+ var wordColor = [];
+ var colorIdx = 0;
+ var matchRegex = "";
+ var matchingSlides = [];
+
+ this.setRegex = function(input)
+ {
+ input = input.replace(/^[^\w]+|[^\w]+$/g, "").replace(/[^\w'-]+/g, "|");
+ matchRegex = new RegExp("(" + input + ")","i");
+ }
+
+ this.getRegex = function()
+ {
+ return matchRegex.toString().replace(/^\/\\b\(|\)\\b\/i$/g, "").replace(/\|/g, " ");
+ }
+
+ // recursively apply word highlighting
+ this.hiliteWords = function(node)
+ {
+ if(node == undefined || !node) return;
+ if(!matchRegex) return;
+ if(skipTags.test(node.nodeName)) return;
+
+ if(node.hasChildNodes()) {
+ for(var i=0; i < node.childNodes.length; i++)
+ this.hiliteWords(node.childNodes[i]);
+ }
+ if(node.nodeType == 3) { // NODE_TEXT
+ var nv, regs;
+ if((nv = node.nodeValue) && (regs = matchRegex.exec(nv))) {
+ //find the slide's section element and save it in our list of matching slides
+ var secnode = node;
+ while (secnode != null && secnode.nodeName != 'SECTION') {
+ secnode = secnode.parentNode;
+ }
+
+ var slideIndex = deck.getIndices(secnode);
+ var slidelen = matchingSlides.length;
+ var alreadyAdded = false;
+ for (var i=0; i < slidelen; i++) {
+ if ( (matchingSlides[i].h === slideIndex.h) && (matchingSlides[i].v === slideIndex.v) ) {
+ alreadyAdded = true;
+ }
+ }
+ if (! alreadyAdded) {
+ matchingSlides.push(slideIndex);
+ }
+
+ if(!wordColor[regs[0].toLowerCase()]) {
+ wordColor[regs[0].toLowerCase()] = colors[colorIdx++ % colors.length];
+ }
+
+ var match = document.createElement(hiliteTag);
+ match.appendChild(document.createTextNode(regs[0]));
+ match.style.backgroundColor = wordColor[regs[0].toLowerCase()];
+ match.style.fontStyle = "inherit";
+ match.style.color = "#000";
+
+ var after = node.splitText(regs.index);
+ after.nodeValue = after.nodeValue.substring(regs[0].length);
+ node.parentNode.insertBefore(match, after);
+ }
+ }
+ };
+
+ // remove highlighting
+ this.remove = function()
+ {
+ var arr = document.getElementsByTagName(hiliteTag);
+ var el;
+ while(arr.length && (el = arr[0])) {
+ el.parentNode.replaceChild(el.firstChild, el);
+ }
+ };
+
+ // start highlighting at target node
+ this.apply = function(input)
+ {
+ if(input == undefined || !input) return;
+ this.remove();
+ this.setRegex(input);
+ this.hiliteWords(targetNode);
+ return matchingSlides;
+ };
+
+ }
+
+ return {
+
+ id: 'search',
+
+ init: reveal => {
+
+ deck = reveal;
+ deck.registerKeyboardShortcut( 'CTRL + Shift + F', 'Search' );
+
+ document.addEventListener( 'keydown', function( event ) {
+ if( event.key == "F" && (event.ctrlKey || event.metaKey) ) { //Control+Shift+f
+ event.preventDefault();
+ toggleSearch();
+ }
+ }, false );
+
+ },
+
+ open: openSearch
+
+ }
+};
+
+export default Plugin;
\ No newline at end of file
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/search/search.esm.js b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/search/search.esm.js
new file mode 100644
index 0000000..b401a70
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/search/search.esm.js
@@ -0,0 +1,7 @@
+var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},t=function(e){try{return!!e()}catch(e){return!0}},n=!t((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),r=function(e){return e&&e.Math==Math&&e},o=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof e&&e)||function(){return this}()||Function("return this")(),i=t,c=/#|\.prototype\./,a=function(e,t){var n=l[u(e)];return n==s||n!=f&&("function"==typeof t?i(t):!!t)},u=a.normalize=function(e){return String(e).replace(c,".").toLowerCase()},l=a.data={},f=a.NATIVE="N",s=a.POLYFILL="P",p=a,g=function(e){return"object"==typeof e?null!==e:"function"==typeof e},d=g,h=function(e){if(!d(e))throw TypeError(String(e)+" is not an object");return e},y=g,v=h,x=function(e){if(!y(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e},b=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,r){return v(n),x(r),t?e.call(n,r):n.__proto__=r,n}}():void 0),E=g,m=b,S={},w=g,O=o.document,R=w(O)&&w(O.createElement),T=function(e){return R?O.createElement(e):{}},_=!n&&!t((function(){return 7!=Object.defineProperty(T("div"),"a",{get:function(){return 7}}).a})),j=g,P=function(e,t){if(!j(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!j(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!j(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!j(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")},I=n,C=_,N=h,A=P,k=Object.defineProperty;S.f=I?k:function(e,t,n){if(N(e),t=A(t,!0),N(n),C)try{return k(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e};var $={},L=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},M=L,U=function(e){return Object(M(e))},D=U,F={}.hasOwnProperty,z=function(e,t){return F.call(D(e),t)},K={}.toString,B=function(e){return K.call(e).slice(8,-1)},W=B,G="".split,V=t((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==W(e)?G.call(e,""):Object(e)}:Object,Y=L,q=function(e){return V(Y(e))},X=Math.ceil,H=Math.floor,J=function(e){return isNaN(e=+e)?0:(e>0?H:X)(e)},Q=J,Z=Math.min,ee=function(e){return e>0?Z(Q(e),9007199254740991):0},te=J,ne=Math.max,re=Math.min,oe=q,ie=ee,ce=function(e,t){var n=te(e);return n<0?ne(n+t,0):re(n,t)},ae=function(e){return function(t,n,r){var o,i=oe(t),c=ie(i.length),a=ce(r,c);if(e&&n!=n){for(;c>a;)if((o=i[a++])!=o)return!0}else for(;c>a;a++)if((e||a in i)&&i[a]===n)return e||a||0;return!e&&-1}},ue={includes:ae(!0),indexOf:ae(!1)},le={},fe=z,se=q,pe=ue.indexOf,ge=le,de=function(e,t){var n,r=se(e),o=0,i=[];for(n in r)!fe(ge,n)&&fe(r,n)&&i.push(n);for(;t.length>o;)fe(r,n=t[o++])&&(~pe(i,n)||i.push(n));return i},he=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"].concat("length","prototype");$.f=Object.getOwnPropertyNames||function(e){return de(e,he)};var ye={exports:{}},ve=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},xe=S,be=ve,Ee=n?function(e,t,n){return xe.f(e,t,be(1,n))}:function(e,t,n){return e[t]=n,e},me=o,Se=Ee,we=function(e,t){try{Se(me,e,t)}catch(n){me[e]=t}return t},Oe=we,Re=o["__core-js_shared__"]||Oe("__core-js_shared__",{}),Te=Re;(ye.exports=function(e,t){return Te[e]||(Te[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.12.1",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"});var _e,je,Pe=0,Ie=Math.random(),Ce=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++Pe+Ie).toString(36)},Ne=o,Ae=o,ke=function(e){return"function"==typeof e?e:void 0},$e=function(e,t){return arguments.length<2?ke(Ne[e])||ke(Ae[e]):Ne[e]&&Ne[e][t]||Ae[e]&&Ae[e][t]},Le=$e("navigator","userAgent")||"",Me=o.process,Ue=Me&&Me.versions,De=Ue&&Ue.v8;De?je=(_e=De.split("."))[0]<4?1:_e[0]+_e[1]:Le&&(!(_e=Le.match(/Edge\/(\d+)/))||_e[1]>=74)&&(_e=Le.match(/Chrome\/(\d+)/))&&(je=_e[1]);var Fe=je&&+je,ze=t,Ke=!!Object.getOwnPropertySymbols&&!ze((function(){return!String(Symbol())||!Symbol.sham&&Fe&&Fe<41})),Be=Ke&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,We=o,Ge=ye.exports,Ve=z,Ye=Ce,qe=Ke,Xe=Be,He=Ge("wks"),Je=We.Symbol,Qe=Xe?Je:Je&&Je.withoutSetter||Ye,Ze=function(e){return Ve(He,e)&&(qe||"string"==typeof He[e])||(qe&&Ve(Je,e)?He[e]=Je[e]:He[e]=Qe("Symbol."+e)),He[e]},et=g,tt=B,nt=Ze("match"),rt=h,ot=function(){var e=rt(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t},it={},ct=t;function at(e,t){return RegExp(e,t)}it.UNSUPPORTED_Y=ct((function(){var e=at("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),it.BROKEN_CARET=ct((function(){var e=at("^r","gy");return e.lastIndex=2,null!=e.exec("str")}));var ut={exports:{}},lt=Re,ft=Function.toString;"function"!=typeof lt.inspectSource&&(lt.inspectSource=function(e){return ft.call(e)});var st,pt,gt,dt=lt.inspectSource,ht=dt,yt=o.WeakMap,vt="function"==typeof yt&&/native code/.test(ht(yt)),xt=ye.exports,bt=Ce,Et=xt("keys"),mt=vt,St=g,wt=Ee,Ot=z,Rt=Re,Tt=function(e){return Et[e]||(Et[e]=bt(e))},_t=le,jt=o.WeakMap;if(mt||Rt.state){var Pt=Rt.state||(Rt.state=new jt),It=Pt.get,Ct=Pt.has,Nt=Pt.set;st=function(e,t){if(Ct.call(Pt,e))throw new TypeError("Object already initialized");return t.facade=e,Nt.call(Pt,e,t),t},pt=function(e){return It.call(Pt,e)||{}},gt=function(e){return Ct.call(Pt,e)}}else{var At=Tt("state");_t[At]=!0,st=function(e,t){if(Ot(e,At))throw new TypeError("Object already initialized");return t.facade=e,wt(e,At,t),t},pt=function(e){return Ot(e,At)?e[At]:{}},gt=function(e){return Ot(e,At)}}var kt={set:st,get:pt,has:gt,enforce:function(e){return gt(e)?pt(e):st(e,{})},getterFor:function(e){return function(t){var n;if(!St(t)||(n=pt(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},$t=o,Lt=Ee,Mt=z,Ut=we,Dt=dt,Ft=kt.get,zt=kt.enforce,Kt=String(String).split("String");(ut.exports=function(e,t,n,r){var o,i=!!r&&!!r.unsafe,c=!!r&&!!r.enumerable,a=!!r&&!!r.noTargetGet;"function"==typeof n&&("string"!=typeof t||Mt(n,"name")||Lt(n,"name",t),(o=zt(n)).source||(o.source=Kt.join("string"==typeof t?t:""))),e!==$t?(i?!a&&e[t]&&(c=!0):delete e[t],c?e[t]=n:Lt(e,t,n)):c?e[t]=n:Ut(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&Ft(this).source||Dt(this)}));var Bt=$e,Wt=S,Gt=n,Vt=Ze("species"),Yt=n,qt=o,Xt=p,Ht=function(e,t,n){var r,o;return m&&"function"==typeof(r=t.constructor)&&r!==n&&E(o=r.prototype)&&o!==n.prototype&&m(e,o),e},Jt=S.f,Qt=$.f,Zt=function(e){var t;return et(e)&&(void 0!==(t=e[nt])?!!t:"RegExp"==tt(e))},en=ot,tn=it,nn=ut.exports,rn=t,on=kt.enforce,cn=function(e){var t=Bt(e),n=Wt.f;Gt&&t&&!t[Vt]&&n(t,Vt,{configurable:!0,get:function(){return this}})},an=Ze("match"),un=qt.RegExp,ln=un.prototype,fn=/a/g,sn=/a/g,pn=new un(fn)!==fn,gn=tn.UNSUPPORTED_Y;if(Yt&&Xt("RegExp",!pn||gn||rn((function(){return sn[an]=!1,un(fn)!=fn||un(sn)==sn||"/a/i"!=un(fn,"i")})))){for(var dn=function(e,t){var n,r=this instanceof dn,o=Zt(e),i=void 0===t;if(!r&&o&&e.constructor===dn&&i)return e;pn?o&&!i&&(e=e.source):e instanceof dn&&(i&&(t=en.call(e)),e=e.source),gn&&(n=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,""));var c=Ht(pn?new un(e,t):un(e,t),r?this:ln,dn);gn&&n&&(on(c).sticky=!0);return c},hn=function(e){e in dn||Jt(dn,e,{configurable:!0,get:function(){return un[e]},set:function(t){un[e]=t}})},yn=Qt(un),vn=0;yn.length>vn;)hn(yn[vn++]);ln.constructor=dn,dn.prototype=ln,nn(qt,"RegExp",dn)}cn("RegExp");var xn={},bn={},En={}.propertyIsEnumerable,mn=Object.getOwnPropertyDescriptor,Sn=mn&&!En.call({1:2},1);bn.f=Sn?function(e){var t=mn(this,e);return!!t&&t.enumerable}:En;var wn=n,On=bn,Rn=ve,Tn=q,_n=P,jn=z,Pn=_,In=Object.getOwnPropertyDescriptor;xn.f=wn?In:function(e,t){if(e=Tn(e),t=_n(t,!0),Pn)try{return In(e,t)}catch(e){}if(jn(e,t))return Rn(!On.f.call(e,t),e[t])};var Cn={};Cn.f=Object.getOwnPropertySymbols;var Nn=$,An=Cn,kn=h,$n=$e("Reflect","ownKeys")||function(e){var t=Nn.f(kn(e)),n=An.f;return n?t.concat(n(e)):t},Ln=z,Mn=$n,Un=xn,Dn=S,Fn=o,zn=xn.f,Kn=Ee,Bn=ut.exports,Wn=we,Gn=function(e,t){for(var n=Mn(t),r=Dn.f,o=Un.f,i=0;i0&&(!i.multiline||i.multiline&&"\n"!==e[i.lastIndex-1])&&(u="(?: "+u+")",f=" "+f,l++),n=new RegExp("^(?:"+u+")",a)),tr&&(n=new RegExp("^"+u+"$(?!\\s)",a)),Zn&&(t=i.lastIndex),r=Hn.call(c?n:i,f),c?r?(r.input=r.input.slice(l),r[0]=r[0].slice(l),r.index=i.lastIndex,i.lastIndex+=r[0].length):i.lastIndex=0:Zn&&r&&(i.lastIndex=i.global?r.index+r[0].length:t),tr&&r&&r.length>1&&Jn.call(r[0],n,(function(){for(o=1;o")})),br="$0"==="a".replace(/./,"$0"),Er=dr("replace"),mr=!!/./[Er]&&""===/./[Er]("a","$0"),Sr=!gr((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]})),wr=J,Or=L,Rr=function(e){return function(t,n){var r,o,i=String(Or(t)),c=wr(n),a=i.length;return c<0||c>=a?e?"":void 0:(r=i.charCodeAt(c))<55296||r>56319||c+1===a||(o=i.charCodeAt(c+1))<56320||o>57343?e?i.charAt(c):r:e?i.slice(c,c+2):o-56320+(r-55296<<10)+65536}},Tr={codeAt:Rr(!1),charAt:Rr(!0)}.charAt,_r=U,jr=Math.floor,Pr="".replace,Ir=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,Cr=/\$([$&'`]|\d{1,2})/g,Nr=B,Ar=nr,kr=function(e,t,n,r){var o=dr(e),i=!gr((function(){var t={};return t[o]=function(){return 7},7!=""[e](t)})),c=i&&!gr((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[yr]=function(){return n},n.flags="",n[o]=/./[o]),n.exec=function(){return t=!0,null},n[o](""),!t}));if(!i||!c||"replace"===e&&(!xr||!br||mr)||"split"===e&&!Sr){var a=/./[o],u=n(o,""[e],(function(e,t,n,r,o){var c=t.exec;return c===pr||c===vr.exec?i&&!o?{done:!0,value:a.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),{REPLACE_KEEPS_$0:br,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:mr}),l=u[0],f=u[1];sr(String.prototype,e,l),sr(vr,o,2==t?function(e,t){return f.call(e,this,t)}:function(e){return f.call(e,this)})}r&&hr(vr[o],"sham",!0)},$r=h,Lr=ee,Mr=J,Ur=L,Dr=function(e,t,n){return t+(n?Tr(e,t).length:1)},Fr=function(e,t,n,r,o,i){var c=n+e.length,a=r.length,u=Cr;return void 0!==o&&(o=_r(o),u=Ir),Pr.call(i,u,(function(i,u){var l;switch(u.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(c);case"<":l=o[u.slice(1,-1)];break;default:var f=+u;if(0===f)return i;if(f>a){var s=jr(f/10);return 0===s?i:s<=a?void 0===r[s-1]?u.charAt(1):r[s-1]+u.charAt(1):i}l=r[f-1]}return void 0===l?"":l}))},zr=function(e,t){var n=e.exec;if("function"==typeof n){var r=n.call(e,t);if("object"!=typeof r)throw TypeError("RegExp exec method returned something other than an Object or null");return r}if("RegExp"!==Nr(e))throw TypeError("RegExp#exec called on incompatible receiver");return Ar.call(e,t)},Kr=Math.max,Br=Math.min;kr("replace",2,(function(e,t,n,r){var o=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,i=r.REPLACE_KEEPS_$0,c=o?"$":"$0";return[function(n,r){var o=Ur(this),i=null==n?void 0:n[e];return void 0!==i?i.call(n,o,r):t.call(String(o),n,r)},function(e,r){if(!o&&i||"string"==typeof r&&-1===r.indexOf(c)){var a=n(t,e,this,r);if(a.done)return a.value}var u=$r(e),l=String(this),f="function"==typeof r;f||(r=String(r));var s=u.global;if(s){var p=u.unicode;u.lastIndex=0}for(var g=[];;){var d=zr(u,l);if(null===d)break;if(g.push(d),!s)break;""===String(d[0])&&(u.lastIndex=Dr(l,Lr(u.lastIndex),p))}for(var h,y="",v=0,x=0;x=v&&(y+=l.slice(v,E)+R,v=E+b.length)}return y+l.slice(v)}]}));var Wr={};Wr[Ze("toStringTag")]="z";var Gr="[object z]"===String(Wr),Vr=Gr,Yr=B,qr=Ze("toStringTag"),Xr="Arguments"==Yr(function(){return arguments}()),Hr=Vr?Yr:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),qr))?n:Xr?Yr(t):"Object"==(r=Yr(t))&&"function"==typeof t.callee?"Arguments":r},Jr=Gr?{}.toString:function(){return"[object "+Hr(this)+"]"},Qr=Gr,Zr=ut.exports,eo=Jr;Qr||Zr(Object.prototype,"toString",eo,{unsafe:!0})
+/*!
+ * Handles finding a text string anywhere in the slides and showing the next occurrence to the user
+ * by navigatating to that slide and highlighting it.
+ *
+ * @author Jon Snyder , February 2013
+ */;export default function(){var e,t,n,r,o,i,c;function a(){(t=document.createElement("div")).classList.add("searchbox"),t.style.position="absolute",t.style.top="10px",t.style.right="10px",t.style.zIndex=10,t.innerHTML='\n\t\t',(n=t.querySelector(".searchinput")).style.width="240px",n.style.fontSize="14px",n.style.padding="4px 6px",n.style.color="#000",n.style.background="#fff",n.style.borderRadius="2px",n.style.border="0",n.style.outline="0",n.style.boxShadow="0 2px 18px rgba(0, 0, 0, 0.2)",n.style["-webkit-appearance"]="none",e.getRevealElement().appendChild(t),n.addEventListener("keyup",(function(t){switch(t.keyCode){case 13:t.preventDefault(),function(){if(i){var t=n.value;""===t?(c&&c.remove(),r=null):(c=new f("slidecontent"),r=c.apply(t),o=0)}r&&(r.length&&r.length<=o&&(o=0),r.length>o&&(e.slide(r[o].h,r[o].v),o++))}(),i=!1;break;default:i=!0}}),!1),l()}function u(){t||a(),t.style.display="inline",n.focus(),n.select()}function l(){t||a(),t.style.display="none",c&&c.remove()}function f(t,n){var r=document.getElementById(t)||document.body,o=n||"EM",i=new RegExp("^(?:"+o+"|SCRIPT|FORM)$"),c=["#ff6","#a0ffff","#9f9","#f99","#f6f"],a=[],u=0,l="",f=[];this.setRegex=function(e){e=e.replace(/^[^\w]+|[^\w]+$/g,"").replace(/[^\w'-]+/g,"|"),l=new RegExp("("+e+")","i")},this.getRegex=function(){return l.toString().replace(/^\/\\b\(|\)\\b\/i$/g,"").replace(/\|/g," ")},this.hiliteWords=function(t){if(null!=t&&t&&l&&!i.test(t.nodeName)){if(t.hasChildNodes())for(var n=0;n0?H:X)(e)},Q=J,Z=Math.min,ee=function(e){return e>0?Z(Q(e),9007199254740991):0},te=J,ne=Math.max,re=Math.min,oe=q,ie=ee,ce=function(e,t){var n=te(e);return n<0?ne(n+t,0):re(n,t)},ae=function(e){return function(t,n,r){var o,i=oe(t),c=ie(i.length),a=ce(r,c);if(e&&n!=n){for(;c>a;)if((o=i[a++])!=o)return!0}else for(;c>a;a++)if((e||a in i)&&i[a]===n)return e||a||0;return!e&&-1}},ue={includes:ae(!0),indexOf:ae(!1)},le={},fe=z,se=q,pe=ue.indexOf,de=le,ge=function(e,t){var n,r=se(e),o=0,i=[];for(n in r)!fe(de,n)&&fe(r,n)&&i.push(n);for(;t.length>o;)fe(r,n=t[o++])&&(~pe(i,n)||i.push(n));return i},he=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"].concat("length","prototype");$.f=Object.getOwnPropertyNames||function(e){return ge(e,he)};var ye={exports:{}},ve=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},xe=S,be=ve,me=n?function(e,t,n){return xe.f(e,t,be(1,n))}:function(e,t,n){return e[t]=n,e},Ee=o,Se=me,we=function(e,t){try{Se(Ee,e,t)}catch(n){Ee[e]=t}return t},Oe=we,Re="__core-js_shared__",Te=o[Re]||Oe(Re,{}),_e=Te;(ye.exports=function(e,t){return _e[e]||(_e[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.12.1",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"});var je,Pe,Ie=0,Ce=Math.random(),Ne=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++Ie+Ce).toString(36)},Ae=o,ke=o,$e=function(e){return"function"==typeof e?e:void 0},Le=function(e,t){return arguments.length<2?$e(Ae[e])||$e(ke[e]):Ae[e]&&Ae[e][t]||ke[e]&&ke[e][t]},Me=Le("navigator","userAgent")||"",Ue=o.process,De=Ue&&Ue.versions,Fe=De&&De.v8;Fe?Pe=(je=Fe.split("."))[0]<4?1:je[0]+je[1]:Me&&(!(je=Me.match(/Edge\/(\d+)/))||je[1]>=74)&&(je=Me.match(/Chrome\/(\d+)/))&&(Pe=je[1]);var ze=Pe&&+Pe,Ke=t,Be=!!Object.getOwnPropertySymbols&&!Ke((function(){return!String(Symbol())||!Symbol.sham&&ze&&ze<41})),We=Be&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,Ge=o,Ve=ye.exports,Ye=z,qe=Ne,Xe=Be,He=We,Je=Ve("wks"),Qe=Ge.Symbol,Ze=He?Qe:Qe&&Qe.withoutSetter||qe,et=function(e){return Ye(Je,e)&&(Xe||"string"==typeof Je[e])||(Xe&&Ye(Qe,e)?Je[e]=Qe[e]:Je[e]=Ze("Symbol."+e)),Je[e]},tt=d,nt=B,rt=et("match"),ot=h,it=function(){var e=ot(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t},ct={},at=t;function ut(e,t){return RegExp(e,t)}ct.UNSUPPORTED_Y=at((function(){var e=ut("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),ct.BROKEN_CARET=at((function(){var e=ut("^r","gy");return e.lastIndex=2,null!=e.exec("str")}));var lt={exports:{}},ft=Te,st=Function.toString;"function"!=typeof ft.inspectSource&&(ft.inspectSource=function(e){return st.call(e)});var pt,dt,gt,ht=ft.inspectSource,yt=ht,vt=o.WeakMap,xt="function"==typeof vt&&/native code/.test(yt(vt)),bt=ye.exports,mt=Ne,Et=bt("keys"),St=xt,wt=d,Ot=me,Rt=z,Tt=Te,_t=function(e){return Et[e]||(Et[e]=mt(e))},jt=le,Pt="Object already initialized",It=o.WeakMap;if(St||Tt.state){var Ct=Tt.state||(Tt.state=new It),Nt=Ct.get,At=Ct.has,kt=Ct.set;pt=function(e,t){if(At.call(Ct,e))throw new TypeError(Pt);return t.facade=e,kt.call(Ct,e,t),t},dt=function(e){return Nt.call(Ct,e)||{}},gt=function(e){return At.call(Ct,e)}}else{var $t=_t("state");jt[$t]=!0,pt=function(e,t){if(Rt(e,$t))throw new TypeError(Pt);return t.facade=e,Ot(e,$t,t),t},dt=function(e){return Rt(e,$t)?e[$t]:{}},gt=function(e){return Rt(e,$t)}}var Lt={set:pt,get:dt,has:gt,enforce:function(e){return gt(e)?dt(e):pt(e,{})},getterFor:function(e){return function(t){var n;if(!wt(t)||(n=dt(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},Mt=o,Ut=me,Dt=z,Ft=we,zt=ht,Kt=Lt.get,Bt=Lt.enforce,Wt=String(String).split("String");(lt.exports=function(e,t,n,r){var o,i=!!r&&!!r.unsafe,c=!!r&&!!r.enumerable,a=!!r&&!!r.noTargetGet;"function"==typeof n&&("string"!=typeof t||Dt(n,"name")||Ut(n,"name",t),(o=Bt(n)).source||(o.source=Wt.join("string"==typeof t?t:""))),e!==Mt?(i?!a&&e[t]&&(c=!0):delete e[t],c?e[t]=n:Ut(e,t,n)):c?e[t]=n:Ft(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&Kt(this).source||zt(this)}));var Gt=Le,Vt=S,Yt=n,qt=et("species"),Xt=n,Ht=o,Jt=p,Qt=function(e,t,n){var r,o;return E&&"function"==typeof(r=t.constructor)&&r!==n&&m(o=r.prototype)&&o!==n.prototype&&E(e,o),e},Zt=S.f,en=$.f,tn=function(e){var t;return tt(e)&&(void 0!==(t=e[rt])?!!t:"RegExp"==nt(e))},nn=it,rn=ct,on=lt.exports,cn=t,an=Lt.enforce,un=function(e){var t=Gt(e),n=Vt.f;Yt&&t&&!t[qt]&&n(t,qt,{configurable:!0,get:function(){return this}})},ln=et("match"),fn=Ht.RegExp,sn=fn.prototype,pn=/a/g,dn=/a/g,gn=new fn(pn)!==pn,hn=rn.UNSUPPORTED_Y;if(Xt&&Jt("RegExp",!gn||hn||cn((function(){return dn[ln]=!1,fn(pn)!=pn||fn(dn)==dn||"/a/i"!=fn(pn,"i")})))){for(var yn=function(e,t){var n,r=this instanceof yn,o=tn(e),i=void 0===t;if(!r&&o&&e.constructor===yn&&i)return e;gn?o&&!i&&(e=e.source):e instanceof yn&&(i&&(t=nn.call(e)),e=e.source),hn&&(n=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,""));var c=Qt(gn?new fn(e,t):fn(e,t),r?this:sn,yn);hn&&n&&(an(c).sticky=!0);return c},vn=function(e){e in yn||Zt(yn,e,{configurable:!0,get:function(){return fn[e]},set:function(t){fn[e]=t}})},xn=en(fn),bn=0;xn.length>bn;)vn(xn[bn++]);sn.constructor=yn,yn.prototype=sn,on(Ht,"RegExp",yn)}un("RegExp");var mn={},En={},Sn={}.propertyIsEnumerable,wn=Object.getOwnPropertyDescriptor,On=wn&&!Sn.call({1:2},1);En.f=On?function(e){var t=wn(this,e);return!!t&&t.enumerable}:Sn;var Rn=n,Tn=En,_n=ve,jn=q,Pn=P,In=z,Cn=_,Nn=Object.getOwnPropertyDescriptor;mn.f=Rn?Nn:function(e,t){if(e=jn(e),t=Pn(t,!0),Cn)try{return Nn(e,t)}catch(e){}if(In(e,t))return _n(!Tn.f.call(e,t),e[t])};var An={};An.f=Object.getOwnPropertySymbols;var kn=$,$n=An,Ln=h,Mn=Le("Reflect","ownKeys")||function(e){var t=kn.f(Ln(e)),n=$n.f;return n?t.concat(n(e)):t},Un=z,Dn=Mn,Fn=mn,zn=S,Kn=o,Bn=mn.f,Wn=me,Gn=lt.exports,Vn=we,Yn=function(e,t){for(var n=Dn(t),r=zn.f,o=Fn.f,i=0;i0&&(!i.multiline||i.multiline&&"\n"!==e[i.lastIndex-1])&&(u="(?: "+u+")",f=" "+f,l++),n=new RegExp("^(?:"+u+")",a)),rr&&(n=new RegExp("^"+u+"$(?!\\s)",a)),tr&&(t=i.lastIndex),r=Qn.call(c?n:i,f),c?r?(r.input=r.input.slice(l),r[0]=r[0].slice(l),r.index=i.lastIndex,i.lastIndex+=r[0].length):i.lastIndex=0:tr&&r&&(i.lastIndex=i.global?r.index+r[0].length:t),rr&&r&&r.length>1&&Zn.call(r[0],n,(function(){for(o=1;o")})),Sr="$0"==="a".replace(/./,"$0"),wr=vr("replace"),Or=!!/./[wr]&&""===/./[wr]("a","$0"),Rr=!yr((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]})),Tr=J,_r=L,jr=function(e){return function(t,n){var r,o,i=String(_r(t)),c=Tr(n),a=i.length;return c<0||c>=a?e?"":void 0:(r=i.charCodeAt(c))<55296||r>56319||c+1===a||(o=i.charCodeAt(c+1))<56320||o>57343?e?i.charAt(c):r:e?i.slice(c,c+2):o-56320+(r-55296<<10)+65536}},Pr={codeAt:jr(!1),charAt:jr(!0)}.charAt,Ir=U,Cr=Math.floor,Nr="".replace,Ar=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,kr=/\$([$&'`]|\d{1,2})/g,$r=B,Lr=or,Mr=function(e,t,n,r){var o=vr(e),i=!yr((function(){var t={};return t[o]=function(){return 7},7!=""[e](t)})),c=i&&!yr((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[br]=function(){return n},n.flags="",n[o]=/./[o]),n.exec=function(){return t=!0,null},n[o](""),!t}));if(!i||!c||"replace"===e&&(!Er||!Sr||Or)||"split"===e&&!Rr){var a=/./[o],u=n(o,""[e],(function(e,t,n,r,o){var c=t.exec;return c===hr||c===mr.exec?i&&!o?{done:!0,value:a.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),{REPLACE_KEEPS_$0:Sr,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:Or}),l=u[0],f=u[1];gr(String.prototype,e,l),gr(mr,o,2==t?function(e,t){return f.call(e,this,t)}:function(e){return f.call(e,this)})}r&&xr(mr[o],"sham",!0)},Ur=h,Dr=ee,Fr=J,zr=L,Kr=function(e,t,n){return t+(n?Pr(e,t).length:1)},Br=function(e,t,n,r,o,i){var c=n+e.length,a=r.length,u=kr;return void 0!==o&&(o=Ir(o),u=Ar),Nr.call(i,u,(function(i,u){var l;switch(u.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(c);case"<":l=o[u.slice(1,-1)];break;default:var f=+u;if(0===f)return i;if(f>a){var s=Cr(f/10);return 0===s?i:s<=a?void 0===r[s-1]?u.charAt(1):r[s-1]+u.charAt(1):i}l=r[f-1]}return void 0===l?"":l}))},Wr=function(e,t){var n=e.exec;if("function"==typeof n){var r=n.call(e,t);if("object"!=typeof r)throw TypeError("RegExp exec method returned something other than an Object or null");return r}if("RegExp"!==$r(e))throw TypeError("RegExp#exec called on incompatible receiver");return Lr.call(e,t)},Gr=Math.max,Vr=Math.min;Mr("replace",2,(function(e,t,n,r){var o=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,i=r.REPLACE_KEEPS_$0,c=o?"$":"$0";return[function(n,r){var o=zr(this),i=null==n?void 0:n[e];return void 0!==i?i.call(n,o,r):t.call(String(o),n,r)},function(e,r){if(!o&&i||"string"==typeof r&&-1===r.indexOf(c)){var a=n(t,e,this,r);if(a.done)return a.value}var u=Ur(e),l=String(this),f="function"==typeof r;f||(r=String(r));var s=u.global;if(s){var p=u.unicode;u.lastIndex=0}for(var d=[];;){var g=Wr(u,l);if(null===g)break;if(d.push(g),!s)break;""===String(g[0])&&(u.lastIndex=Kr(l,Dr(u.lastIndex),p))}for(var h,y="",v=0,x=0;x=v&&(y+=l.slice(v,m)+R,v=m+b.length)}return y+l.slice(v)}]}));var Yr={};Yr[et("toStringTag")]="z";var qr="[object z]"===String(Yr),Xr=qr,Hr=B,Jr=et("toStringTag"),Qr="Arguments"==Hr(function(){return arguments}()),Zr=Xr?Hr:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),Jr))?n:Qr?Hr(t):"Object"==(r=Hr(t))&&"function"==typeof t.callee?"Arguments":r},eo=qr?{}.toString:function(){return"[object "+Zr(this)+"]"},to=qr,no=lt.exports,ro=eo;to||no(Object.prototype,"toString",ro,{unsafe:!0})
+/*!
+ * Handles finding a text string anywhere in the slides and showing the next occurrence to the user
+ * by navigatating to that slide and highlighting it.
+ *
+ * @author Jon Snyder , February 2013
+ */;return function(){var e,t,n,r,o,i,c;function a(){(t=document.createElement("div")).classList.add("searchbox"),t.style.position="absolute",t.style.top="10px",t.style.right="10px",t.style.zIndex=10,t.innerHTML='\n\t\t',(n=t.querySelector(".searchinput")).style.width="240px",n.style.fontSize="14px",n.style.padding="4px 6px",n.style.color="#000",n.style.background="#fff",n.style.borderRadius="2px",n.style.border="0",n.style.outline="0",n.style.boxShadow="0 2px 18px rgba(0, 0, 0, 0.2)",n.style["-webkit-appearance"]="none",e.getRevealElement().appendChild(t),n.addEventListener("keyup",(function(t){switch(t.keyCode){case 13:t.preventDefault(),function(){if(i){var t=n.value;""===t?(c&&c.remove(),r=null):(c=new f("slidecontent"),r=c.apply(t),o=0)}r&&(r.length&&r.length<=o&&(o=0),r.length>o&&(e.slide(r[o].h,r[o].v),o++))}(),i=!1;break;default:i=!0}}),!1),l()}function u(){t||a(),t.style.display="inline",n.focus(),n.select()}function l(){t||a(),t.style.display="none",c&&c.remove()}function f(t,n){var r=document.getElementById(t)||document.body,o=n||"EM",i=new RegExp("^(?:"+o+"|SCRIPT|FORM)$"),c=["#ff6","#a0ffff","#9f9","#f99","#f6f"],a=[],u=0,l="",f=[];this.setRegex=function(e){e=e.replace(/^[^\w]+|[^\w]+$/g,"").replace(/[^\w'-]+/g,"|"),l=new RegExp("("+e+")","i")},this.getRegex=function(){return l.toString().replace(/^\/\\b\(|\)\\b\/i$/g,"").replace(/\|/g," ")},this.hiliteWords=function(t){if(null!=t&&t&&l&&!i.test(t.nodeName)){if(t.hasChildNodes())for(var n=0;n {
+
+ zoom.reset();
+
+ }
+
+};
+
+export default () => Plugin;
+
+/*!
+ * zoom.js 0.3 (modified for use with reveal.js)
+ * http://lab.hakim.se/zoom-js
+ * MIT licensed
+ *
+ * Copyright (C) 2011-2014 Hakim El Hattab, http://hakim.se
+ */
+var zoom = (function(){
+
+ // The current zoom level (scale)
+ var level = 1;
+
+ // The current mouse position, used for panning
+ var mouseX = 0,
+ mouseY = 0;
+
+ // Timeout before pan is activated
+ var panEngageTimeout = -1,
+ panUpdateInterval = -1;
+
+ // Check for transform support so that we can fallback otherwise
+ var supportsTransforms = 'transform' in document.body.style;
+
+ if( supportsTransforms ) {
+ // The easing that will be applied when we zoom in/out
+ document.body.style.transition = 'transform 0.8s ease';
+ }
+
+ // Zoom out if the user hits escape
+ document.addEventListener( 'keyup', function( event ) {
+ if( level !== 1 && event.keyCode === 27 ) {
+ zoom.out();
+ }
+ } );
+
+ // Monitor mouse movement for panning
+ document.addEventListener( 'mousemove', function( event ) {
+ if( level !== 1 ) {
+ mouseX = event.clientX;
+ mouseY = event.clientY;
+ }
+ } );
+
+ /**
+ * Applies the CSS required to zoom in, prefers the use of CSS3
+ * transforms but falls back on zoom for IE.
+ *
+ * @param {Object} rect
+ * @param {Number} scale
+ */
+ function magnify( rect, scale ) {
+
+ var scrollOffset = getScrollOffset();
+
+ // Ensure a width/height is set
+ rect.width = rect.width || 1;
+ rect.height = rect.height || 1;
+
+ // Center the rect within the zoomed viewport
+ rect.x -= ( window.innerWidth - ( rect.width * scale ) ) / 2;
+ rect.y -= ( window.innerHeight - ( rect.height * scale ) ) / 2;
+
+ if( supportsTransforms ) {
+ // Reset
+ if( scale === 1 ) {
+ document.body.style.transform = '';
+ }
+ // Scale
+ else {
+ var origin = scrollOffset.x +'px '+ scrollOffset.y +'px',
+ transform = 'translate('+ -rect.x +'px,'+ -rect.y +'px) scale('+ scale +')';
+
+ document.body.style.transformOrigin = origin;
+ document.body.style.transform = transform;
+ }
+ }
+ else {
+ // Reset
+ if( scale === 1 ) {
+ document.body.style.position = '';
+ document.body.style.left = '';
+ document.body.style.top = '';
+ document.body.style.width = '';
+ document.body.style.height = '';
+ document.body.style.zoom = '';
+ }
+ // Scale
+ else {
+ document.body.style.position = 'relative';
+ document.body.style.left = ( - ( scrollOffset.x + rect.x ) / scale ) + 'px';
+ document.body.style.top = ( - ( scrollOffset.y + rect.y ) / scale ) + 'px';
+ document.body.style.width = ( scale * 100 ) + '%';
+ document.body.style.height = ( scale * 100 ) + '%';
+ document.body.style.zoom = scale;
+ }
+ }
+
+ level = scale;
+
+ if( document.documentElement.classList ) {
+ if( level !== 1 ) {
+ document.documentElement.classList.add( 'zoomed' );
+ }
+ else {
+ document.documentElement.classList.remove( 'zoomed' );
+ }
+ }
+ }
+
+ /**
+ * Pan the document when the mosue cursor approaches the edges
+ * of the window.
+ */
+ function pan() {
+ var range = 0.12,
+ rangeX = window.innerWidth * range,
+ rangeY = window.innerHeight * range,
+ scrollOffset = getScrollOffset();
+
+ // Up
+ if( mouseY < rangeY ) {
+ window.scroll( scrollOffset.x, scrollOffset.y - ( 1 - ( mouseY / rangeY ) ) * ( 14 / level ) );
+ }
+ // Down
+ else if( mouseY > window.innerHeight - rangeY ) {
+ window.scroll( scrollOffset.x, scrollOffset.y + ( 1 - ( window.innerHeight - mouseY ) / rangeY ) * ( 14 / level ) );
+ }
+
+ // Left
+ if( mouseX < rangeX ) {
+ window.scroll( scrollOffset.x - ( 1 - ( mouseX / rangeX ) ) * ( 14 / level ), scrollOffset.y );
+ }
+ // Right
+ else if( mouseX > window.innerWidth - rangeX ) {
+ window.scroll( scrollOffset.x + ( 1 - ( window.innerWidth - mouseX ) / rangeX ) * ( 14 / level ), scrollOffset.y );
+ }
+ }
+
+ function getScrollOffset() {
+ return {
+ x: window.scrollX !== undefined ? window.scrollX : window.pageXOffset,
+ y: window.scrollY !== undefined ? window.scrollY : window.pageYOffset
+ }
+ }
+
+ return {
+ /**
+ * Zooms in on either a rectangle or HTML element.
+ *
+ * @param {Object} options
+ * - element: HTML element to zoom in on
+ * OR
+ * - x/y: coordinates in non-transformed space to zoom in on
+ * - width/height: the portion of the screen to zoom in on
+ * - scale: can be used instead of width/height to explicitly set scale
+ */
+ to: function( options ) {
+
+ // Due to an implementation limitation we can't zoom in
+ // to another element without zooming out first
+ if( level !== 1 ) {
+ zoom.out();
+ }
+ else {
+ options.x = options.x || 0;
+ options.y = options.y || 0;
+
+ // If an element is set, that takes precedence
+ if( !!options.element ) {
+ // Space around the zoomed in element to leave on screen
+ var padding = 20;
+ var bounds = options.element.getBoundingClientRect();
+
+ options.x = bounds.left - padding;
+ options.y = bounds.top - padding;
+ options.width = bounds.width + ( padding * 2 );
+ options.height = bounds.height + ( padding * 2 );
+ }
+
+ // If width/height values are set, calculate scale from those values
+ if( options.width !== undefined && options.height !== undefined ) {
+ options.scale = Math.max( Math.min( window.innerWidth / options.width, window.innerHeight / options.height ), 1 );
+ }
+
+ if( options.scale > 1 ) {
+ options.x *= options.scale;
+ options.y *= options.scale;
+
+ magnify( options, options.scale );
+
+ if( options.pan !== false ) {
+
+ // Wait with engaging panning as it may conflict with the
+ // zoom transition
+ panEngageTimeout = setTimeout( function() {
+ panUpdateInterval = setInterval( pan, 1000 / 60 );
+ }, 800 );
+
+ }
+ }
+ }
+ },
+
+ /**
+ * Resets the document zoom state to its default.
+ */
+ out: function() {
+ clearTimeout( panEngageTimeout );
+ clearInterval( panUpdateInterval );
+
+ magnify( { x: 0, y: 0 }, 1 );
+
+ level = 1;
+ },
+
+ // Alias
+ magnify: function( options ) { this.to( options ) },
+ reset: function() { this.out() },
+
+ zoomLevel: function() {
+ return level;
+ }
+ }
+
+})();
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/zoom/zoom.esm.js b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/zoom/zoom.esm.js
new file mode 100644
index 0000000..c0e8d7b
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/zoom/zoom.esm.js
@@ -0,0 +1,4 @@
+/*!
+ * reveal.js Zoom plugin
+ */
+var e={id:"zoom",init:function(e){e.getRevealElement().addEventListener("mousedown",(function(n){var o=/Linux/.test(window.navigator.platform)?"ctrl":"alt",i=(e.getConfig().zoomKey?e.getConfig().zoomKey:o)+"Key",d=e.getConfig().zoomLevel?e.getConfig().zoomLevel:2;n[i]&&!e.isOverview()&&(n.preventDefault(),t.to({x:n.clientX,y:n.clientY,scale:d,pan:!1}))}))},destroy:function(){t.reset()}},t=function(){var e=1,n=0,o=0,i=-1,d=-1,l="transform"in document.body.style;function s(t,n){var o=r();if(t.width=t.width||1,t.height=t.height||1,t.x-=(window.innerWidth-t.width*n)/2,t.y-=(window.innerHeight-t.height*n)/2,l)if(1===n)document.body.style.transform="";else{var i=o.x+"px "+o.y+"px",d="translate("+-t.x+"px,"+-t.y+"px) scale("+n+")";document.body.style.transformOrigin=i,document.body.style.transform=d}else 1===n?(document.body.style.position="",document.body.style.left="",document.body.style.top="",document.body.style.width="",document.body.style.height="",document.body.style.zoom=""):(document.body.style.position="relative",document.body.style.left=-(o.x+t.x)/n+"px",document.body.style.top=-(o.y+t.y)/n+"px",document.body.style.width=100*n+"%",document.body.style.height=100*n+"%",document.body.style.zoom=n);e=n,document.documentElement.classList&&(1!==e?document.documentElement.classList.add("zoomed"):document.documentElement.classList.remove("zoomed"))}function c(){var t=.12*window.innerWidth,i=.12*window.innerHeight,d=r();owindow.innerHeight-i&&window.scroll(d.x,d.y+(1-(window.innerHeight-o)/i)*(14/e)),nwindow.innerWidth-t&&window.scroll(d.x+(1-(window.innerWidth-n)/t)*(14/e),d.y)}function r(){return{x:void 0!==window.scrollX?window.scrollX:window.pageXOffset,y:void 0!==window.scrollY?window.scrollY:window.pageYOffset}}return l&&(document.body.style.transition="transform 0.8s ease"),document.addEventListener("keyup",(function(n){1!==e&&27===n.keyCode&&t.out()})),document.addEventListener("mousemove",(function(t){1!==e&&(n=t.clientX,o=t.clientY)})),{to:function(n){if(1!==e)t.out();else{if(n.x=n.x||0,n.y=n.y||0,n.element){var o=n.element.getBoundingClientRect();n.x=o.left-20,n.y=o.top-20,n.width=o.width+40,n.height=o.height+40}void 0!==n.width&&void 0!==n.height&&(n.scale=Math.max(Math.min(window.innerWidth/n.width,window.innerHeight/n.height),1)),n.scale>1&&(n.x*=n.scale,n.y*=n.scale,s(n,n.scale),!1!==n.pan&&(i=setTimeout((function(){d=setInterval(c,1e3/60)}),800)))}},out:function(){clearTimeout(i),clearInterval(d),s({x:0,y:0},1),e=1},magnify:function(e){this.to(e)},reset:function(){this.out()},zoomLevel:function(){return e}}}();export default function(){return e}
diff --git a/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/zoom/zoom.js b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/zoom/zoom.js
new file mode 100644
index 0000000..b52804d
--- /dev/null
+++ b/lect12-gsea/lect12-gsea_files/libs/revealjs/plugin/zoom/zoom.js
@@ -0,0 +1,4 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).RevealZoom=t()}(this,(function(){"use strict";
+/*!
+ * reveal.js Zoom plugin
+ */var e={id:"zoom",init:function(e){e.getRevealElement().addEventListener("mousedown",(function(o){var n=/Linux/.test(window.navigator.platform)?"ctrl":"alt",i=(e.getConfig().zoomKey?e.getConfig().zoomKey:n)+"Key",d=e.getConfig().zoomLevel?e.getConfig().zoomLevel:2;o[i]&&!e.isOverview()&&(o.preventDefault(),t.to({x:o.clientX,y:o.clientY,scale:d,pan:!1}))}))},destroy:function(){t.reset()}},t=function(){var e=1,o=0,n=0,i=-1,d=-1,l="transform"in document.body.style;function s(t,o){var n=r();if(t.width=t.width||1,t.height=t.height||1,t.x-=(window.innerWidth-t.width*o)/2,t.y-=(window.innerHeight-t.height*o)/2,l)if(1===o)document.body.style.transform="";else{var i=n.x+"px "+n.y+"px",d="translate("+-t.x+"px,"+-t.y+"px) scale("+o+")";document.body.style.transformOrigin=i,document.body.style.transform=d}else 1===o?(document.body.style.position="",document.body.style.left="",document.body.style.top="",document.body.style.width="",document.body.style.height="",document.body.style.zoom=""):(document.body.style.position="relative",document.body.style.left=-(n.x+t.x)/o+"px",document.body.style.top=-(n.y+t.y)/o+"px",document.body.style.width=100*o+"%",document.body.style.height=100*o+"%",document.body.style.zoom=o);e=o,document.documentElement.classList&&(1!==e?document.documentElement.classList.add("zoomed"):document.documentElement.classList.remove("zoomed"))}function c(){var t=.12*window.innerWidth,i=.12*window.innerHeight,d=r();nwindow.innerHeight-i&&window.scroll(d.x,d.y+(1-(window.innerHeight-n)/i)*(14/e)),owindow.innerWidth-t&&window.scroll(d.x+(1-(window.innerWidth-o)/t)*(14/e),d.y)}function r(){return{x:void 0!==window.scrollX?window.scrollX:window.pageXOffset,y:void 0!==window.scrollY?window.scrollY:window.pageYOffset}}return l&&(document.body.style.transition="transform 0.8s ease"),document.addEventListener("keyup",(function(o){1!==e&&27===o.keyCode&&t.out()})),document.addEventListener("mousemove",(function(t){1!==e&&(o=t.clientX,n=t.clientY)})),{to:function(o){if(1!==e)t.out();else{if(o.x=o.x||0,o.y=o.y||0,o.element){var n=o.element.getBoundingClientRect();o.x=n.left-20,o.y=n.top-20,o.width=n.width+40,o.height=n.height+40}void 0!==o.width&&void 0!==o.height&&(o.scale=Math.max(Math.min(window.innerWidth/o.width,window.innerHeight/o.height),1)),o.scale>1&&(o.x*=o.scale,o.y*=o.scale,s(o,o.scale),!1!==o.pan&&(i=setTimeout((function(){d=setInterval(c,1e3/60)}),800)))}},out:function(){clearTimeout(i),clearInterval(d),s({x:0,y:0},1),e=1},magnify:function(e){this.to(e)},reset:function(){this.out()},zoomLevel:function(){return e}}}();return function(){return e}}));