import{a as ji,b as rt,c as F,d as w,e as ee,f,g as te,h as we,j as kt,l as Dt,m as st,n as k,o as T,p as A,q as Tt,r as Q,s as At,t as It,v as nt}from"../chunk-ZTIDN7WG.js";import{f as zt,g as tt}from"../chunk-2E7GFLIB.js";import{a as it,d as Lt}from"../chunk-36LXVOSM.js";import{b as yt,l as Mt,n as xt}from"../chunk-MLOHZPZR.js";import"../chunk-M27HZ2ZP.js";import{a as ft,b as wt,c as Je,f as Ke,i as et,k as h,l as me,n as Re,o as ge,p as fe,q as vt,r as L}from"../chunk-UYNCS6ZA.js";import{b as a,c as d,d as u,f as N}from"../chunk-5YIZAH6A.js";function dt(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let i=0;i<e.length;i++)if(e[i]!==t[i])return!1;return!0}function St(e,t,i){if(e===t)return!0;if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!i(e[r],t[r]))return!1;return!0}function pi(e,t,i=0){return(e%t+t+i)%t-i}function bt(e,t,i){return pi(e-t,i-t)+t}var Oi=class{constructor(e){this.model=e,this.catchingUp=!1,this.pendingFrame=!1,this.scheduler=new we(this.animFrame.bind(this)),this.catchUpMs=500,this.lastTimestamp=0}start(){this.catchingUp||(this.lastTimestamp=performance.now()),this.catchingUp=!0,this.pendingFrame=!0,this.scheduler.requestAnimFrame()}stop(){this.catchingUp=!1,this.scheduler.cancelAnimFrame()}animFrame(e){this.scheduler.requestAnimFrame();let t=(e-this.lastTimestamp)/this.catchUpMs;this.lastTimestamp=e,this.model.catchUpMove.set((async()=>{let i=await this.model.catchUpMove.get();if(i.move===null)return i;let r=i.amount+t;return r>=1?(this.pendingFrame=!0,this.stop(),this.model.timestampRequest.set("end"),{move:null,amount:0}):(this.pendingFrame=!1,{move:i.move,amount:r})})())}},ve,ct,ye,$t,Vi=($t=class{constructor(e,t){d(this,ve);d(this,ye,void 0);this.delegate=t,this.playing=!1,this.direction=1,this.lastDatestamp=0,this.scheduler=new we(this.animFrame.bind(this)),u(this,ye,new rt),this.model=e,this.lastTimestampPromise=N(this,ve,ct).call(this),this.model.playingInfo.addFreshListener(this.onPlayingProp.bind(this)),this.catchUpHelper=new Oi(this.model),this.model.catchUpMove.addFreshListener(this.onCatchUpMoveProp.bind(this))}async onPlayingProp(e){e.playing!==this.playing&&(e.playing?this.play(e):this.pause())}async onCatchUpMoveProp(e){let t=e.move!==null;t!==this.catchUpHelper.catchingUp&&(t?this.catchUpHelper.start():this.catchUpHelper.stop()),this.scheduler.requestAnimFrame()}jumpToStart(e){this.model.timestampRequest.set("start"),this.pause(),e?.flash&&this.delegate.flash()}jumpToEnd(e){this.model.timestampRequest.set("end"),this.pause(),e?.flash&&this.delegate.flash()}playPause(){this.playing?this.pause():this.play()}async play(e){let t=e?.direction??1,i=await this.model.coarseTimelineInfo.get();(e?.autoSkipToOtherEndIfStartingAtBoundary??!0)&&(t===1&&i.atEnd&&(this.model.timestampRequest.set("start"),this.delegate.flash()),t===-1&&i.atStart&&(this.model.timestampRequest.set("end"),this.delegate.flash())),this.model.playingInfo.set({playing:!0,direction:t,untilBoundary:e?.untilBoundary??"entire-timeline",loop:e?.loop??!1}),this.playing=!0,this.lastDatestamp=performance.now(),this.lastTimestampPromise=N(this,ve,ct).call(this),this.scheduler.requestAnimFrame()}pause(){this.playing=!1,this.scheduler.cancelAnimFrame(),this.model.playingInfo.set({playing:!1,untilBoundary:"entire-timeline"})}async animFrame(e){this.playing&&this.scheduler.requestAnimFrame();let t=this.lastDatestamp,i=await a(this,ye).queue(Promise.all([this.model.playingInfo.get(),this.lastTimestampPromise,this.model.timeRange.get(),this.model.tempoScale.get(),this.model.currentMoveInfo.get()])),[r,s,n,o,l]=i;if(!r.playing){this.playing=!1;return}let m=l.earliestEnd;(l.currentMoves.length===0||r.untilBoundary==="entire-timeline")&&(m=n.end);let c=l.latestStart;(l.currentMoves.length===0||r.untilBoundary==="entire-timeline")&&(c=n.start);let v=(e-t)*this.direction*o;v=Math.max(v,1),v*=r.direction;let p=s+v,x=null;p>=m?r.loop?p=bt(p,n.start,n.end):(p===n.end?x="end":p=m,this.playing=!1,this.model.playingInfo.set({playing:!1})):p<=c&&(r.loop?p=bt(p,n.start,n.end):(p===n.start?x="start":p=c,this.playing=!1,this.model.playingInfo.set({playing:!1}))),this.lastDatestamp=e,this.lastTimestampPromise=Promise.resolve(p),this.model.timestampRequest.set(x??p)}},ve=new WeakSet,ct=async function(){return(await this.model.detailedTimelineInfo.get()).timestamp},ye=new WeakMap,$t),Fi=class{constructor(e,t){this.model=e,this.animationController=new Vi(e,t)}jumpToStart(e){this.animationController.jumpToStart(e)}jumpToEnd(e){this.animationController.jumpToEnd(e)}togglePlay(e){typeof e>"u"&&this.animationController.playPause(),e?this.animationController.play():this.animationController.pause()}async visitTwizzleLink(){let e=document.createElement("a");e.href=await this.model.twizzleLink(),e.target="_blank",e.click()}},Ui={"bottom-row":!0,none:!0},Bi=class extends w{getDefaultValue(){return"auto"}},mi=new T(`
:host {
  width: 384px;
  height: 256px;
  display: grid;
}

.wrapper {
  width: 100%;
  height: 100%;
  display: grid;
  overflow: hidden;
}

.wrapper > * {
  width: 100%;
  height: 100%;
  overflow: hidden;
}

.wrapper.back-view-side-by-side {
  grid-template-columns: 1fr 1fr;
}

.wrapper.back-view-top-right {
  grid-template-columns: 3fr 1fr;
  grid-template-rows: 1fr 3fr;
}

.wrapper.back-view-top-right > :nth-child(1) {
  grid-row: 1 / 3;
  grid-column: 1 / 3;
}

.wrapper.back-view-top-right > :nth-child(2) {
  grid-row: 1 / 2;
  grid-column: 2 / 3;
}
`),je="http://www.w3.org/2000/svg",Ct="data-copy-id",Et=0;function Wi(){return Et+=1,`svg${Et.toString()}`}var qi={dim:{white:"#dddddd",orange:"#884400",limegreen:"#008800",red:"#660000","rgb(34, 102, 255)":"#000088",yellow:"#888800"},oriented:{white:"#44ddcc",orange:"#44ddcc",limegreen:"#44ddcc",red:"#44ddcc","rgb(34, 102, 255)":"#44ddcc",yellow:"#44ddcc"},ignored:{white:"#444444",orange:"#444444",limegreen:"#444444",red:"#444444","rgb(34, 102, 255)":"#444444",yellow:"#444444"},invisible:{white:"#00000000",orange:"#00000000",limegreen:"#00000000",red:"#00000000","rgb(34, 102, 255)":"#00000000",yellow:"#00000000"}},Hi=class{constructor(e,t,i){if(this.kpuzzle=e,this.originalColors={},this.gradients={},!t)throw new Error(`No SVG definition for puzzle type: ${e.name()}`);this.svgID=Wi(),this.wrapperElement=document.createElement("div"),this.wrapperElement.classList.add("svg-wrapper"),this.wrapperElement.innerHTML=t;let r=this.wrapperElement.querySelector("svg");if(!r)throw new Error("Could not get SVG element");if(this.svgElement=r,je!==r.namespaceURI)throw new Error("Unexpected XML namespace");r.style.maxWidth="100%",r.style.maxHeight="100%",this.gradientDefs=document.createElementNS(je,"defs"),r.insertBefore(this.gradientDefs,r.firstChild);for(let s in e.definition.orbits){let n=e.definition.orbits[s];for(let o=0;o<n.numPieces;o++)for(let l=0;l<n.numOrientations;l++){let m=this.elementID(s,o,l),c=this.elementByID(m),v=c.style.fill;i?(()=>{let p=i.orbits;if(!p)return;let x=p[s];if(!x)return;let z=x.pieces[o];if(!z)return;let D=z.facelets[l];if(!D)return;let V=typeof D=="string"?D:D?.mask,$e=qi[V];$e&&(v=$e[v])})():v=c.style.fill,this.originalColors[m]=v,this.gradients[m]=this.newGradient(m,v),this.gradientDefs.appendChild(this.gradients[m]),c.setAttribute("style",`fill: url(#grad-${this.svgID}-${m})`)}}for(let s of Array.from(r.querySelectorAll(`[${Ct}]`))){let n=s.getAttribute(Ct);s.setAttribute("style",`fill: url(#grad-${this.svgID}-${n})`)}}drawState(e,t,i){this.draw(e,t,i)}draw(e,t,i){let r=e.experimentalToTransformation(),s=t?.experimentalToTransformation();if(!r)throw new Error("Distinguishable pieces are not handled for SVG yet!");for(let n in r.kpuzzle.definition.orbits){let o=r.kpuzzle.definition.orbits[n],l=r.transformationData[n],m=s?s.transformationData[n]:null;for(let c=0;c<o.numPieces;c++)for(let v=0;v<o.numOrientations;v++){let p=this.elementID(n,c,v),x=this.elementID(n,l.permutation[c],(o.numOrientations-l.orientation[c]+v)%o.numOrientations),z=!1;if(m){let D=this.elementID(n,m.permutation[c],(o.numOrientations-m.orientation[c]+v)%o.numOrientations);x===D&&(z=!0),i=i||0;let V=100*(1-i*i*(2-i*i));this.gradients[p].children[0].setAttribute("stop-color",this.originalColors[x]),this.gradients[p].children[1].setAttribute("stop-color",this.originalColors[x]),this.gradients[p].children[1].setAttribute("offset",`${Math.max(V-5,0)}%`),this.gradients[p].children[2].setAttribute("offset",`${Math.max(V-5,0)}%`),this.gradients[p].children[3].setAttribute("offset",`${V}%`),this.gradients[p].children[4].setAttribute("offset",`${V}%`),this.gradients[p].children[4].setAttribute("stop-color",this.originalColors[D]),this.gradients[p].children[5].setAttribute("stop-color",this.originalColors[D])}else z=!0;z&&(this.gradients[p].children[0].setAttribute("stop-color",this.originalColors[x]),this.gradients[p].children[1].setAttribute("stop-color",this.originalColors[x]),this.gradients[p].children[1].setAttribute("offset","100%"),this.gradients[p].children[2].setAttribute("offset","100%"),this.gradients[p].children[3].setAttribute("offset","100%"),this.gradients[p].children[4].setAttribute("offset","100%"))}}}newGradient(e,t){let i=document.createElementNS(je,"radialGradient");i.setAttribute("id",`grad-${this.svgID}-${e}`),i.setAttribute("r","70.7107%");let r=[{offset:0,color:t},{offset:0,color:t},{offset:0,color:"black"},{offset:0,color:"black"},{offset:0,color:t},{offset:100,color:t}];for(let s of r){let n=document.createElementNS(je,"stop");n.setAttribute("offset",`${s.offset}%`),n.setAttribute("stop-color",s.color),n.setAttribute("stop-opacity","1"),i.appendChild(n)}return i}elementID(e,t,i){return`${e}-l${t}-o${i}`}elementByID(e){return this.wrapperElement.querySelector(`#${e}`)}},Qi=new T(`
:host {
  width: 384px;
  height: 256px;
  display: grid;
}

.wrapper {
  width: 100%;
  height: 100%;
  display: grid;
  overflow: hidden;
}

.svg-wrapper,
twisty-2d-svg,
svg {
  width: 100%;
  height: 100%;
  display: grid;
  min-height: 0;
}

svg {
  animation: fade-in 0.25s ease-in;
}

@keyframes fade-in {
  from { opacity: 0; }
  to { opacity: 1; }
}
`),Z,_,Jt,gi=(Jt=class extends A{constructor(t,i,r,s,n){super();d(this,Z,void 0);d(this,_,void 0);this.model=t,this.kpuzzle=i,this.svgSource=r,this.options=s,this.puzzleLoader=n,this.scheduler=new we(this.render.bind(this)),u(this,Z,null),u(this,_,new te),this.addCSS(Qi),this.resetSVG(),a(this,_).addListener(this.model.puzzleID,o=>{n?.id!==o&&this.disconnect()}),a(this,_).addListener(this.model.legacyPosition,this.onPositionChange.bind(this)),this.options?.experimentalStickeringMask&&this.experimentalSetStickeringMask(this.options.experimentalStickeringMask)}disconnect(){a(this,_).disconnect()}onPositionChange(t){try{if(t.movesInProgress.length>0){let i=t.movesInProgress[0].move,r=i;t.movesInProgress[0].direction===-1&&(r=i.invert());let s=t.state.applyMove(r);this.svgWrapper.draw(t.state,s,t.movesInProgress[0].fraction)}else this.svgWrapper.draw(t.state),u(this,Z,t)}catch(i){console.warn("Bad position (this doesn't necessarily mean something is wrong). Pre-emptively disconnecting:",this.puzzleLoader?.id,i),this.disconnect()}}scheduleRender(){this.scheduler.requestAnimFrame()}experimentalSetStickeringMask(t){this.resetSVG(t)}resetSVG(t){this.svgWrapper&&this.removeElement(this.svgWrapper.wrapperElement),this.kpuzzle&&(this.svgWrapper=new Hi(this.kpuzzle,this.svgSource,t),this.addElement(this.svgWrapper.wrapperElement),a(this,Z)&&this.onPositionChange(a(this,Z)))}render(){}},Z=new WeakMap,_=new WeakMap,Jt);k.define("twisty-2d-puzzle",gi);var Me,xe,Kt,Yi=(Kt=class{constructor(e,t,i,r){d(this,Me,new te);d(this,xe,null);this.model=e,this.schedulable=t,this.puzzleLoader=i,this.effectiveVisualization=r,this.twisty2DPuzzle(),a(this,Me).addListener(this.model.twistySceneModel.stickeringMask,async s=>{(await this.twisty2DPuzzle()).experimentalSetStickeringMask(s)})}disconnect(){a(this,Me).disconnect()}scheduleRender(){}async twisty2DPuzzle(){return a(this,xe)??u(this,xe,(async()=>{let e=this.effectiveVisualization==="experimental-2D-LL"?this.puzzleLoader.llSVG():this.puzzleLoader.svg();return new gi(this.model,await this.puzzleLoader.kpuzzle(),await e,{},this.puzzleLoader)})())}},Me=new WeakMap,xe=new WeakMap,Kt),ze,Le,U,ei,fi=(ei=class extends A{constructor(t,i){super();d(this,ze,new te);d(this,Le,void 0);d(this,U,null);this.model=t,this.effectiveVisualization=i}disconnect(){a(this,ze).disconnect()}async connectedCallback(){this.addCSS(mi),this.model&&a(this,ze).addListener(this.model.twistyPlayerModel.puzzleLoader,this.onPuzzleLoader.bind(this))}async scene(){return a(this,Le)??u(this,Le,(async()=>new(await Q).Scene)())}scheduleRender(){a(this,U)?.scheduleRender()}currentTwisty2DPuzzleWrapper(){return a(this,U)}async setCurrentTwisty2DPuzzleWrapper(t){let i=a(this,U);u(this,U,t),i?.disconnect();let r=t.twisty2DPuzzle();this.contentWrapper.textContent="",this.addElement(await r)}async onPuzzleLoader(t){a(this,U)?.disconnect();let i=new Yi(this.model.twistyPlayerModel,this,t,this.effectiveVisualization);this.setCurrentTwisty2DPuzzleWrapper(i)}},ze=new WeakMap,Le=new WeakMap,U=new WeakMap,ei);k.define("twisty-2d-scene-wrapper",fi);var B,ti,_e=(ti=class{constructor(e,t,i){d(this,B,null);this.elem=e,this.prefix=t,this.validSuffixes=i}clearValue(){a(this,B)&&this.elem.contentWrapper.classList.remove(a(this,B)),u(this,B,null)}setValue(e){if(!this.validSuffixes.includes(e))throw new Error(`Invalid suffix: ${e}`);let t=`${this.prefix}${e}`,i=a(this,B)!==t;return i&&(this.clearValue(),this.elem.contentWrapper.classList.add(t),u(this,B,t)),i}},B=new WeakMap,ti),ke,ii,wi=(ii=class{constructor(){d(this,ke,void 0);this.promise=new Promise((e,t)=>{u(this,ke,e),this.reject=t})}handleNewValue(e){a(this,ke).call(this,e)}},ke=new WeakMap,ii),I,De,ri,vi=(ri=class extends EventTarget{constructor(t,i,r,s){super();d(this,I,new te);d(this,De,null);this.model=t,this.schedulable=i,this.puzzleLoader=r,this.visualizationStrategy=s,this.twisty3DPuzzle(),a(this,I).addListener(this.model.puzzleLoader,n=>{this.puzzleLoader.id!==n.id&&this.disconnect()}),a(this,I).addListener(this.model.legacyPosition,async n=>{try{(await this.twisty3DPuzzle()).onPositionChange(n),this.scheduleRender()}catch{this.disconnect()}}),a(this,I).addListener(this.model.twistySceneModel.hintFacelet,async n=>{(await this.twisty3DPuzzle()).experimentalUpdateOptions({hintFacelets:n==="auto"?"floating":n}),this.scheduleRender()}),a(this,I).addListener(this.model.twistySceneModel.foundationDisplay,async n=>{(await this.twisty3DPuzzle()).experimentalUpdateOptions({showFoundation:n!=="none"}),this.scheduleRender()}),a(this,I).addListener(this.model.twistySceneModel.stickeringMask,async n=>{(await this.twisty3DPuzzle()).setStickeringMask(n),this.scheduleRender()}),a(this,I).addListener(this.model.twistySceneModel.faceletScale,async n=>{(await this.twisty3DPuzzle()).experimentalUpdateOptions({faceletScale:n}),this.scheduleRender()}),a(this,I).addMultiListener3([this.model.twistySceneModel.stickeringMask,this.model.twistySceneModel.foundationStickerSprite,this.model.twistySceneModel.hintStickerSprite],async n=>{"experimentalUpdateTexture"in await this.twisty3DPuzzle()&&((await this.twisty3DPuzzle()).experimentalUpdateTexture(n[0].specialBehaviour==="picture",n[1],n[2]),this.scheduleRender())})}disconnect(){a(this,I).disconnect()}scheduleRender(){this.schedulable.scheduleRender(),this.dispatchEvent(new CustomEvent("render-scheduled"))}async twisty3DPuzzle(){return a(this,De)??u(this,De,(async()=>{let t=Tt();if(this.puzzleLoader.id==="3x3x3"&&this.visualizationStrategy==="Cube3D"){let[i,r,s,n]=await Promise.all([this.model.twistySceneModel.foundationStickerSprite.get(),this.model.twistySceneModel.hintStickerSprite.get(),this.model.twistySceneModel.stickeringMask.get(),this.model.twistySceneModel.initialHintFaceletsAnimation.get()]);return(await t).cube3DShim(()=>this.schedulable.scheduleRender(),{foundationSprite:i,hintSprite:r,experimentalStickeringMask:s,initialHintFaceletsAnimation:n})}else{let[i,r,s,n]=await Promise.all([this.model.twistySceneModel.hintFacelet.get(),this.model.twistySceneModel.foundationStickerSprite.get(),this.model.twistySceneModel.hintStickerSprite.get(),this.model.twistySceneModel.faceletScale.get()]),o=(await t).pg3dShim(()=>this.schedulable.scheduleRender(),this.puzzleLoader,i==="auto"?"floating":i,n);return o.then(l=>l.experimentalUpdateTexture(!0,r??void 0,s??void 0)),o}})())}async raycastMove(t,i){let r=await this.twisty3DPuzzle();if(!("experimentalGetControlTargets"in r)){console.info("not PG3D! skipping raycast");return}let s=r.experimentalGetControlTargets(),[n,o]=await Promise.all([t,this.model.twistySceneModel.movePressCancelOptions.get()]),l=n.intersectObjects(s);if(l.length>0){let m=r.getClosestMoveToAxis(l[0].point,i);m?this.model.experimentalAddMove(m.move,{cancel:o}):console.info("Skipping move!")}}},I=new WeakMap,De=new WeakMap,ri),We,se,P,Te,X,R,Ae,qe,si,ut=(si=class extends A{constructor(t){super();d(this,We,new _e(this,"back-view-",["auto","none","side-by-side","top-right"]));d(this,se,new te);d(this,P,null);d(this,Te,void 0);d(this,X,new Set);d(this,R,null);d(this,Ae,new wi);d(this,qe,new rt);this.model=t}disconnect(){a(this,se).disconnect()}async connectedCallback(){this.addCSS(mi);let t=new nt(this.model,this);this.addVantage(t),this.model&&(a(this,se).addMultiListener([this.model.puzzleLoader,this.model.visualizationStrategy],this.onPuzzle.bind(this)),a(this,se).addListener(this.model.backView,this.onBackView.bind(this))),this.scheduleRender()}setBackView(t){let i=["side-by-side","top-right"].includes(t),r=a(this,P)!==null;a(this,We).setValue(t),i?r||(u(this,P,new nt(this.model,this,{backView:!0})),this.addVantage(a(this,P)),this.scheduleRender()):a(this,P)&&(this.removeVantage(a(this,P)),u(this,P,null))}onBackView(t){this.setBackView(t)}async onPress(t){let i=a(this,R);if(!i){console.info("no wrapper; skipping scene wrapper press!");return}let r=(async()=>{let[s,n]=await Promise.all([t.detail.cameraPromise,Q]),o=new n.Raycaster,l=new(await Q).Vector2(t.detail.pressInfo.normalizedX,t.detail.pressInfo.normalizedY);return o.setFromCamera(l,s),o})();i.raycastMove(r,{invert:!t.detail.pressInfo.rightClick,depth:t.detail.pressInfo.keys.ctrlOrMetaKey?"rotation":t.detail.pressInfo.keys.shiftKey?"secondSlice":"none"})}async scene(){return a(this,Te)??u(this,Te,(async()=>new(await Q).Scene)())}addVantage(t){t.addEventListener("press",this.onPress.bind(this)),a(this,X).add(t),this.contentWrapper.appendChild(t)}removeVantage(t){a(this,X).delete(t),t.remove(),t.disconnect(),a(this,R)?.disconnect()}experimentalVantages(){return a(this,X).values()}scheduleRender(){for(let t of a(this,X))t.scheduleRender()}async setCurrentTwisty3DPuzzleWrapper(t,i){let r=a(this,R);try{u(this,R,i),r?.disconnect(),t.add(await i.twisty3DPuzzle())}finally{r&&t.remove(await r.twisty3DPuzzle())}a(this,Ae).handleNewValue(i)}async experimentalTwisty3DPuzzleWrapper(){return a(this,R)||a(this,Ae).promise}async onPuzzle(t){if(t[1]==="2D")return;a(this,R)?.disconnect();let[i,r]=await a(this,qe).queue(Promise.all([this.scene(),new vi(this.model,this,t[0],t[1])]));this.setCurrentTwisty3DPuzzleWrapper(i,r)}},We=new WeakMap,se=new WeakMap,P=new WeakMap,Te=new WeakMap,X=new WeakMap,R=new WeakMap,Ae=new WeakMap,qe=new WeakMap,si);k.define("twisty-3d-scene-wrapper",ut);var Gi=new T(`
:host {
  width: 384px;
  height: 24px;
  display: grid;
}

.wrapper {
  width: 100%;
  height: 100%;
  display: grid;
  overflow: hidden;
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
}

.wrapper {
  grid-auto-flow: column;
}

.viewer-link-none .twizzle-link-button {
  display: none;
}

.wrapper twisty-button,
.wrapper twisty-control-button {
  width: inherit;
  height: inherit;
}
`),Zi=new T(`
:host:not([hidden]) {
  display: grid;
}

:host {
  width: 48px;
  height: 24px;
}

.wrapper {
  width: 100%;
  height: 100%;
}

button {
  width: 100%;
  height: 100%;
  border: none;
  
  background-position: center;
  background-repeat: no-repeat;
  background-size: contain;

  background-color: rgba(196, 196, 196, 0.75);
}

button:enabled {
  background-color: rgba(196, 196, 196, 0.75)
}

.dark-mode button:enabled {
  background-color: #88888888;
}

button:disabled {
  background-color: rgba(0, 0, 0, 0.4);
  opacity: 0.25;
  pointer-events: none;
}

.dark-mode button:disabled {
  background-color: #ffffff44;
}

button:enabled:hover {
  background-color: rgba(255, 255, 255, 0.75);
  box-shadow: 0 0 1em rgba(0, 0, 0, 0.25);
  cursor: pointer;
}

/* TODO: fullscreen icons have too much padding?? */
.svg-skip-to-start button,
button.svg-skip-to-start {
  background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNTg0IiBoZWlnaHQ9IjM1ODQiIHZpZXdCb3g9IjAgMCAzNTg0IDM1ODQiPjxwYXRoIGQ9Ik0yNjQzIDEwMzdxMTktMTkgMzItMTN0MTMgMzJ2MTQ3MnEwIDI2LTEzIDMydC0zMi0xM2wtNzEwLTcxMHEtOS05LTEzLTE5djcxMHEwIDI2LTEzIDMydC0zMi0xM2wtNzEwLTcxMHEtOS05LTEzLTE5djY3OHEwIDI2LTE5IDQ1dC00NSAxOUg5NjBxLTI2IDAtNDUtMTl0LTE5LTQ1VjEwODhxMC0yNiAxOS00NXQ0NS0xOWgxMjhxMjYgMCA0NSAxOXQxOSA0NXY2NzhxNC0xMSAxMy0xOWw3MTAtNzEwcTE5LTE5IDMyLTEzdDEzIDMydjcxMHE0LTExIDEzLTE5eiIvPjwvc3ZnPg==");
}

.svg-skip-to-end button,
button.svg-skip-to-end {
  background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNTg0IiBoZWlnaHQ9IjM1ODQiIHZpZXdCb3g9IjAgMCAzNTg0IDM1ODQiPjxwYXRoIGQ9Ik05NDEgMjU0N3EtMTkgMTktMzIgMTN0LTEzLTMyVjEwNTZxMC0yNiAxMy0zMnQzMiAxM2w3MTAgNzEwcTggOCAxMyAxOXYtNzEwcTAtMjYgMTMtMzJ0MzIgMTNsNzEwIDcxMHE4IDggMTMgMTl2LTY3OHEwLTI2IDE5LTQ1dDQ1LTE5aDEyOHEyNiAwIDQ1IDE5dDE5IDQ1djE0MDhxMCAyNi0xOSA0NXQtNDUgMTloLTEyOHEtMjYgMC00NS0xOXQtMTktNDV2LTY3OHEtNSAxMC0xMyAxOWwtNzEwIDcxMHEtMTkgMTktMzIgMTN0LTEzLTMydi03MTBxLTUgMTAtMTMgMTl6Ii8+PC9zdmc+");
}

.svg-step-forward button,
button.svg-step-forward {
  background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNTg0IiBoZWlnaHQ9IjM1ODQiIHZpZXdCb3g9IjAgMCAzNTg0IDM1ODQiPjxwYXRoIGQ9Ik0yNjg4IDE1NjhxMCAyNi0xOSA0NWwtNTEyIDUxMnEtMTkgMTktNDUgMTl0LTQ1LTE5cS0xOS0xOS0xOS00NXYtMjU2aC0yMjRxLTk4IDAtMTc1LjUgNnQtMTU0IDIxLjVxLTc2LjUgMTUuNS0xMzMgNDIuNXQtMTA1LjUgNjkuNXEtNDkgNDIuNS04MCAxMDF0LTQ4LjUgMTM4LjVxLTE3LjUgODAtMTcuNSAxODEgMCA1NSA1IDEyMyAwIDYgMi41IDIzLjV0Mi41IDI2LjVxMCAxNS04LjUgMjV0LTIzLjUgMTBxLTE2IDAtMjgtMTctNy05LTEzLTIydC0xMy41LTMwcS03LjUtMTctMTAuNS0yNC0xMjctMjg1LTEyNy00NTEgMC0xOTkgNTMtMzMzIDE2Mi00MDMgODc1LTQwM2gyMjR2LTI1NnEwLTI2IDE5LTQ1dDQ1LTE5cTI2IDAgNDUgMTlsNTEyIDUxMnExOSAxOSAxOSA0NXoiLz48L3N2Zz4=");
}

.svg-step-backward button,
button.svg-step-backward {
  background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNTg0IiBoZWlnaHQ9IjM1ODQiIHZpZXdCb3g9IjAgMCAzNTg0IDM1ODQiPjxwYXRoIGQ9Ik0yNjg4IDIwNDhxMCAxNjYtMTI3IDQ1MS0zIDctMTAuNSAyNHQtMTMuNSAzMHEtNiAxMy0xMyAyMi0xMiAxNy0yOCAxNy0xNSAwLTIzLjUtMTB0LTguNS0yNXEwLTkgMi41LTI2LjV0Mi41LTIzLjVxNS02OCA1LTEyMyAwLTEwMS0xNy41LTE4MXQtNDguNS0xMzguNXEtMzEtNTguNS04MC0xMDF0LTEwNS41LTY5LjVxLTU2LjUtMjctMTMzLTQyLjV0LTE1NC0yMS41cS03Ny41LTYtMTc1LjUtNmgtMjI0djI1NnEwIDI2LTE5IDQ1dC00NSAxOXEtMjYgMC00NS0xOWwtNTEyLTUxMnEtMTktMTktMTktNDV0MTktNDVsNTEyLTUxMnExOS0xOSA0NS0xOXQ0NSAxOXExOSAxOSAxOSA0NXYyNTZoMjI0cTcxMyAwIDg3NSA0MDMgNTMgMTM0IDUzIDMzM3oiLz48L3N2Zz4=");
}

.svg-pause button,
button.svg-pause {
  background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNTg0IiBoZWlnaHQ9IjM1ODQiIHZpZXdCb3g9IjAgMCAzNTg0IDM1ODQiPjxwYXRoIGQ9Ik0yNTYwIDEwODh2MTQwOHEwIDI2LTE5IDQ1dC00NSAxOWgtNTEycS0yNiAwLTQ1LTE5dC0xOS00NVYxMDg4cTAtMjYgMTktNDV0NDUtMTloNTEycTI2IDAgNDUgMTl0MTkgNDV6bS04OTYgMHYxNDA4cTAgMjYtMTkgNDV0LTQ1IDE5aC01MTJxLTI2IDAtNDUtMTl0LTE5LTQ1VjEwODhxMC0yNiAxOS00NXQ0NS0xOWg1MTJxMjYgMCA0NSAxOXQxOSA0NXoiLz48L3N2Zz4=");
}

.svg-play button,
button.svg-play {
  background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNTg0IiBoZWlnaHQ9IjM1ODQiIHZpZXdCb3g9IjAgMCAzNTg0IDM1ODQiPjxwYXRoIGQ9Ik0yNDcyLjUgMTgyM2wtMTMyOCA3MzhxLTIzIDEzLTM5LjUgM3QtMTYuNS0zNlYxMDU2cTAtMjYgMTYuNS0zNnQzOS41IDNsMTMyOCA3MzhxMjMgMTMgMjMgMzF0LTIzIDMxeiIvPjwvc3ZnPg==");
}

.svg-enter-fullscreen button,
button.svg-enter-fullscreen {
  background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjgiIHZpZXdCb3g9IjAgMCAyOCAyOCIgd2lkdGg9IjI4Ij48cGF0aCBkPSJNMiAyaDI0djI0SDJ6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTkgMTZIN3Y1aDV2LTJIOXYtM3ptLTItNGgyVjloM1Y3SDd2NXptMTIgN2gtM3YyaDV2LTVoLTJ2M3pNMTYgN3YyaDN2M2gyVjdoLTV6Ii8+PC9zdmc+");
}

.svg-exit-fullscreen button,
button.svg-exit-fullscreen {
  background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjgiIHZpZXdCb3g9IjAgMCAyOCAyOCIgd2lkdGg9IjI4Ij48cGF0aCBkPSJNMiAyaDI0djI0SDJ6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTcgMThoM3YzaDJ2LTVIN3Yyem0zLThIN3YyaDVWN2gtMnYzem02IDExaDJ2LTNoM3YtMmgtNXY1em0yLTExVjdoLTJ2NWg1di0yaC0zeiIvPjwvc3ZnPg==");
}

.svg-twizzle-tw button,
button.svg-twizzle-tw {
  background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODY0IiBoZWlnaHQ9IjYwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMzk3LjU4MSAxNTEuMTh2NTcuMDg0aC04OS43MDN2MjQwLjM1MmgtNjYuOTU1VjIwOC4yNjRIMTUxLjIydi01Ny4wODNoMjQ2LjM2MXptNTQuMzEgNzEuNjc3bDcuNTEyIDMzLjY5MmMyLjcxOCAxMi4xNiA1LjU4IDI0LjY4IDguNTg0IDM3LjU1NWEyMTgwLjc3NSAyMTgwLjc3NSAwIDAwOS40NDIgMzguODQzIDEyNjYuMyAxMjY2LjMgMCAwMDEwLjA4NiAzNy41NTVjMy43Mi0xMi41OSA3LjM2OC0yNS40NjYgMTAuOTQ1LTM4LjYyOCAzLjU3Ni0xMy4xNjIgNy4wMS0yNi4xMSAxMC4zLTM4Ljg0M2w1Ljc2OS0yMi40NTZjMS4yNDgtNC44ODcgMi40NzItOS43MDUgMy42NzQtMTQuNDU1IDMuMDA0LTExLjg3NSA1LjY1MS0yMi45NjIgNy45NC0zMy4yNjNoNDYuMzU0bDIuMzg0IDEwLjU2M2EyMDAwLjc3IDIwMDAuNzcgMCAwMDMuOTM1IDE2LjgyOGw2LjcxMSAyNy43MWMxLjIxMyA0Ljk1NiAyLjQ1IDkuOTggMy43MDkgMTUuMDczYTMxMTkuNzc3IDMxMTkuNzc3IDAgMDA5Ljg3MSAzOC44NDMgMTI0OS4yMjcgMTI0OS4yMjcgMCAwMDEwLjczIDM4LjYyOCAxOTA3LjYwNSAxOTA3LjYwNSAwIDAwMTAuMzAxLTM3LjU1NSAxMzk3Ljk0IDEzOTcuOTQgMCAwMDkuNjU3LTM4Ljg0M2w0LjQtMTkuMDQ2Yy43MTUtMy4xMyAxLjQyMS02LjIzNiAyLjExOC05LjMyMWw5LjU3Ny00Mi44OGg2Ni41MjZhMjk4OC43MTggMjk4OC43MTggMCAwMS0xOS41MjkgNjYuMzExbC01LjcyOCAxOC40ODJhMzIzNy40NiAzMjM3LjQ2IDAgMDEtMTQuMDE1IDQzLjc1MmMtNi40MzggMTkuNi0xMi43MzMgMzcuNjk4LTE4Ljg4NSA1NC4yOTRsLTMuMzA2IDguODI1Yy00Ljg4NCAxMi44OTgtOS40MzMgMjQuMjYzLTEzLjY0NyAzNC4wOTVoLTQ5Ljc4N2E4NDE3LjI4OSA4NDE3LjI4OSAwIDAxLTIxLjAzMS02NC44MDkgMTI4OC42ODYgMTI4OC42ODYgMCAwMS0xOC44ODUtNjQuODEgMTk3Mi40NDQgMTk3Mi40NDQgMCAwMS0xOC4yNCA2NC44MSAyNTc5LjQxMiAyNTc5LjQxMiAwIDAxLTIwLjM4OCA2NC44MWgtNDkuNzg3Yy00LjY4Mi0xMC45MjYtOS43Mi0yMy43NDMtMTUuMTEtMzguNDUxbC0xLjYyOS00LjQ3Yy01LjI1OC0xNC41MjEtMTAuNjgtMzAuMTkyLTE2LjI2Ni00Ny4wMTRsLTIuNDA0LTcuMjhjLTYuNDM4LTE5LjYtMTMuMDItNDAuMzQ0LTE5Ljc0My02Mi4yMzRhMjk4OC43MDcgMjk4OC43MDcgMCAwMS0xOS41MjktNjYuMzExaDY3LjM4NXoiIGZpbGw9IiM0Mjg1RjQiIGZpbGwtcnVsZT0ibm9uemVybyIvPjwvc3ZnPg==");
}
`),K=typeof document>"u"?null:document,_i=K?.fullscreenEnabled||!!K?.webkitFullscreenEnabled;function Xi(){return document.exitFullscreen?document.exitFullscreen():document.webkitExitFullscreen()}function Nt(){return document.fullscreenElement?document.fullscreenElement:document.webkitFullscreenElement??null}function $i(e){return e.requestFullscreen?e.requestFullscreen():e.webkitRequestFullscreen()}var Ji=["skip-to-start","skip-to-end","step-forward","step-backward","pause","play","enter-fullscreen","exit-fullscreen","twizzle-tw"],Ki=class extends f{derive(e){return{fullscreen:{enabled:_i,icon:document.fullscreenElement===null?"enter-fullscreen":"exit-fullscreen",title:"Enter fullscreen"},"jump-to-start":{enabled:!e.coarseTimelineInfo.atStart,icon:"skip-to-start",title:"Restart"},"play-step-backwards":{enabled:!e.coarseTimelineInfo.atStart,icon:"step-backward",title:"Step backward"},"play-pause":{enabled:!(e.coarseTimelineInfo.atStart&&e.coarseTimelineInfo.atEnd),icon:e.coarseTimelineInfo.playing?"pause":"play",title:e.coarseTimelineInfo.playing?"Pause":"Play"},"play-step":{enabled:!e.coarseTimelineInfo.atEnd,icon:"step-forward",title:"Step forward"},"jump-to-end":{enabled:!e.coarseTimelineInfo.atEnd,icon:"skip-to-end",title:"Skip to End"},"twizzle-link":{enabled:!0,icon:"twizzle-tw",title:"View at Twizzle",hidden:e.viewerLink==="none"}}}},Pt={fullscreen:!0,"jump-to-start":!0,"play-step-backwards":!0,"play-pause":!0,"play-step":!0,"jump-to-end":!0,"twizzle-link":!0},He,Mi,ni,yi=(ni=class extends A{constructor(t,i,r){super();d(this,He);this.model=t,this.controller=i,this.defaultFullscreenElement=r,this.buttons=null}connectedCallback(){this.addCSS(Gi);let t={};for(let i in Pt){let r=new xi;t[i]=r,r.htmlButton.addEventListener("click",()=>N(this,He,Mi).call(this,i)),this.addElement(r)}this.buttons=t,this.model?.buttonAppearance.addFreshListener(this.update.bind(this)),this.model?.twistySceneModel.darkMode.addFreshListener(this.updateDarkMode.bind(this))}async onFullscreenButton(){if(!this.defaultFullscreenElement)throw new Error("Attempted to go fullscreen without an element.");if(Nt()===this.defaultFullscreenElement)Xi();else{this.buttons?.fullscreen.setIcon("exit-fullscreen"),$i(await this.model?.twistySceneModel.fullscreenElement.get()??this.defaultFullscreenElement);let t=()=>{Nt()!==this.defaultFullscreenElement&&(this.buttons?.fullscreen.setIcon("enter-fullscreen"),window.removeEventListener("fullscreenchange",t))};window.addEventListener("fullscreenchange",t)}}async update(t){for(let i in Pt){let r=this.buttons[i],s=t[i];r.htmlButton.disabled=!s.enabled,r.htmlButton.title=s.title,r.setIcon(s.icon),r.hidden=!!s.hidden}}updateDarkMode(t){for(let i of Object.values(this.buttons??{}))i.updateDarkMode(t)}},He=new WeakSet,Mi=function(t){switch(t){case"fullscreen":{this.onFullscreenButton();break}case"jump-to-start":{this.controller?.jumpToStart({flash:!0});break}case"play-step-backwards":{this.controller?.animationController.play({direction:-1,untilBoundary:"move"});break}case"play-pause":{this.controller?.togglePlay();break}case"play-step":{this.controller?.animationController.play({direction:1,untilBoundary:"move"});break}case"jump-to-end":{this.controller?.jumpToEnd({flash:!0});break}case"twizzle-link":{this.controller?.visitTwizzleLink();break}default:throw new Error("Missing command")}},ni);k.define("twisty-buttons",yi);var Ie,ai,xi=(ai=class extends A{constructor(){super(...arguments);d(this,Ie,void 0);this.htmlButton=document.createElement("button"),u(this,Ie,new _e(this,"svg-",Ji))}updateDarkMode(t){this.contentWrapper.classList.toggle("dark-mode",t==="dark")}connectedCallback(){this.addCSS(Zi),this.addElement(this.htmlButton)}setIcon(t){a(this,Ie).setValue(t)}},Ie=new WeakMap,ai);k.define("twisty-button",xi);var er=new T(`
:host {
  width: 384px;
  height: 16px;
  display: grid;
}

.wrapper {
  width: 100%;
  height: 100%;
  display: grid;
  overflow: hidden;
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  background: rgba(196, 196, 196, 0.75);
}

input:not(:disabled) {
  cursor: ew-resize;
}

.wrapper.dark-mode {
  background: #666666;
}
`),tr=!1,Ue=!1;K?.addEventListener("mousedown",function(e){e.which&&(Ue=!0)},!0);K?.addEventListener("mouseup",function(e){e.which&&(Ue=!1)},!0);var ht=0,Ve=0;K?.addEventListener("mousedown",()=>{Ve++},!1);K?.addEventListener("mousemove",zi,!1);K?.addEventListener("mouseenter",zi,!1);function zi(e){ht=e.pageY}var Rt=0,jt=0,at=!1,ot=0,Se,oi,Li=(oi=class extends A{constructor(t,i){super();d(this,Se,null);this.model=t,this.controller=i}async onDetailedTimelineInfo(t){let i=await this.inputElem();i.min=t.timeRange.start.toString(),i.max=t.timeRange.end.toString(),i.disabled=i.min===i.max,i.value=t.timestamp.toString()}async connectedCallback(){this.addCSS(er),this.addElement(await this.inputElem()),this.model?.twistySceneModel.darkMode.addFreshListener(this.updateDarkMode.bind(this))}updateDarkMode(t){this.contentWrapper.classList.toggle("dark-mode",t==="dark")}async inputElem(){return a(this,Se)??u(this,Se,(async()=>{let t=document.createElement("input");return t.type="range",t.disabled=!0,this.model?.detailedTimelineInfo.addFreshListener(this.onDetailedTimelineInfo.bind(this)),t.addEventListener("input",this.onInput.bind(this)),t.addEventListener("keydown",this.onKeypress.bind(this)),t})())}async onInput(t){if(at)return;let i=await this.inputElem();await this.slowDown(t,i);let r=parseInt(i.value);this.model?.playingInfo.set({playing:!1}),this.model?.timestampRequest.set(r)}onKeypress(t){switch(t.key){case"ArrowLeft":case"ArrowRight":{this.controller?.animationController.play({direction:t.key==="ArrowLeft"?-1:1,untilBoundary:"move"}),t.preventDefault();break}case" ":{this.controller?.togglePlay(),t.preventDefault();break}}}async slowDown(t,i){if(!!tr&&Ue){let r=i.getBoundingClientRect(),s=r.top+r.height/2;console.log(s,t,ht,Ue);let n=Math.abs(s-ht),o=1;n>64&&(o=Math.max(Math.pow(2,-(n-64)/64),1/32));let l=parseInt(i.value);if(console.log("cl",ot,Ve,l),ot===Ve){let m=(l-jt)*o;console.log("delta",m,n),at=!0;let c=l;c=Rt+m*o+(l-Rt)*Math.min(1,Math.pow(1/2,n*n/64)),i.value=c.toString(),console.log(o),at=!1,this.contentWrapper.style.opacity=o.toString()}else ot=Ve;jt=l}}},Se=new WeakMap,oi);k.define("twisty-scrubber",Li);var Ot=null;async function Vt(e,t){let[{PerspectiveCamera:i,Scene:r},s,n,o,l,m,c]=await Promise.all([Q,await e.puzzleLoader.get(),await e.visualizationStrategy.get(),await e.twistySceneModel.stickeringRequest.get(),await e.twistySceneModel.stickeringMaskRequest.get(),await e.legacyPosition.get(),await e.twistySceneModel.orbitCoordinates.get()]),v=t?.width??2048,p=t?.height??2048,x=v/p,z=Ot??(Ot=await(async()=>new i(20,x,.1,20))()),D=new r,V=new vi(e,{scheduleRender:()=>{}},s,n);D.add(await V.twisty3DPuzzle()),await It(z,c);let gt=(await At(v,p,D,z)).toDataURL(),Pi=await ki(e);return{dataURL:gt,download:async Ri=>{Di(gt,Ri??Pi)}}}async function ki(e){let[t,i]=await Promise.all([e.puzzleID.get(),e.alg.get()]);return`[${t}]${i.alg.experimentalNumChildAlgNodes()===0?"":` ${i.alg.toString()}`}`}function Di(e,t,i="png"){let r=document.createElement("a");r.href=e,r.download=`${t}.${i}`,r.click()}var ir=new T(`
:host {
  width: 384px;
  height: 256px;
  display: grid;

  -webkit-user-select: none;
  user-select: none;
}

.wrapper {
  display: grid;
  overflow: hidden;
  contain: size;
  grid-template-rows: 7fr minmax(1.5em, 0.5fr) minmax(2em, 1fr);
}

.wrapper > * {
  width: inherit;
  height: inherit;
  overflow: hidden;
}

.wrapper.controls-none {
  grid-template-rows: 7fr;
}

.wrapper.controls-none twisty-scrubber,
.wrapper.controls-none twisty-control-button-panel ,
.wrapper.controls-none twisty-scrubber,
.wrapper.controls-none twisty-buttons {
  display: none;
}

twisty-scrubber {
  background: rgba(196, 196, 196, 0.5);
}

.wrapper.checkered,
.wrapper.checkered-transparent {
  background-color: #EAEAEA;
  background-image: linear-gradient(45deg, #DDD 25%, transparent 25%, transparent 75%, #DDD 75%, #DDD),
    linear-gradient(45deg, #DDD 25%, transparent 25%, transparent 75%, #DDD 75%, #DDD);
  background-size: 32px 32px;
  background-position: 0 0, 16px 16px;
}

.wrapper.checkered-transparent {
  background-color: #F4F4F4;
  background-image: linear-gradient(45deg, #DDDDDD88 25%, transparent 25%, transparent 75%, #DDDDDD88 75%, #DDDDDD88),
    linear-gradient(45deg, #DDDDDD88 25%, transparent 25%, transparent 75%, #DDDDDD88 75%, #DDDDDD88);
}

.wrapper.dark-mode {
  background-color: #444;
  background-image: linear-gradient(45deg, #DDDDDD0b 25%, transparent 25%, transparent 75%, #DDDDDD0b 75%, #DDDDDD0b),
    linear-gradient(45deg, #DDDDDD0b 25%, transparent 25%, transparent 75%, #DDDDDD0b 75%, #DDDDDD0b);
}

.visualization-wrapper > * {
  width: 100%;
  height: 100%;
}

.error-elem {
  width: 100%;
  height: 100%;
  display: none;
  place-content: center;
  font-family: sans-serif;
  box-shadow: inset 0 0 2em rgb(255, 0, 0);
  color: red;
  text-shadow: 0 0 0.2em white;
  background: rgba(255, 255, 255, 0.25);
}

.wrapper.error .visualization-wrapper {
  display: none;
}

.wrapper.error .error-elem {
  display: grid;
}
`),Ft=class extends w{getDefaultValue(){return null}},pt=class extends F{getDefaultValue(){return null}derive(e){return typeof e=="string"?new URL(e,location.href):e}},pe=class{constructor(e){this.warnings=Object.freeze(e?.warnings??[]),this.errors=Object.freeze(e?.errors??[]),Object.freeze(this)}add(e){return new pe({warnings:this.warnings.concat(e?.warnings??[]),errors:this.errors.concat(e?.errors??[])})}log(){this.errors.length>0?console.error(`\u{1F6A8} ${this.errors[0]}`):this.warnings.length>0?console.warn(`\u26A0\uFE0F ${this.warnings[0]}`):console.info("\u{1F60E} No issues!")}};function Ti(e){try{let t=L.fromString(e),i=[];return t.toString()!==e&&i.push("Alg is non-canonical!"),{alg:t,issues:new pe({warnings:i})}}catch(t){return{alg:new L,issues:new pe({errors:[`Malformed alg: ${t.toString()}`]})}}}function rr(e,t){return e.alg.isIdentical(t.alg)&&dt(e.issues.warnings,t.issues.warnings)&&dt(e.issues.errors,t.issues.errors)}var Ut=class extends F{getDefaultValue(){return{alg:new L,issues:new pe}}canReuseValue(e,t){return rr(e,t)}async derive(e){return typeof e=="string"?Ti(e):{alg:e,issues:new pe}}},sr=class extends f{derive(e){return e.kpuzzle.algToTransformation(e.setupAlg.alg)}},nr=class extends f{derive(e){if(e.setupTransformation)return e.setupTransformation;switch(e.setupAnchor){case"start":return e.setupAlgTransformation;case"end":{let i=e.indexer.transformationAtIndex(e.indexer.numAnimatedLeaves()).invert();return e.setupAlgTransformation.applyTransformation(i)}default:throw new Error("Unimplemented!")}}},ar=class extends w{getDefaultValue(){return{move:null,amount:0}}canReuseValue(e,t){return e.move===t.move&&e.amount===t.amount}},or=class extends f{derive(e){return{stateIndex:e.currentMoveInfo.stateIndex,movesFinishing:e.currentMoveInfo.movesFinishing.map(t=>t.move),movesFinished:e.currentMoveInfo.movesFinished.map(t=>t.move)}}canReuseValue(e,t){return e.stateIndex===t.stateIndex&&St(e.movesFinishing,t.movesFinishing,(i,r)=>i.isIdentical(r))&&St(e.movesFinished,t.movesFinished,(i,r)=>i.isIdentical(r))}},lr=class extends f{derive(e){function t(i){return e.detailedTimelineInfo.atEnd&&e.catchUpMove.move!==null&&i.currentMoves.push({move:e.catchUpMove.move,direction:-1,fraction:1-e.catchUpMove.amount,startTimestamp:-1,endTimestamp:-1}),i}if(e.indexer.currentMoveInfo)return t(e.indexer.currentMoveInfo(e.detailedTimelineInfo.timestamp));{let i=e.indexer.timestampToIndex(e.detailedTimelineInfo.timestamp),r={stateIndex:i,currentMoves:[],movesFinishing:[],movesFinished:[],movesStarting:[],latestStart:-1/0,earliestEnd:1/0};if(e.indexer.numAnimatedLeaves()>0){let s=e.indexer.getAnimLeaf(i)?.as(h);if(!s)return t(r);let n=e.indexer.indexToMoveStartTimestamp(i),o=e.indexer.moveDuration(i),l=o?(e.detailedTimelineInfo.timestamp-n)/o:0,m=n+o,c={move:s,direction:1,fraction:l,startTimestamp:n,endTimestamp:m};l===0?r.movesStarting.push(c):l===1?r.movesFinishing.push(c):(r.currentMoves.push(c),r.latestStart=Math.max(r.latestStart,n),r.earliestEnd=Math.min(r.earliestEnd,m))}return t(r)}}},dr=class extends f{derive(e){let t=e.indexer.transformationAtIndex(e.currentLeavesSimplified.stateIndex);t=e.anchoredStart.applyTransformation(t);for(let i of e.currentLeavesSimplified.movesFinishing)t=t.applyMove(i);for(let i of e.currentLeavesSimplified.movesFinished)t=t.applyMove(i);return t.toKState()}};function G(e){switch(Math.abs(e)){case 0:return 0;case 1:return 1e3;case 2:return 1500;default:return 2e3}}var Ai=class extends ge{constructor(e=G){super(),this.durationForAmount=e}traverseAlg(e){let t=0;for(let i of e.childAlgNodes())t+=this.traverseAlgNode(i);return t}traverseGrouping(e){return e.amount*this.traverseAlg(e.alg)}traverseMove(e){return this.durationForAmount(e.amount)}traverseCommutator(e){return 2*(this.traverseAlg(e.A)+this.traverseAlg(e.B))}traverseConjugate(e){return 2*this.traverseAlg(e.A)+this.traverseAlg(e.B)}traversePause(e){return this.durationForAmount(1)}traverseNewline(e){return this.durationForAmount(1)}traverseLineComment(e){return this.durationForAmount(0)}},cr=class{constructor(e,t){this.kpuzzle=e,this.durationFn=new Ai(G),this.moves=new L(t.experimentalExpand())}getAnimLeaf(e){return Array.from(this.moves.childAlgNodes())[e]}indexToMoveStartTimestamp(e){let t=new L(Array.from(this.moves.childAlgNodes()).slice(0,e));return this.durationFn.traverseAlg(t)}timestampToIndex(e){let t=0,i;for(i=0;i<this.numAnimatedLeaves();i++)if(t+=this.durationFn.traverseMove(this.getAnimLeaf(i)),t>=e)return i;return i}stateAtIndex(e){return this.kpuzzle.startState().applyTransformation(this.transformationAtIndex(e))}transformationAtIndex(e){let t=this.kpuzzle.identityTransformation();for(let i of Array.from(this.moves.childAlgNodes()).slice(0,e))t=t.applyMove(i);return t}algDuration(){return this.durationFn.traverseAlg(this.moves)}numAnimatedLeaves(){return Lt(this.moves)}moveDuration(e){return this.durationFn.traverseMove(this.getAnimLeaf(e))}},Bt={u:"y",l:"x",f:"z",r:"x",b:"z",d:"y",m:"x",e:"y",s:"z",x:"x",y:"y",z:"z"};function ur(e,t){return Bt[e.family[0].toLowerCase()]===Bt[t.family[0].toLowerCase()]}var hr=class extends ge{traverseAlg(e){let t=[];for(let i of e.childAlgNodes())t.push(this.traverseAlgNode(i));return Array.prototype.concat(...t)}traverseGroupingOnce(e){if(e.experimentalIsEmpty())return[];for(let s of e.childAlgNodes())if(!s.is(h))return this.traverseAlg(e);let t=Array.from(e.childAlgNodes()),i=G(t[0].amount);for(let s=0;s<t.length-1;s++){for(let n=1;n<t.length;n++)if(!ur(t[s],t[n]))return this.traverseAlg(e);i=Math.max(i,G(t[s].amount))}let r=t.map(s=>({animLeafAlgNode:s,msUntilNext:0,duration:i}));return r[r.length-1].msUntilNext=i,r}traverseGrouping(e){let t=[],i=e.amount>0?e.alg:e.alg.invert();for(let r=0;r<Math.abs(e.amount);r++)t.push(this.traverseGroupingOnce(i));return Array.prototype.concat(...t)}traverseMove(e){let t=G(e.amount);return[{animLeafAlgNode:e,msUntilNext:t,duration:t}]}traverseCommutator(e){let t=[],i=[e.A,e.B,e.A.invert(),e.B.invert()];for(let r of i)t.push(this.traverseGroupingOnce(r));return Array.prototype.concat(...t)}traverseConjugate(e){let t=[],i=[e.A,e.B,e.A.invert()];for(let r of i)t.push(this.traverseGroupingOnce(r));return Array.prototype.concat(...t)}traversePause(e){if(e.experimentalNISSGrouping)return[];let t=G(1);return[{animLeafAlgNode:e,msUntilNext:t,duration:t}]}traverseNewline(e){return[]}traverseLineComment(e){return[]}},pr=fe(hr);function mr(e){let t=0;return pr(e).map(r=>{let s={animLeaf:r.animLeafAlgNode,start:t,end:t+r.duration};return t+=r.msUntilNext,s})}var gr={"y' y' U' E D R2 r2 F2 B2 U E D' R2 L2' z2 S2 U U D D S2 F2' B2":[{animLeaf:new h("y",-1),start:0,end:1e3},{animLeaf:new h("y",-1),start:1e3,end:2e3},{animLeaf:new h("U",-1),start:1e3,end:1600},{animLeaf:new h("E",1),start:1200,end:1800},{animLeaf:new h("D"),start:1400,end:2e3},{animLeaf:new h("R",2),start:2e3,end:3500},{animLeaf:new h("r",2),start:2e3,end:3500},{animLeaf:new h("F",2),start:3500,end:4200},{animLeaf:new h("B",2),start:3800,end:4500},{animLeaf:new h("U",1),start:4500,end:5500},{animLeaf:new h("E",1),start:4500,end:5500},{animLeaf:new h("D",-1),start:4500,end:5500},{animLeaf:new h("R",2),start:5500,end:6500},{animLeaf:new h("L",-2),start:5500,end:6500},{animLeaf:new h("z",2),start:5500,end:6500},{animLeaf:new h("S",2),start:6500,end:7500},{animLeaf:new h("U"),start:7500,end:8e3},{animLeaf:new h("D"),start:7750,end:8250},{animLeaf:new h("U"),start:8e3,end:8500},{animLeaf:new h("D"),start:8250,end:8750},{animLeaf:new h("S",2),start:8750,end:9250},{animLeaf:new h("F",-2),start:8750,end:1e4},{animLeaf:new h("B",2),start:8750,end:1e4}],"M' R' U' D' M R":[{animLeaf:new h("M",-1),start:0,end:1e3},{animLeaf:new h("R",-1),start:0,end:1e3},{animLeaf:new h("U",-1),start:1e3,end:2e3},{animLeaf:new h("D",-1),start:1e3,end:2e3},{animLeaf:new h("M"),start:2e3,end:3e3},{animLeaf:new h("R"),start:2e3,end:3e3}],"U' E' r E r2' E r U E":[{animLeaf:new h("U",-1),start:0,end:1e3},{animLeaf:new h("E",-1),start:0,end:1e3},{animLeaf:new h("r"),start:1e3,end:2500},{animLeaf:new h("E"),start:2500,end:3500},{animLeaf:new h("r",-2),start:3500,end:5e3},{animLeaf:new h("E"),start:5e3,end:6e3},{animLeaf:new h("r"),start:6e3,end:7e3},{animLeaf:new h("U"),start:7e3,end:8e3},{animLeaf:new h("E"),start:7e3,end:8e3}]},Wt=class{constructor(e,t){this.kpuzzle=e,this.animLeaves=gr[t.toString()]??mr(t)}getAnimLeaf(e){return this.animLeaves[Math.min(e,this.animLeaves.length-1)]?.animLeaf??null}getAnimLeafWithRange(e){return this.animLeaves[Math.min(e,this.animLeaves.length-1)]}indexToMoveStartTimestamp(e){let t=0;return this.animLeaves.length>0&&(t=this.animLeaves[Math.min(e,this.animLeaves.length-1)].start),t}timestampToIndex(e){let t=0;for(t=0;t<this.animLeaves.length;t++)if(this.animLeaves[t].start>=e)return Math.max(0,t-1);return Math.max(0,t-1)}timestampToPosition(e,t){let i=this.currentMoveInfo(e),r=t??this.kpuzzle.identityTransformation().toKState();for(let s of this.animLeaves.slice(0,i.stateIndex)){let n=s.animLeaf.as(h);n!==null&&(r=r.applyMove(n))}return{state:r,movesInProgress:i.currentMoves}}currentMoveInfo(e){let t=1/0;for(let c of this.animLeaves)if(c.start<=e&&c.end>=e)t=Math.min(t,c.start);else if(c.start>e)break;let i=[],r=[],s=[],n=[],o=-1/0,l=1/0,m=0;for(let c of this.animLeaves)if(c.end<=t)m++;else{if(c.start>e)break;{let v=c.animLeaf.as(h);if(v!==null){let p=(e-c.start)/(c.end-c.start),x=!1;p>1&&(p=1,x=!0);let z={move:v,direction:1,fraction:p,startTimestamp:c.start,endTimestamp:c.end};switch(p){case 0:{r.push(z);break}case 1:{x?n.push(z):s.push(z);break}default:i.push(z),o=Math.max(o,c.start),l=Math.min(l,c.end)}}}}return{stateIndex:m,currentMoves:i,latestStart:o,earliestEnd:l,movesStarting:r,movesFinishing:s,movesFinished:n}}stateAtIndex(e,t){let i=t??this.kpuzzle.startState();for(let r=0;r<this.animLeaves.length&&r<e;r++){let n=this.animLeaves[r].animLeaf.as(h);n!==null&&(i=i.applyMove(n))}return i}transformationAtIndex(e){let t=this.kpuzzle.identityTransformation();for(let i of this.animLeaves.slice(0,e)){let r=i.animLeaf.as(h);r!==null&&(t=t.applyMove(r))}return t}algDuration(){let e=0;for(let t of this.animLeaves)e=Math.max(e,t.end);return e}numAnimatedLeaves(){return this.animLeaves.length}moveDuration(e){let t=this.getAnimLeafWithRange(e);return t.end-t.start}},Y=class{constructor(e,t,i,r,s=[]){this.moveCount=e,this.duration=t,this.forward=i,this.backward=r,this.children=s}},fr=class extends ge{constructor(e){super(),this.kpuzzle=e,this.durationFn=new Ai(G),this.cache={},this.identity=e.identityTransformation(),this.dummyLeaf=new Y(0,0,this.identity,this.identity,[])}traverseAlg(e){let t=0,i=0,r=this.identity,s=[];for(let n of e.childAlgNodes()){let o=this.traverseAlgNode(n);t+=o.moveCount,i+=o.duration,r===this.identity?r=o.forward:r=r.applyTransformation(o.forward),s.push(o)}return new Y(t,i,r,r.invert(),s)}traverseGrouping(e){let t=this.traverseAlg(e.alg);return this.mult(t,e.amount,[t])}traverseMove(e){let t=e.toString(),i=this.cache[t];if(i)return i;let r=this.kpuzzle.moveToTransformation(e);return i=new Y(1,this.durationFn.traverseAlgNode(e),r,r.invert()),this.cache[t]=i,i}traverseCommutator(e){let t=this.traverseAlg(e.A),i=this.traverseAlg(e.B),r=t.forward.applyTransformation(i.forward),s=t.backward.applyTransformation(i.backward),n=r.applyTransformation(s),o=new Y(2*(t.moveCount+i.moveCount),2*(t.duration+i.duration),n,n.invert(),[t,i]);return this.mult(o,1,[o,t,i])}traverseConjugate(e){let t=this.traverseAlg(e.A),i=this.traverseAlg(e.B),s=t.forward.applyTransformation(i.forward).applyTransformation(t.backward),n=new Y(2*t.moveCount+i.moveCount,2*t.duration+i.duration,s,s.invert(),[t,i]);return this.mult(n,1,[n,t,i])}traversePause(e){return e.experimentalNISSGrouping?this.dummyLeaf:new Y(1,this.durationFn.traverseAlgNode(e),this.identity,this.identity)}traverseNewline(e){return this.dummyLeaf}traverseLineComment(e){return this.dummyLeaf}mult(e,t,i){let r=Math.abs(t),s=e.forward.selfMultiply(t);return new Y(e.moveCount*r,e.duration*r,s,s.invert(),i)}},M=class{constructor(e,t){this.apd=e,this.back=t}},wr=class extends Re{constructor(e,t,i){super(),this.kpuzzle=e,this.algOrAlgNode=t,this.apd=i,this.i=-1,this.dur=-1,this.goali=-1,this.goaldur=-1,this.move=void 0,this.back=!1,this.moveDuration=0,this.st=this.kpuzzle.identityTransformation(),this.root=new M(this.apd,!1)}moveByIndex(e){return this.i>=0&&this.i===e?this.move!==void 0:this.dosearch(e,1/0)}moveByDuration(e){return this.dur>=0&&this.dur<e&&this.dur+this.moveDuration>=e?this.move!==void 0:this.dosearch(1/0,e)}dosearch(e,t){return this.goali=e,this.goaldur=t,this.i=0,this.dur=0,this.move=void 0,this.moveDuration=0,this.back=!1,this.st=this.kpuzzle.identityTransformation(),this.algOrAlgNode.is(L)?this.traverseAlg(this.algOrAlgNode,this.root):this.traverseAlgNode(this.algOrAlgNode,this.root)}traverseAlg(e,t){if(!this.firstcheck(t))return!1;let i=t.back?e.experimentalNumChildAlgNodes()-1:0;for(let r of wt(e.childAlgNodes(),t.back?-1:1)){if(this.traverseAlgNode(r,new M(t.apd.children[i],t.back)))return!0;i+=t.back?-1:1}return!1}traverseGrouping(e,t){if(!this.firstcheck(t))return!1;let i=this.domult(t,e.amount);return this.traverseAlg(e.alg,new M(t.apd.children[0],i))}traverseMove(e,t){return this.firstcheck(t)?(this.move=e,this.moveDuration=t.apd.duration,this.back=t.back,!0):!1}traverseCommutator(e,t){if(!this.firstcheck(t))return!1;let i=this.domult(t,1);return i?this.traverseAlg(e.B,new M(t.apd.children[2],!i))||this.traverseAlg(e.A,new M(t.apd.children[1],!i))||this.traverseAlg(e.B,new M(t.apd.children[2],i))||this.traverseAlg(e.A,new M(t.apd.children[1],i)):this.traverseAlg(e.A,new M(t.apd.children[1],i))||this.traverseAlg(e.B,new M(t.apd.children[2],i))||this.traverseAlg(e.A,new M(t.apd.children[1],!i))||this.traverseAlg(e.B,new M(t.apd.children[2],!i))}traverseConjugate(e,t){if(!this.firstcheck(t))return!1;let i=this.domult(t,1);return i?this.traverseAlg(e.A,new M(t.apd.children[1],!i))||this.traverseAlg(e.B,new M(t.apd.children[2],i))||this.traverseAlg(e.A,new M(t.apd.children[1],i)):this.traverseAlg(e.A,new M(t.apd.children[1],i))||this.traverseAlg(e.B,new M(t.apd.children[2],i))||this.traverseAlg(e.A,new M(t.apd.children[1],!i))}traversePause(e,t){return this.firstcheck(t)?(this.move=e,this.moveDuration=t.apd.duration,this.back=t.back,!0):!1}traverseNewline(e,t){return!1}traverseLineComment(e,t){return!1}firstcheck(e){return e.apd.moveCount+this.i<=this.goali&&e.apd.duration+this.dur<this.goaldur?this.keepgoing(e):!0}domult(e,t){let i=e.back;if(t===0)return i;t<0&&(i=!i,t=-t);let r=e.apd.children[0],s=Math.min(Math.floor((this.goali-this.i)/r.moveCount),Math.ceil((this.goaldur-this.dur)/r.duration-1));return s>0&&this.keepgoing(new M(r,i),s),i}keepgoing(e,t=1){return this.i+=t*e.apd.moveCount,this.dur+=t*e.apd.duration,t!==1?e.back?this.st=this.st.applyTransformation(e.apd.backward.selfMultiply(t)):this.st=this.st.applyTransformation(e.apd.forward.selfMultiply(t)):e.back?this.st=this.st.applyTransformation(e.apd.backward):this.st=this.st.applyTransformation(e.apd.forward),!1}},vr=16;function yr(e,t){let i=new Je,r=new Je;for(let s of e.childAlgNodes())r.push(s),r.experimentalNumAlgNodes()>=t&&(i.push(new me(r.toAlg())),r.reset());return i.push(new me(r.toAlg())),i.toAlg()}var Mr=class extends ge{traverseAlg(e){let t=e.experimentalNumChildAlgNodes();return t<vr?e:yr(e,Math.ceil(Math.sqrt(t)))}traverseGrouping(e){return new me(this.traverseAlg(e.alg),e.amount)}traverseMove(e){return e}traverseCommutator(e){return new Ke(this.traverseAlg(e.A),this.traverseAlg(e.B))}traverseConjugate(e){return new Ke(this.traverseAlg(e.A),this.traverseAlg(e.B))}traversePause(e){return e}traverseNewline(e){return e}traverseLineComment(e){return e}},xr=fe(Mr),qt=class{constructor(e,t){this.kpuzzle=e;let i=new fr(this.kpuzzle),r=xr(t);this.decoration=i.traverseAlg(r),this.walker=new wr(this.kpuzzle,r,this.decoration)}getAnimLeaf(e){if(this.walker.moveByIndex(e)){if(!this.walker.move)throw new Error("`this.walker.mv` missing");let t=this.walker.move;return this.walker.back?t.invert():t}return null}indexToMoveStartTimestamp(e){if(this.walker.moveByIndex(e)||this.walker.i===e)return this.walker.dur;throw new Error(`Out of algorithm: index ${e}`)}indexToMovesInProgress(e){if(this.walker.moveByIndex(e)||this.walker.i===e)return this.walker.dur;throw new Error(`Out of algorithm: index ${e}`)}stateAtIndex(e,t){return this.walker.moveByIndex(e),(t??this.kpuzzle.startState()).applyTransformation(this.walker.st)}transformationAtIndex(e){return this.walker.moveByIndex(e),this.walker.st}numAnimatedLeaves(){return this.decoration.moveCount}timestampToIndex(e){return this.walker.moveByDuration(e),this.walker.i}algDuration(){return this.decoration.duration}moveDuration(e){return this.walker.moveByIndex(e),this.walker.moveDuration}},zr=class extends f{derive(e){switch(e.indexerConstructorRequest){case"auto":return it(e.alg.alg)<100&&e.puzzle==="3x3x3"&&e.visualizationStrategy==="Cube3D"?Wt:qt;case"tree":return qt;case"simple":return cr;case"simultaneous":return Wt;default:throw new Error("Invalid indexer request!")}}},Lr=class extends w{getDefaultValue(){return"auto"}},kr=class extends f{derive(e){return new e.indexerConstructor(e.kpuzzle,e.algWithIssues.alg)}},Dr=class extends f{derive(e){return{state:e.state,movesInProgress:e.currentMoveInfo.currentMoves}}},Tr=class extends f{derive(e){return e.alg.issues.errors.length>0?null:it(e.alg.alg)}},Ar=!0,Ht=class extends f{async derive(e){try{return Ar&&e.kpuzzle.algToTransformation(e.algWithIssues.alg),e.algWithIssues}catch(t){return{alg:new L,issues:new pe({errors:[`Invalid alg for puzzle: ${t.toString()}`]})}}}},Ir=class extends w{getDefaultValue(){return"start"}},Sr=class extends w{getDefaultValue(){return null}},br=class extends f{async derive(e){return e.puzzleLoader.kpuzzle()}},Cr=class extends w{getDefaultValue(){return ee}},Er=class extends f{async derive(e){return e.puzzleLoader.id}},Nr=class extends w{getDefaultValue(){return ee}},Pr=class extends f{derive(e){if(e.puzzleIDRequest&&e.puzzleIDRequest!==ee){let t=tt[e.puzzleIDRequest];return t||this.userVisibleErrorTracker.set({errors:[`Invalid puzzle ID: ${e.puzzleIDRequest}`]}),t}return e.puzzleDescriptionRequest&&e.puzzleDescriptionRequest!==ee?xt(e.puzzleDescriptionRequest):zt}},Rr=class extends f{derive(e){return{playing:e.playingInfo.playing,atStart:e.detailedTimelineInfo.atStart,atEnd:e.detailedTimelineInfo.atEnd}}canReuseValue(e,t){return e.playing===t.playing&&e.atStart===t.atStart&&e.atEnd===t.atEnd}},Qe,Ii,li,jr=(li=class extends f{constructor(){super(...arguments);d(this,Qe)}derive(t){let i=N(this,Qe,Ii).call(this,t),r=!1,s=!1;return i>=t.timeRange.end&&(s=!0,i=Math.min(t.timeRange.end,i)),i<=t.timeRange.start&&(r=!0,i=Math.max(t.timeRange.start,i)),{timestamp:i,timeRange:t.timeRange,atStart:r,atEnd:s}}canReuseValue(t,i){return t.timestamp===i.timestamp&&t.timeRange.start===i.timeRange.start&&t.timeRange.end===i.timeRange.end&&t.atStart===i.atStart&&t.atEnd===i.atEnd}},Qe=new WeakSet,Ii=function(t){switch(t.timestampRequest){case"auto":return t.setupAnchor==="start"&&t.setupAlg.alg.experimentalIsEmpty()?t.timeRange.end:t.timeRange.start;case"start":return t.timeRange.start;case"end":return t.timeRange.end;case"anchor":return t.setupAnchor==="start"?t.timeRange.start:t.timeRange.end;case"opposite-anchor":return t.setupAnchor==="start"?t.timeRange.end:t.timeRange.start;default:return t.timestampRequest}},li),Or=class extends F{async getDefaultValue(){return{direction:1,playing:!1,untilBoundary:"entire-timeline",loop:!1}}async derive(e,t){let i=await t,r=Object.assign({},i);return Object.assign(r,e),r}canReuseValue(e,t){return e.direction===t.direction&&e.playing===t.playing&&e.untilBoundary===t.untilBoundary&&e.loop===t.loop}},Vr=class extends F{getDefaultValue(){return 1}derive(e){return e<0?1:e}},Fr={auto:!0,start:!0,end:!0,anchor:!0,"opposite-anchor":!0},Ur=class extends w{getDefaultValue(){return"auto"}set(e){!this.validInput(e)||super.set(e)}validInput(e){return!!(typeof e=="number"||Fr[e])}},en={none:!0,"side-by-side":!0,"top-right":!0},Br=class extends w{getDefaultValue(){return"auto"}},Wr=class extends f{derive(e){return{start:0,end:e.indexer.algDuration()}}},qr=class extends w{getDefaultValue(){return"auto"}},Hr=class extends w{getDefaultValue(){return"auto"}},Qr=class extends f{derive(e){switch(e.puzzleID){case"clock":case"square1":case"kilominx":case"redi_cube":case"melindas2x2x2x2":return"2D";case"3x3x3":switch(e.visualizationRequest){case"auto":case"3D":return"Cube3D";default:return e.visualizationRequest}default:switch(e.visualizationRequest){case"auto":case"3D":return"PG3D";case"experimental-2D-LL":return e.puzzleID==="4x4x4"?"experimental-2D-LL":"2D";default:return e.visualizationRequest}}}},Yr=class extends w{getDefaultValue(){return"auto"}},Gr=class extends w{getDefaultValue(){return"auto"}},Zr=class extends w{getDefaultValue(){return"auto"}},Qt=null;async function _r(){return Qt??(Qt=new(await Q).TextureLoader)}var Yt=class extends f{async derive(e){let{spriteURL:t}=e;return t===null?null:new Promise(async(i,r)=>{let s=()=>{console.warn("Could not load sprite:",t.toString()),i(null)};try{(await _r()).load(t.toString(),i,s,s)}catch{s()}})}},Xr={facelets:["regular","regular","regular","regular","regular"]};async function $r(e){let{definition:t}=await e.kpuzzle(),i={orbits:{}};for(let[r,s]of Object.entries(t.orbits))i.orbits[r]={pieces:new Array(s.numPieces).fill(Xr)};return i}var Jr=class extends f{getDefaultValue(){return{orbits:{}}}async derive(e){return e.stickeringMaskRequest?e.stickeringMaskRequest:e.stickeringRequest==="picture"?{specialBehaviour:"picture",orbits:{}}:e.puzzleLoader.stickeringMask?.(e.stickeringRequest??"full")??$r(e.puzzleLoader)}},Kr={"-":"Regular",D:"Dim",I:"Ignored",X:"Invisible",O:"IgnoreNonPrimary",P:"PermuteNonPrimary",o:"Ignoriented","?":"OrientationWithoutPermutation","@":"Regular"};function es(e){let t={orbits:{}},i=e.split(",");for(let r of i){let[s,n,...o]=r.split(":");if(o.length>0)throw new Error(`Invalid serialized orbit stickering mask (too many colons): \`${r}\``);let l=[];t.orbits[s]={pieces:l};for(let m of n){let c=Kr[m];l.push(yt(c))}}return t}var ts=class extends F{getDefaultValue(){return null}derive(e){return e===null?null:typeof e=="string"?es(e):e}},is=class extends w{getDefaultValue(){return null}},rs=class extends w{getDefaultValue(){return"auto"}},ss=class extends w{getDefaultValue(){return{}}},ns=class extends w{getDefaultValue(){return"auto"}},as=class extends w{getDefaultValue(){return"auto"}},os=class extends f{derive(e){return e.darkModeRequest==="dark"?"dark":"light"}},ls=class extends w{getDefaultValue(){return"auto"}},ds=class extends w{getDefaultValue(){return null}},cs=35,us=class extends w{getDefaultValue(){return cs}};function Si(e,t){return e.latitude===t.latitude&&e.longitude===t.longitude&&e.distance===t.distance}var hs=class extends F{getDefaultValue(){return"auto"}canReuseValue(e,t){return e===t||Si(e,t)}async derive(e,t){if(e==="auto")return"auto";let i=await t;i==="auto"&&(i={});let r=Object.assign({},i);return Object.assign(r,e),typeof r.latitude<"u"&&(r.latitude=Math.min(Math.max(r.latitude,-90),90)),typeof r.longitude<"u"&&(r.longitude=pi(r.longitude,360,180)),r}},ps=class extends f{canReuseValue(e,t){return Si(e,t)}async derive(e){if(e.orbitCoordinatesRequest==="auto")return Zt(e.puzzleID,e.strategy);let t=Object.assign(Object.assign({},Zt(e.puzzleID,e.strategy),e.orbitCoordinatesRequest));if(Math.abs(t.latitude)<=e.latitudeLimit)return t;{let{latitude:i,longitude:r,distance:s}=t;return{latitude:e.latitudeLimit*Math.sign(i),longitude:r,distance:s}}}},ms={latitude:31.717474411461005,longitude:0,distance:5.877852522924731},gs={latitude:35,longitude:30,distance:6},Gt={latitude:35,longitude:30,distance:6.25},fs={latitude:Math.atan(1/2)*Dt,longitude:0,distance:6.7},ws={latitude:26.56505117707799,longitude:0,distance:6};function Zt(e,t){if(e[1]==="x")return t==="Cube3D"?gs:Gt;switch(e){case"megaminx":case"gigaminx":return fs;case"pyraminx":case"master_tetraminx":return ws;case"skewb":return Gt;default:return ms}}var vs=class{constructor(e){this.twistyPlayerModel=e,this.background=new as,this.darkModeRequest=new ls,this.dragInput=new rs,this.foundationDisplay=new Gr,this.foundationStickerSpriteURL=new pt,this.fullscreenElement=new ds,this.hintFacelet=new kt,this.hintStickerSpriteURL=new pt,this.initialHintFaceletsAnimation=new Zr,this.latitudeLimit=new us,this.movePressInput=new ns,this.movePressCancelOptions=new ss,this.orbitCoordinatesRequest=new hs,this.stickeringMaskRequest=new ts,this.stickeringRequest=new is,this.faceletScale=new Yr,this.darkMode=new os({darkModeRequest:this.darkModeRequest}),this.foundationStickerSprite=new Yt({spriteURL:this.foundationStickerSpriteURL}),this.hintStickerSprite=new Yt({spriteURL:this.hintStickerSpriteURL}),this.orbitCoordinates=new ps({orbitCoordinatesRequest:this.orbitCoordinatesRequest,latitudeLimit:this.latitudeLimit,puzzleID:e.puzzleID,strategy:e.visualizationStrategy}),this.stickeringMask=new Jr({stickeringMaskRequest:this.stickeringMaskRequest,stickeringRequest:this.stickeringRequest,puzzleLoader:e.puzzleLoader})}},ys={errors:[]},Ms=class extends w{getDefaultValue(){return ys}reset(){this.set(this.getDefaultValue())}canReuseValue(e,t){return dt(e.errors,t.errors)}},xs=class{constructor(){this.userVisibleErrorTracker=new Ms,this.alg=new Ut,this.backView=new Br,this.controlPanel=new Bi,this.catchUpMove=new ar,this.indexerConstructorRequest=new Lr,this.playingInfo=new Or,this.puzzleDescriptionRequest=new Cr,this.puzzleIDRequest=new Nr,this.setupAnchor=new Ir,this.setupAlg=new Ut,this.setupTransformation=new Sr,this.tempoScale=new Vr,this.timestampRequest=new Ur,this.viewerLink=new qr,this.visualizationFormat=new Hr,this.title=new Ft,this.videoURL=new pt,this.competitionID=new Ft,this.puzzleLoader=new Pr({puzzleIDRequest:this.puzzleIDRequest,puzzleDescriptionRequest:this.puzzleDescriptionRequest},this.userVisibleErrorTracker),this.kpuzzle=new br({puzzleLoader:this.puzzleLoader}),this.puzzleID=new Er({puzzleLoader:this.puzzleLoader}),this.puzzleAlg=new Ht({algWithIssues:this.alg,kpuzzle:this.kpuzzle}),this.puzzleSetupAlg=new Ht({algWithIssues:this.setupAlg,kpuzzle:this.kpuzzle}),this.visualizationStrategy=new Qr({visualizationRequest:this.visualizationFormat,puzzleID:this.puzzleID}),this.indexerConstructor=new zr({alg:this.alg,puzzle:this.puzzleID,visualizationStrategy:this.visualizationStrategy,indexerConstructorRequest:this.indexerConstructorRequest}),this.moveCount=new Tr({alg:this.puzzleAlg}),this.setupAlgTransformation=new sr({setupAlg:this.puzzleSetupAlg,kpuzzle:this.kpuzzle}),this.indexer=new kr({indexerConstructor:this.indexerConstructor,algWithIssues:this.puzzleAlg,kpuzzle:this.kpuzzle}),this.anchorTransformation=new nr({setupTransformation:this.setupTransformation,setupAnchor:this.setupAnchor,setupAlgTransformation:this.setupAlgTransformation,indexer:this.indexer}),this.timeRange=new Wr({indexer:this.indexer}),this.detailedTimelineInfo=new jr({timestampRequest:this.timestampRequest,timeRange:this.timeRange,setupAnchor:this.setupAnchor,setupAlg:this.setupAlg}),this.coarseTimelineInfo=new Rr({detailedTimelineInfo:this.detailedTimelineInfo,playingInfo:this.playingInfo}),this.currentMoveInfo=new lr({indexer:this.indexer,detailedTimelineInfo:this.detailedTimelineInfo,catchUpMove:this.catchUpMove}),this.buttonAppearance=new Ki({coarseTimelineInfo:this.coarseTimelineInfo,viewerLink:this.viewerLink}),this.currentLeavesSimplified=new or({currentMoveInfo:this.currentMoveInfo}),this.currentState=new dr({anchoredStart:this.anchorTransformation,currentLeavesSimplified:this.currentLeavesSimplified,indexer:this.indexer}),this.legacyPosition=new Dr({currentMoveInfo:this.currentMoveInfo,state:this.currentState}),this.twistySceneModel=new vs(this)}async twizzleLink(){let[e,t,i,r,s,n,o,l]=await Promise.all([this.viewerLink.get(),this.puzzleID.get(),this.puzzleDescriptionRequest.get(),this.alg.get(),this.setupAlg.get(),this.setupAnchor.get(),this.twistySceneModel.stickeringRequest.get(),this.twistySceneModel.twistyPlayerModel.title.get()]),m=e==="experimental-twizzle-explorer",c=new URL(`https://alpha.twizzle.net/${m?"explore":"edit"}/`);return r.alg.experimentalIsEmpty()||c.searchParams.set("alg",r.alg.toString()),s.alg.experimentalIsEmpty()||c.searchParams.set("setup-alg",s.alg.toString()),n!=="start"&&c.searchParams.set("setup-anchor",n),o!=="full"&&o!==null&&c.searchParams.set("experimental-stickering",o),m&&i!==ee?c.searchParams.set("puzzle-description",i):t!=="3x3x3"&&c.searchParams.set("puzzle",t),l&&c.searchParams.set("title",l),c.toString()}experimentalAddAlgLeaf(e,t){let i=e.as(h);i?this.experimentalAddMove(i,t):this.alg.set((async()=>{let s=(await this.alg.get()).alg.concat(new L([e]));return this.timestampRequest.set("end"),s})())}experimentalAddMove(e,t){let i=typeof e=="string"?new h(e):e;this.alg.set((async()=>{let[{alg:r},s]=await Promise.all([this.alg.get(),this.puzzleLoader.get()]),n=vt(r,i,{...t,...await Mt(s)});return this.timestampRequest.set("end"),this.catchUpMove.set({move:i,amount:0}),n})())}experimentalRemoveFinalChild(){this.alg.set((async()=>{let e=(await this.alg.get()).alg,t=Array.from(e.childAlgNodes()),[i]=t.splice(-1);if(!i)return e;this.timestampRequest.set("end");let r=i.as(h);return r&&this.catchUpMove.set({move:r.invert(),amount:0}),new L(t)})())}};function g(e){return new Error(`Cannot get \`.${e}\` directly from a \`TwistyPlayer\`.`)}var zs=class extends A{constructor(){super(...arguments),this.experimentalModel=new xs,this.experimentalGet=new Ls(this.experimentalModel)}set alg(e){this.experimentalModel.alg.set(e)}get alg(){throw g("alg")}set experimentalSetupAlg(e){this.experimentalModel.setupAlg.set(e)}get experimentalSetupAlg(){throw g("setup")}set experimentalSetupAnchor(e){this.experimentalModel.setupAnchor.set(e)}get experimentalSetupAnchor(){throw g("anchor")}set puzzle(e){this.experimentalModel.puzzleIDRequest.set(e)}get puzzle(){throw g("puzzle")}set experimentalPuzzleDescription(e){this.experimentalModel.puzzleDescriptionRequest.set(e)}get experimentalPuzzleDescription(){throw g("experimentalPuzzleDescription")}set timestamp(e){this.experimentalModel.timestampRequest.set(e)}get timestamp(){throw g("timestamp")}set hintFacelets(e){this.experimentalModel.twistySceneModel.hintFacelet.set(e)}get hintFacelets(){throw g("hintFacelets")}set experimentalStickering(e){this.experimentalModel.twistySceneModel.stickeringRequest.set(e)}get experimentalStickering(){throw g("experimentalStickering")}set experimentalStickeringMaskOrbits(e){this.experimentalModel.twistySceneModel.stickeringMaskRequest.set(e)}get experimentalStickeringMaskOrbits(){throw g("experimentalStickeringMaskOrbits")}set experimentalFaceletScale(e){this.experimentalModel.twistySceneModel.faceletScale.set(e)}get experimentalFaceletScale(){throw g("experimentalFaceletScale")}set backView(e){this.experimentalModel.backView.set(e)}get backView(){throw g("backView")}set background(e){this.experimentalModel.twistySceneModel.background.set(e)}get background(){throw g("background")}set darkMode(e){this.experimentalModel.twistySceneModel.darkModeRequest.set(e)}get darkMode(){throw g("darkMode")}set controlPanel(e){this.experimentalModel.controlPanel.set(e)}get controlPanel(){throw g("controlPanel")}set visualization(e){this.experimentalModel.visualizationFormat.set(e)}get visualization(){throw g("visualization")}set experimentalTitle(e){this.experimentalModel.title.set(e)}get experimentalTitle(){throw g("experimentalTitle")}set experimentalVideoURL(e){this.experimentalModel.videoURL.set(e)}get experimentalVideoURL(){throw g("experimentalVideoURL")}set experimentalCompetitionID(e){this.experimentalModel.competitionID.set(e)}get experimentalCompetitionID(){throw g("experimentalCompetitionID")}set viewerLink(e){this.experimentalModel.viewerLink.set(e)}get viewerLink(){throw g("viewerLink")}set experimentalMovePressInput(e){this.experimentalModel.twistySceneModel.movePressInput.set(e)}get experimentalMovePressInput(){throw g("experimentalMovePressInput")}set experimentalMovePressCancelOptions(e){this.experimentalModel.twistySceneModel.movePressCancelOptions.set(e)}get experimentalMovePressCancelOptions(){throw g("experimentalMovePressCancelOptions")}set cameraLatitude(e){this.experimentalModel.twistySceneModel.orbitCoordinatesRequest.set({latitude:e})}get cameraLatitude(){throw g("cameraLatitude")}set cameraLongitude(e){this.experimentalModel.twistySceneModel.orbitCoordinatesRequest.set({longitude:e})}get cameraLongitude(){throw g("cameraLongitude")}set cameraDistance(e){this.experimentalModel.twistySceneModel.orbitCoordinatesRequest.set({distance:e})}get cameraDistance(){throw g("cameraDistance")}set cameraLatitudeLimit(e){this.experimentalModel.twistySceneModel.latitudeLimit.set(e)}get cameraLatitudeLimit(){throw g("cameraLatitudeLimit")}set indexer(e){this.experimentalModel.indexerConstructorRequest.set(e)}get indexer(){throw g("indexer")}set tempoScale(e){this.experimentalModel.tempoScale.set(e)}get tempoScale(){throw g("tempoScale")}set experimentalSprite(e){this.experimentalModel.twistySceneModel.foundationStickerSpriteURL.set(e)}get experimentalSprite(){throw g("experimentalSprite")}set experimentalHintSprite(e){this.experimentalModel.twistySceneModel.hintStickerSpriteURL.set(e)}get experimentalHintSprite(){throw g("experimentalHintSprite")}set fullscreenElement(e){this.experimentalModel.twistySceneModel.fullscreenElement.set(e)}get fullscreenElement(){throw g("fullscreenElement")}set experimentalInitialHintFaceletsAnimation(e){this.experimentalModel.twistySceneModel.initialHintFaceletsAnimation.set(e)}get experimentalInitialHintFaceletsAnimation(){throw g("experimentalInitialHintFaceletsAnimation")}set experimentalDragInput(e){this.experimentalModel.twistySceneModel.dragInput.set(e)}get experimentalDragInput(){throw g("experimentalDragInput")}},Ls=class{constructor(e){this.model=e}async alg(){return(await this.model.alg.get()).alg}async setupAlg(){return(await this.model.setupAlg.get()).alg}puzzleID(){return this.model.puzzleID.get()}async timestamp(){return(await this.model.detailedTimelineInfo.get()).timestamp}},lt="data-",Be={alg:"alg","experimental-setup-alg":"experimentalSetupAlg","experimental-setup-anchor":"experimentalSetupAnchor",puzzle:"puzzle","experimental-puzzle-description":"experimentalPuzzleDescription",visualization:"visualization","hint-facelets":"hintFacelets","experimental-stickering":"experimentalStickering","experimental-stickering-mask-orbits":"experimentalStickeringMaskOrbits",background:"background","dark-mode":"darkMode","control-panel":"controlPanel","back-view":"backView","experimental-initial-hint-facelets-animation":"experimentalInitialHintFaceletsAnimation","viewer-link":"viewerLink","experimental-move-press-input":"experimentalMovePressInput","experimental-drag-input":"experimentalDragInput","experimental-title":"experimentalTitle","experimental-video-url":"experimentalVideoURL","experimental-competition-id":"experimentalCompetitionID","camera-latitude":"cameraLatitude","camera-longitude":"cameraLongitude","camera-distance":"cameraDistance","camera-latitude-limit":"cameraLatitudeLimit","tempo-scale":"tempoScale","experimental-sprite":"experimentalSprite","experimental-hint-sprite":"experimentalHintSprite"},ks=Object.fromEntries(Object.values(Be).map(e=>[e,!0])),Ds={experimentalMovePressCancelOptions:!0},be,ne,$,ae,oe,b,le,de,Ye,bi,di,Xe=(di=class extends zs{constructor(t={}){super();d(this,Ye);d(this,be,void 0);d(this,ne,void 0);d(this,$,void 0);d(this,ae,void 0);d(this,oe,void 0);d(this,b,void 0);d(this,le,void 0);d(this,de,void 0);this.controller=new Fi(this.experimentalModel,this),this.experimentalCanvasClickCallback=()=>{},u(this,be,new _e(this,"controls-",["auto"].concat(Object.keys(Ui)))),u(this,ne,document.createElement("div")),u(this,$,document.createElement("div")),u(this,ae,!1),u(this,oe,"auto"),u(this,b,null),u(this,le,new wi),u(this,de,null);for(let[i,r]of Object.entries(t)){if(!(ks[i]||Ds[i])){console.warn(`Invalid config passed to TwistyPlayer: ${i}`);break}this[i]=r}}async connectedCallback(){if(a(this,ae))return;u(this,ae,!0),this.addCSS(ir),this.addElement(a(this,ne)).classList.add("visualization-wrapper"),this.addElement(a(this,$)).classList.add("error-elem"),a(this,$).textContent="Error",this.experimentalModel.userVisibleErrorTracker.addFreshListener(i=>{let r=i.errors[0]??null;this.contentWrapper.classList.toggle("error",!!r),r&&(a(this,$).textContent=r)});let t=new Li(this.experimentalModel,this.controller);this.contentWrapper.appendChild(t),this.buttons=new yi(this.experimentalModel,this.controller,this),this.contentWrapper.appendChild(this.buttons),this.experimentalModel.twistySceneModel.background.addFreshListener(i=>{this.contentWrapper.classList.toggle("checkered",["auto","checkered"].includes(i)),this.contentWrapper.classList.toggle("checkered-transparent",i==="checkered-transparent")}),this.experimentalModel.twistySceneModel.darkMode.addFreshListener(i=>{this.contentWrapper.classList.toggle("dark-mode",["dark"].includes(i))}),this.experimentalModel.controlPanel.addFreshListener(i=>{a(this,be).setValue(i)}),this.experimentalModel.visualizationStrategy.addFreshListener(N(this,Ye,bi).bind(this)),this.experimentalModel.puzzleID.addFreshListener(this.flash.bind(this))}experimentalSetFlashLevel(t){u(this,oe,t)}flash(){a(this,oe)==="auto"&&a(this,b)?.animate([{opacity:.25},{opacity:1}],{duration:250,easing:"ease-out"})}async experimentalCurrentVantages(){this.connectedCallback();let t=a(this,b);return t instanceof ut?t.experimentalVantages():[]}async experimentalCurrentCanvases(){let t=await this.experimentalCurrentVantages(),i=[];for(let r of t)i.push((await r.canvasInfo()).canvas);return i}async experimentalCurrentThreeJSPuzzleObject(t){this.connectedCallback();let r=await(await a(this,le).promise).experimentalTwisty3DPuzzleWrapper(),s=r.twisty3DPuzzle(),n=(async()=>{await s,await new Promise(o=>setTimeout(o,0))})();if(t){let o=new we(async()=>{});r.addEventListener("render-scheduled",async()=>{o.requestIsPending()||(o.requestAnimFrame(),await n,t())})}return s}jumpToStart(t){this.controller.jumpToStart(t)}jumpToEnd(t){this.controller.jumpToEnd(t)}play(){this.controller.togglePlay(!0)}pause(){this.controller.togglePlay(!1)}togglePlay(t){this.controller.togglePlay(t)}experimentalAddMove(t,i){this.experimentalModel.experimentalAddMove(t,i)}experimentalAddAlgLeaf(t,i){this.experimentalModel.experimentalAddAlgLeaf(t,i)}static get observedAttributes(){let t=[];for(let i of Object.keys(Be))t.push(i,lt+i);return t}experimentalRemoveFinalChild(){this.experimentalModel.experimentalRemoveFinalChild()}attributeChangedCallback(t,i,r){t.startsWith(lt)&&(t=t.slice(lt.length));let s=Be[t];!s||(this[s]=r)}async experimentalScreenshot(t){return(await Vt(this.experimentalModel,t)).dataURL}async experimentalDownloadScreenshot(t){if(["2D","experimental-2D-LL"].includes(await this.experimentalModel.visualizationStrategy.get())){let r=await a(this,b).currentTwisty2DPuzzleWrapper().twisty2DPuzzle(),s=new XMLSerializer().serializeToString(r.svgWrapper.svgElement),n=URL.createObjectURL(new Blob([s]));Di(n,t??await ki(this.experimentalModel),"svg")}else await(await Vt(this.experimentalModel)).download(t)}},be=new WeakMap,ne=new WeakMap,$=new WeakMap,ae=new WeakMap,oe=new WeakMap,b=new WeakMap,le=new WeakMap,de=new WeakMap,Ye=new WeakSet,bi=function(t){if(t!==a(this,de)){a(this,b)?.remove(),a(this,b)?.disconnect();let i;switch(t){case"2D":case"experimental-2D-LL":{i=new fi(this.experimentalModel.twistySceneModel,t);break}case"Cube3D":case"PG3D":{i=new ut(this.experimentalModel),a(this,le).handleNewValue(i);break}default:throw new Error("Invalid visualization")}a(this,ne).appendChild(i),u(this,b,i),u(this,de,t)}},di);k.define("twisty-player",Xe);var Ts=new T(`
:host {
  display: inline;
}

.wrapper {
  display: inline;
}

a:not(:hover) {
  color: inherit;
  text-decoration: none;
}

twisty-alg-leaf-elem.twisty-alg-comment {
  color: rgba(0, 0, 0, 0.4);
}

.wrapper.current-move {
  background: rgba(66, 133, 244, 0.3);
  margin-left: -0.1em;
  margin-right: -0.1em;
  padding-left: 0.1em;
  padding-right: 0.1em;
  border-radius: 0.1em;
}
`),As=250,ie=class extends A{constructor(e,t,i,r,s,n){if(super({mode:"open"}),this.algOrAlgNode=r,this.classList.add(e),this.addCSS(Ts),n){let o=this.contentWrapper.appendChild(document.createElement("a"));o.href="#",o.textContent=t,o.addEventListener("click",l=>{l.preventDefault(),i.twistyAlgViewer.jumpToIndex(i.earliestMoveIndex,s)})}else this.contentWrapper.appendChild(document.createElement("span")).textContent=t}pathToIndex(e){return[]}setCurrentMove(e){this.contentWrapper.classList.toggle("current-move",e)}};k.define("twisty-alg-leaf-elem",ie);var re=class extends st{constructor(e,t){super(),this.algOrAlgNode=t,this.queue=[],this.classList.add(e)}addString(e){this.queue.push(document.createTextNode(e))}addElem(e){return this.queue.push(e.element),e.moveCount}flushQueue(e=1){for(let t of Ci(this.queue,e))this.append(t);this.queue=[]}pathToIndex(e){return[]}};k.define("twisty-alg-wrapper-elem",re);function Is(e){return e===1?-1:1}function Ss(e,t){return t<0?Is(e):e}function Ci(e,t){if(t===1)return e;let i=Array.from(e);return i.reverse(),i}var bs=class extends Re{traverseAlg(e,t){let i=0,r=new re("twisty-alg-alg",e),s=!0;for(let n of ft(e.childAlgNodes(),t.direction))s||r.addString(" "),s=!1,n.as(et)?.experimentalNISSGrouping&&r.addString("^("),n.as(me)?.experimentalNISSPlaceholder||(i+=r.addElem(this.traverseAlgNode(n,{earliestMoveIndex:t.earliestMoveIndex+i,twistyAlgViewer:t.twistyAlgViewer,direction:t.direction}))),n.as(et)?.experimentalNISSGrouping&&r.addString(")");return r.flushQueue(t.direction),{moveCount:i,element:r}}traverseGrouping(e,t){let i=e.experimentalAsSquare1Tuple(),r=Ss(t.direction,e.amount),s=0,n=new re("twisty-alg-grouping",e);return n.addString("("),i?(s+=n.addElem({moveCount:1,element:new ie("twisty-alg-move",i[0].amount.toString(),t,i[0],!0,!0)}),n.addString(", "),s+=n.addElem({moveCount:1,element:new ie("twisty-alg-move",i[1].amount.toString(),t,i[1],!0,!0)})):s+=n.addElem(this.traverseAlg(e.alg,{earliestMoveIndex:t.earliestMoveIndex+s,twistyAlgViewer:t.twistyAlgViewer,direction:r})),n.addString(`)${e.experimentalRepetitionSuffix}`),n.flushQueue(),{moveCount:s*Math.abs(e.amount),element:n}}traverseMove(e,t){let i=new ie("twisty-alg-move",e.toString(),t,e,!0,!0);return t.twistyAlgViewer.highlighter.addMove(e.startCharIndex,i),{moveCount:1,element:i}}traverseCommutator(e,t){let i=0,r=new re("twisty-alg-commutator",e);r.addString("["),r.flushQueue();let[s,n]=Ci([e.A,e.B],t.direction);return i+=r.addElem(this.traverseAlg(s,{earliestMoveIndex:t.earliestMoveIndex+i,twistyAlgViewer:t.twistyAlgViewer,direction:t.direction})),r.addString(", "),i+=r.addElem(this.traverseAlg(n,{earliestMoveIndex:t.earliestMoveIndex+i,twistyAlgViewer:t.twistyAlgViewer,direction:t.direction})),r.flushQueue(t.direction),r.addString("]"),r.flushQueue(),{moveCount:i*2,element:r}}traverseConjugate(e,t){let i=0,r=new re("twisty-alg-conjugate",e);r.addString("[");let s=r.addElem(this.traverseAlg(e.A,{earliestMoveIndex:t.earliestMoveIndex+i,twistyAlgViewer:t.twistyAlgViewer,direction:t.direction}));return i+=s,r.addString(": "),i+=r.addElem(this.traverseAlg(e.B,{earliestMoveIndex:t.earliestMoveIndex+i,twistyAlgViewer:t.twistyAlgViewer,direction:t.direction})),r.addString("]"),r.flushQueue(),{moveCount:i+s,element:r}}traversePause(e,t){return e.experimentalNISSGrouping?this.traverseAlg(e.experimentalNISSGrouping.alg,t):{moveCount:1,element:new ie("twisty-alg-pause",".",t,e,!0,!0)}}traverseNewline(e,t){let i=new re("twisty-alg-newline",e);return i.append(document.createElement("br")),{moveCount:0,element:i}}traverseLineComment(e,t){return{moveCount:0,element:new ie("twisty-alg-line-comment",`//${e.text}`,t,e,!1,!1)}}},Cs=fe(bs),Es=class{constructor(){this.moveCharIndexMap=new Map,this.currentElem=null}addMove(e,t){this.moveCharIndexMap.set(e,t)}set(e){let t=e?this.moveCharIndexMap.get(e.startCharIndex)??null:null;this.currentElem!==t&&(this.currentElem?.classList.remove("twisty-alg-current-move"),this.currentElem?.setCurrentMove(!1),t?.classList.add("twisty-alg-current-move"),t?.setCurrentMove(!0),this.currentElem=t)}},Ce,C,Ge,Ni,ci,Ei=(ci=class extends st{constructor(t){super();d(this,Ge);d(this,Ce,void 0);d(this,C,void 0);this.highlighter=new Es,u(this,C,null),this.lastClickTimestamp=null,t?.twistyPlayer&&(this.twistyPlayer=t?.twistyPlayer)}connectedCallback(){}setAlg(t){u(this,Ce,Cs(t,{earliestMoveIndex:0,twistyAlgViewer:this,direction:1}).element),this.textContent="",this.appendChild(a(this,Ce))}get twistyPlayer(){return a(this,C)}set twistyPlayer(t){N(this,Ge,Ni).call(this,t)}async jumpToIndex(t,i){let r=a(this,C);if(r){r.pause();let s=(async()=>{let n=await r.experimentalModel.indexer.get(),o=i?As:0;return n.indexToMoveStartTimestamp(t)+n.moveDuration(t)-o})();r.experimentalModel.timestampRequest.set(await s),this.lastClickTimestamp===await s?(r.play(),this.lastClickTimestamp=null):this.lastClickTimestamp=await s}}async attributeChangedCallback(t,i,r){if(t==="for"){let s=document.getElementById(r);if(!s){console.warn("for= elem does not exist");return}if(await customElements.whenDefined("twisty-player"),!(s instanceof Xe)){console.warn("for= elem is not a twisty-player");return}this.twistyPlayer=s}}static get observedAttributes(){return["for"]}},Ce=new WeakMap,C=new WeakMap,Ge=new WeakSet,Ni=async function(t){if(a(this,C)){console.warn("twisty-player reassignment is not supported");return}if(t===null)throw new Error("clearing twistyPlayer is not supported");u(this,C,t),a(this,C).experimentalModel.alg.addFreshListener(s=>{this.setAlg(s.alg)});let i=(await a(this,C).experimentalModel.alg.get()).alg,r="startCharIndex"in i?i:L.fromString(i.toString());this.setAlg(r),t.experimentalModel.currentMoveInfo.addFreshListener(s=>{let n=s.currentMoves[0];if(n??(n=s.movesStarting[0]),n??(n=s.movesFinishing[0]),!n)this.highlighter.set(null);else{let o=n.move;this.highlighter.set(o)}}),t.experimentalModel.detailedTimelineInfo.addFreshListener(s=>{s.timestamp!==this.lastClickTimestamp&&(this.lastClickTimestamp=null)})},ci);k.define("twisty-alg-viewer",Ei);var Ns=class extends Re{traverseAlg(e,t){let i=[],r=0;for(let s of e.childAlgNodes()){let n=this.traverseAlgNode(s,{numMovesSofar:t.numMovesSofar+r});i.push(n.tokens),r+=n.numLeavesInside}return{tokens:Array.prototype.concat(...i),numLeavesInside:r}}traverseGrouping(e,t){let i=this.traverseAlg(e.alg,t);return{tokens:i.tokens,numLeavesInside:i.numLeavesInside*e.amount}}traverseMove(e,t){return{tokens:[{leaf:e,idx:t.numMovesSofar}],numLeavesInside:1}}traverseCommutator(e,t){let i=this.traverseAlg(e.A,t),r=this.traverseAlg(e.B,{numMovesSofar:t.numMovesSofar+i.numLeavesInside});return{tokens:i.tokens.concat(r.tokens),numLeavesInside:i.numLeavesInside*2+r.numLeavesInside}}traverseConjugate(e,t){let i=this.traverseAlg(e.A,t),r=this.traverseAlg(e.B,{numMovesSofar:t.numMovesSofar+i.numLeavesInside});return{tokens:i.tokens.concat(r.tokens),numLeavesInside:i.numLeavesInside*2+r.numLeavesInside*2}}traversePause(e,t){return{tokens:[{leaf:e,idx:t.numMovesSofar}],numLeavesInside:1}}traverseNewline(e,t){return{tokens:[],numLeavesInside:0}}traverseLineComment(e,t){return{tokens:[],numLeavesInside:0}}},Ps=fe(Ns),Rs=class extends w{getDefaultValue(){return""}},js=class extends f{derive(e){return Ti(e.value)}},Os=class extends F{getDefaultValue(){return{selectionStart:0,selectionEnd:0,endChangedMostRecently:!1}}async derive(e,t){let{selectionStart:i,selectionEnd:r}=e,s=await t,n=e.selectionStart===s.selectionStart&&e.selectionEnd!==(await t).selectionEnd;return{selectionStart:i,selectionEnd:r,endChangedMostRecently:n}}},Vs=class extends f{derive(e){return e.selectionInfo.endChangedMostRecently?e.selectionInfo.selectionEnd:e.selectionInfo.selectionStart}},Fs=class extends f{derive(e){return Ps(e.algWithIssues.alg,{numMovesSofar:0}).tokens}},Us=class extends f{derive(e){function t(r){if(r===null)return null;let s;return e.targetChar<r.leaf.startCharIndex?s="before":e.targetChar===r.leaf.startCharIndex?s="start":e.targetChar<r.leaf.endCharIndex?s="inside":e.targetChar===r.leaf.endCharIndex?s="end":s="after",{leafInfo:r,where:s}}let i=null;for(let r of e.leafTokens){if(e.targetChar<r.leaf.startCharIndex&&i!==null)return t(i);if(e.targetChar<=r.leaf.endCharIndex)return t(r);i=r}return t(i)}},Bs=class{constructor(){this.valueProp=new Rs,this.selectionProp=new Os,this.targetCharProp=new Vs({selectionInfo:this.selectionProp}),this.algEditorAlgWithIssues=new js({value:this.valueProp}),this.leafTokensProp=new Fs({algWithIssues:this.algEditorAlgWithIssues}),this.leafToHighlight=new Us({leafTokens:this.leafTokensProp,targetChar:this.targetCharProp})}},Ws=new T(`
:host {
  width: 384px;
  display: grid;
}

.wrapper {
  /*overflow: hidden;
  resize: horizontal;*/

  background: var(--background, none);
  display: grid;
}

textarea, .carbon-copy {
  grid-area: 1 / 1 / 2 / 2;

  width: 100%;
  font-family: sans-serif;
  line-height: 1.2em;

  font-size: var(--font-size, inherit);
  font-family: var(--font-family, sans-serif);

  box-sizing: border-box;

  padding: var(--padding, 0.5em);
  /* Prevent horizontal growth. */
  overflow-x: hidden;
}

textarea {
  resize: none;
  background: none;
  z-index: 2;
  overflow: hidden;
  border: 1px solid var(--border-color, rgba(0, 0, 0, 0.25));
}

.carbon-copy {
  white-space: pre-wrap;
  word-wrap: break-word;
  color: transparent;
  user-select: none;
  pointer-events: none;

  z-index: 1;
}

.carbon-copy .highlight {
  background: var(--highlight-color, rgba(255, 128, 0, 0.5));
  padding: 0.1em 0.2em;
  margin: -0.1em -0.2em;
  border-radius: 0.2em;
}

.wrapper.issue-warning textarea,
.wrapper.valid-for-puzzle-warning textarea {
  outline: none;
  border: 1px solid rgba(200, 200, 0, 0.5);
  background: rgba(255, 255, 0, 0.1);
}

.wrapper.issue-error textarea,
.wrapper.valid-for-puzzle-error textarea {
  outline: none;
  border: 1px solid red;
  background: rgba(255, 0, 0, 0.1);
}
`),Oe="for-twisty-player",_t="placeholder",Xt="twisty-player-prop",y,j,W,E,q,Ee,S,O,ce,Fe,ue,Ne,mt,he,ui,qs=(ui=class extends A{constructor(t){super();d(this,ce);d(this,Ne);d(this,y,void 0);d(this,j,void 0);d(this,W,void 0);d(this,E,void 0);d(this,q,void 0);d(this,Ee,void 0);d(this,S,void 0);d(this,O,void 0);d(this,ue,void 0);d(this,he,void 0);this.model=new Bs,u(this,y,document.createElement("textarea")),u(this,j,document.createElement("div")),u(this,W,document.createElement("span")),u(this,E,document.createElement("span")),u(this,q,document.createElement("span")),u(this,Ee,new _e(this,"valid-for-puzzle-",["none","warning","error"])),u(this,S,null),this.debugNeverRequestTimestamp=!1,u(this,ue,!1),u(this,he,null),a(this,j).classList.add("carbon-copy"),this.addElement(a(this,j)),a(this,y).rows=1,this.addElement(a(this,y)),a(this,W).classList.add("prefix"),a(this,j).appendChild(a(this,W)),a(this,E).classList.add("highlight"),a(this,j).appendChild(a(this,E)),a(this,q).classList.add("suffix"),a(this,j).appendChild(a(this,q)),a(this,y).placeholder="Alg",a(this,y).setAttribute("spellcheck","false"),this.addCSS(Ws),a(this,y).addEventListener("input",()=>{u(this,ue,!0),this.onInput()}),a(this,y).addEventListener("blur",()=>this.onBlur()),document.addEventListener("selectionchange",()=>this.onSelectionChange()),t?.twistyPlayer&&(this.twistyPlayer=t.twistyPlayer),u(this,O,t?.twistyPlayerProp??"alg"),t?.twistyPlayerProp==="alg"&&this.model.leafToHighlight.addFreshListener(i=>{i&&this.highlightLeaf(i.leafInfo.leaf)})}set algString(t){a(this,y).value=t,this.onInput()}get algString(){return a(this,y).value}set placeholder(t){a(this,y).placeholder=t}onInput(){a(this,E).hidden=!0,this.highlightLeaf(null);let t=a(this,y).value.trimEnd();this.model.valueProp.set(t),a(this,ce,Fe)?.set(t)}async onSelectionChange(){if(document.activeElement!==this||this.shadow.activeElement!==a(this,y)||a(this,O)!=="alg")return;let{selectionStart:t,selectionEnd:i}=a(this,y);this.model.selectionProp.set({selectionStart:t,selectionEnd:i})}async onBlur(){}setAlgIssueClassForPuzzle(t){a(this,Ee).setValue(t)}highlightLeaf(t){if(a(this,O)==="alg"){if(t===null){a(this,W).textContent="",a(this,E).textContent="",a(this,q).textContent=N(this,Ne,mt).call(this,a(this,y).value);return}t!==a(this,he)&&(u(this,he,t),a(this,W).textContent=a(this,y).value.slice(0,t.startCharIndex),a(this,E).textContent=a(this,y).value.slice(t.startCharIndex,t.endCharIndex),a(this,q).textContent=N(this,Ne,mt).call(this,a(this,y).value.slice(t.endCharIndex)),a(this,E).hidden=!1)}}get twistyPlayer(){return a(this,S)}set twistyPlayer(t){if(a(this,S)){console.warn("twisty-player reassignment/clearing is not supported");return}u(this,S,t),t&&((async()=>this.algString=a(this,ce,Fe)?(await a(this,ce,Fe).get()).alg.toString():"")(),a(this,O)==="alg"&&(a(this,S)?.experimentalModel.puzzleAlg.addFreshListener(i=>{if(i.issues.errors.length===0){this.setAlgIssueClassForPuzzle(i.issues.warnings.length===0?"none":"warning");let r=i.alg,s=L.fromString(this.algString);r.isIdentical(s)||(this.algString=r.toString(),this.onInput())}else this.setAlgIssueClassForPuzzle("error")}),this.model.leafToHighlight.addFreshListener(async i=>{if(i===null)return;let[r,s]=await Promise.all([await t.experimentalModel.indexer.get(),await t.experimentalModel.timestampRequest.get()]);if(s==="auto"&&!a(this,ue))return;let n=r.indexToMoveStartTimestamp(i.leafInfo.idx),o=r.moveDuration(i.leafInfo.idx),l;switch(i.where){case"before":{l=n;break}case"start":case"inside":{l=n+o/4;break}case"end":case"after":{l=n+o;break}default:throw console.log("invalid where"),new Error("Invalid where!")}this.debugNeverRequestTimestamp||t.experimentalModel.timestampRequest.set(l)}),t.experimentalModel.currentLeavesSimplified.addFreshListener(async i=>{let s=(await t.experimentalModel.indexer.get()).getAnimLeaf(i.stateIndex);this.highlightLeaf(s)})))}attributeChangedCallback(t,i,r){switch(t){case Oe:{let s=document.getElementById(r);if(!s){console.warn(`${Oe}= elem does not exist`);return}if(!(s instanceof Xe)){console.warn(`${Oe}=is not a twisty-player`);return}this.twistyPlayer=s;return}case _t:{this.placeholder=r;return}case Xt:{if(a(this,S))throw console.log("cannot set prop"),new Error("cannot set prop after twisty player");u(this,O,r);return}}}static get observedAttributes(){return[Oe,_t,Xt]}},y=new WeakMap,j=new WeakMap,W=new WeakMap,E=new WeakMap,q=new WeakMap,Ee=new WeakMap,S=new WeakMap,O=new WeakMap,ce=new WeakSet,Fe=function(){return a(this,S)===null?null:a(this,S).experimentalModel[a(this,O)]},ue=new WeakMap,Ne=new WeakSet,mt=function(t){return t.endsWith(`
`)?`${t} `:t},he=new WeakMap,ui);k.define("twisty-alg-editor",qs);var Hs=new T(`
.wrapper {
  background: rgb(255, 245, 235);
  border: 1px solid rgba(0, 0, 0, 0.25);
}

.setup-alg, twisty-alg-viewer {
  padding: 0.5em 1em;
}

.heading {
  background: rgba(255, 230, 210, 1);
  font-weight: bold;
  padding: 0.25em 0.5em;
}

.heading.title {
  background: rgb(255, 245, 235);
  font-size: 150%;
  white-space: pre;
}

.heading a {
  text-decoration: none;
  color: inherit;
}

twisty-player {
  width: 100%;
  min-height: 128px;
  height: 288px;
  resize: vertical;
  overflow-y: hidden;
}

twisty-player + .heading {
  padding-top: 0.5em;
}

twisty-alg-viewer {
  display: inline-block;
}

.wrapper {
  container-type: inline-size;
}

.scrollable-region {
  border-top: 1px solid rgba(0, 0, 0, 0.25);
}

.scrollable-region {
  max-height: 18em;
  overflow-y: auto;
}

@container (min-width: 512px) {
  .responsive-wrapper {
    display: grid;
    grid-template-columns: 1fr 1fr;
  }
  twisty-player {
    height: 320px
  }
  .scrollable-region {
    border-top: none;
    border-left: 1px solid rgba(0, 0, 0, 0.25);
    contain: strict;
    max-height: 100cqh;
  }
}

.wrapper:fullscreen,
.wrapper:fullscreen .responsive-wrapper {
  width: 100%;
  height: 100%;
}

.wrapper:fullscreen twisty-player,
.wrapper:fullscreen .scrollable-region {
  height: 50%;
}

@container (min-width: 512px) {
  .wrapper:fullscreen twisty-player,
  .wrapper:fullscreen .scrollable-region {
    height: 100%;
  }
}
`),Qs=new T(`
.wrapper {
  background: white;
}

.heading {
  background: #4285f422;
}

.scrollable-region {
  overflow-y: auto;
}

.wrapper.dark-mode {
  background: #262626;
  color: #929292;
  border-color: #FFFFFF44;
  color-scheme: dark;
}

.wrapper.dark-mode .heading:not(.title) {
  background: #1d1d1d;
  color: #ececec;
}

.heading.title {
  background: none;
}
`);function Ys(e="",t=location.href){let i={alg:"alg","setup-alg":"experimental-setup-alg","setup-anchor":"experimental-setup-anchor",puzzle:"puzzle",stickering:"experimental-stickering","puzzle-description":"experimental-puzzle-description",title:"experimental-title","video-url":"experimental-video-url",competition:"experimental-competition-id"},r=new URL(t).searchParams,s={};for(let[n,o]of Object.entries(i)){let l=r.get(e+n);if(l!==null){let m=Be[o];s[m]=l}}return s}var Pe,Ze,H,J,hi,Gs=(hi=class extends A{constructor(t){super({mode:"open"});d(this,Pe,void 0);d(this,Ze,void 0);d(this,H,void 0);d(this,J,void 0);this.options=t,this.twistyPlayer=null,this.a=null}fallback(){if(this.contentWrapper.textContent="",this.a){let t=this.contentWrapper.appendChild(document.createElement("span"));t.textContent="\u2757\uFE0F",t.title="Could not show a player for link",this.addElement(this.a)}a(this,Pe)?.remove(),a(this,Ze)?.remove()}async connectedCallback(){if(u(this,J,this.addElement(document.createElement("div"))),a(this,J).classList.add("responsive-wrapper"),this.options?.darkMode&&this.contentWrapper.classList.add("dark-mode"),u(this,Pe,this.addCSS(Hs)),this.options?.cdnForumTweaks&&this.addCSS(Qs),this.a=this.querySelector("a"),!this.a)return;let t=Ys("",this.a.href),i=this.a?.href,{hostname:r,pathname:s}=new URL(i);if(r!=="alpha.twizzle.net"){this.fallback();return}if(["/edit/","/explore/"].includes(s)){let n=s==="/explore/";if(t.puzzle&&!(t.puzzle in tt)){let l=(await import("../puzzle-geometry-ONZP5DBU.js")).getPuzzleDescriptionString(t.puzzle);delete t.puzzle,t.experimentalPuzzleDescription=l}if(this.twistyPlayer=a(this,J).appendChild(new Xe({background:this.options?.cdnForumTweaks?"checkered-transparent":"checkered",darkMode:this.options?.darkMode?"dark":"light",...t,viewerLink:n?"experimental-twizzle-explorer":"auto"})),this.twistyPlayer.fullscreenElement=this.contentWrapper,t.experimentalTitle&&(this.twistyPlayer.experimentalTitle=t.experimentalTitle),u(this,H,a(this,J).appendChild(document.createElement("div"))),a(this,H).classList.add("scrollable-region"),t.experimentalTitle&&this.addHeading(t.experimentalTitle).classList.add("title"),t.experimentalSetupAlg){this.addHeading("Setup",async()=>(await this.twistyPlayer?.experimentalModel.setupAlg.get())?.alg.toString()??null);let l=a(this,H).appendChild(document.createElement("div"));l.classList.add("setup-alg"),l.textContent=new L(t.experimentalSetupAlg).toString()}this.addHeading("Moves",async()=>(await this.twistyPlayer?.experimentalModel.alg.get())?.alg.toString()??null),a(this,H).appendChild(new Ei({twistyPlayer:this.twistyPlayer})).part.add("twisty-alg-viewer")}else this.fallback()}addHeading(t,i){let r=a(this,H).appendChild(document.createElement("div"));if(r.classList.add("heading"),r.textContent=t,i){r.textContent+=" ";let s=r.appendChild(document.createElement("a"));s.textContent="\u{1F4CB}",s.href="#",s.title="Copy to clipboard";async function n(o){s.textContent=o,await new Promise(l=>setTimeout(l,2e3)),s.textContent===o&&(s.textContent="\u{1F4CB}")}s.addEventListener("click",async o=>{o.preventDefault(),s.textContent="\u2026\u{1F4CB}";let l=await i();if(l)try{await navigator.clipboard.writeText(l),n("\u2705\u{1F4CB}")}catch(m){throw n("\u274C\u{1F4CB}"),m}else n("\u274C\u{1F4CB}")})}return r}},Pe=new WeakMap,Ze=new WeakMap,H=new WeakMap,J=new WeakMap,hi);k.define("twizzle-link",Gs);export{ee as EXPERIMENTAL_PROP_NO_VALUE,Hi as ExperimentalKPuzzleSVGWrapper,cr as SimpleAlgIndexer,qt as TreeAlgIndexer,qs as TwistyAlgEditor,Ei as TwistyAlgViewer,Xe as TwistyPlayer,Gs as TwizzleLink,en as backViewLayouts,ji as setTwistyDebug};
//# sourceMappingURL=twisty.js.map
