i.map(l=>t.pts.indexOf(l))).flat():s=[...Array(e-2).keys()].map(i=>[0,i+1,i+2]).flat(),It(r,t.indices??s,t.fixed,t.uv?t.tex:d.gfx.defTex,t.shader,t.uniform??void 0,t.blend??0)}t.outline&&fs({pts:[...t.pts,t.pts[0]],radius:t.radius,width:t.outline.width,color:t.outline.color,join:t.outline.join,uniform:t.uniform,fixed:t.fixed,opacity:t.opacity??t.outline.opacity}),ze()}}o(qt,"drawPolygon");function ds(t){if(t.radiusX===void 0||t.radiusY===void 0)throw new Error('drawEllipse() requires properties "radiusX" and "radiusY".');if(t.radiusX===0||t.radiusY===0)return;let e=t.start??0,n=t.end??360,r=an(t.anchor??"center").scale(new q(-t.radiusX,-t.radiusY)),s=mn(r,t.radiusX,t.radiusY,e,n,t.resolution);s.unshift(r);let i=Object.assign({},t,{pts:s,radius:0,...t.gradient?{colors:[t.gradient[0],...Array(s.length-1).fill(t.gradient[1])]}:{}});if(n-e>=360&&t.outline){t.fill!==!1&&qt(Object.assign({},i,{outline:null})),qt(Object.assign({},i,{pts:s.slice(1),fill:!1}));return}qt(i)}o(ds,"drawEllipse");function on(t){if(typeof t.radius!="number")throw new Error('drawCircle() requires property "radius".');t.radius!==0&&ds(Object.assign({},t,{radiusX:t.radius,radiusY:t.radius,angle:0}))}o(on,"drawCircle");function yn(t){let{p1:e,p2:n}=t;if(!e||!n)throw new Error('drawLine() requires properties "p1" and "p2".');let r=t.width||1,s=n.sub(e).unit().normal().scale(r*.5),i=t.color??se.WHITE,l=t.opacity??1,c={pos:[e.x-s.x,e.y-s.y,e.x+s.x,e.y+s.y,n.x+s.x,n.y+s.y,n.x-s.x,n.y-s.y],uv:[0,0,0,0,0,0,0,0],color:[i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b],opacity:[l,l,l,l]};It(c,[0,1,3,1,2,3],t.fixed,d.gfx.defTex,t.shader,t.uniform??void 0)}o(yn,"drawLine");function Bu(t){let e=t.pts,n=[],r=(t.width||1)*.5,s=e[0]===e[e.length-1]||e[0].eq(e[e.length-1]),i=t.pos||P(0,0),l;s?l=e[0].sub(e[e.length-2]):l=e[1].sub(e[0]);let c=l.len(),h=l.normal().scale(-r/c),u,g=e[0];if(!s)switch(t.cap){case"square":{let p=l.scale(-r/c);n.push(g.add(p).add(h)),n.push(g.add(p).sub(h));break}case"round":{let p=Math.max(r,10),T=Math.PI/p,f=h.scale(-1),w=Math.cos(T),S=Math.sin(T);for(let C=0;C0?(n.push(u.add(I)),n.push(u.sub(h)),n.push(u.add(I)),n.push(u.sub(w))):(n.push(u.add(h)),n.push(u.sub(I)),n.push(u.add(w)),n.push(u.sub(I))),l=T,c=f,h=w}if(!s)switch(n.push(g.add(h)),n.push(g.sub(h)),t.cap){case"square":{let p=l.scale(r/c);n.push(g.add(p).add(h)),n.push(g.add(p).sub(h));break}case"round":{let p=Math.max(r,10),T=Math.PI/p,f=h.scale(1),w=Math.cos(T),S=Math.sin(T);for(let C=0;C
0){let k=u.add(I),x=Math.max(r,10),v=ye(h.angleBetween(w)/x),M=h,R=Math.cos(v),L=Math.sin(v);for(let D=0;D({pos:i.add(p),uv:P(),color:t.color||se.WHITE,opacity:t.opacity??1}));let y=[],m=0;for(let p=0;p({pos:i.add(p),uv:P(),color:t.color||se.WHITE,opacity:t.opacity??1}));let y=[],m=0;for(let p=0;p2)switch(t.join){case"bevel":return Bu(t);case"round":return Ru(t);case"miter":return Fu(t)}if(t.radius&&e.length>=3){yn(Object.assign({},t,{p1:e[0],p2:e[1]}));for(let r=1;rts(t.pt1,t.pt2,t.pt3,t.pt4,e),t)}o(Ou,"drawBezier");function zt(t){if(t.width===void 0||t.height===void 0)throw new Error('drawUVQuad() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,n=t.height,r=an(t.anchor||ns),s=r.x*e*-.5,i=r.y*n*-.5,l=t.quad||new xe(0,0,1,1),c=t.color||se.WHITE,h=t.opacity??1,u=t.tex?.1/t.tex.width:0,g=t.tex?.1/t.tex.height:0,y=l.x+u,m=l.y+g,E=l.w-u*2,p=l.h-g*2;We(),$e(t.pos),rn(t.angle),Jn(t.scale),st(s,i),It({pos:[-e/2,n/2,-e/2,-n/2,e/2,-n/2,e/2,n/2],uv:[t.flipX?y+E:y,t.flipY?m:m+p,t.flipX?y+E:y,t.flipY?m+p:m,t.flipX?y:y+E,t.flipY?m+p:m,t.flipX?y:y+E,t.flipY?m:m+p],color:[c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b],opacity:[h,h,h,h]},[0,1,3,1,2,3],t.fixed,t.tex,t.shader,t.uniform??void 0,t.blend??0),ze()}o(zt,"drawUVQuad");function Lu(t){let e=t.canvas.fb;zt(Object.assign({},t,{tex:e.tex,width:t.width||e.width,height:t.height||e.height}))}o(Lu,"drawCanvas");var ms={};function Ns(t,e){if(e.override){Object.assign(t,e);return}e.pos&&(t.pos=t.pos.add(e.pos)),e.scale&&(t.scale=t.scale.scale(P(e.scale))),e.angle&&(t.angle+=e.angle),e.color&&t.ch.length===1&&(t.color=t.color.mult(e.color)),e.opacity!=null&&(t.opacity*=e.opacity)}o(Ns,"applyCharTransform");function Kr(t){let e={},n="",r=[],s=String(t),i=o(l=>{r.length>0&&(e[n.length]=r.slice()),n+=l},"emit");for(;s!=="";){if(s[0]==="\\"){if(s.length===1)throw new Error("Styled text error: \\ at end of string");i(s[1]),s=s.slice(2);continue}if(s[0]==="["){let l=/^\[(\/)?(\w+?)\]/.exec(s);if(!l){i(s[0]),s=s.slice(1);continue}let[c,h,u]=l;if(h!==void 0){let g=r.pop();if(g!==u)throw g!==void 0?new Error(`Styled text error: mismatched tags. Expected [/${g}], got [/${u}]`):new Error(`Styled text error: stray end tag [/${u}]`)}else r.push(u);s=s.slice(c.length);continue}i(s[0]),s=s.slice(1)}if(r.length>0)throw new Error(`Styled text error: unclosed tags ${r}`);return{charStyleMap:e,text:n}}o(Kr,"compileStyledText");function Vt(t){var C,I,k;if(t.text===void 0)throw new Error('formatText() requires property "text".');let e=pi(t.font);if(!t.text||t.text===""||e instanceof ut||!e)return{width:0,height:0,chars:[],opt:t,renderedText:""};let{charStyleMap:n,text:r}=Kr(t.text+""),s=vo(r);if(e instanceof Fr||typeof e=="string"){let x=e instanceof Fr?e.fontface.family:e,v=e instanceof Fr?{outline:e.outline,filter:e.filter}:{outline:null,filter:Ms},M=ms[x]??{font:{tex:new Ct(d.gfx.ggl,2048,2048,{filter:v.filter}),map:{},size:64},cursor:new q(0),maxHeight:0,outline:v.outline};ms[x]||(ms[x]=M),e=M.font;for(let R of s)if(!M.font.map[R]){let L=d.fontCacheC2d;if(!L)throw new Error("fontCacheC2d is not defined.");if(!d.fontCacheCanvas)throw new Error("fontCacheCanvas is not defined.");L.clearRect(0,0,d.fontCacheCanvas.width,d.fontCacheCanvas.height),L.font=`${e.size}px ${x}`,L.textBaseline="top",L.textAlign="left",L.fillStyle="#ffffff";let D=L.measureText(R),O=Math.ceil(D.width);if(!O)continue;let z=Math.ceil(Math.abs(D.actualBoundingBoxAscent))+Math.ceil(Math.abs(D.actualBoundingBoxDescent));M.outline&&M.outline.width&&M.outline.color&&(L.lineJoin="round",L.lineWidth=M.outline.width*2,L.strokeStyle=M.outline.color.toHex(),L.strokeText(R,M.outline.width,M.outline.width),O+=M.outline.width*2,z+=M.outline.width*3),L.fillText(R,((C=M.outline)==null?void 0:C.width)??0,((I=M.outline)==null?void 0:I.width)??0);let te=L.getImageData(0,0,O,z);if(M.cursor.x+O>2048&&(M.cursor.x=0,M.cursor.y+=M.maxHeight,M.maxHeight=0,M.cursor.y>2048))throw new Error("Font atlas exceeds character limit");e.tex.update(te,M.cursor.x,M.cursor.y),e.map[R]=new xe(M.cursor.x,M.cursor.y,O,z),M.cursor.x+=O+1,M.maxHeight=Math.max(M.maxHeight,z)}}let i=t.size||e.size,l=P(t.scale??1).scale(i/e.size),c=t.lineSpacing??0,h=t.letterSpacing??0,u=0,g=0,y=0,m=[],E=[],p=0,T=null,f=0,w;for(;pt.width&&(y+=i+c,T!=null&&(p-=E.length-T,x=s[p],v=e.map[x],M=v.w*l.x,E=E.slice(0,T-1),u=f),T=null,f=0,m.push({width:u-h,chars:E}),u=w??0,E=[]),E.push({tex:e.tex,width:v.w,height:v.h,quad:new xe(v.x/e.tex.width,v.y/e.tex.height,v.w/e.tex.width,v.h/e.tex.height),ch:x,pos:new q(u,y),opacity:t.opacity??1,color:t.color??se.WHITE,scale:P(l),angle:0}),x===" "&&(T=E.length,f=u),t.indentAll&&w===void 0&&/\S/.test(x)&&(w=u),u+=M,g=Math.max(g,u),u+=h}}p++}m.push({width:u-h,chars:E}),y+=i,t.width&&(g=t.width);let S=[];for(let x=0;x{zt({tex:e.tex,width:e.width,height:e.height,pos:e.pos,scale:e.scale,angle:e.angle,color:e.color,opacity:e.opacity,quad:e.quad,anchor:"center",uniform:t.opt.uniform,shader:t.opt.shader,fixed:t.opt.fixed})}),ze()}o(Gt,"drawFormattedText");function Ve(t){if(t.width===void 0||t.height===void 0)throw new Error('drawRect() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,n=t.height,r=an(t.anchor||ns).add(1,1).scale(new q(e,n).scale(-.5)),s=[new q(0,0),new q(e,0),new q(e,n),new q(0,n)];if(t.radius){let i=Math.min(e,n)/2,l=Array.isArray(t.radius)?t.radius.map(c=>Math.min(i,c)):new Array(4).fill(Math.min(i,t.radius));s=[new q(l[0],0),...l[1]?mn(new q(e-l[1],l[1]),l[1],l[1],270,360):[P(e,0)],...l[2]?mn(new q(e-l[2],n-l[2]),l[2],l[2],0,90):[P(e,n)],...l[3]?mn(new q(l[3],n-l[3]),l[3],l[3],90,180):[P(0,n)],...l[0]?mn(new q(l[0],l[0]),l[0],l[0],180,270):[]]}qt(Object.assign({},t,{offset:r,pts:s,...t.gradient?{colors:t.horizontal?[t.gradient[0],t.gradient[1],t.gradient[1],t.gradient[0]]:[t.gradient[0],t.gradient[0],t.gradient[1],t.gradient[1]]}:{}}))}o(Ve,"drawRect");function Pt(t){Ye();let e=d.gfx.width,n=d.gfx.height;d.gfx.width=d.gfx.viewport.width,d.gfx.height=d.gfx.viewport.height,t(),Ye(),d.gfx.width=e,d.gfx.height=n}o(Pt,"drawUnscaled");function Us(t,e){Pt(()=>{let n=P(8);We(),$e(t);let r=Vt({text:e,font:Dr,size:16,pos:n,color:ue(255,255,255),fixed:!0}),s=r.width+n.x*2,i=r.height+n.x*2;t.x+s>=Ee()&&$e(P(-s,0)),t.y+i>=Pe()&&$e(P(0,-i)),Ve({width:s,height:i,color:ue(0,0,0),radius:4,opacity:.8,fixed:!0}),Gt(r),ze()})}o(Us,"drawInspectText");function Yi(t){if(!t.p1||!t.p2||!t.p3)throw new Error('drawTriangle() requires properties "p1", "p2" and "p3".');return qt(Object.assign({},t,{pts:[t.p1,t.p2,t.p3]}))}o(Yi,"drawTriangle");function Du(){if(d.debug.inspect){let t=null;for(let e of d.game.root.get("*",{recursive:!0}))if(e.c("area")&&(!d.globalOpt.inspectOnlyActive||!e.paused)&&e.isHovering()){t=e;break}if(d.game.root.drawInspect(),t){let e=[],n=t.inspect();for(let r in n)n[r]?e.push(n[r]):e.push(r);e.push(...t.tags.map(r=>`tag: ${r}`)),Us(ku(cs()),e.join(`
+`))}Us(P(8),`FPS: ${d.debug.fps()}`)}d.debug.paused&&Pt(()=>{We(),st(Ee(),0),st(-8,8);let t=32;Ve({width:t,height:t,anchor:"topright",color:ue(0,0,0),opacity:.8,radius:4,fixed:!0});for(let e=1;e<=2;e++)Ve({width:4,height:t*.6,anchor:"center",pos:P(-t/3*e,t*.5),color:ue(255,255,255),radius:2,fixed:!0});ze()}),d.debug.timeScale!==1&&Pt(()=>{We(),st(Ee(),Pe()),st(-8,-8);let t=8,e=Vt({text:d.debug.timeScale.toFixed(1),font:Dr,size:16,color:ue(255,255,255),pos:P(-t),anchor:"botright",fixed:!0});Ve({width:e.width+t*2+t*4,height:e.height+t*2,anchor:"botright",color:ue(0,0,0),opacity:.8,radius:4,fixed:!0});for(let n=0;n<2;n++){let r=d.debug.timeScale<1;Yi({p1:P(-e.width-t*(r?2:3.5),-t),p2:P(-e.width-t*(r?2:3.5),-t-e.height),p3:P(-e.width-t*(r?3.5:2),-t-e.height/2),pos:P(-n*t*1+(r?-t*.5:0),0),color:ue(255,255,255),fixed:!0})}Gt(e),ze()}),d.debug.curRecording&&Pt(()=>{We(),st(0,Pe()),st(24,-24),on({radius:12,color:ue(255,0,0),opacity:Ks(0,1,d.app.time()*4),fixed:!0}),ze()}),d.debug.showLog&&d.game.logs.length>0&&Pt(()=>{We(),st(0,Pe()),st(8,-8);let t=8,e=[];for(let r of d.game.logs){let s="",i=r.msg instanceof Error?"error":"info";s+=`[time]${r.time.toFixed(2)}[/time]`,s+=" ",s+=`[${i}]${Wr(r.msg)}[/${i}]`,e.push(s)}d.game.logs=d.game.logs.filter(r=>d.app.time()-r.time<(d.globalOpt.logTime||4));let n=Vt({text:e.join(`
+`),font:Dr,pos:P(t,-t),anchor:"botleft",size:16,width:Ee()*.6,lineSpacing:t/2,fixed:!0,styles:{time:{color:ue(127,127,127)},info:{color:ue(255,255,255)},error:{color:ue(255,0,127)}}});Ve({width:n.width+t*2,height:n.height+t*2,anchor:"botleft",color:ue(0,0,0),radius:4,opacity:.8,fixed:!0}),Gt(n),ze()})}o(Du,"drawDebug");function Wr(t,e=!1,n=new Set){if(n.has(t))return"";var r="",s;return e&&typeof t=="string"&&(t=JSON.stringify(t)),Array.isArray(t)&&(r=["[",t.map(i=>Wr(i,!0,n.union(new Set([t])))).join(", "),"]"].join(""),t=r),t===null?"null":(typeof t=="object"&&t.toString===Object.prototype.toString&&(t.constructor!==Object&&(r+=t.constructor.name+" "),r+=["{",(s=Object.getOwnPropertyNames(t).map(i=>`${/^\w+$/.test(i)?i:JSON.stringify(i)}: ${Wr(t[i],!0,n.union(new Set([t])))}`).join(", "))?` ${s} `:"","}"].join(""),t=r),String(t).replaceAll(new RegExp("(?0?d.game.events.trigger("loading",t):Pt(()=>{let e=Ee()/2,n=24,r=P(Ee()/2,Pe()/2).sub(P(e/2,n/2));Ve({pos:P(0),width:Ee(),height:Pe(),color:ue(0,0,0)}),Ve({pos:r,width:e,height:n,fill:!1,outline:{width:4}}),Ve({pos:r,width:e*t,height:n})})}o(Uu,"drawLoadScreen");function Xi(t,e,n){let r=d.gfx.ggl.gl;Ye(),r.clear(r.STENCIL_BUFFER_BIT),r.enable(r.STENCIL_TEST),r.stencilFunc(r.NEVER,1,255),r.stencilOp(r.REPLACE,r.REPLACE,r.REPLACE),e(),Ye(),r.stencilFunc(n,1,255),r.stencilOp(r.KEEP,r.KEEP,r.KEEP),t(),Ye(),r.disable(r.STENCIL_TEST)}o(Xi,"drawStenciled");function ju(t,e){let n=d.gfx.ggl.gl;Xi(t,e,n.EQUAL)}o(ju,"drawMasked");function cr(t){var i,l;if(!t.tex)throw new Error('drawTexture() requires property "tex".');let e=t.quad??new xe(0,0,1,1),n=t.tex.width*e.w,r=t.tex.height*e.h,s=q.ONE;if(t.tiled){let c=an(t.anchor||ns),h=(((i=t.pos)==null?void 0:i.x)||0)-(c.x+1)*.5*(t.width||n),u=(((l=t.pos)==null?void 0:l.y)||0)-(c.y+1)*.5*(t.height||r),g=(t.width||n)/n,y=(t.height||r)/r,m=Math.floor(g),E=Math.floor(y),p=g-m,T=y-E,f=(m+p?1:0)*(E+T?1:0),w=new Array(f*6),S={pos:new Array(f*4*2),uv:new Array(f*4*2),color:new Array(f*4*3),opacity:new Array(f*4)},C=0,I=t.color||se.WHITE,k=t.opacity||1,x=o((v,M,R,L,D)=>{w[C*6+0]=C*4+0,w[C*6+1]=C*4+1,w[C*6+2]=C*4+3,w[C*6+3]=C*4+1,w[C*6+4]=C*4+2,w[C*6+5]=C*4+3;let O=C*4;S.pos[O*2]=v+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y,S.color[O*3]=I.r,S.color[O*3+1]=I.g,S.color[O*3+2]=I.b,S.opacity[O]=k,O++,S.pos[O*2]=v+R+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y,S.color[O*3]=I.r,S.color[O*3+1]=I.g,S.color[O*3+2]=I.b,S.opacity[O]=k,O++,S.pos[O*2]=v+R+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=I.r,S.color[O*3+1]=I.g,S.color[O*3+2]=I.b,S.opacity[O]=k,O++,S.pos[O*2]=v+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=I.r,S.color[O*3+1]=I.g,S.color[O*3+2]=I.b,S.opacity[O]=k,C++},"addQuad");for(let v=0;v{let n=ls(e,ks,Ps),r=t.pixelDensity??1,s=t.scale??1,{gl:i}=e,l=Ct.fromImage(e,new ImageData(new Uint8ClampedArray([255,255,255,255]),1,1)),c=t.width&&t.height?new Hr(e,t.width*r*s,t.height*r*s):new Hr(e,i.drawingBufferWidth,i.drawingBufferHeight),h=null,u=1;t.background&&(typeof t.background=="string"?h=ue(t.background):(h=ue(...t.background),u=t.background[3]??1),i.clearColor(h.r/255,h.g/255,h.b/255,u??1)),i.enable(i.BLEND),i.blendFuncSeparate(i.ONE,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);let g=new gc(e,ai,lh,uh),y=Ct.fromImage(e,new ImageData(new Uint8ClampedArray([128,128,128,255,190,190,190,255,190,190,190,255,128,128,128,255]),2,2),{wrap:"repeat",filter:"nearest"}),m=new Array(32).fill(0).map(E=>new tn);return{lastDrawCalls:0,ggl:e,defShader:n,defTex:l,frameBuffer:c,postShader:null,postShaderUniform:null,renderer:g,transform:new tn,transformStack:m,transformStackIndex:-1,bgTex:y,bgColor:h,bgAlpha:u,width:t.width??i.drawingBufferWidth/r/s,height:t.height??i.drawingBufferHeight/r/s,viewport:{x:0,y:0,width:i.drawingBufferWidth,height:i.drawingBufferHeight},fixed:!1}},"initAppGfx");function Ji(){let t=d.pixelDensity,e=d.gfx.ggl.gl.drawingBufferWidth/t,n=d.gfx.ggl.gl.drawingBufferHeight/t;if(d.globalOpt.letterbox){if(!d.globalOpt.width||!d.globalOpt.height)throw new Error("Letterboxing requires width and height defined.");let r=e/n,s=d.globalOpt.width/d.globalOpt.height;if(r>s){let i=n*s,l=(e-i)/2;d.gfx.viewport={x:l,y:0,width:i,height:n}}else{let i=e/s,l=(n-i)/2;d.gfx.viewport={x:0,y:l,width:e,height:i}}return}if(d.globalOpt.stretch&&(!d.globalOpt.width||!d.globalOpt.height))throw new Error("Stretching requires width and height defined.");d.gfx.viewport={x:0,y:0,width:e,height:n}}o(Ji,"updateViewport");var da=o((t,e,n)=>{let r=d.systems,s=r.findIndex(l=>l.name===t);if(s!=-1){let l=r[s].when;for(let c of l){let h=d.systemsByEvent[c].findIndex(u=>u.name===t);d.systemsByEvent[c].splice(h,1)}}let i={name:t,run:e,when:n};for(let l of n)d.systemsByEvent[l].push(i);r.push({name:t,run:e,when:n})},"system"),yc="data:image/png;base64,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",wc="data:image/png;base64,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",xc="4000.0.0",d={k:null,globalOpt:null,gfx:null,game:null,app:null,assets:null,fontCacheCanvas:null,fontCacheC2d:null,debug:null,audio:null,pixelDensity:null,canvas:null,gscale:null,kaSprite:null,boomSprite:null,handleErr:null,systems:[],systemsByEvent:[[],[],[],[],[],[]]},fa=!1,Ac=o((t={})=>{d.k&&(console.warn("KAPLAY already initialized, you are calling kaplay() multiple times, it may lead bugs!"),d.k.quit()),d.globalOpt=t;let e=t.root??document.body;e===document.body&&(document.body.style.width="100%",document.body.style.height="100%",document.body.style.margin="0px",document.documentElement.style.width="100%",document.documentElement.style.height="100%");let n=t.canvas??e.appendChild(document.createElement("canvas"));d.canvas=n;let r=t.scale??1;d.gscale=r;let s=t.width&&t.height&&!t.stretch&&!t.letterbox;s?(n.width=t.width*r,n.height=t.height*r):(n.width=n.parentElement.offsetWidth,n.height=n.parentElement.offsetHeight);let i=["outline: none","cursor: default"];if(s){let N=n.width,V=n.height;i.push(`width: ${N}px`),i.push(`height: ${V}px`)}else i.push("width: 100%"),i.push("height: 100%");t.crisp&&(i.push("image-rendering: pixelated"),i.push("image-rendering: crisp-edges")),n.style.cssText=i.join(";");let l=t.pixelDensity||1;d.pixelDensity=l,n.width*=l,n.height*=l,n.tabIndex=0;let c=document.createElement("canvas");c.width=256,c.height=256,d.fontCacheCanvas=c;let h=c.getContext("2d",{willReadFrequently:!0});d.fontCacheC2d=h;let u=Ih({canvas:n,touchToMouse:t.touchToMouse,gamepads:t.gamepads,pixelDensity:t.pixelDensity,maxFPS:t.maxFPS,buttons:t.buttons});d.app=u;let g=[],y=u.canvas.getContext("webgl",{antialias:!0,depth:!0,stencil:!0,alpha:!0,preserveDrawingBuffer:!0});if(!y)throw new Error("WebGL not supported");let m=y,E=Iu(m,{texFilter:t.texFilter}),p=mc(t,E);d.gfx=p;let T=dc();d.audio=T;let f=Qh(E,t.spriteAtlasPadding??0);d.assets=f;let w=hc();d.game=w,w.root.use(zr()),da("collision",Fe,[4,3]);function S(N,V){let X=new Hr(E,N,V);return{clear:o(()=>X.clear(),"clear"),free:o(()=>X.free(),"free"),toDataURL:o(()=>X.toDataURL(),"toDataURL"),toImageData:o(()=>X.toImageData(),"toImageData"),width:X.width,height:X.height,draw:o(ie=>{Ye(),X.bind(),ie(),Ye(),X.unbind()},"draw"),get fb(){return X}}}o(S,"makeCanvas");function C(){m.clear(m.COLOR_BUFFER_BIT),p.frameBuffer.bind(),m.clear(m.COLOR_BUFFER_BIT),p.bgColor||Pt(()=>{zt({width:Ee(),height:Pe(),quad:new xe(0,0,Ee()/64,Pe()/64),tex:p.bgTex,fixed:!0})}),p.renderer.numDraws=0,p.fixed=!1,p.transformStackIndex=-1,p.transform.setIdentity()}o(C,"frameStart");function I(N,V){p.postShader=N,p.postShaderUniform=V??null}o(I,"usePostEffect");function k(){Ye(),p.lastDrawCalls=p.renderer.numDraws,p.frameBuffer.unbind(),m.viewport(0,0,m.drawingBufferWidth,m.drawingBufferHeight);let N=p.width,V=p.height;p.width=m.drawingBufferWidth/l,p.height=m.drawingBufferHeight/l,cr({flipY:!0,tex:p.frameBuffer.tex,pos:new q(p.viewport.x,p.viewport.y),width:p.viewport.width,height:p.viewport.height,shader:p.postShader,uniform:typeof p.postShaderUniform=="function"?p.postShaderUniform():p.postShaderUniform,fixed:!0}),Ye(),p.width=N,p.height=V}o(k,"frameEnd");let x=!1,v={inspect:!1,set timeScale(N){u.state.timeScale=N},get timeScale(){return u.state.timeScale},showLog:!0,fps:o(()=>u.fps(),"fps"),numFrames:o(()=>u.numFrames(),"numFrames"),stepFrame:Ie,drawCalls:o(()=>p.lastDrawCalls,"drawCalls"),clearLog:o(()=>w.logs=[],"clearLog"),log:o((...N)=>{let V=t.logMax??8,X=N.length>1?N.concat(" ").join(" "):N[0];w.logs.unshift({msg:X,time:u.time()}),w.logs.length>V&&(w.logs=w.logs.slice(0,V))},"log"),error:o(N=>v.log(new Error(N.toString?N.toString():N)),"error"),curRecording:null,numObjects:o(()=>$("*",{recursive:!0}).length,"numObjects"),get paused(){return x},set paused(N){x=N,N?T.ctx.suspend():T.ctx.resume()}};d.debug=v;function M(N,V){try{return JSON.parse(window.localStorage[N])}catch{return V?(R(N,V),V):null}}o(M,"getData");function R(N,V){window.localStorage[N]=JSON.stringify(V)}o(R,"setData");function L(N,...V){let X=N(Ce),ie;typeof X=="function"?ie=X(...V)(Ce):ie=X;for(let Me in ie)Ce[Me]=ie[Me],t.global!==!1&&(window[Me]=ie[Me]);return Ce}o(L,"plug");function D(N){let V=u.canvas.captureStream(N),X=T.ctx.createMediaStreamDestination();T.masterNode.connect(X);let ie=new MediaRecorder(V),Me=[];return ie.ondataavailable=be=>{be.data.size>0&&Me.push(be.data)},ie.onerror=()=>{T.masterNode.disconnect(X),V.getTracks().forEach(be=>be.stop())},ie.start(),{resume(){ie.resume()},pause(){ie.pause()},stop(){return ie.stop(),T.masterNode.disconnect(X),V.getTracks().forEach(be=>be.stop()),new Promise(be=>{ie.onstop=()=>{be(new Blob(Me,{type:"video/mp4"}))}})},download(be="kaboom.mp4"){this.stop().then(rt=>Cs(be,rt))}}}o(D,"record");function O(){return document.activeElement===u.canvas}o(O,"isFocused");let z=w.root.add.bind(w.root),te=w.root.readd.bind(w.root),H=w.root.removeAll.bind(w.root),$=w.root.get.bind(w.root),Q=w.root.wait.bind(w.root),ne=w.root.loop.bind(w.root),Y=w.root.query.bind(w.root),ee=w.root.tween.bind(w.root),W=xn(null,wc),De=xn(null,yc);d.kaSprite=W,d.boomSprite=De;function He(){w.root.fixedUpdate()}o(He,"fixedUpdateFrame");function Ie(){w.root.update()}o(Ie,"updateFrame");const Ue=class Ue{constructor(V,X,ie,Me,be=!1){b(this,"source");b(this,"target");b(this,"normal");b(this,"distance");b(this,"resolved",!1);this.source=V,this.target=X,this.normal=ie,this.distance=Me,this.resolved=be}get displacement(){return this.normal.scale(this.distance)}reverse(){return new Ue(this.target,this.source,this.normal.scale(-1),this.distance,this.resolved)}hasOverlap(){return!this.displacement.isZero()}isLeft(){return this.displacement.cross(w.gravity||P(0,1))>0}isRight(){return this.displacement.cross(w.gravity||P(0,1))<0}isTop(){return this.displacement.dot(w.gravity||P(0,1))>0}isBottom(){return this.displacement.dot(w.gravity||P(0,1))<0}preventResolution(){this.resolved=!0}};o(Ue,"Collision");let Ne=Ue;function Je(N,V){if(V.paused||!V.exists())return!1;for(let ie of N.collisionIgnore)if(V.is(ie))return!1;for(let ie of V.collisionIgnore)if(N.is(ie))return!1;let X=Ts(N.worldArea(),V.worldArea());if(X){let ie=new Ne(N,V,X.normal,X.distance);N.trigger("collideUpdate",V,ie);let Me=ie.reverse();Me.resolved=ie.resolved,V.trigger("collideUpdate",N,Me)}return!0}o(Je,"narrowPhase");let K=new Yh,oe=!1;function ce(){if(Os()){if(!oe){oe=!0,Ls(N=>{N.has("area")&&K.add(N)}),la(N=>{K.remove(N)}),ua((N,V)=>{V==="area"&&K.add(N)}),ha((N,V)=>{V==="area"&&K.remove(N)}),Ds(N=>{oe=!1,K.clear()});for(let N of $("*",{recursive:!0}))N.has("area")&&K.add(N)}K.update();for(let[N,V]of K)Je(N,V)}}o(ce,"broadPhase");function Fe(){if(Os())return ce()}o(Fe,"checkFrame");function Se(N){if(fa)return;fa=!0,console.error(N),T.ctx.suspend();let V=N.message??String(N)??"Unknown error, check console for more info",X=!1;u.run(()=>{},()=>{X||(X=!0,C(),Pt(()=>{let ie=Ee(),Me=Pe(),be={size:36,width:ie-32*2,letterSpacing:4,lineSpacing:4,font:Dr,fixed:!0};Ve({width:ie,height:Me,color:ue(0,0,255),fixed:!0});let rt=Vt({...be,text:"Error",pos:P(32),color:ue(255,128,0),fixed:!0});Gt(rt),js({...be,text:V,pos:P(32,32+rt.height+16),fixed:!0}),ze(),w.events.trigger("error",N)}),k())})}o(Se,"handleErr"),d.handleErr=Se;function tt(N){g.push(N)}o(tt,"onCleanup");function Qe(){w.events.onOnce("frameEnd",()=>{u.quit(),m.clear(m.COLOR_BUFFER_BIT|m.DEPTH_BUFFER_BIT|m.STENCIL_BUFFER_BIT);let N=m.getParameter(m.MAX_TEXTURE_IMAGE_UNITS);for(let V=0;VV())})}o(Qe,"quit");let nt=!0;u.run(()=>{try{if(f.loaded&&!v.paused){for(let N of d.systemsByEvent[1])N.run();He();for(let N of d.systemsByEvent[4])N.run()}}catch(N){Se(N)}},(N,V)=>{try{if(N(),f.loaded||jt()===1&&!nt&&(f.loaded=!0,gi().forEach(X=>w.events.trigger("loadError",...X)),w.events.trigger("load")),!f.loaded&&t.loadingScreen!==!1||nt)C(),Uu(),k();else{if(!v.paused){for(let X of d.systemsByEvent[0])X.run();Ie();for(let X of d.systemsByEvent[3])X.run()}C();for(let X of d.systemsByEvent[2])X.run();Nu(),t.debug!==!1&&Du();for(let X of d.systemsByEvent[5])X.run();k()}nt&&(nt=!1),w.events.trigger("frameEnd"),V()}catch(X){Se(X)}}),Ji(),ji();let Ce={_k:d,VERSION:xc,loadRoot:nl,loadProgress:jt,loadSprite:xn,loadSpriteAtlas:vi,loadSound:fl,loadMusic:gl,loadBitmapFont:wi,loadFont:al,loadShader:hl,loadShaderURL:cl,loadAseprite:il,loadPedit:ll,loadBean:pl,loadHappy:_h,loadJSON:rl,load:Ur,getSound:Ai,getFont:mi,getBitmapFont:yi,getSprite:bi,getShader:xi,getAsset:sl,Asset:ut,SpriteData:nn,SoundData:wn,width:Ee,height:Pe,center:hr,dt:u.dt,fixedDt:u.fixedDt,restDt:u.restDt,time:u.time,screenshot:u.screenshot,record:D,isFocused:O,setCursor:u.setCursor,getCursor:u.getCursor,setCursorLocked:u.setCursorLocked,isCursorLocked:u.isCursorLocked,setFullscreen:u.setFullscreen,isFullscreen:u.isFullscreen,isTouchscreen:u.isTouchscreen,onLoad:us,onLoadError:nu,onLoading:$l,onResize:eu,onGamepadConnect:u.onGamepadConnect,onGamepadDisconnect:u.onGamepadDisconnect,onError:tu,onCleanup:tt,flash:Oi,setCamPos:qi,getCamPos:Ti,setCamRot:Ri,getCamRot:Fi,setCamScale:Ii,getCamScale:Bi,getCamTransform:wr,camPos:su,camScale:iu,camFlash:ou,camRot:au,camTransform:lu,shake:ru,toScreen:Gr,toWorld:Li,setGravity:hu,getGravity:cu,setGravityDirection:du,getGravityDirection:nr,setBackground:zo,getBackground:Vo,getGamepads:u.getGamepads,getTreeRoot:vu,add:z,make:hs,destroy:Vi,destroyAll:H,get:$,query:Y,readd:te,pos:lr,scale:ur,rotate:Vl,color:hi,blend:Go,opacity:ci,anchor:Vr,area:ql,sprite:jr,text:ml,polygon:_o,rect:fi,circle:Ho,ellipse:Wo,uvquad:yl,video:wl,picture:Zo,outline:Jo,particles:Qo,body:Tl,surfaceEffector:Bl,areaEffector:Rl,pointEffector:Fl,buoyancyEffector:Dl,platformEffector:Ll,constantForce:Ol,doubleJump:Il,shader:$o,textInput:Cl,timer:zr,fixed:Ci,stay:Pi,health:Sl,lifespan:Ml,named:kl,state:Pl,z:Gl,layer:Ul,move:jl,offscreen:zl,follow:Nl,fadeIn:Yo,mask:Xo,drawon:Ko,raycast:di,tile:Si,animate:El,serializeAnimation:ki,agent:xl,sentry:bl,patrol:vl,pathfinder:Al,fakeMouse:sc,trigger:ic,on:Ge,onFixedUpdate:ac,onUpdate:Kl,onDraw:oc,onAdd:Ls,onDestroy:la,onUse:ua,onUnuse:ha,onTag:Wl,onUntag:lc,onClick:uc,onCollide:Yl,onCollideUpdate:Xl,onCollideEnd:Jl,onHover:Ql,onHoverUpdate:Zl,onHoverEnd:_l,onKeyDown:u.onKeyDown,onKeyPress:u.onKeyPress,onKeyPressRepeat:u.onKeyPressRepeat,onKeyRelease:u.onKeyRelease,onMouseDown:u.onMouseDown,onMousePress:u.onMousePress,onMouseRelease:u.onMouseRelease,onMouseMove:u.onMouseMove,onCharInput:u.onCharInput,onTouchStart:u.onTouchStart,onTouchMove:u.onTouchMove,onTouchEnd:u.onTouchEnd,onScroll:u.onScroll,onHide:u.onHide,onShow:u.onShow,onGamepadButtonDown:u.onGamepadButtonDown,onGamepadButtonPress:u.onGamepadButtonPress,onGamepadButtonRelease:u.onGamepadButtonRelease,onGamepadStick:u.onGamepadStick,onButtonPress:u.onButtonPress,onButtonDown:u.onButtonDown,onButtonRelease:u.onButtonRelease,mousePos:cs,mouseDeltaPos:u.mouseDeltaPos,isKeyDown:u.isKeyDown,isKeyPressed:u.isKeyPressed,isKeyPressedRepeat:u.isKeyPressedRepeat,isKeyReleased:u.isKeyReleased,isMouseDown:u.isMouseDown,isMousePressed:u.isMousePressed,isMouseReleased:u.isMouseReleased,isMouseMoved:u.isMouseMoved,isGamepadButtonPressed:u.isGamepadButtonPressed,isGamepadButtonDown:u.isGamepadButtonDown,isGamepadButtonReleased:u.isGamepadButtonReleased,getGamepadStick:u.getGamepadStick,isButtonPressed:u.isButtonPressed,isButtonDown:u.isButtonDown,isButtonReleased:u.isButtonReleased,setButton:u.setButton,getButton:u.getButton,pressButton:u.pressButton,releaseButton:u.releaseButton,getLastInputDeviceType:u.getLastInputDeviceType,charInputted:u.charInputted,loop:ne,wait:Q,play:pu,setVolume:Ni,getVolume:Ui,volume:mu,burp:Di,audioCtx:T.ctx,Line:Xe,Rect:we,Circle:Le,Ellipse:ht,Point:ih,Polygon:Re,Vec2:q,Color:se,Mat4:Xr,Mat23:tn,Quad:xe,RNG:ba,rand:ke,randi:Ws,randSeed:Ea,vec2:P,rgb:ue,hsl2rgb:nh,quad:ve,choose:ka,chooseMultiple:Ma,shuffle:Ys,chance:Sa,lerp:Oe,tween:ee,easings:ar,map:ot,mapc:va,wave:Ks,deg2rad:ye,rad2deg:Tt,clamp:lt,evaluateQuadratic:Ha,evaluateQuadraticFirstDerivative:Ka,evaluateQuadraticSecondDerivative:Wa,evaluateBezier:ts,evaluateBezierFirstDerivative:Ya,evaluateBezierSecondDerivative:Xa,evaluateCatmullRom:Ja,evaluateCatmullRomFirstDerivative:Qa,curveLengthApproximation:ni,normalizedCurve:Za,hermite:Zn,cardinal:ri,catmullRom:ir,bezier:_a,kochanekBartels:$a,easingSteps:io,easingLinear:ro,easingCubicBezier:so,testLineLine:Jr,testRectRect:Xs,testRectLine:Qr,testRectPoint:fr,testCirclePolygon:gr,testLinePoint:Zr,testLineCircle:Qn,clipLineToRect:Ca,clipLineToCircle:qa,gjkShapeIntersects:No,gjkShapeIntersection:Ts,isConvex:ho,triangulate:ii,NavMesh:Wh,drawSprite:zu,drawText:js,formatText:Vt,drawRect:Ve,drawLine:yn,drawLines:fs,drawTriangle:Yi,drawCircle:on,drawEllipse:ds,drawUVQuad:zt,drawPolygon:qt,drawCurve:Wi,drawBezier:Ou,drawFormattedText:Gt,drawMasked:ju,drawSubtracted:Vu,beginPicture:Cu,appendToPicture:qu,endPicture:Tu,drawPicture:Ki,pushTransform:We,popTransform:ze,pushTranslate:$e,pushScale:Jn,pushRotate:rn,pushMatrix:Mu,usePostEffect:I,makeCanvas:S,drawCanvas:Lu,Picture:Hi,debug:v,scene:bu,getSceneName:Su,go:Eu,onSceneLeave:Ds,layers:Au,getLayers:wu,setLayers:zi,getDefaultLayer:xu,addLevel:Hl,getData:M,setData:R,download:ss,downloadJSON:wo,downloadText:oi,downloadBlob:Cs,plug:L,system:da,ASCII_CHARS:co,canvas:u.canvas,addKaboom:yu,LEFT:q.LEFT,RIGHT:q.RIGHT,UP:q.UP,DOWN:q.DOWN,RED:se.RED,GREEN:se.GREEN,BLUE:se.BLUE,YELLOW:se.YELLOW,MAGENTA:se.MAGENTA,CYAN:se.CYAN,WHITE:se.WHITE,BLACK:se.BLACK,quit:Qe,KEvent:Te,KEventHandler:rs,KEventController:sn,KeepFlags:uu,cancel:o(()=>go,"cancel"),BlendMode:Io};d.k=Ce;let he=t.plugins;if(he&&he.forEach(L),t.global!==!1)for(let N in Ce)window[N]=Ce[N];return t.focus!==!1&&u.canvas.focus(),Ce},"kaplay"),vc=Ac;const bc="G-2GKHT76YTG";function Ec(t,e){if(window.gtag){e&&e();return}const n=document.createElement("script");n.async=!0,n.src=`https://www.googletagmanager.com/gtag/js?id=${t}`,n.onload=()=>{window.dataLayer=window.dataLayer||[],window.gtag=function(){window.dataLayer.push(arguments)},window.gtag("js",new Date),window.gtag("config",t,{}),e&&e()},document.head.appendChild(n)}function Sc(){window.gtag&&window.gtag("event","game_start",{event_category:"game"})}function Mc(t,e){window.gtag&&window.gtag("event","block_reached",{event_category:"game",block_index:t,block_name:e})}function Gu(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}const kc=Gu()?640:1920,Pc=Gu()?480:1080,a=vc({loadingScreen:!1,background:[0,0,0,0],font:"jetbrains",maxFPS:120,backgroundAudio:!1,width:kc,height:Pc,letterbox:!0,pixelDensity:1,crisp:!1,texFilter:"linear"});a.onLoading(t=>{});window.addEventListener("keydown",t=>{(t.key==="/"||t.key==="?")&&t.preventDefault()});a.loadFont("jetbrains","/fonts/jetbrains.ttf",{outline:{width:6,color:a.rgb(8,8,8)}});a.loadSprite("bg4","/sprites/bg4.png");a.loadSprite("bg2","/sprites/bg2.png");a.loadSound("code_sound","/sounds/code_sound.mp3");a.loadSound("wrong_typing","/sounds/wrong typing.mp3");a.loadSprite("muteON","/sprites/muteON.png");a.loadSprite("muteOff","/sprites/muteOFF.png");a.loadSprite("WPM","/sprites/WPM.png");const Cc=[{id:1,title:"twoSum",language:"javascript",blocks:[`var twoSum = function(nums, target) {
+`,` let map = {};
+`,`
+`,` for (let i = 0; i < nums.length; i++) {
+`,` let other = target - nums[i];
+`,`
+`,` if (other in map) {
+`,` return [i, map[other]];
+`,` }
+`,`
+`,` map[nums[i]] = i;
+`,` }
+`,`
+`,` return [];
+`,`};
+`]},{id:2,title:"isPalindrome",language:"javascript",blocks:[`var isPalindrome = function(x) {
+`,` if (x < 0) {
+`,` return false;
+`,` }
+`,`
+`,` let reverse = 0;
+`,` let xcopy = x;
+`,`
+`,` while (x > 0) {
+`,` reverse = (reverse * 10) + (x % 10);
+`,` x = Math.floor(x / 10);
+`,` }
+`,`
+`,` return reverse === xcopy;
+`,`};
+`]},{id:3,title:"longestCommonPrefix",language:"javascript",blocks:[`var longestCommonPrefix = function(strs) {
+`,` return strs.reduce((prev, next) => {
+`,` let i = 0;
+`,` while (prev[i] && next[i] && prev[i] === next[i]) i++;
+`,` return prev.slice(0, i);
+`,` });
+`,`};
+`]},{id:4,title:"mergeTwoLists",language:"javascript",blocks:[`var mergeTwoLists = function(list1, list2) {
+`,` let dummy = new ListNode();
+`,` let cur = dummy;
+`,`
+`,` while (list1 && list2) {
+`,` if (list1.val > list2.val) {
+`,` cur.next = list2;
+`,` list2 = list2.next;
+`,` } else {
+`,` cur.next = list1;
+`,` list1 = list1.next;
+`,` }
+`,` cur = cur.next;
+`,` }
+`,`
+`,` cur.next = list1 || list2;
+`,`
+`,` return dummy.next;
+`,`};
+`]},{id:5,title:"removeDuplicates",language:"javascript",blocks:[`var removeDuplicates = function(nums) {
+`,` let i = 1;
+`,`
+`,` for (let j = 1; j < nums.length; j++) {
+`,` if (nums[j] !== nums[i - 1]) {
+`,` nums[i] = nums[j];
+`,` i++;
+`,` }
+`,` }
+`,`
+`,` return i;
+`,`};
+`]},{id:6,title:"strStr",language:"javascript",blocks:[`var strStr = function(haystack, needle) {
+`,` if (haystack.length < needle.length) {
+`,` return -1;
+`,` }
+`,`
+`,` for (let i = 0; i <= haystack.length - needle.length; i++) {
+`,` if (haystack.substring(i, i + needle.length) === needle) {
+`,` return i;
+`,` }
+`,` }
+`,`
+`,` return -1;
+`,`};
+`]},{id:7,title:"searchInsert",language:"javascript",blocks:[`var searchInsert = function(nums, target) {
+`,` let left = 0;
+`,` let right = nums.length - 1;
+`,`
+`,` while (left <= right) {
+`,` let mid = Math.floor((left + right) / 2);
+`,`
+`,` if (nums[mid] === target) {
+`,` return mid;
+`,` } else if (nums[mid] > target) {
+`,` right = mid - 1;
+`,` } else {
+`,` left = mid + 1;
+`,` }
+`,` }
+`,`
+`,` return left;
+`,`};
+`]},{id:8,title:"lengthOfLastWord",language:"javascript",blocks:[`var lengthOfLastWord = function(s) {
+`,` let length = 0;
+`,` for (let i = s.length - 1; i >= 0; i--) {
+`,` if (s[i] !== ' ') {
+`,` length++;
+`,` } else if (length > 0) {
+`,` break;
+`,` }
+`,` }
+`,`
+`,` return length;
+`,`};
+`]},{id:9,title:"plusOne",language:"javascript",blocks:[`var plusOne = function(digits) {
+`,` for (let i = digits.length - 1; i >= 0; i--) {
+`,` if (digits[i] + 1 !== 10) {
+`,` digits[i] += 1;
+`,` return digits;
+`,` }
+`,` digits[i] = 0;
+`,` if (i === 0) {
+`,` digits.unshift(1);
+`,` return digits;
+`,` }
+`,` }
+`,`};
+`]},{id:10,title:"addBinary",language:"javascript",blocks:[`var addBinary = function(a, b) {
+`,` let carry = 0;
+`,` let res = '';
+`,` let i = a.length - 1;
+`,` let j = b.length - 1;
+`,`
+`,` while (i >= 0 || j >= 0 || carry) {
+`,` let sum = carry;
+`,` if (i >= 0) sum += parseInt(a[i]);
+`,` if (j >= 0) sum += parseInt(b[j]);
+`,`
+`,` res = (sum % 2) + res;
+`,` carry = Math.floor(sum / 2);
+`,`
+`,` i--;
+`,` j--;
+`,` }
+`,`
+`,` return res;
+`,`};
+`]},{id:11,title:"mySqrt",language:"javascript",blocks:[`var mySqrt = function(x) {
+`,` var left = 1;
+`,` var right = Math.floor(x / 2) + 1;
+`,` var mid;
+`,`
+`,` while (left <= right) {
+`,` mid = Math.floor((left + right) / 2);
+`,`
+`,` if (mid * mid > x) {
+`,` right = mid - 1;
+`,` } else if (mid * mid < x) {
+`,` left = mid + 1;
+`,` } else {
+`,` return mid;
+`,` }
+`,` }
+`,`
+`,` return right;
+`,`};
+`]},{id:12,title:"climbStairs",language:"javascript",blocks:[`var climbStairs = function(n) {
+`,` if (n <= 3) return n;
+`,`
+`,` let prev1 = 3;
+`,` let prev2 = 2;
+`,` let cur = 0;
+`,`
+`,` for (let i = 3; i < n; i++) {
+`,` cur = prev1 + prev2;
+`,` prev2 = prev1;
+`,` prev1 = cur;
+`,` }
+`,`
+`,` return cur;
+`,`};
+`]},{id:13,title:"deleteDuplicates",language:"javascript",blocks:[`var deleteDuplicates = function(head) {
+`,` let res = head;
+`,`
+`,` while (head && head.next) {
+`,` if (head.val === head.next.val) {
+`,` head.next = head.next.next;
+`,` } else {
+`,` head = head.next;
+`,` }
+`,` }
+`,`
+`,` return res;
+`,`};
+`]},{id:14,title:"mergeSortedArray",language:"javascript",blocks:[`var merge = function(nums1, m, nums2, n) {
+`,` for (let i = m, j = 0; j < n; i++, j++) {
+`,` nums1[i] = nums2[j];
+`,` }
+`,` nums1.sort((a, b) => a - b);
+`,`};
+`]},{id:15,title:"inorderTraversal",language:"javascript",blocks:[`var inorderTraversal = function(root) {
+`,` const res = [];
+`,`
+`,` function inorder(node) {
+`,` if (!node) {
+`,` return;
+`,` }
+`,` inorder(node.left);
+`,` res.push(node.val);
+`,` inorder(node.right);
+`,` }
+`,`
+`,` inorder(root);
+`,` return res;
+`,`};
+`]},{id:16,title:"isSameTree",language:"javascript",blocks:[`var isSameTree = function(p, q) {
+`,` if (!p && !q) {
+`,` return true;
+`,` }
+`,`
+`,` if (p && q && p.val === q.val) {
+`,` return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
+`,` }
+`,`
+`,` return false;
+`,`};
+`]},{id:17,title:"isSymmetric",language:"javascript",blocks:[`var isSymmetric = function(root) {
+`,` const isMirror = (n1, n2) => {
+`,` if (!n1 && !n2) {
+`,` return true;
+`,` }
+`,`
+`,` if (!n1 || !n2) {
`,` return false;
`,` }
-`,` charSet.add(str[i]);
+`,` const leftMirror = isMirror(n1.left, n2.right);
+`,` const rightMirror = isMirror(n1.right, n2.left);
+`,` return n1.val === n2.val && leftMirror && rightMirror;
+`,` };
+`,`
+`,` return isMirror(root.left, root.right);
+`,`};
+`]},{id:18,title:"twoSum",language:"golang",blocks:[`func twoSum(nums []int, target int) []int {
+`,` m := map[int]int{}
+`,` for i, n := range nums {
+`,` if j, ok := m[target-n]; ok {
+`,` return []int{j, i}
`,` }
+`,` m[n] = i
+`,` }
+`,` return nil
+`,`}
+`]},{id:19,title:"isPalindrome",language:"golang",blocks:[`func isPalindrome(x int) bool {
+`,` if x < 0 {
+`,` return false
+`,` }
+`,` orig, rev := x, 0
+`,` for x > 0 {
+`,` rev = rev*10 + x%10
+`,` x /= 10
`,` }
-`,` return matrix;
+`,` return rev == orig
+`,`}
+`]},{id:20,title:"longestCommonPrefix",language:"golang",blocks:[`func longestCommonPrefix(strs []string) string {
+`,` if len(strs) == 0 {
+`,` return ""
+`,` }
+`,` pref := strs[0]
+`,` for _, s := range strs[1:] {
+`,` i := 0
+`,` for i < len(pref) && i < len(s) && pref[i] == s[i] {
+`,` i++
+`,` }
+`,` pref = pref[:i]
+`,` if pref == "" {
+`,` break
`,` }
-`,`
+`,` }
+`,` return pref
`,`}
-`],[`function rotateMatrix(matrix) {
-`,` const n = matrix.length;
-`,`
-`,` for (let layer = 0; layer < Math.floor(n / 2); layer++) {
-`,` let first = layer;
-`,` let last = n - 1 - layer;
-`,` matrix[first][i] = matrix[last - offset][first];
-`,` matrix[last - offset][first] = matrix[last][last - offset];
-`,` matrix[last][last - offset] = matrix[i][last];
-`," matrix[i][last] = top;n",` }
+`]},{id:21,title:"mergeTwoLists",language:"golang",blocks:[`func mergeTwoLists(l1, l2 *ListNode) *ListNode {
+`,` d := &ListNode{}
+`,` cur := d
+`,` for l1 != nil && l2 != nil {
+`,` if l1.Val < l2.Val {
+`,` cur.Next, l1 = l1, l1.Next
+`,` } else {
+`,` cur.Next, l2 = l2, l2.Next
`,` }
-`,`
-`,` return matrix;
+`,` cur = cur.Next
+`,` }
+`,` if l1 != nil {
+`,` cur.Next = l1
+`,` } else {
+`,` cur.Next = l2
+`,` }
+`,` return d.Next
+`,`}
+`]},{id:22,title:"removeDuplicates",language:"golang",blocks:[`func removeDuplicates(nums []int) int {
+`,` i := 1
+`,` for j := 1; j < len(nums); j++ {
+`,` if nums[j] != nums[i-1] {
+`,` nums[i], i = nums[j], i+1
`,` }
-`],[`class Node {
-`,` constructor(data) {
-`,` this.data = data;
-`,` this.next = null;
`,` }
+`,` return i
`,`}
-`,`
-`,`class LinkedList {
-`,` constructor() {
+`]},{id:23,title:"strStr",language:"golang",blocks:[`func strStr(haystack, needle string) int {
+`,` if len(needle) == 0 {
+`,` return 0
`,` }
-`,`
-`,` append(data) {
-`,` if (this.head === null) {
-`,` this.head = new Node(data);
-`,` return;
-`,` append(data) {
-`,` if (this.head === null) {
-`,` this.head = new Node(data);
-`,` return;
+`,` for i := 0; i+len(needle) <= len(haystack); i++ {
+`,` if haystack[i:i+len(needle)] == needle {
+`,` return i
`,` }
-`,` let current = this.head;
-`,` while (current.next !== null) {
-`,` current = current.next;
-`,` }
-`,` current.next = new Node(data);
-`,` }
-`,`}
-`],[`import React, { useState } from 'react';{
-`,`
-`,`const SignupForm = () => {
-`,` const [formData, setFormData] = useState({
-`,` email: '',
-`,` password: ''
-`,` });
-`,`
-`,` const [submitted, setSubmitted] = useState(false);
-`,`
-`,` const handleChange = (e) => {
-`,` setFormData({
-`,` ...formData,
-`,` [e.target.name]: e.target.value
-`,` });
-`,` };
-`,`
-`,` const handleSubmit = (e) => {
-`,` e.preventDefault();
-`,` setSubmitted(true);
-`,` };
-`,`
-`,` return (
-`]],qu={blocks:Lu};Nu({background:[255,209,253]});const Fn=Color.fromArray([0,0,255]),kn=Color.fromArray([128,128,255]),Yr=Color.GREEN,zr=Color.RED,Gu=Color.fromArray([255,215,0]);let ii=0,De=0,qe=0,nt=0,Ct=0,xr=0,vr=0,jt=0;const ju=2;let br=60;const Ku=2;let Qr=0;const oi=qu;scene("game",()=>{let t=0,e=0;const r=8;let n=[],s=0;add([rect(width()-100,640,{radius:32}),anchor("center"),pos(center().x,height()/2),outline(4)]);const i=add([text(`[yellow]${br}[/yellow]`,{size:32,styles:{yellow:{color:Gu}}}),pos(center().x-40,height()/2-250),anchor("top")]),a=add([text("_",{size:32,color:zr}),pos(0,0),anchor("center")]);function h(){return oi.blocks[t]}function l(){const m=h(),f=e*r;return m.slice(f,f+r)}function c(){let m=0;loop(.3,()=>{if(m=ju){go("endgame");return}t++,t>=oi.blocks.length&&(t=0),u();return}n.forEach(V=>V.destroy()),n.length=0,s=0,Qr=0;const f=30,A=17;let y=height()/2-f*m.length/2;for(let V of m){for(let I=0;I{if(br--,i.text=`[yellow]${br}[/yellow]`,br<=0){i.text="[yellow]0[/yellow]";const m=h().join("").length,f=De+qe;jt+=Math.max(0,m-f),console.log(`Missin Characters: ${jt}`),go("endgame")}})}window.addEventListener("keydown",m=>{const f=m.key;if(f==="Backspace"&&s>0){const A=n[s-1],y=s=Ku)&&s=n.length&&n.every(V=>V.color.eq(Yr))&&(e++,u())}}),g(),u()});scene("endgame",()=>{add([text("Analytics",{size:48}),pos(center().x,center().y-100),anchor("center")]);const t=Ct+xr+jt,e=t>0?Ct/t*100:0,r=60-br,n=Ct/5/(r/60),s=vr/r*60;add([text(`Accuracy: ${e.toFixed(2)}%`,{size:32}),pos(center().x,center().y),anchor("center")]),add([text(`WPM: ${n.toFixed(2)}`,{size:32}),pos(center().x,center().y+40),anchor("center")]),add([text(`LOC: ${s.toFixed(2)}`,{size:32}),pos(center().x,center().y+80),anchor("center")]),add([text(`Missing Characters: ${jt}`,{size:32}),pos(center().x,center().y+120),anchor("center")])});go("game");
-//# sourceMappingURL=index-Cv33lXux.js.map
+`,` }
+`,` return -1
+`,`}
+`]},{id:24,title:"searchInsert",language:"golang",blocks:[`func searchInsert(nums []int, target int) int {
+`,` l, r := 0, len(nums)-1
+`,` for l <= r {
+`,` m := (l + r) / 2
+`,` if nums[m] == target {
+`,` return m
+`,` }
+`,` if nums[m] < target {
+`,` l = m + 1
+`,` } else {
+`,` r = m - 1
+`,` }
+`,` }
+`,` return l
+`,`}
+`]},{id:25,title:"lengthOfLastWord",language:"golang",blocks:[`func lengthOfLastWord(s string) int {
+`,` l := 0
+`,` for i := len(s) - 1; i >= 0; i-- {
+`,` if s[i] != ' ' {
+`,` l++
+`,` } else if l > 0 {
+`,` break
+`,` }
+`,` }
+`,` return l
+`,`}
+`]},{id:26,title:"plusOne",language:"golang",blocks:[`func plusOne(digits []int) []int {
+`,` for i := len(digits) - 1; i >= 0; i-- {
+`,` digits[i]++
+`,` if digits[i] < 10 {
+`,` return digits
+`,` }
+`,` digits[i] = 0
+`,` }
+`,` return append([]int{1}, digits...)
+`,`}
+`]},{id:27,title:"addBinary",language:"golang",blocks:[`func addBinary(a, b string) string {
+`,` i, j, carry := len(a)-1, len(b)-1, 0
+`,` res := ""
+`,` for i >= 0 || j >= 0 || carry > 0 {
+`,` sum := carry
+`,` if i >= 0 {
+`,` sum += int(a[i] - '0')
+`,` i--
+`,` }
+`,` if j >= 0 {
+`,` sum += int(b[j] - '0')
+`,` j--
+`,` }
+`,` res = string('0'+sum%2) + res
+`,` carry = sum / 2
+`,` }
+`,` return res
+`,`}
+`]},{id:28,title:"mySqrt",language:"golang",blocks:[`func mySqrt(x int) int {
+`,` l, r := 0, x
+`,` for l <= r {
+`,` m := (l + r) / 2
+`,` if m*m <= x {
+`,` l = m + 1
+`,` } else {
+`,` r = m - 1
+`,` }
+`,` }
+`,` return r
+`,`}
+`]},{id:29,title:"climbStairs",language:"golang",blocks:[`func climbStairs(n int) int {
+`,` if n <= 3 {
+`,` return n
+`,` }
+`,` a, b := 2, 3
+`,` for i := 4; i <= n; i++ {
+`,` a, b = b, a+b
+`,` }
+`,` return b
+`,`}
+`]},{id:30,title:"deleteDuplicatesList",language:"golang",blocks:[`func deleteDuplicatesList(head *ListNode) *ListNode {
+`,` cur := head
+`,` for cur != nil && cur.Next != nil {
+`,` if cur.Val == cur.Next.Val {
+`,` cur.Next = cur.Next.Next
+`,` } else {
+`,` cur = cur.Next
+`,` }
+`,` }
+`,` return head
+`,`}
+`]},{id:31,title:"mergeSortedArray",language:"golang",blocks:[`func merge(nums1 []int, m int, nums2 []int, n int) {
+`,` i, j, k := m-1, n-1, m+n-1
+`,` for j >= 0 {
+`,` if i >= 0 && nums1[i] > nums2[j] {
+`,` nums1[k] = nums1[i]
+`,` i--
+`,` } else {
+`,` nums1[k] = nums2[j]
+`,` j--
+`,` }
+`,` k--
+`,` }
+`,`}
+`]},{id:32,title:"inorderTraversal",language:"golang",blocks:[`func inorderTraversal(root *TreeNode) []int {
+`,` res := []int{}
+`,` var dfs func(*TreeNode)
+`,` dfs = func(n *TreeNode) {
+`,` if n == nil {
+`,` return
+`,` }
+`,` dfs(n.Left)
+`,` res = append(res, n.Val)
+`,` dfs(n.Right)
+`,` }
+`,` dfs(root)
+`,` return res
+`,`}
+`]},{id:33,title:"isSameTree",language:"golang",blocks:[`func isSameTree(p, q *TreeNode) bool {
+`,` if p == nil || q == nil {
+`,` return p == q
+`,` }
+`,` if p.Val != q.Val {
+`,` return false
+`,` }
+`,` return isSameTree(p.Left, q.Left) && isSameTree(p.Right, q.Right)
+`,`}
+`]},{id:34,title:"isSymmetric",language:"golang",blocks:[`func isSymmetric(root *TreeNode) bool {
+`,` var check func(a, b *TreeNode) bool
+`,` check = func(a, b *TreeNode) bool {
+`,` if a == nil || b == nil {
+`,` return a == b
+`,` }
+`,` if a.Val != b.Val {
+`,` return false
+`,` }
+`,` return check(a.Left, b.Right) && check(a.Right, b.Left)
+`,` }
+`,` if root == nil {
+`,` return true
+`,` }
+`,` return check(root.Left, root.Right)
+`,`}
+`]},{id:35,title:"twoSum",language:"python",blocks:[`def twoSum(nums, target):
+`,` lookup = {}
+`,` for i, num in enumerate(nums):
+`,` other = target - num
+`,` if other in lookup:
+`,` return [lookup[other], i]
+`,` lookup[num] = i
+`,` return []
+`]},{id:36,title:"isPalindrome",language:"python",blocks:[`def isPalindrome(x):
+`,` if x < 0:
+`,` return False
+`,` original, rev = x, 0
+`,` while x > 0:
+`,` rev = rev * 10 + (x % 10)
+`,` x //= 10
+`,` return rev == original
+`]},{id:37,title:"longestCommonPrefix",language:"python",blocks:[`def longestCommonPrefix(strs):
+`,` if not strs: return ""
+`,` prefix = strs[0]
+`,` for s in strs[1:]:
+`,` i = 0
+`,` while i < len(prefix) and i < len(s) and prefix[i] == s[i]:
+`,` i += 1
+`,` prefix = prefix[:i]
+`,` if not prefix:
+`,` break
+`,` return prefix
+`]},{id:38,title:"mergeTwoLists",language:"python",blocks:[`def mergeTwoLists(l1, l2):
+`,` dummy = ListNode()
+`,` cur = dummy
+`,` while l1 and l2:
+`,` if l1.val <= l2.val:
+`,` cur.next, l1 = l1, l1.next
+`,` else:
+`,` cur.next, l2 = l2, l2.next
+`,` cur = cur.next
+`,` cur.next = l1 or l2
+`,` return dummy.next
+`]},{id:39,title:"removeDuplicates",language:"python",blocks:[`def removeDuplicates(nums):
+`,` if not nums: return 0
+`,` i = 1
+`,` for j in range(1, len(nums)):
+`,` if nums[j] != nums[i - 1]:
+`,` nums[i] = nums[j]
+`,` i += 1
+`,` return i
+`]},{id:40,title:"strStr",language:"python",blocks:[`def strStr(haystack, needle):
+`,` if len(needle) == 0:
+`,` return 0
+`,` for i in range(len(haystack) - len(needle) + 1):
+`,` if haystack[i:i + len(needle)] == needle:
+`,` return i
+`,` return -1
+`]},{id:41,title:"searchInsert",language:"python",blocks:[`def searchInsert(nums, target):
+`,` left, right = 0, len(nums) - 1
+`,` while left <= right:
+`,` mid = (left + right) // 2
+`,` if nums[mid] == target:
+`,` return mid
+`,` elif nums[mid] < target:
+`,` left = mid + 1
+`,` else:
+`,` right = mid - 1
+`,` return left
+`]},{id:42,title:"lengthOfLastWord",language:"python",blocks:[`def lengthOfLastWord(s):
+`,` length = 0
+`,` for i in range(len(s) - 1, -1, -1):
+`,` if s[i] != ' ':
+`,` length += 1
+`,` elif length > 0:
+`,` break
+`,` return length
+`]},{id:43,title:"plusOne",language:"python",blocks:[`def plusOne(digits):
+`,` n = len(digits)
+`,` for i in range(n - 1, -1, -1):
+`,` if digits[i] < 9:
+`,` digits[i] += 1
+`,` return digits
+`,` digits[i] = 0
+`,` return [1] + digits
+`]},{id:44,title:"addBinary",language:"python",blocks:[`def addBinary(a, b):
+`,` i, j, carry = len(a) - 1, len(b) - 1, 0
+`,` res = []
+`,` while i >= 0 || j >= 0 || carry:
+`,` s = carry
+`,` if i >= 0:
+`,` s += int(a[i])
+`,` i -= 1
+`,` if j >= 0:
+`,` s += int(b[j])
+`,` j -= 1
+`,` res.append(str(s % 2))
+`,` carry = s // 2
+`,` return ''.join(reversed(res))
+`]},{id:45,title:"mySqrt",language:"python",blocks:[`def mySqrt(x):
+`,` left, right = 0, x
+`,` ans = 0
+`,` while left <= right:
+`,` mid = (left + right) // 2
+`,` if mid * mid <= x:
+`,` ans = mid
+`,` left = mid + 1
+`,` else:
+`,` right = mid - 1
+`,` return ans
+`]},{id:46,title:"climbStairs",language:"python",blocks:[`def climbStairs(n):
+`,` if n <= 3:
+`,` return n
+`,` prev2, prev1 = 2, 3
+`,` for _ in range(4, n + 1):
+`,` next_val = prev1 + prev2
+`,` prev2 = prev1
+`,` prev1 = next_val
+`,` return prev1
+`]},{id:47,title:"deleteDuplicates",language:"python",blocks:[`def deleteDuplicates(head):
+`,` cur = head
+`,` while cur and cur.next:
+`,` if cur.val == cur.next.val:
+`,` cur.next = cur.next.next
+`,` else:
+`,` cur = cur.next
+`,` return head
+`]},{id:48,title:"mergeSortedArray",language:"python",blocks:[`def merge(nums1, m, nums2, n):
+`,` # Modifica nums1 en sitio
+`,` i, j, k = m - 1, n - 1, m + n - 1
+`,` while j >= 0:
+`,` if i >= 0 and nums1[i] > nums2[j]:
+`,` nums1[k] = nums1[i]
+`,` i -= 1
+`,` else:
+`,` nums1[k] = nums2[j]
+`,` j -= 1
+`,` k -= 1
+`]},{id:49,title:"inorderTraversal",language:"python",blocks:[`def inorderTraversal(root):
+`,` res = []
+`,` def dfs(node):
+`,` if not node:
+`,` return
+`,` dfs(node.left)
+`,` res.append(node.val)
+`,` dfs(node.right)
+`,` dfs(root)
+`,` return res
+`]},{id:50,title:"isSameTree",language:"python",blocks:[`def isSameTree(p, q):
+`,` if not p and not q:
+`,` return True
+`,` if not p or not q or p.val != q.val:
+`,` return False
+`,` return isSameTree(p.left, q.left) and isSameTree(p.right, q.right)
+`]},{id:51,title:"isSymmetric",language:"python",blocks:[`def isSymmetric(root):
+`,` def isMirror(a, b):
+`,` if not a and not b:
+`,` return True
+`,` if not a or not b or a.val != b.val:
+`,` return False
+`,` return isMirror(a.left, b.right) and isMirror(a.right, b.left)
+`,` if not root:
+`,` return True
+`,` return isMirror(root.left, root.right)
+`]}],ga=.35,qc=.18,Tc=60,zs=5,Ic=1,Bc=28,pa=Cc,Rc=.15,ys=.15,Sr=.05,ws=5,xs=40,Qt={resizableObjects:[],timeLeft:0};let dr=!1;function Fc(){dr=!dr}function ma(t){dr=t}function Oc(t){const e=t.isKeyDown("shift");return e&&!dr||!e&&dr}function Wt(t){return t.replace(/\\/g,"\\\\")}function Yr(t,e){t.shake(2),e!=null&&e.mute||t.play("wrong_typing")}function Lc(t){for(let e=t.length-1;e>0;e--){const n=Math.floor(Math.random()*(e+1));[t[e],t[n]]=[t[n],t[e]]}return t}function ya(t,e){t.loop(.5,()=>{e.opacity=e.opacity===0?.8:0})}const As=[{name:"default",tokens:{functions:"#2688ff",classes:"#fc7e05",brackets:"#F2F6FF",keywords:"#df75ff",comments:"#5C6370",strings:"#97ff4d",numbers:"#fc7e05",variables:"#8ae2ff",types:"#ff9e42",operators:"#F2F6FF",punctuation:"#F2F6FF",attributes:"#fc7e05",tags:"#8ae2ff",text:"#F2F6FF",background:"#282C34",constants:"#fc7e05",decorators:"#df75ff",regex:"#97ff4d",foreground:"#F2F6FF"},associations:{functions:/function\s*|=>\s*/,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/,brackets:/[\(\)\[\]\{\}<>]/,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly|def|pass|lambda|nonlocal|global|assert|del|is|not|and|or|True|False|None|elif|except|raise|finally|continue|break|with|as|in|try|yield|await)\b/,types:/:\s*[A-Za-z_$][\w$<>, ]*/,decorators:/@\w+/,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,numbers:/\b\d+(\.\d+)?\b/,punctuation:/[\.,;:]/,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/,constants:/\b[A-Z0-9_]+\b/,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/}},{name:"ts",tokens:{functions:"#61AFEF",classes:"#f27c0c",brackets:"#e6eeff",keywords:"#e48aff",comments:"#5C6370",strings:"#98C379",numbers:"#f27c0c",variables:"#E06C75",types:"#E5C07B",operators:"#56B6C2",punctuation:"#e6eeff",attributes:"#f27c0c",tags:"#E06C75",text:"#e6eeff",background:"#282C34",constants:"#f27c0c",decorators:"#e48aff",regex:"#98C379",foreground:"#e6eeff"},associations:{functions:/function\s*|=>\s*/g,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/g,brackets:/[\(\)\[\]\{\}<>]/g,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/g,types:/:\s*[A-Za-z_$][\w$<>, ]*/g,decorators:/@\w+/g,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/g,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/g,numbers:/\b\d+(\.\d+)?\b/g,punctuation:/[\.,;:]/g,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/g,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/g,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/g,constants:/\b[A-Z0-9_]+\b/g,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/g}}],de=t=>({id:"resizablePos",sizeFunc:t,add(){Qt.resizableObjects.push(this),this.pos=this.sizeFunc()},updatePos(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Dc=t=>({id:"resizableRect",resizeFunc:t,add(){},updateRectSize(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Vs=t=>{localStorage.setItem("playMute",JSON.stringify(t))},wa=()=>{const t=localStorage.getItem("playMute");return t?JSON.parse(t):!1},re={mute:!1,practiceMode:!1,isCapsOn:!1,rivalSpeed:0,language:"js"};function Nc(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}a.scene("selection",()=>{a.loadSprite("icon_05","/sprites/icon_05.png"),a.loadSprite("icon_04","/sprites/icon_04.png"),a.loadSprite("icon_03","/sprites/icon_03.png"),a.loadSprite("icon_02","/sprites/icon_02.png"),a.loadSprite("icon_01","/sprites/icon_01.png"),a.loadSprite("BG_WPM_IN_GAME","/sprites/BG_WPM_IN_GAME.png"),a.loadSprite("BG_TIME_IN_GAME","/sprites/BG_TIME_IN_GAME.png"),a.loadSprite("SilverDevs","/sprites/SilverDev_logo.png"),a.loadMusic("videogame","/sounds/videogame.mp3");let t=[];const e=18,n=800,r=a.height()*.85,s=a.height()*.86,i=a.height()*.66,c=a.width()*.3-10+n/2,h=0,u=a.width()*.35-40;a.width()*.6-40;const g=i+80,y=30;let m=0;if(re.mute=wa(),a.setVolume(re.mute?0:.5),a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),Nc()){a.add([a.text("WPM is a desktop-only experience",{size:18}),de(()=>a.vec2(a.width()*.5,a.height()*.5)),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.scale(.5),a.z(18)]);return}a.add([a.pos(c,a.height()*.5),a.anchor("center"),a.text("Get faster and better at technical interviewing",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.pos(c,a.height()*.55),a.anchor("center"),a.text("by practicing typing code.",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(810,260,{radius:0}),a.pos(a.width()*.3-15,i),a.color(a.rgb(52,53,54)),a.z(20),a.opacity(.3)]),a.add([a.rect(790,230,{radius:1}),a.pos(a.width()*.3-5,i+20),a.color(0,0,0),a.z(20),a.opacity(1)]);const E=a.add([a.anchor("left"),a.text("",{size:e}),de(()=>a.vec2(u,g)),a.opacity(1),a.z(21)]),p=a.add([a.anchor("left"),a.text("",{size:e}),de(()=>a.vec2(u,g+y)),a.opacity(1),a.z(21)]),T=a.add([a.anchor("left"),a.text("",{size:e}),de(()=>a.vec2(u,g+y*2)),a.opacity(1),a.z(21)]),f=a.add([a.anchor("left"),a.text("",{size:e}),de(()=>a.vec2(u+250,g+y)),a.opacity(1),a.z(21)]),w=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),S=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);$();const C=a.add([a.text("←",{size:22}),de(()=>a.vec2(0,0)),a.anchor("left"),a.color(a.rgb(3,255,87)),a.opacity(1),a.z(22),a.animate()]);function I(){switch(m){case 0:t=["about","github","start"];break;case 1:t=["yes","no"];break;case 2:t=["javascript","python","golang"];break;case 3:t=["interview","practice"];break}E.text=m===0?"Start":m===1?"Play with Audio?":m===2?"Language":"Game Mode",p.text=t[0],T.text=t[1],m===2?f.text=t[2]:f.text="",te()}function k(K){if(K!==""){const ce=t.find(Fe=>Fe.startsWith(K.toLowerCase()));if(ce)return ce}return{1:"yes",2:"javascript",3:"interview"}[m]||"start"}function x(K){const oe=K.pos.y+h,ce=K.pos.x+K.text.length*16;C.pos=a.vec2(ce,oe),C.animate("pos",[a.vec2(ce,oe),a.vec2(ce+10,oe)],{duration:.5,loop:!0,direction:"ping-pong"})}let v="Start",M=v.length;const R=14,L=a.width()/2.88-(M-1)*R/2;let D=[],O=[];te();function z(){D.forEach(K=>a.destroy(K)),O.forEach(K=>a.destroy(K)),D=[],O=[];for(let K=0;K{K===Se&&(Fe.color=a.rgb(3,255,87),ce=Fe)}),ce?(C.opacity=1,x(ce)):oe.length?(C.opacity=1,x(oe[0].obj)):C.opacity=0}re.mute=wa(),a.setVolume(re.mute?0:.5),w.opacity=re.mute?0:1,S.opacity=re.mute?1:0;const H=a.add([a.text("",{size:e}),a.pos(L,r),a.anchor("left"),a.color(a.YELLOW),a.opacity(0),a.z(21)]);a.add([a.text("-",{size:e}),a.pos(H.pos.x-30,r),a.anchor("left"),a.color(a.rgb(3,255,87)),a.z(21)]);function $(){w.opacity=re.mute?0:1,S.opacity=re.mute?1:0}let Q="",ne=0,Y="";function ee(K){var Ce;const oe=k(K);(!K||oe.toLowerCase().startsWith(K.toLowerCase()))&&oe!==v&&(v=oe,M=v.length,z());let ce=0,Fe=-1;for(let he=0;hev.length,Qe=K.length>Q.length&&ce>=Se,nt=ce>=2&&K.length>Fe+1;if(tt||Qe){Yr(a,re),Y=Q,H.text=Wt(Y);return}if(ce>ne&&Yr(a,re),ne=ce,nt){Y=K.slice(0,Fe+1),H.text=Wt(Y);return}switch(Y=K,Q=Y,D.forEach((he,Ue)=>{const N=v[Ue],V=K[Ue],X=V?V===" "&&N!==" "?"_":V:N;he.text=Wt(X),he.color=V?V.toLowerCase()!==N.toLowerCase()||V===" "&&N!==" "?a.rgb(255,0,0):a.rgb(3,255,87):a.rgb(128,128,128)}),O.forEach((he,Ue)=>{Ue===K.length?(he.color=a.rgb(3,255,87),he.opacity=Math.abs(Math.sin(a.time()*5))):he.opacity=0}),K.toLowerCase()){case"javascript":case"python":case"golang":if(m===2){re.language=K.toLowerCase(),Ie(),I();const he=k("");he!==v&&(v=he,M=v.length,z())}break;case"github":m===0&&(window.open("https://github.com/conanbatt/wpm","_blank"),De());break;case"about":m===0&&(window.removeEventListener("keydown",Ne),a.go("about"));break;case"start":if(m===0){Ie(),I();const he=k("");he!==v&&(v=he,M=v.length,z())}break;case"yes":m===1&&(re.mute=!1,Vs(!1),a.setVolume(.5),$(),Ie());break;case"no":m===1&&(re.mute=!0,Vs(!0),a.setVolume(0),$(),Ie());break;case"interview":m===3&&(window.removeEventListener("keydown",Ne),ma(re.isCapsOn),a.go("game"));break;case"practice":m===3&&(re.practiceMode=!0,ma(re.isCapsOn),window.removeEventListener("keydown",Ne),a.go("game"));break}te()}function W(K){Y="",Q="",ne=0,I(),v=K,M=v.length,z(),te(),H.text=""}function De(){m=0,W("Start")}function He(){switch(m){case 1:W("Yes");break;case 2:W("javascript");break;case 3:W("Interview");break;default:W(t[0]);break}}function Ie(){m++,He()}let Ne;function Je(){Ne=K=>{K.getModifierState&&typeof K.getModifierState=="function"&&(re.isCapsOn=K.getModifierState("CapsLock")),K.key.length===1&&(Q=Y,Y+=K.key,H.text=Wt(Y),ee(Y),K.key!==" "&&!re.mute&&a.play("code_sound")),K.key===" "&&(K.preventDefault(),Q=Y,Y+=" ",H.text=Wt(Y),ee(Y))},window.addEventListener("keydown",Ne)}a.onKeyPress("backspace",()=>{Y&&(Y=Y.slice(0,-1),H.text=Wt(Y),ee(Y))}),a.onKeyPress("space",()=>{Q=Y,Y+=" ",H.text=Wt(Y),ee(Y)}),a.onKeyDown("escape",()=>{De()}),a.onUpdate(()=>{O.forEach((K,oe)=>{oe===Y.length?(K.color=a.rgb(3,255,87),K.opacity=Math.abs(Math.sin(a.time()*5))):K.opacity=0})}),I(),Je()});let Uc=a.Color.fromHex("#6a717d"),xa=a.YELLOW,jc=a.Color.RED,Mt=0,vs=18,zc=16.4,St=[],Mr={},kr=!1,$n=0,Or=0,pn=0,Lr=0,Yt=0,bs=0,Pr=0,Cr=0,Bt=0,Hu=$n,Ku=Lr,Wu=Or,Yu=pn,Xu=Mt,Gs="",Hs=[],qr="",dn="",gt="",Es=[];const Vc=t=>{Ec(bc,()=>{Sc()}),a.loadMusic("endgame","/sounds/endgame.mp3"),a.loadSprite("arrow_yellow","/sprites/arrow_yellow.png");let e=0,n=As[0],r=-1,s=re.rivalSpeed,i={lineCount:0};const l=a.play("videogame");let c=.95;l.loop=!0,l.volume=0;const h=.3,u=.01,g=100;let y;const m=pa.filter(U=>(U.language||"default")===re.language),E=Lc([...m]);Hs=E.slice(0,ws).map(U=>U.title);const p={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{p.cursorPos=0,p.line="",p.curLineCount=0,p.curCharInLine=0,p.curIdentSize=0,p.cursorPointer&&(p.cursorPointer.pos=Se())}},T={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{T.cursorPos=0,T.line="",T.curLineCount=0,T.curCharInLine=0,T.curIdentSize=0,T.cursorPointer&&(T.cursorPointer.pos=Se(!0))}},f=(U,G)=>{const{tokens:J,associations:le}=n,{cursorPos:me}=p,{cursorPos:Ze}=T;if(St.includes(U))return jc;if(!re.practiceMode&&(U===Ze||U>me-1&&Ume-1)return Uc;const At=[{test:()=>le.brackets.test(G),color:J.brackets},{test:()=>le.operators.test(G),color:J.operators},{test:()=>le.punctuation.test(G),color:J.punctuation},{test:()=>G==='"'||G==="'",color:J.strings}];for(const{test:fe,color:qe}of At)if(fe())return a.Color.fromHex(qe);let ct="";for(const fe of Es)if(U>=fe.start&&Ule.tags.test(fe),color:J.tags},{test:fe=>le.numbers.test(fe),color:J.numbers},{test:fe=>le.classes.test(fe),color:J.classes},{test:fe=>le.functions.test(fe),color:J.functions},{test:fe=>le.keywords.test(fe),color:J.keywords},{test:fe=>le.strings.test(fe),color:J.strings},{test:fe=>/^[A-Za-z_$][\w$]*$/.test(fe),color:J.variables}];for(const{test:fe,color:qe}of Ar)if(fe(ct))return a.Color.fromHex(qe);return a.Color.fromHex(J.text)};let w=0;a.onUpdate(()=>{if(be(),!kr){C();return}if(Bt+=a.dt(),!re.practiceMode){if(w+=a.dt(),w{UG+J,0)/5}function I(U){return U.replace(/\\/g,"\\\\").replace(/\[/g,"\\[").replace(/\]/g,"\\]").replace(/\{/g,"\\{").replace(/\}/g,"\\}").replace(/'/g,"\\'")}function k(U){const G=/[\w$]+|[^\s\w]/g;Es=[];for(const J of U.matchAll(G))Es.push({text:J[0],start:J.index,end:J.index+J[0].length})}function x(){Hu=$n,Ku=Lr,Wu=Or,Yu=pn,Xu=Mt}function v(){kr=!1,Mt=0,Bt=0,$n=0,Lr=0,Or=0,pn=0,Yt=0,bs=0,Pr=0,Cr=0,s=ga,St=[],Mr={}}function M(){const U=a.get("menuItem");for(let G=0;Ga.vec2(0,0),L=a.add([a.anchor("left"),a.pos(a.width()*.25+90,a.height()*.025),a.text("0",{size:18}),a.color(a.YELLOW),a.z(21)]),D=a.add([a.anchor("left"),a.pos(a.width()*.35+90,a.height()*.025),a.text("time: ",{size:18}),a.color(a.YELLOW),a.z(22),a.opacity(re.practiceMode?0:1)]);a.add([a.sprite("BG_WPM_IN_GAME"),a.pos(a.width()*.25,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([a.sprite("BG_TIME_IN_GAME"),a.pos(a.width()*.35,a.height()*.02+5),a.anchor("left"),a.z(20),a.opacity(re.practiceMode?0:1)]),a.add([de(R),a.sprite("bg2"),a.anchor("topleft"),a.opacity(1)]),a.add([a.pos(a.width()*.01+10,a.height()*.01-10),a.sprite("SilverDevs"),a.anchor("topleft"),a.opacity(1),a.z(51)]),a.add([a.rect(2e3,54,{radius:0}),a.pos(1e3,0),a.color(a.rgb(7,7,7)),a.outline(2),a.anchor("top"),a.z(10)]),a.add([a.text("Challenges",{size:20}),de(()=>a.vec2(a.width()*.05,a.height()*.1)),a.color(a.WHITE),a.opacity(1)]),a.add([a.text("ESC to retry",{size:20}),de(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]);const O=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),z=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),te={javascript:"icon_02",ts:"icon_01",golang:"icon_03",react:"icon_04",python:"icon_05",default:"icon_02"},H=pa.filter(U=>(U.language||"default")===re.language).map(U=>({title:U.title,language:U.language||"default"}));H.slice(0,ws).forEach(({title:U,language:G},J)=>{const le=te[G]??te.default;a.add([a.sprite(le),de(()=>a.vec2(a.width()*.02,a.height()*(Rc+Sr*J))),a.opacity(1),a.z(55),"challengeIcon"]),a.add([a.text(U,{size:20}),de(()=>a.vec2(a.width()*.05,a.height()*(ys+Sr*J))),a.color(a.WHITE),a.opacity(1),"menuItem",{menuIndex:J}])}),re.mute?(O.opacity=0,z.opacity=1,S()):(O.opacity=1,z.opacity=0,S()),a.onKeyPress(["escape"],()=>{l.stop(),v(),a.go("game")});const Q=a.add([a.sprite("arrow_yellow"),a.pos(a.width()*.1,a.height()*(ys-Sr*.5)),a.opacity(1),a.animate()]);let ne=-1,Y=Q.pos.y;function ee(){const U=a.height()*(ys+Sr*ne);Q.pos=a.vec2(Q.pos.x,U),Q.animate("pos",[a.vec2(10,U),a.vec2(20,U)],{duration:.5,direction:"ping-pong"}),a.get("menuItem").forEach(G=>{G.menuIndex===ne?G.color=a.YELLOW:G.color=a.WHITE})}const W=()=>a.vec2(a.width(),a.height()),De=()=>a.width()>1080?a.vec2(450,0):a.vec2(a.width()*.3,0),He=a.vec2(50,103);a.setVolume(.5),a.add([a.rect(1920,1080,{radius:8}),a.color(a.rgb(53,53,71)),de(De),a.anchor("topleft"),a.opacity(.3),a.z(0)]);const Ie=a.add([Dc(W),de(De),a.anchor("topleft"),a.color(),a.rotate(0),a.scale(1),a.z(10),a.opacity(0)]),Ne=()=>a.vec2(He).sub(0,Bc*(xs*e)),Je=Ie.add([a.text("",{size:vs,lineSpacing:12,letterSpacing:2,transform:(U,G)=>({color:f(U,G)})}),a.pos(0,0),de(Ne)]),oe=vs+12,ce=(oe-vs)/2,Fe=10,Se=(U=!1)=>{const G=U?T:p,J=G.curLineCount-e*xs,le=G.curCharInLine*zc,me=J*oe+ce+Fe;return Ie.pos.add(Je.pos).add(le,me)},tt=a.add([a.text("_",{size:16}),de(()=>Se()),a.opacity(1),a.anchor("left"),a.color(255,255,255),a.z(10)]),Qe=a.add([a.text("_",{size:16}),de(()=>Se(!0)),a.opacity(re.practiceMode?0:1),a.anchor("left"),a.color(xa)]);ya(a,tt),re.practiceMode||ya(a,Qe),p.cursorPointer=tt,T.cursorPointer=Qe;function nt(){return E[r]?E[r]:(console.error("No dialogs found for the selected language"),E[0])}const Ce=U=>{if(a.debug.inspect!==!0)return;const G=U[p.cursorPos],J=U.substring(0,p.cursorPos),le=U.substring(p.cursorPos+1);console.log(`%c${J}%c${G}%c${le}`,"color: inherit;","color: #f00;","color: inherit;")};function he(){if(r++,r>0&&Mt++,c+=.05,Ue(),Mt===zs){Mt=zs,x(),v(),l.stop(),a.go("endgame");return}const U=ga,G=qc,J=4;if(Mt>0){const ct=Math.min(Mt,J)/J;s=U*Math.pow(G/U,ct)}else s=U;p.reset(),T.reset(),Q.pos=a.vec2(Q.pos.x,Y),nect.name===me)||As[0];const Ze=le.blocks;i.lineCount=Ze.length,qr=Ze.join(""),k(qr);const At=I(qr);gt=qr.replace(/▯/g," "),dn=At,Je.text=dn,p.line=gt.split(`
+`)[0],T.line=p.line,Gs=le.title,tt.updatePos(),Qe.updatePos()}function Ue(){l.speed=c}function N(){dn=gt.split("").map((U,G)=>St.includes(G)?U===`
+`?`${Mr[G]}
+`:Mr[G]:U).join(""),dn=I(dn),Je.text=dn}function V(U=!1){const G=U?T:p;G.cursorPointer&&(G.cursorPos++,G.curCharInLine++,G.cursorPointer.pos=Se(U),Ce(gt))}function X(U=!1){const G=U?T:p;G.cursorPointer&&(G.cursorPos--,G.curCharInLine--,G.cursorPointer.pos=Se(U),Ce(gt))}function ie(U=!1){var me;const G=U?T:p;if(!G.cursorPointer)return;G.curLineCount++,p.curLineCount>=xs*(e+1)&&e++,U||Cr++;const J=gt.split(`
+`)[G.curLineCount];if(!J)return;const le=((me=J.match(/^\s+/))==null?void 0:me[0].length)||0;G.line=J,G.cursorPos+=le,G.curIdentSize=le,G.curCharInLine=le,Je.updatePos(),G.cursorPointer.pos=Se(U),tt.updatePos(),Qe.updatePos()}function Me(){gt[T.cursorPos]===`
+`?(V(!0),ie(!0)):V(!0)}function be(){D.text=Bt.toFixed(1),Bt>0&&Yt>5&&($n=Yt&&Bt>1?Yt/5/(Bt/60):0,Or=Cr&&Bt>1?Cr/(Bt/60):0,pn=Pr>0?Yt/Pr*100:100,isNaN(pn)&&(pn=100),L.text=Math.round($n||0).toString())}const rt=60;let ln=new Array(rt).fill(0),un=Math.floor(a.time());function xr(){let U=Math.floor(a.time());if(U!==un){for(let J=un+1;J<=U;J++){let le=J%rt;ln[le]=0}un=U}let G=U%rt;ln[G]++}a.onKeyPress("capslock",()=>{Fc()}),a.onKeyPress(U=>{if((p.cursorPos>0?gt[p.cursorPos]:"")===`
+`)return;const J=gt[p.cursorPos],le=Oc(a);let me=U,Ze,At=!1;if(!(me==="backspace"||me==="enter"||me==="shift")){if(me.length===1)me=le?me.toUpperCase():me.toLowerCase(),Ze=me;else if(me==="space")me=" ",Ze="_";else return;if(Pr++,At=me===J,At)re.mute||a.play("code_sound"),Yt++,xr(),V();else{if(St.length>Ic)return Yr(a,re);St.push(p.cursorPos),Mr[p.cursorPos]=Ze,N(),V(),a.shake(2),re.mute||a.play("wrong_typing"),bs++}!kr&&(Yt>0||bs>0)&&(kr=!0)}}),a.onKeyPress("enter",()=>{const G=gt[p.cursorPos]===`
+`;if(St.length>0||!G)return Yr(a,re);if(p.curLineCount>=i.lineCount-1)return he();V(),ie()}),a.onKeyPressRepeat("backspace",()=>{if(!(p.cursorPos<=0)){if(p.curCharInLine===p.curIdentSize&&p.curLineCount>0)return a.shake(2);X(),St.includes(p.cursorPos)&&(St=St.filter(U=>U!==p.cursorPos)),N()}}),a.onResize(()=>{for(const U of Qt.resizableObjects)U.is("resizablePos")&&U.updatePos(),U.is("resizableRect")&&U.updateRectSize()}),he(),M(),ee()};a.scene("game",Vc);const Gc=({wpm:t,lpm:e,acc:n,bestWpm:r,blockNames:s,bestLvl:i})=>{const l=Ju(),c={wpm:t,lpm:e,acc:n,bestLvl:i,bestWpm:Math.max(r,(l==null?void 0:l.bestWpm)||0),blockNames:s,loadDate:new Date().toISOString()},h=encodeURIComponent(JSON.stringify(c)),u=60*60*24*30;document.cookie=`playerData=${h}; domain=silver.dev; path=/; max-age=${u}; SameSite=Lax`},Ju=()=>{const t="playerData=",e=document.cookie.split("; ").find(n=>n.startsWith(t));if(!e)return null;try{const n=e.substring(t.length);return JSON.parse(decodeURIComponent(n))}catch(n){return console.error("Error parsing playerData cookie:",n),null}};a.scene("endgame",()=>{let t=18,e=Xu,n=Gs,r=parseFloat((Hu||0).toFixed(0)),s=parseFloat((Wu||0).toFixed(0)),i=parseFloat((Yu||0).toFixed(0));parseFloat((Ku||0).toFixed(0));const l=Ju()||{},c=Math.max(parseFloat(l.bestWpm)||0,r);r=parseFloat((r||0).toFixed(0)),s=parseFloat((s||0).toFixed(0)),i=parseFloat((i||0).toFixed(0)),Gc({wpm:r,bestLvl:e,bestWpm:c,lpm:s,acc:i,blockNames:Hs}),Vs(re.mute),a.setVolume(1);const h=a.play("endgame");h.loop=!0,h.volume=0;const u=.05,g=.01,y=100;let m;function E(){if(clearInterval(m),re.mute)h.volume=0;else{let R=0;m=setInterval(()=>{Ra.vec2(a.width()/2,a.height()/2),T=a.width()*.1,f=a.height()*.2,w=(R,L)=>de(()=>p().add(a.vec2(R,L))),S=-T-45,C=f*.45,I=t+20,k=4*t*.6;a.add([a.sprite("bg2"),a.pos(p()),a.anchor("center"),a.z(10)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(1080,925,{radius:36}),a.pos(p()),a.anchor("center"),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(-T-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(+T-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.text("WPM",{size:32}),w(-T,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(r.toFixed(0),{size:42}),w(-T,f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("BEST",{size:t}),w(S,C),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text(c.toFixed(0),{size:t}),w(S+k+20,C),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text("ACC",{size:t}),w(S,C+I),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text(`${i.toFixed(0)}%`,{size:t}),w(S+k+20,C+I),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("SCORE",{size:32}),w(+T,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(`${e}/${zs}`,{size:42}),w(+T,+f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("Last challenge",{size:t}),w(+T,+f*.45),a.anchor("center"),a.color(a.WHITE),a.z(18)]),a.add([a.text(n,{size:t}),w(+T,+f*.4+50),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("ChallengeSet:",{size:t+2}),a.pos(a.width()*.45,a.height()*.74),a.anchor("left"),a.color(a.YELLOW),a.z(18)]);const x=t+15;Hs.forEach((R,L)=>{a.add([a.text(R,{size:t+2}),de(()=>a.vec2(a.width()*.45,a.height()*.78+L*x)),a.anchor("left"),a.color(a.WHITE),a.z(18)])});const v=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);re.mute?(v.opacity=0,M.opacity=1,E()):(v.opacity=1,M.opacity=0,E()),a.add([a.text("ESC to retry",{size:20}),de(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),onKeyPress("escape",()=>{e=0,n="",h.stop(),a.go("game")})});a.scene("about",()=>{const t=a.width()*.8,e=(a.width()-t)/2,n=a.height()*.4+20,r=18,s=8;a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.text(`Typing is one of the most under-rated coding skills.
+
+We type messages and code all day, and the speed at the which we do it increases our overall Actions Per Day, making us more productive.
+
+It is also a key predictor of interview performance. Slow coding gets an “instant no” in any competitive interview process, and interviewers almost never tell candidates this is why, because it is embarrasing and even conflictive.
+
+Many developers get publicly angry at the suggestion that typing speed is irrelevant. I say to you - do you want to be upset or do you want to pass interviews?
+
+WPM is a diagnostic and practice tool to write realistic without editor or AI-assistance, helping you polish your typing skills for any interview environment.
+
+To beat this game you will need to master touch-typing, and fix hand positioning and other bad habits that are preventing you from writing - and thinking - at your top speed.`,{size:r,width:t,align:"left",lineSpacing:s}),a.pos(e,n),a.anchor("topleft"),a.color(a.WHITE),a.z(30)]);const i="https://docs.silver.dev/interview-ready/library/guia-de-tipeo-para-devs#1-typingclub",l=n+17.5*(r+s)+10,c=a.add([a.text(i,{size:r,width:t,align:"left"}),a.pos(e,l),a.anchor("topleft"),a.color(a.YELLOW),a.area(),a.z(30)]);c.onClick(()=>window.open(i,"_blank")),c.onHover(()=>document.body.style.cursor="pointer",()=>document.body.style.cursor="default"),onKeyPress("escape",()=>{a.go("selection")});const h=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),u=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);re.mute?(h.opacity=0,u.opacity=1):(h.opacity=1,u.opacity=0),a.add([a.text("ESC to return",{size:20}),de(()=>a.vec2(a.width()*.5,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),a.add([a.text("Design by Leonel Orrut and Daniel Báez in KAPLAY ",{size:16}),de(()=>a.vec2(a.width()*.8,a.height()*.98)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)])});const Qu=document.createElement("style");Qu.innerHTML=`
+ :root {
+ --bg: hsl(0, 3.60%, 11.00%);
+ --gray1: #0a080a;
+ --gray2: #110b11;
+ }
+
+ body {
+ margin: 0;
+ overflow: hidden;
+ background: var(--bg);
+ position: relative;
+ }
+
+ body::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background:
+ linear-gradient(45deg, var(--gray1) 25%, transparent 25%),
+ linear-gradient(-45deg, var(--gray1) 25%, transparent 25%),
+ linear-gradient(45deg, transparent 75%, var(--gray1) 75%),
+ linear-gradient(-45deg, transparent 75%, var(--gray1) 75%),
+ rgba(0, 0, 0, 0.81);
+ background-size: 15px 15px, 15px 15px, 15px 15px, 15px 15px, cover;
+ background-position: 0 0, 0 7.5px, 7.5px -7.5px, -7.5px 0, center;
+ background-blend-mode: multiply;
+ backdrop-filter: blur(10px);
+ z-index: -1;
+ }
+ `;document.head.appendChild(Qu);a.go("selection");
+//# sourceMappingURL=index-D-Wfc2C4.js.map
diff --git a/website/public/sounds/code_sound.mp3 b/website/public/sounds/code_sound.mp3
new file mode 100644
index 0000000..89b4bd3
Binary files /dev/null and b/website/public/sounds/code_sound.mp3 differ
diff --git a/website/public/sounds/endgame.mp3 b/website/public/sounds/endgame.mp3
new file mode 100644
index 0000000..05c74d4
Binary files /dev/null and b/website/public/sounds/endgame.mp3 differ
diff --git a/website/public/sounds/videogame.mp3 b/website/public/sounds/videogame.mp3
new file mode 100644
index 0000000..95b3702
Binary files /dev/null and b/website/public/sounds/videogame.mp3 differ
diff --git a/website/public/sounds/wrong typing.mp3 b/website/public/sounds/wrong typing.mp3
new file mode 100644
index 0000000..aedc1fe
Binary files /dev/null and b/website/public/sounds/wrong typing.mp3 differ
diff --git a/website/public/sprites/BG_AWPM_IN_GAME.png b/website/public/sprites/BG_AWPM_IN_GAME.png
new file mode 100644
index 0000000..6bc7055
Binary files /dev/null and b/website/public/sprites/BG_AWPM_IN_GAME.png differ
diff --git a/website/public/sprites/BG_TIME_IN_GAME.png b/website/public/sprites/BG_TIME_IN_GAME.png
new file mode 100644
index 0000000..f091b9b
Binary files /dev/null and b/website/public/sprites/BG_TIME_IN_GAME.png differ
diff --git a/website/public/sprites/BG_WPM_IN_GAM.png b/website/public/sprites/BG_WPM_IN_GAM.png
new file mode 100644
index 0000000..d0db1e1
Binary files /dev/null and b/website/public/sprites/BG_WPM_IN_GAM.png differ
diff --git a/website/public/sprites/BG_WPM_IN_GAME.png b/website/public/sprites/BG_WPM_IN_GAME.png
new file mode 100644
index 0000000..736fb3f
Binary files /dev/null and b/website/public/sprites/BG_WPM_IN_GAME.png differ
diff --git a/website/public/sprites/SilverDev_logo.png b/website/public/sprites/SilverDev_logo.png
new file mode 100644
index 0000000..07ee1bb
Binary files /dev/null and b/website/public/sprites/SilverDev_logo.png differ
diff --git a/website/public/sprites/WPM.png b/website/public/sprites/WPM.png
new file mode 100644
index 0000000..3003abc
Binary files /dev/null and b/website/public/sprites/WPM.png differ
diff --git a/website/public/sprites/arrow_yellow.png b/website/public/sprites/arrow_yellow.png
new file mode 100644
index 0000000..57613fd
Binary files /dev/null and b/website/public/sprites/arrow_yellow.png differ
diff --git a/website/public/sprites/bg.png b/website/public/sprites/bg.png
new file mode 100644
index 0000000..4d1fcee
Binary files /dev/null and b/website/public/sprites/bg.png differ
diff --git a/website/public/sprites/bg2.png b/website/public/sprites/bg2.png
new file mode 100644
index 0000000..1ed02e7
Binary files /dev/null and b/website/public/sprites/bg2.png differ
diff --git a/website/public/sprites/bg4.png b/website/public/sprites/bg4.png
new file mode 100644
index 0000000..c9d4a06
Binary files /dev/null and b/website/public/sprites/bg4.png differ
diff --git a/website/public/sprites/icon_01.png b/website/public/sprites/icon_01.png
new file mode 100644
index 0000000..982fa72
Binary files /dev/null and b/website/public/sprites/icon_01.png differ
diff --git a/website/public/sprites/icon_02.png b/website/public/sprites/icon_02.png
new file mode 100644
index 0000000..59291ea
Binary files /dev/null and b/website/public/sprites/icon_02.png differ
diff --git a/website/public/sprites/icon_03.png b/website/public/sprites/icon_03.png
new file mode 100644
index 0000000..148b355
Binary files /dev/null and b/website/public/sprites/icon_03.png differ
diff --git a/website/public/sprites/icon_04.png b/website/public/sprites/icon_04.png
new file mode 100644
index 0000000..7de95c4
Binary files /dev/null and b/website/public/sprites/icon_04.png differ
diff --git a/website/public/sprites/icon_05.png b/website/public/sprites/icon_05.png
new file mode 100644
index 0000000..e8bc449
Binary files /dev/null and b/website/public/sprites/icon_05.png differ
diff --git a/website/public/sprites/muteOFF.png b/website/public/sprites/muteOFF.png
new file mode 100644
index 0000000..1c07bfa
Binary files /dev/null and b/website/public/sprites/muteOFF.png differ
diff --git a/website/public/sprites/muteON.png b/website/public/sprites/muteON.png
new file mode 100644
index 0000000..93bb0e4
Binary files /dev/null and b/website/public/sprites/muteON.png differ
diff --git a/website/public/style.css b/website/public/style.css
new file mode 100644
index 0000000..e69de29
diff --git a/website/src/styles/game.css b/website/src/styles/game.css
new file mode 100644
index 0000000..e69de29