export class Runescape{constructor(){this.mondrian=null,this.txList=[]}launch(t,e,i){this.blockHeight=`${t}`,this.txValueCache=e,this.parcelId=i?Number(i.split(":").pop()):null,this.loadRoutine()}async loadRoutine(){const t={};if(null!==this.parcelId)console.log("parcelId",this.parcelId);else{console.log("isParent",!0);let C="";if(C=(t=>{t=BigInt(t);const e=5000000000n,i=210000n,o=t=>e/2n**t,s=t/i;let n=0n;for(let t=0n;t<s;t++)n+=o(t)*i;return n+=t%i*o(s),String(n)})(this.blockHeight),C){console.log("inscribed on sat",C);const P=await fetch(`/r/sat/${C}/at/-1`).then((t=>t.json()));console.log("inscriptionId",P.id);let z=[],A=!0,D=0;for(;A;){const _=await fetch(`/r/children/${P.id}/${D}`).then((t=>t.json()));A=_.more,z=z.concat(_.ids),D+=1}console.log("Num of children",z.length);const O=await fetch("/content/a9f6a9b050af3de1a4ce714978c1f2231ba731f1f46731a16d0e411f89308566i0"),$=document.createElement("script");function G(t){const e=new Uint8Array(t.length/2);for(var i=0;i<e.length;i++)e[i]=parseInt(t.substring(2*i,2*i+2),16);return e.buffer}if($.innerHTML=await O.text(),document.body.appendChild($),z.length>0)for(let j=0;j<z.length;j++){const N=z[j];fetch(`/r/metadata/${N}`).then((async t=>{if(t.ok)return await t.text();throw new Error(`${t.status} ${N} metadata not found`)})).then((t=>CBOR.decode(G(t.replace(/"/g,""))))).then((e=>{if(e){const i=e.parcelId.split(":").pop();i in t||(t[i]=N,console.log("parcelId",i,"indexed"))}})).catch((t=>console.log(t)))}}}window.THREE=await import("/content/0d013bb60fc5bf5a6c77da7371b07dc162ebc7d7f3af0ff3bd00ae5f0c546445i0");const{default:e}=await import("/content/036f12ea42d0fd664948e952b61f4c2f0d04e5672e7a7b3e2c33ac2544b6b1a7i0"),{POSTPROCESSING:i}=await import("/content/5f68b5b0e97c51679eba9f8987fc3945dc04fc894a0bb7c099385145cbd3a617i0"),o=i.BloomEffect,s=i.EffectComposer,n=i.EffectPass,r=i.RenderPass,l=i.BlendFunction,a={headers:{Accept:"application/json"}},h=await fetch("/r/blockheight",a).then((t=>t.json())),c=await fetch(`/r/blockinfo/${h}`,a).then((t=>t.json()));console.log("latest blockHeight",h,"tx_count",c.transaction_count);const d=Math.floor(c.transaction_count/2);console.log("treasure tx: 1/2 tx x latest tx_count =",d),await this.fetchData();const p=d<this.txList.length?this.txList[d].value:0;console.log("treasure tx #",d,"in block",this.blockHeight,"has tx value in total of",p,"sats");for(let F=0;F<this.txList.length;F++)this.txList[F].size=this.logTxSize(this.txList[F].value);let f=0;for(let W of this.txList)f+=W.size*W.size;let x=Math.ceil(Math.sqrt(f));this.mondrian=new MondrianLayout(x,x),e.install({THREE:THREE});const w=window.innerWidth,u=window.innerHeight,g=new THREE.Clock,m=new THREE.Scene,y=new THREE.PerspectiveCamera(90,w/u,.01,1e3);y.position.set(0,x/1.6,0);const E=new THREE.WebGLRenderer({powerPreference:"high-performance",antialias:!1,stencil:!1,depth:!1});E.setSize(w,u),E.shadowMap.enabled=!0,E.shadowMap.type=THREE.BasicShadowMap;let b=new THREE.HemisphereLight(16777215,0,2);m.add(b);let M=new THREE.DirectionalLight(16777215,1);M.position.set(-10,100,-10),M.target.position.set(0,0,0),M.castShadow=!0,m.add(M),document.getElementById("root").appendChild(E.domElement);const R=new e(y,E.domElement);let S=13576336;this.blockHeight<84e4&&(S=16356896);const T=new THREE.MeshStandardMaterial({color:S,wireframe:!1}),H=new THREE.MeshStandardMaterial({color:16777215,wireframe:!1}),L=new THREE.MeshStandardMaterial({color:16775424,wireframe:!1,roughness:.375}),I=new s(E);I.addPass(new r(m,y));const k=new o({blendFunction:l.ADD,mipmapBlur:!0,luminanceThreshold:.4,luminanceSmoothing:.12,intensity:2});I.addPass(new n(y,k));let v=0;for(let q=0;q<this.txList.length;q++){const U=this.mondrian.place(this.txList[q].size),V=.5*U.r,X=new THREE.Mesh(new THREE.BoxGeometry(.9*U.r,.2*U.r,.9*U.r),this.txList[q].value===p?L:T);if(t&&t[q]){const J=new THREE.Mesh(new THREE.BoxGeometry(.6*U.r,.25*U.r,.6*U.r),H);J.position.set(U.position.x-x/2+V,.1*U.r/2,U.position.y-x/2+V),m.add(J)}if(null!==this.parcelId&&q===this.parcelId){const K=new THREE.Mesh(new THREE.BoxGeometry(.6*U.r,.25*U.r,.6*U.r),H);K.position.set(U.position.x-x/2+V,.1*U.r/2,U.position.y-x/2+V),m.add(K)}this.txList[q].value===p&&(v+=1),m.add(X),X.position.set(U.position.x-x/2+V,.1*U.r/2,U.position.y-x/2+V)}console.log("found",v,1!==v?"treasure parcels":"treasure parcel","with the same output value for BlockDrop"),E.render(m,y),I.render();let B=!1;!function t(){const e=g.getDelta(),i=g.getElapsedTime(),o=R.update(e);B&&(k.intensity=2+2*Math.sin(i),I.render(),i>30&&(B=!1)),requestAnimationFrame(t),o&&(B=!0)}()}async fetchData(){const t=await fetch(this.txValueCache).then((t=>t.text()));if(t){let e=t.split(/\r?\n/);this.txList=new Array(e.length);for(let t=0;t<e.length;t++){let i=parseInt(e[t]);this.txList[t]={value:i}}}}decompress=t=>{const e=Uint8Array.from(atob(t),(t=>t.charCodeAt(0))),i=new DecompressionStream("gzip"),o=i.writable.getWriter();return o.write(e),o.close(),new Response(i.readable).arrayBuffer().then((function(t){return(new TextDecoder).decode(t)}))};logTxSize(t){if(0===t)return 1;let e=Math.ceil(Math.log10(t))-5;return Math.min(Number.MAX_SAFE_INTEGER,Math.max(1,e))}}class MondrianLayout{constructor(t,e){this.width=t,this.height=e,this.xMax=0,this.yMax=0,this.rowOffset=0,this.rows=[],this.txMap=[]}getSize(){return{width:this.xMax,height:this.yMax}}getRow(t){let e=t.y-this.rowOffset;return e<this.rows.length?this.rows[e]:null}getSlot(t){let e=this.getRow(t);return null!==e&&e.map.hasOwnProperty(t.x)?e.map[t.x]:null}addRow(){let t={y:this.rows.length+this.rowOffset,slots:[],map:{},max:0};return this.rows.push(t),t}addSlot(t){if(t.r<=0)return null;let e=this.getSlot(t.position);if(null!==e)return e.r=Math.max(e.r,t.r),e;{let e=this.getRow(t.position);if(null===e)return null;let i=e.slots.findIndex((e=>e.position.x>t.position.x));return-1===i?e.slots.push(t):e.slots.splice(i,0,t),e.map[t.position.x]=t,t}}removeSlot(t){let e=this.getRow(t.position);if(null!==e){delete e.map[t.position.x];let i=e.slots.findIndex((e=>e.position.x===t.position.x));-1!==i&&e.slots.splice(i,1)}}fillSlot(t,e){let i={left:t.position.x,right:t.position.x+e,bottom:t.position.y,top:t.position.y+e};this.removeSlot(t);for(let o=t.position.y;o<i.top;o++){let s=this.getRow({x:t.position.x,y:o});if(null!==s){let n=[],r=0;for(let e of s.slots)if(!(e.position.x+e.r<i.left||e.position.x>=i.right)){n.push(e);let i=Math.max(0,e.position.x+e.r-(t.position.x+t.r));r=Math.max(r,i)}i.right<this.width&&!s.map.hasOwnProperty(i.right)&&this.addSlot({position:{x:i.right,y:o},r:t.r-e+r});for(let e of n)e.r=t.position.x-e.position.x,0===e.r&&this.removeSlot(e)}else this.addRow(),t.position.x>0&&this.addSlot({position:{x:0,y:o},r:t.position.x}),i.right<this.width&&this.addSlot({position:{x:i.right,y:o},r:this.width-i.right})}for(let i=Math.max(0,t.position.y-e);i<t.position.y;i++){let o=this.getRow({x:t.position.x,y:i});if(null!==o)for(let i=0;i<o.slots.length;i++){let s=o.slots[i];if(s.position.x<t.position.x+e&&s.position.x+s.r>t.position.x&&s.position.y+s.r>=t.position.y){let e=s.r;s.r=t.position.y-s.position.y;let i={x:s.position.x+s.r,y:s.position.y,width:e-s.r,height:s.r};for(;i.width>0&&i.height>0;)i.width<=i.height?(this.addSlot({position:{x:i.x,y:i.y},r:i.width}),i.y+=i.width,i.height-=i.width):(this.addSlot({position:{x:i.x,y:i.y},r:i.height}),i.x+=i.height,i.width-=i.height)}}}return{position:t.position,r:e}}place(t){let e={},i=!1,o=null;for(let e of this.rows){for(let s of e.slots)if(s.r>=t){i=!0,o=this.fillSlot(s,t);break}if(i)break}if(!i){let e=this.addRow(),i=this.addSlot({position:{x:0,y:e.y},r:this.width});o=this.fillSlot(i,t)}for(let t=0;t<o.r;t++)for(let i=0;i<o.r;i++)this.setTxMapCell({x:o.position.x+t,y:o.position.y+i},e);return o.position.x+o.r>this.xMax&&(this.xMax=o.position.x+o.r),o.position.y+o.r>this.yMax&&(this.yMax=o.position.y+o.r),o}setTxMapCell(t,e){let i=t.y-this.rowOffset;if(i>=0&&i<this.height&&t.x>=0&&t.x<this.width){let o=i*this.width+t.x;o>=0&&o<this.txMap.length&&(this.txMap[o]=e)}}}