├── .gitignore ├── .nvmrc ├── README.md ├── assets └── favicon.svg ├── docs ├── build │ ├── bundle.css │ ├── bundle.css.map │ ├── bundle.js │ └── bundle.js.map ├── favicon.ico ├── global.css ├── index.html └── sounds │ ├── buzzer.ogg │ ├── cheer.ogg │ ├── ding.ogg │ └── theme.ogg ├── package-lock.json ├── package.json ├── public ├── favicon.ico ├── global.css ├── index.html └── sounds │ ├── buzzer.ogg │ ├── cheer.ogg │ ├── ding.ogg │ └── theme.ogg ├── rollup.config.js └── src ├── Answer.svelte ├── App.svelte ├── Bank.svelte ├── Board.svelte ├── Guess.svelte ├── Question.svelte ├── Team.svelte └── main.js /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | /public/build/ 3 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v12.16.3 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Hacker Feud](https://i.imgur.com/2Q0EAXK.gif) 2 | 3 | # Hacker Feud 4 | 5 | A tongue-in-cheek parody of Family Feud but for software engineers. 6 | Made with [Svelte](https://github.com/sveltejs/svelte). 7 | Click [here](https://lettier.github.io/hacker-feud/) to play. 8 | 9 | # Gameplay 10 | 11 | Among your group, select a host. 12 | The host will read off the questions, 13 | input the guesses, and manage the other parts of the interface. 14 | The rest of the group has to split into two teams. 15 | Within each team, order everyone sequentially. 16 | 17 | At the start of a round, 18 | the first person from each team faces off. 19 | For the very first guess, 20 | during the face off, 21 | the first person to say their guess goes first. 22 | Keep alternating until there is a correct guess. 23 | Whoever gives a correct guess wins the face off 24 | and their team now controls the board. 25 | At this moment, the controlling team can 26 | pass control to the opposing team if they wish. 27 | 28 | With control of the board, 29 | sequentially move through the team 30 | with each member giving a guess. 31 | After three strikes, 32 | the opposing team has a chance to guess and steal the bank. 33 | The bank is the number located in the middle near the top. 34 | If the opposing team doesn't steal or rather, gives an incorrect guess, 35 | the bank goes to the team that struck out. 36 | 37 | # Customize 38 | 39 | The team names, questions, answers, and points are located in [main.js](src/main.js). 40 | 41 | # Build 42 | 43 | ```bash 44 | git clone https://github.com/lettier/hacker-feud.git 45 | cd hacker-feud 46 | # Install Node Version Manager. 47 | curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash 48 | nvm use 49 | npm install 50 | npm run build 51 | ``` 52 | 53 | # Run 54 | 55 | ```bash 56 | npm run dev &> /dev/null & 57 | python -mwebbrowser http://localhost:55555 58 | ``` 59 | 60 | ## Copyright 61 | 62 | (C) 2020 David Lettier 63 |
64 | [lettier.com](https://www.lettier.com) 65 | -------------------------------------------------------------------------------- /assets/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 13 | 15 | 17 | 18 | 20 | image/svg+xml 21 | 23 | 24 | 25 | 26 | David Lettier 27 | 28 | 29 | 30 | 31 | (C) David Lettier 32 | 33 | 34 | 35 | 36 | 37 | 40 | 48 | 52 | 57 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /docs/build/bundle.css: -------------------------------------------------------------------------------- 1 | .answer.svelte-1bkgl8a{margin-top:5px;margin-bottom:5px;margin-left:2.5px;margin-right:2.5px;padding:5px;padding-left:10px;padding-right:10px;background-color:lightcoral;color:ghostwhite;font-size:2vw;max-width:50%;flex-basis:40%;display:flex;justify-content:space-between;border-radius:10px} 2 | .message.svelte-1iwruhk{position:absolute;top:0px;left:0px;z-index:1000;width:100%;height:100%;display:flex;justify-content:center;align-items:center;color:white;background-color:rgba(100, 100, 100, 0.8);font-size:6vw;text-align:center;cursor:pointer}.message-text.svelte-1iwruhk{width:80%}.column-center.svelte-1iwruhk{width:100%;height:100%;display:flex;flex-flow:column;flex-wrap:nowrap;justify-content:center;align-items:center}.row-center.svelte-1iwruhk{width:100%;display:flex;flex-flow:row;flex-wrap:nowrap;justify-content:center;align-items:center}.logo.svelte-1iwruhk{margin:1%;background-color:cornsilk;padding:5%;border-radius:45%;width:40%;border:20px bisque dotted;text-align:center;box-shadow:inset 0 0 0 20px white}.logo-text.svelte-1iwruhk{text-align:center;color:coral;font-family:Rye;font-size:10vw;text-shadow:5px 5px 0px white}.github.svelte-1iwruhk{background-color:bisque;color:lightcoral}.github.svelte-1iwruhk:hover{background-color:bisque;color:lightcoral} 3 | .bank.svelte-pxlgt{display:flex;justify-content:center;align-items:center;width:10%;font-size:4vw;color:coral;background-color:bisque;padding:25px;border-radius:25px;display:flex;flex-flow:row} 4 | .board-container.svelte-gb7rwm{width:80%;height:55%;margin-top:5%;margin-bottom:20px;display:flex;flex-flow:column;justify-content:center;align-items:center;background-color:cornsilk;border-radius:40%;border:20px dotted bisque;box-shadow:inset 0 0 0 20px white}.board.svelte-gb7rwm{display:flex;flex-flow:row;justify-content:space-between;align-items:center;position:relative;width:105%;height:100%}.board-middle.svelte-gb7rwm{position:relative;top:-7.5%}.answers.svelte-gb7rwm{width:100%;display:flex;flex-flow:row;flex-wrap:wrap;align-items:center;justify-content:center;margin-left:10px;margin-right:10px;margin-top:20px;margin-bottom:20px}.strikes.svelte-gb7rwm{width:20%;display:flex;flex-wrap:nowrap;flex-flow:row;align-items:center;justify-content:space-evenly;border-radius:20px}.strike.svelte-gb7rwm{color:coral;font-size:5vw}.strike-hidden.svelte-gb7rwm{color:cornsilk}.row-center.svelte-gb7rwm{display:flex;justify-content:center;align-items:center;flex-flow:row} 5 | .container.svelte-9al0mu{display:flex;flex-flow:column;align-items:flex-start;justify-content:center;width:100%;margin-left:10%;margin-right:10%}.input-container.svelte-9al0mu{display:flex;flex-flow:row;align-items:flex-start;justify-content:flex-start;width:100%}.team-text.svelte-9al0mu{font-size:2vw}.margin-left.svelte-9al0mu{margin-left:5px} 6 | .question.svelte-1ahptd6{text-align:center;margin-top:20px;font-size:2.5vw;background-color:lightblue;padding-left:20px;padding-right:20px;border-radius:60px;display:flex;flex-flow:row} 7 | .team.svelte-1x4z6a5{font-size:4vw;color:coral;background-color:bisque;padding:25px;border-radius:25px;display:flex;flex-flow:row} 8 | 9 | /*# sourceMappingURL=bundle.css.map */ -------------------------------------------------------------------------------- /docs/build/bundle.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "file": "bundle.css", 4 | "sources": [ 5 | "../../Answer.svelte", 6 | "../../App.svelte", 7 | "../../Bank.svelte", 8 | "../../Board.svelte", 9 | "../../Guess.svelte", 10 | "../../Question.svelte", 11 | "../../Team.svelte" 12 | ], 13 | "sourcesContent": [ 14 | "\n\n\n\n\n\n
\n {#if answer.show}\n
\n {answer.text}\n
\n
\n {answer.money}\n
\n {:else}\n
\n  \n
\n
\n  \n
\n {/if}\n
\n", 15 | "\n\n\n\n\n\n{#if showMessage}\n
showMessage = false }\">\n
{message}
\n
\n{/if}\n
\n {#if !start}\n
\n \n \n \n
\n {:else}\n \n {#if end}\n
\n \n
\n {:else}\n {#if next}\n
\n \n
\n {:else}\n
\n { e.teamNumber = 0; handleGuess(e); } }\" disable={teamDisable[0]} teamName={teamNames[0]}/>\n { e.teamNumber = 1; handleGuess(e); } }\" disable={teamDisable[1]} teamName={teamNames[1]}/>\n
\n {#if showPass}\n \n {/if}\n {/if}\n {/if}\n {/if}\n
\n", 16 | "\n\n\n\n\n\n
\n
\n {money}\n
\n
\n", 17 | "\n\n\n\n\n\n
\n
\n
\n \n
\n
\n
\n \n
\n
\n \n
\n
\n {#each answers as answer}\n \n {/each}\n
\n
\n
\n {#each strikes as strike}\n
\n {strike}\n
\n {:else}\n
\n ☐\n
\n {/each}\n
\n
\n
\n
\n \n
\n
\n
\n", 18 | "\n\n\n\n\n\n
\n
\n TEAM\n
\n
\n {#if !show || disable}\n show = true }\" disabled={ disable ? 'true' : '' }>\n \n {:else}\n { if (e.keyCode == 13) sendGuess(); } }\" autofocus>\n \n {/if}\n
\n
\n", 19 | "\n\n\n\n\n\n
\n

\n {question}\n

\n
\n", 20 | "\n\n\n\n\n\n
\n {money}\n
\n" 21 | ], 22 | "names": [], 23 | "mappings": "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" 24 | } -------------------------------------------------------------------------------- /docs/build/bundle.js: -------------------------------------------------------------------------------- 1 | var app=function(){"use strict";function e(){}function t(e){return e()}function n(){return Object.create(null)}function o(e){e.forEach(t)}function s(e){return"function"==typeof e}function r(e,t){return e!=e?t==t:e!==t||e&&"object"==typeof e||"function"==typeof e}function a(e,t){e.appendChild(t)}function i(e,t,n){e.insertBefore(t,n||null)}function l(e){e.parentNode.removeChild(e)}function c(e,t){for(let n=0;ne.removeEventListener(t,n,o)}function g(e,t,n){null==n?e.removeAttribute(t):e.getAttribute(t)!==n&&e.setAttribute(t,n)}function h(e,t){t=""+t,e.data!==t&&(e.data=t)}function $(e,t){(null!=t||e.value)&&(e.value=t)}function v(e,t,n,o){e.style.setProperty(t,n,o?"important":"")}let b;function w(e){b=e}function y(){const e=function(){if(!b)throw new Error("Function called outside component initialization");return b}();return(t,n)=>{const o=e.$$.callbacks[t];if(o){const s=function(e,t){const n=document.createEvent("CustomEvent");return n.initCustomEvent(e,!1,!1,t),n}(t,n);o.slice().forEach(t=>{t.call(e,s)})}}}const x=[],k=[],N=[],q=[],M=Promise.resolve();let E=!1;function T(e){N.push(e)}let L=!1;const C=new Set;function _(){if(!L){L=!0;do{for(let e=0;e{H.delete(e),o&&(n&&e.d(1),o())}),e.o(t)}}function W(e){e&&e.c()}function z(e,n,r){const{fragment:a,on_mount:i,on_destroy:l,after_update:c}=e.$$;a&&a.m(n,r),T(()=>{const n=i.map(t).filter(s);l?l.push(...n):o(n),e.$$.on_mount=[]}),c.forEach(T)}function B(e,t){const n=e.$$;null!==n.fragment&&(o(n.on_destroy),n.fragment&&n.fragment.d(t),n.on_destroy=n.fragment=null,n.ctx=[])}function G(e,t){-1===e.$$.dirty[0]&&(x.push(e),E||(E=!0,M.then(_)),e.$$.dirty.fill(0)),e.$$.dirty[t/31|0]|=1<{const s=o.length?o[0]:n;return d.ctx&&i(d.ctx[e],d.ctx[e]=s)&&(d.bound[e]&&d.bound[e](s),p&&G(t,e)),n}):[],d.update(),p=!0,o(d.before_update),d.fragment=!!a&&a(d.ctx),s.target){if(s.hydrate){const e=function(e){return Array.from(e.childNodes)}(s.target);d.fragment&&d.fragment.l(e),e.forEach(l)}else d.fragment&&d.fragment.c();s.intro&&A(t.$$.fragment),z(t,s.target,s.anchor),_()}w(m)}class I{$destroy(){B(this,1),this.$destroy=e}$on(e,t){const n=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return n.push(t),()=>{const e=n.indexOf(t);-1!==e&&n.splice(e,1)}}$set(){}}function K(t){let n,o,s;return{c(){n=u("div"),o=u("div"),s=m(t[0]),g(n,"class","bank svelte-pxlgt")},m(e,t){i(e,n,t),a(n,o),a(o,s)},p(e,[t]){1&t&&h(s,e[0])},i:e,o:e,d(e){e&&l(n)}}}function j(e,t,n){let{money:o=0}=t;return e.$set=e=>{"money"in e&&n(0,o=e.money)},[o]}class J extends I{constructor(e){super(),D(this,e,j,K,r,{money:0})}}function Q(t){let n,o;return{c(){n=u("div"),o=m(t[0]),g(n,"class","team svelte-1x4z6a5")},m(e,t){i(e,n,t),a(n,o)},p(e,[t]){1&t&&h(o,e[0])},i:e,o:e,d(e){e&&l(n)}}}function V(e,t,n){let{money:o=0}=t;return e.$set=e=>{"money"in e&&n(0,o=e.money)},[o]}class U extends I{constructor(e){super(),D(this,e,V,Q,r,{money:0})}}function X(t){let n,o,s;return{c(){n=u("div"),o=u("p"),s=m(t[0]),g(n,"class","question svelte-1ahptd6")},m(e,t){i(e,n,t),a(n,o),a(o,s)},p(e,[t]){1&t&&h(s,e[0])},i:e,o:e,d(e){e&&l(n)}}}function Y(e,t,n){let{question:o}=t;return e.$set=e=>{"question"in e&&n(0,o=e.question)},[o]}class Z extends I{constructor(e){super(),D(this,e,Y,X,r,{question:0})}}function ee(t){let n,o,s;return{c(){n=u("div"),n.textContent=" ",o=f(),s=u("div"),s.textContent=" "},m(e,t){i(e,n,t),i(e,o,t),i(e,s,t)},p:e,d(e){e&&l(n),e&&l(o),e&&l(s)}}}function te(e){let t,n,o,s,r,c=e[0].text+"",d=e[0].money+"";return{c(){t=u("div"),n=m(c),o=f(),s=u("div"),r=m(d)},m(e,l){i(e,t,l),a(t,n),i(e,o,l),i(e,s,l),a(s,r)},p(e,t){1&t&&c!==(c=e[0].text+"")&&h(n,c),1&t&&d!==(d=e[0].money+"")&&h(r,d)},d(e){e&&l(t),e&&l(o),e&&l(s)}}}function ne(t){let n,o;function s(e,t){return e[0].show?te:ee}let r=s(t),a=r(t);return{c(){n=u("div"),a.c(),g(n,"class",o="answer "+(t[0].show?"answer-animation":"")+" svelte-1bkgl8a")},m(e,t){i(e,n,t),a.m(n,null)},p(e,[t]){r===(r=s(e))&&a?a.p(e,t):(a.d(1),a=r(e),a&&(a.c(),a.m(n,null))),1&t&&o!==(o="answer "+(e[0].show?"answer-animation":"")+" svelte-1bkgl8a")&&g(n,"class",o)},i:e,o:e,d(e){e&&l(n),a.d()}}}function oe(e,t,n){let{answer:o}=t;return e.$set=e=>{"answer"in e&&n(0,o=e.answer)},[o]}class se extends I{constructor(e){super(),D(this,e,oe,ne,r,{answer:0})}}function re(e,t,n){const o=e.slice();return o[5]=t[n],o}function ae(e,t,n){const o=e.slice();return o[8]=t[n],o}function ie(e){let t;const n=new se({props:{answer:e[8]}});return{c(){W(n.$$.fragment)},m(e,o){z(n,e,o),t=!0},p(e,t){const o={};16&t&&(o.answer=e[8]),n.$set(o)},i(e){t||(A(n.$$.fragment,e),t=!0)},o(e){R(n.$$.fragment,e),t=!1},d(e){B(n,e)}}}function le(e){let t;return{c(){t=u("div"),t.textContent="☐\n ",g(t,"class","strike strike-hidden svelte-gb7rwm")},m(e,n){i(e,t,n)},d(e){e&&l(t)}}}function ce(e){let t,n,o,s=e[5]+"";return{c(){t=u("div"),n=m(s),o=f(),g(t,"class","strike svelte-gb7rwm")},m(e,s){i(e,t,s),a(t,n),a(t,o)},p(e,t){8&t&&s!==(s=e[5]+"")&&h(n,s)},d(e){e&&l(t)}}}function ue(e){let t,n,o,s,r,m,d,p,h,$,v,b,w,y,x,k;const N=new U({props:{money:e[2][0]}}),q=new J({props:{money:e[1]}}),M=new Z({props:{question:e[0].question}});let E=e[4],T=[];for(let t=0;tR(T[e],1,1,()=>{T[e]=null});let C=e[3],_=[];for(let t=0;t{"qa"in e&&n(0,s=e.qa),"bankMoney"in e&&n(1,r=e.bankMoney),"teamMoney"in e&&n(2,a=e.teamMoney),"strikes"in e&&n(3,i=e.strikes)},e.$$.update=()=>{1&e.$$.dirty&&n(4,o=s.answers)},[s,r,a,i,o]}class fe extends I{constructor(e){super(),D(this,e,me,ue,r,{qa:0,bankMoney:1,teamMoney:2,strikes:3})}}function de(e){let t,n,s,r;return{c(){t=u("input"),n=f(),s=u("button"),s.innerHTML="Submit",t.autofocus=!0,g(s,"class","margin-left button-animation svelte-9al0mu")},m(a,l,c){i(a,t,l),$(t,e[3]),i(a,n,l),i(a,s,l),t.focus(),c&&o(r),r=[p(t,"input",e[8]),p(t,"keyup",e[9]),p(s,"click",e[4])]},p(e,n){8&n&&t.value!==e[3]&&$(t,e[3])},d(e){e&&l(t),e&&l(n),e&&l(s),o(r)}}}function pe(e){let t,n,s,r,c,m,d;return{c(){t=u("input"),s=f(),r=u("button"),c=u("span"),c.textContent="Guess",v(t,"cursor",e[0]?"not-allowed":"pointer"),t.value=e[1],t.disabled=n=e[0]?"true":"",g(r,"class",m="margin-left "+(e[0]?"":"button-animation")+" svelte-9al0mu"),r.disabled=e[0]},m(n,l,u){i(n,t,l),i(n,s,l),i(n,r,l),a(r,c),u&&o(d),d=[p(t,"click",e[6]),p(r,"click",e[7])]},p(e,o){1&o&&v(t,"cursor",e[0]?"not-allowed":"pointer"),2&o&&t.value!==e[1]&&(t.value=e[1]),1&o&&n!==(n=e[0]?"true":"")&&(t.disabled=n),1&o&&m!==(m="margin-left "+(e[0]?"":"button-animation")+" svelte-9al0mu")&&g(r,"class",m),1&o&&(r.disabled=e[0])},d(e){e&&l(t),e&&l(s),e&&l(r),o(d)}}}function ge(t){let n,o,s,r;function c(e,t){return!e[2]||e[0]?pe:de}let m=c(t),d=m(t);return{c(){n=u("div"),o=u("div"),o.textContent="TEAM",s=f(),r=u("div"),d.c(),g(o,"class","team-text svelte-9al0mu"),g(r,"class","input-container svelte-9al0mu"),g(n,"class","container svelte-9al0mu")},m(e,t){i(e,n,t),a(n,o),a(n,s),a(n,r),d.m(r,null)},p(e,[t]){m===(m=c(e))&&d?d.p(e,t):(d.d(1),d=m(e),d&&(d.c(),d.m(r,null)))},i:e,o:e,d(e){e&&l(n),d.d()}}}function he(e,t,n){const o=y();let{disable:s=!1}=t,{teamName:r=""}=t,a=!1,i="";function l(e){o("guess",String(i).trim()),n(2,a=!1),n(3,i="")}return e.$set=e=>{"disable"in e&&n(0,s=e.disable),"teamName"in e&&n(1,r=e.teamName)},[s,r,a,i,l,o,e=>n(2,a=!0),e=>n(2,a=!0),function(){i=this.value,n(3,i)},e=>{13==e.keyCode&&l()}]}class $e extends I{constructor(e){super(),D(this,e,he,ge,r,{disable:0,teamName:1})}}function ve(e){let t,n,o,s;return{c(){t=u("div"),n=u("div"),o=m(e[9]),g(n,"class","message-text svelte-1iwruhk"),g(t,"class","message svelte-1iwruhk")},m(r,l,c){i(r,t,l),a(t,n),a(n,o),c&&s(),s=p(t,"click",e[26])},p(e,t){512&t&&h(o,e[9])},d(e){e&&l(t),s()}}}function be(e){let t,n,o,s,r;const a=new fe({props:{qa:e[0][e[2]],bankMoney:e[10],teamMoney:e[11],strikes:e[12]}}),c=[ke,xe,ye],u=[];function m(e,t){return e[8]?0:e[7]?1:2}return n=m(e),o=u[n]=c[n](e),{c(){W(a.$$.fragment),t=f(),o.c(),s=d()},m(e,o){z(a,e,o),i(e,t,o),u[n].m(e,o),i(e,s,o),r=!0},p(e,t){const r={};5&t&&(r.qa=e[0][e[2]]),1024&t&&(r.bankMoney=e[10]),2048&t&&(r.teamMoney=e[11]),4096&t&&(r.strikes=e[12]),a.$set(r);let i=n;n=m(e),n===i?u[n].p(e,t):(O(),R(u[i],1,1,()=>{u[i]=null}),P(),o=u[n],o||(o=u[n]=c[n](e),o.c()),A(o,1),o.m(s.parentNode,s))},i(e){r||(A(a.$$.fragment,e),A(o),r=!0)},o(e){R(a.$$.fragment,e),R(o),r=!1},d(e){B(a,e),e&&l(t),u[n].d(e),e&&l(s)}}}function we(t){let n,s,r,c,m,d,h;return{c(){n=u("div"),s=u("div"),s.innerHTML='
\n Hacker Feud\n
',r=f(),c=u("button"),c.innerHTML="Start",m=f(),d=u("button"),d.innerHTML="GitHub",g(s,"class","logo logo-border-animation svelte-1iwruhk"),g(d,"class","github svelte-1iwruhk"),g(n,"class","column-center svelte-1iwruhk")},m(e,l,u){i(e,n,l),a(n,s),a(n,r),a(n,c),a(n,m),a(n,d),u&&o(h),h=[p(c,"click",t[13]),p(d,"click",t[27])]},p:e,i:e,o:e,d(e){e&&l(n),o(h)}}}function ye(e){let t,n,o,s,r;const c=new $e({props:{disable:e[6][0],teamName:e[1][0]}});c.$on("guess",e[28]);const m=new $e({props:{disable:e[6][1],teamName:e[1][1]}});m.$on("guess",e[29]);let p=e[5]&&Ne(e);return{c(){t=u("div"),W(c.$$.fragment),n=f(),W(m.$$.fragment),o=f(),p&&p.c(),s=d(),g(t,"class","row-center svelte-1iwruhk")},m(e,l){i(e,t,l),z(c,t,null),a(t,n),z(m,t,null),i(e,o,l),p&&p.m(e,l),i(e,s,l),r=!0},p(e,t){const n={};64&t&&(n.disable=e[6][0]),2&t&&(n.teamName=e[1][0]),c.$set(n);const o={};64&t&&(o.disable=e[6][1]),2&t&&(o.teamName=e[1][1]),m.$set(o),e[5]?p?p.p(e,t):(p=Ne(e),p.c(),p.m(s.parentNode,s)):p&&(p.d(1),p=null)},i(e){r||(A(c.$$.fragment,e),A(m.$$.fragment,e),r=!0)},o(e){R(c.$$.fragment,e),R(m.$$.fragment,e),r=!1},d(e){e&&l(t),B(c),B(m),e&&l(o),p&&p.d(e),e&&l(s)}}}function xe(t){let n,o,s;return{c(){n=u("div"),o=u("button"),o.innerHTML="Next Round",g(n,"class","row-center svelte-1iwruhk")},m(e,r,l){i(e,n,r),a(n,o),l&&s(),s=p(o,"click",t[16])},p:e,i:e,o:e,d(e){e&&l(n),s()}}}function ke(t){let n,o,s;return{c(){n=u("div"),o=u("button"),o.innerHTML="Restart",g(n,"class","row-center svelte-1iwruhk")},m(e,r,l){i(e,n,r),a(n,o),l&&s(),s=p(o,"click",t[17])},p:e,i:e,o:e,d(e){e&&l(n),s()}}}function Ne(t){let n,o;return{c(){n=u("button"),n.innerHTML="Pass?"},m(e,s,r){i(e,n,s),r&&o(),o=p(n,"click",t[15])},p:e,d(e){e&&l(n),o()}}}function qe(e){let t,n,o,s,r,a=e[3]&&ve(e);const c=[we,be],m=[];function d(e,t){return e[4]?1:0}return o=d(e),s=m[o]=c[o](e),{c(){a&&a.c(),t=f(),n=u("div"),s.c(),g(n,"class","column-center svelte-1iwruhk")},m(e,s){a&&a.m(e,s),i(e,t,s),i(e,n,s),m[o].m(n,null),r=!0},p(e,[r]){e[3]?a?a.p(e,r):(a=ve(e),a.c(),a.m(t.parentNode,t)):a&&(a.d(1),a=null);let i=o;o=d(e),o===i?m[o].p(e,r):(O(),R(m[i],1,1,()=>{m[i]=null}),P(),s=m[o],s||(s=m[o]=c[o](e),s.c()),A(s,1),s.m(n,null))},i(e){r||(A(s),r=!0)},o(e){R(s),r=!1},d(e){a&&a.d(e),e&&l(t),e&&l(n),m[o].d()}}}function Me(e,t){let n=new Audio(`sounds/${e}.ogg`);n.volume=t,n.play()}function Ee(e){let t=document.getElementById("board");t&&(e?t.classList.add("logo-border-animation"):t.classList.remove("logo-border-animation"))}function Te(e,t,n){let{qas:o=[]}=t,{teamNames:s=["",""]}=t,r=0,a=!1,i=!1,l=!1,c=!1,u=[!1,!1],m=!1,f=!1,d=!1,p=null,g=-1,h="",$="",v=0,b=[0,0],w=[];function y(e,t){p&&clearTimeout(p),p=null,n(9,$=e),n(3,a=!0),t<=0||(p=setTimeout(()=>{n(9,$=""),n(3,a=!1)},1e3*t))}function x(e){let t=o[r].answers.map(t=>(t.show=e,t));n(0,o[r].answers=t,o)}function k(){let e=0,t=o[r].answers,n=t.length;for(let o=0;o1&&(g=0),n(11,b[g]+=v,b)),n(10,v=0),x(!0),Ee(!0),Me("cheer",.1),y("Team "+s[g]+" wins the round!",4),n(7,f=!0)):t?n(10,v+=a):(n(12,w+=["☒"]),y("Strike!",1),w.length>=3&&(n(6,u=[!1,!1]),n(6,u[e.teamNumber]=!0,u),m=!0,g=e.teamNumber+1,g>1&&(g=0),y("Team "+s[g]+" can steal!",5)))}Me("theme",.1);return e.$set=e=>{"qas"in e&&n(0,o=e.qas),"teamNames"in e&&n(1,s=e.teamNames)},[o,s,r,a,i,c,u,f,d,$,v,b,w,function(){l=!0,n(4,i=!0),y("Face off! First team to call out their answer goes first.",4)},N,function(){g<0?n(5,c=!1):(n(6,u[g]=!0,u),g+=1,g>1&&(g=0),n(6,u[g]=!1,u),n(5,c=!1),y(`Team ${s[g]} now has the board.`,4))},function(e){if(r+1>=o.length){n(8,d=!0);let e=b[0]>b[1]?0:1;Ee(!0),Me("cheer",.1),y("Team "+s[e]+" wins the game!",6)}else x(!1),n(2,r+=1),Ee(!1),y("Face off!",3);n(7,f=!1),l=!0,m=!1,n(5,c=!1),n(6,u=[!1,!1]),g=-1,h="",n(10,v=0),n(12,w=[])},function(e){x(!1),n(2,r=0),n(4,i=!1),l=!1,n(6,u=[!1,!1]),m=!1,n(5,c=!1),n(7,f=!1),n(8,d=!1),g=-1,h="",n(10,v=0),n(11,b=[0,0]),n(12,w=[]),Me("theme",.1)},l,m,p,g,h,y,x,k,()=>n(3,a=!1),()=>{window.open("https://github.com/lettier/hacker-feud")},e=>{e.teamNumber=0,N(e)},e=>{e.teamNumber=1,N(e)}]}return new class extends I{constructor(e){super(),D(this,e,Te,qe,r,{qas:0,teamNames:1})}}({target:document.body,props:{teamNames:["Dunning–Kruger Effect","Impostor Syndrome"],qas:[{question:"Which programing language is dead?",answers:[{text:"Perl",money:17},{text:"PHP",money:11},{text:"Haskell",money:6},{text:"Lisp",money:4},{text:"Ruby",money:3},{text:"Elm",money:1}]},{question:"What is the most hated thing about programming?",answers:[{text:"Whiteboarding",money:17},{text:"Naming Things",money:11},{text:"Stand-ups",money:6},{text:"OBOE",money:4},{text:"Cache Invalidation",money:3},{text:"Jira",money:1}]},{question:"Name a flame war you've been in.",answers:[{text:"Tabs vs Spaces",money:17},{text:"OOP vs Functional",money:11},{text:"GNOME vs KDE",money:6},{text:"Vim vs Emacs",money:4},{text:"Chrome vs Firefox",money:3},{text:"NoSQL vs RDMS",money:1}]},{question:"Which language should you rewrite something in?",answers:[{text:"Rust",money:17},{text:"Go",money:11},{text:"JavaScript",money:6},{text:"Elm",money:4},{text:"Kotlin",money:3},{text:"Elixir",money:1}]}]}})}(); 2 | //# sourceMappingURL=bundle.js.map 3 | -------------------------------------------------------------------------------- /docs/build/bundle.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"bundle.js","sources":["../../node_modules/svelte/internal/index.mjs","../../src/Bank.svelte","../../src/Team.svelte","../../src/Question.svelte","../../src/Answer.svelte","../../src/Board.svelte","../../src/Guess.svelte","../../src/App.svelte","../../src/main.js"],"sourcesContent":["function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n // @ts-ignore\n for (const k in src)\n tar[k] = src[k];\n return tar;\n}\nfunction is_promise(value) {\n return value && typeof value === 'object' && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n element.__svelte_meta = {\n loc: { file, line, column, char }\n };\n}\nfunction run(fn) {\n return fn();\n}\nfunction blank_object() {\n return Object.create(null);\n}\nfunction run_all(fns) {\n fns.forEach(run);\n}\nfunction is_function(thing) {\n return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nfunction not_equal(a, b) {\n return a != a ? b == b : a !== b;\n}\nfunction validate_store(store, name) {\n if (store != null && typeof store.subscribe !== 'function') {\n throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n }\n}\nfunction subscribe(store, ...callbacks) {\n if (store == null) {\n return noop;\n }\n const unsub = store.subscribe(...callbacks);\n return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n let value;\n subscribe(store, _ => value = _)();\n return value;\n}\nfunction component_subscribe(component, store, callback) {\n component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n if (definition) {\n const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n return definition[0](slot_ctx);\n }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n return definition[1] && fn\n ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n if (definition[2] && fn) {\n const lets = definition[2](fn(dirty));\n if ($$scope.dirty === undefined) {\n return lets;\n }\n if (typeof lets === 'object') {\n const merged = [];\n const len = Math.max($$scope.dirty.length, lets.length);\n for (let i = 0; i < len; i += 1) {\n merged[i] = $$scope.dirty[i] | lets[i];\n }\n return merged;\n }\n return $$scope.dirty | lets;\n }\n return $$scope.dirty;\n}\nfunction exclude_internal_props(props) {\n const result = {};\n for (const k in props)\n if (k[0] !== '$')\n result[k] = props[k];\n return result;\n}\nfunction compute_rest_props(props, keys) {\n const rest = {};\n keys = new Set(keys);\n for (const k in props)\n if (!keys.has(k) && k[0] !== '$')\n rest[k] = props[k];\n return rest;\n}\nfunction once(fn) {\n let ran = false;\n return function (...args) {\n if (ran)\n return;\n ran = true;\n fn.call(this, ...args);\n };\n}\nfunction null_to_empty(value) {\n return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value = ret) {\n store.set(value);\n return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n ? () => window.performance.now()\n : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n now = fn;\n}\nfunction set_raf(fn) {\n raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n tasks.forEach(task => {\n if (!task.c(now)) {\n tasks.delete(task);\n task.f();\n }\n });\n if (tasks.size !== 0)\n raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n let task;\n if (tasks.size === 0)\n raf(run_tasks);\n return {\n promise: new Promise(fulfill => {\n tasks.add(task = { c: callback, f: fulfill });\n }),\n abort() {\n tasks.delete(task);\n }\n };\n}\n\nfunction append(target, node) {\n target.appendChild(node);\n}\nfunction insert(target, node, anchor) {\n target.insertBefore(node, anchor || null);\n}\nfunction detach(node) {\n node.parentNode.removeChild(node);\n}\nfunction destroy_each(iterations, detaching) {\n for (let i = 0; i < iterations.length; i += 1) {\n if (iterations[i])\n iterations[i].d(detaching);\n }\n}\nfunction element(name) {\n return document.createElement(name);\n}\nfunction element_is(name, is) {\n return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n const target = {};\n for (const k in obj) {\n if (has_prop(obj, k)\n // @ts-ignore\n && exclude.indexOf(k) === -1) {\n // @ts-ignore\n target[k] = obj[k];\n }\n }\n return target;\n}\nfunction svg_element(name) {\n return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n return document.createTextNode(data);\n}\nfunction space() {\n return text(' ');\n}\nfunction empty() {\n return text('');\n}\nfunction listen(node, event, handler, options) {\n node.addEventListener(event, handler, options);\n return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n return function (event) {\n event.preventDefault();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_propagation(fn) {\n return function (event) {\n event.stopPropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction self(fn) {\n return function (event) {\n // @ts-ignore\n if (event.target === this)\n fn.call(this, event);\n };\n}\nfunction attr(node, attribute, value) {\n if (value == null)\n node.removeAttribute(attribute);\n else if (node.getAttribute(attribute) !== value)\n node.setAttribute(attribute, value);\n}\nfunction set_attributes(node, attributes) {\n // @ts-ignore\n const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n for (const key in attributes) {\n if (attributes[key] == null) {\n node.removeAttribute(key);\n }\n else if (key === 'style') {\n node.style.cssText = attributes[key];\n }\n else if (key === '__value' || descriptors[key] && descriptors[key].set) {\n node[key] = attributes[key];\n }\n else {\n attr(node, key, attributes[key]);\n }\n }\n}\nfunction set_svg_attributes(node, attributes) {\n for (const key in attributes) {\n attr(node, key, attributes[key]);\n }\n}\nfunction set_custom_element_data(node, prop, value) {\n if (prop in node) {\n node[prop] = value;\n }\n else {\n attr(node, prop, value);\n }\n}\nfunction xlink_attr(node, attribute, value) {\n node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group) {\n const value = [];\n for (let i = 0; i < group.length; i += 1) {\n if (group[i].checked)\n value.push(group[i].__value);\n }\n return value;\n}\nfunction to_number(value) {\n return value === '' ? undefined : +value;\n}\nfunction time_ranges_to_array(ranges) {\n const array = [];\n for (let i = 0; i < ranges.length; i += 1) {\n array.push({ start: ranges.start(i), end: ranges.end(i) });\n }\n return array;\n}\nfunction children(element) {\n return Array.from(element.childNodes);\n}\nfunction claim_element(nodes, name, attributes, svg) {\n for (let i = 0; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeName === name) {\n let j = 0;\n while (j < node.attributes.length) {\n const attribute = node.attributes[j];\n if (attributes[attribute.name]) {\n j++;\n }\n else {\n node.removeAttribute(attribute.name);\n }\n }\n return nodes.splice(i, 1)[0];\n }\n }\n return svg ? svg_element(name) : element(name);\n}\nfunction claim_text(nodes, data) {\n for (let i = 0; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeType === 3) {\n node.data = '' + data;\n return nodes.splice(i, 1)[0];\n }\n }\n return text(data);\n}\nfunction claim_space(nodes) {\n return claim_text(nodes, ' ');\n}\nfunction set_data(text, data) {\n data = '' + data;\n if (text.data !== data)\n text.data = data;\n}\nfunction set_input_value(input, value) {\n if (value != null || input.value) {\n input.value = value;\n }\n}\nfunction set_input_type(input, type) {\n try {\n input.type = type;\n }\n catch (e) {\n // do nothing\n }\n}\nfunction set_style(node, key, value, important) {\n node.style.setProperty(key, value, important ? 'important' : '');\n}\nfunction select_option(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n if (option.__value === value) {\n option.selected = true;\n return;\n }\n }\n}\nfunction select_options(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n option.selected = ~value.indexOf(option.__value);\n }\n}\nfunction select_value(select) {\n const selected_option = select.querySelector(':checked') || select.options[0];\n return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n if (crossorigin === undefined) {\n crossorigin = false;\n try {\n if (typeof window !== 'undefined' && window.parent) {\n void window.parent.document;\n }\n }\n catch (error) {\n crossorigin = true;\n }\n }\n return crossorigin;\n}\nfunction add_resize_listener(node, fn) {\n const computed_style = getComputedStyle(node);\n const z_index = (parseInt(computed_style.zIndex) || 0) - 1;\n if (computed_style.position === 'static') {\n node.style.position = 'relative';\n }\n const iframe = element('iframe');\n iframe.setAttribute('style', `display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ` +\n `overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: ${z_index};`);\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n let unsubscribe;\n if (is_crossorigin()) {\n iframe.src = `data:text/html,`;\n unsubscribe = listen(window, 'message', (event) => {\n if (event.source === iframe.contentWindow)\n fn();\n });\n }\n else {\n iframe.src = 'about:blank';\n iframe.onload = () => {\n unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n };\n }\n append(node, iframe);\n return () => {\n detach(iframe);\n if (unsubscribe)\n unsubscribe();\n };\n}\nfunction toggle_class(element, name, toggle) {\n element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail) {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, false, false, detail);\n return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n return Array.from(parent.querySelectorAll(selector));\n}\nclass HtmlTag {\n constructor(html, anchor = null) {\n this.e = element('div');\n this.a = anchor;\n this.u(html);\n }\n m(target, anchor = null) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert(target, this.n[i], anchor);\n }\n this.t = target;\n }\n u(html) {\n this.e.innerHTML = html;\n this.n = Array.from(this.e.childNodes);\n }\n p(html) {\n this.d();\n this.u(html);\n this.m(this.t, this.a);\n }\n d() {\n this.n.forEach(detach);\n }\n}\n\nconst active_docs = new Set();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i--)\n hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n return hash >>> 0;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n const step = 16.666 / duration;\n let keyframes = '{\\n';\n for (let p = 0; p <= 1; p += step) {\n const t = a + (b - a) * ease(p);\n keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n }\n const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n const name = `__svelte_${hash(rule)}_${uid}`;\n const doc = node.ownerDocument;\n active_docs.add(doc);\n const stylesheet = doc.__svelte_stylesheet || (doc.__svelte_stylesheet = doc.head.appendChild(element('style')).sheet);\n const current_rules = doc.__svelte_rules || (doc.__svelte_rules = {});\n if (!current_rules[name]) {\n current_rules[name] = true;\n stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n }\n const animation = node.style.animation || '';\n node.style.animation = `${animation ? `${animation}, ` : ``}${name} ${duration}ms linear ${delay}ms 1 both`;\n active += 1;\n return name;\n}\nfunction delete_rule(node, name) {\n const previous = (node.style.animation || '').split(', ');\n const next = previous.filter(name\n ? anim => anim.indexOf(name) < 0 // remove specific animation\n : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n );\n const deleted = previous.length - next.length;\n if (deleted) {\n node.style.animation = next.join(', ');\n active -= deleted;\n if (!active)\n clear_rules();\n }\n}\nfunction clear_rules() {\n raf(() => {\n if (active)\n return;\n active_docs.forEach(doc => {\n const stylesheet = doc.__svelte_stylesheet;\n let i = stylesheet.cssRules.length;\n while (i--)\n stylesheet.deleteRule(i);\n doc.__svelte_rules = {};\n });\n active_docs.clear();\n });\n}\n\nfunction create_animation(node, from, fn, params) {\n if (!from)\n return noop;\n const to = node.getBoundingClientRect();\n if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n return noop;\n const { delay = 0, duration = 300, easing = identity, \n // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n start: start_time = now() + delay, \n // @ts-ignore todo:\n end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n let running = true;\n let started = false;\n let name;\n function start() {\n if (css) {\n name = create_rule(node, 0, 1, duration, delay, easing, css);\n }\n if (!delay) {\n started = true;\n }\n }\n function stop() {\n if (css)\n delete_rule(node, name);\n running = false;\n }\n loop(now => {\n if (!started && now >= start_time) {\n started = true;\n }\n if (started && now >= end) {\n tick(1, 0);\n stop();\n }\n if (!running) {\n return false;\n }\n if (started) {\n const p = now - start_time;\n const t = 0 + 1 * easing(p / duration);\n tick(t, 1 - t);\n }\n return true;\n });\n start();\n tick(0, 1);\n return stop;\n}\nfunction fix_position(node) {\n const style = getComputedStyle(node);\n if (style.position !== 'absolute' && style.position !== 'fixed') {\n const { width, height } = style;\n const a = node.getBoundingClientRect();\n node.style.position = 'absolute';\n node.style.width = width;\n node.style.height = height;\n add_transform(node, a);\n }\n}\nfunction add_transform(node, a) {\n const b = node.getBoundingClientRect();\n if (a.left !== b.left || a.top !== b.top) {\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n current_component = component;\n}\nfunction get_current_component() {\n if (!current_component)\n throw new Error(`Function called outside component initialization`);\n return current_component;\n}\nfunction beforeUpdate(fn) {\n get_current_component().$$.before_update.push(fn);\n}\nfunction onMount(fn) {\n get_current_component().$$.on_mount.push(fn);\n}\nfunction afterUpdate(fn) {\n get_current_component().$$.after_update.push(fn);\n}\nfunction onDestroy(fn) {\n get_current_component().$$.on_destroy.push(fn);\n}\nfunction createEventDispatcher() {\n const component = get_current_component();\n return (type, detail) => {\n const callbacks = component.$$.callbacks[type];\n if (callbacks) {\n // TODO are there situations where events could be dispatched\n // in a server (non-DOM) environment?\n const event = custom_event(type, detail);\n callbacks.slice().forEach(fn => {\n fn.call(component, event);\n });\n }\n };\n}\nfunction setContext(key, context) {\n get_current_component().$$.context.set(key, context);\n}\nfunction getContext(key) {\n return get_current_component().$$.context.get(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n const callbacks = component.$$.callbacks[event.type];\n if (callbacks) {\n callbacks.slice().forEach(fn => fn(event));\n }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nconst render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n if (!update_scheduled) {\n update_scheduled = true;\n resolved_promise.then(flush);\n }\n}\nfunction tick() {\n schedule_update();\n return resolved_promise;\n}\nfunction add_render_callback(fn) {\n render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n flush_callbacks.push(fn);\n}\nlet flushing = false;\nconst seen_callbacks = new Set();\nfunction flush() {\n if (flushing)\n return;\n flushing = true;\n do {\n // first, call beforeUpdate functions\n // and update components\n for (let i = 0; i < dirty_components.length; i += 1) {\n const component = dirty_components[i];\n set_current_component(component);\n update(component.$$);\n }\n dirty_components.length = 0;\n while (binding_callbacks.length)\n binding_callbacks.pop()();\n // then, once components are updated, call\n // afterUpdate functions. This may cause\n // subsequent updates...\n for (let i = 0; i < render_callbacks.length; i += 1) {\n const callback = render_callbacks[i];\n if (!seen_callbacks.has(callback)) {\n // ...so guard against infinite loops\n seen_callbacks.add(callback);\n callback();\n }\n }\n render_callbacks.length = 0;\n } while (dirty_components.length);\n while (flush_callbacks.length) {\n flush_callbacks.pop()();\n }\n update_scheduled = false;\n flushing = false;\n seen_callbacks.clear();\n}\nfunction update($$) {\n if ($$.fragment !== null) {\n $$.update();\n run_all($$.before_update);\n const dirty = $$.dirty;\n $$.dirty = [-1];\n $$.fragment && $$.fragment.p($$.ctx, dirty);\n $$.after_update.forEach(add_render_callback);\n }\n}\n\nlet promise;\nfunction wait() {\n if (!promise) {\n promise = Promise.resolve();\n promise.then(() => {\n promise = null;\n });\n }\n return promise;\n}\nfunction dispatch(node, direction, kind) {\n node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n outros = {\n r: 0,\n c: [],\n p: outros // parent group\n };\n}\nfunction check_outros() {\n if (!outros.r) {\n run_all(outros.c);\n }\n outros = outros.p;\n}\nfunction transition_in(block, local) {\n if (block && block.i) {\n outroing.delete(block);\n block.i(local);\n }\n}\nfunction transition_out(block, local, detach, callback) {\n if (block && block.o) {\n if (outroing.has(block))\n return;\n outroing.add(block);\n outros.c.push(() => {\n outroing.delete(block);\n if (callback) {\n if (detach)\n block.d(1);\n callback();\n }\n });\n block.o(local);\n }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n let config = fn(node, params);\n let running = false;\n let animation_name;\n let task;\n let uid = 0;\n function cleanup() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n tick(0, 1);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n if (task)\n task.abort();\n running = true;\n add_render_callback(() => dispatch(node, true, 'start'));\n task = loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(1, 0);\n dispatch(node, true, 'end');\n cleanup();\n return running = false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(t, 1 - t);\n }\n }\n return running;\n });\n }\n let started = false;\n return {\n start() {\n if (started)\n return;\n delete_rule(node);\n if (is_function(config)) {\n config = config();\n wait().then(go);\n }\n else {\n go();\n }\n },\n invalidate() {\n started = false;\n },\n end() {\n if (running) {\n cleanup();\n running = false;\n }\n }\n };\n}\nfunction create_out_transition(node, fn, params) {\n let config = fn(node, params);\n let running = true;\n let animation_name;\n const group = outros;\n group.r += 1;\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n add_render_callback(() => dispatch(node, false, 'start'));\n loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(0, 1);\n dispatch(node, false, 'end');\n if (!--group.r) {\n // this will result in `end()` being called,\n // so we don't need to clean up here\n run_all(group.c);\n }\n return false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(1 - t, t);\n }\n }\n return running;\n });\n }\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go();\n });\n }\n else {\n go();\n }\n return {\n end(reset) {\n if (reset && config.tick) {\n config.tick(1, 0);\n }\n if (running) {\n if (animation_name)\n delete_rule(node, animation_name);\n running = false;\n }\n }\n };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n let config = fn(node, params);\n let t = intro ? 0 : 1;\n let running_program = null;\n let pending_program = null;\n let animation_name = null;\n function clear_animation() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function init(program, duration) {\n const d = program.b - t;\n duration *= Math.abs(d);\n return {\n a: t,\n b: program.b,\n d,\n duration,\n start: program.start,\n end: program.start + duration,\n group: program.group\n };\n }\n function go(b) {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n const program = {\n start: now() + delay,\n b\n };\n if (!b) {\n // @ts-ignore todo: improve typings\n program.group = outros;\n outros.r += 1;\n }\n if (running_program) {\n pending_program = program;\n }\n else {\n // if this is an intro, and there's a delay, we need to do\n // an initial tick and/or apply CSS animation immediately\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, b, duration, delay, easing, css);\n }\n if (b)\n tick(0, 1);\n running_program = init(program, duration);\n add_render_callback(() => dispatch(node, b, 'start'));\n loop(now => {\n if (pending_program && now > pending_program.start) {\n running_program = init(pending_program, duration);\n pending_program = null;\n dispatch(node, running_program.b, 'start');\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n }\n }\n if (running_program) {\n if (now >= running_program.end) {\n tick(t = running_program.b, 1 - t);\n dispatch(node, running_program.b, 'end');\n if (!pending_program) {\n // we're done\n if (running_program.b) {\n // intro — we can tidy up immediately\n clear_animation();\n }\n else {\n // outro — needs to be coordinated\n if (!--running_program.group.r)\n run_all(running_program.group.c);\n }\n }\n running_program = null;\n }\n else if (now >= running_program.start) {\n const p = now - running_program.start;\n t = running_program.a + running_program.d * easing(p / running_program.duration);\n tick(t, 1 - t);\n }\n }\n return !!(running_program || pending_program);\n });\n }\n }\n return {\n run(b) {\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go(b);\n });\n }\n else {\n go(b);\n }\n },\n end() {\n clear_animation();\n running_program = pending_program = null;\n }\n };\n}\n\nfunction handle_promise(promise, info) {\n const token = info.token = {};\n function update(type, index, key, value) {\n if (info.token !== token)\n return;\n info.resolved = value;\n let child_ctx = info.ctx;\n if (key !== undefined) {\n child_ctx = child_ctx.slice();\n child_ctx[key] = value;\n }\n const block = type && (info.current = type)(child_ctx);\n let needs_flush = false;\n if (info.block) {\n if (info.blocks) {\n info.blocks.forEach((block, i) => {\n if (i !== index && block) {\n group_outros();\n transition_out(block, 1, 1, () => {\n info.blocks[i] = null;\n });\n check_outros();\n }\n });\n }\n else {\n info.block.d(1);\n }\n block.c();\n transition_in(block, 1);\n block.m(info.mount(), info.anchor);\n needs_flush = true;\n }\n info.block = block;\n if (info.blocks)\n info.blocks[index] = block;\n if (needs_flush) {\n flush();\n }\n }\n if (is_promise(promise)) {\n const current_component = get_current_component();\n promise.then(value => {\n set_current_component(current_component);\n update(info.then, 1, info.value, value);\n set_current_component(null);\n }, error => {\n set_current_component(current_component);\n update(info.catch, 2, info.error, error);\n set_current_component(null);\n });\n // if we previously had a then/catch block, destroy it\n if (info.current !== info.pending) {\n update(info.pending, 0);\n return true;\n }\n }\n else {\n if (info.current !== info.then) {\n update(info.then, 1, info.value, promise);\n return true;\n }\n info.resolved = promise;\n }\n}\n\nconst globals = (typeof window !== 'undefined'\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : global);\n\nfunction destroy_block(block, lookup) {\n block.d(1);\n lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n transition_out(block, 1, 1, () => {\n lookup.delete(block.key);\n });\n}\nfunction fix_and_destroy_block(block, lookup) {\n block.f();\n destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n block.f();\n outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n let o = old_blocks.length;\n let n = list.length;\n let i = o;\n const old_indexes = {};\n while (i--)\n old_indexes[old_blocks[i].key] = i;\n const new_blocks = [];\n const new_lookup = new Map();\n const deltas = new Map();\n i = n;\n while (i--) {\n const child_ctx = get_context(ctx, list, i);\n const key = get_key(child_ctx);\n let block = lookup.get(key);\n if (!block) {\n block = create_each_block(key, child_ctx);\n block.c();\n }\n else if (dynamic) {\n block.p(child_ctx, dirty);\n }\n new_lookup.set(key, new_blocks[i] = block);\n if (key in old_indexes)\n deltas.set(key, Math.abs(i - old_indexes[key]));\n }\n const will_move = new Set();\n const did_move = new Set();\n function insert(block) {\n transition_in(block, 1);\n block.m(node, next, lookup.has(block.key));\n lookup.set(block.key, block);\n next = block.first;\n n--;\n }\n while (o && n) {\n const new_block = new_blocks[n - 1];\n const old_block = old_blocks[o - 1];\n const new_key = new_block.key;\n const old_key = old_block.key;\n if (new_block === old_block) {\n // do nothing\n next = new_block.first;\n o--;\n n--;\n }\n else if (!new_lookup.has(old_key)) {\n // remove old block\n destroy(old_block, lookup);\n o--;\n }\n else if (!lookup.has(new_key) || will_move.has(new_key)) {\n insert(new_block);\n }\n else if (did_move.has(old_key)) {\n o--;\n }\n else if (deltas.get(new_key) > deltas.get(old_key)) {\n did_move.add(new_key);\n insert(new_block);\n }\n else {\n will_move.add(old_key);\n o--;\n }\n }\n while (o--) {\n const old_block = old_blocks[o];\n if (!new_lookup.has(old_block.key))\n destroy(old_block, lookup);\n }\n while (n)\n insert(new_blocks[n - 1]);\n return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n const keys = new Set();\n for (let i = 0; i < list.length; i++) {\n const key = get_key(get_context(ctx, list, i));\n if (keys.has(key)) {\n throw new Error(`Cannot have duplicate keys in a keyed each`);\n }\n keys.add(key);\n }\n}\n\nfunction get_spread_update(levels, updates) {\n const update = {};\n const to_null_out = {};\n const accounted_for = { $$scope: 1 };\n let i = levels.length;\n while (i--) {\n const o = levels[i];\n const n = updates[i];\n if (n) {\n for (const key in o) {\n if (!(key in n))\n to_null_out[key] = 1;\n }\n for (const key in n) {\n if (!accounted_for[key]) {\n update[key] = n[key];\n accounted_for[key] = 1;\n }\n }\n levels[i] = n;\n }\n else {\n for (const key in o) {\n accounted_for[key] = 1;\n }\n }\n }\n for (const key in to_null_out) {\n if (!(key in update))\n update[key] = undefined;\n }\n return update;\n}\nfunction get_spread_object(spread_props) {\n return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\n// source: https://html.spec.whatwg.org/multipage/indices.html\nconst boolean_attributes = new Set([\n 'allowfullscreen',\n 'allowpaymentrequest',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'ismap',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected'\n]);\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, classes_to_add) {\n const attributes = Object.assign({}, ...args);\n if (classes_to_add) {\n if (attributes.class == null) {\n attributes.class = classes_to_add;\n }\n else {\n attributes.class += ' ' + classes_to_add;\n }\n }\n let str = '';\n Object.keys(attributes).forEach(name => {\n if (invalid_attribute_name_character.test(name))\n return;\n const value = attributes[name];\n if (value === true)\n str += \" \" + name;\n else if (boolean_attributes.has(name.toLowerCase())) {\n if (value)\n str += \" \" + name;\n }\n else if (value != null) {\n str += ` ${name}=\"${String(value).replace(/\"/g, '"').replace(/'/g, ''')}\"`;\n }\n });\n return str;\n}\nconst escaped = {\n '\"': '"',\n \"'\": ''',\n '&': '&',\n '<': '<',\n '>': '>'\n};\nfunction escape(html) {\n return String(html).replace(/[\"'&<>]/g, match => escaped[match]);\n}\nfunction each(items, fn) {\n let str = '';\n for (let i = 0; i < items.length; i += 1) {\n str += fn(items[i], i);\n }\n return str;\n}\nconst missing_component = {\n $$render: () => ''\n};\nfunction validate_component(component, name) {\n if (!component || !component.$$render) {\n if (name === 'svelte:component')\n name += ' this={...}';\n throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules`);\n }\n return component;\n}\nfunction debug(file, line, column, values) {\n console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n console.log(values); // eslint-disable-line no-console\n return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n function $$render(result, props, bindings, slots) {\n const parent_component = current_component;\n const $$ = {\n on_destroy,\n context: new Map(parent_component ? parent_component.$$.context : []),\n // these will be immediately discarded\n on_mount: [],\n before_update: [],\n after_update: [],\n callbacks: blank_object()\n };\n set_current_component({ $$ });\n const html = fn(result, props, bindings, slots);\n set_current_component(parent_component);\n return html;\n }\n return {\n render: (props = {}, options = {}) => {\n on_destroy = [];\n const result = { title: '', head: '', css: new Set() };\n const html = $$render(result, props, {}, options);\n run_all(on_destroy);\n return {\n html,\n css: {\n code: Array.from(result.css).map(css => css.code).join('\\n'),\n map: null // TODO\n },\n head: result.title + result.head\n };\n },\n $$render\n };\n}\nfunction add_attribute(name, value, boolean) {\n if (value == null || (boolean && !value))\n return '';\n return ` ${name}${value === true ? '' : `=${typeof value === 'string' ? JSON.stringify(escape(value)) : `\"${value}\"`}`}`;\n}\nfunction add_classes(classes) {\n return classes ? ` class=\"${classes}\"` : ``;\n}\n\nfunction bind(component, name, callback) {\n const index = component.$$.props[name];\n if (index !== undefined) {\n component.$$.bound[index] = callback;\n callback(component.$$.ctx[index]);\n }\n}\nfunction create_component(block) {\n block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor) {\n const { fragment, on_mount, on_destroy, after_update } = component.$$;\n fragment && fragment.m(target, anchor);\n // onMount happens before the initial afterUpdate\n add_render_callback(() => {\n const new_on_destroy = on_mount.map(run).filter(is_function);\n if (on_destroy) {\n on_destroy.push(...new_on_destroy);\n }\n else {\n // Edge case - component was destroyed immediately,\n // most likely as a result of a binding initialising\n run_all(new_on_destroy);\n }\n component.$$.on_mount = [];\n });\n after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n const $$ = component.$$;\n if ($$.fragment !== null) {\n run_all($$.on_destroy);\n $$.fragment && $$.fragment.d(detaching);\n // TODO null out other refs, including component.$$ (but need to\n // preserve final state?)\n $$.on_destroy = $$.fragment = null;\n $$.ctx = [];\n }\n}\nfunction make_dirty(component, i) {\n if (component.$$.dirty[0] === -1) {\n dirty_components.push(component);\n schedule_update();\n component.$$.dirty.fill(0);\n }\n component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, dirty = [-1]) {\n const parent_component = current_component;\n set_current_component(component);\n const prop_values = options.props || {};\n const $$ = component.$$ = {\n fragment: null,\n ctx: null,\n // state\n props,\n update: noop,\n not_equal,\n bound: blank_object(),\n // lifecycle\n on_mount: [],\n on_destroy: [],\n before_update: [],\n after_update: [],\n context: new Map(parent_component ? parent_component.$$.context : []),\n // everything else\n callbacks: blank_object(),\n dirty\n };\n let ready = false;\n $$.ctx = instance\n ? instance(component, prop_values, (i, ret, ...rest) => {\n const value = rest.length ? rest[0] : ret;\n if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n if ($$.bound[i])\n $$.bound[i](value);\n if (ready)\n make_dirty(component, i);\n }\n return ret;\n })\n : [];\n $$.update();\n ready = true;\n run_all($$.before_update);\n // `false` as a special case of no DOM component\n $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n if (options.target) {\n if (options.hydrate) {\n const nodes = children(options.target);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.l(nodes);\n nodes.forEach(detach);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.c();\n }\n if (options.intro)\n transition_in(component.$$.fragment);\n mount_component(component, options.target, options.anchor);\n flush();\n }\n set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n SvelteElement = class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n connectedCallback() {\n // @ts-ignore todo: improve typings\n for (const key in this.$$.slotted) {\n // @ts-ignore todo: improve typings\n this.appendChild(this.$$.slotted[key]);\n }\n }\n attributeChangedCallback(attr, _oldValue, newValue) {\n this[attr] = newValue;\n }\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n // TODO should this delegate to addEventListener?\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set() {\n // overridden by instance, if it has props\n }\n };\n}\nclass SvelteComponent {\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set() {\n // overridden by instance, if it has props\n }\n}\n\nfunction dispatch_dev(type, detail) {\n document.dispatchEvent(custom_event(type, Object.assign({ version: '3.22.2' }, detail)));\n}\nfunction append_dev(target, node) {\n dispatch_dev(\"SvelteDOMInsert\", { target, node });\n append(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n dispatch_dev(\"SvelteDOMInsert\", { target, node, anchor });\n insert(target, node, anchor);\n}\nfunction detach_dev(node) {\n dispatch_dev(\"SvelteDOMRemove\", { node });\n detach(node);\n}\nfunction detach_between_dev(before, after) {\n while (before.nextSibling && before.nextSibling !== after) {\n detach_dev(before.nextSibling);\n }\n}\nfunction detach_before_dev(after) {\n while (after.previousSibling) {\n detach_dev(after.previousSibling);\n }\n}\nfunction detach_after_dev(before) {\n while (before.nextSibling) {\n detach_dev(before.nextSibling);\n }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) {\n const modifiers = options === true ? [\"capture\"] : options ? Array.from(Object.keys(options)) : [];\n if (has_prevent_default)\n modifiers.push('preventDefault');\n if (has_stop_propagation)\n modifiers.push('stopPropagation');\n dispatch_dev(\"SvelteDOMAddEventListener\", { node, event, handler, modifiers });\n const dispose = listen(node, event, handler, options);\n return () => {\n dispatch_dev(\"SvelteDOMRemoveEventListener\", { node, event, handler, modifiers });\n dispose();\n };\n}\nfunction attr_dev(node, attribute, value) {\n attr(node, attribute, value);\n if (value == null)\n dispatch_dev(\"SvelteDOMRemoveAttribute\", { node, attribute });\n else\n dispatch_dev(\"SvelteDOMSetAttribute\", { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n node[property] = value;\n dispatch_dev(\"SvelteDOMSetProperty\", { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n node.dataset[property] = value;\n dispatch_dev(\"SvelteDOMSetDataset\", { node, property, value });\n}\nfunction set_data_dev(text, data) {\n data = '' + data;\n if (text.data === data)\n return;\n dispatch_dev(\"SvelteDOMSetData\", { node: text, data });\n text.data = data;\n}\nfunction validate_each_argument(arg) {\n if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n let msg = '{#each} only iterates over array-like objects.';\n if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n msg += ' You can use a spread to convert this iterable into an array.';\n }\n throw new Error(msg);\n }\n}\nfunction validate_slots(name, slot, keys) {\n for (const slot_key of Object.keys(slot)) {\n if (!~keys.indexOf(slot_key)) {\n console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n }\n }\n}\nclass SvelteComponentDev extends SvelteComponent {\n constructor(options) {\n if (!options || (!options.target && !options.$$inline)) {\n throw new Error(`'target' is a required option`);\n }\n super();\n }\n $destroy() {\n super.$destroy();\n this.$destroy = () => {\n console.warn(`Component was already destroyed`); // eslint-disable-line no-console\n };\n }\n $capture_state() { }\n $inject_state() { }\n}\nfunction loop_guard(timeout) {\n const start = Date.now();\n return () => {\n if (Date.now() - start > timeout) {\n throw new Error(`Infinite loop detected`);\n }\n };\n}\n\nexport { HtmlTag, SvelteComponent, SvelteComponentDev, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_location, add_render_callback, add_resize_listener, add_transform, afterUpdate, append, append_dev, assign, attr, attr_dev, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_component, claim_element, claim_space, claim_text, clear_loops, component_subscribe, compute_rest_props, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, escape, escaped, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, getContext, get_binding_group_value, get_current_component, get_slot_changes, get_slot_context, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, has_prop, identity, init, insert, insert_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_function, is_promise, listen, listen_dev, loop, loop_guard, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_data, set_data_dev, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, spread, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, update_keyed_each, validate_component, validate_each_argument, validate_each_keys, validate_slots, validate_store, xlink_attr };\n","\n\n\n\n\n\n
\n
\n {money}\n
\n
\n","\n\n\n\n\n\n
\n {money}\n
\n","\n\n\n\n\n\n
\n

\n {question}\n

\n
\n","\n\n\n\n\n\n
\n {#if answer.show}\n
\n {answer.text}\n
\n
\n {answer.money}\n
\n {:else}\n
\n  \n
\n
\n  \n
\n {/if}\n
\n","\n\n\n\n\n\n
\n
\n
\n \n
\n
\n
\n \n
\n
\n \n
\n
\n {#each answers as answer}\n \n {/each}\n
\n
\n
\n {#each strikes as strike}\n
\n {strike}\n
\n {:else}\n
\n ☐\n
\n {/each}\n
\n
\n
\n
\n \n
\n
\n
\n","\n\n\n\n\n\n
\n
\n TEAM\n
\n
\n {#if !show || disable}\n show = true }\" disabled={ disable ? 'true' : '' }>\n \n {:else}\n { if (e.keyCode == 13) sendGuess(); } }\" autofocus>\n \n {/if}\n
\n
\n","\n\n\n\n\n\n{#if showMessage}\n
showMessage = false }\">\n
{message}
\n
\n{/if}\n
\n {#if !start}\n
\n \n \n \n
\n {:else}\n \n {#if end}\n
\n \n
\n {:else}\n {#if next}\n
\n \n
\n {:else}\n
\n { e.teamNumber = 0; handleGuess(e); } }\" disable={teamDisable[0]} teamName={teamNames[0]}/>\n { e.teamNumber = 1; handleGuess(e); } }\" disable={teamDisable[1]} teamName={teamNames[1]}/>\n
\n {#if showPass}\n \n {/if}\n {/if}\n {/if}\n {/if}\n
\n","/*\n (C) 2020 David Lettier\n lettier.com\n*/\n\nimport App from \"./App.svelte\";\n\nconst app = new App({\n\ttarget: document.body,\n\tprops: {\n teamNames: [\"Dunning–Kruger Effect\", \"Impostor Syndrome\"],\n qas: [\n {\n question: \"Which programing language is dead?\",\n answers: [\n {\n text: \"Perl\",\n money: 17\n },\n {\n text: \"PHP\",\n money: 11\n },\n {\n text: \"Haskell\",\n money: 6\n },\n {\n text: \"Lisp\",\n money: 4\n },\n {\n text: \"Ruby\",\n money: 3\n },\n {\n text: \"Elm\",\n money: 1\n }\n ]\n },\n {\n question: \"What is the most hated thing about programming?\",\n answers: [\n {\n text: \"Whiteboarding\",\n money: 17\n },\n {\n text: \"Naming Things\",\n money: 11\n },\n {\n text: \"Stand-ups\",\n money: 6\n },\n {\n text: \"OBOE\",\n money: 4\n },\n {\n text: \"Cache Invalidation\",\n money: 3\n },\n {\n text: \"Jira\",\n money: 1\n }\n ]\n },\n {\n question: \"Name a flame war you've been in.\",\n answers: [\n {\n text: \"Tabs vs Spaces\",\n money: 17\n },\n {\n text: \"OOP vs Functional\",\n money: 11\n },\n {\n text: \"GNOME vs KDE\",\n money: 6\n },\n {\n text: \"Vim vs Emacs\",\n money: 4\n },\n {\n text: \"Chrome vs Firefox\",\n money: 3\n },\n {\n text: \"NoSQL vs RDMS\",\n money: 1\n }\n ]\n },\n {\n question: \"Which language should you rewrite something in?\",\n answers: [\n {\n text: \"Rust\",\n money: 17\n },\n {\n text: \"Go\",\n money: 11\n },\n {\n text: \"JavaScript\",\n money: 6\n },\n {\n text: \"Elm\",\n money: 4\n },\n {\n text: \"Kotlin\",\n money: 3\n },\n {\n text: \"Elixir\",\n money: 1\n }\n ]\n }\n ]\n\t}\n});\n\nexport default app;\n"],"names":["noop","run","fn","blank_object","Object","create","run_all","fns","forEach","is_function","thing","safe_not_equal","a","b","append","target","node","appendChild","insert","anchor","insertBefore","detach","parentNode","removeChild","destroy_each","iterations","detaching","i","length","d","element","name","document","createElement","text","data","createTextNode","space","empty","listen","event","handler","options","addEventListener","removeEventListener","attr","attribute","value","removeAttribute","getAttribute","setAttribute","set_data","set_input_value","input","set_style","key","important","style","setProperty","current_component","set_current_component","component","createEventDispatcher","Error","get_current_component","type","detail","callbacks","$$","e","createEvent","initCustomEvent","custom_event","slice","call","dirty_components","binding_callbacks","render_callbacks","flush_callbacks","resolved_promise","Promise","resolve","update_scheduled","add_render_callback","push","flushing","seen_callbacks","Set","flush","update","pop","callback","has","add","clear","fragment","before_update","dirty","p","ctx","after_update","outroing","outros","group_outros","r","c","check_outros","transition_in","block","local","delete","transition_out","o","create_component","mount_component","on_mount","on_destroy","m","new_on_destroy","map","filter","destroy_component","make_dirty","then","fill","init","instance","create_fragment","not_equal","props","parent_component","prop_values","bound","context","Map","ready","ret","rest","hydrate","nodes","Array","from","childNodes","children","l","intro","SvelteComponent","[object Object]","this","$destroy","index","indexOf","splice","money","question","show","answer","qa","bankMoney","teamMoney","strikes","answers","dispatch","disable","teamName","guess","sendGuess","String","trim","keyCode","playSound","volume","sound","Audio","play","setAnimation","on","el","getElementById","classList","remove","qas","teamNames","qaIndex","showMessage","start","faceOff","showPass","teamDisable","steal","next","end","messageTimeout","currentTeam","message","displayMessage","seconds","clearTimeout","setTimeout","setAnswerVisibility","allShown","shown","handleGuess","match","toLowerCase","teamNumber","winningTeam","window","open","body"],"mappings":"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"} -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lettier/hacker-feud/e51c870f1b391ec043b832c85a5c2e92a777df25/docs/favicon.ico -------------------------------------------------------------------------------- /docs/global.css: -------------------------------------------------------------------------------- 1 | /* 2 | (C) 2020 David Lettier 3 | lettier.com 4 | */ 5 | 6 | html, body { 7 | position: relative; 8 | width: 100%; 9 | height: 100%; 10 | } 11 | 12 | body { 13 | background-color: floralwhite; 14 | color: #333; 15 | margin: 0; 16 | padding: 8px; 17 | box-sizing: border-box; 18 | font-family: 'Love Ya Like A Sister', sans-serif; 19 | } 20 | 21 | a { 22 | color: rgb(0,100,200); 23 | text-decoration: none; 24 | } 25 | 26 | a:hover { 27 | text-decoration: underline; 28 | } 29 | 30 | a:visited { 31 | color: rgb(0,80,160); 32 | } 33 | 34 | label { 35 | display: block; 36 | } 37 | 38 | input, button, select, textarea { 39 | font-family: inherit; 40 | font-size: inherit; 41 | padding: 0.4em; 42 | margin: 0 0 0.5em 0; 43 | box-sizing: border-box; 44 | border: 0px solid #ccc; 45 | border-radius: 10px; 46 | outline: none; 47 | } 48 | 49 | input { 50 | width: 65%; 51 | background-color: bisque; 52 | color: coral; 53 | font-size: 1.5vw; 54 | } 55 | 56 | input:disabled { 57 | background-color: #aaa; 58 | color: #eee; 59 | } 60 | 61 | input[type="range"] { 62 | height: 0; 63 | } 64 | 65 | button { 66 | cursor: pointer; 67 | color: ghostwhite; 68 | font-size: 1.5vw; 69 | background-color: lightcoral; 70 | outline: none; 71 | } 72 | 73 | button:disabled { 74 | cursor: not-allowed; 75 | background-color: lightgrey; 76 | color: #999; 77 | } 78 | 79 | button:not(:disabled):hover { 80 | background-color: #ff8181; 81 | } 82 | 83 | button:not(:disabled):active > span { 84 | position: relative; 85 | top: 5px; 86 | } 87 | 88 | button:focus { 89 | border-color: #666; 90 | } 91 | 92 | @keyframes logo-border-keyframes { 93 | 0% { border-color: bisque; border-width: 20px; } 94 | 50% { border-color: white; border-width: 25px; } 95 | 100% { border-color: bisque; border-width: 20px; } 96 | } 97 | 98 | .logo-border-animation { 99 | animation-name: logo-border-keyframes; 100 | animation-duration: 1s; 101 | animation-iteration-count: infinite; 102 | } 103 | 104 | @keyframes button-keyframes { 105 | from { margin-left: 20px; } 106 | to { margin-left: 25px; } 107 | } 108 | 109 | .button-animation { 110 | animation-name: button-keyframes; 111 | animation-duration: 1s; 112 | animation-iteration-count: infinite; 113 | } 114 | 115 | @keyframes answer-keyframes { 116 | from { transform: rotateX(180deg); backface-visibility: hidden; -webkit-backface-visibility: hidden; } 117 | to { transform: rotateX(0deg); backface-visibility: hidden; -webkit-backface-visibility: hidden; } 118 | } 119 | 120 | .answer-animation { 121 | animation-name: answer-keyframes; 122 | animation-duration: 1s; 123 | animation-iteration-count: 1; 124 | } 125 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Hacker Feud 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /docs/sounds/buzzer.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lettier/hacker-feud/e51c870f1b391ec043b832c85a5c2e92a777df25/docs/sounds/buzzer.ogg -------------------------------------------------------------------------------- /docs/sounds/cheer.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lettier/hacker-feud/e51c870f1b391ec043b832c85a5c2e92a777df25/docs/sounds/cheer.ogg -------------------------------------------------------------------------------- /docs/sounds/ding.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lettier/hacker-feud/e51c870f1b391ec043b832c85a5c2e92a777df25/docs/sounds/ding.ogg -------------------------------------------------------------------------------- /docs/sounds/theme.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lettier/hacker-feud/e51c870f1b391ec043b832c85a5c2e92a777df25/docs/sounds/theme.ogg -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hacker-feud", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.8.3", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", 10 | "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.8.3" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.9.5", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", 19 | "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.9.0", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", 25 | "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.9.0", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | } 32 | }, 33 | "@polka/url": { 34 | "version": "0.5.0", 35 | "resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz", 36 | "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==" 37 | }, 38 | "@rollup/plugin-commonjs": { 39 | "version": "11.0.2", 40 | "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.0.2.tgz", 41 | "integrity": "sha512-MPYGZr0qdbV5zZj8/2AuomVpnRVXRU5XKXb3HVniwRoRCreGlf5kOE081isNWeiLIi6IYkwTX9zE0/c7V8g81g==", 42 | "dev": true, 43 | "requires": { 44 | "@rollup/pluginutils": "^3.0.0", 45 | "estree-walker": "^1.0.1", 46 | "is-reference": "^1.1.2", 47 | "magic-string": "^0.25.2", 48 | "resolve": "^1.11.0" 49 | } 50 | }, 51 | "@rollup/plugin-node-resolve": { 52 | "version": "7.1.3", 53 | "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", 54 | "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", 55 | "dev": true, 56 | "requires": { 57 | "@rollup/pluginutils": "^3.0.8", 58 | "@types/resolve": "0.0.8", 59 | "builtin-modules": "^3.1.0", 60 | "is-module": "^1.0.0", 61 | "resolve": "^1.14.2" 62 | } 63 | }, 64 | "@rollup/pluginutils": { 65 | "version": "3.0.10", 66 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.10.tgz", 67 | "integrity": "sha512-d44M7t+PjmMrASHbhgpSbVgtL6EFyX7J4mYxwQ/c5eoaE6N2VgCgEcWVzNnwycIloti+/MpwFr8qfw+nRw00sw==", 68 | "dev": true, 69 | "requires": { 70 | "@types/estree": "0.0.39", 71 | "estree-walker": "^1.0.1", 72 | "picomatch": "^2.2.2" 73 | } 74 | }, 75 | "@types/estree": { 76 | "version": "0.0.39", 77 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", 78 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", 79 | "dev": true 80 | }, 81 | "@types/node": { 82 | "version": "14.0.1", 83 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.1.tgz", 84 | "integrity": "sha512-FAYBGwC+W6F9+huFIDtn43cpy7+SzG+atzRiTfdp3inUKL2hXnd4rG8hylJLIh4+hqrQy1P17kvJByE/z825hA==", 85 | "dev": true 86 | }, 87 | "@types/resolve": { 88 | "version": "0.0.8", 89 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", 90 | "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", 91 | "dev": true, 92 | "requires": { 93 | "@types/node": "*" 94 | } 95 | }, 96 | "acorn": { 97 | "version": "7.2.0", 98 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", 99 | "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", 100 | "dev": true 101 | }, 102 | "ansi-styles": { 103 | "version": "3.2.1", 104 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 105 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 106 | "dev": true, 107 | "requires": { 108 | "color-convert": "^1.9.0" 109 | } 110 | }, 111 | "anymatch": { 112 | "version": "3.1.1", 113 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 114 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 115 | "dev": true, 116 | "requires": { 117 | "normalize-path": "^3.0.0", 118 | "picomatch": "^2.0.4" 119 | } 120 | }, 121 | "async-limiter": { 122 | "version": "1.0.1", 123 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", 124 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", 125 | "dev": true 126 | }, 127 | "binary-extensions": { 128 | "version": "2.0.0", 129 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", 130 | "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", 131 | "dev": true 132 | }, 133 | "braces": { 134 | "version": "3.0.2", 135 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 136 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 137 | "dev": true, 138 | "requires": { 139 | "fill-range": "^7.0.1" 140 | } 141 | }, 142 | "buffer-from": { 143 | "version": "1.1.1", 144 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 145 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 146 | "dev": true 147 | }, 148 | "builtin-modules": { 149 | "version": "3.1.0", 150 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", 151 | "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", 152 | "dev": true 153 | }, 154 | "chalk": { 155 | "version": "2.4.2", 156 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 157 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 158 | "dev": true, 159 | "requires": { 160 | "ansi-styles": "^3.2.1", 161 | "escape-string-regexp": "^1.0.5", 162 | "supports-color": "^5.3.0" 163 | } 164 | }, 165 | "chokidar": { 166 | "version": "3.4.0", 167 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", 168 | "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", 169 | "dev": true, 170 | "requires": { 171 | "anymatch": "~3.1.1", 172 | "braces": "~3.0.2", 173 | "fsevents": "~2.1.2", 174 | "glob-parent": "~5.1.0", 175 | "is-binary-path": "~2.1.0", 176 | "is-glob": "~4.0.1", 177 | "normalize-path": "~3.0.0", 178 | "readdirp": "~3.4.0" 179 | } 180 | }, 181 | "color-convert": { 182 | "version": "1.9.3", 183 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 184 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 185 | "dev": true, 186 | "requires": { 187 | "color-name": "1.1.3" 188 | } 189 | }, 190 | "color-name": { 191 | "version": "1.1.3", 192 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 193 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 194 | "dev": true 195 | }, 196 | "commander": { 197 | "version": "2.20.3", 198 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 199 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 200 | "dev": true 201 | }, 202 | "console-clear": { 203 | "version": "1.1.1", 204 | "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", 205 | "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==" 206 | }, 207 | "escape-string-regexp": { 208 | "version": "1.0.5", 209 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 210 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 211 | "dev": true 212 | }, 213 | "estree-walker": { 214 | "version": "1.0.1", 215 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", 216 | "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", 217 | "dev": true 218 | }, 219 | "fill-range": { 220 | "version": "7.0.1", 221 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 222 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 223 | "dev": true, 224 | "requires": { 225 | "to-regex-range": "^5.0.1" 226 | } 227 | }, 228 | "fsevents": { 229 | "version": "2.1.3", 230 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", 231 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", 232 | "dev": true, 233 | "optional": true 234 | }, 235 | "get-port": { 236 | "version": "3.2.0", 237 | "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", 238 | "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" 239 | }, 240 | "glob-parent": { 241 | "version": "5.1.1", 242 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 243 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 244 | "dev": true, 245 | "requires": { 246 | "is-glob": "^4.0.1" 247 | } 248 | }, 249 | "has-flag": { 250 | "version": "3.0.0", 251 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 252 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 253 | "dev": true 254 | }, 255 | "is-binary-path": { 256 | "version": "2.1.0", 257 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 258 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 259 | "dev": true, 260 | "requires": { 261 | "binary-extensions": "^2.0.0" 262 | } 263 | }, 264 | "is-extglob": { 265 | "version": "2.1.1", 266 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 267 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 268 | "dev": true 269 | }, 270 | "is-glob": { 271 | "version": "4.0.1", 272 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 273 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 274 | "dev": true, 275 | "requires": { 276 | "is-extglob": "^2.1.1" 277 | } 278 | }, 279 | "is-module": { 280 | "version": "1.0.0", 281 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 282 | "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", 283 | "dev": true 284 | }, 285 | "is-number": { 286 | "version": "7.0.0", 287 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 288 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 289 | "dev": true 290 | }, 291 | "is-reference": { 292 | "version": "1.1.4", 293 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", 294 | "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==", 295 | "dev": true, 296 | "requires": { 297 | "@types/estree": "0.0.39" 298 | } 299 | }, 300 | "jest-worker": { 301 | "version": "24.9.0", 302 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", 303 | "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", 304 | "dev": true, 305 | "requires": { 306 | "merge-stream": "^2.0.0", 307 | "supports-color": "^6.1.0" 308 | }, 309 | "dependencies": { 310 | "supports-color": { 311 | "version": "6.1.0", 312 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", 313 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", 314 | "dev": true, 315 | "requires": { 316 | "has-flag": "^3.0.0" 317 | } 318 | } 319 | } 320 | }, 321 | "js-tokens": { 322 | "version": "4.0.0", 323 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 324 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 325 | "dev": true 326 | }, 327 | "kleur": { 328 | "version": "3.0.3", 329 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", 330 | "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" 331 | }, 332 | "livereload": { 333 | "version": "0.9.1", 334 | "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.1.tgz", 335 | "integrity": "sha512-9g7sua11kkyZNo2hLRCG3LuZZwqexoyEyecSlV8cAsfAVVCZqLzVir6XDqmH0r+Vzgnd5LrdHDMyjtFnJQLAYw==", 336 | "dev": true, 337 | "requires": { 338 | "chokidar": "^3.3.0", 339 | "livereload-js": "^3.1.0", 340 | "opts": ">= 1.2.0", 341 | "ws": "^6.2.1" 342 | } 343 | }, 344 | "livereload-js": { 345 | "version": "3.2.2", 346 | "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.2.2.tgz", 347 | "integrity": "sha512-xhScbNeC687ZINjEf/bD+BMiPx4s4q0mehcLb3zCc8+mykOtmaBR4vqzyIV9rIGdG9JjHaT0LiFdscvivCjX1Q==", 348 | "dev": true 349 | }, 350 | "local-access": { 351 | "version": "1.0.1", 352 | "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.0.1.tgz", 353 | "integrity": "sha512-ykt2pgN0aqIy6KQC1CqdWTWkmUwNgaOS6dcpHVjyBJONA+Xi7AtSB1vuxC/U/0tjIP3wcRudwQk1YYzUvzk2bA==" 354 | }, 355 | "magic-string": { 356 | "version": "0.25.7", 357 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", 358 | "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", 359 | "dev": true, 360 | "requires": { 361 | "sourcemap-codec": "^1.4.4" 362 | } 363 | }, 364 | "merge-stream": { 365 | "version": "2.0.0", 366 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 367 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 368 | "dev": true 369 | }, 370 | "mime": { 371 | "version": "2.4.5", 372 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", 373 | "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==" 374 | }, 375 | "mri": { 376 | "version": "1.1.5", 377 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.5.tgz", 378 | "integrity": "sha512-d2RKzMD4JNyHMbnbWnznPaa8vbdlq/4pNZ3IgdaGrVbBhebBsGUUE/6qorTMYNS6TwuH3ilfOlD2bf4Igh8CKg==" 379 | }, 380 | "normalize-path": { 381 | "version": "3.0.0", 382 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 383 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 384 | "dev": true 385 | }, 386 | "opts": { 387 | "version": "1.2.7", 388 | "resolved": "https://registry.npmjs.org/opts/-/opts-1.2.7.tgz", 389 | "integrity": "sha512-hwZhzGGG/GQ7igxAVFOEun2N4fWul31qE9nfBdCnZGQCB5+L7tN9xZ+94B4aUpLOJx/of3zZs5XsuubayQYQjA==", 390 | "dev": true 391 | }, 392 | "path-parse": { 393 | "version": "1.0.6", 394 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 395 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 396 | "dev": true 397 | }, 398 | "picomatch": { 399 | "version": "2.2.2", 400 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 401 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 402 | "dev": true 403 | }, 404 | "readdirp": { 405 | "version": "3.4.0", 406 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", 407 | "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", 408 | "dev": true, 409 | "requires": { 410 | "picomatch": "^2.2.1" 411 | } 412 | }, 413 | "require-relative": { 414 | "version": "0.8.7", 415 | "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", 416 | "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", 417 | "dev": true 418 | }, 419 | "resolve": { 420 | "version": "1.17.0", 421 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 422 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 423 | "dev": true, 424 | "requires": { 425 | "path-parse": "^1.0.6" 426 | } 427 | }, 428 | "rollup": { 429 | "version": "1.32.1", 430 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", 431 | "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", 432 | "dev": true, 433 | "requires": { 434 | "@types/estree": "*", 435 | "@types/node": "*", 436 | "acorn": "^7.1.0" 437 | } 438 | }, 439 | "rollup-plugin-livereload": { 440 | "version": "1.3.0", 441 | "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-1.3.0.tgz", 442 | "integrity": "sha512-abyqXaB21+nFHo+vJULBqfzNx6zXABC19UyvqgDfdoxR/8pFAd041GO+GIUe8ZYC2DbuMUmioh1Lvbk14YLZgw==", 443 | "dev": true, 444 | "requires": { 445 | "livereload": "^0.9.1" 446 | } 447 | }, 448 | "rollup-plugin-svelte": { 449 | "version": "5.2.1", 450 | "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-5.2.1.tgz", 451 | "integrity": "sha512-wc93cN66sRpX6uFljVFqvWT6NU3V5ab/uLXKt2UiARuexFU/ctolzkmdXM7WM5iKdTX9scToS9sabJTJV4DUMA==", 452 | "dev": true, 453 | "requires": { 454 | "require-relative": "^0.8.7", 455 | "rollup-pluginutils": "^2.8.2", 456 | "sourcemap-codec": "^1.4.8" 457 | } 458 | }, 459 | "rollup-plugin-terser": { 460 | "version": "5.3.0", 461 | "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.0.tgz", 462 | "integrity": "sha512-XGMJihTIO3eIBsVGq7jiNYOdDMb3pVxuzY0uhOE/FM4x/u9nQgr3+McsjzqBn3QfHIpNSZmFnpoKAwHBEcsT7g==", 463 | "dev": true, 464 | "requires": { 465 | "@babel/code-frame": "^7.5.5", 466 | "jest-worker": "^24.9.0", 467 | "rollup-pluginutils": "^2.8.2", 468 | "serialize-javascript": "^2.1.2", 469 | "terser": "^4.6.2" 470 | } 471 | }, 472 | "rollup-pluginutils": { 473 | "version": "2.8.2", 474 | "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", 475 | "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", 476 | "dev": true, 477 | "requires": { 478 | "estree-walker": "^0.6.1" 479 | }, 480 | "dependencies": { 481 | "estree-walker": { 482 | "version": "0.6.1", 483 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", 484 | "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", 485 | "dev": true 486 | } 487 | } 488 | }, 489 | "sade": { 490 | "version": "1.7.3", 491 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.3.tgz", 492 | "integrity": "sha512-m4BctppMvJ60W1dXnHq7jMmFe3hPJZDAH85kQ3ACTo7XZNVUuTItCQ+2HfyaMeV5cKrbw7l4vD/6We3GBxvdJw==", 493 | "requires": { 494 | "mri": "^1.1.0" 495 | } 496 | }, 497 | "serialize-javascript": { 498 | "version": "2.1.2", 499 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", 500 | "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", 501 | "dev": true 502 | }, 503 | "sirv": { 504 | "version": "0.4.2", 505 | "resolved": "https://registry.npmjs.org/sirv/-/sirv-0.4.2.tgz", 506 | "integrity": "sha512-dQbZnsMaIiTQPZmbGmktz+c74zt/hyrJEB4tdp2Jj0RNv9J6B/OWR5RyrZEvIn9fyh9Zlg2OlE2XzKz6wMKGAw==", 507 | "requires": { 508 | "@polka/url": "^0.5.0", 509 | "mime": "^2.3.1" 510 | } 511 | }, 512 | "sirv-cli": { 513 | "version": "0.4.5", 514 | "resolved": "https://registry.npmjs.org/sirv-cli/-/sirv-cli-0.4.5.tgz", 515 | "integrity": "sha512-Fl6icSm0EwPrXSGid2xphMp//WNTSX2yENRAGnJuuZNmdc8LvE/BtdZD3MPn28ifAfDqTMwbB3dpcZojAIOiBg==", 516 | "requires": { 517 | "console-clear": "^1.1.0", 518 | "get-port": "^3.2.0", 519 | "kleur": "^3.0.0", 520 | "local-access": "^1.0.1", 521 | "sade": "^1.4.0", 522 | "sirv": "^0.4.2", 523 | "tinydate": "^1.0.0" 524 | } 525 | }, 526 | "source-map": { 527 | "version": "0.6.1", 528 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 529 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 530 | "dev": true 531 | }, 532 | "source-map-support": { 533 | "version": "0.5.19", 534 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 535 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 536 | "dev": true, 537 | "requires": { 538 | "buffer-from": "^1.0.0", 539 | "source-map": "^0.6.0" 540 | } 541 | }, 542 | "sourcemap-codec": { 543 | "version": "1.4.8", 544 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 545 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 546 | "dev": true 547 | }, 548 | "supports-color": { 549 | "version": "5.5.0", 550 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 551 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 552 | "dev": true, 553 | "requires": { 554 | "has-flag": "^3.0.0" 555 | } 556 | }, 557 | "svelte": { 558 | "version": "3.22.2", 559 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.22.2.tgz", 560 | "integrity": "sha512-DxumO0+vvHA6NSc2jtVty08I8lFI43q8P2zX6JxZL8J1kqK5NVjad6TRM/twhnWXC+QScnwkZ15O6X1aTsEKTA==", 561 | "dev": true 562 | }, 563 | "terser": { 564 | "version": "4.6.13", 565 | "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.13.tgz", 566 | "integrity": "sha512-wMvqukYgVpQlymbnNbabVZbtM6PN63AzqexpwJL8tbh/mRT9LE5o+ruVduAGL7D6Fpjl+Q+06U5I9Ul82odAhw==", 567 | "dev": true, 568 | "requires": { 569 | "commander": "^2.20.0", 570 | "source-map": "~0.6.1", 571 | "source-map-support": "~0.5.12" 572 | } 573 | }, 574 | "tinydate": { 575 | "version": "1.2.0", 576 | "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.2.0.tgz", 577 | "integrity": "sha512-3GwPk8VhDFnUZ2TrgkhXJs6hcMAIIw4x/xkz+ayK6dGoQmp2nUwKzBXK0WnMsqkh6vfUhpqQicQF3rbshfyJkg==" 578 | }, 579 | "to-regex-range": { 580 | "version": "5.0.1", 581 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 582 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 583 | "dev": true, 584 | "requires": { 585 | "is-number": "^7.0.0" 586 | } 587 | }, 588 | "ws": { 589 | "version": "6.2.1", 590 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", 591 | "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", 592 | "dev": true, 593 | "requires": { 594 | "async-limiter": "~1.0.0" 595 | } 596 | } 597 | } 598 | } 599 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hacker-feud", 3 | "author": "David Lettier", 4 | "private": true, 5 | "version": "1.0.0", 6 | "scripts": { 7 | "build": "rollup -c", 8 | "dev": "rollup -c -w", 9 | "start": "sirv public -p 55555" 10 | }, 11 | "devDependencies": { 12 | "@rollup/plugin-commonjs": "11.0.2", 13 | "@rollup/plugin-node-resolve": "^7.0.0", 14 | "rollup": "^1.20.0", 15 | "rollup-plugin-livereload": "^1.0.0", 16 | "rollup-plugin-svelte": "^5.0.3", 17 | "rollup-plugin-terser": "^5.1.2", 18 | "svelte": "^3.0.0" 19 | }, 20 | "dependencies": { 21 | "sirv-cli": "^0.4.4" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lettier/hacker-feud/e51c870f1b391ec043b832c85a5c2e92a777df25/public/favicon.ico -------------------------------------------------------------------------------- /public/global.css: -------------------------------------------------------------------------------- 1 | /* 2 | (C) 2020 David Lettier 3 | lettier.com 4 | */ 5 | 6 | html, body { 7 | position: relative; 8 | width: 100%; 9 | height: 100%; 10 | } 11 | 12 | body { 13 | background-color: floralwhite; 14 | color: #333; 15 | margin: 0; 16 | padding: 8px; 17 | box-sizing: border-box; 18 | font-family: 'Love Ya Like A Sister', sans-serif; 19 | } 20 | 21 | a { 22 | color: rgb(0,100,200); 23 | text-decoration: none; 24 | } 25 | 26 | a:hover { 27 | text-decoration: underline; 28 | } 29 | 30 | a:visited { 31 | color: rgb(0,80,160); 32 | } 33 | 34 | label { 35 | display: block; 36 | } 37 | 38 | input, button, select, textarea { 39 | font-family: inherit; 40 | font-size: inherit; 41 | padding: 0.4em; 42 | margin: 0 0 0.5em 0; 43 | box-sizing: border-box; 44 | border: 0px solid #ccc; 45 | border-radius: 10px; 46 | outline: none; 47 | } 48 | 49 | input { 50 | width: 65%; 51 | background-color: bisque; 52 | color: coral; 53 | font-size: 1.5vw; 54 | } 55 | 56 | input:disabled { 57 | background-color: #aaa; 58 | color: #eee; 59 | } 60 | 61 | input[type="range"] { 62 | height: 0; 63 | } 64 | 65 | button { 66 | cursor: pointer; 67 | color: ghostwhite; 68 | font-size: 1.5vw; 69 | background-color: lightcoral; 70 | outline: none; 71 | } 72 | 73 | button:disabled { 74 | cursor: not-allowed; 75 | background-color: lightgrey; 76 | color: #999; 77 | } 78 | 79 | button:not(:disabled):hover { 80 | background-color: #ff8181; 81 | } 82 | 83 | button:not(:disabled):active > span { 84 | position: relative; 85 | top: 5px; 86 | } 87 | 88 | button:focus { 89 | border-color: #666; 90 | } 91 | 92 | @keyframes logo-border-keyframes { 93 | 0% { border-color: bisque; border-width: 20px; } 94 | 50% { border-color: white; border-width: 25px; } 95 | 100% { border-color: bisque; border-width: 20px; } 96 | } 97 | 98 | .logo-border-animation { 99 | animation-name: logo-border-keyframes; 100 | animation-duration: 1s; 101 | animation-iteration-count: infinite; 102 | } 103 | 104 | @keyframes button-keyframes { 105 | from { margin-left: 20px; } 106 | to { margin-left: 25px; } 107 | } 108 | 109 | .button-animation { 110 | animation-name: button-keyframes; 111 | animation-duration: 1s; 112 | animation-iteration-count: infinite; 113 | } 114 | 115 | @keyframes answer-keyframes { 116 | from { transform: rotateX(180deg); backface-visibility: hidden; -webkit-backface-visibility: hidden; } 117 | to { transform: rotateX(0deg); backface-visibility: hidden; -webkit-backface-visibility: hidden; } 118 | } 119 | 120 | .answer-animation { 121 | animation-name: answer-keyframes; 122 | animation-duration: 1s; 123 | animation-iteration-count: 1; 124 | } 125 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Hacker Feud 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /public/sounds/buzzer.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lettier/hacker-feud/e51c870f1b391ec043b832c85a5c2e92a777df25/public/sounds/buzzer.ogg -------------------------------------------------------------------------------- /public/sounds/cheer.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lettier/hacker-feud/e51c870f1b391ec043b832c85a5c2e92a777df25/public/sounds/cheer.ogg -------------------------------------------------------------------------------- /public/sounds/ding.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lettier/hacker-feud/e51c870f1b391ec043b832c85a5c2e92a777df25/public/sounds/ding.ogg -------------------------------------------------------------------------------- /public/sounds/theme.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lettier/hacker-feud/e51c870f1b391ec043b832c85a5c2e92a777df25/public/sounds/theme.ogg -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import svelte from 'rollup-plugin-svelte'; 2 | import resolve from '@rollup/plugin-node-resolve'; 3 | import commonjs from '@rollup/plugin-commonjs'; 4 | import livereload from 'rollup-plugin-livereload'; 5 | import { terser } from 'rollup-plugin-terser'; 6 | 7 | const production = !process.env.ROLLUP_WATCH; 8 | 9 | export default { 10 | input: 'src/main.js', 11 | output: { 12 | sourcemap: true, 13 | format: 'iife', 14 | name: 'app', 15 | file: 'public/build/bundle.js' 16 | }, 17 | plugins: [ 18 | svelte({ 19 | // enable run-time checks when not in production 20 | dev: !production, 21 | // we'll extract any component CSS out into 22 | // a separate file - better for performance 23 | css: css => { 24 | css.write('public/build/bundle.css'); 25 | } 26 | }), 27 | 28 | // If you have external dependencies installed from 29 | // npm, you'll most likely need these plugins. In 30 | // some cases you'll need additional configuration - 31 | // consult the documentation for details: 32 | // https://github.com/rollup/plugins/tree/master/packages/commonjs 33 | resolve({ 34 | browser: true, 35 | dedupe: ['svelte'] 36 | }), 37 | commonjs(), 38 | 39 | // In dev mode, call `npm run start` once 40 | // the bundle has been generated 41 | !production && serve(), 42 | 43 | // Watch the `public` directory and refresh the 44 | // browser on changes when not in production 45 | !production && livereload('public'), 46 | 47 | // If we're building for production (npm run build 48 | // instead of npm run dev), minify 49 | production && terser() 50 | ], 51 | watch: { 52 | clearScreen: false 53 | } 54 | }; 55 | 56 | function serve() { 57 | let started = false; 58 | 59 | return { 60 | writeBundle() { 61 | if (!started) { 62 | started = true; 63 | 64 | require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], { 65 | stdio: ['ignore', 'inherit', 'inherit'], 66 | shell: true 67 | }); 68 | } 69 | } 70 | }; 71 | } 72 | -------------------------------------------------------------------------------- /src/Answer.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 9 | 10 | 29 | 30 |
31 | {#if answer.show} 32 |
33 | {answer.text} 34 |
35 |
36 | {answer.money} 37 |
38 | {:else} 39 |
40 |   41 |
42 |
43 |   44 |
45 | {/if} 46 |
47 | -------------------------------------------------------------------------------- /src/App.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 262 | 263 | 326 | 327 | {#if showMessage} 328 |
329 |
{message}
330 |
331 | {/if} 332 |
333 | {#if !start} 334 |
335 | 340 | 343 | 346 |
347 | {:else} 348 | 349 | {#if end} 350 |
351 | 352 |
353 | {:else} 354 | {#if next} 355 |
356 | 357 |
358 | {:else} 359 |
360 | 361 | 362 |
363 | {#if showPass} 364 | 365 | {/if} 366 | {/if} 367 | {/if} 368 | {/if} 369 |
370 | -------------------------------------------------------------------------------- /src/Bank.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 9 | 10 | 25 | 26 |
27 |
28 | {money} 29 |
30 |
31 | -------------------------------------------------------------------------------- /src/Board.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 19 | 20 | 83 | 84 |
85 |
86 |
87 | 88 |
89 |
90 |
91 | 92 |
93 |
94 | 95 |
96 |
97 | {#each answers as answer} 98 | 99 | {/each} 100 |
101 |
102 |
103 | {#each strikes as strike} 104 |
105 | {strike} 106 |
107 | {:else} 108 |
109 | ☐ 110 |
111 | {/each} 112 |
113 |
114 |
115 |
116 | 117 |
118 |
119 |
120 | -------------------------------------------------------------------------------- /src/Guess.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 26 | 27 | 51 | 52 |
53 |
54 | TEAM 55 |
56 |
57 | {#if !show || disable} 58 | 60 | 62 | {:else} 63 | 64 | 65 | {/if} 66 |
67 |
68 | -------------------------------------------------------------------------------- /src/Question.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 9 | 10 | 23 | 24 |
25 |

26 | {question} 27 |

28 |
29 | -------------------------------------------------------------------------------- /src/Team.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 9 | 10 | 21 | 22 |
23 | {money} 24 |
25 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | /* 2 | (C) 2020 David Lettier 3 | lettier.com 4 | */ 5 | 6 | import App from "./App.svelte"; 7 | 8 | const app = new App({ 9 | target: document.body, 10 | props: { 11 | teamNames: ["Dunning–Kruger Effect", "Impostor Syndrome"], 12 | qas: [ 13 | { 14 | question: "Which programing language is dead?", 15 | answers: [ 16 | { 17 | text: "Perl", 18 | money: 17 19 | }, 20 | { 21 | text: "PHP", 22 | money: 11 23 | }, 24 | { 25 | text: "Haskell", 26 | money: 6 27 | }, 28 | { 29 | text: "Lisp", 30 | money: 4 31 | }, 32 | { 33 | text: "Ruby", 34 | money: 3 35 | }, 36 | { 37 | text: "Elm", 38 | money: 1 39 | } 40 | ] 41 | }, 42 | { 43 | question: "What is the most hated thing about programming?", 44 | answers: [ 45 | { 46 | text: "Whiteboarding", 47 | money: 17 48 | }, 49 | { 50 | text: "Naming Things", 51 | money: 11 52 | }, 53 | { 54 | text: "Stand-ups", 55 | money: 6 56 | }, 57 | { 58 | text: "OBOE", 59 | money: 4 60 | }, 61 | { 62 | text: "Cache Invalidation", 63 | money: 3 64 | }, 65 | { 66 | text: "Jira", 67 | money: 1 68 | } 69 | ] 70 | }, 71 | { 72 | question: "Name a flame war you've been in.", 73 | answers: [ 74 | { 75 | text: "Tabs vs Spaces", 76 | money: 17 77 | }, 78 | { 79 | text: "OOP vs Functional", 80 | money: 11 81 | }, 82 | { 83 | text: "GNOME vs KDE", 84 | money: 6 85 | }, 86 | { 87 | text: "Vim vs Emacs", 88 | money: 4 89 | }, 90 | { 91 | text: "Chrome vs Firefox", 92 | money: 3 93 | }, 94 | { 95 | text: "NoSQL vs RDMS", 96 | money: 1 97 | } 98 | ] 99 | }, 100 | { 101 | question: "Which language should you rewrite something in?", 102 | answers: [ 103 | { 104 | text: "Rust", 105 | money: 17 106 | }, 107 | { 108 | text: "Go", 109 | money: 11 110 | }, 111 | { 112 | text: "JavaScript", 113 | money: 6 114 | }, 115 | { 116 | text: "Elm", 117 | money: 4 118 | }, 119 | { 120 | text: "Kotlin", 121 | money: 3 122 | }, 123 | { 124 | text: "Elixir", 125 | money: 1 126 | } 127 | ] 128 | } 129 | ] 130 | } 131 | }); 132 | 133 | export default app; 134 | --------------------------------------------------------------------------------