@napplet/conformance-cli 0.3.2 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,171 @@
1
+ (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&n(o)}).observe(document,{childList:!0,subtree:!0});function r(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function n(i){if(i.ep)return;i.ep=!0;const s=r(i);fetch(i.href,s)}})();var _e=["shell","relay","identity","storage","inc","theme","keys","media","notify","config","resource","cvm","outbox","upload","intent","ble","webrtc","link","count","lists","serial","fs","common","dm","gamepad"],d={id:"string"},Sn={"gamepad.subscribe":{dir:"out",forbiddenFields:["id"],forbiddenReason:"NAP-GAMEPAD fire-and-forget envelopes do not carry it"},"gamepad.unsubscribe":{dir:"out",forbiddenFields:["id"],forbiddenReason:"NAP-GAMEPAD fire-and-forget envelopes do not carry it"},"gamepad.state":{dir:"in",fields:{available:"boolean",focused:"boolean",pads:"array"}},"shell.ready":{dir:"out"},"shell.init":{dir:"in",fields:{capabilities:"object",services:"array"}},"relay.subscribe":{dir:"out",fields:{...d,subId:"string",filters:"array"}},"relay.close":{dir:"out",fields:{...d,subId:"string"}},"relay.publish":{dir:"out",fields:{...d,event:"object"}},"relay.publishEncrypted":{dir:"out",fields:{...d,event:"object",recipient:"string"}},"relay.query":{dir:"out",fields:{...d,filters:"array"}},"relay.event":{dir:"in"},"relay.eose":{dir:"in"},"relay.closed":{dir:"in"},"relay.publish.result":{dir:"in"},"relay.publishEncrypted.result":{dir:"in"},"relay.query.result":{dir:"in"},"identity.getPublicKey":{dir:"out",fields:{...d}},"identity.getRelays":{dir:"out",fields:{...d}},"identity.getProfile":{dir:"out",fields:{...d}},"identity.getFollows":{dir:"out",fields:{...d}},"identity.getList":{dir:"out",fields:{...d,listType:"string"}},"identity.getZaps":{dir:"out",fields:{...d}},"identity.getMutes":{dir:"out",fields:{...d}},"identity.getBlocked":{dir:"out",fields:{...d}},"identity.getBadges":{dir:"out",fields:{...d}},"identity.changed":{dir:"in"},"identity.getPublicKey.result":{dir:"in"},"identity.getRelays.result":{dir:"in"},"identity.getProfile.result":{dir:"in"},"identity.getFollows.result":{dir:"in"},"identity.getList.result":{dir:"in"},"identity.getZaps.result":{dir:"in"},"identity.getMutes.result":{dir:"in"},"identity.getBlocked.result":{dir:"in"},"identity.getBadges.result":{dir:"in"},"storage.get":{dir:"out",fields:{...d,key:"string"}},"storage.set":{dir:"out",fields:{...d,key:"string",value:"string"}},"storage.remove":{dir:"out",fields:{...d,key:"string"}},"storage.keys":{dir:"out",fields:{...d}},"storage.get.result":{dir:"in"},"storage.set.result":{dir:"in"},"storage.remove.result":{dir:"in"},"storage.keys.result":{dir:"in"},"inc.emit":{dir:"out",fields:{topic:"string"},forbiddenFields:["sender"]},"inc.subscribe":{dir:"out",fields:{...d,topic:"string"}},"inc.unsubscribe":{dir:"out",fields:{topic:"string"}},"inc.channel.open":{dir:"out",fields:{...d,target:"string"}},"inc.channel.emit":{dir:"out",fields:{channelId:"string"}},"inc.channel.broadcast":{dir:"out"},"inc.channel.list":{dir:"out",fields:{...d}},"inc.channel.close":{dir:"out",fields:{channelId:"string"}},"inc.subscribe.result":{dir:"in"},"inc.event":{dir:"in",fields:{topic:"string",sender:"string"}},"inc.channel.open.result":{dir:"in"},"inc.channel.opened":{dir:"in",fields:{channelId:"string",peer:"string"}},"inc.channel.event":{dir:"in"},"inc.channel.list.result":{dir:"in"},"inc.channel.closed":{dir:"in"},"theme.get":{dir:"out",fields:{...d}},"theme.get.result":{dir:"in"},"theme.changed":{dir:"in"},"keys.forward":{dir:"out",fields:{key:"string",code:"string",ctrl:"boolean",alt:"boolean",shift:"boolean",meta:"boolean"}},"keys.registerAction":{dir:"out",fields:{...d,action:"object"}},"keys.unregisterAction":{dir:"out",fields:{actionId:"string"}},"keys.registerAction.result":{dir:"in"},"keys.bindings":{dir:"in"},"keys.action":{dir:"in"},"media.session.create":{dir:"out",fields:{...d,owner:"object"}},"media.session.update":{dir:"out",fields:{sessionId:"string",metadata:"object"}},"media.session.destroy":{dir:"out",fields:{sessionId:"string"}},"media.state":{dir:"out",fields:{sessionId:"string",status:"string"}},"media.capabilities":{dir:"out",fields:{sessionId:"string",actions:"array"}},"media.session.create.result":{dir:"in"},"media.command":{dir:"in"},"media.controls":{dir:"in"},"notify.send":{dir:"out",fields:{...d,title:"string"}},"notify.dismiss":{dir:"out",fields:{notificationId:"string"}},"notify.badge":{dir:"out",fields:{count:"number"}},"notify.channel.register":{dir:"out",fields:{channelId:"string",label:"string"}},"notify.permission.request":{dir:"out",fields:{...d}},"notify.send.result":{dir:"in"},"notify.permission.result":{dir:"in"},"notify.action":{dir:"in"},"notify.clicked":{dir:"in"},"notify.dismissed":{dir:"in"},"notify.controls":{dir:"in"},"config.registerSchema":{dir:"out",fields:{...d,schema:"object"}},"config.get":{dir:"out",fields:{...d}},"config.subscribe":{dir:"out"},"config.unsubscribe":{dir:"out"},"config.openSettings":{dir:"out"},"config.registerSchema.result":{dir:"in"},"config.values":{dir:"in"},"config.schemaError":{dir:"in"},"resource.info":{dir:"out",fields:{...d}},"resource.bytes":{dir:"out",fields:{...d,url:"string"}},"resource.bytesMany":{dir:"out",fields:{...d,requests:"array"}},"resource.cancel":{dir:"out",fields:{...d}},"resource.info.result":{dir:"in"},"resource.info.error":{dir:"in"},"resource.bytes.result":{dir:"in"},"resource.bytes.error":{dir:"in"},"resource.bytesMany.result":{dir:"in"},"resource.bytesMany.error":{dir:"in"},"cvm.discover":{dir:"out",fields:{...d}},"cvm.request":{dir:"out",fields:{...d,server:"object",message:"object"}},"cvm.close":{dir:"out",fields:{...d,server:"object"}},"cvm.registry.list":{dir:"out",fields:{...d}},"cvm.registry.has":{dir:"out",fields:{...d,family:"string"}},"cvm.registry.describe":{dir:"out",fields:{...d,family:"string"}},"cvm.registry.call":{dir:"out",fields:{...d,family:"string",tool:"string"}},"cvm.discover.result":{dir:"in"},"cvm.request.result":{dir:"in"},"cvm.close.result":{dir:"in"},"cvm.event":{dir:"in"},"cvm.registry.list.result":{dir:"in"},"cvm.registry.has.result":{dir:"in"},"cvm.registry.describe.result":{dir:"in"},"cvm.registry.call.result":{dir:"in"},"outbox.getEvent":{dir:"out",fields:{...d,eventId:"string"}},"outbox.query":{dir:"out",fields:{...d,filters:"present"}},"outbox.subscribe":{dir:"out",fields:{...d,subId:"string",filters:"present"}},"outbox.close":{dir:"out",fields:{...d,subId:"string"}},"outbox.publish":{dir:"out",fields:{...d,event:"object"}},"outbox.resolveRelays":{dir:"out",fields:{...d,target:"present"}},"outbox.getEvent.result":{dir:"in"},"outbox.query.result":{dir:"in"},"outbox.event":{dir:"in"},"outbox.closed":{dir:"in"},"outbox.publish.result":{dir:"in"},"outbox.resolveRelays.result":{dir:"in"},"upload.info":{dir:"out",fields:{...d}},"upload.upload":{dir:"out",fields:{...d,request:"object"}},"upload.status":{dir:"out",fields:{...d,uploadId:"string"}},"upload.info.result":{dir:"in"},"upload.upload.result":{dir:"in"},"upload.status.result":{dir:"in"},"upload.status.changed":{dir:"in"},"intent.invoke":{dir:"out",fields:{...d,request:"object"}},"intent.available":{dir:"out",fields:{...d,archetype:"string"}},"intent.handlers":{dir:"out",fields:{...d}},"intent.invoke.result":{dir:"in",fields:{...d,result:"object"}},"intent.available.result":{dir:"in"},"intent.handlers.result":{dir:"in"},"intent.deliver":{dir:"in",fields:{delivery:"object"}},"intent.changed":{dir:"in"},"ble.open":{dir:"out",fields:{...d,request:"object"}},"ble.services":{dir:"out",fields:{...d,sessionId:"string"}},"ble.read":{dir:"out",fields:{...d,sessionId:"string",target:"object"}},"ble.write":{dir:"out",fields:{...d,sessionId:"string",target:"object",data:"array"}},"ble.subscribe":{dir:"out",fields:{...d,sessionId:"string",target:"object"}},"ble.unsubscribe":{dir:"out",fields:{...d,sessionId:"string",target:"object"}},"ble.close":{dir:"out",fields:{...d,sessionId:"string"}},"ble.open.result":{dir:"in"},"ble.services.result":{dir:"in"},"ble.read.result":{dir:"in"},"ble.write.result":{dir:"in"},"ble.subscribe.result":{dir:"in"},"ble.unsubscribe.result":{dir:"in"},"ble.close.result":{dir:"in"},"ble.event":{dir:"in"},"common.encodeNip19":{dir:"out",fields:{...d,input:"object"}},"common.decodeNip19":{dir:"out",fields:{...d,value:"string"}},"common.getProfile":{dir:"out",fields:{...d,target:"string"}},"common.follows":{dir:"out",fields:{...d}},"common.follow":{dir:"out",fields:{...d,pubkeys:"array"}},"common.unfollow":{dir:"out",fields:{...d,pubkeys:"array"}},"common.react":{dir:"out",fields:{...d,targetEventId:"string",reaction:"string"}},"common.report":{dir:"out",fields:{...d,target:"object",reason:"string",text:"string"}},"common.encodeNip19.result":{dir:"in"},"common.decodeNip19.result":{dir:"in"},"common.getProfile.result":{dir:"in"},"common.follows.result":{dir:"in"},"common.follow.result":{dir:"in"},"common.unfollow.result":{dir:"in"},"common.react.result":{dir:"in"},"common.report.result":{dir:"in"},"webrtc.open":{dir:"out",fields:{...d,request:"object"}},"webrtc.send":{dir:"out",fields:{...d,sessionId:"string",payload:"present"}},"webrtc.close":{dir:"out",fields:{...d,sessionId:"string"}},"webrtc.open.result":{dir:"in"},"webrtc.send.result":{dir:"in"},"webrtc.close.result":{dir:"in"},"webrtc.event":{dir:"in"},"link.open":{dir:"out",fields:{...d,url:"string"}},"link.open.result":{dir:"in"},"count.query":{dir:"out",fields:{...d,filters:"array"}},"count.query.result":{dir:"in"},"lists.supported":{dir:"out",fields:{...d}},"lists.add":{dir:"out",fields:{...d,list:"object",items:"array"}},"lists.remove":{dir:"out",fields:{...d,list:"object",items:"array"}},"lists.supported.result":{dir:"in"},"lists.add.result":{dir:"in"},"lists.remove.result":{dir:"in"},"serial.open":{dir:"out",fields:{...d,request:"object"}},"serial.write":{dir:"out",fields:{...d,sessionId:"string",data:"array"}},"serial.close":{dir:"out",fields:{...d,sessionId:"string"}},"serial.open.result":{dir:"in"},"serial.write.result":{dir:"in"},"serial.close.result":{dir:"in"},"serial.event":{dir:"in"},"fs.info":{dir:"out",fields:{...d}},"fs.pickFile":{dir:"out",fields:{...d}},"fs.pickFiles":{dir:"out",fields:{...d}},"fs.pickDirectory":{dir:"out",fields:{...d}},"fs.pickSaveFile":{dir:"out",fields:{...d}},"fs.stat":{dir:"out",fields:{...d,path:"string"}},"fs.list":{dir:"out",fields:{...d,path:"string"}},"fs.read":{dir:"out",fields:{...d,path:"string"}},"fs.write":{dir:"out",fields:{...d,path:"string",data:"string"}},"fs.mkdir":{dir:"out",fields:{...d,path:"string"}},"fs.remove":{dir:"out",fields:{...d,path:"string"}},"fs.move":{dir:"out",fields:{...d,fromPath:"string",toPath:"string"}},"fs.watch":{dir:"out",fields:{...d,path:"string"}},"fs.unwatch":{dir:"out",fields:{...d,watchId:"string"}},"fs.info.result":{dir:"in"},"fs.pickFile.result":{dir:"in"},"fs.pickFiles.result":{dir:"in"},"fs.pickDirectory.result":{dir:"in"},"fs.pickSaveFile.result":{dir:"in"},"fs.stat.result":{dir:"in"},"fs.list.result":{dir:"in"},"fs.read.result":{dir:"in"},"fs.write.result":{dir:"in"},"fs.mkdir.result":{dir:"in"},"fs.remove.result":{dir:"in"},"fs.move.result":{dir:"in"},"fs.watch.result":{dir:"in"},"fs.unwatch.result":{dir:"in"},"fs.changed":{dir:"in"},"dm.status":{dir:"out",fields:{...d}},"dm.conversations":{dir:"out",fields:{...d}},"dm.messages":{dir:"out",fields:{...d,conversationId:"string"}},"dm.send":{dir:"out",fields:{...d,recipients:"array",content:"string"}},"dm.subscribe":{dir:"out",fields:{...d}},"dm.unsubscribe":{dir:"out",fields:{...d,subscriptionId:"string"}},"dm.status.result":{dir:"in"},"dm.conversations.result":{dir:"in"},"dm.messages.result":{dir:"in"},"dm.send.result":{dir:"in"},"dm.subscribe.result":{dir:"in"},"dm.unsubscribe.result":{dir:"in"},"dm.message":{dir:"in"}};function Ce(e){if(e===void 0)return"undefined";if(e===null)return"null";if(Array.isArray(e))return"array";const t=typeof e;return t==="string"||t==="number"||t==="boolean"?t:t==="object"?"object":"present"}function Rn(e,t){return t==="present"?e!=null:Ce(e)===t}function In(e,t){if(typeof e!="object"||e===null||Array.isArray(e))return;const r=e;typeof r.archetype!="string"&&t.push({code:r.archetype===void 0?"missing-field":"wrong-type",message:'Intent request requires a string "archetype" field',field:"request.archetype"});for(const i of["action","convention"])typeof r[i]!="string"&&t.push({code:r[i]===void 0?"missing-field":"wrong-type",message:`Intent request field "${i}" must be a string`,field:`request.${i}`});const n=typeof r.convention=="string"?/^napplet:([^/?#]+)\/([^/?#]+)$/.exec(r.convention):null;(!n||n[1]!==r.archetype||n[2]!==r.action)&&t.push({code:"wrong-type",message:"Intent convention must be stable and match archetype and action",field:"request.convention"}),r.handler!==void 0&&typeof r.handler!="string"&&t.push({code:"wrong-type",message:'Intent request field "handler" must be a string',field:"request.handler"}),r.behavior!==void 0&&Ce(r.behavior)!=="object"&&t.push({code:"wrong-type",message:'Intent request field "behavior" must be an object',field:"request.behavior"}),r.handlerHint!==void 0&&An(r.handlerHint,t),"sender"in r&&t.push({code:"forbidden-field",message:"Intent request does not define a caller-supplied sender field",field:"request.sender"})}function An(e,t){if(Ce(e)!=="object"){t.push({code:"wrong-type",message:'Intent request field "handlerHint" must be an object',field:"request.handlerHint"});return}const{address:r,relays:n}=e;(typeof r!="string"||!/^35129:[0-9a-f]{64}:.+$/s.test(r))&&t.push({code:r===void 0?"missing-field":"wrong-type",message:'Intent handler hint "address" must be a 35129:<pubkey>:<d> coordinate',field:"request.handlerHint.address"}),n!==void 0&&!(Array.isArray(n)&&n.every(i=>typeof i=="string"))&&t.push({code:"wrong-type",message:'Intent handler hint "relays" must be an array of strings',field:"request.handlerHint.relays"})}function Ht(e,t,r){Array.isArray(e)&&e.every(n=>typeof n=="string")||r.push({code:"wrong-type",message:`Field "${t}" must be an array of strings`,field:t})}function $n(e,t){e.servers!==void 0&&Ht(e.servers,"servers",t)}function Tn(e,t){if(Array.isArray(e)){if(e.length===0){t.push({code:"invalid-resource-request",message:'Field "requests" must contain at least one resource request',field:"requests"});return}for(const[r,n]of e.entries()){const i=`requests[${r}]`;if(typeof n!="object"||n===null||Array.isArray(n)){t.push({code:"invalid-resource-request",message:`Field "${i}" must be a resource request object`,field:i});continue}const s=n;typeof s.url!="string"&&t.push({code:s.url===void 0?"missing-field":"wrong-type",message:`Field "${i}.url" must be a string`,field:`${i}.url`}),s.servers!==void 0&&Ht(s.servers,`${i}.servers`,t)}}}function Bn(e){const t=[];if(typeof e!="object"||e===null||Array.isArray(e))return{ok:!1,errors:[{code:"not-an-object",message:"Envelope must be a non-null object"}]};const r=e,n=r.type;if(typeof n!="string")return{ok:!1,errors:[{code:"missing-type",message:"Envelope is missing a string `type` field"}]};const i=n.indexOf(".");if(i<=0)return{ok:!1,type:n,errors:[{code:"malformed-type",message:`Envelope type "${n}" is not in domain.action form`}]};const s=n.slice(0,i);if(!_e.includes(s))return{ok:!1,type:n,domain:s,errors:[{code:"unknown-domain",message:`"${s}" is not a known NAP domain`}]};const c=Sn[n];if(!c)return{ok:!1,type:n,domain:s,errors:[{code:"unknown-type",message:`"${n}" is not a known ${s} message type`}]};for(const[a,l]of Object.entries(c.fields??{})){if(!(a in r)||r[a]===void 0){t.push({code:"missing-field",message:`Required field "${a}" is missing`,field:a});continue}Rn(r[a],l)||t.push({code:"wrong-type",message:`Field "${a}" should be ${l} but is ${Ce(r[a])}`,field:a})}if(c.dir==="in")return{ok:!1,type:n,domain:s,direction:"in",errors:[{code:"inbound-type-emitted",message:`"${n}" is a shell→napplet message; a napplet must not emit it`},...t]};for(const a of c.forbiddenFields??[])a in r&&t.push({code:"forbidden-field",message:`Field "${a}" cannot be emitted by a napplet: ${c.forbiddenReason??"it must be runtime-derived"}`,field:a});return n==="intent.invoke"&&In(r.request,t),n==="resource.bytes"&&$n(r,t),n==="resource.bytesMany"&&Tn(r.requests,t),{ok:t.length===0,type:n,domain:s,direction:"out",errors:t}}var Ut=5129,On=15129,de=35129,ct=[Ut,On,de];function jt(e,t){return e.tags.find(r=>r[0]===t)}function qn(e){return ct.includes(e)}function Dt(e){return typeof e=="string"&&/^[0-9a-f]{64}$/.test(e)}function Mt(e){return jt(e,"d")?.[1]||void 0}function Nn(e){return e.tags.filter(t=>t[0]==="R").map(t=>t[1]?.trim()??"").filter(Boolean)}function Ft(e){return Mt(e)??jt(e,"title")?.[1]??e.id}function He(e){const t=[],r=[];if(!e)return{ok:!1,requires:[],optional:[],errors:[{code:"missing-manifest-event",message:"No NIP-5D manifest event was resolved"}],warnings:r};const n=Mt(e),i=Nn(e);qn(e.kind)||t.push({code:"invalid-napplet-kind",message:`Manifest event kind ${e.kind} is not a NIP-5D napplet kind`});const s=e.tags.filter(c=>c[0]==="d");e.kind===de&&(s.length!==1||!n)?t.push({code:"missing-d-tag",message:"Named manifests require exactly one non-empty d tag"}):e.kind!==de&&s.length>0&&t.push({code:"unexpected-d-tag",message:"Only named manifests carry a d tag"});const o=e.tags.filter(c=>c[0]==="x");return(o.length!==1||o[0].length!==2||!Dt(o[0][1]))&&t.push({code:"invalid-artifact-hash",message:"Manifest requires exactly one x tag with the lowercase sha256 of /index.html"}),(typeof e.content!="string"||!e.content.trim())&&t.push({code:"missing-description",message:"Manifest content must contain a non-empty plain-text description"}),Ln(e,t,r),Pn(e,t,r),{ok:t.length===0,kind:e.kind,dTag:n,requires:i,optional:e.tags.filter(c=>c[0]==="O").map(c=>c[1]).filter(Boolean),errors:t,warnings:r}}function Ln(e,t,r){for(const n of e.tags.filter(i=>i[0]==="R"||i[0]==="O")){const i=n[1];n.length!==2||!i||/[.:\s]/.test(i)||i.startsWith("NAP-")?t.push({code:n[0]==="R"?"invalid-required-nap":"invalid-optional-nap",message:`${n[0]} must name one bare NAP domain`}):_e.includes(i)||r.push({code:"unknown-required-nap",message:`Domain "${i}" is not in this tool's registry; check its NAP and runtime availability`})}}function Pn(e,t,r){for(const i of["title","source","a","A"]){const s=e.tags.filter(o=>o[0]===i);(s.length>1||s.length&&(i==="a"||i==="A")&&e.kind!==Ut)&&t.push({code:"invalid-metadata",message:`Invalid ${i} tag cardinality for kind ${e.kind}`})}for(const i of e.tags.filter(s=>s[0]==="i"))(!i[1]?.trim()||i[1].includes("?"))&&t.push({code:"invalid-metadata",message:"Intent advertisements must be non-empty queryless identities"});const n=e.tags.filter(i=>i[0]==="icon");(n.length>1||n.some(i=>i.length!==3||!Dt(i[1])||!["image/png","image/jpeg","image/webp"].includes(i[2])))&&r.push({code:"invalid-icon",message:"Ignore invalid icon metadata and use generic artwork (NIP-5D §Icon)"})}var le="f".repeat(64),_n={id:"reference-source-endpoint",catalogId:"reference-source"},Cn="https://reference.invalid/blob",Hn=`named:${le}:reference-handler`,Un={kind:35129,pubkey:le,id:"0".repeat(64),tags:[["d","reference-handler"],["z","note"],["i","napplet:note/open","event"]]},jn="reference-subscriber",Dn="napplet:note/open";function ke(e,t,r){return u({type:e,id:t,result:{entries:[r]}})}var u=e=>[e],q=()=>[];function yt(e){if(typeof e!="string"||!e.startsWith("data:"))return null;const t=e.indexOf(",");if(t<0)return{blob:new Blob([],{type:"text/plain"}),mime:"text/plain"};const r=e.slice(5,t),n=e.slice(t+1),i=r.split(";").filter(Boolean),s=i.includes("base64"),o=i.find(c=>c.includes("/"))??"text/plain";try{if(s){const c=globalThis.atob(n),a=Uint8Array.from(c,l=>l.charCodeAt(0));return{blob:new Blob([a],{type:o}),mime:o}}return{blob:new Blob([decodeURIComponent(n)],{type:o}),mime:o}}catch{return null}}var Mn={"gamepad.subscribe":()=>u({type:"gamepad.state",available:!1,reason:"unavailable",focused:!1,pads:[]}),"gamepad.unsubscribe":q,"relay.subscribe":e=>u({type:"relay.eose",subId:e.subId}),"relay.close":q,"relay.publish":e=>u({type:"relay.publish.result",id:e.id,ok:!0,event:e.event}),"relay.publishEncrypted":e=>u({type:"relay.publishEncrypted.result",id:e.id,ok:!0,event:e.event}),"relay.query":e=>u({type:"relay.query.result",id:e.id,events:[]}),"identity.getPublicKey":e=>u({type:"identity.getPublicKey.result",id:e.id,pubkey:le}),"identity.getRelays":e=>u({type:"identity.getRelays.result",id:e.id,relays:{}}),"identity.getProfile":e=>u({type:"identity.getProfile.result",id:e.id,profile:null}),"identity.getFollows":e=>u({type:"identity.getFollows.result",id:e.id,pubkeys:[]}),"identity.getList":e=>u({type:"identity.getList.result",id:e.id,entries:[]}),"identity.getZaps":e=>u({type:"identity.getZaps.result",id:e.id,zaps:[]}),"identity.getMutes":e=>u({type:"identity.getMutes.result",id:e.id,pubkeys:[]}),"identity.getBlocked":e=>u({type:"identity.getBlocked.result",id:e.id,pubkeys:[]}),"identity.getBadges":e=>u({type:"identity.getBadges.result",id:e.id,badges:[]}),"storage.get":e=>u({type:"storage.get.result",id:e.id,value:null}),"storage.set":e=>u({type:"storage.set.result",id:e.id}),"storage.remove":e=>u({type:"storage.remove.result",id:e.id}),"storage.keys":e=>u({type:"storage.keys.result",id:e.id,keys:[]}),"inc.emit":q,"inc.subscribe":e=>u({type:"inc.subscribe.result",id:e.id}),"inc.unsubscribe":q,"inc.channel.open":e=>u({type:"inc.channel.open.result",id:e.id,channelId:`chan-${String(e.id)}`,peer:"reference-peer"}),"inc.channel.emit":q,"inc.channel.broadcast":q,"inc.channel.list":e=>u({type:"inc.channel.list.result",id:e.id,channels:[]}),"inc.channel.close":q,"theme.get":e=>u({type:"theme.get.result",id:e.id,theme:{colors:{background:"#000000",text:"#ffffff",primary:"#663399"}}}),"keys.forward":q,"keys.registerAction":e=>u({type:"keys.registerAction.result",id:e.id,actionId:`action-${String(e.id)}`}),"keys.unregisterAction":q,"media.session.create":e=>u({type:"media.session.create.result",id:e.id,sessionId:`session-${String(e.id)}`,owner:e.owner}),"media.session.update":q,"media.session.destroy":q,"media.state":q,"media.capabilities":q,"notify.send":e=>u({type:"notify.send.result",id:e.id,notificationId:`notif-${String(e.id)}`}),"notify.dismiss":q,"notify.badge":q,"notify.channel.register":q,"notify.permission.request":e=>u({type:"notify.permission.result",id:e.id,granted:!0}),"config.registerSchema":e=>u({type:"config.registerSchema.result",id:e.id,ok:!0}),"config.get":e=>u({type:"config.values",id:e.id,values:{}}),"config.subscribe":()=>u({type:"config.values",values:{}}),"config.unsubscribe":q,"config.openSettings":q,"resource.bytes":e=>{const t=yt(e.url);return u(t?{type:"resource.bytes.result",id:e.id,blob:t.blob,mime:t.mime}:{type:"resource.bytes.result",id:e.id,blob:new Blob([]),mime:"application/octet-stream"})},"resource.bytesMany":e=>u({type:"resource.bytesMany.result",id:e.id,items:Array.isArray(e.requests)?e.requests.map(t=>{const r=typeof t=="object"&&t!==null&&!Array.isArray(t)?t.url:void 0,n=yt(r);return{url:typeof r=="string"?r:"",ok:!0,blob:n?.blob??new Blob([]),mime:n?.mime??"application/octet-stream"}}):[]}),"resource.info":e=>u({type:"resource.info.result",id:e.id,info:{schemes:[{scheme:"data",enabled:!0},{scheme:"https",enabled:!0}],maxServers:8}}),"resource.cancel":q,"cvm.discover":e=>u({type:"cvm.discover.result",id:e.id,servers:[]}),"cvm.request":e=>u({type:"cvm.request.result",id:e.id,message:{}}),"cvm.close":e=>u({type:"cvm.close.result",id:e.id}),"outbox.getEvent":e=>u({type:"outbox.getEvent.result",id:e.id}),"outbox.query":e=>u({type:"outbox.query.result",id:e.id,events:[]}),"outbox.subscribe":e=>u({type:"outbox.closed",subId:e.subId,reason:"reference shell complete"}),"outbox.close":q,"outbox.publish":e=>u({type:"outbox.publish.result",id:e.id,ok:!0}),"outbox.resolveRelays":e=>u({type:"outbox.resolveRelays.result",id:e.id,plan:{}}),"upload.info":e=>u({type:"upload.info.result",id:e.id,info:{rails:[{rail:"nip96",enabled:!0,returns:["https"]},{rail:"blossom",enabled:!0,returns:["https","blossom"]}]}}),"upload.upload":e=>u({type:"upload.upload.result",id:e.id,result:{url:Cn}}),"upload.status":e=>u({type:"upload.status.result",id:e.id,status:{}}),"ble.open":e=>u({type:"ble.open.result",id:e.id,session:{id:"ble-reference",state:"open",device:{id:"reference-device",name:"Reference BLE"}}}),"ble.services":e=>u({type:"ble.services.result",id:e.id,services:[]}),"ble.read":e=>u({type:"ble.read.result",id:e.id,data:[]}),"ble.write":e=>u({type:"ble.write.result",id:e.id}),"ble.subscribe":e=>u({type:"ble.subscribe.result",id:e.id}),"ble.unsubscribe":e=>u({type:"ble.unsubscribe.result",id:e.id}),"ble.close":e=>u({type:"ble.close.result",id:e.id}),"common.encodeNip19":e=>u({type:"common.encodeNip19.result",id:e.id,ok:!0,value:"npub1reference",nip19Type:"npub"}),"common.decodeNip19":e=>u({type:"common.decodeNip19.result",id:e.id,ok:!0,nip19Type:"npub",hex:le}),"common.getProfile":e=>u({type:"common.getProfile.result",id:e.id,ok:!0,pubkey:le,profile:null}),"common.follows":e=>u({type:"common.follows.result",id:e.id,ok:!0,pubkeys:[]}),"common.follow":e=>u({type:"common.follow.result",id:e.id,ok:!0}),"common.unfollow":e=>u({type:"common.unfollow.result",id:e.id,ok:!0}),"common.react":e=>u({type:"common.react.result",id:e.id,ok:!0,eventId:"0".repeat(64)}),"common.report":e=>u({type:"common.report.result",id:e.id,ok:!0,eventId:"1".repeat(64)}),"webrtc.open":e=>u({type:"webrtc.open.result",id:e.id,session:{id:"webrtc-reference",scope:{type:"direct",pubkey:le},channel:"default",state:"connecting"}}),"webrtc.send":e=>u({type:"webrtc.send.result",id:e.id}),"webrtc.close":e=>u({type:"webrtc.close.result",id:e.id}),"link.open":e=>u({type:"link.open.result",id:e.id,status:"opened"}),"count.query":e=>u({type:"count.query.result",id:e.id,ok:!0,count:0}),"lists.supported":e=>u({type:"lists.supported.result",id:e.id,lists:[]}),"lists.add":e=>u({type:"lists.add.result",id:e.id,ok:!0,added:0,skipped:0}),"lists.remove":e=>u({type:"lists.remove.result",id:e.id,ok:!0,removed:0,skipped:0}),"serial.open":e=>u({type:"serial.open.result",id:e.id,session:{id:`serial-${String(e.id)}`,state:"open"}}),"serial.write":e=>u({type:"serial.write.result",id:e.id}),"serial.close":e=>u({type:"serial.close.result",id:e.id}),"fs.info":e=>u({type:"fs.info.result",id:e.id,info:{roots:[{path:"/shared",name:"Shared files",permissions:["read","list","write","create","delete","watch"]}],limits:{maxReadBytes:1048576,maxWriteBytes:1048576,maxWatchCount:16}}}),"fs.pickFile":e=>ke("fs.pickFile.result",e.id,{path:"/picked/file.txt",kind:"file",name:"file.txt",permissions:["read"]}),"fs.pickFiles":e=>ke("fs.pickFiles.result",e.id,{path:"/picked/file.txt",kind:"file",name:"file.txt",permissions:["read"]}),"fs.pickDirectory":e=>ke("fs.pickDirectory.result",e.id,{path:"/picked",kind:"directory",name:"picked",permissions:["read","list"]}),"fs.pickSaveFile":e=>ke("fs.pickSaveFile.result",e.id,{path:"/picked/export.json",kind:"file",name:"export.json",permissions:["write","create"]}),"fs.stat":e=>u({type:"fs.stat.result",id:e.id,metadata:{path:e.path,kind:"file",size:0}}),"fs.list":e=>u({type:"fs.list.result",id:e.id,entries:[]}),"fs.read":e=>u({type:"fs.read.result",id:e.id,result:{data:"",offset:0,bytesRead:0,eof:!0,size:0}}),"fs.write":e=>u({type:"fs.write.result",id:e.id,result:{bytesWritten:0,size:0}}),"fs.mkdir":e=>u({type:"fs.mkdir.result",id:e.id}),"fs.remove":e=>u({type:"fs.remove.result",id:e.id}),"fs.move":e=>u({type:"fs.move.result",id:e.id}),"fs.watch":e=>u({type:"fs.watch.result",id:e.id,watchId:`watch-${String(e.id)}`}),"fs.unwatch":e=>u({type:"fs.unwatch.result",id:e.id})};function Fn(e){const t=new Set;return(r,n)=>{const i=Zn(n),s=Bn(n);if(e.records.push({envelope:n,verdict:s,timestamp:e.now()}),!i||!s.ok)return[];const o=r.domains??_e;if(!o.includes(i.slice(0,i.indexOf("."))))return[];if(i==="shell.ready")return t.has(r.id)?[]:(t.add(r.id),u({type:"shell.init",capabilities:{domains:[...o]},services:[]}));const c=n;if(i==="intent.invoke")return e.intents.handleInvoke(r,c);if(i==="intent.available")return u({type:"intent.available.result",id:c.id,availability:e.intents.availability(c.archetype)});if(i==="intent.handlers")return u({type:"intent.handlers.result",id:c.id,handlers:e.intents.handlers()});if(i==="inc.emit")return Wn(r,c,e.queueDelivery);const a=Mn[i];return a?a(c):[]}}function Zn(e){if(!e||typeof e!="object")return;const t=e.type;return typeof t=="string"?t:void 0}function Wn(e,t,r){if(t.topic!==Dn)return[];const n={type:"inc.event",topic:t.topic,sender:e.id};return"payload"in t&&(n.payload=t.payload),r(jn,n),[]}function Vn(e){return e.kind===5129?`snapshot:${e.id}`:e.kind===15129?`root:${e.pubkey}`:`named:${e.pubkey}:${e.tags.find(t=>t[0]==="d")?.[1]??""}`}function Kn(e,t){if(!e.tags.some(n=>n[0]==="z"&&n[1]===t))return[];const r=[];for(const n of e.tags)n[0]!=="i"||/^napplet:([^/?#]+)\/([^/?#]+)$/.exec(n[1]??"")?.[1]!==t||r.push({convention:n[1],params:n.slice(2)});return r}function Gn(e,t,r){const n=[];for(const i of e){const s=Kn(i,t);if(!s.length)continue;const o=i.tags.find(a=>a[0]==="title")?.[1],c=Vn(i);n.push({id:c,...o?{title:o}:{},actions:[...new Set(s.map(({convention:a})=>a.slice(a.indexOf("/")+1)))],conventions:[...new Set(s.map(({convention:a})=>a))],contracts:s,...c===r?{isDefault:!0}:{}})}return{archetype:t,available:n.length>0,candidates:n,hasDefault:n.some(i=>i.isDefault)}}function zn(e,t=[Un],r={note:Hn}){const n=i=>Gn(t,String(i),r[String(i)]);return{availability:n,handlers:()=>[...new Set(t.flatMap(i=>i.tags.filter(s=>s[0]==="z").map(s=>s[1])))].map(n),handleInvoke(i,s){const o=s.request,c=n(o.archetype).candidates.filter(g=>g.conventions.includes(o.convention)),a=o.handler&&!["default","choose"].includes(o.handler),l=o.handler==="choose"?void 0:a?c.find(g=>g.id===o.handler):c.find(g=>g.isDefault)??c[0];if(!l)return u({type:"intent.invoke.result",id:s.id,result:{ok:!1,error:"no handler"}});const{archetype:f,action:h,convention:m}=o;return e(l.id,structuredClone({type:"intent.deliver",delivery:{sender:i.catalogId,archetype:f,action:h,convention:m,..."payload"in o?{payload:o.payload}:{}}})),u({type:"intent.invoke.result",id:s.id,result:{ok:!0,archetype:f,action:h,convention:m,handler:l.id}})}}}function Yn(e={}){const t=[],r=Xn(),n=Fn({now:e.now??Date.now,records:t,queueDelivery:r.queue,intents:zn(r.queue,e.manifests,e.defaults)});return{get records(){return t},handle:i=>n(_n,i),handleFrom:n,takeDeliveries:r.take,reset(){t.length=0,r.clear()}}}function Xn(){const e=new Map;return{queue(t,r){const n=e.get(t);n?n.push(r):e.set(t,[r])},take(t){const r=e.get(t)??[];return e.delete(t),r},clear(){e.clear()}}}function Jn(e){return{manifestHtml:e.manifestHtml,manifestEvent:e.manifestEvent??null,sandbox:e.sandbox??{allowScripts:!0,allowSameOrigin:!1},installedGlobal:e.boot.installedGlobal,bootError:e.boot.bootError,emitted:e.boot.emitted,forbiddenGlobals:e.forbiddenGlobals??[],degraded:e.boot.degraded,lifecycle:e.lifecycle??null}}var Zt="__nappletConformance.error";function wt(e){return new Promise(t=>setTimeout(t,e))}function Qn(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var er=`(() => {
2
+ const record = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
3
+ const numberIn = (value, min, max) => typeof value === 'number' && Number.isFinite(value) && value >= min && value <= max;
4
+ const isGamepadState = (value) => {
5
+ if (!record(value) || typeof value.available !== 'boolean' || typeof value.focused !== 'boolean' || !Array.isArray(value.pads)) return false;
6
+ if (value.available) {
7
+ if (value.reason !== undefined) return false;
8
+ } else if (value.focused || (value.reason !== 'blocked' && value.reason !== 'unavailable')) return false;
9
+ return Array.from(value.pads).every((pad) => {
10
+ if (pad === null) return true;
11
+ if (!record(pad) || !Number.isInteger(pad.index) || pad.index < 0 || typeof pad.id !== 'string' || typeof pad.mapping !== 'string' || pad.connected !== true) return false;
12
+ if (typeof pad.timestamp !== 'number' || !Number.isFinite(pad.timestamp) || !Array.isArray(pad.axes) || !Array.isArray(pad.buttons)) return false;
13
+ if (!value.focused && pad.timestamp !== 0) return false;
14
+ if (!Array.from(pad.axes).every((axis) => numberIn(axis, -1, 1) && (value.focused || axis === 0))) return false;
15
+ return Array.from(pad.buttons).every((button) => record(button) && numberIn(button.value, 0, 1) && typeof button.pressed === 'boolean' && typeof button.touched === 'boolean' && (value.focused || (button.value === 0 && !button.pressed && !button.touched)));
16
+ });
17
+ };
18
+ const copyGamepadState = (state) => {
19
+ const copy = { available: state.available, focused: state.focused };
20
+ if (state.reason !== undefined) copy.reason = state.reason;
21
+ copy.pads = state.pads.map((pad) => pad === null ? null : {
22
+ index: pad.index, id: pad.id, mapping: pad.mapping, connected: pad.connected,
23
+ timestamp: pad.timestamp, axes: pad.axes.slice(), buttons: pad.buttons.map((button) => ({ value: button.value, pressed: button.pressed, touched: button.touched })),
24
+ });
25
+ return copy;
26
+ };
27
+ return { isGamepadState, copyGamepadState };
28
+ })()`;function tr(e){return`
29
+ (() => {
30
+ const domains = ${JSON.stringify(e)};
31
+ const napplet = {};
32
+ for (const domain of domains) napplet[domain] = {};
33
+ const gamepadTools = ${er};
34
+ let gamepadState = { available: true, focused: false, pads: [] };
35
+ const gamepadHandlers = new Set();
36
+ // Subscribe on first use, like the nap binding, so napplets that never touch
37
+ // gamepad emit no gamepad traffic for checks to attribute to them.
38
+ let gamepadSubscribed = false;
39
+ const gamepadSubscribe = () => {
40
+ if (gamepadSubscribed) return;
41
+ gamepadSubscribed = true;
42
+ window.parent.postMessage({ type: 'gamepad.subscribe' }, '*');
43
+ };
44
+ const pending = new Map();
45
+ let seq = 0;
46
+ const nextId = () => {
47
+ try {
48
+ if (window.crypto && typeof window.crypto.randomUUID === 'function') return window.crypto.randomUUID();
49
+ } catch {}
50
+ seq += 1;
51
+ return 'conformance-' + Date.now().toString(36) + '-' + seq.toString(36);
52
+ };
53
+ const request = (message, resultType, errorType) => new Promise((resolve, reject) => {
54
+ const id = message.id || nextId();
55
+ const timeout = window.setTimeout(() => {
56
+ pending.delete(id);
57
+ reject(new Error(message.type + ' timed out'));
58
+ }, 5000);
59
+ pending.set(id, { resolve, reject, resultType, errorType, timeout });
60
+ window.parent.postMessage({ ...message, id }, '*');
61
+ });
62
+ window.addEventListener('message', (event) => {
63
+ if (event.source !== window.parent) return;
64
+ const msg = event.data;
65
+ if (gamepadSubscribed && msg && msg.type === 'gamepad.state' && !('id' in msg) && gamepadTools.isGamepadState(msg)) {
66
+ gamepadState = gamepadTools.copyGamepadState(msg);
67
+ const recipients = Array.from(gamepadHandlers);
68
+ for (const entry of recipients) {
69
+ if (!gamepadHandlers.has(entry)) continue;
70
+ try { entry.handler(gamepadTools.copyGamepadState(gamepadState)); }
71
+ catch (error) { queueMicrotask(() => { throw error; }); }
72
+ }
73
+ return;
74
+ }
75
+ if (!msg || typeof msg !== 'object' || typeof msg.id !== 'string') return;
76
+ const slot = pending.get(msg.id);
77
+ if (!slot) return;
78
+ if (msg.type !== slot.resultType && msg.type !== slot.errorType) return;
79
+ pending.delete(msg.id);
80
+ window.clearTimeout(slot.timeout);
81
+ if (msg.type === slot.errorType) {
82
+ slot.reject(new Error(msg.message ? msg.error + ': ' + msg.message : String(msg.error || 'request failed')));
83
+ return;
84
+ }
85
+ slot.resolve(msg);
86
+ });
87
+ if (napplet.gamepad) {
88
+ napplet.gamepad = {
89
+ get available() { gamepadSubscribe(); return gamepadState.available; },
90
+ get focused() { gamepadSubscribe(); return gamepadState.focused; },
91
+ getGamepads() { gamepadSubscribe(); return gamepadTools.copyGamepadState(gamepadState).pads; },
92
+ onChange(handler) {
93
+ const entry = { handler };
94
+ gamepadHandlers.add(entry);
95
+ gamepadSubscribe();
96
+ return { close() { gamepadHandlers.delete(entry); } };
97
+ },
98
+ };
99
+ }
100
+ if (napplet.resource) {
101
+ napplet.resource.info = () =>
102
+ request({ type: 'resource.info' }, 'resource.info.result', 'resource.info.error')
103
+ .then((msg) => msg.info);
104
+ napplet.resource.bytes = (url, options) => {
105
+ const message = { type: 'resource.bytes', url: String(url) };
106
+ if (options && options.servers !== undefined) message.servers = options.servers;
107
+ return request(message, 'resource.bytes.result', 'resource.bytes.error')
108
+ .then((msg) => msg.blob);
109
+ };
110
+ napplet.resource.bytesMany = (requests) =>
111
+ request({ type: 'resource.bytesMany', requests: Array.from(requests || []) }, 'resource.bytesMany.result', 'resource.bytesMany.error')
112
+ .then((msg) => msg.items);
113
+ napplet.resource.bytesAsObjectURL = (url) => {
114
+ const handle = { url: '', revoke: () => {} };
115
+ let objectUrl = '';
116
+ let revoked = false;
117
+ const ready = napplet.resource.bytes(url).then((blob) => {
118
+ if (revoked) return;
119
+ objectUrl = URL.createObjectURL(blob);
120
+ handle.url = objectUrl;
121
+ return objectUrl;
122
+ });
123
+ handle.revoke = () => {
124
+ if (revoked) return;
125
+ revoked = true;
126
+ if (objectUrl) URL.revokeObjectURL(objectUrl);
127
+ };
128
+ Object.defineProperty(handle, 'ready', { value: ready, enumerable: false });
129
+ return handle;
130
+ };
131
+ }
132
+ window.napplet = napplet;
133
+ const report = (reason) => {
134
+ try {
135
+ window.parent.postMessage({ type: '${Zt}', reason: String(reason && reason.message || reason) }, '*');
136
+ } catch {}
137
+ };
138
+ window.addEventListener('error', (event) => report(event.error || event.message));
139
+ window.addEventListener('unhandledrejection', (event) => report(event.reason));
140
+ })();
141
+ `}function nr(e,t,r){const n=`<base href="${Qn(t)}">`,i=`<script>${tr(r)}<\/script>`,s=/<head(?:\s[^>]*)?>/i.exec(e);if(s){const o=s.index+s[0].length;return`${e.slice(0,o)}${n}${i}${e.slice(o)}`}return`${n}${i}${e}`}function rr(e){if(!e.startsWith("data:"))return null;const t=e.indexOf(",");if(t<0)return"";const r=e.slice(0,t),n=e.slice(t+1);return r.endsWith(";base64")?atob(n):decodeURIComponent(n)}async function ir(e){if(e==="about:blank")return"<!doctype html><html><head></head><body></body></html>";const t=rr(e);if(t!==null)return t;const r=await fetch(e);if(!r.ok)throw new Error(`Failed to fetch napplet HTML: ${r.status} ${r.statusText}`);return r.text()}async function vt(e,t,r,n){const i=Yn(),s=r.createElement("iframe");s.setAttribute("sandbox",t.allowSameOrigin?"allow-scripts allow-same-origin":"allow-scripts"),s.setAttribute("allow","gamepad 'none'"),s.setAttribute("aria-hidden","true"),s.style.position="absolute",s.style.width="1px",s.style.height="1px",s.style.left="-9999px";let o=null;const c=f=>{if(f.source!==s.contentWindow)return;const h=f.data;if(h&&typeof h=="object"&&h.type===Zt){o=`napplet boot error: ${String(h.reason??"unknown error")}`;return}const m=i.handle(f.data),g=f.source;for(const y of m)g?.postMessage(y,"*")};let a=!1;const l=new Promise(f=>{s.addEventListener("load",()=>{a=!0,f()},{once:!0})});n.addEventListener("message",c),(r.body??r.documentElement).appendChild(s);try{const f=await ir(t.url);s.srcdoc=nr(f,t.url,e)}catch(f){o=f instanceof Error?f.message:String(f)}if(!o){const f=Symbol("timeout");await Promise.race([l.then(()=>"loaded"),wt(t.readyTimeoutMs).then(()=>f)])===f||!a?o=`napplet did not boot (iframe did not load within ${t.readyTimeoutMs}ms; a conformant napplet must run under sandbox="allow-scripts" without allow-same-origin)`:await wt(t.settleMs)}n.removeEventListener("message",c);try{s.remove()}catch{}return{installedGlobal:o===null,bootError:o,emitted:[...i.records]}}async function sr(e){const t=e.document??document,r=e.window??window,n={url:e.url,readyTimeoutMs:e.readyTimeoutMs??5e3,settleMs:e.settleMs,allowSameOrigin:e.allowSameOrigin??!1},i=await vt(_e,n,t,r);let s=null;{const o=await vt([],n,t,r);s={bootError:o.bootError,emitted:o.emitted}}return{installedGlobal:i.installedGlobal,bootError:i.bootError,emitted:i.emitted,degraded:s}}var or=e=>({status:"pass",detail:e}),ar=(e,t)=>({status:"fail",detail:e,diagnostics:t}),cr=e=>({status:"skip",detail:e}),O={pass:or,fail:ar,skip:cr};function lr(e,t){const r=He(e.manifestEvent);return[...r.errors,...r.warnings].filter(n=>t.includes(n.code))}function Se(e,t,r,n="error"){return{id:e,area:"manifest",severity:n,title:t,run:i=>{if(!i.manifestEvent)return O.skip("No NIP-5D manifest event was resolved");const s=lr(i,r);return s.length?O.fail(s[0].message,s):O.pass()}}}var dr=[Se("manifest/event-kind","Resolved event is a NIP-5D napplet manifest",["invalid-napplet-kind","missing-d-tag","unexpected-d-tag"]),Se("manifest/index-html","Manifest declares a hashed /index.html",["invalid-artifact-hash","missing-description","invalid-metadata"]),Se("manifest/requires","R/O tags name bare NAP domains",["invalid-required-nap","invalid-optional-nap"]),Se("manifest/requires-known","R/O domains are in this toolchain registry (advisory)",["unknown-required-nap"],"warning"),{id:"boot/sandbox-allow-scripts",area:"boot",severity:"error",title:"Runs under allow-scripts without allow-same-origin",run:e=>e.sandbox.allowScripts?e.sandbox.allowSameOrigin?O.fail("Napplet relied on allow-same-origin, which a shell must not grant"):O.pass():O.fail("Napplet was not loaded with allow-scripts")},{id:"boot/installs-global",area:"boot",severity:"error",title:"Runs after runtime-injected window.napplet is installed",run:e=>e.installedGlobal?O.pass():O.fail("runtime did not inject window.napplet before load")},{id:"boot/no-boot-error",area:"boot",severity:"error",title:"Boots without an uncaught error",run:e=>e.bootError?O.fail(e.bootError):O.pass()},{id:"boot/no-forbidden-globals",area:"boot",severity:"error",title:"Does not access forbidden browser authority surfaces",run:e=>e.forbiddenGlobals.length?O.fail(`Accessed forbidden surface(s): ${e.forbiddenGlobals.join(", ")}`,e.forbiddenGlobals):O.pass()},{id:"wire/envelope-well-formed",area:"wire",severity:"error",title:"Every emitted envelope is well-formed",run:e=>{if(e.emitted.length===0)return O.skip("Napplet emitted no envelopes");const t=e.emitted.filter(n=>!n.verdict.ok);if(t.length===0)return O.pass(`${e.emitted.length} envelope(s) valid`);const r=t.map(n=>({envelope:n.envelope,errors:n.verdict.errors}));return O.fail(`${t.length}/${e.emitted.length} emitted envelope(s) invalid`,r)}},{id:"degrade/domain-absence",area:"degradation",severity:"error",title:"Does not crash when no NAP domains are injected",run:e=>e.degraded?e.degraded.bootError?O.fail(`Crashed with no injected domains: ${e.degraded.bootError}`):O.pass():O.skip("Host did not run the degraded (no-capabilities) pass")},{id:"lifecycle/clean-teardown",area:"lifecycle",severity:"warning",title:"Tears down listeners on unload",run:e=>e.lifecycle?e.lifecycle.listenerLeak?O.fail("Message listeners remained after unload"):O.pass():O.skip("Lifecycle not measured")}];function ur(e,t={}){const r=t.now??(()=>Date.now()),n=t.checks??dr,i=r(),s=n.map(a=>{const l=a.run(e);return{id:a.id,area:a.area,severity:a.severity,title:a.title,status:l.status,detail:l.detail,diagnostics:l.diagnostics}}),o={total:s.length,passed:s.filter(a=>a.status==="pass").length,failed:s.filter(a=>a.status==="fail").length,skipped:s.filter(a=>a.status==="skip").length,errors:s.filter(a=>a.status==="fail"&&a.severity==="error").length,warnings:s.filter(a=>a.status==="fail"&&a.severity==="warning").length};return{napplet:e.manifestEvent?Ft(e.manifestEvent):void 0,startedAt:i,finishedAt:r(),checks:s,summary:o,ok:o.errors===0}}function fr(e,t){const r=i=>e.tags.find(s=>s[0]===i)?.[1],n=e.tags.filter(i=>i[0]==="server").map(i=>i[1]).filter(Boolean);return[["event",e.id],["kind",e.kind],["d",r("d")],["name",Ft(e)],["requires",t.requires.join(", ")],["optional",t.optional.join(", ")],["artifact hash (x)",r("x")],["servers",n.join(", ")]]}/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */function hr(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array"}function lt(e,t=""){if(!Number.isSafeInteger(e)||e<0){const r=t&&`"${t}" `;throw new Error(`${r}expected integer >= 0, got ${e}`)}}function D(e,t,r=""){const n=hr(e),i=e?.length,s=t!==void 0;if(!n||s&&i!==t){const o=r&&`"${r}" `,c=s?` of length ${t}`:"",a=n?`length=${i}`:`type=${typeof e}`;throw new Error(o+"expected Uint8Array"+c+", got "+a)}return e}function Et(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function pr(e,t){D(e,void 0,"digestInto() output");const r=t.outputLen;if(e.length<r)throw new Error('"digestInto() output" expected to be of length >='+r)}function Qe(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function Ze(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function z(e,t){return e<<32-t|e>>>t}const Wt=typeof Uint8Array.from([]).toHex=="function"&&typeof Uint8Array.fromHex=="function",mr=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function _(e){if(D(e),Wt)return e.toHex();let t="";for(let r=0;r<e.length;r++)t+=mr[e[r]];return t}const J={_0:48,_9:57,A:65,F:70,a:97,f:102};function xt(e){if(e>=J._0&&e<=J._9)return e-J._0;if(e>=J.A&&e<=J.F)return e-(J.A-10);if(e>=J.a&&e<=J.f)return e-(J.a-10)}function X(e){if(typeof e!="string")throw new Error("hex string expected, got "+typeof e);if(Wt)return Uint8Array.fromHex(e);const t=e.length,r=t/2;if(t%2)throw new Error("hex string expected, got unpadded hex of length "+t);const n=new Uint8Array(r);for(let i=0,s=0;i<r;i++,s+=2){const o=xt(e.charCodeAt(s)),c=xt(e.charCodeAt(s+1));if(o===void 0||c===void 0){const a=e[s]+e[s+1];throw new Error('hex string expected, got non-hex character "'+a+'" at index '+s)}n[i]=o*16+c}return n}function Be(...e){let t=0;for(let n=0;n<e.length;n++){const i=e[n];D(i),t+=i.length}const r=new Uint8Array(t);for(let n=0,i=0;n<e.length;n++){const s=e[n];r.set(s,i),i+=s.length}return r}function gr(e,t={}){const r=(i,s)=>e(s).update(i).digest(),n=e(void 0);return r.outputLen=n.outputLen,r.blockLen=n.blockLen,r.create=i=>e(i),Object.assign(r,t),Object.freeze(r)}function Vt(e=32){const t=typeof globalThis=="object"?globalThis.crypto:null;if(typeof t?.getRandomValues!="function")throw new Error("crypto.getRandomValues must be defined");return t.getRandomValues(new Uint8Array(e))}const br=e=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,e])});/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */function Kt(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array"}function Gt(e,t){return Array.isArray(t)?t.length===0?!0:e?t.every(r=>typeof r=="string"):t.every(r=>Number.isSafeInteger(r)):!1}function yr(e){if(typeof e!="function")throw new Error("function expected");return!0}function ye(e,t){if(typeof t!="string")throw new Error(`${e}: string expected`);return!0}function zt(e){if(!Number.isSafeInteger(e))throw new Error(`invalid integer: ${e}`)}function et(e){if(!Array.isArray(e))throw new Error("array expected")}function Yt(e,t){if(!Gt(!0,t))throw new Error(`${e}: array of strings expected`)}function Xt(e,t){if(!Gt(!1,t))throw new Error(`${e}: array of numbers expected`)}function wr(...e){const t=s=>s,r=(s,o)=>c=>s(o(c)),n=e.map(s=>s.encode).reduceRight(r,t),i=e.map(s=>s.decode).reduce(r,t);return{encode:n,decode:i}}function vr(e){const t=typeof e=="string"?e.split(""):e,r=t.length;Yt("alphabet",t);const n=new Map(t.map((i,s)=>[i,s]));return{encode:i=>(et(i),i.map(s=>{if(!Number.isSafeInteger(s)||s<0||s>=r)throw new Error(`alphabet.encode: digit index outside alphabet "${s}". Allowed: ${e}`);return t[s]})),decode:i=>(et(i),i.map(s=>{ye("alphabet.decode",s);const o=n.get(s);if(o===void 0)throw new Error(`Unknown letter: "${s}". Allowed: ${e}`);return o}))}}function Er(e=""){return ye("join",e),{encode:t=>(Yt("join.decode",t),t.join(e)),decode:t=>(ye("join.decode",t),t.split(e))}}const Jt=(e,t)=>t===0?e:Jt(t,e%t),Oe=(e,t)=>e+(t-Jt(e,t)),$e=(()=>{let e=[];for(let t=0;t<40;t++)e.push(2**t);return e})();function tt(e,t,r,n){if(et(e),t<=0||t>32)throw new Error(`convertRadix2: wrong from=${t}`);if(r<=0||r>32)throw new Error(`convertRadix2: wrong to=${r}`);if(Oe(t,r)>32)throw new Error(`convertRadix2: carry overflow from=${t} to=${r} carryBits=${Oe(t,r)}`);let i=0,s=0;const o=$e[t],c=$e[r]-1,a=[];for(const l of e){if(zt(l),l>=o)throw new Error(`convertRadix2: invalid data word=${l} from=${t}`);if(i=i<<t|l,s+t>32)throw new Error(`convertRadix2: carry overflow pos=${s} from=${t}`);for(s+=t;s>=r;s-=r)a.push((i>>s-r&c)>>>0);const f=$e[s];if(f===void 0)throw new Error("invalid carry");i&=f-1}if(i=i<<r-s&c,!n&&s>=t)throw new Error("Excess padding");if(!n&&i>0)throw new Error(`Non-zero padding: ${i}`);return n&&s>0&&a.push(i>>>0),a}function xr(e,t=!1){if(zt(e),e<=0||e>32)throw new Error("radix2: bits should be in (0..32]");if(Oe(8,e)>32||Oe(e,8)>32)throw new Error("radix2: carry overflow");return{encode:r=>{if(!Kt(r))throw new Error("radix2.encode input should be Uint8Array");return tt(Array.from(r),8,e,!t)},decode:r=>(Xt("radix2.decode",r),Uint8Array.from(tt(r,e,8,t)))}}function kt(e){return yr(e),function(...t){try{return e.apply(null,t)}catch{}}}const nt=wr(vr("qpzry9x8gf2tvdw0s3jn54khce6mua7l"),Er("")),St=[996825010,642813549,513874426,1027748829,705979059];function pe(e){const t=e>>25;let r=(e&33554431)<<5;for(let n=0;n<St.length;n++)(t>>n&1)===1&&(r^=St[n]);return r}function Rt(e,t,r=1){const n=e.length;let i=1;for(let s=0;s<n;s++){const o=e.charCodeAt(s);if(o<33||o>126)throw new Error(`Invalid prefix (${e})`);i=pe(i)^o>>5}i=pe(i);for(let s=0;s<n;s++)i=pe(i)^e.charCodeAt(s)&31;for(let s of t)i=pe(i)^s;for(let s=0;s<6;s++)i=pe(i);return i^=r,nt.encode(tt([i%$e[30]],30,5,!1))}function kr(e){const t=e==="bech32"?1:734539939,r=xr(5),n=r.decode,i=r.encode,s=kt(n);function o(h,m,g=90){ye("bech32.encode prefix",h),Kt(m)&&(m=Array.from(m)),Xt("bech32.encode",m);const y=h.length;if(y===0)throw new TypeError(`Invalid prefix length ${y}`);const E=y+7+m.length;if(g!==!1&&E>g)throw new TypeError(`Length ${E} exceeds limit ${g}`);const N=h.toLowerCase(),L=Rt(N,m,t);return`${N}1${nt.encode(m)}${L}`}function c(h,m=90){ye("bech32.decode input",h);const g=h.length;if(g<8||m!==!1&&g>m)throw new TypeError(`invalid string length: ${g} (${h}). Expected (8..${m})`);const y=h.toLowerCase();if(h!==y&&h!==h.toUpperCase())throw new Error("String must be lowercase or uppercase");const E=y.lastIndexOf("1");if(E===0||E===-1)throw new Error('Letter "1" must be present between prefix and data only');const N=y.slice(0,E),L=y.slice(E+1);if(L.length<6)throw new Error("Data must be at least 6 characters long");const K=nt.decode(L).slice(0,-6),Q=Rt(N,K,t);if(!L.endsWith(Q))throw new Error(`Invalid checksum in ${h}: expected "${Q}"`);return{prefix:N,words:K}}const a=kt(c);function l(h){const{prefix:m,words:g}=c(h,!1);return{prefix:m,words:g,bytes:n(g)}}function f(h,m){return o(h,i(m))}return{encode:o,decode:c,encodeFromBytes:f,decodeToBytes:l,decodeUnsafe:a,fromWords:n,fromWordsUnsafe:s,toWords:i}}const It=kr("bech32");var Re=new TextDecoder("utf-8");new TextEncoder;var Sr=5e3;function Rr(e){try{return e.startsWith("nostr:")&&(e=e.substring(6)),Ir(e)}catch{return{type:"invalid",data:null}}}function Ir(e){let{prefix:t,words:r}=It.decode(e,Sr),n=new Uint8Array(It.fromWords(r));switch(t){case"nprofile":{let i=We(n);if(!i[0]?.[0])throw new Error("missing TLV 0 for nprofile");if(i[0][0].length!==32)throw new Error("TLV 0 should be 32 bytes");return{type:"nprofile",data:{pubkey:_(i[0][0]),relays:i[1]?i[1].map(s=>Re.decode(s)):[]}}}case"nevent":{let i=We(n);if(!i[0]?.[0])throw new Error("missing TLV 0 for nevent");if(i[0][0].length!==32)throw new Error("TLV 0 should be 32 bytes");if(i[2]&&i[2][0].length!==32)throw new Error("TLV 2 should be 32 bytes");if(i[3]&&i[3][0].length!==4)throw new Error("TLV 3 should be 4 bytes");return{type:"nevent",data:{id:_(i[0][0]),relays:i[1]?i[1].map(s=>Re.decode(s)):[],author:i[2]?.[0]?_(i[2][0]):void 0,kind:i[3]?.[0]?parseInt(_(i[3][0]),16):void 0}}}case"naddr":{let i=We(n);if(!i[0]?.[0])throw new Error("missing TLV 0 for naddr");if(!i[2]?.[0])throw new Error("missing TLV 2 for naddr");if(i[2][0].length!==32)throw new Error("TLV 2 should be 32 bytes");if(!i[3]?.[0])throw new Error("missing TLV 3 for naddr");if(i[3][0].length!==4)throw new Error("TLV 3 should be 4 bytes");return{type:"naddr",data:{identifier:Re.decode(i[0][0]),pubkey:_(i[2][0]),kind:parseInt(_(i[3][0]),16),relays:i[1]?i[1].map(s=>Re.decode(s)):[]}}}case"nsec":return{type:t,data:n};case"npub":case"note":return{type:t,data:_(n)};default:throw new Error(`unknown prefix ${t}`)}}function We(e){let t={},r=e;for(;r.length>0;){let n=r[0],i=r[1],s=r.slice(2,2+i);if(r=r.slice(2+i),s.length<i)throw new Error(`not enough data to read on TLV ${n}`);t[n]=t[n]||[],t[n].push(s)}return t}function Ar(e,t,r){return e&t^~e&r}function $r(e,t,r){return e&t^e&r^t&r}class Tr{blockLen;outputLen;padOffset;isLE;buffer;view;finished=!1;length=0;pos=0;destroyed=!1;constructor(t,r,n,i){this.blockLen=t,this.outputLen=r,this.padOffset=n,this.isLE=i,this.buffer=new Uint8Array(t),this.view=Ze(this.buffer)}update(t){Et(this),D(t);const{view:r,buffer:n,blockLen:i}=this,s=t.length;for(let o=0;o<s;){const c=Math.min(i-this.pos,s-o);if(c===i){const a=Ze(t);for(;i<=s-o;o+=i)this.process(a,o);continue}n.set(t.subarray(o,o+c),this.pos),this.pos+=c,o+=c,this.pos===i&&(this.process(r,0),this.pos=0)}return this.length+=t.length,this.roundClean(),this}digestInto(t){Et(this),pr(t,this),this.finished=!0;const{buffer:r,view:n,blockLen:i,isLE:s}=this;let{pos:o}=this;r[o++]=128,Qe(this.buffer.subarray(o)),this.padOffset>i-o&&(this.process(n,0),o=0);for(let h=o;h<i;h++)r[h]=0;n.setBigUint64(i-8,BigInt(this.length*8),s),this.process(n,0);const c=Ze(t),a=this.outputLen;if(a%4)throw new Error("_sha2: outputLen must be aligned to 32bit");const l=a/4,f=this.get();if(l>f.length)throw new Error("_sha2: outputLen bigger than state");for(let h=0;h<l;h++)c.setUint32(4*h,f[h],s)}digest(){const{buffer:t,outputLen:r}=this;this.digestInto(t);const n=t.slice(0,r);return this.destroy(),n}_cloneInto(t){t||=new this.constructor,t.set(...this.get());const{blockLen:r,buffer:n,length:i,finished:s,destroyed:o,pos:c}=this;return t.destroyed=o,t.finished=s,t.length=i,t.pos=c,i%r&&t.buffer.set(n),t}clone(){return this._cloneInto()}}const ee=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),Br=Uint32Array.from([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),te=new Uint32Array(64);class Or extends Tr{constructor(t){super(64,t,8,!1)}get(){const{A:t,B:r,C:n,D:i,E:s,F:o,G:c,H:a}=this;return[t,r,n,i,s,o,c,a]}set(t,r,n,i,s,o,c,a){this.A=t|0,this.B=r|0,this.C=n|0,this.D=i|0,this.E=s|0,this.F=o|0,this.G=c|0,this.H=a|0}process(t,r){for(let h=0;h<16;h++,r+=4)te[h]=t.getUint32(r,!1);for(let h=16;h<64;h++){const m=te[h-15],g=te[h-2],y=z(m,7)^z(m,18)^m>>>3,E=z(g,17)^z(g,19)^g>>>10;te[h]=E+te[h-7]+y+te[h-16]|0}let{A:n,B:i,C:s,D:o,E:c,F:a,G:l,H:f}=this;for(let h=0;h<64;h++){const m=z(c,6)^z(c,11)^z(c,25),g=f+m+Ar(c,a,l)+Br[h]+te[h]|0,E=(z(n,2)^z(n,13)^z(n,22))+$r(n,i,s)|0;f=l,l=a,a=c,c=o+g|0,o=s,s=i,i=n,n=g+E|0}n=n+this.A|0,i=i+this.B|0,s=s+this.C|0,o=o+this.D|0,c=c+this.E|0,a=a+this.F|0,l=l+this.G|0,f=f+this.H|0,this.set(n,i,s,o,c,a,l,f)}roundClean(){Qe(te)}destroy(){this.set(0,0,0,0,0,0,0,0),Qe(this.buffer)}}class qr extends Or{A=ee[0]|0;B=ee[1]|0;C=ee[2]|0;D=ee[3]|0;E=ee[4]|0;F=ee[5]|0;G=ee[6]|0;H=ee[7]|0;constructor(){super(32)}}const qe=gr(()=>new qr,br(1));/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const dt=BigInt(0),rt=BigInt(1);function At(e,t=""){if(typeof e!="boolean"){const r=t&&`"${t}" `;throw new Error(r+"expected boolean, got type="+typeof e)}return e}function Nr(e){if(typeof e=="bigint"){if(!_r(e))throw new Error("positive bigint expected, got "+e)}else lt(e);return e}function Qt(e){if(typeof e!="string")throw new Error("hex string expected, got "+typeof e);return e===""?dt:BigInt("0x"+e)}function ut(e){return Qt(_(e))}function en(e){return Qt(_(Lr(D(e)).reverse()))}function ft(e,t){lt(t),e=Nr(e);const r=X(e.toString(16).padStart(t*2,"0"));if(r.length!==t)throw new Error("number too large");return r}function tn(e,t){return ft(e,t).reverse()}function Lr(e){return Uint8Array.from(e)}function Pr(e){return Uint8Array.from(e,(t,r)=>{const n=t.charCodeAt(0);if(t.length!==1||n>127)throw new Error(`string contains non-ASCII character "${e[r]}" with code ${n} at position ${r}`);return n})}const _r=e=>typeof e=="bigint"&&dt<=e;function Cr(e){let t;for(t=0;e>dt;e>>=rt,t+=1);return t}const nn=e=>(rt<<BigInt(e))-rt;function rn(e,t={},r={}){if(!e||typeof e!="object")throw new Error("expected valid options object");function n(s,o,c){const a=e[s];if(c&&a===void 0)return;const l=typeof a;if(l!==o||a===null)throw new Error(`param "${s}" is invalid: expected ${o}, got ${l}`)}const i=(s,o)=>Object.entries(s).forEach(([c,a])=>n(c,a,o));i(t,!1),i(r,!0)}function $t(e){const t=new WeakMap;return(r,...n)=>{const i=t.get(r);if(i!==void 0)return i;const s=e(r,...n);return t.set(r,s),s}}/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const j=BigInt(0),U=BigInt(1),se=BigInt(2),sn=BigInt(3),on=BigInt(4),an=BigInt(5),Hr=BigInt(7),cn=BigInt(8),Ur=BigInt(9),ln=BigInt(16);function V(e,t){const r=e%t;return r>=j?r:t+r}function F(e,t,r){let n=e;for(;t-- >j;)n*=n,n%=r;return n}function Tt(e,t){if(e===j)throw new Error("invert: expected non-zero number");if(t<=j)throw new Error("invert: expected positive modulus, got "+t);let r=V(e,t),n=t,i=j,s=U;for(;r!==j;){const c=n/r,a=n%r,l=i-s*c;n=r,r=a,i=s,s=l}if(n!==U)throw new Error("invert: does not exist");return V(i,t)}function ht(e,t,r){if(!e.eql(e.sqr(t),r))throw new Error("Cannot find square root")}function dn(e,t){const r=(e.ORDER+U)/on,n=e.pow(t,r);return ht(e,n,t),n}function jr(e,t){const r=(e.ORDER-an)/cn,n=e.mul(t,se),i=e.pow(n,r),s=e.mul(t,i),o=e.mul(e.mul(s,se),i),c=e.mul(s,e.sub(o,e.ONE));return ht(e,c,t),c}function Dr(e){const t=Ue(e),r=un(e),n=r(t,t.neg(t.ONE)),i=r(t,n),s=r(t,t.neg(n)),o=(e+Hr)/ln;return(c,a)=>{let l=c.pow(a,o),f=c.mul(l,n);const h=c.mul(l,i),m=c.mul(l,s),g=c.eql(c.sqr(f),a),y=c.eql(c.sqr(h),a);l=c.cmov(l,f,g),f=c.cmov(m,h,y);const E=c.eql(c.sqr(f),a),N=c.cmov(l,f,E);return ht(c,N,a),N}}function un(e){if(e<sn)throw new Error("sqrt is not defined for small field");let t=e-U,r=0;for(;t%se===j;)t/=se,r++;let n=se;const i=Ue(e);for(;Bt(i,n)===1;)if(n++>1e3)throw new Error("Cannot find square root: probably non-prime P");if(r===1)return dn;let s=i.pow(n,t);const o=(t+U)/se;return function(a,l){if(a.is0(l))return l;if(Bt(a,l)!==1)throw new Error("Cannot find square root");let f=r,h=a.mul(a.ONE,s),m=a.pow(l,t),g=a.pow(l,o);for(;!a.eql(m,a.ONE);){if(a.is0(m))return a.ZERO;let y=1,E=a.sqr(m);for(;!a.eql(E,a.ONE);)if(y++,E=a.sqr(E),y===f)throw new Error("Cannot find square root");const N=U<<BigInt(f-y-1),L=a.pow(h,N);f=y,h=a.sqr(L),m=a.mul(m,h),g=a.mul(g,L)}return g}}function Mr(e){return e%on===sn?dn:e%cn===an?jr:e%ln===Ur?Dr(e):un(e)}const Fr=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function Zr(e){const t={ORDER:"bigint",BYTES:"number",BITS:"number"},r=Fr.reduce((n,i)=>(n[i]="function",n),t);return rn(e,r),e}function Wr(e,t,r){if(r<j)throw new Error("invalid exponent, negatives unsupported");if(r===j)return e.ONE;if(r===U)return t;let n=e.ONE,i=t;for(;r>j;)r&U&&(n=e.mul(n,i)),i=e.sqr(i),r>>=U;return n}function fn(e,t,r=!1){const n=new Array(t.length).fill(r?e.ZERO:void 0),i=t.reduce((o,c,a)=>e.is0(c)?o:(n[a]=o,e.mul(o,c)),e.ONE),s=e.inv(i);return t.reduceRight((o,c,a)=>e.is0(c)?o:(n[a]=e.mul(o,n[a]),e.mul(o,c)),s),n}function Bt(e,t){const r=(e.ORDER-U)/se,n=e.pow(t,r),i=e.eql(n,e.ONE),s=e.eql(n,e.ZERO),o=e.eql(n,e.neg(e.ONE));if(!i&&!s&&!o)throw new Error("invalid Legendre symbol result");return i?1:s?0:-1}function Vr(e,t){t!==void 0&&lt(t);const r=t!==void 0?t:e.toString(2).length,n=Math.ceil(r/8);return{nBitLength:r,nByteLength:n}}class Kr{ORDER;BITS;BYTES;isLE;ZERO=j;ONE=U;_lengths;_sqrt;_mod;constructor(t,r={}){if(t<=j)throw new Error("invalid field: expected ORDER > 0, got "+t);let n;this.isLE=!1,r!=null&&typeof r=="object"&&(typeof r.BITS=="number"&&(n=r.BITS),typeof r.sqrt=="function"&&(this.sqrt=r.sqrt),typeof r.isLE=="boolean"&&(this.isLE=r.isLE),r.allowedLengths&&(this._lengths=r.allowedLengths?.slice()),typeof r.modFromBytes=="boolean"&&(this._mod=r.modFromBytes));const{nBitLength:i,nByteLength:s}=Vr(t,n);if(s>2048)throw new Error("invalid field: expected ORDER of <= 2048 bytes");this.ORDER=t,this.BITS=i,this.BYTES=s,this._sqrt=void 0,Object.preventExtensions(this)}create(t){return V(t,this.ORDER)}isValid(t){if(typeof t!="bigint")throw new Error("invalid field element: expected bigint, got "+typeof t);return j<=t&&t<this.ORDER}is0(t){return t===j}isValidNot0(t){return!this.is0(t)&&this.isValid(t)}isOdd(t){return(t&U)===U}neg(t){return V(-t,this.ORDER)}eql(t,r){return t===r}sqr(t){return V(t*t,this.ORDER)}add(t,r){return V(t+r,this.ORDER)}sub(t,r){return V(t-r,this.ORDER)}mul(t,r){return V(t*r,this.ORDER)}pow(t,r){return Wr(this,t,r)}div(t,r){return V(t*Tt(r,this.ORDER),this.ORDER)}sqrN(t){return t*t}addN(t,r){return t+r}subN(t,r){return t-r}mulN(t,r){return t*r}inv(t){return Tt(t,this.ORDER)}sqrt(t){return this._sqrt||(this._sqrt=Mr(this.ORDER)),this._sqrt(this,t)}toBytes(t){return this.isLE?tn(t,this.BYTES):ft(t,this.BYTES)}fromBytes(t,r=!1){D(t);const{_lengths:n,BYTES:i,isLE:s,ORDER:o,_mod:c}=this;if(n){if(!n.includes(t.length)||t.length>i)throw new Error("Field.fromBytes: expected "+n+" bytes, got "+t.length);const l=new Uint8Array(i);l.set(t,s?0:l.length-t.length),t=l}if(t.length!==i)throw new Error("Field.fromBytes: expected "+i+" bytes, got "+t.length);let a=s?en(t):ut(t);if(c&&(a=V(a,o)),!r&&!this.isValid(a))throw new Error("invalid field element: outside of range 0..ORDER");return a}invertBatch(t){return fn(this,t)}cmov(t,r,n){return n?r:t}}function Ue(e,t={}){return new Kr(e,t)}function hn(e){if(typeof e!="bigint")throw new Error("field order must be bigint");const t=e.toString(2).length;return Math.ceil(t/8)}function Gr(e){const t=hn(e);return t+Math.ceil(t/2)}function zr(e,t,r=!1){D(e);const n=e.length,i=hn(t),s=Gr(t);if(n<16||n<s||n>1024)throw new Error("expected "+s+"-1024 bytes of input, got "+n);const o=r?en(e):ut(e),c=V(o,t-U)+U;return r?tn(c,i):ft(c,i)}/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const ue=BigInt(0),oe=BigInt(1);function Ne(e,t){const r=t.negate();return e?r:t}function Ot(e,t){const r=fn(e.Fp,t.map(n=>n.Z));return t.map((n,i)=>e.fromAffine(n.toAffine(r[i])))}function pn(e,t){if(!Number.isSafeInteger(e)||e<=0||e>t)throw new Error("invalid window size, expected [1.."+t+"], got W="+e)}function Ve(e,t){pn(e,t);const r=Math.ceil(t/e)+1,n=2**(e-1),i=2**e,s=nn(e),o=BigInt(e);return{windows:r,windowSize:n,mask:s,maxNumber:i,shiftBy:o}}function qt(e,t,r){const{windowSize:n,mask:i,maxNumber:s,shiftBy:o}=r;let c=Number(e&i),a=e>>o;c>n&&(c-=s,a+=oe);const l=t*n,f=l+Math.abs(c)-1,h=c===0,m=c<0,g=t%2!==0;return{nextN:a,offset:f,isZero:h,isNeg:m,isNegF:g,offsetF:l}}const Ke=new WeakMap,mn=new WeakMap;function Ge(e){return mn.get(e)||1}function Nt(e){if(e!==ue)throw new Error("invalid wNAF")}class Yr{BASE;ZERO;Fn;bits;constructor(t,r){this.BASE=t.BASE,this.ZERO=t.ZERO,this.Fn=t.Fn,this.bits=r}_unsafeLadder(t,r,n=this.ZERO){let i=t;for(;r>ue;)r&oe&&(n=n.add(i)),i=i.double(),r>>=oe;return n}precomputeWindow(t,r){const{windows:n,windowSize:i}=Ve(r,this.bits),s=[];let o=t,c=o;for(let a=0;a<n;a++){c=o,s.push(c);for(let l=1;l<i;l++)c=c.add(o),s.push(c);o=c.double()}return s}wNAF(t,r,n){if(!this.Fn.isValid(n))throw new Error("invalid scalar");let i=this.ZERO,s=this.BASE;const o=Ve(t,this.bits);for(let c=0;c<o.windows;c++){const{nextN:a,offset:l,isZero:f,isNeg:h,isNegF:m,offsetF:g}=qt(n,c,o);n=a,f?s=s.add(Ne(m,r[g])):i=i.add(Ne(h,r[l]))}return Nt(n),{p:i,f:s}}wNAFUnsafe(t,r,n,i=this.ZERO){const s=Ve(t,this.bits);for(let o=0;o<s.windows&&n!==ue;o++){const{nextN:c,offset:a,isZero:l,isNeg:f}=qt(n,o,s);if(n=c,!l){const h=r[a];i=i.add(f?h.negate():h)}}return Nt(n),i}getPrecomputes(t,r,n){let i=Ke.get(r);return i||(i=this.precomputeWindow(r,t),t!==1&&(typeof n=="function"&&(i=n(i)),Ke.set(r,i))),i}cached(t,r,n){const i=Ge(t);return this.wNAF(i,this.getPrecomputes(i,t,n),r)}unsafe(t,r,n,i){const s=Ge(t);return s===1?this._unsafeLadder(t,r,i):this.wNAFUnsafe(s,this.getPrecomputes(s,t,n),r,i)}createCache(t,r){pn(r,this.bits),mn.set(t,r),Ke.delete(t)}hasCache(t){return Ge(t)!==1}}function Xr(e,t,r,n){let i=t,s=e.ZERO,o=e.ZERO;for(;r>ue||n>ue;)r&oe&&(s=s.add(i)),n&oe&&(o=o.add(i)),i=i.double(),r>>=oe,n>>=oe;return{p1:s,p2:o}}function Lt(e,t,r){if(t){if(t.ORDER!==e)throw new Error("Field.ORDER must match order: Fp == p, Fn == n");return Zr(t),t}else return Ue(e,{isLE:r})}function Jr(e,t,r={},n){if(n===void 0&&(n=e==="edwards"),!t||typeof t!="object")throw new Error(`expected valid ${e} CURVE object`);for(const a of["p","n","h"]){const l=t[a];if(!(typeof l=="bigint"&&l>ue))throw new Error(`CURVE.${a} must be positive bigint`)}const i=Lt(t.p,r.Fp,n),s=Lt(t.n,r.Fn,n),c=["Gx","Gy","a","b"];for(const a of c)if(!i.isValid(t[a]))throw new Error(`CURVE.${a} must be valid field element of CURVE.Fp`);return t=Object.freeze(Object.assign({},t)),{CURVE:t,Fp:i,Fn:s}}function Qr(e,t){return function(n){const i=e(n);return{secretKey:i,publicKey:t(i)}}}/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const Pt=(e,t)=>(e+(e>=0?t:-t)/ti)/t;function ei(e,t,r){const[[n,i],[s,o]]=t,c=Pt(o*e,r),a=Pt(-i*e,r);let l=e-c*n-a*s,f=-c*i-a*o;const h=l<me,m=f<me;h&&(l=-l),m&&(f=-f);const g=nn(Math.ceil(Cr(r)/2))+Te;if(l<me||l>=g||f<me||f>=g)throw new Error("splitScalar (endomorphism): failed, k="+e);return{k1neg:h,k1:l,k2neg:m,k2:f}}const me=BigInt(0),Te=BigInt(1),ti=BigInt(2),Ie=BigInt(3),ni=BigInt(4);function ri(e,t={}){const r=Jr("weierstrass",e,t),{Fp:n,Fn:i}=r;let s=r.CURVE;const{h:o,n:c}=s;rn(t,{},{allowInfinityPoint:"boolean",clearCofactor:"function",isTorsionFree:"function",fromBytes:"function",toBytes:"function",endo:"object"});const{endo:a}=t;if(a&&(!n.is0(s.a)||typeof a.beta!="bigint"||!Array.isArray(a.basises)))throw new Error('invalid endo: expected "beta": bigint and "basises": array');const l=si(n,i);function f(){if(!n.isOdd)throw new Error("compression is not supported: Field does not have .isOdd()")}function h(A,p,b){const{x:v,y:x}=p.toAffine(),$=n.toBytes(v);if(At(b,"isCompressed"),b){f();const R=!n.isOdd(x);return Be(ii(R),$)}else return Be(Uint8Array.of(4),$,n.toBytes(x))}function m(A){D(A,void 0,"Point");const{publicKey:p,publicKeyUncompressed:b}=l,v=A.length,x=A[0],$=A.subarray(1);if(v===p&&(x===2||x===3)){const R=n.fromBytes($);if(!n.isValid(R))throw new Error("bad point: is not on curve, wrong x");const k=E(R);let w;try{w=n.sqrt(k)}catch(M){const P=M instanceof Error?": "+M.message:"";throw new Error("bad point: is not on curve, sqrt error"+P)}f();const S=n.isOdd(w);return(x&1)===1!==S&&(w=n.neg(w)),{x:R,y:w}}else if(v===b&&x===4){const R=n.BYTES,k=n.fromBytes($.subarray(0,R)),w=n.fromBytes($.subarray(R,R*2));if(!N(k,w))throw new Error("bad point: is not on curve");return{x:k,y:w}}else throw new Error(`bad point: got length ${v}, expected compressed=${p} or uncompressed=${b}`)}const g=t.toBytes||h,y=t.fromBytes||m;function E(A){const p=n.sqr(A),b=n.mul(p,A);return n.add(n.add(b,n.mul(A,s.a)),s.b)}function N(A,p){const b=n.sqr(p),v=E(A);return n.eql(b,v)}if(!N(s.Gx,s.Gy))throw new Error("bad curve params: generator point");const L=n.mul(n.pow(s.a,Ie),ni),K=n.mul(n.sqr(s.b),BigInt(27));if(n.is0(n.add(L,K)))throw new Error("bad curve params: a or b");function Q(A,p,b=!1){if(!n.isValid(p)||b&&n.is0(p))throw new Error(`bad point coordinate ${A}`);return p}function ve(A){if(!(A instanceof B))throw new Error("Weierstrass Point expected")}function Ee(A){if(!a||!a.basises)throw new Error("no endo");return ei(A,a.basises,i.ORDER)}const xe=$t((A,p)=>{const{X:b,Y:v,Z:x}=A;if(n.eql(x,n.ONE))return{x:b,y:v};const $=A.is0();p==null&&(p=$?n.ONE:n.inv(x));const R=n.mul(b,p),k=n.mul(v,p),w=n.mul(x,p);if($)return{x:n.ZERO,y:n.ZERO};if(!n.eql(w,n.ONE))throw new Error("invZ was invalid");return{x:R,y:k}}),kn=$t(A=>{if(A.is0()){if(t.allowInfinityPoint&&!n.is0(A.Y))return;throw new Error("bad point: ZERO")}const{x:p,y:b}=A.toAffine();if(!n.isValid(p)||!n.isValid(b))throw new Error("bad point: x or y not field elements");if(!N(p,b))throw new Error("bad point: equation left != right");if(!A.isTorsionFree())throw new Error("bad point: not in prime-order subgroup");return!0});function gt(A,p,b,v,x){return b=new B(n.mul(b.X,A),b.Y,b.Z),p=Ne(v,p),b=Ne(x,b),p.add(b)}class B{static BASE=new B(s.Gx,s.Gy,n.ONE);static ZERO=new B(n.ZERO,n.ONE,n.ZERO);static Fp=n;static Fn=i;X;Y;Z;constructor(p,b,v){this.X=Q("x",p),this.Y=Q("y",b,!0),this.Z=Q("z",v),Object.freeze(this)}static CURVE(){return s}static fromAffine(p){const{x:b,y:v}=p||{};if(!p||!n.isValid(b)||!n.isValid(v))throw new Error("invalid affine point");if(p instanceof B)throw new Error("projective point not allowed");return n.is0(b)&&n.is0(v)?B.ZERO:new B(b,v,n.ONE)}static fromBytes(p){const b=B.fromAffine(y(D(p,void 0,"point")));return b.assertValidity(),b}static fromHex(p){return B.fromBytes(X(p))}get x(){return this.toAffine().x}get y(){return this.toAffine().y}precompute(p=8,b=!0){return he.createCache(this,p),b||this.multiply(Ie),this}assertValidity(){kn(this)}hasEvenY(){const{y:p}=this.toAffine();if(!n.isOdd)throw new Error("Field doesn't support isOdd");return!n.isOdd(p)}equals(p){ve(p);const{X:b,Y:v,Z:x}=this,{X:$,Y:R,Z:k}=p,w=n.eql(n.mul(b,k),n.mul($,x)),S=n.eql(n.mul(v,k),n.mul(R,x));return w&&S}negate(){return new B(this.X,n.neg(this.Y),this.Z)}double(){const{a:p,b}=s,v=n.mul(b,Ie),{X:x,Y:$,Z:R}=this;let k=n.ZERO,w=n.ZERO,S=n.ZERO,I=n.mul(x,x),M=n.mul($,$),P=n.mul(R,R),T=n.mul(x,$);return T=n.add(T,T),S=n.mul(x,R),S=n.add(S,S),k=n.mul(p,S),w=n.mul(v,P),w=n.add(k,w),k=n.sub(M,w),w=n.add(M,w),w=n.mul(k,w),k=n.mul(T,k),S=n.mul(v,S),P=n.mul(p,P),T=n.sub(I,P),T=n.mul(p,T),T=n.add(T,S),S=n.add(I,I),I=n.add(S,I),I=n.add(I,P),I=n.mul(I,T),w=n.add(w,I),P=n.mul($,R),P=n.add(P,P),I=n.mul(P,T),k=n.sub(k,I),S=n.mul(P,M),S=n.add(S,S),S=n.add(S,S),new B(k,w,S)}add(p){ve(p);const{X:b,Y:v,Z:x}=this,{X:$,Y:R,Z:k}=p;let w=n.ZERO,S=n.ZERO,I=n.ZERO;const M=s.a,P=n.mul(s.b,Ie);let T=n.mul(b,$),Z=n.mul(v,R),W=n.mul(x,k),ae=n.add(b,v),H=n.add($,R);ae=n.mul(ae,H),H=n.add(T,Z),ae=n.sub(ae,H),H=n.add(b,x);let G=n.add($,k);return H=n.mul(H,G),G=n.add(T,W),H=n.sub(H,G),G=n.add(v,x),w=n.add(R,k),G=n.mul(G,w),w=n.add(Z,W),G=n.sub(G,w),I=n.mul(M,H),w=n.mul(P,W),I=n.add(w,I),w=n.sub(Z,I),I=n.add(Z,I),S=n.mul(w,I),Z=n.add(T,T),Z=n.add(Z,T),W=n.mul(M,W),H=n.mul(P,H),Z=n.add(Z,W),W=n.sub(T,W),W=n.mul(M,W),H=n.add(H,W),T=n.mul(Z,H),S=n.add(S,T),T=n.mul(G,H),w=n.mul(ae,w),w=n.sub(w,T),T=n.mul(ae,Z),I=n.mul(G,I),I=n.add(I,T),new B(w,S,I)}subtract(p){return this.add(p.negate())}is0(){return this.equals(B.ZERO)}multiply(p){const{endo:b}=t;if(!i.isValidNot0(p))throw new Error("invalid scalar: out of range");let v,x;const $=R=>he.cached(this,R,k=>Ot(B,k));if(b){const{k1neg:R,k1:k,k2neg:w,k2:S}=Ee(p),{p:I,f:M}=$(k),{p:P,f:T}=$(S);x=M.add(T),v=gt(b.beta,I,P,R,w)}else{const{p:R,f:k}=$(p);v=R,x=k}return Ot(B,[v,x])[0]}multiplyUnsafe(p){const{endo:b}=t,v=this;if(!i.isValid(p))throw new Error("invalid scalar: out of range");if(p===me||v.is0())return B.ZERO;if(p===Te)return v;if(he.hasCache(this))return this.multiply(p);if(b){const{k1neg:x,k1:$,k2neg:R,k2:k}=Ee(p),{p1:w,p2:S}=Xr(B,v,$,k);return gt(b.beta,w,S,x,R)}else return he.unsafe(v,p)}toAffine(p){return xe(this,p)}isTorsionFree(){const{isTorsionFree:p}=t;return o===Te?!0:p?p(B,this):he.unsafe(this,c).is0()}clearCofactor(){const{clearCofactor:p}=t;return o===Te?this:p?p(B,this):this.multiplyUnsafe(o)}isSmallOrder(){return this.multiplyUnsafe(o).is0()}toBytes(p=!0){return At(p,"isCompressed"),this.assertValidity(),g(B,this,p)}toHex(p=!0){return _(this.toBytes(p))}toString(){return`<Point ${this.is0()?"ZERO":this.toHex()}>`}}const bt=i.BITS,he=new Yr(B,t.endo?Math.ceil(bt/2):bt);return B.BASE.precompute(8),B}function ii(e){return Uint8Array.of(e?2:3)}function si(e,t){return{secretKey:t.BYTES,publicKey:1+e.BYTES,publicKeyUncompressed:1+2*e.BYTES,publicKeyHasPrefix:!0,signature:2*t.BYTES}}/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const je={p:BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),n:BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),h:BigInt(1),a:BigInt(0),b:BigInt(7),Gx:BigInt("0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"),Gy:BigInt("0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8")},oi={beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),basises:[[BigInt("0x3086d221a7d46bcde86c90e49284eb15"),-BigInt("0xe4437ed6010e88286f547fa90abfe4c3")],[BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),BigInt("0x3086d221a7d46bcde86c90e49284eb15")]]},ai=BigInt(0),it=BigInt(2);function ci(e){const t=je.p,r=BigInt(3),n=BigInt(6),i=BigInt(11),s=BigInt(22),o=BigInt(23),c=BigInt(44),a=BigInt(88),l=e*e*e%t,f=l*l*e%t,h=F(f,r,t)*f%t,m=F(h,r,t)*f%t,g=F(m,it,t)*l%t,y=F(g,i,t)*g%t,E=F(y,s,t)*y%t,N=F(E,c,t)*E%t,L=F(N,a,t)*N%t,K=F(L,c,t)*E%t,Q=F(K,r,t)*f%t,ve=F(Q,o,t)*y%t,Ee=F(ve,n,t)*l%t,xe=F(Ee,it,t);if(!Le.eql(Le.sqr(xe),e))throw new Error("Cannot find square root");return xe}const Le=Ue(je.p,{sqrt:ci}),fe=ri(je,{Fp:Le,endo:oi}),_t={};function Pe(e,...t){let r=_t[e];if(r===void 0){const n=qe(Pr(e));r=Be(n,n),_t[e]=r}return qe(Be(r,...t))}const pt=e=>e.toBytes(!0).slice(1),mt=e=>e%it===ai;function st(e){const{Fn:t,BASE:r}=fe,n=t.fromBytes(e),i=r.multiply(n);return{scalar:mt(i.y)?n:t.neg(n),bytes:pt(i)}}function gn(e){const t=Le;if(!t.isValidNot0(e))throw new Error("invalid x: Fail if x ≥ p");const r=t.create(e*e),n=t.create(r*e+BigInt(7));let i=t.sqrt(n);mt(i)||(i=t.neg(i));const s=fe.fromAffine({x:e,y:i});return s.assertValidity(),s}const be=ut;function bn(...e){return fe.Fn.create(be(Pe("BIP0340/challenge",...e)))}function Ct(e){return st(e).bytes}function li(e,t,r=Vt(32)){const{Fn:n}=fe,i=D(e,void 0,"message"),{bytes:s,scalar:o}=st(t),c=D(r,32,"auxRand"),a=n.toBytes(o^be(Pe("BIP0340/aux",c))),l=Pe("BIP0340/nonce",a,s,i),{bytes:f,scalar:h}=st(l),m=bn(f,s,i),g=new Uint8Array(64);if(g.set(f,0),g.set(n.toBytes(n.create(h+m*o)),32),!yn(g,i,s))throw new Error("sign: Invalid signature produced");return g}function yn(e,t,r){const{Fp:n,Fn:i,BASE:s}=fe,o=D(e,64,"signature"),c=D(t,void 0,"message"),a=D(r,32,"publicKey");try{const l=gn(be(a)),f=be(o.subarray(0,32));if(!n.isValidNot0(f))return!1;const h=be(o.subarray(32,64));if(!i.isValidNot0(h))return!1;const m=bn(i.toBytes(f),pt(l),c),g=s.multiplyUnsafe(h).add(l.multiplyUnsafe(i.neg(m))),{x:y,y:E}=g.toAffine();return!(g.is0()||!mt(E)||y!==f)}catch{return!1}}const Y=(()=>{const r=(n=Vt(48))=>zr(n,je.n);return{keygen:Qr(r,Ct),getPublicKey:Ct,sign:li,verify:yn,Point:fe,utils:{randomSecretKey:r,taggedHash:Pe,lift_x:gn,pointToBytes:pt},lengths:{secretKey:32,publicKey:32,publicKeyHasPrefix:!1,signature:64,seed:48}}})();var ie=Symbol("verified"),di=e=>e instanceof Object;function ui(e){if(!di(e)||typeof e.kind!="number"||typeof e.content!="string"||typeof e.created_at!="number"||typeof e.pubkey!="string"||!e.pubkey.match(/^[a-f0-9]{64}$/)||!Array.isArray(e.tags))return!1;for(let t=0;t<e.tags.length;t++){let r=e.tags[t];if(!Array.isArray(r))return!1;for(let n=0;n<r.length;n++)if(typeof r[n]!="string")return!1}return!0}new TextDecoder("utf-8");var fi=new TextEncoder;function ge(e){try{e.indexOf("://")===-1&&(e="wss://"+e);let t=new URL(e);return t.protocol==="http:"?t.protocol="ws:":t.protocol==="https:"&&(t.protocol="wss:"),t.pathname=t.pathname.replace(/\/+/g,"/"),t.pathname.endsWith("/")&&(t.pathname=t.pathname.slice(0,-1)),(t.port==="80"&&t.protocol==="ws:"||t.port==="443"&&t.protocol==="wss:")&&(t.port=""),t.searchParams.sort(),t.hash="",t.toString()}catch{throw new Error(`Invalid URL: ${e}`)}}var hi=class{generateSecretKey(){return Y.utils.randomSecretKey()}getPublicKey(t){return _(Y.getPublicKey(t))}finalizeEvent(t,r){const n=t;return n.pubkey=_(Y.getPublicKey(r)),n.id=ze(n),n.sig=_(Y.sign(X(ze(n)),r)),n[ie]=!0,n}verifyEvent(t){if(typeof t[ie]=="boolean")return t[ie];try{const r=ze(t);if(r!==t.id)return t[ie]=!1,!1;const n=Y.verify(X(t.sig),X(r),X(t.pubkey));return t[ie]=n,n}catch{return t[ie]=!1,!1}}};function pi(e){if(!ui(e))throw new Error("can't serialize event with wrong or missing properties");return JSON.stringify([0,e.pubkey,e.created_at,e.kind,e.tags,e.content])}function ze(e){let t=qe(fi.encode(pi(e)));return _(t)}var De=new hi;De.generateSecretKey;De.getPublicKey;De.finalizeEvent;var mi=De.verifyEvent,gi=22242;function bi(e,t){if(e.ids&&e.ids.indexOf(t.id)===-1||e.kinds&&e.kinds.indexOf(t.kind)===-1||e.authors&&e.authors.indexOf(t.pubkey)===-1)return!1;for(let r in e)if(r[0]==="#"){let n=r.slice(1),i=e[`#${n}`];if(i&&!t.tags.find(([s,o])=>s===r.slice(1)&&i.indexOf(o)!==-1))return!1}return!(e.since&&t.created_at<e.since||e.until&&t.created_at>e.until)}function yi(e,t){for(let r=0;r<e.length;r++)if(bi(e[r],t))return!0;return!1}function wi(e,t){let r=t.length+3,n=e.indexOf(`"${t}":`)+r,i=e.slice(n).indexOf('"')+n+1;return e.slice(i,i+64)}function vi(e){let t=e.slice(0,22).indexOf('"EVENT"');if(t===-1)return null;let r=e.slice(t+7+1).indexOf('"');if(r===-1)return null;let n=t+7+1+r,i=e.slice(n+1,80).indexOf('"');if(i===-1)return null;let s=n+1+i;return e.slice(n+1,s)}function Ei(e,t){return{kind:gi,created_at:Math.floor(Date.now()/1e3),tags:[["relay",e],["challenge",t]],content:""}}var wn=class extends Error{constructor(e,t){super(`Tried to send message '${e} on a closed connection to ${t}.`),this.name="SendingOnClosedConnection"}},vn=class{url;_connected=!1;onclose=null;onnotice=e=>console.debug(`NOTICE from ${this.url}: ${e}`);onauth;baseEoseTimeout=4400;publishTimeout=4400;pingFrequency=29e3;pingTimeout=2e4;resubscribeBackoff=[1e4,1e4,1e4,2e4,2e4,3e4,6e4];openSubs=new Map;enablePing;enableReconnect;idleSince=Date.now();ongoingOperations=0;reconnectTimeoutHandle;pingIntervalHandle;reconnectAttempts=0;skipReconnection=!1;connectionPromise;openCountRequests=new Map;openEventPublishes=new Map;ws;challenge;authPromise;serial=0;verifyEvent;_WebSocket;constructor(e,t){this.url=ge(e),this.verifyEvent=t.verifyEvent,this._WebSocket=t.websocketImplementation||WebSocket,this.enablePing=t.enablePing,this.enableReconnect=t.enableReconnect||!1}static async connect(e,t){const r=new vn(e,t);return await r.connect(t),r}closeAllSubscriptions(e){for(let[t,r]of this.openSubs)r.close(e);this.openSubs.clear();for(let[t,r]of this.openEventPublishes)r.reject(new Error(e));this.openEventPublishes.clear();for(let[t,r]of this.openCountRequests)r.reject(new Error(e));this.openCountRequests.clear()}get connected(){return this._connected}async reconnect(){const e=this.resubscribeBackoff[Math.min(this.reconnectAttempts,this.resubscribeBackoff.length-1)];this.reconnectAttempts++,this.reconnectTimeoutHandle=setTimeout(async()=>{try{await this.connect()}catch{}},e)}handleHardClose(e){this.pingIntervalHandle&&(clearInterval(this.pingIntervalHandle),this.pingIntervalHandle=void 0),this._connected=!1,this.connectionPromise=void 0,this.idleSince=void 0,this.enableReconnect&&!this.skipReconnection?this.reconnect():(this.onclose?.(),this.closeAllSubscriptions(e))}async connect(e){let t;return this.connectionPromise?this.connectionPromise:(this.challenge=void 0,this.authPromise=void 0,this.skipReconnection=!1,this.connectionPromise=new Promise((r,n)=>{e?.timeout&&(t=setTimeout(()=>{n("connection timed out"),this.connectionPromise=void 0,this.skipReconnection=!0,this.onclose?.(),this.handleHardClose("relay connection timed out")},e.timeout)),e?.abort&&(e.abort.onabort=n);try{this.ws=new this._WebSocket(this.url)}catch(i){clearTimeout(t),n(i);return}this.ws.onopen=()=>{this.reconnectTimeoutHandle&&(clearTimeout(this.reconnectTimeoutHandle),this.reconnectTimeoutHandle=void 0),clearTimeout(t),this._connected=!0;const i=this.reconnectAttempts>0;this.reconnectAttempts=0;for(const s of this.openSubs.values()){if(s.eosed=!1,i)for(let o=0;o<s.filters.length;o++)s.lastEmitted&&(s.filters[o].since=s.lastEmitted+1);s.fire()}this.enablePing&&(this.pingIntervalHandle=setInterval(()=>this.pingpong(),this.pingFrequency)),r()},this.ws.onerror=()=>{clearTimeout(t),n("connection failed"),this.connectionPromise=void 0,this.skipReconnection=!0,this.onclose?.(),this.handleHardClose("relay connection failed")},this.ws.onclose=i=>{clearTimeout(t),n(i.message||"websocket closed"),this.handleHardClose("relay connection closed")},this.ws.onmessage=this._onmessage.bind(this)}),this.connectionPromise)}waitForPingPong(){return new Promise(e=>{this.ws.once("pong",()=>e(!0)),this.ws.ping()})}waitForDummyReq(){return new Promise((e,t)=>{if(!this.connectionPromise)return t(new Error(`no connection to ${this.url}, can't ping`));try{const r=this.subscribe([{ids:["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"],limit:0}],{label:"<forced-ping>",oneose:()=>{e(!0),r.close()},onclose(){e(!0)},eoseTimeout:this.pingTimeout+1e3})}catch(r){t(r)}})}async pingpong(){this.ws?.readyState===1&&(await Promise.any([this.ws&&this.ws.ping&&this.ws.once?this.waitForPingPong():this.waitForDummyReq(),new Promise(t=>setTimeout(()=>t(!1),this.pingTimeout))])||this.ws?.readyState===this._WebSocket.OPEN&&this.ws?.close())}async send(e){if(!this.connectionPromise)throw new wn(e,this.url);this.connectionPromise.then(()=>{this.ws?.send(e)})}async auth(e){const t=this.challenge;if(!t)throw new Error("can't perform auth, no challenge was received");return this.authPromise?this.authPromise:(this.authPromise=new Promise(async(r,n)=>{try{let i=await e(Ei(this.url,t)),s=setTimeout(()=>{let o=this.openEventPublishes.get(i.id);o&&(o.reject(new Error("auth timed out")),this.openEventPublishes.delete(i.id))},this.publishTimeout);this.openEventPublishes.set(i.id,{resolve:r,reject:n,timeout:s}),this.send('["AUTH",'+JSON.stringify(i)+"]")}catch(i){console.warn("subscribe auth function failed:",i)}}),this.authPromise)}async publish(e){this.idleSince=void 0,this.ongoingOperations++;const t=new Promise((r,n)=>{const i=setTimeout(()=>{const s=this.openEventPublishes.get(e.id);s&&(s.reject(new Error("publish timed out")),this.openEventPublishes.delete(e.id))},this.publishTimeout);this.openEventPublishes.set(e.id,{resolve:r,reject:n,timeout:i})});return this.send('["EVENT",'+JSON.stringify(e)+"]"),this.ongoingOperations--,this.ongoingOperations===0&&(this.idleSince=Date.now()),t}async count(e,t){this.serial++;const r=t?.id||"count:"+this.serial,n=new Promise((i,s)=>{this.openCountRequests.set(r,{resolve:i,reject:s})});return this.send('["COUNT","'+r+'",'+JSON.stringify(e).substring(1)),n}subscribe(e,t){t.label!=="<forced-ping>"&&(this.idleSince=void 0,this.ongoingOperations++);const r=this.prepareSubscription(e,t);return r.fire(),t.abort&&(t.abort.onabort=()=>r.close(String(t.abort.reason||"<aborted>"))),r}prepareSubscription(e,t){this.serial++;const r=t.id||(t.label?t.label+":":"sub:")+this.serial,n=new xi(this,r,e,t);return this.openSubs.set(r,n),n}close(){this.skipReconnection=!0,this.reconnectTimeoutHandle&&(clearTimeout(this.reconnectTimeoutHandle),this.reconnectTimeoutHandle=void 0),this.pingIntervalHandle&&(clearInterval(this.pingIntervalHandle),this.pingIntervalHandle=void 0),this.closeAllSubscriptions("relay connection closed by us"),this._connected=!1,this.idleSince=void 0,this.onclose?.(),this.ws?.readyState===this._WebSocket.OPEN&&this.ws?.close()}_onmessage(e){const t=e.data;if(!t)return;const r=vi(t);if(r){const n=this.openSubs.get(r);if(!n)return;const i=wi(t,"id"),s=n.alreadyHaveEvent?.(i);if(n.receivedEvent?.(this,i),s)return}try{let n=JSON.parse(t);switch(n[0]){case"EVENT":{const i=this.openSubs.get(n[1]),s=n[2];this.verifyEvent(s)&&yi(i.filters,s)?i.onevent(s):i.oninvalidevent?.(s),(!i.lastEmitted||i.lastEmitted<s.created_at)&&(i.lastEmitted=s.created_at);return}case"COUNT":{const i=n[1],s=n[2],o=this.openCountRequests.get(i);o&&(o.resolve(s.count),this.openCountRequests.delete(i));return}case"EOSE":{const i=this.openSubs.get(n[1]);if(!i)return;i.receivedEose();return}case"OK":{const i=n[1],s=n[2],o=n[3],c=this.openEventPublishes.get(i);c&&(clearTimeout(c.timeout),s?c.resolve(o):c.reject(new Error(o)),this.openEventPublishes.delete(i));return}case"CLOSED":{const i=n[1],s=this.openSubs.get(i);if(!s)return;s.closed=!0,s.close(n[2]);return}case"NOTICE":{this.onnotice(n[1]);return}case"AUTH":{this.challenge=n[1],this.onauth&&this.auth(this.onauth);return}default:{this.openSubs.get(n[1])?.oncustom?.(n);return}}}catch(n){try{const[i,s,o]=JSON.parse(t);console.warn(`[nostr] relay ${this.url} error processing message:`,n,o)}catch{console.warn(`[nostr] relay ${this.url} error processing message:`,n)}return}}},xi=class{relay;id;lastEmitted;closed=!1;eosed=!1;filters;alreadyHaveEvent;receivedEvent;onevent;oninvalidevent;oneose;onclose;oncustom;eoseTimeout;eoseTimeoutHandle;constructor(e,t,r,n){if(r.length===0)throw new Error("subscription can't be created with zero filters");this.relay=e,this.filters=r,this.id=t,this.alreadyHaveEvent=n.alreadyHaveEvent,this.receivedEvent=n.receivedEvent,this.eoseTimeout=n.eoseTimeout||e.baseEoseTimeout,this.oneose=n.oneose,this.onclose=n.onclose,this.oninvalidevent=n.oninvalidevent,this.onevent=n.onevent||(i=>{console.warn(`onevent() callback not defined for subscription '${this.id}' in relay ${this.relay.url}. event received:`,i)})}fire(){this.relay.send('["REQ","'+this.id+'",'+JSON.stringify(this.filters).substring(1)),this.eoseTimeoutHandle=setTimeout(this.receivedEose.bind(this),this.eoseTimeout)}receivedEose(){this.eosed||(clearTimeout(this.eoseTimeoutHandle),this.eosed=!0,this.oneose?.())}close(e="closed by caller"){if(!this.closed&&this.relay.connected){try{this.relay.send('["CLOSE",'+JSON.stringify(this.id)+"]")}catch(t){if(!(t instanceof wn))throw t}this.closed=!0}this.relay.openSubs.delete(this.id),this.relay.ongoingOperations--,this.relay.ongoingOperations===0&&(this.relay.idleSince=Date.now()),this.onclose?.(e)}},ki=e=>(e[ie]=!0,!0),Si=class{relays=new Map;seenOn=new Map;trackRelays=!1;verifyEvent;enablePing;enableReconnect;automaticallyAuth;trustedRelayURLs=new Set;onRelayConnectionFailure;onRelayConnectionSuccess;allowConnectingToRelay;maxWaitForConnection;_WebSocket;constructor(e){this.verifyEvent=e.verifyEvent,this._WebSocket=e.websocketImplementation,this.enablePing=e.enablePing,this.enableReconnect=e.enableReconnect||!1,this.automaticallyAuth=e.automaticallyAuth,this.onRelayConnectionFailure=e.onRelayConnectionFailure,this.onRelayConnectionSuccess=e.onRelayConnectionSuccess,this.allowConnectingToRelay=e.allowConnectingToRelay,this.maxWaitForConnection=e.maxWaitForConnection||3e3}async ensureRelay(e,t){e=ge(e);let r=this.relays.get(e);if(r||(r=new vn(e,{verifyEvent:this.trustedRelayURLs.has(e)?ki:this.verifyEvent,websocketImplementation:this._WebSocket,enablePing:this.enablePing,enableReconnect:this.enableReconnect}),r.onclose=()=>{this.relays.delete(e)},this.relays.set(e,r)),this.automaticallyAuth){const n=this.automaticallyAuth(e);n&&(r.onauth=n)}try{await r.connect({timeout:t?.connectionTimeout,abort:t?.abort})}catch(n){throw this.relays.delete(e),n}return r}close(e){e.map(ge).forEach(t=>{this.relays.get(t)?.close(),this.relays.delete(t)})}subscribe(e,t,r){const n=[],i=[];for(let s=0;s<e.length;s++){const o=ge(e[s]);n.find(c=>c.url===o)||i.indexOf(o)===-1&&(i.push(o),n.push({url:o,filter:t}))}return this.subscribeMap(n,r)}subscribeMany(e,t,r){return this.subscribe(e,t,r)}subscribeMap(e,t){const r=new Map;for(const m of e){const{url:g,filter:y}=m;r.has(g)||r.set(g,[]),r.get(g).push(y)}const n=Array.from(r.entries()).map(([m,g])=>({url:m,filters:g}));this.trackRelays&&(t.receivedEvent=(m,g)=>{let y=this.seenOn.get(g);y||(y=new Set,this.seenOn.set(g,y)),y.add(m)});const i=new Set,s=[],o=[];let c=m=>{o[m]||(o[m]=!0,o.filter(g=>g).length===n.length&&(t.oneose?.(),c=()=>{}))};const a=[];let l=(m,g)=>{a[m]||(c(m),a[m]=g,a.filter(y=>y).length===n.length&&(t.onclose?.(a),l=()=>{}))};const f=m=>{if(t.alreadyHaveEvent?.(m))return!0;const g=i.has(m);return i.add(m),g},h=Promise.all(n.map(async({url:m,filters:g},y)=>{if(this.allowConnectingToRelay?.(m,["read",g])===!1){l(y,"connection skipped by allowConnectingToRelay");return}let E;try{E=await this.ensureRelay(m,{connectionTimeout:this.maxWaitForConnection<(t.maxWait||0)?Math.max(t.maxWait*.8,t.maxWait-1e3):this.maxWaitForConnection,abort:t.abort})}catch(L){this.onRelayConnectionFailure?.(m),l(y,L?.message||String(L));return}this.onRelayConnectionSuccess?.(m);let N=E.subscribe(g,{...t,oneose:()=>c(y),onclose:L=>{L.startsWith("auth-required: ")&&t.onauth?E.auth(t.onauth).then(()=>{E.subscribe(g,{...t,oneose:()=>c(y),onclose:K=>{l(y,K)},alreadyHaveEvent:f,eoseTimeout:t.maxWait,abort:t.abort})}).catch(K=>{l(y,`auth was required and attempted, but failed with: ${K}`)}):l(y,L)},alreadyHaveEvent:f,eoseTimeout:t.maxWait,abort:t.abort});s.push(N)}));return{async close(m){await h,s.forEach(g=>{g.close(m)})}}}subscribeEose(e,t,r){let n;return n=this.subscribe(e,t,{...r,oneose(){const i="closed automatically on eose";n?n.close(i):r.onclose?.(e.map(s=>i))}}),n}subscribeManyEose(e,t,r){return this.subscribeEose(e,t,r)}async querySync(e,t,r){return new Promise(async n=>{const i=[];this.subscribeEose(e,t,{...r,onevent(s){i.push(s)},onclose(s){n(i)}})})}async get(e,t,r){t.limit=1;const n=await this.querySync(e,t,r);return n.sort((i,s)=>s.created_at-i.created_at),n[0]||null}publish(e,t,r){return e.map(ge).map(async(n,i,s)=>{if(s.indexOf(n)!==i)return Promise.reject("duplicate url");if(this.allowConnectingToRelay?.(n,["write",t])===!1)return Promise.reject("connection skipped by allowConnectingToRelay");let o;try{o=await this.ensureRelay(n,{connectionTimeout:this.maxWaitForConnection<(r?.maxWait||0)?Math.max(r.maxWait*.8,r.maxWait-1e3):this.maxWaitForConnection,abort:r?.abort})}catch(c){return this.onRelayConnectionFailure?.(n),"connection failure: "+String(c)}return o.publish(t).catch(async c=>{if(c instanceof Error&&c.message.startsWith("auth-required: ")&&r?.onauth)return await o.auth(r.onauth),o.publish(t);throw c}).then(c=>{if(this.trackRelays){let a=this.seenOn.get(t.id);a||(a=new Set,this.seenOn.set(t.id,a)),a.add(o)}return c})})}listConnectionStatus(){const e=new Map;return this.relays.forEach((t,r)=>e.set(r,t.connected)),e}destroy(){this.relays.forEach(e=>e.close()),this.relays=new Map}pruneIdleRelays(e=1e4){const t=[];for(const[r,n]of this.relays)n.idleSince&&Date.now()-n.idleSince>=e&&(this.relays.delete(r),t.push(r),n.close());return t}},En;try{En=WebSocket}catch{}var Ri=class extends Si{constructor(e){super({verifyEvent:mi,websocketImplementation:En,maxWaitForConnection:3e3,...e})}},ce=Symbol("verified"),Ii=e=>e instanceof Object;function Ai(e){if(!Ii(e)||typeof e.kind!="number"||typeof e.content!="string"||typeof e.created_at!="number"||typeof e.pubkey!="string"||!e.pubkey.match(/^[a-f0-9]{64}$/)||!Array.isArray(e.tags))return!1;for(let t=0;t<e.tags.length;t++){let r=e.tags[t];if(!Array.isArray(r))return!1;for(let n=0;n<r.length;n++)if(typeof r[n]!="string")return!1}return!0}new TextDecoder("utf-8");var $i=new TextEncoder,Ti=class{generateSecretKey(){return Y.utils.randomSecretKey()}getPublicKey(e){return _(Y.getPublicKey(e))}finalizeEvent(e,t){const r=e;return r.pubkey=_(Y.getPublicKey(t)),r.id=Ye(r),r.sig=_(Y.sign(X(Ye(r)),t)),r[ce]=!0,r}verifyEvent(e){if(typeof e[ce]=="boolean")return e[ce];try{const t=Ye(e);if(t!==e.id)return e[ce]=!1,!1;const r=Y.verify(X(e.sig),X(t),X(e.pubkey));return e[ce]=r,r}catch{return e[ce]=!1,!1}}};function Bi(e){if(!Ai(e))throw new Error("can't serialize event with wrong or missing properties");return JSON.stringify([0,e.pubkey,e.created_at,e.kind,e.tags,e.content])}function Ye(e){let t=qe($i.encode(Bi(e)));return _(t)}var Me=new Ti;Me.generateSecretKey;Me.getPublicKey;Me.finalizeEvent;var Oi=Me.verifyEvent;const qi=8e3;function Ni(e){return typeof e=="number"&&ct.includes(e)}function Li(e){try{const t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"}catch{return!1}}function Pi(e){const t=[];for(const r of e??[])try{const n=new URL(r);if(n.protocol!=="ws:"&&n.protocol!=="wss:")continue;t.push(n.href)}catch{}return[...new Set(t)]}function _i(e){const t=Rr(e.trim());if(t.type!=="nevent"&&t.type!=="naddr")throw new Error("Enter a NIP-19 nevent or naddr for a NIP-5D napplet manifest event");const r=Pi(t.data.relays);if(r.length===0)throw new Error("The pointer does not include relay hints; include at least one relay in the nevent/naddr");if(t.type==="nevent"){if(t.data.kind!==void 0&&!Ni(t.data.kind))throw new Error(`nevent points at kind ${t.data.kind}, not a NIP-5D napplet manifest kind`);return{type:"nevent",relays:r,filter:{ids:[t.data.id],kinds:t.data.kind===void 0?[...ct]:[t.data.kind],authors:t.data.author?[t.data.author]:void 0,limit:1}}}if(t.data.kind!==de)throw new Error(`naddr kind ${t.data.kind} is not the named napplet kind ${de}`);return{type:"naddr",relays:r,filter:{kinds:[de],authors:[t.data.pubkey],"#d":[t.data.identifier],limit:1}}}function Ci(e){return{id:e.id,pubkey:e.pubkey,kind:e.kind,tags:e.tags,content:e.content}}async function Hi(e){const t=typeof e=="string"?new TextEncoder().encode(e):e,r=new Uint8Array(t.byteLength);r.set(t);const n=await crypto.subtle.digest("SHA-256",r.buffer);return[...new Uint8Array(n)].map(i=>i.toString(16).padStart(2,"0")).join("")}function Ui(e){const t=[];for(const r of e.tags)if(!(r[0]!=="server"||!r[1]))try{const n=new URL(r[1]);(n.protocol==="http:"||n.protocol==="https:")&&t.push(n.href)}catch{}return[...new Set(t)]}function ji(e,t){const r=e.endsWith("/")?e:`${e}/`;return new URL(t,r).href}async function Di(e,t=fetch){const r=He(e);if(!r.ok)throw new Error(r.errors.map(o=>o.message).join("; "));const n=e.tags.find(o=>o[0]==="x")[1],i=Ui(e);if(i.length===0)throw new Error("Manifest does not include any usable Blossom server hints");const s=[];for(const o of i){const c=ji(o,n);try{const a=await t(c,{mode:"cors"});if(!a.ok){s.push(`${c}: HTTP ${a.status}`);continue}const l=new Uint8Array(await a.arrayBuffer()),f=await Hi(l);if(f!==n){s.push(`${c}: sha256 ${f} did not match manifest ${n}`);continue}return new TextDecoder().decode(l)}catch(a){s.push(`${c}: ${a instanceof Error?a.message:String(a)}`)}}throw new Error(`Unable to fetch verified /index.html from Blossom servers: ${s.join("; ")}`)}async function Mi(e,t){try{const n=await(await t(e,{mode:"cors"})).text();return{source:"url",input:e,label:e,bootUrl:e,html:n,fetched:!0,manifestEvent:null}}catch{return{source:"url",input:e,label:e,bootUrl:e,html:"",fetched:!1,manifestEvent:null}}}async function Fi(e,t){const r=_i(e),n=!t.pool,i=t.pool??new Ri;try{const s=await i.get(r.relays,{...r.filter},{maxWait:t.maxRelayWaitMs??qi});if(!s)throw new Error("No matching napplet manifest event was found on the pointer relay hints");if(!Oi(s))throw new Error("Resolved manifest event signature is invalid");const o=Ci(s),c=He(o);if(!c.ok)throw new Error(`Resolved event is not a valid NIP-5D napplet manifest: ${c.errors[0]?.message}`);const a=await Di(o,t.fetcher??fetch),l=(t.createObjectUrl??URL.createObjectURL)(new Blob([a],{type:"text/html;charset=utf-8"})),f=()=>(t.revokeObjectUrl??URL.revokeObjectURL)(l);return{source:"nostr",input:e,label:o.id??e,bootUrl:l,html:a,fetched:!0,manifestEvent:o,revoke:f}}finally{n&&i.destroy()}}async function Zi(e,t={}){const r=e.trim();if(!r)throw new Error("Enter a NIP-19 nevent/naddr, or an HTTP URL for local dev");return Li(r)?Mi(r,t.fetcher??fetch):Fi(r,t)}const Wi=/\bwindow\s*\.\s*nostr\b|\bglobalThis\s*\.\s*nostr\b/,Vi="/__conformance__/events",ot=new URLSearchParams(location.search),xn=ot.get("live")==="1";function ne(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}const re=document.getElementById("app");function Ki(){return re.innerHTML=`
142
+ <header class="masthead">
143
+ <h1>napplet conformance ${xn?'<span class="live-badge" id="live-badge">● live</span>':""}</h1>
144
+ <p>Load a napplet by <code>nevent</code> or <code>naddr</code> and run NAP protocol conformance live. Same engine as <code>napplet-conformance</code> CI.</p>
145
+ </header>
146
+ <form id="run-form" class="runbar">
147
+ <input id="target" type="text" placeholder="naddr1… or nevent1… for a NIP-5D napplet manifest" autocomplete="off" spellcheck="false" />
148
+ <button id="run" type="submit">Run conformance</button>
149
+ <button id="rerun" type="button" class="secondary" hidden>Re-run</button>
150
+ </form>
151
+ <p id="status" class="status" role="status"></p>
152
+ <section id="output" class="output"></section>
153
+ `,{targetInput:re.querySelector("#target"),runButton:re.querySelector("#run"),rerunButton:re.querySelector("#rerun"),liveBadge:re.querySelector("#live-badge")??document.createElement("span"),status:re.querySelector("#status"),output:re.querySelector("#output")}}const C=Ki();let we="",at=0;function Ae(e,t="info"){C.status.textContent=e,C.status.dataset.kind=t}function Xe(e){return String(e).padStart(2,"0")}function Gi(e){const t=new Date(e);return`${Xe(t.getHours())}:${Xe(t.getMinutes())}:${Xe(t.getSeconds())}`}function zi(e){const t=e.ok?"conformant":"non-conformant",n=[...new Set(e.checks.map(o=>o.area))].map(o=>{const c=e.checks.filter(a=>a.area===o).map(a=>{const l=a.severity==="warning"&&a.status==="fail"?' <span class="tag warn">warning</span>':"",f=a.detail?`<span class="detail">${ne(a.detail)}</span>`:"";return`<li class="check ${a.status}"><span class="badge ${a.status}">${a.status}</span><span class="id">${ne(a.id)}</span>${l}${f}</li>`}).join("");return`<div class="area"><h3>${ne(o)}</h3><ul>${c}</ul></div>`}).join(""),i=e.summary,s=at>1?`<span class="run-stamp">run #${at} · ${Gi(e.finishedAt)}</span>`:"";return`
154
+ <div class="verdict ${t}">
155
+ <span class="result">${e.ok?"CONFORMANT":"NON-CONFORMANT"}</span>
156
+ <span class="counts">${i.passed} passed · ${i.failed} failed · ${i.skipped} skipped${i.warnings?` · ${i.warnings} warning(s)`:""}</span>
157
+ ${s}
158
+ </div>
159
+ <div class="checks">${n}</div>
160
+ `}function Yi(e){return e.length===0?'<p class="empty">No envelopes were emitted.</p>':`<ul class="envlog">${e.map(r=>{const n=r.verdict.ok?"ok":"bad",i=r.verdict.ok?"":`<div class="errs">${r.verdict.errors.map(s=>ne(`${s.code}: ${s.message}`)).join("<br>")}</div>`;return`<li class="env ${n}"><code>${ne(JSON.stringify(r.envelope))}</code>${i}</li>`}).join("")}</ul>`}function Xi(e){const t=(r,n)=>`<tr><th>${ne(r)}</th><td>${n?ne(String(n)):"<em>—</em>"}</td></tr>`;if(e.manifestEvent){const r=e.manifestEvent,n=He(r);return`
161
+ <table class="manifest">
162
+ ${fr(r,n).map(([i,s])=>t(i,s)).join("")}
163
+ </table>
164
+ ${n.errors.length?`<div class="errs">${n.errors.map(i=>ne(`${i.code}: ${i.message}`)).join("<br>")}</div>`:""}
165
+ `}return e.fetched?'<p class="empty">Local URL mode booted raw HTML. It does not include a signed NIP-5D manifest event, so manifest-event checks are skipped.</p>':`<p class="empty">Couldn't fetch the local URL HTML, likely because of CORS. Use a NIP-19 <code>nevent</code>/<code>naddr</code> for authoritative manifest checks, or use the CLI for local URL runs.</p>`}function Ji(e,t,r){C.output.innerHTML=`
166
+ ${zi(e)}
167
+ <div class="panels">
168
+ <section class="panel"><h2>Emitted envelopes (${t.length})</h2>${Yi(t)}</section>
169
+ <section class="panel"><h2>Manifest</h2>${Xi(r)}</section>
170
+ </div>
171
+ `}async function Fe(e){we=e,C.runButton.disabled=!0,C.rerunButton.disabled=!0;let t=null;try{Ae(`Resolving ${e} …`),t=await Zi(e);const r=Wi.test(t.html)?["window.nostr"]:[];Ae("Booting napplet in a sandboxed iframe …");const n=await sr({url:t.bootUrl,readyTimeoutMs:5e3,settleMs:800,runDegraded:!0}),i=Jn({manifestHtml:t.html,manifestEvent:t.manifestEvent,boot:n,forbiddenGlobals:r}),s=ur(i);at+=1,Ae(s.ok?"Done — conformant.":"Done — non-conformant.",s.ok?"info":"error"),Ji(s,n.emitted,t),C.rerunButton.hidden=!1}catch(r){Ae(`Error: ${r instanceof Error?r.message:String(r)}`,"error")}finally{t?.revoke?.(),C.runButton.disabled=!1,C.rerunButton.disabled=!1}}function Qi(){if(!xn||typeof EventSource>"u")return;let e=!1;const t=new EventSource(Vi);t.addEventListener("rerun",()=>{!we||e||(e=!0,setTimeout(()=>{e=!1,Fe(we)},50))}),t.addEventListener("open",()=>{C.liveBadge&&(C.liveBadge.dataset.state="connected")}),t.addEventListener("error",()=>{C.liveBadge&&(C.liveBadge.dataset.state="disconnected")})}C.runButton.parentElement.addEventListener("submit",e=>{e.preventDefault();const t=C.targetInput.value.trim();if(t){const r=new URL(location.href);r.searchParams.set("target",t),r.searchParams.delete("url"),history.replaceState(null,"",r),Fe(t)}});C.rerunButton.addEventListener("click",()=>{we&&Fe(we)});Qi();const Je=ot.get("target")??ot.get("url");Je&&(C.targetInput.value=Je,Fe(Je));
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>napplet conformance runtime</title>
7
7
  <meta name="description" content="Load a napplet and run NAP protocol conformance checks live in your browser." />
8
- <script type="module" crossorigin src="/assets/index-CS2zxBsY.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-B0s98LMQ.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="/assets/index-D4WUxbBl.css">
10
10
  </head>
11
11
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@napplet/conformance-cli",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "Headless CLI that runs @napplet/conformance against a napplet in real Chromium via Playwright — the `test:conformance` runner",
5
5
  "type": "module",
6
6
  "bin": {
@@ -14,8 +14,11 @@
14
14
  "access": "public"
15
15
  },
16
16
  "dependencies": {
17
+ "@kehto/paja": ">=0.21.0 <0.22.0",
17
18
  "playwright": "^1.59.1",
18
- "@napplet/conformance": "^0.19.0"
19
+ "@napplet/conformance": "^0.20.0",
20
+ "@napplet/core": "0.34.0",
21
+ "@napplet/nap": "0.34.0"
19
22
  },
20
23
  "devDependencies": {
21
24
  "@types/node": "^22.15.0",