webpeerjs 0.1.6 โ 0.1.7
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.
- package/dist/esm/webpeerjs.js +18 -18
- package/dist/umd/webpeerjs.js +19 -19
- package/package.json +88 -88
- package/src/config.js +13 -7
- package/src/utils.js +68 -17
- package/src/webpeerjs.js +46 -19
package/dist/esm/webpeerjs.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
//! WebPEER.js -- https://github.com/nuzulul/webpeerjs
|
|
2
|
-
const e="webpeerjs",t=e,n="/"+e+"/1.0.0",r=e+"-dbstore",s=["universal-connectivity-browser-peer-discovery"],i=[e+"-peer-discovery"],o=["_"+e+"-peer-data_"],a="https://delegated-ipfs.dev",c="https://dns.google/resolve",l="_dnsaddr.bootstrap.libp2p.io",u=15e3,h=!1,d="stun:stun.l.google.com:19302",p=["QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN","QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb","QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt","QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ"],f=["12D3KooWFhXabKDwALpzqMbto94sB7rvmZ6M28hs9Y9xSopDKwQr"],g=p.concat(f),m=[{Peers:[{Addrs:["/dns6/sv15.bootstrap.libp2p.io/tcp/443/wss","/dns4/sv15.bootstrap.libp2p.io/tcp/443/wss"],ID:"QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",Schema:"peer"}]},{Peers:[{Addrs:["/dns4/am6.bootstrap.libp2p.io/tcp/443/wss","/dns6/am6.bootstrap.libp2p.io/tcp/443/wss"],ID:"QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",Schema:"peer"}]},{Peers:[{Addrs:["/dns6/sg1.bootstrap.libp2p.io/tcp/443/wss","/dns4/sg1.bootstrap.libp2p.io/tcp/443/wss"],ID:"QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",Schema:"peer"}]}];function y(e=0){return new Uint8Array(e)}function w(e=0){return new Uint8Array(e)}const b=Math.pow(2,7),v=Math.pow(2,14),E=Math.pow(2,21),S=Math.pow(2,28),_=Math.pow(2,35),I=Math.pow(2,42),R=Math.pow(2,49),A=128,T=127;function D(e){if(e<b)return 1;if(e<v)return 2;if(e<E)return 3;if(e<S)return 4;if(e<_)return 5;if(e<I)return 6;if(e<R)return 7;if(null!=Number.MAX_SAFE_INTEGER&&e>Number.MAX_SAFE_INTEGER)throw new RangeError("Could not encode varint");return 8}function k(e,t,n=0){switch(D(e)){case 8:t[n++]=255&e|A,e/=128;case 7:t[n++]=255&e|A,e/=128;case 6:t[n++]=255&e|A,e/=128;case 5:t[n++]=255&e|A,e/=128;case 4:t[n++]=255&e|A,e>>>=7;case 3:t[n++]=255&e|A,e>>>=7;case 2:t[n++]=255&e|A,e>>>=7;case 1:t[n++]=255&e,e>>>=7;break;default:throw new Error("unreachable")}return t}function P(e,t){let n=e[t],r=0;if(r+=n&T,n<A)return r;if(n=e[t+1],r+=(n&T)<<7,n<A)return r;if(n=e[t+2],r+=(n&T)<<14,n<A)return r;if(n=e[t+3],r+=(n&T)<<21,n<A)return r;if(n=e[t+4],r+=(n&T)*S,n<A)return r;if(n=e[t+5],r+=(n&T)*_,n<A)return r;if(n=e[t+6],r+=(n&T)*I,n<A)return r;if(n=e[t+7],r+=(n&T)*R,n<A)return r;throw new RangeError("Could not decode varint")}function C(e,t,n=0){return null==t&&(t=w(D(e))),t instanceof Uint8Array?k(e,t,n):function(e,t,n=0){switch(D(e)){case 8:t.set(n++,255&e|A),e/=128;case 7:t.set(n++,255&e|A),e/=128;case 6:t.set(n++,255&e|A),e/=128;case 5:t.set(n++,255&e|A),e/=128;case 4:t.set(n++,255&e|A),e>>>=7;case 3:t.set(n++,255&e|A),e>>>=7;case 2:t.set(n++,255&e|A),e>>>=7;case 1:t.set(n++,255&e),e>>>=7;break;default:throw new Error("unreachable")}return t}(e,t,n)}function x(e,t=0){return e instanceof Uint8Array?P(e,t):function(e,t){let n=e.get(t),r=0;if(r+=n&T,n<A)return r;if(n=e.get(t+1),r+=(n&T)<<7,n<A)return r;if(n=e.get(t+2),r+=(n&T)<<14,n<A)return r;if(n=e.get(t+3),r+=(n&T)<<21,n<A)return r;if(n=e.get(t+4),r+=(n&T)*S,n<A)return r;if(n=e.get(t+5),r+=(n&T)*_,n<A)return r;if(n=e.get(t+6),r+=(n&T)*I,n<A)return r;if(n=e.get(t+7),r+=(n&T)*R,n<A)return r;throw new RangeError("Could not decode varint")}(e,t)}const N=new Float32Array([-0]),M=new Uint8Array(N.buffer);function O(e,t,n){N[0]=e,t[n]=M[0],t[n+1]=M[1],t[n+2]=M[2],t[n+3]=M[3]}const L=new Float64Array([-0]),B=new Uint8Array(L.buffer);function U(e,t,n){L[0]=e,t[n]=B[0],t[n+1]=B[1],t[n+2]=B[2],t[n+3]=B[3],t[n+4]=B[4],t[n+5]=B[5],t[n+6]=B[6],t[n+7]=B[7]}const F=BigInt(Number.MAX_SAFE_INTEGER),V=BigInt(Number.MIN_SAFE_INTEGER);class K{lo;hi;constructor(e,t){this.lo=0|e,this.hi=0|t}toNumber(e=!1){if(!e&&this.hi>>>31>0){const e=1+~this.lo>>>0;let t=~this.hi>>>0;return 0===e&&(t=t+1>>>0),-(e+4294967296*t)}return this.lo+4294967296*this.hi}toBigInt(e=!1){if(e)return BigInt(this.lo>>>0)+(BigInt(this.hi>>>0)<<32n);if(this.hi>>>31!=0){const e=1+~this.lo>>>0;let t=~this.hi>>>0;return 0===e&&(t=t+1>>>0),-(BigInt(e)+(BigInt(t)<<32n))}return BigInt(this.lo>>>0)+(BigInt(this.hi>>>0)<<32n)}toString(e=!1){return this.toBigInt(e).toString()}zzEncode(){const e=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^e)>>>0,this.lo=(this.lo<<1^e)>>>0,this}zzDecode(){const e=-(1&this.lo);return this.lo=((this.lo>>>1|this.hi<<31)^e)>>>0,this.hi=(this.hi>>>1^e)>>>0,this}length(){const e=this.lo,t=(this.lo>>>28|this.hi<<4)>>>0,n=this.hi>>>24;return 0===n?0===t?e<16384?e<128?1:2:e<2097152?3:4:t<16384?t<128?5:6:t<2097152?7:8:n<128?9:10}static fromBigInt(e){if(0n===e)return $;if(e<F&&e>V)return this.fromNumber(Number(e));const t=e<0n;t&&(e=-e);let n=e>>32n,r=e-(n<<32n);return t&&(n=0n|~n,r=0n|~r,++r>q&&(r=0n,++n>q&&(n=0n))),new K(Number(r),Number(n))}static fromNumber(e){if(0===e)return $;const t=e<0;t&&(e=-e);let n=e>>>0,r=(e-n)/4294967296>>>0;return t&&(r=~r>>>0,n=~n>>>0,++n>4294967295&&(n=0,++r>4294967295&&(r=0))),new K(n,r)}static from(e){return"number"==typeof e?K.fromNumber(e):"bigint"==typeof e?K.fromBigInt(e):"string"==typeof e?K.fromBigInt(BigInt(e)):null!=e.low||null!=e.high?new K(e.low>>>0,e.high>>>0):$}}const $=new K(0,0);$.toBigInt=function(){return 0n},$.zzEncode=$.zzDecode=function(){return this},$.length=function(){return 1};const q=4294967296n;function H(e,t,n){const r=n;let s,i;for(let r=0;r<e.length;++r)s=e.charCodeAt(r),s<128?t[n++]=s:s<2048?(t[n++]=s>>6|192,t[n++]=63&s|128):55296==(64512&s)&&56320==(64512&(i=e.charCodeAt(r+1)))?(s=65536+((1023&s)<<10)+(1023&i),++r,t[n++]=s>>18|240,t[n++]=s>>12&63|128,t[n++]=s>>6&63|128,t[n++]=63&s|128):(t[n++]=s>>12|224,t[n++]=s>>6&63|128,t[n++]=63&s|128);return n-r}function z(e,t){return RangeError(`index out of range: ${e.pos} + ${t??1} > ${e.len}`)}function W(e,t){return(e[t-4]|e[t-3]<<8|e[t-2]<<16|e[t-1]<<24)>>>0}class j{buf;pos;len;_slice=Uint8Array.prototype.subarray;constructor(e){this.buf=e,this.pos=0,this.len=e.length}uint32(){let e=4294967295;if(e=(127&this.buf[this.pos])>>>0,this.buf[this.pos++]<128)return e;if(e=(e|(127&this.buf[this.pos])<<7)>>>0,this.buf[this.pos++]<128)return e;if(e=(e|(127&this.buf[this.pos])<<14)>>>0,this.buf[this.pos++]<128)return e;if(e=(e|(127&this.buf[this.pos])<<21)>>>0,this.buf[this.pos++]<128)return e;if(e=(e|(15&this.buf[this.pos])<<28)>>>0,this.buf[this.pos++]<128)return e;if((this.pos+=5)>this.len)throw this.pos=this.len,z(this,10);return e}int32(){return 0|this.uint32()}sint32(){const e=this.uint32();return e>>>1^-(1&e)}bool(){return 0!==this.uint32()}fixed32(){if(this.pos+4>this.len)throw z(this,4);return W(this.buf,this.pos+=4)}sfixed32(){if(this.pos+4>this.len)throw z(this,4);return 0|W(this.buf,this.pos+=4)}float(){if(this.pos+4>this.len)throw z(this,4);const e=(t=this.buf,n=this.pos,M[0]=t[n],M[1]=t[n+1],M[2]=t[n+2],M[3]=t[n+3],N[0]);var t,n;return this.pos+=4,e}double(){if(this.pos+8>this.len)throw z(this,4);const e=(t=this.buf,n=this.pos,B[0]=t[n],B[1]=t[n+1],B[2]=t[n+2],B[3]=t[n+3],B[4]=t[n+4],B[5]=t[n+5],B[6]=t[n+6],B[7]=t[n+7],L[0]);var t,n;return this.pos+=8,e}bytes(){const e=this.uint32(),t=this.pos,n=this.pos+e;if(n>this.len)throw z(this,e);return this.pos+=e,t===n?new Uint8Array(0):this.buf.subarray(t,n)}string(){const e=this.bytes();return function(e,t,n){if(n-t<1)return"";let r;const s=[];let i,o=0;for(;t<n;)i=e[t++],i<128?s[o++]=i:i>191&&i<224?s[o++]=(31&i)<<6|63&e[t++]:i>239&&i<365?(i=((7&i)<<18|(63&e[t++])<<12|(63&e[t++])<<6|63&e[t++])-65536,s[o++]=55296+(i>>10),s[o++]=56320+(1023&i)):s[o++]=(15&i)<<12|(63&e[t++])<<6|63&e[t++],o>8191&&((r??(r=[])).push(String.fromCharCode.apply(String,s)),o=0);return null!=r?(o>0&&r.push(String.fromCharCode.apply(String,s.slice(0,o))),r.join("")):String.fromCharCode.apply(String,s.slice(0,o))}(e,0,e.length)}skip(e){if("number"==typeof e){if(this.pos+e>this.len)throw z(this,e);this.pos+=e}else do{if(this.pos>=this.len)throw z(this)}while(128&this.buf[this.pos++]);return this}skipType(e){switch(e){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;4!=(e=7&this.uint32());)this.skipType(e);break;case 5:this.skip(4);break;default:throw Error(`invalid wire type ${e} at offset ${this.pos}`)}return this}readLongVarint(){const e=new K(0,0);let t=0;if(!(this.len-this.pos>4)){for(;t<3;++t){if(this.pos>=this.len)throw z(this);if(e.lo=(e.lo|(127&this.buf[this.pos])<<7*t)>>>0,this.buf[this.pos++]<128)return e}return e.lo=(e.lo|(127&this.buf[this.pos++])<<7*t)>>>0,e}for(;t<4;++t)if(e.lo=(e.lo|(127&this.buf[this.pos])<<7*t)>>>0,this.buf[this.pos++]<128)return e;if(e.lo=(e.lo|(127&this.buf[this.pos])<<28)>>>0,e.hi=(e.hi|(127&this.buf[this.pos])>>4)>>>0,this.buf[this.pos++]<128)return e;if(t=0,this.len-this.pos>4){for(;t<5;++t)if(e.hi=(e.hi|(127&this.buf[this.pos])<<7*t+3)>>>0,this.buf[this.pos++]<128)return e}else for(;t<5;++t){if(this.pos>=this.len)throw z(this);if(e.hi=(e.hi|(127&this.buf[this.pos])<<7*t+3)>>>0,this.buf[this.pos++]<128)return e}throw Error("invalid varint encoding")}readFixed64(){if(this.pos+8>this.len)throw z(this,8);const e=W(this.buf,this.pos+=4),t=W(this.buf,this.pos+=4);return new K(e,t)}int64(){return this.readLongVarint().toBigInt()}int64Number(){return this.readLongVarint().toNumber()}int64String(){return this.readLongVarint().toString()}uint64(){return this.readLongVarint().toBigInt(!0)}uint64Number(){const e=P(this.buf,this.pos);return this.pos+=D(e),e}uint64String(){return this.readLongVarint().toString(!0)}sint64(){return this.readLongVarint().zzDecode().toBigInt()}sint64Number(){return this.readLongVarint().zzDecode().toNumber()}sint64String(){return this.readLongVarint().zzDecode().toString()}fixed64(){return this.readFixed64().toBigInt()}fixed64Number(){return this.readFixed64().toNumber()}fixed64String(){return this.readFixed64().toString()}sfixed64(){return this.readFixed64().toBigInt()}sfixed64Number(){return this.readFixed64().toNumber()}sfixed64String(){return this.readFixed64().toString()}}function G(e,t,n){const r=function(e){return new j(e instanceof Uint8Array?e:e.subarray())}(e);return t.decode(r,void 0,n)}function Y(e){if(e instanceof Uint8Array&&"Uint8Array"===e.constructor.name)return e;if(e instanceof ArrayBuffer)return new Uint8Array(e);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength);throw new Error("Unknown type, must be binary type")}var Q=function(e,t){if(e.length>=255)throw new TypeError("Alphabet too long");for(var n=new Uint8Array(256),r=0;r<n.length;r++)n[r]=255;for(var s=0;s<e.length;s++){var i=e.charAt(s),o=i.charCodeAt(0);if(255!==n[o])throw new TypeError(i+" is ambiguous");n[o]=s}var a=e.length,c=e.charAt(0),l=Math.log(a)/Math.log(256),u=Math.log(256)/Math.log(a);function h(e){if("string"!=typeof e)throw new TypeError("Expected String");if(0===e.length)return new Uint8Array;var t=0;if(" "!==e[t]){for(var r=0,s=0;e[t]===c;)r++,t++;for(var i=(e.length-t)*l+1>>>0,o=new Uint8Array(i);e[t];){var u=n[e.charCodeAt(t)];if(255===u)return;for(var h=0,d=i-1;(0!==u||h<s)&&-1!==d;d--,h++)u+=a*o[d]>>>0,o[d]=u%256>>>0,u=u/256>>>0;if(0!==u)throw new Error("Non-zero carry");s=h,t++}if(" "!==e[t]){for(var p=i-s;p!==i&&0===o[p];)p++;for(var f=new Uint8Array(r+(i-p)),g=r;p!==i;)f[g++]=o[p++];return f}}}return{encode:function(t){if(t instanceof Uint8Array||(ArrayBuffer.isView(t)?t=new Uint8Array(t.buffer,t.byteOffset,t.byteLength):Array.isArray(t)&&(t=Uint8Array.from(t))),!(t instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(0===t.length)return"";for(var n=0,r=0,s=0,i=t.length;s!==i&&0===t[s];)s++,n++;for(var o=(i-s)*u+1>>>0,l=new Uint8Array(o);s!==i;){for(var h=t[s],d=0,p=o-1;(0!==h||d<r)&&-1!==p;p--,d++)h+=256*l[p]>>>0,l[p]=h%a>>>0,h=h/a>>>0;if(0!==h)throw new Error("Non-zero carry");r=d,s++}for(var f=o-r;f!==o&&0===l[f];)f++;for(var g=c.repeat(n);f<o;++f)g+=e.charAt(l[f]);return g},decodeUnsafe:h,decode:function(e){var n=h(e);if(n)return n;throw new Error(`Non-${t} character`)}}},Z=Q;class J{name;prefix;baseEncode;constructor(e,t,n){this.name=e,this.prefix=t,this.baseEncode=n}encode(e){if(e instanceof Uint8Array)return`${this.prefix}${this.baseEncode(e)}`;throw Error("Unknown type, must be binary type")}}let X=class{name;prefix;baseDecode;prefixCodePoint;constructor(e,t,n){if(this.name=e,this.prefix=t,void 0===t.codePointAt(0))throw new Error("Invalid prefix character");this.prefixCodePoint=t.codePointAt(0),this.baseDecode=n}decode(e){if("string"==typeof e){if(e.codePointAt(0)!==this.prefixCodePoint)throw Error(`Unable to decode multibase string ${JSON.stringify(e)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`);return this.baseDecode(e.slice(this.prefix.length))}throw Error("Can only multibase decode strings")}or(e){return te(this,e)}};class ee{decoders;constructor(e){this.decoders=e}or(e){return te(this,e)}decode(e){const t=e[0],n=this.decoders[t];if(null!=n)return n.decode(e);throw RangeError(`Unable to decode multibase string ${JSON.stringify(e)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`)}}function te(e,t){return new ee({...e.decoders??{[e.prefix]:e},...t.decoders??{[t.prefix]:t}})}class ne{name;prefix;baseEncode;baseDecode;encoder;decoder;constructor(e,t,n,r){this.name=e,this.prefix=t,this.baseEncode=n,this.baseDecode=r,this.encoder=new J(e,t,n),this.decoder=new X(e,t,r)}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}}function re({name:e,prefix:t,encode:n,decode:r}){return new ne(e,t,n,r)}function se({name:e,prefix:t,alphabet:n}){const{encode:r,decode:s}=Z(n,e);return re({prefix:t,name:e,encode:r,decode:e=>Y(s(e))})}function ie({name:e,prefix:t,bitsPerChar:n,alphabet:r}){return re({prefix:t,name:e,encode:e=>function(e,t,n){const r="="===t[t.length-1],s=(1<<n)-1;let i="",o=0,a=0;for(let r=0;r<e.length;++r)for(a=a<<8|e[r],o+=8;o>n;)o-=n,i+=t[s&a>>o];if(0!==o&&(i+=t[s&a<<n-o]),r)for(;i.length*n&7;)i+="=";return i}(e,r,n),decode:t=>function(e,t,n,r){const s={};for(let e=0;e<t.length;++e)s[t[e]]=e;let i=e.length;for(;"="===e[i-1];)--i;const o=new Uint8Array(i*n/8|0);let a=0,c=0,l=0;for(let t=0;t<i;++t){const i=s[e[t]];if(void 0===i)throw new SyntaxError(`Non-${r} character`);c=c<<n|i,a+=n,a>=8&&(a-=8,o[l++]=255&c>>a)}if(a>=n||255&c<<8-a)throw new SyntaxError("Unexpected end of data");return o}(t,r,n,e)})}const oe=se({prefix:"9",name:"base10",alphabet:"0123456789"});var ae=Object.freeze({__proto__:null,base10:oe});const ce=ie({prefix:"f",name:"base16",alphabet:"0123456789abcdef",bitsPerChar:4}),le=ie({prefix:"F",name:"base16upper",alphabet:"0123456789ABCDEF",bitsPerChar:4});var ue=Object.freeze({__proto__:null,base16:ce,base16upper:le});const he=ie({prefix:"0",name:"base2",alphabet:"01",bitsPerChar:1});var de=Object.freeze({__proto__:null,base2:he});const pe=Array.from("๐๐ชโ๐ฐ๐๐๐๐๐๐๐๐๐๐๐๐๐โ๐ป๐ฅ๐พ๐ฟ๐โค๐๐คฃ๐๐๐๐ญ๐๐๐
๐๐๐ฅ๐ฅฐ๐๐๐๐ข๐ค๐๐๐ช๐โบ๐๐ค๐๐๐๐๐น๐คฆ๐๐โโจ๐คท๐ฑ๐๐ธ๐๐๐๐๐๐๐๐๐คฉ๐๐๐ค๐๐ฏ๐๐๐ถ๐๐คญโฃ๐๐๐๐ช๐๐ฅ๐๐๐ฉ๐ก๐คช๐๐ฅณ๐ฅ๐คค๐๐๐ณโ๐๐๐ด๐๐ฌ๐๐๐ท๐ป๐โญโ
๐ฅบ๐๐๐ค๐ฆโ๐ฃ๐๐โน๐๐๐ โ๐๐บ๐๐ป๐๐๐๐๐น๐ฃ๐ซ๐๐๐ต๐ค๐๐ด๐ค๐ผ๐ซโฝ๐คโ๐๐คซ๐๐ฎ๐๐ป๐๐ถ๐๐ฒ๐ฟ๐งก๐โก๐๐โโ๐๐ฐ๐คจ๐ถ๐ค๐ถ๐ฐ๐๐ข๐ค๐๐จ๐จ๐คฌโ๐๐บ๐ค๐๐๐ฑ๐๐ถ๐ฅดโถโกโ๐๐ธโฌ๐จ๐๐ฆ๐ท๐บโ ๐
๐๐ต๐๐คฒ๐ค ๐คง๐๐ต๐
๐ง๐พ๐๐๐ค๐๐คฏ๐ทโ๐ง๐ฏ๐๐๐ค๐๐โ๐ด๐ฃ๐ธ๐๐๐ฅ๐คข๐
๐ก๐ฉ๐๐ธ๐ป๐ค๐คฎ๐ผ๐ฅต๐ฉ๐๐๐ผ๐๐ฃ๐ฅ"),fe=pe.reduce(((e,t,n)=>(e[n]=t,e)),[]),ge=pe.reduce(((e,t,n)=>(e[t.codePointAt(0)]=n,e)),[]);const me=re({prefix:"๐",name:"base256emoji",encode:function(e){return e.reduce(((e,t)=>e+=fe[t]),"")},decode:function(e){const t=[];for(const n of e){const e=ge[n.codePointAt(0)];if(void 0===e)throw new Error(`Non-base256emoji character: ${n}`);t.push(e)}return new Uint8Array(t)}});var ye=Object.freeze({__proto__:null,base256emoji:me});const we=ie({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5}),be=ie({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5}),ve=ie({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5}),Ee=ie({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5}),Se=ie({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5}),_e=ie({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5}),Ie=ie({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5}),Re=ie({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5}),Ae=ie({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});var Te=Object.freeze({__proto__:null,base32:we,base32hex:Se,base32hexpad:Ie,base32hexpadupper:Re,base32hexupper:_e,base32pad:ve,base32padupper:Ee,base32upper:be,base32z:Ae});const De=se({prefix:"k",name:"base36",alphabet:"0123456789abcdefghijklmnopqrstuvwxyz"}),ke=se({prefix:"K",name:"base36upper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"});var Pe=Object.freeze({__proto__:null,base36:De,base36upper:ke});const Ce=se({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),xe=se({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var Ne=Object.freeze({__proto__:null,base58btc:Ce,base58flickr:xe});const Me=ie({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),Oe=ie({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),Le=ie({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),Be=ie({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});var Ue=Object.freeze({__proto__:null,base64:Me,base64pad:Oe,base64url:Le,base64urlpad:Be});const Fe=ie({prefix:"7",name:"base8",alphabet:"01234567",bitsPerChar:3});var Ve=Object.freeze({__proto__:null,base8:Fe});const Ke=re({prefix:"\0",name:"identity",encode:e=>{return t=e,(new TextDecoder).decode(t);var t},decode:e=>function(e){return(new TextEncoder).encode(e)}(e)});var $e=Object.freeze({__proto__:null,identity:Ke});new TextEncoder,new TextDecoder;var qe=function e(t,n,r){n=n||[];var s=r=r||0;for(;t>=We;)n[r++]=255&t|He,t/=128;for(;t&ze;)n[r++]=255&t|He,t>>>=7;return n[r]=0|t,e.bytes=r-s+1,n},He=128,ze=-128,We=Math.pow(2,31);var je=function e(t,n){var r,s=0,i=0,o=n=n||0,a=t.length;do{if(o>=a)throw e.bytes=0,new RangeError("Could not decode varint");r=t[o++],s+=i<28?(r&Ye)<<i:(r&Ye)*Math.pow(2,i),i+=7}while(r>=Ge);return e.bytes=o-n,s},Ge=128,Ye=127;var Qe=Math.pow(2,7),Ze=Math.pow(2,14),Je=Math.pow(2,21),Xe=Math.pow(2,28),et=Math.pow(2,35),tt=Math.pow(2,42),nt=Math.pow(2,49),rt=Math.pow(2,56),st=Math.pow(2,63),it={encode:qe,decode:je,encodingLength:function(e){return e<Qe?1:e<Ze?2:e<Je?3:e<Xe?4:e<et?5:e<tt?6:e<nt?7:e<rt?8:e<st?9:10}};function ot(e,t=0){return[it.decode(e,t),it.decode.bytes]}function at(e,t,n=0){return it.encode(e,t,n),t}function ct(e){return it.encodingLength(e)}function lt(e,t){const n=t.byteLength,r=ct(e),s=r+ct(n),i=new Uint8Array(s+n);return at(e,i,0),at(n,i,r),i.set(t,s),new ht(e,n,t,i)}function ut(e){const t=Y(e),[n,r]=ot(t),[s,i]=ot(t.subarray(r)),o=t.subarray(r+i);if(o.byteLength!==s)throw new Error("Incorrect length");return new ht(n,s,o,t)}class ht{code;size;digest;bytes;constructor(e,t,n,r){this.code=e,this.size=t,this.digest=n,this.bytes=r}}const dt=Y;const pt={code:0,name:"identity",encode:dt,digest:function(e){return lt(0,dt(e))}};class ft{name;code;encode;constructor(e,t,n){this.name=e,this.code=t,this.encode=n}digest(e){if(e instanceof Uint8Array){const t=this.encode(e);return t instanceof Uint8Array?lt(this.code,t):t.then((e=>lt(this.code,e)))}throw Error("Unknown type, must be binary type")}}const gt=function({name:e,code:t,encode:n}){return new ft(e,t,n)}({name:"sha2-256",code:18,encode:function(e){return async t=>new Uint8Array(await crypto.subtle.digest(e,t))}("SHA-256")});function mt(e,t){const{bytes:n,version:r}=e;return 0===r?function(e,t,n){const{prefix:r}=n;if(r!==Ce.prefix)throw Error(`Cannot string encode V0 in ${n.name} encoding`);const s=t.get(r);if(null==s){const s=n.encode(e).slice(1);return t.set(r,s),s}return s}(n,wt(e),t??Ce.encoder):function(e,t,n){const{prefix:r}=n,s=t.get(r);if(null==s){const s=n.encode(e);return t.set(r,s),s}return s}(n,wt(e),t??we.encoder)}const yt=new WeakMap;function wt(e){const t=yt.get(e);if(null==t){const t=new Map;return yt.set(e,t),t}return t}class bt{code;version;multihash;bytes;"/";constructor(e,t,n,r){this.code=t,this.version=e,this.multihash=n,this.bytes=r,this["/"]=r}get asCID(){return this}get byteOffset(){return this.bytes.byteOffset}get byteLength(){return this.bytes.byteLength}toV0(){switch(this.version){case 0:return this;case 1:{const{code:e,multihash:t}=this;if(e!==vt)throw new Error("Cannot convert a non dag-pb CID to CIDv0");if(t.code!==Et)throw new Error("Cannot convert non sha2-256 multihash CID to CIDv0");return bt.createV0(t)}default:throw Error(`Can not convert CID version ${this.version} to version 0. This is a bug please report`)}}toV1(){switch(this.version){case 0:{const{code:e,digest:t}=this.multihash,n=lt(e,t);return bt.createV1(this.code,n)}case 1:return this;default:throw Error(`Can not convert CID version ${this.version} to version 1. This is a bug please report`)}}equals(e){return bt.equals(this,e)}static equals(e,t){const n=t;return null!=n&&e.code===n.code&&e.version===n.version&&function(e,t){if(e===t)return!0;{const n=t;return e.code===n.code&&e.size===n.size&&n.bytes instanceof Uint8Array&&function(e,t){if(e===t)return!0;if(e.byteLength!==t.byteLength)return!1;for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return!1;return!0}(e.bytes,n.bytes)}}(e.multihash,n.multihash)}toString(e){return mt(this,e)}toJSON(){return{"/":mt(this)}}link(){return this}[Symbol.toStringTag]="CID";[Symbol.for("nodejs.util.inspect.custom")](){return`CID(${this.toString()})`}static asCID(e){if(null==e)return null;const t=e;if(t instanceof bt)return t;if(null!=t["/"]&&t["/"]===t.bytes||t.asCID===t){const{version:e,code:n,multihash:r,bytes:s}=t;return new bt(e,n,r,s??St(e,n,r.bytes))}if(!0===t[_t]){const{version:e,multihash:n,code:r}=t,s=ut(n);return bt.create(e,r,s)}return null}static create(e,t,n){if("number"!=typeof t)throw new Error("String codecs are no longer supported");if(!(n.bytes instanceof Uint8Array))throw new Error("Invalid digest");switch(e){case 0:if(t!==vt)throw new Error(`Version 0 CID must use dag-pb (code: ${vt}) block encoding`);return new bt(e,t,n,n.bytes);case 1:{const r=St(e,t,n.bytes);return new bt(e,t,n,r)}default:throw new Error("Invalid version")}}static createV0(e){return bt.create(0,vt,e)}static createV1(e,t){return bt.create(1,e,t)}static decode(e){const[t,n]=bt.decodeFirst(e);if(0!==n.length)throw new Error("Incorrect length");return t}static decodeFirst(e){const t=bt.inspectBytes(e),n=t.size-t.multihashSize,r=Y(e.subarray(n,n+t.multihashSize));if(r.byteLength!==t.multihashSize)throw new Error("Incorrect length");const s=r.subarray(t.multihashSize-t.digestSize),i=new ht(t.multihashCode,t.digestSize,s,r);return[0===t.version?bt.createV0(i):bt.createV1(t.codec,i),e.subarray(t.size)]}static inspectBytes(e){let t=0;const n=()=>{const[n,r]=ot(e.subarray(t));return t+=r,n};let r=n(),s=vt;if(18===r?(r=0,t=0):s=n(),0!==r&&1!==r)throw new RangeError(`Invalid CID version ${r}`);const i=t,o=n(),a=n(),c=t+a;return{version:r,codec:s,multihashCode:o,digestSize:a,multihashSize:c-i,size:c}}static parse(e,t){const[n,r]=function(e,t){switch(e[0]){case"Q":{const n=t??Ce;return[Ce.prefix,n.decode(`${Ce.prefix}${e}`)]}case Ce.prefix:{const n=t??Ce;return[Ce.prefix,n.decode(e)]}case we.prefix:{const n=t??we;return[we.prefix,n.decode(e)]}default:if(null==t)throw Error("To parse non base32 or base58btc encoded CID multibase decoder must be provided");return[e[0],t.decode(e)]}}(e,t),s=bt.decode(r);if(0===s.version&&"Q"!==e[0])throw Error("Version 0 CID string must not include multibase prefix");return wt(s).set(n,e),s}}const vt=112,Et=18;function St(e,t,n){const r=ct(e),s=r+ct(t),i=new Uint8Array(s+n.byteLength);return at(e,i,0),at(t,i,r),i.set(n,s),i}const _t=Symbol.for("@ipld/js-cid/CID"),It={...$e,...de,...Ve,...ae,...ue,...Te,...Pe,...Ne,...Ue,...ye};function Rt(e,t,n,r){return{name:e,prefix:t,encoder:{name:e,prefix:t,encode:n},decoder:{decode:r}}}const At=Rt("utf8","u",(e=>"u"+new TextDecoder("utf8").decode(e)),(e=>(new TextEncoder).encode(e.substring(1)))),Tt=Rt("ascii","a",(e=>{let t="a";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return t}),(e=>{const t=w((e=e.substring(1)).length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);return t})),Dt={utf8:At,"utf-8":At,hex:It.base16,latin1:Tt,ascii:Tt,binary:Tt,...It};function kt(e,t="utf8"){const n=Dt[t];if(null==n)throw new Error(`Unsupported encoding "${t}"`);return n.decoder.decode(`${n.prefix}${e}`)}class Pt{fn;len;next;val;constructor(e,t,n){this.fn=e,this.len=t,this.next=void 0,this.val=n}}function Ct(){}class xt{head;tail;len;next;constructor(e){this.head=e.head,this.tail=e.tail,this.len=e.len,this.next=e.states}}const Nt=function(e){const t=8192;let n,r=t;return function(e){if(e<1||e>4096)return w(e);r+e>t&&(n=w(t),r=0);const s=n.subarray(r,r+=e);return 7&r&&(r=1+(7|r)),s}}();class Mt{len;head;tail;states;constructor(){this.len=0,this.head=new Pt(Ct,0,0),this.tail=this.head,this.states=null}_push(e,t,n){return this.tail=this.tail.next=new Pt(e,t,n),this.len+=t,this}uint32(e){return this.len+=(this.tail=this.tail.next=new Bt((e>>>=0)<128?1:e<16384?2:e<2097152?3:e<268435456?4:5,e)).len,this}int32(e){return e<0?this._push(Ut,10,K.fromNumber(e)):this.uint32(e)}sint32(e){return this.uint32((e<<1^e>>31)>>>0)}uint64(e){const t=K.fromBigInt(e);return this._push(Ut,t.length(),t)}uint64Number(e){return this._push(k,D(e),e)}uint64String(e){return this.uint64(BigInt(e))}int64(e){return this.uint64(e)}int64Number(e){return this.uint64Number(e)}int64String(e){return this.uint64String(e)}sint64(e){const t=K.fromBigInt(e).zzEncode();return this._push(Ut,t.length(),t)}sint64Number(e){const t=K.fromNumber(e).zzEncode();return this._push(Ut,t.length(),t)}sint64String(e){return this.sint64(BigInt(e))}bool(e){return this._push(Ot,1,e?1:0)}fixed32(e){return this._push(Ft,4,e>>>0)}sfixed32(e){return this.fixed32(e)}fixed64(e){const t=K.fromBigInt(e);return this._push(Ft,4,t.lo)._push(Ft,4,t.hi)}fixed64Number(e){const t=K.fromNumber(e);return this._push(Ft,4,t.lo)._push(Ft,4,t.hi)}fixed64String(e){return this.fixed64(BigInt(e))}sfixed64(e){return this.fixed64(e)}sfixed64Number(e){return this.fixed64Number(e)}sfixed64String(e){return this.fixed64String(e)}float(e){return this._push(O,4,e)}double(e){return this._push(U,8,e)}bytes(e){const t=e.length>>>0;return 0===t?this._push(Ot,1,0):this.uint32(t)._push(Vt,t,e)}string(e){const t=function(e){let t=0,n=0;for(let r=0;r<e.length;++r)n=e.charCodeAt(r),n<128?t+=1:n<2048?t+=2:55296==(64512&n)&&56320==(64512&e.charCodeAt(r+1))?(++r,t+=4):t+=3;return t}(e);return 0!==t?this.uint32(t)._push(H,t,e):this._push(Ot,1,0)}fork(){return this.states=new xt(this),this.head=this.tail=new Pt(Ct,0,0),this.len=0,this}reset(){return null!=this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new Pt(Ct,0,0),this.len=0),this}ldelim(){const e=this.head,t=this.tail,n=this.len;return this.reset().uint32(n),0!==n&&(this.tail.next=e.next,this.tail=t,this.len+=n),this}finish(){let e=this.head.next;const t=(n=this.len,null!=globalThis.Buffer?w(n):Nt(n));var n;let r=0;for(;null!=e;)e.fn(e.val,t,r),r+=e.len,e=e.next;return t}}function Ot(e,t,n){t[n]=255&e}function Lt(e,t,n){for(;e>127;)t[n++]=127&e|128,e>>>=7;t[n]=e}class Bt extends Pt{next;constructor(e,t){super(Lt,e,t),this.next=void 0}}function Ut(e,t,n){for(;0!==e.hi;)t[n++]=127&e.lo|128,e.lo=(e.lo>>>7|e.hi<<25)>>>0,e.hi>>>=7;for(;e.lo>127;)t[n++]=127&e.lo|128,e.lo=e.lo>>>7;t[n++]=e.lo}function Ft(e,t,n){t[n]=255&e,t[n+1]=e>>>8&255,t[n+2]=e>>>16&255,t[n+3]=e>>>24}function Vt(e,t,n){t.set(e,n)}function Kt(e,t,n){t.set(e,n)}function $t(e,t,n){e.length<40?H(e,t,n):null!=t.utf8Write?t.utf8Write(e,n):t.set(kt(e),n)}function qt(e,t){const n=new Mt;return t.encode(e,n,{lengthDelimited:!1}),n.finish()}var Ht;function zt(e,t,n,r){return{name:e,type:t,encode:n,decode:r}}function Wt(e){function t(t){if(null==e[t.toString()])throw new Error("Invalid enum value");return e[t]}return zt("enum",Ht.VARINT,(function(e,n){const r=t(e);n.int32(r)}),(function(e){return t(e.int32())}))}function jt(e,t){return zt("message",Ht.LENGTH_DELIMITED,e,t)}null!=globalThis.Buffer&&(Mt.prototype.bytes=function(e){const t=e.length>>>0;return this.uint32(t),t>0&&this._push(Kt,t,e),this},Mt.prototype.string=function(e){const t=globalThis.Buffer.byteLength(e);return this.uint32(t),t>0&&this._push($t,t,e),this}),function(e){e[e.VARINT=0]="VARINT",e[e.BIT64=1]="BIT64",e[e.LENGTH_DELIMITED=2]="LENGTH_DELIMITED",e[e.START_GROUP=3]="START_GROUP",e[e.END_GROUP=4]="END_GROUP",e[e.BIT32=5]="BIT32"}(Ht||(Ht={}));let Gt=class extends Error{code;constructor(e,t,n){super(e,n),this.code=t}};
|
|
2
|
+
const e="webpeerjs",t=e,n="/"+e+"/1.0.0",r=e+"-dbstore",s=["universal-connectivity-browser-peer-discovery"],i=[e+"-peer-discovery"],o=["_"+e+"-peer-data_"],a="https://delegated-ipfs.dev",c="https://dns.google/resolve",l="_dnsaddr.bootstrap.libp2p.io",u=15e3,h=!1,d="stun:stun.l.google.com:19302",p=["QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN","QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb","QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt","QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ"],f=["12D3KooWFhXabKDwALpzqMbto94sB7rvmZ6M28hs9Y9xSopDKwQr"],g=p.concat(f),m=[{Peers:[{Addrs:["/dns6/sv15.bootstrap.libp2p.io/tcp/443/wss","/dns4/sv15.bootstrap.libp2p.io/tcp/443/wss"],ID:"QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",Schema:"peer"}]},{Peers:[{Addrs:["/dns4/am6.bootstrap.libp2p.io/tcp/443/wss","/dns6/am6.bootstrap.libp2p.io/tcp/443/wss"],ID:"QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",Schema:"peer"}]},{Peers:[{Addrs:["/dns6/sg1.bootstrap.libp2p.io/tcp/443/wss","/dns4/sg1.bootstrap.libp2p.io/tcp/443/wss"],ID:"QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",Schema:"peer"}]}];function y(e=0){return new Uint8Array(e)}function w(e=0){return new Uint8Array(e)}const b=Math.pow(2,7),v=Math.pow(2,14),E=Math.pow(2,21),S=Math.pow(2,28),_=Math.pow(2,35),I=Math.pow(2,42),R=Math.pow(2,49),A=128,T=127;function D(e){if(e<b)return 1;if(e<v)return 2;if(e<E)return 3;if(e<S)return 4;if(e<_)return 5;if(e<I)return 6;if(e<R)return 7;if(null!=Number.MAX_SAFE_INTEGER&&e>Number.MAX_SAFE_INTEGER)throw new RangeError("Could not encode varint");return 8}function k(e,t,n=0){switch(D(e)){case 8:t[n++]=255&e|A,e/=128;case 7:t[n++]=255&e|A,e/=128;case 6:t[n++]=255&e|A,e/=128;case 5:t[n++]=255&e|A,e/=128;case 4:t[n++]=255&e|A,e>>>=7;case 3:t[n++]=255&e|A,e>>>=7;case 2:t[n++]=255&e|A,e>>>=7;case 1:t[n++]=255&e,e>>>=7;break;default:throw new Error("unreachable")}return t}function P(e,t){let n=e[t],r=0;if(r+=n&T,n<A)return r;if(n=e[t+1],r+=(n&T)<<7,n<A)return r;if(n=e[t+2],r+=(n&T)<<14,n<A)return r;if(n=e[t+3],r+=(n&T)<<21,n<A)return r;if(n=e[t+4],r+=(n&T)*S,n<A)return r;if(n=e[t+5],r+=(n&T)*_,n<A)return r;if(n=e[t+6],r+=(n&T)*I,n<A)return r;if(n=e[t+7],r+=(n&T)*R,n<A)return r;throw new RangeError("Could not decode varint")}function C(e,t,n=0){return null==t&&(t=w(D(e))),t instanceof Uint8Array?k(e,t,n):function(e,t,n=0){switch(D(e)){case 8:t.set(n++,255&e|A),e/=128;case 7:t.set(n++,255&e|A),e/=128;case 6:t.set(n++,255&e|A),e/=128;case 5:t.set(n++,255&e|A),e/=128;case 4:t.set(n++,255&e|A),e>>>=7;case 3:t.set(n++,255&e|A),e>>>=7;case 2:t.set(n++,255&e|A),e>>>=7;case 1:t.set(n++,255&e),e>>>=7;break;default:throw new Error("unreachable")}return t}(e,t,n)}function x(e,t=0){return e instanceof Uint8Array?P(e,t):function(e,t){let n=e.get(t),r=0;if(r+=n&T,n<A)return r;if(n=e.get(t+1),r+=(n&T)<<7,n<A)return r;if(n=e.get(t+2),r+=(n&T)<<14,n<A)return r;if(n=e.get(t+3),r+=(n&T)<<21,n<A)return r;if(n=e.get(t+4),r+=(n&T)*S,n<A)return r;if(n=e.get(t+5),r+=(n&T)*_,n<A)return r;if(n=e.get(t+6),r+=(n&T)*I,n<A)return r;if(n=e.get(t+7),r+=(n&T)*R,n<A)return r;throw new RangeError("Could not decode varint")}(e,t)}const N=new Float32Array([-0]),M=new Uint8Array(N.buffer);function O(e,t,n){N[0]=e,t[n]=M[0],t[n+1]=M[1],t[n+2]=M[2],t[n+3]=M[3]}const L=new Float64Array([-0]),B=new Uint8Array(L.buffer);function U(e,t,n){L[0]=e,t[n]=B[0],t[n+1]=B[1],t[n+2]=B[2],t[n+3]=B[3],t[n+4]=B[4],t[n+5]=B[5],t[n+6]=B[6],t[n+7]=B[7]}const F=BigInt(Number.MAX_SAFE_INTEGER),V=BigInt(Number.MIN_SAFE_INTEGER);class K{lo;hi;constructor(e,t){this.lo=0|e,this.hi=0|t}toNumber(e=!1){if(!e&&this.hi>>>31>0){const e=1+~this.lo>>>0;let t=~this.hi>>>0;return 0===e&&(t=t+1>>>0),-(e+4294967296*t)}return this.lo+4294967296*this.hi}toBigInt(e=!1){if(e)return BigInt(this.lo>>>0)+(BigInt(this.hi>>>0)<<32n);if(this.hi>>>31!=0){const e=1+~this.lo>>>0;let t=~this.hi>>>0;return 0===e&&(t=t+1>>>0),-(BigInt(e)+(BigInt(t)<<32n))}return BigInt(this.lo>>>0)+(BigInt(this.hi>>>0)<<32n)}toString(e=!1){return this.toBigInt(e).toString()}zzEncode(){const e=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^e)>>>0,this.lo=(this.lo<<1^e)>>>0,this}zzDecode(){const e=-(1&this.lo);return this.lo=((this.lo>>>1|this.hi<<31)^e)>>>0,this.hi=(this.hi>>>1^e)>>>0,this}length(){const e=this.lo,t=(this.lo>>>28|this.hi<<4)>>>0,n=this.hi>>>24;return 0===n?0===t?e<16384?e<128?1:2:e<2097152?3:4:t<16384?t<128?5:6:t<2097152?7:8:n<128?9:10}static fromBigInt(e){if(0n===e)return $;if(e<F&&e>V)return this.fromNumber(Number(e));const t=e<0n;t&&(e=-e);let n=e>>32n,r=e-(n<<32n);return t&&(n=0n|~n,r=0n|~r,++r>q&&(r=0n,++n>q&&(n=0n))),new K(Number(r),Number(n))}static fromNumber(e){if(0===e)return $;const t=e<0;t&&(e=-e);let n=e>>>0,r=(e-n)/4294967296>>>0;return t&&(r=~r>>>0,n=~n>>>0,++n>4294967295&&(n=0,++r>4294967295&&(r=0))),new K(n,r)}static from(e){return"number"==typeof e?K.fromNumber(e):"bigint"==typeof e?K.fromBigInt(e):"string"==typeof e?K.fromBigInt(BigInt(e)):null!=e.low||null!=e.high?new K(e.low>>>0,e.high>>>0):$}}const $=new K(0,0);$.toBigInt=function(){return 0n},$.zzEncode=$.zzDecode=function(){return this},$.length=function(){return 1};const q=4294967296n;function H(e,t,n){const r=n;let s,i;for(let r=0;r<e.length;++r)s=e.charCodeAt(r),s<128?t[n++]=s:s<2048?(t[n++]=s>>6|192,t[n++]=63&s|128):55296==(64512&s)&&56320==(64512&(i=e.charCodeAt(r+1)))?(s=65536+((1023&s)<<10)+(1023&i),++r,t[n++]=s>>18|240,t[n++]=s>>12&63|128,t[n++]=s>>6&63|128,t[n++]=63&s|128):(t[n++]=s>>12|224,t[n++]=s>>6&63|128,t[n++]=63&s|128);return n-r}function z(e,t){return RangeError(`index out of range: ${e.pos} + ${t??1} > ${e.len}`)}function W(e,t){return(e[t-4]|e[t-3]<<8|e[t-2]<<16|e[t-1]<<24)>>>0}class j{buf;pos;len;_slice=Uint8Array.prototype.subarray;constructor(e){this.buf=e,this.pos=0,this.len=e.length}uint32(){let e=4294967295;if(e=(127&this.buf[this.pos])>>>0,this.buf[this.pos++]<128)return e;if(e=(e|(127&this.buf[this.pos])<<7)>>>0,this.buf[this.pos++]<128)return e;if(e=(e|(127&this.buf[this.pos])<<14)>>>0,this.buf[this.pos++]<128)return e;if(e=(e|(127&this.buf[this.pos])<<21)>>>0,this.buf[this.pos++]<128)return e;if(e=(e|(15&this.buf[this.pos])<<28)>>>0,this.buf[this.pos++]<128)return e;if((this.pos+=5)>this.len)throw this.pos=this.len,z(this,10);return e}int32(){return 0|this.uint32()}sint32(){const e=this.uint32();return e>>>1^-(1&e)}bool(){return 0!==this.uint32()}fixed32(){if(this.pos+4>this.len)throw z(this,4);return W(this.buf,this.pos+=4)}sfixed32(){if(this.pos+4>this.len)throw z(this,4);return 0|W(this.buf,this.pos+=4)}float(){if(this.pos+4>this.len)throw z(this,4);const e=(t=this.buf,n=this.pos,M[0]=t[n],M[1]=t[n+1],M[2]=t[n+2],M[3]=t[n+3],N[0]);var t,n;return this.pos+=4,e}double(){if(this.pos+8>this.len)throw z(this,4);const e=(t=this.buf,n=this.pos,B[0]=t[n],B[1]=t[n+1],B[2]=t[n+2],B[3]=t[n+3],B[4]=t[n+4],B[5]=t[n+5],B[6]=t[n+6],B[7]=t[n+7],L[0]);var t,n;return this.pos+=8,e}bytes(){const e=this.uint32(),t=this.pos,n=this.pos+e;if(n>this.len)throw z(this,e);return this.pos+=e,t===n?new Uint8Array(0):this.buf.subarray(t,n)}string(){const e=this.bytes();return function(e,t,n){if(n-t<1)return"";let r;const s=[];let i,o=0;for(;t<n;)i=e[t++],i<128?s[o++]=i:i>191&&i<224?s[o++]=(31&i)<<6|63&e[t++]:i>239&&i<365?(i=((7&i)<<18|(63&e[t++])<<12|(63&e[t++])<<6|63&e[t++])-65536,s[o++]=55296+(i>>10),s[o++]=56320+(1023&i)):s[o++]=(15&i)<<12|(63&e[t++])<<6|63&e[t++],o>8191&&((r??(r=[])).push(String.fromCharCode.apply(String,s)),o=0);return null!=r?(o>0&&r.push(String.fromCharCode.apply(String,s.slice(0,o))),r.join("")):String.fromCharCode.apply(String,s.slice(0,o))}(e,0,e.length)}skip(e){if("number"==typeof e){if(this.pos+e>this.len)throw z(this,e);this.pos+=e}else do{if(this.pos>=this.len)throw z(this)}while(128&this.buf[this.pos++]);return this}skipType(e){switch(e){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;4!=(e=7&this.uint32());)this.skipType(e);break;case 5:this.skip(4);break;default:throw Error(`invalid wire type ${e} at offset ${this.pos}`)}return this}readLongVarint(){const e=new K(0,0);let t=0;if(!(this.len-this.pos>4)){for(;t<3;++t){if(this.pos>=this.len)throw z(this);if(e.lo=(e.lo|(127&this.buf[this.pos])<<7*t)>>>0,this.buf[this.pos++]<128)return e}return e.lo=(e.lo|(127&this.buf[this.pos++])<<7*t)>>>0,e}for(;t<4;++t)if(e.lo=(e.lo|(127&this.buf[this.pos])<<7*t)>>>0,this.buf[this.pos++]<128)return e;if(e.lo=(e.lo|(127&this.buf[this.pos])<<28)>>>0,e.hi=(e.hi|(127&this.buf[this.pos])>>4)>>>0,this.buf[this.pos++]<128)return e;if(t=0,this.len-this.pos>4){for(;t<5;++t)if(e.hi=(e.hi|(127&this.buf[this.pos])<<7*t+3)>>>0,this.buf[this.pos++]<128)return e}else for(;t<5;++t){if(this.pos>=this.len)throw z(this);if(e.hi=(e.hi|(127&this.buf[this.pos])<<7*t+3)>>>0,this.buf[this.pos++]<128)return e}throw Error("invalid varint encoding")}readFixed64(){if(this.pos+8>this.len)throw z(this,8);const e=W(this.buf,this.pos+=4),t=W(this.buf,this.pos+=4);return new K(e,t)}int64(){return this.readLongVarint().toBigInt()}int64Number(){return this.readLongVarint().toNumber()}int64String(){return this.readLongVarint().toString()}uint64(){return this.readLongVarint().toBigInt(!0)}uint64Number(){const e=P(this.buf,this.pos);return this.pos+=D(e),e}uint64String(){return this.readLongVarint().toString(!0)}sint64(){return this.readLongVarint().zzDecode().toBigInt()}sint64Number(){return this.readLongVarint().zzDecode().toNumber()}sint64String(){return this.readLongVarint().zzDecode().toString()}fixed64(){return this.readFixed64().toBigInt()}fixed64Number(){return this.readFixed64().toNumber()}fixed64String(){return this.readFixed64().toString()}sfixed64(){return this.readFixed64().toBigInt()}sfixed64Number(){return this.readFixed64().toNumber()}sfixed64String(){return this.readFixed64().toString()}}function G(e,t,n){const r=function(e){return new j(e instanceof Uint8Array?e:e.subarray())}(e);return t.decode(r,void 0,n)}function Y(e){if(e instanceof Uint8Array&&"Uint8Array"===e.constructor.name)return e;if(e instanceof ArrayBuffer)return new Uint8Array(e);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength);throw new Error("Unknown type, must be binary type")}var Q=function(e,t){if(e.length>=255)throw new TypeError("Alphabet too long");for(var n=new Uint8Array(256),r=0;r<n.length;r++)n[r]=255;for(var s=0;s<e.length;s++){var i=e.charAt(s),o=i.charCodeAt(0);if(255!==n[o])throw new TypeError(i+" is ambiguous");n[o]=s}var a=e.length,c=e.charAt(0),l=Math.log(a)/Math.log(256),u=Math.log(256)/Math.log(a);function h(e){if("string"!=typeof e)throw new TypeError("Expected String");if(0===e.length)return new Uint8Array;var t=0;if(" "!==e[t]){for(var r=0,s=0;e[t]===c;)r++,t++;for(var i=(e.length-t)*l+1>>>0,o=new Uint8Array(i);e[t];){var u=n[e.charCodeAt(t)];if(255===u)return;for(var h=0,d=i-1;(0!==u||h<s)&&-1!==d;d--,h++)u+=a*o[d]>>>0,o[d]=u%256>>>0,u=u/256>>>0;if(0!==u)throw new Error("Non-zero carry");s=h,t++}if(" "!==e[t]){for(var p=i-s;p!==i&&0===o[p];)p++;for(var f=new Uint8Array(r+(i-p)),g=r;p!==i;)f[g++]=o[p++];return f}}}return{encode:function(t){if(t instanceof Uint8Array||(ArrayBuffer.isView(t)?t=new Uint8Array(t.buffer,t.byteOffset,t.byteLength):Array.isArray(t)&&(t=Uint8Array.from(t))),!(t instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(0===t.length)return"";for(var n=0,r=0,s=0,i=t.length;s!==i&&0===t[s];)s++,n++;for(var o=(i-s)*u+1>>>0,l=new Uint8Array(o);s!==i;){for(var h=t[s],d=0,p=o-1;(0!==h||d<r)&&-1!==p;p--,d++)h+=256*l[p]>>>0,l[p]=h%a>>>0,h=h/a>>>0;if(0!==h)throw new Error("Non-zero carry");r=d,s++}for(var f=o-r;f!==o&&0===l[f];)f++;for(var g=c.repeat(n);f<o;++f)g+=e.charAt(l[f]);return g},decodeUnsafe:h,decode:function(e){var n=h(e);if(n)return n;throw new Error(`Non-${t} character`)}}},J=Q;class Z{name;prefix;baseEncode;constructor(e,t,n){this.name=e,this.prefix=t,this.baseEncode=n}encode(e){if(e instanceof Uint8Array)return`${this.prefix}${this.baseEncode(e)}`;throw Error("Unknown type, must be binary type")}}let X=class{name;prefix;baseDecode;prefixCodePoint;constructor(e,t,n){if(this.name=e,this.prefix=t,void 0===t.codePointAt(0))throw new Error("Invalid prefix character");this.prefixCodePoint=t.codePointAt(0),this.baseDecode=n}decode(e){if("string"==typeof e){if(e.codePointAt(0)!==this.prefixCodePoint)throw Error(`Unable to decode multibase string ${JSON.stringify(e)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`);return this.baseDecode(e.slice(this.prefix.length))}throw Error("Can only multibase decode strings")}or(e){return te(this,e)}};class ee{decoders;constructor(e){this.decoders=e}or(e){return te(this,e)}decode(e){const t=e[0],n=this.decoders[t];if(null!=n)return n.decode(e);throw RangeError(`Unable to decode multibase string ${JSON.stringify(e)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`)}}function te(e,t){return new ee({...e.decoders??{[e.prefix]:e},...t.decoders??{[t.prefix]:t}})}class ne{name;prefix;baseEncode;baseDecode;encoder;decoder;constructor(e,t,n,r){this.name=e,this.prefix=t,this.baseEncode=n,this.baseDecode=r,this.encoder=new Z(e,t,n),this.decoder=new X(e,t,r)}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}}function re({name:e,prefix:t,encode:n,decode:r}){return new ne(e,t,n,r)}function se({name:e,prefix:t,alphabet:n}){const{encode:r,decode:s}=J(n,e);return re({prefix:t,name:e,encode:r,decode:e=>Y(s(e))})}function ie({name:e,prefix:t,bitsPerChar:n,alphabet:r}){return re({prefix:t,name:e,encode:e=>function(e,t,n){const r="="===t[t.length-1],s=(1<<n)-1;let i="",o=0,a=0;for(let r=0;r<e.length;++r)for(a=a<<8|e[r],o+=8;o>n;)o-=n,i+=t[s&a>>o];if(0!==o&&(i+=t[s&a<<n-o]),r)for(;i.length*n&7;)i+="=";return i}(e,r,n),decode:t=>function(e,t,n,r){const s={};for(let e=0;e<t.length;++e)s[t[e]]=e;let i=e.length;for(;"="===e[i-1];)--i;const o=new Uint8Array(i*n/8|0);let a=0,c=0,l=0;for(let t=0;t<i;++t){const i=s[e[t]];if(void 0===i)throw new SyntaxError(`Non-${r} character`);c=c<<n|i,a+=n,a>=8&&(a-=8,o[l++]=255&c>>a)}if(a>=n||255&c<<8-a)throw new SyntaxError("Unexpected end of data");return o}(t,r,n,e)})}const oe=se({prefix:"9",name:"base10",alphabet:"0123456789"});var ae=Object.freeze({__proto__:null,base10:oe});const ce=ie({prefix:"f",name:"base16",alphabet:"0123456789abcdef",bitsPerChar:4}),le=ie({prefix:"F",name:"base16upper",alphabet:"0123456789ABCDEF",bitsPerChar:4});var ue=Object.freeze({__proto__:null,base16:ce,base16upper:le});const he=ie({prefix:"0",name:"base2",alphabet:"01",bitsPerChar:1});var de=Object.freeze({__proto__:null,base2:he});const pe=Array.from("๐๐ชโ๐ฐ๐๐๐๐๐๐๐๐๐๐๐๐๐โ๐ป๐ฅ๐พ๐ฟ๐โค๐๐คฃ๐๐๐๐ญ๐๐๐
๐๐๐ฅ๐ฅฐ๐๐๐๐ข๐ค๐๐๐ช๐โบ๐๐ค๐๐๐๐๐น๐คฆ๐๐โโจ๐คท๐ฑ๐๐ธ๐๐๐๐๐๐๐๐๐คฉ๐๐๐ค๐๐ฏ๐๐๐ถ๐๐คญโฃ๐๐๐๐ช๐๐ฅ๐๐๐ฉ๐ก๐คช๐๐ฅณ๐ฅ๐คค๐๐๐ณโ๐๐๐ด๐๐ฌ๐๐๐ท๐ป๐โญโ
๐ฅบ๐๐๐ค๐ฆโ๐ฃ๐๐โน๐๐๐ โ๐๐บ๐๐ป๐๐๐๐๐น๐ฃ๐ซ๐๐๐ต๐ค๐๐ด๐ค๐ผ๐ซโฝ๐คโ๐๐คซ๐๐ฎ๐๐ป๐๐ถ๐๐ฒ๐ฟ๐งก๐โก๐๐โโ๐๐ฐ๐คจ๐ถ๐ค๐ถ๐ฐ๐๐ข๐ค๐๐จ๐จ๐คฌโ๐๐บ๐ค๐๐๐ฑ๐๐ถ๐ฅดโถโกโ๐๐ธโฌ๐จ๐๐ฆ๐ท๐บโ ๐
๐๐ต๐๐คฒ๐ค ๐คง๐๐ต๐
๐ง๐พ๐๐๐ค๐๐คฏ๐ทโ๐ง๐ฏ๐๐๐ค๐๐โ๐ด๐ฃ๐ธ๐๐๐ฅ๐คข๐
๐ก๐ฉ๐๐ธ๐ป๐ค๐คฎ๐ผ๐ฅต๐ฉ๐๐๐ผ๐๐ฃ๐ฅ"),fe=pe.reduce(((e,t,n)=>(e[n]=t,e)),[]),ge=pe.reduce(((e,t,n)=>(e[t.codePointAt(0)]=n,e)),[]);const me=re({prefix:"๐",name:"base256emoji",encode:function(e){return e.reduce(((e,t)=>e+=fe[t]),"")},decode:function(e){const t=[];for(const n of e){const e=ge[n.codePointAt(0)];if(void 0===e)throw new Error(`Non-base256emoji character: ${n}`);t.push(e)}return new Uint8Array(t)}});var ye=Object.freeze({__proto__:null,base256emoji:me});const we=ie({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5}),be=ie({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5}),ve=ie({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5}),Ee=ie({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5}),Se=ie({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5}),_e=ie({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5}),Ie=ie({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5}),Re=ie({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5}),Ae=ie({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});var Te=Object.freeze({__proto__:null,base32:we,base32hex:Se,base32hexpad:Ie,base32hexpadupper:Re,base32hexupper:_e,base32pad:ve,base32padupper:Ee,base32upper:be,base32z:Ae});const De=se({prefix:"k",name:"base36",alphabet:"0123456789abcdefghijklmnopqrstuvwxyz"}),ke=se({prefix:"K",name:"base36upper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"});var Pe=Object.freeze({__proto__:null,base36:De,base36upper:ke});const Ce=se({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),xe=se({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var Ne=Object.freeze({__proto__:null,base58btc:Ce,base58flickr:xe});const Me=ie({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),Oe=ie({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),Le=ie({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),Be=ie({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});var Ue=Object.freeze({__proto__:null,base64:Me,base64pad:Oe,base64url:Le,base64urlpad:Be});const Fe=ie({prefix:"7",name:"base8",alphabet:"01234567",bitsPerChar:3});var Ve=Object.freeze({__proto__:null,base8:Fe});const Ke=re({prefix:"\0",name:"identity",encode:e=>{return t=e,(new TextDecoder).decode(t);var t},decode:e=>function(e){return(new TextEncoder).encode(e)}(e)});var $e=Object.freeze({__proto__:null,identity:Ke});new TextEncoder,new TextDecoder;var qe=function e(t,n,r){n=n||[];var s=r=r||0;for(;t>=We;)n[r++]=255&t|He,t/=128;for(;t&ze;)n[r++]=255&t|He,t>>>=7;return n[r]=0|t,e.bytes=r-s+1,n},He=128,ze=-128,We=Math.pow(2,31);var je=function e(t,n){var r,s=0,i=0,o=n=n||0,a=t.length;do{if(o>=a)throw e.bytes=0,new RangeError("Could not decode varint");r=t[o++],s+=i<28?(r&Ye)<<i:(r&Ye)*Math.pow(2,i),i+=7}while(r>=Ge);return e.bytes=o-n,s},Ge=128,Ye=127;var Qe=Math.pow(2,7),Je=Math.pow(2,14),Ze=Math.pow(2,21),Xe=Math.pow(2,28),et=Math.pow(2,35),tt=Math.pow(2,42),nt=Math.pow(2,49),rt=Math.pow(2,56),st=Math.pow(2,63),it={encode:qe,decode:je,encodingLength:function(e){return e<Qe?1:e<Je?2:e<Ze?3:e<Xe?4:e<et?5:e<tt?6:e<nt?7:e<rt?8:e<st?9:10}};function ot(e,t=0){return[it.decode(e,t),it.decode.bytes]}function at(e,t,n=0){return it.encode(e,t,n),t}function ct(e){return it.encodingLength(e)}function lt(e,t){const n=t.byteLength,r=ct(e),s=r+ct(n),i=new Uint8Array(s+n);return at(e,i,0),at(n,i,r),i.set(t,s),new ht(e,n,t,i)}function ut(e){const t=Y(e),[n,r]=ot(t),[s,i]=ot(t.subarray(r)),o=t.subarray(r+i);if(o.byteLength!==s)throw new Error("Incorrect length");return new ht(n,s,o,t)}class ht{code;size;digest;bytes;constructor(e,t,n,r){this.code=e,this.size=t,this.digest=n,this.bytes=r}}const dt=Y;const pt={code:0,name:"identity",encode:dt,digest:function(e){return lt(0,dt(e))}};class ft{name;code;encode;constructor(e,t,n){this.name=e,this.code=t,this.encode=n}digest(e){if(e instanceof Uint8Array){const t=this.encode(e);return t instanceof Uint8Array?lt(this.code,t):t.then((e=>lt(this.code,e)))}throw Error("Unknown type, must be binary type")}}const gt=function({name:e,code:t,encode:n}){return new ft(e,t,n)}({name:"sha2-256",code:18,encode:function(e){return async t=>new Uint8Array(await crypto.subtle.digest(e,t))}("SHA-256")});function mt(e,t){const{bytes:n,version:r}=e;return 0===r?function(e,t,n){const{prefix:r}=n;if(r!==Ce.prefix)throw Error(`Cannot string encode V0 in ${n.name} encoding`);const s=t.get(r);if(null==s){const s=n.encode(e).slice(1);return t.set(r,s),s}return s}(n,wt(e),t??Ce.encoder):function(e,t,n){const{prefix:r}=n,s=t.get(r);if(null==s){const s=n.encode(e);return t.set(r,s),s}return s}(n,wt(e),t??we.encoder)}const yt=new WeakMap;function wt(e){const t=yt.get(e);if(null==t){const t=new Map;return yt.set(e,t),t}return t}class bt{code;version;multihash;bytes;"/";constructor(e,t,n,r){this.code=t,this.version=e,this.multihash=n,this.bytes=r,this["/"]=r}get asCID(){return this}get byteOffset(){return this.bytes.byteOffset}get byteLength(){return this.bytes.byteLength}toV0(){switch(this.version){case 0:return this;case 1:{const{code:e,multihash:t}=this;if(e!==vt)throw new Error("Cannot convert a non dag-pb CID to CIDv0");if(t.code!==Et)throw new Error("Cannot convert non sha2-256 multihash CID to CIDv0");return bt.createV0(t)}default:throw Error(`Can not convert CID version ${this.version} to version 0. This is a bug please report`)}}toV1(){switch(this.version){case 0:{const{code:e,digest:t}=this.multihash,n=lt(e,t);return bt.createV1(this.code,n)}case 1:return this;default:throw Error(`Can not convert CID version ${this.version} to version 1. This is a bug please report`)}}equals(e){return bt.equals(this,e)}static equals(e,t){const n=t;return null!=n&&e.code===n.code&&e.version===n.version&&function(e,t){if(e===t)return!0;{const n=t;return e.code===n.code&&e.size===n.size&&n.bytes instanceof Uint8Array&&function(e,t){if(e===t)return!0;if(e.byteLength!==t.byteLength)return!1;for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return!1;return!0}(e.bytes,n.bytes)}}(e.multihash,n.multihash)}toString(e){return mt(this,e)}toJSON(){return{"/":mt(this)}}link(){return this}[Symbol.toStringTag]="CID";[Symbol.for("nodejs.util.inspect.custom")](){return`CID(${this.toString()})`}static asCID(e){if(null==e)return null;const t=e;if(t instanceof bt)return t;if(null!=t["/"]&&t["/"]===t.bytes||t.asCID===t){const{version:e,code:n,multihash:r,bytes:s}=t;return new bt(e,n,r,s??St(e,n,r.bytes))}if(!0===t[_t]){const{version:e,multihash:n,code:r}=t,s=ut(n);return bt.create(e,r,s)}return null}static create(e,t,n){if("number"!=typeof t)throw new Error("String codecs are no longer supported");if(!(n.bytes instanceof Uint8Array))throw new Error("Invalid digest");switch(e){case 0:if(t!==vt)throw new Error(`Version 0 CID must use dag-pb (code: ${vt}) block encoding`);return new bt(e,t,n,n.bytes);case 1:{const r=St(e,t,n.bytes);return new bt(e,t,n,r)}default:throw new Error("Invalid version")}}static createV0(e){return bt.create(0,vt,e)}static createV1(e,t){return bt.create(1,e,t)}static decode(e){const[t,n]=bt.decodeFirst(e);if(0!==n.length)throw new Error("Incorrect length");return t}static decodeFirst(e){const t=bt.inspectBytes(e),n=t.size-t.multihashSize,r=Y(e.subarray(n,n+t.multihashSize));if(r.byteLength!==t.multihashSize)throw new Error("Incorrect length");const s=r.subarray(t.multihashSize-t.digestSize),i=new ht(t.multihashCode,t.digestSize,s,r);return[0===t.version?bt.createV0(i):bt.createV1(t.codec,i),e.subarray(t.size)]}static inspectBytes(e){let t=0;const n=()=>{const[n,r]=ot(e.subarray(t));return t+=r,n};let r=n(),s=vt;if(18===r?(r=0,t=0):s=n(),0!==r&&1!==r)throw new RangeError(`Invalid CID version ${r}`);const i=t,o=n(),a=n(),c=t+a;return{version:r,codec:s,multihashCode:o,digestSize:a,multihashSize:c-i,size:c}}static parse(e,t){const[n,r]=function(e,t){switch(e[0]){case"Q":{const n=t??Ce;return[Ce.prefix,n.decode(`${Ce.prefix}${e}`)]}case Ce.prefix:{const n=t??Ce;return[Ce.prefix,n.decode(e)]}case we.prefix:{const n=t??we;return[we.prefix,n.decode(e)]}default:if(null==t)throw Error("To parse non base32 or base58btc encoded CID multibase decoder must be provided");return[e[0],t.decode(e)]}}(e,t),s=bt.decode(r);if(0===s.version&&"Q"!==e[0])throw Error("Version 0 CID string must not include multibase prefix");return wt(s).set(n,e),s}}const vt=112,Et=18;function St(e,t,n){const r=ct(e),s=r+ct(t),i=new Uint8Array(s+n.byteLength);return at(e,i,0),at(t,i,r),i.set(n,s),i}const _t=Symbol.for("@ipld/js-cid/CID"),It={...$e,...de,...Ve,...ae,...ue,...Te,...Pe,...Ne,...Ue,...ye};function Rt(e,t,n,r){return{name:e,prefix:t,encoder:{name:e,prefix:t,encode:n},decoder:{decode:r}}}const At=Rt("utf8","u",(e=>"u"+new TextDecoder("utf8").decode(e)),(e=>(new TextEncoder).encode(e.substring(1)))),Tt=Rt("ascii","a",(e=>{let t="a";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return t}),(e=>{const t=w((e=e.substring(1)).length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);return t})),Dt={utf8:At,"utf-8":At,hex:It.base16,latin1:Tt,ascii:Tt,binary:Tt,...It};function kt(e,t="utf8"){const n=Dt[t];if(null==n)throw new Error(`Unsupported encoding "${t}"`);return n.decoder.decode(`${n.prefix}${e}`)}class Pt{fn;len;next;val;constructor(e,t,n){this.fn=e,this.len=t,this.next=void 0,this.val=n}}function Ct(){}class xt{head;tail;len;next;constructor(e){this.head=e.head,this.tail=e.tail,this.len=e.len,this.next=e.states}}const Nt=function(e){const t=8192;let n,r=t;return function(e){if(e<1||e>4096)return w(e);r+e>t&&(n=w(t),r=0);const s=n.subarray(r,r+=e);return 7&r&&(r=1+(7|r)),s}}();class Mt{len;head;tail;states;constructor(){this.len=0,this.head=new Pt(Ct,0,0),this.tail=this.head,this.states=null}_push(e,t,n){return this.tail=this.tail.next=new Pt(e,t,n),this.len+=t,this}uint32(e){return this.len+=(this.tail=this.tail.next=new Bt((e>>>=0)<128?1:e<16384?2:e<2097152?3:e<268435456?4:5,e)).len,this}int32(e){return e<0?this._push(Ut,10,K.fromNumber(e)):this.uint32(e)}sint32(e){return this.uint32((e<<1^e>>31)>>>0)}uint64(e){const t=K.fromBigInt(e);return this._push(Ut,t.length(),t)}uint64Number(e){return this._push(k,D(e),e)}uint64String(e){return this.uint64(BigInt(e))}int64(e){return this.uint64(e)}int64Number(e){return this.uint64Number(e)}int64String(e){return this.uint64String(e)}sint64(e){const t=K.fromBigInt(e).zzEncode();return this._push(Ut,t.length(),t)}sint64Number(e){const t=K.fromNumber(e).zzEncode();return this._push(Ut,t.length(),t)}sint64String(e){return this.sint64(BigInt(e))}bool(e){return this._push(Ot,1,e?1:0)}fixed32(e){return this._push(Ft,4,e>>>0)}sfixed32(e){return this.fixed32(e)}fixed64(e){const t=K.fromBigInt(e);return this._push(Ft,4,t.lo)._push(Ft,4,t.hi)}fixed64Number(e){const t=K.fromNumber(e);return this._push(Ft,4,t.lo)._push(Ft,4,t.hi)}fixed64String(e){return this.fixed64(BigInt(e))}sfixed64(e){return this.fixed64(e)}sfixed64Number(e){return this.fixed64Number(e)}sfixed64String(e){return this.fixed64String(e)}float(e){return this._push(O,4,e)}double(e){return this._push(U,8,e)}bytes(e){const t=e.length>>>0;return 0===t?this._push(Ot,1,0):this.uint32(t)._push(Vt,t,e)}string(e){const t=function(e){let t=0,n=0;for(let r=0;r<e.length;++r)n=e.charCodeAt(r),n<128?t+=1:n<2048?t+=2:55296==(64512&n)&&56320==(64512&e.charCodeAt(r+1))?(++r,t+=4):t+=3;return t}(e);return 0!==t?this.uint32(t)._push(H,t,e):this._push(Ot,1,0)}fork(){return this.states=new xt(this),this.head=this.tail=new Pt(Ct,0,0),this.len=0,this}reset(){return null!=this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new Pt(Ct,0,0),this.len=0),this}ldelim(){const e=this.head,t=this.tail,n=this.len;return this.reset().uint32(n),0!==n&&(this.tail.next=e.next,this.tail=t,this.len+=n),this}finish(){let e=this.head.next;const t=(n=this.len,null!=globalThis.Buffer?w(n):Nt(n));var n;let r=0;for(;null!=e;)e.fn(e.val,t,r),r+=e.len,e=e.next;return t}}function Ot(e,t,n){t[n]=255&e}function Lt(e,t,n){for(;e>127;)t[n++]=127&e|128,e>>>=7;t[n]=e}class Bt extends Pt{next;constructor(e,t){super(Lt,e,t),this.next=void 0}}function Ut(e,t,n){for(;0!==e.hi;)t[n++]=127&e.lo|128,e.lo=(e.lo>>>7|e.hi<<25)>>>0,e.hi>>>=7;for(;e.lo>127;)t[n++]=127&e.lo|128,e.lo=e.lo>>>7;t[n++]=e.lo}function Ft(e,t,n){t[n]=255&e,t[n+1]=e>>>8&255,t[n+2]=e>>>16&255,t[n+3]=e>>>24}function Vt(e,t,n){t.set(e,n)}function Kt(e,t,n){t.set(e,n)}function $t(e,t,n){e.length<40?H(e,t,n):null!=t.utf8Write?t.utf8Write(e,n):t.set(kt(e),n)}function qt(e,t){const n=new Mt;return t.encode(e,n,{lengthDelimited:!1}),n.finish()}var Ht;function zt(e,t,n,r){return{name:e,type:t,encode:n,decode:r}}function Wt(e){function t(t){if(null==e[t.toString()])throw new Error("Invalid enum value");return e[t]}return zt("enum",Ht.VARINT,(function(e,n){const r=t(e);n.int32(r)}),(function(e){return t(e.int32())}))}function jt(e,t){return zt("message",Ht.LENGTH_DELIMITED,e,t)}null!=globalThis.Buffer&&(Mt.prototype.bytes=function(e){const t=e.length>>>0;return this.uint32(t),t>0&&this._push(Kt,t,e),this},Mt.prototype.string=function(e){const t=globalThis.Buffer.byteLength(e);return this.uint32(t),t>0&&this._push($t,t,e),this}),function(e){e[e.VARINT=0]="VARINT",e[e.BIT64=1]="BIT64",e[e.LENGTH_DELIMITED=2]="LENGTH_DELIMITED",e[e.START_GROUP=3]="START_GROUP",e[e.END_GROUP=4]="END_GROUP",e[e.BIT32=5]="BIT32"}(Ht||(Ht={}));let Gt=class extends Error{code;constructor(e,t,n){super(e,n),this.code=t}};
|
|
3
3
|
//! WebPEER.js -- https://github.com/nuzulul/webpeerjs
|
|
4
|
-
var Yt;function Qt(e,t="utf8"){const n=Dt[t];if(null==n)throw new Error(`Unsupported encoding "${t}"`);return n.encoder.encode(e).substring(1)}!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.publicKey&&e.publicKey.byteLength>0&&(t.uint32(10),t.bytes(e.publicKey)),null!=e.addrs)for(const n of e.addrs)t.uint32(18),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={publicKey:y(0),addrs:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.publicKey=e.bytes();break;case 2:n.addrs.push(e.bytes());break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Yt||(Yt={}));const Zt="/",Jt=(new TextEncoder).encode(Zt),Xt=Jt[0];class en{_buf;constructor(e,t){if("string"==typeof e)this._buf=kt(e);else{if(!(e instanceof Uint8Array))throw new Error("Invalid key, should be String of Uint8Array");this._buf=e}if(null==t&&(t=!0),t&&this.clean(),0===this._buf.byteLength||this._buf[0]!==Xt)throw new Error("Invalid key")}toString(e="utf8"){return Qt(this._buf,e)}uint8Array(){return this._buf}get[Symbol.toStringTag](){return`Key(${this.toString()})`}static withNamespaces(e){return new en(e.join(Zt))}static random(){return new en(Math.random().toString().substring(2))}static asKey(e){return e instanceof Uint8Array||"string"==typeof e?new en(e):"function"==typeof e.uint8Array?new en(e.uint8Array()):null}clean(){if(null!=this._buf&&0!==this._buf.byteLength||(this._buf=Jt),this._buf[0]!==Xt){const e=new Uint8Array(this._buf.byteLength+1);e.fill(Xt,0,1),e.set(this._buf,1),this._buf=e}for(;this._buf.byteLength>1&&this._buf[this._buf.byteLength-1]===Xt;)this._buf=this._buf.subarray(0,-1)}less(e){const t=this.list(),n=e.list();for(let e=0;e<t.length;e++){if(n.length<e+1)return!1;const r=t[e],s=n[e];if(r<s)return!0;if(r>s)return!1}return t.length<n.length}reverse(){return en.withNamespaces(this.list().slice().reverse())}namespaces(){return this.list()}baseNamespace(){const e=this.namespaces();return e[e.length-1]}list(){return this.toString().split(Zt).slice(1)}type(){return function(e){const t=e.split(":");if(t.length<2)return"";return t.slice(0,-1).join(":")}(this.baseNamespace())}name(){return function(e){const t=e.split(":");return t[t.length-1]}(this.baseNamespace())}instance(e){return new en(this.toString()+":"+e)}path(){let e=this.parent().toString();return e.endsWith(Zt)||(e+=Zt),e+=this.type(),new en(e)}parent(){const e=this.list();return 1===e.length?new en(Zt):new en(e.slice(0,-1).join(Zt))}child(e){return this.toString()===Zt?e:e.toString()===Zt?this:new en(this.toString()+e.toString(),!1)}isAncestorOf(e){return e.toString()!==this.toString()&&e.toString().startsWith(this.toString())}isDecendantOf(e){return e.toString()!==this.toString()&&this.toString().startsWith(e.toString())}isTopLevel(){return 1===this.list().length}concat(...e){return en.withNamespaces([...this.namespaces(),...(t=e.map((e=>e.namespaces())),[].concat(...t))]);var t}}const tn=Symbol.for("@libp2p/connection"),nn=Symbol.for("@libp2p/content-routing"),rn=Symbol.for("@libp2p/peer-discovery"),sn=Symbol.for("@libp2p/peer-id");function on(e){return null!=e&&Boolean(e[sn])}const an=Symbol.for("@libp2p/peer-routing"),cn="StrictSign",ln="StrictNoSign";var un;!function(e){e.Accept="accept",e.Ignore="ignore",e.Reject="reject"}(un||(un={}));const hn=Symbol.for("@libp2p/transport");var dn;!function(e){e[e.FATAL_ALL=0]="FATAL_ALL",e[e.NO_FATAL=1]="NO_FATAL"}(dn||(dn={}));let pn=class e extends Error{code;type;constructor(t="The operation was aborted"){super(t),this.name="AbortError",this.code=e.code,this.type=e.type}static code="ABORT_ERR";static type="aborted"},fn=class extends Error{code;props;constructor(e,t,n){super(e),this.code=t,this.name=n?.name??"CodeError",this.props=n??{}}};class gn extends AggregateError{code;props;constructor(e,t,n,r){super(e,t),this.code=n,this.name=r?.name??"AggregateCodeError",this.props=r??{}}}const mn="ERR_TIMEOUT",yn="ERR_INVALID_MESSAGE";class wn extends EventTarget{#e=new Map;constructor(){super()}listenerCount(e){const t=this.#e.get(e);return null==t?0:t.length}addEventListener(e,t,n){super.addEventListener(e,t,n);let r=this.#e.get(e);null==r&&(r=[],this.#e.set(e,r)),r.push({callback:t,once:(!0!==n&&!1!==n&&n?.once)??!1})}removeEventListener(e,t,n){super.removeEventListener(e.toString(),t??null,n);let r=this.#e.get(e);null!=r&&(r=r.filter((({callback:e})=>e!==t)),this.#e.set(e,r))}dispatchEvent(e){const t=super.dispatchEvent(e);let n=this.#e.get(e.type);return null==n||(n=n.filter((({once:e})=>!e)),this.#e.set(e.type,n)),t}safeDispatchEvent(e,t={}){return this.dispatchEvent(new vn(e,t))}}class bn extends Event{detail;constructor(e,t){super(e,t),this.detail=t?.detail}}const vn=globalThis.CustomEvent??bn;function En(e){return null!=e&&"function"==typeof e.start&&"function"==typeof e.stop}const Sn=Symbol.for("@libp2p/service-capabilities"),_n=Symbol.for("@libp2p/service-dependencies");function In(e,t){if(e===t)return!0;if(e.byteLength!==t.byteLength)return!1;for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return!1;return!0}function Rn(e,t){null==t&&(t=e.reduce(((e,t)=>e+t.length),0));const n=w(t);let r=0;for(const t of e)n.set(t,r),r+=t.length;return n}const An=45,Tn=15,Dn=new class{index=0;input="";new(e){return this.index=0,this.input=e,this}readAtomically(e){const t=this.index,n=e();return void 0===n&&(this.index=t),n}parseWith(e){const t=e();if(this.index===this.input.length)return t}peekChar(){if(!(this.index>=this.input.length))return this.input[this.index]}readChar(){if(!(this.index>=this.input.length))return this.input[this.index++]}readGivenChar(e){return this.readAtomically((()=>{const t=this.readChar();if(t===e)return t}))}readSeparator(e,t,n){return this.readAtomically((()=>{if(!(t>0&&void 0===this.readGivenChar(e)))return n()}))}readNumber(e,t,n,r){return this.readAtomically((()=>{let s=0,i=0;const o=this.peekChar();if(void 0===o)return;const a="0"===o,c=2**(8*r)-1;for(;;){const n=this.readAtomically((()=>{const t=this.readChar();if(void 0===t)return;const n=Number.parseInt(t,e);return Number.isNaN(n)?void 0:n}));if(void 0===n)break;if(s*=e,s+=n,s>c)return;if(i+=1,void 0!==t&&i>t)return}return 0===i||!n&&a&&i>1?void 0:s}))}readIPv4Addr(){return this.readAtomically((()=>{const e=new Uint8Array(4);for(let t=0;t<e.length;t++){const n=this.readSeparator(".",t,(()=>this.readNumber(10,3,!1,1)));if(void 0===n)return;e[t]=n}return e}))}readIPv6Addr(){const e=e=>{for(let t=0;t<e.length/2;t++){const n=2*t;if(t<e.length-3){const r=this.readSeparator(":",t,(()=>this.readIPv4Addr()));if(void 0!==r)return e[n]=r[0],e[n+1]=r[1],e[n+2]=r[2],e[n+3]=r[3],[n+4,!0]}const r=this.readSeparator(":",t,(()=>this.readNumber(16,4,!0,2)));if(void 0===r)return[n,!1];e[n]=r>>8,e[n+1]=255&r}return[e.length,!1]};return this.readAtomically((()=>{const t=new Uint8Array(16),[n,r]=e(t);if(16===n)return t;if(r)return;if(void 0===this.readGivenChar(":"))return;if(void 0===this.readGivenChar(":"))return;const s=new Uint8Array(14),i=16-(n+2),[o]=e(s.subarray(0,i));return t.set(s.subarray(0,o),16-o),t}))}readIPAddr(){return this.readIPv4Addr()??this.readIPv6Addr()}};function kn(e){return Boolean(function(e){if(!(e.length>Tn))return Dn.new(e).parseWith((()=>Dn.readIPv4Addr()))}(e))}function Pn(e){return Boolean(function(e){if(e.includes("%")&&(e=e.split("%")[0]),!(e.length>An))return Dn.new(e).parseWith((()=>Dn.readIPv6Addr()))}(e))}function Cn(e){return Boolean(function(e){if(e.includes("%")&&(e=e.split("%")[0]),!(e.length>An))return Dn.new(e).parseWith((()=>Dn.readIPAddr()))}(e))}const xn=kn,Nn=Pn,Mn=function(e){let t=0;if(e=e.toString().trim(),xn(e)){const n=new Uint8Array(t+4);return e.split(/\./g).forEach((e=>{n[t++]=255&parseInt(e,10)})),n}if(Nn(e)){const n=e.split(":",8);let r;for(r=0;r<n.length;r++){let e;xn(n[r])&&(e=Mn(n[r]),n[r]=Qt(e.slice(0,2),"base16")),null!=e&&++r<8&&n.splice(r,0,Qt(e.slice(2,4),"base16"))}if(""===n[0])for(;n.length<8;)n.unshift("0");else if(""===n[n.length-1])for(;n.length<8;)n.push("0");else if(n.length<8){for(r=0;r<n.length&&""!==n[r];r++);const e=[r,1];for(r=9-n.length;r>0;r--)e.push("0");n.splice.apply(n,e)}const s=new Uint8Array(t+16);for(r=0;r<n.length;r++){const e=parseInt(n[r],16);s[t++]=e>>8&255,s[t++]=255&e}return s}throw new Error("invalid ip address")},On=function(e,t=0,n){t=~~t,n=n??e.length-t;const r=new DataView(e.buffer);if(4===n){const r=[];for(let s=0;s<n;s++)r.push(e[t+s]);return r.join(".")}if(16===n){const e=[];for(let s=0;s<n;s+=2)e.push(r.getUint16(t+s).toString(16));return e.join(":").replace(/(^|:)0(:0)*:0(:|$)/,"$1::$3").replace(/:{3,4}/,"::")}return""},Ln=-1,Bn={},Un={};function Fn(e){if("number"==typeof e){if(null!=Un[e])return Un[e];throw new Error(`no protocol with code: ${e}`)}if("string"==typeof e){if(null!=Bn[e])return Bn[e];throw new Error(`no protocol with name: ${e}`)}throw new Error("invalid protocol id type: "+typeof e)}function Vn(e,t){switch(Fn(e).code){case 4:case 41:return function(e){const t=On(e,0,e.length);if(null==t)throw new Error("ipBuff is required");if(!Cn(t))throw new Error("invalid ip address");return t}(t);case 42:case 53:case 54:case 55:case 56:case 400:case 449:case 777:return Gn(t);case 6:case 273:case 33:case 132:return Wn(t).toString();case 421:return function(e){const t=x(e),n=e.slice(D(t));if(n.length!==t)throw new Error("inconsistent lengths");return Qt(n,"base58btc")}(t);case 444:case 445:return Yn(t);case 466:return function(e){const t=x(e),n=e.slice(D(t));if(n.length!==t)throw new Error("inconsistent lengths");return"u"+Qt(n,"base64url")}(t);case 481:return globalThis.encodeURIComponent(Gn(t));default:return Qt(t,"base16")}}function Kn(e,t){switch(Fn(e).code){case 4:case 41:return Hn(t);case 42:case 53:case 54:case 55:case 56:case 400:case 449:case 777:return jn(t);case 6:case 273:case 33:case 132:return zn(parseInt(t,10));case 421:return function(e){let t;t="Q"===e[0]||"1"===e[0]?ut(Ce.decode(`z${e}`)).bytes:bt.parse(e).multihash.bytes;const n=Uint8Array.from(C(t.length));return Rn([n,t],n.length+t.length)}(t);case 444:return function(e){const t=e.split(":");if(2!==t.length)throw new Error(`failed to parse onion addr: ["'${t.join('", "')}'"]' does not contain a port number`);if(16!==t[0].length)throw new Error(`failed to parse onion addr: ${t[0]} not a Tor onion address.`);const n=we.decode("b"+t[0]),r=parseInt(t[1],10);if(r<1||r>65536)throw new Error("Port number is not in range(1, 65536)");const s=zn(r);return Rn([n,s],n.length+s.length)}(t);case 445:return function(e){const t=e.split(":");if(2!==t.length)throw new Error(`failed to parse onion addr: ["'${t.join('", "')}'"]' does not contain a port number`);if(56!==t[0].length)throw new Error(`failed to parse onion addr: ${t[0]} not a Tor onion3 address.`);const n=we.decode(`b${t[0]}`),r=parseInt(t[1],10);if(r<1||r>65536)throw new Error("Port number is not in range(1, 65536)");const s=zn(r);return Rn([n,s],n.length+s.length)}(t);case 466:return function(e){const t=qn.decode(e),n=Uint8Array.from(C(t.length));return Rn([n,t],n.length+t.length)}(t);case 481:return jn(globalThis.decodeURIComponent(t));default:return kt(t,"base16")}}[[4,32,"ip4"],[6,16,"tcp"],[33,16,"dccp"],[41,128,"ip6"],[42,Ln,"ip6zone"],[43,8,"ipcidr"],[53,Ln,"dns",!0],[54,Ln,"dns4",!0],[55,Ln,"dns6",!0],[56,Ln,"dnsaddr",!0],[132,16,"sctp"],[273,16,"udp"],[275,0,"p2p-webrtc-star"],[276,0,"p2p-webrtc-direct"],[277,0,"p2p-stardust"],[280,0,"webrtc-direct"],[281,0,"webrtc"],[290,0,"p2p-circuit"],[301,0,"udt"],[302,0,"utp"],[400,Ln,"unix",!1,!0],[421,Ln,"ipfs"],[421,Ln,"p2p"],[443,0,"https"],[444,96,"onion"],[445,296,"onion3"],[446,Ln,"garlic64"],[448,0,"tls"],[449,Ln,"sni"],[460,0,"quic"],[461,0,"quic-v1"],[465,0,"webtransport"],[466,Ln,"certhash"],[477,0,"ws"],[478,0,"wss"],[479,0,"p2p-websocket-star"],[480,0,"http"],[481,Ln,"http-path"],[777,Ln,"memory"]].forEach((e=>{const t=function(e,t,n,r,s){return{code:e,size:t,name:n,resolvable:Boolean(r),path:Boolean(s)}}(...e);Un[t.code]=t,Bn[t.name]=t})),Fn("ip4"),Fn("ip6"),Fn("ipcidr");const $n=Object.values(It).map((e=>e.decoder)),qn=function(){let e=$n[0].or($n[1]);return $n.slice(2).forEach((t=>e=e.or(t))),e}();function Hn(e){if(!Cn(e))throw new Error("invalid ip address");return Mn(e)}function zn(e){const t=new ArrayBuffer(2);return new DataView(t).setUint16(0,e),new Uint8Array(t)}function Wn(e){return new DataView(e.buffer).getUint16(e.byteOffset)}function jn(e){const t=kt(e),n=Uint8Array.from(C(t.length));return Rn([n,t],n.length+t.length)}function Gn(e){const t=x(e);if((e=e.slice(D(t))).length!==t)throw new Error("inconsistent lengths");return Qt(e)}function Yn(e){const t=e.slice(0,e.length-2),n=e.slice(e.length-2);return`${Qt(t,"base32")}:${Wn(n)}`}function Qn(e){const t=[],n=[];let r=null,s=0;for(;s<e.length;){const i=x(e,s),o=D(i),a=Fn(i),c=Xn(a,e.slice(s+o));if(0===c){t.push([i]),n.push([i]),s+=o;continue}const l=e.slice(s+o,s+o+c);if(s+=c+o,s>e.length)throw tr("Invalid address Uint8Array: "+Qt(e,"base16"));t.push([i,l]);const u=Vn(i,l);if(n.push([i,u]),!0===a.path){r=u;break}}return{bytes:Uint8Array.from(e),string:Zn(n),tuples:t,stringTuples:n,path:r}}function Zn(e){const t=[];return e.map((e=>{const n=Fn(e[0]);return t.push(n.name),e.length>1&&null!=e[1]&&t.push(e[1]),null})),er(t.join("/"))}function Jn(e){return Rn(e.map((e=>{const t=Fn(e[0]);let n=Uint8Array.from(C(t.code));return e.length>1&&null!=e[1]&&(n=Rn([n,e[1]])),n})))}function Xn(e,t){if(e.size>0)return e.size/8;if(0===e.size)return 0;{const e=x(t instanceof Uint8Array?t:Uint8Array.from(t));return e+D(e)}}function er(e){return"/"+e.trim().split("/").filter((e=>e)).join("/")}function tr(e){return new Error("Error parsing address: "+e)}const nr=Symbol.for("nodejs.util.inspect.custom"),rr=Symbol.for("@multiformats/js-multiaddr/multiaddr"),sr=[Fn("dns").code,Fn("dns4").code,Fn("dns6").code,Fn("dnsaddr").code];class ir{bytes;#t;#n;#r;#s;[rr]=!0;constructor(e){let t;if(null==e&&(e=""),e instanceof Uint8Array)t=Qn(e);else if("string"==typeof e){if(e.length>0&&"/"!==e.charAt(0))throw new Error(`multiaddr "${e}" must start with a "/"`);t=function(e){const t=[],n=[];let r=null;const s=(e=er(e)).split("/").slice(1);if(1===s.length&&""===s[0])return{bytes:new Uint8Array,string:"/",tuples:[],stringTuples:[],path:null};for(let i=0;i<s.length;i++){const o=Fn(s[i]);if(0===o.size){t.push([o.code]),n.push([o.code]);continue}if(i++,i>=s.length)throw tr("invalid address: "+e);if(!0===o.path){r=er(s.slice(i).join("/")),t.push([o.code,Kn(o.code,r)]),n.push([o.code,r]);break}const a=Kn(o.code,s[i]);t.push([o.code,a]),n.push([o.code,Vn(o.code,a)])}return{string:Zn(n),bytes:Jn(t),tuples:t,stringTuples:n,path:r}}(e)}else{if(!ar(e))throw new Error("addr must be a string, Buffer, or another Multiaddr");t=Qn(e.bytes)}this.bytes=t.bytes,this.#t=t.string,this.#n=t.tuples,this.#r=t.stringTuples,this.#s=t.path}toString(){return this.#t}toJSON(){return this.toString()}toOptions(){let e,t,n,r,s="";const i=Fn("tcp"),o=Fn("udp"),a=Fn("ip4"),c=Fn("ip6"),l=Fn("dns6"),u=Fn("ip6zone");for(const[h,d]of this.stringTuples())h===u.code&&(s=`%${d??""}`),sr.includes(h)&&(t=i.name,r=443,n=`${d??""}${s}`,e=h===l.code?6:4),h!==i.code&&h!==o.code||(t=Fn(h).name,r=parseInt(d??"")),h!==a.code&&h!==c.code||(t=Fn(h).name,n=`${d??""}${s}`,e=h===c.code?6:4);if(null==e||null==t||null==n||null==r)throw new Error('multiaddr must have a valid format: "/{ip4, ip6, dns4, dns6, dnsaddr}/{address}/{tcp, udp}/{port}".');return{family:e,host:n,transport:t,port:r}}protos(){return this.#n.map((([e])=>Object.assign({},Fn(e))))}protoCodes(){return this.#n.map((([e])=>e))}protoNames(){return this.#n.map((([e])=>Fn(e).name))}tuples(){return this.#n}stringTuples(){return this.#r}encapsulate(e){return e=new ir(e),new ir(this.toString()+e.toString())}decapsulate(e){const t=e.toString(),n=this.toString(),r=n.lastIndexOf(t);if(r<0)throw new Error(`Address ${this.toString()} does not contain subaddress: ${e.toString()}`);return new ir(n.slice(0,r))}decapsulateCode(e){const t=this.tuples();for(let n=t.length-1;n>=0;n--)if(t[n][0]===e)return new ir(Jn(t.slice(0,n)));return this}getPeerId(){try{let e=[];this.stringTuples().forEach((([t,n])=>{t===Bn.p2p.code&&e.push([t,n]),t===Bn["p2p-circuit"].code&&(e=[])}));const t=e.pop();if(null!=t?.[1]){const e=t[1];return"Q"===e[0]||"1"===e[0]?Qt(Ce.decode(`z${e}`),"base58btc"):Qt(bt.parse(e).multihash.bytes,"base58btc")}return null}catch(e){return null}}getPath(){return this.#s}equals(e){return In(this.bytes,e.bytes)}async resolve(e){const t=this.protos().find((e=>e.resolvable));if(null==t)return[this];const n=or.get(t.name);if(null==n)throw new fn(`no available resolver for ${t.name}`,"ERR_NO_AVAILABLE_RESOLVER");return(await n(this,e)).map((e=>cr(e)))}nodeAddress(){const e=this.toOptions();if("tcp"!==e.transport&&"udp"!==e.transport)throw new Error(`multiaddr must have a valid format - no protocol with name: "${e.transport}". Must have a valid transport protocol: "{tcp, udp}"`);return{family:e.family,address:e.host,port:e.port}}isThinWaistAddress(e){const t=(e??this).protos();return 2===t.length&&((4===t[0].code||41===t[0].code)&&(6===t[1].code||273===t[1].code))}[nr](){return`Multiaddr(${this.#t})`}}const or=new Map;function ar(e){return Boolean(e?.[rr])}function cr(e){return new ir(e)}function lr(){const e={};return e.promise=new Promise(((t,n)=>{e.resolve=t,e.reject=n})),e}class ur{buffer;mask;top;btm;next;constructor(e){if(!(e>0)||e-1&e)throw new Error("Max size for a FixedFIFO should be a power of two");this.buffer=new Array(e),this.mask=e-1,this.top=0,this.btm=0,this.next=null}push(e){return void 0===this.buffer[this.top]&&(this.buffer[this.top]=e,this.top=this.top+1&this.mask,!0)}shift(){const e=this.buffer[this.btm];if(void 0!==e)return this.buffer[this.btm]=void 0,this.btm=this.btm+1&this.mask,e}isEmpty(){return void 0===this.buffer[this.btm]}}class hr{size;hwm;head;tail;constructor(e={}){this.hwm=e.splitLimit??16,this.head=new ur(this.hwm),this.tail=this.head,this.size=0}calculateSize(e){return null!=e?.byteLength?e.byteLength:1}push(e){if(null!=e?.value&&(this.size+=this.calculateSize(e.value)),!this.head.push(e)){const t=this.head;this.head=t.next=new ur(2*this.head.buffer.length),this.head.push(e)}}shift(){let e=this.tail.shift();if(void 0===e&&null!=this.tail.next){const t=this.tail.next;this.tail.next=null,this.tail=t,e=this.tail.shift()}return null!=e?.value&&(this.size-=this.calculateSize(e.value)),e}isEmpty(){return this.head.isEmpty()}}let dr=class extends Error{type;code;constructor(e,t){super(e??"The operation was aborted"),this.type="aborted",this.code=t??"ABORT_ERR"}};function pr(e={}){return function(e,t){t=t??{};let n,r,s,i=t.onEnd,o=new hr,a=lr();const c=async()=>{try{return o.isEmpty()?s?{done:!0}:await new Promise(((t,s)=>{r=i=>{r=null,o.push(i);try{t(e(o))}catch(e){s(e)}return n}})):e(o)}finally{o.isEmpty()&&queueMicrotask((()=>{a.resolve(),a=lr()}))}},l=e=>null!=r?r(e):(o.push(e),n),u=e=>(o=new hr,null!=r?r({error:e}):(o.push({error:e}),n)),h=e=>{if(s)return n;if(!0!==t?.objectMode&&null==e?.byteLength)throw new Error("objectMode was not true but tried to push non-Uint8Array value");return l({done:!1,value:e})},d=e=>s?n:(s=!0,null!=e?u(e):l({done:!0})),p=()=>(o=new hr,d(),{done:!0}),f=e=>(d(e),{done:!0});if(n={[Symbol.asyncIterator](){return this},next:c,return:p,throw:f,push:h,end:d,get readableLength(){return o.size},onEmpty:async e=>{const t=e?.signal;if(t?.throwIfAborted(),o.isEmpty())return;let n,r;null!=t&&(n=new Promise(((e,n)=>{r=()=>{n(new dr)},t.addEventListener("abort",r)})));try{await Promise.race([a.promise,n])}finally{null!=r&&null!=t&&t?.removeEventListener("abort",r)}}},null==i)return n;const g=n;return n={[Symbol.asyncIterator](){return this},next:()=>g.next(),throw:e=>(g.throw(e),null!=i&&(i(e),i=void 0),{done:!0}),return:()=>(g.return(),null!=i&&(i(),i=void 0),{done:!0}),push:h,end:e=>(g.end(e),null!=i&&(i(e),i=void 0),n),get readableLength(){return g.readableLength},onEmpty:e=>g.onEmpty(e)},n}((e=>{const t=e.shift();if(null==t)return{done:!0};if(null!=t.error)throw t.error;return{done:!0===t.done,value:t.value}}),e)}function fr(...e){const t=[];for(const n of e)null==n[Symbol.asyncIterator]&&t.push(n);return t.length===e.length?function*(){for(const e of t)yield*e}():async function*(){const t=pr({objectMode:!0});Promise.resolve().then((async()=>{try{await Promise.all(e.map((async e=>{for await(const n of e)t.push(n)}))),t.end()}catch(e){t.end(e)}})),yield*t}()}function gr(e,...t){if(null==e)throw new Error("Empty pipeline");if(br(e)){const t=e;e=()=>t.source}else if(wr(e)||yr(e)){const t=e;e=()=>t}const n=[e,...t];if(n.length>1&&br(n[n.length-1])&&(n[n.length-1]=n[n.length-1].sink),n.length>2)for(let e=1;e<n.length-1;e++)br(n[e])&&(n[e]=vr(n[e]));return mr(...n)}const mr=(...e)=>{let t;for(;e.length>0;)t=e.shift()(t);return t},yr=e=>null!=e?.[Symbol.asyncIterator],wr=e=>null!=e?.[Symbol.iterator],br=e=>null!=e&&(null!=e.sink&&null!=e.source),vr=e=>t=>{const n=e.sink(t);if(null!=n?.then){const t=pr({objectMode:!0});let r;n.then((()=>{t.end()}),(e=>{t.end(e)}));const s=e.source;if(yr(s))r=async function*(){yield*s,t.end()};else{if(!wr(s))throw new Error("Unknown duplex source type - must be Iterable or AsyncIterable");r=function*(){yield*s,t.end()}}return fr(t,r())}return e.source},Er=Symbol.for("@achingbrain/uint8arraylist");function Sr(e,t){if(null==t||t<0)throw new RangeError("index is out of bounds");let n=0;for(const r of e){const e=n+r.byteLength;if(t<e)return{buf:r,index:t-n};n=e}throw new RangeError("index is out of bounds")}function _r(e){return Boolean(e?.[Er])}class Ir{bufs;length;[Er]=!0;constructor(...e){this.bufs=[],this.length=0,e.length>0&&this.appendAll(e)}*[Symbol.iterator](){yield*this.bufs}get byteLength(){return this.length}append(...e){this.appendAll(e)}appendAll(e){let t=0;for(const n of e)if(n instanceof Uint8Array)t+=n.byteLength,this.bufs.push(n);else{if(!_r(n))throw new Error("Could not append value, must be an Uint8Array or a Uint8ArrayList");t+=n.byteLength,this.bufs.push(...n.bufs)}this.length+=t}prepend(...e){this.prependAll(e)}prependAll(e){let t=0;for(const n of e.reverse())if(n instanceof Uint8Array)t+=n.byteLength,this.bufs.unshift(n);else{if(!_r(n))throw new Error("Could not prepend value, must be an Uint8Array or a Uint8ArrayList");t+=n.byteLength,this.bufs.unshift(...n.bufs)}this.length+=t}get(e){const t=Sr(this.bufs,e);return t.buf[t.index]}set(e,t){const n=Sr(this.bufs,e);n.buf[n.index]=t}write(e,t=0){if(e instanceof Uint8Array)for(let n=0;n<e.length;n++)this.set(t+n,e[n]);else{if(!_r(e))throw new Error("Could not write value, must be an Uint8Array or a Uint8ArrayList");for(let n=0;n<e.length;n++)this.set(t+n,e.get(n))}}consume(e){if(e=Math.trunc(e),!(Number.isNaN(e)||e<=0)){if(e===this.byteLength)return this.bufs=[],void(this.length=0);for(;this.bufs.length>0;){if(!(e>=this.bufs[0].byteLength)){this.bufs[0]=this.bufs[0].subarray(e),this.length-=e;break}e-=this.bufs[0].byteLength,this.length-=this.bufs[0].byteLength,this.bufs.shift()}}}slice(e,t){const{bufs:n,length:r}=this._subList(e,t);return Rn(n,r)}subarray(e,t){const{bufs:n,length:r}=this._subList(e,t);return 1===n.length?n[0]:Rn(n,r)}sublist(e,t){const{bufs:n,length:r}=this._subList(e,t),s=new Ir;return s.length=r,s.bufs=[...n],s}_subList(e,t){if(e=e??0,t=t??this.length,e<0&&(e=this.length+e),t<0&&(t=this.length+t),e<0||t>this.length)throw new RangeError("index is out of bounds");if(e===t)return{bufs:[],length:0};if(0===e&&t===this.length)return{bufs:this.bufs,length:this.length};const n=[];let r=0;for(let s=0;s<this.bufs.length;s++){const i=this.bufs[s],o=r,a=o+i.byteLength;if(r=a,e>=a)continue;const c=e>=o&&e<a,l=t>o&&t<=a;if(c&&l){if(e===o&&t===a){n.push(i);break}const r=e-o;n.push(i.subarray(r,r+(t-e)));break}if(c){if(0===e){n.push(i);continue}n.push(i.subarray(e-o))}else{if(l){if(t===a){n.push(i);break}n.push(i.subarray(0,t-o));break}n.push(i)}}return{bufs:n,length:t-e}}indexOf(e,t=0){if(!(_r(e)||e instanceof Uint8Array))throw new TypeError('The "value" argument must be a Uint8ArrayList or Uint8Array');const n=e instanceof Uint8Array?e:e.subarray();if(t=Number(t??0),isNaN(t)&&(t=0),t<0&&(t=this.length+t),t<0&&(t=0),0===e.length)return t>this.length?this.length:t;const r=n.byteLength;if(0===r)throw new TypeError("search must be at least 1 byte long");const s=new Int32Array(256);for(let e=0;e<256;e++)s[e]=-1;for(let e=0;e<r;e++)s[n[e]]=e;const i=s,o=this.byteLength-n.byteLength,a=n.byteLength-1;let c;for(let e=t;e<=o;e+=c){c=0;for(let t=a;t>=0;t--){const r=this.get(e+t);if(n[t]!==r){c=Math.max(1,t-i[r]);break}}if(0===c)return e}return-1}getInt8(e){const t=this.subarray(e,e+1);return new DataView(t.buffer,t.byteOffset,t.byteLength).getInt8(0)}setInt8(e,t){const n=w(1);new DataView(n.buffer,n.byteOffset,n.byteLength).setInt8(0,t),this.write(n,e)}getInt16(e,t){const n=this.subarray(e,e+2);return new DataView(n.buffer,n.byteOffset,n.byteLength).getInt16(0,t)}setInt16(e,t,n){const r=y(2);new DataView(r.buffer,r.byteOffset,r.byteLength).setInt16(0,t,n),this.write(r,e)}getInt32(e,t){const n=this.subarray(e,e+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getInt32(0,t)}setInt32(e,t,n){const r=y(4);new DataView(r.buffer,r.byteOffset,r.byteLength).setInt32(0,t,n),this.write(r,e)}getBigInt64(e,t){const n=this.subarray(e,e+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getBigInt64(0,t)}setBigInt64(e,t,n){const r=y(8);new DataView(r.buffer,r.byteOffset,r.byteLength).setBigInt64(0,t,n),this.write(r,e)}getUint8(e){const t=this.subarray(e,e+1);return new DataView(t.buffer,t.byteOffset,t.byteLength).getUint8(0)}setUint8(e,t){const n=w(1);new DataView(n.buffer,n.byteOffset,n.byteLength).setUint8(0,t),this.write(n,e)}getUint16(e,t){const n=this.subarray(e,e+2);return new DataView(n.buffer,n.byteOffset,n.byteLength).getUint16(0,t)}setUint16(e,t,n){const r=y(2);new DataView(r.buffer,r.byteOffset,r.byteLength).setUint16(0,t,n),this.write(r,e)}getUint32(e,t){const n=this.subarray(e,e+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getUint32(0,t)}setUint32(e,t,n){const r=y(4);new DataView(r.buffer,r.byteOffset,r.byteLength).setUint32(0,t,n),this.write(r,e)}getBigUint64(e,t){const n=this.subarray(e,e+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getBigUint64(0,t)}setBigUint64(e,t,n){const r=y(8);new DataView(r.buffer,r.byteOffset,r.byteLength).setBigUint64(0,t,n),this.write(r,e)}getFloat32(e,t){const n=this.subarray(e,e+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getFloat32(0,t)}setFloat32(e,t,n){const r=y(4);new DataView(r.buffer,r.byteOffset,r.byteLength).setFloat32(0,t,n),this.write(r,e)}getFloat64(e,t){const n=this.subarray(e,e+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getFloat64(0,t)}setFloat64(e,t,n){const r=y(8);new DataView(r.buffer,r.byteOffset,r.byteLength).setFloat64(0,t,n),this.write(r,e)}equals(e){if(null==e)return!1;if(!(e instanceof Ir))return!1;if(e.bufs.length!==this.bufs.length)return!1;for(let t=0;t<this.bufs.length;t++)if(!In(this.bufs[t],e.bufs[t]))return!1;return!0}static fromUint8Arrays(e,t){const n=new Ir;return n.bufs=e,null==t&&(t=e.reduce(((e,t)=>e+t.byteLength),0)),n.length=t,n}}let Rr=class extends Error{type;code;constructor(e,t){super(e??"The operation was aborted"),this.type="aborted",this.name="AbortError",this.code=t??"ABORT_ERR"}};async function Ar(e,t,n){if(null==t)return e;if(t.aborted)return Promise.reject(new Rr(n?.errorMessage,n?.errorCode));let r;const s=new Rr(n?.errorMessage,n?.errorCode);try{return await Promise.race([e,new Promise(((e,n)=>{r=()=>{n(s)},t.addEventListener("abort",r)}))])}finally{null!=r&&t.removeEventListener("abort",r)}}class Tr{readNext;haveNext;ended;nextResult;constructor(){this.ended=!1,this.readNext=lr(),this.haveNext=lr()}[Symbol.asyncIterator](){return this}async next(){if(null==this.nextResult&&await this.haveNext.promise,null==this.nextResult)throw new Error("HaveNext promise resolved but nextResult was undefined");const e=this.nextResult;return this.nextResult=void 0,this.readNext.resolve(),this.readNext=lr(),e}async throw(e){this.ended=!0,null!=e&&this.haveNext.reject(e);return{done:!0,value:void 0}}async return(){const e={done:!0,value:void 0};return await this._push(void 0),e}async push(e,t){await this._push(e,t)}async end(e,t){null!=e?await this.throw(e):await this._push(void 0,t)}async _push(e,t){if(null!=e&&this.ended)throw new Error("Cannot push value onto an ended pushable");if(null!=this.nextResult&&(await this.readNext.promise,null!=this.nextResult))throw new Error("NeedNext promise resolved but nextResult was not consumed");null!=e?this.nextResult={done:!1,value:e}:(this.ended=!0,this.nextResult={done:!0,value:void 0}),this.haveNext.resolve(),this.haveNext=lr(),await Ar(this.readNext.promise,t?.signal,t)}}let Dr=class extends Error{code;constructor(e,t){super(e),this.code=t}},kr=class extends Dr{type;constructor(e){super(e,"ABORT_ERR"),this.type="aborted"}};function Pr(e,t){const n=new Tr;e.sink(n).catch((async e=>{await n.end(e)})),e.sink=async e=>{for await(const t of e)await n.push(t);await n.end()};let r=e.source;null!=e.source[Symbol.iterator]?r=e.source[Symbol.iterator]():null!=e.source[Symbol.asyncIterator]&&(r=e.source[Symbol.asyncIterator]());const s=new Ir,i={read:async(e,t)=>{let n;t?.signal?.throwIfAborted();const i=new Promise(((e,r)=>{n=()=>{r(new kr("Read aborted"))},t?.signal?.addEventListener("abort",n)}));try{if(null==e){const{done:e,value:t}=await Promise.race([r.next(),i]);return!0===e?new Ir:t}for(;s.byteLength<e;){const{value:e,done:t}=await Promise.race([r.next(),i]);if(!0===t)throw new Dr("unexpected end of input","ERR_UNEXPECTED_EOF");s.append(e)}const t=s.sublist(0,e);return s.consume(e),t}finally{null!=n&&t?.signal?.removeEventListener("abort",n)}},write:async(e,t)=>{t?.signal?.throwIfAborted(),e instanceof Uint8Array?await n.push(e,t):await n.push(e.subarray(),t)},unwrap:()=>{if(s.byteLength>0){const n=e.source;e.source=async function*(){!1===t?.yieldBytes?yield s:yield*s,yield*n}()}return e}};return i}class Cr extends Error{code;constructor(e,t){super(e),this.code=t}}function xr(e,t={}){const n=Pr(e,t);null!=t.maxDataLength&&null==t.maxLengthLength&&(t.maxLengthLength=D(t.maxDataLength));const r=t?.lengthDecoder??x,s=t?.lengthEncoder??C;return{read:async e=>{let s=-1;const i=new Ir;for(;;){i.append(await n.read(1,e));try{s=r(i)}catch(e){if(e instanceof RangeError)continue;throw e}if(null!=t?.maxLengthLength&&i.byteLength>t.maxLengthLength)throw new Cr("message length length too long","ERR_MSG_LENGTH_TOO_LONG");if(s>-1)break}if(null!=t?.maxDataLength&&s>t.maxDataLength)throw new Cr("message length too long","ERR_MSG_DATA_TOO_LONG");return n.read(s,e)},write:async(e,t)=>{await n.write(new Ir(s(e.byteLength),e),t)},writeV:async(e,t)=>{const r=new Ir(...e.flatMap((e=>[s(e.byteLength),e])));await n.write(r,t)},unwrap:()=>n.unwrap()}}function Nr(e){return null!=e[Symbol.asyncIterator]}const Mr=e=>{const t=D(e),n=w(t);return C(e,n),Mr.bytes=t,n};function Or(e,t){const n=(t=t??{}).lengthEncoder??Mr;function*r(e){const t=n(e.byteLength);t instanceof Uint8Array?yield t:yield*t,e instanceof Uint8Array?yield e:yield*e}return Nr(e)?async function*(){for await(const t of e)yield*r(t)}():function*(){for(const t of e)yield*r(t)}()}Mr.bytes=0,Or.single=(e,t)=>{const n=(t=t??{}).lengthEncoder??Mr;return new Ir(n(e.byteLength),e)};var Lr="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Br(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function Ur(e,t){for(const n in t)Object.defineProperty(e,n,{value:t[n],enumerable:!0,configurable:!0});return e}var Fr=function(e,t,n){if(!e||"string"==typeof e)throw new TypeError("Please pass an Error to err-code");n||(n={}),"object"==typeof t&&(n=t,t=""),t&&(n.code=t);try{return Ur(e,n)}catch(t){n.message=e.message,n.stack=e.stack;const r=function(){};r.prototype=Object.create(Object.getPrototypeOf(e));return Ur(new r,n)}},Vr=Br(Fr);var Kr;!function(e){e[e.LENGTH=0]="LENGTH",e[e.DATA=1]="DATA"}(Kr||(Kr={}));const $r=e=>{const t=x(e);return $r.bytes=D(t),t};function qr(e,t){const n=new Ir;let r=Kr.LENGTH,s=-1;const i=t?.lengthDecoder??$r,o=t?.maxLengthLength??8,a=t?.maxDataLength??4194304;function*c(){for(;n.byteLength>0;){if(r===Kr.LENGTH)try{if(s=i(n),s<0)throw Vr(new Error("invalid message length"),"ERR_INVALID_MSG_LENGTH");if(s>a)throw Vr(new Error("message length too long"),"ERR_MSG_DATA_TOO_LONG");const e=i.bytes;n.consume(e),null!=t?.onLength&&t.onLength(s),r=Kr.DATA}catch(e){if(e instanceof RangeError){if(n.byteLength>o)throw Vr(new Error("message length length too long"),"ERR_MSG_LENGTH_TOO_LONG");break}throw e}if(r===Kr.DATA){if(n.byteLength<s)break;const e=n.sublist(0,s);n.consume(s),null!=t?.onData&&t.onData(e),yield e,r=Kr.LENGTH}}}return Nr(e)?async function*(){for await(const t of e)n.append(t),yield*c();if(n.byteLength>0)throw Vr(new Error("unexpected end of input"),"ERR_UNEXPECTED_EOF")}():function*(){for(const t of e)n.append(t),yield*c();if(n.byteLength>0)throw Vr(new Error("unexpected end of input"),"ERR_UNEXPECTED_EOF")}()}function Hr(e){const[t,n]=null!=e[Symbol.asyncIterator]?[e[Symbol.asyncIterator](),Symbol.asyncIterator]:[e[Symbol.iterator](),Symbol.iterator],r=[];return{peek:()=>t.next(),push:e=>{r.push(e)},next:()=>r.length>0?{done:!1,value:r.shift()}:t.next(),[n](){return this}}}function zr(e,t){let n=0;if(null!=e[Symbol.asyncIterator])return async function*(){for await(const r of e)yield t(r,n++)}();const r=Hr(e),{value:s,done:i}=r.next();if(!0===i)return function*(){}();const o=t(s,n++);if("function"==typeof o.then)return async function*(){yield await o;for await(const e of r)yield t(e,n++)}();const a=t;return function*(){yield o;for(const e of r)yield a(e,n++)}()}
|
|
4
|
+
var Yt;function Qt(e,t="utf8"){const n=Dt[t];if(null==n)throw new Error(`Unsupported encoding "${t}"`);return n.encoder.encode(e).substring(1)}!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.publicKey&&e.publicKey.byteLength>0&&(t.uint32(10),t.bytes(e.publicKey)),null!=e.addrs)for(const n of e.addrs)t.uint32(18),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={publicKey:y(0),addrs:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.publicKey=e.bytes();break;case 2:n.addrs.push(e.bytes());break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Yt||(Yt={}));const Jt="/",Zt=(new TextEncoder).encode(Jt),Xt=Zt[0];class en{_buf;constructor(e,t){if("string"==typeof e)this._buf=kt(e);else{if(!(e instanceof Uint8Array))throw new Error("Invalid key, should be String of Uint8Array");this._buf=e}if(null==t&&(t=!0),t&&this.clean(),0===this._buf.byteLength||this._buf[0]!==Xt)throw new Error("Invalid key")}toString(e="utf8"){return Qt(this._buf,e)}uint8Array(){return this._buf}get[Symbol.toStringTag](){return`Key(${this.toString()})`}static withNamespaces(e){return new en(e.join(Jt))}static random(){return new en(Math.random().toString().substring(2))}static asKey(e){return e instanceof Uint8Array||"string"==typeof e?new en(e):"function"==typeof e.uint8Array?new en(e.uint8Array()):null}clean(){if(null!=this._buf&&0!==this._buf.byteLength||(this._buf=Zt),this._buf[0]!==Xt){const e=new Uint8Array(this._buf.byteLength+1);e.fill(Xt,0,1),e.set(this._buf,1),this._buf=e}for(;this._buf.byteLength>1&&this._buf[this._buf.byteLength-1]===Xt;)this._buf=this._buf.subarray(0,-1)}less(e){const t=this.list(),n=e.list();for(let e=0;e<t.length;e++){if(n.length<e+1)return!1;const r=t[e],s=n[e];if(r<s)return!0;if(r>s)return!1}return t.length<n.length}reverse(){return en.withNamespaces(this.list().slice().reverse())}namespaces(){return this.list()}baseNamespace(){const e=this.namespaces();return e[e.length-1]}list(){return this.toString().split(Jt).slice(1)}type(){return function(e){const t=e.split(":");if(t.length<2)return"";return t.slice(0,-1).join(":")}(this.baseNamespace())}name(){return function(e){const t=e.split(":");return t[t.length-1]}(this.baseNamespace())}instance(e){return new en(this.toString()+":"+e)}path(){let e=this.parent().toString();return e.endsWith(Jt)||(e+=Jt),e+=this.type(),new en(e)}parent(){const e=this.list();return 1===e.length?new en(Jt):new en(e.slice(0,-1).join(Jt))}child(e){return this.toString()===Jt?e:e.toString()===Jt?this:new en(this.toString()+e.toString(),!1)}isAncestorOf(e){return e.toString()!==this.toString()&&e.toString().startsWith(this.toString())}isDecendantOf(e){return e.toString()!==this.toString()&&this.toString().startsWith(e.toString())}isTopLevel(){return 1===this.list().length}concat(...e){return en.withNamespaces([...this.namespaces(),...(t=e.map((e=>e.namespaces())),[].concat(...t))]);var t}}const tn=Symbol.for("@libp2p/connection"),nn=Symbol.for("@libp2p/content-routing"),rn=Symbol.for("@libp2p/peer-discovery"),sn=Symbol.for("@libp2p/peer-id");function on(e){return null!=e&&Boolean(e[sn])}const an=Symbol.for("@libp2p/peer-routing"),cn="StrictSign",ln="StrictNoSign";var un;!function(e){e.Accept="accept",e.Ignore="ignore",e.Reject="reject"}(un||(un={}));const hn=Symbol.for("@libp2p/transport");var dn;!function(e){e[e.FATAL_ALL=0]="FATAL_ALL",e[e.NO_FATAL=1]="NO_FATAL"}(dn||(dn={}));let pn=class e extends Error{code;type;constructor(t="The operation was aborted"){super(t),this.name="AbortError",this.code=e.code,this.type=e.type}static code="ABORT_ERR";static type="aborted"},fn=class extends Error{code;props;constructor(e,t,n){super(e),this.code=t,this.name=n?.name??"CodeError",this.props=n??{}}};class gn extends AggregateError{code;props;constructor(e,t,n,r){super(e,t),this.code=n,this.name=r?.name??"AggregateCodeError",this.props=r??{}}}const mn="ERR_TIMEOUT",yn="ERR_INVALID_MESSAGE";class wn extends EventTarget{#e=new Map;constructor(){super()}listenerCount(e){const t=this.#e.get(e);return null==t?0:t.length}addEventListener(e,t,n){super.addEventListener(e,t,n);let r=this.#e.get(e);null==r&&(r=[],this.#e.set(e,r)),r.push({callback:t,once:(!0!==n&&!1!==n&&n?.once)??!1})}removeEventListener(e,t,n){super.removeEventListener(e.toString(),t??null,n);let r=this.#e.get(e);null!=r&&(r=r.filter((({callback:e})=>e!==t)),this.#e.set(e,r))}dispatchEvent(e){const t=super.dispatchEvent(e);let n=this.#e.get(e.type);return null==n||(n=n.filter((({once:e})=>!e)),this.#e.set(e.type,n)),t}safeDispatchEvent(e,t={}){return this.dispatchEvent(new vn(e,t))}}class bn extends Event{detail;constructor(e,t){super(e,t),this.detail=t?.detail}}const vn=globalThis.CustomEvent??bn;function En(e){return null!=e&&"function"==typeof e.start&&"function"==typeof e.stop}const Sn=Symbol.for("@libp2p/service-capabilities"),_n=Symbol.for("@libp2p/service-dependencies");function In(e,t){if(e===t)return!0;if(e.byteLength!==t.byteLength)return!1;for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return!1;return!0}function Rn(e,t){null==t&&(t=e.reduce(((e,t)=>e+t.length),0));const n=w(t);let r=0;for(const t of e)n.set(t,r),r+=t.length;return n}const An=45,Tn=15,Dn=new class{index=0;input="";new(e){return this.index=0,this.input=e,this}readAtomically(e){const t=this.index,n=e();return void 0===n&&(this.index=t),n}parseWith(e){const t=e();if(this.index===this.input.length)return t}peekChar(){if(!(this.index>=this.input.length))return this.input[this.index]}readChar(){if(!(this.index>=this.input.length))return this.input[this.index++]}readGivenChar(e){return this.readAtomically((()=>{const t=this.readChar();if(t===e)return t}))}readSeparator(e,t,n){return this.readAtomically((()=>{if(!(t>0&&void 0===this.readGivenChar(e)))return n()}))}readNumber(e,t,n,r){return this.readAtomically((()=>{let s=0,i=0;const o=this.peekChar();if(void 0===o)return;const a="0"===o,c=2**(8*r)-1;for(;;){const n=this.readAtomically((()=>{const t=this.readChar();if(void 0===t)return;const n=Number.parseInt(t,e);return Number.isNaN(n)?void 0:n}));if(void 0===n)break;if(s*=e,s+=n,s>c)return;if(i+=1,void 0!==t&&i>t)return}return 0===i||!n&&a&&i>1?void 0:s}))}readIPv4Addr(){return this.readAtomically((()=>{const e=new Uint8Array(4);for(let t=0;t<e.length;t++){const n=this.readSeparator(".",t,(()=>this.readNumber(10,3,!1,1)));if(void 0===n)return;e[t]=n}return e}))}readIPv6Addr(){const e=e=>{for(let t=0;t<e.length/2;t++){const n=2*t;if(t<e.length-3){const r=this.readSeparator(":",t,(()=>this.readIPv4Addr()));if(void 0!==r)return e[n]=r[0],e[n+1]=r[1],e[n+2]=r[2],e[n+3]=r[3],[n+4,!0]}const r=this.readSeparator(":",t,(()=>this.readNumber(16,4,!0,2)));if(void 0===r)return[n,!1];e[n]=r>>8,e[n+1]=255&r}return[e.length,!1]};return this.readAtomically((()=>{const t=new Uint8Array(16),[n,r]=e(t);if(16===n)return t;if(r)return;if(void 0===this.readGivenChar(":"))return;if(void 0===this.readGivenChar(":"))return;const s=new Uint8Array(14),i=16-(n+2),[o]=e(s.subarray(0,i));return t.set(s.subarray(0,o),16-o),t}))}readIPAddr(){return this.readIPv4Addr()??this.readIPv6Addr()}};function kn(e){return Boolean(function(e){if(!(e.length>Tn))return Dn.new(e).parseWith((()=>Dn.readIPv4Addr()))}(e))}function Pn(e){return Boolean(function(e){if(e.includes("%")&&(e=e.split("%")[0]),!(e.length>An))return Dn.new(e).parseWith((()=>Dn.readIPv6Addr()))}(e))}function Cn(e){return Boolean(function(e){if(e.includes("%")&&(e=e.split("%")[0]),!(e.length>An))return Dn.new(e).parseWith((()=>Dn.readIPAddr()))}(e))}const xn=kn,Nn=Pn,Mn=function(e){let t=0;if(e=e.toString().trim(),xn(e)){const n=new Uint8Array(t+4);return e.split(/\./g).forEach((e=>{n[t++]=255&parseInt(e,10)})),n}if(Nn(e)){const n=e.split(":",8);let r;for(r=0;r<n.length;r++){let e;xn(n[r])&&(e=Mn(n[r]),n[r]=Qt(e.slice(0,2),"base16")),null!=e&&++r<8&&n.splice(r,0,Qt(e.slice(2,4),"base16"))}if(""===n[0])for(;n.length<8;)n.unshift("0");else if(""===n[n.length-1])for(;n.length<8;)n.push("0");else if(n.length<8){for(r=0;r<n.length&&""!==n[r];r++);const e=[r,1];for(r=9-n.length;r>0;r--)e.push("0");n.splice.apply(n,e)}const s=new Uint8Array(t+16);for(r=0;r<n.length;r++){const e=parseInt(n[r],16);s[t++]=e>>8&255,s[t++]=255&e}return s}throw new Error("invalid ip address")},On=function(e,t=0,n){t=~~t,n=n??e.length-t;const r=new DataView(e.buffer);if(4===n){const r=[];for(let s=0;s<n;s++)r.push(e[t+s]);return r.join(".")}if(16===n){const e=[];for(let s=0;s<n;s+=2)e.push(r.getUint16(t+s).toString(16));return e.join(":").replace(/(^|:)0(:0)*:0(:|$)/,"$1::$3").replace(/:{3,4}/,"::")}return""},Ln=-1,Bn={},Un={};function Fn(e){if("number"==typeof e){if(null!=Un[e])return Un[e];throw new Error(`no protocol with code: ${e}`)}if("string"==typeof e){if(null!=Bn[e])return Bn[e];throw new Error(`no protocol with name: ${e}`)}throw new Error("invalid protocol id type: "+typeof e)}function Vn(e,t){switch(Fn(e).code){case 4:case 41:return function(e){const t=On(e,0,e.length);if(null==t)throw new Error("ipBuff is required");if(!Cn(t))throw new Error("invalid ip address");return t}(t);case 42:case 53:case 54:case 55:case 56:case 400:case 449:case 777:return Gn(t);case 6:case 273:case 33:case 132:return Wn(t).toString();case 421:return function(e){const t=x(e),n=e.slice(D(t));if(n.length!==t)throw new Error("inconsistent lengths");return Qt(n,"base58btc")}(t);case 444:case 445:return Yn(t);case 466:return function(e){const t=x(e),n=e.slice(D(t));if(n.length!==t)throw new Error("inconsistent lengths");return"u"+Qt(n,"base64url")}(t);case 481:return globalThis.encodeURIComponent(Gn(t));default:return Qt(t,"base16")}}function Kn(e,t){switch(Fn(e).code){case 4:case 41:return Hn(t);case 42:case 53:case 54:case 55:case 56:case 400:case 449:case 777:return jn(t);case 6:case 273:case 33:case 132:return zn(parseInt(t,10));case 421:return function(e){let t;t="Q"===e[0]||"1"===e[0]?ut(Ce.decode(`z${e}`)).bytes:bt.parse(e).multihash.bytes;const n=Uint8Array.from(C(t.length));return Rn([n,t],n.length+t.length)}(t);case 444:return function(e){const t=e.split(":");if(2!==t.length)throw new Error(`failed to parse onion addr: ["'${t.join('", "')}'"]' does not contain a port number`);if(16!==t[0].length)throw new Error(`failed to parse onion addr: ${t[0]} not a Tor onion address.`);const n=we.decode("b"+t[0]),r=parseInt(t[1],10);if(r<1||r>65536)throw new Error("Port number is not in range(1, 65536)");const s=zn(r);return Rn([n,s],n.length+s.length)}(t);case 445:return function(e){const t=e.split(":");if(2!==t.length)throw new Error(`failed to parse onion addr: ["'${t.join('", "')}'"]' does not contain a port number`);if(56!==t[0].length)throw new Error(`failed to parse onion addr: ${t[0]} not a Tor onion3 address.`);const n=we.decode(`b${t[0]}`),r=parseInt(t[1],10);if(r<1||r>65536)throw new Error("Port number is not in range(1, 65536)");const s=zn(r);return Rn([n,s],n.length+s.length)}(t);case 466:return function(e){const t=qn.decode(e),n=Uint8Array.from(C(t.length));return Rn([n,t],n.length+t.length)}(t);case 481:return jn(globalThis.decodeURIComponent(t));default:return kt(t,"base16")}}[[4,32,"ip4"],[6,16,"tcp"],[33,16,"dccp"],[41,128,"ip6"],[42,Ln,"ip6zone"],[43,8,"ipcidr"],[53,Ln,"dns",!0],[54,Ln,"dns4",!0],[55,Ln,"dns6",!0],[56,Ln,"dnsaddr",!0],[132,16,"sctp"],[273,16,"udp"],[275,0,"p2p-webrtc-star"],[276,0,"p2p-webrtc-direct"],[277,0,"p2p-stardust"],[280,0,"webrtc-direct"],[281,0,"webrtc"],[290,0,"p2p-circuit"],[301,0,"udt"],[302,0,"utp"],[400,Ln,"unix",!1,!0],[421,Ln,"ipfs"],[421,Ln,"p2p"],[443,0,"https"],[444,96,"onion"],[445,296,"onion3"],[446,Ln,"garlic64"],[448,0,"tls"],[449,Ln,"sni"],[460,0,"quic"],[461,0,"quic-v1"],[465,0,"webtransport"],[466,Ln,"certhash"],[477,0,"ws"],[478,0,"wss"],[479,0,"p2p-websocket-star"],[480,0,"http"],[481,Ln,"http-path"],[777,Ln,"memory"]].forEach((e=>{const t=function(e,t,n,r,s){return{code:e,size:t,name:n,resolvable:Boolean(r),path:Boolean(s)}}(...e);Un[t.code]=t,Bn[t.name]=t})),Fn("ip4"),Fn("ip6"),Fn("ipcidr");const $n=Object.values(It).map((e=>e.decoder)),qn=function(){let e=$n[0].or($n[1]);return $n.slice(2).forEach((t=>e=e.or(t))),e}();function Hn(e){if(!Cn(e))throw new Error("invalid ip address");return Mn(e)}function zn(e){const t=new ArrayBuffer(2);return new DataView(t).setUint16(0,e),new Uint8Array(t)}function Wn(e){return new DataView(e.buffer).getUint16(e.byteOffset)}function jn(e){const t=kt(e),n=Uint8Array.from(C(t.length));return Rn([n,t],n.length+t.length)}function Gn(e){const t=x(e);if((e=e.slice(D(t))).length!==t)throw new Error("inconsistent lengths");return Qt(e)}function Yn(e){const t=e.slice(0,e.length-2),n=e.slice(e.length-2);return`${Qt(t,"base32")}:${Wn(n)}`}function Qn(e){const t=[],n=[];let r=null,s=0;for(;s<e.length;){const i=x(e,s),o=D(i),a=Fn(i),c=Xn(a,e.slice(s+o));if(0===c){t.push([i]),n.push([i]),s+=o;continue}const l=e.slice(s+o,s+o+c);if(s+=c+o,s>e.length)throw tr("Invalid address Uint8Array: "+Qt(e,"base16"));t.push([i,l]);const u=Vn(i,l);if(n.push([i,u]),!0===a.path){r=u;break}}return{bytes:Uint8Array.from(e),string:Jn(n),tuples:t,stringTuples:n,path:r}}function Jn(e){const t=[];return e.map((e=>{const n=Fn(e[0]);return t.push(n.name),e.length>1&&null!=e[1]&&t.push(e[1]),null})),er(t.join("/"))}function Zn(e){return Rn(e.map((e=>{const t=Fn(e[0]);let n=Uint8Array.from(C(t.code));return e.length>1&&null!=e[1]&&(n=Rn([n,e[1]])),n})))}function Xn(e,t){if(e.size>0)return e.size/8;if(0===e.size)return 0;{const e=x(t instanceof Uint8Array?t:Uint8Array.from(t));return e+D(e)}}function er(e){return"/"+e.trim().split("/").filter((e=>e)).join("/")}function tr(e){return new Error("Error parsing address: "+e)}const nr=Symbol.for("nodejs.util.inspect.custom"),rr=Symbol.for("@multiformats/js-multiaddr/multiaddr"),sr=[Fn("dns").code,Fn("dns4").code,Fn("dns6").code,Fn("dnsaddr").code];class ir{bytes;#t;#n;#r;#s;[rr]=!0;constructor(e){let t;if(null==e&&(e=""),e instanceof Uint8Array)t=Qn(e);else if("string"==typeof e){if(e.length>0&&"/"!==e.charAt(0))throw new Error(`multiaddr "${e}" must start with a "/"`);t=function(e){const t=[],n=[];let r=null;const s=(e=er(e)).split("/").slice(1);if(1===s.length&&""===s[0])return{bytes:new Uint8Array,string:"/",tuples:[],stringTuples:[],path:null};for(let i=0;i<s.length;i++){const o=Fn(s[i]);if(0===o.size){t.push([o.code]),n.push([o.code]);continue}if(i++,i>=s.length)throw tr("invalid address: "+e);if(!0===o.path){r=er(s.slice(i).join("/")),t.push([o.code,Kn(o.code,r)]),n.push([o.code,r]);break}const a=Kn(o.code,s[i]);t.push([o.code,a]),n.push([o.code,Vn(o.code,a)])}return{string:Jn(n),bytes:Zn(t),tuples:t,stringTuples:n,path:r}}(e)}else{if(!ar(e))throw new Error("addr must be a string, Buffer, or another Multiaddr");t=Qn(e.bytes)}this.bytes=t.bytes,this.#t=t.string,this.#n=t.tuples,this.#r=t.stringTuples,this.#s=t.path}toString(){return this.#t}toJSON(){return this.toString()}toOptions(){let e,t,n,r,s="";const i=Fn("tcp"),o=Fn("udp"),a=Fn("ip4"),c=Fn("ip6"),l=Fn("dns6"),u=Fn("ip6zone");for(const[h,d]of this.stringTuples())h===u.code&&(s=`%${d??""}`),sr.includes(h)&&(t=i.name,r=443,n=`${d??""}${s}`,e=h===l.code?6:4),h!==i.code&&h!==o.code||(t=Fn(h).name,r=parseInt(d??"")),h!==a.code&&h!==c.code||(t=Fn(h).name,n=`${d??""}${s}`,e=h===c.code?6:4);if(null==e||null==t||null==n||null==r)throw new Error('multiaddr must have a valid format: "/{ip4, ip6, dns4, dns6, dnsaddr}/{address}/{tcp, udp}/{port}".');return{family:e,host:n,transport:t,port:r}}protos(){return this.#n.map((([e])=>Object.assign({},Fn(e))))}protoCodes(){return this.#n.map((([e])=>e))}protoNames(){return this.#n.map((([e])=>Fn(e).name))}tuples(){return this.#n}stringTuples(){return this.#r}encapsulate(e){return e=new ir(e),new ir(this.toString()+e.toString())}decapsulate(e){const t=e.toString(),n=this.toString(),r=n.lastIndexOf(t);if(r<0)throw new Error(`Address ${this.toString()} does not contain subaddress: ${e.toString()}`);return new ir(n.slice(0,r))}decapsulateCode(e){const t=this.tuples();for(let n=t.length-1;n>=0;n--)if(t[n][0]===e)return new ir(Zn(t.slice(0,n)));return this}getPeerId(){try{let e=[];this.stringTuples().forEach((([t,n])=>{t===Bn.p2p.code&&e.push([t,n]),t===Bn["p2p-circuit"].code&&(e=[])}));const t=e.pop();if(null!=t?.[1]){const e=t[1];return"Q"===e[0]||"1"===e[0]?Qt(Ce.decode(`z${e}`),"base58btc"):Qt(bt.parse(e).multihash.bytes,"base58btc")}return null}catch(e){return null}}getPath(){return this.#s}equals(e){return In(this.bytes,e.bytes)}async resolve(e){const t=this.protos().find((e=>e.resolvable));if(null==t)return[this];const n=or.get(t.name);if(null==n)throw new fn(`no available resolver for ${t.name}`,"ERR_NO_AVAILABLE_RESOLVER");return(await n(this,e)).map((e=>cr(e)))}nodeAddress(){const e=this.toOptions();if("tcp"!==e.transport&&"udp"!==e.transport)throw new Error(`multiaddr must have a valid format - no protocol with name: "${e.transport}". Must have a valid transport protocol: "{tcp, udp}"`);return{family:e.family,address:e.host,port:e.port}}isThinWaistAddress(e){const t=(e??this).protos();return 2===t.length&&((4===t[0].code||41===t[0].code)&&(6===t[1].code||273===t[1].code))}[nr](){return`Multiaddr(${this.#t})`}}const or=new Map;function ar(e){return Boolean(e?.[rr])}function cr(e){return new ir(e)}function lr(){const e={};return e.promise=new Promise(((t,n)=>{e.resolve=t,e.reject=n})),e}class ur{buffer;mask;top;btm;next;constructor(e){if(!(e>0)||e-1&e)throw new Error("Max size for a FixedFIFO should be a power of two");this.buffer=new Array(e),this.mask=e-1,this.top=0,this.btm=0,this.next=null}push(e){return void 0===this.buffer[this.top]&&(this.buffer[this.top]=e,this.top=this.top+1&this.mask,!0)}shift(){const e=this.buffer[this.btm];if(void 0!==e)return this.buffer[this.btm]=void 0,this.btm=this.btm+1&this.mask,e}isEmpty(){return void 0===this.buffer[this.btm]}}class hr{size;hwm;head;tail;constructor(e={}){this.hwm=e.splitLimit??16,this.head=new ur(this.hwm),this.tail=this.head,this.size=0}calculateSize(e){return null!=e?.byteLength?e.byteLength:1}push(e){if(null!=e?.value&&(this.size+=this.calculateSize(e.value)),!this.head.push(e)){const t=this.head;this.head=t.next=new ur(2*this.head.buffer.length),this.head.push(e)}}shift(){let e=this.tail.shift();if(void 0===e&&null!=this.tail.next){const t=this.tail.next;this.tail.next=null,this.tail=t,e=this.tail.shift()}return null!=e?.value&&(this.size-=this.calculateSize(e.value)),e}isEmpty(){return this.head.isEmpty()}}let dr=class extends Error{type;code;constructor(e,t){super(e??"The operation was aborted"),this.type="aborted",this.code=t??"ABORT_ERR"}};function pr(e={}){return function(e,t){t=t??{};let n,r,s,i=t.onEnd,o=new hr,a=lr();const c=async()=>{try{return o.isEmpty()?s?{done:!0}:await new Promise(((t,s)=>{r=i=>{r=null,o.push(i);try{t(e(o))}catch(e){s(e)}return n}})):e(o)}finally{o.isEmpty()&&queueMicrotask((()=>{a.resolve(),a=lr()}))}},l=e=>null!=r?r(e):(o.push(e),n),u=e=>(o=new hr,null!=r?r({error:e}):(o.push({error:e}),n)),h=e=>{if(s)return n;if(!0!==t?.objectMode&&null==e?.byteLength)throw new Error("objectMode was not true but tried to push non-Uint8Array value");return l({done:!1,value:e})},d=e=>s?n:(s=!0,null!=e?u(e):l({done:!0})),p=()=>(o=new hr,d(),{done:!0}),f=e=>(d(e),{done:!0});if(n={[Symbol.asyncIterator](){return this},next:c,return:p,throw:f,push:h,end:d,get readableLength(){return o.size},onEmpty:async e=>{const t=e?.signal;if(t?.throwIfAborted(),o.isEmpty())return;let n,r;null!=t&&(n=new Promise(((e,n)=>{r=()=>{n(new dr)},t.addEventListener("abort",r)})));try{await Promise.race([a.promise,n])}finally{null!=r&&null!=t&&t?.removeEventListener("abort",r)}}},null==i)return n;const g=n;return n={[Symbol.asyncIterator](){return this},next:()=>g.next(),throw:e=>(g.throw(e),null!=i&&(i(e),i=void 0),{done:!0}),return:()=>(g.return(),null!=i&&(i(),i=void 0),{done:!0}),push:h,end:e=>(g.end(e),null!=i&&(i(e),i=void 0),n),get readableLength(){return g.readableLength},onEmpty:e=>g.onEmpty(e)},n}((e=>{const t=e.shift();if(null==t)return{done:!0};if(null!=t.error)throw t.error;return{done:!0===t.done,value:t.value}}),e)}function fr(...e){const t=[];for(const n of e)null==n[Symbol.asyncIterator]&&t.push(n);return t.length===e.length?function*(){for(const e of t)yield*e}():async function*(){const t=pr({objectMode:!0});Promise.resolve().then((async()=>{try{await Promise.all(e.map((async e=>{for await(const n of e)t.push(n)}))),t.end()}catch(e){t.end(e)}})),yield*t}()}function gr(e,...t){if(null==e)throw new Error("Empty pipeline");if(br(e)){const t=e;e=()=>t.source}else if(wr(e)||yr(e)){const t=e;e=()=>t}const n=[e,...t];if(n.length>1&&br(n[n.length-1])&&(n[n.length-1]=n[n.length-1].sink),n.length>2)for(let e=1;e<n.length-1;e++)br(n[e])&&(n[e]=vr(n[e]));return mr(...n)}const mr=(...e)=>{let t;for(;e.length>0;)t=e.shift()(t);return t},yr=e=>null!=e?.[Symbol.asyncIterator],wr=e=>null!=e?.[Symbol.iterator],br=e=>null!=e&&(null!=e.sink&&null!=e.source),vr=e=>t=>{const n=e.sink(t);if(null!=n?.then){const t=pr({objectMode:!0});let r;n.then((()=>{t.end()}),(e=>{t.end(e)}));const s=e.source;if(yr(s))r=async function*(){yield*s,t.end()};else{if(!wr(s))throw new Error("Unknown duplex source type - must be Iterable or AsyncIterable");r=function*(){yield*s,t.end()}}return fr(t,r())}return e.source},Er=Symbol.for("@achingbrain/uint8arraylist");function Sr(e,t){if(null==t||t<0)throw new RangeError("index is out of bounds");let n=0;for(const r of e){const e=n+r.byteLength;if(t<e)return{buf:r,index:t-n};n=e}throw new RangeError("index is out of bounds")}function _r(e){return Boolean(e?.[Er])}class Ir{bufs;length;[Er]=!0;constructor(...e){this.bufs=[],this.length=0,e.length>0&&this.appendAll(e)}*[Symbol.iterator](){yield*this.bufs}get byteLength(){return this.length}append(...e){this.appendAll(e)}appendAll(e){let t=0;for(const n of e)if(n instanceof Uint8Array)t+=n.byteLength,this.bufs.push(n);else{if(!_r(n))throw new Error("Could not append value, must be an Uint8Array or a Uint8ArrayList");t+=n.byteLength,this.bufs.push(...n.bufs)}this.length+=t}prepend(...e){this.prependAll(e)}prependAll(e){let t=0;for(const n of e.reverse())if(n instanceof Uint8Array)t+=n.byteLength,this.bufs.unshift(n);else{if(!_r(n))throw new Error("Could not prepend value, must be an Uint8Array or a Uint8ArrayList");t+=n.byteLength,this.bufs.unshift(...n.bufs)}this.length+=t}get(e){const t=Sr(this.bufs,e);return t.buf[t.index]}set(e,t){const n=Sr(this.bufs,e);n.buf[n.index]=t}write(e,t=0){if(e instanceof Uint8Array)for(let n=0;n<e.length;n++)this.set(t+n,e[n]);else{if(!_r(e))throw new Error("Could not write value, must be an Uint8Array or a Uint8ArrayList");for(let n=0;n<e.length;n++)this.set(t+n,e.get(n))}}consume(e){if(e=Math.trunc(e),!(Number.isNaN(e)||e<=0)){if(e===this.byteLength)return this.bufs=[],void(this.length=0);for(;this.bufs.length>0;){if(!(e>=this.bufs[0].byteLength)){this.bufs[0]=this.bufs[0].subarray(e),this.length-=e;break}e-=this.bufs[0].byteLength,this.length-=this.bufs[0].byteLength,this.bufs.shift()}}}slice(e,t){const{bufs:n,length:r}=this._subList(e,t);return Rn(n,r)}subarray(e,t){const{bufs:n,length:r}=this._subList(e,t);return 1===n.length?n[0]:Rn(n,r)}sublist(e,t){const{bufs:n,length:r}=this._subList(e,t),s=new Ir;return s.length=r,s.bufs=[...n],s}_subList(e,t){if(e=e??0,t=t??this.length,e<0&&(e=this.length+e),t<0&&(t=this.length+t),e<0||t>this.length)throw new RangeError("index is out of bounds");if(e===t)return{bufs:[],length:0};if(0===e&&t===this.length)return{bufs:this.bufs,length:this.length};const n=[];let r=0;for(let s=0;s<this.bufs.length;s++){const i=this.bufs[s],o=r,a=o+i.byteLength;if(r=a,e>=a)continue;const c=e>=o&&e<a,l=t>o&&t<=a;if(c&&l){if(e===o&&t===a){n.push(i);break}const r=e-o;n.push(i.subarray(r,r+(t-e)));break}if(c){if(0===e){n.push(i);continue}n.push(i.subarray(e-o))}else{if(l){if(t===a){n.push(i);break}n.push(i.subarray(0,t-o));break}n.push(i)}}return{bufs:n,length:t-e}}indexOf(e,t=0){if(!(_r(e)||e instanceof Uint8Array))throw new TypeError('The "value" argument must be a Uint8ArrayList or Uint8Array');const n=e instanceof Uint8Array?e:e.subarray();if(t=Number(t??0),isNaN(t)&&(t=0),t<0&&(t=this.length+t),t<0&&(t=0),0===e.length)return t>this.length?this.length:t;const r=n.byteLength;if(0===r)throw new TypeError("search must be at least 1 byte long");const s=new Int32Array(256);for(let e=0;e<256;e++)s[e]=-1;for(let e=0;e<r;e++)s[n[e]]=e;const i=s,o=this.byteLength-n.byteLength,a=n.byteLength-1;let c;for(let e=t;e<=o;e+=c){c=0;for(let t=a;t>=0;t--){const r=this.get(e+t);if(n[t]!==r){c=Math.max(1,t-i[r]);break}}if(0===c)return e}return-1}getInt8(e){const t=this.subarray(e,e+1);return new DataView(t.buffer,t.byteOffset,t.byteLength).getInt8(0)}setInt8(e,t){const n=w(1);new DataView(n.buffer,n.byteOffset,n.byteLength).setInt8(0,t),this.write(n,e)}getInt16(e,t){const n=this.subarray(e,e+2);return new DataView(n.buffer,n.byteOffset,n.byteLength).getInt16(0,t)}setInt16(e,t,n){const r=y(2);new DataView(r.buffer,r.byteOffset,r.byteLength).setInt16(0,t,n),this.write(r,e)}getInt32(e,t){const n=this.subarray(e,e+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getInt32(0,t)}setInt32(e,t,n){const r=y(4);new DataView(r.buffer,r.byteOffset,r.byteLength).setInt32(0,t,n),this.write(r,e)}getBigInt64(e,t){const n=this.subarray(e,e+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getBigInt64(0,t)}setBigInt64(e,t,n){const r=y(8);new DataView(r.buffer,r.byteOffset,r.byteLength).setBigInt64(0,t,n),this.write(r,e)}getUint8(e){const t=this.subarray(e,e+1);return new DataView(t.buffer,t.byteOffset,t.byteLength).getUint8(0)}setUint8(e,t){const n=w(1);new DataView(n.buffer,n.byteOffset,n.byteLength).setUint8(0,t),this.write(n,e)}getUint16(e,t){const n=this.subarray(e,e+2);return new DataView(n.buffer,n.byteOffset,n.byteLength).getUint16(0,t)}setUint16(e,t,n){const r=y(2);new DataView(r.buffer,r.byteOffset,r.byteLength).setUint16(0,t,n),this.write(r,e)}getUint32(e,t){const n=this.subarray(e,e+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getUint32(0,t)}setUint32(e,t,n){const r=y(4);new DataView(r.buffer,r.byteOffset,r.byteLength).setUint32(0,t,n),this.write(r,e)}getBigUint64(e,t){const n=this.subarray(e,e+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getBigUint64(0,t)}setBigUint64(e,t,n){const r=y(8);new DataView(r.buffer,r.byteOffset,r.byteLength).setBigUint64(0,t,n),this.write(r,e)}getFloat32(e,t){const n=this.subarray(e,e+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getFloat32(0,t)}setFloat32(e,t,n){const r=y(4);new DataView(r.buffer,r.byteOffset,r.byteLength).setFloat32(0,t,n),this.write(r,e)}getFloat64(e,t){const n=this.subarray(e,e+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getFloat64(0,t)}setFloat64(e,t,n){const r=y(8);new DataView(r.buffer,r.byteOffset,r.byteLength).setFloat64(0,t,n),this.write(r,e)}equals(e){if(null==e)return!1;if(!(e instanceof Ir))return!1;if(e.bufs.length!==this.bufs.length)return!1;for(let t=0;t<this.bufs.length;t++)if(!In(this.bufs[t],e.bufs[t]))return!1;return!0}static fromUint8Arrays(e,t){const n=new Ir;return n.bufs=e,null==t&&(t=e.reduce(((e,t)=>e+t.byteLength),0)),n.length=t,n}}let Rr=class extends Error{type;code;constructor(e,t){super(e??"The operation was aborted"),this.type="aborted",this.name="AbortError",this.code=t??"ABORT_ERR"}};async function Ar(e,t,n){if(null==t)return e;if(t.aborted)return Promise.reject(new Rr(n?.errorMessage,n?.errorCode));let r;const s=new Rr(n?.errorMessage,n?.errorCode);try{return await Promise.race([e,new Promise(((e,n)=>{r=()=>{n(s)},t.addEventListener("abort",r)}))])}finally{null!=r&&t.removeEventListener("abort",r)}}class Tr{readNext;haveNext;ended;nextResult;constructor(){this.ended=!1,this.readNext=lr(),this.haveNext=lr()}[Symbol.asyncIterator](){return this}async next(){if(null==this.nextResult&&await this.haveNext.promise,null==this.nextResult)throw new Error("HaveNext promise resolved but nextResult was undefined");const e=this.nextResult;return this.nextResult=void 0,this.readNext.resolve(),this.readNext=lr(),e}async throw(e){this.ended=!0,null!=e&&this.haveNext.reject(e);return{done:!0,value:void 0}}async return(){const e={done:!0,value:void 0};return await this._push(void 0),e}async push(e,t){await this._push(e,t)}async end(e,t){null!=e?await this.throw(e):await this._push(void 0,t)}async _push(e,t){if(null!=e&&this.ended)throw new Error("Cannot push value onto an ended pushable");if(null!=this.nextResult&&(await this.readNext.promise,null!=this.nextResult))throw new Error("NeedNext promise resolved but nextResult was not consumed");null!=e?this.nextResult={done:!1,value:e}:(this.ended=!0,this.nextResult={done:!0,value:void 0}),this.haveNext.resolve(),this.haveNext=lr(),await Ar(this.readNext.promise,t?.signal,t)}}let Dr=class extends Error{code;constructor(e,t){super(e),this.code=t}},kr=class extends Dr{type;constructor(e){super(e,"ABORT_ERR"),this.type="aborted"}};function Pr(e,t){const n=new Tr;e.sink(n).catch((async e=>{await n.end(e)})),e.sink=async e=>{for await(const t of e)await n.push(t);await n.end()};let r=e.source;null!=e.source[Symbol.iterator]?r=e.source[Symbol.iterator]():null!=e.source[Symbol.asyncIterator]&&(r=e.source[Symbol.asyncIterator]());const s=new Ir,i={read:async(e,t)=>{let n;t?.signal?.throwIfAborted();const i=new Promise(((e,r)=>{n=()=>{r(new kr("Read aborted"))},t?.signal?.addEventListener("abort",n)}));try{if(null==e){const{done:e,value:t}=await Promise.race([r.next(),i]);return!0===e?new Ir:t}for(;s.byteLength<e;){const{value:e,done:t}=await Promise.race([r.next(),i]);if(!0===t)throw new Dr("unexpected end of input","ERR_UNEXPECTED_EOF");s.append(e)}const t=s.sublist(0,e);return s.consume(e),t}finally{null!=n&&t?.signal?.removeEventListener("abort",n)}},write:async(e,t)=>{t?.signal?.throwIfAborted(),e instanceof Uint8Array?await n.push(e,t):await n.push(e.subarray(),t)},unwrap:()=>{if(s.byteLength>0){const n=e.source;e.source=async function*(){!1===t?.yieldBytes?yield s:yield*s,yield*n}()}return e}};return i}class Cr extends Error{code;constructor(e,t){super(e),this.code=t}}function xr(e,t={}){const n=Pr(e,t);null!=t.maxDataLength&&null==t.maxLengthLength&&(t.maxLengthLength=D(t.maxDataLength));const r=t?.lengthDecoder??x,s=t?.lengthEncoder??C;return{read:async e=>{let s=-1;const i=new Ir;for(;;){i.append(await n.read(1,e));try{s=r(i)}catch(e){if(e instanceof RangeError)continue;throw e}if(null!=t?.maxLengthLength&&i.byteLength>t.maxLengthLength)throw new Cr("message length length too long","ERR_MSG_LENGTH_TOO_LONG");if(s>-1)break}if(null!=t?.maxDataLength&&s>t.maxDataLength)throw new Cr("message length too long","ERR_MSG_DATA_TOO_LONG");return n.read(s,e)},write:async(e,t)=>{await n.write(new Ir(s(e.byteLength),e),t)},writeV:async(e,t)=>{const r=new Ir(...e.flatMap((e=>[s(e.byteLength),e])));await n.write(r,t)},unwrap:()=>n.unwrap()}}function Nr(e){return null!=e[Symbol.asyncIterator]}const Mr=e=>{const t=D(e),n=w(t);return C(e,n),Mr.bytes=t,n};function Or(e,t){const n=(t=t??{}).lengthEncoder??Mr;function*r(e){const t=n(e.byteLength);t instanceof Uint8Array?yield t:yield*t,e instanceof Uint8Array?yield e:yield*e}return Nr(e)?async function*(){for await(const t of e)yield*r(t)}():function*(){for(const t of e)yield*r(t)}()}Mr.bytes=0,Or.single=(e,t)=>{const n=(t=t??{}).lengthEncoder??Mr;return new Ir(n(e.byteLength),e)};var Lr="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Br(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function Ur(e,t){for(const n in t)Object.defineProperty(e,n,{value:t[n],enumerable:!0,configurable:!0});return e}var Fr=function(e,t,n){if(!e||"string"==typeof e)throw new TypeError("Please pass an Error to err-code");n||(n={}),"object"==typeof t&&(n=t,t=""),t&&(n.code=t);try{return Ur(e,n)}catch(t){n.message=e.message,n.stack=e.stack;const r=function(){};r.prototype=Object.create(Object.getPrototypeOf(e));return Ur(new r,n)}},Vr=Br(Fr);var Kr;!function(e){e[e.LENGTH=0]="LENGTH",e[e.DATA=1]="DATA"}(Kr||(Kr={}));const $r=e=>{const t=x(e);return $r.bytes=D(t),t};function qr(e,t){const n=new Ir;let r=Kr.LENGTH,s=-1;const i=t?.lengthDecoder??$r,o=t?.maxLengthLength??8,a=t?.maxDataLength??4194304;function*c(){for(;n.byteLength>0;){if(r===Kr.LENGTH)try{if(s=i(n),s<0)throw Vr(new Error("invalid message length"),"ERR_INVALID_MSG_LENGTH");if(s>a)throw Vr(new Error("message length too long"),"ERR_MSG_DATA_TOO_LONG");const e=i.bytes;n.consume(e),null!=t?.onLength&&t.onLength(s),r=Kr.DATA}catch(e){if(e instanceof RangeError){if(n.byteLength>o)throw Vr(new Error("message length length too long"),"ERR_MSG_LENGTH_TOO_LONG");break}throw e}if(r===Kr.DATA){if(n.byteLength<s)break;const e=n.sublist(0,s);n.consume(s),null!=t?.onData&&t.onData(e),yield e,r=Kr.LENGTH}}}return Nr(e)?async function*(){for await(const t of e)n.append(t),yield*c();if(n.byteLength>0)throw Vr(new Error("unexpected end of input"),"ERR_UNEXPECTED_EOF")}():function*(){for(const t of e)n.append(t),yield*c();if(n.byteLength>0)throw Vr(new Error("unexpected end of input"),"ERR_UNEXPECTED_EOF")}()}function Hr(e){const[t,n]=null!=e[Symbol.asyncIterator]?[e[Symbol.asyncIterator](),Symbol.asyncIterator]:[e[Symbol.iterator](),Symbol.iterator],r=[];return{peek:()=>t.next(),push:e=>{r.push(e)},next:()=>r.length>0?{done:!1,value:r.shift()}:t.next(),[n](){return this}}}function zr(e,t){let n=0;if(null!=e[Symbol.asyncIterator])return async function*(){for await(const r of e)yield t(r,n++)}();const r=Hr(e),{value:s,done:i}=r.next();if(!0===i)return function*(){}();const o=t(s,n++);if("function"==typeof o.then)return async function*(){yield await o;for await(const e of r)yield t(e,n++)}();const a=t;return function*(){yield o;for(const e of r)yield a(e,n++)}()}
|
|
5
5
|
//! WebPEER.js -- https://github.com/nuzulul/webpeerjs
|
|
6
|
-
$r.bytes=0,qr.fromReader=(e,t)=>{let n=1;return qr(async function*(){for(;;)try{const{done:t,value:r}=await e.next(n);if(!0===t)return;null!=r&&(yield r)}catch(e){if("ERR_UNDER_READ"===e.code)return{done:!0,value:null};throw e}finally{n=1}}(),{...t??{},onLength:e=>{n=e}})};const Wr=t,jr=e=>new Error(`${Wr}: ${e}`);function Gr(e){console.debug(e)}function Yr(e){return(new TextDecoder).decode(e)}function Qr(e){return(new TextEncoder).encode(e)}async function Zr(e){for await(const t of e)return t}async function Jr(e){const t=e,n=(new TextEncoder).encode(t.sequenceNumber.toString());return await gt.encode(n)}let Xr={readyErrored:0,noiseErrored:0,upgradeErrored:0,readyTimedout:0,noiseTimedout:0,success:0},es={pending:0,open:0,ready_error:0,noise_error:0,upgrade_error:0,ready_timeout:0,noise_timeout:0,close:0,abort:0,remote_close:0},ts={pending:0,ready_error:0,noise_error:0,upgrade_error:0,close:0,remote_close:0,ready:0,abort:0,ready_timeout:0,noise_timeout:0,open:0},ns=!0,rs=0,ss=0;var is,os,as={exports:{}};function cs(){if(os)return is;os=1;var e=1e3,t=60*e,n=60*t,r=24*n,s=7*r,i=365.25*r;function o(e,t,n,r){var s=t>=1.5*n;return Math.round(e/n)+" "+r+(s?"s":"")}return is=function(a,c){c=c||{};var l=typeof a;if("string"===l&&a.length>0)return function(o){if((o=String(o)).length>100)return;var a=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(o);if(!a)return;var c=parseFloat(a[1]);switch((a[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return c*i;case"weeks":case"week":case"w":return c*s;case"days":case"day":case"d":return c*r;case"hours":case"hour":case"hrs":case"hr":case"h":return c*n;case"minutes":case"minute":case"mins":case"min":case"m":return c*t;case"seconds":case"second":case"secs":case"sec":case"s":return c*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(a);if("number"===l&&isFinite(a))return c.long?function(s){var i=Math.abs(s);if(i>=r)return o(s,i,r,"day");if(i>=n)return o(s,i,n,"hour");if(i>=t)return o(s,i,t,"minute");if(i>=e)return o(s,i,e,"second");return s+" ms"}(a):function(s){var i=Math.abs(s);if(i>=r)return Math.round(s/r)+"d";if(i>=n)return Math.round(s/n)+"h";if(i>=t)return Math.round(s/t)+"m";if(i>=e)return Math.round(s/e)+"s";return s+"ms"}(a);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(a))}}var ls=function(e){function t(e){let r,s,i,o=null;function a(...e){if(!a.enabled)return;const n=a,s=Number(new Date),i=s-(r||s);n.diff=i,n.prev=r,n.curr=s,r=s,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let o=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,((r,s)=>{if("%%"===r)return"%";o++;const i=t.formatters[s];if("function"==typeof i){const t=e[o];r=i.call(n,t),e.splice(o,1),o--}return r})),t.formatArgs.call(n,e);(n.log||t.log).apply(n,e)}return a.namespace=e,a.useColors=t.useColors(),a.color=t.selectColor(e),a.extend=n,a.destroy=t.destroy,Object.defineProperty(a,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==o?o:(s!==t.namespaces&&(s=t.namespaces,i=t.enabled(e)),i),set:e=>{o=e}}),"function"==typeof t.init&&t.init(a),a}function n(e,n){const r=t(this.namespace+(void 0===n?":":n)+e);return r.log=this.log,r}function r(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){if(e instanceof Error)return e.stack||e.message;return e},t.disable=function(){const e=[...t.names.map(r),...t.skips.map(r).map((e=>"-"+e))].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.namespaces=e,t.names=[],t.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),s=r.length;for(n=0;n<s;n++)r[n]&&("-"===(e=r[n].replace(/\*/g,".*?"))[0]?t.skips.push(new RegExp("^"+e.slice(1)+"$")):t.names.push(new RegExp("^"+e+"$")))},t.enabled=function(e){if("*"===e[e.length-1])return!0;let n,r;for(n=0,r=t.skips.length;n<r;n++)if(t.skips[n].test(e))return!1;for(n=0,r=t.names.length;n<r;n++)if(t.names[n].test(e))return!0;return!1},t.humanize=cs(),t.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(e).forEach((n=>{t[n]=e[n]})),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t<e.length;t++)n=(n<<5)-n+e.charCodeAt(t),n|=0;return t.colors[Math.abs(n)%t.colors.length]},t.enable(t.load()),t};!function(e,t){t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let r=0,s=0;t[0].replace(/%[a-zA-Z%]/g,(e=>{"%%"!==e&&(r++,"%c"===e&&(s=r))})),t.splice(s,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=ls(t);const{formatters:n}=e.exports;n.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}(as,as.exports);var us=Br(as.exports);function hs(){return{forComponent:e=>ds(e)}}function ds(e){let t=function(e){const t=()=>{};return t.enabled=!1,t.color="",t.diff=0,t.log=()=>{},t.namespace=e,t.destroy=()=>!0,t.extend=()=>t,t}(`${e}:trace`);return us.enabled(`${e}:trace`)&&null!=us.names.map((e=>e.toString())).find((e=>e.includes(":trace")))&&(t=us(`${e}:trace`)),Object.assign(us(e),{error:us(`${e}:error`),trace:t})}us.formatters.b=e=>null==e?"undefined":Ce.baseEncode(e),us.formatters.t=e=>null==e?"undefined":we.baseEncode(e),us.formatters.m=e=>null==e?"undefined":Me.baseEncode(e),us.formatters.p=e=>null==e?"undefined":e.toString(),us.formatters.c=e=>null==e?"undefined":e.toString(),us.formatters.k=e=>null==e?"undefined":e.toString(),us.formatters.a=e=>null==e?"undefined":e.toString();const ps=Symbol.for("nodejs.util.inspect.custom"),fs=Object.values(It).map((e=>e.decoder)).reduce(((e,t)=>e.or(t)),It.identity.decoder),gs=114,ms=36,ys=37;class ws{type;multihash;privateKey;publicKey;string;constructor(e){this.type=e.type,this.multihash=e.multihash,this.privateKey=e.privateKey,Object.defineProperty(this,"string",{enumerable:!1,writable:!0})}get[Symbol.toStringTag](){return`PeerId(${this.toString()})`}[sn]=!0;toString(){return null==this.string&&(this.string=Ce.encode(this.multihash.bytes).slice(1)),this.string}toCID(){return bt.createV1(gs,this.multihash)}toBytes(){return this.multihash.bytes}toJSON(){return this.toString()}equals(e){if(null==e)return!1;if(e instanceof Uint8Array)return In(this.multihash.bytes,e);if("string"==typeof e)return Ss(e).equals(this);if(null!=e?.multihash?.bytes)return In(this.multihash.bytes,e.multihash.bytes);throw new Error("not valid Id")}[ps](){return`PeerId(${this.toString()})`}}class bs extends ws{type="RSA";publicKey;constructor(e){super({...e,type:"RSA"}),this.publicKey=e.publicKey}}class vs extends ws{type="Ed25519";publicKey;constructor(e){super({...e,type:"Ed25519"}),this.publicKey=e.multihash.digest}}class Es extends ws{type="secp256k1";publicKey;constructor(e){super({...e,type:"secp256k1"}),this.publicKey=e.multihash.digest}}function Ss(e,t){if(t=t??fs,"1"===e.charAt(0)||"Q"===e.charAt(0)){const t=ut(Ce.decode(`z${e}`));return e.startsWith("12D")?new vs({multihash:t}):e.startsWith("16U")?new Es({multihash:t}):new bs({multihash:t})}return _s(fs.decode(e))}function _s(e){try{const t=ut(e);if(t.code===pt.code){if(t.digest.length===ms)return new vs({multihash:t});if(t.digest.length===ys)return new Es({multihash:t})}if(t.code===gt.code)return new bs({multihash:t})}catch{return function(e){if(null==e||null==e.multihash||null==e.version||1===e.version&&e.code!==gs)throw new Error("Supplied PeerID CID is invalid");const t=e.multihash;if(t.code===gt.code)return new bs({multihash:e.multihash});if(t.code===pt.code){if(t.digest.length===ms)return new vs({multihash:e.multihash});if(t.digest.length===ys)return new Es({multihash:e.multihash})}throw new Error("Supplied PeerID CID is invalid")}(bt.decode(e))}throw new Error("Supplied PeerID CID is invalid")}async function Is(e,t){return e.length===ms?new vs({multihash:lt(pt.code,e),privateKey:t}):e.length===ys?new Es({multihash:lt(pt.code,e),privateKey:t}):new bs({multihash:await gt.digest(e),publicKey:e,privateKey:t})}function Rs(e){const t=new globalThis.AbortController;function n(){t.abort();for(const t of e)null!=t?.removeEventListener&&t.removeEventListener("abort",n)}for(const t of e){if(!0===t?.aborted){n();break}null!=t?.addEventListener&&t.addEventListener("abort",n)}const r=t.signal;return r.clear=function(){for(const t of e)null!=t?.removeEventListener&&t.removeEventListener("abort",n)},r}async function*As(e,t={}){const n=e.getReader();try{for(;;){const e=await n.read();if(e.done)return;yield e.value}}finally{!0!==t.preventCancel&&await n.cancel(),n.releaseLock()}}function Ts(e){return null!=e&&("function"==typeof e.then&&"function"==typeof e.catch&&"function"==typeof e.finally)}function Ds(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`positive integer expected, not ${e}`)}function ks(e,...t){if(!((n=e)instanceof Uint8Array||null!=n&&"object"==typeof n&&"Uint8Array"===n.constructor.name))throw new Error("Uint8Array expected");var n;if(t.length>0&&!t.includes(e.length))throw new Error(`Uint8Array expected of length ${t}, not of length=${e.length}`)}function Ps(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");Ds(e.outputLen),Ds(e.blockLen)}function Cs(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")}const xs="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,Ns=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),Ms=(e,t)=>e<<32-t|e>>>t;
|
|
7
|
-
/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */new Uint8Array(new Uint32Array([287454020]).buffer)[0];const
|
|
8
|
-
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */function
|
|
9
|
-
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const
|
|
6
|
+
$r.bytes=0,qr.fromReader=(e,t)=>{let n=1;return qr(async function*(){for(;;)try{const{done:t,value:r}=await e.next(n);if(!0===t)return;null!=r&&(yield r)}catch(e){if("ERR_UNDER_READ"===e.code)return{done:!0,value:null};throw e}finally{n=1}}(),{...t??{},onLength:e=>{n=e}})};const Wr=t,jr=e=>new Error(`${Wr}: ${e}`);function Gr(e){return(new TextDecoder).decode(e)}function Yr(e){return(new TextEncoder).encode(e)}async function Qr(e){for await(const t of e)return t}window.opr&&window.opr.addons||window.opera||navigator.userAgent.indexOf(" OPR/");const Jr="undefined"!=typeof InstallTrigger;/constructor/i.test(window.HTMLElement)||(!window.safari||"undefined"!=typeof safari&&window.safari.pushNotification).toString();async function Zr(e){const t=e,n=(new TextEncoder).encode(t.sequenceNumber.toString());return await gt.encode(n)}!(!window.chrome||!window.chrome.webstore&&!window.chrome.runtime)&&navigator.userAgent.indexOf("Edg");let Xr={readyErrored:0,noiseErrored:0,upgradeErrored:0,readyTimedout:0,noiseTimedout:0,success:0},es={pending:0,open:0,ready_error:0,noise_error:0,upgrade_error:0,ready_timeout:0,noise_timeout:0,close:0,abort:0,remote_close:0},ts={pending:0,ready_error:0,noise_error:0,upgrade_error:0,close:0,remote_close:0,ready:0,abort:0,ready_timeout:0,noise_timeout:0,open:0},ns=0,rs=!0,ss=0,is=!0,os=0;if(!WebTransport)throw jr("It seems that your browser does not support the required WebTransport feature");var as,cs,ls={exports:{}};function us(){if(cs)return as;cs=1;var e=1e3,t=60*e,n=60*t,r=24*n,s=7*r,i=365.25*r;function o(e,t,n,r){var s=t>=1.5*n;return Math.round(e/n)+" "+r+(s?"s":"")}return as=function(a,c){c=c||{};var l=typeof a;if("string"===l&&a.length>0)return function(o){if((o=String(o)).length>100)return;var a=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(o);if(!a)return;var c=parseFloat(a[1]);switch((a[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return c*i;case"weeks":case"week":case"w":return c*s;case"days":case"day":case"d":return c*r;case"hours":case"hour":case"hrs":case"hr":case"h":return c*n;case"minutes":case"minute":case"mins":case"min":case"m":return c*t;case"seconds":case"second":case"secs":case"sec":case"s":return c*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(a);if("number"===l&&isFinite(a))return c.long?function(s){var i=Math.abs(s);if(i>=r)return o(s,i,r,"day");if(i>=n)return o(s,i,n,"hour");if(i>=t)return o(s,i,t,"minute");if(i>=e)return o(s,i,e,"second");return s+" ms"}(a):function(s){var i=Math.abs(s);if(i>=r)return Math.round(s/r)+"d";if(i>=n)return Math.round(s/n)+"h";if(i>=t)return Math.round(s/t)+"m";if(i>=e)return Math.round(s/e)+"s";return s+"ms"}(a);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(a))}}var hs=function(e){function t(e){let r,s,i,o=null;function a(...e){if(!a.enabled)return;const n=a,s=Number(new Date),i=s-(r||s);n.diff=i,n.prev=r,n.curr=s,r=s,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let o=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,((r,s)=>{if("%%"===r)return"%";o++;const i=t.formatters[s];if("function"==typeof i){const t=e[o];r=i.call(n,t),e.splice(o,1),o--}return r})),t.formatArgs.call(n,e);(n.log||t.log).apply(n,e)}return a.namespace=e,a.useColors=t.useColors(),a.color=t.selectColor(e),a.extend=n,a.destroy=t.destroy,Object.defineProperty(a,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==o?o:(s!==t.namespaces&&(s=t.namespaces,i=t.enabled(e)),i),set:e=>{o=e}}),"function"==typeof t.init&&t.init(a),a}function n(e,n){const r=t(this.namespace+(void 0===n?":":n)+e);return r.log=this.log,r}function r(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){if(e instanceof Error)return e.stack||e.message;return e},t.disable=function(){const e=[...t.names.map(r),...t.skips.map(r).map((e=>"-"+e))].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.namespaces=e,t.names=[],t.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),s=r.length;for(n=0;n<s;n++)r[n]&&("-"===(e=r[n].replace(/\*/g,".*?"))[0]?t.skips.push(new RegExp("^"+e.slice(1)+"$")):t.names.push(new RegExp("^"+e+"$")))},t.enabled=function(e){if("*"===e[e.length-1])return!0;let n,r;for(n=0,r=t.skips.length;n<r;n++)if(t.skips[n].test(e))return!1;for(n=0,r=t.names.length;n<r;n++)if(t.names[n].test(e))return!0;return!1},t.humanize=us(),t.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(e).forEach((n=>{t[n]=e[n]})),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t<e.length;t++)n=(n<<5)-n+e.charCodeAt(t),n|=0;return t.colors[Math.abs(n)%t.colors.length]},t.enable(t.load()),t};!function(e,t){t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let r=0,s=0;t[0].replace(/%[a-zA-Z%]/g,(e=>{"%%"!==e&&(r++,"%c"===e&&(s=r))})),t.splice(s,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=hs(t);const{formatters:n}=e.exports;n.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}(ls,ls.exports);var ds=Br(ls.exports);function ps(){return{forComponent:e=>fs(e)}}function fs(e){let t=function(e){const t=()=>{};return t.enabled=!1,t.color="",t.diff=0,t.log=()=>{},t.namespace=e,t.destroy=()=>!0,t.extend=()=>t,t}(`${e}:trace`);return ds.enabled(`${e}:trace`)&&null!=ds.names.map((e=>e.toString())).find((e=>e.includes(":trace")))&&(t=ds(`${e}:trace`)),Object.assign(ds(e),{error:ds(`${e}:error`),trace:t})}ds.formatters.b=e=>null==e?"undefined":Ce.baseEncode(e),ds.formatters.t=e=>null==e?"undefined":we.baseEncode(e),ds.formatters.m=e=>null==e?"undefined":Me.baseEncode(e),ds.formatters.p=e=>null==e?"undefined":e.toString(),ds.formatters.c=e=>null==e?"undefined":e.toString(),ds.formatters.k=e=>null==e?"undefined":e.toString(),ds.formatters.a=e=>null==e?"undefined":e.toString();const gs=Symbol.for("nodejs.util.inspect.custom"),ms=Object.values(It).map((e=>e.decoder)).reduce(((e,t)=>e.or(t)),It.identity.decoder),ys=114,ws=36,bs=37;class vs{type;multihash;privateKey;publicKey;string;constructor(e){this.type=e.type,this.multihash=e.multihash,this.privateKey=e.privateKey,Object.defineProperty(this,"string",{enumerable:!1,writable:!0})}get[Symbol.toStringTag](){return`PeerId(${this.toString()})`}[sn]=!0;toString(){return null==this.string&&(this.string=Ce.encode(this.multihash.bytes).slice(1)),this.string}toCID(){return bt.createV1(ys,this.multihash)}toBytes(){return this.multihash.bytes}toJSON(){return this.toString()}equals(e){if(null==e)return!1;if(e instanceof Uint8Array)return In(this.multihash.bytes,e);if("string"==typeof e)return Is(e).equals(this);if(null!=e?.multihash?.bytes)return In(this.multihash.bytes,e.multihash.bytes);throw new Error("not valid Id")}[gs](){return`PeerId(${this.toString()})`}}class Es extends vs{type="RSA";publicKey;constructor(e){super({...e,type:"RSA"}),this.publicKey=e.publicKey}}class Ss extends vs{type="Ed25519";publicKey;constructor(e){super({...e,type:"Ed25519"}),this.publicKey=e.multihash.digest}}class _s extends vs{type="secp256k1";publicKey;constructor(e){super({...e,type:"secp256k1"}),this.publicKey=e.multihash.digest}}function Is(e,t){if(t=t??ms,"1"===e.charAt(0)||"Q"===e.charAt(0)){const t=ut(Ce.decode(`z${e}`));return e.startsWith("12D")?new Ss({multihash:t}):e.startsWith("16U")?new _s({multihash:t}):new Es({multihash:t})}return Rs(ms.decode(e))}function Rs(e){try{const t=ut(e);if(t.code===pt.code){if(t.digest.length===ws)return new Ss({multihash:t});if(t.digest.length===bs)return new _s({multihash:t})}if(t.code===gt.code)return new Es({multihash:t})}catch{return function(e){if(null==e||null==e.multihash||null==e.version||1===e.version&&e.code!==ys)throw new Error("Supplied PeerID CID is invalid");const t=e.multihash;if(t.code===gt.code)return new Es({multihash:e.multihash});if(t.code===pt.code){if(t.digest.length===ws)return new Ss({multihash:e.multihash});if(t.digest.length===bs)return new _s({multihash:e.multihash})}throw new Error("Supplied PeerID CID is invalid")}(bt.decode(e))}throw new Error("Supplied PeerID CID is invalid")}async function As(e,t){return e.length===ws?new Ss({multihash:lt(pt.code,e),privateKey:t}):e.length===bs?new _s({multihash:lt(pt.code,e),privateKey:t}):new Es({multihash:await gt.digest(e),publicKey:e,privateKey:t})}function Ts(e){const t=new globalThis.AbortController;function n(){t.abort();for(const t of e)null!=t?.removeEventListener&&t.removeEventListener("abort",n)}for(const t of e){if(!0===t?.aborted){n();break}null!=t?.addEventListener&&t.addEventListener("abort",n)}const r=t.signal;return r.clear=function(){for(const t of e)null!=t?.removeEventListener&&t.removeEventListener("abort",n)},r}async function*Ds(e,t={}){const n=e.getReader();try{for(;;){const e=await n.read();if(e.done)return;yield e.value}}finally{!0!==t.preventCancel&&await n.cancel(),n.releaseLock()}}function ks(e){return null!=e&&("function"==typeof e.then&&"function"==typeof e.catch&&"function"==typeof e.finally)}function Ps(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`positive integer expected, not ${e}`)}function Cs(e,...t){if(!((n=e)instanceof Uint8Array||null!=n&&"object"==typeof n&&"Uint8Array"===n.constructor.name))throw new Error("Uint8Array expected");var n;if(t.length>0&&!t.includes(e.length))throw new Error(`Uint8Array expected of length ${t}, not of length=${e.length}`)}function xs(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");Ps(e.outputLen),Ps(e.blockLen)}function Ns(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")}const Ms="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,Os=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),Ls=(e,t)=>e<<32-t|e>>>t;
|
|
7
|
+
/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */new Uint8Array(new Uint32Array([287454020]).buffer)[0];const Bs=async()=>{};async function Us(e,t,n){let r=Date.now();for(let s=0;s<e;s++){n(s);const e=Date.now()-r;e>=0&&e<t||(await Bs(),r+=e)}}function Fs(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function Vs(e){return"string"==typeof e&&(e=Fs(e)),Cs(e),e}function Ks(...e){let t=0;for(let n=0;n<e.length;n++){const r=e[n];Cs(r),t+=r.length}const n=new Uint8Array(t);for(let t=0,r=0;t<e.length;t++){const s=e[t];n.set(s,r),r+=s.length}return n}class $s{clone(){return this._cloneInto()}}const qs={}.toString;function Hs(e){const t=t=>e().update(Vs(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}function zs(e=32){if(Ms&&"function"==typeof Ms.getRandomValues)return Ms.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}const Ws=(e,t,n)=>e&t^e&n^t&n;class js extends $s{constructor(e,t,n,r){super(),this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=r,this.finished=!1,this.length=0,this.pos=0,this.destroyed=!1,this.buffer=new Uint8Array(e),this.view=Os(this.buffer)}update(e){Ns(this);const{view:t,buffer:n,blockLen:r}=this,s=(e=Vs(e)).length;for(let i=0;i<s;){const o=Math.min(r-this.pos,s-i);if(o!==r)n.set(e.subarray(i,i+o),this.pos),this.pos+=o,i+=o,this.pos===r&&(this.process(t,0),this.pos=0);else{const t=Os(e);for(;r<=s-i;i+=r)this.process(t,i)}}return this.length+=e.length,this.roundClean(),this}digestInto(e){Ns(this),function(e,t){Cs(e);const n=t.outputLen;if(e.length<n)throw new Error(`digestInto() expects output buffer of length at least ${n}`)}(e,this),this.finished=!0;const{buffer:t,view:n,blockLen:r,isLE:s}=this;let{pos:i}=this;t[i++]=128,this.buffer.subarray(i).fill(0),this.padOffset>r-i&&(this.process(n,0),i=0);for(let e=i;e<r;e++)t[e]=0;!function(e,t,n,r){if("function"==typeof e.setBigUint64)return e.setBigUint64(t,n,r);const s=BigInt(32),i=BigInt(4294967295),o=Number(n>>s&i),a=Number(n&i),c=r?4:0,l=r?0:4;e.setUint32(t+c,o,r),e.setUint32(t+l,a,r)}(n,r-8,BigInt(8*this.length),s),this.process(n,0);const o=Os(e),a=this.outputLen;if(a%4)throw new Error("_sha2: outputLen should be aligned to 32bit");const c=a/4,l=this.get();if(c>l.length)throw new Error("_sha2: outputLen bigger than state");for(let e=0;e<c;e++)o.setUint32(4*e,l[e],s)}digest(){const{buffer:e,outputLen:t}=this;this.digestInto(e);const n=e.slice(0,t);return this.destroy(),n}_cloneInto(e){e||(e=new this.constructor),e.set(...this.get());const{blockLen:t,buffer:n,length:r,finished:s,destroyed:i,pos:o}=this;return e.length=r,e.pos=o,e.finished=s,e.destroyed=i,r%t&&e.buffer.set(n),e}}const Gs=BigInt(2**32-1),Ys=BigInt(32);function Qs(e,t=!1){return t?{h:Number(e&Gs),l:Number(e>>Ys&Gs)}:{h:0|Number(e>>Ys&Gs),l:0|Number(e&Gs)}}const Js={fromBig:Qs,split:function(e,t=!1){let n=new Uint32Array(e.length),r=new Uint32Array(e.length);for(let s=0;s<e.length;s++){const{h:i,l:o}=Qs(e[s],t);[n[s],r[s]]=[i,o]}return[n,r]},toBig:(e,t)=>BigInt(e>>>0)<<Ys|BigInt(t>>>0),shrSH:(e,t,n)=>e>>>n,shrSL:(e,t,n)=>e<<32-n|t>>>n,rotrSH:(e,t,n)=>e>>>n|t<<32-n,rotrSL:(e,t,n)=>e<<32-n|t>>>n,rotrBH:(e,t,n)=>e<<64-n|t>>>n-32,rotrBL:(e,t,n)=>e>>>n-32|t<<64-n,rotr32H:(e,t)=>t,rotr32L:(e,t)=>e,rotlSH:(e,t,n)=>e<<n|t>>>32-n,rotlSL:(e,t,n)=>t<<n|e>>>32-n,rotlBH:(e,t,n)=>t<<n-32|e>>>64-n,rotlBL:(e,t,n)=>e<<n-32|t>>>64-n,add:function(e,t,n,r){const s=(t>>>0)+(r>>>0);return{h:e+n+(s/2**32|0)|0,l:0|s}},add3L:(e,t,n)=>(e>>>0)+(t>>>0)+(n>>>0),add3H:(e,t,n,r)=>t+n+r+(e/2**32|0)|0,add4L:(e,t,n,r)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0),add4H:(e,t,n,r,s)=>t+n+r+s+(e/2**32|0)|0,add5H:(e,t,n,r,s,i)=>t+n+r+s+i+(e/2**32|0)|0,add5L:(e,t,n,r,s)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0)+(s>>>0)},[Zs,Xs]=(()=>Js.split(["0x428a2f98d728ae22","0x7137449123ef65cd","0xb5c0fbcfec4d3b2f","0xe9b5dba58189dbbc","0x3956c25bf348b538","0x59f111f1b605d019","0x923f82a4af194f9b","0xab1c5ed5da6d8118","0xd807aa98a3030242","0x12835b0145706fbe","0x243185be4ee4b28c","0x550c7dc3d5ffb4e2","0x72be5d74f27b896f","0x80deb1fe3b1696b1","0x9bdc06a725c71235","0xc19bf174cf692694","0xe49b69c19ef14ad2","0xefbe4786384f25e3","0x0fc19dc68b8cd5b5","0x240ca1cc77ac9c65","0x2de92c6f592b0275","0x4a7484aa6ea6e483","0x5cb0a9dcbd41fbd4","0x76f988da831153b5","0x983e5152ee66dfab","0xa831c66d2db43210","0xb00327c898fb213f","0xbf597fc7beef0ee4","0xc6e00bf33da88fc2","0xd5a79147930aa725","0x06ca6351e003826f","0x142929670a0e6e70","0x27b70a8546d22ffc","0x2e1b21385c26c926","0x4d2c6dfc5ac42aed","0x53380d139d95b3df","0x650a73548baf63de","0x766a0abb3c77b2a8","0x81c2c92e47edaee6","0x92722c851482353b","0xa2bfe8a14cf10364","0xa81a664bbc423001","0xc24b8b70d0f89791","0xc76c51a30654be30","0xd192e819d6ef5218","0xd69906245565a910","0xf40e35855771202a","0x106aa07032bbd1b8","0x19a4c116b8d2d0c8","0x1e376c085141ab53","0x2748774cdf8eeb99","0x34b0bcb5e19b48a8","0x391c0cb3c5c95a63","0x4ed8aa4ae3418acb","0x5b9cca4f7763e373","0x682e6ff3d6b2b8a3","0x748f82ee5defb2fc","0x78a5636f43172f60","0x84c87814a1f0ab72","0x8cc702081a6439ec","0x90befffa23631e28","0xa4506cebde82bde9","0xbef9a3f7b2c67915","0xc67178f2e372532b","0xca273eceea26619c","0xd186b8c721c0c207","0xeada7dd6cde0eb1e","0xf57d4f7fee6ed178","0x06f067aa72176fba","0x0a637dc5a2c898a6","0x113f9804bef90dae","0x1b710b35131c471b","0x28db77f523047d84","0x32caab7b40c72493","0x3c9ebe0a15c9bebc","0x431d67c49c100d4c","0x4cc5d4becb3e42b6","0x597f299cfc657e2a","0x5fcb6fab3ad6faec","0x6c44198c4a475817"].map((e=>BigInt(e)))))(),ei=new Uint32Array(80),ti=new Uint32Array(80);class ni extends js{constructor(){super(128,64,16,!1),this.Ah=1779033703,this.Al=-205731576,this.Bh=-1150833019,this.Bl=-2067093701,this.Ch=1013904242,this.Cl=-23791573,this.Dh=-1521486534,this.Dl=1595750129,this.Eh=1359893119,this.El=-1377402159,this.Fh=-1694144372,this.Fl=725511199,this.Gh=528734635,this.Gl=-79577749,this.Hh=1541459225,this.Hl=327033209}get(){const{Ah:e,Al:t,Bh:n,Bl:r,Ch:s,Cl:i,Dh:o,Dl:a,Eh:c,El:l,Fh:u,Fl:h,Gh:d,Gl:p,Hh:f,Hl:g}=this;return[e,t,n,r,s,i,o,a,c,l,u,h,d,p,f,g]}set(e,t,n,r,s,i,o,a,c,l,u,h,d,p,f,g){this.Ah=0|e,this.Al=0|t,this.Bh=0|n,this.Bl=0|r,this.Ch=0|s,this.Cl=0|i,this.Dh=0|o,this.Dl=0|a,this.Eh=0|c,this.El=0|l,this.Fh=0|u,this.Fl=0|h,this.Gh=0|d,this.Gl=0|p,this.Hh=0|f,this.Hl=0|g}process(e,t){for(let n=0;n<16;n++,t+=4)ei[n]=e.getUint32(t),ti[n]=e.getUint32(t+=4);for(let e=16;e<80;e++){const t=0|ei[e-15],n=0|ti[e-15],r=Js.rotrSH(t,n,1)^Js.rotrSH(t,n,8)^Js.shrSH(t,n,7),s=Js.rotrSL(t,n,1)^Js.rotrSL(t,n,8)^Js.shrSL(t,n,7),i=0|ei[e-2],o=0|ti[e-2],a=Js.rotrSH(i,o,19)^Js.rotrBH(i,o,61)^Js.shrSH(i,o,6),c=Js.rotrSL(i,o,19)^Js.rotrBL(i,o,61)^Js.shrSL(i,o,6),l=Js.add4L(s,c,ti[e-7],ti[e-16]),u=Js.add4H(l,r,a,ei[e-7],ei[e-16]);ei[e]=0|u,ti[e]=0|l}let{Ah:n,Al:r,Bh:s,Bl:i,Ch:o,Cl:a,Dh:c,Dl:l,Eh:u,El:h,Fh:d,Fl:p,Gh:f,Gl:g,Hh:m,Hl:y}=this;for(let e=0;e<80;e++){const t=Js.rotrSH(u,h,14)^Js.rotrSH(u,h,18)^Js.rotrBH(u,h,41),w=Js.rotrSL(u,h,14)^Js.rotrSL(u,h,18)^Js.rotrBL(u,h,41),b=u&d^~u&f,v=h&p^~h&g,E=Js.add5L(y,w,v,Xs[e],ti[e]),S=Js.add5H(E,m,t,b,Zs[e],ei[e]),_=0|E,I=Js.rotrSH(n,r,28)^Js.rotrBH(n,r,34)^Js.rotrBH(n,r,39),R=Js.rotrSL(n,r,28)^Js.rotrBL(n,r,34)^Js.rotrBL(n,r,39),A=n&s^n&o^s&o,T=r&i^r&a^i&a;m=0|f,y=0|g,f=0|d,g=0|p,d=0|u,p=0|h,({h:u,l:h}=Js.add(0|c,0|l,0|S,0|_)),c=0|o,l=0|a,o=0|s,a=0|i,s=0|n,i=0|r;const D=Js.add3L(_,R,T);n=Js.add3H(D,S,I,A),r=0|D}({h:n,l:r}=Js.add(0|this.Ah,0|this.Al,0|n,0|r)),({h:s,l:i}=Js.add(0|this.Bh,0|this.Bl,0|s,0|i)),({h:o,l:a}=Js.add(0|this.Ch,0|this.Cl,0|o,0|a)),({h:c,l:l}=Js.add(0|this.Dh,0|this.Dl,0|c,0|l)),({h:u,l:h}=Js.add(0|this.Eh,0|this.El,0|u,0|h)),({h:d,l:p}=Js.add(0|this.Fh,0|this.Fl,0|d,0|p)),({h:f,l:g}=Js.add(0|this.Gh,0|this.Gl,0|f,0|g)),({h:m,l:y}=Js.add(0|this.Hh,0|this.Hl,0|m,0|y)),this.set(n,r,s,i,o,a,c,l,u,h,d,p,f,g,m,y)}roundClean(){ei.fill(0),ti.fill(0)}destroy(){this.buffer.fill(0),this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)}}const ri=Hs((()=>new ni)),si=BigInt(0),ii=BigInt(1),oi=BigInt(2);
|
|
8
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */function ai(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name}function ci(e){if(!ai(e))throw new Error("Uint8Array expected")}const li=Array.from({length:256},((e,t)=>t.toString(16).padStart(2,"0")));function ui(e){ci(e);let t="";for(let n=0;n<e.length;n++)t+=li[e[n]];return t}function hi(e){const t=e.toString(16);return 1&t.length?`0${t}`:t}function di(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);return BigInt(""===e?"0":`0x${e}`)}const pi={_0:48,_9:57,_A:65,_F:70,_a:97,_f:102};function fi(e){return e>=pi._0&&e<=pi._9?e-pi._0:e>=pi._A&&e<=pi._F?e-(pi._A-10):e>=pi._a&&e<=pi._f?e-(pi._a-10):void 0}function gi(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);const t=e.length,n=t/2;if(t%2)throw new Error("padded hex string expected, got unpadded hex of length "+t);const r=new Uint8Array(n);for(let t=0,s=0;t<n;t++,s+=2){const n=fi(e.charCodeAt(s)),i=fi(e.charCodeAt(s+1));if(void 0===n||void 0===i){const t=e[s]+e[s+1];throw new Error('hex string expected, got non-hex character "'+t+'" at index '+s)}r[t]=16*n+i}return r}function mi(e){return di(ui(e))}function yi(e){return ci(e),di(ui(Uint8Array.from(e).reverse()))}function wi(e,t){return gi(e.toString(16).padStart(2*t,"0"))}function bi(e,t){return wi(e,t).reverse()}function vi(e,t,n){let r;if("string"==typeof t)try{r=gi(t)}catch(n){throw new Error(`${e} must be valid hex string, got "${t}". Cause: ${n}`)}else{if(!ai(t))throw new Error(`${e} must be hex string or Uint8Array`);r=Uint8Array.from(t)}const s=r.length;if("number"==typeof n&&s!==n)throw new Error(`${e} expected ${n} bytes, got ${s}`);return r}function Ei(...e){let t=0;for(let n=0;n<e.length;n++){const r=e[n];ci(r),t+=r.length}const n=new Uint8Array(t);for(let t=0,r=0;t<e.length;t++){const s=e[t];n.set(s,r),r+=s.length}return n}const Si=e=>(oi<<BigInt(e-1))-ii,_i=e=>new Uint8Array(e),Ii=e=>Uint8Array.from(e);function Ri(e,t,n){if("number"!=typeof e||e<2)throw new Error("hashLen must be a number");if("number"!=typeof t||t<2)throw new Error("qByteLen must be a number");if("function"!=typeof n)throw new Error("hmacFn must be a function");let r=_i(e),s=_i(e),i=0;const o=()=>{r.fill(1),s.fill(0),i=0},a=(...e)=>n(s,r,...e),c=(e=_i())=>{s=a(Ii([0]),e),r=a(),0!==e.length&&(s=a(Ii([1]),e),r=a())},l=()=>{if(i++>=1e3)throw new Error("drbg: tried 1000 values");let e=0;const n=[];for(;e<t;){r=a();const t=r.slice();n.push(t),e+=r.length}return Ei(...n)};return(e,t)=>{let n;for(o(),c(e);!(n=t(l()));)c();return o(),n}}const Ai={bigint:e=>"bigint"==typeof e,function:e=>"function"==typeof e,boolean:e=>"boolean"==typeof e,string:e=>"string"==typeof e,stringOrUint8Array:e=>"string"==typeof e||ai(e),isSafeInteger:e=>Number.isSafeInteger(e),array:e=>Array.isArray(e),field:(e,t)=>t.Fp.isValid(e),hash:e=>"function"==typeof e&&Number.isSafeInteger(e.outputLen)};function Ti(e,t,n={}){const r=(t,n,r)=>{const s=Ai[n];if("function"!=typeof s)throw new Error(`Invalid validator "${n}", expected function`);const i=e[t];if(!(r&&void 0===i||s(i,e)))throw new Error(`Invalid param ${String(t)}=${i} (${typeof i}), expected ${n}`)};for(const[e,n]of Object.entries(t))r(e,n,!1);for(const[e,t]of Object.entries(n))r(e,t,!0);return e}var Di=Object.freeze({__proto__:null,abytes:ci,bitGet:function(e,t){return e>>BigInt(t)&ii},bitLen:function(e){let t;for(t=0;e>si;e>>=ii,t+=1);return t},bitMask:Si,bitSet:function(e,t,n){return e|(n?ii:si)<<BigInt(t)},bytesToHex:ui,bytesToNumberBE:mi,bytesToNumberLE:yi,concatBytes:Ei,createHmacDrbg:Ri,ensureBytes:vi,equalBytes:function(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return 0===n},hexToBytes:gi,hexToNumber:di,isBytes:ai,numberToBytesBE:wi,numberToBytesLE:bi,numberToHexUnpadded:hi,numberToVarBytesBE:function(e){return gi(hi(e))},utf8ToBytes:function(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))},validateObject:Ti});
|
|
9
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const ki=BigInt(0),Pi=BigInt(1),Ci=BigInt(2),xi=BigInt(3),Ni=BigInt(4),Mi=BigInt(5),Oi=BigInt(8);function Li(e,t){const n=e%t;return n>=ki?n:t+n}function Bi(e,t,n){if(n<=ki||t<ki)throw new Error("Expected power/modulo > 0");if(n===Pi)return ki;let r=Pi;for(;t>ki;)t&Pi&&(r=r*e%n),e=e*e%n,t>>=Pi;return r}function Ui(e,t,n){let r=e;for(;t-- >ki;)r*=r,r%=n;return r}function Fi(e,t){if(e===ki||t<=ki)throw new Error(`invert: expected positive integers, got n=${e} mod=${t}`);let n=Li(e,t),r=t,s=ki,i=Pi;for(;n!==ki;){const e=r%n,t=s-i*(r/n);r=n,n=e,s=i,i=t}if(r!==Pi)throw new Error("invert: does not exist");return Li(s,t)}function Vi(e){if(e%Ni===xi){const t=(e+Pi)/Ni;return function(e,n){const r=e.pow(n,t);if(!e.eql(e.sqr(r),n))throw new Error("Cannot find square root");return r}}if(e%Oi===Mi){const t=(e-Mi)/Oi;return function(e,n){const r=e.mul(n,Ci),s=e.pow(r,t),i=e.mul(n,s),o=e.mul(e.mul(i,Ci),s),a=e.mul(i,e.sub(o,e.ONE));if(!e.eql(e.sqr(a),n))throw new Error("Cannot find square root");return a}}return function(e){const t=(e-Pi)/Ci;let n,r,s;for(n=e-Pi,r=0;n%Ci===ki;n/=Ci,r++);for(s=Ci;s<e&&Bi(s,t,e)!==e-Pi;s++);if(1===r){const t=(e+Pi)/Ni;return function(e,n){const r=e.pow(n,t);if(!e.eql(e.sqr(r),n))throw new Error("Cannot find square root");return r}}const i=(n+Pi)/Ci;return function(e,o){if(e.pow(o,t)===e.neg(e.ONE))throw new Error("Cannot find square root");let a=r,c=e.pow(e.mul(e.ONE,s),n),l=e.pow(o,i),u=e.pow(o,n);for(;!e.eql(u,e.ONE);){if(e.eql(u,e.ZERO))return e.ZERO;let t=1;for(let n=e.sqr(u);t<a&&!e.eql(n,e.ONE);t++)n=e.sqr(n);const n=e.pow(c,Pi<<BigInt(a-t-1));c=e.sqr(n),l=e.mul(l,n),u=e.mul(u,c),a=t}return l}}(e)}BigInt(9),BigInt(16);const Ki=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function $i(e,t){const n=void 0!==t?t:e.toString(2).length;return{nBitLength:n,nByteLength:Math.ceil(n/8)}}function qi(e,t,n=!1,r={}){if(e<=ki)throw new Error(`Expected Field ORDER > 0, got ${e}`);const{nBitLength:s,nByteLength:i}=$i(e,t);if(i>2048)throw new Error("Field lengths over 2048 bytes are not supported");const o=Vi(e),a=Object.freeze({ORDER:e,BITS:s,BYTES:i,MASK:Si(s),ZERO:ki,ONE:Pi,create:t=>Li(t,e),isValid:t=>{if("bigint"!=typeof t)throw new Error("Invalid field element: expected bigint, got "+typeof t);return ki<=t&&t<e},is0:e=>e===ki,isOdd:e=>(e&Pi)===Pi,neg:t=>Li(-t,e),eql:(e,t)=>e===t,sqr:t=>Li(t*t,e),add:(t,n)=>Li(t+n,e),sub:(t,n)=>Li(t-n,e),mul:(t,n)=>Li(t*n,e),pow:(e,t)=>function(e,t,n){if(n<ki)throw new Error("Expected power > 0");if(n===ki)return e.ONE;if(n===Pi)return t;let r=e.ONE,s=t;for(;n>ki;)n&Pi&&(r=e.mul(r,s)),s=e.sqr(s),n>>=Pi;return r}(a,e,t),div:(t,n)=>Li(t*Fi(n,e),e),sqrN:e=>e*e,addN:(e,t)=>e+t,subN:(e,t)=>e-t,mulN:(e,t)=>e*t,inv:t=>Fi(t,e),sqrt:r.sqrt||(e=>o(a,e)),invertBatch:e=>function(e,t){const n=new Array(t.length),r=t.reduce(((t,r,s)=>e.is0(r)?t:(n[s]=t,e.mul(t,r))),e.ONE),s=e.inv(r);return t.reduceRight(((t,r,s)=>e.is0(r)?t:(n[s]=e.mul(t,n[s]),e.mul(t,r))),s),n}(a,e),cmov:(e,t,n)=>n?t:e,toBytes:e=>n?bi(e,i):wi(e,i),fromBytes:e=>{if(e.length!==i)throw new Error(`Fp.fromBytes: expected ${i}, got ${e.length}`);return n?yi(e):mi(e)}});return Object.freeze(a)}function Hi(e){if("bigint"!=typeof e)throw new Error("field order must be bigint");const t=e.toString(2).length;return Math.ceil(t/8)}function zi(e){const t=Hi(e);return t+Math.ceil(t/2)}
|
|
10
10
|
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
11
|
-
const
|
|
12
|
-
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const
|
|
13
|
-
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const
|
|
14
|
-
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const ro=BigInt("57896044618658097711785492504343953926634992332820282019728792003956564819949"),so=BigInt("19681161376707505956807079304988542015446066515923890162744021073123829784752");BigInt(0);const io=BigInt(1),oo=BigInt(2),ao=BigInt(5),co=BigInt(10),lo=BigInt(20),uo=BigInt(40),ho=BigInt(80);function po(e){const t=ro,n=e*e%t*e%t,r=Li(n,oo,t)*n%t,s=Li(r,io,t)*e%t,i=Li(s,ao,t)*s%t,o=Li(i,co,t)*i%t,a=Li(o,lo,t)*o%t,c=Li(a,uo,t)*a%t,l=Li(c,ho,t)*c%t,u=Li(l,ho,t)*c%t,h=Li(u,co,t)*i%t;return{pow_p_5_8:Li(h,oo,t)*e%t,b2:n}}function fo(e){return e[0]&=248,e[31]&=127,e[31]|=64,e}const go=Ki(ro,void 0,!0),mo={a:BigInt(-1),d:BigInt("37095705934669439343138083508754565189542113879843219016388785533085940283555"),Fp:go,n:BigInt("7237005577332262213973186563042994240857116359379907606001950938285454250989"),h:BigInt(8),Gx:BigInt("15112221349535400772501151409588531511454012693041857206046113283949847762202"),Gy:BigInt("46316835694926478169428394003475163141307993866256225615783033603165251855960"),hash:ti,randomBytes:qs,adjustScalarBytes:fo,uvRatio:function(e,t){const n=ro,r=Mi(t*t*t,n),s=Mi(r*r*t,n);let i=Mi(e*r*po(e*s).pow_p_5_8,n);const o=Mi(t*i*i,n),a=i,c=Mi(i*so,n),l=o===e,u=o===Mi(-e,n),h=o===Mi(-e*so,n);return l&&(i=a),(u||h)&&(i=c),(Mi(i,n)&Di)===Di&&(i=Mi(-i,n)),{isValid:l||u,value:i}}},yo=Xi(mo);const wo=(()=>no({P:ro,a:BigInt(486662),montgomeryBits:255,nByteLength:32,Gu:BigInt(9),powPminus2:e=>{const t=ro,{pow_p_5_8:n,b2:r}=po(e);return Mi(Li(n,BigInt(3),t)*r,t)},adjustScalarBytes:fo,randomBytes:qs}))(),bo=(go.ORDER+BigInt(3))/BigInt(8);go.pow(oo,bo),go.sqrt(go.neg(go.ONE)),go.ORDER,BigInt(5),BigInt(8),BigInt(486662),function(e,t){if(!e.isOdd)throw new Error("Field doesn't have isOdd");const n=e.sqrt(t);e.isOdd(n)&&e.neg(n)}(go,go.neg(BigInt(486664))),BigInt("25063068953384623474111414158702152701244531502492656460079210482610430750235"),BigInt("54469307008909316920995813868745141605393597292927456921205312896311721017578"),BigInt("1159843021668779879193775521855586647937357759715417654439879720876111806838"),BigInt("40440834346308536858101042469323190826248399146238708352240133220865137265952"),BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");const vo=64,Eo=32;function So(e,t){const n=new Uint8Array(vo);for(let r=0;r<Eo;r++)n[r]=e[r],n[Eo+r]=t[r];return n}var _o={get(e=globalThis){const t=e.crypto;if(null==t||null==t.subtle)throw Object.assign(new Error("Missing Web Crypto API. The most likely cause of this error is that this page is being accessed from an insecure context (i.e. not HTTPS). For more information and possible resolutions see https://github.com/libp2p/js-libp2p/blob/main/packages/crypto/README.md#web-crypto-api"),{code:"ERR_MISSING_WEB_CRYPTO"});return t}};const Io={alg:"A128GCM",ext:!0,k:"scm9jmO_4BJAgdwWGVulLg",key_ops:["encrypt","decrypt"],kty:"oct"};async function Ro(e,t){const n=function(e){const t="AES-GCM";let n=16;const r="SHA-256",s=32767,i=_o.get();return n*=8,{encrypt:async function(e,o){const a=i.getRandomValues(new Uint8Array(16)),c=i.getRandomValues(new Uint8Array(12)),l={name:t,iv:c};let u;if("string"==typeof o&&(o=kt(o)),0===o.length){u=await i.subtle.importKey("jwk",Io,{name:"AES-GCM"},!0,["encrypt"]);try{const e={name:"PBKDF2",salt:a,iterations:s,hash:{name:r}},c=await i.subtle.importKey("raw",o,{name:"PBKDF2"},!1,["deriveKey"]);u=await i.subtle.deriveKey(e,c,{name:t,length:n},!0,["encrypt"])}catch{u=await i.subtle.importKey("jwk",Io,{name:"AES-GCM"},!0,["encrypt"])}}else{const e={name:"PBKDF2",salt:a,iterations:s,hash:{name:r}},c=await i.subtle.importKey("raw",o,{name:"PBKDF2"},!1,["deriveKey"]);u=await i.subtle.deriveKey(e,c,{name:t,length:n},!0,["encrypt"])}const h=await i.subtle.encrypt(l,u,e);return Rn([a,l.iv,new Uint8Array(h)])},decrypt:async function(e,o){const a=e.subarray(0,16),c=e.subarray(16,28),l=e.subarray(28),u={name:t,iv:c};let h;if("string"==typeof o&&(o=kt(o)),0===o.length)try{const e={name:"PBKDF2",salt:a,iterations:s,hash:{name:r}},c=await i.subtle.importKey("raw",o,{name:"PBKDF2"},!1,["deriveKey"]);h=await i.subtle.deriveKey(e,c,{name:t,length:n},!0,["decrypt"])}catch{h=await i.subtle.importKey("jwk",Io,{name:"AES-GCM"},!0,["decrypt"])}else{const e={name:"PBKDF2",salt:a,iterations:s,hash:{name:r}},c=await i.subtle.importKey("raw",o,{name:"PBKDF2"},!1,["deriveKey"]);h=await i.subtle.deriveKey(e,c,{name:t,length:n},!0,["decrypt"])}const d=await i.subtle.decrypt(u,h,l);return new Uint8Array(d)}}}(),r=await n.encrypt(e,t);return Me.encode(r)}var Ao,To,Do,ko;!function(e){e.RSA="RSA",e.Ed25519="Ed25519",e.Secp256k1="Secp256k1"}(Ao||(Ao={})),function(e){e[e.RSA=0]="RSA",e[e.Ed25519=1]="Ed25519",e[e.Secp256k1=2]="Secp256k1"}(To||(To={})),function(e){e.codec=()=>Wt(To)}(Ao||(Ao={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.Type&&(t.uint32(8),Ao.codec().encode(e.Type,t)),null!=e.Data&&(t.uint32(18),t.bytes(e.Data)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.Type=Ao.codec().decode(e);break;case 2:n.Data=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Do||(Do={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.Type&&(t.uint32(8),Ao.codec().encode(e.Type,t)),null!=e.Data&&(t.uint32(18),t.bytes(e.Data)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.Type=Ao.codec().decode(e);break;case 2:n.Data=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(ko||(ko={}));class Po{_key;constructor(e){this._key=xo(e,32)}verify(e,t){return function(e,t,n){return yo.verify(t,n instanceof Uint8Array?n:n.subarray(),e)}(this._key,t,e)}marshal(){return this._key}get bytes(){return Do.encode({Type:Ao.Ed25519,Data:this.marshal()}).subarray()}equals(e){return In(this.bytes,e.bytes)}hash(){const e=gt.digest(this.bytes);return Ts(e)?e.then((({bytes:e})=>e)):e.bytes}}class Co{_key;_publicKey;constructor(e,t){this._key=xo(e,vo),this._publicKey=xo(t,32)}sign(e){return function(e,t){const n=e.subarray(0,Eo);return yo.sign(t instanceof Uint8Array?t:t.subarray(),n)}(this._key,e)}get public(){return new Po(this._publicKey)}marshal(){return this._key}get bytes(){return ko.encode({Type:Ao.Ed25519,Data:this.marshal()}).subarray()}equals(e){return In(this.bytes,e.bytes)}async hash(){const e=gt.digest(this.bytes);let t;return Ts(e)?({bytes:t}=await e):t=e.bytes,t}async id(){const e=pt.digest(this.public.bytes);return Ce.encode(e.bytes).substring(1)}async export(e,t="libp2p-key"){if("libp2p-key"===t)return Ro(this.bytes,e);throw new fn(`export format '${t}' is not supported`,"ERR_INVALID_EXPORT_FORMAT")}}function xo(e,t){if((e=Uint8Array.from(e??[])).length!==t)throw new fn(`Key must be a Uint8Array of length ${t}, got ${e.length}`,"ERR_INVALID_KEY_TYPE");return e}var No=Object.freeze({__proto__:null,Ed25519PrivateKey:Co,Ed25519PublicKey:Po,generateKeyPair:async function(){const{privateKey:e,publicKey:t}=function(){const e=yo.utils.randomPrivateKey(),t=yo.getPublicKey(e);return{privateKey:So(e,t),publicKey:t}}();return new Co(e,t)},generateKeyPairFromSeed:async function(e){const{privateKey:t,publicKey:n}=function(e){if(e.length!==Eo)throw new TypeError('"seed" must be 32 bytes in length.');if(!(e instanceof Uint8Array))throw new TypeError('"seed" must be a node.js Buffer, or Uint8Array.');const t=e,n=yo.getPublicKey(t);return{privateKey:So(t,n),publicKey:n}}(e);return new Co(t,n)},unmarshalEd25519PrivateKey:function(e){if(e.length>vo){const t=(e=xo(e,vo+32)).subarray(0,vo),n=e.subarray(vo,e.length);return new Co(t,n)}const t=(e=xo(e,vo)).subarray(0,vo),n=e.subarray(32);return new Co(t,n)},unmarshalEd25519PublicKey:function(e){return e=xo(e,32),new Po(e)}});function Mo(e){if(isNaN(e)||e<=0)throw new fn("random bytes length must be a Number bigger than 0","ERR_INVALID_LENGTH");return qs(e)}class Oo extends Vs{constructor(e,t){super(),this.finished=!1,this.destroyed=!1,Ps(e);const n=Us(t);if(this.iHash=e.create(),"function"!=typeof this.iHash.update)throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const r=this.blockLen,s=new Uint8Array(r);s.set(n.length>r?e.create().update(n).digest():n);for(let e=0;e<s.length;e++)s[e]^=54;this.iHash.update(s),this.oHash=e.create();for(let e=0;e<s.length;e++)s[e]^=106;this.oHash.update(s),s.fill(0)}update(e){return Cs(this),this.iHash.update(e),this}digestInto(e){Cs(this),ks(e,this.outputLen),this.finished=!0,this.iHash.digestInto(e),this.oHash.update(e),this.oHash.digestInto(e),this.destroy()}digest(){const e=new Uint8Array(this.oHash.outputLen);return this.digestInto(e),e}_cloneInto(e){e||(e=Object.create(Object.getPrototypeOf(this),{}));const{oHash:t,iHash:n,finished:r,destroyed:s,blockLen:i,outputLen:o}=this;return e.finished=r,e.destroyed=s,e.blockLen=i,e.outputLen=o,e.oHash=t._cloneInto(e.oHash),e.iHash=n._cloneInto(e.iHash),e}destroy(){this.destroyed=!0,this.oHash.destroy(),this.iHash.destroy()}}const Lo=(e,t,n)=>new Oo(e,t).update(n).digest();function Bo(e,t,n,r){Ps(e);const s=function(e,t){if(void 0!==t&&"[object Object]"!==Ks.call(t))throw new Error("Options should be object or undefined");return Object.assign(e,t)}({dkLen:32,asyncTick:10},r),{c:i,dkLen:o,asyncTick:a}=s;if(Ds(i),Ds(o),Ds(a),i<1)throw new Error("PBKDF2: iterations (c) should be >= 1");const c=Us(t),l=Us(n),u=new Uint8Array(o),h=Lo.create(e,c),d=h._cloneInto().update(l);return{c:i,dkLen:o,asyncTick:a,DK:u,PRF:h,PRFSalt:d}}Lo.create=(e,t)=>new Oo(e,t);class Uo{static isArrayBuffer(e){return"[object ArrayBuffer]"===Object.prototype.toString.call(e)}static toArrayBuffer(e){return this.isArrayBuffer(e)?e:e.byteLength===e.buffer.byteLength||0===e.byteOffset&&e.byteLength===e.buffer.byteLength?e.buffer:this.toUint8Array(e.buffer).slice(e.byteOffset,e.byteOffset+e.byteLength).buffer}static toUint8Array(e){return this.toView(e,Uint8Array)}static toView(e,t){if(e.constructor===t)return e;if(this.isArrayBuffer(e))return new t(e);if(this.isArrayBufferView(e))return new t(e.buffer,e.byteOffset,e.byteLength);throw new TypeError("The provided value is not of type '(ArrayBuffer or ArrayBufferView)'")}static isBufferSource(e){return this.isArrayBufferView(e)||this.isArrayBuffer(e)}static isArrayBufferView(e){return ArrayBuffer.isView(e)||e&&this.isArrayBuffer(e.buffer)}static isEqual(e,t){const n=Uo.toUint8Array(e),r=Uo.toUint8Array(t);if(n.length!==r.byteLength)return!1;for(let e=0;e<n.length;e++)if(n[e]!==r[e])return!1;return!0}static concat(...e){let t;t=!Array.isArray(e[0])||e[1]instanceof Function?Array.isArray(e[0])&&e[1]instanceof Function?e[0]:e[e.length-1]instanceof Function?e.slice(0,e.length-1):e:e[0];let n=0;for(const e of t)n+=e.byteLength;const r=new Uint8Array(n);let s=0;for(const e of t){const t=this.toUint8Array(e);r.set(t,s),s+=t.length}return e[e.length-1]instanceof Function?this.toView(r,e[e.length-1]):r.buffer}}const Fo="string",Vo=/^[0-9a-f]+$/i,Ko=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,$o=/^[a-zA-Z0-9-_]+$/;class qo{static fromString(e){const t=unescape(encodeURIComponent(e)),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n.buffer}static toString(e){const t=Uo.toUint8Array(e);let n="";for(let e=0;e<t.length;e++)n+=String.fromCharCode(t[e]);return decodeURIComponent(escape(n))}}class Ho{static toString(e,t=!1){const n=Uo.toArrayBuffer(e),r=new DataView(n);let s="";for(let e=0;e<n.byteLength;e+=2){const n=r.getUint16(e,t);s+=String.fromCharCode(n)}return s}static fromString(e,t=!1){const n=new ArrayBuffer(2*e.length),r=new DataView(n);for(let n=0;n<e.length;n++)r.setUint16(2*n,e.charCodeAt(n),t);return n}}class zo{static isHex(e){return typeof e===Fo&&Vo.test(e)}static isBase64(e){return typeof e===Fo&&Ko.test(e)}static isBase64Url(e){return typeof e===Fo&&$o.test(e)}static ToString(e,t="utf8"){const n=Uo.toUint8Array(e);switch(t.toLowerCase()){case"utf8":return this.ToUtf8String(n);case"binary":return this.ToBinary(n);case"hex":return this.ToHex(n);case"base64":return this.ToBase64(n);case"base64url":return this.ToBase64Url(n);case"utf16le":return Ho.toString(n,!0);case"utf16":case"utf16be":return Ho.toString(n);default:throw new Error(`Unknown type of encoding '${t}'`)}}static FromString(e,t="utf8"){if(!e)return new ArrayBuffer(0);switch(t.toLowerCase()){case"utf8":return this.FromUtf8String(e);case"binary":return this.FromBinary(e);case"hex":return this.FromHex(e);case"base64":return this.FromBase64(e);case"base64url":return this.FromBase64Url(e);case"utf16le":return Ho.fromString(e,!0);case"utf16":case"utf16be":return Ho.fromString(e);default:throw new Error(`Unknown type of encoding '${t}'`)}}static ToBase64(e){const t=Uo.toUint8Array(e);if("undefined"!=typeof btoa){const e=this.ToString(t,"binary");return btoa(e)}return Buffer.from(t).toString("base64")}static FromBase64(e){const t=this.formatString(e);if(!t)return new ArrayBuffer(0);if(!zo.isBase64(t))throw new TypeError("Argument 'base64Text' is not Base64 encoded");return"undefined"!=typeof atob?this.FromBinary(atob(t)):new Uint8Array(Buffer.from(t,"base64")).buffer}static FromBase64Url(e){const t=this.formatString(e);if(!t)return new ArrayBuffer(0);if(!zo.isBase64Url(t))throw new TypeError("Argument 'base64url' is not Base64Url encoded");return this.FromBase64(this.Base64Padding(t.replace(/\-/g,"+").replace(/\_/g,"/")))}static ToBase64Url(e){return this.ToBase64(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=/g,"")}static FromUtf8String(e,t=zo.DEFAULT_UTF8_ENCODING){switch(t){case"ascii":return this.FromBinary(e);case"utf8":return qo.fromString(e);case"utf16":case"utf16be":return Ho.fromString(e);case"utf16le":case"usc2":return Ho.fromString(e,!0);default:throw new Error(`Unknown type of encoding '${t}'`)}}static ToUtf8String(e,t=zo.DEFAULT_UTF8_ENCODING){switch(t){case"ascii":return this.ToBinary(e);case"utf8":return qo.toString(e);case"utf16":case"utf16be":return Ho.toString(e);case"utf16le":case"usc2":return Ho.toString(e,!0);default:throw new Error(`Unknown type of encoding '${t}'`)}}static FromBinary(e){const t=e.length,n=new Uint8Array(t);for(let r=0;r<t;r++)n[r]=e.charCodeAt(r);return n.buffer}static ToBinary(e){const t=Uo.toUint8Array(e);let n="";for(let e=0;e<t.length;e++)n+=String.fromCharCode(t[e]);return n}static ToHex(e){const t=Uo.toUint8Array(e);let n="";const r=t.length;for(let e=0;e<r;e++){const r=t[e];r<16&&(n+="0"),n+=r.toString(16)}return n}static FromHex(e){let t=this.formatString(e);if(!t)return new ArrayBuffer(0);if(!zo.isHex(t))throw new TypeError("Argument 'hexString' is not HEX encoded");t.length%2&&(t=`0${t}`);const n=new Uint8Array(t.length/2);for(let e=0;e<t.length;e+=2){const r=t.slice(e,e+2);n[e/2]=parseInt(r,16)}return n.buffer}static ToUtf16String(e,t=!1){return Ho.toString(e,t)}static FromUtf16String(e,t=!1){return Ho.fromString(e,t)}static Base64Padding(e){const t=4-e.length%4;if(t<4)for(let n=0;n<t;n++)e+="=";return e}static formatString(e){return(null==e?void 0:e.replace(/[\n\r\t ]/g,""))||""}}zo.DEFAULT_UTF8_ENCODING="utf8";var Wo=Uo,jo=zo;
|
|
11
|
+
const Wi=BigInt(0),ji=BigInt(1);function Gi(e,t){const n=(e,t)=>{const n=t.negate();return e?n:t},r=e=>({windows:Math.ceil(t/e)+1,windowSize:2**(e-1)});return{constTimeNegate:n,unsafeLadder(t,n){let r=e.ZERO,s=t;for(;n>Wi;)n&ji&&(r=r.add(s)),s=s.double(),n>>=ji;return r},precomputeWindow(e,t){const{windows:n,windowSize:s}=r(t),i=[];let o=e,a=o;for(let e=0;e<n;e++){a=o,i.push(a);for(let e=1;e<s;e++)a=a.add(o),i.push(a);o=a.double()}return i},wNAF(t,s,i){const{windows:o,windowSize:a}=r(t);let c=e.ZERO,l=e.BASE;const u=BigInt(2**t-1),h=2**t,d=BigInt(t);for(let e=0;e<o;e++){const t=e*a;let r=Number(i&u);i>>=d,r>a&&(r-=h,i+=ji);const o=t,p=t+Math.abs(r)-1,f=e%2!=0,g=r<0;0===r?l=l.add(n(f,s[o])):c=c.add(n(g,s[p]))}return{p:c,f:l}},wNAFCached(e,t,n,r){const s=e._WINDOW_SIZE||1;let i=t.get(e);return i||(i=this.precomputeWindow(e,s),1!==s&&t.set(e,r(i))),this.wNAF(s,i,n)}}}function Yi(e){return function(e){const t=Ki.reduce(((e,t)=>(e[t]="function",e)),{ORDER:"bigint",MASK:"bigint",BYTES:"isSafeInteger",BITS:"isSafeInteger"});Ti(e,t)}(e.Fp),Ti(e,{n:"bigint",h:"bigint",Gx:"field",Gy:"field"},{nBitLength:"isSafeInteger",nByteLength:"isSafeInteger"}),Object.freeze({...$i(e.n,e.nBitLength),...e,p:e.Fp.ORDER})}
|
|
12
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const Qi=BigInt(0),Ji=BigInt(1),Zi=BigInt(2),Xi=BigInt(8),eo={zip215:!0};function to(e){const t=function(e){const t=Yi(e);return Ti(e,{hash:"function",a:"bigint",d:"bigint",randomBytes:"function"},{adjustScalarBytes:"function",domain:"function",uvRatio:"function",mapToCurve:"function"}),Object.freeze({...t})}(e),{Fp:n,n:r,prehash:s,hash:i,randomBytes:o,nByteLength:a,h:c}=t,l=Zi<<BigInt(8*a)-Ji,u=n.create,h=t.uvRatio||((e,t)=>{try{return{isValid:!0,value:n.sqrt(e*n.inv(t))}}catch(e){return{isValid:!1,value:Qi}}}),d=t.adjustScalarBytes||(e=>e),p=t.domain||((e,t,n)=>{if(t.length||n)throw new Error("Contexts/pre-hash are not supported");return e}),f=e=>"bigint"==typeof e&&Qi<e,g=(e,t)=>f(e)&&f(t)&&e<t,m=e=>e===Qi||g(e,l);function y(e,t){if(g(e,t))return e;throw new Error(`Expected valid scalar < ${t}, got ${typeof e} ${e}`)}function w(e){return e===Qi?e:y(e,r)}const b=new Map;function v(e){if(!(e instanceof E))throw new Error("ExtendedPoint expected")}class E{constructor(e,t,n,r){if(this.ex=e,this.ey=t,this.ez=n,this.et=r,!m(e))throw new Error("x required");if(!m(t))throw new Error("y required");if(!m(n))throw new Error("z required");if(!m(r))throw new Error("t required")}get x(){return this.toAffine().x}get y(){return this.toAffine().y}static fromAffine(e){if(e instanceof E)throw new Error("extended point not allowed");const{x:t,y:n}=e||{};if(!m(t)||!m(n))throw new Error("invalid affine point");return new E(t,n,Ji,u(t*n))}static normalizeZ(e){const t=n.invertBatch(e.map((e=>e.ez)));return e.map(((e,n)=>e.toAffine(t[n]))).map(E.fromAffine)}_setWindowSize(e){this._WINDOW_SIZE=e,b.delete(this)}assertValidity(){const{a:e,d:n}=t;if(this.is0())throw new Error("bad point: ZERO");const{ex:r,ey:s,ez:i,et:o}=this,a=u(r*r),c=u(s*s),l=u(i*i),h=u(l*l),d=u(a*e);if(u(l*u(d+c))!==u(h+u(n*u(a*c))))throw new Error("bad point: equation left != right (1)");if(u(r*s)!==u(i*o))throw new Error("bad point: equation left != right (2)")}equals(e){v(e);const{ex:t,ey:n,ez:r}=this,{ex:s,ey:i,ez:o}=e,a=u(t*o),c=u(s*r),l=u(n*o),h=u(i*r);return a===c&&l===h}is0(){return this.equals(E.ZERO)}negate(){return new E(u(-this.ex),this.ey,this.ez,u(-this.et))}double(){const{a:e}=t,{ex:n,ey:r,ez:s}=this,i=u(n*n),o=u(r*r),a=u(Zi*u(s*s)),c=u(e*i),l=n+r,h=u(u(l*l)-i-o),d=c+o,p=d-a,f=c-o,g=u(h*p),m=u(d*f),y=u(h*f),w=u(p*d);return new E(g,m,w,y)}add(e){v(e);const{a:n,d:r}=t,{ex:s,ey:i,ez:o,et:a}=this,{ex:c,ey:l,ez:h,et:d}=e;if(n===BigInt(-1)){const e=u((i-s)*(l+c)),t=u((i+s)*(l-c)),n=u(t-e);if(n===Qi)return this.double();const r=u(o*Zi*d),p=u(a*Zi*h),f=p+r,g=t+e,m=p-r,y=u(f*n),w=u(g*m),b=u(f*m),v=u(n*g);return new E(y,w,v,b)}const p=u(s*c),f=u(i*l),g=u(a*r*d),m=u(o*h),y=u((s+i)*(c+l)-p-f),w=m-g,b=m+g,S=u(f-n*p),_=u(y*w),I=u(b*S),R=u(y*S),A=u(w*b);return new E(_,I,A,R)}subtract(e){return this.add(e.negate())}wNAF(e){return I.wNAFCached(this,b,e,E.normalizeZ)}multiply(e){const{p:t,f:n}=this.wNAF(y(e,r));return E.normalizeZ([t,n])[0]}multiplyUnsafe(e){let t=w(e);return t===Qi?_:this.equals(_)||t===Ji?this:this.equals(S)?this.wNAF(t).p:I.unsafeLadder(this,t)}isSmallOrder(){return this.multiplyUnsafe(c).is0()}isTorsionFree(){return I.unsafeLadder(this,r).is0()}toAffine(e){const{ex:t,ey:r,ez:s}=this,i=this.is0();null==e&&(e=i?Xi:n.inv(s));const o=u(t*e),a=u(r*e),c=u(s*e);if(i)return{x:Qi,y:Ji};if(c!==Ji)throw new Error("invZ was invalid");return{x:o,y:a}}clearCofactor(){const{h:e}=t;return e===Ji?this:this.multiplyUnsafe(e)}static fromHex(e,r=!1){const{d:s,a:i}=t,o=n.BYTES,a=(e=vi("pointHex",e,o)).slice(),c=e[o-1];a[o-1]=-129&c;const d=yi(a);d===Qi||y(d,r?l:n.ORDER);const p=u(d*d),f=u(p-Ji),g=u(s*p-i);let{isValid:m,value:w}=h(f,g);if(!m)throw new Error("Point.fromHex: invalid y coordinate");const b=(w&Ji)===Ji,v=!!(128&c);if(!r&&w===Qi&&v)throw new Error("Point.fromHex: x=0 and x_0=1");return v!==b&&(w=u(-w)),E.fromAffine({x:w,y:d})}static fromPrivateKey(e){return T(e).point}toRawBytes(){const{x:e,y:t}=this.toAffine(),r=bi(t,n.BYTES);return r[r.length-1]|=e&Ji?128:0,r}toHex(){return ui(this.toRawBytes())}}E.BASE=new E(t.Gx,t.Gy,Ji,u(t.Gx*t.Gy)),E.ZERO=new E(Qi,Ji,Ji,Qi);const{BASE:S,ZERO:_}=E,I=Gi(E,8*a);function R(e){return Li(e,r)}function A(e){return R(yi(e))}function T(e){const t=a;e=vi("private key",e,t);const n=vi("hashed private key",i(e),2*t),r=d(n.slice(0,t)),s=n.slice(t,2*t),o=A(r),c=S.multiply(o),l=c.toRawBytes();return{head:r,prefix:s,scalar:o,point:c,pointBytes:l}}function D(e=new Uint8Array,...t){const n=Ei(...t);return A(i(p(n,vi("context",e),!!s)))}const k=eo;S._setWindowSize(8);return{CURVE:t,getPublicKey:function(e){return T(e).pointBytes},sign:function(e,t,r={}){e=vi("message",e),s&&(e=s(e));const{prefix:i,scalar:o,pointBytes:c}=T(t),l=D(r.context,i,e),u=S.multiply(l).toRawBytes(),h=R(l+D(r.context,u,c,e)*o);return w(h),vi("result",Ei(u,bi(h,n.BYTES)),2*a)},verify:function(e,t,r,i=k){const{context:o,zip215:a}=i,c=n.BYTES;e=vi("signature",e,2*c),t=vi("message",t),s&&(t=s(t));const l=yi(e.slice(c,2*c));let u,h,d;try{u=E.fromHex(r,a),h=E.fromHex(e.slice(0,c),a),d=S.multiplyUnsafe(l)}catch(e){return!1}if(!a&&u.isSmallOrder())return!1;const p=D(o,h.toRawBytes(),u.toRawBytes(),t);return h.add(u.multiplyUnsafe(p)).subtract(d).clearCofactor().equals(E.ZERO)},ExtendedPoint:E,utils:{getExtendedPublicKey:T,randomPrivateKey:()=>o(n.BYTES),precompute:(e=8,t=E.BASE)=>(t._setWindowSize(e),t.multiply(BigInt(3)),t)}}}
|
|
13
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const no=BigInt(0),ro=BigInt(1);function so(e){const t=(Ti(n=e,{a:"bigint"},{montgomeryBits:"isSafeInteger",nByteLength:"isSafeInteger",adjustScalarBytes:"function",domain:"function",powPminus2:"function",Gu:"bigint"}),Object.freeze({...n}));var n;const{P:r}=t,s=e=>Li(e,r),i=t.montgomeryBits,o=Math.ceil(i/8),a=t.nByteLength,c=t.adjustScalarBytes||(e=>e),l=t.powPminus2||(e=>Bi(e,r-BigInt(2),r));function u(e,t,n){const r=s(e*(t-n));return[t=s(t-r),n=s(n+r)]}function h(e){if("bigint"==typeof e&&no<=e&&e<r)return e;throw new Error("Expected valid scalar 0 < scalar < CURVE.P")}const d=(t.a-BigInt(2))/BigInt(4);function p(e){return bi(s(e),o)}function f(e,t){const n=function(e){const t=vi("u coordinate",e,o);return 32===a&&(t[31]&=127),yi(t)}(t),r=function(e){const t=vi("scalar",e),n=t.length;if(n!==o&&n!==a)throw new Error(`Expected ${o} or ${a} bytes, got ${n}`);return yi(c(t))}(e),f=function(e,t){const n=h(e),r=h(t),o=n;let a,c=ro,p=no,f=n,g=ro,m=no;for(let e=BigInt(i-1);e>=no;e--){const t=r>>e&ro;m^=t,a=u(m,c,f),c=a[0],f=a[1],a=u(m,p,g),p=a[0],g=a[1],m=t;const n=c+p,i=s(n*n),l=c-p,h=s(l*l),y=i-h,w=f+g,b=s((f-g)*n),v=s(w*l),E=b+v,S=b-v;f=s(E*E),g=s(o*s(S*S)),c=s(i*h),p=s(y*(i+s(d*y)))}a=u(m,c,f),c=a[0],f=a[1],a=u(m,p,g),p=a[0],g=a[1];const y=l(p);return s(c*y)}(n,r);if(f===no)throw new Error("Invalid private or public key received");return p(f)}const g=p(t.Gu);function m(e){return f(e,g)}return{scalarMult:f,scalarMultBase:m,getSharedSecret:(e,t)=>f(e,t),getPublicKey:e=>m(e),utils:{randomPrivateKey:()=>t.randomBytes(t.nByteLength)},GuBytes:g}}
|
|
14
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const io=BigInt("57896044618658097711785492504343953926634992332820282019728792003956564819949"),oo=BigInt("19681161376707505956807079304988542015446066515923890162744021073123829784752");BigInt(0);const ao=BigInt(1),co=BigInt(2),lo=BigInt(5),uo=BigInt(10),ho=BigInt(20),po=BigInt(40),fo=BigInt(80);function go(e){const t=io,n=e*e%t*e%t,r=Ui(n,co,t)*n%t,s=Ui(r,ao,t)*e%t,i=Ui(s,lo,t)*s%t,o=Ui(i,uo,t)*i%t,a=Ui(o,ho,t)*o%t,c=Ui(a,po,t)*a%t,l=Ui(c,fo,t)*c%t,u=Ui(l,fo,t)*c%t,h=Ui(u,uo,t)*i%t;return{pow_p_5_8:Ui(h,co,t)*e%t,b2:n}}function mo(e){return e[0]&=248,e[31]&=127,e[31]|=64,e}const yo=qi(io,void 0,!0),wo={a:BigInt(-1),d:BigInt("37095705934669439343138083508754565189542113879843219016388785533085940283555"),Fp:yo,n:BigInt("7237005577332262213973186563042994240857116359379907606001950938285454250989"),h:BigInt(8),Gx:BigInt("15112221349535400772501151409588531511454012693041857206046113283949847762202"),Gy:BigInt("46316835694926478169428394003475163141307993866256225615783033603165251855960"),hash:ri,randomBytes:zs,adjustScalarBytes:mo,uvRatio:function(e,t){const n=io,r=Li(t*t*t,n),s=Li(r*r*t,n);let i=Li(e*r*go(e*s).pow_p_5_8,n);const o=Li(t*i*i,n),a=i,c=Li(i*oo,n),l=o===e,u=o===Li(-e,n),h=o===Li(-e*oo,n);return l&&(i=a),(u||h)&&(i=c),(Li(i,n)&Pi)===Pi&&(i=Li(-i,n)),{isValid:l||u,value:i}}},bo=to(wo);const vo=(()=>so({P:io,a:BigInt(486662),montgomeryBits:255,nByteLength:32,Gu:BigInt(9),powPminus2:e=>{const t=io,{pow_p_5_8:n,b2:r}=go(e);return Li(Ui(n,BigInt(3),t)*r,t)},adjustScalarBytes:mo,randomBytes:zs}))(),Eo=(yo.ORDER+BigInt(3))/BigInt(8);yo.pow(co,Eo),yo.sqrt(yo.neg(yo.ONE)),yo.ORDER,BigInt(5),BigInt(8),BigInt(486662),function(e,t){if(!e.isOdd)throw new Error("Field doesn't have isOdd");const n=e.sqrt(t);e.isOdd(n)&&e.neg(n)}(yo,yo.neg(BigInt(486664))),BigInt("25063068953384623474111414158702152701244531502492656460079210482610430750235"),BigInt("54469307008909316920995813868745141605393597292927456921205312896311721017578"),BigInt("1159843021668779879193775521855586647937357759715417654439879720876111806838"),BigInt("40440834346308536858101042469323190826248399146238708352240133220865137265952"),BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");const So=64,_o=32;function Io(e,t){const n=new Uint8Array(So);for(let r=0;r<_o;r++)n[r]=e[r],n[_o+r]=t[r];return n}var Ro={get(e=globalThis){const t=e.crypto;if(null==t||null==t.subtle)throw Object.assign(new Error("Missing Web Crypto API. The most likely cause of this error is that this page is being accessed from an insecure context (i.e. not HTTPS). For more information and possible resolutions see https://github.com/libp2p/js-libp2p/blob/main/packages/crypto/README.md#web-crypto-api"),{code:"ERR_MISSING_WEB_CRYPTO"});return t}};const Ao={alg:"A128GCM",ext:!0,k:"scm9jmO_4BJAgdwWGVulLg",key_ops:["encrypt","decrypt"],kty:"oct"};async function To(e,t){const n=function(e){const t="AES-GCM";let n=16;const r="SHA-256",s=32767,i=Ro.get();return n*=8,{encrypt:async function(e,o){const a=i.getRandomValues(new Uint8Array(16)),c=i.getRandomValues(new Uint8Array(12)),l={name:t,iv:c};let u;if("string"==typeof o&&(o=kt(o)),0===o.length){u=await i.subtle.importKey("jwk",Ao,{name:"AES-GCM"},!0,["encrypt"]);try{const e={name:"PBKDF2",salt:a,iterations:s,hash:{name:r}},c=await i.subtle.importKey("raw",o,{name:"PBKDF2"},!1,["deriveKey"]);u=await i.subtle.deriveKey(e,c,{name:t,length:n},!0,["encrypt"])}catch{u=await i.subtle.importKey("jwk",Ao,{name:"AES-GCM"},!0,["encrypt"])}}else{const e={name:"PBKDF2",salt:a,iterations:s,hash:{name:r}},c=await i.subtle.importKey("raw",o,{name:"PBKDF2"},!1,["deriveKey"]);u=await i.subtle.deriveKey(e,c,{name:t,length:n},!0,["encrypt"])}const h=await i.subtle.encrypt(l,u,e);return Rn([a,l.iv,new Uint8Array(h)])},decrypt:async function(e,o){const a=e.subarray(0,16),c=e.subarray(16,28),l=e.subarray(28),u={name:t,iv:c};let h;if("string"==typeof o&&(o=kt(o)),0===o.length)try{const e={name:"PBKDF2",salt:a,iterations:s,hash:{name:r}},c=await i.subtle.importKey("raw",o,{name:"PBKDF2"},!1,["deriveKey"]);h=await i.subtle.deriveKey(e,c,{name:t,length:n},!0,["decrypt"])}catch{h=await i.subtle.importKey("jwk",Ao,{name:"AES-GCM"},!0,["decrypt"])}else{const e={name:"PBKDF2",salt:a,iterations:s,hash:{name:r}},c=await i.subtle.importKey("raw",o,{name:"PBKDF2"},!1,["deriveKey"]);h=await i.subtle.deriveKey(e,c,{name:t,length:n},!0,["decrypt"])}const d=await i.subtle.decrypt(u,h,l);return new Uint8Array(d)}}}(),r=await n.encrypt(e,t);return Me.encode(r)}var Do,ko,Po,Co;!function(e){e.RSA="RSA",e.Ed25519="Ed25519",e.Secp256k1="Secp256k1"}(Do||(Do={})),function(e){e[e.RSA=0]="RSA",e[e.Ed25519=1]="Ed25519",e[e.Secp256k1=2]="Secp256k1"}(ko||(ko={})),function(e){e.codec=()=>Wt(ko)}(Do||(Do={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.Type&&(t.uint32(8),Do.codec().encode(e.Type,t)),null!=e.Data&&(t.uint32(18),t.bytes(e.Data)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.Type=Do.codec().decode(e);break;case 2:n.Data=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Po||(Po={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.Type&&(t.uint32(8),Do.codec().encode(e.Type,t)),null!=e.Data&&(t.uint32(18),t.bytes(e.Data)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.Type=Do.codec().decode(e);break;case 2:n.Data=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Co||(Co={}));class xo{_key;constructor(e){this._key=Mo(e,32)}verify(e,t){return function(e,t,n){return bo.verify(t,n instanceof Uint8Array?n:n.subarray(),e)}(this._key,t,e)}marshal(){return this._key}get bytes(){return Po.encode({Type:Do.Ed25519,Data:this.marshal()}).subarray()}equals(e){return In(this.bytes,e.bytes)}hash(){const e=gt.digest(this.bytes);return ks(e)?e.then((({bytes:e})=>e)):e.bytes}}class No{_key;_publicKey;constructor(e,t){this._key=Mo(e,So),this._publicKey=Mo(t,32)}sign(e){return function(e,t){const n=e.subarray(0,_o);return bo.sign(t instanceof Uint8Array?t:t.subarray(),n)}(this._key,e)}get public(){return new xo(this._publicKey)}marshal(){return this._key}get bytes(){return Co.encode({Type:Do.Ed25519,Data:this.marshal()}).subarray()}equals(e){return In(this.bytes,e.bytes)}async hash(){const e=gt.digest(this.bytes);let t;return ks(e)?({bytes:t}=await e):t=e.bytes,t}async id(){const e=pt.digest(this.public.bytes);return Ce.encode(e.bytes).substring(1)}async export(e,t="libp2p-key"){if("libp2p-key"===t)return To(this.bytes,e);throw new fn(`export format '${t}' is not supported`,"ERR_INVALID_EXPORT_FORMAT")}}function Mo(e,t){if((e=Uint8Array.from(e??[])).length!==t)throw new fn(`Key must be a Uint8Array of length ${t}, got ${e.length}`,"ERR_INVALID_KEY_TYPE");return e}var Oo=Object.freeze({__proto__:null,Ed25519PrivateKey:No,Ed25519PublicKey:xo,generateKeyPair:async function(){const{privateKey:e,publicKey:t}=function(){const e=bo.utils.randomPrivateKey(),t=bo.getPublicKey(e);return{privateKey:Io(e,t),publicKey:t}}();return new No(e,t)},generateKeyPairFromSeed:async function(e){const{privateKey:t,publicKey:n}=function(e){if(e.length!==_o)throw new TypeError('"seed" must be 32 bytes in length.');if(!(e instanceof Uint8Array))throw new TypeError('"seed" must be a node.js Buffer, or Uint8Array.');const t=e,n=bo.getPublicKey(t);return{privateKey:Io(t,n),publicKey:n}}(e);return new No(t,n)},unmarshalEd25519PrivateKey:function(e){if(e.length>So){const t=(e=Mo(e,So+32)).subarray(0,So),n=e.subarray(So,e.length);return new No(t,n)}const t=(e=Mo(e,So)).subarray(0,So),n=e.subarray(32);return new No(t,n)},unmarshalEd25519PublicKey:function(e){return e=Mo(e,32),new xo(e)}});function Lo(e){if(isNaN(e)||e<=0)throw new fn("random bytes length must be a Number bigger than 0","ERR_INVALID_LENGTH");return zs(e)}class Bo extends $s{constructor(e,t){super(),this.finished=!1,this.destroyed=!1,xs(e);const n=Vs(t);if(this.iHash=e.create(),"function"!=typeof this.iHash.update)throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const r=this.blockLen,s=new Uint8Array(r);s.set(n.length>r?e.create().update(n).digest():n);for(let e=0;e<s.length;e++)s[e]^=54;this.iHash.update(s),this.oHash=e.create();for(let e=0;e<s.length;e++)s[e]^=106;this.oHash.update(s),s.fill(0)}update(e){return Ns(this),this.iHash.update(e),this}digestInto(e){Ns(this),Cs(e,this.outputLen),this.finished=!0,this.iHash.digestInto(e),this.oHash.update(e),this.oHash.digestInto(e),this.destroy()}digest(){const e=new Uint8Array(this.oHash.outputLen);return this.digestInto(e),e}_cloneInto(e){e||(e=Object.create(Object.getPrototypeOf(this),{}));const{oHash:t,iHash:n,finished:r,destroyed:s,blockLen:i,outputLen:o}=this;return e.finished=r,e.destroyed=s,e.blockLen=i,e.outputLen=o,e.oHash=t._cloneInto(e.oHash),e.iHash=n._cloneInto(e.iHash),e}destroy(){this.destroyed=!0,this.oHash.destroy(),this.iHash.destroy()}}const Uo=(e,t,n)=>new Bo(e,t).update(n).digest();function Fo(e,t,n,r){xs(e);const s=function(e,t){if(void 0!==t&&"[object Object]"!==qs.call(t))throw new Error("Options should be object or undefined");return Object.assign(e,t)}({dkLen:32,asyncTick:10},r),{c:i,dkLen:o,asyncTick:a}=s;if(Ps(i),Ps(o),Ps(a),i<1)throw new Error("PBKDF2: iterations (c) should be >= 1");const c=Vs(t),l=Vs(n),u=new Uint8Array(o),h=Uo.create(e,c),d=h._cloneInto().update(l);return{c:i,dkLen:o,asyncTick:a,DK:u,PRF:h,PRFSalt:d}}Uo.create=(e,t)=>new Bo(e,t);class Vo{static isArrayBuffer(e){return"[object ArrayBuffer]"===Object.prototype.toString.call(e)}static toArrayBuffer(e){return this.isArrayBuffer(e)?e:e.byteLength===e.buffer.byteLength||0===e.byteOffset&&e.byteLength===e.buffer.byteLength?e.buffer:this.toUint8Array(e.buffer).slice(e.byteOffset,e.byteOffset+e.byteLength).buffer}static toUint8Array(e){return this.toView(e,Uint8Array)}static toView(e,t){if(e.constructor===t)return e;if(this.isArrayBuffer(e))return new t(e);if(this.isArrayBufferView(e))return new t(e.buffer,e.byteOffset,e.byteLength);throw new TypeError("The provided value is not of type '(ArrayBuffer or ArrayBufferView)'")}static isBufferSource(e){return this.isArrayBufferView(e)||this.isArrayBuffer(e)}static isArrayBufferView(e){return ArrayBuffer.isView(e)||e&&this.isArrayBuffer(e.buffer)}static isEqual(e,t){const n=Vo.toUint8Array(e),r=Vo.toUint8Array(t);if(n.length!==r.byteLength)return!1;for(let e=0;e<n.length;e++)if(n[e]!==r[e])return!1;return!0}static concat(...e){let t;t=!Array.isArray(e[0])||e[1]instanceof Function?Array.isArray(e[0])&&e[1]instanceof Function?e[0]:e[e.length-1]instanceof Function?e.slice(0,e.length-1):e:e[0];let n=0;for(const e of t)n+=e.byteLength;const r=new Uint8Array(n);let s=0;for(const e of t){const t=this.toUint8Array(e);r.set(t,s),s+=t.length}return e[e.length-1]instanceof Function?this.toView(r,e[e.length-1]):r.buffer}}const Ko="string",$o=/^[0-9a-f]+$/i,qo=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Ho=/^[a-zA-Z0-9-_]+$/;class zo{static fromString(e){const t=unescape(encodeURIComponent(e)),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n.buffer}static toString(e){const t=Vo.toUint8Array(e);let n="";for(let e=0;e<t.length;e++)n+=String.fromCharCode(t[e]);return decodeURIComponent(escape(n))}}class Wo{static toString(e,t=!1){const n=Vo.toArrayBuffer(e),r=new DataView(n);let s="";for(let e=0;e<n.byteLength;e+=2){const n=r.getUint16(e,t);s+=String.fromCharCode(n)}return s}static fromString(e,t=!1){const n=new ArrayBuffer(2*e.length),r=new DataView(n);for(let n=0;n<e.length;n++)r.setUint16(2*n,e.charCodeAt(n),t);return n}}class jo{static isHex(e){return typeof e===Ko&&$o.test(e)}static isBase64(e){return typeof e===Ko&&qo.test(e)}static isBase64Url(e){return typeof e===Ko&&Ho.test(e)}static ToString(e,t="utf8"){const n=Vo.toUint8Array(e);switch(t.toLowerCase()){case"utf8":return this.ToUtf8String(n);case"binary":return this.ToBinary(n);case"hex":return this.ToHex(n);case"base64":return this.ToBase64(n);case"base64url":return this.ToBase64Url(n);case"utf16le":return Wo.toString(n,!0);case"utf16":case"utf16be":return Wo.toString(n);default:throw new Error(`Unknown type of encoding '${t}'`)}}static FromString(e,t="utf8"){if(!e)return new ArrayBuffer(0);switch(t.toLowerCase()){case"utf8":return this.FromUtf8String(e);case"binary":return this.FromBinary(e);case"hex":return this.FromHex(e);case"base64":return this.FromBase64(e);case"base64url":return this.FromBase64Url(e);case"utf16le":return Wo.fromString(e,!0);case"utf16":case"utf16be":return Wo.fromString(e);default:throw new Error(`Unknown type of encoding '${t}'`)}}static ToBase64(e){const t=Vo.toUint8Array(e);if("undefined"!=typeof btoa){const e=this.ToString(t,"binary");return btoa(e)}return Buffer.from(t).toString("base64")}static FromBase64(e){const t=this.formatString(e);if(!t)return new ArrayBuffer(0);if(!jo.isBase64(t))throw new TypeError("Argument 'base64Text' is not Base64 encoded");return"undefined"!=typeof atob?this.FromBinary(atob(t)):new Uint8Array(Buffer.from(t,"base64")).buffer}static FromBase64Url(e){const t=this.formatString(e);if(!t)return new ArrayBuffer(0);if(!jo.isBase64Url(t))throw new TypeError("Argument 'base64url' is not Base64Url encoded");return this.FromBase64(this.Base64Padding(t.replace(/\-/g,"+").replace(/\_/g,"/")))}static ToBase64Url(e){return this.ToBase64(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=/g,"")}static FromUtf8String(e,t=jo.DEFAULT_UTF8_ENCODING){switch(t){case"ascii":return this.FromBinary(e);case"utf8":return zo.fromString(e);case"utf16":case"utf16be":return Wo.fromString(e);case"utf16le":case"usc2":return Wo.fromString(e,!0);default:throw new Error(`Unknown type of encoding '${t}'`)}}static ToUtf8String(e,t=jo.DEFAULT_UTF8_ENCODING){switch(t){case"ascii":return this.ToBinary(e);case"utf8":return zo.toString(e);case"utf16":case"utf16be":return Wo.toString(e);case"utf16le":case"usc2":return Wo.toString(e,!0);default:throw new Error(`Unknown type of encoding '${t}'`)}}static FromBinary(e){const t=e.length,n=new Uint8Array(t);for(let r=0;r<t;r++)n[r]=e.charCodeAt(r);return n.buffer}static ToBinary(e){const t=Vo.toUint8Array(e);let n="";for(let e=0;e<t.length;e++)n+=String.fromCharCode(t[e]);return n}static ToHex(e){const t=Vo.toUint8Array(e);let n="";const r=t.length;for(let e=0;e<r;e++){const r=t[e];r<16&&(n+="0"),n+=r.toString(16)}return n}static FromHex(e){let t=this.formatString(e);if(!t)return new ArrayBuffer(0);if(!jo.isHex(t))throw new TypeError("Argument 'hexString' is not HEX encoded");t.length%2&&(t=`0${t}`);const n=new Uint8Array(t.length/2);for(let e=0;e<t.length;e+=2){const r=t.slice(e,e+2);n[e/2]=parseInt(r,16)}return n.buffer}static ToUtf16String(e,t=!1){return Wo.toString(e,t)}static FromUtf16String(e,t=!1){return Wo.fromString(e,t)}static Base64Padding(e){const t=4-e.length%4;if(t<4)for(let n=0;n<t;n++)e+="=";return e}static formatString(e){return(null==e?void 0:e.replace(/[\n\r\t ]/g,""))||""}}jo.DEFAULT_UTF8_ENCODING="utf8";var Go=Vo,Yo=jo;
|
|
15
15
|
/*!
|
|
16
16
|
Copyright (c) Peculiar Ventures, LLC
|
|
17
17
|
*/
|
|
18
|
-
function
|
|
18
|
+
function Qo(e,t){let n=0;if(1===e.length)return e[0];for(let r=e.length-1;r>=0;r--)n+=e[e.length-1-r]*Math.pow(2,t*r);return n}function Jo(e,t,n=-1){const r=n;let s=e,i=0,o=Math.pow(2,t);for(let n=1;n<8;n++){if(e<o){let e;if(r<0)e=new ArrayBuffer(n),i=n;else{if(r<n)return new ArrayBuffer(0);e=new ArrayBuffer(r),i=r}const o=new Uint8Array(e);for(let e=n-1;e>=0;e--){const n=Math.pow(2,e*t);o[i-e-1]=Math.floor(s/n),s-=o[i-e-1]*n}return e}o*=Math.pow(2,t)}return new ArrayBuffer(0)}function Zo(...e){let t=0,n=0;for(const n of e)t+=n.length;const r=new ArrayBuffer(t),s=new Uint8Array(r);for(const t of e)s.set(t,n),n+=t.length;return s}function Xo(){const e=new Uint8Array(this.valueHex);if(this.valueHex.byteLength>=2){const t=255===e[0]&&128&e[1],n=0===e[0]&&!(128&e[1]);(t||n)&&this.warnings.push("Needlessly long format")}const t=new ArrayBuffer(this.valueHex.byteLength),n=new Uint8Array(t);for(let e=0;e<this.valueHex.byteLength;e++)n[e]=0;n[0]=128&e[0];const r=Qo(n,8),s=new ArrayBuffer(this.valueHex.byteLength),i=new Uint8Array(s);for(let t=0;t<this.valueHex.byteLength;t++)i[t]=e[t];i[0]&=127;return Qo(i,8)-r}function ea(e,t){const n=e.toString(10);if(t<n.length)return"";const r=t-n.length,s=new Array(r);for(let e=0;e<r;e++)s[e]="0";return s.join("").concat(n)}
|
|
19
19
|
/*!
|
|
20
20
|
* Copyright (c) 2014, GMO GlobalSign
|
|
21
21
|
* Copyright (c) 2015-2022, Peculiar Ventures
|
|
@@ -48,7 +48,7 @@ function Go(e,t){let n=0;if(1===e.length)return e[0];for(let r=e.length-1;r>=0;r
|
|
|
48
48
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
49
49
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
50
50
|
*
|
|
51
|
-
*/function Xo(){if("undefined"==typeof BigInt)throw new Error("BigInt is not defined. Your environment doesn't implement BigInt.")}function ea(e){let t=0,n=0;for(let n=0;n<e.length;n++){t+=e[n].byteLength}const r=new Uint8Array(t);for(let t=0;t<e.length;t++){const s=e[t];r.set(new Uint8Array(s),n),n+=s.byteLength}return r.buffer}function ta(e,t,n,r){return t instanceof Uint8Array?t.byteLength?n<0?(e.error="Wrong parameter: inputOffset less than zero",!1):r<0?(e.error="Wrong parameter: inputLength less than zero",!1):!(t.byteLength-n-r<0)||(e.error="End of input reached before message was fully decoded (inconsistent offset and length values)",!1):(e.error="Wrong parameter: inputBuffer has zero length",!1):(e.error="Wrong parameter: inputBuffer must be 'Uint8Array'",!1)}class na{constructor(){this.items=[]}write(e){this.items.push(e)}final(){return ea(this.items)}}const ra=[new Uint8Array([1])],sa="0123456789",ia="",oa=new ArrayBuffer(0),aa=new Uint8Array(0),ca="EndOfContent",la="OCTET STRING",ua="BIT STRING";function ha(e){var t;return(t=class extends e{constructor(...e){var t;super(...e);const n=e[0]||{};this.isHexOnly=null!==(t=n.isHexOnly)&&void 0!==t&&t,this.valueHexView=n.valueHex?Wo.toUint8Array(n.valueHex):aa}get valueHex(){return this.valueHexView.slice().buffer}set valueHex(e){this.valueHexView=new Uint8Array(e)}fromBER(e,t,n){const r=e instanceof ArrayBuffer?new Uint8Array(e):e;if(!ta(this,r,t,n))return-1;const s=t+n;return this.valueHexView=r.subarray(t,s),this.valueHexView.length?(this.blockLength=n,s):(this.warnings.push("Zero buffer length"),t)}toBER(e=!1){return this.isHexOnly?e?new ArrayBuffer(this.valueHexView.byteLength):this.valueHexView.byteLength===this.valueHexView.buffer.byteLength?this.valueHexView.buffer:this.valueHexView.slice().buffer:(this.error="Flag 'isHexOnly' is not set, abort",oa)}toJSON(){return{...super.toJSON(),isHexOnly:this.isHexOnly,valueHex:jo.ToHex(this.valueHexView)}}}).NAME="hexBlock",t}class da{constructor({blockLength:e=0,error:t="",warnings:n=[],valueBeforeDecode:r=aa}={}){this.blockLength=e,this.error=t,this.warnings=n,this.valueBeforeDecodeView=Wo.toUint8Array(r)}static blockName(){return this.NAME}get valueBeforeDecode(){return this.valueBeforeDecodeView.slice().buffer}set valueBeforeDecode(e){this.valueBeforeDecodeView=new Uint8Array(e)}toJSON(){return{blockName:this.constructor.NAME,blockLength:this.blockLength,error:this.error,warnings:this.warnings,valueBeforeDecode:jo.ToHex(this.valueBeforeDecodeView)}}}da.NAME="baseBlock";class pa extends da{fromBER(e,t,n){throw TypeError("User need to make a specific function in a class which extends 'ValueBlock'")}toBER(e,t){throw TypeError("User need to make a specific function in a class which extends 'ValueBlock'")}}pa.NAME="valueBlock";class fa extends(ha(da)){constructor({idBlock:e={}}={}){var t,n,r,s;super(),e?(this.isHexOnly=null!==(t=e.isHexOnly)&&void 0!==t&&t,this.valueHexView=e.valueHex?Wo.toUint8Array(e.valueHex):aa,this.tagClass=null!==(n=e.tagClass)&&void 0!==n?n:-1,this.tagNumber=null!==(r=e.tagNumber)&&void 0!==r?r:-1,this.isConstructed=null!==(s=e.isConstructed)&&void 0!==s&&s):(this.tagClass=-1,this.tagNumber=-1,this.isConstructed=!1)}toBER(e=!1){let t=0;switch(this.tagClass){case 1:t|=0;break;case 2:t|=64;break;case 3:t|=128;break;case 4:t|=192;break;default:return this.error="Unknown tag class",oa}if(this.isConstructed&&(t|=32),this.tagNumber<31&&!this.isHexOnly){const n=new Uint8Array(1);if(!e){let e=this.tagNumber;e&=31,t|=e,n[0]=t}return n.buffer}if(!this.isHexOnly){const n=Yo(this.tagNumber,7),r=new Uint8Array(n),s=n.byteLength,i=new Uint8Array(s+1);if(i[0]=31|t,!e){for(let e=0;e<s-1;e++)i[e+1]=128|r[e];i[s]=r[s-1]}return i.buffer}const n=new Uint8Array(this.valueHexView.byteLength+1);if(n[0]=31|t,!e){const e=this.valueHexView;for(let t=0;t<e.length-1;t++)n[t+1]=128|e[t];n[this.valueHexView.byteLength]=e[e.length-1]}return n.buffer}fromBER(e,t,n){const r=Wo.toUint8Array(e);if(!ta(this,r,t,n))return-1;const s=r.subarray(t,t+n);if(0===s.length)return this.error="Zero buffer length",-1;switch(192&s[0]){case 0:this.tagClass=1;break;case 64:this.tagClass=2;break;case 128:this.tagClass=3;break;case 192:this.tagClass=4;break;default:return this.error="Unknown tag class",-1}this.isConstructed=!(32&~s[0]),this.isHexOnly=!1;const i=31&s[0];if(31!==i)this.tagNumber=i,this.blockLength=1;else{let e=1,t=this.valueHexView=new Uint8Array(255),n=255;for(;128&s[e];){if(t[e-1]=127&s[e],e++,e>=s.length)return this.error="End of input reached before message was fully decoded",-1;if(e===n){n+=255;const e=new Uint8Array(n);for(let n=0;n<t.length;n++)e[n]=t[n];t=this.valueHexView=new Uint8Array(n)}}this.blockLength=e+1,t[e-1]=127&s[e];const r=new Uint8Array(e);for(let n=0;n<e;n++)r[n]=t[n];t=this.valueHexView=new Uint8Array(e),t.set(r),this.blockLength<=9?this.tagNumber=Go(t,7):(this.isHexOnly=!0,this.warnings.push("Tag too long, represented as hex-coded"))}if(1===this.tagClass&&this.isConstructed)switch(this.tagNumber){case 1:case 2:case 5:case 6:case 9:case 13:case 14:case 23:case 24:case 31:case 32:case 33:case 34:return this.error="Constructed encoding used for primitive type",-1}return t+this.blockLength}toJSON(){return{...super.toJSON(),tagClass:this.tagClass,tagNumber:this.tagNumber,isConstructed:this.isConstructed}}}fa.NAME="identificationBlock";class ga extends da{constructor({lenBlock:e={}}={}){var t,n,r;super(),this.isIndefiniteForm=null!==(t=e.isIndefiniteForm)&&void 0!==t&&t,this.longFormUsed=null!==(n=e.longFormUsed)&&void 0!==n&&n,this.length=null!==(r=e.length)&&void 0!==r?r:0}fromBER(e,t,n){const r=Wo.toUint8Array(e);if(!ta(this,r,t,n))return-1;const s=r.subarray(t,t+n);if(0===s.length)return this.error="Zero buffer length",-1;if(255===s[0])return this.error="Length block 0xFF is reserved by standard",-1;if(this.isIndefiniteForm=128===s[0],this.isIndefiniteForm)return this.blockLength=1,t+this.blockLength;if(this.longFormUsed=!!(128&s[0]),!1===this.longFormUsed)return this.length=s[0],this.blockLength=1,t+this.blockLength;const i=127&s[0];if(i>8)return this.error="Too big integer",-1;if(i+1>s.length)return this.error="End of input reached before message was fully decoded",-1;const o=t+1,a=r.subarray(o,o+i);return 0===a[i-1]&&this.warnings.push("Needlessly long encoded length"),this.length=Go(a,8),this.longFormUsed&&this.length<=127&&this.warnings.push("Unnecessary usage of long length form"),this.blockLength=i+1,t+this.blockLength}toBER(e=!1){let t,n;if(this.length>127&&(this.longFormUsed=!0),this.isIndefiniteForm)return t=new ArrayBuffer(1),!1===e&&(n=new Uint8Array(t),n[0]=128),t;if(this.longFormUsed){const r=Yo(this.length,8);if(r.byteLength>127)return this.error="Too big length",oa;if(t=new ArrayBuffer(r.byteLength+1),e)return t;const s=new Uint8Array(r);n=new Uint8Array(t),n[0]=128|r.byteLength;for(let e=0;e<r.byteLength;e++)n[e+1]=s[e];return t}return t=new ArrayBuffer(1),!1===e&&(n=new Uint8Array(t),n[0]=this.length),t}toJSON(){return{...super.toJSON(),isIndefiniteForm:this.isIndefiniteForm,longFormUsed:this.longFormUsed,length:this.length}}}ga.NAME="lengthBlock";const ma={};class ya extends da{constructor({name:e="",optional:t=!1,primitiveSchema:n,...r}={},s){super(r),this.name=e,this.optional=t,n&&(this.primitiveSchema=n),this.idBlock=new fa(r),this.lenBlock=new ga(r),this.valueBlock=s?new s(r):new pa(r)}fromBER(e,t,n){const r=this.valueBlock.fromBER(e,t,this.lenBlock.isIndefiniteForm?n:this.lenBlock.length);return-1===r?(this.error=this.valueBlock.error,r):(this.idBlock.error.length||(this.blockLength+=this.idBlock.blockLength),this.lenBlock.error.length||(this.blockLength+=this.lenBlock.blockLength),this.valueBlock.error.length||(this.blockLength+=this.valueBlock.blockLength),r)}toBER(e,t){const n=t||new na;t||wa(this);const r=this.idBlock.toBER(e);if(n.write(r),this.lenBlock.isIndefiniteForm)n.write(new Uint8Array([128]).buffer),this.valueBlock.toBER(e,n),n.write(new ArrayBuffer(2));else{const t=this.valueBlock.toBER(e);this.lenBlock.length=t.byteLength;const r=this.lenBlock.toBER(e);n.write(r),n.write(t)}return t?oa:n.final()}toJSON(){const e={...super.toJSON(),idBlock:this.idBlock.toJSON(),lenBlock:this.lenBlock.toJSON(),valueBlock:this.valueBlock.toJSON(),name:this.name,optional:this.optional};return this.primitiveSchema&&(e.primitiveSchema=this.primitiveSchema.toJSON()),e}toString(e="ascii"){return"ascii"===e?this.onAsciiEncoding():jo.ToHex(this.toBER())}onAsciiEncoding(){return`${this.constructor.NAME} : ${jo.ToHex(this.valueBlock.valueBeforeDecodeView)}`}isEqual(e){if(this===e)return!0;if(!(e instanceof this.constructor))return!1;return function(e,t){if(e.byteLength!==t.byteLength)return!1;const n=new Uint8Array(e),r=new Uint8Array(t);for(let e=0;e<n.length;e++)if(n[e]!==r[e])return!1;return!0}(this.toBER(),e.toBER())}}function wa(e){if(e instanceof ma.Constructed)for(const t of e.valueBlock.value)wa(t)&&(e.lenBlock.isIndefiniteForm=!0);return!!e.lenBlock.isIndefiniteForm}ya.NAME="BaseBlock";class ba extends ya{constructor({value:e="",...t}={},n){super(t,n),e&&this.fromString(e)}getValue(){return this.valueBlock.value}setValue(e){this.valueBlock.value=e}fromBER(e,t,n){const r=this.valueBlock.fromBER(e,t,this.lenBlock.isIndefiniteForm?n:this.lenBlock.length);return-1===r?(this.error=this.valueBlock.error,r):(this.fromBuffer(this.valueBlock.valueHexView),this.idBlock.error.length||(this.blockLength+=this.idBlock.blockLength),this.lenBlock.error.length||(this.blockLength+=this.lenBlock.blockLength),this.valueBlock.error.length||(this.blockLength+=this.valueBlock.blockLength),r)}onAsciiEncoding(){return`${this.constructor.NAME} : '${this.valueBlock.value}'`}}ba.NAME="BaseStringBlock";class va extends(ha(pa)){constructor({isHexOnly:e=!0,...t}={}){super(t),this.isHexOnly=e}}var Ea,Sa,_a,Ia,Ra;va.NAME="PrimitiveValueBlock";class Aa extends ya{constructor(e={}){super(e,va),this.idBlock.isConstructed=!1}}function Ta(e,t=0,n=e.length){const r=t;let s=new ya({},pa);const i=new da;if(!ta(i,e,t,n))return s.error=i.error,{offset:-1,result:s};if(!e.subarray(t,t+n).length)return s.error="Zero buffer length",{offset:-1,result:s};let o=s.idBlock.fromBER(e,t,n);if(s.idBlock.warnings.length&&s.warnings.concat(s.idBlock.warnings),-1===o)return s.error=s.idBlock.error,{offset:-1,result:s};if(t=o,n-=s.idBlock.blockLength,o=s.lenBlock.fromBER(e,t,n),s.lenBlock.warnings.length&&s.warnings.concat(s.lenBlock.warnings),-1===o)return s.error=s.lenBlock.error,{offset:-1,result:s};if(t=o,n-=s.lenBlock.blockLength,!s.idBlock.isConstructed&&s.lenBlock.isIndefiniteForm)return s.error="Indefinite length form used for primitive encoding form",{offset:-1,result:s};let a=ya;if(1===s.idBlock.tagClass){if(s.idBlock.tagNumber>=37&&!1===s.idBlock.isHexOnly)return s.error="UNIVERSAL 37 and upper tags are reserved by ASN.1 standard",{offset:-1,result:s};switch(s.idBlock.tagNumber){case 0:if(s.idBlock.isConstructed&&s.lenBlock.length>0)return s.error="Type [UNIVERSAL 0] is reserved",{offset:-1,result:s};a=ma.EndOfContent;break;case 1:a=ma.Boolean;break;case 2:a=ma.Integer;break;case 3:a=ma.BitString;break;case 4:a=ma.OctetString;break;case 5:a=ma.Null;break;case 6:a=ma.ObjectIdentifier;break;case 10:a=ma.Enumerated;break;case 12:a=ma.Utf8String;break;case 13:a=ma.RelativeObjectIdentifier;break;case 14:a=ma.TIME;break;case 15:return s.error="[UNIVERSAL 15] is reserved by ASN.1 standard",{offset:-1,result:s};case 16:a=ma.Sequence;break;case 17:a=ma.Set;break;case 18:a=ma.NumericString;break;case 19:a=ma.PrintableString;break;case 20:a=ma.TeletexString;break;case 21:a=ma.VideotexString;break;case 22:a=ma.IA5String;break;case 23:a=ma.UTCTime;break;case 24:a=ma.GeneralizedTime;break;case 25:a=ma.GraphicString;break;case 26:a=ma.VisibleString;break;case 27:a=ma.GeneralString;break;case 28:a=ma.UniversalString;break;case 29:a=ma.CharacterString;break;case 30:a=ma.BmpString;break;case 31:a=ma.DATE;break;case 32:a=ma.TimeOfDay;break;case 33:a=ma.DateTime;break;case 34:a=ma.Duration;break;default:{const e=s.idBlock.isConstructed?new ma.Constructed:new ma.Primitive;e.idBlock=s.idBlock,e.lenBlock=s.lenBlock,e.warnings=s.warnings,s=e}}}else a=s.idBlock.isConstructed?ma.Constructed:ma.Primitive;return s=function(e,t){if(e instanceof t)return e;const n=new t;return n.idBlock=e.idBlock,n.lenBlock=e.lenBlock,n.warnings=e.warnings,n.valueBeforeDecodeView=e.valueBeforeDecodeView,n}(s,a),o=s.fromBER(e,t,s.lenBlock.isIndefiniteForm?n:s.lenBlock.length),s.valueBeforeDecodeView=e.subarray(r,r+s.blockLength),{offset:o,result:s}}function Da(e){if(!e.byteLength){const e=new ya({},pa);return e.error="Input buffer has zero length",{offset:-1,result:e}}return Ta(Wo.toUint8Array(e).slice(),0,e.byteLength)}function ka(e,t){return e?1:t}Ea=Aa,ma.Primitive=Ea,Aa.NAME="PRIMITIVE";class Pa extends pa{constructor({value:e=[],isIndefiniteForm:t=!1,...n}={}){super(n),this.value=e,this.isIndefiniteForm=t}fromBER(e,t,n){const r=Wo.toUint8Array(e);if(!ta(this,r,t,n))return-1;if(this.valueBeforeDecodeView=r.subarray(t,t+n),0===this.valueBeforeDecodeView.length)return this.warnings.push("Zero buffer length"),t;let s=t;for(;ka(this.isIndefiniteForm,n)>0;){const e=Ta(r,s,n);if(-1===e.offset)return this.error=e.result.error,this.warnings.concat(e.result.warnings),-1;if(s=e.offset,this.blockLength+=e.result.blockLength,n-=e.result.blockLength,this.value.push(e.result),this.isIndefiniteForm&&e.result.constructor.NAME===ca)break}return this.isIndefiniteForm&&(this.value[this.value.length-1].constructor.NAME===ca?this.value.pop():this.warnings.push("No EndOfContent block encoded")),s}toBER(e,t){const n=t||new na;for(let t=0;t<this.value.length;t++)this.value[t].toBER(e,n);return t?oa:n.final()}toJSON(){const e={...super.toJSON(),isIndefiniteForm:this.isIndefiniteForm,value:[]};for(const t of this.value)e.value.push(t.toJSON());return e}}Pa.NAME="ConstructedValueBlock";class Ca extends ya{constructor(e={}){super(e,Pa),this.idBlock.isConstructed=!0}fromBER(e,t,n){this.valueBlock.isIndefiniteForm=this.lenBlock.isIndefiniteForm;const r=this.valueBlock.fromBER(e,t,this.lenBlock.isIndefiniteForm?n:this.lenBlock.length);return-1===r?(this.error=this.valueBlock.error,r):(this.idBlock.error.length||(this.blockLength+=this.idBlock.blockLength),this.lenBlock.error.length||(this.blockLength+=this.lenBlock.blockLength),this.valueBlock.error.length||(this.blockLength+=this.valueBlock.blockLength),r)}onAsciiEncoding(){const e=[];for(const t of this.valueBlock.value)e.push(t.toString("ascii").split("\n").map((e=>` ${e}`)).join("\n"));const t=3===this.idBlock.tagClass?`[${this.idBlock.tagNumber}]`:this.constructor.NAME;return e.length?`${t} :\n${e.join("\n")}`:`${t} :`}}Sa=Ca,ma.Constructed=Sa,Ca.NAME="CONSTRUCTED";class xa extends pa{fromBER(e,t,n){return t}toBER(e){return oa}}xa.override="EndOfContentValueBlock";class Na extends ya{constructor(e={}){super(e,xa),this.idBlock.tagClass=1,this.idBlock.tagNumber=0}}_a=Na,ma.EndOfContent=_a,Na.NAME=ca;class Ma extends ya{constructor(e={}){super(e,pa),this.idBlock.tagClass=1,this.idBlock.tagNumber=5}fromBER(e,t,n){return this.lenBlock.length>0&&this.warnings.push("Non-zero length of value block for Null type"),this.idBlock.error.length||(this.blockLength+=this.idBlock.blockLength),this.lenBlock.error.length||(this.blockLength+=this.lenBlock.blockLength),this.blockLength+=n,t+n>e.byteLength?(this.error="End of input reached before message was fully decoded (inconsistent offset and length values)",-1):t+n}toBER(e,t){const n=new ArrayBuffer(2);if(!e){const e=new Uint8Array(n);e[0]=5,e[1]=0}return t&&t.write(n),n}onAsciiEncoding(){return`${this.constructor.NAME}`}}Ia=Ma,ma.Null=Ia,Ma.NAME="NULL";class Oa extends(ha(pa)){constructor({value:e,...t}={}){super(t),t.valueHex?this.valueHexView=Wo.toUint8Array(t.valueHex):this.valueHexView=new Uint8Array(1),e&&(this.value=e)}get value(){for(const e of this.valueHexView)if(e>0)return!0;return!1}set value(e){this.valueHexView[0]=e?255:0}fromBER(e,t,n){const r=Wo.toUint8Array(e);return ta(this,r,t,n)?(this.valueHexView=r.subarray(t,t+n),n>1&&this.warnings.push("Boolean value encoded in more then 1 octet"),this.isHexOnly=!0,Zo.call(this),this.blockLength=n,t+n):-1}toBER(){return this.valueHexView.slice()}toJSON(){return{...super.toJSON(),value:this.value}}}Oa.NAME="BooleanValueBlock";let La=class extends ya{constructor(e={}){super(e,Oa),this.idBlock.tagClass=1,this.idBlock.tagNumber=1}getValue(){return this.valueBlock.value}setValue(e){this.valueBlock.value=e}onAsciiEncoding(){return`${this.constructor.NAME} : ${this.getValue}`}};Ra=La,ma.Boolean=Ra,La.NAME="BOOLEAN";class Ba extends(ha(Pa)){constructor({isConstructed:e=!1,...t}={}){super(t),this.isConstructed=e}fromBER(e,t,n){let r=0;if(this.isConstructed){if(this.isHexOnly=!1,r=Pa.prototype.fromBER.call(this,e,t,n),-1===r)return r;for(let e=0;e<this.value.length;e++){const t=this.value[e].constructor.NAME;if(t===ca){if(this.isIndefiniteForm)break;return this.error="EndOfContent is unexpected, OCTET STRING may consists of OCTET STRINGs only",-1}if(t!==la)return this.error="OCTET STRING may consists of OCTET STRINGs only",-1}}else this.isHexOnly=!0,r=super.fromBER(e,t,n),this.blockLength=n;return r}toBER(e,t){return this.isConstructed?Pa.prototype.toBER.call(this,e,t):e?new ArrayBuffer(this.valueHexView.byteLength):this.valueHexView.slice().buffer}toJSON(){return{...super.toJSON(),isConstructed:this.isConstructed}}}var Ua,Fa,Va,Ka,$a,qa,Ha,za,Wa;Ba.NAME="OctetStringValueBlock";class ja extends ya{constructor({idBlock:e={},lenBlock:t={},...n}={}){var r,s;null!==(r=n.isConstructed)&&void 0!==r||(n.isConstructed=!!(null===(s=n.value)||void 0===s?void 0:s.length)),super({idBlock:{isConstructed:n.isConstructed,...e},lenBlock:{...t,isIndefiniteForm:!!n.isIndefiniteForm},...n},Ba),this.idBlock.tagClass=1,this.idBlock.tagNumber=4}fromBER(e,t,n){if(this.valueBlock.isConstructed=this.idBlock.isConstructed,this.valueBlock.isIndefiniteForm=this.lenBlock.isIndefiniteForm,0===n)return 0===this.idBlock.error.length&&(this.blockLength+=this.idBlock.blockLength),0===this.lenBlock.error.length&&(this.blockLength+=this.lenBlock.blockLength),t;if(!this.valueBlock.isConstructed){const r=(e instanceof ArrayBuffer?new Uint8Array(e):e).subarray(t,t+n);try{if(r.byteLength){const e=Ta(r,0,r.byteLength);-1!==e.offset&&e.offset===n&&(this.valueBlock.value=[e.result])}}catch(e){}}return super.fromBER(e,t,n)}onAsciiEncoding(){return this.valueBlock.isConstructed||this.valueBlock.value&&this.valueBlock.value.length?Ca.prototype.onAsciiEncoding.call(this):`${this.constructor.NAME} : ${jo.ToHex(this.valueBlock.valueHexView)}`}getValue(){if(!this.idBlock.isConstructed)return this.valueBlock.valueHexView.slice().buffer;const e=[];for(const t of this.valueBlock.value)t instanceof ja&&e.push(t.valueBlock.valueHexView);return Wo.concat(e)}}Ua=ja,ma.OctetString=Ua,ja.NAME=la;class Ga extends(ha(Pa)){constructor({unusedBits:e=0,isConstructed:t=!1,...n}={}){super(n),this.unusedBits=e,this.isConstructed=t,this.blockLength=this.valueHexView.byteLength}fromBER(e,t,n){if(!n)return t;let r=-1;if(this.isConstructed){if(r=Pa.prototype.fromBER.call(this,e,t,n),-1===r)return r;for(const e of this.value){const t=e.constructor.NAME;if(t===ca){if(this.isIndefiniteForm)break;return this.error="EndOfContent is unexpected, BIT STRING may consists of BIT STRINGs only",-1}if(t!==ua)return this.error="BIT STRING may consists of BIT STRINGs only",-1;const n=e.valueBlock;if(this.unusedBits>0&&n.unusedBits>0)return this.error='Using of "unused bits" inside constructive BIT STRING allowed for least one only',-1;this.unusedBits=n.unusedBits}return r}const s=Wo.toUint8Array(e);if(!ta(this,s,t,n))return-1;const i=s.subarray(t,t+n);if(this.unusedBits=i[0],this.unusedBits>7)return this.error="Unused bits for BitString must be in range 0-7",-1;if(!this.unusedBits){const e=i.subarray(1);try{if(e.byteLength){const t=Ta(e,0,e.byteLength);-1!==t.offset&&t.offset===n-1&&(this.value=[t.result])}}catch(e){}}return this.valueHexView=i.subarray(1),this.blockLength=i.length,t+n}toBER(e,t){if(this.isConstructed)return Pa.prototype.toBER.call(this,e,t);if(e)return new ArrayBuffer(this.valueHexView.byteLength+1);if(!this.valueHexView.byteLength)return oa;const n=new Uint8Array(this.valueHexView.length+1);return n[0]=this.unusedBits,n.set(this.valueHexView,1),n.buffer}toJSON(){return{...super.toJSON(),unusedBits:this.unusedBits,isConstructed:this.isConstructed}}}Ga.NAME="BitStringValueBlock";class Ya extends ya{constructor({idBlock:e={},lenBlock:t={},...n}={}){var r,s;null!==(r=n.isConstructed)&&void 0!==r||(n.isConstructed=!!(null===(s=n.value)||void 0===s?void 0:s.length)),super({idBlock:{isConstructed:n.isConstructed,...e},lenBlock:{...t,isIndefiniteForm:!!n.isIndefiniteForm},...n},Ga),this.idBlock.tagClass=1,this.idBlock.tagNumber=3}fromBER(e,t,n){return this.valueBlock.isConstructed=this.idBlock.isConstructed,this.valueBlock.isIndefiniteForm=this.lenBlock.isIndefiniteForm,super.fromBER(e,t,n)}onAsciiEncoding(){if(this.valueBlock.isConstructed||this.valueBlock.value&&this.valueBlock.value.length)return Ca.prototype.onAsciiEncoding.call(this);{const e=[],t=this.valueBlock.valueHexView;for(const n of t)e.push(n.toString(2).padStart(8,"0"));const n=e.join("");return`${this.constructor.NAME} : ${n.substring(0,n.length-this.valueBlock.unusedBits)}`}}}function Qa(e,t){const n=new Uint8Array([0]),r=new Uint8Array(e),s=new Uint8Array(t);let i=r.slice(0);const o=i.length-1,a=s.slice(0),c=a.length-1;let l=0;let u=0;for(let e=c<o?o:c;e>=0;e--,u++){if(!0==u<a.length)l=i[o-u]+a[c-u]+n[0];else l=i[o-u]+n[0];if(n[0]=l/10,!0==u>=i.length)i=Qo(new Uint8Array([l%10]),i);else i[o-u]=l%10}return n[0]>0&&(i=Qo(n,i)),i}function Za(e){if(e>=ra.length)for(let t=ra.length;t<=e;t++){const e=new Uint8Array([0]);let n=ra[t-1].slice(0);for(let t=n.length-1;t>=0;t--){const r=new Uint8Array([(n[t]<<1)+e[0]]);e[0]=r[0]/10,n[t]=r[0]%10}e[0]>0&&(n=Qo(e,n)),ra.push(n)}return ra[e]}function Ja(e,t){let n=0;const r=new Uint8Array(e),s=new Uint8Array(t),i=r.slice(0),o=i.length-1,a=s.slice(0),c=a.length-1;let l,u=0;for(let e=c;e>=0;e--,u++)if(l=i[o-u]-a[c-u]-n,!0==l<0)n=1,i[o-u]=l+10;else n=0,i[o-u]=l;if(n>0)for(let e=o-c+1;e>=0;e--,u++){if(l=i[o-u]-n,!(l<0)){n=0,i[o-u]=l;break}n=1,i[o-u]=l+10}return i.slice()}Fa=Ya,ma.BitString=Fa,Ya.NAME=ua;class Xa extends(ha(pa)){constructor({value:e,...t}={}){super(t),this._valueDec=0,t.valueHex&&this.setValueHex(),void 0!==e&&(this.valueDec=e)}setValueHex(){this.valueHexView.length>=4?(this.warnings.push("Too big Integer for decoding, hex only"),this.isHexOnly=!0,this._valueDec=0):(this.isHexOnly=!1,this.valueHexView.length>0&&(this._valueDec=Zo.call(this)))}set valueDec(e){this._valueDec=e,this.isHexOnly=!1,this.valueHexView=new Uint8Array(function(e){const t=e<0?-1*e:e;let n=128;for(let r=1;r<8;r++){if(t<=n){if(e<0){const e=Yo(n-t,8,r);return new Uint8Array(e)[0]|=128,e}let s=Yo(t,8,r),i=new Uint8Array(s);if(128&i[0]){const e=s.slice(0),t=new Uint8Array(e);s=new ArrayBuffer(s.byteLength+1),i=new Uint8Array(s);for(let n=0;n<e.byteLength;n++)i[n+1]=t[n];i[0]=0}return s}n*=Math.pow(2,8)}return new ArrayBuffer(0)}(e))}get valueDec(){return this._valueDec}fromDER(e,t,n,r=0){const s=this.fromBER(e,t,n);if(-1===s)return s;const i=this.valueHexView;return 0===i[0]&&128&i[1]?this.valueHexView=i.subarray(1):0!==r&&i.length<r&&(r-i.length>1&&(r=i.length+1),this.valueHexView=i.subarray(r-i.length)),s}toDER(e=!1){const t=this.valueHexView;switch(!0){case!!(128&t[0]):{const e=new Uint8Array(this.valueHexView.length+1);e[0]=0,e.set(t,1),this.valueHexView=e}break;case 0===t[0]&&!(128&t[1]):this.valueHexView=this.valueHexView.subarray(1)}return this.toBER(e)}fromBER(e,t,n){const r=super.fromBER(e,t,n);return-1===r||this.setValueHex(),r}toBER(e){return e?new ArrayBuffer(this.valueHexView.length):this.valueHexView.slice().buffer}toJSON(){return{...super.toJSON(),valueDec:this.valueDec}}toString(){const e=8*this.valueHexView.length-1;let t,n=new Uint8Array(8*this.valueHexView.length/3),r=0;const s=this.valueHexView;let i="",o=!1;for(let o=s.byteLength-1;o>=0;o--){t=s[o];for(let s=0;s<8;s++){if(!(1&~t))if(r===e)n=Ja(Za(r),n),i="-";else n=Qa(n,Za(r));r++,t>>=1}}for(let e=0;e<n.length;e++)n[e]&&(o=!0),o&&(i+=sa.charAt(n[e]));return!1===o&&(i+=sa.charAt(0)),i}}Va=Xa,Xa.NAME="IntegerValueBlock",Object.defineProperty(Va.prototype,"valueHex",{set:function(e){this.valueHexView=new Uint8Array(e),this.setValueHex()},get:function(){return this.valueHexView.slice().buffer}});class ec extends ya{constructor(e={}){super(e,Xa),this.idBlock.tagClass=1,this.idBlock.tagNumber=2}toBigInt(){return Xo(),BigInt(this.valueBlock.toString())}static fromBigInt(e){Xo();const t=BigInt(e),n=new na,r=t.toString(16).replace(/^-/,""),s=new Uint8Array(jo.FromHex(r));if(t<0){const e=new Uint8Array(s.length+(128&s[0]?1:0));e[0]|=128;const r=BigInt(`0x${jo.ToHex(e)}`)+t,i=Wo.toUint8Array(jo.FromHex(r.toString(16)));i[0]|=128,n.write(i)}else 128&s[0]&&n.write(new Uint8Array([0])),n.write(s);return new ec({valueHex:n.final()})}convertToDER(){const e=new ec({valueHex:this.valueBlock.valueHexView});return e.valueBlock.toDER(),e}convertFromDER(){return new ec({valueHex:0===this.valueBlock.valueHexView[0]?this.valueBlock.valueHexView.subarray(1):this.valueBlock.valueHexView})}onAsciiEncoding(){return`${this.constructor.NAME} : ${this.valueBlock.toString()}`}}Ka=ec,ma.Integer=Ka,ec.NAME="INTEGER";class tc extends ec{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=10}}$a=tc,ma.Enumerated=$a,tc.NAME="ENUMERATED";class nc extends(ha(pa)){constructor({valueDec:e=-1,isFirstSid:t=!1,...n}={}){super(n),this.valueDec=e,this.isFirstSid=t}fromBER(e,t,n){if(!n)return t;const r=Wo.toUint8Array(e);if(!ta(this,r,t,n))return-1;const s=r.subarray(t,t+n);this.valueHexView=new Uint8Array(n);for(let e=0;e<n&&(this.valueHexView[e]=127&s[e],this.blockLength++,128&s[e]);e++);const i=new Uint8Array(this.blockLength);for(let e=0;e<this.blockLength;e++)i[e]=this.valueHexView[e];return this.valueHexView=i,128&s[this.blockLength-1]?(this.error="End of input reached before message was fully decoded",-1):(0===this.valueHexView[0]&&this.warnings.push("Needlessly long format of SID encoding"),this.blockLength<=8?this.valueDec=Go(this.valueHexView,7):(this.isHexOnly=!0,this.warnings.push("Too big SID for decoding, hex only")),t+this.blockLength)}set valueBigInt(e){Xo();let t=BigInt(e).toString(2);for(;t.length%7;)t="0"+t;const n=new Uint8Array(t.length/7);for(let e=0;e<n.length;e++)n[e]=parseInt(t.slice(7*e,7*e+7),2)+(e+1<n.length?128:0);this.fromBER(n.buffer,0,n.length)}toBER(e){if(this.isHexOnly){if(e)return new ArrayBuffer(this.valueHexView.byteLength);const t=this.valueHexView,n=new Uint8Array(this.blockLength);for(let e=0;e<this.blockLength-1;e++)n[e]=128|t[e];return n[this.blockLength-1]=t[this.blockLength-1],n.buffer}const t=Yo(this.valueDec,7);if(0===t.byteLength)return this.error="Error during encoding SID value",oa;const n=new Uint8Array(t.byteLength);if(!e){const e=new Uint8Array(t),r=t.byteLength-1;for(let t=0;t<r;t++)n[t]=128|e[t];n[r]=e[r]}return n}toString(){let e="";if(this.isHexOnly)e=jo.ToHex(this.valueHexView);else if(this.isFirstSid){let t=this.valueDec;this.valueDec<=39?e="0.":this.valueDec<=79?(e="1.",t-=40):(e="2.",t-=80),e+=t.toString()}else e=this.valueDec.toString();return e}toJSON(){return{...super.toJSON(),valueDec:this.valueDec,isFirstSid:this.isFirstSid}}}nc.NAME="sidBlock";class rc extends pa{constructor({value:e="",...t}={}){super(t),this.value=[],e&&this.fromString(e)}fromBER(e,t,n){let r=t;for(;n>0;){const t=new nc;if(r=t.fromBER(e,r,n),-1===r)return this.blockLength=0,this.error=t.error,r;0===this.value.length&&(t.isFirstSid=!0),this.blockLength+=t.blockLength,n-=t.blockLength,this.value.push(t)}return r}toBER(e){const t=[];for(let n=0;n<this.value.length;n++){const r=this.value[n].toBER(e);if(0===r.byteLength)return this.error=this.value[n].error,oa;t.push(r)}return ea(t)}fromString(e){this.value=[];let t=0,n=0,r="",s=!1;do{if(n=e.indexOf(".",t),r=-1===n?e.substring(t):e.substring(t,n),t=n+1,s){const e=this.value[0];let t=0;switch(e.valueDec){case 0:break;case 1:t=40;break;case 2:t=80;break;default:return void(this.value=[])}const n=parseInt(r,10);if(isNaN(n))return;e.valueDec=n+t,s=!1}else{const e=new nc;if(r>Number.MAX_SAFE_INTEGER){Xo();const t=BigInt(r);e.valueBigInt=t}else if(e.valueDec=parseInt(r,10),isNaN(e.valueDec))return;this.value.length||(e.isFirstSid=!0,s=!0),this.value.push(e)}}while(-1!==n)}toString(){let e="",t=!1;for(let n=0;n<this.value.length;n++){t=this.value[n].isHexOnly;let r=this.value[n].toString();0!==n&&(e=`${e}.`),t?(r=`{${r}}`,this.value[n].isFirstSid?e=`2.{${r} - 80}`:e+=r):e+=r}return e}toJSON(){const e={...super.toJSON(),value:this.toString(),sidArray:[]};for(let t=0;t<this.value.length;t++)e.sidArray.push(this.value[t].toJSON());return e}}rc.NAME="ObjectIdentifierValueBlock";class sc extends ya{constructor(e={}){super(e,rc),this.idBlock.tagClass=1,this.idBlock.tagNumber=6}getValue(){return this.valueBlock.toString()}setValue(e){this.valueBlock.fromString(e)}onAsciiEncoding(){return`${this.constructor.NAME} : ${this.valueBlock.toString()||"empty"}`}toJSON(){return{...super.toJSON(),value:this.getValue()}}}qa=sc,ma.ObjectIdentifier=qa,sc.NAME="OBJECT IDENTIFIER";class ic extends(ha(da)){constructor({valueDec:e=0,...t}={}){super(t),this.valueDec=e}fromBER(e,t,n){if(0===n)return t;const r=Wo.toUint8Array(e);if(!ta(this,r,t,n))return-1;const s=r.subarray(t,t+n);this.valueHexView=new Uint8Array(n);for(let e=0;e<n&&(this.valueHexView[e]=127&s[e],this.blockLength++,128&s[e]);e++);const i=new Uint8Array(this.blockLength);for(let e=0;e<this.blockLength;e++)i[e]=this.valueHexView[e];return this.valueHexView=i,128&s[this.blockLength-1]?(this.error="End of input reached before message was fully decoded",-1):(0===this.valueHexView[0]&&this.warnings.push("Needlessly long format of SID encoding"),this.blockLength<=8?this.valueDec=Go(this.valueHexView,7):(this.isHexOnly=!0,this.warnings.push("Too big SID for decoding, hex only")),t+this.blockLength)}toBER(e){if(this.isHexOnly){if(e)return new ArrayBuffer(this.valueHexView.byteLength);const t=this.valueHexView,n=new Uint8Array(this.blockLength);for(let e=0;e<this.blockLength-1;e++)n[e]=128|t[e];return n[this.blockLength-1]=t[this.blockLength-1],n.buffer}const t=Yo(this.valueDec,7);if(0===t.byteLength)return this.error="Error during encoding SID value",oa;const n=new Uint8Array(t.byteLength);if(!e){const e=new Uint8Array(t),r=t.byteLength-1;for(let t=0;t<r;t++)n[t]=128|e[t];n[r]=e[r]}return n.buffer}toString(){let e="";return e=this.isHexOnly?jo.ToHex(this.valueHexView):this.valueDec.toString(),e}toJSON(){return{...super.toJSON(),valueDec:this.valueDec}}}ic.NAME="relativeSidBlock";class oc extends pa{constructor({value:e="",...t}={}){super(t),this.value=[],e&&this.fromString(e)}fromBER(e,t,n){let r=t;for(;n>0;){const t=new ic;if(r=t.fromBER(e,r,n),-1===r)return this.blockLength=0,this.error=t.error,r;this.blockLength+=t.blockLength,n-=t.blockLength,this.value.push(t)}return r}toBER(e,t){const n=[];for(let t=0;t<this.value.length;t++){const r=this.value[t].toBER(e);if(0===r.byteLength)return this.error=this.value[t].error,oa;n.push(r)}return ea(n)}fromString(e){this.value=[];let t=0,n=0,r="";do{n=e.indexOf(".",t),r=-1===n?e.substring(t):e.substring(t,n),t=n+1;const s=new ic;if(s.valueDec=parseInt(r,10),isNaN(s.valueDec))return!0;this.value.push(s)}while(-1!==n);return!0}toString(){let e="",t=!1;for(let n=0;n<this.value.length;n++){t=this.value[n].isHexOnly;let r=this.value[n].toString();0!==n&&(e=`${e}.`),t?(r=`{${r}}`,e+=r):e+=r}return e}toJSON(){const e={...super.toJSON(),value:this.toString(),sidArray:[]};for(let t=0;t<this.value.length;t++)e.sidArray.push(this.value[t].toJSON());return e}}oc.NAME="RelativeObjectIdentifierValueBlock";class ac extends ya{constructor(e={}){super(e,oc),this.idBlock.tagClass=1,this.idBlock.tagNumber=13}getValue(){return this.valueBlock.toString()}setValue(e){this.valueBlock.fromString(e)}onAsciiEncoding(){return`${this.constructor.NAME} : ${this.valueBlock.toString()||"empty"}`}toJSON(){return{...super.toJSON(),value:this.getValue()}}}Ha=ac,ma.RelativeObjectIdentifier=Ha,ac.NAME="RelativeObjectIdentifier";class cc extends Ca{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=16}}za=cc,ma.Sequence=za,cc.NAME="SEQUENCE";let lc=class extends Ca{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=17}};Wa=lc,ma.Set=Wa,lc.NAME="SET";class uc extends(ha(pa)){constructor({...e}={}){super(e),this.isHexOnly=!0,this.value=ia}toJSON(){return{...super.toJSON(),value:this.value}}}uc.NAME="StringValueBlock";class hc extends uc{}hc.NAME="SimpleStringValueBlock";class dc extends ba{constructor({...e}={}){super(e,hc)}fromBuffer(e){this.valueBlock.value=String.fromCharCode.apply(null,Wo.toUint8Array(e))}fromString(e){const t=e.length,n=this.valueBlock.valueHexView=new Uint8Array(t);for(let r=0;r<t;r++)n[r]=e.charCodeAt(r);this.valueBlock.value=e}}dc.NAME="SIMPLE STRING";class pc extends dc{fromBuffer(e){this.valueBlock.valueHexView=Wo.toUint8Array(e);try{this.valueBlock.value=jo.ToUtf8String(e)}catch(t){this.warnings.push(`Error during "decodeURIComponent": ${t}, using raw string`),this.valueBlock.value=jo.ToBinary(e)}}fromString(e){this.valueBlock.valueHexView=new Uint8Array(jo.FromUtf8String(e)),this.valueBlock.value=e}}var fc,gc,mc,yc,wc,bc,vc,Ec,Sc,_c,Ic,Rc,Ac,Tc,Dc,kc,Pc,Cc,xc;pc.NAME="Utf8StringValueBlock";class Nc extends pc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=12}}fc=Nc,ma.Utf8String=fc,Nc.NAME="UTF8String";class Mc extends dc{fromBuffer(e){this.valueBlock.value=jo.ToUtf16String(e),this.valueBlock.valueHexView=Wo.toUint8Array(e)}fromString(e){this.valueBlock.value=e,this.valueBlock.valueHexView=new Uint8Array(jo.FromUtf16String(e))}}Mc.NAME="BmpStringValueBlock";class Oc extends Mc{constructor({...e}={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=30}}gc=Oc,ma.BmpString=gc,Oc.NAME="BMPString";class Lc extends dc{fromBuffer(e){const t=ArrayBuffer.isView(e)?e.slice().buffer:e.slice(0),n=new Uint8Array(t);for(let e=0;e<n.length;e+=4)n[e]=n[e+3],n[e+1]=n[e+2],n[e+2]=0,n[e+3]=0;this.valueBlock.value=String.fromCharCode.apply(null,new Uint32Array(t))}fromString(e){const t=e.length,n=this.valueBlock.valueHexView=new Uint8Array(4*t);for(let r=0;r<t;r++){const t=Yo(e.charCodeAt(r),8),s=new Uint8Array(t);if(s.length>4)continue;const i=4-s.length;for(let e=s.length-1;e>=0;e--)n[4*r+e+i]=s[e]}this.valueBlock.value=e}}Lc.NAME="UniversalStringValueBlock";class Bc extends Lc{constructor({...e}={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=28}}mc=Bc,ma.UniversalString=mc,Bc.NAME="UniversalString";class Uc extends dc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=18}}yc=Uc,ma.NumericString=yc,Uc.NAME="NumericString";class Fc extends dc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=19}}wc=Fc,ma.PrintableString=wc,Fc.NAME="PrintableString";class Vc extends dc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=20}}bc=Vc,ma.TeletexString=bc,Vc.NAME="TeletexString";class Kc extends dc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=21}}vc=Kc,ma.VideotexString=vc,Kc.NAME="VideotexString";class $c extends dc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=22}}Ec=$c,ma.IA5String=Ec,$c.NAME="IA5String";class qc extends dc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=25}}Sc=qc,ma.GraphicString=Sc,qc.NAME="GraphicString";class Hc extends dc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=26}}_c=Hc,ma.VisibleString=_c,Hc.NAME="VisibleString";class zc extends dc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=27}}Ic=zc,ma.GeneralString=Ic,zc.NAME="GeneralString";class Wc extends dc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=29}}Rc=Wc,ma.CharacterString=Rc,Wc.NAME="CharacterString";class jc extends Hc{constructor({value:e,valueDate:t,...n}={}){if(super(n),this.year=0,this.month=0,this.day=0,this.hour=0,this.minute=0,this.second=0,e){this.fromString(e),this.valueBlock.valueHexView=new Uint8Array(e.length);for(let t=0;t<e.length;t++)this.valueBlock.valueHexView[t]=e.charCodeAt(t)}t&&(this.fromDate(t),this.valueBlock.valueHexView=new Uint8Array(this.toBuffer())),this.idBlock.tagClass=1,this.idBlock.tagNumber=23}fromBuffer(e){this.fromString(String.fromCharCode.apply(null,Wo.toUint8Array(e)))}toBuffer(){const e=this.toString(),t=new ArrayBuffer(e.length),n=new Uint8Array(t);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t);return t}fromDate(e){this.year=e.getUTCFullYear(),this.month=e.getUTCMonth()+1,this.day=e.getUTCDate(),this.hour=e.getUTCHours(),this.minute=e.getUTCMinutes(),this.second=e.getUTCSeconds()}toDate(){return new Date(Date.UTC(this.year,this.month-1,this.day,this.hour,this.minute,this.second))}fromString(e){const t=/(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})Z/gi.exec(e);if(null===t)return void(this.error="Wrong input string for conversion");const n=parseInt(t[1],10);this.year=n>=50?1900+n:2e3+n,this.month=parseInt(t[2],10),this.day=parseInt(t[3],10),this.hour=parseInt(t[4],10),this.minute=parseInt(t[5],10),this.second=parseInt(t[6],10)}toString(e="iso"){if("iso"===e){const e=new Array(7);return e[0]=Jo(this.year<2e3?this.year-1900:this.year-2e3,2),e[1]=Jo(this.month,2),e[2]=Jo(this.day,2),e[3]=Jo(this.hour,2),e[4]=Jo(this.minute,2),e[5]=Jo(this.second,2),e[6]="Z",e.join("")}return super.toString(e)}onAsciiEncoding(){return`${this.constructor.NAME} : ${this.toDate().toISOString()}`}toJSON(){return{...super.toJSON(),year:this.year,month:this.month,day:this.day,hour:this.hour,minute:this.minute,second:this.second}}}Ac=jc,ma.UTCTime=Ac,jc.NAME="UTCTime";class Gc extends jc{constructor(e={}){var t;super(e),null!==(t=this.millisecond)&&void 0!==t||(this.millisecond=0),this.idBlock.tagClass=1,this.idBlock.tagNumber=24}fromDate(e){super.fromDate(e),this.millisecond=e.getUTCMilliseconds()}toDate(){return new Date(Date.UTC(this.year,this.month-1,this.day,this.hour,this.minute,this.second,this.millisecond))}fromString(e){let t,n=!1,r="",s="",i=0,o=0,a=0;if("Z"===e[e.length-1])r=e.substring(0,e.length-1),n=!0;else{const t=new Number(e[e.length-1]);if(isNaN(t.valueOf()))throw new Error("Wrong input string for conversion");r=e}if(n){if(-1!==r.indexOf("+"))throw new Error("Wrong input string for conversion");if(-1!==r.indexOf("-"))throw new Error("Wrong input string for conversion")}else{let e=1,t=r.indexOf("+"),n="";if(-1===t&&(t=r.indexOf("-"),e=-1),-1!==t){if(n=r.substring(t+1),r=r.substring(0,t),2!==n.length&&4!==n.length)throw new Error("Wrong input string for conversion");let s=parseInt(n.substring(0,2),10);if(isNaN(s.valueOf()))throw new Error("Wrong input string for conversion");if(o=e*s,4===n.length){if(s=parseInt(n.substring(2,4),10),isNaN(s.valueOf()))throw new Error("Wrong input string for conversion");a=e*s}}}let c=r.indexOf(".");if(-1===c&&(c=r.indexOf(",")),-1!==c){const e=new Number(`0${r.substring(c)}`);if(isNaN(e.valueOf()))throw new Error("Wrong input string for conversion");i=e.valueOf(),s=r.substring(0,c)}else s=r;switch(!0){case 8===s.length:if(t=/(\d{4})(\d{2})(\d{2})/gi,-1!==c)throw new Error("Wrong input string for conversion");break;case 10===s.length:if(t=/(\d{4})(\d{2})(\d{2})(\d{2})/gi,-1!==c){let e=60*i;this.minute=Math.floor(e),e=60*(e-this.minute),this.second=Math.floor(e),e=1e3*(e-this.second),this.millisecond=Math.floor(e)}break;case 12===s.length:if(t=/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})/gi,-1!==c){let e=60*i;this.second=Math.floor(e),e=1e3*(e-this.second),this.millisecond=Math.floor(e)}break;case 14===s.length:if(t=/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/gi,-1!==c){const e=1e3*i;this.millisecond=Math.floor(e)}break;default:throw new Error("Wrong input string for conversion")}const l=t.exec(s);if(null===l)throw new Error("Wrong input string for conversion");for(let e=1;e<l.length;e++)switch(e){case 1:this.year=parseInt(l[e],10);break;case 2:this.month=parseInt(l[e],10);break;case 3:this.day=parseInt(l[e],10);break;case 4:this.hour=parseInt(l[e],10)+o;break;case 5:this.minute=parseInt(l[e],10)+a;break;case 6:this.second=parseInt(l[e],10);break;default:throw new Error("Wrong input string for conversion")}if(!1===n){const e=new Date(this.year,this.month,this.day,this.hour,this.minute,this.second,this.millisecond);this.year=e.getUTCFullYear(),this.month=e.getUTCMonth(),this.day=e.getUTCDay(),this.hour=e.getUTCHours(),this.minute=e.getUTCMinutes(),this.second=e.getUTCSeconds(),this.millisecond=e.getUTCMilliseconds()}}toString(e="iso"){if("iso"===e){const e=[];return e.push(Jo(this.year,4)),e.push(Jo(this.month,2)),e.push(Jo(this.day,2)),e.push(Jo(this.hour,2)),e.push(Jo(this.minute,2)),e.push(Jo(this.second,2)),0!==this.millisecond&&(e.push("."),e.push(Jo(this.millisecond,3))),e.push("Z"),e.join("")}return super.toString(e)}toJSON(){return{...super.toJSON(),millisecond:this.millisecond}}}Tc=Gc,ma.GeneralizedTime=Tc,Gc.NAME="GeneralizedTime";class Yc extends Nc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=31}}Dc=Yc,ma.DATE=Dc,Yc.NAME="DATE";class Qc extends Nc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=32}}kc=Qc,ma.TimeOfDay=kc,Qc.NAME="TimeOfDay";class Zc extends Nc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=33}}Pc=Zc,ma.DateTime=Pc,Zc.NAME="DateTime";class Jc extends Nc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=34}}Cc=Jc,ma.Duration=Cc,Jc.NAME="Duration";class Xc extends Nc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=14}}function el(e){let t=e.toString(16);t.length%2>0&&(t=`0${t}`);const n=t.length/2,r=new Uint8Array(n);let s=0,i=0;for(;s<n;)r[s]=parseInt(t.slice(i,i+2),16),s+=1,i+=2;return r}function tl(e){const t=[];return e.forEach((function(e){let n=e.toString(16);n.length%2>0&&(n=`0${n}`),t.push(n)})),BigInt("0x"+t.join(""))}xc=Xc,ma.TIME=xc,Xc.NAME="TIME";async function nl(e,t){const n=_o.get(),r=new cc({value:[new ec({value:0}),new cc({value:[new sc({value:"1.2.840.113549.1.1.1"}),new Ma]}),new ja({valueHex:e.marshal()})]}).toBER(),s=new Uint8Array(r,0,r.byteLength),i=Mo(16),o=await async function(e,t,n,r){const{c:s,dkLen:i,asyncTick:o,DK:a,PRF:c,PRFSalt:l}=Bo(e,t,n,r);let u;const h=new Uint8Array(4),d=Ns(h),p=new Uint8Array(c.outputLen);for(let e=1,t=0;t<i;e++,t+=c.outputLen){const n=a.subarray(t,t+c.outputLen);d.setInt32(0,e,!1),(u=l._cloneInto(u)).update(h).digestInto(p),n.set(p.subarray(0,n.length)),await Ls(s-1,o,(()=>{c._cloneInto(u).update(p).digestInto(p);for(let e=0;e<n.length;e++)n[e]^=p[e]}))}return function(e,t,n,r,s){return e.destroy(),t.destroy(),r&&r.destroy(),s.fill(0),n}(c,l,a,u,p)}
|
|
51
|
+
*/function ta(){if("undefined"==typeof BigInt)throw new Error("BigInt is not defined. Your environment doesn't implement BigInt.")}function na(e){let t=0,n=0;for(let n=0;n<e.length;n++){t+=e[n].byteLength}const r=new Uint8Array(t);for(let t=0;t<e.length;t++){const s=e[t];r.set(new Uint8Array(s),n),n+=s.byteLength}return r.buffer}function ra(e,t,n,r){return t instanceof Uint8Array?t.byteLength?n<0?(e.error="Wrong parameter: inputOffset less than zero",!1):r<0?(e.error="Wrong parameter: inputLength less than zero",!1):!(t.byteLength-n-r<0)||(e.error="End of input reached before message was fully decoded (inconsistent offset and length values)",!1):(e.error="Wrong parameter: inputBuffer has zero length",!1):(e.error="Wrong parameter: inputBuffer must be 'Uint8Array'",!1)}class sa{constructor(){this.items=[]}write(e){this.items.push(e)}final(){return na(this.items)}}const ia=[new Uint8Array([1])],oa="0123456789",aa="",ca=new ArrayBuffer(0),la=new Uint8Array(0),ua="EndOfContent",ha="OCTET STRING",da="BIT STRING";function pa(e){var t;return(t=class extends e{constructor(...e){var t;super(...e);const n=e[0]||{};this.isHexOnly=null!==(t=n.isHexOnly)&&void 0!==t&&t,this.valueHexView=n.valueHex?Go.toUint8Array(n.valueHex):la}get valueHex(){return this.valueHexView.slice().buffer}set valueHex(e){this.valueHexView=new Uint8Array(e)}fromBER(e,t,n){const r=e instanceof ArrayBuffer?new Uint8Array(e):e;if(!ra(this,r,t,n))return-1;const s=t+n;return this.valueHexView=r.subarray(t,s),this.valueHexView.length?(this.blockLength=n,s):(this.warnings.push("Zero buffer length"),t)}toBER(e=!1){return this.isHexOnly?e?new ArrayBuffer(this.valueHexView.byteLength):this.valueHexView.byteLength===this.valueHexView.buffer.byteLength?this.valueHexView.buffer:this.valueHexView.slice().buffer:(this.error="Flag 'isHexOnly' is not set, abort",ca)}toJSON(){return{...super.toJSON(),isHexOnly:this.isHexOnly,valueHex:Yo.ToHex(this.valueHexView)}}}).NAME="hexBlock",t}class fa{constructor({blockLength:e=0,error:t="",warnings:n=[],valueBeforeDecode:r=la}={}){this.blockLength=e,this.error=t,this.warnings=n,this.valueBeforeDecodeView=Go.toUint8Array(r)}static blockName(){return this.NAME}get valueBeforeDecode(){return this.valueBeforeDecodeView.slice().buffer}set valueBeforeDecode(e){this.valueBeforeDecodeView=new Uint8Array(e)}toJSON(){return{blockName:this.constructor.NAME,blockLength:this.blockLength,error:this.error,warnings:this.warnings,valueBeforeDecode:Yo.ToHex(this.valueBeforeDecodeView)}}}fa.NAME="baseBlock";class ga extends fa{fromBER(e,t,n){throw TypeError("User need to make a specific function in a class which extends 'ValueBlock'")}toBER(e,t){throw TypeError("User need to make a specific function in a class which extends 'ValueBlock'")}}ga.NAME="valueBlock";class ma extends(pa(fa)){constructor({idBlock:e={}}={}){var t,n,r,s;super(),e?(this.isHexOnly=null!==(t=e.isHexOnly)&&void 0!==t&&t,this.valueHexView=e.valueHex?Go.toUint8Array(e.valueHex):la,this.tagClass=null!==(n=e.tagClass)&&void 0!==n?n:-1,this.tagNumber=null!==(r=e.tagNumber)&&void 0!==r?r:-1,this.isConstructed=null!==(s=e.isConstructed)&&void 0!==s&&s):(this.tagClass=-1,this.tagNumber=-1,this.isConstructed=!1)}toBER(e=!1){let t=0;switch(this.tagClass){case 1:t|=0;break;case 2:t|=64;break;case 3:t|=128;break;case 4:t|=192;break;default:return this.error="Unknown tag class",ca}if(this.isConstructed&&(t|=32),this.tagNumber<31&&!this.isHexOnly){const n=new Uint8Array(1);if(!e){let e=this.tagNumber;e&=31,t|=e,n[0]=t}return n.buffer}if(!this.isHexOnly){const n=Jo(this.tagNumber,7),r=new Uint8Array(n),s=n.byteLength,i=new Uint8Array(s+1);if(i[0]=31|t,!e){for(let e=0;e<s-1;e++)i[e+1]=128|r[e];i[s]=r[s-1]}return i.buffer}const n=new Uint8Array(this.valueHexView.byteLength+1);if(n[0]=31|t,!e){const e=this.valueHexView;for(let t=0;t<e.length-1;t++)n[t+1]=128|e[t];n[this.valueHexView.byteLength]=e[e.length-1]}return n.buffer}fromBER(e,t,n){const r=Go.toUint8Array(e);if(!ra(this,r,t,n))return-1;const s=r.subarray(t,t+n);if(0===s.length)return this.error="Zero buffer length",-1;switch(192&s[0]){case 0:this.tagClass=1;break;case 64:this.tagClass=2;break;case 128:this.tagClass=3;break;case 192:this.tagClass=4;break;default:return this.error="Unknown tag class",-1}this.isConstructed=!(32&~s[0]),this.isHexOnly=!1;const i=31&s[0];if(31!==i)this.tagNumber=i,this.blockLength=1;else{let e=1,t=this.valueHexView=new Uint8Array(255),n=255;for(;128&s[e];){if(t[e-1]=127&s[e],e++,e>=s.length)return this.error="End of input reached before message was fully decoded",-1;if(e===n){n+=255;const e=new Uint8Array(n);for(let n=0;n<t.length;n++)e[n]=t[n];t=this.valueHexView=new Uint8Array(n)}}this.blockLength=e+1,t[e-1]=127&s[e];const r=new Uint8Array(e);for(let n=0;n<e;n++)r[n]=t[n];t=this.valueHexView=new Uint8Array(e),t.set(r),this.blockLength<=9?this.tagNumber=Qo(t,7):(this.isHexOnly=!0,this.warnings.push("Tag too long, represented as hex-coded"))}if(1===this.tagClass&&this.isConstructed)switch(this.tagNumber){case 1:case 2:case 5:case 6:case 9:case 13:case 14:case 23:case 24:case 31:case 32:case 33:case 34:return this.error="Constructed encoding used for primitive type",-1}return t+this.blockLength}toJSON(){return{...super.toJSON(),tagClass:this.tagClass,tagNumber:this.tagNumber,isConstructed:this.isConstructed}}}ma.NAME="identificationBlock";class ya extends fa{constructor({lenBlock:e={}}={}){var t,n,r;super(),this.isIndefiniteForm=null!==(t=e.isIndefiniteForm)&&void 0!==t&&t,this.longFormUsed=null!==(n=e.longFormUsed)&&void 0!==n&&n,this.length=null!==(r=e.length)&&void 0!==r?r:0}fromBER(e,t,n){const r=Go.toUint8Array(e);if(!ra(this,r,t,n))return-1;const s=r.subarray(t,t+n);if(0===s.length)return this.error="Zero buffer length",-1;if(255===s[0])return this.error="Length block 0xFF is reserved by standard",-1;if(this.isIndefiniteForm=128===s[0],this.isIndefiniteForm)return this.blockLength=1,t+this.blockLength;if(this.longFormUsed=!!(128&s[0]),!1===this.longFormUsed)return this.length=s[0],this.blockLength=1,t+this.blockLength;const i=127&s[0];if(i>8)return this.error="Too big integer",-1;if(i+1>s.length)return this.error="End of input reached before message was fully decoded",-1;const o=t+1,a=r.subarray(o,o+i);return 0===a[i-1]&&this.warnings.push("Needlessly long encoded length"),this.length=Qo(a,8),this.longFormUsed&&this.length<=127&&this.warnings.push("Unnecessary usage of long length form"),this.blockLength=i+1,t+this.blockLength}toBER(e=!1){let t,n;if(this.length>127&&(this.longFormUsed=!0),this.isIndefiniteForm)return t=new ArrayBuffer(1),!1===e&&(n=new Uint8Array(t),n[0]=128),t;if(this.longFormUsed){const r=Jo(this.length,8);if(r.byteLength>127)return this.error="Too big length",ca;if(t=new ArrayBuffer(r.byteLength+1),e)return t;const s=new Uint8Array(r);n=new Uint8Array(t),n[0]=128|r.byteLength;for(let e=0;e<r.byteLength;e++)n[e+1]=s[e];return t}return t=new ArrayBuffer(1),!1===e&&(n=new Uint8Array(t),n[0]=this.length),t}toJSON(){return{...super.toJSON(),isIndefiniteForm:this.isIndefiniteForm,longFormUsed:this.longFormUsed,length:this.length}}}ya.NAME="lengthBlock";const wa={};class ba extends fa{constructor({name:e="",optional:t=!1,primitiveSchema:n,...r}={},s){super(r),this.name=e,this.optional=t,n&&(this.primitiveSchema=n),this.idBlock=new ma(r),this.lenBlock=new ya(r),this.valueBlock=s?new s(r):new ga(r)}fromBER(e,t,n){const r=this.valueBlock.fromBER(e,t,this.lenBlock.isIndefiniteForm?n:this.lenBlock.length);return-1===r?(this.error=this.valueBlock.error,r):(this.idBlock.error.length||(this.blockLength+=this.idBlock.blockLength),this.lenBlock.error.length||(this.blockLength+=this.lenBlock.blockLength),this.valueBlock.error.length||(this.blockLength+=this.valueBlock.blockLength),r)}toBER(e,t){const n=t||new sa;t||va(this);const r=this.idBlock.toBER(e);if(n.write(r),this.lenBlock.isIndefiniteForm)n.write(new Uint8Array([128]).buffer),this.valueBlock.toBER(e,n),n.write(new ArrayBuffer(2));else{const t=this.valueBlock.toBER(e);this.lenBlock.length=t.byteLength;const r=this.lenBlock.toBER(e);n.write(r),n.write(t)}return t?ca:n.final()}toJSON(){const e={...super.toJSON(),idBlock:this.idBlock.toJSON(),lenBlock:this.lenBlock.toJSON(),valueBlock:this.valueBlock.toJSON(),name:this.name,optional:this.optional};return this.primitiveSchema&&(e.primitiveSchema=this.primitiveSchema.toJSON()),e}toString(e="ascii"){return"ascii"===e?this.onAsciiEncoding():Yo.ToHex(this.toBER())}onAsciiEncoding(){return`${this.constructor.NAME} : ${Yo.ToHex(this.valueBlock.valueBeforeDecodeView)}`}isEqual(e){if(this===e)return!0;if(!(e instanceof this.constructor))return!1;return function(e,t){if(e.byteLength!==t.byteLength)return!1;const n=new Uint8Array(e),r=new Uint8Array(t);for(let e=0;e<n.length;e++)if(n[e]!==r[e])return!1;return!0}(this.toBER(),e.toBER())}}function va(e){if(e instanceof wa.Constructed)for(const t of e.valueBlock.value)va(t)&&(e.lenBlock.isIndefiniteForm=!0);return!!e.lenBlock.isIndefiniteForm}ba.NAME="BaseBlock";class Ea extends ba{constructor({value:e="",...t}={},n){super(t,n),e&&this.fromString(e)}getValue(){return this.valueBlock.value}setValue(e){this.valueBlock.value=e}fromBER(e,t,n){const r=this.valueBlock.fromBER(e,t,this.lenBlock.isIndefiniteForm?n:this.lenBlock.length);return-1===r?(this.error=this.valueBlock.error,r):(this.fromBuffer(this.valueBlock.valueHexView),this.idBlock.error.length||(this.blockLength+=this.idBlock.blockLength),this.lenBlock.error.length||(this.blockLength+=this.lenBlock.blockLength),this.valueBlock.error.length||(this.blockLength+=this.valueBlock.blockLength),r)}onAsciiEncoding(){return`${this.constructor.NAME} : '${this.valueBlock.value}'`}}Ea.NAME="BaseStringBlock";class Sa extends(pa(ga)){constructor({isHexOnly:e=!0,...t}={}){super(t),this.isHexOnly=e}}var _a,Ia,Ra,Aa,Ta;Sa.NAME="PrimitiveValueBlock";class Da extends ba{constructor(e={}){super(e,Sa),this.idBlock.isConstructed=!1}}function ka(e,t=0,n=e.length){const r=t;let s=new ba({},ga);const i=new fa;if(!ra(i,e,t,n))return s.error=i.error,{offset:-1,result:s};if(!e.subarray(t,t+n).length)return s.error="Zero buffer length",{offset:-1,result:s};let o=s.idBlock.fromBER(e,t,n);if(s.idBlock.warnings.length&&s.warnings.concat(s.idBlock.warnings),-1===o)return s.error=s.idBlock.error,{offset:-1,result:s};if(t=o,n-=s.idBlock.blockLength,o=s.lenBlock.fromBER(e,t,n),s.lenBlock.warnings.length&&s.warnings.concat(s.lenBlock.warnings),-1===o)return s.error=s.lenBlock.error,{offset:-1,result:s};if(t=o,n-=s.lenBlock.blockLength,!s.idBlock.isConstructed&&s.lenBlock.isIndefiniteForm)return s.error="Indefinite length form used for primitive encoding form",{offset:-1,result:s};let a=ba;if(1===s.idBlock.tagClass){if(s.idBlock.tagNumber>=37&&!1===s.idBlock.isHexOnly)return s.error="UNIVERSAL 37 and upper tags are reserved by ASN.1 standard",{offset:-1,result:s};switch(s.idBlock.tagNumber){case 0:if(s.idBlock.isConstructed&&s.lenBlock.length>0)return s.error="Type [UNIVERSAL 0] is reserved",{offset:-1,result:s};a=wa.EndOfContent;break;case 1:a=wa.Boolean;break;case 2:a=wa.Integer;break;case 3:a=wa.BitString;break;case 4:a=wa.OctetString;break;case 5:a=wa.Null;break;case 6:a=wa.ObjectIdentifier;break;case 10:a=wa.Enumerated;break;case 12:a=wa.Utf8String;break;case 13:a=wa.RelativeObjectIdentifier;break;case 14:a=wa.TIME;break;case 15:return s.error="[UNIVERSAL 15] is reserved by ASN.1 standard",{offset:-1,result:s};case 16:a=wa.Sequence;break;case 17:a=wa.Set;break;case 18:a=wa.NumericString;break;case 19:a=wa.PrintableString;break;case 20:a=wa.TeletexString;break;case 21:a=wa.VideotexString;break;case 22:a=wa.IA5String;break;case 23:a=wa.UTCTime;break;case 24:a=wa.GeneralizedTime;break;case 25:a=wa.GraphicString;break;case 26:a=wa.VisibleString;break;case 27:a=wa.GeneralString;break;case 28:a=wa.UniversalString;break;case 29:a=wa.CharacterString;break;case 30:a=wa.BmpString;break;case 31:a=wa.DATE;break;case 32:a=wa.TimeOfDay;break;case 33:a=wa.DateTime;break;case 34:a=wa.Duration;break;default:{const e=s.idBlock.isConstructed?new wa.Constructed:new wa.Primitive;e.idBlock=s.idBlock,e.lenBlock=s.lenBlock,e.warnings=s.warnings,s=e}}}else a=s.idBlock.isConstructed?wa.Constructed:wa.Primitive;return s=function(e,t){if(e instanceof t)return e;const n=new t;return n.idBlock=e.idBlock,n.lenBlock=e.lenBlock,n.warnings=e.warnings,n.valueBeforeDecodeView=e.valueBeforeDecodeView,n}(s,a),o=s.fromBER(e,t,s.lenBlock.isIndefiniteForm?n:s.lenBlock.length),s.valueBeforeDecodeView=e.subarray(r,r+s.blockLength),{offset:o,result:s}}function Pa(e){if(!e.byteLength){const e=new ba({},ga);return e.error="Input buffer has zero length",{offset:-1,result:e}}return ka(Go.toUint8Array(e).slice(),0,e.byteLength)}function Ca(e,t){return e?1:t}_a=Da,wa.Primitive=_a,Da.NAME="PRIMITIVE";class xa extends ga{constructor({value:e=[],isIndefiniteForm:t=!1,...n}={}){super(n),this.value=e,this.isIndefiniteForm=t}fromBER(e,t,n){const r=Go.toUint8Array(e);if(!ra(this,r,t,n))return-1;if(this.valueBeforeDecodeView=r.subarray(t,t+n),0===this.valueBeforeDecodeView.length)return this.warnings.push("Zero buffer length"),t;let s=t;for(;Ca(this.isIndefiniteForm,n)>0;){const e=ka(r,s,n);if(-1===e.offset)return this.error=e.result.error,this.warnings.concat(e.result.warnings),-1;if(s=e.offset,this.blockLength+=e.result.blockLength,n-=e.result.blockLength,this.value.push(e.result),this.isIndefiniteForm&&e.result.constructor.NAME===ua)break}return this.isIndefiniteForm&&(this.value[this.value.length-1].constructor.NAME===ua?this.value.pop():this.warnings.push("No EndOfContent block encoded")),s}toBER(e,t){const n=t||new sa;for(let t=0;t<this.value.length;t++)this.value[t].toBER(e,n);return t?ca:n.final()}toJSON(){const e={...super.toJSON(),isIndefiniteForm:this.isIndefiniteForm,value:[]};for(const t of this.value)e.value.push(t.toJSON());return e}}xa.NAME="ConstructedValueBlock";class Na extends ba{constructor(e={}){super(e,xa),this.idBlock.isConstructed=!0}fromBER(e,t,n){this.valueBlock.isIndefiniteForm=this.lenBlock.isIndefiniteForm;const r=this.valueBlock.fromBER(e,t,this.lenBlock.isIndefiniteForm?n:this.lenBlock.length);return-1===r?(this.error=this.valueBlock.error,r):(this.idBlock.error.length||(this.blockLength+=this.idBlock.blockLength),this.lenBlock.error.length||(this.blockLength+=this.lenBlock.blockLength),this.valueBlock.error.length||(this.blockLength+=this.valueBlock.blockLength),r)}onAsciiEncoding(){const e=[];for(const t of this.valueBlock.value)e.push(t.toString("ascii").split("\n").map((e=>` ${e}`)).join("\n"));const t=3===this.idBlock.tagClass?`[${this.idBlock.tagNumber}]`:this.constructor.NAME;return e.length?`${t} :\n${e.join("\n")}`:`${t} :`}}Ia=Na,wa.Constructed=Ia,Na.NAME="CONSTRUCTED";class Ma extends ga{fromBER(e,t,n){return t}toBER(e){return ca}}Ma.override="EndOfContentValueBlock";class Oa extends ba{constructor(e={}){super(e,Ma),this.idBlock.tagClass=1,this.idBlock.tagNumber=0}}Ra=Oa,wa.EndOfContent=Ra,Oa.NAME=ua;class La extends ba{constructor(e={}){super(e,ga),this.idBlock.tagClass=1,this.idBlock.tagNumber=5}fromBER(e,t,n){return this.lenBlock.length>0&&this.warnings.push("Non-zero length of value block for Null type"),this.idBlock.error.length||(this.blockLength+=this.idBlock.blockLength),this.lenBlock.error.length||(this.blockLength+=this.lenBlock.blockLength),this.blockLength+=n,t+n>e.byteLength?(this.error="End of input reached before message was fully decoded (inconsistent offset and length values)",-1):t+n}toBER(e,t){const n=new ArrayBuffer(2);if(!e){const e=new Uint8Array(n);e[0]=5,e[1]=0}return t&&t.write(n),n}onAsciiEncoding(){return`${this.constructor.NAME}`}}Aa=La,wa.Null=Aa,La.NAME="NULL";class Ba extends(pa(ga)){constructor({value:e,...t}={}){super(t),t.valueHex?this.valueHexView=Go.toUint8Array(t.valueHex):this.valueHexView=new Uint8Array(1),e&&(this.value=e)}get value(){for(const e of this.valueHexView)if(e>0)return!0;return!1}set value(e){this.valueHexView[0]=e?255:0}fromBER(e,t,n){const r=Go.toUint8Array(e);return ra(this,r,t,n)?(this.valueHexView=r.subarray(t,t+n),n>1&&this.warnings.push("Boolean value encoded in more then 1 octet"),this.isHexOnly=!0,Xo.call(this),this.blockLength=n,t+n):-1}toBER(){return this.valueHexView.slice()}toJSON(){return{...super.toJSON(),value:this.value}}}Ba.NAME="BooleanValueBlock";let Ua=class extends ba{constructor(e={}){super(e,Ba),this.idBlock.tagClass=1,this.idBlock.tagNumber=1}getValue(){return this.valueBlock.value}setValue(e){this.valueBlock.value=e}onAsciiEncoding(){return`${this.constructor.NAME} : ${this.getValue}`}};Ta=Ua,wa.Boolean=Ta,Ua.NAME="BOOLEAN";class Fa extends(pa(xa)){constructor({isConstructed:e=!1,...t}={}){super(t),this.isConstructed=e}fromBER(e,t,n){let r=0;if(this.isConstructed){if(this.isHexOnly=!1,r=xa.prototype.fromBER.call(this,e,t,n),-1===r)return r;for(let e=0;e<this.value.length;e++){const t=this.value[e].constructor.NAME;if(t===ua){if(this.isIndefiniteForm)break;return this.error="EndOfContent is unexpected, OCTET STRING may consists of OCTET STRINGs only",-1}if(t!==ha)return this.error="OCTET STRING may consists of OCTET STRINGs only",-1}}else this.isHexOnly=!0,r=super.fromBER(e,t,n),this.blockLength=n;return r}toBER(e,t){return this.isConstructed?xa.prototype.toBER.call(this,e,t):e?new ArrayBuffer(this.valueHexView.byteLength):this.valueHexView.slice().buffer}toJSON(){return{...super.toJSON(),isConstructed:this.isConstructed}}}var Va,Ka,$a,qa,Ha,za,Wa,ja,Ga;Fa.NAME="OctetStringValueBlock";class Ya extends ba{constructor({idBlock:e={},lenBlock:t={},...n}={}){var r,s;null!==(r=n.isConstructed)&&void 0!==r||(n.isConstructed=!!(null===(s=n.value)||void 0===s?void 0:s.length)),super({idBlock:{isConstructed:n.isConstructed,...e},lenBlock:{...t,isIndefiniteForm:!!n.isIndefiniteForm},...n},Fa),this.idBlock.tagClass=1,this.idBlock.tagNumber=4}fromBER(e,t,n){if(this.valueBlock.isConstructed=this.idBlock.isConstructed,this.valueBlock.isIndefiniteForm=this.lenBlock.isIndefiniteForm,0===n)return 0===this.idBlock.error.length&&(this.blockLength+=this.idBlock.blockLength),0===this.lenBlock.error.length&&(this.blockLength+=this.lenBlock.blockLength),t;if(!this.valueBlock.isConstructed){const r=(e instanceof ArrayBuffer?new Uint8Array(e):e).subarray(t,t+n);try{if(r.byteLength){const e=ka(r,0,r.byteLength);-1!==e.offset&&e.offset===n&&(this.valueBlock.value=[e.result])}}catch(e){}}return super.fromBER(e,t,n)}onAsciiEncoding(){return this.valueBlock.isConstructed||this.valueBlock.value&&this.valueBlock.value.length?Na.prototype.onAsciiEncoding.call(this):`${this.constructor.NAME} : ${Yo.ToHex(this.valueBlock.valueHexView)}`}getValue(){if(!this.idBlock.isConstructed)return this.valueBlock.valueHexView.slice().buffer;const e=[];for(const t of this.valueBlock.value)t instanceof Ya&&e.push(t.valueBlock.valueHexView);return Go.concat(e)}}Va=Ya,wa.OctetString=Va,Ya.NAME=ha;class Qa extends(pa(xa)){constructor({unusedBits:e=0,isConstructed:t=!1,...n}={}){super(n),this.unusedBits=e,this.isConstructed=t,this.blockLength=this.valueHexView.byteLength}fromBER(e,t,n){if(!n)return t;let r=-1;if(this.isConstructed){if(r=xa.prototype.fromBER.call(this,e,t,n),-1===r)return r;for(const e of this.value){const t=e.constructor.NAME;if(t===ua){if(this.isIndefiniteForm)break;return this.error="EndOfContent is unexpected, BIT STRING may consists of BIT STRINGs only",-1}if(t!==da)return this.error="BIT STRING may consists of BIT STRINGs only",-1;const n=e.valueBlock;if(this.unusedBits>0&&n.unusedBits>0)return this.error='Using of "unused bits" inside constructive BIT STRING allowed for least one only',-1;this.unusedBits=n.unusedBits}return r}const s=Go.toUint8Array(e);if(!ra(this,s,t,n))return-1;const i=s.subarray(t,t+n);if(this.unusedBits=i[0],this.unusedBits>7)return this.error="Unused bits for BitString must be in range 0-7",-1;if(!this.unusedBits){const e=i.subarray(1);try{if(e.byteLength){const t=ka(e,0,e.byteLength);-1!==t.offset&&t.offset===n-1&&(this.value=[t.result])}}catch(e){}}return this.valueHexView=i.subarray(1),this.blockLength=i.length,t+n}toBER(e,t){if(this.isConstructed)return xa.prototype.toBER.call(this,e,t);if(e)return new ArrayBuffer(this.valueHexView.byteLength+1);if(!this.valueHexView.byteLength)return ca;const n=new Uint8Array(this.valueHexView.length+1);return n[0]=this.unusedBits,n.set(this.valueHexView,1),n.buffer}toJSON(){return{...super.toJSON(),unusedBits:this.unusedBits,isConstructed:this.isConstructed}}}Qa.NAME="BitStringValueBlock";class Ja extends ba{constructor({idBlock:e={},lenBlock:t={},...n}={}){var r,s;null!==(r=n.isConstructed)&&void 0!==r||(n.isConstructed=!!(null===(s=n.value)||void 0===s?void 0:s.length)),super({idBlock:{isConstructed:n.isConstructed,...e},lenBlock:{...t,isIndefiniteForm:!!n.isIndefiniteForm},...n},Qa),this.idBlock.tagClass=1,this.idBlock.tagNumber=3}fromBER(e,t,n){return this.valueBlock.isConstructed=this.idBlock.isConstructed,this.valueBlock.isIndefiniteForm=this.lenBlock.isIndefiniteForm,super.fromBER(e,t,n)}onAsciiEncoding(){if(this.valueBlock.isConstructed||this.valueBlock.value&&this.valueBlock.value.length)return Na.prototype.onAsciiEncoding.call(this);{const e=[],t=this.valueBlock.valueHexView;for(const n of t)e.push(n.toString(2).padStart(8,"0"));const n=e.join("");return`${this.constructor.NAME} : ${n.substring(0,n.length-this.valueBlock.unusedBits)}`}}}function Za(e,t){const n=new Uint8Array([0]),r=new Uint8Array(e),s=new Uint8Array(t);let i=r.slice(0);const o=i.length-1,a=s.slice(0),c=a.length-1;let l=0;let u=0;for(let e=c<o?o:c;e>=0;e--,u++){if(!0==u<a.length)l=i[o-u]+a[c-u]+n[0];else l=i[o-u]+n[0];if(n[0]=l/10,!0==u>=i.length)i=Zo(new Uint8Array([l%10]),i);else i[o-u]=l%10}return n[0]>0&&(i=Zo(n,i)),i}function Xa(e){if(e>=ia.length)for(let t=ia.length;t<=e;t++){const e=new Uint8Array([0]);let n=ia[t-1].slice(0);for(let t=n.length-1;t>=0;t--){const r=new Uint8Array([(n[t]<<1)+e[0]]);e[0]=r[0]/10,n[t]=r[0]%10}e[0]>0&&(n=Zo(e,n)),ia.push(n)}return ia[e]}function ec(e,t){let n=0;const r=new Uint8Array(e),s=new Uint8Array(t),i=r.slice(0),o=i.length-1,a=s.slice(0),c=a.length-1;let l,u=0;for(let e=c;e>=0;e--,u++)if(l=i[o-u]-a[c-u]-n,!0==l<0)n=1,i[o-u]=l+10;else n=0,i[o-u]=l;if(n>0)for(let e=o-c+1;e>=0;e--,u++){if(l=i[o-u]-n,!(l<0)){n=0,i[o-u]=l;break}n=1,i[o-u]=l+10}return i.slice()}Ka=Ja,wa.BitString=Ka,Ja.NAME=da;class tc extends(pa(ga)){constructor({value:e,...t}={}){super(t),this._valueDec=0,t.valueHex&&this.setValueHex(),void 0!==e&&(this.valueDec=e)}setValueHex(){this.valueHexView.length>=4?(this.warnings.push("Too big Integer for decoding, hex only"),this.isHexOnly=!0,this._valueDec=0):(this.isHexOnly=!1,this.valueHexView.length>0&&(this._valueDec=Xo.call(this)))}set valueDec(e){this._valueDec=e,this.isHexOnly=!1,this.valueHexView=new Uint8Array(function(e){const t=e<0?-1*e:e;let n=128;for(let r=1;r<8;r++){if(t<=n){if(e<0){const e=Jo(n-t,8,r);return new Uint8Array(e)[0]|=128,e}let s=Jo(t,8,r),i=new Uint8Array(s);if(128&i[0]){const e=s.slice(0),t=new Uint8Array(e);s=new ArrayBuffer(s.byteLength+1),i=new Uint8Array(s);for(let n=0;n<e.byteLength;n++)i[n+1]=t[n];i[0]=0}return s}n*=Math.pow(2,8)}return new ArrayBuffer(0)}(e))}get valueDec(){return this._valueDec}fromDER(e,t,n,r=0){const s=this.fromBER(e,t,n);if(-1===s)return s;const i=this.valueHexView;return 0===i[0]&&128&i[1]?this.valueHexView=i.subarray(1):0!==r&&i.length<r&&(r-i.length>1&&(r=i.length+1),this.valueHexView=i.subarray(r-i.length)),s}toDER(e=!1){const t=this.valueHexView;switch(!0){case!!(128&t[0]):{const e=new Uint8Array(this.valueHexView.length+1);e[0]=0,e.set(t,1),this.valueHexView=e}break;case 0===t[0]&&!(128&t[1]):this.valueHexView=this.valueHexView.subarray(1)}return this.toBER(e)}fromBER(e,t,n){const r=super.fromBER(e,t,n);return-1===r||this.setValueHex(),r}toBER(e){return e?new ArrayBuffer(this.valueHexView.length):this.valueHexView.slice().buffer}toJSON(){return{...super.toJSON(),valueDec:this.valueDec}}toString(){const e=8*this.valueHexView.length-1;let t,n=new Uint8Array(8*this.valueHexView.length/3),r=0;const s=this.valueHexView;let i="",o=!1;for(let o=s.byteLength-1;o>=0;o--){t=s[o];for(let s=0;s<8;s++){if(!(1&~t))if(r===e)n=ec(Xa(r),n),i="-";else n=Za(n,Xa(r));r++,t>>=1}}for(let e=0;e<n.length;e++)n[e]&&(o=!0),o&&(i+=oa.charAt(n[e]));return!1===o&&(i+=oa.charAt(0)),i}}$a=tc,tc.NAME="IntegerValueBlock",Object.defineProperty($a.prototype,"valueHex",{set:function(e){this.valueHexView=new Uint8Array(e),this.setValueHex()},get:function(){return this.valueHexView.slice().buffer}});class nc extends ba{constructor(e={}){super(e,tc),this.idBlock.tagClass=1,this.idBlock.tagNumber=2}toBigInt(){return ta(),BigInt(this.valueBlock.toString())}static fromBigInt(e){ta();const t=BigInt(e),n=new sa,r=t.toString(16).replace(/^-/,""),s=new Uint8Array(Yo.FromHex(r));if(t<0){const e=new Uint8Array(s.length+(128&s[0]?1:0));e[0]|=128;const r=BigInt(`0x${Yo.ToHex(e)}`)+t,i=Go.toUint8Array(Yo.FromHex(r.toString(16)));i[0]|=128,n.write(i)}else 128&s[0]&&n.write(new Uint8Array([0])),n.write(s);return new nc({valueHex:n.final()})}convertToDER(){const e=new nc({valueHex:this.valueBlock.valueHexView});return e.valueBlock.toDER(),e}convertFromDER(){return new nc({valueHex:0===this.valueBlock.valueHexView[0]?this.valueBlock.valueHexView.subarray(1):this.valueBlock.valueHexView})}onAsciiEncoding(){return`${this.constructor.NAME} : ${this.valueBlock.toString()}`}}qa=nc,wa.Integer=qa,nc.NAME="INTEGER";class rc extends nc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=10}}Ha=rc,wa.Enumerated=Ha,rc.NAME="ENUMERATED";class sc extends(pa(ga)){constructor({valueDec:e=-1,isFirstSid:t=!1,...n}={}){super(n),this.valueDec=e,this.isFirstSid=t}fromBER(e,t,n){if(!n)return t;const r=Go.toUint8Array(e);if(!ra(this,r,t,n))return-1;const s=r.subarray(t,t+n);this.valueHexView=new Uint8Array(n);for(let e=0;e<n&&(this.valueHexView[e]=127&s[e],this.blockLength++,128&s[e]);e++);const i=new Uint8Array(this.blockLength);for(let e=0;e<this.blockLength;e++)i[e]=this.valueHexView[e];return this.valueHexView=i,128&s[this.blockLength-1]?(this.error="End of input reached before message was fully decoded",-1):(0===this.valueHexView[0]&&this.warnings.push("Needlessly long format of SID encoding"),this.blockLength<=8?this.valueDec=Qo(this.valueHexView,7):(this.isHexOnly=!0,this.warnings.push("Too big SID for decoding, hex only")),t+this.blockLength)}set valueBigInt(e){ta();let t=BigInt(e).toString(2);for(;t.length%7;)t="0"+t;const n=new Uint8Array(t.length/7);for(let e=0;e<n.length;e++)n[e]=parseInt(t.slice(7*e,7*e+7),2)+(e+1<n.length?128:0);this.fromBER(n.buffer,0,n.length)}toBER(e){if(this.isHexOnly){if(e)return new ArrayBuffer(this.valueHexView.byteLength);const t=this.valueHexView,n=new Uint8Array(this.blockLength);for(let e=0;e<this.blockLength-1;e++)n[e]=128|t[e];return n[this.blockLength-1]=t[this.blockLength-1],n.buffer}const t=Jo(this.valueDec,7);if(0===t.byteLength)return this.error="Error during encoding SID value",ca;const n=new Uint8Array(t.byteLength);if(!e){const e=new Uint8Array(t),r=t.byteLength-1;for(let t=0;t<r;t++)n[t]=128|e[t];n[r]=e[r]}return n}toString(){let e="";if(this.isHexOnly)e=Yo.ToHex(this.valueHexView);else if(this.isFirstSid){let t=this.valueDec;this.valueDec<=39?e="0.":this.valueDec<=79?(e="1.",t-=40):(e="2.",t-=80),e+=t.toString()}else e=this.valueDec.toString();return e}toJSON(){return{...super.toJSON(),valueDec:this.valueDec,isFirstSid:this.isFirstSid}}}sc.NAME="sidBlock";class ic extends ga{constructor({value:e="",...t}={}){super(t),this.value=[],e&&this.fromString(e)}fromBER(e,t,n){let r=t;for(;n>0;){const t=new sc;if(r=t.fromBER(e,r,n),-1===r)return this.blockLength=0,this.error=t.error,r;0===this.value.length&&(t.isFirstSid=!0),this.blockLength+=t.blockLength,n-=t.blockLength,this.value.push(t)}return r}toBER(e){const t=[];for(let n=0;n<this.value.length;n++){const r=this.value[n].toBER(e);if(0===r.byteLength)return this.error=this.value[n].error,ca;t.push(r)}return na(t)}fromString(e){this.value=[];let t=0,n=0,r="",s=!1;do{if(n=e.indexOf(".",t),r=-1===n?e.substring(t):e.substring(t,n),t=n+1,s){const e=this.value[0];let t=0;switch(e.valueDec){case 0:break;case 1:t=40;break;case 2:t=80;break;default:return void(this.value=[])}const n=parseInt(r,10);if(isNaN(n))return;e.valueDec=n+t,s=!1}else{const e=new sc;if(r>Number.MAX_SAFE_INTEGER){ta();const t=BigInt(r);e.valueBigInt=t}else if(e.valueDec=parseInt(r,10),isNaN(e.valueDec))return;this.value.length||(e.isFirstSid=!0,s=!0),this.value.push(e)}}while(-1!==n)}toString(){let e="",t=!1;for(let n=0;n<this.value.length;n++){t=this.value[n].isHexOnly;let r=this.value[n].toString();0!==n&&(e=`${e}.`),t?(r=`{${r}}`,this.value[n].isFirstSid?e=`2.{${r} - 80}`:e+=r):e+=r}return e}toJSON(){const e={...super.toJSON(),value:this.toString(),sidArray:[]};for(let t=0;t<this.value.length;t++)e.sidArray.push(this.value[t].toJSON());return e}}ic.NAME="ObjectIdentifierValueBlock";class oc extends ba{constructor(e={}){super(e,ic),this.idBlock.tagClass=1,this.idBlock.tagNumber=6}getValue(){return this.valueBlock.toString()}setValue(e){this.valueBlock.fromString(e)}onAsciiEncoding(){return`${this.constructor.NAME} : ${this.valueBlock.toString()||"empty"}`}toJSON(){return{...super.toJSON(),value:this.getValue()}}}za=oc,wa.ObjectIdentifier=za,oc.NAME="OBJECT IDENTIFIER";class ac extends(pa(fa)){constructor({valueDec:e=0,...t}={}){super(t),this.valueDec=e}fromBER(e,t,n){if(0===n)return t;const r=Go.toUint8Array(e);if(!ra(this,r,t,n))return-1;const s=r.subarray(t,t+n);this.valueHexView=new Uint8Array(n);for(let e=0;e<n&&(this.valueHexView[e]=127&s[e],this.blockLength++,128&s[e]);e++);const i=new Uint8Array(this.blockLength);for(let e=0;e<this.blockLength;e++)i[e]=this.valueHexView[e];return this.valueHexView=i,128&s[this.blockLength-1]?(this.error="End of input reached before message was fully decoded",-1):(0===this.valueHexView[0]&&this.warnings.push("Needlessly long format of SID encoding"),this.blockLength<=8?this.valueDec=Qo(this.valueHexView,7):(this.isHexOnly=!0,this.warnings.push("Too big SID for decoding, hex only")),t+this.blockLength)}toBER(e){if(this.isHexOnly){if(e)return new ArrayBuffer(this.valueHexView.byteLength);const t=this.valueHexView,n=new Uint8Array(this.blockLength);for(let e=0;e<this.blockLength-1;e++)n[e]=128|t[e];return n[this.blockLength-1]=t[this.blockLength-1],n.buffer}const t=Jo(this.valueDec,7);if(0===t.byteLength)return this.error="Error during encoding SID value",ca;const n=new Uint8Array(t.byteLength);if(!e){const e=new Uint8Array(t),r=t.byteLength-1;for(let t=0;t<r;t++)n[t]=128|e[t];n[r]=e[r]}return n.buffer}toString(){let e="";return e=this.isHexOnly?Yo.ToHex(this.valueHexView):this.valueDec.toString(),e}toJSON(){return{...super.toJSON(),valueDec:this.valueDec}}}ac.NAME="relativeSidBlock";class cc extends ga{constructor({value:e="",...t}={}){super(t),this.value=[],e&&this.fromString(e)}fromBER(e,t,n){let r=t;for(;n>0;){const t=new ac;if(r=t.fromBER(e,r,n),-1===r)return this.blockLength=0,this.error=t.error,r;this.blockLength+=t.blockLength,n-=t.blockLength,this.value.push(t)}return r}toBER(e,t){const n=[];for(let t=0;t<this.value.length;t++){const r=this.value[t].toBER(e);if(0===r.byteLength)return this.error=this.value[t].error,ca;n.push(r)}return na(n)}fromString(e){this.value=[];let t=0,n=0,r="";do{n=e.indexOf(".",t),r=-1===n?e.substring(t):e.substring(t,n),t=n+1;const s=new ac;if(s.valueDec=parseInt(r,10),isNaN(s.valueDec))return!0;this.value.push(s)}while(-1!==n);return!0}toString(){let e="",t=!1;for(let n=0;n<this.value.length;n++){t=this.value[n].isHexOnly;let r=this.value[n].toString();0!==n&&(e=`${e}.`),t?(r=`{${r}}`,e+=r):e+=r}return e}toJSON(){const e={...super.toJSON(),value:this.toString(),sidArray:[]};for(let t=0;t<this.value.length;t++)e.sidArray.push(this.value[t].toJSON());return e}}cc.NAME="RelativeObjectIdentifierValueBlock";class lc extends ba{constructor(e={}){super(e,cc),this.idBlock.tagClass=1,this.idBlock.tagNumber=13}getValue(){return this.valueBlock.toString()}setValue(e){this.valueBlock.fromString(e)}onAsciiEncoding(){return`${this.constructor.NAME} : ${this.valueBlock.toString()||"empty"}`}toJSON(){return{...super.toJSON(),value:this.getValue()}}}Wa=lc,wa.RelativeObjectIdentifier=Wa,lc.NAME="RelativeObjectIdentifier";class uc extends Na{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=16}}ja=uc,wa.Sequence=ja,uc.NAME="SEQUENCE";let hc=class extends Na{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=17}};Ga=hc,wa.Set=Ga,hc.NAME="SET";class dc extends(pa(ga)){constructor({...e}={}){super(e),this.isHexOnly=!0,this.value=aa}toJSON(){return{...super.toJSON(),value:this.value}}}dc.NAME="StringValueBlock";class pc extends dc{}pc.NAME="SimpleStringValueBlock";class fc extends Ea{constructor({...e}={}){super(e,pc)}fromBuffer(e){this.valueBlock.value=String.fromCharCode.apply(null,Go.toUint8Array(e))}fromString(e){const t=e.length,n=this.valueBlock.valueHexView=new Uint8Array(t);for(let r=0;r<t;r++)n[r]=e.charCodeAt(r);this.valueBlock.value=e}}fc.NAME="SIMPLE STRING";class gc extends fc{fromBuffer(e){this.valueBlock.valueHexView=Go.toUint8Array(e);try{this.valueBlock.value=Yo.ToUtf8String(e)}catch(t){this.warnings.push(`Error during "decodeURIComponent": ${t}, using raw string`),this.valueBlock.value=Yo.ToBinary(e)}}fromString(e){this.valueBlock.valueHexView=new Uint8Array(Yo.FromUtf8String(e)),this.valueBlock.value=e}}var mc,yc,wc,bc,vc,Ec,Sc,_c,Ic,Rc,Ac,Tc,Dc,kc,Pc,Cc,xc,Nc,Mc;gc.NAME="Utf8StringValueBlock";class Oc extends gc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=12}}mc=Oc,wa.Utf8String=mc,Oc.NAME="UTF8String";class Lc extends fc{fromBuffer(e){this.valueBlock.value=Yo.ToUtf16String(e),this.valueBlock.valueHexView=Go.toUint8Array(e)}fromString(e){this.valueBlock.value=e,this.valueBlock.valueHexView=new Uint8Array(Yo.FromUtf16String(e))}}Lc.NAME="BmpStringValueBlock";class Bc extends Lc{constructor({...e}={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=30}}yc=Bc,wa.BmpString=yc,Bc.NAME="BMPString";class Uc extends fc{fromBuffer(e){const t=ArrayBuffer.isView(e)?e.slice().buffer:e.slice(0),n=new Uint8Array(t);for(let e=0;e<n.length;e+=4)n[e]=n[e+3],n[e+1]=n[e+2],n[e+2]=0,n[e+3]=0;this.valueBlock.value=String.fromCharCode.apply(null,new Uint32Array(t))}fromString(e){const t=e.length,n=this.valueBlock.valueHexView=new Uint8Array(4*t);for(let r=0;r<t;r++){const t=Jo(e.charCodeAt(r),8),s=new Uint8Array(t);if(s.length>4)continue;const i=4-s.length;for(let e=s.length-1;e>=0;e--)n[4*r+e+i]=s[e]}this.valueBlock.value=e}}Uc.NAME="UniversalStringValueBlock";class Fc extends Uc{constructor({...e}={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=28}}wc=Fc,wa.UniversalString=wc,Fc.NAME="UniversalString";class Vc extends fc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=18}}bc=Vc,wa.NumericString=bc,Vc.NAME="NumericString";class Kc extends fc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=19}}vc=Kc,wa.PrintableString=vc,Kc.NAME="PrintableString";class $c extends fc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=20}}Ec=$c,wa.TeletexString=Ec,$c.NAME="TeletexString";class qc extends fc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=21}}Sc=qc,wa.VideotexString=Sc,qc.NAME="VideotexString";class Hc extends fc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=22}}_c=Hc,wa.IA5String=_c,Hc.NAME="IA5String";class zc extends fc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=25}}Ic=zc,wa.GraphicString=Ic,zc.NAME="GraphicString";class Wc extends fc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=26}}Rc=Wc,wa.VisibleString=Rc,Wc.NAME="VisibleString";class jc extends fc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=27}}Ac=jc,wa.GeneralString=Ac,jc.NAME="GeneralString";class Gc extends fc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=29}}Tc=Gc,wa.CharacterString=Tc,Gc.NAME="CharacterString";class Yc extends Wc{constructor({value:e,valueDate:t,...n}={}){if(super(n),this.year=0,this.month=0,this.day=0,this.hour=0,this.minute=0,this.second=0,e){this.fromString(e),this.valueBlock.valueHexView=new Uint8Array(e.length);for(let t=0;t<e.length;t++)this.valueBlock.valueHexView[t]=e.charCodeAt(t)}t&&(this.fromDate(t),this.valueBlock.valueHexView=new Uint8Array(this.toBuffer())),this.idBlock.tagClass=1,this.idBlock.tagNumber=23}fromBuffer(e){this.fromString(String.fromCharCode.apply(null,Go.toUint8Array(e)))}toBuffer(){const e=this.toString(),t=new ArrayBuffer(e.length),n=new Uint8Array(t);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t);return t}fromDate(e){this.year=e.getUTCFullYear(),this.month=e.getUTCMonth()+1,this.day=e.getUTCDate(),this.hour=e.getUTCHours(),this.minute=e.getUTCMinutes(),this.second=e.getUTCSeconds()}toDate(){return new Date(Date.UTC(this.year,this.month-1,this.day,this.hour,this.minute,this.second))}fromString(e){const t=/(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})Z/gi.exec(e);if(null===t)return void(this.error="Wrong input string for conversion");const n=parseInt(t[1],10);this.year=n>=50?1900+n:2e3+n,this.month=parseInt(t[2],10),this.day=parseInt(t[3],10),this.hour=parseInt(t[4],10),this.minute=parseInt(t[5],10),this.second=parseInt(t[6],10)}toString(e="iso"){if("iso"===e){const e=new Array(7);return e[0]=ea(this.year<2e3?this.year-1900:this.year-2e3,2),e[1]=ea(this.month,2),e[2]=ea(this.day,2),e[3]=ea(this.hour,2),e[4]=ea(this.minute,2),e[5]=ea(this.second,2),e[6]="Z",e.join("")}return super.toString(e)}onAsciiEncoding(){return`${this.constructor.NAME} : ${this.toDate().toISOString()}`}toJSON(){return{...super.toJSON(),year:this.year,month:this.month,day:this.day,hour:this.hour,minute:this.minute,second:this.second}}}Dc=Yc,wa.UTCTime=Dc,Yc.NAME="UTCTime";class Qc extends Yc{constructor(e={}){var t;super(e),null!==(t=this.millisecond)&&void 0!==t||(this.millisecond=0),this.idBlock.tagClass=1,this.idBlock.tagNumber=24}fromDate(e){super.fromDate(e),this.millisecond=e.getUTCMilliseconds()}toDate(){return new Date(Date.UTC(this.year,this.month-1,this.day,this.hour,this.minute,this.second,this.millisecond))}fromString(e){let t,n=!1,r="",s="",i=0,o=0,a=0;if("Z"===e[e.length-1])r=e.substring(0,e.length-1),n=!0;else{const t=new Number(e[e.length-1]);if(isNaN(t.valueOf()))throw new Error("Wrong input string for conversion");r=e}if(n){if(-1!==r.indexOf("+"))throw new Error("Wrong input string for conversion");if(-1!==r.indexOf("-"))throw new Error("Wrong input string for conversion")}else{let e=1,t=r.indexOf("+"),n="";if(-1===t&&(t=r.indexOf("-"),e=-1),-1!==t){if(n=r.substring(t+1),r=r.substring(0,t),2!==n.length&&4!==n.length)throw new Error("Wrong input string for conversion");let s=parseInt(n.substring(0,2),10);if(isNaN(s.valueOf()))throw new Error("Wrong input string for conversion");if(o=e*s,4===n.length){if(s=parseInt(n.substring(2,4),10),isNaN(s.valueOf()))throw new Error("Wrong input string for conversion");a=e*s}}}let c=r.indexOf(".");if(-1===c&&(c=r.indexOf(",")),-1!==c){const e=new Number(`0${r.substring(c)}`);if(isNaN(e.valueOf()))throw new Error("Wrong input string for conversion");i=e.valueOf(),s=r.substring(0,c)}else s=r;switch(!0){case 8===s.length:if(t=/(\d{4})(\d{2})(\d{2})/gi,-1!==c)throw new Error("Wrong input string for conversion");break;case 10===s.length:if(t=/(\d{4})(\d{2})(\d{2})(\d{2})/gi,-1!==c){let e=60*i;this.minute=Math.floor(e),e=60*(e-this.minute),this.second=Math.floor(e),e=1e3*(e-this.second),this.millisecond=Math.floor(e)}break;case 12===s.length:if(t=/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})/gi,-1!==c){let e=60*i;this.second=Math.floor(e),e=1e3*(e-this.second),this.millisecond=Math.floor(e)}break;case 14===s.length:if(t=/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/gi,-1!==c){const e=1e3*i;this.millisecond=Math.floor(e)}break;default:throw new Error("Wrong input string for conversion")}const l=t.exec(s);if(null===l)throw new Error("Wrong input string for conversion");for(let e=1;e<l.length;e++)switch(e){case 1:this.year=parseInt(l[e],10);break;case 2:this.month=parseInt(l[e],10);break;case 3:this.day=parseInt(l[e],10);break;case 4:this.hour=parseInt(l[e],10)+o;break;case 5:this.minute=parseInt(l[e],10)+a;break;case 6:this.second=parseInt(l[e],10);break;default:throw new Error("Wrong input string for conversion")}if(!1===n){const e=new Date(this.year,this.month,this.day,this.hour,this.minute,this.second,this.millisecond);this.year=e.getUTCFullYear(),this.month=e.getUTCMonth(),this.day=e.getUTCDay(),this.hour=e.getUTCHours(),this.minute=e.getUTCMinutes(),this.second=e.getUTCSeconds(),this.millisecond=e.getUTCMilliseconds()}}toString(e="iso"){if("iso"===e){const e=[];return e.push(ea(this.year,4)),e.push(ea(this.month,2)),e.push(ea(this.day,2)),e.push(ea(this.hour,2)),e.push(ea(this.minute,2)),e.push(ea(this.second,2)),0!==this.millisecond&&(e.push("."),e.push(ea(this.millisecond,3))),e.push("Z"),e.join("")}return super.toString(e)}toJSON(){return{...super.toJSON(),millisecond:this.millisecond}}}kc=Qc,wa.GeneralizedTime=kc,Qc.NAME="GeneralizedTime";class Jc extends Oc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=31}}Pc=Jc,wa.DATE=Pc,Jc.NAME="DATE";class Zc extends Oc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=32}}Cc=Zc,wa.TimeOfDay=Cc,Zc.NAME="TimeOfDay";class Xc extends Oc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=33}}xc=Xc,wa.DateTime=xc,Xc.NAME="DateTime";class el extends Oc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=34}}Nc=el,wa.Duration=Nc,el.NAME="Duration";class tl extends Oc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=14}}function nl(e){let t=e.toString(16);t.length%2>0&&(t=`0${t}`);const n=t.length/2,r=new Uint8Array(n);let s=0,i=0;for(;s<n;)r[s]=parseInt(t.slice(i,i+2),16),s+=1,i+=2;return r}function rl(e){const t=[];return e.forEach((function(e){let n=e.toString(16);n.length%2>0&&(n=`0${n}`),t.push(n)})),BigInt("0x"+t.join(""))}Mc=tl,wa.TIME=Mc,tl.NAME="TIME";async function sl(e,t){const n=Ro.get(),r=new uc({value:[new nc({value:0}),new uc({value:[new oc({value:"1.2.840.113549.1.1.1"}),new La]}),new Ya({valueHex:e.marshal()})]}).toBER(),s=new Uint8Array(r,0,r.byteLength),i=Lo(16),o=await async function(e,t,n,r){const{c:s,dkLen:i,asyncTick:o,DK:a,PRF:c,PRFSalt:l}=Fo(e,t,n,r);let u;const h=new Uint8Array(4),d=Os(h),p=new Uint8Array(c.outputLen);for(let e=1,t=0;t<i;e++,t+=c.outputLen){const n=a.subarray(t,t+c.outputLen);d.setInt32(0,e,!1),(u=l._cloneInto(u)).update(h).digestInto(p),n.set(p.subarray(0,n.length)),await Us(s-1,o,(()=>{c._cloneInto(u).update(p).digestInto(p);for(let e=0;e<n.length;e++)n[e]^=p[e]}))}return function(e,t,n,r,s){return e.destroy(),t.destroy(),r&&r.destroy(),s.fill(0),n}(c,l,a,u,p)}
|
|
52
52
|
/*!
|
|
53
53
|
* MIT License
|
|
54
54
|
*
|
|
@@ -72,12 +72,12 @@ function Go(e,t){let n=0;if(1===e.length)return e[0];for(let r=e.length-1;r>=0;r
|
|
|
72
72
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
73
73
|
* SOFTWARE.
|
|
74
74
|
*
|
|
75
|
-
*/(
|
|
76
|
-
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const{bytesToNumberBE:ml,hexToBytes:yl}=Ai,wl={Err:class extends Error{constructor(e=""){super(e)}},_parseInt(e){const{Err:t}=wl;if(e.length<2||2!==e[0])throw new t("Invalid signature integer tag");const n=e[1],r=e.subarray(2,n+2);if(!n||r.length!==n)throw new t("Invalid signature integer: wrong length");if(128&r[0])throw new t("Invalid signature integer: negative");if(0===r[0]&&!(128&r[1]))throw new t("Invalid signature integer: unnecessary leading zero");return{d:ml(r),l:e.subarray(n+2)}},toSig(e){const{Err:t}=wl,n="string"==typeof e?yl(e):e;oi(n);let r=n.length;if(r<2||48!=n[0])throw new t("Invalid signature tag");if(n[1]!==r-2)throw new t("Invalid signature: incorrect length");const{d:s,l:i}=wl._parseInt(n.subarray(2)),{d:o,l:a}=wl._parseInt(i);if(a.length)throw new t("Invalid signature: left bytes after parsing");return{r:s,s:o}},hexFromSig(e){const t=e=>8&Number.parseInt(e[0],16)?"00"+e:e,n=e=>{const t=e.toString(16);return 1&t.length?`0${t}`:t},r=t(n(e.s)),s=t(n(e.r)),i=r.length/2,o=s.length/2,a=n(i),c=n(o);return`30${n(o+i+4)}02${c}${s}02${a}${r}`}},bl=BigInt(0),vl=BigInt(1);BigInt(2);const El=BigInt(3);function Sl(e){const t=function(e){const t=ji(e);Ri(t,{a:"field",b:"field"},{allowedPrivateKeyLengths:"array",wrapPrivateKey:"boolean",isTorsionFree:"function",clearCofactor:"function",allowInfinityPoint:"boolean",fromBytes:"function",toBytes:"function"});const{endo:n,Fp:r,a:s}=t;if(n){if(!r.eql(s,r.ZERO))throw new Error("Endomorphism can only be defined for Koblitz curves that have a=0");if("object"!=typeof n||"bigint"!=typeof n.beta||"function"!=typeof n.splitScalar)throw new Error("Expected endomorphism with beta: bigint and splitScalar: function")}return Object.freeze({...t})}(e),{Fp:n}=t,r=t.toBytes||((e,t,r)=>{const s=t.toAffine();return bi(Uint8Array.from([4]),n.toBytes(s.x),n.toBytes(s.y))}),s=t.fromBytes||(e=>{const t=e.subarray(1);return{x:n.fromBytes(t.subarray(0,n.BYTES)),y:n.fromBytes(t.subarray(n.BYTES,2*n.BYTES))}});function i(e){const{a:r,b:s}=t,i=n.sqr(e),o=n.mul(i,e);return n.add(n.add(o,n.mul(e,r)),s)}if(!n.eql(n.sqr(t.Gy),i(t.Gx)))throw new Error("bad generator point: equation left != right");function o(e){return"bigint"==typeof e&&bl<e&&e<t.n}function a(e){if(!o(e))throw new Error("Expected valid bigint: 0 < bigint < curve.n")}function c(e){const{allowedPrivateKeyLengths:n,nByteLength:r,wrapPrivateKey:s,n:i}=t;if(n&&"bigint"!=typeof e){if(ii(e)&&(e=ci(e)),"string"!=typeof e||!n.includes(e.length))throw new Error("Invalid key");e=e.padStart(2*r,"0")}let o;try{o="bigint"==typeof e?e:fi(wi("private key",e,r))}catch(t){throw new Error(`private key must be ${r} bytes, hex or bigint, not ${typeof e}`)}return s&&(o=Mi(o,i)),a(o),o}const l=new Map;function u(e){if(!(e instanceof h))throw new Error("ProjectivePoint expected")}class h{constructor(e,t,r){if(this.px=e,this.py=t,this.pz=r,null==e||!n.isValid(e))throw new Error("x required");if(null==t||!n.isValid(t))throw new Error("y required");if(null==r||!n.isValid(r))throw new Error("z required")}static fromAffine(e){const{x:t,y:r}=e||{};if(!e||!n.isValid(t)||!n.isValid(r))throw new Error("invalid affine point");if(e instanceof h)throw new Error("projective point not allowed");const s=e=>n.eql(e,n.ZERO);return s(t)&&s(r)?h.ZERO:new h(t,r,n.ONE)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}static normalizeZ(e){const t=n.invertBatch(e.map((e=>e.pz)));return e.map(((e,n)=>e.toAffine(t[n]))).map(h.fromAffine)}static fromHex(e){const t=h.fromAffine(s(wi("pointHex",e)));return t.assertValidity(),t}static fromPrivateKey(e){return h.BASE.multiply(c(e))}_setWindowSize(e){this._WINDOW_SIZE=e,l.delete(this)}assertValidity(){if(this.is0()){if(t.allowInfinityPoint&&!n.is0(this.py))return;throw new Error("bad point: ZERO")}const{x:e,y:r}=this.toAffine();if(!n.isValid(e)||!n.isValid(r))throw new Error("bad point: x or y not FE");const s=n.sqr(r),o=i(e);if(!n.eql(s,o))throw new Error("bad point: equation left != right");if(!this.isTorsionFree())throw new Error("bad point: not in prime-order subgroup")}hasEvenY(){const{y:e}=this.toAffine();if(n.isOdd)return!n.isOdd(e);throw new Error("Field doesn't support isOdd")}equals(e){u(e);const{px:t,py:r,pz:s}=this,{px:i,py:o,pz:a}=e,c=n.eql(n.mul(t,a),n.mul(i,s)),l=n.eql(n.mul(r,a),n.mul(o,s));return c&&l}negate(){return new h(this.px,n.neg(this.py),this.pz)}double(){const{a:e,b:r}=t,s=n.mul(r,El),{px:i,py:o,pz:a}=this;let c=n.ZERO,l=n.ZERO,u=n.ZERO,d=n.mul(i,i),p=n.mul(o,o),f=n.mul(a,a),g=n.mul(i,o);return g=n.add(g,g),u=n.mul(i,a),u=n.add(u,u),c=n.mul(e,u),l=n.mul(s,f),l=n.add(c,l),c=n.sub(p,l),l=n.add(p,l),l=n.mul(c,l),c=n.mul(g,c),u=n.mul(s,u),f=n.mul(e,f),g=n.sub(d,f),g=n.mul(e,g),g=n.add(g,u),u=n.add(d,d),d=n.add(u,d),d=n.add(d,f),d=n.mul(d,g),l=n.add(l,d),f=n.mul(o,a),f=n.add(f,f),d=n.mul(f,g),c=n.sub(c,d),u=n.mul(f,p),u=n.add(u,u),u=n.add(u,u),new h(c,l,u)}add(e){u(e);const{px:r,py:s,pz:i}=this,{px:o,py:a,pz:c}=e;let l=n.ZERO,d=n.ZERO,p=n.ZERO;const f=t.a,g=n.mul(t.b,El);let m=n.mul(r,o),y=n.mul(s,a),w=n.mul(i,c),b=n.add(r,s),v=n.add(o,a);b=n.mul(b,v),v=n.add(m,y),b=n.sub(b,v),v=n.add(r,i);let E=n.add(o,c);return v=n.mul(v,E),E=n.add(m,w),v=n.sub(v,E),E=n.add(s,i),l=n.add(a,c),E=n.mul(E,l),l=n.add(y,w),E=n.sub(E,l),p=n.mul(f,v),l=n.mul(g,w),p=n.add(l,p),l=n.sub(y,p),p=n.add(y,p),d=n.mul(l,p),y=n.add(m,m),y=n.add(y,m),w=n.mul(f,w),v=n.mul(g,v),y=n.add(y,w),w=n.sub(m,w),w=n.mul(f,w),v=n.add(v,w),m=n.mul(y,v),d=n.add(d,m),m=n.mul(E,v),l=n.mul(b,l),l=n.sub(l,m),m=n.mul(b,y),p=n.mul(E,p),p=n.add(p,m),new h(l,d,p)}subtract(e){return this.add(e.negate())}is0(){return this.equals(h.ZERO)}wNAF(e){return p.wNAFCached(this,l,e,(e=>{const t=n.invertBatch(e.map((e=>e.pz)));return e.map(((e,n)=>e.toAffine(t[n]))).map(h.fromAffine)}))}multiplyUnsafe(e){const r=h.ZERO;if(e===bl)return r;if(a(e),e===vl)return this;const{endo:s}=t;if(!s)return p.unsafeLadder(this,e);let{k1neg:i,k1:o,k2neg:c,k2:l}=s.splitScalar(e),u=r,d=r,f=this;for(;o>bl||l>bl;)o&vl&&(u=u.add(f)),l&vl&&(d=d.add(f)),f=f.double(),o>>=vl,l>>=vl;return i&&(u=u.negate()),c&&(d=d.negate()),d=new h(n.mul(d.px,s.beta),d.py,d.pz),u.add(d)}multiply(e){a(e);let r,s,i=e;const{endo:o}=t;if(o){const{k1neg:e,k1:t,k2neg:a,k2:c}=o.splitScalar(i);let{p:l,f:u}=this.wNAF(t),{p:d,f:f}=this.wNAF(c);l=p.constTimeNegate(e,l),d=p.constTimeNegate(a,d),d=new h(n.mul(d.px,o.beta),d.py,d.pz),r=l.add(d),s=u.add(f)}else{const{p:e,f:t}=this.wNAF(i);r=e,s=t}return h.normalizeZ([r,s])[0]}multiplyAndAddUnsafe(e,t,n){const r=h.BASE,s=(e,t)=>t!==bl&&t!==vl&&e.equals(r)?e.multiply(t):e.multiplyUnsafe(t),i=s(this,t).add(s(e,n));return i.is0()?void 0:i}toAffine(e){const{px:t,py:r,pz:s}=this,i=this.is0();null==e&&(e=i?n.ONE:n.inv(s));const o=n.mul(t,e),a=n.mul(r,e),c=n.mul(s,e);if(i)return{x:n.ZERO,y:n.ZERO};if(!n.eql(c,n.ONE))throw new Error("invZ was invalid");return{x:o,y:a}}isTorsionFree(){const{h:e,isTorsionFree:n}=t;if(e===vl)return!0;if(n)return n(h,this);throw new Error("isTorsionFree() has not been declared for the elliptic curve")}clearCofactor(){const{h:e,clearCofactor:n}=t;return e===vl?this:n?n(h,this):this.multiplyUnsafe(t.h)}toRawBytes(e=!0){return this.assertValidity(),r(h,this,e)}toHex(e=!0){return ci(this.toRawBytes(e))}}h.BASE=new h(t.Gx,t.Gy,n.ONE),h.ZERO=new h(n.ZERO,n.ONE,n.ZERO);const d=t.nBitLength,p=Wi(h,t.endo?Math.ceil(d/2):d);return{CURVE:t,ProjectivePoint:h,normPrivateKeyToScalar:c,weierstrassEquation:i,isWithinCurveOrder:o}}function _l(e){const t=function(e){const t=ji(e);return Ri(t,{hash:"hash",hmac:"function",randomBytes:"function"},{bits2int:"function",bits2int_modN:"function",lowS:"boolean"}),Object.freeze({lowS:!0,...t})}(e),{Fp:n,n:r}=t,s=n.BYTES+1,i=2*n.BYTES+1;function o(e){return Mi(e,r)}function a(e){return Bi(e,r)}const{ProjectivePoint:c,normPrivateKeyToScalar:l,weierstrassEquation:u,isWithinCurveOrder:h}=Sl({...t,toBytes(e,t,r){const s=t.toAffine(),i=n.toBytes(s.x),o=bi;return r?o(Uint8Array.from([t.hasEvenY()?2:3]),i):o(Uint8Array.from([4]),i,n.toBytes(s.y))},fromBytes(e){const t=e.length,r=e[0],o=e.subarray(1);if(t!==s||2!==r&&3!==r){if(t===i&&4===r){return{x:n.fromBytes(o.subarray(0,n.BYTES)),y:n.fromBytes(o.subarray(n.BYTES,2*n.BYTES))}}throw new Error(`Point of length ${t} was invalid. Expected ${s} compressed bytes or ${i} uncompressed bytes`)}{const e=fi(o);if(!(bl<(a=e)&&a<n.ORDER))throw new Error("Point is not on curve");const t=u(e);let s;try{s=n.sqrt(t)}catch(e){const t=e instanceof Error?": "+e.message:"";throw new Error("Point is not on curve"+t)}return!(1&~r)!==((s&vl)===vl)&&(s=n.neg(s)),{x:e,y:s}}var a}}),d=e=>ci(mi(e,t.nByteLength));function p(e){return e>r>>vl}const f=(e,t,n)=>fi(e.slice(t,n));class g{constructor(e,t,n){this.r=e,this.s=t,this.recovery=n,this.assertValidity()}static fromCompact(e){const n=t.nByteLength;return e=wi("compactSignature",e,2*n),new g(f(e,0,n),f(e,n,2*n))}static fromDER(e){const{r:t,s:n}=wl.toSig(wi("DER",e));return new g(t,n)}assertValidity(){if(!h(this.r))throw new Error("r must be 0 < r < CURVE.n");if(!h(this.s))throw new Error("s must be 0 < s < CURVE.n")}addRecoveryBit(e){return new g(this.r,this.s,e)}recoverPublicKey(e){const{r:r,s:s,recovery:i}=this,l=b(wi("msgHash",e));if(null==i||![0,1,2,3].includes(i))throw new Error("recovery id invalid");const u=2===i||3===i?r+t.n:r;if(u>=n.ORDER)throw new Error("recovery id 2 or 3 invalid");const h=1&i?"03":"02",p=c.fromHex(h+d(u)),f=a(u),g=o(-l*f),m=o(s*f),y=c.BASE.multiplyAndAddUnsafe(p,g,m);if(!y)throw new Error("point at infinify");return y.assertValidity(),y}hasHighS(){return p(this.s)}normalizeS(){return this.hasHighS()?new g(this.r,o(-this.s),this.recovery):this}toDERRawBytes(){return pi(this.toDERHex())}toDERHex(){return wl.hexFromSig({r:this.r,s:this.s})}toCompactRawBytes(){return pi(this.toCompactHex())}toCompactHex(){return d(this.r)+d(this.s)}}const m={isValidPrivateKey(e){try{return l(e),!0}catch(e){return!1}},normPrivateKeyToScalar:l,randomPrivateKey:()=>{const e=qi(t.n);return function(e,t,n=!1){const r=e.length,s=$i(t),i=qi(t);if(r<16||r<i||r>1024)throw new Error(`expected ${i}-1024 bytes of input, got ${r}`);const o=Mi(n?fi(e):gi(e),t-Di)+Di;return n?yi(o,s):mi(o,s)}(t.randomBytes(e),t.n)},precompute:(e=8,t=c.BASE)=>(t._setWindowSize(e),t.multiply(BigInt(3)),t)};function y(e){const t=ii(e),n="string"==typeof e,r=(t||n)&&e.length;return t?r===s||r===i:n?r===2*s||r===2*i:e instanceof c}const w=t.bits2int||function(e){const n=fi(e),r=8*e.length-t.nBitLength;return r>0?n>>BigInt(r):n},b=t.bits2int_modN||function(e){return o(w(e))},v=vi(t.nBitLength);function E(e){if("bigint"!=typeof e)throw new Error("bigint expected");if(!(bl<=e&&e<v))throw new Error(`bigint expected < 2^${t.nBitLength}`);return mi(e,t.nByteLength)}function S(e,r,s=_){if(["recovered","canonical"].some((e=>e in s)))throw new Error("sign() legacy options not supported");const{hash:i,randomBytes:u}=t;let{lowS:d,prehash:f,extraEntropy:m}=s;null==d&&(d=!0),e=wi("msgHash",e),f&&(e=wi("prehashed msgHash",i(e)));const y=b(e),v=l(r),S=[E(v),E(y)];if(null!=m&&!1!==m){const e=!0===m?u(n.BYTES):m;S.push(wi("extraEntropy",e))}const I=bi(...S),R=y;return{seed:I,k2sig:function(e){const t=w(e);if(!h(t))return;const n=a(t),r=c.BASE.multiply(t).toAffine(),s=o(r.x);if(s===bl)return;const i=o(n*o(R+s*v));if(i===bl)return;let l=(r.x===s?0:2)|Number(r.y&vl),u=i;return d&&p(i)&&(u=function(e){return p(e)?o(-e):e}(i),l^=1),new g(s,u,l)}}}const _={lowS:t.lowS,prehash:!1},I={lowS:t.lowS,prehash:!1};return c.BASE._setWindowSize(8),{CURVE:t,getPublicKey:function(e,t=!0){return c.fromPrivateKey(e).toRawBytes(t)},getSharedSecret:function(e,t,n=!0){if(y(e))throw new Error("first arg must be private key");if(!y(t))throw new Error("second arg must be public key");return c.fromHex(t).multiply(l(e)).toRawBytes(n)},sign:function(e,n,r=_){const{seed:s,k2sig:i}=S(e,n,r),o=t;return _i(o.hash.outputLen,o.nByteLength,o.hmac)(s,i)},verify:function(e,n,r,s=I){const i=e;if(n=wi("msgHash",n),r=wi("publicKey",r),"strict"in s)throw new Error("options.strict was renamed to lowS");const{lowS:l,prehash:u}=s;let h,d;try{if("string"==typeof i||ii(i))try{h=g.fromDER(i)}catch(e){if(!(e instanceof wl.Err))throw e;h=g.fromCompact(i)}else{if("object"!=typeof i||"bigint"!=typeof i.r||"bigint"!=typeof i.s)throw new Error("PARSE");{const{r:e,s:t}=i;h=new g(e,t)}}d=c.fromHex(r)}catch(e){if("PARSE"===e.message)throw new Error("signature must be Signature instance, Uint8Array or hex string");return!1}if(l&&h.hasHighS())return!1;u&&(n=t.hash(n));const{r:p,s:f}=h,m=b(n),y=a(f),w=o(m*y),v=o(p*y),E=c.BASE.multiplyAndAddUnsafe(d,w,v)?.toAffine();return!!E&&o(E.x)===p},ProjectivePoint:c,Signature:g,utils:m}}
|
|
77
|
-
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */function
|
|
75
|
+
*/(ri,t,i,{c:1e4,dkLen:32}),a=Lo(16),c=await n.subtle.importKey("raw",o,"AES-CBC",!1,["encrypt"]),l=await n.subtle.encrypt({name:"AES-CBC",iv:a},c,s),u=new uc({value:[new Ya({valueHex:i}),new nc({value:1e4}),new nc({value:32}),new uc({value:[new oc({value:"1.2.840.113549.2.11"}),new La]})]}),h=new uc({value:[new oc({value:"1.2.840.113549.1.5.13"}),new uc({value:[new uc({value:[new oc({value:"1.2.840.113549.1.5.12"}),u]}),new uc({value:[new oc({value:"2.16.840.1.101.3.4.1.42"}),new Ya({valueHex:a})]})]})]}),d=new uc({value:[h,new Ya({valueHex:l})]}).toBER();return["-----BEGIN ENCRYPTED PRIVATE KEY-----",...Qt(new Uint8Array(d,0,d.byteLength),"base64pad").split(/(.{64})/).filter(Boolean),"-----END ENCRYPTED PRIVATE KEY-----"].join("\n")}async function il(e){const t=[await Ro.get().subtle.importKey("jwk",e,{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!0,["sign"]),await al(e)],n=await ol({privateKey:t[0],publicKey:t[1]});return{privateKey:n[0],publicKey:n[1]}}async function ol(e){if(null==e.privateKey||null==e.publicKey)throw new fn("Private and public key are required","ERR_INVALID_PARAMETERS");return Promise.all([Ro.get().subtle.exportKey("jwk",e.privateKey),Ro.get().subtle.exportKey("jwk",e.publicKey)])}async function al(e){return Ro.get().subtle.importKey("jwk",{kty:e.kty,n:e.n,e:e.e},{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!0,["verify"])}function cl(e){if("RSA"!==e.kty)throw new fn("invalid key type","ERR_INVALID_KEY_TYPE");if(null==e.n)throw new fn("invalid key modulus","ERR_INVALID_KEY_MODULUS");return 8*kt(e.n,"base64url").length}const ll=8192;class ul{_key;constructor(e){this._key=e}verify(e,t){return async function(e,t,n){const r=await Ro.get().subtle.importKey("jwk",e,{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!1,["verify"]);return Ro.get().subtle.verify({name:"RSASSA-PKCS1-v1_5"},r,t,n instanceof Uint8Array?n:n.subarray())}(this._key,t,e)}marshal(){return function(e){if(null==e.n||null==e.e)throw new fn("JWK was missing components","ERR_INVALID_PARAMETERS");const t=new uc({value:[new uc({value:[new oc({value:"1.2.840.113549.1.1.1"}),new La]}),new Ja({valueHex:new uc({value:[nc.fromBigInt(rl(kt(e.n,"base64url"))),nc.fromBigInt(rl(kt(e.e,"base64url")))]}).toBER()})]}).toBER();return new Uint8Array(t,0,t.byteLength)}(this._key)}get bytes(){return Po.encode({Type:Do.RSA,Data:this.marshal()}).subarray()}equals(e){return In(this.bytes,e.bytes)}hash(){const e=gt.digest(this.bytes);return ks(e)?e.then((({bytes:e})=>e)):e.bytes}}class hl{_key;_publicKey;constructor(e,t){this._key=e,this._publicKey=t}genSecret(){return Lo(16)}sign(e){return async function(e,t){const n=await Ro.get().subtle.importKey("jwk",e,{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!1,["sign"]),r=await Ro.get().subtle.sign({name:"RSASSA-PKCS1-v1_5"},n,t instanceof Uint8Array?t:t.subarray());return new Uint8Array(r,0,r.byteLength)}(this._key,e)}get public(){if(null==this._publicKey)throw new fn("public key not provided","ERR_PUBKEY_NOT_PROVIDED");return new ul(this._publicKey)}marshal(){return function(e){if(null==e.n||null==e.e||null==e.d||null==e.p||null==e.q||null==e.dp||null==e.dq||null==e.qi)throw new fn("JWK was missing components","ERR_INVALID_PARAMETERS");const t=new uc({value:[new nc({value:0}),nc.fromBigInt(rl(kt(e.n,"base64url"))),nc.fromBigInt(rl(kt(e.e,"base64url"))),nc.fromBigInt(rl(kt(e.d,"base64url"))),nc.fromBigInt(rl(kt(e.p,"base64url"))),nc.fromBigInt(rl(kt(e.q,"base64url"))),nc.fromBigInt(rl(kt(e.dp,"base64url"))),nc.fromBigInt(rl(kt(e.dq,"base64url"))),nc.fromBigInt(rl(kt(e.qi,"base64url")))]}).toBER();return new Uint8Array(t,0,t.byteLength)}(this._key)}get bytes(){return Co.encode({Type:Do.RSA,Data:this.marshal()}).subarray()}equals(e){return In(this.bytes,e.bytes)}hash(){const e=gt.digest(this.bytes);return ks(e)?e.then((({bytes:e})=>e)):e.bytes}async id(){return Qt(await this.public.hash(),"base58btc")}async export(e,t="pkcs-8"){if("pkcs-8"===t)return sl(this,e);if("libp2p-key"===t)return To(this.bytes,e);throw new fn(`export format '${t}' is not supported`,"ERR_INVALID_EXPORT_FORMAT")}}var dl=Object.freeze({__proto__:null,MAX_RSA_KEY_SIZE:ll,RsaPrivateKey:hl,RsaPublicKey:ul,fromJwk:async function(e){if(cl(e)>ll)throw new fn("key size is too large","ERR_KEY_SIZE_TOO_LARGE");const t=await il(e);return new hl(t.privateKey,t.publicKey)},generateKeyPair:async function(e){if(e>ll)throw new fn("key size is too large","ERR_KEY_SIZE_TOO_LARGE");const t=await async function(e){const t=await Ro.get().subtle.generateKey({name:"RSASSA-PKCS1-v1_5",modulusLength:e,publicExponent:new Uint8Array([1,0,1]),hash:{name:"SHA-256"}},!0,["sign","verify"]),n=await ol(t);return{privateKey:n[0],publicKey:n[1]}}(e);return new hl(t.privateKey,t.publicKey)},unmarshalRsaPrivateKey:async function(e){const t=function(e){const{result:t}=Pa(e),n=t.valueBlock.value;return{n:Qt(nl(n[1].toBigInt()),"base64url"),e:Qt(nl(n[2].toBigInt()),"base64url"),d:Qt(nl(n[3].toBigInt()),"base64url"),p:Qt(nl(n[4].toBigInt()),"base64url"),q:Qt(nl(n[5].toBigInt()),"base64url"),dp:Qt(nl(n[6].toBigInt()),"base64url"),dq:Qt(nl(n[7].toBigInt()),"base64url"),qi:Qt(nl(n[8].toBigInt()),"base64url"),kty:"RSA",alg:"RS256"}}(e);if(cl(t)>ll)throw new fn("key size is too large","ERR_KEY_SIZE_TOO_LARGE");const n=await il(t);return new hl(n.privateKey,n.publicKey)},unmarshalRsaPublicKey:function(e){const t=function(e){const{result:t}=Pa(e),n=t.valueBlock.value[1].valueBlock.value[0].valueBlock.value;return{kty:"RSA",n:Qt(nl(n[0].toBigInt()),"base64url"),e:Qt(nl(n[1].toBigInt()),"base64url")}}(e);if(cl(t)>ll)throw new fn("key size is too large","ERR_KEY_SIZE_TOO_LARGE");return new ul(t)}});const pl=new Uint32Array([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]),fl=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),gl=new Uint32Array(64);class ml extends js{constructor(){super(64,32,8,!1),this.A=0|fl[0],this.B=0|fl[1],this.C=0|fl[2],this.D=0|fl[3],this.E=0|fl[4],this.F=0|fl[5],this.G=0|fl[6],this.H=0|fl[7]}get(){const{A:e,B:t,C:n,D:r,E:s,F:i,G:o,H:a}=this;return[e,t,n,r,s,i,o,a]}set(e,t,n,r,s,i,o,a){this.A=0|e,this.B=0|t,this.C=0|n,this.D=0|r,this.E=0|s,this.F=0|i,this.G=0|o,this.H=0|a}process(e,t){for(let n=0;n<16;n++,t+=4)gl[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){const t=gl[e-15],n=gl[e-2],r=Ls(t,7)^Ls(t,18)^t>>>3,s=Ls(n,17)^Ls(n,19)^n>>>10;gl[e]=s+gl[e-7]+r+gl[e-16]|0}let{A:n,B:r,C:s,D:i,E:o,F:a,G:c,H:l}=this;for(let e=0;e<64;e++){const t=l+(Ls(o,6)^Ls(o,11)^Ls(o,25))+((u=o)&a^~u&c)+pl[e]+gl[e]|0,h=(Ls(n,2)^Ls(n,13)^Ls(n,22))+Ws(n,r,s)|0;l=c,c=a,a=o,o=i+t|0,i=s,s=r,r=n,n=t+h|0}var u;n=n+this.A|0,r=r+this.B|0,s=s+this.C|0,i=i+this.D|0,o=o+this.E|0,a=a+this.F|0,c=c+this.G|0,l=l+this.H|0,this.set(n,r,s,i,o,a,c,l)}roundClean(){gl.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}}const yl=Hs((()=>new ml));
|
|
76
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const{bytesToNumberBE:wl,hexToBytes:bl}=Di,vl={Err:class extends Error{constructor(e=""){super(e)}},_parseInt(e){const{Err:t}=vl;if(e.length<2||2!==e[0])throw new t("Invalid signature integer tag");const n=e[1],r=e.subarray(2,n+2);if(!n||r.length!==n)throw new t("Invalid signature integer: wrong length");if(128&r[0])throw new t("Invalid signature integer: negative");if(0===r[0]&&!(128&r[1]))throw new t("Invalid signature integer: unnecessary leading zero");return{d:wl(r),l:e.subarray(n+2)}},toSig(e){const{Err:t}=vl,n="string"==typeof e?bl(e):e;ci(n);let r=n.length;if(r<2||48!=n[0])throw new t("Invalid signature tag");if(n[1]!==r-2)throw new t("Invalid signature: incorrect length");const{d:s,l:i}=vl._parseInt(n.subarray(2)),{d:o,l:a}=vl._parseInt(i);if(a.length)throw new t("Invalid signature: left bytes after parsing");return{r:s,s:o}},hexFromSig(e){const t=e=>8&Number.parseInt(e[0],16)?"00"+e:e,n=e=>{const t=e.toString(16);return 1&t.length?`0${t}`:t},r=t(n(e.s)),s=t(n(e.r)),i=r.length/2,o=s.length/2,a=n(i),c=n(o);return`30${n(o+i+4)}02${c}${s}02${a}${r}`}},El=BigInt(0),Sl=BigInt(1);BigInt(2);const _l=BigInt(3);function Il(e){const t=function(e){const t=Yi(e);Ti(t,{a:"field",b:"field"},{allowedPrivateKeyLengths:"array",wrapPrivateKey:"boolean",isTorsionFree:"function",clearCofactor:"function",allowInfinityPoint:"boolean",fromBytes:"function",toBytes:"function"});const{endo:n,Fp:r,a:s}=t;if(n){if(!r.eql(s,r.ZERO))throw new Error("Endomorphism can only be defined for Koblitz curves that have a=0");if("object"!=typeof n||"bigint"!=typeof n.beta||"function"!=typeof n.splitScalar)throw new Error("Expected endomorphism with beta: bigint and splitScalar: function")}return Object.freeze({...t})}(e),{Fp:n}=t,r=t.toBytes||((e,t,r)=>{const s=t.toAffine();return Ei(Uint8Array.from([4]),n.toBytes(s.x),n.toBytes(s.y))}),s=t.fromBytes||(e=>{const t=e.subarray(1);return{x:n.fromBytes(t.subarray(0,n.BYTES)),y:n.fromBytes(t.subarray(n.BYTES,2*n.BYTES))}});function i(e){const{a:r,b:s}=t,i=n.sqr(e),o=n.mul(i,e);return n.add(n.add(o,n.mul(e,r)),s)}if(!n.eql(n.sqr(t.Gy),i(t.Gx)))throw new Error("bad generator point: equation left != right");function o(e){return"bigint"==typeof e&&El<e&&e<t.n}function a(e){if(!o(e))throw new Error("Expected valid bigint: 0 < bigint < curve.n")}function c(e){const{allowedPrivateKeyLengths:n,nByteLength:r,wrapPrivateKey:s,n:i}=t;if(n&&"bigint"!=typeof e){if(ai(e)&&(e=ui(e)),"string"!=typeof e||!n.includes(e.length))throw new Error("Invalid key");e=e.padStart(2*r,"0")}let o;try{o="bigint"==typeof e?e:mi(vi("private key",e,r))}catch(t){throw new Error(`private key must be ${r} bytes, hex or bigint, not ${typeof e}`)}return s&&(o=Li(o,i)),a(o),o}const l=new Map;function u(e){if(!(e instanceof h))throw new Error("ProjectivePoint expected")}class h{constructor(e,t,r){if(this.px=e,this.py=t,this.pz=r,null==e||!n.isValid(e))throw new Error("x required");if(null==t||!n.isValid(t))throw new Error("y required");if(null==r||!n.isValid(r))throw new Error("z required")}static fromAffine(e){const{x:t,y:r}=e||{};if(!e||!n.isValid(t)||!n.isValid(r))throw new Error("invalid affine point");if(e instanceof h)throw new Error("projective point not allowed");const s=e=>n.eql(e,n.ZERO);return s(t)&&s(r)?h.ZERO:new h(t,r,n.ONE)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}static normalizeZ(e){const t=n.invertBatch(e.map((e=>e.pz)));return e.map(((e,n)=>e.toAffine(t[n]))).map(h.fromAffine)}static fromHex(e){const t=h.fromAffine(s(vi("pointHex",e)));return t.assertValidity(),t}static fromPrivateKey(e){return h.BASE.multiply(c(e))}_setWindowSize(e){this._WINDOW_SIZE=e,l.delete(this)}assertValidity(){if(this.is0()){if(t.allowInfinityPoint&&!n.is0(this.py))return;throw new Error("bad point: ZERO")}const{x:e,y:r}=this.toAffine();if(!n.isValid(e)||!n.isValid(r))throw new Error("bad point: x or y not FE");const s=n.sqr(r),o=i(e);if(!n.eql(s,o))throw new Error("bad point: equation left != right");if(!this.isTorsionFree())throw new Error("bad point: not in prime-order subgroup")}hasEvenY(){const{y:e}=this.toAffine();if(n.isOdd)return!n.isOdd(e);throw new Error("Field doesn't support isOdd")}equals(e){u(e);const{px:t,py:r,pz:s}=this,{px:i,py:o,pz:a}=e,c=n.eql(n.mul(t,a),n.mul(i,s)),l=n.eql(n.mul(r,a),n.mul(o,s));return c&&l}negate(){return new h(this.px,n.neg(this.py),this.pz)}double(){const{a:e,b:r}=t,s=n.mul(r,_l),{px:i,py:o,pz:a}=this;let c=n.ZERO,l=n.ZERO,u=n.ZERO,d=n.mul(i,i),p=n.mul(o,o),f=n.mul(a,a),g=n.mul(i,o);return g=n.add(g,g),u=n.mul(i,a),u=n.add(u,u),c=n.mul(e,u),l=n.mul(s,f),l=n.add(c,l),c=n.sub(p,l),l=n.add(p,l),l=n.mul(c,l),c=n.mul(g,c),u=n.mul(s,u),f=n.mul(e,f),g=n.sub(d,f),g=n.mul(e,g),g=n.add(g,u),u=n.add(d,d),d=n.add(u,d),d=n.add(d,f),d=n.mul(d,g),l=n.add(l,d),f=n.mul(o,a),f=n.add(f,f),d=n.mul(f,g),c=n.sub(c,d),u=n.mul(f,p),u=n.add(u,u),u=n.add(u,u),new h(c,l,u)}add(e){u(e);const{px:r,py:s,pz:i}=this,{px:o,py:a,pz:c}=e;let l=n.ZERO,d=n.ZERO,p=n.ZERO;const f=t.a,g=n.mul(t.b,_l);let m=n.mul(r,o),y=n.mul(s,a),w=n.mul(i,c),b=n.add(r,s),v=n.add(o,a);b=n.mul(b,v),v=n.add(m,y),b=n.sub(b,v),v=n.add(r,i);let E=n.add(o,c);return v=n.mul(v,E),E=n.add(m,w),v=n.sub(v,E),E=n.add(s,i),l=n.add(a,c),E=n.mul(E,l),l=n.add(y,w),E=n.sub(E,l),p=n.mul(f,v),l=n.mul(g,w),p=n.add(l,p),l=n.sub(y,p),p=n.add(y,p),d=n.mul(l,p),y=n.add(m,m),y=n.add(y,m),w=n.mul(f,w),v=n.mul(g,v),y=n.add(y,w),w=n.sub(m,w),w=n.mul(f,w),v=n.add(v,w),m=n.mul(y,v),d=n.add(d,m),m=n.mul(E,v),l=n.mul(b,l),l=n.sub(l,m),m=n.mul(b,y),p=n.mul(E,p),p=n.add(p,m),new h(l,d,p)}subtract(e){return this.add(e.negate())}is0(){return this.equals(h.ZERO)}wNAF(e){return p.wNAFCached(this,l,e,(e=>{const t=n.invertBatch(e.map((e=>e.pz)));return e.map(((e,n)=>e.toAffine(t[n]))).map(h.fromAffine)}))}multiplyUnsafe(e){const r=h.ZERO;if(e===El)return r;if(a(e),e===Sl)return this;const{endo:s}=t;if(!s)return p.unsafeLadder(this,e);let{k1neg:i,k1:o,k2neg:c,k2:l}=s.splitScalar(e),u=r,d=r,f=this;for(;o>El||l>El;)o&Sl&&(u=u.add(f)),l&Sl&&(d=d.add(f)),f=f.double(),o>>=Sl,l>>=Sl;return i&&(u=u.negate()),c&&(d=d.negate()),d=new h(n.mul(d.px,s.beta),d.py,d.pz),u.add(d)}multiply(e){a(e);let r,s,i=e;const{endo:o}=t;if(o){const{k1neg:e,k1:t,k2neg:a,k2:c}=o.splitScalar(i);let{p:l,f:u}=this.wNAF(t),{p:d,f:f}=this.wNAF(c);l=p.constTimeNegate(e,l),d=p.constTimeNegate(a,d),d=new h(n.mul(d.px,o.beta),d.py,d.pz),r=l.add(d),s=u.add(f)}else{const{p:e,f:t}=this.wNAF(i);r=e,s=t}return h.normalizeZ([r,s])[0]}multiplyAndAddUnsafe(e,t,n){const r=h.BASE,s=(e,t)=>t!==El&&t!==Sl&&e.equals(r)?e.multiply(t):e.multiplyUnsafe(t),i=s(this,t).add(s(e,n));return i.is0()?void 0:i}toAffine(e){const{px:t,py:r,pz:s}=this,i=this.is0();null==e&&(e=i?n.ONE:n.inv(s));const o=n.mul(t,e),a=n.mul(r,e),c=n.mul(s,e);if(i)return{x:n.ZERO,y:n.ZERO};if(!n.eql(c,n.ONE))throw new Error("invZ was invalid");return{x:o,y:a}}isTorsionFree(){const{h:e,isTorsionFree:n}=t;if(e===Sl)return!0;if(n)return n(h,this);throw new Error("isTorsionFree() has not been declared for the elliptic curve")}clearCofactor(){const{h:e,clearCofactor:n}=t;return e===Sl?this:n?n(h,this):this.multiplyUnsafe(t.h)}toRawBytes(e=!0){return this.assertValidity(),r(h,this,e)}toHex(e=!0){return ui(this.toRawBytes(e))}}h.BASE=new h(t.Gx,t.Gy,n.ONE),h.ZERO=new h(n.ZERO,n.ONE,n.ZERO);const d=t.nBitLength,p=Gi(h,t.endo?Math.ceil(d/2):d);return{CURVE:t,ProjectivePoint:h,normPrivateKeyToScalar:c,weierstrassEquation:i,isWithinCurveOrder:o}}function Rl(e){const t=function(e){const t=Yi(e);return Ti(t,{hash:"hash",hmac:"function",randomBytes:"function"},{bits2int:"function",bits2int_modN:"function",lowS:"boolean"}),Object.freeze({lowS:!0,...t})}(e),{Fp:n,n:r}=t,s=n.BYTES+1,i=2*n.BYTES+1;function o(e){return Li(e,r)}function a(e){return Fi(e,r)}const{ProjectivePoint:c,normPrivateKeyToScalar:l,weierstrassEquation:u,isWithinCurveOrder:h}=Il({...t,toBytes(e,t,r){const s=t.toAffine(),i=n.toBytes(s.x),o=Ei;return r?o(Uint8Array.from([t.hasEvenY()?2:3]),i):o(Uint8Array.from([4]),i,n.toBytes(s.y))},fromBytes(e){const t=e.length,r=e[0],o=e.subarray(1);if(t!==s||2!==r&&3!==r){if(t===i&&4===r){return{x:n.fromBytes(o.subarray(0,n.BYTES)),y:n.fromBytes(o.subarray(n.BYTES,2*n.BYTES))}}throw new Error(`Point of length ${t} was invalid. Expected ${s} compressed bytes or ${i} uncompressed bytes`)}{const e=mi(o);if(!(El<(a=e)&&a<n.ORDER))throw new Error("Point is not on curve");const t=u(e);let s;try{s=n.sqrt(t)}catch(e){const t=e instanceof Error?": "+e.message:"";throw new Error("Point is not on curve"+t)}return!(1&~r)!==((s&Sl)===Sl)&&(s=n.neg(s)),{x:e,y:s}}var a}}),d=e=>ui(wi(e,t.nByteLength));function p(e){return e>r>>Sl}const f=(e,t,n)=>mi(e.slice(t,n));class g{constructor(e,t,n){this.r=e,this.s=t,this.recovery=n,this.assertValidity()}static fromCompact(e){const n=t.nByteLength;return e=vi("compactSignature",e,2*n),new g(f(e,0,n),f(e,n,2*n))}static fromDER(e){const{r:t,s:n}=vl.toSig(vi("DER",e));return new g(t,n)}assertValidity(){if(!h(this.r))throw new Error("r must be 0 < r < CURVE.n");if(!h(this.s))throw new Error("s must be 0 < s < CURVE.n")}addRecoveryBit(e){return new g(this.r,this.s,e)}recoverPublicKey(e){const{r:r,s:s,recovery:i}=this,l=b(vi("msgHash",e));if(null==i||![0,1,2,3].includes(i))throw new Error("recovery id invalid");const u=2===i||3===i?r+t.n:r;if(u>=n.ORDER)throw new Error("recovery id 2 or 3 invalid");const h=1&i?"03":"02",p=c.fromHex(h+d(u)),f=a(u),g=o(-l*f),m=o(s*f),y=c.BASE.multiplyAndAddUnsafe(p,g,m);if(!y)throw new Error("point at infinify");return y.assertValidity(),y}hasHighS(){return p(this.s)}normalizeS(){return this.hasHighS()?new g(this.r,o(-this.s),this.recovery):this}toDERRawBytes(){return gi(this.toDERHex())}toDERHex(){return vl.hexFromSig({r:this.r,s:this.s})}toCompactRawBytes(){return gi(this.toCompactHex())}toCompactHex(){return d(this.r)+d(this.s)}}const m={isValidPrivateKey(e){try{return l(e),!0}catch(e){return!1}},normPrivateKeyToScalar:l,randomPrivateKey:()=>{const e=zi(t.n);return function(e,t,n=!1){const r=e.length,s=Hi(t),i=zi(t);if(r<16||r<i||r>1024)throw new Error(`expected ${i}-1024 bytes of input, got ${r}`);const o=Li(n?mi(e):yi(e),t-Pi)+Pi;return n?bi(o,s):wi(o,s)}(t.randomBytes(e),t.n)},precompute:(e=8,t=c.BASE)=>(t._setWindowSize(e),t.multiply(BigInt(3)),t)};function y(e){const t=ai(e),n="string"==typeof e,r=(t||n)&&e.length;return t?r===s||r===i:n?r===2*s||r===2*i:e instanceof c}const w=t.bits2int||function(e){const n=mi(e),r=8*e.length-t.nBitLength;return r>0?n>>BigInt(r):n},b=t.bits2int_modN||function(e){return o(w(e))},v=Si(t.nBitLength);function E(e){if("bigint"!=typeof e)throw new Error("bigint expected");if(!(El<=e&&e<v))throw new Error(`bigint expected < 2^${t.nBitLength}`);return wi(e,t.nByteLength)}function S(e,r,s=_){if(["recovered","canonical"].some((e=>e in s)))throw new Error("sign() legacy options not supported");const{hash:i,randomBytes:u}=t;let{lowS:d,prehash:f,extraEntropy:m}=s;null==d&&(d=!0),e=vi("msgHash",e),f&&(e=vi("prehashed msgHash",i(e)));const y=b(e),v=l(r),S=[E(v),E(y)];if(null!=m&&!1!==m){const e=!0===m?u(n.BYTES):m;S.push(vi("extraEntropy",e))}const I=Ei(...S),R=y;return{seed:I,k2sig:function(e){const t=w(e);if(!h(t))return;const n=a(t),r=c.BASE.multiply(t).toAffine(),s=o(r.x);if(s===El)return;const i=o(n*o(R+s*v));if(i===El)return;let l=(r.x===s?0:2)|Number(r.y&Sl),u=i;return d&&p(i)&&(u=function(e){return p(e)?o(-e):e}(i),l^=1),new g(s,u,l)}}}const _={lowS:t.lowS,prehash:!1},I={lowS:t.lowS,prehash:!1};return c.BASE._setWindowSize(8),{CURVE:t,getPublicKey:function(e,t=!0){return c.fromPrivateKey(e).toRawBytes(t)},getSharedSecret:function(e,t,n=!0){if(y(e))throw new Error("first arg must be private key");if(!y(t))throw new Error("second arg must be public key");return c.fromHex(t).multiply(l(e)).toRawBytes(n)},sign:function(e,n,r=_){const{seed:s,k2sig:i}=S(e,n,r),o=t;return Ri(o.hash.outputLen,o.nByteLength,o.hmac)(s,i)},verify:function(e,n,r,s=I){const i=e;if(n=vi("msgHash",n),r=vi("publicKey",r),"strict"in s)throw new Error("options.strict was renamed to lowS");const{lowS:l,prehash:u}=s;let h,d;try{if("string"==typeof i||ai(i))try{h=g.fromDER(i)}catch(e){if(!(e instanceof vl.Err))throw e;h=g.fromCompact(i)}else{if("object"!=typeof i||"bigint"!=typeof i.r||"bigint"!=typeof i.s)throw new Error("PARSE");{const{r:e,s:t}=i;h=new g(e,t)}}d=c.fromHex(r)}catch(e){if("PARSE"===e.message)throw new Error("signature must be Signature instance, Uint8Array or hex string");return!1}if(l&&h.hasHighS())return!1;u&&(n=t.hash(n));const{r:p,s:f}=h,m=b(n),y=a(f),w=o(m*y),v=o(p*y),E=c.BASE.multiplyAndAddUnsafe(d,w,v)?.toAffine();return!!E&&o(E.x)===p},ProjectivePoint:c,Signature:g,utils:m}}
|
|
77
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */function Al(e){return{hash:e,hmac:(t,...n)=>Uo(e,t,Ks(...n)),randomBytes:zs}}BigInt(4);
|
|
78
78
|
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
79
|
-
const Rl=BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),Al=BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),Tl=BigInt(1),Dl=BigInt(2),kl=(e,t)=>(e+t/Dl)/t;const Pl=Ki(Rl,void 0,void 0,{sqrt:function(e){const t=Rl,n=BigInt(3),r=BigInt(6),s=BigInt(11),i=BigInt(22),o=BigInt(23),a=BigInt(44),c=BigInt(88),l=e*e*e%t,u=l*l*e%t,h=Li(u,n,t)*u%t,d=Li(h,n,t)*u%t,p=Li(d,Dl,t)*l%t,f=Li(p,s,t)*p%t,g=Li(f,i,t)*f%t,m=Li(g,a,t)*g%t,y=Li(m,c,t)*m%t,w=Li(y,a,t)*g%t,b=Li(w,n,t)*u%t,v=Li(b,o,t)*f%t,E=Li(v,r,t)*l%t,S=Li(E,Dl,t);if(!Pl.eql(Pl.sqr(S),e))throw new Error("Cannot find square root");return S}}),Cl=function(e,t){const n=t=>_l({...e,...Il(t)});return Object.freeze({...n(t),create:n})}({a:BigInt(0),b:BigInt(7),Fp:Pl,n:Al,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),h:BigInt(1),lowS:!0,endo:{beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar:e=>{const t=Al,n=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),r=-Tl*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),s=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),i=n,o=BigInt("0x100000000000000000000000000000000"),a=kl(i*e,t),c=kl(-r*e,t);let l=Mi(e-a*n-c*s,t),u=Mi(-a*r-c*i,t);const h=l>o,d=u>o;if(h&&(l=t-l),d&&(u=t-u),l>o||u>o)throw new Error("splitScalar: Endomorphism failed, k="+e);return{k1neg:h,k1:l,k2neg:d,k2:u}}}},gl);function xl(e){try{Cl.ProjectivePoint.fromHex(e)}catch(e){throw new fn(String(e),"ERR_INVALID_PUBLIC_KEY")}}BigInt(0),Cl.ProjectivePoint;class Nl{_key;constructor(e){xl(e),this._key=e}verify(e,t){return function(e,t,n){const r=gt.digest(n instanceof Uint8Array?n:n.subarray());if(Ts(r))return r.then((({digest:n})=>Cl.verify(t,n,e))).catch((e=>{throw new fn(String(e),"ERR_INVALID_INPUT")}));try{return Cl.verify(t,r.digest,e)}catch(e){throw new fn(String(e),"ERR_INVALID_INPUT")}}(this._key,t,e)}marshal(){return e=this._key,Cl.ProjectivePoint.fromHex(e).toRawBytes(!0);var e}get bytes(){return Do.encode({Type:Ao.Secp256k1,Data:this.marshal()}).subarray()}equals(e){return In(this.bytes,e.bytes)}async hash(){const e=gt.digest(this.bytes);let t;return Ts(e)?({bytes:t}=await e):t=e.bytes,t}}class Ml{_key;_publicKey;constructor(e,t){this._key=e,this._publicKey=t??function(e){try{return Cl.getPublicKey(e,!0)}catch(e){throw new fn(String(e),"ERR_INVALID_PRIVATE_KEY")}}(e),function(e){try{Cl.getPublicKey(e,!0)}catch(e){throw new fn(String(e),"ERR_INVALID_PRIVATE_KEY")}}(this._key),xl(this._publicKey)}sign(e){return function(e,t){const n=gt.digest(t instanceof Uint8Array?t:t.subarray());if(Ts(n))return n.then((({digest:t})=>Cl.sign(t,e).toDERRawBytes())).catch((e=>{throw new fn(String(e),"ERR_INVALID_INPUT")}));try{return Cl.sign(n.digest,e).toDERRawBytes()}catch(e){throw new fn(String(e),"ERR_INVALID_INPUT")}}(this._key,e)}get public(){return new Nl(this._publicKey)}marshal(){return this._key}get bytes(){return ko.encode({Type:Ao.Secp256k1,Data:this.marshal()}).subarray()}equals(e){return In(this.bytes,e.bytes)}hash(){const e=gt.digest(this.bytes);return Ts(e)?e.then((({bytes:e})=>e)):e.bytes}async id(){return Qt(await this.public.hash(),"base58btc")}async export(e,t="libp2p-key"){if("libp2p-key"===t)return Ro(this.bytes,e);throw new fn(`export format '${t}' is not supported`,"ERR_INVALID_EXPORT_FORMAT")}}var Ol=Object.freeze({__proto__:null,Secp256k1PrivateKey:Ml,Secp256k1PublicKey:Nl,generateKeyPair:async function(){const e=Cl.utils.randomPrivateKey();return new Ml(e)},unmarshalSecp256k1PrivateKey:function(e){return new Ml(e)},unmarshalSecp256k1PublicKey:function(e){return new Nl(e)}});const Ll={rsa:ul,ed25519:No,secp256k1:Ol};function Bl(e){const t=Object.keys(Ll).join(" / ");return new fn(`invalid or unsupported key type ${e}. Must be ${t}`,"ERR_UNSUPPORTED_KEY_TYPE")}function Ul(e){if("rsa"===(e=e.toLowerCase())||"ed25519"===e||"secp256k1"===e)return Ll[e];throw Bl(e)}function Fl(e){const t=Do.decode(e),n=t.Data??new Uint8Array;switch(t.Type){case Ao.RSA:return Ll.rsa.unmarshalRsaPublicKey(n);case Ao.Ed25519:return Ll.ed25519.unmarshalEd25519PublicKey(n);case Ao.Secp256k1:return Ll.secp256k1.unmarshalSecp256k1PublicKey(n);default:throw Bl(t.Type??"unknown")}}function Vl(e,t){return Ul(t=(t??"rsa").toLowerCase()),e.bytes}async function Kl(e){const t=ko.decode(e),n=t.Data??new Uint8Array;switch(t.Type){case Ao.RSA:return Ll.rsa.unmarshalRsaPrivateKey(n);case Ao.Ed25519:return Ll.ed25519.unmarshalEd25519PrivateKey(n);case Ao.Secp256k1:return Ll.secp256k1.unmarshalSecp256k1PrivateKey(n);default:throw Bl(t.Type??"RSA")}}var $l,ql={exports:{}};$l=ql,function(){$l.exports=g;var e=86400,t=3200,n=146097*t/400,r=e*n,s=1e3*r,i=864e13,o=4294967296,a=1e6,c="000000000",l=Math.trunc||function(e){var t=e-e%1;return 0==t&&(e<0||0===e&&1/e!=1/0)?-0:t},u=g.prototype,h=(g.fromDate=function(e){return new g(+e)},g.fromInt64BE=v(0,1,2,3,0,4),g.fromInt64LE=v(3,2,1,0,4,0),g.fromString=function(e){var t,n=new g;if(e=(e+="").replace(/^\s*[+\-]?\d+/,(function(e){var t=1970+((e=+e)-1970)%400;return n.year=e-t,t})).replace(/(?:Z|([+\-]\d{2}):?(\d{2}))$/,(function(e,n,r){return n<0&&(r*=-1),t=6e4*(60*+n+ +r),""})).replace(/\.\d+$/,(function(e){return n.nano=+(e+c).substr(1,9),""})).split(/\D+/),1<e.length?e[1]--:e[1]=0,n.time=t=Date.UTC.apply(Date,e)-(t||0),isNaN(t))throw new TypeError("Invalid Date");return m(n)},g.fromTimeT=function(e){return w(e,0)},u.year=0,u.time=0,u.nano=0,u.addNano=function(e){return this.nano+=+e||0,this},u.getNano=function(){var e=m(this);return(e.time%1e3*a+ +e.nano+1e9)%1e9},u.getTimeT=function(){var r=m(this),s=Math.floor(r.time/1e3);return(r=r.year)&&(s+=r*n*e/t),s},u.getYear=function(){return this.toDate().getUTCFullYear()+this.year},u.toDate=function(){return y(m(this).time)},u.toJSON=function(){return this.toString().replace(/0{1,6}Z$/,"Z")},u.toString=function(e){var t=this,n=t.toDate(),r={H:function(){return S(n.getUTCHours())},L:function(){return _(n.getUTCMilliseconds(),3)},M:function(){return S(n.getUTCMinutes())},N:function(){return _(t.getNano(),9)},S:function(){return S(n.getUTCSeconds())},Y:function(){var e=t.getYear();return 999999<e?"+"+e:9999<e?"+"+_(e,6):0<=e?_(e,4):-999999<=e?"-"+_(-e,6):e},a:function(){return p[n.getUTCDay()]},b:function(){return d[n.getUTCMonth()]},d:function(){return S(n.getUTCDate())},e:function(){return function(e){return(9<e?"":" ")+(0|e)}(n.getUTCDate())},m:function(){return S(n.getUTCMonth()+1)}};return function e(t){return t.replace(/%./g,(function(t){var n=t[1],s=f[n];return n=r[n],s?e(s):n?n():t}))}(e||h)},u.writeInt64BE=b(0,1,2,3,0,4),u.writeInt64LE=b(3,2,1,0,4,0),"%Y-%m-%dT%H:%M:%S.%NZ"),d=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],p=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],f={"%":"%",F:"%Y-%m-%d",n:"\n",R:"%H:%M",T:"%H:%M:%S",t:"\t",X:"%T",Z:"GMT",z:"+0000"};return g;function g(e,t,n){var r=this;if(!(r instanceof g))return new g(e,t,n);r.time=+e||0,r.nano=+t||0,r.year=+n||0,m(r)}function m(e){var n,r,o,c=e.year,u=e.time,h=e.nano,d=((h<0||a<=h)&&(h-=(r=Math.floor(h/a))*a,u+=r,r=1),c%t);return(u<-i||i<u||d)&&((n=l(u/s))&&(c+=n*t,u-=n*s),(o=y(u)).setUTCFullYear(d+o.getUTCFullYear()),o=(u=+o)+(n=l((c-=d)/t))*s,n&&-i<=o&&o<=i&&(c-=n*t,u=o),r=1),r&&(e.year=c,e.time=u,e.nano=h),e}function y(e){var t=new Date(0);return t.setTime(e),t}function w(e,n){e=+e||0;var s=l((n=(0|n)*o)/r)+l(e/r);return(e=l((n=n%r+e%r)/r))&&(s+=e,n-=e*r),new g(1e3*n,0,s*t)}function b(r,s,i,a,c,u){return function(r,s){var i=m(this);E(r=r||new Array(8),s|=0);var a=Math.floor(i.time/1e3),d=(i=i.year*(n*e/t),l(i/o)+l(a/o));return i=i%o+a%o,(a=Math.floor(i/o))&&(d+=a,i-=a*o),h(r,s+c,d),h(r,s+u,i),r};function h(e,t,n){e[t+r]=n>>24&255,e[t+s]=n>>16&255,e[t+i]=n>>8&255,e[t+a]=255&n}}function v(e,t,n,r,s,i){return function(e,t){E(e,t|=0);var n=o(e,t+s);return w(o(e,t+i),n)};function o(s,i){return 16777216*s[i+e]+(s[i+t]<<16|s[i+n]<<8|s[i+r])}}function E(e,t){if(null==(e=e&&e.length))throw new TypeError("Invalid Buffer");if(e<t+8)throw new RangeError("Out of range")}function S(e){return(9<e?"":"0")+(0|e)}function _(e,t){return(c+(0|e)).substr(-t)}}();var Hl=Br(ql.exports);const zl="ERR_UNRECOGNIZED_VALIDITY",Wl="ERR_SIGNATURE_VERIFICATION",jl="ERR_UNDEFINED_PARAMETER";var Gl;!function(e){let t,n;(e.ValidityType||(e.ValidityType={})).EOL="EOL",function(e){e[e.EOL=0]="EOL"}(t||(t={})),function(e){e.codec=()=>Wt(t)}(e.ValidityType||(e.ValidityType={})),e.codec=()=>(null==n&&(n=jt(((t,n,r={})=>{!1!==r.lengthDelimited&&n.fork(),null!=t.value&&(n.uint32(10),n.bytes(t.value)),null!=t.signatureV1&&(n.uint32(18),n.bytes(t.signatureV1)),null!=t.validityType&&(n.uint32(24),e.ValidityType.codec().encode(t.validityType,n)),null!=t.validity&&(n.uint32(34),n.bytes(t.validity)),null!=t.sequence&&(n.uint32(40),n.uint64(t.sequence)),null!=t.ttl&&(n.uint32(48),n.uint64(t.ttl)),null!=t.pubKey&&(n.uint32(58),n.bytes(t.pubKey)),null!=t.signatureV2&&(n.uint32(66),n.bytes(t.signatureV2)),null!=t.data&&(n.uint32(74),n.bytes(t.data)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.value=t.bytes();break;case 2:r.signatureV1=t.bytes();break;case 3:r.validityType=e.ValidityType.codec().decode(t);break;case 4:r.validity=t.bytes();break;case 5:r.sequence=t.uint64();break;case 6:r.ttl=t.uint64();break;case 7:r.pubKey=t.bytes();break;case 8:r.signatureV2=t.bytes();break;case 9:r.data=t.bytes();break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Gl||(Gl={}));const Yl=["string","number","bigint","symbol"],Ql=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","HTMLElement","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function Zl(e){if(null===e)return"null";if(void 0===e)return"undefined";if(!0===e||!1===e)return"boolean";const t=typeof e;if(Yl.includes(t))return t;if("function"===t)return"Function";if(Array.isArray(e))return"Array";if(function(e){return e&&e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer.call(null,e)}(e))return"Buffer";const n=function(e){const t=Object.prototype.toString.call(e).slice(8,-1);if(Ql.includes(t))return t;return}(e);return n||"Object"}class Jl{constructor(e,t,n){this.major=e,this.majorEncoded=e<<5,this.name=t,this.terminal=n}toString(){return`Type[${this.major}].${this.name}`}compare(e){return this.major<e.major?-1:this.major>e.major?1:0}}Jl.uint=new Jl(0,"uint",!0),Jl.negint=new Jl(1,"negint",!0),Jl.bytes=new Jl(2,"bytes",!0),Jl.string=new Jl(3,"string",!0),Jl.array=new Jl(4,"array",!1),Jl.map=new Jl(5,"map",!1),Jl.tag=new Jl(6,"tag",!1),Jl.float=new Jl(7,"float",!0),Jl.false=new Jl(7,"false",!0),Jl.true=new Jl(7,"true",!0),Jl.null=new Jl(7,"null",!0),Jl.undefined=new Jl(7,"undefined",!0),Jl.break=new Jl(7,"break",!0);class Xl{constructor(e,t,n){this.type=e,this.value=t,this.encodedLength=n,this.encodedBytes=void 0,this.byteValue=void 0}toString(){return`Token[${this.type}].${this.value}`}}const eu=globalThis.process&&!globalThis.process.browser&&globalThis.Buffer&&"function"==typeof globalThis.Buffer.isBuffer,tu=new TextDecoder,nu=new TextEncoder;function ru(e){return eu&&globalThis.Buffer.isBuffer(e)}const su=eu?(e,t,n)=>n-t>64?globalThis.Buffer.from(e.subarray(t,n)).toString("utf8"):cu(e,t,n):(e,t,n)=>n-t>64?tu.decode(e.subarray(t,n)):cu(e,t,n),iu=eu?e=>e.length>64?globalThis.Buffer.from(e):au(e):e=>e.length>64?nu.encode(e):au(e),ou=eu?(e,t,n)=>ru(e)?new Uint8Array(e.subarray(t,n)):e.slice(t,n):(e,t,n)=>e.slice(t,n);function au(e){const t=[];let n=0;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);s<128?t[n++]=s:s<2048?(t[n++]=s>>6|192,t[n++]=63&s|128):55296==(64512&s)&&r+1<e.length&&56320==(64512&e.charCodeAt(r+1))?(s=65536+((1023&s)<<10)+(1023&e.charCodeAt(++r)),t[n++]=s>>18|240,t[n++]=s>>12&63|128,t[n++]=s>>6&63|128,t[n++]=63&s|128):(t[n++]=s>>12|224,t[n++]=s>>6&63|128,t[n++]=63&s|128)}return t}function cu(e,t,n){const r=[];for(;t<n;){const s=e[t];let i=null,o=s>239?4:s>223?3:s>191?2:1;if(t+o<=n){let n,r,a,c;switch(o){case 1:s<128&&(i=s);break;case 2:n=e[t+1],128==(192&n)&&(c=(31&s)<<6|63&n,c>127&&(i=c));break;case 3:n=e[t+1],r=e[t+2],128==(192&n)&&128==(192&r)&&(c=(15&s)<<12|(63&n)<<6|63&r,c>2047&&(c<55296||c>57343)&&(i=c));break;case 4:n=e[t+1],r=e[t+2],a=e[t+3],128==(192&n)&&128==(192&r)&&128==(192&a)&&(c=(15&s)<<18|(63&n)<<12|(63&r)<<6|63&a,c>65535&&c<1114112&&(i=c))}}null===i?(i=65533,o=1):i>65535&&(i-=65536,r.push(i>>>10&1023|55296),i=56320|1023&i),r.push(i),t+=o}return function(e){const t=e.length;if(t<=lu)return String.fromCharCode.apply(String,e);let n="",r=0;for(;r<t;)n+=String.fromCharCode.apply(String,e.slice(r,r+=lu));return n}(r)}const lu=4096;const uu="CBOR decode error:",hu="CBOR encode error:";function du(e,t,n){if(e.length-t<n)throw new Error(`${uu} not enough data for type`)}const pu=[24,256,65536,4294967296,BigInt("18446744073709551616")];function fu(e,t,n){du(e,t,1);const r=e[t];if(!0===n.strict&&r<pu[0])throw new Error(`${uu} integer encoded in more bytes than necessary (strict decode)`);return r}function gu(e,t,n){du(e,t,2);const r=e[t]<<8|e[t+1];if(!0===n.strict&&r<pu[1])throw new Error(`${uu} integer encoded in more bytes than necessary (strict decode)`);return r}function mu(e,t,n){du(e,t,4);const r=16777216*e[t]+(e[t+1]<<16)+(e[t+2]<<8)+e[t+3];if(!0===n.strict&&r<pu[2])throw new Error(`${uu} integer encoded in more bytes than necessary (strict decode)`);return r}function yu(e,t,n){du(e,t,8);const r=16777216*e[t]+(e[t+1]<<16)+(e[t+2]<<8)+e[t+3],s=16777216*e[t+4]+(e[t+5]<<16)+(e[t+6]<<8)+e[t+7],i=(BigInt(r)<<BigInt(32))+BigInt(s);if(!0===n.strict&&i<pu[3])throw new Error(`${uu} integer encoded in more bytes than necessary (strict decode)`);if(i<=Number.MAX_SAFE_INTEGER)return Number(i);if(!0===n.allowBigInt)return i;throw new Error(`${uu} integers outside of the safe integer range are not supported`)}function wu(e,t){return bu(e,0,t.value)}function bu(e,t,n){if(n<pu[0]){const r=Number(n);e.push([t|r])}else if(n<pu[1]){const r=Number(n);e.push([24|t,r])}else if(n<pu[2]){const r=Number(n);e.push([25|t,r>>>8,255&r])}else if(n<pu[3]){const r=Number(n);e.push([26|t,r>>>24&255,r>>>16&255,r>>>8&255,255&r])}else{const r=BigInt(n);if(!(r<pu[4]))throw new Error(`${uu} encountered BigInt larger than allowable range`);{const n=[27|t,0,0,0,0,0,0,0];let s=Number(r&BigInt(4294967295)),i=Number(r>>BigInt(32)&BigInt(4294967295));n[8]=255&s,s>>=8,n[7]=255&s,s>>=8,n[6]=255&s,s>>=8,n[5]=255&s,n[4]=255&i,i>>=8,n[3]=255&i,i>>=8,n[2]=255&i,i>>=8,n[1]=255&i,e.push(n)}}}wu.encodedSize=function(e){return bu.encodedSize(e.value)},bu.encodedSize=function(e){return e<pu[0]?1:e<pu[1]?2:e<pu[2]?3:e<pu[3]?5:9},wu.compareTokens=function(e,t){return e.value<t.value?-1:e.value>t.value?1:0};const vu=BigInt(-1),Eu=BigInt(1);function Su(e,t){const n=t.value,r="bigint"==typeof n?n*vu-Eu:-1*n-1;bu(e,t.type.majorEncoded,r)}function _u(e,t,n,r){du(e,t,n+r);const s=ou(e,t+n,t+n+r);return new Xl(Jl.bytes,s,n+r)}function Iu(e,t,n,r){return _u(e,t,1,n)}function Ru(e){return void 0===e.encodedBytes&&(e.encodedBytes=e.type===Jl.string?iu(e.value):e.value),e.encodedBytes}function Au(e,t){const n=Ru(t);bu(e,t.type.majorEncoded,n.length),e.push(n)}function Tu(e,t,n,r,s){const i=n+r;du(e,t,i);const o=new Xl(Jl.string,su(e,t+n,t+i),i);return!0===s.retainStringBytes&&(o.byteValue=ou(e,t+n,t+i)),o}function Du(e,t,n,r){return Tu(e,t,1,n,r)}Su.encodedSize=function(e){const t=e.value,n="bigint"==typeof t?t*vu-Eu:-1*t-1;return n<pu[0]?1:n<pu[1]?2:n<pu[2]?3:n<pu[3]?5:9},Su.compareTokens=function(e,t){return e.value<t.value?1:e.value>t.value?-1:0},Au.encodedSize=function(e){const t=Ru(e);return bu.encodedSize(t.length)+t.length},Au.compareTokens=function(e,t){return n=Ru(e),r=Ru(t),n.length<r.length?-1:n.length>r.length?1:function(e,t){if(ru(e)&&ru(t))return e.compare(t);for(let n=0;n<e.length;n++)if(e[n]!==t[n])return e[n]<t[n]?-1:1;return 0}(n,r);var n,r};const ku=Au;function Pu(e,t,n,r){return new Xl(Jl.array,r,n)}function Cu(e,t,n,r){return Pu(0,0,1,n)}function xu(e,t){bu(e,Jl.array.majorEncoded,t.value)}function Nu(e,t,n,r){return new Xl(Jl.map,r,n)}function Mu(e,t,n,r){return Nu(0,0,1,n)}function Ou(e,t){bu(e,Jl.map.majorEncoded,t.value)}function Lu(e,t,n,r){return new Xl(Jl.tag,n,1)}function Bu(e,t){bu(e,Jl.tag.majorEncoded,t.value)}xu.compareTokens=wu.compareTokens,xu.encodedSize=function(e){return bu.encodedSize(e.value)},Ou.compareTokens=wu.compareTokens,Ou.encodedSize=function(e){return bu.encodedSize(e.value)},Bu.compareTokens=wu.compareTokens,Bu.encodedSize=function(e){return bu.encodedSize(e.value)};const Uu=20,Fu=21,Vu=22,Ku=23;function $u(e,t,n){if(n){if(!1===n.allowNaN&&Number.isNaN(e))throw new Error(`${uu} NaN values are not supported`);if(!1===n.allowInfinity&&(e===1/0||e===-1/0))throw new Error(`${uu} Infinity values are not supported`)}return new Xl(Jl.float,e,t)}function qu(e,t,n){const r=t.value;if(!1===r)e.push([Jl.float.majorEncoded|Uu]);else if(!0===r)e.push([Jl.float.majorEncoded|Fu]);else if(null===r)e.push([Jl.float.majorEncoded|Vu]);else if(void 0===r)e.push([Jl.float.majorEncoded|Ku]);else{let t,i=!1;n&&!0===n.float64||(ju(r),t=Gu(Wu,1),r===t||Number.isNaN(r)?(Wu[0]=249,e.push(Wu.slice(0,3)),i=!0):(Yu(r),t=Qu(Wu,1),r===t&&(Wu[0]=250,e.push(Wu.slice(0,5)),i=!0))),i||(s=r,zu.setFloat64(0,s,!1),t=Zu(Wu,1),Wu[0]=251,e.push(Wu.slice(0,9)))}var s}qu.encodedSize=function(e,t){const n=e.value;if(!1===n||!0===n||null==n)return 1;if(!t||!0!==t.float64){ju(n);let e=Gu(Wu,1);if(n===e||Number.isNaN(n))return 3;if(Yu(n),e=Qu(Wu,1),n===e)return 5}return 9};const Hu=new ArrayBuffer(9),zu=new DataView(Hu,1),Wu=new Uint8Array(Hu,0);function ju(e){if(e===1/0)zu.setUint16(0,31744,!1);else if(e===-1/0)zu.setUint16(0,64512,!1);else if(Number.isNaN(e))zu.setUint16(0,32256,!1);else{zu.setFloat32(0,e);const t=zu.getUint32(0),n=(2139095040&t)>>23,r=8388607&t;if(255===n)zu.setUint16(0,31744,!1);else if(0===n)zu.setUint16(0,(2147483648&e)>>16|r>>13,!1);else{const e=n-127;e<-24?zu.setUint16(0,0):e<-14?zu.setUint16(0,(2147483648&t)>>16|1<<24+e,!1):zu.setUint16(0,(2147483648&t)>>16|e+15<<10|r>>13,!1)}}}function Gu(e,t){if(e.length-t<2)throw new Error(`${uu} not enough data for float16`);const n=(e[t]<<8)+e[t+1];if(31744===n)return 1/0;if(64512===n)return-1/0;if(32256===n)return NaN;const r=n>>10&31,s=1023&n;let i;return i=0===r?s*2**-24:31!==r?(s+1024)*2**(r-25):0===s?1/0:NaN,32768&n?-i:i}function Yu(e){zu.setFloat32(0,e,!1)}function Qu(e,t){if(e.length-t<4)throw new Error(`${uu} not enough data for float32`);const n=(e.byteOffset||0)+t;return new DataView(e.buffer,n,4).getFloat32(0,!1)}function Zu(e,t){if(e.length-t<8)throw new Error(`${uu} not enough data for float64`);const n=(e.byteOffset||0)+t;return new DataView(e.buffer,n,8).getFloat64(0,!1)}function Ju(e,t,n){throw new Error(`${uu} encountered invalid minor (${n}) for major ${e[t]>>>5}`)}function Xu(e){return()=>{throw new Error(`${uu} ${e}`)}}qu.compareTokens=wu.compareTokens;const eh=[];for(let e=0;e<=23;e++)eh[e]=Ju;eh[24]=function(e,t,n,r){return new Xl(Jl.uint,fu(e,t+1,r),2)},eh[25]=function(e,t,n,r){return new Xl(Jl.uint,gu(e,t+1,r),3)},eh[26]=function(e,t,n,r){return new Xl(Jl.uint,mu(e,t+1,r),5)},eh[27]=function(e,t,n,r){return new Xl(Jl.uint,yu(e,t+1,r),9)},eh[28]=Ju,eh[29]=Ju,eh[30]=Ju,eh[31]=Ju;for(let e=32;e<=55;e++)eh[e]=Ju;eh[56]=function(e,t,n,r){return new Xl(Jl.negint,-1-fu(e,t+1,r),2)},eh[57]=function(e,t,n,r){return new Xl(Jl.negint,-1-gu(e,t+1,r),3)},eh[58]=function(e,t,n,r){return new Xl(Jl.negint,-1-mu(e,t+1,r),5)},eh[59]=function(e,t,n,r){const s=yu(e,t+1,r);if("bigint"!=typeof s){const e=-1-s;if(e>=Number.MIN_SAFE_INTEGER)return new Xl(Jl.negint,e,9)}if(!0!==r.allowBigInt)throw new Error(`${uu} integers outside of the safe integer range are not supported`);return new Xl(Jl.negint,vu-BigInt(s),9)},eh[60]=Ju,eh[61]=Ju,eh[62]=Ju,eh[63]=Ju;for(let e=64;e<=87;e++)eh[e]=Iu;eh[88]=function(e,t,n,r){return _u(e,t,2,fu(e,t+1,r))},eh[89]=function(e,t,n,r){return _u(e,t,3,gu(e,t+1,r))},eh[90]=function(e,t,n,r){return _u(e,t,5,mu(e,t+1,r))},eh[91]=function(e,t,n,r){const s=yu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${uu} 64-bit integer bytes lengths not supported`);return _u(e,t,9,s)},eh[92]=Ju,eh[93]=Ju,eh[94]=Ju,eh[95]=Xu("indefinite length bytes/strings are not supported");for(let e=96;e<=119;e++)eh[e]=Du;eh[120]=function(e,t,n,r){return Tu(e,t,2,fu(e,t+1,r),r)},eh[121]=function(e,t,n,r){return Tu(e,t,3,gu(e,t+1,r),r)},eh[122]=function(e,t,n,r){return Tu(e,t,5,mu(e,t+1,r),r)},eh[123]=function(e,t,n,r){const s=yu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${uu} 64-bit integer string lengths not supported`);return Tu(e,t,9,s,r)},eh[124]=Ju,eh[125]=Ju,eh[126]=Ju,eh[127]=Xu("indefinite length bytes/strings are not supported");for(let e=128;e<=151;e++)eh[e]=Cu;eh[152]=function(e,t,n,r){return Pu(0,0,2,fu(e,t+1,r))},eh[153]=function(e,t,n,r){return Pu(0,0,3,gu(e,t+1,r))},eh[154]=function(e,t,n,r){return Pu(0,0,5,mu(e,t+1,r))},eh[155]=function(e,t,n,r){const s=yu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${uu} 64-bit integer array lengths not supported`);return Pu(0,0,9,s)},eh[156]=Ju,eh[157]=Ju,eh[158]=Ju,eh[159]=function(e,t,n,r){if(!1===r.allowIndefinite)throw new Error(`${uu} indefinite length items not allowed`);return Pu(0,0,1,1/0)};for(let e=160;e<=183;e++)eh[e]=Mu;eh[184]=function(e,t,n,r){return Nu(0,0,2,fu(e,t+1,r))},eh[185]=function(e,t,n,r){return Nu(0,0,3,gu(e,t+1,r))},eh[186]=function(e,t,n,r){return Nu(0,0,5,mu(e,t+1,r))},eh[187]=function(e,t,n,r){const s=yu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${uu} 64-bit integer map lengths not supported`);return Nu(0,0,9,s)},eh[188]=Ju,eh[189]=Ju,eh[190]=Ju,eh[191]=function(e,t,n,r){if(!1===r.allowIndefinite)throw new Error(`${uu} indefinite length items not allowed`);return Nu(0,0,1,1/0)};for(let e=192;e<=215;e++)eh[e]=Lu;eh[216]=function(e,t,n,r){return new Xl(Jl.tag,fu(e,t+1,r),2)},eh[217]=function(e,t,n,r){return new Xl(Jl.tag,gu(e,t+1,r),3)},eh[218]=function(e,t,n,r){return new Xl(Jl.tag,mu(e,t+1,r),5)},eh[219]=function(e,t,n,r){return new Xl(Jl.tag,yu(e,t+1,r),9)},eh[220]=Ju,eh[221]=Ju,eh[222]=Ju,eh[223]=Ju;for(let e=224;e<=243;e++)eh[e]=Xu("simple values are not supported");eh[244]=Ju,eh[245]=Ju,eh[246]=Ju,eh[247]=function(e,t,n,r){if(!1===r.allowUndefined)throw new Error(`${uu} undefined values are not supported`);return!0===r.coerceUndefinedToNull?new Xl(Jl.null,null,1):new Xl(Jl.undefined,void 0,1)},eh[248]=Xu("simple values are not supported"),eh[249]=function(e,t,n,r){return $u(Gu(e,t+1),3,r)},eh[250]=function(e,t,n,r){return $u(Qu(e,t+1),5,r)},eh[251]=function(e,t,n,r){return $u(Zu(e,t+1),9,r)},eh[252]=Ju,eh[253]=Ju,eh[254]=Ju,eh[255]=function(e,t,n,r){if(!1===r.allowIndefinite)throw new Error(`${uu} indefinite length items not allowed`);return new Xl(Jl.break,void 0,1)};const th=[];for(let e=0;e<24;e++)th[e]=new Xl(Jl.uint,e,1);for(let e=-1;e>=-24;e--)th[31-e]=new Xl(Jl.negint,e,1);th[64]=new Xl(Jl.bytes,new Uint8Array(0),1),th[96]=new Xl(Jl.string,"",1),th[128]=new Xl(Jl.array,0,1),th[160]=new Xl(Jl.map,0,1),th[244]=new Xl(Jl.false,!1,1),th[245]=new Xl(Jl.true,!0,1),th[246]=new Xl(Jl.null,null,1),function(){const e=[];e[Jl.uint.major]=wu,e[Jl.negint.major]=Su,e[Jl.bytes.major]=Au,e[Jl.string.major]=ku,e[Jl.array.major]=xu,e[Jl.map.major]=Ou,e[Jl.tag.major]=Bu,e[Jl.float.major]=qu}();class nh{constructor(e,t){this.obj=e,this.parent=t}includes(e){let t=this;do{if(t.obj===e)return!0}while(t=t.parent);return!1}static createCheck(e,t){if(e&&e.includes(t))throw new Error(`${hu} object contains circular references`);return new nh(t,e)}}const rh={null:new Xl(Jl.null,null),undefined:new Xl(Jl.undefined,void 0),true:new Xl(Jl.true,!0),false:new Xl(Jl.false,!1),emptyArray:new Xl(Jl.array,0),emptyMap:new Xl(Jl.map,0)},sh={number:(e,t,n,r)=>Number.isInteger(e)&&Number.isSafeInteger(e)?new Xl(e>=0?Jl.uint:Jl.negint,e):new Xl(Jl.float,e),bigint:(e,t,n,r)=>e>=BigInt(0)?new Xl(Jl.uint,e):new Xl(Jl.negint,e),Uint8Array:(e,t,n,r)=>new Xl(Jl.bytes,e),string:(e,t,n,r)=>new Xl(Jl.string,e),boolean:(e,t,n,r)=>e?rh.true:rh.false,null:(e,t,n,r)=>rh.null,undefined:(e,t,n,r)=>rh.undefined,ArrayBuffer:(e,t,n,r)=>new Xl(Jl.bytes,new Uint8Array(e)),DataView:(e,t,n,r)=>new Xl(Jl.bytes,new Uint8Array(e.buffer,e.byteOffset,e.byteLength)),Array(e,t,n,r){if(!e.length)return!0===n.addBreakTokens?[rh.emptyArray,new Xl(Jl.break)]:rh.emptyArray;r=nh.createCheck(r,e);const s=[];let i=0;for(const t of e)s[i++]=ih(t,n,r);return n.addBreakTokens?[new Xl(Jl.array,e.length),s,new Xl(Jl.break)]:[new Xl(Jl.array,e.length),s]},Object(e,t,n,r){const s="Object"!==t,i=s?e.keys():Object.keys(e),o=s?e.size:i.length;if(!o)return!0===n.addBreakTokens?[rh.emptyMap,new Xl(Jl.break)]:rh.emptyMap;r=nh.createCheck(r,e);const a=[];let c=0;for(const t of i)a[c++]=[ih(t,n,r),ih(s?e.get(t):e[t],n,r)];return function(e,t){t.mapSorter&&e.sort(t.mapSorter)}(a,n),n.addBreakTokens?[new Xl(Jl.map,o),a,new Xl(Jl.break)]:[new Xl(Jl.map,o),a]}};sh.Map=sh.Object,sh.Buffer=sh.Uint8Array;for(const e of"Uint8Clamped Uint16 Uint32 Int8 Int16 Int32 BigUint64 BigInt64 Float32 Float64".split(" "))sh[`${e}Array`]=sh.DataView;function ih(e,t={},n){const r=Zl(e),s=t&&t.typeEncoders&&t.typeEncoders[r]||sh[r];if("function"==typeof s){const i=s(e,r,t,n);if(null!=i)return i}const i=sh[r];if(!i)throw new Error(`${hu} unsupported type: ${r}`);return i(e,r,t,n)}const oh={strict:!1,allowIndefinite:!0,allowUndefined:!0,allowBigInt:!0};class ah{constructor(e,t={}){this._pos=0,this.data=e,this.options=t}pos(){return this._pos}done(){return this._pos>=this.data.length}next(){const e=this.data[this._pos];let t=th[e];if(void 0===t){const n=eh[e];if(!n)throw new Error(`${uu} no decoder for major type ${e>>>5} (byte 0x${e.toString(16).padStart(2,"0")})`);const r=31&e;t=n(this.data,this._pos,r,this.options)}return this._pos+=t.encodedLength,t}}const ch=Symbol.for("DONE"),lh=Symbol.for("BREAK");function uh(e,t){if(e.done())return ch;const n=e.next();if(n.type===Jl.break)return lh;if(n.type.terminal)return n.value;if(n.type===Jl.array)return function(e,t,n){const r=[];for(let s=0;s<e.value;s++){const i=uh(t,n);if(i===lh){if(e.value===1/0)break;throw new Error(`${uu} got unexpected break to lengthed array`)}if(i===ch)throw new Error(`${uu} found array but not enough entries (got ${s}, expected ${e.value})`);r[s]=i}return r}(n,e,t);if(n.type===Jl.map)return function(e,t,n){const r=!0===n.useMaps,s=r?void 0:{},i=r?new Map:void 0;for(let o=0;o<e.value;o++){const a=uh(t,n);if(a===lh){if(e.value===1/0)break;throw new Error(`${uu} got unexpected break to lengthed map`)}if(a===ch)throw new Error(`${uu} found map but not enough entries (got ${o} [no key], expected ${e.value})`);if(!0!==r&&"string"!=typeof a)throw new Error(`${uu} non-string keys not supported (got ${typeof a})`);if(!0===n.rejectDuplicateMapKeys&&(r&&i.has(a)||!r&&a in s))throw new Error(`${uu} found repeat map key "${a}"`);const c=uh(t,n);if(c===ch)throw new Error(`${uu} found map but not enough entries (got ${o} [no value], expected ${e.value})`);r?i.set(a,c):s[a]=c}return r?i:s}(n,e,t);if(n.type===Jl.tag){if(t.tags&&"function"==typeof t.tags[n.value]){const r=uh(e,t);return t.tags[n.value](r)}throw new Error(`${uu} tag not supported (${n.value})`)}throw new Error("unsupported")}function hh(e,t){const[n,r]=function(e,t){if(!(e instanceof Uint8Array))throw new Error(`${uu} data to decode must be a Uint8Array`);const n=(t=Object.assign({},oh,t)).tokenizer||new ah(e,t),r=uh(n,t);if(r===ch)throw new Error(`${uu} did not find any content to decode`);if(r===lh)throw new Error(`${uu} got unexpected break`);return[r,e.subarray(n.pos())]}(e,t);if(r.length>0)throw new Error(`${uu} too many terminals, data makes no sense`);return n}const dh=ds("ipns:utils"),ph=kt("/ipns/"),fh=e=>"signatureV1"in e?Gl.encode({value:kt(e.value),signatureV1:e.signatureV1,validityType:e.validityType,validity:kt(e.validity),sequence:e.sequence,ttl:e.ttl,pubKey:e.pubKey,signatureV2:e.signatureV2,data:e.data}):Gl.encode({pubKey:e.pubKey,signatureV2:e.signatureV2,data:e.data});function gh(e){const t=Gl.decode(e);if(null!=t.sequence&&(t.sequence=BigInt(t.sequence)),null!=t.ttl&&(t.ttl=BigInt(t.ttl)),null==t.signatureV2||null==t.data)throw Vr(new Error("missing data or signatureV2"),Wl);const n=mh(t.data),r=yh(n.Value),s=Qt(n.Validity);if(null!=t.value&&null!=t.signatureV1)return wh(t),{value:r,validityType:Gl.ValidityType.EOL,validity:s,sequence:n.Sequence,ttl:n.TTL,pubKey:t.pubKey,signatureV1:t.signatureV1,signatureV2:t.signatureV2,data:t.data};if(null!=t.signatureV2)return{value:r,validityType:Gl.ValidityType.EOL,validity:s,sequence:n.Sequence,ttl:n.TTL,pubKey:t.pubKey,signatureV2:t.signatureV2,data:t.data};throw new Error("invalid record: does not include signatureV1 or signatureV2")}const mh=e=>{const t=hh(e);if(0!==t.ValidityType)throw Vr(new Error("Unknown validity type"),zl);return t.ValidityType=Gl.ValidityType.EOL,Number.isInteger(t.Sequence)&&(t.Sequence=BigInt(t.Sequence)),Number.isInteger(t.TTL)&&(t.TTL=BigInt(t.TTL)),t},yh=e=>{if(null!=e){if(on(e))return`/ipns/${e.toCID().toString(De)}`;if(e instanceof Uint8Array){const t=Qt(e);t.startsWith("/")&&(e=t)}const t=e.toString().trim();if(t.startsWith("/")&&t.length>1)return t;const n=bt.asCID(e);if(null!=n)return 114===n.code?`/ipns/${n.toString(De)}`:`/ipfs/${n.toV1().toString()}`;try{return e instanceof Uint8Array?`/ipfs/${bt.decode(e).toV1().toString()}`:`/ipfs/${bt.parse(t).toV1().toString()}`}catch{}}throw Vr(new Error("Value must be a valid content path starting with /"),"ERR_INVALID_VALUE")},wh=e=>{if(null==e.data)throw Vr(new Error("Record data is missing"),"ERR_INVALID_RECORD_DATA");const t=mh(e.data);if(!In(t.Value,e.value??new Uint8Array(0)))throw Vr(new Error('Field "value" did not match between protobuf and CBOR'),Wl);if(!In(t.Validity,e.validity??new Uint8Array(0)))throw Vr(new Error('Field "validity" did not match between protobuf and CBOR'),Wl);if(t.ValidityType!==e.validityType)throw Vr(new Error('Field "validityType" did not match between protobuf and CBOR'),Wl);if(t.Sequence!==e.sequence)throw Vr(new Error('Field "sequence" did not match between protobuf and CBOR'),Wl);if(t.TTL!==e.ttl)throw Vr(new Error('Field "ttl" did not match between protobuf and CBOR'),Wl)},bh=ds("ipns:validator"),vh=async(e,t)=>{const n=gh(t);let r;try{const t=(s=n.data,Rn([kt("ipns-signature:"),s]));r=await e.verify(t,n.signatureV2)}catch(e){r=!1}var s;if(!r)throw bh.error("record signature verification failed"),Vr(new Error("record signature verification failed"),Wl);if(n.validityType===Gl.ValidityType.EOL){if(Hl.fromString(n.validity).toDate().getTime()<Date.now())throw bh.error("record has expired"),Vr(new Error("record has expired"),"ERR_IPNS_EXPIRED_RECORD")}else if(null!=n.validityType)throw bh.error("unrecognized validity type"),Vr(new Error("unrecognized validity type"),zl);bh("ipns record for %s is valid",n.value)};async function Eh(e,t){if(t.byteLength>10240)throw Vr(new Error("record too large"),"ERR_RECORD_TOO_LARGE");const n=(e=>_s(e.slice(ph.length)))(e),r=gh(t),s=await(async(e,t)=>{if(null==t||null==e){const e=new Error("one or more of the provided parameters are not defined");throw dh.error(e),Vr(e,jl)}let n;if(null!=t.pubKey){try{n=Fl(t.pubKey)}catch(e){throw dh.error(e),e}if(!(await Is(t.pubKey)).equals(e))throw Vr(new Error("Embedded public key did not match PeerID"),"ERR_INVALID_EMBEDDED_KEY")}else null!=e.publicKey&&(n=Fl(e.publicKey));if(null!=n)return n;throw Vr(new Error("no public key is available"),jl)})(n,r);await vh(s,t)}async function*Sh(e){const t=/\r?\n/,n=new TextDecoder("utf8");let r="";for await(let s of e){"string"==typeof s&&(s=(new TextEncoder).encode(s)),r+=n.decode(s,{stream:!0});const e=r.split(t);r=e.pop()??"";for(let t=0;t<e.length;t++)yield JSON.parse(e[t])}r+=n.decode(),""!==r&&(yield JSON.parse(r))}var _h={exports:{}};!function(e){var t=Object.prototype.hasOwnProperty,n="~";function r(){}function s(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function i(e,t,r,i,o){if("function"!=typeof r)throw new TypeError("The listener must be a function");var a=new s(r,i||e,o),c=n?n+t:t;return e._events[c]?e._events[c].fn?e._events[c]=[e._events[c],a]:e._events[c].push(a):(e._events[c]=a,e._eventsCount++),e}function o(e,t){0==--e._eventsCount?e._events=new r:delete e._events[t]}function a(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),a.prototype.eventNames=function(){var e,r,s=[];if(0===this._eventsCount)return s;for(r in e=this._events)t.call(e,r)&&s.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?s.concat(Object.getOwnPropertySymbols(e)):s},a.prototype.listeners=function(e){var t=n?n+e:e,r=this._events[t];if(!r)return[];if(r.fn)return[r.fn];for(var s=0,i=r.length,o=new Array(i);s<i;s++)o[s]=r[s].fn;return o},a.prototype.listenerCount=function(e){var t=n?n+e:e,r=this._events[t];return r?r.fn?1:r.length:0},a.prototype.emit=function(e,t,r,s,i,o){var a=n?n+e:e;if(!this._events[a])return!1;var c,l,u=this._events[a],h=arguments.length;if(u.fn){switch(u.once&&this.removeListener(e,u.fn,void 0,!0),h){case 1:return u.fn.call(u.context),!0;case 2:return u.fn.call(u.context,t),!0;case 3:return u.fn.call(u.context,t,r),!0;case 4:return u.fn.call(u.context,t,r,s),!0;case 5:return u.fn.call(u.context,t,r,s,i),!0;case 6:return u.fn.call(u.context,t,r,s,i,o),!0}for(l=1,c=new Array(h-1);l<h;l++)c[l-1]=arguments[l];u.fn.apply(u.context,c)}else{var d,p=u.length;for(l=0;l<p;l++)switch(u[l].once&&this.removeListener(e,u[l].fn,void 0,!0),h){case 1:u[l].fn.call(u[l].context);break;case 2:u[l].fn.call(u[l].context,t);break;case 3:u[l].fn.call(u[l].context,t,r);break;case 4:u[l].fn.call(u[l].context,t,r,s);break;default:if(!c)for(d=1,c=new Array(h-1);d<h;d++)c[d-1]=arguments[d];u[l].fn.apply(u[l].context,c)}}return!0},a.prototype.on=function(e,t,n){return i(this,e,t,n,!1)},a.prototype.once=function(e,t,n){return i(this,e,t,n,!0)},a.prototype.removeListener=function(e,t,r,s){var i=n?n+e:e;if(!this._events[i])return this;if(!t)return o(this,i),this;var a=this._events[i];if(a.fn)a.fn!==t||s&&!a.once||r&&a.context!==r||o(this,i);else{for(var c=0,l=[],u=a.length;c<u;c++)(a[c].fn!==t||s&&!a[c].once||r&&a[c].context!==r)&&l.push(a[c]);l.length?this._events[i]=1===l.length?l[0]:l:o(this,i)}return this},a.prototype.removeAllListeners=function(e){var t;return e?(t=n?n+e:e,this._events[t]&&o(this,t)):(this._events=new r,this._eventsCount=0),this},a.prototype.off=a.prototype.removeListener,a.prototype.addListener=a.prototype.on,a.prefixed=n,a.EventEmitter=a,e.exports=a}(_h);var Ih=Br(_h.exports);class Rh extends Error{constructor(e){super(e),this.name="TimeoutError"}}let Ah=class extends Error{constructor(e){super(),this.name="AbortError",this.message=e}};const Th=e=>void 0===globalThis.DOMException?new Ah(e):new DOMException(e),Dh=e=>{const t=void 0===e.reason?Th("This operation was aborted."):e.reason;return t instanceof Error?t:Th(t)};function kh(e,t){const{milliseconds:n,fallback:r,message:s,customTimers:i={setTimeout:setTimeout,clearTimeout:clearTimeout}}=t;let o;const a=new Promise(((a,c)=>{if("number"!=typeof n||1!==Math.sign(n))throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${n}\``);if(t.signal){const{signal:e}=t;e.aborted&&c(Dh(e)),e.addEventListener("abort",(()=>{c(Dh(e))}))}if(n===Number.POSITIVE_INFINITY)return void e.then(a,c);const l=new Rh;o=i.setTimeout.call(void 0,(()=>{if(r)try{a(r())}catch(e){c(e)}else"function"==typeof e.cancel&&e.cancel(),!1===s?a():s instanceof Error?c(s):(l.message=s??`Promise timed out after ${n} milliseconds`,c(l))}),n),(async()=>{try{a(await e)}catch(e){c(e)}})()})).finally((()=>{a.clear()}));return a.clear=()=>{i.clearTimeout.call(void 0,o),o=void 0},a}let Ph=class{#i=[];enqueue(e,t){const n={priority:(t={priority:0,...t}).priority,run:e};if(this.size&&this.#i[this.size-1].priority>=t.priority)return void this.#i.push(n);const r=function(e,t,n){let r=0,s=e.length;for(;s>0;){const i=Math.trunc(s/2);let o=r+i;n(e[o],t)<=0?(r=++o,s-=i+1):s=i}return r}(this.#i,n,((e,t)=>t.priority-e.priority));this.#i.splice(r,0,n)}dequeue(){const e=this.#i.shift();return e?.run}filter(e){return this.#i.filter((t=>t.priority===e.priority)).map((e=>e.run))}get size(){return this.#i.length}};class Ch extends Ih{#o;#a;#c=0;#l;#u;#h=0;#d;#p;#i;#f;#g=0;#m;#y;#w;timeout;constructor(e){if(super(),!("number"==typeof(e={carryoverConcurrencyCount:!1,intervalCap:Number.POSITIVE_INFINITY,interval:0,concurrency:Number.POSITIVE_INFINITY,autoStart:!0,queueClass:Ph,...e}).intervalCap&&e.intervalCap>=1))throw new TypeError(`Expected \`intervalCap\` to be a number from 1 and up, got \`${e.intervalCap?.toString()??""}\` (${typeof e.intervalCap})`);if(void 0===e.interval||!(Number.isFinite(e.interval)&&e.interval>=0))throw new TypeError(`Expected \`interval\` to be a finite number >= 0, got \`${e.interval?.toString()??""}\` (${typeof e.interval})`);this.#o=e.carryoverConcurrencyCount,this.#a=e.intervalCap===Number.POSITIVE_INFINITY||0===e.interval,this.#l=e.intervalCap,this.#u=e.interval,this.#i=new e.queueClass,this.#f=e.queueClass,this.concurrency=e.concurrency,this.timeout=e.timeout,this.#w=!0===e.throwOnTimeout,this.#y=!1===e.autoStart}get#b(){return this.#a||this.#c<this.#l}get#v(){return this.#g<this.#m}#E(){this.#g--,this.#S(),this.emit("next")}#_(){this.#I(),this.#R(),this.#p=void 0}get#A(){const e=Date.now();if(void 0===this.#d){const t=this.#h-e;if(!(t<0))return void 0===this.#p&&(this.#p=setTimeout((()=>{this.#_()}),t)),!0;this.#c=this.#o?this.#g:0}return!1}#S(){if(0===this.#i.size)return this.#d&&clearInterval(this.#d),this.#d=void 0,this.emit("empty"),0===this.#g&&this.emit("idle"),!1;if(!this.#y){const e=!this.#A;if(this.#b&&this.#v){const t=this.#i.dequeue();return!!t&&(this.emit("active"),t(),e&&this.#R(),!0)}}return!1}#R(){this.#a||void 0!==this.#d||(this.#d=setInterval((()=>{this.#I()}),this.#u),this.#h=Date.now()+this.#u)}#I(){0===this.#c&&0===this.#g&&this.#d&&(clearInterval(this.#d),this.#d=void 0),this.#c=this.#o?this.#g:0,this.#T()}#T(){for(;this.#S(););}get concurrency(){return this.#m}set concurrency(e){if(!("number"==typeof e&&e>=1))throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${e}\` (${typeof e})`);this.#m=e,this.#T()}async#D(e){return new Promise(((t,n)=>{e.addEventListener("abort",(()=>{n(e.reason)}),{once:!0})}))}async add(e,t={}){return t={timeout:this.timeout,throwOnTimeout:this.#w,...t},new Promise(((n,r)=>{this.#i.enqueue((async()=>{this.#g++,this.#c++;try{t.signal?.throwIfAborted();let r=e({signal:t.signal});t.timeout&&(r=kh(Promise.resolve(r),{milliseconds:t.timeout})),t.signal&&(r=Promise.race([r,this.#D(t.signal)]));const s=await r;n(s),this.emit("completed",s)}catch(e){if(e instanceof Rh&&!t.throwOnTimeout)return void n();r(e),this.emit("error",e)}finally{this.#E()}}),t),this.emit("add"),this.#S()}))}async addAll(e,t){return Promise.all(e.map((async e=>this.add(e,t))))}start(){return this.#y?(this.#y=!1,this.#T(),this):this}pause(){this.#y=!0}clear(){this.#i=new this.#f}async onEmpty(){0!==this.#i.size&&await this.#k("empty")}async onSizeLessThan(e){this.#i.size<e||await this.#k("next",(()=>this.#i.size<e))}async onIdle(){0===this.#g&&0===this.#i.size||await this.#k("idle")}async#k(e,t){return new Promise((n=>{const r=()=>{t&&!t()||(this.off(e,r),n())};this.on(e,r)}))}get size(){return this.#i.size}sizeBy(e){return this.#i.filter(e).length}get pending(){return this.#g}get isPaused(){return this.#y}}function xh(e){if(null!=e[Symbol.asyncIterator])return(async()=>{for await(const t of e)return t})();for(const t of e)return t}const Nh=kt("/ipns/");function Mh(e){return In(e.subarray(0,Nh.byteLength),Nh)}const Oh=e=>_s(e.slice(Nh.length));class Lh{client;constructor(e){this.client=e}async*findProviders(e,t={}){yield*zr(this.client.getProviders(e,t),(e=>({id:e.ID,multiaddrs:e.Addrs??[]})))}async provide(){}async put(e,t,n){if(!Mh(e))return;const r=Oh(e),s=gh(t);await this.client.putIPNS(r,s,n)}async get(e,t){if(!Mh(e))throw new fn("Not found","ERR_NOT_FOUND");const n=Oh(e);try{const e=await this.client.getIPNS(n,t);return fh(e)}catch(e){if("ERR_BAD_RESPONSE"===e.code)throw new fn("Not found","ERR_NOT_FOUND");throw e}}}class Bh{client;constructor(e){this.client=e}async findPeer(e,t={}){const n=await xh(this.client.getPeers(e,t));if(null!=n)return{id:n.ID,multiaddrs:n.Addrs??[]};throw new fn("Not found","ERR_NOT_FOUND")}async*getClosestPeers(e,t={}){}}const Uh=ds("delegated-routing-v1-http-api-client"),Fh=4,Vh=3e4;class Kh{started;httpQueue;shutDownController;clientUrl;timeout;contentRouting;peerRouting;constructor(e,t={}){this.started=!1,this.shutDownController=new AbortController,this.shutDownController.signal,this.httpQueue=new Ch({concurrency:t.concurrentRequests??Fh}),this.clientUrl=e instanceof URL?e:new URL(e),this.timeout=t.timeout??Vh,this.contentRouting=new Lh(this),this.peerRouting=new Bh(this)}get[nn](){return this.contentRouting}get[an](){return this.peerRouting}isStarted(){return this.started}start(){this.started=!0}stop(){this.httpQueue.clear(),this.shutDownController.abort(),this.started=!1}async*getProviders(e,t={}){Uh("getProviders starts: %c",e);const n=AbortSignal.timeout(this.timeout),r=Rs([this.shutDownController.signal,n,t.signal]),s=lr(),i=lr();this.httpQueue.add((async()=>(s.resolve(),i.promise)));try{await s.promise;const t=`${this.clientUrl}routing/v1/providers/${e.toString()}`,n={headers:{Accept:"application/x-ndjson"},signal:r},i=await fetch(t,n);if(404===i.status)throw new fn("No matching records found.","ERR_NOT_FOUND");if(422===i.status)throw new fn("Request does not conform to schema or semantic constraints.","ERR_INVALID_REQUEST");if(null==i.body)throw new fn("Routing response had no body","ERR_BAD_RESPONSE");if("application/json"===i.headers.get("Content-Type")){const e=await i.json();for(const t of e.Providers){const e=this.#P(t);null!=e&&(yield e)}}else for await(const e of Sh(As(i.body))){const t=this.#P(e);null!=t&&(yield t)}}catch(e){Uh.error("getProviders errored:",e)}finally{r.clear(),i.resolve(),Uh("getProviders finished: %c",e)}}async*getPeers(e,t={}){Uh("getPeers starts: %c",e);const n=AbortSignal.timeout(this.timeout),r=Rs([this.shutDownController.signal,n,t.signal]),s=lr(),i=lr();this.httpQueue.add((async()=>(s.resolve(),i.promise)));try{await s.promise;const t=`${this.clientUrl}routing/v1/peers/${e.toCID().toString()}`,n={headers:{Accept:"application/x-ndjson"},signal:r},i=await fetch(t,n);if(404===i.status)throw new fn("No matching records found.","ERR_NOT_FOUND");if(422===i.status)throw new fn("Request does not conform to schema or semantic constraints.","ERR_INVALID_REQUEST");if(null==i.body)throw new fn("Routing response had no body","ERR_BAD_RESPONSE");if("application/json"===i.headers.get("Content-Type")){const e=await i.json();for(const t of e.Peers){const e=this.#P(t);null!=e&&(yield e)}}else for await(const e of Sh(As(i.body))){const t=this.#P(e);null!=t&&(yield t)}}catch(e){Uh.error("getPeers errored:",e)}finally{r.clear(),i.resolve(),Uh("getPeers finished: %c",e)}}async getIPNS(e,t={}){Uh("getIPNS starts: %c",e);const n=AbortSignal.timeout(this.timeout),r=Rs([this.shutDownController.signal,n,t.signal]),s=lr(),i=lr();this.httpQueue.add((async()=>(s.resolve(),i.promise)));const o=`${this.clientUrl}routing/v1/ipns/${e.toCID().toString()}`;try{await s.promise;const n={headers:{Accept:"application/vnd.ipfs.ipns-record"},signal:r},i=await fetch(o,n);if(Uh("getIPNS GET %s %d",o,i.status),404===i.status)throw new fn("No matching records found.","ERR_NOT_FOUND");if(422===i.status)throw new fn("Request does not conform to schema or semantic constraints.","ERR_INVALID_REQUEST");if(null==i.body)throw new fn("GET ipns response had no body","ERR_BAD_RESPONSE");const a=await i.arrayBuffer(),c=new Uint8Array(a,0,a.byteLength);return!1!==t.validate&&await Eh((e=>Rn([ph,e.toBytes()]))(e),c),gh(c)}catch(e){throw Uh.error("getIPNS GET %s error:",o,e),e}finally{r.clear(),i.resolve(),Uh("getIPNS finished: %c",e)}}async putIPNS(e,t,n={}){Uh("putIPNS starts: %c",e);const r=AbortSignal.timeout(this.timeout),s=Rs([this.shutDownController.signal,r,n.signal]),i=lr(),o=lr();this.httpQueue.add((async()=>(i.resolve(),o.promise)));const a=`${this.clientUrl}routing/v1/ipns/${e.toCID().toString()}`;try{await i.promise;const e={method:"PUT",headers:{"Content-Type":"application/vnd.ipfs.ipns-record"},body:fh(t),signal:s},n=await fetch(a,e);if(Uh("putIPNS PUT %s %d",a,n.status),200!==n.status)throw new fn("PUT ipns response had status other than 200","ERR_BAD_RESPONSE")}catch(e){throw Uh.error("putIPNS PUT %s error:",a,e.stack),e}finally{s.clear(),o.resolve(),Uh("putIPNS finished: %c",e)}}#P(e){const t=[],n=e.Addrs?.map(cr)??[];return null!=e.Protocols&&t.push(...e.Protocols),null!=e.Protocol&&(t.push(e.Protocol),delete e.Protocol),{...e,Schema:"peer",ID:Ss(e.ID),Addrs:n,Protocols:t}}}function $h(e,t={}){return new Kh(new URL(e),t)}function qh(e,t){const n={[Symbol.iterator]:()=>n,next:()=>{const n=e.next(),r=n.value;if(!0===n.done||null==r){return{done:!0,value:void 0}}return{done:!1,value:t(r)}}};return n}class Hh{map;constructor(e){if(this.map=new Map,null!=e)for(const[t,n]of e.entries())this.map.set(t.toString(),n)}[Symbol.iterator](){return this.entries()}clear(){this.map.clear()}delete(e){return this.map.delete(e.toString())}entries(){return qh(this.map.entries(),(e=>[Ss(e[0]),e[1]]))}forEach(e){this.map.forEach(((t,n)=>{e(t,Ss(n),this)}))}get(e){return this.map.get(e.toString())}has(e){return this.map.has(e.toString())}set(e,t){this.map.set(e.toString(),t)}keys(){return qh(this.map.keys(),(e=>Ss(e)))}values(){return this.map.values()}get size(){return this.map.size}}class zh{set;constructor(e){if(this.set=new Set,null!=e)for(const t of e)this.set.add(t.toString())}get size(){return this.set.size}[Symbol.iterator](){return this.values()}add(e){this.set.add(e.toString())}clear(){this.set.clear()}delete(e){this.set.delete(e.toString())}entries(){return qh(this.set.entries(),(e=>{const t=Ss(e[0]);return[t,t]}))}forEach(e){this.set.forEach((t=>{const n=Ss(t);e(n,n,this)}))}has(e){return this.set.has(e.toString())}values(){return qh(this.set.values(),(e=>Ss(e)))}intersection(e){const t=new zh;for(const n of e)this.has(n)&&t.add(n);return t}difference(e){const t=new zh;for(const n of this)e.has(n)||t.add(n);return t}union(e){const t=new zh;for(const n of e)t.add(n);for(const e of this)t.add(e);return t}}const Wh=async()=>{const e=await async function(e,t){return Ul(e).generateKeyPair(2048)}("Ed25519"),t=await async function(e){return Is(Vl(e.public),function(e,t){return Ul(t=(t??"rsa").toLowerCase()),e.bytes}(e))}(e);if("Ed25519"===t.type)return t;throw new Error(`Generated unexpected PeerId type "${t.type}"`)};const jh="ERR_SIGNATURE_NOT_VALID";var Gh;!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.publicKey&&e.publicKey.byteLength>0&&(t.uint32(10),t.bytes(e.publicKey)),null!=e.payloadType&&e.payloadType.byteLength>0&&(t.uint32(18),t.bytes(e.payloadType)),null!=e.payload&&e.payload.byteLength>0&&(t.uint32(26),t.bytes(e.payload)),null!=e.signature&&e.signature.byteLength>0&&(t.uint32(42),t.bytes(e.signature)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={publicKey:new Uint8Array(0),payloadType:new Uint8Array(0),payload:new Uint8Array(0),signature:new Uint8Array(0)},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.publicKey=e.bytes();break;case 2:n.payloadType=e.bytes();break;case 3:n.payload=e.bytes();break;case 5:n.signature=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Gh||(Gh={}));class Yh{static createFromProtobuf=async e=>{const t=Gh.decode(e),n=await Is(t.publicKey);return new Yh({peerId:n,payloadType:t.payloadType,payload:t.payload,signature:t.signature})};static seal=async(e,t)=>{if(null==t.privateKey)throw new Error("Missing private key");const n=e.domain,r=e.codec,s=e.marshal(),i=Qh(n,r,s),o=await Kl(t.privateKey),a=await o.sign(i.subarray());return new Yh({peerId:t,payloadType:r,payload:s,signature:a})};static openAndCertify=async(e,t)=>{const n=await Yh.createFromProtobuf(e);if(!await n.validate(t))throw new fn("envelope signature is not valid for the given domain",jh);return n};peerId;payloadType;payload;signature;marshaled;constructor(e){const{peerId:t,payloadType:n,payload:r,signature:s}=e;this.peerId=t,this.payloadType=n,this.payload=r,this.signature=s}marshal(){if(null==this.peerId.publicKey)throw new Error("Missing public key");return null==this.marshaled&&(this.marshaled=Gh.encode({publicKey:this.peerId.publicKey,payloadType:this.payloadType,payload:this.payload.subarray(),signature:this.signature})),this.marshaled}equals(e){return In(this.marshal(),e.marshal())}async validate(e){const t=Qh(e,this.payloadType,this.payload);if(null==this.peerId.publicKey)throw new Error("Missing public key");return Fl(this.peerId.publicKey).verify(t.subarray(),this.signature)}}const Qh=(e,t,n)=>{const r=kt(e),s=C(r.byteLength),i=C(t.length),o=C(n.length);return new Ir(s,r,i,t,o,n)};const Zh=Uint8Array.from([3,1]);var Jh;!function(e){let t;!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.multiaddr&&e.multiaddr.byteLength>0&&(t.uint32(10),t.bytes(e.multiaddr)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={multiaddr:new Uint8Array(0)},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();if(t>>>3==1)n.multiaddr=e.bytes();else e.skipType(7&t)}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(e.AddressInfo||(e.AddressInfo={})),e.codec=()=>(null==t&&(t=jt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.peerId&&t.peerId.byteLength>0&&(n.uint32(10),n.bytes(t.peerId)),null!=t.seq&&0n!==t.seq&&(n.uint32(16),n.uint64(t.seq)),null!=t.addresses)for(const r of t.addresses)n.uint32(26),e.AddressInfo.codec().encode(r,n);!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={peerId:new Uint8Array(0),seq:0n,addresses:[]},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.peerId=t.bytes();break;case 2:r.seq=t.uint64();break;case 3:r.addresses.push(e.AddressInfo.codec().decode(t,t.uint32()));break;default:t.skipType(7&n)}}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Jh||(Jh={}));class Xh{static createFromProtobuf=e=>{const t=Jh.decode(e),n=_s(t.peerId),r=(t.addresses??[]).map((e=>cr(e.multiaddr))),s=t.seq;return new Xh({peerId:n,multiaddrs:r,seqNumber:s})};static DOMAIN="libp2p-peer-record";static CODEC=Zh;peerId;multiaddrs;seqNumber;domain=Xh.DOMAIN;codec=Xh.CODEC;marshaled;constructor(e){const{peerId:t,multiaddrs:n,seqNumber:r}=e;this.peerId=t,this.multiaddrs=n??[],this.seqNumber=r??BigInt(Date.now())}marshal(){return null==this.marshaled&&(this.marshaled=Jh.encode({peerId:this.peerId.toBytes(),seq:BigInt(this.seqNumber),addresses:this.multiaddrs.map((e=>({multiaddr:e.bytes})))})),this.marshaled}equals(e){return e instanceof Xh&&(!!this.peerId.equals(e.peerId)&&(this.seqNumber===e.seqNumber&&!!function(e,t){const n=(e,t)=>e.toString().localeCompare(t.toString());return e.length===t.length&&(t.sort(n),e.sort(n).every(((e,n)=>t[n].equals(e))))}(this.multiaddrs,e.multiaddrs)))}}function ed(e){if(null!=e[Symbol.asyncIterator])return(async()=>{const t=[];for await(const n of e)t.push(n);return t})();const t=[];for(const n of e)t.push(n);return t}const td={},nd=e=>{e.addEventListener("message",(t=>{nd.dispatchEvent("message",e,t)})),null!=e.port&&e.port.addEventListener("message",(t=>{nd.dispatchEvent("message",e,t)}))};nd.addEventListener=(e,t)=>{null==td[e]&&(td[e]=[]),td[e].push(t)},nd.removeEventListener=(e,t)=>{null!=td[e]&&(td[e]=td[e].filter((e=>e===t)))},nd.dispatchEvent=function(e,t,n){null!=td[e]&&td[e].forEach((e=>e(t,n)))};const rd="lock:worker:request-read",sd="lock:worker:release-read",id="lock:master:grant-read",od="lock:worker:request-write",ad="lock:worker:release-write",cd="lock:master:grant-write",ld=(e,t,n,r,s)=>(i,o)=>{if(o.data.type!==n)return;const a={type:o.data.type,name:o.data.name,identifier:o.data.identifier};e.dispatchEvent(new MessageEvent(t,{data:{name:a.name,handler:async()=>{i.postMessage({type:s,name:a.name,identifier:a.identifier}),await new Promise((e=>{const t=n=>{if(null==n||null==n.data)return;const s=n.data.type,o=(n.data.name,n.data.identifier);s===r&&o===a.identifier&&(i.removeEventListener("message",t),e())};i.addEventListener("message",t)}))}}}))},ud=(e,t,n,r)=>async()=>{const s=Math.random().toString().substring(2);return globalThis.postMessage({type:t,identifier:s,name:e}),new Promise((t=>{const i=o=>{if(null==o||null==o.data)return;const a=o.data.type,c=o.data.identifier;a===n&&c===s&&(globalThis.removeEventListener("message",i),t((()=>{globalThis.postMessage({type:r,identifier:s,name:e})})))};globalThis.addEventListener("message",i)}))},hd={singleProcess:!1};const dd={};let pd;async function fd(e,t){let n;const r=new Promise((e=>{n=e}));return e.add((async()=>kh((async()=>{await new Promise((e=>{n((()=>{e()}))}))})(),{milliseconds:t.timeout}))),r}const gd={name:"lock",concurrency:1/0,timeout:846e5,singleProcess:!1};function md(e){const t=Object.assign({},gd,e);return null==pd&&(pd=(e=>{if(e=Object.assign({},hd,e),Boolean(globalThis.document)||e.singleProcess){const e=new EventTarget;return nd.addEventListener("message",ld(e,"requestReadLock",rd,sd,id)),nd.addEventListener("message",ld(e,"requestWriteLock",od,ad,cd)),e}return{isWorker:!0,readLock:e=>ud(e,rd,id,sd),writeLock:e=>ud(e,od,cd,ad)}})(t),!0!==pd.isWorker&&(pd.addEventListener("requestReadLock",(e=>{null!=dd[e.data.name]&&dd[e.data.name].readLock().then((async t=>e.data.handler().finally((()=>{t()}))))})),pd.addEventListener("requestWriteLock",(async e=>{null!=dd[e.data.name]&&dd[e.data.name].writeLock().then((async t=>e.data.handler().finally((()=>{t()}))))})))),null==dd[t.name]&&(dd[t.name]=((e,t)=>{if(!0===pd.isWorker)return{readLock:pd.readLock(e,t),writeLock:pd.writeLock(e,t)};const n=new Ch({concurrency:1});let r;return{async readLock(){if(null!=r)return fd(r,t);r=new Ch({concurrency:t.concurrency,autoStart:!1});const e=r,s=fd(r,t);return n.add((async()=>{e.start(),await e.onIdle().then((()=>{r===e&&(r=null)}))})),s},writeLock:async()=>(r=null,fd(n,t))}})(t.name,t)),dd[t.name]}const yd={ERR_INVALID_PARAMETERS:"ERR_INVALID_PARAMETERS"};var wd,bd,vd;function Ed(e,t){const n=wd.decode(t);null!=n.publicKey&&null==e.publicKey&&(e=function(e){if("RSA"===e.type)return new bs(e);if("Ed25519"===e.type)return new vs(e);if("secp256k1"===e.type)return new Es(e);throw new fn("Not a PeerId","ERR_INVALID_PARAMETERS")}({...e,publicKey:e.publicKey}));const r=new Map,s=BigInt(Date.now());for(const[e,t]of n.tags.entries())null!=t.expiry&&t.expiry<s||r.set(e,t);return{...n,id:e,addresses:n.addresses.map((({multiaddr:e,isCertified:t})=>({multiaddr:cr(e),isCertified:t??!1}))),metadata:n.metadata,peerRecordEnvelope:n.peerRecordEnvelope??void 0,tags:r}}!function(e){let t;!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.key&&""!==e.key&&(t.uint32(10),t.string(e.key)),null!=e.value&&e.value.byteLength>0&&(t.uint32(18),t.bytes(e.value)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={key:"",value:new Uint8Array(0)},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.key=e.string();break;case 2:n.value=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(e.Peer$metadataEntry||(e.Peer$metadataEntry={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.key&&""!==e.key&&(t.uint32(10),t.string(e.key)),null!=e.value&&(t.uint32(18),vd.codec().encode(e.value,t)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={key:""},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.key=e.string();break;case 2:n.value=vd.codec().decode(e,e.uint32());break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(e.Peer$tagsEntry||(e.Peer$tagsEntry={})),e.codec=()=>(null==t&&(t=jt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.addresses)for(const e of t.addresses)n.uint32(10),bd.codec().encode(e,n);if(null!=t.protocols)for(const e of t.protocols)n.uint32(18),n.string(e);if(null!=t.publicKey&&(n.uint32(34),n.bytes(t.publicKey)),null!=t.peerRecordEnvelope&&(n.uint32(42),n.bytes(t.peerRecordEnvelope)),null!=t.metadata&&0!==t.metadata.size)for(const[r,s]of t.metadata.entries())n.uint32(50),e.Peer$metadataEntry.codec().encode({key:r,value:s},n);if(null!=t.tags&&0!==t.tags.size)for(const[r,s]of t.tags.entries())n.uint32(58),e.Peer$tagsEntry.codec().encode({key:r,value:s},n);!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={addresses:[],protocols:[],metadata:new Map,tags:new Map},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.addresses.push(bd.codec().decode(t,t.uint32()));break;case 2:r.protocols.push(t.string());break;case 4:r.publicKey=t.bytes();break;case 5:r.peerRecordEnvelope=t.bytes();break;case 6:{const n=e.Peer$metadataEntry.codec().decode(t,t.uint32());r.metadata.set(n.key,n.value);break}case 7:{const n=e.Peer$tagsEntry.codec().decode(t,t.uint32());r.tags.set(n.key,n.value);break}default:t.skipType(7&n)}}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(wd||(wd={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.multiaddr&&e.multiaddr.byteLength>0&&(t.uint32(10),t.bytes(e.multiaddr)),null!=e.isCertified&&(t.uint32(16),t.bool(e.isCertified)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={multiaddr:new Uint8Array(0)},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.multiaddr=e.bytes();break;case 2:n.isCertified=e.bool();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(bd||(bd={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.value&&0!==e.value&&(t.uint32(8),t.uint32(e.value)),null!=e.expiry&&(t.uint32(16),t.uint64(e.expiry)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={value:0},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.value=e.uint32();break;case 2:n.expiry=e.uint64();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(vd||(vd={}));const Sd="/peers/";function _d(e){if(!on(e)||null==e.type)throw new fn("Invalid PeerId",yd.ERR_INVALID_PARAMETERS);const t=e.toCID().toString();return new en(`${Sd}${t}`)}async function Id(e,t,n){const r=new Map;for(const s of n){if(null==s)continue;if(s.multiaddr instanceof Uint8Array&&(s.multiaddr=cr(s.multiaddr)),!ar(s.multiaddr))throw new fn("Multiaddr was invalid",yd.ERR_INVALID_PARAMETERS);if(!await t(e,s.multiaddr))continue;const n=s.isCertified??!1,i=s.multiaddr.toString(),o=r.get(i);null!=o?s.isCertified=o.isCertified||n:r.set(i,{multiaddr:s.multiaddr,isCertified:n})}return[...r.values()].sort(((e,t)=>e.multiaddr.toString().localeCompare(t.multiaddr.toString()))).map((({isCertified:e,multiaddr:t})=>({isCertified:e,multiaddr:t.bytes})))}async function Rd(e,t,n,r){if(null==t)throw new fn("Invalid PeerData",yd.ERR_INVALID_PARAMETERS);if(null!=t.publicKey&&null!=e.publicKey&&!In(t.publicKey,e.publicKey))throw new fn("publicKey bytes do not match peer id publicKey bytes",yd.ERR_INVALID_PARAMETERS);const s=r.existingPeer;if(null!=s&&!e.equals(s.id))throw new fn("peer id did not match existing peer id",yd.ERR_INVALID_PARAMETERS);let i=s?.addresses??[],o=new Set(s?.protocols??[]),a=s?.metadata??new Map,c=s?.tags??new Map,l=s?.peerRecordEnvelope;if("patch"===n){if(null==t.multiaddrs&&null==t.addresses||(i=[],null!=t.multiaddrs&&i.push(...t.multiaddrs.map((e=>({isCertified:!1,multiaddr:e})))),null!=t.addresses&&i.push(...t.addresses)),null!=t.protocols&&(o=new Set(t.protocols)),null!=t.metadata){a=Ad(t.metadata instanceof Map?[...t.metadata.entries()]:Object.entries(t.metadata),{validate:Td})}if(null!=t.tags){c=Ad(t.tags instanceof Map?[...t.tags.entries()]:Object.entries(t.tags),{validate:Dd,map:kd})}null!=t.peerRecordEnvelope&&(l=t.peerRecordEnvelope)}if("merge"===n){if(null!=t.multiaddrs&&i.push(...t.multiaddrs.map((e=>({isCertified:!1,multiaddr:e})))),null!=t.addresses&&i.push(...t.addresses),null!=t.protocols&&(o=new Set([...o,...t.protocols])),null!=t.metadata){const e=t.metadata instanceof Map?[...t.metadata.entries()]:Object.entries(t.metadata);for(const[t,n]of e)null==n?a.delete(t):a.set(t,n);a=Ad([...a.entries()],{validate:Td})}if(null!=t.tags){const e=t.tags instanceof Map?[...t.tags.entries()]:Object.entries(t.tags),n=new Map(c);for(const[t,r]of e)null==r?n.delete(t):n.set(t,r);c=Ad([...n.entries()],{validate:Dd,map:kd})}null!=t.peerRecordEnvelope&&(l=t.peerRecordEnvelope)}const u={addresses:await Id(e,r.addressFilter??(async()=>!0),i),protocols:[...o.values()].sort(((e,t)=>e.localeCompare(t))),metadata:a,tags:c,publicKey:s?.id.publicKey??t.publicKey??e.publicKey,peerRecordEnvelope:l};return"RSA"!==e.type&&delete u.publicKey,u}function Ad(e,t){const n=new Map;for(const[n,r]of e)null!=r&&t.validate(n,r);for(const[r,s]of e.sort((([e],[t])=>e.localeCompare(t))))null!=s&&n.set(r,t.map?.(r,s)??s);return n}function Td(e,t){if("string"!=typeof e)throw new fn("Metadata key must be a string",yd.ERR_INVALID_PARAMETERS);if(!(t instanceof Uint8Array))throw new fn("Metadata value must be a Uint8Array",yd.ERR_INVALID_PARAMETERS)}function Dd(e,t){if("string"!=typeof e)throw new fn("Tag name must be a string",yd.ERR_INVALID_PARAMETERS);if(null!=t.value){if(parseInt(`${t.value}`,10)!==t.value)throw new fn("Tag value must be an integer",yd.ERR_INVALID_PARAMETERS);if(t.value<0||t.value>100)throw new fn("Tag value must be between 0-100",yd.ERR_INVALID_PARAMETERS)}if(null!=t.ttl){if(parseInt(`${t.ttl}`,10)!==t.ttl)throw new fn("Tag ttl must be an integer",yd.ERR_INVALID_PARAMETERS);if(t.ttl<0)throw new fn("Tag ttl must be between greater than 0",yd.ERR_INVALID_PARAMETERS)}}function kd(e,t){let n;return null!=t.expiry&&(n=t.expiry),null!=t.ttl&&(n=BigInt(Date.now()+Number(t.ttl))),{value:t.value??0,expiry:n}}function Pd(e,t,n){const r=e.toString().split("/")[2],s=_s(we.decode(r)),i=n.get(s);if(null!=i)return i;const o=Ed(s,t);return n.set(s,o),o}class Cd{peerId;datastore;lock;addressFilter;constructor(e,t={}){this.peerId=e.peerId,this.datastore=e.datastore,this.addressFilter=t.addressFilter,this.lock=md({name:"peer-store",singleProcess:!0})}async has(e){return this.datastore.has(_d(e))}async delete(e){if(this.peerId.equals(e))throw new fn("Cannot delete self peer",yd.ERR_INVALID_PARAMETERS);await this.datastore.delete(_d(e))}async load(e){return Ed(e,await this.datastore.get(_d(e)))}async save(e,t){const{existingBuf:n,existingPeer:r}=await this.#C(e),s=await Rd(e,t,"patch",{addressFilter:this.addressFilter});return this.#x(e,s,n,r)}async patch(e,t){const{existingBuf:n,existingPeer:r}=await this.#C(e),s=await Rd(e,t,"patch",{addressFilter:this.addressFilter,existingPeer:r});return this.#x(e,s,n,r)}async merge(e,t){const{existingBuf:n,existingPeer:r}=await this.#C(e),s=await Rd(e,t,"merge",{addressFilter:this.addressFilter,existingPeer:r});return this.#x(e,s,n,r)}async*all(e){const t=new Hh;for await(const{key:n,value:r}of this.datastore.query(function(e,t){return null==e?{}:{prefix:Sd,filters:(e.filters??[]).map((e=>({key:n,value:r})=>e(Pd(n,r,t)))),orders:(e.orders??[]).map((e=>(n,r)=>e(Pd(n.key,n.value,t),Pd(r.key,r.value,t))))}}(e??{},t))){const e=Pd(n,r,t);e.id.equals(this.peerId)||(yield e)}}async#C(e){try{const t=await this.datastore.get(_d(e));return{existingBuf:t,existingPeer:Ed(e,t)}}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}return{}}async#x(e,t,n,r){const s=wd.encode(t);return null!=n&&In(s,n)?{peer:Ed(e,s),previous:r,updated:!1}:(await this.datastore.put(_d(e),s),{peer:Ed(e,s),previous:r,updated:!0})}}class xd{store;events;peerId;log;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:peer-store"),this.events=e.events,this.peerId=e.peerId,this.store=new Cd(e,t)}async forEach(e,t){this.log.trace("forEach await read lock");const n=await this.store.lock.readLock();this.log.trace("forEach got read lock");try{for await(const n of this.store.all(t))e(n)}finally{this.log.trace("forEach release read lock"),n()}}async all(e){this.log.trace("all await read lock");const t=await this.store.lock.readLock();this.log.trace("all got read lock");try{return await ed(this.store.all(e))}finally{this.log.trace("all release read lock"),t()}}async delete(e){this.log.trace("delete await write lock");const t=await this.store.lock.writeLock();this.log.trace("delete got write lock");try{await this.store.delete(e)}finally{this.log.trace("delete release write lock"),t()}}async has(e){this.log.trace("has await read lock");const t=await this.store.lock.readLock();this.log.trace("has got read lock");try{return await this.store.has(e)}finally{this.log.trace("has release read lock"),t()}}async get(e){this.log.trace("get await read lock");const t=await this.store.lock.readLock();this.log.trace("get got read lock");try{return await this.store.load(e)}finally{this.log.trace("get release read lock"),t()}}async save(e,t){this.log.trace("save await write lock");const n=await this.store.lock.writeLock();this.log.trace("save got write lock");try{const n=await this.store.save(e,t);return this.#N(e,n),n.peer}finally{this.log.trace("save release write lock"),n()}}async patch(e,t){this.log.trace("patch await write lock");const n=await this.store.lock.writeLock();this.log.trace("patch got write lock");try{const n=await this.store.patch(e,t);return this.#N(e,n),n.peer}finally{this.log.trace("patch release write lock"),n()}}async merge(e,t){this.log.trace("merge await write lock");const n=await this.store.lock.writeLock();this.log.trace("merge got write lock");try{const n=await this.store.merge(e,t);return this.#N(e,n),n.peer}finally{this.log.trace("merge release write lock"),n()}}async consumePeerRecord(e,t){const n=await Yh.openAndCertify(e,Xh.DOMAIN);if(!1===t?.equals(n.peerId))return this.log("envelope peer id was not the expected peer id - expected: %p received: %p",t,n.peerId),!1;const r=Xh.createFromProtobuf(n.payload);let s;try{s=await this.get(n.peerId)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}if(null!=s?.peerRecordEnvelope){const e=await Yh.createFromProtobuf(s.peerRecordEnvelope),t=Xh.createFromProtobuf(e.payload);if(t.seqNumber>=r.seqNumber)return this.log("sequence number was lower or equal to existing sequence number - stored: %d received: %d",t.seqNumber,r.seqNumber),!1}return await this.patch(r.peerId,{peerRecordEnvelope:e,addresses:r.multiaddrs.map((e=>({isCertified:!0,multiaddr:e})))}),!0}#N(e,t){t.updated&&(this.peerId.equals(e)?this.events.safeDispatchEvent("self:peer:update",{detail:t}):this.events.safeDispatchEvent("peer:update",{detail:t}))}}function Nd(e){if(null!=e[Symbol.asyncIterator])return(async()=>{for await(const t of e);})();for(const t of e);}function Md(e,t){let n=0;if(null!=e[Symbol.asyncIterator])return async function*(){for await(const r of e)await t(r,n++)&&(yield r)}();const r=Hr(e),{value:s,done:i}=r.next();if(!0===i)return function*(){}();const o=t(s,n++);if("function"==typeof o.then)return async function*(){await o&&(yield s);for await(const e of r)await t(e,n++)&&(yield e)}();const a=t;return function*(){!0===o&&(yield s);for(const e of r)a(e,n++)&&(yield e)}()}function Od(e,t){return null!=e[Symbol.asyncIterator]?async function*(){const n=await ed(e);yield*n.sort(t)}():function*(){const n=ed(e);yield*n.sort(t)}()}function Ld(e,t){return null!=e[Symbol.asyncIterator]?async function*(){let n=0;if(!(t<1))for await(const r of e)if(yield r,n++,n===t)return}():function*(){let n=0;if(!(t<1))for(const r of e)if(yield r,n++,n===t)return}()}class Bd{put(e,t,n){return Promise.reject(new Error(".put is not implemented"))}get(e,t){return Promise.reject(new Error(".get is not implemented"))}has(e,t){return Promise.reject(new Error(".has is not implemented"))}delete(e,t){return Promise.reject(new Error(".delete is not implemented"))}async*putMany(e,t={}){for await(const{key:n,value:r}of e)await this.put(n,r,t),yield n}async*getMany(e,t={}){for await(const n of e)yield{key:n,value:await this.get(n,t)}}async*deleteMany(e,t={}){for await(const n of e)await this.delete(n,t),yield n}batch(){let e=[],t=[];return{put(t,n){e.push({key:t,value:n})},delete(e){t.push(e)},commit:async n=>{await Nd(this.putMany(e,n)),e=[],await Nd(this.deleteMany(t,n)),t=[]}}}async*_all(e,t){throw new Error("._all is not implemented")}async*_allKeys(e,t){throw new Error("._allKeys is not implemented")}query(e,t){let n=this._all(e,t);if(null!=e.prefix){const t=e.prefix;n=Md(n,(e=>e.key.toString().startsWith(t)))}if(Array.isArray(e.filters)&&(n=e.filters.reduce(((e,t)=>Md(e,t)),n)),Array.isArray(e.orders)&&(n=e.orders.reduce(((e,t)=>Od(e,t)),n)),null!=e.offset){let t=0;const r=e.offset;n=Md(n,(()=>t++>=r))}return null!=e.limit&&(n=Ld(n,e.limit)),n}queryKeys(e,t){let n=this._allKeys(e,t);if(null!=e.prefix){const t=e.prefix;n=Md(n,(e=>e.toString().startsWith(t)))}if(Array.isArray(e.filters)&&(n=e.filters.reduce(((e,t)=>Md(e,t)),n)),Array.isArray(e.orders)&&(n=e.orders.reduce(((e,t)=>Od(e,t)),n)),null!=e.offset){const t=e.offset;let r=0;n=Md(n,(()=>r++>=t))}return null!=e.limit&&(n=Ld(n,e.limit)),n}}function Ud(e){return e=e??new Error("Read failed"),Vr(e,"ERR_DB_READ_FAILED")}function Fd(e){return e=e??new Error("Not Found"),Vr(e,"ERR_NOT_FOUND")}class Vd extends Bd{data;constructor(){super(),this.data=new Map}put(e,t){return this.data.set(e.toString(),t),e}get(e){const t=this.data.get(e.toString());if(null==t)throw Fd();return t}has(e){return this.data.has(e.toString())}delete(e){this.data.delete(e.toString())}*_all(){for(const[e,t]of this.data.entries())yield{key:new en(e),value:t}}*_allKeys(){for(const e of this.data.keys())yield new en(e)}}const Kd=e=>e;function $d(e,t){const n=e.getPeerId();if(null!=n){Ss(n).equals(t)&&(e=e.decapsulate(cr(`/p2p/${t.toString()}`)))}return e}class qd{log;components;listen;announce;observed;announceFilter;constructor(e,t={}){const{listen:n=[],announce:r=[]}=t;this.components=e,this.log=e.logger.forComponent("libp2p:address-manager"),this.listen=n.map((e=>e.toString())),this.announce=new Set(r.map((e=>e.toString()))),this.observed=new Map,this.announceFilter=t.announceFilter??Kd,this._updatePeerStoreAddresses=function(e,t){let n;return function(){clearTimeout(n),n=setTimeout((function(){n=void 0,e()}),t)}}(this._updatePeerStoreAddresses.bind(this),1e3),e.events.addEventListener("transport:listening",(()=>{this._updatePeerStoreAddresses()})),e.events.addEventListener("transport:close",(()=>{this._updatePeerStoreAddresses()}))}_updatePeerStoreAddresses(){const e=this.getAnnounceAddrs().concat(this.components.transportManager.getAddrs()).concat([...this.observed.entries()].filter((([e,t])=>t.confident)).map((([e])=>cr(e)))).map((e=>e.getPeerId()===this.components.peerId.toString()?e.decapsulate(`/p2p/${this.components.peerId.toString()}`):e));this.components.peerStore.patch(this.components.peerId,{multiaddrs:e}).catch((e=>{this.log.error("error updating addresses",e)}))}getListenAddrs(){return Array.from(this.listen).map((e=>cr(e)))}getAnnounceAddrs(){return Array.from(this.announce).map((e=>cr(e)))}getObservedAddrs(){return Array.from(this.observed).map((([e])=>cr(e)))}addObservedAddr(e){const t=(e=$d(e,this.components.peerId)).toString();this.observed.has(t)||this.observed.set(t,{confident:!1})}confirmObservedAddr(e){const t=(e=$d(e,this.components.peerId)).toString(),n=(this.observed.get(t)??{confident:!1}).confident;this.observed.set(t,{confident:!0}),n||this._updatePeerStoreAddresses()}removeObservedAddr(e){const t=(e=$d(e,this.components.peerId)).toString();this.observed.delete(t)}getAddresses(){let e=this.getAnnounceAddrs().map((e=>e.toString()));0===e.length&&(e=this.components.transportManager.getAddrs().map((e=>e.toString()))),e=e.concat(Array.from(this.observed).filter((([e,t])=>t.confident)).map((([e])=>e)));const t=new Set(e);return this.announceFilter(Array.from(t).map((e=>cr(e)))).map((e=>!0===e.protos().pop()?.path||e.getPeerId()===this.components.peerId.toString()?e:e.encapsulate(`/p2p/${this.components.peerId.toString()}`)))}}class Hd{components={};_started=!1;constructor(e={}){this.components={};for(const[t,n]of Object.entries(e))this.components[t]=n;null==this.components.logger&&(this.components.logger=hs())}isStarted(){return this._started}async _invokeStartableMethod(e){await Promise.all(Object.values(this.components).filter((e=>En(e))).map((async t=>{await(t[e]?.())})))}async beforeStart(){await this._invokeStartableMethod("beforeStart")}async start(){await this._invokeStartableMethod("start"),this._started=!0}async afterStart(){await this._invokeStartableMethod("afterStart")}async beforeStop(){await this._invokeStartableMethod("beforeStop")}async stop(){await this._invokeStartableMethod("stop"),this._started=!1}async afterStop(){await this._invokeStartableMethod("afterStop")}}const zd=["metrics","connectionProtector","dns"],Wd=["components","isStarted","beforeStart","start","afterStart","beforeStop","stop","afterStop","then","_invokeStartableMethod"];var jd;(function(){var e,t,n,r,s,i,o,a;a=function(e){return[(e&255<<24)>>>24,(e&255<<16)>>>16,(65280&e)>>>8,255&e].join(".")},o=function(e){var n,r,s,i,o,a;for(n=[],s=i=0;i<=3&&0!==e.length;s=++i){if(s>0){if("."!==e[0])throw new Error("Invalid IP");e=e.substring(1)}o=(a=t(e))[0],r=a[1],e=e.substring(r),n.push(o)}if(0!==e.length)throw new Error("Invalid IP");switch(n.length){case 1:if(n[0]>4294967295)throw new Error("Invalid IP");return n[0]>>>0;case 2:if(n[0]>255||n[1]>16777215)throw new Error("Invalid IP");return(n[0]<<24|n[1])>>>0;case 3:if(n[0]>255||n[1]>255||n[2]>65535)throw new Error("Invalid IP");return(n[0]<<24|n[1]<<16|n[2])>>>0;case 4:if(n[0]>255||n[1]>255||n[2]>255||n[3]>255)throw new Error("Invalid IP");return(n[0]<<24|n[1]<<16|n[2]<<8|n[3])>>>0;default:throw new Error("Invalid IP")}},r=(n=function(e){return e.charCodeAt(0)})("0"),i=n("a"),s=n("A"),t=function(e){var t,o,a,c,l;for(c=0,t=10,o="9",a=0,e.length>1&&"0"===e[a]&&("x"===e[a+1]||"X"===e[a+1]?(a+=2,t=16):"0"<=e[a+1]&&e[a+1]<="9"&&(a++,t=8,o="7")),l=a;a<e.length;){if("0"<=e[a]&&e[a]<=o)c=c*t+(n(e[a])-r)>>>0;else{if(16!==t)break;if("a"<=e[a]&&e[a]<="f")c=c*t+(10+n(e[a])-i)>>>0;else{if(!("A"<=e[a]&&e[a]<="F"))break;c=c*t+(10+n(e[a])-s)>>>0}}if(c>4294967295)throw new Error("too large");a++}if(a===l)throw new Error("empty octet");return[c,a]},e=function(){function e(e,t){var n,r,s;if("string"!=typeof e)throw new Error("Missing `net' parameter");if(t||(s=e.split("/",2),e=s[0],t=s[1]),t||(t=32),"string"==typeof t&&t.indexOf(".")>-1){try{this.maskLong=o(t)}catch(e){throw new Error("Invalid mask: "+t)}for(n=r=32;r>=0;n=--r)if(this.maskLong===4294967295<<32-n>>>0){this.bitmask=n;break}}else{if(!t&&0!==t)throw new Error("Invalid mask: empty");this.bitmask=parseInt(t,10),this.maskLong=0,this.bitmask>0&&(this.maskLong=4294967295<<32-this.bitmask>>>0)}try{this.netLong=(o(e)&this.maskLong)>>>0}catch(t){throw new Error("Invalid net address: "+e)}if(!(this.bitmask<=32))throw new Error("Invalid mask for ip4: "+t);this.size=Math.pow(2,32-this.bitmask),this.base=a(this.netLong),this.mask=a(this.maskLong),this.hostmask=a(~this.maskLong),this.first=this.bitmask<=30?a(this.netLong+1):this.base,this.last=this.bitmask<=30?a(this.netLong+this.size-2):a(this.netLong+this.size-1),this.broadcast=this.bitmask<=30?a(this.netLong+this.size-1):void 0}return e.prototype.contains=function(t){return"string"==typeof t&&(t.indexOf("/")>0||4!==t.split(".").length)&&(t=new e(t)),t instanceof e?this.contains(t.base)&&this.contains(t.broadcast||t.last):(o(t)&this.maskLong)>>>0==(this.netLong&this.maskLong)>>>0},e.prototype.next=function(t){return null==t&&(t=1),new e(a(this.netLong+this.size*t),this.mask)},e.prototype.forEach=function(e){var t,n,r;for(r=o(this.first),n=o(this.last),t=0;r<=n;)e(a(r),r,t),t++,r++},e.prototype.toString=function(){return this.base+"/"+this.bitmask},e}(),jd=e}).call(Lr);const Gd=["0.0.0.0/8","10.0.0.0/8","100.64.0.0/10","127.0.0.0/8","169.254.0.0/16","172.16.0.0/12","192.0.0.0/24","192.0.0.0/29","192.0.0.8/32","192.0.0.9/32","192.0.0.10/32","192.0.0.170/32","192.0.0.171/32","192.0.2.0/24","192.31.196.0/24","192.52.193.0/24","192.88.99.0/24","192.168.0.0/16","192.175.48.0/24","198.18.0.0/15","198.51.100.0/24","203.0.113.0/24","240.0.0.0/4","255.255.255.255/32"].map((e=>new jd(e)));function Yd(e){return kn(e)?function(e){for(const t of Gd)if(t.contains(e))return!0;return!1}(e):Pn(e)?/^::$/.test(t=e)||/^::1$/.test(t)||/^::f{4}:([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/.test(t)||/^::f{4}:0.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/.test(t)||/^64:ff9b::([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/.test(t)||/^100::([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(t)||/^2001::([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(t)||/^2001:2[0-9a-fA-F]:([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(t)||/^2001:db8:([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(t)||/^2002:([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(t)||/^f[c-d]([0-9a-fA-F]{2,2}):/i.test(t)||/^fe[8-9a-bA-B][0-9a-fA-F]:/i.test(t)||/^ff([0-9a-fA-F]{2,2}):/i.test(t):void 0;var t}function Qd(e={}){return{denyDialPeer:async()=>!1,denyDialMultiaddr:async e=>{const t=e.stringTuples();return(4===t[0][0]||41===t[0][0])&&Boolean(Yd(`${t[0][1]}`))},denyInboundConnection:async()=>!1,denyOutboundConnection:async()=>!1,denyInboundEncryptedConnection:async()=>!1,denyOutboundEncryptedConnection:async()=>!1,denyInboundUpgradedConnection:async()=>!1,denyOutboundUpgradedConnection:async()=>!1,filterMultiaddrForPeer:async()=>!0,...e}}const Zd=e=>({match:t=>!(t.length<1)&&(!!e(t[0])&&t.slice(1)),pattern:"fn"}),Jd=e=>({match:t=>Zd((t=>t===e)).match(t),pattern:e}),Xd=()=>({match:e=>Zd((e=>"string"==typeof e)).match(e),pattern:"{string}"}),ep=()=>({match:e=>Zd((e=>!isNaN(parseInt(e)))).match(e),pattern:"{number}"}),tp=()=>({match:e=>{if(e.length<2)return!1;if("p2p"!==e[0]&&"ipfs"!==e[0])return!1;if(!e[1].startsWith("Q")&&!e[1].startsWith("1"))return!1;try{Ce.decode(`z${e[1]}`)}catch(e){return!1}return e.slice(2)},pattern:"/p2p/{peerid}"}),np=()=>({match:e=>{if(e.length<2)return!1;if("certhash"!==e[0])return!1;try{Le.decode(e[1])}catch{return!1}return e.slice(2)},pattern:"/certhash/{certhash}"}),rp=e=>({match:t=>{const n=e.match(t);return!1===n?t:n},pattern:`optional(${e.pattern})`}),sp=(...e)=>({match:t=>{let n;for(const r of e){const e=r.match(t);!1!==e&&((null==n||e.length<n.length)&&(n=e))}return null!=n&&n},pattern:`or(${e.map((e=>e.pattern)).join(", ")})`}),ip=(...e)=>({match:t=>{for(const n of e){const e=n.match(t);if(!1===e)return!1;t=e}return t},pattern:`and(${e.map((e=>e.pattern)).join(", ")})`});function op(...e){function t(t){let n=(e=>e.toString().split("/").slice(1))(t);for(const t of e){const e=t.match(n);if(!1===e)return!1;n=e}return n}return{matches:function(e){return!1!==t(e)},exactMatch:function(e){const n=t(e);return!1!==n&&0===n.length}}}const ap=ip(Jd("dns4"),Xd()),cp=ip(Jd("dns6"),Xd()),lp=ip(Jd("dnsaddr"),Xd()),up=ip(Jd("dns"),Xd()),hp=op(sp(up,lp,ap,cp)),dp=sp(ip(Jd("ip4"),Zd(kn)),ip(Jd("ip6"),Zd(Pn))),pp=sp(dp,up,ap,cp,lp),fp=op(pp),gp=op(dp),mp=ip(pp,Jd("tcp"),ep()),yp=ip(pp,Jd("udp"),ep()),wp=sp(mp,yp),bp=ip(yp,Jd("quic")),vp=ip(yp,Jd("quic-v1")),Ep=sp(bp,vp),Sp=sp(pp,mp,yp,bp,vp),_p=sp(ip(Sp,Jd("ws"),rp(tp()))),Ip=sp(ip(Sp,Jd("wss"),rp(tp())),ip(Sp,Jd("tls"),Jd("ws"),rp(tp()))),Rp=ip(wp,Jd("webrtc-direct"),np(),rp(np()),rp(tp())),Ap=ip(vp,Jd("webtransport"),rp(np()),rp(np()),rp(tp())),Tp=op(Ap),Dp=sp(_p,Ip,ip(mp,rp(tp())),ip(Ep,rp(tp())),ip(pp,rp(tp())),Rp,Ap,tp()),kp=op(ip(Dp,Jd("p2p-circuit"),tp())),Pp=op(sp(ip(Dp,Jd("p2p-circuit"),Jd("webrtc"),tp()),ip(Dp,Jd("webrtc"),rp(tp())),Jd("webrtc")));function Cp(e){try{const{address:t}=e.nodeAddress();return Boolean(Yd(t))}catch{return!0}}function xp(e,t){const n=function(e,t){const n=Cp(e.multiaddr),r=Cp(t.multiaddr);return n&&!r?1:!n&&r?-1:0}(e,t);if(0!==n)return n;const r=function(e,t){const n=kp.exactMatch(e.multiaddr),r=kp.exactMatch(t.multiaddr);return n&&!r?1:!n&&r?-1:0}(e,t);if(0!==r)return r;const s=function(e,t){return e.isCertified&&!t.isCertified?-1:!e.isCertified&&t.isCertified?1:0}(e,t);return s}sp(ip(pp,Jd("tcp"),ep(),Jd("http"),rp(tp())),ip(pp,Jd("http"),rp(tp()))),sp(ip(pp,Jd("tcp"),sp(ip(Jd("443"),Jd("http")),ip(ep(),Jd("https"))),rp(tp())),ip(pp,Jd("tls"),Jd("http"),rp(tp())),ip(pp,Jd("https"),rp(tp())));class Np extends Event{constructor(e,t){super(e),this.detail=t}}function Mp(e){const t=[qp.A];return null==e?t:Array.isArray(e)?0===e.length?t:e:[e]}const Op=60;function Lp(e){return{Status:e.Status??0,TC:e.TC??e.flag_tc??!1,RD:e.RD??e.flag_rd??!1,RA:e.RA??e.flag_ra??!1,AD:e.AD??e.flag_ad??!1,CD:e.CD??e.flag_cd??!1,Question:(e.Question??e.questions??[]).map((e=>({name:e.name,type:qp[e.type]}))),Answer:(e.Answer??e.answers??[]).map((e=>({name:e.name,type:qp[e.type],TTL:e.TTL??e.ttl??Op,data:e.data instanceof Uint8Array?Qt(e.data):e.data})))}}const Bp=4;function Up(e,t={}){const n=new Ch({concurrency:t.queryConcurrency??Bp});return async(t,r={})=>{const s=new URLSearchParams;s.set("name",t),Mp(r.types).forEach((e=>{s.append("type",qp[e])})),r.onProgress?.(new Np("dns:query",{detail:t}));const i=await n.add((async()=>{const t=await fetch(`${e}?${s}`,{headers:{accept:"application/dns-json"},signal:r?.signal});if(200!==t.status)throw new Error(`Unexpected HTTP status: ${t.status} - ${t.statusText}`);const n=Lp(await t.json());return r.onProgress?.(new Np("dns:response",{detail:n})),n}),{signal:r.signal});if(null==i)throw new Error("No DNS response received");return i}}var Fp=function(e){if(!e)throw Error("hashlru must have a max value, of type number, greater than 0");var t=0,n=Object.create(null),r=Object.create(null);function s(s,i){n[s]=i,++t>=e&&(t=0,r=n,n=Object.create(null))}return{has:function(e){return void 0!==n[e]||void 0!==r[e]},remove:function(e){void 0!==n[e]&&(n[e]=void 0),void 0!==r[e]&&(r[e]=void 0)},get:function(e){var t=n[e];return void 0!==t?t:void 0!==(t=r[e])?(s(e,t),t):void 0},set:function(e,t){void 0!==n[e]?n[e]=t:s(e,t)},clear:function(){n=Object.create(null),r=Object.create(null)}}},Vp=Br(Fp);class Kp{lru;constructor(e){this.lru=Vp(e)}get(e,t){let n=!0;const r=[];for(const s of t){const t=this.getAnswers(e,s);if(0===t.length){n=!1;break}r.push(...t)}if(n)return Lp({answers:r})}getAnswers(e,t){const n=`${e.toLowerCase()}-${t}`,r=this.lru.get(n);if(null!=r){const e=r.filter((e=>e.expires>Date.now())).map((({expires:e,value:t})=>({...t,TTL:Math.round((e-Date.now())/1e3),type:qp[t.type]})));return 0===e.length&&this.lru.remove(n),e}return[]}add(e,t){const n=`${e.toLowerCase()}-${t.type}`,r=this.lru.get(n)??[];r.push({expires:Date.now()+1e3*(t.TTL??Op),value:t}),this.lru.set(n,r)}remove(e,t){const n=`${e.toLowerCase()}-${t}`;this.lru.remove(n)}clear(){this.lru.clear()}}let $p=class{resolvers;cache;constructor(e){var t;this.resolvers={},this.cache=(t=e.cacheSize??1e3,new Kp(t)),Object.entries(e.resolvers??{}).forEach((([e,t])=>{Array.isArray(t)||(t=[t]),e.endsWith(".")||(e=`${e}.`),this.resolvers[e]=t})),null==this.resolvers["."]&&(this.resolvers["."]=[Up("https://cloudflare-dns.com/dns-query"),Up("https://dns.google/resolve")])}async query(e,t={}){const n=Mp(t.types),r=!1!==t.cached?this.cache.get(e,n):void 0;if(null!=r)return t.onProgress?.(new Np("dns:cache",{detail:r})),r;const s=`${e.split(".").pop()}.`,i=(this.resolvers[s]??this.resolvers["."]).sort((()=>Math.random()>.5?-1:1)),o=[];for(const r of i){if(!0===t.signal?.aborted)break;try{const s=await r(e,{...t,types:n});for(const t of s.Answer)this.cache.add(e,t);return s}catch(e){o.push(e),t.onProgress?.(new Np("dns:error",{detail:e}))}}if(1===o.length)throw o[0];throw new AggregateError(o,`DNS lookup of ${e} ${n} failed`)}};var qp;!function(e){e[e.A=1]="A",e[e.CNAME=5]="CNAME",e[e.TXT=16]="TXT",e[e.AAAA=28]="AAAA"}(qp||(qp={}));const{code:Hp}=Fn("dnsaddr"),zp=async function(e,t={}){const n=t.maxRecursiveDepth??32;if(0===n)throw new fn("Max recursive depth reached","ERR_MAX_RECURSIVE_DEPTH_REACHED");const[,r]=e.stringTuples().find((([e])=>e===Hp))??[],s=t?.dns??function(e={}){return new $p(e)}(),i=await s.query(`_dnsaddr.${r}`,{signal:t?.signal,types:[qp.TXT]}),o=e.getPeerId(),a=[];for(const e of i.Answer){const r=e.data.replace(/["']/g,"").trim().split("=")[1];if(null==r)continue;if(null!=o&&!r.includes(o))continue;const s=cr(r);if(r.startsWith("/dnsaddr")){const e=await s.resolve({...t,maxRecursiveDepth:n-1});a.push(...e.map((e=>e.toString())))}else a.push(s.toString())}return a};const Wp=e=>{if("[object Object]"!==Object.prototype.toString.call(e))return!1;const t=Object.getPrototypeOf(e);return null===t||t===Object.prototype},{hasOwnProperty:jp}=Object.prototype,{propertyIsEnumerable:Gp}=Object,Yp=(e,t,n)=>Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0}),Qp=Lr,Zp={concatArrays:!1,ignoreUndefined:!1},Jp=e=>{const t=[];for(const n in e)jp.call(e,n)&&t.push(n);if(Object.getOwnPropertySymbols){const n=Object.getOwnPropertySymbols(e);for(const r of n)Gp.call(e,r)&&t.push(r)}return t};function Xp(e){return Array.isArray(e)?function(e){const t=e.slice(0,0);return Jp(e).forEach((n=>{Yp(t,n,Xp(e[n]))})),t}(e):Wp(e)?function(e){const t=null===Object.getPrototypeOf(e)?Object.create(null):{};return Jp(e).forEach((n=>{Yp(t,n,Xp(e[n]))})),t}(e):e}const ef=(e,t,n,r)=>(n.forEach((n=>{void 0===t[n]&&r.ignoreUndefined||(n in e&&e[n]!==Object.getPrototypeOf(e)?Yp(e,n,nf(e[n],t[n],r)):Yp(e,n,Xp(t[n])))})),e),tf=(e,t,n)=>{let r=e.slice(0,0),s=0;return[e,t].forEach((t=>{const i=[];for(let n=0;n<t.length;n++)jp.call(t,n)&&(i.push(String(n)),Yp(r,s++,t===e?t[n]:Xp(t[n])));r=ef(r,t,Jp(t).filter((e=>!i.includes(e))),n)})),r};function nf(e,t,n){return n.concatArrays&&Array.isArray(e)&&Array.isArray(t)?tf(e,t,n):Wp(t)&&Wp(e)?ef(e,t,Jp(t),n):Xp(t)}var rf,sf,of=Br((function(...e){const t=nf(Xp(Zp),this!==Qp&&this||{},Zp);let n={_:{}};for(const r of e)if(void 0!==r){if(!Wp(r))throw new TypeError("`"+r+"` is not an Option Object");n=nf(n,{_:r},t)}return n._}));!function(e){e.NOT_STARTED_YET="The libp2p node is not started yet",e.ERR_PROTECTOR_REQUIRED="Private network is enforced, but no protector was provided",e.NOT_FOUND="Not found"}(rf||(rf={})),function(e){e.ERR_PROTECTOR_REQUIRED="ERR_PROTECTOR_REQUIRED",e.ERR_PEER_DIAL_INTERCEPTED="ERR_PEER_DIAL_INTERCEPTED",e.ERR_CONNECTION_INTERCEPTED="ERR_CONNECTION_INTERCEPTED",e.ERR_INVALID_PROTOCOLS_FOR_STREAM="ERR_INVALID_PROTOCOLS_FOR_STREAM",e.ERR_CONNECTION_ENDED="ERR_CONNECTION_ENDED",e.ERR_CONNECTION_FAILED="ERR_CONNECTION_FAILED",e.ERR_NODE_NOT_STARTED="ERR_NODE_NOT_STARTED",e.ERR_ALREADY_ABORTED="ERR_ALREADY_ABORTED",e.ERR_TOO_MANY_ADDRESSES="ERR_TOO_MANY_ADDRESSES",e.ERR_NO_VALID_ADDRESSES="ERR_NO_VALID_ADDRESSES",e.ERR_RELAYED_DIAL="ERR_RELAYED_DIAL",e.ERR_DIALED_SELF="ERR_DIALED_SELF",e.ERR_DISCOVERED_SELF="ERR_DISCOVERED_SELF",e.ERR_DUPLICATE_TRANSPORT="ERR_DUPLICATE_TRANSPORT",e.ERR_ENCRYPTION_FAILED="ERR_ENCRYPTION_FAILED",e.ERR_HOP_REQUEST_FAILED="ERR_HOP_REQUEST_FAILED",e.ERR_INVALID_KEY="ERR_INVALID_KEY",e.ERR_INVALID_MESSAGE="ERR_INVALID_MESSAGE",e.ERR_INVALID_PARAMETERS="ERR_INVALID_PARAMETERS",e.ERR_INVALID_PEER="ERR_INVALID_PEER",e.ERR_MUXER_UNAVAILABLE="ERR_MUXER_UNAVAILABLE",e.ERR_NOT_FOUND="ERR_NOT_FOUND",e.ERR_TRANSPORT_UNAVAILABLE="ERR_TRANSPORT_UNAVAILABLE",e.ERR_TRANSPORT_DIAL_FAILED="ERR_TRANSPORT_DIAL_FAILED",e.ERR_UNSUPPORTED_PROTOCOL="ERR_UNSUPPORTED_PROTOCOL",e.ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED="ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED",e.ERR_INVALID_MULTIADDR="ERR_INVALID_MULTIADDR",e.ERR_SIGNATURE_NOT_VALID="ERR_SIGNATURE_NOT_VALID",e.ERR_FIND_SELF="ERR_FIND_SELF",e.ERR_NO_ROUTERS_AVAILABLE="ERR_NO_ROUTERS_AVAILABLE",e.ERR_CONNECTION_NOT_MULTIPLEXED="ERR_CONNECTION_NOT_MULTIPLEXED",e.ERR_NO_DIAL_TOKENS="ERR_NO_DIAL_TOKENS",e.ERR_INVALID_CMS="ERR_INVALID_CMS",e.ERR_MISSING_KEYS="ERR_MISSING_KEYS",e.ERR_NO_KEY="ERR_NO_KEY",e.ERR_INVALID_KEY_NAME="ERR_INVALID_KEY_NAME",e.ERR_INVALID_KEY_TYPE="ERR_INVALID_KEY_TYPE",e.ERR_KEY_ALREADY_EXISTS="ERR_KEY_ALREADY_EXISTS",e.ERR_INVALID_KEY_SIZE="ERR_INVALID_KEY_SIZE",e.ERR_KEY_NOT_FOUND="ERR_KEY_NOT_FOUND",e.ERR_OLD_KEY_NAME_INVALID="ERR_OLD_KEY_NAME_INVALID",e.ERR_NEW_KEY_NAME_INVALID="ERR_NEW_KEY_NAME_INVALID",e.ERR_PASSWORD_REQUIRED="ERR_PASSWORD_REQUIRED",e.ERR_PEM_REQUIRED="ERR_PEM_REQUIRED",e.ERR_CANNOT_READ_KEY="ERR_CANNOT_READ_KEY",e.ERR_MISSING_PRIVATE_KEY="ERR_MISSING_PRIVATE_KEY",e.ERR_MISSING_PUBLIC_KEY="ERR_MISSING_PUBLIC_KEY",e.ERR_INVALID_OLD_PASS_TYPE="ERR_INVALID_OLD_PASS_TYPE",e.ERR_INVALID_NEW_PASS_TYPE="ERR_INVALID_NEW_PASS_TYPE",e.ERR_INVALID_PASS_LENGTH="ERR_INVALID_PASS_LENGTH",e.ERR_NOT_IMPLEMENTED="ERR_NOT_IMPLEMENTED",e.ERR_WRONG_PING_ACK="ERR_WRONG_PING_ACK",e.ERR_INVALID_RECORD="ERR_INVALID_RECORD",e.ERR_ALREADY_SUCCEEDED="ERR_ALREADY_SUCCEEDED",e.ERR_NO_HANDLER_FOR_PROTOCOL="ERR_NO_HANDLER_FOR_PROTOCOL",e.ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS="ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS",e.ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS="ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS",e.ERR_CONNECTION_DENIED="ERR_CONNECTION_DENIED",e.ERR_TRANSFER_LIMIT_EXCEEDED="ERR_TRANSFER_LIMIT_EXCEEDED"}(sf||(sf={}));const af={addresses:{listen:[],announce:[],noAnnounce:[],announceFilter:e=>e},connectionManager:{resolvers:{dnsaddr:zp},addressSorter:xp},transportManager:{faultTolerance:dn.FATAL_ALL}};const cf=()=>{const e=new Error("Delay aborted");return e.name="AbortError",e},lf=new WeakMap;const uf=function({clearTimeout:e,setTimeout:t}={}){return(n,{value:r,signal:s}={})=>{if(s?.aborted)return Promise.reject(cf());let i,o,a;const c=e??clearTimeout,l=()=>{c(i),a(cf())},u=new Promise(((e,c)=>{o=()=>{s&&s.removeEventListener("abort",l),e(r)},a=c,i=(t??setTimeout)(o,n)}));return s&&s.addEventListener("abort",l,{once:!0}),lf.set(u,(()=>{c(i),i=null,o()})),u}}();class hf{memoryStorage;points;duration;blockDuration;execEvenly;execEvenlyMinDelayMs;keyPrefix;constructor(e={}){this.points=e.points??4,this.duration=e.duration??1,this.blockDuration=e.blockDuration??0,this.execEvenly=e.execEvenly??!1,this.execEvenlyMinDelayMs=e.execEvenlyMinDelayMs??1e3*this.duration/this.points,this.keyPrefix=e.keyPrefix??"rlflx",this.memoryStorage=new df}async consume(e,t=1,n={}){const r=this.getKey(e),s=this._getKeySecDuration(n);let i=this.memoryStorage.incrby(r,t,s);if(i.remainingPoints=Math.max(this.points-i.consumedPoints,0),i.consumedPoints>this.points)throw this.blockDuration>0&&i.consumedPoints<=this.points+t&&(i=this.memoryStorage.set(r,i.consumedPoints,this.blockDuration)),new fn("Rate limit exceeded","ERR_RATE_LIMIT_EXCEEDED",i);if(this.execEvenly&&i.msBeforeNext>0&&!i.isFirstInDuration){let e=Math.ceil(i.msBeforeNext/(i.remainingPoints+2));e<this.execEvenlyMinDelayMs&&(e=i.consumedPoints*this.execEvenlyMinDelayMs),await uf(e)}return i}penalty(e,t=1,n={}){const r=this.getKey(e),s=this._getKeySecDuration(n),i=this.memoryStorage.incrby(r,t,s);return i.remainingPoints=Math.max(this.points-i.consumedPoints,0),i}reward(e,t=1,n={}){const r=this.getKey(e),s=this._getKeySecDuration(n),i=this.memoryStorage.incrby(r,-t,s);return i.remainingPoints=Math.max(this.points-i.consumedPoints,0),i}block(e,t){const n=1e3*t,r=this.points+1;return this.memoryStorage.set(this.getKey(e),r,t),{remainingPoints:0,msBeforeNext:0===n?-1:n,consumedPoints:r,isFirstInDuration:!1}}set(e,t,n=0){const r=1e3*(n>=0?n:this.duration);return this.memoryStorage.set(this.getKey(e),t,n),{remainingPoints:0,msBeforeNext:0===r?-1:r,consumedPoints:t,isFirstInDuration:!1}}get(e){const t=this.memoryStorage.get(this.getKey(e));return null!=t&&(t.remainingPoints=Math.max(this.points-t.consumedPoints,0)),t}delete(e){this.memoryStorage.delete(this.getKey(e))}_getKeySecDuration(e){return null!=e?.customDuration&&e.customDuration>=0?e.customDuration:this.duration}getKey(e){return this.keyPrefix.length>0?`${this.keyPrefix}:${e}`:e}parseKey(e){return e.substring(this.keyPrefix.length)}}class df{storage;constructor(){this.storage=new Map}incrby(e,t,n){const r=this.storage.get(e);if(null!=r){const s=null!=r.expiresAt?r.expiresAt.getTime()-(new Date).getTime():-1;return null==r.expiresAt||s>0?(r.value+=t,{remainingPoints:0,msBeforeNext:s,consumedPoints:r.value,isFirstInDuration:!1}):this.set(e,t,n)}return this.set(e,t,n)}set(e,t,n){const r=1e3*n,s=this.storage.get(e);null!=s&&clearTimeout(s.timeoutId);const i={value:t,expiresAt:r>0?new Date(Date.now()+r):void 0};return this.storage.set(e,i),r>0&&(i.timeoutId=setTimeout((()=>{this.storage.delete(e)}),r),null!=i.timeoutId.unref&&i.timeoutId.unref()),{remainingPoints:0,msBeforeNext:0===r?-1:r,consumedPoints:i.value,isFirstInDuration:!0}}get(e){const t=this.storage.get(e);if(null!=t){return{remainingPoints:0,msBeforeNext:null!=t.expiresAt?t.expiresAt.getTime()-(new Date).getTime():-1,consumedPoints:t.value,isFirstInDuration:!1}}}delete(e){const t=this.storage.get(e);return null!=t&&(null!=t.timeoutId&&clearTimeout(t.timeoutId),this.storage.delete(e),!0)}}function pf(e){if(on(e))return{peerId:e,multiaddrs:[]};let t;if(Array.isArray(e)||(e=[e]),e.length>0){const n=e[0].getPeerId();t=null==n?void 0:Ss(n),e.forEach((e=>{if(!ar(e))throw new fn("Invalid Multiaddr",sf.ERR_INVALID_MULTIADDR);const n=e.getPeerId();if(null==n){if(null!=t)throw new fn("Multiaddrs must all have the same peer id or have no peer id",sf.ERR_INVALID_PARAMETERS)}else{const e=Ss(n);if(null==t||!t.equals(e))throw new fn("Multiaddrs must all have the same peer id or have no peer id",sf.ERR_INVALID_PARAMETERS)}}))}return{peerId:t,multiaddrs:e}}class ff extends Error{type;code;constructor(e,t){super(e??"The operation was aborted"),this.type="aborted",this.name="AbortError",this.code=t??"ABORT_ERR"}}async function gf(e,t,n,r){const s=new ff(r?.errorMessage,r?.errorCode);return!0===n?.aborted?Promise.reject(s):new Promise(((i,o)=>{function a(){n?.removeEventListener("abort",u),e.removeEventListener(t,c),null!=r?.errorEvent&&e.removeEventListener(r.errorEvent,l)}const c=e=>{try{if(!1===r?.filter?.(e))return}catch(e){return a(),void o(e)}a(),i(e)},l=e=>{a(),o(e.detail)},u=()=>{a(),o(s)};n?.addEventListener("abort",u),e.addEventListener(t,c),null!=r?.errorEvent&&e.addEventListener(r.errorEvent,l)}))}class mf{deferred;signal;constructor(e){this.signal=e,this.deferred=lr(),this.onAbort=this.onAbort.bind(this),this.signal?.addEventListener("abort",this.onAbort)}onAbort(){this.deferred.reject(this.signal?.reason??new pn)}cleanup(){this.signal?.removeEventListener("abort",this.onAbort)}}class yf{id;fn;options;recipients;status;timeline;controller;constructor(e,t){this.id=`${parseInt(String(1e9*Math.random()),10).toString()}${Date.now()}`,this.status="queued",this.fn=e,this.options=t,this.recipients=[],this.timeline={created:Date.now()},this.controller=new AbortController,this.controller.signal,this.onAbort=this.onAbort.bind(this)}abort(e){this.controller.abort(e)}onAbort(){this.recipients.reduce(((e,t)=>e&&!0===t.signal?.aborted),!0)&&(this.controller.abort(new pn),this.cleanup())}async join(e={}){const t=new mf(e.signal);return this.recipients.push(t),e.signal?.addEventListener("abort",this.onAbort),t.deferred.promise}async run(){this.status="running",this.timeline.started=Date.now();try{this.controller.signal.throwIfAborted();const e=await Ar(this.fn({...this.options??{},signal:this.controller.signal}),this.controller.signal);this.recipients.forEach((t=>{t.deferred.resolve(e)})),this.status="complete"}catch(e){this.recipients.forEach((t=>{t.deferred.reject(e)})),this.status="errored"}finally{this.timeline.finished=Date.now(),this.cleanup()}}cleanup(){this.recipients.forEach((e=>{e.cleanup(),e.signal?.removeEventListener("abort",this.onAbort)}))}}class wf extends wn{concurrency;queue;pending;sort;constructor(e={}){super(),this.concurrency=e.concurrency??Number.POSITIVE_INFINITY,this.pending=0,null!=e.metricName&&e.metrics?.registerMetricGroup(e.metricName,{calculate:()=>({size:this.queue.length,running:this.pending,queued:this.queue.length-this.pending})}),this.sort=e.sort,this.queue=[]}tryToStartAnother(){if(0===this.size)return queueMicrotask((()=>{this.safeDispatchEvent("empty")})),0===this.running&&queueMicrotask((()=>{this.safeDispatchEvent("idle")})),!1;if(this.pending<this.concurrency){let e;for(const t of this.queue)if("queued"===t.status){e=t;break}return null!=e&&(this.safeDispatchEvent("active"),this.pending++,e.run().finally((()=>{for(let t=0;t<this.queue.length;t++)if(this.queue[t]===e){this.queue.splice(t,1);break}this.pending--,this.tryToStartAnother(),this.safeDispatchEvent("next")})),!0)}return!1}enqueue(e){this.queue.push(e),null!=this.sort&&this.queue.sort(this.sort)}async add(e,t){t?.signal?.throwIfAborted();const n=new yf(e,t);return this.enqueue(n),this.safeDispatchEvent("add"),this.tryToStartAnother(),n.join(t).then((e=>(this.safeDispatchEvent("completed",{detail:e}),this.safeDispatchEvent("success",{detail:{job:n,result:e}}),e))).catch((e=>{if("queued"===n.status)for(let e=0;e<this.queue.length;e++)if(this.queue[e]===n){this.queue.splice(e,1);break}throw this.safeDispatchEvent("error",{detail:e}),this.safeDispatchEvent("failure",{detail:{job:n,error:e}}),e}))}clear(){this.queue.splice(0,this.queue.length)}abort(){this.queue.forEach((e=>{e.abort(new pn)})),this.clear()}async onEmpty(e){0!==this.size&&await gf(this,"empty",e?.signal)}async onSizeLessThan(e,t){this.size<e||await gf(this,"next",t?.signal,{filter:()=>this.size<e})}async onIdle(e){0===this.pending&&0===this.size||await gf(this,"idle",e?.signal)}get size(){return this.queue.length}get queued(){return this.queue.length-this.pending}get running(){return this.pending}async*toGenerator(e){e?.signal?.throwIfAborted();const t=pr({objectMode:!0}),n=e=>{null!=e?this.abort():this.clear(),t.end(e)},r=e=>{null!=e.detail&&t.push(e.detail)},s=e=>{n(e.detail)},i=()=>{n()},o=()=>{n(new fn("Queue aborted","ERR_QUEUE_ABORTED"))};this.addEventListener("completed",r),this.addEventListener("error",s),this.addEventListener("idle",i),e?.signal?.addEventListener("abort",o);try{yield*t}finally{this.removeEventListener("completed",r),this.removeEventListener("error",s),this.removeEventListener("idle",i),e?.signal?.removeEventListener("abort",o),n()}}}class bf extends wf{has(e){return null!=this.find(e)}find(e){return this.queue.find((t=>e.equals(t.options.peerId)))}}const vf="last-dial-failure",Ef=42e4,Sf={minConnections:5,maxQueueLength:100,autoDialConcurrency:25,autoDialPriority:0,autoDialInterval:5e3,autoDialPeerRetryThreshold:Ef,autoDialDiscoveredPeersDebounce:10};class _f{connectionManager;peerStore;queue;minConnections;autoDialPriority;autoDialIntervalMs;autoDialMaxQueueLength;autoDialPeerRetryThresholdMs;autoDialDiscoveredPeersDebounce;autoDialInterval;started;running;log;constructor(e,t){let n;this.connectionManager=e.connectionManager,this.peerStore=e.peerStore,this.minConnections=t.minConnections??Sf.minConnections,this.autoDialPriority=t.autoDialPriority??Sf.autoDialPriority,this.autoDialIntervalMs=t.autoDialInterval??Sf.autoDialInterval,this.autoDialMaxQueueLength=t.maxQueueLength??Sf.maxQueueLength,this.autoDialPeerRetryThresholdMs=t.autoDialPeerRetryThreshold??Sf.autoDialPeerRetryThreshold,this.autoDialDiscoveredPeersDebounce=t.autoDialDiscoveredPeersDebounce??Sf.autoDialDiscoveredPeersDebounce,this.log=e.logger.forComponent("libp2p:connection-manager:auto-dial"),this.started=!1,this.running=!1,this.queue=new bf({concurrency:t.autoDialConcurrency??Sf.autoDialConcurrency,metricName:"libp2p_autodial_queue",metrics:e.metrics}),this.queue.addEventListener("error",(e=>{this.log.error("error during auto-dial",e.detail)})),e.events.addEventListener("connection:close",(()=>{this.autoDial().catch((e=>{this.log.error(e)}))})),e.events.addEventListener("peer:discovery",(()=>{clearTimeout(n),n=setTimeout((()=>{this.autoDial().catch((e=>{this.log.error(e)}))}),this.autoDialDiscoveredPeersDebounce)}))}isStarted(){return this.started}start(){this.started=!0}afterStart(){this.autoDial().catch((e=>{this.log.error("error while autodialing",e)}))}stop(){this.queue.clear(),clearTimeout(this.autoDialInterval),this.started=!1,this.running=!1}async autoDial(){if(!this.started||this.running)return;const e=this.connectionManager.getConnectionsMap(),t=e.size;if(t>=this.minConnections)return void(this.minConnections>0&&this.log.trace("have enough connections %d/%d",t,this.minConnections));if(this.queue.size>this.autoDialMaxQueueLength)return this.log("not enough connections %d/%d but auto dial queue is full",t,this.minConnections),void this.sheduleNextAutodial();this.running=!0,this.log("not enough connections %d/%d - will dial peers to increase the number of connections",t,this.minConnections);const n=new zh(this.connectionManager.getDialQueue().map((e=>e.peerId)).filter(Boolean)),r=await this.peerStore.all({filters:[t=>0===t.addresses.length?(this.log.trace("not autodialing %p because they have no addresses",t.id),!1):e.has(t.id)?(this.log.trace("not autodialing %p because they are already connected",t.id),!1):n.has(t.id)?(this.log.trace("not autodialing %p because they are already being dialed",t.id),!1):!this.queue.has(t.id)||(this.log.trace("not autodialing %p because they are already being autodialed",t.id),!1)]}),s=r.sort((()=>Math.random()>.5?1:-1)),i=new Hh;for(const e of s)i.has(e.id)||i.set(e.id,[...e.tags.values()].reduce(((e,t)=>e+t.value),0));const o=s.sort(((e,t)=>{const n=i.get(e.id)??0,r=i.get(t.id)??0;return n>r?-1:n<r?1:0})).filter((e=>{const t=e.metadata.get(vf);if(null==t)return!0;const n=parseInt(Qt(t));return!!isNaN(n)||Date.now()-n>this.autoDialPeerRetryThresholdMs}));this.log("selected %d/%d peers to dial",o.length,r.length);for(const e of o)this.queue.add((async()=>{const t=this.connectionManager.getConnectionsMap().size;if(t>=this.minConnections)return this.log("got enough connections now %d/%d",t,this.minConnections),void this.queue.clear();this.log("connecting to a peerStore stored peer %p",e.id),await this.connectionManager.openConnection(e.id,{priority:this.autoDialPriority})}),{peerId:e.id}).catch((e=>{this.log.error("could not connect to peerStore stored peer",e)}));this.running=!1,this.sheduleNextAutodial()}sheduleNextAutodial(){this.started&&(this.autoDialInterval=setTimeout((()=>{this.autoDial().catch((e=>{this.log.error("error while autodialing",e)}))}),this.autoDialIntervalMs))}}const If=["/ipfs/id/1.0.0","/ipfs/id/push/1.0.0","/libp2p/autonat/1.0.0","/libp2p/dcutr"];const Rf={maxConnections:100,allow:[]};class Af{maxConnections;connectionManager;peerStore;allow;events;log;constructor(e,t={}){this.maxConnections=t.maxConnections??Rf.maxConnections,this.allow=t.allow??Rf.allow,this.connectionManager=e.connectionManager,this.peerStore=e.peerStore,this.events=e.events,this.log=e.logger.forComponent("libp2p:connection-manager:connection-pruner"),e.events.addEventListener("connection:open",(()=>{this.maybePruneConnections().catch((e=>{this.log.error(e)}))}))}async maybePruneConnections(){const e=this.connectionManager.getConnections(),t=e.length;if(this.log("checking max connections limit %d/%d",t,this.maxConnections),t<=this.maxConnections)return;const n=new Hh;for(const t of e){const e=t.remotePeer;if(!n.has(e)){n.set(e,0);try{const t=await this.peerStore.get(e);n.set(e,[...t.tags.values()].reduce(((e,t)=>e+t.value),0))}catch(e){"ERR_NOT_FOUND"!==e.code&&this.log.error("error loading peer tags",e)}}}const r=this.sortConnections(e,n),s=Math.max(t-this.maxConnections,0),i=[];for(const e of r){this.log("too many connections open - closing a connection to %p",e.remotePeer);if(this.allow.some((t=>e.remoteAddr.toString().startsWith(t.toString())))||i.push(e),i.length===s)break}await Promise.all(i.map((async e=>{await async function(e,t){const n=e?.streams?.map((e=>e.protocol))??[],r=t?.closableProtocols??If;if(!(n.filter((e=>null!=e&&!r.includes(e))).length>0))try{await(e?.close(t))}catch(t){e?.abort(t)}}(e,{signal:AbortSignal.timeout(1e3)})}))),this.events.safeDispatchEvent("connection:prune",{detail:i})}sortConnections(e,t){return e.sort(((e,t)=>{const n=e.timeline.open,r=t.timeline.open;return n<r?1:n>r?-1:0})).sort(((e,t)=>"outbound"===e.direction&&"inbound"===t.direction?1:"inbound"===e.direction&&"outbound"===t.direction?-1:0)).sort(((e,t)=>e.streams.length>t.streams.length?1:e.streams.length<t.streams.length?-1:0)).sort(((e,n)=>{const r=t.get(e.remotePeer)??0,s=t.get(n.remotePeer)??0;return r>s?1:r<s?-1:0}))}}class Tf extends wf{constructor(e={}){super({...e,sort:(e,t)=>e.options.priority>t.options.priority?-1:e.options.priority<t.options.priority?1:0})}}const Df={addressSorter:xp,maxParallelDials:50,maxDialQueueLength:500,maxPeerAddrsToDial:25,dialTimeout:5e3,resolvers:{dnsaddr:zp}};class kf{queue;components;addressSorter;maxPeerAddrsToDial;maxDialQueueLength;dialTimeout;shutDownController;connections;log;constructor(e,t={}){this.addressSorter=t.addressSorter??Df.addressSorter,this.maxPeerAddrsToDial=t.maxPeerAddrsToDial??Df.maxPeerAddrsToDial,this.maxDialQueueLength=t.maxDialQueueLength??Df.maxDialQueueLength,this.dialTimeout=t.dialTimeout??Df.dialTimeout,this.connections=t.connections??new Hh,this.log=e.logger.forComponent("libp2p:connection-manager:dial-queue"),this.components=e,this.shutDownController=new AbortController,this.shutDownController.signal;for(const[e,n]of Object.entries(t.resolvers??{}))or.set(e,n);this.queue=new Tf({concurrency:t.maxParallelDials??Df.maxParallelDials,metricName:"libp2p_dial_queue",metrics:e.metrics}),this.queue.addEventListener("error",(e=>{this.log.error("error in dial queue",e.detail)}))}start(){this.shutDownController=new AbortController,this.shutDownController.signal}stop(){this.shutDownController.abort(),this.queue.abort()}async dial(e,t={}){const{peerId:n,multiaddrs:r}=pf(e),s=Array.from(this.connections.values()).flat().find((e=>!0!==t.force&&(!!e.remotePeer.equals(n)||r.find((t=>t.equals(e.remoteAddr))))));if(null!=s)return this.log("already connected to %a",s.remoteAddr),s;const i=this.queue.queue.find((e=>{if(!0===n?.equals(e.options.peerId))return!0;const t=e.options.multiaddrs;if(null==t)return!1;for(const e of r)if(t.has(e.toString()))return!0;return!1}));if(null!=i){this.log("joining existing dial target for %p",n);for(const e of r)i.options.multiaddrs.add(e.toString());return i.join(t)}if(this.queue.size>=this.maxDialQueueLength)throw new fn("Dial queue is full","ERR_DIAL_QUEUE_FULL");return this.log("creating dial target for %p",n,r.map((e=>e.toString()))),this.queue.add((async e=>{const t=this.createDialAbortController(e?.signal);let r;try{r=await this.calculateMultiaddrs(n,e?.multiaddrs,{...e,signal:t}),r.map((({multiaddr:e})=>e.toString())).forEach((t=>{e?.multiaddrs.add(t)}))}catch(e){throw t.clear(),e}try{let s=0;const i=[];for(const o of r){if(s===this.maxPeerAddrsToDial)throw this.log("dialed maxPeerAddrsToDial (%d) addresses for %p, not trying any others",s,n),new fn("Peer had more than maxPeerAddrsToDial",sf.ERR_TOO_MANY_ADDRESSES);s++;try{const n=await this.components.transportManager.dial(o.multiaddr,{...e,signal:t});return this.log("dial to %a succeeded",o.multiaddr),n}catch(e){if(this.log.error("dial failed to %a",o.multiaddr,e),null!=n)try{await this.components.peerStore.patch(n,{metadata:{[vf]:kt(Date.now().toString())}})}catch(e){this.log.error("could not update last dial failure key for %p",n,e)}if(t.aborted)throw new fn(e.message,mn);i.push(e)}}if(1===i.length)throw i[0];throw new gn(i,"All multiaddr dials failed",sf.ERR_TRANSPORT_DIAL_FAILED)}finally{t.clear()}}),{peerId:n,priority:t.priority??Pf,multiaddrs:new Set(r.map((e=>e.toString()))),signal:t.signal})}createDialAbortController(e){const t=Rs([AbortSignal.timeout(this.dialTimeout),this.shutDownController.signal,e]);return t}async calculateMultiaddrs(e,t=new Set,n={}){const r=[...t].map((e=>({multiaddr:cr(e),isCertified:!1})));if(null!=e){if(this.components.peerId.equals(e))throw new fn("Tried to dial self",sf.ERR_DIALED_SELF);if(!0===await(this.components.connectionGater.denyDialPeer?.(e)))throw new fn("The dial request is blocked by gater.allowDialPeer",sf.ERR_PEER_DIAL_INTERCEPTED);if(0===r.length){this.log("loading multiaddrs for %p",e);try{const t=await this.components.peerStore.get(e);r.push(...t.addresses),this.log("loaded multiaddrs for %p",e,r.map((({multiaddr:e})=>e.toString())))}catch(e){if(e.code!==sf.ERR_NOT_FOUND)throw e}}if(0===r.length){this.log("looking up multiaddrs for %p in the peer routing",e);try{const t=await this.components.peerRouting.findPeer(e);this.log("found multiaddrs for %p in the peer routing",e,r.map((({multiaddr:e})=>e.toString()))),r.push(...t.multiaddrs.map((e=>({multiaddr:e,isCertified:!1}))))}catch(t){t.code!==sf.ERR_NO_ROUTERS_AVAILABLE&&this.log.error("looking up multiaddrs for %p in the peer routing failed",e,t)}}}let s=(await Promise.all(r.map((async e=>{const t=await async function(e,t){let n=!1;for(const t of or.keys())if(n=e.protoNames().includes(t),n)break;if(!n)return[e];const r=await e.resolve(t);return t.log("resolved %s to",e,r.map((e=>e.toString()))),r}(e.multiaddr,{dns:this.components.dns,...n,log:this.log});return 1===t.length&&t[0].equals(e.multiaddr)?e:t.map((e=>({multiaddr:e,isCertified:!1})))})))).flat();if(null!=e){const t=`/p2p/${e.toString()}`;s=s.map((e=>{const n=e.multiaddr.protos().pop();return!0===n?.path?e:null==e.multiaddr.getPeerId()?{multiaddr:e.multiaddr.encapsulate(t),isCertified:e.isCertified}:e}))}const i=s.filter((t=>{if(null==this.components.transportManager.dialTransportForMultiaddr(t.multiaddr))return!1;const n=t.multiaddr.getPeerId();return null==e||null==n||e.equals(n)})),o=new Map;for(const e of i){const t=e.multiaddr.toString(),n=o.get(t);null==n?o.set(t,e):n.isCertified=n.isCertified||e.isCertified||!1}const a=[...o.values()];if(0===a.length)throw new fn("The dial request has no valid addresses",sf.ERR_NO_VALID_ADDRESSES);const c=[];for(const e of a)null!=this.components.connectionGater.denyDialMultiaddr&&await this.components.connectionGater.denyDialMultiaddr(e.multiaddr)||c.push(e);const l=c.sort(this.addressSorter);if(0===l.length)throw new fn("The connection gater denied all addresses in the dial request",sf.ERR_NO_VALID_ADDRESSES);return this.log.trace("addresses for %p before filtering",e??"unknown peer",s.map((({multiaddr:e})=>e.toString()))),this.log.trace("addresses for %p after filtering",e??"unknown peer",l.map((({multiaddr:e})=>e.toString()))),l}async isDialable(e,t={}){Array.isArray(e)||(e=[e]);try{const n=await this.calculateMultiaddrs(void 0,new Set(e.map((e=>e.toString()))),t);return!1!==t.runOnTransientConnection||null!=n.find((e=>!kp.matches(e.multiaddr)))}catch(e){this.log.trace("error calculating if multiaddr(s) were dialable",e)}return!1}}const Pf=50,Cf={minConnections:5,maxConnections:100,inboundConnectionThreshold:5,maxIncomingPendingConnections:10,autoDialConcurrency:25,autoDialPriority:0,autoDialMaxQueueLength:100,autoDialPeerRetryThreshold:Ef,autoDialDiscoveredPeersDebounce:10};class xf{started;connections;allow;deny;maxIncomingPendingConnections;incomingPendingConnections;maxConnections;dialQueue;autoDial;connectionPruner;inboundConnectionRateLimiter;peerStore;metrics;events;log;constructor(e,t={}){this.maxConnections=t.maxConnections??Cf.maxConnections;const n=t.minConnections??Cf.minConnections;if(this.maxConnections<n)throw new fn("Connection Manager maxConnections must be greater than minConnections",sf.ERR_INVALID_PARAMETERS);this.connections=new Hh,this.started=!1,this.peerStore=e.peerStore,this.metrics=e.metrics,this.events=e.events,this.log=e.logger.forComponent("libp2p:connection-manager"),this.onConnect=this.onConnect.bind(this),this.onDisconnect=this.onDisconnect.bind(this),this.events.addEventListener("connection:open",this.onConnect),this.events.addEventListener("connection:close",this.onDisconnect),this.allow=(t.allow??[]).map((e=>cr(e))),this.deny=(t.deny??[]).map((e=>cr(e))),this.incomingPendingConnections=0,this.maxIncomingPendingConnections=t.maxIncomingPendingConnections??Cf.maxIncomingPendingConnections,this.inboundConnectionRateLimiter=new hf({points:t.inboundConnectionThreshold??Cf.inboundConnectionThreshold,duration:1}),this.autoDial=new _f({connectionManager:this,peerStore:e.peerStore,events:e.events,logger:e.logger},{minConnections:n,autoDialConcurrency:t.autoDialConcurrency??Cf.autoDialConcurrency,autoDialPriority:t.autoDialPriority??Cf.autoDialPriority,autoDialPeerRetryThreshold:t.autoDialPeerRetryThreshold??Cf.autoDialPeerRetryThreshold,autoDialDiscoveredPeersDebounce:t.autoDialDiscoveredPeersDebounce??Cf.autoDialDiscoveredPeersDebounce,maxQueueLength:t.autoDialMaxQueueLength??Cf.autoDialMaxQueueLength}),this.connectionPruner=new Af({connectionManager:this,peerStore:e.peerStore,events:e.events,logger:e.logger},{maxConnections:this.maxConnections,allow:this.allow}),this.dialQueue=new kf(e,{addressSorter:t.addressSorter??xp,maxParallelDials:t.maxParallelDials??50,maxDialQueueLength:t.maxDialQueueLength??500,maxPeerAddrsToDial:t.maxPeerAddrsToDial??25,dialTimeout:t.dialTimeout??5e3,resolvers:t.resolvers??{dnsaddr:zp},connections:this.connections})}isStarted(){return this.started}async start(){this.metrics?.registerMetricGroup("libp2p_connection_manager_connections",{calculate:()=>{const e={inbound:0,outbound:0};for(const t of this.connections.values())for(const n of t)"inbound"===n.direction?e.inbound++:e.outbound++;return e}}),this.metrics?.registerMetricGroup("libp2p_protocol_streams_total",{label:"protocol",calculate:()=>{const e={};for(const t of this.connections.values())for(const n of t)for(const t of n.streams){const n=`${t.direction} ${t.protocol??"unnegotiated"}`;e[n]=(e[n]??0)+1}return e}}),this.metrics?.registerMetricGroup("libp2p_connection_manager_protocol_streams_per_connection_90th_percentile",{label:"protocol",calculate:()=>{const e={};for(const t of this.connections.values())for(const n of t){const t={};for(const e of n.streams){const n=`${e.direction} ${e.protocol??"unnegotiated"}`;t[n]=(t[n]??0)+1}for(const[n,r]of Object.entries(t))e[n]=e[n]??[],e[n].push(r)}const t={};for(let[n,r]of Object.entries(e)){r=r.sort(((e,t)=>e-t));const e=Math.floor(.9*r.length);t[n]=r[e]}return t}}),this.dialQueue.start(),this.autoDial.start(),this.started=!0,this.log("started")}async afterStart(){Promise.resolve().then((async()=>{const e=await this.peerStore.all({filters:[e=>e.tags.has("keep-alive")]});await Promise.all(e.map((async e=>{await this.openConnection(e.id).catch((e=>{this.log.error(e)}))})))})).catch((e=>{this.log.error(e)})),this.autoDial.afterStart()}async stop(){this.dialQueue.stop(),this.autoDial.stop();const e=[];for(const t of this.connections.values())for(const n of t)e.push((async()=>{try{await n.close()}catch(e){this.log.error(e)}})());this.log("closing %d connections",e.length),await Promise.all(e),this.connections.clear(),this.log("stopped")}onConnect(e){this._onConnect(e).catch((e=>{this.log.error(e)}))}async _onConnect(e){const{detail:t}=e;if(!this.started)return void await t.close();const n=t.remotePeer,r=this.connections.get(n);let s=!1;null!=r?r.push(t):(s=!0,this.connections.set(n,[t])),null!=n.publicKey&&"RSA"===n.type&&await this.peerStore.patch(n,{publicKey:n.publicKey}),s&&this.events.safeDispatchEvent("peer:connect",{detail:t.remotePeer})}onDisconnect(e){const{detail:t}=e;if(!this.started)return;const n=t.remotePeer;let r=this.connections.get(n);null!=r&&r.length>1?(r=r.filter((e=>e.id!==t.id)),this.connections.set(n,r)):null!=r&&(this.connections.delete(n),this.events.safeDispatchEvent("peer:disconnect",{detail:t.remotePeer}))}getConnections(e){if(null!=e)return this.connections.get(e)??[];let t=[];for(const e of this.connections.values())t=t.concat(e);return t}getConnectionsMap(){return this.connections}async openConnection(e,t={}){if(!this.isStarted())throw new fn("Not started",sf.ERR_NODE_NOT_STARTED);t.signal?.throwIfAborted();const{peerId:n}=pf(e);if(null!=n&&!0!==t.force){this.log("dial %p",n);const e=this.getConnections(n).find((e=>!e.transient));if(null!=e)return this.log("had an existing non-transient connection to %p",n),e}const r=await this.dialQueue.dial(e,{...t,priority:t.priority??Pf});let s=this.connections.get(r.remotePeer);null==s&&(s=[],this.connections.set(r.remotePeer,s));let i=!1;for(const e of s)e.id===r.id&&(i=!0);return i||s.push(r),r}async closeConnections(e,t={}){const n=this.connections.get(e)??[];await Promise.all(n.map((async e=>{try{await e.close(t)}catch(t){e.abort(t)}})))}async acceptIncomingConnection(e){if(this.deny.some((t=>e.remoteAddr.toString().startsWith(t.toString()))))return this.log("connection from %a refused - connection remote address was in deny list",e.remoteAddr),!1;if(this.allow.some((t=>e.remoteAddr.toString().startsWith(t.toString()))))return this.incomingPendingConnections++,!0;if(this.incomingPendingConnections===this.maxIncomingPendingConnections)return this.log("connection from %a refused - incomingPendingConnections exceeded by host",e.remoteAddr),!1;if(e.remoteAddr.isThinWaistAddress()){const t=e.remoteAddr.nodeAddress().address;try{await this.inboundConnectionRateLimiter.consume(t,1)}catch{return this.log("connection from %a refused - inboundConnectionThreshold exceeded by host %s",e.remoteAddr,t),!1}}return this.getConnections().length<this.maxConnections?(this.incomingPendingConnections++,!0):(this.log("connection from %a refused - maxConnections exceeded",e.remoteAddr),!1)}afterUpgradeInbound(){this.incomingPendingConnections--}getDialQueue(){const e={queued:"queued",running:"active",errored:"error",complete:"success"};return this.dialQueue.queue.queue.map((t=>({id:t.id,status:e[t.status],peerId:t.options.peerId,multiaddrs:[...t.options.multiaddrs].map((e=>cr(e)))})))}async isDialable(e,t={}){return this.dialQueue.isDialable(e,t)}}class Nf{routers;started;components;constructor(e,t){this.routers=t.routers??[],this.started=!1,this.components=e}isStarted(){return this.started}async start(){this.started=!0}async stop(){this.started=!1}async*findProviders(e,t={}){if(0===this.routers.length)throw new fn("No content routers available",sf.ERR_NO_ROUTERS_AVAILABLE);const n=this,r=new zh;for await(const s of fr(...n.routers.map((n=>n.findProviders(e,t)))))null!=s&&(s.multiaddrs.length>0&&await this.components.peerStore.merge(s.id,{multiaddrs:s.multiaddrs}),r.has(s.id)||(r.add(s.id),yield s))}async provide(e,t={}){if(0===this.routers.length)throw new fn("No content routers available",sf.ERR_NO_ROUTERS_AVAILABLE);await Promise.all(this.routers.map((async n=>{await n.provide(e,t)})))}async put(e,t,n){if(!this.isStarted())throw new fn(rf.NOT_STARTED_YET,sf.ERR_NODE_NOT_STARTED);await Promise.all(this.routers.map((async r=>{await r.put(e,t,n)})))}async get(e,t){if(!this.isStarted())throw new fn(rf.NOT_STARTED_YET,sf.ERR_NODE_NOT_STARTED);return Promise.any(this.routers.map((async n=>n.get(e,t))))}}const Mf=globalThis.CustomEvent??Event;async function*Of(e,t={}){let n=t.concurrency??1/0;n<1&&(n=1/0);const r=null!=t.ordered&&t.ordered,s=new EventTarget,i=[];let o,a=lr(),c=lr(),l=!1,u=!1;function h(){return r?i[0]?.done:Boolean(i.find((e=>e.done)))}function*d(){for(;i.length>0&&i[0].done;){const e=i[0];if(i.shift(),!e.ok)throw u=!0,a.resolve(),e.err;yield e.value,a.resolve()}}function*p(){for(;h();)for(let e=0;e<i.length;e++)if(i[e].done){const t=i[e];if(i.splice(e,1),e--,!t.ok)throw u=!0,a.resolve(),t.err;yield t.value,a.resolve()}}for(s.addEventListener("task-complete",(()=>{c.resolve()})),Promise.resolve().then((async()=>{try{for await(const t of e){if(i.length===n&&(a=lr(),await a.promise),u)break;const e={done:!1};i.push(e),t().then((t=>{e.done=!0,e.ok=!0,e.value=t,s.dispatchEvent(new Mf("task-complete"))}),(t=>{e.done=!0,e.err=t,s.dispatchEvent(new Mf("task-complete"))}))}l=!0,s.dispatchEvent(new Mf("task-complete"))}catch(e){o=e,s.dispatchEvent(new Mf("task-complete"))}}));;){if(h()||(c=lr(),await c.promise),null!=o)throw o;if(r?yield*d():yield*p(),l&&0===i.length)break}}class Lf{log;peerId;peerStore;routers;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:peer-routing"),this.peerId=e.peerId,this.peerStore=e.peerStore,this.routers=t.routers??[]}async findPeer(e,t){if(0===this.routers.length)throw new fn("No peer routers available",sf.ERR_NO_ROUTERS_AVAILABLE);if(e.toString()===this.peerId.toString())throw new fn("Should not try to find self",sf.ERR_FIND_SELF);const n=this,r=fr(...this.routers.map((r=>async function*(){try{yield await r.findPeer(e,t)}catch(e){n.log.error(e)}}())));for await(const e of r)if(null!=e)return e.multiaddrs.length>0&&await this.peerStore.merge(e.id,{multiaddrs:e.multiaddrs}),e;throw new fn(rf.NOT_FOUND,sf.ERR_NOT_FOUND)}async*getClosestPeers(e,t={}){if(0===this.routers.length)throw new fn("No peer routers available",sf.ERR_NO_ROUTERS_AVAILABLE);const n=this,r=new zh;for await(const s of Of(async function*(){const r=fr(...n.routers.map((n=>n.getClosestPeers(e,t))));for await(let e of r)yield async()=>{if(0===e.multiaddrs.length)try{e=await n.findPeer(e.id,{...t,useCache:!1})}catch(e){return void n.log.error("could not find peer multiaddrs",e)}return e}}()))null!=s&&(s.multiaddrs.length>0&&await this.peerStore.merge(s.id,{multiaddrs:s.multiaddrs}),r.has(s.id)||(r.add(s.id),yield s))}}class Bf extends wn{peerRouting;log;walking;walkers;shutdownController;walkController;needNext;constructor(e){super(),this.log=e.logger.forComponent("libp2p:random-walk"),this.peerRouting=e.peerRouting,this.walkers=0,this.walking=!1,this.shutdownController=new AbortController,this.shutdownController.signal}start(){this.shutdownController=new AbortController,this.shutdownController.signal}stop(){this.shutdownController.abort()}async*walk(e){this.walking||this.startWalk(),this.walkers++;const t=Rs([this.shutdownController.signal,e?.signal]);try{for(;;){this.needNext?.resolve(),this.needNext=lr();const e=await gf(this,"walk:peer",t,{errorEvent:"walk:error"});yield e.detail}}finally{t.clear(),this.walkers--,0===this.walkers&&(this.walkController?.abort(),this.walkController=void 0)}}startWalk(){this.walking=!0,this.walkController=new AbortController,this.walkController.signal;const e=Rs([this.walkController.signal,this.shutdownController.signal]),t=Date.now();let n=0;Promise.resolve().then((async()=>{for(this.log("start walk");this.walkers>0;)try{for await(const t of this.peerRouting.getClosestPeers(Mo(32),{signal:e}))e.throwIfAborted(),this.log("found peer %p",t.id),n++,this.safeDispatchEvent("walk:peer",{detail:t}),1===this.walkers&&null!=this.needNext&&await Ar(this.needNext.promise,e)}catch(e){this.log.error("randomwalk errored",e),this.safeDispatchEvent("walk:error",{detail:e})}})).catch((e=>{this.log.error("randomwalk errored",e)})).finally((()=>{this.log("finished walk, found %d peers after %dms",n,Date.now()-t),this.walking=!1}))}}class Uf{log;topologies;handlers;components;constructor(e){this.log=e.logger.forComponent("libp2p:registrar"),this.topologies=new Map,this.handlers=new Map,this.components=e,this._onDisconnect=this._onDisconnect.bind(this),this._onPeerUpdate=this._onPeerUpdate.bind(this),this._onPeerIdentify=this._onPeerIdentify.bind(this),this.components.events.addEventListener("peer:disconnect",this._onDisconnect),this.components.events.addEventListener("peer:update",this._onPeerUpdate),this.components.events.addEventListener("peer:identify",this._onPeerIdentify)}getProtocols(){return Array.from(new Set([...this.handlers.keys()])).sort()}getHandler(e){const t=this.handlers.get(e);if(null==t)throw new fn(`No handler registered for protocol ${e}`,sf.ERR_NO_HANDLER_FOR_PROTOCOL);return t}getTopologies(e){const t=this.topologies.get(e);return null==t?[]:[...t.values()]}async handle(e,t,n){if(this.handlers.has(e))throw new fn(`Handler already registered for protocol ${e}`,sf.ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED);const r=of.bind({ignoreUndefined:!0})({maxInboundStreams:32,maxOutboundStreams:64},n);this.handlers.set(e,{handler:t,options:r}),await this.components.peerStore.merge(this.components.peerId,{protocols:[e]})}async unhandle(e){(Array.isArray(e)?e:[e]).forEach((e=>{this.handlers.delete(e)})),await this.components.peerStore.patch(this.components.peerId,{protocols:this.getProtocols()})}async register(e,t){if(null==t)throw new fn("invalid topology",sf.ERR_INVALID_PARAMETERS);const n=`${(1e9*Math.random()).toString(36)}${Date.now()}`;let r=this.topologies.get(e);return null==r&&(r=new Map,this.topologies.set(e,r)),r.set(n,t),n}unregister(e){for(const[t,n]of this.topologies.entries())n.has(e)&&(n.delete(e),0===n.size&&this.topologies.delete(t))}_onDisconnect(e){const t=e.detail;this.components.peerStore.get(t).then((e=>{for(const n of e.protocols){const e=this.topologies.get(n);if(null!=e)for(const n of e.values())!1!==n.filter?.has(t)&&(n.filter?.remove(t),n.onDisconnect?.(t))}})).catch((e=>{e.code!==sf.ERR_NOT_FOUND&&this.log.error("could not inform topologies of disconnecting peer %p",t,e)}))}_onPeerUpdate(e){const{peer:t,previous:n}=e.detail,r=(n?.protocols??[]).filter((e=>!t.protocols.includes(e)));for(const e of r){const n=this.topologies.get(e);if(null!=n)for(const e of n.values())!1!==e.filter?.has(t.id)&&(e.filter?.remove(t.id),e.onDisconnect?.(t.id))}}_onPeerIdentify(e){const t=e.detail.protocols,n=e.detail.connection,r=e.detail.peerId;for(const e of t){const t=this.topologies.get(e);if(null!=t)for(const e of t.values())n.transient&&!0!==e.notifyOnTransient||!0!==e.filter?.has(r)&&(e.filter?.add(r),e.onConnect?.(r,n))}}}class Ff extends Map{metric;constructor(e){super();const{name:t,metrics:n}=e;this.metric=n.registerMetric(t),this.updateComponentMetric()}set(e,t){return super.set(e,t),this.updateComponentMetric(),this}delete(e){const t=super.delete(e);return this.updateComponentMetric(),t}clear(){super.clear(),this.updateComponentMetric()}updateComponentMetric(){this.metric.update(this.size)}}class Vf{log;components;transports;listeners;faultTolerance;started;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:transports"),this.components=e,this.started=!1,this.transports=new Map,this.listeners=function(e){const{name:t,metrics:n}=e;let r;return r=null!=n?new Ff({name:t,metrics:n}):new Map,r}({name:"libp2p_transport_manager_listeners",metrics:this.components.metrics}),this.faultTolerance=t.faultTolerance??dn.FATAL_ALL}add(e){const t=e[Symbol.toStringTag];if(null==t)throw new fn("Transport must have a valid tag",sf.ERR_INVALID_KEY);if(this.transports.has(t))throw new fn(`There is already a transport with the tag ${t}`,sf.ERR_DUPLICATE_TRANSPORT);this.log("adding transport %s",t),this.transports.set(t,e),this.listeners.has(t)||this.listeners.set(t,[])}isStarted(){return this.started}start(){this.started=!0}async afterStart(){const e=this.components.addressManager.getListenAddrs();await this.listen(e)}async stop(){const e=[];for(const[t,n]of this.listeners)for(this.log("closing listeners for %s",t);n.length>0;){const t=n.pop();null!=t&&e.push(t.close())}await Promise.all(e),this.log("all listeners closed");for(const e of this.listeners.keys())this.listeners.set(e,[]);this.started=!1}async dial(e,t){const n=this.dialTransportForMultiaddr(e);if(null==n)throw new fn(`No transport available for address ${String(e)}`,sf.ERR_TRANSPORT_UNAVAILABLE);try{return await n.dial(e,{...t,upgrader:this.components.upgrader})}catch(e){throw null==e.code&&(e.code=sf.ERR_TRANSPORT_DIAL_FAILED),e}}getAddrs(){let e=[];for(const t of this.listeners.values())for(const n of t)e=[...e,...n.getAddrs()];return e}getTransports(){return Array.of(...this.transports.values())}getListeners(){return Array.of(...this.listeners.values()).flat()}dialTransportForMultiaddr(e){for(const t of this.transports.values()){if(t.dialFilter([e]).length>0)return t}}listenTransportForMultiaddr(e){for(const t of this.transports.values()){if(t.listenFilter([e]).length>0)return t}}async listen(e){if(!this.isStarted())throw new fn("Not started",sf.ERR_NODE_NOT_STARTED);if(null==e||0===e.length)return void this.log("no addresses were provided for listening, this node is dial only");const t=[];for(const[n,r]of this.transports.entries()){const s=r.listenFilter(e),i=[];for(const e of s){this.log("creating listener for %s on %a",n,e);const t=r.createListener({upgrader:this.components.upgrader});let s=this.listeners.get(n)??[];null==s&&(s=[],this.listeners.set(n,s)),s.push(t),t.addEventListener("listening",(()=>{this.components.events.safeDispatchEvent("transport:listening",{detail:t})})),t.addEventListener("close",(()=>{const e=s.findIndex((e=>e===t));s.splice(e,1),this.components.events.safeDispatchEvent("transport:close",{detail:t})})),i.push(t.listen(e))}if(0===i.length){t.push(n);continue}if(null==(await Promise.allSettled(i)).find((e=>"fulfilled"===e.status))&&this.faultTolerance!==dn.NO_FATAL)throw new fn(`Transport (${n}) could not listen on any available address`,sf.ERR_NO_VALID_ADDRESSES)}if(t.length===this.transports.size){const e=`no valid addresses were provided for transports [${t.join(", ")}]`;if(this.faultTolerance===dn.FATAL_ALL)throw new fn(e,sf.ERR_NO_VALID_ADDRESSES);this.log(`libp2p in dial mode only: ${e}`)}}async remove(e){const t=this.listeners.get(e)??[];this.log.trace("removing transport %s",e);const n=[];for(this.log.trace("closing listeners for %s",e);t.length>0;){const e=t.pop();null!=e&&n.push(e.close())}await Promise.all(n),this.transports.delete(e),this.listeners.delete(e)}async removeAll(){const e=[];for(const t of this.transports.keys())e.push(this.remove(t));await Promise.all(e)}}const Kf="/multistream/1.0.0",$f=1024,qf=kt("\n");async function Hf(e,t,n){await e.write(t,n)}async function zf(e,t){const n=await async function(e,t){const n=await e.read(t);if(0===n.byteLength||n.get(n.byteLength-1)!==qf[0])throw t.log.error("Invalid mss message - missing newline",n),new fn("missing newline","ERR_INVALID_MULTISTREAM_SELECT_MESSAGE");return n.sublist(0,-1)}(e,t);return Qt(n.subarray())}async function Wf(e,t,n){if(1===(t=Array.isArray(t)?[...t]:[t]).length&&!1===n.negotiateFully)return function(e,t,n){const r=e.sink.bind(e),s=e.source;let i=!1,o=!1;const a=lr();let c=!1,l=!1;const u=lr();let h=!1,d=!1;const p=lr(),f=xr({sink:r,source:s},{...n,maxDataLength:$f});async function g(){if(o)return n.log.trace("optimistic: already negotiating %s stream",t),void await a.promise;o=!0;try{c||(n.log.trace("optimistic: doing send protocol for %s stream",t),await m()),h||(n.log.trace("optimistic: doing read protocol for %s stream",t),await y())}finally{o=!1,i=!0,a.resolve()}}async function m(){if(l)await u.promise;else{l=!0;try{n.log.trace('optimistic: write ["%s", "%s", data] in source',Kf,t),await f.writeV([kt(`${Kf}\n`),kt(`${t}\n`)]),n.log.trace('optimistic: wrote ["%s", "%s", data] in source',Kf,t)}finally{c=!0,l=!1,u.resolve()}}}async function y(){if(d)await p.promise;else{d=!0;try{n.log.trace("optimistic: reading multistream select header");let e=await zf(f,n);if(n.log.trace('optimistic: read multistream select header "%s"',e),e===Kf&&(e=await zf(f,n)),n.log.trace('optimistic: read protocol "%s", expecting "%s"',e,t),e!==t)throw new fn("protocol selection failed","ERR_UNSUPPORTED_PROTOCOL")}finally{h=!0,d=!1,p.resolve()}}}if(e.sink=async e=>{const{sink:r}=f.unwrap();await r(async function*(){let r=!1;for await(const s of e){if(l&&await u.promise,c)yield s;else{l=!0,n.log.trace('optimistic: write ["%s", "%s", data(%d)] in sink',Kf,t,s.byteLength);const e=`${t}\n`;yield new Ir(Uint8Array.from([19]),kt(`${Kf}\n`),C(e.length),kt(e),s).subarray(),n.log.trace('optimistic: wrote ["%s", "%s", data(%d)] in sink',Kf,t,s.byteLength),c=!0,l=!1,u.resolve(),g().catch((e=>{n.log.error("could not finish optimistic protocol negotiation of %s",t,e)}))}r=!0}r||await g()}())},e.source=async function*(){await g(),n.log.trace('optimistic: reading data from "%s" stream',t),yield*f.unwrap().source}(),null!=e.closeRead){const t=e.closeRead.bind(e);e.closeRead=async e=>{i||await g().catch((e=>{n.log.error("could not negotiate protocol before close read",e)})),await t(e)}}if(null!=e.closeWrite){const t=e.closeWrite.bind(e);e.closeWrite=async e=>{i||await g().catch((e=>{n.log.error("could not negotiate protocol before close write",e)})),await t(e)}}if(null!=e.close){const t=e.close.bind(e);e.close=async e=>{const n=[];l&&n.push(u.promise),d&&n.push(p.promise),n.length>0?await Ar(Promise.all(n),e?.signal):(i=!0,o=!1,a.resolve()),await t(e)}}return{stream:e,protocol:t}}(e,t[0],n);const r=xr(e,{...n,maxDataLength:$f}),s=t.shift();if(null==s)throw new Error("At least one protocol must be specified");n.log.trace('select: write ["%s", "%s"]',Kf,s);const i=kt(`${Kf}\n`),o=kt(`${s}\n`);await async function(e,t,n){await e.writeV(t,n)}(r,[i,o],n),n.log.trace("select: reading multistream-select header");let a=await zf(r,n);if(n.log.trace('select: read "%s"',a),a===Kf&&(n.log.trace("select: reading protocol response"),a=await zf(r,n),n.log.trace('select: read "%s"',a)),a===s)return{stream:r.unwrap(),protocol:s};for(const e of t){n.log.trace('select: write "%s"',e),await Hf(r,kt(`${e}\n`),n),n.log.trace("select: reading protocol response");const t=await zf(r,n);if(n.log.trace('select: read "%s" for "%s"',t,e),t===e)return{stream:r.unwrap(),protocol:e}}throw new fn("protocol selection failed","ERR_UNSUPPORTED_PROTOCOL")}async function jf(e,t,n){t=Array.isArray(t)?t:[t],n.log.trace("handle: available protocols %s",t);const r=xr(e,{...n,maxDataLength:$f,maxLengthLength:2});for(;;){n.log.trace("handle: reading incoming string");const e=await zf(r,n);if(n.log.trace('handle: read "%s"',e),e!==Kf){if(t.includes(e))return n.log.trace('handle: respond with "%s" for "%s"',e,e),await Hf(r,kt(`${e}\n`),n),n.log.trace('handle: responded with "%s" for "%s"',e,e),{stream:r.unwrap(),protocol:e};if("ls"!==e)n.log('handle: respond with "na" for "%s"',e),await Hf(r,kt("na\n"),n),n.log('handle: responded with "na" for "%s"',e);else{const s=new Ir(...t.map((e=>Or.single(kt(`${e}\n`)))),kt("\n"));n.log.trace('handle: respond with "%s" for %s',t,e),await Hf(r,s,n),n.log.trace('handle: responded with "%s" for %s',t,e)}}else n.log.trace('handle: respond with "%s" for "%s"',Kf,e),await Hf(r,kt(`${Kf}\n`),n),n.log.trace('handle: responded with "%s" for "%s"',Kf,e)}}class Gf{id;remoteAddr;remotePeer;direction;timeline;multiplexer;encryption;status;transient;log;tags;_newStream;_close;_abort;_getStreams;constructor(e){const{remoteAddr:t,remotePeer:n,newStream:r,close:s,abort:i,getStreams:o}=e;this.id=`${parseInt(String(1e9*Math.random())).toString(36)}${Date.now()}`,this.remoteAddr=t,this.remotePeer=n,this.direction=e.direction,this.status="open",this.timeline=e.timeline,this.multiplexer=e.multiplexer,this.encryption=e.encryption,this.transient=e.transient??!1,this.log=e.logger.forComponent(`libp2p:connection:${this.direction}:${this.id}`),null==this.remoteAddr.getPeerId()&&(this.remoteAddr=this.remoteAddr.encapsulate(`/p2p/${this.remotePeer}`)),this._newStream=r,this._close=s,this._abort=i,this._getStreams=o,this.tags=[]}[Symbol.toStringTag]="Connection";[tn]=!0;get streams(){return this._getStreams()}async newStream(e,t){if("closing"===this.status)throw new fn("the connection is being closed","ERR_CONNECTION_BEING_CLOSED");if("closed"===this.status)throw new fn("the connection is closed","ERR_CONNECTION_CLOSED");if(Array.isArray(e)||(e=[e]),this.transient&&!0!==t?.runOnTransientConnection)throw new fn("Cannot open protocol stream on transient connection","ERR_TRANSIENT_CONNECTION");const n=await this._newStream(e,t);return n.direction="outbound",n}async close(e={}){if("closed"!==this.status&&"closing"!==this.status){if(this.log("closing connection to %a",this.remoteAddr),this.status="closing",null==e.signal){const t=AbortSignal.timeout(500);e={...e,signal:t}}try{this.log.trace("closing all streams"),await Promise.all(this.streams.map((async t=>t.close(e)))),this.log.trace("closing underlying transport"),await this._close(e),this.log.trace("updating timeline with close time"),this.status="closed",this.timeline.close=Date.now()}catch(e){this.log.error("error encountered during graceful close of connection to %a",this.remoteAddr,e),this.abort(e)}}}abort(e){this.log.error("aborting connection to %a due to error",this.remoteAddr,e),this.status="closing",this.streams.forEach((t=>{t.abort(e)})),this.log.error("all streams aborted",this.streams.length),this._abort(e),this.timeline.close=Date.now(),this.status="closed"}}function Yf(e,t,n){let r=0;return n.streams.forEach((n=>{n.direction===t&&n.protocol===e&&r++})),r}class Qf{components;connectionEncryption;muxers;inboundUpgradeTimeout;events;constructor(e,t){this.components=e,this.connectionEncryption=new Map,t.connectionEncryption.forEach((e=>{this.connectionEncryption.set(e.protocol,e)})),this.muxers=new Map,t.muxers.forEach((e=>{this.muxers.set(e.protocol,e)})),this.inboundUpgradeTimeout=t.inboundUpgradeTimeout??2e3,this.events=e.events}async shouldBlockConnection(e,t,n){const r=this.components.connectionGater[n];if(void 0!==r&&await r(e,t))throw new fn(`The multiaddr connection is blocked by gater.${n}`,sf.ERR_CONNECTION_INTERCEPTED)}async upgradeInbound(e,t){if(!await this.components.connectionManager.acceptIncomingConnection(e))throw new fn("connection denied",sf.ERR_CONNECTION_DENIED);let n,r,s,i,o;const a=AbortSignal.timeout(this.inboundUpgradeTimeout),c=()=>{e.abort(new fn("inbound upgrade timeout",mn))};a.addEventListener("abort",c,{once:!0});try{if(!0===await(this.components.connectionGater.denyInboundConnection?.(e)))throw new fn("The multiaddr connection is blocked by gater.acceptConnection",sf.ERR_CONNECTION_INTERCEPTED);this.components.metrics?.trackMultiaddrConnection(e),e.log("starting the inbound connection upgrade");let a=e;if(!0!==t?.skipProtection){const t=this.components.connectionProtector;null!=t&&(e.log("protecting the inbound connection"),a=await t.protect(e))}try{if(n=a,!0!==t?.skipEncryption){({conn:n,remotePeer:r,protocol:o}=await this._encryptInbound(a));const e={...a,...n};await this.shouldBlockConnection(r,e,"denyInboundEncryptedConnection")}else{const t=e.remoteAddr.getPeerId();if(null==t)throw new fn("inbound connection that skipped encryption must have a peer id",sf.ERR_INVALID_MULTIADDR);const n=Ss(t);o="native",r=n}if(s=n,null!=t?.muxerFactory)i=t.muxerFactory;else if(this.muxers.size>0){const e=await this._multiplexInbound({...a,...n},this.muxers);i=e.muxerFactory,s=e.stream}}catch(t){throw e.log.error("failed to upgrade inbound connection",t),t}return await this.shouldBlockConnection(r,e,"denyInboundUpgradedConnection"),e.log("successfully upgraded inbound connection"),this._createConnection({cryptoProtocol:o,direction:"inbound",maConn:e,upgradedConn:s,muxerFactory:i,remotePeer:r,transient:t?.transient})}finally{a.removeEventListener("abort",c),this.components.connectionManager.afterUpgradeInbound()}}async upgradeOutbound(e,t){const n=e.remoteAddr.getPeerId();let r,s,i,o,a,c;null!=n&&(r=Ss(n),await this.shouldBlockConnection(r,e,"denyOutboundConnection")),this.components.metrics?.trackMultiaddrConnection(e),e.log("starting the outbound connection upgrade");let l=e;if(!0!==t?.skipProtection){const t=this.components.connectionProtector;null!=t&&(l=await t.protect(e))}try{if(s=l,!0!==t?.skipEncryption){({conn:s,remotePeer:i,protocol:a}=await this._encryptOutbound(l,r));const e={...l,...s};await this.shouldBlockConnection(i,e,"denyOutboundEncryptedConnection")}else{if(null==r)throw new fn("Encryption was skipped but no peer id was passed",sf.ERR_INVALID_PEER);a="native",i=r}if(o=s,null!=t?.muxerFactory)c=t.muxerFactory;else if(this.muxers.size>0){const e=await this._multiplexOutbound({...l,...s},this.muxers);c=e.muxerFactory,o=e.stream}}catch(t){throw e.log.error("failed to upgrade outbound connection",t),await e.close(t),t}return await this.shouldBlockConnection(i,e,"denyOutboundUpgradedConnection"),e.log("successfully upgraded outbound connection"),this._createConnection({cryptoProtocol:a,direction:"outbound",maConn:e,upgradedConn:o,muxerFactory:c,remotePeer:i,transient:t?.transient})}_createConnection(e){const{cryptoProtocol:t,direction:n,maConn:r,upgradedConn:s,remotePeer:i,muxerFactory:o,transient:a}=e;let c,l,u;null!=o&&(c=o.createStreamMuxer({direction:n,onIncomingStream:e=>{null!=u&&Promise.resolve().then((async()=>{const t=this.components.registrar.getProtocols(),{stream:n,protocol:r}=await jf(e,t,{log:e.log,yieldBytes:!1});if(null==u)return;u.log("incoming stream opened on %s",r);const s=function(e,t){try{const{options:n}=t.getHandler(e);return n.maxInboundStreams}catch(e){if(e.code!==sf.ERR_NO_HANDLER_FOR_PROTOCOL)throw e}return 32}(r,this.components.registrar);if(Yf(r,"inbound",u)===s){const t=new fn(`Too many inbound protocol streams for protocol "${r}" - limit ${s}`,sf.ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS);throw e.abort(t),t}e.source=n.source,e.sink=n.sink,e.protocol=r,null!=n.closeWrite&&(e.closeWrite=n.closeWrite),null!=n.closeRead&&(e.closeRead=n.closeRead),null!=n.close&&(e.close=n.close),await this.components.peerStore.merge(i,{protocols:[r]}),this.components.metrics?.trackProtocolStream(e,u),this._onStream({connection:u,stream:e,protocol:r})})).catch((async t=>{u.log.error("error handling incoming stream id %s",e.id,t.message,t.code,t.stack),null==e.timeline.close&&await e.close()}))}}),l=async(e,t={})=>{if(null==c)throw new fn("Stream is not multiplexed",sf.ERR_MUXER_UNAVAILABLE);u.log("starting new stream for protocols %s",e);const n=await c.newStream();u.log.trace("started new stream %s for protocols %s",n.id,e);try{if(null==t.signal){n.log("no abort signal was passed while trying to negotiate protocols %s falling back to default timeout",e);const r=AbortSignal.timeout(3e4);t={...t,signal:r}}n.log.trace("selecting protocol from protocols %s",e);const{stream:r,protocol:s}=await Wf(n,e,{...t,log:n.log,yieldBytes:!0});n.log("selected protocol %s",s);const o=function(e,t,n={}){try{const{options:n}=t.getHandler(e);if(null!=n.maxOutboundStreams)return n.maxOutboundStreams}catch(e){if(e.code!==sf.ERR_NO_HANDLER_FOR_PROTOCOL)throw e}return n.maxOutboundStreams??64}(s,this.components.registrar,t),a=Yf(s,"outbound",u);if(a>=o){const e=new fn(`Too many outbound protocol streams for protocol "${s}" - ${a}/${o}`,sf.ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS);throw n.abort(e),e}return await this.components.peerStore.merge(i,{protocols:[s]}),n.source=r.source,n.sink=r.sink,n.protocol=s,null!=r.closeWrite&&(n.closeWrite=r.closeWrite),null!=r.closeRead&&(n.closeRead=r.closeRead),null!=r.close&&(n.close=r.close),this.components.metrics?.trackProtocolStream(n,u),n}catch(t){if(u.log.error("could not create new stream for protocols %s",e,t),null==n.timeline.close&&n.abort(t),null!=t.code)throw t;throw new fn(String(t),sf.ERR_UNSUPPORTED_PROTOCOL)}},Promise.all([c.sink(s.source),s.sink(c.source)]).catch((e=>{u.log.error("error piping data through muxer",e)})));const h=r.timeline;r.timeline=new Proxy(h,{set:(...e)=>(null!=u&&"close"===e[1]&&null!=e[2]&&null==h.close&&(async()=>{try{"open"===u.status&&await u.close()}catch(e){u.log.error("error closing connection after timeline close",e)}finally{this.events.safeDispatchEvent("connection:close",{detail:u})}})().catch((e=>{u.log.error("error thrown while dispatching connection:close event",e)})),Reflect.set(...e))}),r.timeline.upgraded=Date.now();var d;return d={remoteAddr:r.remoteAddr,remotePeer:i,status:"open",direction:n,timeline:r.timeline,multiplexer:c?.protocol,encryption:t,transient:a,logger:this.components.logger,newStream:l??(()=>{throw new fn("connection is not multiplexed",sf.ERR_CONNECTION_NOT_MULTIPLEXED)}),getStreams:()=>null!=c?c.streams:[],close:async e=>{null!=c&&(u.log.trace("close muxer"),await c.close(e)),u.log.trace("close maconn"),await r.close(e),u.log.trace("closed maconn")},abort:e=>{r.abort(e),null!=c&&c.abort(e)}},u=new Gf(d),this.events.safeDispatchEvent("connection:open",{detail:u}),u}_onStream(e){const{connection:t,stream:n,protocol:r}=e,{handler:s,options:i}=this.components.registrar.getHandler(r);if(t.transient&&!0!==i.runOnTransientConnection)throw new fn("Cannot open protocol stream on transient connection","ERR_TRANSIENT_CONNECTION");s({connection:t,stream:n})}async _encryptInbound(e){const t=Array.from(this.connectionEncryption.keys());e.log("handling inbound crypto protocol selection",t);try{const{stream:n,protocol:r}=await jf(e,t,{log:e.log}),s=this.connectionEncryption.get(r);if(null==s)throw new Error(`no crypto module found for ${r}`);return e.log("encrypting inbound connection using",r),{...await s.secureInbound(this.components.peerId,n),protocol:r}}catch(t){throw e.log.error("encrypting inbound connection failed",t),new fn(t.message,sf.ERR_ENCRYPTION_FAILED)}}async _encryptOutbound(e,t){const n=Array.from(this.connectionEncryption.keys());e.log("selecting outbound crypto protocol",n);try{e.log.trace("selecting encrypter from %s",n);const{stream:r,protocol:s}=await Wf(e,n,{log:e.log,yieldBytes:!0}),i=this.connectionEncryption.get(s);if(null==i)throw new Error(`no crypto module found for ${s}`);return e.log("encrypting outbound connection to %p using %s",t,i),{...await i.secureOutbound(this.components.peerId,r,t),protocol:s}}catch(n){throw e.log.error("encrypting outbound connection to %p failed",t,n),new fn(n.message,sf.ERR_ENCRYPTION_FAILED)}}async _multiplexOutbound(e,t){const n=Array.from(t.keys());e.log("outbound selecting muxer %s",n);try{e.log.trace("selecting stream muxer from %s",n);const{stream:r,protocol:s}=await Wf(e,n,{log:e.log,yieldBytes:!0});e.log("selected %s as muxer protocol",s);return{stream:r,muxerFactory:t.get(s)}}catch(t){throw e.log.error("error multiplexing outbound connection",t),new fn(String(t),sf.ERR_MUXER_UNAVAILABLE)}}async _multiplexInbound(e,t){const n=Array.from(t.keys());e.log("inbound handling muxers %s",n);try{const{stream:r,protocol:s}=await jf(e,n,{log:e.log});return{stream:r,muxerFactory:t.get(s)}}catch(t){throw e.log.error("error multiplexing inbound connection",t),new fn(String(t),sf.ERR_MUXER_UNAVAILABLE)}}}class Zf extends wn{peerId;peerStore;contentRouting;peerRouting;metrics;services;logger;status;components;log;constructor(e){super(),this.status="stopped";const t=new wn,n=t.dispatchEvent.bind(t);t.dispatchEvent=e=>{const t=n(e),r=this.dispatchEvent(new vn(e.type,{detail:e.detail}));return t||r},this.peerId=e.peerId,this.logger=e.logger??hs(),this.log=this.logger.forComponent("libp2p"),this.services={};const r=this.components=function(e={}){const t=new Hd(e);return new Proxy(t,{get(e,n,r){if("string"==typeof n&&!Wd.includes(n)){const e=t.components[n];if(null==e&&!zd.includes(n))throw new fn(`${n} not set`,"ERR_SERVICE_MISSING");return e}return Reflect.get(e,n,r)},set:(e,n,r)=>("string"==typeof n?t.components[n]=r:Reflect.set(e,n,r),!0)})}({peerId:e.peerId,privateKey:e.privateKey,nodeInfo:e.nodeInfo??{name:"libp2p",version:"1.6.0"},logger:this.logger,events:t,datastore:e.datastore??new Vd,connectionGater:Qd(e.connectionGater),dns:e.dns});this.peerStore=this.configureComponent("peerStore",new xd(r,{addressFilter:this.components.connectionGater.filterMultiaddrForPeer,...e.peerStore})),null!=e.metrics&&(this.metrics=this.configureComponent("metrics",e.metrics(this.components))),r.events.addEventListener("peer:update",(e=>{if(null==e.detail.previous){const t={id:e.detail.peer.id,multiaddrs:e.detail.peer.addresses.map((e=>e.multiaddr))};r.events.safeDispatchEvent("peer:discovery",{detail:t})}})),null!=e.connectionProtector&&this.configureComponent("connectionProtector",e.connectionProtector(r)),this.components.upgrader=new Qf(this.components,{connectionEncryption:(e.connectionEncryption??[]).map(((e,t)=>this.configureComponent(`connection-encryption-${t}`,e(this.components)))),muxers:(e.streamMuxers??[]).map(((e,t)=>this.configureComponent(`stream-muxers-${t}`,e(this.components)))),inboundUpgradeTimeout:e.connectionManager.inboundUpgradeTimeout}),this.configureComponent("transportManager",new Vf(this.components,e.transportManager)),this.configureComponent("connectionManager",new xf(this.components,e.connectionManager)),this.configureComponent("registrar",new Uf(this.components)),this.configureComponent("addressManager",new qd(this.components,e.addresses));const s=(e.peerRouters??[]).map(((e,t)=>this.configureComponent(`peer-router-${t}`,e(this.components))));this.peerRouting=this.components.peerRouting=this.configureComponent("peerRouting",new Lf(this.components,{routers:s}));const i=(e.contentRouters??[]).map(((e,t)=>this.configureComponent(`content-router-${t}`,e(this.components))));if(this.contentRouting=this.components.contentRouting=this.configureComponent("contentRouting",new Nf(this.components,{routers:i})),this.configureComponent("randomWalk",new Bf(this.components)),(e.peerDiscovery??[]).forEach(((e,t)=>{this.configureComponent(`peer-discovery-${t}`,e(this.components)).addEventListener("peer",(e=>{this.#M(e)}))})),e.transports?.forEach(((e,t)=>{this.components.transportManager.add(this.configureComponent(`transport-${t}`,e(this.components)))})),null!=e.services)for(const t of Object.keys(e.services)){const n=(0,e.services[t])(this.components);null!=n?(this.services[t]=n,this.configureComponent(t,n),null!=n[nn]&&(this.log("registering service %s for content routing",t),i.push(n[nn])),null!=n[an]&&(this.log("registering service %s for peer routing",t),s.push(n[an])),null!=n[rn]&&(this.log("registering service %s for peer discovery",t),n[rn].addEventListener?.("peer",(e=>{this.#M(e)})))):this.log.error("service factory %s returned null or undefined instance",t)}}configureComponent(e,t){return null==t&&this.log.error("component %s was null or undefined",e),this.components[e]=t,t}async start(){if("stopped"===this.status){this.status="starting",this.log("libp2p is starting");try{await(this.components.beforeStart?.()),await this.components.start(),await(this.components.afterStart?.()),this.status="started",this.safeDispatchEvent("start",{detail:this}),this.log("libp2p has started")}catch(e){throw this.log.error("An error occurred starting libp2p",e),this.status="started",await this.stop(),e}}}async stop(){"started"===this.status&&(this.log("libp2p is stopping"),this.status="stopping",await(this.components.beforeStop?.()),await this.components.stop(),await(this.components.afterStop?.()),this.status="stopped",this.safeDispatchEvent("stop",{detail:this}),this.log("libp2p has stopped"))}getConnections(e){return this.components.connectionManager.getConnections(e)}getDialQueue(){return this.components.connectionManager.getDialQueue()}getPeers(){const e=new zh;for(const t of this.components.connectionManager.getConnections())e.add(t.remotePeer);return Array.from(e)}async dial(e,t={}){return this.components.connectionManager.openConnection(e,{priority:75,...t})}async dialProtocol(e,t,n={}){if(null==t)throw new fn("no protocols were provided to open a stream",sf.ERR_INVALID_PROTOCOLS_FOR_STREAM);if(0===(t=Array.isArray(t)?t:[t]).length)throw new fn("no protocols were provided to open a stream",sf.ERR_INVALID_PROTOCOLS_FOR_STREAM);return(await this.dial(e,n)).newStream(t,n)}getMultiaddrs(){return this.components.addressManager.getAddresses()}getProtocols(){return this.components.registrar.getProtocols()}async hangUp(e,t={}){ar(e)&&(e=Ss(e.getPeerId()??"")),await this.components.connectionManager.closeConnections(e,t)}async getPublicKey(e,t={}){if(this.log("getPublicKey %p",e),null!=e.publicKey)return e.publicKey;try{const t=await this.peerStore.get(e);if(null!=t.id.publicKey)return t.id.publicKey}catch(e){if(e.code!==sf.ERR_NOT_FOUND)throw e}const n=Rn([kt("/pk/"),e.multihash.digest]),r=await this.contentRouting.get(n,t);return Fl(r),await this.peerStore.patch(e,{publicKey:r}),r}async handle(e,t,n){Array.isArray(e)||(e=[e]),await Promise.all(e.map((async e=>{await this.components.registrar.handle(e,t,n)})))}async unhandle(e){Array.isArray(e)||(e=[e]),await Promise.all(e.map((async e=>{await this.components.registrar.unhandle(e)})))}async register(e,t){return this.components.registrar.register(e,t)}unregister(e){this.components.registrar.unregister(e)}async isDialable(e,t={}){return this.components.connectionManager.isDialable(e,t)}#M(e){const{detail:t}=e;t.id.toString()!==this.peerId.toString()?this.components.peerStore.merge(t.id,{multiaddrs:t.multiaddrs}).catch((e=>{this.log.error(e)})):this.log.error(new Error(sf.ERR_DISCOVERED_SELF))}}async function Jf(e={}){const t=e.peerId??=await Wh();if(null==t.privateKey)throw new fn("peer id was missing private key","ERR_MISSING_PRIVATE_KEY");return e.privateKey??=await Kl(t.privateKey),new Zf(await async function(e){const t=of(af,e);if(null===t.connectionProtector&&null!=globalThis.process?.env?.LIBP2P_FORCE_PNET)throw new fn(rf.ERR_PROTECTOR_REQUIRED,sf.ERR_PROTECTOR_REQUIRED);if(!(await Is(t.privateKey.public.bytes,t.privateKey.bytes)).equals(t.peerId))throw new fn("Private key doesn't match peer id",sf.ERR_INVALID_KEY);return t}(e))}new en("SHARDING"),ds("datastore:core:tiered");const Xf=(e,t)=>t.some((t=>e instanceof t));let eg,tg;const ng=new WeakMap,rg=new WeakMap,sg=new WeakMap;let ig={get(e,t,n){if(e instanceof IDBTransaction){if("done"===t)return ng.get(e);if("store"===t)return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return lg(e[t])},set:(e,t,n)=>(e[t]=n,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function og(e){ig=e(ig)}function ag(e){return(tg||(tg=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(e)?function(...t){return e.apply(ug(this),t),lg(this.request)}:function(...t){return lg(e.apply(ug(this),t))}}function cg(e){return"function"==typeof e?ag(e):(e instanceof IDBTransaction&&function(e){if(ng.has(e))return;const t=new Promise(((t,n)=>{const r=()=>{e.removeEventListener("complete",s),e.removeEventListener("error",i),e.removeEventListener("abort",i)},s=()=>{t(),r()},i=()=>{n(e.error||new DOMException("AbortError","AbortError")),r()};e.addEventListener("complete",s),e.addEventListener("error",i),e.addEventListener("abort",i)}));ng.set(e,t)}(e),Xf(e,eg||(eg=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction]))?new Proxy(e,ig):e)}function lg(e){if(e instanceof IDBRequest)return function(e){const t=new Promise(((t,n)=>{const r=()=>{e.removeEventListener("success",s),e.removeEventListener("error",i)},s=()=>{t(lg(e.result)),r()},i=()=>{n(e.error),r()};e.addEventListener("success",s),e.addEventListener("error",i)}));return sg.set(t,e),t}(e);if(rg.has(e))return rg.get(e);const t=cg(e);return t!==e&&(rg.set(e,t),sg.set(t,e)),t}const ug=e=>sg.get(e);const hg=["get","getKey","getAll","getAllKeys","count"],dg=["put","add","delete","clear"],pg=new Map;function fg(e,t){if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(pg.get(t))return pg.get(t);const n=t.replace(/FromIndex$/,""),r=t!==n,s=dg.includes(n);if(!(n in(r?IDBIndex:IDBObjectStore).prototype)||!s&&!hg.includes(n))return;const i=async function(e,...t){const i=this.transaction(e,s?"readwrite":"readonly");let o=i.store;return r&&(o=o.index(t.shift())),(await Promise.all([o[n](...t),s&&i.done]))[0]};return pg.set(t,i),i}og((e=>({...e,get:(t,n,r)=>fg(t,n)||e.get(t,n,r),has:(t,n)=>!!fg(t,n)||e.has(t,n)})));const gg=["continue","continuePrimaryKey","advance"],mg={},yg=new WeakMap,wg=new WeakMap,bg={get(e,t){if(!gg.includes(t))return e[t];let n=mg[t];return n||(n=mg[t]=function(...e){yg.set(this,wg.get(this)[t](...e))}),n}};async function*vg(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;const n=new Proxy(t,bg);for(wg.set(n,t),sg.set(n,ug(t));t;)yield n,t=await(yg.get(n)||t.continue()),yg.delete(n)}function Eg(e,t){return t===Symbol.asyncIterator&&Xf(e,[IDBIndex,IDBObjectStore,IDBCursor])||"iterate"===t&&Xf(e,[IDBIndex,IDBObjectStore])}og((e=>({...e,get:(t,n,r)=>Eg(t,n)?vg:e.get(t,n,r),has:(t,n)=>Eg(t,n)||e.has(t,n)})));class Sg extends Bd{location;version;db;constructor(e,t={}){super(),this.location=`${t.prefix??""}${e}`,this.version=t.version??1}async open(){try{const e=this.location;this.db=await function(e,t,{blocked:n,upgrade:r,blocking:s,terminated:i}={}){const o=indexedDB.open(e,t),a=lg(o);return r&&o.addEventListener("upgradeneeded",(e=>{r(lg(o.result),e.oldVersion,e.newVersion,lg(o.transaction),e)})),n&&o.addEventListener("blocked",(e=>n(e.oldVersion,e.newVersion,e))),a.then((e=>{i&&e.addEventListener("close",(()=>i())),s&&e.addEventListener("versionchange",(e=>s(e.oldVersion,e.newVersion,e)))})).catch((()=>{})),a}(e,this.version,{upgrade(t){t.createObjectStore(e)}})}catch(e){throw function(e){return e=e??new Error("Cannot open database"),Vr(e,"ERR_DB_OPEN_FAILED")}(e)}}async close(){this.db?.close()}async put(e,t){if(null==this.db)throw new Error("Datastore needs to be opened.");try{return await this.db.put(this.location,t,e.toString()),e}catch(e){throw function(e){return e=e??new Error("Write failed"),Vr(e,"ERR_DB_WRITE_FAILED")}(e)}}async get(e){if(null==this.db)throw new Error("Datastore needs to be opened.");let t;try{t=await this.db.get(this.location,e.toString())}catch(e){throw Ud(e)}if(void 0===t)throw Fd();return t}async has(e){if(null==this.db)throw new Error("Datastore needs to be opened.");try{return Boolean(await this.db.getKey(this.location,e.toString()))}catch(e){throw Ud(e)}}async delete(e){if(null==this.db)throw new Error("Datastore needs to be opened.");try{await this.db.delete(this.location,e.toString())}catch(e){throw function(e){return e=e??new Error("Delete failed"),Vr(e,"ERR_DB_DELETE_FAILED")}(e)}}batch(){const e=[],t=[];return{put(t,n){e.push({key:t,value:n})},delete(e){t.push(e)},commit:async()=>{if(null==this.db)throw new Error("Datastore needs to be opened.");const n=this.db.transaction(this.location,"readwrite");try{const r=e.filter((({key:e})=>null==t.find((t=>t.toString()===e.toString())))).map((e=>async()=>{await n.store.put(e.value,e.key.toString())})).concat(t.map((e=>async()=>{await n.store.delete(e.toString())}))).concat((async()=>{await n.done}));await Promise.all(r.map((async e=>{await e()})))}catch{n.abort()}}}}async*query(e){let t=this.#O(e,((e,t)=>({key:e,value:t})));Array.isArray(e.filters)&&(t=e.filters.reduce(((e,t)=>Md(e,t)),t)),Array.isArray(e.orders)&&(t=e.orders.reduce(((e,t)=>Od(e,t)),t)),yield*t}async*queryKeys(e){let t=this.#O(e,(e=>e));Array.isArray(e.filters)&&(t=e.filters.reduce(((e,t)=>Md(e,t)),t)),Array.isArray(e.orders)&&(t=e.orders.reduce(((e,t)=>Od(e,t)),t)),yield*t}async*#O(e,t){if(null==this.db)throw new Error("Datastore needs to be opened.");let n=0,r=-1;for(const s of await this.db.getAllKeys(this.location)){if(null!=e.prefix&&!s.toString().startsWith(e.prefix))continue;if(null!=e.limit&&n===e.limit)return;if(r++,null!=e.offset&&r<e.offset)continue;const i=new en(s.toString());let o;try{o=await this.get(i)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e;continue}null!=o&&(yield t(i,o),n++)}}async destroy(){await function(e,{blocked:t}={}){const n=indexedDB.deleteDatabase(e);return t&&n.addEventListener("blocked",(e=>t(e.oldVersion,e))),lg(n).then((()=>{}))}(this.location)}}function _g(){const e=lr();let t=!1;return{sink:async n=>{if(t)throw new Error("already piped");t=!0,e.resolve(n)},source:async function*(){const t=await e.promise;yield*t}()}}const Ig=65535,Rg=Boolean(globalThis.process?.env?.DUMP_SESSION_KEYS),Ag=e=>new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4));function Tg(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name}if(!(68===new Uint8Array(new Uint32Array([287454020]).buffer)[0]))throw new Error("Non little-endian hardware is not supported");function Dg(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function kg(e){if("string"==typeof e)e=Dg(e);else{if(!Tg(e))throw new Error("expected Uint8Array, got "+typeof e);e=e.slice()}return e}const Pg=e=>"[object Object]"===Object.prototype.toString.call(e)&&e.constructor===Object;function Cg(e,t){if(!Tg(e))throw new Error("Uint8Array expected");if("number"==typeof t&&e.length!==t)throw new Error(`Uint8Array length ${t} expected`)}const xg=(e,t)=>(Object.assign(t,e),t);function Ng(e,t,n,r){if("function"==typeof e.setBigUint64)return e.setBigUint64(t,n,r);const s=BigInt(32),i=BigInt(4294967295),o=Number(n>>s&i),a=Number(n&i);e.setUint32(t+4,o,r),e.setUint32(t+0,a,r)}function Mg(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`wrong positive integer: ${e}`)}function Og(e){if("boolean"!=typeof e)throw new Error(`boolean expected, not ${e}`)}function Lg(e,...t){if(null==(n=e)||"object"!=typeof n||!(n instanceof Uint8Array||"Uint8Array"===n.constructor.name))throw new Error("Uint8Array expected");var n;if(t.length>0&&!t.includes(e.length))throw new Error(`Uint8Array expected of length ${t}, not of length=${e.length}`)}function Bg(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")}const Ug=(e,t)=>255&e[t++]|(255&e[t++])<<8;class Fg{constructor(e){this.blockLen=16,this.outputLen=16,this.buffer=new Uint8Array(16),this.r=new Uint16Array(10),this.h=new Uint16Array(10),this.pad=new Uint16Array(8),this.pos=0,this.finished=!1,Cg(e=kg(e),32);const t=Ug(e,0),n=Ug(e,2),r=Ug(e,4),s=Ug(e,6),i=Ug(e,8),o=Ug(e,10),a=Ug(e,12),c=Ug(e,14);this.r[0]=8191&t,this.r[1]=8191&(t>>>13|n<<3),this.r[2]=7939&(n>>>10|r<<6),this.r[3]=8191&(r>>>7|s<<9),this.r[4]=255&(s>>>4|i<<12),this.r[5]=i>>>1&8190,this.r[6]=8191&(i>>>14|o<<2),this.r[7]=8065&(o>>>11|a<<5),this.r[8]=8191&(a>>>8|c<<8),this.r[9]=c>>>5&127;for(let t=0;t<8;t++)this.pad[t]=Ug(e,16+2*t)}process(e,t,n=!1){const r=n?0:2048,{h:s,r:i}=this,o=i[0],a=i[1],c=i[2],l=i[3],u=i[4],h=i[5],d=i[6],p=i[7],f=i[8],g=i[9],m=Ug(e,t+0),y=Ug(e,t+2),w=Ug(e,t+4),b=Ug(e,t+6),v=Ug(e,t+8),E=Ug(e,t+10),S=Ug(e,t+12),_=Ug(e,t+14);let I=s[0]+(8191&m),R=s[1]+(8191&(m>>>13|y<<3)),A=s[2]+(8191&(y>>>10|w<<6)),T=s[3]+(8191&(w>>>7|b<<9)),D=s[4]+(8191&(b>>>4|v<<12)),k=s[5]+(v>>>1&8191),P=s[6]+(8191&(v>>>14|E<<2)),C=s[7]+(8191&(E>>>11|S<<5)),x=s[8]+(8191&(S>>>8|_<<8)),N=s[9]+(_>>>5|r),M=0,O=M+I*o+R*(5*g)+A*(5*f)+T*(5*p)+D*(5*d);M=O>>>13,O&=8191,O+=k*(5*h)+P*(5*u)+C*(5*l)+x*(5*c)+N*(5*a),M+=O>>>13,O&=8191;let L=M+I*a+R*o+A*(5*g)+T*(5*f)+D*(5*p);M=L>>>13,L&=8191,L+=k*(5*d)+P*(5*h)+C*(5*u)+x*(5*l)+N*(5*c),M+=L>>>13,L&=8191;let B=M+I*c+R*a+A*o+T*(5*g)+D*(5*f);M=B>>>13,B&=8191,B+=k*(5*p)+P*(5*d)+C*(5*h)+x*(5*u)+N*(5*l),M+=B>>>13,B&=8191;let U=M+I*l+R*c+A*a+T*o+D*(5*g);M=U>>>13,U&=8191,U+=k*(5*f)+P*(5*p)+C*(5*d)+x*(5*h)+N*(5*u),M+=U>>>13,U&=8191;let F=M+I*u+R*l+A*c+T*a+D*o;M=F>>>13,F&=8191,F+=k*(5*g)+P*(5*f)+C*(5*p)+x*(5*d)+N*(5*h),M+=F>>>13,F&=8191;let V=M+I*h+R*u+A*l+T*c+D*a;M=V>>>13,V&=8191,V+=k*o+P*(5*g)+C*(5*f)+x*(5*p)+N*(5*d),M+=V>>>13,V&=8191;let K=M+I*d+R*h+A*u+T*l+D*c;M=K>>>13,K&=8191,K+=k*a+P*o+C*(5*g)+x*(5*f)+N*(5*p),M+=K>>>13,K&=8191;let $=M+I*p+R*d+A*h+T*u+D*l;M=$>>>13,$&=8191,$+=k*c+P*a+C*o+x*(5*g)+N*(5*f),M+=$>>>13,$&=8191;let q=M+I*f+R*p+A*d+T*h+D*u;M=q>>>13,q&=8191,q+=k*l+P*c+C*a+x*o+N*(5*g),M+=q>>>13,q&=8191;let H=M+I*g+R*f+A*p+T*d+D*h;M=H>>>13,H&=8191,H+=k*u+P*l+C*c+x*a+N*o,M+=H>>>13,H&=8191,M=(M<<2)+M|0,M=M+O|0,O=8191&M,M>>>=13,L+=M,s[0]=O,s[1]=L,s[2]=B,s[3]=U,s[4]=F,s[5]=V,s[6]=K,s[7]=$,s[8]=q,s[9]=H}finalize(){const{h:e,pad:t}=this,n=new Uint16Array(10);let r=e[1]>>>13;e[1]&=8191;for(let t=2;t<10;t++)e[t]+=r,r=e[t]>>>13,e[t]&=8191;e[0]+=5*r,r=e[0]>>>13,e[0]&=8191,e[1]+=r,r=e[1]>>>13,e[1]&=8191,e[2]+=r,n[0]=e[0]+5,r=n[0]>>>13,n[0]&=8191;for(let t=1;t<10;t++)n[t]=e[t]+r,r=n[t]>>>13,n[t]&=8191;n[9]-=8192;let s=(1^r)-1;for(let e=0;e<10;e++)n[e]&=s;s=~s;for(let t=0;t<10;t++)e[t]=e[t]&s|n[t];e[0]=65535&(e[0]|e[1]<<13),e[1]=65535&(e[1]>>>3|e[2]<<10),e[2]=65535&(e[2]>>>6|e[3]<<7),e[3]=65535&(e[3]>>>9|e[4]<<4),e[4]=65535&(e[4]>>>12|e[5]<<1|e[6]<<14),e[5]=65535&(e[6]>>>2|e[7]<<11),e[6]=65535&(e[7]>>>5|e[8]<<8),e[7]=65535&(e[8]>>>8|e[9]<<5);let i=e[0]+t[0];e[0]=65535&i;for(let n=1;n<8;n++)i=(e[n]+t[n]|0)+(i>>>16)|0,e[n]=65535&i}update(e){Bg(this);const{buffer:t,blockLen:n}=this,r=(e=kg(e)).length;for(let s=0;s<r;){const i=Math.min(n-this.pos,r-s);if(i!==n)t.set(e.subarray(s,s+i),this.pos),this.pos+=i,s+=i,this.pos===n&&(this.process(t,0,!1),this.pos=0);else for(;n<=r-s;s+=n)this.process(e,s)}return this}destroy(){this.h.fill(0),this.r.fill(0),this.buffer.fill(0),this.pad.fill(0)}digestInto(e){Bg(this),function(e,t){Lg(e);const n=t.outputLen;if(e.length<n)throw new Error(`digestInto() expects output buffer of length at least ${n}`)}(e,this),this.finished=!0;const{buffer:t,h:n}=this;let{pos:r}=this;if(r){for(t[r++]=1;r<16;r++)t[r]=0;this.process(t,0,!0)}this.finalize();let s=0;for(let t=0;t<8;t++)e[s++]=n[t]>>>0,e[s++]=n[t]>>>8;return e}digest(){const{buffer:e,outputLen:t}=this;this.digestInto(e);const n=e.slice(0,t);return this.destroy(),n}}const Vg=function(e){const t=(t,n)=>e(n).update(kg(t)).digest(),n=e(new Uint8Array(32));return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=t=>e(t),t}((e=>new Fg(e))),Kg=Dg("expand 16-byte k"),$g=Dg("expand 32-byte k"),qg=Ag(Kg),Hg=Ag($g);function zg(e,t){return e<<t|e>>>32-t}function Wg(e){return e.byteOffset%4==0}const jg=64,Gg=16,Yg=2**32-1,Qg=new Uint32Array;function Zg(e,t){const{allowShortKeys:n,extendNonceFn:r,counterLength:s,counterRight:i,rounds:o}=function(e,t){if(void 0!==t&&("object"!=typeof t||!Pg(t)))throw new Error("options must be object or undefined");return Object.assign(e,t)}({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},t);if("function"!=typeof e)throw new Error("core must be a function");return Mg(s),Mg(o),Og(i),Og(n),(t,a,c,l,u=0)=>{Lg(t),Lg(a),Lg(c);const h=c.length;if(l||(l=new Uint8Array(h)),Lg(l),Mg(u),u<0||u>=Yg)throw new Error("arx: counter overflow");if(l.length<h)throw new Error(`arx: output (${l.length}) is shorter than data (${h})`);const d=[];let p,f,g=t.length;if(32===g)p=t.slice(),d.push(p),f=Hg;else{if(16!==g||!n)throw new Error(`arx: invalid 32-byte key, got length=${g}`);p=new Uint8Array(32),p.set(t),p.set(t,16),f=qg,d.push(p)}Wg(a)||(a=a.slice(),d.push(a));const m=Ag(p);if(r){if(24!==a.length)throw new Error("arx: extended nonce must be 24 bytes");r(f,m,Ag(a.subarray(0,16)),m),a=a.subarray(16)}const y=16-s;if(y!==a.length)throw new Error(`arx: nonce must be ${y} or 16 bytes`);if(12!==y){const e=new Uint8Array(12);e.set(a,i?0:12-a.length),a=e,d.push(a)}const w=Ag(a);for(!function(e,t,n,r,s,i,o,a){const c=s.length,l=new Uint8Array(jg),u=Ag(l),h=Wg(s)&&Wg(i),d=h?Ag(s):Qg,p=h?Ag(i):Qg;for(let f=0;f<c;o++){if(e(t,n,r,u,o,a),o>=Yg)throw new Error("arx: counter overflow");const g=Math.min(jg,c-f);if(h&&g===jg){const e=f/4;if(f%4!=0)throw new Error("arx: invalid block position");for(let t,n=0;n<Gg;n++)t=e+n,p[t]=d[t]^u[n];f+=jg}else{for(let e,t=0;t<g;t++)e=f+t,i[e]=s[e]^l[t];f+=g}}}(e,f,m,w,c,l,u,o);d.length>0;)d.pop().fill(0);return l}}function Jg(e,t,n,r,s,i=20){let o=e[0],a=e[1],c=e[2],l=e[3],u=t[0],h=t[1],d=t[2],p=t[3],f=t[4],g=t[5],m=t[6],y=t[7],w=s,b=n[0],v=n[1],E=n[2],S=o,_=a,I=c,R=l,A=u,T=h,D=d,k=p,P=f,C=g,x=m,N=y,M=w,O=b,L=v,B=E;for(let e=0;e<i;e+=2)S=S+A|0,M=zg(M^S,16),P=P+M|0,A=zg(A^P,12),S=S+A|0,M=zg(M^S,8),P=P+M|0,A=zg(A^P,7),_=_+T|0,O=zg(O^_,16),C=C+O|0,T=zg(T^C,12),_=_+T|0,O=zg(O^_,8),C=C+O|0,T=zg(T^C,7),I=I+D|0,L=zg(L^I,16),x=x+L|0,D=zg(D^x,12),I=I+D|0,L=zg(L^I,8),x=x+L|0,D=zg(D^x,7),R=R+k|0,B=zg(B^R,16),N=N+B|0,k=zg(k^N,12),R=R+k|0,B=zg(B^R,8),N=N+B|0,k=zg(k^N,7),S=S+T|0,B=zg(B^S,16),x=x+B|0,T=zg(T^x,12),S=S+T|0,B=zg(B^S,8),x=x+B|0,T=zg(T^x,7),_=_+D|0,M=zg(M^_,16),N=N+M|0,D=zg(D^N,12),_=_+D|0,M=zg(M^_,8),N=N+M|0,D=zg(D^N,7),I=I+k|0,O=zg(O^I,16),P=P+O|0,k=zg(k^P,12),I=I+k|0,O=zg(O^I,8),P=P+O|0,k=zg(k^P,7),R=R+A|0,L=zg(L^R,16),C=C+L|0,A=zg(A^C,12),R=R+A|0,L=zg(L^R,8),C=C+L|0,A=zg(A^C,7);let U=0;r[U++]=o+S|0,r[U++]=a+_|0,r[U++]=c+I|0,r[U++]=l+R|0,r[U++]=u+A|0,r[U++]=h+T|0,r[U++]=d+D|0,r[U++]=p+k|0,r[U++]=f+P|0,r[U++]=g+C|0,r[U++]=m+x|0,r[U++]=y+N|0,r[U++]=w+M|0,r[U++]=b+O|0,r[U++]=v+L|0,r[U++]=E+B|0}const Xg=Zg(Jg,{counterRight:!1,counterLength:4,allowShortKeys:!1}),em=new Uint8Array(16),tm=(e,t)=>{e.update(t);const n=t.length%16;n&&e.update(em.subarray(n))},nm=new Uint8Array(32);function rm(e,t,n,r,s){const i=e(t,n,nm),o=Vg.create(i);s&&tm(o,s),tm(o,r);const a=new Uint8Array(16),c=(l=a,new DataView(l.buffer,l.byteOffset,l.byteLength));var l;Ng(c,0,BigInt(s?s.length:0),!0),Ng(c,8,BigInt(r.length),!0),o.update(a);const u=o.digest();return i.fill(0),u}const sm=xg({blockSize:64,nonceLength:12,tagLength:16},(im=Xg,(e,t,n)=>{const r=16;return Cg(e,32),Cg(t),{encrypt:(s,i)=>{const o=s.length,a=o+r;i?Cg(i,a):i=new Uint8Array(a),im(e,t,s,i,1);const c=rm(im,e,t,i.subarray(0,-16),n);return i.set(c,o),i},decrypt:(s,i)=>{const o=s.length,a=o-r;if(o<r)throw new Error("encrypted data must be at least 16 bytes");i?Cg(i,a):i=new Uint8Array(a);const c=s.subarray(0,-16);if(!function(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return 0===n}(s.subarray(-16),rm(im,e,t,c,n)))throw new Error("invalid tag");return im(e,t,c,i,1),i}}}));var im;const om=new Uint8Array([0]),am=new Uint8Array;const cm={hashSHA256:e=>gl(e.subarray()),getHKDF(e,t){const n=function(e,t,n){return Ps(e),void 0===n&&(n=new Uint8Array(e.outputLen)),Lo(e,Us(n),Us(t))}(gl,t,e),r=function(e,t,n,r=32){if(Ps(e),Ds(r),r>255*e.outputLen)throw new Error("Length should be <= 255*HashLen");const s=Math.ceil(r/e.outputLen);void 0===n&&(n=am);const i=new Uint8Array(s*e.outputLen),o=Lo.create(e,t),a=o._cloneInto(),c=new Uint8Array(o.outputLen);for(let t=0;t<s;t++)om[0]=t+1,a.update(0===t?am:c).update(n).update(om).digestInto(c),i.set(c,e.outputLen*t),o._cloneInto(a);return o.destroy(),a.destroy(),c.fill(0),om.fill(0),i.slice(0,r)}(gl,n,void 0,96),s=r;return[s.subarray(0,32),s.subarray(32,64),s.subarray(64,96)]},generateX25519KeyPair(){const e=wo.utils.randomPrivateKey();return{publicKey:wo.getPublicKey(e),privateKey:e}},generateX25519KeyPairFromSeed:e=>({publicKey:wo.getPublicKey(e),privateKey:e}),generateX25519SharedKey:(e,t)=>wo.getSharedSecret(e.subarray(),t.subarray()),chaCha20Poly1305Encrypt:(e,t,n,r)=>sm(r,t,n).encrypt(e.subarray()),chaCha20Poly1305Decrypt:(e,t,n,r,s)=>sm(r,t,n).decrypt(e.subarray(),s)},lm=cm;const um=e=>{const t=w(2);return t[0]=e>>8,t[1]=e,t};um.bytes=2;const hm=e=>{if(e.length<2)throw RangeError("Could not decode int16BE");if(e instanceof Uint8Array){let t=0;return t+=e[0]<<8,t+=e[1],t}return e.getUint16(0)};function dm(e,t){t.enabled&&Rg&&(e?(t(`LOCAL_STATIC_PUBLIC_KEY ${Qt(e.publicKey,"hex")}`),t(`LOCAL_STATIC_PRIVATE_KEY ${Qt(e.privateKey,"hex")}`)):t("Missing local static keys."))}function pm(e,t){t.enabled&&Rg&&(e?(t(`LOCAL_PUBLIC_EPHEMERAL_KEY ${Qt(e.publicKey,"hex")}`),t(`LOCAL_PRIVATE_EPHEMERAL_KEY ${Qt(e.privateKey,"hex")}`)):t("Missing local ephemeral keys."))}function fm(e,t){t.enabled&&Rg&&t(e?`REMOTE_EPHEMERAL_PUBLIC_KEY ${Qt(e.subarray(),"hex")}`:"Missing remote ephemeral keys.")}function gm(e,t,n){n.enabled&&Rg&&(n(`CIPHER_STATE_1 ${e.n.getUint64()} ${e.k&&Qt(e.k,"hex")}`),n(`CIPHER_STATE_2 ${t.n.getUint64()} ${t.k&&Qt(t.k,"hex")}`))}function mm(e,t){if(e.length!==t.length)throw new Error("Inputs should have the same length");const n=w(e.length);for(let r=0;r<e.length;r++)n[r]=e[r]^t[r];return n}hm.bytes=2;class ym extends Error{code;constructor(e="Unexpected Peer"){super(e),this.code=ym.code}static code="ERR_UNEXPECTED_PEER"}class wm extends Error{code;constructor(e="Invalid crypto exchange"){super(e),this.code=wm.code}static code="ERR_INVALID_CRYPTO_EXCHANGE"}class bm{n;bytes;view;constructor(e=0){this.n=e,this.bytes=y(12),this.view=new DataView(this.bytes.buffer,this.bytes.byteOffset,this.bytes.byteLength),this.view.setUint32(4,e,!0)}increment(){this.n++,this.view.setUint32(4,this.n,!0)}getBytes(){return this.bytes}getUint64(){return this.n}assertValue(){if(this.n>4294967295)throw new Error("Cipherstate has reached maximum n, a new handshake must be performed")}}const vm=y(0);class Em{k;n;crypto;constructor(e,t=void 0,n=0){this.crypto=e,this.k=t,this.n=new bm(n)}hasKey(){return Boolean(this.k)}encryptWithAd(e,t){if(!this.hasKey())return t;this.n.assertValue();const n=this.crypto.encrypt(t,this.n.getBytes(),e,this.k);return this.n.increment(),n}decryptWithAd(e,t,n){if(!this.hasKey())return t;this.n.assertValue();const r=this.crypto.decrypt(t,this.n.getBytes(),e,this.k,n);return this.n.increment(),r}}class Sm{cs;ck;h;crypto;constructor(e,t){this.crypto=e;const n=kt(t,"utf-8");this.h=function(e,t){if(t.length<=32){const e=y(32);return e.set(t),e}return e.hash(t)}(e,n),this.ck=this.h,this.cs=new Em(e)}mixKey(e){const[t,n]=this.crypto.hkdf(this.ck,e);this.ck=t,this.cs=new Em(this.crypto,n)}mixHash(e){this.h=this.crypto.hash(new Ir(this.h,e))}encryptAndHash(e){const t=this.cs.encryptWithAd(this.h,e);return this.mixHash(t),t}decryptAndHash(e){const t=this.cs.decryptWithAd(this.h,e);return this.mixHash(e),t}split(){const[e,t]=this.crypto.hkdf(this.ck,vm);return[new Em(this.crypto,e),new Em(this.crypto,t)]}}class _m{ss;s;e;rs;re;initiator;crypto;constructor(e){const{crypto:t,protocolName:n,prologue:r,initiator:s,s:i,e:o,rs:a,re:c}=e;this.crypto=t,this.ss=new Sm(t,n),this.ss.mixHash(r),this.initiator=s,this.s=i,this.e=o,this.rs=a,this.re=c}writeE(){if(this.e)throw new Error("ephemeral keypair is already set");const e=this.crypto.generateKeypair();return this.ss.mixHash(e.publicKey),this.e=e,e.publicKey}writeS(){if(!this.s)throw new Error("static keypair is not set");return this.ss.encryptAndHash(this.s.publicKey)}writeEE(){if(!this.e)throw new Error("ephemeral keypair is not set");if(!this.re)throw new Error("remote ephemeral public key is not set");this.ss.mixKey(this.crypto.dh(this.e,this.re))}writeES(){if(this.initiator){if(!this.e)throw new Error("ephemeral keypair is not set");if(!this.rs)throw new Error("remote static public key is not set");this.ss.mixKey(this.crypto.dh(this.e,this.rs))}else{if(!this.s)throw new Error("static keypair is not set");if(!this.re)throw new Error("remote ephemeral public key is not set");this.ss.mixKey(this.crypto.dh(this.s,this.re))}}writeSE(){if(this.initiator){if(!this.s)throw new Error("static keypair is not set");if(!this.re)throw new Error("remote ephemeral public key is not set");this.ss.mixKey(this.crypto.dh(this.s,this.re))}else{if(!this.e)throw new Error("ephemeral keypair is not set");if(!this.rs)throw new Error("remote static public key is not set");this.ss.mixKey(this.crypto.dh(this.e,this.rs))}}readE(e,t=0){if(this.re)throw new Error("remote ephemeral public key is already set");if(e.byteLength<t+32)throw new Error("message is not long enough");this.re=e.sublist(t,t+32),this.ss.mixHash(this.re)}readS(e,t=0){if(this.rs)throw new Error("remote static public key is already set");const n=32+(this.ss.cs.hasKey()?16:0);if(e.byteLength<t+n)throw new Error("message is not long enough");const r=e.sublist(t,t+n);return this.rs=this.ss.decryptAndHash(r),n}readEE(){this.writeEE()}readES(){this.writeES()}readSE(){this.writeSE()}}class Im extends _m{writeMessageA(e){return new Ir(this.writeE(),this.ss.encryptAndHash(e))}writeMessageB(e){const t=this.writeE();this.writeEE();const n=this.writeS();return this.writeES(),new Ir(t,n,this.ss.encryptAndHash(e))}writeMessageC(e){const t=this.writeS();return this.writeSE(),new Ir(t,this.ss.encryptAndHash(e))}readMessageA(e){try{return this.readE(e),this.ss.decryptAndHash(e.sublist(32))}catch(e){throw new wm(`handshake stage 0 validation fail: ${e.message}`)}}readMessageB(e){try{this.readE(e),this.readEE();const t=this.readS(e,32);return this.readES(),this.ss.decryptAndHash(e.sublist(32+t))}catch(e){throw new wm(`handshake stage 1 validation fail: ${e.message}`)}}readMessageC(e){try{const t=this.readS(e);return this.readSE(),this.ss.decryptAndHash(e.sublist(t))}catch(e){throw new wm(`handshake stage 2 validation fail: ${e.message}`)}}}var Rm,Am;async function Tm(e,t,n){const r=await e.sign(km(t));return Am.encode({identityKey:e.public.bytes,identitySig:r,extensions:n})}async function Dm(e,t,n){try{const r=Am.decode(e);if(n){const e=n.subarray();if(!In(e,r.identityKey))throw new Error(`Payload identity key ${Qt(r.identityKey,"hex")} does not match expected remote identity key ${Qt(e,"hex")}`)}if(!t)throw new Error("Remote static does not exist");const s=km(t),i=Fl(r.identityKey);if(!await i.verify(s,r.identitySig))throw new Error("Invalid payload signature");return r}catch(e){throw new ym(e.message)}}function km(e){const t=kt("noise-libp2p-static-key:");return e instanceof Uint8Array?Rn([t,e],t.length+e.length):(e.prepend(t),e)}async function Pm(e){const{log:t,connection:n,crypto:r,privateKey:s,prologue:i,s:o,remoteIdentityKey:a,extensions:c}=e,l=await Tm(s,o.publicKey,c),u=new Im({crypto:r,protocolName:"Noise_XX_25519_ChaChaPoly_SHA256",initiator:!0,prologue:i,s:o});dm(u.s,t),t.trace("Stage 0 - Initiator starting to send first message."),await n.write(u.writeMessageA(vm)),t.trace("Stage 0 - Initiator finished sending first message."),pm(u.e,t),t.trace("Stage 1 - Initiator waiting to receive first message from responder...");const h=u.readMessageB(await n.read());var d,p;t.trace("Stage 1 - Initiator received the message."),fm(u.re,t),d=u.rs,(p=t).enabled&&Rg&&p(d?`REMOTE_STATIC_PUBLIC_KEY ${Qt(d.subarray(),"hex")}`:"Missing remote static public key."),t.trace("Initiator going to check remote's signature...");const f=await Dm(h,u.rs,a);t.trace("All good with the signature!"),t.trace("Stage 2 - Initiator sending third handshake message."),await n.write(u.writeMessageC(l)),t.trace("Stage 2 - Initiator sent message with signed payload.");const[g,m]=u.ss.split();return gm(g,m,t),{payload:f,encrypt:e=>g.encryptWithAd(vm,e),decrypt:(e,t)=>m.decryptWithAd(vm,e,t)}}!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.webtransportCerthashes)for(const n of e.webtransportCerthashes)t.uint32(10),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={webtransportCerthashes:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();if(t>>>3==1)n.webtransportCerthashes.push(e.bytes());else e.skipType(7&t)}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Rm||(Rm={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.identityKey&&e.identityKey.byteLength>0&&(t.uint32(10),t.bytes(e.identityKey)),null!=e.identitySig&&e.identitySig.byteLength>0&&(t.uint32(18),t.bytes(e.identitySig)),null!=e.extensions&&(t.uint32(34),Rm.codec().encode(e.extensions,t)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={identityKey:y(0),identitySig:y(0)},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.identityKey=e.bytes();break;case 2:n.identitySig=e.bytes();break;case 4:n.extensions=Rm.codec().decode(e,e.uint32());break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Am||(Am={}));class Cm{protocol="/noise";crypto;prologue;staticKey;extensions;metrics;components;constructor(e,t={}){const{staticNoiseKey:n,extensions:r,crypto:s,prologueBytes:i}=t,{metrics:o}=e;this.components=e;const a=s??lm;this.crypto=function(e){return{generateKeypair:e.generateX25519KeyPair,dh:(t,n)=>e.generateX25519SharedKey(t.privateKey,n).subarray(0,32),encrypt:e.chaCha20Poly1305Encrypt,decrypt:e.chaCha20Poly1305Decrypt,hash:e.hashSHA256,hkdf:e.getHKDF}}(a),this.extensions=r,this.metrics=o?function(e){return{xxHandshakeSuccesses:e.registerCounter("libp2p_noise_xxhandshake_successes_total",{help:"Total count of noise xxHandshakes successes_"}),xxHandshakeErrors:e.registerCounter("libp2p_noise_xxhandshake_error_total",{help:"Total count of noise xxHandshakes errors"}),encryptedPackets:e.registerCounter("libp2p_noise_encrypted_packets_total",{help:"Total count of noise encrypted packets successfully"}),decryptedPackets:e.registerCounter("libp2p_noise_decrypted_packets_total",{help:"Total count of noise decrypted packets"}),decryptErrors:e.registerCounter("libp2p_noise_decrypt_errors_total",{help:"Total count of noise decrypt errors"})}}(o):void 0,this.staticKey=n?a.generateX25519KeyPairFromSeed(n):a.generateX25519KeyPair(),this.prologue=i??y(0)}async secureOutbound(e,t,n){const r=xr(t,{lengthEncoder:um,lengthDecoder:hm,maxDataLength:Ig});if(!e.privateKey)throw new fn("local peerId does not contain private key","ERR_NO_PRIVATE_KEY");const s=await Kl(e.privateKey),i=n?.publicKey,o=await this.performHandshakeInitiator(r,s,i),a=await this.createSecureConnection(r,o);return t.source=a.source,t.sink=a.sink,{conn:t,remoteExtensions:o.payload.extensions,remotePeer:await Is(o.payload.identityKey)}}async secureInbound(e,t,n){const r=xr(t,{lengthEncoder:um,lengthDecoder:hm,maxDataLength:Ig});if(!e.privateKey)throw new fn("local peerId does not contain private key","ERR_NO_PRIVATE_KEY");const s=await Kl(e.privateKey),i=n?.publicKey,o=await this.performHandshakeResponder(r,s,i),a=await this.createSecureConnection(r,o);return t.source=a.source,t.sink=a.sink,{conn:t,remoteExtensions:o.payload.extensions,remotePeer:await Is(o.payload.identityKey)}}async performHandshakeInitiator(e,t,n){let r;try{r=await Pm({connection:e,privateKey:t,remoteIdentityKey:n,log:this.components.logger.forComponent("libp2p:noise:xxhandshake"),crypto:this.crypto,prologue:this.prologue,s:this.staticKey,extensions:this.extensions}),this.metrics?.xxHandshakeSuccesses.increment()}catch(e){throw this.metrics?.xxHandshakeErrors.increment(),e}return r}async performHandshakeResponder(e,t,n){let r;try{r=await async function(e){const{log:t,connection:n,crypto:r,privateKey:s,prologue:i,s:o,remoteIdentityKey:a,extensions:c}=e,l=await Tm(s,o.publicKey,c),u=new Im({crypto:r,protocolName:"Noise_XX_25519_ChaChaPoly_SHA256",initiator:!1,prologue:i,s:o});dm(u.s,t),t.trace("Stage 0 - Responder waiting to receive first message."),u.readMessageA(await n.read()),t.trace("Stage 0 - Responder received first message."),fm(u.re,t),t.trace("Stage 1 - Responder sending out first message with signed payload and static key."),await n.write(u.writeMessageB(l)),t.trace("Stage 1 - Responder sent the second handshake message with signed payload."),pm(u.e,t),t.trace("Stage 2 - Responder waiting for third handshake message...");const h=u.readMessageC(await n.read());t.trace("Stage 2 - Responder received the message, finished handshake.");const d=await Dm(h,u.rs,a),[p,f]=u.ss.split();return gm(p,f,t),{payload:d,encrypt:e=>f.encryptWithAd(vm,e),decrypt:(e,t)=>p.decryptWithAd(vm,e,t)}}({connection:e,privateKey:t,remoteIdentityKey:n,log:this.components.logger.forComponent("libp2p:noise:xxhandshake"),crypto:this.crypto,prologue:this.prologue,s:this.staticKey,extensions:this.extensions}),this.metrics?.xxHandshakeSuccesses.increment()}catch(e){throw this.metrics?.xxHandshakeErrors.increment(),e}return r}async createSecureConnection(e,t){const[n,r]=function(){const e=_g(),t=_g();return[{source:e.source,sink:t.sink},{source:t.source,sink:e.sink}]}(),s=e.unwrap();return await gr(n,function(e,t){return async function*(n){for await(const r of n)for(let n=0;n<r.length;n+=65519){let s,i=n+65519;i>r.length&&(i=r.length),s=r instanceof Uint8Array?e.encrypt(r.subarray(n,i)):e.encrypt(r.sublist(n,i)),t?.encryptedPackets.increment(),yield new Ir(um(s.byteLength),s)}}}(t,this.metrics),s,(e=>qr(e,{lengthDecoder:hm})),function(e,t){return async function*(n){for await(const r of n)for(let n=0;n<r.length;n+=Ig){let s=n+Ig;if(s>r.length&&(s=r.length),s-16<n)throw new Error("Invalid chunk");const i=r.sublist(n,s),o=r.subarray(n,s-16);try{const n=e.decrypt(i,o);t?.decryptedPackets.increment(),yield n}catch(e){throw t?.decryptErrors.increment(),e}}}}(t,this.metrics),n),r}}function xm(e={}){return t=>new Cm(t,e)}function Nm(e){if(null!=e){if("function"==typeof e[Symbol.iterator])return e[Symbol.iterator]();if("function"==typeof e[Symbol.asyncIterator])return e[Symbol.asyncIterator]();if("function"==typeof e.next)return e}throw new Error("argument is not an iterator or iterable")}function Mm(e){return null!=e&&("function"==typeof e.then&&"function"==typeof e.catch&&"function"==typeof e.finally)}class Om{id;direction;timeline;protocol;metadata;source;status;readStatus;writeStatus;log;sinkController;sinkEnd;closed;endErr;streamSource;onEnd;onCloseRead;onCloseWrite;onReset;onAbort;sendCloseWriteTimeout;sendingData;constructor(e){this.sinkController=new AbortController,this.sinkEnd=lr(),this.closed=lr(),this.log=e.log,this.status="open",this.readStatus="ready",this.writeStatus="ready",this.id=e.id,this.metadata=e.metadata??{},this.direction=e.direction,this.timeline={open:Date.now()},this.sendCloseWriteTimeout=e.sendCloseWriteTimeout??5e3,this.onEnd=e.onEnd,this.onCloseRead=e?.onCloseRead,this.onCloseWrite=e?.onCloseWrite,this.onReset=e?.onReset,this.onAbort=e?.onAbort,this.source=this.streamSource=pr({onEnd:e=>{null!=e?this.log.trace("source ended with error",e):this.log.trace("source ended"),this.onSourceEnd(e)}}),this.sink=this.sink.bind(this)}async sink(e){if("ready"!==this.writeStatus)throw new fn(`writable end state is "${this.writeStatus}" not "ready"`,"ERR_SINK_INVALID_STATE");try{this.writeStatus="writing";const t={signal:this.sinkController.signal};if("outbound"===this.direction){const e=this.sendNewStream(t);Mm(e)&&await e}const n=()=>{!function(e,t){const n=Nm(e).return?.();var r;null!=(r=n)&&"function"==typeof r.then&&"function"==typeof r.catch&&"function"==typeof r.finally&&n.catch((e=>{t.error("could not cause iterator to return",e)}))}(e,this.log)};try{this.sinkController.signal.addEventListener("abort",n),this.log.trace("sink reading from source");for await(let n of e){n=n instanceof Uint8Array?new Ir(n):n;const e=this.sendData(n,t);Mm(e)&&(this.sendingData=lr(),await e,this.sendingData.resolve(),this.sendingData=void 0)}}finally{this.sinkController.signal.removeEventListener("abort",n)}this.log.trace('sink finished reading from source, write status is "%s"',this.writeStatus),"writing"===this.writeStatus&&(this.writeStatus="closing",this.log.trace("send close write to remote"),await this.sendCloseWrite({signal:AbortSignal.timeout(this.sendCloseWriteTimeout)}),this.writeStatus="closed"),this.onSinkEnd()}catch(e){throw this.log.trace("sink ended with error, calling abort with error",e),this.abort(e),e}finally{this.log.trace("resolve sink end"),this.sinkEnd.resolve()}}onSourceEnd(e){null==this.timeline.closeRead&&(this.timeline.closeRead=Date.now(),this.readStatus="closed",null!=e&&null==this.endErr&&(this.endErr=e),this.onCloseRead?.(),null!=this.timeline.closeWrite?(this.log.trace("source and sink ended"),this.timeline.close=Date.now(),"aborted"!==this.status&&"reset"!==this.status&&(this.status="closed"),null!=this.onEnd&&this.onEnd(this.endErr),this.closed.resolve()):this.log.trace("source ended, waiting for sink to end"))}onSinkEnd(e){null==this.timeline.closeWrite&&(this.timeline.closeWrite=Date.now(),this.writeStatus="closed",null!=e&&null==this.endErr&&(this.endErr=e),this.onCloseWrite?.(),null!=this.timeline.closeRead?(this.log.trace("sink and source ended"),this.timeline.close=Date.now(),"aborted"!==this.status&&"reset"!==this.status&&(this.status="closed"),null!=this.onEnd&&this.onEnd(this.endErr),this.closed.resolve()):this.log.trace("sink ended, waiting for source to end"))}async close(e){this.log.trace("closing gracefully"),this.status="closing",await Ar(Promise.all([this.closeWrite(e),this.closeRead(e),this.closed.promise]),e?.signal),this.status="closed",this.log.trace("closed gracefully")}async closeRead(e={}){if("closing"===this.readStatus||"closed"===this.readStatus)return;this.log.trace('closing readable end of stream with starting read status "%s"',this.readStatus);const t=this.readStatus;this.readStatus="closing","reset"!==this.status&&"aborted"!==this.status&&null==this.timeline.closeRead&&(this.log.trace("send close read to remote"),await this.sendCloseRead(e)),"ready"===t&&(this.log.trace("ending internal source queue with %d queued bytes",this.streamSource.readableLength),this.streamSource.end()),this.log.trace("closed readable end of stream")}async closeWrite(e={}){"closing"!==this.writeStatus&&"closed"!==this.writeStatus&&(this.log.trace('closing writable end of stream with starting write status "%s"',this.writeStatus),"ready"===this.writeStatus&&(this.log.trace("sink was never sunk, sink an empty array"),await Ar(this.sink([]),e.signal)),"writing"===this.writeStatus&&(null!=this.sendingData&&await Ar(this.sendingData.promise,e.signal),this.log.trace("aborting source passed to .sink"),this.sinkController.abort(),await Ar(this.sinkEnd.promise,e.signal)),this.writeStatus="closed",this.log.trace("closed writable end of stream"))}abort(e){if("closed"===this.status||"aborted"===this.status||"reset"===this.status)return;this.log("abort with error",e),this.log("try to send reset to remote");const t=this.sendReset();Mm(t)&&t.catch((e=>{this.log.error("error sending reset message",e)})),this.status="aborted",this.timeline.abort=Date.now(),this._closeSinkAndSource(e),this.onAbort?.(e)}reset(){if("closed"===this.status||"aborted"===this.status||"reset"===this.status)return;const e=new fn("stream reset","ERR_STREAM_RESET");this.status="reset",this.timeline.reset=Date.now(),this._closeSinkAndSource(e),this.onReset?.()}_closeSinkAndSource(e){this._closeSink(e),this._closeSource(e)}_closeSink(e){"writing"===this.writeStatus&&(this.log.trace("end sink source"),this.sinkController.abort()),this.onSinkEnd(e)}_closeSource(e){"closing"!==this.readStatus&&"closed"!==this.readStatus&&(this.log.trace("ending source with %d bytes to be read by consumer",this.streamSource.readableLength),this.readStatus="closing",this.streamSource.end(e))}remoteCloseWrite(){"closing"!==this.readStatus&&"closed"!==this.readStatus?(this.log.trace("remote close write"),this._closeSource()):this.log("received remote close write but local source is already closed")}remoteCloseRead(){"closing"!==this.writeStatus&&"closed"!==this.writeStatus?(this.log.trace("remote close read"),this._closeSink()):this.log("received remote close read but local sink is already closed")}destroy(){"closed"!==this.status&&"aborted"!==this.status&&"reset"!==this.status?(this.log.trace("stream destroyed"),this._closeSinkAndSource()):this.log("received destroy but we are already closed")}sourcePush(e){this.streamSource.push(e)}sourceReadableLength(){return this.streamSource.readableLength}}class Lm extends Om{writer;reader;constructor(e){super(e),this.writer=e.bidiStream.writable.getWriter(),this.reader=e.bidiStream.readable.getReader(),Promise.resolve().then((async()=>{for(;;){const t=await this.reader.read();if(t.done)return void e.log("remote closed write");null!=t.value&&this.sourcePush(new Ir(t.value))}})).catch((t=>{e.log.error("error reading from stream",t),this.abort(t)})).finally((()=>{this.remoteCloseWrite()})),this.writer.closed.then((()=>{e.log("writer closed")})).catch((t=>{e.log("writer close promise rejected",t)})).finally((()=>{this.remoteCloseRead()}))}sendNewStream(e){}async sendData(e,t){for await(const n of e)this.log("sendData waiting for writer to be ready"),await Ar(this.writer.ready,t?.signal),this.writer.write(n).catch((e=>{this.log.error("error sending stream data",e)}))}async sendReset(e){this.log("sendReset aborting writer"),await Ar(this.writer.abort(),e?.signal),this.log("sendReset aborted writer")}async sendCloseWrite(e){this.log("sendCloseWrite closing writer"),await Ar(this.writer.close(),e?.signal),this.log("sendCloseWrite closed writer")}async sendCloseRead(e){this.log("sendCloseRead cancelling reader"),await Ar(this.reader.cancel(),e?.signal),this.log("sendCloseRead cancelled reader")}}async function Bm(e,t,n,r,s,i){const o=i.forComponent(`libp2p:webtransport:stream:${n}:${t}`),a=new Lm({bidiStream:e,id:t,direction:n,log:o,onEnd:()=>{const e=r.findIndex((e=>e===a));-1!==e&&r.splice(e,1),s?.(a)}});return a}function Um(){return{source:{[Symbol.asyncIterator]:()=>({next:async()=>new Promise((()=>{}))})},sink:async e=>new Promise((()=>{}))}}function Fm(e,t,n,r){let s=0;const i=n.forComponent("libp2p:webtransport:muxer");return{protocol:"webtransport",createStreamMuxer:o=>{"function"==typeof o&&(o={onIncomingStream:o});const a=[];Promise.resolve().then((async()=>{
|
|
79
|
+
const Tl=BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),Dl=BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),kl=BigInt(1),Pl=BigInt(2),Cl=(e,t)=>(e+t/Pl)/t;const xl=qi(Tl,void 0,void 0,{sqrt:function(e){const t=Tl,n=BigInt(3),r=BigInt(6),s=BigInt(11),i=BigInt(22),o=BigInt(23),a=BigInt(44),c=BigInt(88),l=e*e*e%t,u=l*l*e%t,h=Ui(u,n,t)*u%t,d=Ui(h,n,t)*u%t,p=Ui(d,Pl,t)*l%t,f=Ui(p,s,t)*p%t,g=Ui(f,i,t)*f%t,m=Ui(g,a,t)*g%t,y=Ui(m,c,t)*m%t,w=Ui(y,a,t)*g%t,b=Ui(w,n,t)*u%t,v=Ui(b,o,t)*f%t,E=Ui(v,r,t)*l%t,S=Ui(E,Pl,t);if(!xl.eql(xl.sqr(S),e))throw new Error("Cannot find square root");return S}}),Nl=function(e,t){const n=t=>Rl({...e,...Al(t)});return Object.freeze({...n(t),create:n})}({a:BigInt(0),b:BigInt(7),Fp:xl,n:Dl,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),h:BigInt(1),lowS:!0,endo:{beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar:e=>{const t=Dl,n=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),r=-kl*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),s=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),i=n,o=BigInt("0x100000000000000000000000000000000"),a=Cl(i*e,t),c=Cl(-r*e,t);let l=Li(e-a*n-c*s,t),u=Li(-a*r-c*i,t);const h=l>o,d=u>o;if(h&&(l=t-l),d&&(u=t-u),l>o||u>o)throw new Error("splitScalar: Endomorphism failed, k="+e);return{k1neg:h,k1:l,k2neg:d,k2:u}}}},yl);function Ml(e){try{Nl.ProjectivePoint.fromHex(e)}catch(e){throw new fn(String(e),"ERR_INVALID_PUBLIC_KEY")}}BigInt(0),Nl.ProjectivePoint;class Ol{_key;constructor(e){Ml(e),this._key=e}verify(e,t){return function(e,t,n){const r=gt.digest(n instanceof Uint8Array?n:n.subarray());if(ks(r))return r.then((({digest:n})=>Nl.verify(t,n,e))).catch((e=>{throw new fn(String(e),"ERR_INVALID_INPUT")}));try{return Nl.verify(t,r.digest,e)}catch(e){throw new fn(String(e),"ERR_INVALID_INPUT")}}(this._key,t,e)}marshal(){return e=this._key,Nl.ProjectivePoint.fromHex(e).toRawBytes(!0);var e}get bytes(){return Po.encode({Type:Do.Secp256k1,Data:this.marshal()}).subarray()}equals(e){return In(this.bytes,e.bytes)}async hash(){const e=gt.digest(this.bytes);let t;return ks(e)?({bytes:t}=await e):t=e.bytes,t}}class Ll{_key;_publicKey;constructor(e,t){this._key=e,this._publicKey=t??function(e){try{return Nl.getPublicKey(e,!0)}catch(e){throw new fn(String(e),"ERR_INVALID_PRIVATE_KEY")}}(e),function(e){try{Nl.getPublicKey(e,!0)}catch(e){throw new fn(String(e),"ERR_INVALID_PRIVATE_KEY")}}(this._key),Ml(this._publicKey)}sign(e){return function(e,t){const n=gt.digest(t instanceof Uint8Array?t:t.subarray());if(ks(n))return n.then((({digest:t})=>Nl.sign(t,e).toDERRawBytes())).catch((e=>{throw new fn(String(e),"ERR_INVALID_INPUT")}));try{return Nl.sign(n.digest,e).toDERRawBytes()}catch(e){throw new fn(String(e),"ERR_INVALID_INPUT")}}(this._key,e)}get public(){return new Ol(this._publicKey)}marshal(){return this._key}get bytes(){return Co.encode({Type:Do.Secp256k1,Data:this.marshal()}).subarray()}equals(e){return In(this.bytes,e.bytes)}hash(){const e=gt.digest(this.bytes);return ks(e)?e.then((({bytes:e})=>e)):e.bytes}async id(){return Qt(await this.public.hash(),"base58btc")}async export(e,t="libp2p-key"){if("libp2p-key"===t)return To(this.bytes,e);throw new fn(`export format '${t}' is not supported`,"ERR_INVALID_EXPORT_FORMAT")}}var Bl=Object.freeze({__proto__:null,Secp256k1PrivateKey:Ll,Secp256k1PublicKey:Ol,generateKeyPair:async function(){const e=Nl.utils.randomPrivateKey();return new Ll(e)},unmarshalSecp256k1PrivateKey:function(e){return new Ll(e)},unmarshalSecp256k1PublicKey:function(e){return new Ol(e)}});const Ul={rsa:dl,ed25519:Oo,secp256k1:Bl};function Fl(e){const t=Object.keys(Ul).join(" / ");return new fn(`invalid or unsupported key type ${e}. Must be ${t}`,"ERR_UNSUPPORTED_KEY_TYPE")}function Vl(e){if("rsa"===(e=e.toLowerCase())||"ed25519"===e||"secp256k1"===e)return Ul[e];throw Fl(e)}function Kl(e){const t=Po.decode(e),n=t.Data??new Uint8Array;switch(t.Type){case Do.RSA:return Ul.rsa.unmarshalRsaPublicKey(n);case Do.Ed25519:return Ul.ed25519.unmarshalEd25519PublicKey(n);case Do.Secp256k1:return Ul.secp256k1.unmarshalSecp256k1PublicKey(n);default:throw Fl(t.Type??"unknown")}}function $l(e,t){return Vl(t=(t??"rsa").toLowerCase()),e.bytes}async function ql(e){const t=Co.decode(e),n=t.Data??new Uint8Array;switch(t.Type){case Do.RSA:return Ul.rsa.unmarshalRsaPrivateKey(n);case Do.Ed25519:return Ul.ed25519.unmarshalEd25519PrivateKey(n);case Do.Secp256k1:return Ul.secp256k1.unmarshalSecp256k1PrivateKey(n);default:throw Fl(t.Type??"RSA")}}var Hl,zl={exports:{}};Hl=zl,function(){Hl.exports=g;var e=86400,t=3200,n=146097*t/400,r=e*n,s=1e3*r,i=864e13,o=4294967296,a=1e6,c="000000000",l=Math.trunc||function(e){var t=e-e%1;return 0==t&&(e<0||0===e&&1/e!=1/0)?-0:t},u=g.prototype,h=(g.fromDate=function(e){return new g(+e)},g.fromInt64BE=v(0,1,2,3,0,4),g.fromInt64LE=v(3,2,1,0,4,0),g.fromString=function(e){var t,n=new g;if(e=(e+="").replace(/^\s*[+\-]?\d+/,(function(e){var t=1970+((e=+e)-1970)%400;return n.year=e-t,t})).replace(/(?:Z|([+\-]\d{2}):?(\d{2}))$/,(function(e,n,r){return n<0&&(r*=-1),t=6e4*(60*+n+ +r),""})).replace(/\.\d+$/,(function(e){return n.nano=+(e+c).substr(1,9),""})).split(/\D+/),1<e.length?e[1]--:e[1]=0,n.time=t=Date.UTC.apply(Date,e)-(t||0),isNaN(t))throw new TypeError("Invalid Date");return m(n)},g.fromTimeT=function(e){return w(e,0)},u.year=0,u.time=0,u.nano=0,u.addNano=function(e){return this.nano+=+e||0,this},u.getNano=function(){var e=m(this);return(e.time%1e3*a+ +e.nano+1e9)%1e9},u.getTimeT=function(){var r=m(this),s=Math.floor(r.time/1e3);return(r=r.year)&&(s+=r*n*e/t),s},u.getYear=function(){return this.toDate().getUTCFullYear()+this.year},u.toDate=function(){return y(m(this).time)},u.toJSON=function(){return this.toString().replace(/0{1,6}Z$/,"Z")},u.toString=function(e){var t=this,n=t.toDate(),r={H:function(){return S(n.getUTCHours())},L:function(){return _(n.getUTCMilliseconds(),3)},M:function(){return S(n.getUTCMinutes())},N:function(){return _(t.getNano(),9)},S:function(){return S(n.getUTCSeconds())},Y:function(){var e=t.getYear();return 999999<e?"+"+e:9999<e?"+"+_(e,6):0<=e?_(e,4):-999999<=e?"-"+_(-e,6):e},a:function(){return p[n.getUTCDay()]},b:function(){return d[n.getUTCMonth()]},d:function(){return S(n.getUTCDate())},e:function(){return function(e){return(9<e?"":" ")+(0|e)}(n.getUTCDate())},m:function(){return S(n.getUTCMonth()+1)}};return function e(t){return t.replace(/%./g,(function(t){var n=t[1],s=f[n];return n=r[n],s?e(s):n?n():t}))}(e||h)},u.writeInt64BE=b(0,1,2,3,0,4),u.writeInt64LE=b(3,2,1,0,4,0),"%Y-%m-%dT%H:%M:%S.%NZ"),d=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],p=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],f={"%":"%",F:"%Y-%m-%d",n:"\n",R:"%H:%M",T:"%H:%M:%S",t:"\t",X:"%T",Z:"GMT",z:"+0000"};return g;function g(e,t,n){var r=this;if(!(r instanceof g))return new g(e,t,n);r.time=+e||0,r.nano=+t||0,r.year=+n||0,m(r)}function m(e){var n,r,o,c=e.year,u=e.time,h=e.nano,d=((h<0||a<=h)&&(h-=(r=Math.floor(h/a))*a,u+=r,r=1),c%t);return(u<-i||i<u||d)&&((n=l(u/s))&&(c+=n*t,u-=n*s),(o=y(u)).setUTCFullYear(d+o.getUTCFullYear()),o=(u=+o)+(n=l((c-=d)/t))*s,n&&-i<=o&&o<=i&&(c-=n*t,u=o),r=1),r&&(e.year=c,e.time=u,e.nano=h),e}function y(e){var t=new Date(0);return t.setTime(e),t}function w(e,n){e=+e||0;var s=l((n=(0|n)*o)/r)+l(e/r);return(e=l((n=n%r+e%r)/r))&&(s+=e,n-=e*r),new g(1e3*n,0,s*t)}function b(r,s,i,a,c,u){return function(r,s){var i=m(this);E(r=r||new Array(8),s|=0);var a=Math.floor(i.time/1e3),d=(i=i.year*(n*e/t),l(i/o)+l(a/o));return i=i%o+a%o,(a=Math.floor(i/o))&&(d+=a,i-=a*o),h(r,s+c,d),h(r,s+u,i),r};function h(e,t,n){e[t+r]=n>>24&255,e[t+s]=n>>16&255,e[t+i]=n>>8&255,e[t+a]=255&n}}function v(e,t,n,r,s,i){return function(e,t){E(e,t|=0);var n=o(e,t+s);return w(o(e,t+i),n)};function o(s,i){return 16777216*s[i+e]+(s[i+t]<<16|s[i+n]<<8|s[i+r])}}function E(e,t){if(null==(e=e&&e.length))throw new TypeError("Invalid Buffer");if(e<t+8)throw new RangeError("Out of range")}function S(e){return(9<e?"":"0")+(0|e)}function _(e,t){return(c+(0|e)).substr(-t)}}();var Wl=Br(zl.exports);const jl="ERR_UNRECOGNIZED_VALIDITY",Gl="ERR_SIGNATURE_VERIFICATION",Yl="ERR_UNDEFINED_PARAMETER";var Ql;!function(e){let t,n;(e.ValidityType||(e.ValidityType={})).EOL="EOL",function(e){e[e.EOL=0]="EOL"}(t||(t={})),function(e){e.codec=()=>Wt(t)}(e.ValidityType||(e.ValidityType={})),e.codec=()=>(null==n&&(n=jt(((t,n,r={})=>{!1!==r.lengthDelimited&&n.fork(),null!=t.value&&(n.uint32(10),n.bytes(t.value)),null!=t.signatureV1&&(n.uint32(18),n.bytes(t.signatureV1)),null!=t.validityType&&(n.uint32(24),e.ValidityType.codec().encode(t.validityType,n)),null!=t.validity&&(n.uint32(34),n.bytes(t.validity)),null!=t.sequence&&(n.uint32(40),n.uint64(t.sequence)),null!=t.ttl&&(n.uint32(48),n.uint64(t.ttl)),null!=t.pubKey&&(n.uint32(58),n.bytes(t.pubKey)),null!=t.signatureV2&&(n.uint32(66),n.bytes(t.signatureV2)),null!=t.data&&(n.uint32(74),n.bytes(t.data)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.value=t.bytes();break;case 2:r.signatureV1=t.bytes();break;case 3:r.validityType=e.ValidityType.codec().decode(t);break;case 4:r.validity=t.bytes();break;case 5:r.sequence=t.uint64();break;case 6:r.ttl=t.uint64();break;case 7:r.pubKey=t.bytes();break;case 8:r.signatureV2=t.bytes();break;case 9:r.data=t.bytes();break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Ql||(Ql={}));const Jl=["string","number","bigint","symbol"],Zl=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","HTMLElement","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function Xl(e){if(null===e)return"null";if(void 0===e)return"undefined";if(!0===e||!1===e)return"boolean";const t=typeof e;if(Jl.includes(t))return t;if("function"===t)return"Function";if(Array.isArray(e))return"Array";if(function(e){return e&&e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer.call(null,e)}(e))return"Buffer";const n=function(e){const t=Object.prototype.toString.call(e).slice(8,-1);if(Zl.includes(t))return t;return}(e);return n||"Object"}class eu{constructor(e,t,n){this.major=e,this.majorEncoded=e<<5,this.name=t,this.terminal=n}toString(){return`Type[${this.major}].${this.name}`}compare(e){return this.major<e.major?-1:this.major>e.major?1:0}}eu.uint=new eu(0,"uint",!0),eu.negint=new eu(1,"negint",!0),eu.bytes=new eu(2,"bytes",!0),eu.string=new eu(3,"string",!0),eu.array=new eu(4,"array",!1),eu.map=new eu(5,"map",!1),eu.tag=new eu(6,"tag",!1),eu.float=new eu(7,"float",!0),eu.false=new eu(7,"false",!0),eu.true=new eu(7,"true",!0),eu.null=new eu(7,"null",!0),eu.undefined=new eu(7,"undefined",!0),eu.break=new eu(7,"break",!0);class tu{constructor(e,t,n){this.type=e,this.value=t,this.encodedLength=n,this.encodedBytes=void 0,this.byteValue=void 0}toString(){return`Token[${this.type}].${this.value}`}}const nu=globalThis.process&&!globalThis.process.browser&&globalThis.Buffer&&"function"==typeof globalThis.Buffer.isBuffer,ru=new TextDecoder,su=new TextEncoder;function iu(e){return nu&&globalThis.Buffer.isBuffer(e)}const ou=nu?(e,t,n)=>n-t>64?globalThis.Buffer.from(e.subarray(t,n)).toString("utf8"):uu(e,t,n):(e,t,n)=>n-t>64?ru.decode(e.subarray(t,n)):uu(e,t,n),au=nu?e=>e.length>64?globalThis.Buffer.from(e):lu(e):e=>e.length>64?su.encode(e):lu(e),cu=nu?(e,t,n)=>iu(e)?new Uint8Array(e.subarray(t,n)):e.slice(t,n):(e,t,n)=>e.slice(t,n);function lu(e){const t=[];let n=0;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);s<128?t[n++]=s:s<2048?(t[n++]=s>>6|192,t[n++]=63&s|128):55296==(64512&s)&&r+1<e.length&&56320==(64512&e.charCodeAt(r+1))?(s=65536+((1023&s)<<10)+(1023&e.charCodeAt(++r)),t[n++]=s>>18|240,t[n++]=s>>12&63|128,t[n++]=s>>6&63|128,t[n++]=63&s|128):(t[n++]=s>>12|224,t[n++]=s>>6&63|128,t[n++]=63&s|128)}return t}function uu(e,t,n){const r=[];for(;t<n;){const s=e[t];let i=null,o=s>239?4:s>223?3:s>191?2:1;if(t+o<=n){let n,r,a,c;switch(o){case 1:s<128&&(i=s);break;case 2:n=e[t+1],128==(192&n)&&(c=(31&s)<<6|63&n,c>127&&(i=c));break;case 3:n=e[t+1],r=e[t+2],128==(192&n)&&128==(192&r)&&(c=(15&s)<<12|(63&n)<<6|63&r,c>2047&&(c<55296||c>57343)&&(i=c));break;case 4:n=e[t+1],r=e[t+2],a=e[t+3],128==(192&n)&&128==(192&r)&&128==(192&a)&&(c=(15&s)<<18|(63&n)<<12|(63&r)<<6|63&a,c>65535&&c<1114112&&(i=c))}}null===i?(i=65533,o=1):i>65535&&(i-=65536,r.push(i>>>10&1023|55296),i=56320|1023&i),r.push(i),t+=o}return function(e){const t=e.length;if(t<=hu)return String.fromCharCode.apply(String,e);let n="",r=0;for(;r<t;)n+=String.fromCharCode.apply(String,e.slice(r,r+=hu));return n}(r)}const hu=4096;const du="CBOR decode error:",pu="CBOR encode error:";function fu(e,t,n){if(e.length-t<n)throw new Error(`${du} not enough data for type`)}const gu=[24,256,65536,4294967296,BigInt("18446744073709551616")];function mu(e,t,n){fu(e,t,1);const r=e[t];if(!0===n.strict&&r<gu[0])throw new Error(`${du} integer encoded in more bytes than necessary (strict decode)`);return r}function yu(e,t,n){fu(e,t,2);const r=e[t]<<8|e[t+1];if(!0===n.strict&&r<gu[1])throw new Error(`${du} integer encoded in more bytes than necessary (strict decode)`);return r}function wu(e,t,n){fu(e,t,4);const r=16777216*e[t]+(e[t+1]<<16)+(e[t+2]<<8)+e[t+3];if(!0===n.strict&&r<gu[2])throw new Error(`${du} integer encoded in more bytes than necessary (strict decode)`);return r}function bu(e,t,n){fu(e,t,8);const r=16777216*e[t]+(e[t+1]<<16)+(e[t+2]<<8)+e[t+3],s=16777216*e[t+4]+(e[t+5]<<16)+(e[t+6]<<8)+e[t+7],i=(BigInt(r)<<BigInt(32))+BigInt(s);if(!0===n.strict&&i<gu[3])throw new Error(`${du} integer encoded in more bytes than necessary (strict decode)`);if(i<=Number.MAX_SAFE_INTEGER)return Number(i);if(!0===n.allowBigInt)return i;throw new Error(`${du} integers outside of the safe integer range are not supported`)}function vu(e,t){return Eu(e,0,t.value)}function Eu(e,t,n){if(n<gu[0]){const r=Number(n);e.push([t|r])}else if(n<gu[1]){const r=Number(n);e.push([24|t,r])}else if(n<gu[2]){const r=Number(n);e.push([25|t,r>>>8,255&r])}else if(n<gu[3]){const r=Number(n);e.push([26|t,r>>>24&255,r>>>16&255,r>>>8&255,255&r])}else{const r=BigInt(n);if(!(r<gu[4]))throw new Error(`${du} encountered BigInt larger than allowable range`);{const n=[27|t,0,0,0,0,0,0,0];let s=Number(r&BigInt(4294967295)),i=Number(r>>BigInt(32)&BigInt(4294967295));n[8]=255&s,s>>=8,n[7]=255&s,s>>=8,n[6]=255&s,s>>=8,n[5]=255&s,n[4]=255&i,i>>=8,n[3]=255&i,i>>=8,n[2]=255&i,i>>=8,n[1]=255&i,e.push(n)}}}vu.encodedSize=function(e){return Eu.encodedSize(e.value)},Eu.encodedSize=function(e){return e<gu[0]?1:e<gu[1]?2:e<gu[2]?3:e<gu[3]?5:9},vu.compareTokens=function(e,t){return e.value<t.value?-1:e.value>t.value?1:0};const Su=BigInt(-1),_u=BigInt(1);function Iu(e,t){const n=t.value,r="bigint"==typeof n?n*Su-_u:-1*n-1;Eu(e,t.type.majorEncoded,r)}function Ru(e,t,n,r){fu(e,t,n+r);const s=cu(e,t+n,t+n+r);return new tu(eu.bytes,s,n+r)}function Au(e,t,n,r){return Ru(e,t,1,n)}function Tu(e){return void 0===e.encodedBytes&&(e.encodedBytes=e.type===eu.string?au(e.value):e.value),e.encodedBytes}function Du(e,t){const n=Tu(t);Eu(e,t.type.majorEncoded,n.length),e.push(n)}function ku(e,t,n,r,s){const i=n+r;fu(e,t,i);const o=new tu(eu.string,ou(e,t+n,t+i),i);return!0===s.retainStringBytes&&(o.byteValue=cu(e,t+n,t+i)),o}function Pu(e,t,n,r){return ku(e,t,1,n,r)}Iu.encodedSize=function(e){const t=e.value,n="bigint"==typeof t?t*Su-_u:-1*t-1;return n<gu[0]?1:n<gu[1]?2:n<gu[2]?3:n<gu[3]?5:9},Iu.compareTokens=function(e,t){return e.value<t.value?1:e.value>t.value?-1:0},Du.encodedSize=function(e){const t=Tu(e);return Eu.encodedSize(t.length)+t.length},Du.compareTokens=function(e,t){return n=Tu(e),r=Tu(t),n.length<r.length?-1:n.length>r.length?1:function(e,t){if(iu(e)&&iu(t))return e.compare(t);for(let n=0;n<e.length;n++)if(e[n]!==t[n])return e[n]<t[n]?-1:1;return 0}(n,r);var n,r};const Cu=Du;function xu(e,t,n,r){return new tu(eu.array,r,n)}function Nu(e,t,n,r){return xu(0,0,1,n)}function Mu(e,t){Eu(e,eu.array.majorEncoded,t.value)}function Ou(e,t,n,r){return new tu(eu.map,r,n)}function Lu(e,t,n,r){return Ou(0,0,1,n)}function Bu(e,t){Eu(e,eu.map.majorEncoded,t.value)}function Uu(e,t,n,r){return new tu(eu.tag,n,1)}function Fu(e,t){Eu(e,eu.tag.majorEncoded,t.value)}Mu.compareTokens=vu.compareTokens,Mu.encodedSize=function(e){return Eu.encodedSize(e.value)},Bu.compareTokens=vu.compareTokens,Bu.encodedSize=function(e){return Eu.encodedSize(e.value)},Fu.compareTokens=vu.compareTokens,Fu.encodedSize=function(e){return Eu.encodedSize(e.value)};const Vu=20,Ku=21,$u=22,qu=23;function Hu(e,t,n){if(n){if(!1===n.allowNaN&&Number.isNaN(e))throw new Error(`${du} NaN values are not supported`);if(!1===n.allowInfinity&&(e===1/0||e===-1/0))throw new Error(`${du} Infinity values are not supported`)}return new tu(eu.float,e,t)}function zu(e,t,n){const r=t.value;if(!1===r)e.push([eu.float.majorEncoded|Vu]);else if(!0===r)e.push([eu.float.majorEncoded|Ku]);else if(null===r)e.push([eu.float.majorEncoded|$u]);else if(void 0===r)e.push([eu.float.majorEncoded|qu]);else{let t,i=!1;n&&!0===n.float64||(Yu(r),t=Qu(Gu,1),r===t||Number.isNaN(r)?(Gu[0]=249,e.push(Gu.slice(0,3)),i=!0):(Ju(r),t=Zu(Gu,1),r===t&&(Gu[0]=250,e.push(Gu.slice(0,5)),i=!0))),i||(s=r,ju.setFloat64(0,s,!1),t=Xu(Gu,1),Gu[0]=251,e.push(Gu.slice(0,9)))}var s}zu.encodedSize=function(e,t){const n=e.value;if(!1===n||!0===n||null==n)return 1;if(!t||!0!==t.float64){Yu(n);let e=Qu(Gu,1);if(n===e||Number.isNaN(n))return 3;if(Ju(n),e=Zu(Gu,1),n===e)return 5}return 9};const Wu=new ArrayBuffer(9),ju=new DataView(Wu,1),Gu=new Uint8Array(Wu,0);function Yu(e){if(e===1/0)ju.setUint16(0,31744,!1);else if(e===-1/0)ju.setUint16(0,64512,!1);else if(Number.isNaN(e))ju.setUint16(0,32256,!1);else{ju.setFloat32(0,e);const t=ju.getUint32(0),n=(2139095040&t)>>23,r=8388607&t;if(255===n)ju.setUint16(0,31744,!1);else if(0===n)ju.setUint16(0,(2147483648&e)>>16|r>>13,!1);else{const e=n-127;e<-24?ju.setUint16(0,0):e<-14?ju.setUint16(0,(2147483648&t)>>16|1<<24+e,!1):ju.setUint16(0,(2147483648&t)>>16|e+15<<10|r>>13,!1)}}}function Qu(e,t){if(e.length-t<2)throw new Error(`${du} not enough data for float16`);const n=(e[t]<<8)+e[t+1];if(31744===n)return 1/0;if(64512===n)return-1/0;if(32256===n)return NaN;const r=n>>10&31,s=1023&n;let i;return i=0===r?s*2**-24:31!==r?(s+1024)*2**(r-25):0===s?1/0:NaN,32768&n?-i:i}function Ju(e){ju.setFloat32(0,e,!1)}function Zu(e,t){if(e.length-t<4)throw new Error(`${du} not enough data for float32`);const n=(e.byteOffset||0)+t;return new DataView(e.buffer,n,4).getFloat32(0,!1)}function Xu(e,t){if(e.length-t<8)throw new Error(`${du} not enough data for float64`);const n=(e.byteOffset||0)+t;return new DataView(e.buffer,n,8).getFloat64(0,!1)}function eh(e,t,n){throw new Error(`${du} encountered invalid minor (${n}) for major ${e[t]>>>5}`)}function th(e){return()=>{throw new Error(`${du} ${e}`)}}zu.compareTokens=vu.compareTokens;const nh=[];for(let e=0;e<=23;e++)nh[e]=eh;nh[24]=function(e,t,n,r){return new tu(eu.uint,mu(e,t+1,r),2)},nh[25]=function(e,t,n,r){return new tu(eu.uint,yu(e,t+1,r),3)},nh[26]=function(e,t,n,r){return new tu(eu.uint,wu(e,t+1,r),5)},nh[27]=function(e,t,n,r){return new tu(eu.uint,bu(e,t+1,r),9)},nh[28]=eh,nh[29]=eh,nh[30]=eh,nh[31]=eh;for(let e=32;e<=55;e++)nh[e]=eh;nh[56]=function(e,t,n,r){return new tu(eu.negint,-1-mu(e,t+1,r),2)},nh[57]=function(e,t,n,r){return new tu(eu.negint,-1-yu(e,t+1,r),3)},nh[58]=function(e,t,n,r){return new tu(eu.negint,-1-wu(e,t+1,r),5)},nh[59]=function(e,t,n,r){const s=bu(e,t+1,r);if("bigint"!=typeof s){const e=-1-s;if(e>=Number.MIN_SAFE_INTEGER)return new tu(eu.negint,e,9)}if(!0!==r.allowBigInt)throw new Error(`${du} integers outside of the safe integer range are not supported`);return new tu(eu.negint,Su-BigInt(s),9)},nh[60]=eh,nh[61]=eh,nh[62]=eh,nh[63]=eh;for(let e=64;e<=87;e++)nh[e]=Au;nh[88]=function(e,t,n,r){return Ru(e,t,2,mu(e,t+1,r))},nh[89]=function(e,t,n,r){return Ru(e,t,3,yu(e,t+1,r))},nh[90]=function(e,t,n,r){return Ru(e,t,5,wu(e,t+1,r))},nh[91]=function(e,t,n,r){const s=bu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${du} 64-bit integer bytes lengths not supported`);return Ru(e,t,9,s)},nh[92]=eh,nh[93]=eh,nh[94]=eh,nh[95]=th("indefinite length bytes/strings are not supported");for(let e=96;e<=119;e++)nh[e]=Pu;nh[120]=function(e,t,n,r){return ku(e,t,2,mu(e,t+1,r),r)},nh[121]=function(e,t,n,r){return ku(e,t,3,yu(e,t+1,r),r)},nh[122]=function(e,t,n,r){return ku(e,t,5,wu(e,t+1,r),r)},nh[123]=function(e,t,n,r){const s=bu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${du} 64-bit integer string lengths not supported`);return ku(e,t,9,s,r)},nh[124]=eh,nh[125]=eh,nh[126]=eh,nh[127]=th("indefinite length bytes/strings are not supported");for(let e=128;e<=151;e++)nh[e]=Nu;nh[152]=function(e,t,n,r){return xu(0,0,2,mu(e,t+1,r))},nh[153]=function(e,t,n,r){return xu(0,0,3,yu(e,t+1,r))},nh[154]=function(e,t,n,r){return xu(0,0,5,wu(e,t+1,r))},nh[155]=function(e,t,n,r){const s=bu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${du} 64-bit integer array lengths not supported`);return xu(0,0,9,s)},nh[156]=eh,nh[157]=eh,nh[158]=eh,nh[159]=function(e,t,n,r){if(!1===r.allowIndefinite)throw new Error(`${du} indefinite length items not allowed`);return xu(0,0,1,1/0)};for(let e=160;e<=183;e++)nh[e]=Lu;nh[184]=function(e,t,n,r){return Ou(0,0,2,mu(e,t+1,r))},nh[185]=function(e,t,n,r){return Ou(0,0,3,yu(e,t+1,r))},nh[186]=function(e,t,n,r){return Ou(0,0,5,wu(e,t+1,r))},nh[187]=function(e,t,n,r){const s=bu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${du} 64-bit integer map lengths not supported`);return Ou(0,0,9,s)},nh[188]=eh,nh[189]=eh,nh[190]=eh,nh[191]=function(e,t,n,r){if(!1===r.allowIndefinite)throw new Error(`${du} indefinite length items not allowed`);return Ou(0,0,1,1/0)};for(let e=192;e<=215;e++)nh[e]=Uu;nh[216]=function(e,t,n,r){return new tu(eu.tag,mu(e,t+1,r),2)},nh[217]=function(e,t,n,r){return new tu(eu.tag,yu(e,t+1,r),3)},nh[218]=function(e,t,n,r){return new tu(eu.tag,wu(e,t+1,r),5)},nh[219]=function(e,t,n,r){return new tu(eu.tag,bu(e,t+1,r),9)},nh[220]=eh,nh[221]=eh,nh[222]=eh,nh[223]=eh;for(let e=224;e<=243;e++)nh[e]=th("simple values are not supported");nh[244]=eh,nh[245]=eh,nh[246]=eh,nh[247]=function(e,t,n,r){if(!1===r.allowUndefined)throw new Error(`${du} undefined values are not supported`);return!0===r.coerceUndefinedToNull?new tu(eu.null,null,1):new tu(eu.undefined,void 0,1)},nh[248]=th("simple values are not supported"),nh[249]=function(e,t,n,r){return Hu(Qu(e,t+1),3,r)},nh[250]=function(e,t,n,r){return Hu(Zu(e,t+1),5,r)},nh[251]=function(e,t,n,r){return Hu(Xu(e,t+1),9,r)},nh[252]=eh,nh[253]=eh,nh[254]=eh,nh[255]=function(e,t,n,r){if(!1===r.allowIndefinite)throw new Error(`${du} indefinite length items not allowed`);return new tu(eu.break,void 0,1)};const rh=[];for(let e=0;e<24;e++)rh[e]=new tu(eu.uint,e,1);for(let e=-1;e>=-24;e--)rh[31-e]=new tu(eu.negint,e,1);rh[64]=new tu(eu.bytes,new Uint8Array(0),1),rh[96]=new tu(eu.string,"",1),rh[128]=new tu(eu.array,0,1),rh[160]=new tu(eu.map,0,1),rh[244]=new tu(eu.false,!1,1),rh[245]=new tu(eu.true,!0,1),rh[246]=new tu(eu.null,null,1),function(){const e=[];e[eu.uint.major]=vu,e[eu.negint.major]=Iu,e[eu.bytes.major]=Du,e[eu.string.major]=Cu,e[eu.array.major]=Mu,e[eu.map.major]=Bu,e[eu.tag.major]=Fu,e[eu.float.major]=zu}();class sh{constructor(e,t){this.obj=e,this.parent=t}includes(e){let t=this;do{if(t.obj===e)return!0}while(t=t.parent);return!1}static createCheck(e,t){if(e&&e.includes(t))throw new Error(`${pu} object contains circular references`);return new sh(t,e)}}const ih={null:new tu(eu.null,null),undefined:new tu(eu.undefined,void 0),true:new tu(eu.true,!0),false:new tu(eu.false,!1),emptyArray:new tu(eu.array,0),emptyMap:new tu(eu.map,0)},oh={number:(e,t,n,r)=>Number.isInteger(e)&&Number.isSafeInteger(e)?new tu(e>=0?eu.uint:eu.negint,e):new tu(eu.float,e),bigint:(e,t,n,r)=>e>=BigInt(0)?new tu(eu.uint,e):new tu(eu.negint,e),Uint8Array:(e,t,n,r)=>new tu(eu.bytes,e),string:(e,t,n,r)=>new tu(eu.string,e),boolean:(e,t,n,r)=>e?ih.true:ih.false,null:(e,t,n,r)=>ih.null,undefined:(e,t,n,r)=>ih.undefined,ArrayBuffer:(e,t,n,r)=>new tu(eu.bytes,new Uint8Array(e)),DataView:(e,t,n,r)=>new tu(eu.bytes,new Uint8Array(e.buffer,e.byteOffset,e.byteLength)),Array(e,t,n,r){if(!e.length)return!0===n.addBreakTokens?[ih.emptyArray,new tu(eu.break)]:ih.emptyArray;r=sh.createCheck(r,e);const s=[];let i=0;for(const t of e)s[i++]=ah(t,n,r);return n.addBreakTokens?[new tu(eu.array,e.length),s,new tu(eu.break)]:[new tu(eu.array,e.length),s]},Object(e,t,n,r){const s="Object"!==t,i=s?e.keys():Object.keys(e),o=s?e.size:i.length;if(!o)return!0===n.addBreakTokens?[ih.emptyMap,new tu(eu.break)]:ih.emptyMap;r=sh.createCheck(r,e);const a=[];let c=0;for(const t of i)a[c++]=[ah(t,n,r),ah(s?e.get(t):e[t],n,r)];return function(e,t){t.mapSorter&&e.sort(t.mapSorter)}(a,n),n.addBreakTokens?[new tu(eu.map,o),a,new tu(eu.break)]:[new tu(eu.map,o),a]}};oh.Map=oh.Object,oh.Buffer=oh.Uint8Array;for(const e of"Uint8Clamped Uint16 Uint32 Int8 Int16 Int32 BigUint64 BigInt64 Float32 Float64".split(" "))oh[`${e}Array`]=oh.DataView;function ah(e,t={},n){const r=Xl(e),s=t&&t.typeEncoders&&t.typeEncoders[r]||oh[r];if("function"==typeof s){const i=s(e,r,t,n);if(null!=i)return i}const i=oh[r];if(!i)throw new Error(`${pu} unsupported type: ${r}`);return i(e,r,t,n)}const ch={strict:!1,allowIndefinite:!0,allowUndefined:!0,allowBigInt:!0};class lh{constructor(e,t={}){this._pos=0,this.data=e,this.options=t}pos(){return this._pos}done(){return this._pos>=this.data.length}next(){const e=this.data[this._pos];let t=rh[e];if(void 0===t){const n=nh[e];if(!n)throw new Error(`${du} no decoder for major type ${e>>>5} (byte 0x${e.toString(16).padStart(2,"0")})`);const r=31&e;t=n(this.data,this._pos,r,this.options)}return this._pos+=t.encodedLength,t}}const uh=Symbol.for("DONE"),hh=Symbol.for("BREAK");function dh(e,t){if(e.done())return uh;const n=e.next();if(n.type===eu.break)return hh;if(n.type.terminal)return n.value;if(n.type===eu.array)return function(e,t,n){const r=[];for(let s=0;s<e.value;s++){const i=dh(t,n);if(i===hh){if(e.value===1/0)break;throw new Error(`${du} got unexpected break to lengthed array`)}if(i===uh)throw new Error(`${du} found array but not enough entries (got ${s}, expected ${e.value})`);r[s]=i}return r}(n,e,t);if(n.type===eu.map)return function(e,t,n){const r=!0===n.useMaps,s=r?void 0:{},i=r?new Map:void 0;for(let o=0;o<e.value;o++){const a=dh(t,n);if(a===hh){if(e.value===1/0)break;throw new Error(`${du} got unexpected break to lengthed map`)}if(a===uh)throw new Error(`${du} found map but not enough entries (got ${o} [no key], expected ${e.value})`);if(!0!==r&&"string"!=typeof a)throw new Error(`${du} non-string keys not supported (got ${typeof a})`);if(!0===n.rejectDuplicateMapKeys&&(r&&i.has(a)||!r&&a in s))throw new Error(`${du} found repeat map key "${a}"`);const c=dh(t,n);if(c===uh)throw new Error(`${du} found map but not enough entries (got ${o} [no value], expected ${e.value})`);r?i.set(a,c):s[a]=c}return r?i:s}(n,e,t);if(n.type===eu.tag){if(t.tags&&"function"==typeof t.tags[n.value]){const r=dh(e,t);return t.tags[n.value](r)}throw new Error(`${du} tag not supported (${n.value})`)}throw new Error("unsupported")}function ph(e,t){const[n,r]=function(e,t){if(!(e instanceof Uint8Array))throw new Error(`${du} data to decode must be a Uint8Array`);const n=(t=Object.assign({},ch,t)).tokenizer||new lh(e,t),r=dh(n,t);if(r===uh)throw new Error(`${du} did not find any content to decode`);if(r===hh)throw new Error(`${du} got unexpected break`);return[r,e.subarray(n.pos())]}(e,t);if(r.length>0)throw new Error(`${du} too many terminals, data makes no sense`);return n}const fh=fs("ipns:utils"),gh=kt("/ipns/"),mh=e=>"signatureV1"in e?Ql.encode({value:kt(e.value),signatureV1:e.signatureV1,validityType:e.validityType,validity:kt(e.validity),sequence:e.sequence,ttl:e.ttl,pubKey:e.pubKey,signatureV2:e.signatureV2,data:e.data}):Ql.encode({pubKey:e.pubKey,signatureV2:e.signatureV2,data:e.data});function yh(e){const t=Ql.decode(e);if(null!=t.sequence&&(t.sequence=BigInt(t.sequence)),null!=t.ttl&&(t.ttl=BigInt(t.ttl)),null==t.signatureV2||null==t.data)throw Vr(new Error("missing data or signatureV2"),Gl);const n=wh(t.data),r=bh(n.Value),s=Qt(n.Validity);if(null!=t.value&&null!=t.signatureV1)return vh(t),{value:r,validityType:Ql.ValidityType.EOL,validity:s,sequence:n.Sequence,ttl:n.TTL,pubKey:t.pubKey,signatureV1:t.signatureV1,signatureV2:t.signatureV2,data:t.data};if(null!=t.signatureV2)return{value:r,validityType:Ql.ValidityType.EOL,validity:s,sequence:n.Sequence,ttl:n.TTL,pubKey:t.pubKey,signatureV2:t.signatureV2,data:t.data};throw new Error("invalid record: does not include signatureV1 or signatureV2")}const wh=e=>{const t=ph(e);if(0!==t.ValidityType)throw Vr(new Error("Unknown validity type"),jl);return t.ValidityType=Ql.ValidityType.EOL,Number.isInteger(t.Sequence)&&(t.Sequence=BigInt(t.Sequence)),Number.isInteger(t.TTL)&&(t.TTL=BigInt(t.TTL)),t},bh=e=>{if(null!=e){if(on(e))return`/ipns/${e.toCID().toString(De)}`;if(e instanceof Uint8Array){const t=Qt(e);t.startsWith("/")&&(e=t)}const t=e.toString().trim();if(t.startsWith("/")&&t.length>1)return t;const n=bt.asCID(e);if(null!=n)return 114===n.code?`/ipns/${n.toString(De)}`:`/ipfs/${n.toV1().toString()}`;try{return e instanceof Uint8Array?`/ipfs/${bt.decode(e).toV1().toString()}`:`/ipfs/${bt.parse(t).toV1().toString()}`}catch{}}throw Vr(new Error("Value must be a valid content path starting with /"),"ERR_INVALID_VALUE")},vh=e=>{if(null==e.data)throw Vr(new Error("Record data is missing"),"ERR_INVALID_RECORD_DATA");const t=wh(e.data);if(!In(t.Value,e.value??new Uint8Array(0)))throw Vr(new Error('Field "value" did not match between protobuf and CBOR'),Gl);if(!In(t.Validity,e.validity??new Uint8Array(0)))throw Vr(new Error('Field "validity" did not match between protobuf and CBOR'),Gl);if(t.ValidityType!==e.validityType)throw Vr(new Error('Field "validityType" did not match between protobuf and CBOR'),Gl);if(t.Sequence!==e.sequence)throw Vr(new Error('Field "sequence" did not match between protobuf and CBOR'),Gl);if(t.TTL!==e.ttl)throw Vr(new Error('Field "ttl" did not match between protobuf and CBOR'),Gl)},Eh=fs("ipns:validator"),Sh=async(e,t)=>{const n=yh(t);let r;try{const t=(s=n.data,Rn([kt("ipns-signature:"),s]));r=await e.verify(t,n.signatureV2)}catch(e){r=!1}var s;if(!r)throw Eh.error("record signature verification failed"),Vr(new Error("record signature verification failed"),Gl);if(n.validityType===Ql.ValidityType.EOL){if(Wl.fromString(n.validity).toDate().getTime()<Date.now())throw Eh.error("record has expired"),Vr(new Error("record has expired"),"ERR_IPNS_EXPIRED_RECORD")}else if(null!=n.validityType)throw Eh.error("unrecognized validity type"),Vr(new Error("unrecognized validity type"),jl);Eh("ipns record for %s is valid",n.value)};async function _h(e,t){if(t.byteLength>10240)throw Vr(new Error("record too large"),"ERR_RECORD_TOO_LARGE");const n=(e=>Rs(e.slice(gh.length)))(e),r=yh(t),s=await(async(e,t)=>{if(null==t||null==e){const e=new Error("one or more of the provided parameters are not defined");throw fh.error(e),Vr(e,Yl)}let n;if(null!=t.pubKey){try{n=Kl(t.pubKey)}catch(e){throw fh.error(e),e}if(!(await As(t.pubKey)).equals(e))throw Vr(new Error("Embedded public key did not match PeerID"),"ERR_INVALID_EMBEDDED_KEY")}else null!=e.publicKey&&(n=Kl(e.publicKey));if(null!=n)return n;throw Vr(new Error("no public key is available"),Yl)})(n,r);await Sh(s,t)}async function*Ih(e){const t=/\r?\n/,n=new TextDecoder("utf8");let r="";for await(let s of e){"string"==typeof s&&(s=(new TextEncoder).encode(s)),r+=n.decode(s,{stream:!0});const e=r.split(t);r=e.pop()??"";for(let t=0;t<e.length;t++)yield JSON.parse(e[t])}r+=n.decode(),""!==r&&(yield JSON.parse(r))}var Rh={exports:{}};!function(e){var t=Object.prototype.hasOwnProperty,n="~";function r(){}function s(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function i(e,t,r,i,o){if("function"!=typeof r)throw new TypeError("The listener must be a function");var a=new s(r,i||e,o),c=n?n+t:t;return e._events[c]?e._events[c].fn?e._events[c]=[e._events[c],a]:e._events[c].push(a):(e._events[c]=a,e._eventsCount++),e}function o(e,t){0==--e._eventsCount?e._events=new r:delete e._events[t]}function a(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),a.prototype.eventNames=function(){var e,r,s=[];if(0===this._eventsCount)return s;for(r in e=this._events)t.call(e,r)&&s.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?s.concat(Object.getOwnPropertySymbols(e)):s},a.prototype.listeners=function(e){var t=n?n+e:e,r=this._events[t];if(!r)return[];if(r.fn)return[r.fn];for(var s=0,i=r.length,o=new Array(i);s<i;s++)o[s]=r[s].fn;return o},a.prototype.listenerCount=function(e){var t=n?n+e:e,r=this._events[t];return r?r.fn?1:r.length:0},a.prototype.emit=function(e,t,r,s,i,o){var a=n?n+e:e;if(!this._events[a])return!1;var c,l,u=this._events[a],h=arguments.length;if(u.fn){switch(u.once&&this.removeListener(e,u.fn,void 0,!0),h){case 1:return u.fn.call(u.context),!0;case 2:return u.fn.call(u.context,t),!0;case 3:return u.fn.call(u.context,t,r),!0;case 4:return u.fn.call(u.context,t,r,s),!0;case 5:return u.fn.call(u.context,t,r,s,i),!0;case 6:return u.fn.call(u.context,t,r,s,i,o),!0}for(l=1,c=new Array(h-1);l<h;l++)c[l-1]=arguments[l];u.fn.apply(u.context,c)}else{var d,p=u.length;for(l=0;l<p;l++)switch(u[l].once&&this.removeListener(e,u[l].fn,void 0,!0),h){case 1:u[l].fn.call(u[l].context);break;case 2:u[l].fn.call(u[l].context,t);break;case 3:u[l].fn.call(u[l].context,t,r);break;case 4:u[l].fn.call(u[l].context,t,r,s);break;default:if(!c)for(d=1,c=new Array(h-1);d<h;d++)c[d-1]=arguments[d];u[l].fn.apply(u[l].context,c)}}return!0},a.prototype.on=function(e,t,n){return i(this,e,t,n,!1)},a.prototype.once=function(e,t,n){return i(this,e,t,n,!0)},a.prototype.removeListener=function(e,t,r,s){var i=n?n+e:e;if(!this._events[i])return this;if(!t)return o(this,i),this;var a=this._events[i];if(a.fn)a.fn!==t||s&&!a.once||r&&a.context!==r||o(this,i);else{for(var c=0,l=[],u=a.length;c<u;c++)(a[c].fn!==t||s&&!a[c].once||r&&a[c].context!==r)&&l.push(a[c]);l.length?this._events[i]=1===l.length?l[0]:l:o(this,i)}return this},a.prototype.removeAllListeners=function(e){var t;return e?(t=n?n+e:e,this._events[t]&&o(this,t)):(this._events=new r,this._eventsCount=0),this},a.prototype.off=a.prototype.removeListener,a.prototype.addListener=a.prototype.on,a.prefixed=n,a.EventEmitter=a,e.exports=a}(Rh);var Ah=Br(Rh.exports);class Th extends Error{constructor(e){super(e),this.name="TimeoutError"}}let Dh=class extends Error{constructor(e){super(),this.name="AbortError",this.message=e}};const kh=e=>void 0===globalThis.DOMException?new Dh(e):new DOMException(e),Ph=e=>{const t=void 0===e.reason?kh("This operation was aborted."):e.reason;return t instanceof Error?t:kh(t)};function Ch(e,t){const{milliseconds:n,fallback:r,message:s,customTimers:i={setTimeout:setTimeout,clearTimeout:clearTimeout}}=t;let o;const a=new Promise(((a,c)=>{if("number"!=typeof n||1!==Math.sign(n))throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${n}\``);if(t.signal){const{signal:e}=t;e.aborted&&c(Ph(e)),e.addEventListener("abort",(()=>{c(Ph(e))}))}if(n===Number.POSITIVE_INFINITY)return void e.then(a,c);const l=new Th;o=i.setTimeout.call(void 0,(()=>{if(r)try{a(r())}catch(e){c(e)}else"function"==typeof e.cancel&&e.cancel(),!1===s?a():s instanceof Error?c(s):(l.message=s??`Promise timed out after ${n} milliseconds`,c(l))}),n),(async()=>{try{a(await e)}catch(e){c(e)}})()})).finally((()=>{a.clear()}));return a.clear=()=>{i.clearTimeout.call(void 0,o),o=void 0},a}let xh=class{#i=[];enqueue(e,t){const n={priority:(t={priority:0,...t}).priority,run:e};if(this.size&&this.#i[this.size-1].priority>=t.priority)return void this.#i.push(n);const r=function(e,t,n){let r=0,s=e.length;for(;s>0;){const i=Math.trunc(s/2);let o=r+i;n(e[o],t)<=0?(r=++o,s-=i+1):s=i}return r}(this.#i,n,((e,t)=>t.priority-e.priority));this.#i.splice(r,0,n)}dequeue(){const e=this.#i.shift();return e?.run}filter(e){return this.#i.filter((t=>t.priority===e.priority)).map((e=>e.run))}get size(){return this.#i.length}};class Nh extends Ah{#o;#a;#c=0;#l;#u;#h=0;#d;#p;#i;#f;#g=0;#m;#y;#w;timeout;constructor(e){if(super(),!("number"==typeof(e={carryoverConcurrencyCount:!1,intervalCap:Number.POSITIVE_INFINITY,interval:0,concurrency:Number.POSITIVE_INFINITY,autoStart:!0,queueClass:xh,...e}).intervalCap&&e.intervalCap>=1))throw new TypeError(`Expected \`intervalCap\` to be a number from 1 and up, got \`${e.intervalCap?.toString()??""}\` (${typeof e.intervalCap})`);if(void 0===e.interval||!(Number.isFinite(e.interval)&&e.interval>=0))throw new TypeError(`Expected \`interval\` to be a finite number >= 0, got \`${e.interval?.toString()??""}\` (${typeof e.interval})`);this.#o=e.carryoverConcurrencyCount,this.#a=e.intervalCap===Number.POSITIVE_INFINITY||0===e.interval,this.#l=e.intervalCap,this.#u=e.interval,this.#i=new e.queueClass,this.#f=e.queueClass,this.concurrency=e.concurrency,this.timeout=e.timeout,this.#w=!0===e.throwOnTimeout,this.#y=!1===e.autoStart}get#b(){return this.#a||this.#c<this.#l}get#v(){return this.#g<this.#m}#E(){this.#g--,this.#S(),this.emit("next")}#_(){this.#I(),this.#R(),this.#p=void 0}get#A(){const e=Date.now();if(void 0===this.#d){const t=this.#h-e;if(!(t<0))return void 0===this.#p&&(this.#p=setTimeout((()=>{this.#_()}),t)),!0;this.#c=this.#o?this.#g:0}return!1}#S(){if(0===this.#i.size)return this.#d&&clearInterval(this.#d),this.#d=void 0,this.emit("empty"),0===this.#g&&this.emit("idle"),!1;if(!this.#y){const e=!this.#A;if(this.#b&&this.#v){const t=this.#i.dequeue();return!!t&&(this.emit("active"),t(),e&&this.#R(),!0)}}return!1}#R(){this.#a||void 0!==this.#d||(this.#d=setInterval((()=>{this.#I()}),this.#u),this.#h=Date.now()+this.#u)}#I(){0===this.#c&&0===this.#g&&this.#d&&(clearInterval(this.#d),this.#d=void 0),this.#c=this.#o?this.#g:0,this.#T()}#T(){for(;this.#S(););}get concurrency(){return this.#m}set concurrency(e){if(!("number"==typeof e&&e>=1))throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${e}\` (${typeof e})`);this.#m=e,this.#T()}async#D(e){return new Promise(((t,n)=>{e.addEventListener("abort",(()=>{n(e.reason)}),{once:!0})}))}async add(e,t={}){return t={timeout:this.timeout,throwOnTimeout:this.#w,...t},new Promise(((n,r)=>{this.#i.enqueue((async()=>{this.#g++,this.#c++;try{t.signal?.throwIfAborted();let r=e({signal:t.signal});t.timeout&&(r=Ch(Promise.resolve(r),{milliseconds:t.timeout})),t.signal&&(r=Promise.race([r,this.#D(t.signal)]));const s=await r;n(s),this.emit("completed",s)}catch(e){if(e instanceof Th&&!t.throwOnTimeout)return void n();r(e),this.emit("error",e)}finally{this.#E()}}),t),this.emit("add"),this.#S()}))}async addAll(e,t){return Promise.all(e.map((async e=>this.add(e,t))))}start(){return this.#y?(this.#y=!1,this.#T(),this):this}pause(){this.#y=!0}clear(){this.#i=new this.#f}async onEmpty(){0!==this.#i.size&&await this.#k("empty")}async onSizeLessThan(e){this.#i.size<e||await this.#k("next",(()=>this.#i.size<e))}async onIdle(){0===this.#g&&0===this.#i.size||await this.#k("idle")}async#k(e,t){return new Promise((n=>{const r=()=>{t&&!t()||(this.off(e,r),n())};this.on(e,r)}))}get size(){return this.#i.size}sizeBy(e){return this.#i.filter(e).length}get pending(){return this.#g}get isPaused(){return this.#y}}function Mh(e){if(null!=e[Symbol.asyncIterator])return(async()=>{for await(const t of e)return t})();for(const t of e)return t}const Oh=kt("/ipns/");function Lh(e){return In(e.subarray(0,Oh.byteLength),Oh)}const Bh=e=>Rs(e.slice(Oh.length));class Uh{client;constructor(e){this.client=e}async*findProviders(e,t={}){yield*zr(this.client.getProviders(e,t),(e=>({id:e.ID,multiaddrs:e.Addrs??[]})))}async provide(){}async put(e,t,n){if(!Lh(e))return;const r=Bh(e),s=yh(t);await this.client.putIPNS(r,s,n)}async get(e,t){if(!Lh(e))throw new fn("Not found","ERR_NOT_FOUND");const n=Bh(e);try{const e=await this.client.getIPNS(n,t);return mh(e)}catch(e){if("ERR_BAD_RESPONSE"===e.code)throw new fn("Not found","ERR_NOT_FOUND");throw e}}}class Fh{client;constructor(e){this.client=e}async findPeer(e,t={}){const n=await Mh(this.client.getPeers(e,t));if(null!=n)return{id:n.ID,multiaddrs:n.Addrs??[]};throw new fn("Not found","ERR_NOT_FOUND")}async*getClosestPeers(e,t={}){}}const Vh=fs("delegated-routing-v1-http-api-client"),Kh=4,$h=3e4;class qh{started;httpQueue;shutDownController;clientUrl;timeout;contentRouting;peerRouting;constructor(e,t={}){this.started=!1,this.shutDownController=new AbortController,this.shutDownController.signal,this.httpQueue=new Nh({concurrency:t.concurrentRequests??Kh}),this.clientUrl=e instanceof URL?e:new URL(e),this.timeout=t.timeout??$h,this.contentRouting=new Uh(this),this.peerRouting=new Fh(this)}get[nn](){return this.contentRouting}get[an](){return this.peerRouting}isStarted(){return this.started}start(){this.started=!0}stop(){this.httpQueue.clear(),this.shutDownController.abort(),this.started=!1}async*getProviders(e,t={}){Vh("getProviders starts: %c",e);const n=AbortSignal.timeout(this.timeout),r=Ts([this.shutDownController.signal,n,t.signal]),s=lr(),i=lr();this.httpQueue.add((async()=>(s.resolve(),i.promise)));try{await s.promise;const t=`${this.clientUrl}routing/v1/providers/${e.toString()}`,n={headers:{Accept:"application/x-ndjson"},signal:r},i=await fetch(t,n);if(404===i.status)throw new fn("No matching records found.","ERR_NOT_FOUND");if(422===i.status)throw new fn("Request does not conform to schema or semantic constraints.","ERR_INVALID_REQUEST");if(null==i.body)throw new fn("Routing response had no body","ERR_BAD_RESPONSE");if("application/json"===i.headers.get("Content-Type")){const e=await i.json();for(const t of e.Providers){const e=this.#P(t);null!=e&&(yield e)}}else for await(const e of Ih(Ds(i.body))){const t=this.#P(e);null!=t&&(yield t)}}catch(e){Vh.error("getProviders errored:",e)}finally{r.clear(),i.resolve(),Vh("getProviders finished: %c",e)}}async*getPeers(e,t={}){Vh("getPeers starts: %c",e);const n=AbortSignal.timeout(this.timeout),r=Ts([this.shutDownController.signal,n,t.signal]),s=lr(),i=lr();this.httpQueue.add((async()=>(s.resolve(),i.promise)));try{await s.promise;const t=`${this.clientUrl}routing/v1/peers/${e.toCID().toString()}`,n={headers:{Accept:"application/x-ndjson"},signal:r},i=await fetch(t,n);if(404===i.status)throw new fn("No matching records found.","ERR_NOT_FOUND");if(422===i.status)throw new fn("Request does not conform to schema or semantic constraints.","ERR_INVALID_REQUEST");if(null==i.body)throw new fn("Routing response had no body","ERR_BAD_RESPONSE");if("application/json"===i.headers.get("Content-Type")){const e=await i.json();for(const t of e.Peers){const e=this.#P(t);null!=e&&(yield e)}}else for await(const e of Ih(Ds(i.body))){const t=this.#P(e);null!=t&&(yield t)}}catch(e){Vh.error("getPeers errored:",e)}finally{r.clear(),i.resolve(),Vh("getPeers finished: %c",e)}}async getIPNS(e,t={}){Vh("getIPNS starts: %c",e);const n=AbortSignal.timeout(this.timeout),r=Ts([this.shutDownController.signal,n,t.signal]),s=lr(),i=lr();this.httpQueue.add((async()=>(s.resolve(),i.promise)));const o=`${this.clientUrl}routing/v1/ipns/${e.toCID().toString()}`;try{await s.promise;const n={headers:{Accept:"application/vnd.ipfs.ipns-record"},signal:r},i=await fetch(o,n);if(Vh("getIPNS GET %s %d",o,i.status),404===i.status)throw new fn("No matching records found.","ERR_NOT_FOUND");if(422===i.status)throw new fn("Request does not conform to schema or semantic constraints.","ERR_INVALID_REQUEST");if(null==i.body)throw new fn("GET ipns response had no body","ERR_BAD_RESPONSE");const a=await i.arrayBuffer(),c=new Uint8Array(a,0,a.byteLength);return!1!==t.validate&&await _h((e=>Rn([gh,e.toBytes()]))(e),c),yh(c)}catch(e){throw Vh.error("getIPNS GET %s error:",o,e),e}finally{r.clear(),i.resolve(),Vh("getIPNS finished: %c",e)}}async putIPNS(e,t,n={}){Vh("putIPNS starts: %c",e);const r=AbortSignal.timeout(this.timeout),s=Ts([this.shutDownController.signal,r,n.signal]),i=lr(),o=lr();this.httpQueue.add((async()=>(i.resolve(),o.promise)));const a=`${this.clientUrl}routing/v1/ipns/${e.toCID().toString()}`;try{await i.promise;const e={method:"PUT",headers:{"Content-Type":"application/vnd.ipfs.ipns-record"},body:mh(t),signal:s},n=await fetch(a,e);if(Vh("putIPNS PUT %s %d",a,n.status),200!==n.status)throw new fn("PUT ipns response had status other than 200","ERR_BAD_RESPONSE")}catch(e){throw Vh.error("putIPNS PUT %s error:",a,e.stack),e}finally{s.clear(),o.resolve(),Vh("putIPNS finished: %c",e)}}#P(e){const t=[],n=e.Addrs?.map(cr)??[];return null!=e.Protocols&&t.push(...e.Protocols),null!=e.Protocol&&(t.push(e.Protocol),delete e.Protocol),{...e,Schema:"peer",ID:Is(e.ID),Addrs:n,Protocols:t}}}function Hh(e,t={}){return new qh(new URL(e),t)}function zh(e,t){const n={[Symbol.iterator]:()=>n,next:()=>{const n=e.next(),r=n.value;if(!0===n.done||null==r){return{done:!0,value:void 0}}return{done:!1,value:t(r)}}};return n}class Wh{map;constructor(e){if(this.map=new Map,null!=e)for(const[t,n]of e.entries())this.map.set(t.toString(),n)}[Symbol.iterator](){return this.entries()}clear(){this.map.clear()}delete(e){return this.map.delete(e.toString())}entries(){return zh(this.map.entries(),(e=>[Is(e[0]),e[1]]))}forEach(e){this.map.forEach(((t,n)=>{e(t,Is(n),this)}))}get(e){return this.map.get(e.toString())}has(e){return this.map.has(e.toString())}set(e,t){this.map.set(e.toString(),t)}keys(){return zh(this.map.keys(),(e=>Is(e)))}values(){return this.map.values()}get size(){return this.map.size}}class jh{set;constructor(e){if(this.set=new Set,null!=e)for(const t of e)this.set.add(t.toString())}get size(){return this.set.size}[Symbol.iterator](){return this.values()}add(e){this.set.add(e.toString())}clear(){this.set.clear()}delete(e){this.set.delete(e.toString())}entries(){return zh(this.set.entries(),(e=>{const t=Is(e[0]);return[t,t]}))}forEach(e){this.set.forEach((t=>{const n=Is(t);e(n,n,this)}))}has(e){return this.set.has(e.toString())}values(){return zh(this.set.values(),(e=>Is(e)))}intersection(e){const t=new jh;for(const n of e)this.has(n)&&t.add(n);return t}difference(e){const t=new jh;for(const n of this)e.has(n)||t.add(n);return t}union(e){const t=new jh;for(const n of e)t.add(n);for(const e of this)t.add(e);return t}}const Gh=async()=>{const e=await async function(e,t){return Vl(e).generateKeyPair(2048)}("Ed25519"),t=await async function(e){return As($l(e.public),function(e,t){return Vl(t=(t??"rsa").toLowerCase()),e.bytes}(e))}(e);if("Ed25519"===t.type)return t;throw new Error(`Generated unexpected PeerId type "${t.type}"`)};const Yh="ERR_SIGNATURE_NOT_VALID";var Qh;!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.publicKey&&e.publicKey.byteLength>0&&(t.uint32(10),t.bytes(e.publicKey)),null!=e.payloadType&&e.payloadType.byteLength>0&&(t.uint32(18),t.bytes(e.payloadType)),null!=e.payload&&e.payload.byteLength>0&&(t.uint32(26),t.bytes(e.payload)),null!=e.signature&&e.signature.byteLength>0&&(t.uint32(42),t.bytes(e.signature)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={publicKey:new Uint8Array(0),payloadType:new Uint8Array(0),payload:new Uint8Array(0),signature:new Uint8Array(0)},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.publicKey=e.bytes();break;case 2:n.payloadType=e.bytes();break;case 3:n.payload=e.bytes();break;case 5:n.signature=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Qh||(Qh={}));class Jh{static createFromProtobuf=async e=>{const t=Qh.decode(e),n=await As(t.publicKey);return new Jh({peerId:n,payloadType:t.payloadType,payload:t.payload,signature:t.signature})};static seal=async(e,t)=>{if(null==t.privateKey)throw new Error("Missing private key");const n=e.domain,r=e.codec,s=e.marshal(),i=Zh(n,r,s),o=await ql(t.privateKey),a=await o.sign(i.subarray());return new Jh({peerId:t,payloadType:r,payload:s,signature:a})};static openAndCertify=async(e,t)=>{const n=await Jh.createFromProtobuf(e);if(!await n.validate(t))throw new fn("envelope signature is not valid for the given domain",Yh);return n};peerId;payloadType;payload;signature;marshaled;constructor(e){const{peerId:t,payloadType:n,payload:r,signature:s}=e;this.peerId=t,this.payloadType=n,this.payload=r,this.signature=s}marshal(){if(null==this.peerId.publicKey)throw new Error("Missing public key");return null==this.marshaled&&(this.marshaled=Qh.encode({publicKey:this.peerId.publicKey,payloadType:this.payloadType,payload:this.payload.subarray(),signature:this.signature})),this.marshaled}equals(e){return In(this.marshal(),e.marshal())}async validate(e){const t=Zh(e,this.payloadType,this.payload);if(null==this.peerId.publicKey)throw new Error("Missing public key");return Kl(this.peerId.publicKey).verify(t.subarray(),this.signature)}}const Zh=(e,t,n)=>{const r=kt(e),s=C(r.byteLength),i=C(t.length),o=C(n.length);return new Ir(s,r,i,t,o,n)};const Xh=Uint8Array.from([3,1]);var ed;!function(e){let t;!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.multiaddr&&e.multiaddr.byteLength>0&&(t.uint32(10),t.bytes(e.multiaddr)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={multiaddr:new Uint8Array(0)},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();if(t>>>3==1)n.multiaddr=e.bytes();else e.skipType(7&t)}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(e.AddressInfo||(e.AddressInfo={})),e.codec=()=>(null==t&&(t=jt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.peerId&&t.peerId.byteLength>0&&(n.uint32(10),n.bytes(t.peerId)),null!=t.seq&&0n!==t.seq&&(n.uint32(16),n.uint64(t.seq)),null!=t.addresses)for(const r of t.addresses)n.uint32(26),e.AddressInfo.codec().encode(r,n);!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={peerId:new Uint8Array(0),seq:0n,addresses:[]},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.peerId=t.bytes();break;case 2:r.seq=t.uint64();break;case 3:r.addresses.push(e.AddressInfo.codec().decode(t,t.uint32()));break;default:t.skipType(7&n)}}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(ed||(ed={}));class td{static createFromProtobuf=e=>{const t=ed.decode(e),n=Rs(t.peerId),r=(t.addresses??[]).map((e=>cr(e.multiaddr))),s=t.seq;return new td({peerId:n,multiaddrs:r,seqNumber:s})};static DOMAIN="libp2p-peer-record";static CODEC=Xh;peerId;multiaddrs;seqNumber;domain=td.DOMAIN;codec=td.CODEC;marshaled;constructor(e){const{peerId:t,multiaddrs:n,seqNumber:r}=e;this.peerId=t,this.multiaddrs=n??[],this.seqNumber=r??BigInt(Date.now())}marshal(){return null==this.marshaled&&(this.marshaled=ed.encode({peerId:this.peerId.toBytes(),seq:BigInt(this.seqNumber),addresses:this.multiaddrs.map((e=>({multiaddr:e.bytes})))})),this.marshaled}equals(e){return e instanceof td&&(!!this.peerId.equals(e.peerId)&&(this.seqNumber===e.seqNumber&&!!function(e,t){const n=(e,t)=>e.toString().localeCompare(t.toString());return e.length===t.length&&(t.sort(n),e.sort(n).every(((e,n)=>t[n].equals(e))))}(this.multiaddrs,e.multiaddrs)))}}function nd(e){if(null!=e[Symbol.asyncIterator])return(async()=>{const t=[];for await(const n of e)t.push(n);return t})();const t=[];for(const n of e)t.push(n);return t}const rd={},sd=e=>{e.addEventListener("message",(t=>{sd.dispatchEvent("message",e,t)})),null!=e.port&&e.port.addEventListener("message",(t=>{sd.dispatchEvent("message",e,t)}))};sd.addEventListener=(e,t)=>{null==rd[e]&&(rd[e]=[]),rd[e].push(t)},sd.removeEventListener=(e,t)=>{null!=rd[e]&&(rd[e]=rd[e].filter((e=>e===t)))},sd.dispatchEvent=function(e,t,n){null!=rd[e]&&rd[e].forEach((e=>e(t,n)))};const id="lock:worker:request-read",od="lock:worker:release-read",ad="lock:master:grant-read",cd="lock:worker:request-write",ld="lock:worker:release-write",ud="lock:master:grant-write",hd=(e,t,n,r,s)=>(i,o)=>{if(o.data.type!==n)return;const a={type:o.data.type,name:o.data.name,identifier:o.data.identifier};e.dispatchEvent(new MessageEvent(t,{data:{name:a.name,handler:async()=>{i.postMessage({type:s,name:a.name,identifier:a.identifier}),await new Promise((e=>{const t=n=>{if(null==n||null==n.data)return;const s=n.data.type,o=(n.data.name,n.data.identifier);s===r&&o===a.identifier&&(i.removeEventListener("message",t),e())};i.addEventListener("message",t)}))}}}))},dd=(e,t,n,r)=>async()=>{const s=Math.random().toString().substring(2);return globalThis.postMessage({type:t,identifier:s,name:e}),new Promise((t=>{const i=o=>{if(null==o||null==o.data)return;const a=o.data.type,c=o.data.identifier;a===n&&c===s&&(globalThis.removeEventListener("message",i),t((()=>{globalThis.postMessage({type:r,identifier:s,name:e})})))};globalThis.addEventListener("message",i)}))},pd={singleProcess:!1};const fd={};let gd;async function md(e,t){let n;const r=new Promise((e=>{n=e}));return e.add((async()=>Ch((async()=>{await new Promise((e=>{n((()=>{e()}))}))})(),{milliseconds:t.timeout}))),r}const yd={name:"lock",concurrency:1/0,timeout:846e5,singleProcess:!1};function wd(e){const t=Object.assign({},yd,e);return null==gd&&(gd=(e=>{if(e=Object.assign({},pd,e),Boolean(globalThis.document)||e.singleProcess){const e=new EventTarget;return sd.addEventListener("message",hd(e,"requestReadLock",id,od,ad)),sd.addEventListener("message",hd(e,"requestWriteLock",cd,ld,ud)),e}return{isWorker:!0,readLock:e=>dd(e,id,ad,od),writeLock:e=>dd(e,cd,ud,ld)}})(t),!0!==gd.isWorker&&(gd.addEventListener("requestReadLock",(e=>{null!=fd[e.data.name]&&fd[e.data.name].readLock().then((async t=>e.data.handler().finally((()=>{t()}))))})),gd.addEventListener("requestWriteLock",(async e=>{null!=fd[e.data.name]&&fd[e.data.name].writeLock().then((async t=>e.data.handler().finally((()=>{t()}))))})))),null==fd[t.name]&&(fd[t.name]=((e,t)=>{if(!0===gd.isWorker)return{readLock:gd.readLock(e,t),writeLock:gd.writeLock(e,t)};const n=new Nh({concurrency:1});let r;return{async readLock(){if(null!=r)return md(r,t);r=new Nh({concurrency:t.concurrency,autoStart:!1});const e=r,s=md(r,t);return n.add((async()=>{e.start(),await e.onIdle().then((()=>{r===e&&(r=null)}))})),s},writeLock:async()=>(r=null,md(n,t))}})(t.name,t)),fd[t.name]}const bd={ERR_INVALID_PARAMETERS:"ERR_INVALID_PARAMETERS"};var vd,Ed,Sd;function _d(e,t){const n=vd.decode(t);null!=n.publicKey&&null==e.publicKey&&(e=function(e){if("RSA"===e.type)return new Es(e);if("Ed25519"===e.type)return new Ss(e);if("secp256k1"===e.type)return new _s(e);throw new fn("Not a PeerId","ERR_INVALID_PARAMETERS")}({...e,publicKey:e.publicKey}));const r=new Map,s=BigInt(Date.now());for(const[e,t]of n.tags.entries())null!=t.expiry&&t.expiry<s||r.set(e,t);return{...n,id:e,addresses:n.addresses.map((({multiaddr:e,isCertified:t})=>({multiaddr:cr(e),isCertified:t??!1}))),metadata:n.metadata,peerRecordEnvelope:n.peerRecordEnvelope??void 0,tags:r}}!function(e){let t;!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.key&&""!==e.key&&(t.uint32(10),t.string(e.key)),null!=e.value&&e.value.byteLength>0&&(t.uint32(18),t.bytes(e.value)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={key:"",value:new Uint8Array(0)},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.key=e.string();break;case 2:n.value=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(e.Peer$metadataEntry||(e.Peer$metadataEntry={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.key&&""!==e.key&&(t.uint32(10),t.string(e.key)),null!=e.value&&(t.uint32(18),Sd.codec().encode(e.value,t)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={key:""},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.key=e.string();break;case 2:n.value=Sd.codec().decode(e,e.uint32());break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(e.Peer$tagsEntry||(e.Peer$tagsEntry={})),e.codec=()=>(null==t&&(t=jt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.addresses)for(const e of t.addresses)n.uint32(10),Ed.codec().encode(e,n);if(null!=t.protocols)for(const e of t.protocols)n.uint32(18),n.string(e);if(null!=t.publicKey&&(n.uint32(34),n.bytes(t.publicKey)),null!=t.peerRecordEnvelope&&(n.uint32(42),n.bytes(t.peerRecordEnvelope)),null!=t.metadata&&0!==t.metadata.size)for(const[r,s]of t.metadata.entries())n.uint32(50),e.Peer$metadataEntry.codec().encode({key:r,value:s},n);if(null!=t.tags&&0!==t.tags.size)for(const[r,s]of t.tags.entries())n.uint32(58),e.Peer$tagsEntry.codec().encode({key:r,value:s},n);!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={addresses:[],protocols:[],metadata:new Map,tags:new Map},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.addresses.push(Ed.codec().decode(t,t.uint32()));break;case 2:r.protocols.push(t.string());break;case 4:r.publicKey=t.bytes();break;case 5:r.peerRecordEnvelope=t.bytes();break;case 6:{const n=e.Peer$metadataEntry.codec().decode(t,t.uint32());r.metadata.set(n.key,n.value);break}case 7:{const n=e.Peer$tagsEntry.codec().decode(t,t.uint32());r.tags.set(n.key,n.value);break}default:t.skipType(7&n)}}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(vd||(vd={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.multiaddr&&e.multiaddr.byteLength>0&&(t.uint32(10),t.bytes(e.multiaddr)),null!=e.isCertified&&(t.uint32(16),t.bool(e.isCertified)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={multiaddr:new Uint8Array(0)},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.multiaddr=e.bytes();break;case 2:n.isCertified=e.bool();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Ed||(Ed={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.value&&0!==e.value&&(t.uint32(8),t.uint32(e.value)),null!=e.expiry&&(t.uint32(16),t.uint64(e.expiry)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={value:0},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.value=e.uint32();break;case 2:n.expiry=e.uint64();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Sd||(Sd={}));const Id="/peers/";function Rd(e){if(!on(e)||null==e.type)throw new fn("Invalid PeerId",bd.ERR_INVALID_PARAMETERS);const t=e.toCID().toString();return new en(`${Id}${t}`)}async function Ad(e,t,n){const r=new Map;for(const s of n){if(null==s)continue;if(s.multiaddr instanceof Uint8Array&&(s.multiaddr=cr(s.multiaddr)),!ar(s.multiaddr))throw new fn("Multiaddr was invalid",bd.ERR_INVALID_PARAMETERS);if(!await t(e,s.multiaddr))continue;const n=s.isCertified??!1,i=s.multiaddr.toString(),o=r.get(i);null!=o?s.isCertified=o.isCertified||n:r.set(i,{multiaddr:s.multiaddr,isCertified:n})}return[...r.values()].sort(((e,t)=>e.multiaddr.toString().localeCompare(t.multiaddr.toString()))).map((({isCertified:e,multiaddr:t})=>({isCertified:e,multiaddr:t.bytes})))}async function Td(e,t,n,r){if(null==t)throw new fn("Invalid PeerData",bd.ERR_INVALID_PARAMETERS);if(null!=t.publicKey&&null!=e.publicKey&&!In(t.publicKey,e.publicKey))throw new fn("publicKey bytes do not match peer id publicKey bytes",bd.ERR_INVALID_PARAMETERS);const s=r.existingPeer;if(null!=s&&!e.equals(s.id))throw new fn("peer id did not match existing peer id",bd.ERR_INVALID_PARAMETERS);let i=s?.addresses??[],o=new Set(s?.protocols??[]),a=s?.metadata??new Map,c=s?.tags??new Map,l=s?.peerRecordEnvelope;if("patch"===n){if(null==t.multiaddrs&&null==t.addresses||(i=[],null!=t.multiaddrs&&i.push(...t.multiaddrs.map((e=>({isCertified:!1,multiaddr:e})))),null!=t.addresses&&i.push(...t.addresses)),null!=t.protocols&&(o=new Set(t.protocols)),null!=t.metadata){a=Dd(t.metadata instanceof Map?[...t.metadata.entries()]:Object.entries(t.metadata),{validate:kd})}if(null!=t.tags){c=Dd(t.tags instanceof Map?[...t.tags.entries()]:Object.entries(t.tags),{validate:Pd,map:Cd})}null!=t.peerRecordEnvelope&&(l=t.peerRecordEnvelope)}if("merge"===n){if(null!=t.multiaddrs&&i.push(...t.multiaddrs.map((e=>({isCertified:!1,multiaddr:e})))),null!=t.addresses&&i.push(...t.addresses),null!=t.protocols&&(o=new Set([...o,...t.protocols])),null!=t.metadata){const e=t.metadata instanceof Map?[...t.metadata.entries()]:Object.entries(t.metadata);for(const[t,n]of e)null==n?a.delete(t):a.set(t,n);a=Dd([...a.entries()],{validate:kd})}if(null!=t.tags){const e=t.tags instanceof Map?[...t.tags.entries()]:Object.entries(t.tags),n=new Map(c);for(const[t,r]of e)null==r?n.delete(t):n.set(t,r);c=Dd([...n.entries()],{validate:Pd,map:Cd})}null!=t.peerRecordEnvelope&&(l=t.peerRecordEnvelope)}const u={addresses:await Ad(e,r.addressFilter??(async()=>!0),i),protocols:[...o.values()].sort(((e,t)=>e.localeCompare(t))),metadata:a,tags:c,publicKey:s?.id.publicKey??t.publicKey??e.publicKey,peerRecordEnvelope:l};return"RSA"!==e.type&&delete u.publicKey,u}function Dd(e,t){const n=new Map;for(const[n,r]of e)null!=r&&t.validate(n,r);for(const[r,s]of e.sort((([e],[t])=>e.localeCompare(t))))null!=s&&n.set(r,t.map?.(r,s)??s);return n}function kd(e,t){if("string"!=typeof e)throw new fn("Metadata key must be a string",bd.ERR_INVALID_PARAMETERS);if(!(t instanceof Uint8Array))throw new fn("Metadata value must be a Uint8Array",bd.ERR_INVALID_PARAMETERS)}function Pd(e,t){if("string"!=typeof e)throw new fn("Tag name must be a string",bd.ERR_INVALID_PARAMETERS);if(null!=t.value){if(parseInt(`${t.value}`,10)!==t.value)throw new fn("Tag value must be an integer",bd.ERR_INVALID_PARAMETERS);if(t.value<0||t.value>100)throw new fn("Tag value must be between 0-100",bd.ERR_INVALID_PARAMETERS)}if(null!=t.ttl){if(parseInt(`${t.ttl}`,10)!==t.ttl)throw new fn("Tag ttl must be an integer",bd.ERR_INVALID_PARAMETERS);if(t.ttl<0)throw new fn("Tag ttl must be between greater than 0",bd.ERR_INVALID_PARAMETERS)}}function Cd(e,t){let n;return null!=t.expiry&&(n=t.expiry),null!=t.ttl&&(n=BigInt(Date.now()+Number(t.ttl))),{value:t.value??0,expiry:n}}function xd(e,t,n){const r=e.toString().split("/")[2],s=Rs(we.decode(r)),i=n.get(s);if(null!=i)return i;const o=_d(s,t);return n.set(s,o),o}class Nd{peerId;datastore;lock;addressFilter;constructor(e,t={}){this.peerId=e.peerId,this.datastore=e.datastore,this.addressFilter=t.addressFilter,this.lock=wd({name:"peer-store",singleProcess:!0})}async has(e){return this.datastore.has(Rd(e))}async delete(e){if(this.peerId.equals(e))throw new fn("Cannot delete self peer",bd.ERR_INVALID_PARAMETERS);await this.datastore.delete(Rd(e))}async load(e){return _d(e,await this.datastore.get(Rd(e)))}async save(e,t){const{existingBuf:n,existingPeer:r}=await this.#C(e),s=await Td(e,t,"patch",{addressFilter:this.addressFilter});return this.#x(e,s,n,r)}async patch(e,t){const{existingBuf:n,existingPeer:r}=await this.#C(e),s=await Td(e,t,"patch",{addressFilter:this.addressFilter,existingPeer:r});return this.#x(e,s,n,r)}async merge(e,t){const{existingBuf:n,existingPeer:r}=await this.#C(e),s=await Td(e,t,"merge",{addressFilter:this.addressFilter,existingPeer:r});return this.#x(e,s,n,r)}async*all(e){const t=new Wh;for await(const{key:n,value:r}of this.datastore.query(function(e,t){return null==e?{}:{prefix:Id,filters:(e.filters??[]).map((e=>({key:n,value:r})=>e(xd(n,r,t)))),orders:(e.orders??[]).map((e=>(n,r)=>e(xd(n.key,n.value,t),xd(r.key,r.value,t))))}}(e??{},t))){const e=xd(n,r,t);e.id.equals(this.peerId)||(yield e)}}async#C(e){try{const t=await this.datastore.get(Rd(e));return{existingBuf:t,existingPeer:_d(e,t)}}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}return{}}async#x(e,t,n,r){const s=vd.encode(t);return null!=n&&In(s,n)?{peer:_d(e,s),previous:r,updated:!1}:(await this.datastore.put(Rd(e),s),{peer:_d(e,s),previous:r,updated:!0})}}class Md{store;events;peerId;log;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:peer-store"),this.events=e.events,this.peerId=e.peerId,this.store=new Nd(e,t)}async forEach(e,t){this.log.trace("forEach await read lock");const n=await this.store.lock.readLock();this.log.trace("forEach got read lock");try{for await(const n of this.store.all(t))e(n)}finally{this.log.trace("forEach release read lock"),n()}}async all(e){this.log.trace("all await read lock");const t=await this.store.lock.readLock();this.log.trace("all got read lock");try{return await nd(this.store.all(e))}finally{this.log.trace("all release read lock"),t()}}async delete(e){this.log.trace("delete await write lock");const t=await this.store.lock.writeLock();this.log.trace("delete got write lock");try{await this.store.delete(e)}finally{this.log.trace("delete release write lock"),t()}}async has(e){this.log.trace("has await read lock");const t=await this.store.lock.readLock();this.log.trace("has got read lock");try{return await this.store.has(e)}finally{this.log.trace("has release read lock"),t()}}async get(e){this.log.trace("get await read lock");const t=await this.store.lock.readLock();this.log.trace("get got read lock");try{return await this.store.load(e)}finally{this.log.trace("get release read lock"),t()}}async save(e,t){this.log.trace("save await write lock");const n=await this.store.lock.writeLock();this.log.trace("save got write lock");try{const n=await this.store.save(e,t);return this.#N(e,n),n.peer}finally{this.log.trace("save release write lock"),n()}}async patch(e,t){this.log.trace("patch await write lock");const n=await this.store.lock.writeLock();this.log.trace("patch got write lock");try{const n=await this.store.patch(e,t);return this.#N(e,n),n.peer}finally{this.log.trace("patch release write lock"),n()}}async merge(e,t){this.log.trace("merge await write lock");const n=await this.store.lock.writeLock();this.log.trace("merge got write lock");try{const n=await this.store.merge(e,t);return this.#N(e,n),n.peer}finally{this.log.trace("merge release write lock"),n()}}async consumePeerRecord(e,t){const n=await Jh.openAndCertify(e,td.DOMAIN);if(!1===t?.equals(n.peerId))return this.log("envelope peer id was not the expected peer id - expected: %p received: %p",t,n.peerId),!1;const r=td.createFromProtobuf(n.payload);let s;try{s=await this.get(n.peerId)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}if(null!=s?.peerRecordEnvelope){const e=await Jh.createFromProtobuf(s.peerRecordEnvelope),t=td.createFromProtobuf(e.payload);if(t.seqNumber>=r.seqNumber)return this.log("sequence number was lower or equal to existing sequence number - stored: %d received: %d",t.seqNumber,r.seqNumber),!1}return await this.patch(r.peerId,{peerRecordEnvelope:e,addresses:r.multiaddrs.map((e=>({isCertified:!0,multiaddr:e})))}),!0}#N(e,t){t.updated&&(this.peerId.equals(e)?this.events.safeDispatchEvent("self:peer:update",{detail:t}):this.events.safeDispatchEvent("peer:update",{detail:t}))}}function Od(e){if(null!=e[Symbol.asyncIterator])return(async()=>{for await(const t of e);})();for(const t of e);}function Ld(e,t){let n=0;if(null!=e[Symbol.asyncIterator])return async function*(){for await(const r of e)await t(r,n++)&&(yield r)}();const r=Hr(e),{value:s,done:i}=r.next();if(!0===i)return function*(){}();const o=t(s,n++);if("function"==typeof o.then)return async function*(){await o&&(yield s);for await(const e of r)await t(e,n++)&&(yield e)}();const a=t;return function*(){!0===o&&(yield s);for(const e of r)a(e,n++)&&(yield e)}()}function Bd(e,t){return null!=e[Symbol.asyncIterator]?async function*(){const n=await nd(e);yield*n.sort(t)}():function*(){const n=nd(e);yield*n.sort(t)}()}function Ud(e,t){return null!=e[Symbol.asyncIterator]?async function*(){let n=0;if(!(t<1))for await(const r of e)if(yield r,n++,n===t)return}():function*(){let n=0;if(!(t<1))for(const r of e)if(yield r,n++,n===t)return}()}class Fd{put(e,t,n){return Promise.reject(new Error(".put is not implemented"))}get(e,t){return Promise.reject(new Error(".get is not implemented"))}has(e,t){return Promise.reject(new Error(".has is not implemented"))}delete(e,t){return Promise.reject(new Error(".delete is not implemented"))}async*putMany(e,t={}){for await(const{key:n,value:r}of e)await this.put(n,r,t),yield n}async*getMany(e,t={}){for await(const n of e)yield{key:n,value:await this.get(n,t)}}async*deleteMany(e,t={}){for await(const n of e)await this.delete(n,t),yield n}batch(){let e=[],t=[];return{put(t,n){e.push({key:t,value:n})},delete(e){t.push(e)},commit:async n=>{await Od(this.putMany(e,n)),e=[],await Od(this.deleteMany(t,n)),t=[]}}}async*_all(e,t){throw new Error("._all is not implemented")}async*_allKeys(e,t){throw new Error("._allKeys is not implemented")}query(e,t){let n=this._all(e,t);if(null!=e.prefix){const t=e.prefix;n=Ld(n,(e=>e.key.toString().startsWith(t)))}if(Array.isArray(e.filters)&&(n=e.filters.reduce(((e,t)=>Ld(e,t)),n)),Array.isArray(e.orders)&&(n=e.orders.reduce(((e,t)=>Bd(e,t)),n)),null!=e.offset){let t=0;const r=e.offset;n=Ld(n,(()=>t++>=r))}return null!=e.limit&&(n=Ud(n,e.limit)),n}queryKeys(e,t){let n=this._allKeys(e,t);if(null!=e.prefix){const t=e.prefix;n=Ld(n,(e=>e.toString().startsWith(t)))}if(Array.isArray(e.filters)&&(n=e.filters.reduce(((e,t)=>Ld(e,t)),n)),Array.isArray(e.orders)&&(n=e.orders.reduce(((e,t)=>Bd(e,t)),n)),null!=e.offset){const t=e.offset;let r=0;n=Ld(n,(()=>r++>=t))}return null!=e.limit&&(n=Ud(n,e.limit)),n}}function Vd(e){return e=e??new Error("Read failed"),Vr(e,"ERR_DB_READ_FAILED")}function Kd(e){return e=e??new Error("Not Found"),Vr(e,"ERR_NOT_FOUND")}class $d extends Fd{data;constructor(){super(),this.data=new Map}put(e,t){return this.data.set(e.toString(),t),e}get(e){const t=this.data.get(e.toString());if(null==t)throw Kd();return t}has(e){return this.data.has(e.toString())}delete(e){this.data.delete(e.toString())}*_all(){for(const[e,t]of this.data.entries())yield{key:new en(e),value:t}}*_allKeys(){for(const e of this.data.keys())yield new en(e)}}const qd=e=>e;function Hd(e,t){const n=e.getPeerId();if(null!=n){Is(n).equals(t)&&(e=e.decapsulate(cr(`/p2p/${t.toString()}`)))}return e}class zd{log;components;listen;announce;observed;announceFilter;constructor(e,t={}){const{listen:n=[],announce:r=[]}=t;this.components=e,this.log=e.logger.forComponent("libp2p:address-manager"),this.listen=n.map((e=>e.toString())),this.announce=new Set(r.map((e=>e.toString()))),this.observed=new Map,this.announceFilter=t.announceFilter??qd,this._updatePeerStoreAddresses=function(e,t){let n;return function(){clearTimeout(n),n=setTimeout((function(){n=void 0,e()}),t)}}(this._updatePeerStoreAddresses.bind(this),1e3),e.events.addEventListener("transport:listening",(()=>{this._updatePeerStoreAddresses()})),e.events.addEventListener("transport:close",(()=>{this._updatePeerStoreAddresses()}))}_updatePeerStoreAddresses(){const e=this.getAnnounceAddrs().concat(this.components.transportManager.getAddrs()).concat([...this.observed.entries()].filter((([e,t])=>t.confident)).map((([e])=>cr(e)))).map((e=>e.getPeerId()===this.components.peerId.toString()?e.decapsulate(`/p2p/${this.components.peerId.toString()}`):e));this.components.peerStore.patch(this.components.peerId,{multiaddrs:e}).catch((e=>{this.log.error("error updating addresses",e)}))}getListenAddrs(){return Array.from(this.listen).map((e=>cr(e)))}getAnnounceAddrs(){return Array.from(this.announce).map((e=>cr(e)))}getObservedAddrs(){return Array.from(this.observed).map((([e])=>cr(e)))}addObservedAddr(e){const t=(e=Hd(e,this.components.peerId)).toString();this.observed.has(t)||this.observed.set(t,{confident:!1})}confirmObservedAddr(e){const t=(e=Hd(e,this.components.peerId)).toString(),n=(this.observed.get(t)??{confident:!1}).confident;this.observed.set(t,{confident:!0}),n||this._updatePeerStoreAddresses()}removeObservedAddr(e){const t=(e=Hd(e,this.components.peerId)).toString();this.observed.delete(t)}getAddresses(){let e=this.getAnnounceAddrs().map((e=>e.toString()));0===e.length&&(e=this.components.transportManager.getAddrs().map((e=>e.toString()))),e=e.concat(Array.from(this.observed).filter((([e,t])=>t.confident)).map((([e])=>e)));const t=new Set(e);return this.announceFilter(Array.from(t).map((e=>cr(e)))).map((e=>!0===e.protos().pop()?.path||e.getPeerId()===this.components.peerId.toString()?e:e.encapsulate(`/p2p/${this.components.peerId.toString()}`)))}}class Wd{components={};_started=!1;constructor(e={}){this.components={};for(const[t,n]of Object.entries(e))this.components[t]=n;null==this.components.logger&&(this.components.logger=ps())}isStarted(){return this._started}async _invokeStartableMethod(e){await Promise.all(Object.values(this.components).filter((e=>En(e))).map((async t=>{await(t[e]?.())})))}async beforeStart(){await this._invokeStartableMethod("beforeStart")}async start(){await this._invokeStartableMethod("start"),this._started=!0}async afterStart(){await this._invokeStartableMethod("afterStart")}async beforeStop(){await this._invokeStartableMethod("beforeStop")}async stop(){await this._invokeStartableMethod("stop"),this._started=!1}async afterStop(){await this._invokeStartableMethod("afterStop")}}const jd=["metrics","connectionProtector","dns"],Gd=["components","isStarted","beforeStart","start","afterStart","beforeStop","stop","afterStop","then","_invokeStartableMethod"];var Yd;(function(){var e,t,n,r,s,i,o,a;a=function(e){return[(e&255<<24)>>>24,(e&255<<16)>>>16,(65280&e)>>>8,255&e].join(".")},o=function(e){var n,r,s,i,o,a;for(n=[],s=i=0;i<=3&&0!==e.length;s=++i){if(s>0){if("."!==e[0])throw new Error("Invalid IP");e=e.substring(1)}o=(a=t(e))[0],r=a[1],e=e.substring(r),n.push(o)}if(0!==e.length)throw new Error("Invalid IP");switch(n.length){case 1:if(n[0]>4294967295)throw new Error("Invalid IP");return n[0]>>>0;case 2:if(n[0]>255||n[1]>16777215)throw new Error("Invalid IP");return(n[0]<<24|n[1])>>>0;case 3:if(n[0]>255||n[1]>255||n[2]>65535)throw new Error("Invalid IP");return(n[0]<<24|n[1]<<16|n[2])>>>0;case 4:if(n[0]>255||n[1]>255||n[2]>255||n[3]>255)throw new Error("Invalid IP");return(n[0]<<24|n[1]<<16|n[2]<<8|n[3])>>>0;default:throw new Error("Invalid IP")}},r=(n=function(e){return e.charCodeAt(0)})("0"),i=n("a"),s=n("A"),t=function(e){var t,o,a,c,l;for(c=0,t=10,o="9",a=0,e.length>1&&"0"===e[a]&&("x"===e[a+1]||"X"===e[a+1]?(a+=2,t=16):"0"<=e[a+1]&&e[a+1]<="9"&&(a++,t=8,o="7")),l=a;a<e.length;){if("0"<=e[a]&&e[a]<=o)c=c*t+(n(e[a])-r)>>>0;else{if(16!==t)break;if("a"<=e[a]&&e[a]<="f")c=c*t+(10+n(e[a])-i)>>>0;else{if(!("A"<=e[a]&&e[a]<="F"))break;c=c*t+(10+n(e[a])-s)>>>0}}if(c>4294967295)throw new Error("too large");a++}if(a===l)throw new Error("empty octet");return[c,a]},e=function(){function e(e,t){var n,r,s;if("string"!=typeof e)throw new Error("Missing `net' parameter");if(t||(s=e.split("/",2),e=s[0],t=s[1]),t||(t=32),"string"==typeof t&&t.indexOf(".")>-1){try{this.maskLong=o(t)}catch(e){throw new Error("Invalid mask: "+t)}for(n=r=32;r>=0;n=--r)if(this.maskLong===4294967295<<32-n>>>0){this.bitmask=n;break}}else{if(!t&&0!==t)throw new Error("Invalid mask: empty");this.bitmask=parseInt(t,10),this.maskLong=0,this.bitmask>0&&(this.maskLong=4294967295<<32-this.bitmask>>>0)}try{this.netLong=(o(e)&this.maskLong)>>>0}catch(t){throw new Error("Invalid net address: "+e)}if(!(this.bitmask<=32))throw new Error("Invalid mask for ip4: "+t);this.size=Math.pow(2,32-this.bitmask),this.base=a(this.netLong),this.mask=a(this.maskLong),this.hostmask=a(~this.maskLong),this.first=this.bitmask<=30?a(this.netLong+1):this.base,this.last=this.bitmask<=30?a(this.netLong+this.size-2):a(this.netLong+this.size-1),this.broadcast=this.bitmask<=30?a(this.netLong+this.size-1):void 0}return e.prototype.contains=function(t){return"string"==typeof t&&(t.indexOf("/")>0||4!==t.split(".").length)&&(t=new e(t)),t instanceof e?this.contains(t.base)&&this.contains(t.broadcast||t.last):(o(t)&this.maskLong)>>>0==(this.netLong&this.maskLong)>>>0},e.prototype.next=function(t){return null==t&&(t=1),new e(a(this.netLong+this.size*t),this.mask)},e.prototype.forEach=function(e){var t,n,r;for(r=o(this.first),n=o(this.last),t=0;r<=n;)e(a(r),r,t),t++,r++},e.prototype.toString=function(){return this.base+"/"+this.bitmask},e}(),Yd=e}).call(Lr);const Qd=["0.0.0.0/8","10.0.0.0/8","100.64.0.0/10","127.0.0.0/8","169.254.0.0/16","172.16.0.0/12","192.0.0.0/24","192.0.0.0/29","192.0.0.8/32","192.0.0.9/32","192.0.0.10/32","192.0.0.170/32","192.0.0.171/32","192.0.2.0/24","192.31.196.0/24","192.52.193.0/24","192.88.99.0/24","192.168.0.0/16","192.175.48.0/24","198.18.0.0/15","198.51.100.0/24","203.0.113.0/24","240.0.0.0/4","255.255.255.255/32"].map((e=>new Yd(e)));function Jd(e){return kn(e)?function(e){for(const t of Qd)if(t.contains(e))return!0;return!1}(e):Pn(e)?/^::$/.test(t=e)||/^::1$/.test(t)||/^::f{4}:([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/.test(t)||/^::f{4}:0.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/.test(t)||/^64:ff9b::([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/.test(t)||/^100::([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(t)||/^2001::([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(t)||/^2001:2[0-9a-fA-F]:([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(t)||/^2001:db8:([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(t)||/^2002:([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(t)||/^f[c-d]([0-9a-fA-F]{2,2}):/i.test(t)||/^fe[8-9a-bA-B][0-9a-fA-F]:/i.test(t)||/^ff([0-9a-fA-F]{2,2}):/i.test(t):void 0;var t}function Zd(e={}){return{denyDialPeer:async()=>!1,denyDialMultiaddr:async e=>{const t=e.stringTuples();return(4===t[0][0]||41===t[0][0])&&Boolean(Jd(`${t[0][1]}`))},denyInboundConnection:async()=>!1,denyOutboundConnection:async()=>!1,denyInboundEncryptedConnection:async()=>!1,denyOutboundEncryptedConnection:async()=>!1,denyInboundUpgradedConnection:async()=>!1,denyOutboundUpgradedConnection:async()=>!1,filterMultiaddrForPeer:async()=>!0,...e}}const Xd=e=>({match:t=>!(t.length<1)&&(!!e(t[0])&&t.slice(1)),pattern:"fn"}),ep=e=>({match:t=>Xd((t=>t===e)).match(t),pattern:e}),tp=()=>({match:e=>Xd((e=>"string"==typeof e)).match(e),pattern:"{string}"}),np=()=>({match:e=>Xd((e=>!isNaN(parseInt(e)))).match(e),pattern:"{number}"}),rp=()=>({match:e=>{if(e.length<2)return!1;if("p2p"!==e[0]&&"ipfs"!==e[0])return!1;if(!e[1].startsWith("Q")&&!e[1].startsWith("1"))return!1;try{Ce.decode(`z${e[1]}`)}catch(e){return!1}return e.slice(2)},pattern:"/p2p/{peerid}"}),sp=()=>({match:e=>{if(e.length<2)return!1;if("certhash"!==e[0])return!1;try{Le.decode(e[1])}catch{return!1}return e.slice(2)},pattern:"/certhash/{certhash}"}),ip=e=>({match:t=>{const n=e.match(t);return!1===n?t:n},pattern:`optional(${e.pattern})`}),op=(...e)=>({match:t=>{let n;for(const r of e){const e=r.match(t);!1!==e&&((null==n||e.length<n.length)&&(n=e))}return null!=n&&n},pattern:`or(${e.map((e=>e.pattern)).join(", ")})`}),ap=(...e)=>({match:t=>{for(const n of e){const e=n.match(t);if(!1===e)return!1;t=e}return t},pattern:`and(${e.map((e=>e.pattern)).join(", ")})`});function cp(...e){function t(t){let n=(e=>e.toString().split("/").slice(1))(t);for(const t of e){const e=t.match(n);if(!1===e)return!1;n=e}return n}return{matches:function(e){return!1!==t(e)},exactMatch:function(e){const n=t(e);return!1!==n&&0===n.length}}}const lp=ap(ep("dns4"),tp()),up=ap(ep("dns6"),tp()),hp=ap(ep("dnsaddr"),tp()),dp=ap(ep("dns"),tp()),pp=cp(op(dp,hp,lp,up)),fp=op(ap(ep("ip4"),Xd(kn)),ap(ep("ip6"),Xd(Pn))),gp=op(fp,dp,lp,up,hp),mp=cp(gp),yp=cp(fp),wp=ap(gp,ep("tcp"),np()),bp=ap(gp,ep("udp"),np()),vp=op(wp,bp),Ep=ap(bp,ep("quic")),Sp=ap(bp,ep("quic-v1")),_p=op(Ep,Sp),Ip=op(gp,wp,bp,Ep,Sp),Rp=op(ap(Ip,ep("ws"),ip(rp()))),Ap=op(ap(Ip,ep("wss"),ip(rp())),ap(Ip,ep("tls"),ep("ws"),ip(rp()))),Tp=ap(vp,ep("webrtc-direct"),sp(),ip(sp()),ip(rp())),Dp=ap(Sp,ep("webtransport"),ip(sp()),ip(sp()),ip(rp())),kp=cp(Dp),Pp=op(Rp,Ap,ap(wp,ip(rp())),ap(_p,ip(rp())),ap(gp,ip(rp())),Tp,Dp,rp()),Cp=cp(ap(Pp,ep("p2p-circuit"),rp())),xp=cp(op(ap(Pp,ep("p2p-circuit"),ep("webrtc"),rp()),ap(Pp,ep("webrtc"),ip(rp())),ep("webrtc")));function Np(e){try{const{address:t}=e.nodeAddress();return Boolean(Jd(t))}catch{return!0}}function Mp(e,t){const n=function(e,t){const n=Np(e.multiaddr),r=Np(t.multiaddr);return n&&!r?1:!n&&r?-1:0}(e,t);if(0!==n)return n;const r=function(e,t){const n=Cp.exactMatch(e.multiaddr),r=Cp.exactMatch(t.multiaddr);return n&&!r?1:!n&&r?-1:0}(e,t);if(0!==r)return r;const s=function(e,t){return e.isCertified&&!t.isCertified?-1:!e.isCertified&&t.isCertified?1:0}(e,t);return s}op(ap(gp,ep("tcp"),np(),ep("http"),ip(rp())),ap(gp,ep("http"),ip(rp()))),op(ap(gp,ep("tcp"),op(ap(ep("443"),ep("http")),ap(np(),ep("https"))),ip(rp())),ap(gp,ep("tls"),ep("http"),ip(rp())),ap(gp,ep("https"),ip(rp())));class Op extends Event{constructor(e,t){super(e),this.detail=t}}function Lp(e){const t=[zp.A];return null==e?t:Array.isArray(e)?0===e.length?t:e:[e]}const Bp=60;function Up(e){return{Status:e.Status??0,TC:e.TC??e.flag_tc??!1,RD:e.RD??e.flag_rd??!1,RA:e.RA??e.flag_ra??!1,AD:e.AD??e.flag_ad??!1,CD:e.CD??e.flag_cd??!1,Question:(e.Question??e.questions??[]).map((e=>({name:e.name,type:zp[e.type]}))),Answer:(e.Answer??e.answers??[]).map((e=>({name:e.name,type:zp[e.type],TTL:e.TTL??e.ttl??Bp,data:e.data instanceof Uint8Array?Qt(e.data):e.data})))}}const Fp=4;function Vp(e,t={}){const n=new Nh({concurrency:t.queryConcurrency??Fp});return async(t,r={})=>{const s=new URLSearchParams;s.set("name",t),Lp(r.types).forEach((e=>{s.append("type",zp[e])})),r.onProgress?.(new Op("dns:query",{detail:t}));const i=await n.add((async()=>{const t=await fetch(`${e}?${s}`,{headers:{accept:"application/dns-json"},signal:r?.signal});if(200!==t.status)throw new Error(`Unexpected HTTP status: ${t.status} - ${t.statusText}`);const n=Up(await t.json());return r.onProgress?.(new Op("dns:response",{detail:n})),n}),{signal:r.signal});if(null==i)throw new Error("No DNS response received");return i}}var Kp=function(e){if(!e)throw Error("hashlru must have a max value, of type number, greater than 0");var t=0,n=Object.create(null),r=Object.create(null);function s(s,i){n[s]=i,++t>=e&&(t=0,r=n,n=Object.create(null))}return{has:function(e){return void 0!==n[e]||void 0!==r[e]},remove:function(e){void 0!==n[e]&&(n[e]=void 0),void 0!==r[e]&&(r[e]=void 0)},get:function(e){var t=n[e];return void 0!==t?t:void 0!==(t=r[e])?(s(e,t),t):void 0},set:function(e,t){void 0!==n[e]?n[e]=t:s(e,t)},clear:function(){n=Object.create(null),r=Object.create(null)}}},$p=Br(Kp);class qp{lru;constructor(e){this.lru=$p(e)}get(e,t){let n=!0;const r=[];for(const s of t){const t=this.getAnswers(e,s);if(0===t.length){n=!1;break}r.push(...t)}if(n)return Up({answers:r})}getAnswers(e,t){const n=`${e.toLowerCase()}-${t}`,r=this.lru.get(n);if(null!=r){const e=r.filter((e=>e.expires>Date.now())).map((({expires:e,value:t})=>({...t,TTL:Math.round((e-Date.now())/1e3),type:zp[t.type]})));return 0===e.length&&this.lru.remove(n),e}return[]}add(e,t){const n=`${e.toLowerCase()}-${t.type}`,r=this.lru.get(n)??[];r.push({expires:Date.now()+1e3*(t.TTL??Bp),value:t}),this.lru.set(n,r)}remove(e,t){const n=`${e.toLowerCase()}-${t}`;this.lru.remove(n)}clear(){this.lru.clear()}}let Hp=class{resolvers;cache;constructor(e){var t;this.resolvers={},this.cache=(t=e.cacheSize??1e3,new qp(t)),Object.entries(e.resolvers??{}).forEach((([e,t])=>{Array.isArray(t)||(t=[t]),e.endsWith(".")||(e=`${e}.`),this.resolvers[e]=t})),null==this.resolvers["."]&&(this.resolvers["."]=[Vp("https://cloudflare-dns.com/dns-query"),Vp("https://dns.google/resolve")])}async query(e,t={}){const n=Lp(t.types),r=!1!==t.cached?this.cache.get(e,n):void 0;if(null!=r)return t.onProgress?.(new Op("dns:cache",{detail:r})),r;const s=`${e.split(".").pop()}.`,i=(this.resolvers[s]??this.resolvers["."]).sort((()=>Math.random()>.5?-1:1)),o=[];for(const r of i){if(!0===t.signal?.aborted)break;try{const s=await r(e,{...t,types:n});for(const t of s.Answer)this.cache.add(e,t);return s}catch(e){o.push(e),t.onProgress?.(new Op("dns:error",{detail:e}))}}if(1===o.length)throw o[0];throw new AggregateError(o,`DNS lookup of ${e} ${n} failed`)}};var zp;!function(e){e[e.A=1]="A",e[e.CNAME=5]="CNAME",e[e.TXT=16]="TXT",e[e.AAAA=28]="AAAA"}(zp||(zp={}));const{code:Wp}=Fn("dnsaddr"),jp=async function(e,t={}){const n=t.maxRecursiveDepth??32;if(0===n)throw new fn("Max recursive depth reached","ERR_MAX_RECURSIVE_DEPTH_REACHED");const[,r]=e.stringTuples().find((([e])=>e===Wp))??[],s=t?.dns??function(e={}){return new Hp(e)}(),i=await s.query(`_dnsaddr.${r}`,{signal:t?.signal,types:[zp.TXT]}),o=e.getPeerId(),a=[];for(const e of i.Answer){const r=e.data.replace(/["']/g,"").trim().split("=")[1];if(null==r)continue;if(null!=o&&!r.includes(o))continue;const s=cr(r);if(r.startsWith("/dnsaddr")){const e=await s.resolve({...t,maxRecursiveDepth:n-1});a.push(...e.map((e=>e.toString())))}else a.push(s.toString())}return a};const Gp=e=>{if("[object Object]"!==Object.prototype.toString.call(e))return!1;const t=Object.getPrototypeOf(e);return null===t||t===Object.prototype},{hasOwnProperty:Yp}=Object.prototype,{propertyIsEnumerable:Qp}=Object,Jp=(e,t,n)=>Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0}),Zp=Lr,Xp={concatArrays:!1,ignoreUndefined:!1},ef=e=>{const t=[];for(const n in e)Yp.call(e,n)&&t.push(n);if(Object.getOwnPropertySymbols){const n=Object.getOwnPropertySymbols(e);for(const r of n)Qp.call(e,r)&&t.push(r)}return t};function tf(e){return Array.isArray(e)?function(e){const t=e.slice(0,0);return ef(e).forEach((n=>{Jp(t,n,tf(e[n]))})),t}(e):Gp(e)?function(e){const t=null===Object.getPrototypeOf(e)?Object.create(null):{};return ef(e).forEach((n=>{Jp(t,n,tf(e[n]))})),t}(e):e}const nf=(e,t,n,r)=>(n.forEach((n=>{void 0===t[n]&&r.ignoreUndefined||(n in e&&e[n]!==Object.getPrototypeOf(e)?Jp(e,n,sf(e[n],t[n],r)):Jp(e,n,tf(t[n])))})),e),rf=(e,t,n)=>{let r=e.slice(0,0),s=0;return[e,t].forEach((t=>{const i=[];for(let n=0;n<t.length;n++)Yp.call(t,n)&&(i.push(String(n)),Jp(r,s++,t===e?t[n]:tf(t[n])));r=nf(r,t,ef(t).filter((e=>!i.includes(e))),n)})),r};function sf(e,t,n){return n.concatArrays&&Array.isArray(e)&&Array.isArray(t)?rf(e,t,n):Gp(t)&&Gp(e)?nf(e,t,ef(t),n):tf(t)}var of,af,cf=Br((function(...e){const t=sf(tf(Xp),this!==Zp&&this||{},Xp);let n={_:{}};for(const r of e)if(void 0!==r){if(!Gp(r))throw new TypeError("`"+r+"` is not an Option Object");n=sf(n,{_:r},t)}return n._}));!function(e){e.NOT_STARTED_YET="The libp2p node is not started yet",e.ERR_PROTECTOR_REQUIRED="Private network is enforced, but no protector was provided",e.NOT_FOUND="Not found"}(of||(of={})),function(e){e.ERR_PROTECTOR_REQUIRED="ERR_PROTECTOR_REQUIRED",e.ERR_PEER_DIAL_INTERCEPTED="ERR_PEER_DIAL_INTERCEPTED",e.ERR_CONNECTION_INTERCEPTED="ERR_CONNECTION_INTERCEPTED",e.ERR_INVALID_PROTOCOLS_FOR_STREAM="ERR_INVALID_PROTOCOLS_FOR_STREAM",e.ERR_CONNECTION_ENDED="ERR_CONNECTION_ENDED",e.ERR_CONNECTION_FAILED="ERR_CONNECTION_FAILED",e.ERR_NODE_NOT_STARTED="ERR_NODE_NOT_STARTED",e.ERR_ALREADY_ABORTED="ERR_ALREADY_ABORTED",e.ERR_TOO_MANY_ADDRESSES="ERR_TOO_MANY_ADDRESSES",e.ERR_NO_VALID_ADDRESSES="ERR_NO_VALID_ADDRESSES",e.ERR_RELAYED_DIAL="ERR_RELAYED_DIAL",e.ERR_DIALED_SELF="ERR_DIALED_SELF",e.ERR_DISCOVERED_SELF="ERR_DISCOVERED_SELF",e.ERR_DUPLICATE_TRANSPORT="ERR_DUPLICATE_TRANSPORT",e.ERR_ENCRYPTION_FAILED="ERR_ENCRYPTION_FAILED",e.ERR_HOP_REQUEST_FAILED="ERR_HOP_REQUEST_FAILED",e.ERR_INVALID_KEY="ERR_INVALID_KEY",e.ERR_INVALID_MESSAGE="ERR_INVALID_MESSAGE",e.ERR_INVALID_PARAMETERS="ERR_INVALID_PARAMETERS",e.ERR_INVALID_PEER="ERR_INVALID_PEER",e.ERR_MUXER_UNAVAILABLE="ERR_MUXER_UNAVAILABLE",e.ERR_NOT_FOUND="ERR_NOT_FOUND",e.ERR_TRANSPORT_UNAVAILABLE="ERR_TRANSPORT_UNAVAILABLE",e.ERR_TRANSPORT_DIAL_FAILED="ERR_TRANSPORT_DIAL_FAILED",e.ERR_UNSUPPORTED_PROTOCOL="ERR_UNSUPPORTED_PROTOCOL",e.ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED="ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED",e.ERR_INVALID_MULTIADDR="ERR_INVALID_MULTIADDR",e.ERR_SIGNATURE_NOT_VALID="ERR_SIGNATURE_NOT_VALID",e.ERR_FIND_SELF="ERR_FIND_SELF",e.ERR_NO_ROUTERS_AVAILABLE="ERR_NO_ROUTERS_AVAILABLE",e.ERR_CONNECTION_NOT_MULTIPLEXED="ERR_CONNECTION_NOT_MULTIPLEXED",e.ERR_NO_DIAL_TOKENS="ERR_NO_DIAL_TOKENS",e.ERR_INVALID_CMS="ERR_INVALID_CMS",e.ERR_MISSING_KEYS="ERR_MISSING_KEYS",e.ERR_NO_KEY="ERR_NO_KEY",e.ERR_INVALID_KEY_NAME="ERR_INVALID_KEY_NAME",e.ERR_INVALID_KEY_TYPE="ERR_INVALID_KEY_TYPE",e.ERR_KEY_ALREADY_EXISTS="ERR_KEY_ALREADY_EXISTS",e.ERR_INVALID_KEY_SIZE="ERR_INVALID_KEY_SIZE",e.ERR_KEY_NOT_FOUND="ERR_KEY_NOT_FOUND",e.ERR_OLD_KEY_NAME_INVALID="ERR_OLD_KEY_NAME_INVALID",e.ERR_NEW_KEY_NAME_INVALID="ERR_NEW_KEY_NAME_INVALID",e.ERR_PASSWORD_REQUIRED="ERR_PASSWORD_REQUIRED",e.ERR_PEM_REQUIRED="ERR_PEM_REQUIRED",e.ERR_CANNOT_READ_KEY="ERR_CANNOT_READ_KEY",e.ERR_MISSING_PRIVATE_KEY="ERR_MISSING_PRIVATE_KEY",e.ERR_MISSING_PUBLIC_KEY="ERR_MISSING_PUBLIC_KEY",e.ERR_INVALID_OLD_PASS_TYPE="ERR_INVALID_OLD_PASS_TYPE",e.ERR_INVALID_NEW_PASS_TYPE="ERR_INVALID_NEW_PASS_TYPE",e.ERR_INVALID_PASS_LENGTH="ERR_INVALID_PASS_LENGTH",e.ERR_NOT_IMPLEMENTED="ERR_NOT_IMPLEMENTED",e.ERR_WRONG_PING_ACK="ERR_WRONG_PING_ACK",e.ERR_INVALID_RECORD="ERR_INVALID_RECORD",e.ERR_ALREADY_SUCCEEDED="ERR_ALREADY_SUCCEEDED",e.ERR_NO_HANDLER_FOR_PROTOCOL="ERR_NO_HANDLER_FOR_PROTOCOL",e.ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS="ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS",e.ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS="ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS",e.ERR_CONNECTION_DENIED="ERR_CONNECTION_DENIED",e.ERR_TRANSFER_LIMIT_EXCEEDED="ERR_TRANSFER_LIMIT_EXCEEDED"}(af||(af={}));const lf={addresses:{listen:[],announce:[],noAnnounce:[],announceFilter:e=>e},connectionManager:{resolvers:{dnsaddr:jp},addressSorter:Mp},transportManager:{faultTolerance:dn.FATAL_ALL}};const uf=()=>{const e=new Error("Delay aborted");return e.name="AbortError",e},hf=new WeakMap;const df=function({clearTimeout:e,setTimeout:t}={}){return(n,{value:r,signal:s}={})=>{if(s?.aborted)return Promise.reject(uf());let i,o,a;const c=e??clearTimeout,l=()=>{c(i),a(uf())},u=new Promise(((e,c)=>{o=()=>{s&&s.removeEventListener("abort",l),e(r)},a=c,i=(t??setTimeout)(o,n)}));return s&&s.addEventListener("abort",l,{once:!0}),hf.set(u,(()=>{c(i),i=null,o()})),u}}();class pf{memoryStorage;points;duration;blockDuration;execEvenly;execEvenlyMinDelayMs;keyPrefix;constructor(e={}){this.points=e.points??4,this.duration=e.duration??1,this.blockDuration=e.blockDuration??0,this.execEvenly=e.execEvenly??!1,this.execEvenlyMinDelayMs=e.execEvenlyMinDelayMs??1e3*this.duration/this.points,this.keyPrefix=e.keyPrefix??"rlflx",this.memoryStorage=new ff}async consume(e,t=1,n={}){const r=this.getKey(e),s=this._getKeySecDuration(n);let i=this.memoryStorage.incrby(r,t,s);if(i.remainingPoints=Math.max(this.points-i.consumedPoints,0),i.consumedPoints>this.points)throw this.blockDuration>0&&i.consumedPoints<=this.points+t&&(i=this.memoryStorage.set(r,i.consumedPoints,this.blockDuration)),new fn("Rate limit exceeded","ERR_RATE_LIMIT_EXCEEDED",i);if(this.execEvenly&&i.msBeforeNext>0&&!i.isFirstInDuration){let e=Math.ceil(i.msBeforeNext/(i.remainingPoints+2));e<this.execEvenlyMinDelayMs&&(e=i.consumedPoints*this.execEvenlyMinDelayMs),await df(e)}return i}penalty(e,t=1,n={}){const r=this.getKey(e),s=this._getKeySecDuration(n),i=this.memoryStorage.incrby(r,t,s);return i.remainingPoints=Math.max(this.points-i.consumedPoints,0),i}reward(e,t=1,n={}){const r=this.getKey(e),s=this._getKeySecDuration(n),i=this.memoryStorage.incrby(r,-t,s);return i.remainingPoints=Math.max(this.points-i.consumedPoints,0),i}block(e,t){const n=1e3*t,r=this.points+1;return this.memoryStorage.set(this.getKey(e),r,t),{remainingPoints:0,msBeforeNext:0===n?-1:n,consumedPoints:r,isFirstInDuration:!1}}set(e,t,n=0){const r=1e3*(n>=0?n:this.duration);return this.memoryStorage.set(this.getKey(e),t,n),{remainingPoints:0,msBeforeNext:0===r?-1:r,consumedPoints:t,isFirstInDuration:!1}}get(e){const t=this.memoryStorage.get(this.getKey(e));return null!=t&&(t.remainingPoints=Math.max(this.points-t.consumedPoints,0)),t}delete(e){this.memoryStorage.delete(this.getKey(e))}_getKeySecDuration(e){return null!=e?.customDuration&&e.customDuration>=0?e.customDuration:this.duration}getKey(e){return this.keyPrefix.length>0?`${this.keyPrefix}:${e}`:e}parseKey(e){return e.substring(this.keyPrefix.length)}}class ff{storage;constructor(){this.storage=new Map}incrby(e,t,n){const r=this.storage.get(e);if(null!=r){const s=null!=r.expiresAt?r.expiresAt.getTime()-(new Date).getTime():-1;return null==r.expiresAt||s>0?(r.value+=t,{remainingPoints:0,msBeforeNext:s,consumedPoints:r.value,isFirstInDuration:!1}):this.set(e,t,n)}return this.set(e,t,n)}set(e,t,n){const r=1e3*n,s=this.storage.get(e);null!=s&&clearTimeout(s.timeoutId);const i={value:t,expiresAt:r>0?new Date(Date.now()+r):void 0};return this.storage.set(e,i),r>0&&(i.timeoutId=setTimeout((()=>{this.storage.delete(e)}),r),null!=i.timeoutId.unref&&i.timeoutId.unref()),{remainingPoints:0,msBeforeNext:0===r?-1:r,consumedPoints:i.value,isFirstInDuration:!0}}get(e){const t=this.storage.get(e);if(null!=t){return{remainingPoints:0,msBeforeNext:null!=t.expiresAt?t.expiresAt.getTime()-(new Date).getTime():-1,consumedPoints:t.value,isFirstInDuration:!1}}}delete(e){const t=this.storage.get(e);return null!=t&&(null!=t.timeoutId&&clearTimeout(t.timeoutId),this.storage.delete(e),!0)}}function gf(e){if(on(e))return{peerId:e,multiaddrs:[]};let t;if(Array.isArray(e)||(e=[e]),e.length>0){const n=e[0].getPeerId();t=null==n?void 0:Is(n),e.forEach((e=>{if(!ar(e))throw new fn("Invalid Multiaddr",af.ERR_INVALID_MULTIADDR);const n=e.getPeerId();if(null==n){if(null!=t)throw new fn("Multiaddrs must all have the same peer id or have no peer id",af.ERR_INVALID_PARAMETERS)}else{const e=Is(n);if(null==t||!t.equals(e))throw new fn("Multiaddrs must all have the same peer id or have no peer id",af.ERR_INVALID_PARAMETERS)}}))}return{peerId:t,multiaddrs:e}}class mf extends Error{type;code;constructor(e,t){super(e??"The operation was aborted"),this.type="aborted",this.name="AbortError",this.code=t??"ABORT_ERR"}}async function yf(e,t,n,r){const s=new mf(r?.errorMessage,r?.errorCode);return!0===n?.aborted?Promise.reject(s):new Promise(((i,o)=>{function a(){n?.removeEventListener("abort",u),e.removeEventListener(t,c),null!=r?.errorEvent&&e.removeEventListener(r.errorEvent,l)}const c=e=>{try{if(!1===r?.filter?.(e))return}catch(e){return a(),void o(e)}a(),i(e)},l=e=>{a(),o(e.detail)},u=()=>{a(),o(s)};n?.addEventListener("abort",u),e.addEventListener(t,c),null!=r?.errorEvent&&e.addEventListener(r.errorEvent,l)}))}class wf{deferred;signal;constructor(e){this.signal=e,this.deferred=lr(),this.onAbort=this.onAbort.bind(this),this.signal?.addEventListener("abort",this.onAbort)}onAbort(){this.deferred.reject(this.signal?.reason??new pn)}cleanup(){this.signal?.removeEventListener("abort",this.onAbort)}}class bf{id;fn;options;recipients;status;timeline;controller;constructor(e,t){this.id=`${parseInt(String(1e9*Math.random()),10).toString()}${Date.now()}`,this.status="queued",this.fn=e,this.options=t,this.recipients=[],this.timeline={created:Date.now()},this.controller=new AbortController,this.controller.signal,this.onAbort=this.onAbort.bind(this)}abort(e){this.controller.abort(e)}onAbort(){this.recipients.reduce(((e,t)=>e&&!0===t.signal?.aborted),!0)&&(this.controller.abort(new pn),this.cleanup())}async join(e={}){const t=new wf(e.signal);return this.recipients.push(t),e.signal?.addEventListener("abort",this.onAbort),t.deferred.promise}async run(){this.status="running",this.timeline.started=Date.now();try{this.controller.signal.throwIfAborted();const e=await Ar(this.fn({...this.options??{},signal:this.controller.signal}),this.controller.signal);this.recipients.forEach((t=>{t.deferred.resolve(e)})),this.status="complete"}catch(e){this.recipients.forEach((t=>{t.deferred.reject(e)})),this.status="errored"}finally{this.timeline.finished=Date.now(),this.cleanup()}}cleanup(){this.recipients.forEach((e=>{e.cleanup(),e.signal?.removeEventListener("abort",this.onAbort)}))}}class vf extends wn{concurrency;queue;pending;sort;constructor(e={}){super(),this.concurrency=e.concurrency??Number.POSITIVE_INFINITY,this.pending=0,null!=e.metricName&&e.metrics?.registerMetricGroup(e.metricName,{calculate:()=>({size:this.queue.length,running:this.pending,queued:this.queue.length-this.pending})}),this.sort=e.sort,this.queue=[]}tryToStartAnother(){if(0===this.size)return queueMicrotask((()=>{this.safeDispatchEvent("empty")})),0===this.running&&queueMicrotask((()=>{this.safeDispatchEvent("idle")})),!1;if(this.pending<this.concurrency){let e;for(const t of this.queue)if("queued"===t.status){e=t;break}return null!=e&&(this.safeDispatchEvent("active"),this.pending++,e.run().finally((()=>{for(let t=0;t<this.queue.length;t++)if(this.queue[t]===e){this.queue.splice(t,1);break}this.pending--,this.tryToStartAnother(),this.safeDispatchEvent("next")})),!0)}return!1}enqueue(e){this.queue.push(e),null!=this.sort&&this.queue.sort(this.sort)}async add(e,t){t?.signal?.throwIfAborted();const n=new bf(e,t);return this.enqueue(n),this.safeDispatchEvent("add"),this.tryToStartAnother(),n.join(t).then((e=>(this.safeDispatchEvent("completed",{detail:e}),this.safeDispatchEvent("success",{detail:{job:n,result:e}}),e))).catch((e=>{if("queued"===n.status)for(let e=0;e<this.queue.length;e++)if(this.queue[e]===n){this.queue.splice(e,1);break}throw this.safeDispatchEvent("error",{detail:e}),this.safeDispatchEvent("failure",{detail:{job:n,error:e}}),e}))}clear(){this.queue.splice(0,this.queue.length)}abort(){this.queue.forEach((e=>{e.abort(new pn)})),this.clear()}async onEmpty(e){0!==this.size&&await yf(this,"empty",e?.signal)}async onSizeLessThan(e,t){this.size<e||await yf(this,"next",t?.signal,{filter:()=>this.size<e})}async onIdle(e){0===this.pending&&0===this.size||await yf(this,"idle",e?.signal)}get size(){return this.queue.length}get queued(){return this.queue.length-this.pending}get running(){return this.pending}async*toGenerator(e){e?.signal?.throwIfAborted();const t=pr({objectMode:!0}),n=e=>{null!=e?this.abort():this.clear(),t.end(e)},r=e=>{null!=e.detail&&t.push(e.detail)},s=e=>{n(e.detail)},i=()=>{n()},o=()=>{n(new fn("Queue aborted","ERR_QUEUE_ABORTED"))};this.addEventListener("completed",r),this.addEventListener("error",s),this.addEventListener("idle",i),e?.signal?.addEventListener("abort",o);try{yield*t}finally{this.removeEventListener("completed",r),this.removeEventListener("error",s),this.removeEventListener("idle",i),e?.signal?.removeEventListener("abort",o),n()}}}class Ef extends vf{has(e){return null!=this.find(e)}find(e){return this.queue.find((t=>e.equals(t.options.peerId)))}}const Sf="last-dial-failure",_f=42e4,If={minConnections:5,maxQueueLength:100,autoDialConcurrency:25,autoDialPriority:0,autoDialInterval:5e3,autoDialPeerRetryThreshold:_f,autoDialDiscoveredPeersDebounce:10};class Rf{connectionManager;peerStore;queue;minConnections;autoDialPriority;autoDialIntervalMs;autoDialMaxQueueLength;autoDialPeerRetryThresholdMs;autoDialDiscoveredPeersDebounce;autoDialInterval;started;running;log;constructor(e,t){let n;this.connectionManager=e.connectionManager,this.peerStore=e.peerStore,this.minConnections=t.minConnections??If.minConnections,this.autoDialPriority=t.autoDialPriority??If.autoDialPriority,this.autoDialIntervalMs=t.autoDialInterval??If.autoDialInterval,this.autoDialMaxQueueLength=t.maxQueueLength??If.maxQueueLength,this.autoDialPeerRetryThresholdMs=t.autoDialPeerRetryThreshold??If.autoDialPeerRetryThreshold,this.autoDialDiscoveredPeersDebounce=t.autoDialDiscoveredPeersDebounce??If.autoDialDiscoveredPeersDebounce,this.log=e.logger.forComponent("libp2p:connection-manager:auto-dial"),this.started=!1,this.running=!1,this.queue=new Ef({concurrency:t.autoDialConcurrency??If.autoDialConcurrency,metricName:"libp2p_autodial_queue",metrics:e.metrics}),this.queue.addEventListener("error",(e=>{this.log.error("error during auto-dial",e.detail)})),e.events.addEventListener("connection:close",(()=>{this.autoDial().catch((e=>{this.log.error(e)}))})),e.events.addEventListener("peer:discovery",(()=>{clearTimeout(n),n=setTimeout((()=>{this.autoDial().catch((e=>{this.log.error(e)}))}),this.autoDialDiscoveredPeersDebounce)}))}isStarted(){return this.started}start(){this.started=!0}afterStart(){this.autoDial().catch((e=>{this.log.error("error while autodialing",e)}))}stop(){this.queue.clear(),clearTimeout(this.autoDialInterval),this.started=!1,this.running=!1}async autoDial(){if(!this.started||this.running)return;const e=this.connectionManager.getConnectionsMap(),t=e.size;if(t>=this.minConnections)return void(this.minConnections>0&&this.log.trace("have enough connections %d/%d",t,this.minConnections));if(this.queue.size>this.autoDialMaxQueueLength)return this.log("not enough connections %d/%d but auto dial queue is full",t,this.minConnections),void this.sheduleNextAutodial();this.running=!0,this.log("not enough connections %d/%d - will dial peers to increase the number of connections",t,this.minConnections);const n=new jh(this.connectionManager.getDialQueue().map((e=>e.peerId)).filter(Boolean)),r=await this.peerStore.all({filters:[t=>0===t.addresses.length?(this.log.trace("not autodialing %p because they have no addresses",t.id),!1):e.has(t.id)?(this.log.trace("not autodialing %p because they are already connected",t.id),!1):n.has(t.id)?(this.log.trace("not autodialing %p because they are already being dialed",t.id),!1):!this.queue.has(t.id)||(this.log.trace("not autodialing %p because they are already being autodialed",t.id),!1)]}),s=r.sort((()=>Math.random()>.5?1:-1)),i=new Wh;for(const e of s)i.has(e.id)||i.set(e.id,[...e.tags.values()].reduce(((e,t)=>e+t.value),0));const o=s.sort(((e,t)=>{const n=i.get(e.id)??0,r=i.get(t.id)??0;return n>r?-1:n<r?1:0})).filter((e=>{const t=e.metadata.get(Sf);if(null==t)return!0;const n=parseInt(Qt(t));return!!isNaN(n)||Date.now()-n>this.autoDialPeerRetryThresholdMs}));this.log("selected %d/%d peers to dial",o.length,r.length);for(const e of o)this.queue.add((async()=>{const t=this.connectionManager.getConnectionsMap().size;if(t>=this.minConnections)return this.log("got enough connections now %d/%d",t,this.minConnections),void this.queue.clear();this.log("connecting to a peerStore stored peer %p",e.id),await this.connectionManager.openConnection(e.id,{priority:this.autoDialPriority})}),{peerId:e.id}).catch((e=>{this.log.error("could not connect to peerStore stored peer",e)}));this.running=!1,this.sheduleNextAutodial()}sheduleNextAutodial(){this.started&&(this.autoDialInterval=setTimeout((()=>{this.autoDial().catch((e=>{this.log.error("error while autodialing",e)}))}),this.autoDialIntervalMs))}}const Af=["/ipfs/id/1.0.0","/ipfs/id/push/1.0.0","/libp2p/autonat/1.0.0","/libp2p/dcutr"];const Tf={maxConnections:100,allow:[]};class Df{maxConnections;connectionManager;peerStore;allow;events;log;constructor(e,t={}){this.maxConnections=t.maxConnections??Tf.maxConnections,this.allow=t.allow??Tf.allow,this.connectionManager=e.connectionManager,this.peerStore=e.peerStore,this.events=e.events,this.log=e.logger.forComponent("libp2p:connection-manager:connection-pruner"),e.events.addEventListener("connection:open",(()=>{this.maybePruneConnections().catch((e=>{this.log.error(e)}))}))}async maybePruneConnections(){const e=this.connectionManager.getConnections(),t=e.length;if(this.log("checking max connections limit %d/%d",t,this.maxConnections),t<=this.maxConnections)return;const n=new Wh;for(const t of e){const e=t.remotePeer;if(!n.has(e)){n.set(e,0);try{const t=await this.peerStore.get(e);n.set(e,[...t.tags.values()].reduce(((e,t)=>e+t.value),0))}catch(e){"ERR_NOT_FOUND"!==e.code&&this.log.error("error loading peer tags",e)}}}const r=this.sortConnections(e,n),s=Math.max(t-this.maxConnections,0),i=[];for(const e of r){this.log("too many connections open - closing a connection to %p",e.remotePeer);if(this.allow.some((t=>e.remoteAddr.toString().startsWith(t.toString())))||i.push(e),i.length===s)break}await Promise.all(i.map((async e=>{await async function(e,t){const n=e?.streams?.map((e=>e.protocol))??[],r=t?.closableProtocols??Af;if(!(n.filter((e=>null!=e&&!r.includes(e))).length>0))try{await(e?.close(t))}catch(t){e?.abort(t)}}(e,{signal:AbortSignal.timeout(1e3)})}))),this.events.safeDispatchEvent("connection:prune",{detail:i})}sortConnections(e,t){return e.sort(((e,t)=>{const n=e.timeline.open,r=t.timeline.open;return n<r?1:n>r?-1:0})).sort(((e,t)=>"outbound"===e.direction&&"inbound"===t.direction?1:"inbound"===e.direction&&"outbound"===t.direction?-1:0)).sort(((e,t)=>e.streams.length>t.streams.length?1:e.streams.length<t.streams.length?-1:0)).sort(((e,n)=>{const r=t.get(e.remotePeer)??0,s=t.get(n.remotePeer)??0;return r>s?1:r<s?-1:0}))}}class kf extends vf{constructor(e={}){super({...e,sort:(e,t)=>e.options.priority>t.options.priority?-1:e.options.priority<t.options.priority?1:0})}}const Pf={addressSorter:Mp,maxParallelDials:50,maxDialQueueLength:500,maxPeerAddrsToDial:25,dialTimeout:5e3,resolvers:{dnsaddr:jp}};class Cf{queue;components;addressSorter;maxPeerAddrsToDial;maxDialQueueLength;dialTimeout;shutDownController;connections;log;constructor(e,t={}){this.addressSorter=t.addressSorter??Pf.addressSorter,this.maxPeerAddrsToDial=t.maxPeerAddrsToDial??Pf.maxPeerAddrsToDial,this.maxDialQueueLength=t.maxDialQueueLength??Pf.maxDialQueueLength,this.dialTimeout=t.dialTimeout??Pf.dialTimeout,this.connections=t.connections??new Wh,this.log=e.logger.forComponent("libp2p:connection-manager:dial-queue"),this.components=e,this.shutDownController=new AbortController,this.shutDownController.signal;for(const[e,n]of Object.entries(t.resolvers??{}))or.set(e,n);this.queue=new kf({concurrency:t.maxParallelDials??Pf.maxParallelDials,metricName:"libp2p_dial_queue",metrics:e.metrics}),this.queue.addEventListener("error",(e=>{this.log.error("error in dial queue",e.detail)}))}start(){this.shutDownController=new AbortController,this.shutDownController.signal}stop(){this.shutDownController.abort(),this.queue.abort()}async dial(e,t={}){const{peerId:n,multiaddrs:r}=gf(e),s=Array.from(this.connections.values()).flat().find((e=>!0!==t.force&&(!!e.remotePeer.equals(n)||r.find((t=>t.equals(e.remoteAddr))))));if(null!=s)return this.log("already connected to %a",s.remoteAddr),s;const i=this.queue.queue.find((e=>{if(!0===n?.equals(e.options.peerId))return!0;const t=e.options.multiaddrs;if(null==t)return!1;for(const e of r)if(t.has(e.toString()))return!0;return!1}));if(null!=i){this.log("joining existing dial target for %p",n);for(const e of r)i.options.multiaddrs.add(e.toString());return i.join(t)}if(this.queue.size>=this.maxDialQueueLength)throw new fn("Dial queue is full","ERR_DIAL_QUEUE_FULL");return this.log("creating dial target for %p",n,r.map((e=>e.toString()))),this.queue.add((async e=>{const t=this.createDialAbortController(e?.signal);let r;try{r=await this.calculateMultiaddrs(n,e?.multiaddrs,{...e,signal:t}),r.map((({multiaddr:e})=>e.toString())).forEach((t=>{e?.multiaddrs.add(t)}))}catch(e){throw t.clear(),e}try{let s=0;const i=[];for(const o of r){if(s===this.maxPeerAddrsToDial)throw this.log("dialed maxPeerAddrsToDial (%d) addresses for %p, not trying any others",s,n),new fn("Peer had more than maxPeerAddrsToDial",af.ERR_TOO_MANY_ADDRESSES);s++;try{const n=await this.components.transportManager.dial(o.multiaddr,{...e,signal:t});return this.log("dial to %a succeeded",o.multiaddr),n}catch(e){if(this.log.error("dial failed to %a",o.multiaddr,e),null!=n)try{await this.components.peerStore.patch(n,{metadata:{[Sf]:kt(Date.now().toString())}})}catch(e){this.log.error("could not update last dial failure key for %p",n,e)}if(t.aborted)throw new fn(e.message,mn);i.push(e)}}if(1===i.length)throw i[0];throw new gn(i,"All multiaddr dials failed",af.ERR_TRANSPORT_DIAL_FAILED)}finally{t.clear()}}),{peerId:n,priority:t.priority??xf,multiaddrs:new Set(r.map((e=>e.toString()))),signal:t.signal})}createDialAbortController(e){const t=Ts([AbortSignal.timeout(this.dialTimeout),this.shutDownController.signal,e]);return t}async calculateMultiaddrs(e,t=new Set,n={}){const r=[...t].map((e=>({multiaddr:cr(e),isCertified:!1})));if(null!=e){if(this.components.peerId.equals(e))throw new fn("Tried to dial self",af.ERR_DIALED_SELF);if(!0===await(this.components.connectionGater.denyDialPeer?.(e)))throw new fn("The dial request is blocked by gater.allowDialPeer",af.ERR_PEER_DIAL_INTERCEPTED);if(0===r.length){this.log("loading multiaddrs for %p",e);try{const t=await this.components.peerStore.get(e);r.push(...t.addresses),this.log("loaded multiaddrs for %p",e,r.map((({multiaddr:e})=>e.toString())))}catch(e){if(e.code!==af.ERR_NOT_FOUND)throw e}}if(0===r.length){this.log("looking up multiaddrs for %p in the peer routing",e);try{const t=await this.components.peerRouting.findPeer(e);this.log("found multiaddrs for %p in the peer routing",e,r.map((({multiaddr:e})=>e.toString()))),r.push(...t.multiaddrs.map((e=>({multiaddr:e,isCertified:!1}))))}catch(t){t.code!==af.ERR_NO_ROUTERS_AVAILABLE&&this.log.error("looking up multiaddrs for %p in the peer routing failed",e,t)}}}let s=(await Promise.all(r.map((async e=>{const t=await async function(e,t){let n=!1;for(const t of or.keys())if(n=e.protoNames().includes(t),n)break;if(!n)return[e];const r=await e.resolve(t);return t.log("resolved %s to",e,r.map((e=>e.toString()))),r}(e.multiaddr,{dns:this.components.dns,...n,log:this.log});return 1===t.length&&t[0].equals(e.multiaddr)?e:t.map((e=>({multiaddr:e,isCertified:!1})))})))).flat();if(null!=e){const t=`/p2p/${e.toString()}`;s=s.map((e=>{const n=e.multiaddr.protos().pop();return!0===n?.path?e:null==e.multiaddr.getPeerId()?{multiaddr:e.multiaddr.encapsulate(t),isCertified:e.isCertified}:e}))}const i=s.filter((t=>{if(null==this.components.transportManager.dialTransportForMultiaddr(t.multiaddr))return!1;const n=t.multiaddr.getPeerId();return null==e||null==n||e.equals(n)})),o=new Map;for(const e of i){const t=e.multiaddr.toString(),n=o.get(t);null==n?o.set(t,e):n.isCertified=n.isCertified||e.isCertified||!1}const a=[...o.values()];if(0===a.length)throw new fn("The dial request has no valid addresses",af.ERR_NO_VALID_ADDRESSES);const c=[];for(const e of a)null!=this.components.connectionGater.denyDialMultiaddr&&await this.components.connectionGater.denyDialMultiaddr(e.multiaddr)||c.push(e);const l=c.sort(this.addressSorter);if(0===l.length)throw new fn("The connection gater denied all addresses in the dial request",af.ERR_NO_VALID_ADDRESSES);return this.log.trace("addresses for %p before filtering",e??"unknown peer",s.map((({multiaddr:e})=>e.toString()))),this.log.trace("addresses for %p after filtering",e??"unknown peer",l.map((({multiaddr:e})=>e.toString()))),l}async isDialable(e,t={}){Array.isArray(e)||(e=[e]);try{const n=await this.calculateMultiaddrs(void 0,new Set(e.map((e=>e.toString()))),t);return!1!==t.runOnTransientConnection||null!=n.find((e=>!Cp.matches(e.multiaddr)))}catch(e){this.log.trace("error calculating if multiaddr(s) were dialable",e)}return!1}}const xf=50,Nf={minConnections:5,maxConnections:100,inboundConnectionThreshold:5,maxIncomingPendingConnections:10,autoDialConcurrency:25,autoDialPriority:0,autoDialMaxQueueLength:100,autoDialPeerRetryThreshold:_f,autoDialDiscoveredPeersDebounce:10};class Mf{started;connections;allow;deny;maxIncomingPendingConnections;incomingPendingConnections;maxConnections;dialQueue;autoDial;connectionPruner;inboundConnectionRateLimiter;peerStore;metrics;events;log;constructor(e,t={}){this.maxConnections=t.maxConnections??Nf.maxConnections;const n=t.minConnections??Nf.minConnections;if(this.maxConnections<n)throw new fn("Connection Manager maxConnections must be greater than minConnections",af.ERR_INVALID_PARAMETERS);this.connections=new Wh,this.started=!1,this.peerStore=e.peerStore,this.metrics=e.metrics,this.events=e.events,this.log=e.logger.forComponent("libp2p:connection-manager"),this.onConnect=this.onConnect.bind(this),this.onDisconnect=this.onDisconnect.bind(this),this.events.addEventListener("connection:open",this.onConnect),this.events.addEventListener("connection:close",this.onDisconnect),this.allow=(t.allow??[]).map((e=>cr(e))),this.deny=(t.deny??[]).map((e=>cr(e))),this.incomingPendingConnections=0,this.maxIncomingPendingConnections=t.maxIncomingPendingConnections??Nf.maxIncomingPendingConnections,this.inboundConnectionRateLimiter=new pf({points:t.inboundConnectionThreshold??Nf.inboundConnectionThreshold,duration:1}),this.autoDial=new Rf({connectionManager:this,peerStore:e.peerStore,events:e.events,logger:e.logger},{minConnections:n,autoDialConcurrency:t.autoDialConcurrency??Nf.autoDialConcurrency,autoDialPriority:t.autoDialPriority??Nf.autoDialPriority,autoDialPeerRetryThreshold:t.autoDialPeerRetryThreshold??Nf.autoDialPeerRetryThreshold,autoDialDiscoveredPeersDebounce:t.autoDialDiscoveredPeersDebounce??Nf.autoDialDiscoveredPeersDebounce,maxQueueLength:t.autoDialMaxQueueLength??Nf.autoDialMaxQueueLength}),this.connectionPruner=new Df({connectionManager:this,peerStore:e.peerStore,events:e.events,logger:e.logger},{maxConnections:this.maxConnections,allow:this.allow}),this.dialQueue=new Cf(e,{addressSorter:t.addressSorter??Mp,maxParallelDials:t.maxParallelDials??50,maxDialQueueLength:t.maxDialQueueLength??500,maxPeerAddrsToDial:t.maxPeerAddrsToDial??25,dialTimeout:t.dialTimeout??5e3,resolvers:t.resolvers??{dnsaddr:jp},connections:this.connections})}isStarted(){return this.started}async start(){this.metrics?.registerMetricGroup("libp2p_connection_manager_connections",{calculate:()=>{const e={inbound:0,outbound:0};for(const t of this.connections.values())for(const n of t)"inbound"===n.direction?e.inbound++:e.outbound++;return e}}),this.metrics?.registerMetricGroup("libp2p_protocol_streams_total",{label:"protocol",calculate:()=>{const e={};for(const t of this.connections.values())for(const n of t)for(const t of n.streams){const n=`${t.direction} ${t.protocol??"unnegotiated"}`;e[n]=(e[n]??0)+1}return e}}),this.metrics?.registerMetricGroup("libp2p_connection_manager_protocol_streams_per_connection_90th_percentile",{label:"protocol",calculate:()=>{const e={};for(const t of this.connections.values())for(const n of t){const t={};for(const e of n.streams){const n=`${e.direction} ${e.protocol??"unnegotiated"}`;t[n]=(t[n]??0)+1}for(const[n,r]of Object.entries(t))e[n]=e[n]??[],e[n].push(r)}const t={};for(let[n,r]of Object.entries(e)){r=r.sort(((e,t)=>e-t));const e=Math.floor(.9*r.length);t[n]=r[e]}return t}}),this.dialQueue.start(),this.autoDial.start(),this.started=!0,this.log("started")}async afterStart(){Promise.resolve().then((async()=>{const e=await this.peerStore.all({filters:[e=>e.tags.has("keep-alive")]});await Promise.all(e.map((async e=>{await this.openConnection(e.id).catch((e=>{this.log.error(e)}))})))})).catch((e=>{this.log.error(e)})),this.autoDial.afterStart()}async stop(){this.dialQueue.stop(),this.autoDial.stop();const e=[];for(const t of this.connections.values())for(const n of t)e.push((async()=>{try{await n.close()}catch(e){this.log.error(e)}})());this.log("closing %d connections",e.length),await Promise.all(e),this.connections.clear(),this.log("stopped")}onConnect(e){this._onConnect(e).catch((e=>{this.log.error(e)}))}async _onConnect(e){const{detail:t}=e;if(!this.started)return void await t.close();const n=t.remotePeer,r=this.connections.get(n);let s=!1;null!=r?r.push(t):(s=!0,this.connections.set(n,[t])),null!=n.publicKey&&"RSA"===n.type&&await this.peerStore.patch(n,{publicKey:n.publicKey}),s&&this.events.safeDispatchEvent("peer:connect",{detail:t.remotePeer})}onDisconnect(e){const{detail:t}=e;if(!this.started)return;const n=t.remotePeer;let r=this.connections.get(n);null!=r&&r.length>1?(r=r.filter((e=>e.id!==t.id)),this.connections.set(n,r)):null!=r&&(this.connections.delete(n),this.events.safeDispatchEvent("peer:disconnect",{detail:t.remotePeer}))}getConnections(e){if(null!=e)return this.connections.get(e)??[];let t=[];for(const e of this.connections.values())t=t.concat(e);return t}getConnectionsMap(){return this.connections}async openConnection(e,t={}){if(!this.isStarted())throw new fn("Not started",af.ERR_NODE_NOT_STARTED);t.signal?.throwIfAborted();const{peerId:n}=gf(e);if(null!=n&&!0!==t.force){this.log("dial %p",n);const e=this.getConnections(n).find((e=>!e.transient));if(null!=e)return this.log("had an existing non-transient connection to %p",n),e}const r=await this.dialQueue.dial(e,{...t,priority:t.priority??xf});let s=this.connections.get(r.remotePeer);null==s&&(s=[],this.connections.set(r.remotePeer,s));let i=!1;for(const e of s)e.id===r.id&&(i=!0);return i||s.push(r),r}async closeConnections(e,t={}){const n=this.connections.get(e)??[];await Promise.all(n.map((async e=>{try{await e.close(t)}catch(t){e.abort(t)}})))}async acceptIncomingConnection(e){if(this.deny.some((t=>e.remoteAddr.toString().startsWith(t.toString()))))return this.log("connection from %a refused - connection remote address was in deny list",e.remoteAddr),!1;if(this.allow.some((t=>e.remoteAddr.toString().startsWith(t.toString()))))return this.incomingPendingConnections++,!0;if(this.incomingPendingConnections===this.maxIncomingPendingConnections)return this.log("connection from %a refused - incomingPendingConnections exceeded by host",e.remoteAddr),!1;if(e.remoteAddr.isThinWaistAddress()){const t=e.remoteAddr.nodeAddress().address;try{await this.inboundConnectionRateLimiter.consume(t,1)}catch{return this.log("connection from %a refused - inboundConnectionThreshold exceeded by host %s",e.remoteAddr,t),!1}}return this.getConnections().length<this.maxConnections?(this.incomingPendingConnections++,!0):(this.log("connection from %a refused - maxConnections exceeded",e.remoteAddr),!1)}afterUpgradeInbound(){this.incomingPendingConnections--}getDialQueue(){const e={queued:"queued",running:"active",errored:"error",complete:"success"};return this.dialQueue.queue.queue.map((t=>({id:t.id,status:e[t.status],peerId:t.options.peerId,multiaddrs:[...t.options.multiaddrs].map((e=>cr(e)))})))}async isDialable(e,t={}){return this.dialQueue.isDialable(e,t)}}class Of{routers;started;components;constructor(e,t){this.routers=t.routers??[],this.started=!1,this.components=e}isStarted(){return this.started}async start(){this.started=!0}async stop(){this.started=!1}async*findProviders(e,t={}){if(0===this.routers.length)throw new fn("No content routers available",af.ERR_NO_ROUTERS_AVAILABLE);const n=this,r=new jh;for await(const s of fr(...n.routers.map((n=>n.findProviders(e,t)))))null!=s&&(s.multiaddrs.length>0&&await this.components.peerStore.merge(s.id,{multiaddrs:s.multiaddrs}),r.has(s.id)||(r.add(s.id),yield s))}async provide(e,t={}){if(0===this.routers.length)throw new fn("No content routers available",af.ERR_NO_ROUTERS_AVAILABLE);await Promise.all(this.routers.map((async n=>{await n.provide(e,t)})))}async put(e,t,n){if(!this.isStarted())throw new fn(of.NOT_STARTED_YET,af.ERR_NODE_NOT_STARTED);await Promise.all(this.routers.map((async r=>{await r.put(e,t,n)})))}async get(e,t){if(!this.isStarted())throw new fn(of.NOT_STARTED_YET,af.ERR_NODE_NOT_STARTED);return Promise.any(this.routers.map((async n=>n.get(e,t))))}}const Lf=globalThis.CustomEvent??Event;async function*Bf(e,t={}){let n=t.concurrency??1/0;n<1&&(n=1/0);const r=null!=t.ordered&&t.ordered,s=new EventTarget,i=[];let o,a=lr(),c=lr(),l=!1,u=!1;function h(){return r?i[0]?.done:Boolean(i.find((e=>e.done)))}function*d(){for(;i.length>0&&i[0].done;){const e=i[0];if(i.shift(),!e.ok)throw u=!0,a.resolve(),e.err;yield e.value,a.resolve()}}function*p(){for(;h();)for(let e=0;e<i.length;e++)if(i[e].done){const t=i[e];if(i.splice(e,1),e--,!t.ok)throw u=!0,a.resolve(),t.err;yield t.value,a.resolve()}}for(s.addEventListener("task-complete",(()=>{c.resolve()})),Promise.resolve().then((async()=>{try{for await(const t of e){if(i.length===n&&(a=lr(),await a.promise),u)break;const e={done:!1};i.push(e),t().then((t=>{e.done=!0,e.ok=!0,e.value=t,s.dispatchEvent(new Lf("task-complete"))}),(t=>{e.done=!0,e.err=t,s.dispatchEvent(new Lf("task-complete"))}))}l=!0,s.dispatchEvent(new Lf("task-complete"))}catch(e){o=e,s.dispatchEvent(new Lf("task-complete"))}}));;){if(h()||(c=lr(),await c.promise),null!=o)throw o;if(r?yield*d():yield*p(),l&&0===i.length)break}}class Uf{log;peerId;peerStore;routers;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:peer-routing"),this.peerId=e.peerId,this.peerStore=e.peerStore,this.routers=t.routers??[]}async findPeer(e,t){if(0===this.routers.length)throw new fn("No peer routers available",af.ERR_NO_ROUTERS_AVAILABLE);if(e.toString()===this.peerId.toString())throw new fn("Should not try to find self",af.ERR_FIND_SELF);const n=this,r=fr(...this.routers.map((r=>async function*(){try{yield await r.findPeer(e,t)}catch(e){n.log.error(e)}}())));for await(const e of r)if(null!=e)return e.multiaddrs.length>0&&await this.peerStore.merge(e.id,{multiaddrs:e.multiaddrs}),e;throw new fn(of.NOT_FOUND,af.ERR_NOT_FOUND)}async*getClosestPeers(e,t={}){if(0===this.routers.length)throw new fn("No peer routers available",af.ERR_NO_ROUTERS_AVAILABLE);const n=this,r=new jh;for await(const s of Bf(async function*(){const r=fr(...n.routers.map((n=>n.getClosestPeers(e,t))));for await(let e of r)yield async()=>{if(0===e.multiaddrs.length)try{e=await n.findPeer(e.id,{...t,useCache:!1})}catch(e){return void n.log.error("could not find peer multiaddrs",e)}return e}}()))null!=s&&(s.multiaddrs.length>0&&await this.peerStore.merge(s.id,{multiaddrs:s.multiaddrs}),r.has(s.id)||(r.add(s.id),yield s))}}class Ff extends wn{peerRouting;log;walking;walkers;shutdownController;walkController;needNext;constructor(e){super(),this.log=e.logger.forComponent("libp2p:random-walk"),this.peerRouting=e.peerRouting,this.walkers=0,this.walking=!1,this.shutdownController=new AbortController,this.shutdownController.signal}start(){this.shutdownController=new AbortController,this.shutdownController.signal}stop(){this.shutdownController.abort()}async*walk(e){this.walking||this.startWalk(),this.walkers++;const t=Ts([this.shutdownController.signal,e?.signal]);try{for(;;){this.needNext?.resolve(),this.needNext=lr();const e=await yf(this,"walk:peer",t,{errorEvent:"walk:error"});yield e.detail}}finally{t.clear(),this.walkers--,0===this.walkers&&(this.walkController?.abort(),this.walkController=void 0)}}startWalk(){this.walking=!0,this.walkController=new AbortController,this.walkController.signal;const e=Ts([this.walkController.signal,this.shutdownController.signal]),t=Date.now();let n=0;Promise.resolve().then((async()=>{for(this.log("start walk");this.walkers>0;)try{for await(const t of this.peerRouting.getClosestPeers(Lo(32),{signal:e}))e.throwIfAborted(),this.log("found peer %p",t.id),n++,this.safeDispatchEvent("walk:peer",{detail:t}),1===this.walkers&&null!=this.needNext&&await Ar(this.needNext.promise,e)}catch(e){this.log.error("randomwalk errored",e),this.safeDispatchEvent("walk:error",{detail:e})}})).catch((e=>{this.log.error("randomwalk errored",e)})).finally((()=>{this.log("finished walk, found %d peers after %dms",n,Date.now()-t),this.walking=!1}))}}class Vf{log;topologies;handlers;components;constructor(e){this.log=e.logger.forComponent("libp2p:registrar"),this.topologies=new Map,this.handlers=new Map,this.components=e,this._onDisconnect=this._onDisconnect.bind(this),this._onPeerUpdate=this._onPeerUpdate.bind(this),this._onPeerIdentify=this._onPeerIdentify.bind(this),this.components.events.addEventListener("peer:disconnect",this._onDisconnect),this.components.events.addEventListener("peer:update",this._onPeerUpdate),this.components.events.addEventListener("peer:identify",this._onPeerIdentify)}getProtocols(){return Array.from(new Set([...this.handlers.keys()])).sort()}getHandler(e){const t=this.handlers.get(e);if(null==t)throw new fn(`No handler registered for protocol ${e}`,af.ERR_NO_HANDLER_FOR_PROTOCOL);return t}getTopologies(e){const t=this.topologies.get(e);return null==t?[]:[...t.values()]}async handle(e,t,n){if(this.handlers.has(e))throw new fn(`Handler already registered for protocol ${e}`,af.ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED);const r=cf.bind({ignoreUndefined:!0})({maxInboundStreams:32,maxOutboundStreams:64},n);this.handlers.set(e,{handler:t,options:r}),await this.components.peerStore.merge(this.components.peerId,{protocols:[e]})}async unhandle(e){(Array.isArray(e)?e:[e]).forEach((e=>{this.handlers.delete(e)})),await this.components.peerStore.patch(this.components.peerId,{protocols:this.getProtocols()})}async register(e,t){if(null==t)throw new fn("invalid topology",af.ERR_INVALID_PARAMETERS);const n=`${(1e9*Math.random()).toString(36)}${Date.now()}`;let r=this.topologies.get(e);return null==r&&(r=new Map,this.topologies.set(e,r)),r.set(n,t),n}unregister(e){for(const[t,n]of this.topologies.entries())n.has(e)&&(n.delete(e),0===n.size&&this.topologies.delete(t))}_onDisconnect(e){const t=e.detail;this.components.peerStore.get(t).then((e=>{for(const n of e.protocols){const e=this.topologies.get(n);if(null!=e)for(const n of e.values())!1!==n.filter?.has(t)&&(n.filter?.remove(t),n.onDisconnect?.(t))}})).catch((e=>{e.code!==af.ERR_NOT_FOUND&&this.log.error("could not inform topologies of disconnecting peer %p",t,e)}))}_onPeerUpdate(e){const{peer:t,previous:n}=e.detail,r=(n?.protocols??[]).filter((e=>!t.protocols.includes(e)));for(const e of r){const n=this.topologies.get(e);if(null!=n)for(const e of n.values())!1!==e.filter?.has(t.id)&&(e.filter?.remove(t.id),e.onDisconnect?.(t.id))}}_onPeerIdentify(e){const t=e.detail.protocols,n=e.detail.connection,r=e.detail.peerId;for(const e of t){const t=this.topologies.get(e);if(null!=t)for(const e of t.values())n.transient&&!0!==e.notifyOnTransient||!0!==e.filter?.has(r)&&(e.filter?.add(r),e.onConnect?.(r,n))}}}class Kf extends Map{metric;constructor(e){super();const{name:t,metrics:n}=e;this.metric=n.registerMetric(t),this.updateComponentMetric()}set(e,t){return super.set(e,t),this.updateComponentMetric(),this}delete(e){const t=super.delete(e);return this.updateComponentMetric(),t}clear(){super.clear(),this.updateComponentMetric()}updateComponentMetric(){this.metric.update(this.size)}}class $f{log;components;transports;listeners;faultTolerance;started;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:transports"),this.components=e,this.started=!1,this.transports=new Map,this.listeners=function(e){const{name:t,metrics:n}=e;let r;return r=null!=n?new Kf({name:t,metrics:n}):new Map,r}({name:"libp2p_transport_manager_listeners",metrics:this.components.metrics}),this.faultTolerance=t.faultTolerance??dn.FATAL_ALL}add(e){const t=e[Symbol.toStringTag];if(null==t)throw new fn("Transport must have a valid tag",af.ERR_INVALID_KEY);if(this.transports.has(t))throw new fn(`There is already a transport with the tag ${t}`,af.ERR_DUPLICATE_TRANSPORT);this.log("adding transport %s",t),this.transports.set(t,e),this.listeners.has(t)||this.listeners.set(t,[])}isStarted(){return this.started}start(){this.started=!0}async afterStart(){const e=this.components.addressManager.getListenAddrs();await this.listen(e)}async stop(){const e=[];for(const[t,n]of this.listeners)for(this.log("closing listeners for %s",t);n.length>0;){const t=n.pop();null!=t&&e.push(t.close())}await Promise.all(e),this.log("all listeners closed");for(const e of this.listeners.keys())this.listeners.set(e,[]);this.started=!1}async dial(e,t){const n=this.dialTransportForMultiaddr(e);if(null==n)throw new fn(`No transport available for address ${String(e)}`,af.ERR_TRANSPORT_UNAVAILABLE);try{return await n.dial(e,{...t,upgrader:this.components.upgrader})}catch(e){throw null==e.code&&(e.code=af.ERR_TRANSPORT_DIAL_FAILED),e}}getAddrs(){let e=[];for(const t of this.listeners.values())for(const n of t)e=[...e,...n.getAddrs()];return e}getTransports(){return Array.of(...this.transports.values())}getListeners(){return Array.of(...this.listeners.values()).flat()}dialTransportForMultiaddr(e){for(const t of this.transports.values()){if(t.dialFilter([e]).length>0)return t}}listenTransportForMultiaddr(e){for(const t of this.transports.values()){if(t.listenFilter([e]).length>0)return t}}async listen(e){if(!this.isStarted())throw new fn("Not started",af.ERR_NODE_NOT_STARTED);if(null==e||0===e.length)return void this.log("no addresses were provided for listening, this node is dial only");const t=[];for(const[n,r]of this.transports.entries()){const s=r.listenFilter(e),i=[];for(const e of s){this.log("creating listener for %s on %a",n,e);const t=r.createListener({upgrader:this.components.upgrader});let s=this.listeners.get(n)??[];null==s&&(s=[],this.listeners.set(n,s)),s.push(t),t.addEventListener("listening",(()=>{this.components.events.safeDispatchEvent("transport:listening",{detail:t})})),t.addEventListener("close",(()=>{const e=s.findIndex((e=>e===t));s.splice(e,1),this.components.events.safeDispatchEvent("transport:close",{detail:t})})),i.push(t.listen(e))}if(0===i.length){t.push(n);continue}if(null==(await Promise.allSettled(i)).find((e=>"fulfilled"===e.status))&&this.faultTolerance!==dn.NO_FATAL)throw new fn(`Transport (${n}) could not listen on any available address`,af.ERR_NO_VALID_ADDRESSES)}if(t.length===this.transports.size){const e=`no valid addresses were provided for transports [${t.join(", ")}]`;if(this.faultTolerance===dn.FATAL_ALL)throw new fn(e,af.ERR_NO_VALID_ADDRESSES);this.log(`libp2p in dial mode only: ${e}`)}}async remove(e){const t=this.listeners.get(e)??[];this.log.trace("removing transport %s",e);const n=[];for(this.log.trace("closing listeners for %s",e);t.length>0;){const e=t.pop();null!=e&&n.push(e.close())}await Promise.all(n),this.transports.delete(e),this.listeners.delete(e)}async removeAll(){const e=[];for(const t of this.transports.keys())e.push(this.remove(t));await Promise.all(e)}}const qf="/multistream/1.0.0",Hf=1024,zf=kt("\n");async function Wf(e,t,n){await e.write(t,n)}async function jf(e,t){const n=await async function(e,t){const n=await e.read(t);if(0===n.byteLength||n.get(n.byteLength-1)!==zf[0])throw t.log.error("Invalid mss message - missing newline",n),new fn("missing newline","ERR_INVALID_MULTISTREAM_SELECT_MESSAGE");return n.sublist(0,-1)}(e,t);return Qt(n.subarray())}async function Gf(e,t,n){if(1===(t=Array.isArray(t)?[...t]:[t]).length&&!1===n.negotiateFully)return function(e,t,n){const r=e.sink.bind(e),s=e.source;let i=!1,o=!1;const a=lr();let c=!1,l=!1;const u=lr();let h=!1,d=!1;const p=lr(),f=xr({sink:r,source:s},{...n,maxDataLength:Hf});async function g(){if(o)return n.log.trace("optimistic: already negotiating %s stream",t),void await a.promise;o=!0;try{c||(n.log.trace("optimistic: doing send protocol for %s stream",t),await m()),h||(n.log.trace("optimistic: doing read protocol for %s stream",t),await y())}finally{o=!1,i=!0,a.resolve()}}async function m(){if(l)await u.promise;else{l=!0;try{n.log.trace('optimistic: write ["%s", "%s", data] in source',qf,t),await f.writeV([kt(`${qf}\n`),kt(`${t}\n`)]),n.log.trace('optimistic: wrote ["%s", "%s", data] in source',qf,t)}finally{c=!0,l=!1,u.resolve()}}}async function y(){if(d)await p.promise;else{d=!0;try{n.log.trace("optimistic: reading multistream select header");let e=await jf(f,n);if(n.log.trace('optimistic: read multistream select header "%s"',e),e===qf&&(e=await jf(f,n)),n.log.trace('optimistic: read protocol "%s", expecting "%s"',e,t),e!==t)throw new fn("protocol selection failed","ERR_UNSUPPORTED_PROTOCOL")}finally{h=!0,d=!1,p.resolve()}}}if(e.sink=async e=>{const{sink:r}=f.unwrap();await r(async function*(){let r=!1;for await(const s of e){if(l&&await u.promise,c)yield s;else{l=!0,n.log.trace('optimistic: write ["%s", "%s", data(%d)] in sink',qf,t,s.byteLength);const e=`${t}\n`;yield new Ir(Uint8Array.from([19]),kt(`${qf}\n`),C(e.length),kt(e),s).subarray(),n.log.trace('optimistic: wrote ["%s", "%s", data(%d)] in sink',qf,t,s.byteLength),c=!0,l=!1,u.resolve(),g().catch((e=>{n.log.error("could not finish optimistic protocol negotiation of %s",t,e)}))}r=!0}r||await g()}())},e.source=async function*(){await g(),n.log.trace('optimistic: reading data from "%s" stream',t),yield*f.unwrap().source}(),null!=e.closeRead){const t=e.closeRead.bind(e);e.closeRead=async e=>{i||await g().catch((e=>{n.log.error("could not negotiate protocol before close read",e)})),await t(e)}}if(null!=e.closeWrite){const t=e.closeWrite.bind(e);e.closeWrite=async e=>{i||await g().catch((e=>{n.log.error("could not negotiate protocol before close write",e)})),await t(e)}}if(null!=e.close){const t=e.close.bind(e);e.close=async e=>{const n=[];l&&n.push(u.promise),d&&n.push(p.promise),n.length>0?await Ar(Promise.all(n),e?.signal):(i=!0,o=!1,a.resolve()),await t(e)}}return{stream:e,protocol:t}}(e,t[0],n);const r=xr(e,{...n,maxDataLength:Hf}),s=t.shift();if(null==s)throw new Error("At least one protocol must be specified");n.log.trace('select: write ["%s", "%s"]',qf,s);const i=kt(`${qf}\n`),o=kt(`${s}\n`);await async function(e,t,n){await e.writeV(t,n)}(r,[i,o],n),n.log.trace("select: reading multistream-select header");let a=await jf(r,n);if(n.log.trace('select: read "%s"',a),a===qf&&(n.log.trace("select: reading protocol response"),a=await jf(r,n),n.log.trace('select: read "%s"',a)),a===s)return{stream:r.unwrap(),protocol:s};for(const e of t){n.log.trace('select: write "%s"',e),await Wf(r,kt(`${e}\n`),n),n.log.trace("select: reading protocol response");const t=await jf(r,n);if(n.log.trace('select: read "%s" for "%s"',t,e),t===e)return{stream:r.unwrap(),protocol:e}}throw new fn("protocol selection failed","ERR_UNSUPPORTED_PROTOCOL")}async function Yf(e,t,n){t=Array.isArray(t)?t:[t],n.log.trace("handle: available protocols %s",t);const r=xr(e,{...n,maxDataLength:Hf,maxLengthLength:2});for(;;){n.log.trace("handle: reading incoming string");const e=await jf(r,n);if(n.log.trace('handle: read "%s"',e),e!==qf){if(t.includes(e))return n.log.trace('handle: respond with "%s" for "%s"',e,e),await Wf(r,kt(`${e}\n`),n),n.log.trace('handle: responded with "%s" for "%s"',e,e),{stream:r.unwrap(),protocol:e};if("ls"!==e)n.log('handle: respond with "na" for "%s"',e),await Wf(r,kt("na\n"),n),n.log('handle: responded with "na" for "%s"',e);else{const s=new Ir(...t.map((e=>Or.single(kt(`${e}\n`)))),kt("\n"));n.log.trace('handle: respond with "%s" for %s',t,e),await Wf(r,s,n),n.log.trace('handle: responded with "%s" for %s',t,e)}}else n.log.trace('handle: respond with "%s" for "%s"',qf,e),await Wf(r,kt(`${qf}\n`),n),n.log.trace('handle: responded with "%s" for "%s"',qf,e)}}class Qf{id;remoteAddr;remotePeer;direction;timeline;multiplexer;encryption;status;transient;log;tags;_newStream;_close;_abort;_getStreams;constructor(e){const{remoteAddr:t,remotePeer:n,newStream:r,close:s,abort:i,getStreams:o}=e;this.id=`${parseInt(String(1e9*Math.random())).toString(36)}${Date.now()}`,this.remoteAddr=t,this.remotePeer=n,this.direction=e.direction,this.status="open",this.timeline=e.timeline,this.multiplexer=e.multiplexer,this.encryption=e.encryption,this.transient=e.transient??!1,this.log=e.logger.forComponent(`libp2p:connection:${this.direction}:${this.id}`),null==this.remoteAddr.getPeerId()&&(this.remoteAddr=this.remoteAddr.encapsulate(`/p2p/${this.remotePeer}`)),this._newStream=r,this._close=s,this._abort=i,this._getStreams=o,this.tags=[]}[Symbol.toStringTag]="Connection";[tn]=!0;get streams(){return this._getStreams()}async newStream(e,t){if("closing"===this.status)throw new fn("the connection is being closed","ERR_CONNECTION_BEING_CLOSED");if("closed"===this.status)throw new fn("the connection is closed","ERR_CONNECTION_CLOSED");if(Array.isArray(e)||(e=[e]),this.transient&&!0!==t?.runOnTransientConnection)throw new fn("Cannot open protocol stream on transient connection","ERR_TRANSIENT_CONNECTION");const n=await this._newStream(e,t);return n.direction="outbound",n}async close(e={}){if("closed"!==this.status&&"closing"!==this.status){if(this.log("closing connection to %a",this.remoteAddr),this.status="closing",null==e.signal){const t=AbortSignal.timeout(500);e={...e,signal:t}}try{this.log.trace("closing all streams"),await Promise.all(this.streams.map((async t=>t.close(e)))),this.log.trace("closing underlying transport"),await this._close(e),this.log.trace("updating timeline with close time"),this.status="closed",this.timeline.close=Date.now()}catch(e){this.log.error("error encountered during graceful close of connection to %a",this.remoteAddr,e),this.abort(e)}}}abort(e){this.log.error("aborting connection to %a due to error",this.remoteAddr,e),this.status="closing",this.streams.forEach((t=>{t.abort(e)})),this.log.error("all streams aborted",this.streams.length),this._abort(e),this.timeline.close=Date.now(),this.status="closed"}}function Jf(e,t,n){let r=0;return n.streams.forEach((n=>{n.direction===t&&n.protocol===e&&r++})),r}class Zf{components;connectionEncryption;muxers;inboundUpgradeTimeout;events;constructor(e,t){this.components=e,this.connectionEncryption=new Map,t.connectionEncryption.forEach((e=>{this.connectionEncryption.set(e.protocol,e)})),this.muxers=new Map,t.muxers.forEach((e=>{this.muxers.set(e.protocol,e)})),this.inboundUpgradeTimeout=t.inboundUpgradeTimeout??2e3,this.events=e.events}async shouldBlockConnection(e,t,n){const r=this.components.connectionGater[n];if(void 0!==r&&await r(e,t))throw new fn(`The multiaddr connection is blocked by gater.${n}`,af.ERR_CONNECTION_INTERCEPTED)}async upgradeInbound(e,t){if(!await this.components.connectionManager.acceptIncomingConnection(e))throw new fn("connection denied",af.ERR_CONNECTION_DENIED);let n,r,s,i,o;const a=AbortSignal.timeout(this.inboundUpgradeTimeout),c=()=>{e.abort(new fn("inbound upgrade timeout",mn))};a.addEventListener("abort",c,{once:!0});try{if(!0===await(this.components.connectionGater.denyInboundConnection?.(e)))throw new fn("The multiaddr connection is blocked by gater.acceptConnection",af.ERR_CONNECTION_INTERCEPTED);this.components.metrics?.trackMultiaddrConnection(e),e.log("starting the inbound connection upgrade");let a=e;if(!0!==t?.skipProtection){const t=this.components.connectionProtector;null!=t&&(e.log("protecting the inbound connection"),a=await t.protect(e))}try{if(n=a,!0!==t?.skipEncryption){({conn:n,remotePeer:r,protocol:o}=await this._encryptInbound(a));const e={...a,...n};await this.shouldBlockConnection(r,e,"denyInboundEncryptedConnection")}else{const t=e.remoteAddr.getPeerId();if(null==t)throw new fn("inbound connection that skipped encryption must have a peer id",af.ERR_INVALID_MULTIADDR);const n=Is(t);o="native",r=n}if(s=n,null!=t?.muxerFactory)i=t.muxerFactory;else if(this.muxers.size>0){const e=await this._multiplexInbound({...a,...n},this.muxers);i=e.muxerFactory,s=e.stream}}catch(t){throw e.log.error("failed to upgrade inbound connection",t),t}return await this.shouldBlockConnection(r,e,"denyInboundUpgradedConnection"),e.log("successfully upgraded inbound connection"),this._createConnection({cryptoProtocol:o,direction:"inbound",maConn:e,upgradedConn:s,muxerFactory:i,remotePeer:r,transient:t?.transient})}finally{a.removeEventListener("abort",c),this.components.connectionManager.afterUpgradeInbound()}}async upgradeOutbound(e,t){const n=e.remoteAddr.getPeerId();let r,s,i,o,a,c;null!=n&&(r=Is(n),await this.shouldBlockConnection(r,e,"denyOutboundConnection")),this.components.metrics?.trackMultiaddrConnection(e),e.log("starting the outbound connection upgrade");let l=e;if(!0!==t?.skipProtection){const t=this.components.connectionProtector;null!=t&&(l=await t.protect(e))}try{if(s=l,!0!==t?.skipEncryption){({conn:s,remotePeer:i,protocol:a}=await this._encryptOutbound(l,r));const e={...l,...s};await this.shouldBlockConnection(i,e,"denyOutboundEncryptedConnection")}else{if(null==r)throw new fn("Encryption was skipped but no peer id was passed",af.ERR_INVALID_PEER);a="native",i=r}if(o=s,null!=t?.muxerFactory)c=t.muxerFactory;else if(this.muxers.size>0){const e=await this._multiplexOutbound({...l,...s},this.muxers);c=e.muxerFactory,o=e.stream}}catch(t){throw e.log.error("failed to upgrade outbound connection",t),await e.close(t),t}return await this.shouldBlockConnection(i,e,"denyOutboundUpgradedConnection"),e.log("successfully upgraded outbound connection"),this._createConnection({cryptoProtocol:a,direction:"outbound",maConn:e,upgradedConn:o,muxerFactory:c,remotePeer:i,transient:t?.transient})}_createConnection(e){const{cryptoProtocol:t,direction:n,maConn:r,upgradedConn:s,remotePeer:i,muxerFactory:o,transient:a}=e;let c,l,u;null!=o&&(c=o.createStreamMuxer({direction:n,onIncomingStream:e=>{null!=u&&Promise.resolve().then((async()=>{const t=this.components.registrar.getProtocols(),{stream:n,protocol:r}=await Yf(e,t,{log:e.log,yieldBytes:!1});if(null==u)return;u.log("incoming stream opened on %s",r);const s=function(e,t){try{const{options:n}=t.getHandler(e);return n.maxInboundStreams}catch(e){if(e.code!==af.ERR_NO_HANDLER_FOR_PROTOCOL)throw e}return 32}(r,this.components.registrar);if(Jf(r,"inbound",u)===s){const t=new fn(`Too many inbound protocol streams for protocol "${r}" - limit ${s}`,af.ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS);throw e.abort(t),t}e.source=n.source,e.sink=n.sink,e.protocol=r,null!=n.closeWrite&&(e.closeWrite=n.closeWrite),null!=n.closeRead&&(e.closeRead=n.closeRead),null!=n.close&&(e.close=n.close),await this.components.peerStore.merge(i,{protocols:[r]}),this.components.metrics?.trackProtocolStream(e,u),this._onStream({connection:u,stream:e,protocol:r})})).catch((async t=>{u.log.error("error handling incoming stream id %s",e.id,t.message,t.code,t.stack),null==e.timeline.close&&await e.close()}))}}),l=async(e,t={})=>{if(null==c)throw new fn("Stream is not multiplexed",af.ERR_MUXER_UNAVAILABLE);u.log("starting new stream for protocols %s",e);const n=await c.newStream();u.log.trace("started new stream %s for protocols %s",n.id,e);try{if(null==t.signal){n.log("no abort signal was passed while trying to negotiate protocols %s falling back to default timeout",e);const r=AbortSignal.timeout(3e4);t={...t,signal:r}}n.log.trace("selecting protocol from protocols %s",e);const{stream:r,protocol:s}=await Gf(n,e,{...t,log:n.log,yieldBytes:!0});n.log("selected protocol %s",s);const o=function(e,t,n={}){try{const{options:n}=t.getHandler(e);if(null!=n.maxOutboundStreams)return n.maxOutboundStreams}catch(e){if(e.code!==af.ERR_NO_HANDLER_FOR_PROTOCOL)throw e}return n.maxOutboundStreams??64}(s,this.components.registrar,t),a=Jf(s,"outbound",u);if(a>=o){const e=new fn(`Too many outbound protocol streams for protocol "${s}" - ${a}/${o}`,af.ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS);throw n.abort(e),e}return await this.components.peerStore.merge(i,{protocols:[s]}),n.source=r.source,n.sink=r.sink,n.protocol=s,null!=r.closeWrite&&(n.closeWrite=r.closeWrite),null!=r.closeRead&&(n.closeRead=r.closeRead),null!=r.close&&(n.close=r.close),this.components.metrics?.trackProtocolStream(n,u),n}catch(t){if(u.log.error("could not create new stream for protocols %s",e,t),null==n.timeline.close&&n.abort(t),null!=t.code)throw t;throw new fn(String(t),af.ERR_UNSUPPORTED_PROTOCOL)}},Promise.all([c.sink(s.source),s.sink(c.source)]).catch((e=>{u.log.error("error piping data through muxer",e)})));const h=r.timeline;r.timeline=new Proxy(h,{set:(...e)=>(null!=u&&"close"===e[1]&&null!=e[2]&&null==h.close&&(async()=>{try{"open"===u.status&&await u.close()}catch(e){u.log.error("error closing connection after timeline close",e)}finally{this.events.safeDispatchEvent("connection:close",{detail:u})}})().catch((e=>{u.log.error("error thrown while dispatching connection:close event",e)})),Reflect.set(...e))}),r.timeline.upgraded=Date.now();var d;return d={remoteAddr:r.remoteAddr,remotePeer:i,status:"open",direction:n,timeline:r.timeline,multiplexer:c?.protocol,encryption:t,transient:a,logger:this.components.logger,newStream:l??(()=>{throw new fn("connection is not multiplexed",af.ERR_CONNECTION_NOT_MULTIPLEXED)}),getStreams:()=>null!=c?c.streams:[],close:async e=>{null!=c&&(u.log.trace("close muxer"),await c.close(e)),u.log.trace("close maconn"),await r.close(e),u.log.trace("closed maconn")},abort:e=>{r.abort(e),null!=c&&c.abort(e)}},u=new Qf(d),this.events.safeDispatchEvent("connection:open",{detail:u}),u}_onStream(e){const{connection:t,stream:n,protocol:r}=e,{handler:s,options:i}=this.components.registrar.getHandler(r);if(t.transient&&!0!==i.runOnTransientConnection)throw new fn("Cannot open protocol stream on transient connection","ERR_TRANSIENT_CONNECTION");s({connection:t,stream:n})}async _encryptInbound(e){const t=Array.from(this.connectionEncryption.keys());e.log("handling inbound crypto protocol selection",t);try{const{stream:n,protocol:r}=await Yf(e,t,{log:e.log}),s=this.connectionEncryption.get(r);if(null==s)throw new Error(`no crypto module found for ${r}`);return e.log("encrypting inbound connection using",r),{...await s.secureInbound(this.components.peerId,n),protocol:r}}catch(t){throw e.log.error("encrypting inbound connection failed",t),new fn(t.message,af.ERR_ENCRYPTION_FAILED)}}async _encryptOutbound(e,t){const n=Array.from(this.connectionEncryption.keys());e.log("selecting outbound crypto protocol",n);try{e.log.trace("selecting encrypter from %s",n);const{stream:r,protocol:s}=await Gf(e,n,{log:e.log,yieldBytes:!0}),i=this.connectionEncryption.get(s);if(null==i)throw new Error(`no crypto module found for ${s}`);return e.log("encrypting outbound connection to %p using %s",t,i),{...await i.secureOutbound(this.components.peerId,r,t),protocol:s}}catch(n){throw e.log.error("encrypting outbound connection to %p failed",t,n),new fn(n.message,af.ERR_ENCRYPTION_FAILED)}}async _multiplexOutbound(e,t){const n=Array.from(t.keys());e.log("outbound selecting muxer %s",n);try{e.log.trace("selecting stream muxer from %s",n);const{stream:r,protocol:s}=await Gf(e,n,{log:e.log,yieldBytes:!0});e.log("selected %s as muxer protocol",s);return{stream:r,muxerFactory:t.get(s)}}catch(t){throw e.log.error("error multiplexing outbound connection",t),new fn(String(t),af.ERR_MUXER_UNAVAILABLE)}}async _multiplexInbound(e,t){const n=Array.from(t.keys());e.log("inbound handling muxers %s",n);try{const{stream:r,protocol:s}=await Yf(e,n,{log:e.log});return{stream:r,muxerFactory:t.get(s)}}catch(t){throw e.log.error("error multiplexing inbound connection",t),new fn(String(t),af.ERR_MUXER_UNAVAILABLE)}}}class Xf extends wn{peerId;peerStore;contentRouting;peerRouting;metrics;services;logger;status;components;log;constructor(e){super(),this.status="stopped";const t=new wn,n=t.dispatchEvent.bind(t);t.dispatchEvent=e=>{const t=n(e),r=this.dispatchEvent(new vn(e.type,{detail:e.detail}));return t||r},this.peerId=e.peerId,this.logger=e.logger??ps(),this.log=this.logger.forComponent("libp2p"),this.services={};const r=this.components=function(e={}){const t=new Wd(e);return new Proxy(t,{get(e,n,r){if("string"==typeof n&&!Gd.includes(n)){const e=t.components[n];if(null==e&&!jd.includes(n))throw new fn(`${n} not set`,"ERR_SERVICE_MISSING");return e}return Reflect.get(e,n,r)},set:(e,n,r)=>("string"==typeof n?t.components[n]=r:Reflect.set(e,n,r),!0)})}({peerId:e.peerId,privateKey:e.privateKey,nodeInfo:e.nodeInfo??{name:"libp2p",version:"1.6.0"},logger:this.logger,events:t,datastore:e.datastore??new $d,connectionGater:Zd(e.connectionGater),dns:e.dns});this.peerStore=this.configureComponent("peerStore",new Md(r,{addressFilter:this.components.connectionGater.filterMultiaddrForPeer,...e.peerStore})),null!=e.metrics&&(this.metrics=this.configureComponent("metrics",e.metrics(this.components))),r.events.addEventListener("peer:update",(e=>{if(null==e.detail.previous){const t={id:e.detail.peer.id,multiaddrs:e.detail.peer.addresses.map((e=>e.multiaddr))};r.events.safeDispatchEvent("peer:discovery",{detail:t})}})),null!=e.connectionProtector&&this.configureComponent("connectionProtector",e.connectionProtector(r)),this.components.upgrader=new Zf(this.components,{connectionEncryption:(e.connectionEncryption??[]).map(((e,t)=>this.configureComponent(`connection-encryption-${t}`,e(this.components)))),muxers:(e.streamMuxers??[]).map(((e,t)=>this.configureComponent(`stream-muxers-${t}`,e(this.components)))),inboundUpgradeTimeout:e.connectionManager.inboundUpgradeTimeout}),this.configureComponent("transportManager",new $f(this.components,e.transportManager)),this.configureComponent("connectionManager",new Mf(this.components,e.connectionManager)),this.configureComponent("registrar",new Vf(this.components)),this.configureComponent("addressManager",new zd(this.components,e.addresses));const s=(e.peerRouters??[]).map(((e,t)=>this.configureComponent(`peer-router-${t}`,e(this.components))));this.peerRouting=this.components.peerRouting=this.configureComponent("peerRouting",new Uf(this.components,{routers:s}));const i=(e.contentRouters??[]).map(((e,t)=>this.configureComponent(`content-router-${t}`,e(this.components))));if(this.contentRouting=this.components.contentRouting=this.configureComponent("contentRouting",new Of(this.components,{routers:i})),this.configureComponent("randomWalk",new Ff(this.components)),(e.peerDiscovery??[]).forEach(((e,t)=>{this.configureComponent(`peer-discovery-${t}`,e(this.components)).addEventListener("peer",(e=>{this.#M(e)}))})),e.transports?.forEach(((e,t)=>{this.components.transportManager.add(this.configureComponent(`transport-${t}`,e(this.components)))})),null!=e.services)for(const t of Object.keys(e.services)){const n=(0,e.services[t])(this.components);null!=n?(this.services[t]=n,this.configureComponent(t,n),null!=n[nn]&&(this.log("registering service %s for content routing",t),i.push(n[nn])),null!=n[an]&&(this.log("registering service %s for peer routing",t),s.push(n[an])),null!=n[rn]&&(this.log("registering service %s for peer discovery",t),n[rn].addEventListener?.("peer",(e=>{this.#M(e)})))):this.log.error("service factory %s returned null or undefined instance",t)}}configureComponent(e,t){return null==t&&this.log.error("component %s was null or undefined",e),this.components[e]=t,t}async start(){if("stopped"===this.status){this.status="starting",this.log("libp2p is starting");try{await(this.components.beforeStart?.()),await this.components.start(),await(this.components.afterStart?.()),this.status="started",this.safeDispatchEvent("start",{detail:this}),this.log("libp2p has started")}catch(e){throw this.log.error("An error occurred starting libp2p",e),this.status="started",await this.stop(),e}}}async stop(){"started"===this.status&&(this.log("libp2p is stopping"),this.status="stopping",await(this.components.beforeStop?.()),await this.components.stop(),await(this.components.afterStop?.()),this.status="stopped",this.safeDispatchEvent("stop",{detail:this}),this.log("libp2p has stopped"))}getConnections(e){return this.components.connectionManager.getConnections(e)}getDialQueue(){return this.components.connectionManager.getDialQueue()}getPeers(){const e=new jh;for(const t of this.components.connectionManager.getConnections())e.add(t.remotePeer);return Array.from(e)}async dial(e,t={}){return this.components.connectionManager.openConnection(e,{priority:75,...t})}async dialProtocol(e,t,n={}){if(null==t)throw new fn("no protocols were provided to open a stream",af.ERR_INVALID_PROTOCOLS_FOR_STREAM);if(0===(t=Array.isArray(t)?t:[t]).length)throw new fn("no protocols were provided to open a stream",af.ERR_INVALID_PROTOCOLS_FOR_STREAM);return(await this.dial(e,n)).newStream(t,n)}getMultiaddrs(){return this.components.addressManager.getAddresses()}getProtocols(){return this.components.registrar.getProtocols()}async hangUp(e,t={}){ar(e)&&(e=Is(e.getPeerId()??"")),await this.components.connectionManager.closeConnections(e,t)}async getPublicKey(e,t={}){if(this.log("getPublicKey %p",e),null!=e.publicKey)return e.publicKey;try{const t=await this.peerStore.get(e);if(null!=t.id.publicKey)return t.id.publicKey}catch(e){if(e.code!==af.ERR_NOT_FOUND)throw e}const n=Rn([kt("/pk/"),e.multihash.digest]),r=await this.contentRouting.get(n,t);return Kl(r),await this.peerStore.patch(e,{publicKey:r}),r}async handle(e,t,n){Array.isArray(e)||(e=[e]),await Promise.all(e.map((async e=>{await this.components.registrar.handle(e,t,n)})))}async unhandle(e){Array.isArray(e)||(e=[e]),await Promise.all(e.map((async e=>{await this.components.registrar.unhandle(e)})))}async register(e,t){return this.components.registrar.register(e,t)}unregister(e){this.components.registrar.unregister(e)}async isDialable(e,t={}){return this.components.connectionManager.isDialable(e,t)}#M(e){const{detail:t}=e;t.id.toString()!==this.peerId.toString()?this.components.peerStore.merge(t.id,{multiaddrs:t.multiaddrs}).catch((e=>{this.log.error(e)})):this.log.error(new Error(af.ERR_DISCOVERED_SELF))}}async function eg(e={}){const t=e.peerId??=await Gh();if(null==t.privateKey)throw new fn("peer id was missing private key","ERR_MISSING_PRIVATE_KEY");return e.privateKey??=await ql(t.privateKey),new Xf(await async function(e){const t=cf(lf,e);if(null===t.connectionProtector&&null!=globalThis.process?.env?.LIBP2P_FORCE_PNET)throw new fn(of.ERR_PROTECTOR_REQUIRED,af.ERR_PROTECTOR_REQUIRED);if(!(await As(t.privateKey.public.bytes,t.privateKey.bytes)).equals(t.peerId))throw new fn("Private key doesn't match peer id",af.ERR_INVALID_KEY);return t}(e))}new en("SHARDING"),fs("datastore:core:tiered");const tg=(e,t)=>t.some((t=>e instanceof t));let ng,rg;const sg=new WeakMap,ig=new WeakMap,og=new WeakMap;let ag={get(e,t,n){if(e instanceof IDBTransaction){if("done"===t)return sg.get(e);if("store"===t)return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return hg(e[t])},set:(e,t,n)=>(e[t]=n,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function cg(e){ag=e(ag)}function lg(e){return(rg||(rg=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(e)?function(...t){return e.apply(dg(this),t),hg(this.request)}:function(...t){return hg(e.apply(dg(this),t))}}function ug(e){return"function"==typeof e?lg(e):(e instanceof IDBTransaction&&function(e){if(sg.has(e))return;const t=new Promise(((t,n)=>{const r=()=>{e.removeEventListener("complete",s),e.removeEventListener("error",i),e.removeEventListener("abort",i)},s=()=>{t(),r()},i=()=>{n(e.error||new DOMException("AbortError","AbortError")),r()};e.addEventListener("complete",s),e.addEventListener("error",i),e.addEventListener("abort",i)}));sg.set(e,t)}(e),tg(e,ng||(ng=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction]))?new Proxy(e,ag):e)}function hg(e){if(e instanceof IDBRequest)return function(e){const t=new Promise(((t,n)=>{const r=()=>{e.removeEventListener("success",s),e.removeEventListener("error",i)},s=()=>{t(hg(e.result)),r()},i=()=>{n(e.error),r()};e.addEventListener("success",s),e.addEventListener("error",i)}));return og.set(t,e),t}(e);if(ig.has(e))return ig.get(e);const t=ug(e);return t!==e&&(ig.set(e,t),og.set(t,e)),t}const dg=e=>og.get(e);const pg=["get","getKey","getAll","getAllKeys","count"],fg=["put","add","delete","clear"],gg=new Map;function mg(e,t){if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(gg.get(t))return gg.get(t);const n=t.replace(/FromIndex$/,""),r=t!==n,s=fg.includes(n);if(!(n in(r?IDBIndex:IDBObjectStore).prototype)||!s&&!pg.includes(n))return;const i=async function(e,...t){const i=this.transaction(e,s?"readwrite":"readonly");let o=i.store;return r&&(o=o.index(t.shift())),(await Promise.all([o[n](...t),s&&i.done]))[0]};return gg.set(t,i),i}cg((e=>({...e,get:(t,n,r)=>mg(t,n)||e.get(t,n,r),has:(t,n)=>!!mg(t,n)||e.has(t,n)})));const yg=["continue","continuePrimaryKey","advance"],wg={},bg=new WeakMap,vg=new WeakMap,Eg={get(e,t){if(!yg.includes(t))return e[t];let n=wg[t];return n||(n=wg[t]=function(...e){bg.set(this,vg.get(this)[t](...e))}),n}};async function*Sg(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;const n=new Proxy(t,Eg);for(vg.set(n,t),og.set(n,dg(t));t;)yield n,t=await(bg.get(n)||t.continue()),bg.delete(n)}function _g(e,t){return t===Symbol.asyncIterator&&tg(e,[IDBIndex,IDBObjectStore,IDBCursor])||"iterate"===t&&tg(e,[IDBIndex,IDBObjectStore])}cg((e=>({...e,get:(t,n,r)=>_g(t,n)?Sg:e.get(t,n,r),has:(t,n)=>_g(t,n)||e.has(t,n)})));class Ig extends Fd{location;version;db;constructor(e,t={}){super(),this.location=`${t.prefix??""}${e}`,this.version=t.version??1}async open(){try{const e=this.location;this.db=await function(e,t,{blocked:n,upgrade:r,blocking:s,terminated:i}={}){const o=indexedDB.open(e,t),a=hg(o);return r&&o.addEventListener("upgradeneeded",(e=>{r(hg(o.result),e.oldVersion,e.newVersion,hg(o.transaction),e)})),n&&o.addEventListener("blocked",(e=>n(e.oldVersion,e.newVersion,e))),a.then((e=>{i&&e.addEventListener("close",(()=>i())),s&&e.addEventListener("versionchange",(e=>s(e.oldVersion,e.newVersion,e)))})).catch((()=>{})),a}(e,this.version,{upgrade(t){t.createObjectStore(e)}})}catch(e){throw function(e){return e=e??new Error("Cannot open database"),Vr(e,"ERR_DB_OPEN_FAILED")}(e)}}async close(){this.db?.close()}async put(e,t){if(null==this.db)throw new Error("Datastore needs to be opened.");try{return await this.db.put(this.location,t,e.toString()),e}catch(e){throw function(e){return e=e??new Error("Write failed"),Vr(e,"ERR_DB_WRITE_FAILED")}(e)}}async get(e){if(null==this.db)throw new Error("Datastore needs to be opened.");let t;try{t=await this.db.get(this.location,e.toString())}catch(e){throw Vd(e)}if(void 0===t)throw Kd();return t}async has(e){if(null==this.db)throw new Error("Datastore needs to be opened.");try{return Boolean(await this.db.getKey(this.location,e.toString()))}catch(e){throw Vd(e)}}async delete(e){if(null==this.db)throw new Error("Datastore needs to be opened.");try{await this.db.delete(this.location,e.toString())}catch(e){throw function(e){return e=e??new Error("Delete failed"),Vr(e,"ERR_DB_DELETE_FAILED")}(e)}}batch(){const e=[],t=[];return{put(t,n){e.push({key:t,value:n})},delete(e){t.push(e)},commit:async()=>{if(null==this.db)throw new Error("Datastore needs to be opened.");const n=this.db.transaction(this.location,"readwrite");try{const r=e.filter((({key:e})=>null==t.find((t=>t.toString()===e.toString())))).map((e=>async()=>{await n.store.put(e.value,e.key.toString())})).concat(t.map((e=>async()=>{await n.store.delete(e.toString())}))).concat((async()=>{await n.done}));await Promise.all(r.map((async e=>{await e()})))}catch{n.abort()}}}}async*query(e){let t=this.#O(e,((e,t)=>({key:e,value:t})));Array.isArray(e.filters)&&(t=e.filters.reduce(((e,t)=>Ld(e,t)),t)),Array.isArray(e.orders)&&(t=e.orders.reduce(((e,t)=>Bd(e,t)),t)),yield*t}async*queryKeys(e){let t=this.#O(e,(e=>e));Array.isArray(e.filters)&&(t=e.filters.reduce(((e,t)=>Ld(e,t)),t)),Array.isArray(e.orders)&&(t=e.orders.reduce(((e,t)=>Bd(e,t)),t)),yield*t}async*#O(e,t){if(null==this.db)throw new Error("Datastore needs to be opened.");let n=0,r=-1;for(const s of await this.db.getAllKeys(this.location)){if(null!=e.prefix&&!s.toString().startsWith(e.prefix))continue;if(null!=e.limit&&n===e.limit)return;if(r++,null!=e.offset&&r<e.offset)continue;const i=new en(s.toString());let o;try{o=await this.get(i)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e;continue}null!=o&&(yield t(i,o),n++)}}async destroy(){await function(e,{blocked:t}={}){const n=indexedDB.deleteDatabase(e);return t&&n.addEventListener("blocked",(e=>t(e.oldVersion,e))),hg(n).then((()=>{}))}(this.location)}}function Rg(){const e=lr();let t=!1;return{sink:async n=>{if(t)throw new Error("already piped");t=!0,e.resolve(n)},source:async function*(){const t=await e.promise;yield*t}()}}const Ag=65535,Tg=Boolean(globalThis.process?.env?.DUMP_SESSION_KEYS),Dg=e=>new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4));function kg(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name}if(!(68===new Uint8Array(new Uint32Array([287454020]).buffer)[0]))throw new Error("Non little-endian hardware is not supported");function Pg(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function Cg(e){if("string"==typeof e)e=Pg(e);else{if(!kg(e))throw new Error("expected Uint8Array, got "+typeof e);e=e.slice()}return e}const xg=e=>"[object Object]"===Object.prototype.toString.call(e)&&e.constructor===Object;function Ng(e,t){if(!kg(e))throw new Error("Uint8Array expected");if("number"==typeof t&&e.length!==t)throw new Error(`Uint8Array length ${t} expected`)}const Mg=(e,t)=>(Object.assign(t,e),t);function Og(e,t,n,r){if("function"==typeof e.setBigUint64)return e.setBigUint64(t,n,r);const s=BigInt(32),i=BigInt(4294967295),o=Number(n>>s&i),a=Number(n&i);e.setUint32(t+4,o,r),e.setUint32(t+0,a,r)}function Lg(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`wrong positive integer: ${e}`)}function Bg(e){if("boolean"!=typeof e)throw new Error(`boolean expected, not ${e}`)}function Ug(e,...t){if(null==(n=e)||"object"!=typeof n||!(n instanceof Uint8Array||"Uint8Array"===n.constructor.name))throw new Error("Uint8Array expected");var n;if(t.length>0&&!t.includes(e.length))throw new Error(`Uint8Array expected of length ${t}, not of length=${e.length}`)}function Fg(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")}const Vg=(e,t)=>255&e[t++]|(255&e[t++])<<8;class Kg{constructor(e){this.blockLen=16,this.outputLen=16,this.buffer=new Uint8Array(16),this.r=new Uint16Array(10),this.h=new Uint16Array(10),this.pad=new Uint16Array(8),this.pos=0,this.finished=!1,Ng(e=Cg(e),32);const t=Vg(e,0),n=Vg(e,2),r=Vg(e,4),s=Vg(e,6),i=Vg(e,8),o=Vg(e,10),a=Vg(e,12),c=Vg(e,14);this.r[0]=8191&t,this.r[1]=8191&(t>>>13|n<<3),this.r[2]=7939&(n>>>10|r<<6),this.r[3]=8191&(r>>>7|s<<9),this.r[4]=255&(s>>>4|i<<12),this.r[5]=i>>>1&8190,this.r[6]=8191&(i>>>14|o<<2),this.r[7]=8065&(o>>>11|a<<5),this.r[8]=8191&(a>>>8|c<<8),this.r[9]=c>>>5&127;for(let t=0;t<8;t++)this.pad[t]=Vg(e,16+2*t)}process(e,t,n=!1){const r=n?0:2048,{h:s,r:i}=this,o=i[0],a=i[1],c=i[2],l=i[3],u=i[4],h=i[5],d=i[6],p=i[7],f=i[8],g=i[9],m=Vg(e,t+0),y=Vg(e,t+2),w=Vg(e,t+4),b=Vg(e,t+6),v=Vg(e,t+8),E=Vg(e,t+10),S=Vg(e,t+12),_=Vg(e,t+14);let I=s[0]+(8191&m),R=s[1]+(8191&(m>>>13|y<<3)),A=s[2]+(8191&(y>>>10|w<<6)),T=s[3]+(8191&(w>>>7|b<<9)),D=s[4]+(8191&(b>>>4|v<<12)),k=s[5]+(v>>>1&8191),P=s[6]+(8191&(v>>>14|E<<2)),C=s[7]+(8191&(E>>>11|S<<5)),x=s[8]+(8191&(S>>>8|_<<8)),N=s[9]+(_>>>5|r),M=0,O=M+I*o+R*(5*g)+A*(5*f)+T*(5*p)+D*(5*d);M=O>>>13,O&=8191,O+=k*(5*h)+P*(5*u)+C*(5*l)+x*(5*c)+N*(5*a),M+=O>>>13,O&=8191;let L=M+I*a+R*o+A*(5*g)+T*(5*f)+D*(5*p);M=L>>>13,L&=8191,L+=k*(5*d)+P*(5*h)+C*(5*u)+x*(5*l)+N*(5*c),M+=L>>>13,L&=8191;let B=M+I*c+R*a+A*o+T*(5*g)+D*(5*f);M=B>>>13,B&=8191,B+=k*(5*p)+P*(5*d)+C*(5*h)+x*(5*u)+N*(5*l),M+=B>>>13,B&=8191;let U=M+I*l+R*c+A*a+T*o+D*(5*g);M=U>>>13,U&=8191,U+=k*(5*f)+P*(5*p)+C*(5*d)+x*(5*h)+N*(5*u),M+=U>>>13,U&=8191;let F=M+I*u+R*l+A*c+T*a+D*o;M=F>>>13,F&=8191,F+=k*(5*g)+P*(5*f)+C*(5*p)+x*(5*d)+N*(5*h),M+=F>>>13,F&=8191;let V=M+I*h+R*u+A*l+T*c+D*a;M=V>>>13,V&=8191,V+=k*o+P*(5*g)+C*(5*f)+x*(5*p)+N*(5*d),M+=V>>>13,V&=8191;let K=M+I*d+R*h+A*u+T*l+D*c;M=K>>>13,K&=8191,K+=k*a+P*o+C*(5*g)+x*(5*f)+N*(5*p),M+=K>>>13,K&=8191;let $=M+I*p+R*d+A*h+T*u+D*l;M=$>>>13,$&=8191,$+=k*c+P*a+C*o+x*(5*g)+N*(5*f),M+=$>>>13,$&=8191;let q=M+I*f+R*p+A*d+T*h+D*u;M=q>>>13,q&=8191,q+=k*l+P*c+C*a+x*o+N*(5*g),M+=q>>>13,q&=8191;let H=M+I*g+R*f+A*p+T*d+D*h;M=H>>>13,H&=8191,H+=k*u+P*l+C*c+x*a+N*o,M+=H>>>13,H&=8191,M=(M<<2)+M|0,M=M+O|0,O=8191&M,M>>>=13,L+=M,s[0]=O,s[1]=L,s[2]=B,s[3]=U,s[4]=F,s[5]=V,s[6]=K,s[7]=$,s[8]=q,s[9]=H}finalize(){const{h:e,pad:t}=this,n=new Uint16Array(10);let r=e[1]>>>13;e[1]&=8191;for(let t=2;t<10;t++)e[t]+=r,r=e[t]>>>13,e[t]&=8191;e[0]+=5*r,r=e[0]>>>13,e[0]&=8191,e[1]+=r,r=e[1]>>>13,e[1]&=8191,e[2]+=r,n[0]=e[0]+5,r=n[0]>>>13,n[0]&=8191;for(let t=1;t<10;t++)n[t]=e[t]+r,r=n[t]>>>13,n[t]&=8191;n[9]-=8192;let s=(1^r)-1;for(let e=0;e<10;e++)n[e]&=s;s=~s;for(let t=0;t<10;t++)e[t]=e[t]&s|n[t];e[0]=65535&(e[0]|e[1]<<13),e[1]=65535&(e[1]>>>3|e[2]<<10),e[2]=65535&(e[2]>>>6|e[3]<<7),e[3]=65535&(e[3]>>>9|e[4]<<4),e[4]=65535&(e[4]>>>12|e[5]<<1|e[6]<<14),e[5]=65535&(e[6]>>>2|e[7]<<11),e[6]=65535&(e[7]>>>5|e[8]<<8),e[7]=65535&(e[8]>>>8|e[9]<<5);let i=e[0]+t[0];e[0]=65535&i;for(let n=1;n<8;n++)i=(e[n]+t[n]|0)+(i>>>16)|0,e[n]=65535&i}update(e){Fg(this);const{buffer:t,blockLen:n}=this,r=(e=Cg(e)).length;for(let s=0;s<r;){const i=Math.min(n-this.pos,r-s);if(i!==n)t.set(e.subarray(s,s+i),this.pos),this.pos+=i,s+=i,this.pos===n&&(this.process(t,0,!1),this.pos=0);else for(;n<=r-s;s+=n)this.process(e,s)}return this}destroy(){this.h.fill(0),this.r.fill(0),this.buffer.fill(0),this.pad.fill(0)}digestInto(e){Fg(this),function(e,t){Ug(e);const n=t.outputLen;if(e.length<n)throw new Error(`digestInto() expects output buffer of length at least ${n}`)}(e,this),this.finished=!0;const{buffer:t,h:n}=this;let{pos:r}=this;if(r){for(t[r++]=1;r<16;r++)t[r]=0;this.process(t,0,!0)}this.finalize();let s=0;for(let t=0;t<8;t++)e[s++]=n[t]>>>0,e[s++]=n[t]>>>8;return e}digest(){const{buffer:e,outputLen:t}=this;this.digestInto(e);const n=e.slice(0,t);return this.destroy(),n}}const $g=function(e){const t=(t,n)=>e(n).update(Cg(t)).digest(),n=e(new Uint8Array(32));return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=t=>e(t),t}((e=>new Kg(e))),qg=Pg("expand 16-byte k"),Hg=Pg("expand 32-byte k"),zg=Dg(qg),Wg=Dg(Hg);function jg(e,t){return e<<t|e>>>32-t}function Gg(e){return e.byteOffset%4==0}const Yg=64,Qg=16,Jg=2**32-1,Zg=new Uint32Array;function Xg(e,t){const{allowShortKeys:n,extendNonceFn:r,counterLength:s,counterRight:i,rounds:o}=function(e,t){if(void 0!==t&&("object"!=typeof t||!xg(t)))throw new Error("options must be object or undefined");return Object.assign(e,t)}({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},t);if("function"!=typeof e)throw new Error("core must be a function");return Lg(s),Lg(o),Bg(i),Bg(n),(t,a,c,l,u=0)=>{Ug(t),Ug(a),Ug(c);const h=c.length;if(l||(l=new Uint8Array(h)),Ug(l),Lg(u),u<0||u>=Jg)throw new Error("arx: counter overflow");if(l.length<h)throw new Error(`arx: output (${l.length}) is shorter than data (${h})`);const d=[];let p,f,g=t.length;if(32===g)p=t.slice(),d.push(p),f=Wg;else{if(16!==g||!n)throw new Error(`arx: invalid 32-byte key, got length=${g}`);p=new Uint8Array(32),p.set(t),p.set(t,16),f=zg,d.push(p)}Gg(a)||(a=a.slice(),d.push(a));const m=Dg(p);if(r){if(24!==a.length)throw new Error("arx: extended nonce must be 24 bytes");r(f,m,Dg(a.subarray(0,16)),m),a=a.subarray(16)}const y=16-s;if(y!==a.length)throw new Error(`arx: nonce must be ${y} or 16 bytes`);if(12!==y){const e=new Uint8Array(12);e.set(a,i?0:12-a.length),a=e,d.push(a)}const w=Dg(a);for(!function(e,t,n,r,s,i,o,a){const c=s.length,l=new Uint8Array(Yg),u=Dg(l),h=Gg(s)&&Gg(i),d=h?Dg(s):Zg,p=h?Dg(i):Zg;for(let f=0;f<c;o++){if(e(t,n,r,u,o,a),o>=Jg)throw new Error("arx: counter overflow");const g=Math.min(Yg,c-f);if(h&&g===Yg){const e=f/4;if(f%4!=0)throw new Error("arx: invalid block position");for(let t,n=0;n<Qg;n++)t=e+n,p[t]=d[t]^u[n];f+=Yg}else{for(let e,t=0;t<g;t++)e=f+t,i[e]=s[e]^l[t];f+=g}}}(e,f,m,w,c,l,u,o);d.length>0;)d.pop().fill(0);return l}}function em(e,t,n,r,s,i=20){let o=e[0],a=e[1],c=e[2],l=e[3],u=t[0],h=t[1],d=t[2],p=t[3],f=t[4],g=t[5],m=t[6],y=t[7],w=s,b=n[0],v=n[1],E=n[2],S=o,_=a,I=c,R=l,A=u,T=h,D=d,k=p,P=f,C=g,x=m,N=y,M=w,O=b,L=v,B=E;for(let e=0;e<i;e+=2)S=S+A|0,M=jg(M^S,16),P=P+M|0,A=jg(A^P,12),S=S+A|0,M=jg(M^S,8),P=P+M|0,A=jg(A^P,7),_=_+T|0,O=jg(O^_,16),C=C+O|0,T=jg(T^C,12),_=_+T|0,O=jg(O^_,8),C=C+O|0,T=jg(T^C,7),I=I+D|0,L=jg(L^I,16),x=x+L|0,D=jg(D^x,12),I=I+D|0,L=jg(L^I,8),x=x+L|0,D=jg(D^x,7),R=R+k|0,B=jg(B^R,16),N=N+B|0,k=jg(k^N,12),R=R+k|0,B=jg(B^R,8),N=N+B|0,k=jg(k^N,7),S=S+T|0,B=jg(B^S,16),x=x+B|0,T=jg(T^x,12),S=S+T|0,B=jg(B^S,8),x=x+B|0,T=jg(T^x,7),_=_+D|0,M=jg(M^_,16),N=N+M|0,D=jg(D^N,12),_=_+D|0,M=jg(M^_,8),N=N+M|0,D=jg(D^N,7),I=I+k|0,O=jg(O^I,16),P=P+O|0,k=jg(k^P,12),I=I+k|0,O=jg(O^I,8),P=P+O|0,k=jg(k^P,7),R=R+A|0,L=jg(L^R,16),C=C+L|0,A=jg(A^C,12),R=R+A|0,L=jg(L^R,8),C=C+L|0,A=jg(A^C,7);let U=0;r[U++]=o+S|0,r[U++]=a+_|0,r[U++]=c+I|0,r[U++]=l+R|0,r[U++]=u+A|0,r[U++]=h+T|0,r[U++]=d+D|0,r[U++]=p+k|0,r[U++]=f+P|0,r[U++]=g+C|0,r[U++]=m+x|0,r[U++]=y+N|0,r[U++]=w+M|0,r[U++]=b+O|0,r[U++]=v+L|0,r[U++]=E+B|0}const tm=Xg(em,{counterRight:!1,counterLength:4,allowShortKeys:!1}),nm=new Uint8Array(16),rm=(e,t)=>{e.update(t);const n=t.length%16;n&&e.update(nm.subarray(n))},sm=new Uint8Array(32);function im(e,t,n,r,s){const i=e(t,n,sm),o=$g.create(i);s&&rm(o,s),rm(o,r);const a=new Uint8Array(16),c=(l=a,new DataView(l.buffer,l.byteOffset,l.byteLength));var l;Og(c,0,BigInt(s?s.length:0),!0),Og(c,8,BigInt(r.length),!0),o.update(a);const u=o.digest();return i.fill(0),u}const om=Mg({blockSize:64,nonceLength:12,tagLength:16},(am=tm,(e,t,n)=>{const r=16;return Ng(e,32),Ng(t),{encrypt:(s,i)=>{const o=s.length,a=o+r;i?Ng(i,a):i=new Uint8Array(a),am(e,t,s,i,1);const c=im(am,e,t,i.subarray(0,-16),n);return i.set(c,o),i},decrypt:(s,i)=>{const o=s.length,a=o-r;if(o<r)throw new Error("encrypted data must be at least 16 bytes");i?Ng(i,a):i=new Uint8Array(a);const c=s.subarray(0,-16);if(!function(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return 0===n}(s.subarray(-16),im(am,e,t,c,n)))throw new Error("invalid tag");return am(e,t,c,i,1),i}}}));var am;const cm=new Uint8Array([0]),lm=new Uint8Array;const um={hashSHA256:e=>yl(e.subarray()),getHKDF(e,t){const n=function(e,t,n){return xs(e),void 0===n&&(n=new Uint8Array(e.outputLen)),Uo(e,Vs(n),Vs(t))}(yl,t,e),r=function(e,t,n,r=32){if(xs(e),Ps(r),r>255*e.outputLen)throw new Error("Length should be <= 255*HashLen");const s=Math.ceil(r/e.outputLen);void 0===n&&(n=lm);const i=new Uint8Array(s*e.outputLen),o=Uo.create(e,t),a=o._cloneInto(),c=new Uint8Array(o.outputLen);for(let t=0;t<s;t++)cm[0]=t+1,a.update(0===t?lm:c).update(n).update(cm).digestInto(c),i.set(c,e.outputLen*t),o._cloneInto(a);return o.destroy(),a.destroy(),c.fill(0),cm.fill(0),i.slice(0,r)}(yl,n,void 0,96),s=r;return[s.subarray(0,32),s.subarray(32,64),s.subarray(64,96)]},generateX25519KeyPair(){const e=vo.utils.randomPrivateKey();return{publicKey:vo.getPublicKey(e),privateKey:e}},generateX25519KeyPairFromSeed:e=>({publicKey:vo.getPublicKey(e),privateKey:e}),generateX25519SharedKey:(e,t)=>vo.getSharedSecret(e.subarray(),t.subarray()),chaCha20Poly1305Encrypt:(e,t,n,r)=>om(r,t,n).encrypt(e.subarray()),chaCha20Poly1305Decrypt:(e,t,n,r,s)=>om(r,t,n).decrypt(e.subarray(),s)},hm=um;const dm=e=>{const t=w(2);return t[0]=e>>8,t[1]=e,t};dm.bytes=2;const pm=e=>{if(e.length<2)throw RangeError("Could not decode int16BE");if(e instanceof Uint8Array){let t=0;return t+=e[0]<<8,t+=e[1],t}return e.getUint16(0)};function fm(e,t){t.enabled&&Tg&&(e?(t(`LOCAL_STATIC_PUBLIC_KEY ${Qt(e.publicKey,"hex")}`),t(`LOCAL_STATIC_PRIVATE_KEY ${Qt(e.privateKey,"hex")}`)):t("Missing local static keys."))}function gm(e,t){t.enabled&&Tg&&(e?(t(`LOCAL_PUBLIC_EPHEMERAL_KEY ${Qt(e.publicKey,"hex")}`),t(`LOCAL_PRIVATE_EPHEMERAL_KEY ${Qt(e.privateKey,"hex")}`)):t("Missing local ephemeral keys."))}function mm(e,t){t.enabled&&Tg&&t(e?`REMOTE_EPHEMERAL_PUBLIC_KEY ${Qt(e.subarray(),"hex")}`:"Missing remote ephemeral keys.")}function ym(e,t,n){n.enabled&&Tg&&(n(`CIPHER_STATE_1 ${e.n.getUint64()} ${e.k&&Qt(e.k,"hex")}`),n(`CIPHER_STATE_2 ${t.n.getUint64()} ${t.k&&Qt(t.k,"hex")}`))}function wm(e,t){if(e.length!==t.length)throw new Error("Inputs should have the same length");const n=w(e.length);for(let r=0;r<e.length;r++)n[r]=e[r]^t[r];return n}pm.bytes=2;class bm extends Error{code;constructor(e="Unexpected Peer"){super(e),this.code=bm.code}static code="ERR_UNEXPECTED_PEER"}class vm extends Error{code;constructor(e="Invalid crypto exchange"){super(e),this.code=vm.code}static code="ERR_INVALID_CRYPTO_EXCHANGE"}class Em{n;bytes;view;constructor(e=0){this.n=e,this.bytes=y(12),this.view=new DataView(this.bytes.buffer,this.bytes.byteOffset,this.bytes.byteLength),this.view.setUint32(4,e,!0)}increment(){this.n++,this.view.setUint32(4,this.n,!0)}getBytes(){return this.bytes}getUint64(){return this.n}assertValue(){if(this.n>4294967295)throw new Error("Cipherstate has reached maximum n, a new handshake must be performed")}}const Sm=y(0);class _m{k;n;crypto;constructor(e,t=void 0,n=0){this.crypto=e,this.k=t,this.n=new Em(n)}hasKey(){return Boolean(this.k)}encryptWithAd(e,t){if(!this.hasKey())return t;this.n.assertValue();const n=this.crypto.encrypt(t,this.n.getBytes(),e,this.k);return this.n.increment(),n}decryptWithAd(e,t,n){if(!this.hasKey())return t;this.n.assertValue();const r=this.crypto.decrypt(t,this.n.getBytes(),e,this.k,n);return this.n.increment(),r}}class Im{cs;ck;h;crypto;constructor(e,t){this.crypto=e;const n=kt(t,"utf-8");this.h=function(e,t){if(t.length<=32){const e=y(32);return e.set(t),e}return e.hash(t)}(e,n),this.ck=this.h,this.cs=new _m(e)}mixKey(e){const[t,n]=this.crypto.hkdf(this.ck,e);this.ck=t,this.cs=new _m(this.crypto,n)}mixHash(e){this.h=this.crypto.hash(new Ir(this.h,e))}encryptAndHash(e){const t=this.cs.encryptWithAd(this.h,e);return this.mixHash(t),t}decryptAndHash(e){const t=this.cs.decryptWithAd(this.h,e);return this.mixHash(e),t}split(){const[e,t]=this.crypto.hkdf(this.ck,Sm);return[new _m(this.crypto,e),new _m(this.crypto,t)]}}class Rm{ss;s;e;rs;re;initiator;crypto;constructor(e){const{crypto:t,protocolName:n,prologue:r,initiator:s,s:i,e:o,rs:a,re:c}=e;this.crypto=t,this.ss=new Im(t,n),this.ss.mixHash(r),this.initiator=s,this.s=i,this.e=o,this.rs=a,this.re=c}writeE(){if(this.e)throw new Error("ephemeral keypair is already set");const e=this.crypto.generateKeypair();return this.ss.mixHash(e.publicKey),this.e=e,e.publicKey}writeS(){if(!this.s)throw new Error("static keypair is not set");return this.ss.encryptAndHash(this.s.publicKey)}writeEE(){if(!this.e)throw new Error("ephemeral keypair is not set");if(!this.re)throw new Error("remote ephemeral public key is not set");this.ss.mixKey(this.crypto.dh(this.e,this.re))}writeES(){if(this.initiator){if(!this.e)throw new Error("ephemeral keypair is not set");if(!this.rs)throw new Error("remote static public key is not set");this.ss.mixKey(this.crypto.dh(this.e,this.rs))}else{if(!this.s)throw new Error("static keypair is not set");if(!this.re)throw new Error("remote ephemeral public key is not set");this.ss.mixKey(this.crypto.dh(this.s,this.re))}}writeSE(){if(this.initiator){if(!this.s)throw new Error("static keypair is not set");if(!this.re)throw new Error("remote ephemeral public key is not set");this.ss.mixKey(this.crypto.dh(this.s,this.re))}else{if(!this.e)throw new Error("ephemeral keypair is not set");if(!this.rs)throw new Error("remote static public key is not set");this.ss.mixKey(this.crypto.dh(this.e,this.rs))}}readE(e,t=0){if(this.re)throw new Error("remote ephemeral public key is already set");if(e.byteLength<t+32)throw new Error("message is not long enough");this.re=e.sublist(t,t+32),this.ss.mixHash(this.re)}readS(e,t=0){if(this.rs)throw new Error("remote static public key is already set");const n=32+(this.ss.cs.hasKey()?16:0);if(e.byteLength<t+n)throw new Error("message is not long enough");const r=e.sublist(t,t+n);return this.rs=this.ss.decryptAndHash(r),n}readEE(){this.writeEE()}readES(){this.writeES()}readSE(){this.writeSE()}}class Am extends Rm{writeMessageA(e){return new Ir(this.writeE(),this.ss.encryptAndHash(e))}writeMessageB(e){const t=this.writeE();this.writeEE();const n=this.writeS();return this.writeES(),new Ir(t,n,this.ss.encryptAndHash(e))}writeMessageC(e){const t=this.writeS();return this.writeSE(),new Ir(t,this.ss.encryptAndHash(e))}readMessageA(e){try{return this.readE(e),this.ss.decryptAndHash(e.sublist(32))}catch(e){throw new vm(`handshake stage 0 validation fail: ${e.message}`)}}readMessageB(e){try{this.readE(e),this.readEE();const t=this.readS(e,32);return this.readES(),this.ss.decryptAndHash(e.sublist(32+t))}catch(e){throw new vm(`handshake stage 1 validation fail: ${e.message}`)}}readMessageC(e){try{const t=this.readS(e);return this.readSE(),this.ss.decryptAndHash(e.sublist(t))}catch(e){throw new vm(`handshake stage 2 validation fail: ${e.message}`)}}}var Tm,Dm;async function km(e,t,n){const r=await e.sign(Cm(t));return Dm.encode({identityKey:e.public.bytes,identitySig:r,extensions:n})}async function Pm(e,t,n){try{const r=Dm.decode(e);if(n){const e=n.subarray();if(!In(e,r.identityKey))throw new Error(`Payload identity key ${Qt(r.identityKey,"hex")} does not match expected remote identity key ${Qt(e,"hex")}`)}if(!t)throw new Error("Remote static does not exist");const s=Cm(t),i=Kl(r.identityKey);if(!await i.verify(s,r.identitySig))throw new Error("Invalid payload signature");return r}catch(e){throw new bm(e.message)}}function Cm(e){const t=kt("noise-libp2p-static-key:");return e instanceof Uint8Array?Rn([t,e],t.length+e.length):(e.prepend(t),e)}async function xm(e){const{log:t,connection:n,crypto:r,privateKey:s,prologue:i,s:o,remoteIdentityKey:a,extensions:c}=e,l=await km(s,o.publicKey,c),u=new Am({crypto:r,protocolName:"Noise_XX_25519_ChaChaPoly_SHA256",initiator:!0,prologue:i,s:o});fm(u.s,t),t.trace("Stage 0 - Initiator starting to send first message."),await n.write(u.writeMessageA(Sm)),t.trace("Stage 0 - Initiator finished sending first message."),gm(u.e,t),t.trace("Stage 1 - Initiator waiting to receive first message from responder...");const h=u.readMessageB(await n.read());var d,p;t.trace("Stage 1 - Initiator received the message."),mm(u.re,t),d=u.rs,(p=t).enabled&&Tg&&p(d?`REMOTE_STATIC_PUBLIC_KEY ${Qt(d.subarray(),"hex")}`:"Missing remote static public key."),t.trace("Initiator going to check remote's signature...");const f=await Pm(h,u.rs,a);t.trace("All good with the signature!"),t.trace("Stage 2 - Initiator sending third handshake message."),await n.write(u.writeMessageC(l)),t.trace("Stage 2 - Initiator sent message with signed payload.");const[g,m]=u.ss.split();return ym(g,m,t),{payload:f,encrypt:e=>g.encryptWithAd(Sm,e),decrypt:(e,t)=>m.decryptWithAd(Sm,e,t)}}!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.webtransportCerthashes)for(const n of e.webtransportCerthashes)t.uint32(10),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={webtransportCerthashes:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();if(t>>>3==1)n.webtransportCerthashes.push(e.bytes());else e.skipType(7&t)}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Tm||(Tm={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.identityKey&&e.identityKey.byteLength>0&&(t.uint32(10),t.bytes(e.identityKey)),null!=e.identitySig&&e.identitySig.byteLength>0&&(t.uint32(18),t.bytes(e.identitySig)),null!=e.extensions&&(t.uint32(34),Tm.codec().encode(e.extensions,t)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={identityKey:y(0),identitySig:y(0)},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.identityKey=e.bytes();break;case 2:n.identitySig=e.bytes();break;case 4:n.extensions=Tm.codec().decode(e,e.uint32());break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Dm||(Dm={}));class Nm{protocol="/noise";crypto;prologue;staticKey;extensions;metrics;components;constructor(e,t={}){const{staticNoiseKey:n,extensions:r,crypto:s,prologueBytes:i}=t,{metrics:o}=e;this.components=e;const a=s??hm;this.crypto=function(e){return{generateKeypair:e.generateX25519KeyPair,dh:(t,n)=>e.generateX25519SharedKey(t.privateKey,n).subarray(0,32),encrypt:e.chaCha20Poly1305Encrypt,decrypt:e.chaCha20Poly1305Decrypt,hash:e.hashSHA256,hkdf:e.getHKDF}}(a),this.extensions=r,this.metrics=o?function(e){return{xxHandshakeSuccesses:e.registerCounter("libp2p_noise_xxhandshake_successes_total",{help:"Total count of noise xxHandshakes successes_"}),xxHandshakeErrors:e.registerCounter("libp2p_noise_xxhandshake_error_total",{help:"Total count of noise xxHandshakes errors"}),encryptedPackets:e.registerCounter("libp2p_noise_encrypted_packets_total",{help:"Total count of noise encrypted packets successfully"}),decryptedPackets:e.registerCounter("libp2p_noise_decrypted_packets_total",{help:"Total count of noise decrypted packets"}),decryptErrors:e.registerCounter("libp2p_noise_decrypt_errors_total",{help:"Total count of noise decrypt errors"})}}(o):void 0,this.staticKey=n?a.generateX25519KeyPairFromSeed(n):a.generateX25519KeyPair(),this.prologue=i??y(0)}async secureOutbound(e,t,n){const r=xr(t,{lengthEncoder:dm,lengthDecoder:pm,maxDataLength:Ag});if(!e.privateKey)throw new fn("local peerId does not contain private key","ERR_NO_PRIVATE_KEY");const s=await ql(e.privateKey),i=n?.publicKey,o=await this.performHandshakeInitiator(r,s,i),a=await this.createSecureConnection(r,o);return t.source=a.source,t.sink=a.sink,{conn:t,remoteExtensions:o.payload.extensions,remotePeer:await As(o.payload.identityKey)}}async secureInbound(e,t,n){const r=xr(t,{lengthEncoder:dm,lengthDecoder:pm,maxDataLength:Ag});if(!e.privateKey)throw new fn("local peerId does not contain private key","ERR_NO_PRIVATE_KEY");const s=await ql(e.privateKey),i=n?.publicKey,o=await this.performHandshakeResponder(r,s,i),a=await this.createSecureConnection(r,o);return t.source=a.source,t.sink=a.sink,{conn:t,remoteExtensions:o.payload.extensions,remotePeer:await As(o.payload.identityKey)}}async performHandshakeInitiator(e,t,n){let r;try{r=await xm({connection:e,privateKey:t,remoteIdentityKey:n,log:this.components.logger.forComponent("libp2p:noise:xxhandshake"),crypto:this.crypto,prologue:this.prologue,s:this.staticKey,extensions:this.extensions}),this.metrics?.xxHandshakeSuccesses.increment()}catch(e){throw this.metrics?.xxHandshakeErrors.increment(),e}return r}async performHandshakeResponder(e,t,n){let r;try{r=await async function(e){const{log:t,connection:n,crypto:r,privateKey:s,prologue:i,s:o,remoteIdentityKey:a,extensions:c}=e,l=await km(s,o.publicKey,c),u=new Am({crypto:r,protocolName:"Noise_XX_25519_ChaChaPoly_SHA256",initiator:!1,prologue:i,s:o});fm(u.s,t),t.trace("Stage 0 - Responder waiting to receive first message."),u.readMessageA(await n.read()),t.trace("Stage 0 - Responder received first message."),mm(u.re,t),t.trace("Stage 1 - Responder sending out first message with signed payload and static key."),await n.write(u.writeMessageB(l)),t.trace("Stage 1 - Responder sent the second handshake message with signed payload."),gm(u.e,t),t.trace("Stage 2 - Responder waiting for third handshake message...");const h=u.readMessageC(await n.read());t.trace("Stage 2 - Responder received the message, finished handshake.");const d=await Pm(h,u.rs,a),[p,f]=u.ss.split();return ym(p,f,t),{payload:d,encrypt:e=>f.encryptWithAd(Sm,e),decrypt:(e,t)=>p.decryptWithAd(Sm,e,t)}}({connection:e,privateKey:t,remoteIdentityKey:n,log:this.components.logger.forComponent("libp2p:noise:xxhandshake"),crypto:this.crypto,prologue:this.prologue,s:this.staticKey,extensions:this.extensions}),this.metrics?.xxHandshakeSuccesses.increment()}catch(e){throw this.metrics?.xxHandshakeErrors.increment(),e}return r}async createSecureConnection(e,t){const[n,r]=function(){const e=Rg(),t=Rg();return[{source:e.source,sink:t.sink},{source:t.source,sink:e.sink}]}(),s=e.unwrap();return await gr(n,function(e,t){return async function*(n){for await(const r of n)for(let n=0;n<r.length;n+=65519){let s,i=n+65519;i>r.length&&(i=r.length),s=r instanceof Uint8Array?e.encrypt(r.subarray(n,i)):e.encrypt(r.sublist(n,i)),t?.encryptedPackets.increment(),yield new Ir(dm(s.byteLength),s)}}}(t,this.metrics),s,(e=>qr(e,{lengthDecoder:pm})),function(e,t){return async function*(n){for await(const r of n)for(let n=0;n<r.length;n+=Ag){let s=n+Ag;if(s>r.length&&(s=r.length),s-16<n)throw new Error("Invalid chunk");const i=r.sublist(n,s),o=r.subarray(n,s-16);try{const n=e.decrypt(i,o);t?.decryptedPackets.increment(),yield n}catch(e){throw t?.decryptErrors.increment(),e}}}}(t,this.metrics),n),r}}function Mm(e={}){return t=>new Nm(t,e)}function Om(e){if(null!=e){if("function"==typeof e[Symbol.iterator])return e[Symbol.iterator]();if("function"==typeof e[Symbol.asyncIterator])return e[Symbol.asyncIterator]();if("function"==typeof e.next)return e}throw new Error("argument is not an iterator or iterable")}function Lm(e){return null!=e&&("function"==typeof e.then&&"function"==typeof e.catch&&"function"==typeof e.finally)}class Bm{id;direction;timeline;protocol;metadata;source;status;readStatus;writeStatus;log;sinkController;sinkEnd;closed;endErr;streamSource;onEnd;onCloseRead;onCloseWrite;onReset;onAbort;sendCloseWriteTimeout;sendingData;constructor(e){this.sinkController=new AbortController,this.sinkEnd=lr(),this.closed=lr(),this.log=e.log,this.status="open",this.readStatus="ready",this.writeStatus="ready",this.id=e.id,this.metadata=e.metadata??{},this.direction=e.direction,this.timeline={open:Date.now()},this.sendCloseWriteTimeout=e.sendCloseWriteTimeout??5e3,this.onEnd=e.onEnd,this.onCloseRead=e?.onCloseRead,this.onCloseWrite=e?.onCloseWrite,this.onReset=e?.onReset,this.onAbort=e?.onAbort,this.source=this.streamSource=pr({onEnd:e=>{null!=e?this.log.trace("source ended with error",e):this.log.trace("source ended"),this.onSourceEnd(e)}}),this.sink=this.sink.bind(this)}async sink(e){if("ready"!==this.writeStatus)throw new fn(`writable end state is "${this.writeStatus}" not "ready"`,"ERR_SINK_INVALID_STATE");try{this.writeStatus="writing";const t={signal:this.sinkController.signal};if("outbound"===this.direction){const e=this.sendNewStream(t);Lm(e)&&await e}const n=()=>{!function(e,t){const n=Om(e).return?.();var r;null!=(r=n)&&"function"==typeof r.then&&"function"==typeof r.catch&&"function"==typeof r.finally&&n.catch((e=>{t.error("could not cause iterator to return",e)}))}(e,this.log)};try{this.sinkController.signal.addEventListener("abort",n),this.log.trace("sink reading from source");for await(let n of e){n=n instanceof Uint8Array?new Ir(n):n;const e=this.sendData(n,t);Lm(e)&&(this.sendingData=lr(),await e,this.sendingData.resolve(),this.sendingData=void 0)}}finally{this.sinkController.signal.removeEventListener("abort",n)}this.log.trace('sink finished reading from source, write status is "%s"',this.writeStatus),"writing"===this.writeStatus&&(this.writeStatus="closing",this.log.trace("send close write to remote"),await this.sendCloseWrite({signal:AbortSignal.timeout(this.sendCloseWriteTimeout)}),this.writeStatus="closed"),this.onSinkEnd()}catch(e){throw this.log.trace("sink ended with error, calling abort with error",e),this.abort(e),e}finally{this.log.trace("resolve sink end"),this.sinkEnd.resolve()}}onSourceEnd(e){null==this.timeline.closeRead&&(this.timeline.closeRead=Date.now(),this.readStatus="closed",null!=e&&null==this.endErr&&(this.endErr=e),this.onCloseRead?.(),null!=this.timeline.closeWrite?(this.log.trace("source and sink ended"),this.timeline.close=Date.now(),"aborted"!==this.status&&"reset"!==this.status&&(this.status="closed"),null!=this.onEnd&&this.onEnd(this.endErr),this.closed.resolve()):this.log.trace("source ended, waiting for sink to end"))}onSinkEnd(e){null==this.timeline.closeWrite&&(this.timeline.closeWrite=Date.now(),this.writeStatus="closed",null!=e&&null==this.endErr&&(this.endErr=e),this.onCloseWrite?.(),null!=this.timeline.closeRead?(this.log.trace("sink and source ended"),this.timeline.close=Date.now(),"aborted"!==this.status&&"reset"!==this.status&&(this.status="closed"),null!=this.onEnd&&this.onEnd(this.endErr),this.closed.resolve()):this.log.trace("sink ended, waiting for source to end"))}async close(e){this.log.trace("closing gracefully"),this.status="closing",await Ar(Promise.all([this.closeWrite(e),this.closeRead(e),this.closed.promise]),e?.signal),this.status="closed",this.log.trace("closed gracefully")}async closeRead(e={}){if("closing"===this.readStatus||"closed"===this.readStatus)return;this.log.trace('closing readable end of stream with starting read status "%s"',this.readStatus);const t=this.readStatus;this.readStatus="closing","reset"!==this.status&&"aborted"!==this.status&&null==this.timeline.closeRead&&(this.log.trace("send close read to remote"),await this.sendCloseRead(e)),"ready"===t&&(this.log.trace("ending internal source queue with %d queued bytes",this.streamSource.readableLength),this.streamSource.end()),this.log.trace("closed readable end of stream")}async closeWrite(e={}){"closing"!==this.writeStatus&&"closed"!==this.writeStatus&&(this.log.trace('closing writable end of stream with starting write status "%s"',this.writeStatus),"ready"===this.writeStatus&&(this.log.trace("sink was never sunk, sink an empty array"),await Ar(this.sink([]),e.signal)),"writing"===this.writeStatus&&(null!=this.sendingData&&await Ar(this.sendingData.promise,e.signal),this.log.trace("aborting source passed to .sink"),this.sinkController.abort(),await Ar(this.sinkEnd.promise,e.signal)),this.writeStatus="closed",this.log.trace("closed writable end of stream"))}abort(e){if("closed"===this.status||"aborted"===this.status||"reset"===this.status)return;this.log("abort with error",e),this.log("try to send reset to remote");const t=this.sendReset();Lm(t)&&t.catch((e=>{this.log.error("error sending reset message",e)})),this.status="aborted",this.timeline.abort=Date.now(),this._closeSinkAndSource(e),this.onAbort?.(e)}reset(){if("closed"===this.status||"aborted"===this.status||"reset"===this.status)return;const e=new fn("stream reset","ERR_STREAM_RESET");this.status="reset",this.timeline.reset=Date.now(),this._closeSinkAndSource(e),this.onReset?.()}_closeSinkAndSource(e){this._closeSink(e),this._closeSource(e)}_closeSink(e){"writing"===this.writeStatus&&(this.log.trace("end sink source"),this.sinkController.abort()),this.onSinkEnd(e)}_closeSource(e){"closing"!==this.readStatus&&"closed"!==this.readStatus&&(this.log.trace("ending source with %d bytes to be read by consumer",this.streamSource.readableLength),this.readStatus="closing",this.streamSource.end(e))}remoteCloseWrite(){"closing"!==this.readStatus&&"closed"!==this.readStatus?(this.log.trace("remote close write"),this._closeSource()):this.log("received remote close write but local source is already closed")}remoteCloseRead(){"closing"!==this.writeStatus&&"closed"!==this.writeStatus?(this.log.trace("remote close read"),this._closeSink()):this.log("received remote close read but local sink is already closed")}destroy(){"closed"!==this.status&&"aborted"!==this.status&&"reset"!==this.status?(this.log.trace("stream destroyed"),this._closeSinkAndSource()):this.log("received destroy but we are already closed")}sourcePush(e){this.streamSource.push(e)}sourceReadableLength(){return this.streamSource.readableLength}}class Um extends Bm{writer;reader;constructor(e){super(e),this.writer=e.bidiStream.writable.getWriter(),this.reader=e.bidiStream.readable.getReader(),Promise.resolve().then((async()=>{for(;;){const t=await this.reader.read();if(t.done)return void e.log("remote closed write");null!=t.value&&this.sourcePush(new Ir(t.value))}})).catch((t=>{e.log.error("error reading from stream",t),this.abort(t)})).finally((()=>{this.remoteCloseWrite()})),this.writer.closed.then((()=>{e.log("writer closed")})).catch((t=>{e.log("writer close promise rejected",t)})).finally((()=>{this.remoteCloseRead()}))}sendNewStream(e){}async sendData(e,t){for await(const n of e)this.log("sendData waiting for writer to be ready"),await Ar(this.writer.ready,t?.signal),this.writer.write(n).catch((e=>{this.log.error("error sending stream data",e)}))}async sendReset(e){this.log("sendReset aborting writer"),await Ar(this.writer.abort(),e?.signal),this.log("sendReset aborted writer")}async sendCloseWrite(e){this.log("sendCloseWrite closing writer"),await Ar(this.writer.close(),e?.signal),this.log("sendCloseWrite closed writer")}async sendCloseRead(e){this.log("sendCloseRead cancelling reader"),await Ar(this.reader.cancel(),e?.signal),this.log("sendCloseRead cancelled reader")}}async function Fm(e,t,n,r,s,i){const o=i.forComponent(`libp2p:webtransport:stream:${n}:${t}`),a=new Um({bidiStream:e,id:t,direction:n,log:o,onEnd:()=>{const e=r.findIndex((e=>e===a));-1!==e&&r.splice(e,1),s?.(a)}});return a}function Vm(){return{source:{[Symbol.asyncIterator]:()=>({next:async()=>new Promise((()=>{}))})},sink:async e=>new Promise((()=>{}))}}function Km(e,t,n,r){let s=0;const i=n.forComponent("libp2p:webtransport:muxer");return{protocol:"webtransport",createStreamMuxer:o=>{"function"==typeof o&&(o={onIncomingStream:o});const a=[];Promise.resolve().then((async()=>{
|
|
80
80
|
//! TODO unclear how to add backpressure here?
|
|
81
|
-
for(;;){const{done:e,value:c}=await t.read();if(e)break;if(a.length>=r.maxInboundStreams)i(`too many inbound streams open - ${a.length}/${r.maxInboundStreams}, closing new incoming stream`),c.writable.close().catch((e=>{i.error(`failed to close inbound stream that crossed our maxInboundStream limit: ${e.message}`)})),c.readable.cancel().catch((e=>{i.error(`failed to close inbound stream that crossed our maxInboundStream limit: ${e.message}`)}));else{const e=await Bm(c,String(s++),"inbound",a,o?.onStreamEnd,n);a.push(e),o?.onIncomingStream?.(e)}}}));const c={protocol:"webtransport",streams:a,newStream:async t=>{i("new outgoing stream",t);const r=await e.createBidirectionalStream(),c=await Bm(r,String(s++),o?.direction??"outbound",a,o?.onStreamEnd,n);return a.push(c),c},close:async()=>{i("closing webtransport muxer gracefully"),e.close()},abort:t=>{i("closing webtransport muxer with err:",t),e.close()},...Um()};return c}}}const Vm=Object.values(It).map((e=>e.decoder)).reduce(((e,t)=>e.or(t)));function Km(e){if(!Tp.matches(e))throw new fn("Invalid multiaddr, was not a WebTransport address","ERR_INVALID_MULTIADDR");const t=e.stringTuples(),n=t.filter((([e,t])=>e===Fn("certhash").code)).map((([e,t])=>{return n=t??"",ut(Vm.decode(n));var n})),r=t.filter((([e,t])=>e===Fn("p2p").code)).map((([e,t])=>Ss(t??"")))[0],s=e.toOptions();let i=s.host;return 6===s.family&&i?.includes(":")&&(i=`[${i}]`),{url:`https://${i}:${s.port}`,certhashes:n,remotePeer:r}}var $m=WebTransport;class qm{log;components;config;metrics;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:webtransport"),this.components=e,this.config={...t,maxInboundStreams:t.maxInboundStreams??1e3,certificates:t.certificates??[]},null!=e.metrics&&(this.metrics={dialerEvents:e.metrics.registerCounterGroup("libp2p_webtransport_dialer_events_total",{label:"event",help:"Total count of WebTransport dialer events by type"})})}[Symbol.toStringTag]="@libp2p/webtransport";[hn]=!0;async dial(e,t){if(!0===t?.signal?.aborted)throw new pn;this.log("dialing %s",e);const n=this.components.peerId;if(void 0===n)throw new fn("Need a local peerid","ERR_INVALID_PARAMETERS");t=t??{};const{url:r,certhashes:s,remotePeer:i}=Km(e);let o,a,c=()=>{},l=!1,u=!1,h=!1;try{this.metrics?.dialerEvents.increment({pending:!0});const d=new $m(`${r}/.well-known/libp2p-webtransport?type=noise`,{serverCertificateHashes:s.map((e=>({algorithm:"sha-256",value:e.digest})))});if(c=e=>{if(!l)try{this.metrics?.dialerEvents.increment({[e]:!0}),d.close()}catch(e){this.log.error("error closing wt session",e)}finally{null!=a&&(a.timeline.close=Date.now()),l=!0}},o=()=>{c(u?"noise_timeout":"ready_timeout")},t.signal?.addEventListener("abort",o,{once:!0}),this.log("wait for session to be ready"),await Promise.race([d.closed,d.ready]),this.log("session became ready"),u=!0,this.metrics?.dialerEvents.increment({ready:!0}),d.closed.catch((e=>{this.log.error("error on remote wt session close",e)})).finally((()=>{c("remote_close")})),h=await Ar(this.authenticateWebTransport(d,n,i,s),t.signal),!h)throw new fn("Failed to authenticate webtransport","ERR_AUTHENTICATION_FAILED");return this.metrics?.dialerEvents.increment({open:!0}),a={close:async()=>{this.log("closing webtransport"),c("close")},abort:e=>{this.log("aborting webtransport due to passed err",e),c("abort")},remoteAddr:e,timeline:{open:Date.now()},log:this.components.logger.forComponent("libp2p:webtransport:maconn"),...Um()},await t.upgrader.upgradeOutbound(a,{skipEncryption:!0,muxerFactory:Fm(d,d.incomingBidirectionalStreams.getReader(),this.components.logger,this.config),skipProtection:!0})}catch(e){throw this.log.error("caught wt session err",e),c(h?"upgrade_error":u?"noise_error":"ready_error"),e}finally{null!=o&&t.signal?.removeEventListener("abort",o)}}async authenticateWebTransport(e,t,n,r=[],s){if(!0===s?.aborted)throw new pn;const i=await e.createBidirectionalStream(),o=i.writable.getWriter(),a=i.readable.getReader(),c={source:async function*(){for(;;){const e=await a.read();if(null!=e.value&&(yield e.value),e.done)break}}(),sink:async e=>{for await(const t of e){await Ar(o.ready,s);const e=t instanceof Uint8Array?t:t.subarray();o.write(e).catch((e=>{this.log.error("could not write chunk during authentication of WebTransport stream",e)}))}}},l=xm()(this.components),{remoteExtensions:u}=await l.secureOutbound(t,c,n);if(o.close().catch((e=>{this.log.error(`Failed to close authentication stream writer: ${e.message}`)})),a.cancel().catch((e=>{this.log.error(`Failed to close authentication stream reader: ${e.message}`)})),h=u?.webtransportCerthashes??[],(d=r.map((e=>e.bytes))).filter((e=>Boolean(h.find((t=>In(e,t)))))).length!==d.length)throw new Error("Our certhashes are not a subset of the remote's reported certhashes");var h,d;return!0}createListener(e){return function(e){throw new Error("Not implemented")}(this.components,(this.config.certificates,this.config.maxInboundStreams))}listenFilter(){return[]}dialFilter(e){return e.filter((e=>{if(!Tp.exactMatch(e))return!1;const{url:t,certhashes:n}=Km(e);return null!=t&&n.length>0}))}}function Hm(e={}){return t=>new qm(t,e)}const zm=[Fn("tcp").code,Fn("dns").code,Fn("dnsaddr").code,Fn("dns4").code,Fn("dns6").code];function Wm(e){let t;try{t=Fn("sni").code}catch(e){return null}for(const[n,r]of e)if(n===t&&void 0!==r)return r;return null}function jm(e){return e.some((([e,t])=>e===Fn("tls").code))}function Gm(e,t,n){const r=Ym[Fn(e).name];if(void 0===r)throw new Error(`Can't interpret protocol ${Fn(e).name}`);const s=r(t,n);return e===Fn("ip6").code?`[${s}]`:s}const Ym={ip4:(e,t)=>e,ip6:(e,t)=>0===t.length?e:`[${e}]`,tcp:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`tcp://${Gm(n[0],n[1]??"",t)}:${e}`},udp:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`udp://${Gm(n[0],n[1]??"",t)}:${e}`},dnsaddr:(e,t)=>e,dns4:(e,t)=>e,dns6:(e,t)=>e,dns:(e,t)=>e,ipfs:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${Gm(n[0],n[1]??"",t)}/ipfs/${e}`},p2p:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${Gm(n[0],n[1]??"",t)}/p2p/${e}`},http:(e,t)=>{const n=jm(t),r=Wm(t);if(n&&null!==r)return`https://${r}`;const s=n?"https://":"http://",i=t.pop();if(void 0===i)throw new Error("Unexpected end of multiaddr");let o=Gm(i[0],i[1]??"",t);return o=o.replace("tcp://",""),`${s}${o}`},"http-path":(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${Gm(n[0],n[1]??"",t)}/${decodeURIComponent(e)}`},tls:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return Gm(n[0],n[1]??"",t)},sni:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return Gm(n[0],n[1]??"",t)},https:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");let r=Gm(n[0],n[1]??"",t);return r=r.replace("tcp://",""),`https://${r}`},ws:(e,t)=>{const n=jm(t),r=Wm(t);if(n&&null!==r)return`wss://${r}`;const s=n?"wss://":"ws://",i=t.pop();if(void 0===i)throw new Error("Unexpected end of multiaddr");let o=Gm(i[0],i[1]??"",t);return o=o.replace("tcp://",""),`${s}${o}`},wss:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");let r=Gm(n[0],n[1]??"",t);return r=r.replace("tcp://",""),`wss://${r}`},"p2p-websocket-star":(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${Gm(n[0],n[1]??"",t)}/p2p-websocket-star`},"p2p-webrtc-star":(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${Gm(n[0],n[1]??"",t)}/p2p-webrtc-star`},"p2p-webrtc-direct":(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${Gm(n[0],n[1]??"",t)}/p2p-webrtc-direct`}};var Qm=async e=>{if(e.readyState>=2)throw new Error("socket closed");1!==e.readyState&&await new Promise(((t,n)=>{function r(){e.removeEventListener("open",s),e.removeEventListener("error",i)}function s(){r(),t()}function i(t){r(),n(t.error??new Error(`connect ECONNREFUSED ${e.url}`))}e.addEventListener("open",s),e.addEventListener("error",i)}))},Zm=(e,t)=>{(t=t??{}).closeOnEnd=!1!==t.closeOnEnd;return async n=>{for await(const t of n){try{await Qm(e)}catch(e){if("socket closed"===e.message)break;throw e}if(e.readyState===e.CLOSING||e.readyState===e.CLOSED)break;e.send(t)}null!=t.closeOnEnd&&e.readyState<=1&&await new Promise(((t,n)=>{e.addEventListener("close",(e=>{if(e.wasClean||1006===e.code)t();else{const t=Object.assign(new Error("ws error"),{event:e});n(t)}})),setTimeout((()=>{e.close()}))}))}},Jm={},Xm={};Object.defineProperty(Xm,"__esModule",{value:!0});class ey{constructor(){this.pullQueue=[],this.pushQueue=[],this.eventHandlers={},this.isPaused=!1,this.isStopped=!1}push(e){if(this.isStopped)return;const t={value:e,done:!1};if(this.pullQueue.length){const e=this.pullQueue.shift();e&&e.resolve(t)}else this.pushQueue.push(Promise.resolve(t)),void 0!==this.highWaterMark&&this.pushQueue.length>=this.highWaterMark&&!this.isPaused&&(this.isPaused=!0,this.eventHandlers.highWater?this.eventHandlers.highWater():console&&console.warn(`EventIterator queue reached ${this.pushQueue.length} items`))}stop(){if(!this.isStopped){this.isStopped=!0,this.remove();for(const e of this.pullQueue)e.resolve({value:void 0,done:!0});this.pullQueue.length=0}}fail(e){if(!this.isStopped)if(this.isStopped=!0,this.remove(),this.pullQueue.length){for(const t of this.pullQueue)t.reject(e);this.pullQueue.length=0}else{const t=Promise.reject(e);t.catch((()=>{})),this.pushQueue.push(t)}}remove(){Promise.resolve().then((()=>{this.removeCallback&&this.removeCallback()}))}[Symbol.asyncIterator](){return{next:e=>{const t=this.pushQueue.shift();return t?(void 0!==this.lowWaterMark&&this.pushQueue.length<=this.lowWaterMark&&this.isPaused&&(this.isPaused=!1,this.eventHandlers.lowWater&&this.eventHandlers.lowWater()),t):this.isStopped?Promise.resolve({value:void 0,done:!0}):new Promise(((e,t)=>{this.pullQueue.push({resolve:e,reject:t})}))},return:()=>(this.isStopped=!0,this.pushQueue.length=0,this.remove(),Promise.resolve({value:void 0,done:!0}))}}}let ty=class{constructor(e,{highWaterMark:t=100,lowWaterMark:n=1}={}){const r=new ey;r.highWaterMark=t,r.lowWaterMark=n,r.removeCallback=e({push:e=>r.push(e),stop:()=>r.stop(),fail:e=>r.fail(e),on:(e,t)=>{r.eventHandlers[e]=t}})||(()=>{}),this[Symbol.asyncIterator]=()=>r[Symbol.asyncIterator](),Object.freeze(this)}};Xm.EventIterator=ty,Xm.default=ty,Object.defineProperty(Jm,"__esModule",{value:!0});const ny=Xm;var ry=Jm.EventIterator=ny.EventIterator;function sy(e){return e instanceof ArrayBuffer||"ArrayBuffer"===e?.constructor?.name&&"number"==typeof e?.byteLength}Jm.subscribe=function(e,t,n){return new ny.EventIterator((({push:n})=>(this.addEventListener(e,n,t),()=>this.removeEventListener(e,n,t))),n)},Jm.default=ny.EventIterator;var iy=(e,t)=>{t=t??{};const n=(e=>{e.binaryType="arraybuffer";const t=async()=>{await new Promise(((t,n)=>{if(s)return void t();if(null!=r)return void n(r);const i=t=>{e.removeEventListener("open",o),e.removeEventListener("error",a),t()},o=()=>{i(t)},a=t=>{i((()=>{n(t.error??new Error(`connect ECONNREFUSED ${e.url}`))}))};e.addEventListener("open",o),e.addEventListener("error",a)}))},n=async function*(){const n=new ry((({push:t,stop:n,fail:r})=>{const s=e=>{let n=null;"string"==typeof e.data&&(n=kt(e.data)),sy(e.data)&&(n=new Uint8Array(e.data)),e.data instanceof Uint8Array&&(n=e.data),null!=n&&t(n)},i=e=>{r(e.error??new Error("Socket error"))};return e.addEventListener("message",s),e.addEventListener("error",i),e.addEventListener("close",n),()=>{e.removeEventListener("message",s),e.removeEventListener("error",i),e.removeEventListener("close",n)}}),{highWaterMark:1/0});await t();for await(const e of n)yield sy(e)?new Uint8Array(e):e}();let r,s=1===e.readyState;return e.addEventListener("open",(()=>{s=!0,r=null})),e.addEventListener("close",(()=>{s=!1,r=null})),e.addEventListener("error",(t=>{s||(r=t.error??new Error(`connect ECONNREFUSED ${e.url}`))})),Object.assign(n,{connected:t})})(e);let r=t.remoteAddress,s=t.remotePort;if(null!=e.url)try{const t=new URL(e.url);r=t.hostname,s=parseInt(t.port,10)}catch{}if(null==r||null==s)throw new Error("Remote connection did not have address and/or port");return{sink:Zm(e,t),source:n,connected:async()=>{await n.connected()},close:async()=>{e.readyState!==e.CONNECTING&&e.readyState!==e.OPEN||await new Promise((t=>{e.addEventListener("close",(()=>{t()})),e.close()}))},destroy:()=>{null!=e.terminate?e.terminate():e.close()},remoteAddress:r,remotePort:s,socket:e}},oy=WebSocket;const ay={"http:":"ws:","https:":"wss:"};function cy(e,t){t=t??{};const n=((e,t)=>{if(e.startsWith("//")&&(e=`${t?.protocol??"ws:"}${e}`),e.startsWith("/")&&null!=t){const n=t.protocol??"ws:",r=t.host,s=null!=t.port&&!0!==r?.endsWith(`:${t.port}`)?`:${t.port}`:"";e=`${n}//${r}${s}${e}`}const n=new URL(e);for(const[e,t]of Object.entries(ay))n.protocol===e&&(n.protocol=t);return n})(e,"undefined"==typeof window?void 0:window.location),r=new oy(n.toString(),t.websocket);return iy(r,t)}var ly=Br((function(){return"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0)}));const uy="object"==typeof window&&"object"==typeof document&&9===document.nodeType,hy=ly(),dy=uy&&!hy,py=hy&&!uy,fy=hy&&uy,gy=void 0!==globalThis.process&&void 0!==globalThis.process.release&&"node"===globalThis.process.release.name&&!hy,my="function"==typeof importScripts&&"undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope;void 0!==globalThis.process&&void 0!==globalThis.process.env&&globalThis.process.env.NODE_ENV;const yy="undefined"!=typeof navigator&&"ReactNative"===navigator.product,wy=Gy("dns4"),by=Gy("dns6"),vy=Gy("dnsaddr"),Ey=jy(Gy("dns"),vy,wy,by),Sy=jy(Gy("ip4"),Gy("ip6")),_y=jy(Wy(Sy,Gy("tcp")),Wy(Ey,Gy("tcp"))),Iy=Wy(Sy,Gy("udp")),Ry=Wy(Iy,Gy("utp")),Ay=Wy(Iy,Gy("quic")),Ty=Wy(Iy,Gy("quic-v1")),Dy=jy(Wy(_y,Gy("ws")),Wy(Ey,Gy("ws"))),ky=jy(Wy(Dy,Gy("p2p")),Dy),Py=jy(Wy(_y,Gy("wss")),Wy(Ey,Gy("wss")),Wy(_y,Gy("tls"),Gy("ws")),Wy(Ey,Gy("tls"),Gy("ws"))),Cy=jy(Wy(Py,Gy("p2p")),Py),xy=jy(Wy(_y,Gy("http")),Wy(Sy,Gy("http")),Wy(Ey,Gy("http"))),Ny=jy(Wy(_y,Gy("https")),Wy(Sy,Gy("https")),Wy(Ey,Gy("https"))),My=Wy(Iy,Gy("webrtc-direct"),Gy("certhash")),Oy=jy(Wy(My,Gy("p2p")),My),Ly=Wy(Ty,Gy("webtransport"),Gy("certhash"),Gy("certhash")),By=jy(Wy(Ly,Gy("p2p")),Ly),Uy=jy(Wy(ky,Gy("p2p-webrtc-star"),Gy("p2p")),Wy(Cy,Gy("p2p-webrtc-star"),Gy("p2p")),Wy(ky,Gy("p2p-webrtc-star")),Wy(Cy,Gy("p2p-webrtc-star"))),Fy=jy(Wy(xy,Gy("p2p-webrtc-direct"),Gy("p2p")),Wy(Ny,Gy("p2p-webrtc-direct"),Gy("p2p")),Wy(xy,Gy("p2p-webrtc-direct")),Wy(Ny,Gy("p2p-webrtc-direct"))),Vy=jy(Dy,Py,xy,Ny,Uy,Fy,_y,Ry,Ay,Ey,Oy,By),Ky=jy(Wy(Vy,Gy("p2p")),Uy,Fy,Oy,By,Gy("p2p")),$y=jy(Wy(Ky,Gy("p2p-circuit"),Ky),Wy(Ky,Gy("p2p-circuit")),Wy(Gy("p2p-circuit"),Ky),Wy(Vy,Gy("p2p-circuit")),Wy(Gy("p2p-circuit"),Vy),Gy("p2p-circuit")),qy=()=>jy(Wy($y,qy),$y),Hy=qy();function zy(e){return function(t){let n;try{n=cr(t)}catch(e){return!1}const r=e(n.protoNames());return null!==r&&(!0===r||!1===r?r:0===r.length)}}function Wy(...e){function t(t){if(t.length<e.length)return null;let n=t;return e.some((e=>(n="function"==typeof e?e().partialMatch(t):e.partialMatch(t),Array.isArray(n)&&(t=n),null===n))),n}return{toString:function(){return"{ "+e.join(" ")+" }"},input:e,matches:zy(t),partialMatch:t}}function jy(...e){function t(t){let n=null;return e.some((e=>{const r="function"==typeof e?e().partialMatch(t):e.partialMatch(t);return null!=r&&(n=r,!0)})),n}return{toString:function(){return"{ "+e.join(" ")+" }"},input:e,matches:zy(t),partialMatch:t}}function Gy(e){const t=e;return{toString:function(){return t},matches:function(e){let n;try{n=cr(e)}catch(e){return!1}const r=n.protoNames();return 1===r.length&&r[0]===t},partialMatch:function(e){return 0===e.length?null:e[0]===t?e.slice(1):null}}}class Yy{log;init;logger;constructor(e,t){this.log=e.logger.forComponent("libp2p:websockets"),this.logger=e.logger,this.init=t}[hn]=!0;[Symbol.toStringTag]="@libp2p/websockets";[Sn]=["@libp2p/transport"];async dial(e,t){this.log("dialing %s",e),t=t??{};const n=function(e,t,n){const r=n.logger.forComponent("libp2p:websockets:maconn"),s={log:r,async sink(t){try{await e.sink(async function*(){for await(const e of t)e instanceof Uint8Array?yield e:yield e.subarray()}())}catch(e){"aborted"!==e.type&&r.error(e)}},source:e.source,remoteAddr:t,timeline:{open:Date.now()},async close(t={}){const n=Date.now();if(null==t.signal){const e=AbortSignal.timeout(500);t={...t,signal:e}}const i=()=>{const{host:e,port:t}=s.remoteAddr.toOptions();r("timeout closing stream to %s:%s after %dms, destroying it manually",e,t,Date.now()-n),this.abort(new fn("Socket close timeout","ERR_SOCKET_CLOSE_TIMEOUT"))};t.signal?.addEventListener("abort",i);try{await e.close()}catch(e){r.error("error closing WebSocket gracefully",e),this.abort(e)}finally{t.signal?.removeEventListener("abort",i),s.timeline.close=Date.now()}},abort(t){const{host:n,port:i}=s.remoteAddr.toOptions();r("timeout closing stream to %s:%s due to error",n,i,t),e.destroy(),s.timeline.close=Date.now()}};return e.socket.addEventListener("close",(()=>{null==s.timeline.close&&(s.timeline.close=Date.now())}),{once:!0}),s}(await this._connect(e,t),e,{logger:this.logger});this.log("new outbound connection %s",n.remoteAddr);const r=await t.upgrader.upgradeOutbound(n);return this.log("outbound connection %s upgraded",n.remoteAddr),r}async _connect(e,t){if(!0===t?.signal?.aborted)throw new pn;const n=e.toOptions();this.log("dialing %s:%s",n.host,n.port);const r=lr(),s=cy(function(e,t){const n=cr(e).stringTuples(),r=n.pop();if(void 0===r)throw new Error("Unexpected end of multiaddr");const s=Fn(r[0]),i=Ym[s.name];if(null==i)throw new Error(`No interpreter found for ${s.name}`);let o=i(r[1]??"",n);return zm.includes(r[0])&&(o=o.replace(/^.*:\/\//,""),o="443"===r[1]?`https://${o}`:`http://${o}`),(o.startsWith("http://")||o.startsWith("https://"))&&(o=new URL(o).toString(),o.endsWith("/")&&(o=o.substring(0,o.length-1))),o}(e),this.init);if(s.socket.addEventListener("error",(()=>{const t=new fn(`Could not connect to ${e.toString()}`,"ERR_CONNECTION_FAILED");this.log.error("connection error:",t),r.reject(t)})),null==t.signal)return await Promise.race([s.connected(),r.promise]),this.log("connected %s",e),s;let i;const o=new Promise(((e,n)=>{i=()=>{n(new pn),s.close().catch((e=>{this.log.error("error closing raw socket",e)}))},!0!==t?.signal?.aborted?t?.signal?.addEventListener("abort",i):i()}));try{await Promise.race([o,r.promise,s.connected()])}finally{null!=i&&t?.signal?.removeEventListener("abort",i)}return this.log("connected %s",e),s}createListener(e){return function(){throw new Error("WebSocket Servers can not be created in the browser!")}(this.logger,this.init)}listenFilter(e){return e=Array.isArray(e)?e:[e],null!=this.init?.filter?this.init?.filter(e):dy||my?function(e){return e.filter((e=>{if(e.protoCodes().includes(290))return!1;const t=e.decapsulateCode(421);return Cy.matches(t)}))}(e):function(e){return e.filter((e=>{if(e.protoCodes().includes(290))return!1;const t=e.decapsulateCode(421);return ky.matches(t)||Cy.matches(t)}))}(e)}dialFilter(e){return this.listenFilter(e)}}function Qy(e={}){return t=>new Yy(t,e)}var Zy;!function(e){e.ERR_ALREADY_ABORTED="ERR_ALREADY_ABORTED",e.ERR_DATA_CHANNEL="ERR_DATA_CHANNEL",e.ERR_CONNECTION_CLOSED="ERR_CONNECTION_CLOSED",e.ERR_HASH_NOT_SUPPORTED="ERR_HASH_NOT_SUPPORTED",e.ERR_INVALID_MULTIADDR="ERR_INVALID_MULTIADDR",e.ERR_INVALID_FINGERPRINT="ERR_INVALID_FINGERPRINT",e.ERR_INVALID_PARAMETERS="ERR_INVALID_PARAMETERS",e.ERR_NOT_IMPLEMENTED="ERR_NOT_IMPLEMENTED",e.ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS="ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS",e.ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS="ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS"}(Zy||(Zy={}));var Jy=function(e,t,n){if(n||2===arguments.length)for(var r,s=0,i=t.length;s<i;s++)!r&&s in t||(r||(r=Array.prototype.slice.call(t,0,s)),r[s]=t[s]);return e.concat(r||Array.prototype.slice.call(t))},Xy=function(e,t,n){this.name=e,this.version=t,this.os=n,this.type="browser"},ew=function(e){this.version=e,this.type="node",this.name="node",this.os=process.platform},tw=function(e,t,n,r){this.name=e,this.version=t,this.os=n,this.bot=r,this.type="bot-device"},nw=function(){this.type="bot",this.bot=!0,this.name="bot",this.version=null,this.os=null},rw=function(){this.type="react-native",this.name="react-native",this.version=null,this.os=null},sw=/(nuhk|curl|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask\ Jeeves\/Teoma|ia_archiver)/,iw=3,ow=[["aol",/AOLShield\/([0-9\._]+)/],["edge",/Edge\/([0-9\._]+)/],["edge-ios",/EdgiOS\/([0-9\._]+)/],["yandexbrowser",/YaBrowser\/([0-9\._]+)/],["kakaotalk",/KAKAOTALK\s([0-9\.]+)/],["samsung",/SamsungBrowser\/([0-9\.]+)/],["silk",/\bSilk\/([0-9._-]+)\b/],["miui",/MiuiBrowser\/([0-9\.]+)$/],["beaker",/BeakerBrowser\/([0-9\.]+)/],["edge-chromium",/EdgA?\/([0-9\.]+)/],["chromium-webview",/(?!Chrom.*OPR)wv\).*Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/],["chrome",/(?!Chrom.*OPR)Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/],["phantomjs",/PhantomJS\/([0-9\.]+)(:?\s|$)/],["crios",/CriOS\/([0-9\.]+)(:?\s|$)/],["firefox",/Firefox\/([0-9\.]+)(?:\s|$)/],["fxios",/FxiOS\/([0-9\.]+)/],["opera-mini",/Opera Mini.*Version\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)(?:\s|$)/],["opera",/OPR\/([0-9\.]+)(:?\s|$)/],["pie",/^Microsoft Pocket Internet Explorer\/(\d+\.\d+)$/],["pie",/^Mozilla\/\d\.\d+\s\(compatible;\s(?:MSP?IE|MSInternet Explorer) (\d+\.\d+);.*Windows CE.*\)$/],["netfront",/^Mozilla\/\d\.\d+.*NetFront\/(\d.\d)/],["ie",/Trident\/7\.0.*rv\:([0-9\.]+).*\).*Gecko$/],["ie",/MSIE\s([0-9\.]+);.*Trident\/[4-7].0/],["ie",/MSIE\s(7\.0)/],["bb10",/BB10;\sTouch.*Version\/([0-9\.]+)/],["android",/Android\s([0-9\.]+)/],["ios",/Version\/([0-9\._]+).*Mobile.*Safari.*/],["safari",/Version\/([0-9\._]+).*Safari/],["facebook",/FB[AS]V\/([0-9\.]+)/],["instagram",/Instagram\s([0-9\.]+)/],["ios-webview",/AppleWebKit\/([0-9\.]+).*Mobile/],["ios-webview",/AppleWebKit\/([0-9\.]+).*Gecko\)$/],["curl",/^curl\/([0-9\.]+)$/],["searchbot",/alexa|bot|crawl(er|ing)|facebookexternalhit|feedburner|google web preview|nagios|postrank|pingdom|slurp|spider|yahoo!|yandex/]],aw=[["iOS",/iP(hone|od|ad)/],["Android OS",/Android/],["BlackBerry OS",/BlackBerry|BB10/],["Windows Mobile",/IEMobile/],["Amazon OS",/Kindle/],["Windows 3.11",/Win16/],["Windows 95",/(Windows 95)|(Win95)|(Windows_95)/],["Windows 98",/(Windows 98)|(Win98)/],["Windows 2000",/(Windows NT 5.0)|(Windows 2000)/],["Windows XP",/(Windows NT 5.1)|(Windows XP)/],["Windows Server 2003",/(Windows NT 5.2)/],["Windows Vista",/(Windows NT 6.0)/],["Windows 7",/(Windows NT 6.1)/],["Windows 8",/(Windows NT 6.2)/],["Windows 8.1",/(Windows NT 6.3)/],["Windows 10",/(Windows NT 10.0)/],["Windows ME",/Windows ME/],["Windows CE",/Windows CE|WinCE|Microsoft Pocket Internet Explorer/],["Open BSD",/OpenBSD/],["Sun OS",/SunOS/],["Chrome OS",/CrOS/],["Linux",/(Linux)|(X11)/],["Mac OS",/(Mac_PowerPC)|(Macintosh)/],["QNX",/QNX/],["BeOS",/BeOS/],["OS/2",/OS\/2/]];const cw="undefined"==typeof document&&"undefined"!=typeof navigator&&"ReactNative"===navigator.product?new rw:"undefined"!=typeof navigator?function(e){var t=function(e){return""!==e&&ow.reduce((function(t,n){var r=n[0],s=n[1];if(t)return t;var i=s.exec(e);return!!i&&[r,i]}),!1)}(e);if(!t)return null;var n=t[0],r=t[1];if("searchbot"===n)return new nw;var s=r[1]&&r[1].split(".").join("_").split("_").slice(0,3);s?s.length<iw&&(s=Jy(Jy([],s,!0),function(e){for(var t=[],n=0;n<e;n++)t.push("0");return t}(iw-s.length),!0)):s=[];var i=s.join("."),o=function(e){for(var t=0,n=aw.length;t<n;t++){var r=aw[t],s=r[0];if(r[1].exec(e))return s}return null}(e),a=sw.exec(e);return a&&a[1]?new tw(n,i,o,a[1]):new Xy(n,i,o)}(navigator.userAgent):function(){var e="undefined"!=typeof process&&process.version;return e?new ew(process.version.slice(1)):null}(),lw=null!=cw&&"firefox"===cw.name,uw=async function*(){},hw=async e=>{};class dw{log;peerConnection;remoteAddr;timeline;metrics;source=uw();sink=hw;constructor(e,t){this.log=e.logger.forComponent("libp2p:webrtc:maconn"),this.remoteAddr=t.remoteAddr,this.timeline=t.timeline,this.peerConnection=t.peerConnection;const n=this.peerConnection.connectionState;this.peerConnection.onconnectionstatechange=()=>{this.log.trace("peer connection state change",this.peerConnection.connectionState,"initial state",n),"disconnected"!==this.peerConnection.connectionState&&"failed"!==this.peerConnection.connectionState&&"closed"!==this.peerConnection.connectionState||(this.timeline.close=Date.now())}}async close(e){this.log.trace("closing connection"),this.peerConnection.close(),this.timeline.close=Date.now(),this.metrics?.increment({close:!0})}abort(e){this.log.error("closing connection due to error",e),this.peerConnection.close(),this.timeline.close=Date.now(),this.metrics?.increment({abort:!0})}}const pw=e=>{const t=e.addEventListener||e.on||e.addListener,n=e.removeEventListener||e.off||e.removeListener;if(!t||!n)throw new TypeError("Emitter is not compatible");return{addListener:t.bind(e),removeListener:n.bind(e)}};function fw(e,t,n){"function"==typeof n&&(n={filter:n});const r=function(e,t,n){let r;const s=new Promise(((s,i)=>{if(!((n={rejectionEvents:["error"],multiArgs:!1,resolveImmediately:!1,...n}).count>=0)||n.count!==Number.POSITIVE_INFINITY&&!Number.isInteger(n.count))throw new TypeError("The `count` option should be at least 0 or more");n.signal?.throwIfAborted();const o=[t].flat(),a=[],{addListener:c,removeListener:l}=pw(e),u=(...e)=>{const t=n.multiArgs?e:e[0];n.filter&&!n.filter(t)||(a.push(t),n.count===a.length&&(r(),s(a)))},h=e=>{r(),i(e)};r=()=>{for(const e of o)l(e,u);for(const e of n.rejectionEvents)l(e,h)};for(const e of o)c(e,u);for(const e of n.rejectionEvents)c(e,h);n.signal&&n.signal.addEventListener("abort",(()=>{h(n.signal.reason)}),{once:!0}),n.resolveImmediately&&s(a)}));if(s.cancel=r,"number"==typeof n.timeout){const e=kh(s,{milliseconds:n.timeout});return e.cancel=r,e}return s}(e,t,n={...n,count:1,resolveImmediately:!1}),s=r.then((e=>e[0]));return s.cancel=r.cancel,s}var gw;!function(e){let t,n;!function(e){e.FIN="FIN",e.STOP_SENDING="STOP_SENDING",e.RESET="RESET",e.FIN_ACK="FIN_ACK"}(e.Flag||(e.Flag={})),function(e){e[e.FIN=0]="FIN",e[e.STOP_SENDING=1]="STOP_SENDING",e[e.RESET=2]="RESET",e[e.FIN_ACK=3]="FIN_ACK"}(t||(t={})),function(e){e.codec=()=>Wt(t)}(e.Flag||(e.Flag={})),e.codec=()=>(null==n&&(n=jt(((t,n,r={})=>{!1!==r.lengthDelimited&&n.fork(),null!=t.flag&&(n.uint32(8),e.Flag.codec().encode(t.flag,n)),null!=t.message&&(n.uint32(18),n.bytes(t.message)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.flag=e.Flag.codec().decode(t);break;case 2:r.message=t.bytes();break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(gw||(gw={}));class mw extends Om{channel;incomingData;maxBufferedAmount;bufferedAmountLowEventTimeout;maxMessageSize;receiveFinAck;finAckTimeout;openTimeout;constructor(e){const t=e.onEnd;switch(e.onEnd=e=>{this.log.trace("readable and writeable ends closed",this.status),Promise.resolve((async()=>{if(null==this.timeline.abort&&null===this.timeline.reset)try{await kh(this.receiveFinAck.promise,{milliseconds:this.finAckTimeout})}catch(e){this.log.error("error receiving FIN_ACK",e)}})).then((()=>{this.incomingData.end(),t?.(e)})).catch((e=>{this.log.error("error ending stream",e)}))},super(e),this.channel=e.channel,this.channel.binaryType="arraybuffer",this.incomingData=pr(),this.bufferedAmountLowEventTimeout=e.bufferedAmountLowEventTimeout??3e4,this.maxBufferedAmount=e.maxBufferedAmount??16777216,this.maxMessageSize=(e.maxMessageSize??16384)-5-2,this.receiveFinAck=lr(),this.finAckTimeout=e.closeTimeout??5e3,this.openTimeout=e.openTimeout??5e3,this.channel.readyState){case"open":this.timeline.open=(new Date).getTime();break;case"closed":case"closing":void 0!==this.timeline.close&&0!==this.timeline.close||(this.timeline.close=Date.now());break;case"connecting":break;default:throw this.log.error("unknown datachannel state %s",this.channel.readyState),new fn("Unknown datachannel state","ERR_INVALID_STATE")}this.channel.onopen=e=>{this.timeline.open=(new Date).getTime()},this.channel.onclose=e=>{this.receiveFinAck.resolve(),this.close().catch((e=>{this.log.error("error closing stream after channel closed",e)}))},this.channel.onerror=e=>{const t=e.error;this.abort(t)},this.channel.onmessage=async e=>{const{data:t}=e;null!==t&&0!==t.byteLength&&this.incomingData.push(new Uint8Array(t,0,t.byteLength))};const n=this;Promise.resolve().then((async()=>{for await(const e of qr(this.incomingData)){const t=n.processIncomingProtobuf(e);null!=t&&n.sourcePush(new Ir(t))}})).catch((e=>{this.log.error("error processing incoming data channel messages",e)}))}sendNewStream(){}async _sendMessage(e,t=!0){if(t&&this.channel.bufferedAmount>this.maxBufferedAmount)try{this.log('channel buffer is %d, wait for "bufferedamountlow" event',this.channel.bufferedAmount),await fw(this.channel,"bufferedamountlow",{timeout:this.bufferedAmountLowEventTimeout})}catch(e){if(e instanceof Rh)throw new fn(`Timed out waiting for DataChannel buffer to clear after ${this.bufferedAmountLowEventTimeout}ms`,"ERR_BUFFER_CLEAR_TIMEOUT");throw e}if("closed"===this.channel.readyState||"closing"===this.channel.readyState)throw new fn(`Invalid datachannel state - ${this.channel.readyState}`,"ERR_INVALID_STATE");"open"!==this.channel.readyState&&(this.log('channel state is "%s" and not "open", waiting for "open" event before sending data',this.channel.readyState),await fw(this.channel,"open",{timeout:this.openTimeout}),this.log('channel state is now "%s", sending data',this.channel.readyState)),this.channel.send(e.subarray())}async sendData(e){for(e=e.sublist();e.byteLength>0;){const t=Math.min(e.byteLength,this.maxMessageSize),n=e.subarray(0,t),r=gw.encode({message:n}),s=Or.single(r);await this._sendMessage(s),e.consume(t)}}async sendReset(){await this._sendFlag(gw.Flag.RESET)}async sendCloseWrite(e){if(await this._sendFlag(gw.Flag.FIN)){this.log.trace("awaiting FIN_ACK");try{await Ar(this.receiveFinAck.promise,e?.signal,{errorMessage:"sending close-write was aborted before FIN_ACK was received",errorCode:"ERR_FIN_ACK_NOT_RECEIVED"})}catch(e){this.log.error("failed to await FIN_ACK",e)}}else this.log.trace("sending FIN failed, not awaiting FIN_ACK");this.receiveFinAck.resolve()}async sendCloseRead(){await this._sendFlag(gw.Flag.STOP_SENDING)}processIncomingProtobuf(e){const t=gw.decode(e);if(void 0!==t.flag&&(this.log.trace('incoming flag %s, write status "%s", read status "%s"',t.flag,this.writeStatus,this.readStatus),t.flag===gw.Flag.FIN&&(this.remoteCloseWrite(),this.log.trace("sending FIN_ACK"),this._sendFlag(gw.Flag.FIN_ACK).catch((e=>{this.log.error("error sending FIN_ACK immediately",e)}))),t.flag===gw.Flag.RESET&&this.reset(),t.flag===gw.Flag.STOP_SENDING&&this.remoteCloseRead(),t.flag===gw.Flag.FIN_ACK&&(this.log.trace("received FIN_ACK"),this.receiveFinAck.resolve())),"ready"===this.readStatus)return t.message}async _sendFlag(e){if("open"!==this.channel.readyState)return this.log.trace('not sending flag %s because channel is "%s" and not "open"',this.channel.readyState,e.toString()),!1;this.log.trace("sending flag %s",e.toString());const t=gw.encode({flag:e}),n=Or.single(t);try{return await this._sendMessage(n,!1),!0}catch(t){this.log.error("could not send flag %s",e.toString(),t)}return!1}}function yw(e){const{channel:t,direction:n}=e;return new mw({id:"inbound"===n?`i${t.id}`:`r${t.id}`,log:e.logger.forComponent(`libp2p:webrtc:stream:${n}:${t.id}`),...e})}const ww="/webrtc";class bw{protocol;peerConnection;bufferedStreams=[];metrics;dataChannelOptions;components;log;constructor(e,t){this.components=e,this.peerConnection=t.peerConnection,this.metrics=t.metrics,this.protocol=t.protocol??ww,this.dataChannelOptions=t.dataChannelOptions??{},this.log=e.logger.forComponent("libp2p:webrtc:datachannelmuxerfactory"),this.peerConnection.ondatachannel=({channel:t})=>{if(this.log.trace('incoming early datachannel with channel id %d and label "%s"',t.id),"init"===t.label)return this.log.trace("closing early init channel"),void t.close();const n={},r=yw({channel:t,direction:"inbound",onEnd:e=>{n.onEnd(e)},logger:e.logger,...this.dataChannelOptions});n.stream=r,n.channel=t,n.onEnd=()=>{this.bufferedStreams=this.bufferedStreams.filter((e=>e.stream.id!==r.id))},this.bufferedStreams.push(n)}}createStreamMuxer(e){return new vw(this.components,{...e,peerConnection:this.peerConnection,dataChannelOptions:this.dataChannelOptions,metrics:this.metrics,streams:this.bufferedStreams,protocol:this.protocol})}}class vw{init;streams;protocol;log;peerConnection;dataChannelOptions;metrics;logger;constructor(e,t){this.init=t,this.log=e.logger.forComponent("libp2p:webrtc:muxer"),this.logger=e.logger,this.streams=t.streams.map((e=>e.stream)),this.peerConnection=t.peerConnection,this.protocol=t.protocol??ww,this.metrics=t.metrics,this.dataChannelOptions=t.dataChannelOptions??{},this.peerConnection.ondatachannel=({channel:e})=>{if(this.log.trace("incoming datachannel with channel id %d",e.id),"init"===e.label)return this.log.trace("closing init channel"),void e.close();const n=yw({channel:e,direction:"inbound",onEnd:()=>{this.log("incoming channel %s ended with state %s",e.id,e.readyState),this.#L(n,e)},logger:this.logger,...this.dataChannelOptions});this.streams.push(n),this.metrics?.increment({incoming_stream:!0}),t?.onIncomingStream?.(n)},this.init.streams.length>0&&queueMicrotask((()=>{this.init.streams.forEach((e=>{e.onEnd=()=>{this.log("incoming early channel %s ended with state %s",e.channel.id,e.channel.readyState),this.#L(e.stream,e.channel)},this.metrics?.increment({incoming_stream:!0}),this.init?.onIncomingStream?.(e.stream)}))}))}#L(e,t){this.log.trace("stream %s %s %s onEnd",e.direction,e.id,e.protocol),function(e,t,n=3e4,r){"open"===e.readyState&&Promise.resolve().then((async()=>{if(e.bufferedAmount>0){r.log("%s drain channel with %d buffered bytes",t,e.bufferedAmount);const s=lr();let i=!1;e.bufferedAmountLowThreshold=0;const o=()=>{i||(r.log("%s drain channel closed before drain",t),s.resolve())};e.addEventListener("close",o,{once:!0}),e.addEventListener("bufferedamountlow",(()=>{i=!0,e.removeEventListener("close",o),s.resolve()})),await kh(s.promise,{milliseconds:n})}})).then((async()=>{"open"===e.readyState&&e.close()})).catch((e=>{r.log.error("error closing outbound stream",e)}))}(t,`${e.direction} ${e.id} ${e.protocol}`,this.dataChannelOptions.drainTimeout,{log:this.log}),this.streams=this.streams.filter((t=>t.id!==e.id)),this.metrics?.increment({stream_end:!0}),this.init?.onStreamEnd?.(e)}async close(e){try{await Promise.all(this.streams.map((async t=>t.close(e))))}catch(e){this.abort(e)}}abort(e){for(const t of this.streams)t.abort(e)}source=uw();sink=hw;newStream(){const e=this.peerConnection.createDataChannel("");this.log.trace("opened outgoing datachannel with channel id %s",e.id);const t=yw({channel:e,direction:"outbound",onEnd:()=>{this.log("outgoing channel %s ended with state %s",e.id,e.readyState),this.#L(t,e)},logger:this.logger,...this.dataChannelOptions});return this.streams.push(t),this.metrics?.increment({outgoing_stream:!0}),t}}const Ew=globalThis.RTCPeerConnection,Sw=globalThis.RTCSessionDescription,_w=globalThis.RTCIceCandidate;function Iw(e,t){const n=xr(e,t),r={read:async(e,t)=>{const r=await n.read(t);return e.decode(r)},write:async(e,t,r)=>{await n.write(t.encode(e),r)},writeV:async(e,t,r)=>{await n.writeV(e.map((e=>t.encode(e))),r)},pb:e=>({read:async t=>r.read(e,t),write:async(t,n)=>r.write(t,e,n),writeV:async(t,n)=>r.writeV(t,e,n),unwrap:()=>r}),unwrap:()=>n.unwrap()};return r}var Rw;!function(e){let t,n;!function(e){e.SDP_OFFER="SDP_OFFER",e.SDP_ANSWER="SDP_ANSWER",e.ICE_CANDIDATE="ICE_CANDIDATE"}(e.Type||(e.Type={})),function(e){e[e.SDP_OFFER=0]="SDP_OFFER",e[e.SDP_ANSWER=1]="SDP_ANSWER",e[e.ICE_CANDIDATE=2]="ICE_CANDIDATE"}(t||(t={})),function(e){e.codec=()=>Wt(t)}(e.Type||(e.Type={})),e.codec=()=>(null==n&&(n=jt(((t,n,r={})=>{!1!==r.lengthDelimited&&n.fork(),null!=t.type&&(n.uint32(8),e.Type.codec().encode(t.type,n)),null!=t.data&&(n.uint32(18),n.string(t.data)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.type=e.Type.codec().decode(t);break;case 2:r.data=t.string();break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Rw||(Rw={}));const Aw=async(e,t,n)=>{try{const r=lr();for(!function(e,t){e[lw?"oniceconnectionstatechange":"onconnectionstatechange"]=n=>{switch(function(e){return lw?e.iceConnectionState:e.connectionState}(e)){case"connected":t.resolve();break;case"failed":case"disconnected":case"closed":t.reject(new fn("RTCPeerConnection was closed","ERR_CONNECTION_CLOSED_BEFORE_CONNECTED"))}}}(e,r);;){const s=await Promise.race([r.promise,t.read({signal:n.signal}).catch((()=>{}))]);if(null==s){n.signal?.throwIfAborted();break}if(s.type!==Rw.Type.ICE_CANDIDATE)throw new fn("ICE candidate message expected","ERR_NOT_ICE_CANDIDATE");const i=JSON.parse(s.data??"null");if(""===i||null===i){n.log.trace("end-of-candidates received");continue}const o=new _w(i);n.log.trace("%s received new ICE candidate %o",n.direction,i);try{await e.addIceCandidate(o)}catch(e){n.log.error("%s bad candidate received",n.direction,i,e)}}}catch(e){if(n.log.error("%s error parsing ICE candidate",n.direction,e),!0===n.signal?.aborted)throw e}};async function Tw({rtcConfiguration:e,dataChannel:t,signal:n,metrics:r,multiaddr:s,connectionManager:i,transportManager:o,log:a,logger:c}){const{baseAddr:l}=function(e){const t=e.toString().split(kw+"/");if(2!==t.length)throw new fn("webrtc protocol was not present in multiaddr",Zy.ERR_INVALID_MULTIADDR);if(!t[0].includes(Pw))throw new fn("p2p-circuit protocol was not present in multiaddr",Zy.ERR_INVALID_MULTIADDR);let n=cr(t[0]);const r=cr("/"+t[1]).getPeerId();if(null==r)throw new fn("destination peer id was missing",Zy.ERR_INVALID_MULTIADDR);const s=n.protos().pop();if(void 0===s)throw new fn("invalid multiaddr",Zy.ERR_INVALID_MULTIADDR);"p2p"!==s.name&&(n=n.encapsulate(`/p2p/${r}`));return{baseAddr:n,peerId:Ss(r)}}(s);r?.dialerEvents.increment({open:!0}),a.trace("dialing base address: %a",l);const u=l.getPeerId();if(null==u)throw new fn("Relay peer was missing","ERR_INVALID_ADDRESS");const h=i.getConnections(Ss(u));let d,p=!1;0===h.length?(d=await o.dial(l,{signal:n}),p=!0):d=h[0];try{const r=await d.newStream(Cw,{signal:n,runOnTransientConnection:!0}),i=Iw(r).pb(Rw),o=new Ew(e),l=new bw({logger:c},{peerConnection:o,dataChannelOptions:t});try{const e=o.createDataChannel("init");o.onicecandidate=({candidate:e})=>{const t=JSON.stringify(e?.toJSON()??null);a.trace("initiator sending ICE candidate %o",e),i.write({type:Rw.Type.ICE_CANDIDATE,data:t},{signal:n}).catch((e=>{a.error("error sending ICE candidate",e)}))},o.onicecandidateerror=e=>{a.error("initiator ICE candidate error",e)};const t=await o.createOffer().catch((e=>{throw a.error("could not execute createOffer",e),new fn("Failed to set createOffer","ERR_SDP_HANDSHAKE_FAILED")}));a.trace("initiator send SDP offer %s",t.sdp),await i.write({type:Rw.Type.SDP_OFFER,data:t.sdp},{signal:n}),await o.setLocalDescription(t).catch((e=>{throw a.error("could not execute setLocalDescription",e),new fn("Failed to set localDescription","ERR_SDP_HANDSHAKE_FAILED")}));const c=await i.read({signal:n});if(c.type!==Rw.Type.SDP_ANSWER)throw new fn("Remote should send an SDP answer","ERR_SDP_HANDSHAKE_FAILED");a.trace("initiator receive SDP answer %s",c.data);const u=new Sw({type:"answer",sdp:c.data});return await o.setRemoteDescription(u).catch((e=>{throw a.error("could not execute setRemoteDescription",e),new fn("Failed to set remoteDescription","ERR_SDP_HANDSHAKE_FAILED")})),a.trace("initiator read candidates until connected"),await Aw(o,i,{direction:"initiator",signal:n,log:a}),a.trace("initiator connected, closing init channel"),e.close(),a.trace("closing signalling channel"),await r.close({signal:n}),a.trace("initiator connected to remote address %s",s),{remoteAddress:s,peerConnection:o,muxerFactory:l}}catch(e){throw a.error("outgoing signalling error",e),o.close(),r.abort(e),e}finally{o.onicecandidate=null,o.onicecandidateerror=null}}finally{if(p)try{await d.close({signal:n})}catch(e){d.abort(e)}}}class Dw extends wn{peerId;transportManager;shutdownController;constructor(e,t){super(),this.peerId=e.peerId,this.transportManager=e.transportManager,this.shutdownController=t.shutdownController}async listen(){this.safeDispatchEvent("listening",{})}getAddrs(){return this.transportManager.getListeners().filter((e=>e!==this)).map((e=>e.getAddrs().filter((e=>Hy.matches(e))).map((e=>e.encapsulate(`/webrtc/p2p/${this.peerId}`))))).flat()}async close(){this.shutdownController.abort(),this.safeDispatchEvent("close",{})}}const kw="/webrtc",Pw="/p2p-circuit",Cw="/webrtc-signaling/0.0.1";class xw{components;init;log;_started=!1;metrics;shutdownController;constructor(e,t={}){this.components=e,this.init=t,this.log=e.logger.forComponent("libp2p:webrtc"),this.shutdownController=new AbortController,this.shutdownController.signal,null!=e.metrics&&(this.metrics={dialerEvents:e.metrics.registerCounterGroup("libp2p_webrtc_dialer_events_total",{label:"event",help:"Total count of WebRTC dialer events by type"}),listenerEvents:e.metrics.registerCounterGroup("libp2p_webrtc_listener_events_total",{label:"event",help:"Total count of WebRTC listener events by type"})})}[hn]=!0;[Symbol.toStringTag]="@libp2p/webrtc";[Sn]=["@libp2p/transport"];[_n]=["@libp2p/identify","@libp2p/circuit-relay-v2-transport"];isStarted(){return this._started}async start(){await this.components.registrar.handle(Cw,(e=>{this._onProtocol(e).catch((t=>{this.log.error("failed to handle incoming connect from %p",e.connection.remotePeer,t)}))}),{runOnTransientConnection:!0}),this._started=!0}async stop(){await this.components.registrar.unhandle(Cw),this._started=!1}createListener(e){return new Dw(this.components,{shutdownController:this.shutdownController})}listenFilter(e){return e.filter(Pp.exactMatch)}dialFilter(e){return this.listenFilter(e)}async dial(e,t){this.log.trace("dialing address: %a",e);const{remoteAddress:n,peerConnection:r,muxerFactory:s}=await Tw({rtcConfiguration:"function"==typeof this.init.rtcConfiguration?await this.init.rtcConfiguration():this.init.rtcConfiguration,dataChannel:this.init.dataChannel,multiaddr:e,dataChannelOptions:this.init.dataChannel,signal:t.signal,connectionManager:this.components.connectionManager,transportManager:this.components.transportManager,log:this.log,logger:this.components.logger}),i=new dw(this.components,{peerConnection:r,timeline:{open:Date.now()},remoteAddr:n,metrics:this.metrics?.dialerEvents}),o=await t.upgrader.upgradeOutbound(i,{skipProtection:!0,skipEncryption:!0,muxerFactory:s});return this._closeOnShutdown(r,i),o}async _onProtocol({connection:e,stream:t}){const n=AbortSignal.timeout(this.init.inboundConnectionTimeout??3e4),r=new Ew("function"==typeof this.init.rtcConfiguration?await this.init.rtcConfiguration():this.init.rtcConfiguration),s=new bw(this.components,{peerConnection:r,dataChannelOptions:this.init.dataChannel});try{const{remoteAddress:i}=await async function({peerConnection:e,stream:t,signal:n,connection:r,log:s}){s.trace("new inbound signaling stream");const i=Iw(t).pb(Rw);try{e.onicecandidate=({candidate:e})=>{const t=JSON.stringify(e?.toJSON()??null);s.trace("recipient sending ICE candidate %s",t),i.write({type:Rw.Type.ICE_CANDIDATE,data:t},{signal:n}).catch((e=>{s.error("error sending ICE candidate",e)}))};const t=await i.read({signal:n});if(t.type!==Rw.Type.SDP_OFFER)throw new fn(`expected message type SDP_OFFER, received: ${t.type??"undefined"} `,"ERR_SDP_HANDSHAKE_FAILED");s.trace("recipient receive SDP offer %s",t.data);const r=new Sw({type:"offer",sdp:t.data});await e.setRemoteDescription(r).catch((e=>{throw s.error("could not execute setRemoteDescription",e),new fn("Failed to set remoteDescription","ERR_SDP_HANDSHAKE_FAILED")}));const o=await e.createAnswer().catch((e=>{throw s.error("could not execute createAnswer",e),new fn("Failed to create answer","ERR_SDP_HANDSHAKE_FAILED")}));s.trace("recipient send SDP answer %s",o.sdp),await i.write({type:Rw.Type.SDP_ANSWER,data:o.sdp},{signal:n}),await e.setLocalDescription(o).catch((e=>{throw s.error("could not execute setLocalDescription",e),new fn("Failed to set localDescription","ERR_SDP_HANDSHAKE_FAILED")})),s.trace("recipient read candidates until connected"),await Aw(e,i,{direction:"recipient",signal:n,log:s})}catch(t){if("connected"!==e.connectionState)throw s.error("error while handling signaling stream from peer %a",r.remoteAddr,t),e.close(),t;s("error while handling signaling stream from peer %a, ignoring as the RTCPeerConnection is already connected",r.remoteAddr,t)}const o=cr(`/webrtc/p2p/${r.remoteAddr.getPeerId()}`);return s.trace("recipient connected to remote address %s",o),{remoteAddress:o}}({peerConnection:r,connection:e,stream:t,signal:n,log:this.log});await t.close({signal:n});const o=new dw(this.components,{peerConnection:r,timeline:{open:(new Date).getTime()},remoteAddr:i,metrics:this.metrics?.listenerEvents});await this.components.upgrader.upgradeInbound(o,{skipEncryption:!0,skipProtection:!0,muxerFactory:s}),this._closeOnShutdown(r,o)}catch(e){throw this.log.error("incoming signalling error",e),r.close(),t.abort(e),e}}_closeOnShutdown(e,t){const n=()=>{t.close().catch((e=>{this.log.error("could not close WebRTCMultiaddrConnection",e)}))};this.shutdownController.signal.addEventListener("abort",n),e.addEventListener("close",(()=>{this.shutdownController.signal.removeEventListener("abort",n)}))}}var Nw;function Mw(e,t){if(kp.matches(e))return!1;return null!=t.dialTransportForMultiaddr(e)&&(!!hp.matches(e)||!!gp.matches(e)&&!1===Yd(e.toOptions().host))}!function(e){let t,n;!function(e){e.UNUSED="UNUSED",e.CONNECT="CONNECT",e.SYNC="SYNC"}(e.Type||(e.Type={})),function(e){e[e.UNUSED=0]="UNUSED",e[e.CONNECT=100]="CONNECT",e[e.SYNC=300]="SYNC"}(t||(t={})),function(e){e.codec=()=>Wt(t)}(e.Type||(e.Type={})),e.codec=()=>(null==n&&(n=jt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.type&&(n.uint32(8),e.Type.codec().encode(t.type,n)),null!=t.observedAddresses)for(const e of t.observedAddresses)n.uint32(18),n.bytes(e);!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={observedAddresses:[]},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.type=e.Type.codec().decode(t);break;case 2:r.observedAddresses.push(t.bytes());break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Nw||(Nw={}));const Ow=5e3,Lw=3,Bw=1,Uw=1;class Fw{started;timeout;retries;maxInboundStreams;maxOutboundStreams;peerStore;registrar;connectionManager;addressManager;transportManager;topologyId;log;constructor(e,t){this.log=e.logger.forComponent("libp2p:dcutr"),this.started=!1,this.peerStore=e.peerStore,this.registrar=e.registrar,this.addressManager=e.addressManager,this.connectionManager=e.connectionManager,this.transportManager=e.transportManager,this.timeout=t.timeout??Ow,this.retries=t.retries??Lw,this.maxInboundStreams=t.maxInboundStreams??Bw,this.maxOutboundStreams=t.maxOutboundStreams??Uw}[Symbol.toStringTag]="@libp2p/dcutr";[_n]=["@libp2p/identify"];isStarted(){return this.started}async start(){this.started||(this.topologyId=await this.registrar.register(Vw,{notifyOnTransient:!0,onConnect:(e,t)=>{t.transient&&"inbound"===t.direction&&this.upgradeInbound(t).catch((e=>{this.log.error("error during outgoing DCUtR attempt",e)}))}}),await this.registrar.handle(Vw,(e=>{this.handleIncomingUpgrade(e.stream,e.connection).catch((t=>{this.log.error("error during incoming DCUtR attempt",t),e.stream.abort(t)}))}),{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnTransientConnection:!0}),this.started=!0)}async stop(){await this.registrar.unhandle(Vw),null!=this.topologyId&&this.registrar.unregister(this.topologyId),this.started=!1}async upgradeInbound(e){if(await this.attemptUnilateralConnectionUpgrade(e))return;let t;for(let n=0;n<this.retries;n++){const r={signal:AbortSignal.timeout(this.timeout)};try{t=await e.newStream([Vw],{signal:r.signal,runOnTransientConnection:!0});const n=Iw(t,{maxDataLength:4096}).pb(Nw);this.log("B sending connect to %p",e.remotePeer);const s=Date.now();await n.write({type:Nw.Type.CONNECT,observedAddresses:this.addressManager.getAddresses().map((e=>e.bytes))},r),this.log("B receiving connect from %p",e.remotePeer);const i=await n.read(r);if(i.type!==Nw.Type.CONNECT)throw this.log("A sent wrong message type"),new fn("DCUtR message type was incorrect",yn);const o=this.getDialableMultiaddrs(i.observedAddresses);if(0===o.length)throw this.log("A did not have any dialable multiaddrs"),new fn("DCUtR connect message had no multiaddrs",yn);const a=Date.now()-s;this.log("A sending sync, rtt %dms",a),await n.write({type:Nw.Type.SYNC,observedAddresses:[]},r),this.log("A waiting for half RTT"),await uf(a/2),this.log("B dialing",o);const c=await this.connectionManager.openConnection(o,{signal:r.signal,priority:100});this.log("DCUtR to %p succeeded to address %a, closing relayed connection",e.remotePeer,c.remoteAddr),await e.close(r);break}catch(e){if(this.log.error("error while attempting DCUtR on attempt %d of %d",n+1,this.retries,e),t?.abort(e),n===this.retries)throw e}finally{null!=t&&await t.close(r)}}}async attemptUnilateralConnectionUpgrade(e){const t=(await this.peerStore.get(e.remotePeer)).addresses.map((t=>{const n=t.multiaddr;return null==n.getPeerId()?n.encapsulate(`/p2p/${e.remotePeer}`):n})).filter((e=>Mw(e,this.transportManager)));if(t.length>0){const n=AbortSignal.timeout(this.timeout);try{this.log("attempting unilateral connection upgrade to %a",t);const r=await this.connectionManager.openConnection(t,{signal:n,force:!0});if(r.transient)throw new Error("Could not open a new, non-transient, connection");return this.log("unilateral connection upgrade to %p succeeded via %a, closing relayed connection",e.remotePeer,r.remoteAddr),await e.close({signal:n}),!0}catch(n){this.log.error("unilateral connection upgrade to %p on addresses %a failed",e.remotePeer,t,n)}}else this.log("peer %p has no public addresses, not attempting unilateral connection upgrade",e.remotePeer);return!1}async handleIncomingUpgrade(e,t){const n={signal:AbortSignal.timeout(this.timeout)};try{const r=Iw(e,{maxDataLength:4096}).pb(Nw);this.log("A receiving connect");const s=await r.read(n);if(s.type!==Nw.Type.CONNECT)throw this.log("B sent wrong message type"),new fn("DCUtR message type was incorrect",yn);if(0===s.observedAddresses.length)throw this.log("B sent no multiaddrs"),new fn("DCUtR connect message had no multiaddrs",yn);const i=this.getDialableMultiaddrs(s.observedAddresses);if(0===i.length)throw this.log("B had no dialable multiaddrs"),new fn("DCUtR connect message had no dialable multiaddrs",yn);this.log("A sending connect"),await r.write({type:Nw.Type.CONNECT,observedAddresses:this.addressManager.getAddresses().map((e=>e.bytes))}),this.log("A receiving sync");if((await r.read(n)).type!==Nw.Type.SYNC)throw new fn("DCUtR message type was incorrect",yn);this.log("A dialing",i);const o=await this.connectionManager.openConnection(i,{signal:n.signal,priority:100,force:!0});this.log("DCUtR to %p succeeded via %a, closing relayed connection",t.remotePeer,o.remoteAddr),await t.close(n)}catch(n){this.log.error("incoming DCUtR from %p failed",t.remotePeer,n),e.abort(n)}finally{await e.close(n)}}getDialableMultiaddrs(e){const t=[];for(const n of e)if(null!=n&&0!==n.length)try{const e=cr(n);if(!Mw(e,this.transportManager))continue;t.push(e)}catch{}return t}}const Vw="/libp2p/dcutr";function Kw(e={}){return t=>new Fw(t,e)}const $w="ERR_INVALID_FRAME",qw="ERR_UNREQUESTED_PING",Hw="ERR_NOT_MATCHING_PING",zw="ERR_STREAM_ALREADY_EXISTS",Ww="ERR_DECODE_INVALID_VERSION",jw="ERR_BOTH_CLIENTS",Gw="ERR_RECV_WINDOW_EXCEEDED",Yw=new Set([$w,qw,Hw,zw,Ww,jw,Gw]),Qw="ERR_INVALID_CONFIG",Zw="ERR_MUXER_LOCAL_CLOSED",Jw="ERR_MUXER_REMOTE_CLOSED",Xw=262144,eb={enableKeepAlive:!0,keepAliveInterval:3e4,maxInboundStreams:1e3,maxOutboundStreams:1e3,initialStreamWindowSize:Xw,maxStreamWindowSize:16777216,maxMessageSize:65536};var tb,nb;!function(e){e[e.Data=0]="Data",e[e.WindowUpdate=1]="WindowUpdate",e[e.Ping=2]="Ping",e[e.GoAway=3]="GoAway"}(tb||(tb={})),function(e){e[e.SYN=1]="SYN",e[e.ACK=2]="ACK",e[e.FIN=4]="FIN",e[e.RST=8]="RST"}(nb||(nb={})),Object.values(nb).filter((e=>"string"!=typeof e));var rb;!function(e){e[e.NormalTermination=0]="NormalTermination",e[e.ProtocolError=1]="ProtocolError",e[e.InternalError=2]="InternalError"}(rb||(rb={}));const sb=2**24;class ib{source;buffer;frameInProgress;constructor(e){this.source=function(e){if(void 0!==e[Symbol.iterator]){const t=e[Symbol.iterator]();return t.return=void 0,{[Symbol.iterator]:()=>t}}if(void 0!==e[Symbol.asyncIterator]){const t=e[Symbol.asyncIterator]();return t.return=void 0,{[Symbol.asyncIterator]:()=>t}}throw new Error("a source must be either an iterable or an async iterable")}(e),this.buffer=new Ir,this.frameInProgress=!1}async*emitFrames(){for await(const e of this.source)for(this.buffer.append(e);;){const e=this.readHeader();if(void 0===e)break;const{type:t,length:n}=e;t===tb.Data?(this.frameInProgress=!0,yield{header:e,readData:this.readBytes.bind(this,n)}):yield{header:e}}}readHeader(){if(this.frameInProgress)throw new fn("decoding frame already in progress","ERR_DECODE_IN_PROGRESS");if(this.buffer.length<12)return;const e=function(e){if(0!==e[0])throw new fn("Invalid frame version",Ww);return{type:e[1],flag:(e[2]<<8)+e[3],streamID:e[4]*sb+(e[5]<<16)+(e[6]<<8)+e[7],length:e[8]*sb+(e[9]<<16)+(e[10]<<8)+e[11]}}(this.buffer.subarray(0,12));return this.buffer.consume(12),e}async readBytes(e){if(this.buffer.length<e)for await(const t of this.source)if(this.buffer.append(t),this.buffer.length>=e)break;const t=this.buffer.sublist(0,e);return this.buffer.consume(e),this.frameInProgress=!1,t}}function ob(e){const t=new Uint8Array(12);return t[1]=e.type,t[2]=e.flag>>>8,t[3]=e.flag,t[4]=e.streamID>>>24,t[5]=e.streamID>>>16,t[6]=e.streamID>>>8,t[7]=e.streamID,t[8]=e.length>>>24,t[9]=e.length>>>16,t[10]=e.length>>>8,t[11]=e.length,t}function ab(e){return null!=e?.then}function cb(e,t){let n=0;if(null!=e[Symbol.asyncIterator])return async function*(){for await(const r of e){const e=t(r,n++);ab(e)&&await e,yield r}}();const r=Hr(e),{value:s,done:i}=r.next();if(!0===i)return function*(){}();const o=t(s,n++);if("function"==typeof o?.then)return async function*(){yield s;for await(const e of r){const r=t(e,n++);ab(r)&&await r,yield e}}();const a=t;return function*(){yield s;for(const e of r)a(e,n++),yield e}()}var lb;!function(e){e[e.Init=0]="Init",e[e.SYNSent=1]="SYNSent",e[e.SYNReceived=2]="SYNReceived",e[e.Established=3]="Established",e[e.Finished=4]="Finished"}(lb||(lb={}));class ub extends Om{name;state;config;_id;sendWindowCapacity;sendWindowCapacityUpdate;recvWindow;recvWindowCapacity;epochStart;getRTT;sendFrame;constructor(e){super({...e,onEnd:t=>{this.state=lb.Finished,e.onEnd?.(t)}}),this.config=e.config,this._id=parseInt(e.id,10),this.name=e.name,this.state=e.state,this.sendWindowCapacity=Xw,this.recvWindow=this.config.initialStreamWindowSize,this.recvWindowCapacity=this.recvWindow,this.epochStart=Date.now(),this.getRTT=e.getRTT,this.sendFrame=e.sendFrame,this.source=cb(this.source,(()=>{this.sendWindowUpdate()}))}async sendNewStream(){}async sendData(e,t={}){for(e=e.sublist();0!==e.byteLength;){if(0===this.sendWindowCapacity&&(this.log?.trace("wait for send window capacity, status %s",this.status),await this.waitForSendWindowCapacity(t),"closed"===this.status||"aborted"===this.status||"reset"===this.status))return void this.log?.trace("%s while waiting for send window capacity",this.status);const n=Math.min(this.sendWindowCapacity,this.config.maxMessageSize-12,e.length),r=this.getSendFlags();this.sendFrame({type:tb.Data,flag:r,streamID:this._id,length:n},e.sublist(0,n)),this.sendWindowCapacity-=n,e.consume(n)}}async sendReset(){this.sendFrame({type:tb.WindowUpdate,flag:nb.RST,streamID:this._id,length:0})}async sendCloseWrite(){const e=this.getSendFlags()|nb.FIN;this.sendFrame({type:tb.WindowUpdate,flag:e,streamID:this._id,length:0})}async sendCloseRead(){}async waitForSendWindowCapacity(e={}){if(this.sendWindowCapacity>0)return;let t,n;const r=()=>{"open"===this.status||"closing"===this.status?n(new fn("stream aborted","ERR_STREAM_ABORT")):t()};e.signal?.addEventListener("abort",r);try{await new Promise(((e,r)=>{this.sendWindowCapacityUpdate=()=>{e()},n=r,t=e}))}finally{e.signal?.removeEventListener("abort",r)}}handleWindowUpdate(e){this.log?.trace("stream received window update id=%s",this._id),this.processFlags(e.flag);const t=this.sendWindowCapacity;this.sendWindowCapacity+=e.length,0===t&&e.length>0&&this.sendWindowCapacityUpdate?.()}async handleData(e,t){if(this.log?.trace("stream received data id=%s",this._id),this.processFlags(e.flag),this.recvWindowCapacity<e.length)throw new fn("receive window exceeded",Gw,{available:this.recvWindowCapacity,recv:e.length});const n=await t();this.recvWindowCapacity-=e.length,this.sourcePush(n)}processFlags(e){(e&nb.ACK)===nb.ACK&&this.state===lb.SYNSent&&(this.state=lb.Established),(e&nb.FIN)===nb.FIN&&this.remoteCloseWrite(),(e&nb.RST)===nb.RST&&this.reset()}getSendFlags(){switch(this.state){case lb.Init:return this.state=lb.SYNSent,nb.SYN;case lb.SYNReceived:return this.state=lb.Established,nb.ACK;default:return 0}}sendWindowUpdate(){const e=this.getSendFlags(),t=Date.now(),n=this.getRTT();if(0===e&&n>-1&&t-this.epochStart<4*n&&(this.recvWindow=Math.min(2*this.recvWindow,this.config.maxStreamWindowSize)),this.recvWindowCapacity>=this.recvWindow&&0===e)return;const r=this.recvWindow-this.recvWindowCapacity;this.recvWindowCapacity=this.recvWindow,this.epochStart=t,this.sendFrame({type:tb.WindowUpdate,flag:e,streamID:this._id,length:r})}}const hb="/yamux/1.0.0";class db{protocol=hb;_components;_init;constructor(e,t={}){this._components=e,this._init=t}createStreamMuxer(e){return new pb(this._components,{...this._init,...e})}}class pb{protocol=hb;source;sink;config;log;logger;closeController;nextStreamID;_streams;nextPingID;activePing;rtt;client;localGoAway;remoteGoAway;numInboundStreams;numOutboundStreams;onIncomingStream;onStreamEnd;constructor(e,t){this.client="outbound"===t.direction,this.config={...eb,...t},this.logger=e.logger,this.log=this.logger.forComponent("libp2p:yamux"),function(e){if(e.keepAliveInterval<=0)throw new fn("keep-alive interval must be positive",Qw);if(e.maxInboundStreams<0)throw new fn("max inbound streams must be larger or equal 0",Qw);if(e.maxOutboundStreams<0)throw new fn("max outbound streams must be larger or equal 0",Qw);if(e.initialStreamWindowSize<Xw)throw new fn("InitialStreamWindowSize must be larger or equal 256 kB",Qw);if(e.maxStreamWindowSize<e.initialStreamWindowSize)throw new fn("MaxStreamWindowSize must be larger than the InitialStreamWindowSize",Qw);if(e.maxStreamWindowSize>2**32-1)throw new fn("MaxStreamWindowSize must be less than equal MAX_UINT32",Qw);if(e.maxMessageSize<1024)throw new fn("MaxMessageSize must be greater than a kilobyte",Qw)}(this.config),this.closeController=new AbortController,this.closeController.signal,this.onIncomingStream=t.onIncomingStream,this.onStreamEnd=t.onStreamEnd,this._streams=new Map,this.source=pr({onEnd:()=>{this.log?.trace("muxer source ended"),this._streams.forEach((e=>{e.destroy()}))}}),this.sink=async e=>{const t=()=>{const t=Nm(e);if(null!=t.return){const e=t.return();null!=(n=e)&&"function"==typeof n.then&&e.catch((e=>{this.log?.("could not cause sink source to return",e)}))}var n};let n,r;try{const r=new ib(e);try{this.closeController.signal.addEventListener("abort",t);for await(const e of r.emitFrames())await this.handleFrame(e.header,e.readData)}finally{this.closeController.signal.removeEventListener("abort",t)}n=rb.NormalTermination}catch(e){const t=e.code;Yw.has(t)?(this.log?.error("protocol error in sink",e),n=rb.ProtocolError):(this.log?.error("internal error in sink",e),n=rb.InternalError),r=e}this.log?.trace("muxer sink ended"),null!=r?this.abort(r,n):await this.close({reason:n})},this.numInboundStreams=0,this.numOutboundStreams=0,this.nextStreamID=this.client?1:2,this.nextPingID=0,this.rtt=-1,this.log?.trace("muxer created"),this.config.enableKeepAlive&&this.keepAliveLoop().catch((e=>this.log?.error("keepalive error: %s",e))),this.ping().catch((e=>this.log?.error("ping error: %s",e)))}get streams(){return Array.from(this._streams.values())}newStream(e){if(void 0!==this.remoteGoAway)throw new fn("muxer closed remotely",Jw);if(void 0!==this.localGoAway)throw new fn("muxer closed locally",Zw);const t=this.nextStreamID;if(this.nextStreamID+=2,this.numOutboundStreams>=this.config.maxOutboundStreams)throw new fn("max outbound streams exceeded","ERROR_MAX_OUTBOUND_STREAMS_EXCEEDED");this.log?.trace("new outgoing stream id=%s",t);const n=this._newStream(t,e,lb.Init,"outbound");return this._streams.set(t,n),this.numOutboundStreams++,n.sendWindowUpdate(),n}async ping(){if(void 0!==this.remoteGoAway)throw new fn("muxer closed remotely",Jw);if(void 0!==this.localGoAway)throw new fn("muxer closed locally",Zw);if(void 0===this.activePing){let e=()=>{};this.activePing={id:this.nextPingID++,promise:new Promise(((t,n)=>{const r=()=>{n(new fn("muxer closed locally",Zw))};this.closeController.signal.addEventListener("abort",r,{once:!0}),e=()=>{this.closeController.signal.removeEventListener("abort",r),t()}})),resolve:e};const t=Date.now();this.sendPing(this.activePing.id);try{await this.activePing.promise}finally{delete this.activePing}const n=Date.now();this.rtt=n-t}else await this.activePing.promise;return this.rtt}getRTT(){return this.rtt}async close(e={}){if(this.closeController.signal.aborted)return;const t=e?.reason??rb.NormalTermination;if(this.log?.trace("muxer close reason=%s",t),null==e.signal){const t=AbortSignal.timeout(500);e={...e,signal:t}}try{await Promise.all([...this._streams.values()].map((async t=>t.close(e)))),this.sendGoAway(t),this._closeMuxer()}catch(e){this.abort(e)}}abort(e,t){if(!this.closeController.signal.aborted){t=t??rb.InternalError,this.log?.error("muxer abort reason=%s error=%s",t,e);for(const t of this._streams.values())t.abort(e);this.sendGoAway(t),this._closeMuxer()}}isClosed(){return this.closeController.signal.aborted}_closeMuxer(){this.closeController.abort(),this.source.end()}_newStream(e,t,n,r){if(null!=this._streams.get(e))throw new fn("Stream already exists",zw,{id:e});const s=new ub({id:e.toString(),name:t,state:n,direction:r,sendFrame:this.sendFrame.bind(this),onEnd:()=>{this.closeStream(e),this.onStreamEnd?.(s)},log:this.logger.forComponent(`libp2p:yamux:${r}:${e}`),config:this.config,getRTT:this.getRTT.bind(this)});return s}closeStream(e){this.client===(e%2==0)?this.numInboundStreams--:this.numOutboundStreams--,this._streams.delete(e)}async keepAliveLoop(){const e=new Promise(((e,t)=>{this.closeController.signal.addEventListener("abort",t,{once:!0})}));for(this.log?.trace("muxer keepalive enabled interval=%s",this.config.keepAliveInterval);;){let t;try{await Promise.race([e,new Promise((e=>{t=setTimeout(e,this.config.keepAliveInterval)}))]),this.ping().catch((e=>this.log?.error("ping error: %s",e)))}catch(e){return void clearInterval(t)}}}async handleFrame(e,t){const{streamID:n,type:r,length:s}=e;if(this.log?.trace("received frame %o",e),0===n)switch(r){case tb.Ping:return void this.handlePing(e);case tb.GoAway:return void this.handleGoAway(s);default:throw new fn("Invalid frame type",$w,{header:e})}else switch(e.type){case tb.Data:case tb.WindowUpdate:return void await this.handleStreamMessage(e,t);default:throw new fn("Invalid frame type",$w,{header:e})}}handlePing(e){if(e.flag===nb.SYN)this.log?.trace("received ping request pingId=%s",e.length),this.sendPing(e.length,nb.ACK);else{if(e.flag!==nb.ACK)throw new fn("Invalid frame flag",$w,{header:e});this.log?.trace("received ping response pingId=%s",e.length),this.handlePingResponse(e.length)}}handlePingResponse(e){if(void 0===this.activePing)throw new fn("ping not requested",qw);if(this.activePing.id!==e)throw new fn("ping doesn't match our id",Hw);this.activePing.resolve()}handleGoAway(e){this.log?.trace("received GoAway reason=%s",rb[e]??"unknown"),this.remoteGoAway=e;for(const e of this._streams.values())e.reset();this._closeMuxer()}async handleStreamMessage(e,t){const{streamID:n,flag:r,type:s}=e;(r&nb.SYN)===nb.SYN&&this.incomingStream(n);const i=this._streams.get(n);if(void 0!==i)switch(s){case tb.WindowUpdate:return void i.handleWindowUpdate(e);case tb.Data:if(void 0===t)throw new Error("unreachable");return void await i.handleData(e,t);default:throw new Error("unreachable")}else if(s===tb.Data){if(this.log?.("discarding data for stream id=%s",n),void 0===t)throw new Error("unreachable");await t()}else this.log?.("frame for missing stream id=%s",n)}incomingStream(e){if(this.client!==(e%2==0))throw new fn("both endpoints are clients",jw);if(this._streams.has(e))return;if(this.log?.trace("new incoming stream id=%s",e),void 0!==this.localGoAway)return void this.sendFrame({type:tb.WindowUpdate,flag:nb.RST,streamID:e,length:0});if(this.numInboundStreams>=this.config.maxInboundStreams)return this.log?.("maxIncomingStreams exceeded, forcing stream reset"),void this.sendFrame({type:tb.WindowUpdate,flag:nb.RST,streamID:e,length:0});const t=this._newStream(e,void 0,lb.SYNReceived,"inbound");this.numInboundStreams++,this._streams.set(e,t),this.onIncomingStream?.(t)}sendFrame(e,t){if(this.log?.trace("sending frame %o",e),e.type===tb.Data){if(void 0===t)throw new fn("invalid frame",$w);this.source.push(new Ir(ob(e),t))}else this.source.push(ob(e))}sendPing(e,t=nb.SYN){t===nb.SYN?this.log?.trace("sending ping request pingId=%s",e):this.log?.trace("sending ping response pingId=%s",e),this.sendFrame({type:tb.Ping,flag:t,streamID:0,length:e})}sendGoAway(e=rb.NormalTermination){this.log?.("sending GoAway reason=%s",rb[e]),this.localGoAway=e,this.sendFrame({type:tb.GoAway,flag:0,streamID:0,length:e})}}function fb(e={}){return t=>new db(t,e)}function gb(e=0){return null!=globalThis.Buffer?.alloc?(t=globalThis.Buffer.alloc(e),null!=globalThis.Buffer?new Uint8Array(t.buffer,t.byteOffset,t.byteLength):t):new Uint8Array(e);var t}var mb;!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.publicKey&&e.publicKey.byteLength>0&&(t.uint32(10),t.bytes(e.publicKey)),null!=e.addrs)for(const n of e.addrs)t.uint32(18),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={publicKey:gb(0),addrs:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.publicKey=e.bytes();break;case 2:n.addrs.push(e.bytes());break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(mb||(mb={}));class yb extends wn{[rn]=!0;[Symbol.toStringTag]="@libp2p/pubsub-peer-discovery";interval;listenOnly;topics;intervalId;components;log;constructor(e,t={}){super();const{interval:n,topics:r,listenOnly:s}=t;this.components=e,this.interval=n??1e4,this.listenOnly=s??!1,this.log=e.logger.forComponent("libp2p:discovery:pubsub"),Array.isArray(r)&&r.length>0?this.topics=r:this.topics=["_peer-discovery._p2p._pubsub"],this._onMessage=this._onMessage.bind(this)}isStarted(){return null!=this.intervalId}start(){}afterStart(){if(null!=this.intervalId)return;const e=this.components.pubsub;if(null==e)throw new Error("PubSub not configured");for(const t of this.topics)e.subscribe(t),e.addEventListener("message",this._onMessage);this.listenOnly||(this._broadcast(),this.intervalId=setInterval((()=>{this._broadcast()}),this.interval))}beforeStop(){const e=this.components.pubsub;if(null==e)throw new Error("PubSub not configured");for(const t of this.topics)e.unsubscribe(t),e.removeEventListener("message",this._onMessage)}stop(){null!=this.intervalId&&(clearInterval(this.intervalId),this.intervalId=void 0)}_broadcast(){const e=this.components.peerId;if(null==e.publicKey)throw new Error("PeerId was missing public key");const t={publicKey:e.publicKey,addrs:this.components.addressManager.getAddresses().map((e=>e.bytes))},n=mb.encode(t),r=this.components.pubsub;if(null==r)throw new Error("PubSub not configured");for(const e of this.topics)0!==r.getSubscribers(e).length?(this.log("broadcasting our peer data on topic %s",e),r.publish(e,n)):this.log("skipping broadcasting our peer data on topic %s because there are no peers present",e)}_onMessage(e){if(!this.isStarted())return;const t=e.detail;if(!this.topics.includes(t.topic))return;const n=mb.decode(t.data);Is(n.publicKey).then((e=>{e.equals(this.components.peerId)||(this.log("discovered peer %p on %s",e,t.topic),this.safeDispatchEvent("peer",{detail:{id:e,multiaddrs:n.addrs.map((e=>cr(e)))}}))})).catch((e=>{this.log.error(e)}))}}function wb(e={}){return t=>new yb(t,e)}const bb="circuit-relay-relay";BigInt(1<<17);const vb="/libp2p/circuit/relay/0.2.0/hop",Eb="/libp2p/circuit/relay/0.2.0/stop",Sb="ERR_RELAYED_DIAL";var _b,Ib,Rb,Ab,Tb,Db,kb,Pb;function Cb(e){const t=e*BigInt(1e3),n=(new Date).getTime();return Number(t-BigInt(n))}!function(e){let t,n;!function(e){e.RESERVE="RESERVE",e.CONNECT="CONNECT",e.STATUS="STATUS"}(e.Type||(e.Type={})),function(e){e[e.RESERVE=0]="RESERVE",e[e.CONNECT=1]="CONNECT",e[e.STATUS=2]="STATUS"}(t||(t={})),function(e){e.codec=()=>Wt(t)}(e.Type||(e.Type={})),e.codec=()=>(null==n&&(n=jt(((t,n,r={})=>{!1!==r.lengthDelimited&&n.fork(),null!=t.type&&(n.uint32(8),e.Type.codec().encode(t.type,n)),null!=t.peer&&(n.uint32(18),Rb.codec().encode(t.peer,n)),null!=t.reservation&&(n.uint32(26),Ab.codec().encode(t.reservation,n)),null!=t.limit&&(n.uint32(34),Tb.codec().encode(t.limit,n)),null!=t.status&&(n.uint32(40),Db.codec().encode(t.status,n)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.type=e.Type.codec().decode(t);break;case 2:r.peer=Rb.codec().decode(t,t.uint32());break;case 3:r.reservation=Ab.codec().decode(t,t.uint32());break;case 4:r.limit=Tb.codec().decode(t,t.uint32());break;case 5:r.status=Db.codec().decode(t);break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(_b||(_b={})),function(e){let t,n;!function(e){e.CONNECT="CONNECT",e.STATUS="STATUS"}(e.Type||(e.Type={})),function(e){e[e.CONNECT=0]="CONNECT",e[e.STATUS=1]="STATUS"}(t||(t={})),function(e){e.codec=()=>Wt(t)}(e.Type||(e.Type={})),e.codec=()=>(null==n&&(n=jt(((t,n,r={})=>{!1!==r.lengthDelimited&&n.fork(),null!=t.type&&(n.uint32(8),e.Type.codec().encode(t.type,n)),null!=t.peer&&(n.uint32(18),Rb.codec().encode(t.peer,n)),null!=t.limit&&(n.uint32(26),Tb.codec().encode(t.limit,n)),null!=t.status&&(n.uint32(32),Db.codec().encode(t.status,n)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.type=e.Type.codec().decode(t);break;case 2:r.peer=Rb.codec().decode(t,t.uint32());break;case 3:r.limit=Tb.codec().decode(t,t.uint32());break;case 4:r.status=Db.codec().decode(t);break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Ib||(Ib={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.id&&e.id.byteLength>0&&(t.uint32(10),t.bytes(e.id)),null!=e.addrs)for(const n of e.addrs)t.uint32(18),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={id:new Uint8Array(0),addrs:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.id=e.bytes();break;case 2:n.addrs.push(e.bytes());break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Rb||(Rb={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.expire&&0n!==e.expire&&(t.uint32(8),t.uint64(e.expire)),null!=e.addrs)for(const n of e.addrs)t.uint32(18),t.bytes(n);null!=e.voucher&&(t.uint32(26),t.bytes(e.voucher)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={expire:0n,addrs:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.expire=e.uint64();break;case 2:n.addrs.push(e.bytes());break;case 3:n.voucher=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Ab||(Ab={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.duration&&(t.uint32(8),t.uint32(e.duration)),null!=e.data&&(t.uint32(16),t.uint64(e.data)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.duration=e.uint32();break;case 2:n.data=e.uint64();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Tb||(Tb={})),function(e){e.UNUSED="UNUSED",e.OK="OK",e.RESERVATION_REFUSED="RESERVATION_REFUSED",e.RESOURCE_LIMIT_EXCEEDED="RESOURCE_LIMIT_EXCEEDED",e.PERMISSION_DENIED="PERMISSION_DENIED",e.CONNECTION_FAILED="CONNECTION_FAILED",e.NO_RESERVATION="NO_RESERVATION",e.MALFORMED_MESSAGE="MALFORMED_MESSAGE",e.UNEXPECTED_MESSAGE="UNEXPECTED_MESSAGE"}(Db||(Db={})),function(e){e[e.UNUSED=0]="UNUSED",e[e.OK=100]="OK",e[e.RESERVATION_REFUSED=200]="RESERVATION_REFUSED",e[e.RESOURCE_LIMIT_EXCEEDED=201]="RESOURCE_LIMIT_EXCEEDED",e[e.PERMISSION_DENIED=202]="PERMISSION_DENIED",e[e.CONNECTION_FAILED=203]="CONNECTION_FAILED",e[e.NO_RESERVATION=204]="NO_RESERVATION",e[e.MALFORMED_MESSAGE=400]="MALFORMED_MESSAGE",e[e.UNEXPECTED_MESSAGE=401]="UNEXPECTED_MESSAGE"}(kb||(kb={})),function(e){e.codec=()=>Wt(kb)}(Db||(Db={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.relay&&e.relay.byteLength>0&&(t.uint32(10),t.bytes(e.relay)),null!=e.peer&&e.peer.byteLength>0&&(t.uint32(18),t.bytes(e.peer)),null!=e.expiration&&0n!==e.expiration&&(t.uint32(24),t.uint64(e.expiration)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={relay:new Uint8Array(0),peer:new Uint8Array(0),expiration:0n},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.relay=e.bytes();break;case 2:n.peer=e.bytes();break;case 3:n.expiration=e.uint64();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Pb||(Pb={}));class xb extends wn{peerId;peerStore;contentRouting;registrar;started;topologyId;log;constructor(e){super(),this.log=e.logger.forComponent("libp2p:circuit-relay:discover-relays"),this.started=!1,this.peerId=e.peerId,this.peerStore=e.peerStore,this.contentRouting=e.contentRouting,this.registrar=e.registrar}isStarted(){return this.started}async start(){this.topologyId=await this.registrar.register(vb,{notifyOnTransient:!0,onConnect:e=>{this.safeDispatchEvent("relay:discover",{detail:e})}}),this.started=!0}afterStart(){this.discover().catch((e=>{this.log.error("error discovering relays",e)}))}stop(){null!=this.topologyId&&this.registrar.unregister(this.topologyId),this.started=!1}async discover(){this.log("searching peer store for relays");const e=await this.peerStore.all({filters:[e=>e.protocols.includes(vb)],orders:[()=>Math.random()<.5?1:-1]});for(const t of e)this.log("found relay peer %p in content peer store",t.id),this.safeDispatchEvent("relay:discover",{detail:t.id});this.log("found %d relay peers in peer store",e.length);try{this.log("searching content routing for relays");const e=await async function(e){const t=(new TextEncoder).encode(e),n=await gt.digest(t);return bt.createV0(n)}("/libp2p/relay");let t=0;for await(const n of this.contentRouting.findProviders(e))if(n.multiaddrs.length>0&&!n.id.equals(this.peerId)){const e=n.id;t++,await this.peerStore.merge(e,{multiaddrs:n.multiaddrs}),this.log("found relay peer %p in content routing",e),this.safeDispatchEvent("relay:discover",{detail:e})}this.log("found %d relay peers in content routing",t)}catch(e){this.log.error("failed when finding relays on the network",e)}}}class Nb extends wn{peerId;connectionManager;transportManager;peerStore;events;reserveQueue;reservations;maxDiscoveredRelays;maxReservationQueueLength;reservationCompletionTimeout;started;log;constructor(e,t){super(),this.log=e.logger.forComponent("libp2p:circuit-relay:transport:reservation-store"),this.peerId=e.peerId,this.connectionManager=e.connectionManager,this.transportManager=e.transportManager,this.peerStore=e.peerStore,this.events=e.events,this.reservations=new Hh,this.maxDiscoveredRelays=t?.discoverRelays??0,this.maxReservationQueueLength=t?.maxReservationQueueLength??100,this.reservationCompletionTimeout=t?.reservationCompletionTimeout??1e4,this.started=!1,this.reserveQueue=new bf({concurrency:t?.reservationConcurrency??1,metricName:"libp2p_relay_reservation_queue",metrics:e.metrics}),this.events.addEventListener("peer:disconnect",(e=>{this.#B(e.detail)}))}isStarted(){return this.started}start(){this.started=!0}stop(){this.reserveQueue.clear(),this.reservations.forEach((({timeout:e})=>{clearTimeout(e)})),this.reservations.clear(),this.started=!1}async addRelay(e,t){this.peerId.equals(e)?this.log("not trying to use self as relay"):this.reserveQueue.size>this.maxReservationQueueLength?this.log("not adding relay as the queue is full"):this.reserveQueue.has(e)?this.log("relay peer is already in the reservation queue"):(this.log("add relay %p",e),await this.reserveQueue.add((async()=>{try{const n=this.reservations.get(e);if(null!=n){if(Cb(n.reservation.expire)>6e5)return void this.log("already have reservation on relay peer %p and it expires in more than 10 minutes",e);clearTimeout(n.timeout),this.reservations.delete(e)}if("discovered"===t&&[...this.reservations.values()].reduce(((e,t)=>("discovered"===t.type&&e++,e)),0)>=this.maxDiscoveredRelays)return void this.log("already have enough discovered relays");const r=AbortSignal.timeout(this.reservationCompletionTimeout),s=await this.connectionManager.openConnection(e,{signal:r});if(s.remoteAddr.protoNames().includes("p2p-circuit"))return void this.log("not creating reservation over relayed connection");const i=await this.#U(s,{signal:r});this.log("created reservation on relay peer %p",e);const o=Cb(i.expire),a=Math.min(Math.max(o-3e5,3e4),Math.pow(2,31)-1),c=setTimeout((()=>{this.addRelay(e,t).catch((t=>{this.log.error("could not refresh reservation to relay %p",e,t)}))}),a);this.reservations.set(e,{timeout:c,reservation:i,type:t}),await this.peerStore.merge(e,{tags:{[bb]:{value:1,ttl:o}}}),await this.transportManager.listen([cr(`/p2p/${e.toString()}/p2p-circuit`)])}catch(t){this.log.error("could not reserve slot on %p",e,t);const n=this.reservations.get(e);null!=n&&clearTimeout(n.timeout),this.reservations.delete(e)}}),{peerId:e}))}hasReservation(e){return this.reservations.has(e)}getReservation(e){return this.reservations.get(e)?.reservation}async#U(e,t){t.signal?.throwIfAborted(),this.log("requesting reservation from %p",e.remotePeer);const n=await e.newStream(vb,t),r=Iw(n).pb(_b);let s;await r.write({type:_b.Type.RESERVE},t);try{s=await r.read(t)}catch(t){throw this.log.error("error parsing reserve message response from %p because",e.remotePeer,t),n.abort(t),t}finally{await n.close()}if(s.status===Db.OK&&null!=s.reservation){let t=!1;const n=e.remoteAddr.bytes;for(const e of s.reservation.addrs)if(In(n,e)){t=!0;break}return t||s.reservation.addrs.push(n),s.reservation}const i=`reservation failed with status ${s.status??"undefined"}`;throw this.log.error(i),new Error(i)}#B(e){const t=this.reservations.get(e);null!=t&&(this.log("connection to relay %p closed, removing reservation from local store",e),clearTimeout(t.timeout),this.reservations.delete(e),this.safeDispatchEvent("relay:removed",{detail:e}),this.reservations.size<this.maxDiscoveredRelays&&(this.log("not enough relays %d/%d",this.reservations.size,this.maxDiscoveredRelays),this.safeDispatchEvent("relay:not-enough-relays",{})))}}function Mb(e){const{stream:t,remoteAddr:n,logger:r}=e,s=r.forComponent("libp2p:stream:converter");let i=!1,o=!1;const a=t.close.bind(t);t.close=async e=>{await a(e),h(!0)};const c=t.abort.bind(t);t.abort=e=>{c(e),h(!0)};const l=t.sink.bind(t);t.sink=async e=>{try{await l(e)}catch(e){"aborted"!==e.type&&s.error("%s error in sink",n,e)}finally{o=!0,h()}};const u={log:s,sink:t.sink,source:async function*(){try{for await(const e of t.source)e instanceof Uint8Array?yield e:yield*e}finally{i=!0,h()}}(),remoteAddr:n,timeline:{open:Date.now(),close:void 0},close:t.close,abort:t.abort};function h(e){!0===e&&(i=!0,o=!0),i&&o&&null==u.timeline.close&&(u.timeline.close=Date.now())}return u}class Ob extends wn{connectionManager;relayStore;listeningAddrs;log;constructor(e){super(),this.log=e.logger.forComponent("libp2p:circuit-relay:transport:listener"),this.connectionManager=e.connectionManager,this.relayStore=e.relayStore,this.listeningAddrs=new Hh,this.relayStore.addEventListener("relay:removed",this._onRemoveRelayPeer)}_onRemoveRelayPeer=e=>{this.#F(e.detail)};async listen(e){this.log("listen on %a",e);const t=e.decapsulate("/p2p-circuit"),n=await this.connectionManager.openConnection(t);if(!this.relayStore.hasReservation(n.remotePeer))return this.log("making reservation on peer %p",n.remotePeer),void await this.relayStore.addRelay(n.remotePeer,"configured");const r=this.relayStore.getReservation(n.remotePeer);if(null==r)throw new fn("Did not have reservation after making reservation","ERR_NO_RESERVATION");this.listeningAddrs.has(n.remotePeer)?this.log("already listening on relay %p",n.remotePeer):(this.listeningAddrs.set(n.remotePeer,r.addrs.map((e=>cr(e).encapsulate("/p2p-circuit")))),this.safeDispatchEvent("listening",{}))}getAddrs(){return[...this.listeningAddrs.values()].flat()}async close(){}#F(e){const t=this.listeningAddrs.has(e);this.log("relay peer removed %p - had reservation",e,t),this.listeningAddrs.delete(e),t&&(this.log.trace("removing relay event listener for peer %p",e),this.relayStore.removeEventListener("relay:removed",this._onRemoveRelayPeer),this.safeDispatchEvent("close",{}))}}const Lb=300,Bb=300,Ub=3e4;class Fb{discovery;registrar;peerStore;connectionManager;transportManager;peerId;upgrader;addressManager;connectionGater;reservationStore;logger;maxInboundStopStreams;maxOutboundStopStreams;stopTimeout;started;log;constructor(e,t){this.log=e.logger.forComponent("libp2p:circuit-relay:transport"),this.registrar=e.registrar,this.peerStore=e.peerStore,this.connectionManager=e.connectionManager,this.transportManager=e.transportManager,this.logger=e.logger,this.peerId=e.peerId,this.upgrader=e.upgrader,this.addressManager=e.addressManager,this.connectionGater=e.connectionGater,this.maxInboundStopStreams=t.maxInboundStopStreams??Lb,this.maxOutboundStopStreams=t.maxOutboundStopStreams??Bb,this.stopTimeout=t.stopTimeout??Ub,null!=t.discoverRelays&&t.discoverRelays>0&&(this.discovery=new xb(e),this.discovery.addEventListener("relay:discover",(e=>{this.reservationStore.addRelay(e.detail,"discovered").catch((t=>{this.log.error("could not add discovered relay %p",e.detail,t)}))}))),this.reservationStore=new Nb(e,t),this.reservationStore.addEventListener("relay:not-enough-relays",(()=>{this.discovery?.discover().catch((e=>{this.log.error("could not discover relays",e)}))})),this.started=!1}isStarted(){return this.started}async start(){this.reservationStore.start(),await this.registrar.handle(Eb,(e=>{this.onStop(e).catch((t=>{this.log.error("error while handling STOP protocol",t),e.stream.abort(t)}))}),{maxInboundStreams:this.maxInboundStopStreams,maxOutboundStreams:this.maxOutboundStopStreams,runOnTransientConnection:!0}),await(this.discovery?.start()),this.started=!0}afterStart(){this.discovery?.afterStart()}async stop(){this.discovery?.stop(),this.reservationStore.stop(),await this.registrar.unhandle(Eb),this.started=!1}[hn]=!0;[Symbol.toStringTag]="libp2p/circuit-relay-v2";async dial(e,t={}){if(1!==e.protoCodes().filter((e=>290===e)).length){const t="Invalid circuit relay address";throw this.log.error(t,e),new fn(t,Sb)}const n=e.toString().split("/p2p-circuit"),r=cr(n[0]),s=cr(n[n.length-1]),i=r.getPeerId(),o=s.getPeerId();if(null==i||null==o){const t=`Circuit relay dial to ${e.toString()} failed as address did not have peer ids`;throw this.log.error(t),new fn(t,Sb)}const a=Ss(i),c=Ss(o);let l=!1;let u,h=this.connectionManager.getConnections(a)[0];null==h&&(await this.peerStore.merge(a,{multiaddrs:[r]}),h=await this.connectionManager.openConnection(a,t),l=!0);try{return u=await h.newStream(vb),await this.connectV2({stream:u,connection:h,destinationPeer:c,destinationAddr:s,relayAddr:r,ma:e,disconnectOnFailure:l})}catch(e){throw this.log.error("circuit relay dial to destination %p via relay %p failed",c,a,e),null!=u&&u.abort(e),l&&await h.close(),e}}async connectV2({stream:e,connection:t,destinationPeer:n,destinationAddr:r,relayAddr:s,ma:i,disconnectOnFailure:o}){try{const t=Iw(e),o=t.pb(_b);await o.write({type:_b.Type.CONNECT,peer:{id:n.toBytes(),addrs:[cr(r).bytes]}});const a=await o.read();if(a.status!==Db.OK)throw new fn(`failed to connect via relay with status ${a?.status?.toString()??"undefined"}`,"ERR_HOP_REQUEST_FAILED");const c=Mb({stream:t.unwrap(),remoteAddr:i,localAddr:s.encapsulate(`/p2p-circuit/p2p/${this.peerId.toString()}`),logger:this.logger});return this.log("new outbound transient connection %a",c.remoteAddr),await this.upgrader.upgradeOutbound(c,{transient:!0})}catch(e){throw this.log.error(`Circuit relay dial to destination ${n.toString()} via relay ${t.remotePeer.toString()} failed`,e),o&&await t.close(),e}}createListener(e){return function(e){return new Ob(e)}({connectionManager:this.connectionManager,relayStore:this.reservationStore,logger:this.logger})}listenFilter(e){return(e=Array.isArray(e)?e:[e]).filter((e=>Hy.matches(e)))}dialFilter(e){return this.listenFilter(e)}async onStop({connection:e,stream:t}){if(!this.reservationStore.hasReservation(e.remotePeer))try{this.log("dialed via relay we did not have a reservation on, start listening on that relay address"),await this.transportManager.listen([e.remoteAddr.encapsulate("/p2p-circuit")])}catch(e){this.log.error("failed to listen on a relay peer we were dialed via but did not have a reservation on",e)}const n=AbortSignal.timeout(this.stopTimeout),r=Iw(t).pb(Ib),s=await r.read({signal:n});if(this.log("new circuit relay v2 stop stream from %p with type %s",e.remotePeer,s.type),void 0===s?.type)return this.log.error("type was missing from circuit v2 stop protocol request from %s",e.remotePeer),await r.write({type:Ib.Type.STATUS,status:Db.MALFORMED_MESSAGE},{signal:n}),void await t.close();if(s.type!==Ib.Type.CONNECT)return this.log.error("invalid stop connect request via peer %p",e.remotePeer),await r.write({type:Ib.Type.STATUS,status:Db.UNEXPECTED_MESSAGE},{signal:n}),void await t.close();if(!(e=>{if(null==e.peer)return!1;try{e.peer.addrs.forEach(cr)}catch{return!1}return!0})(s))return this.log.error("invalid stop connect request via peer %p",e.remotePeer),await r.write({type:Ib.Type.STATUS,status:Db.MALFORMED_MESSAGE},{signal:n}),void await t.close();const i=_s(s.peer.id);if(!0===await(this.connectionGater.denyInboundRelayedConnection?.(e.remotePeer,i)))return this.log.error("connection gater denied inbound relayed connection from %p",e.remotePeer),await r.write({type:Ib.Type.STATUS,status:Db.PERMISSION_DENIED},{signal:n}),void await t.close();this.log.trace("sending success response to %p",e.remotePeer),await r.write({type:Ib.Type.STATUS,status:Db.OK},{signal:n});const o=e.remoteAddr.encapsulate(`/p2p-circuit/p2p/${i.toString()}`),a=this.addressManager.getAddresses()[0],c=Mb({stream:r.unwrap().unwrap(),remoteAddr:o,localAddr:a,logger:this.logger});this.log("new inbound transient connection %a",c.remoteAddr),await this.upgrader.upgradeInbound(c,{transient:!0}),this.log("%s connection %a upgraded","inbound",c.remoteAddr)}}function Vb(e={}){return t=>new Fb(t,e)}const Kb="/floodsub/1.0.0",$b="/meshsub/1.0.0",qb="/meshsub/1.1.0",Hb=5e3,zb={maxSubscriptions:1/0,maxMessages:1/0,maxIhaveMessageIDs:1/0,maxIwantMessageIDs:1/0,maxControlMessages:1/0,maxPeerInfos:1/0};var Wb,jb,Gb,Yb,Qb,Zb,Jb,Xb,ev,tv,nv,rv;!function(e){let t;!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.subscribe&&(t.uint32(8),t.bool(e.subscribe)),null!=e.topic&&(t.uint32(18),t.string(e.topic)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();switch(t>>>3){case 1:r.subscribe=e.bool();break;case 2:r.topic=e.string();break;default:e.skipType(7&t)}}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=(t,n)=>G(t,e.codec(),n)}(e.SubOpts||(e.SubOpts={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.from&&(t.uint32(10),t.bytes(e.from)),null!=e.data&&(t.uint32(18),t.bytes(e.data)),null!=e.seqno&&(t.uint32(26),t.bytes(e.seqno)),null!=e.topic&&""!==e.topic&&(t.uint32(34),t.string(e.topic)),null!=e.signature&&(t.uint32(42),t.bytes(e.signature)),null!=e.key&&(t.uint32(50),t.bytes(e.key)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={topic:""},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();switch(t>>>3){case 1:r.from=e.bytes();break;case 2:r.data=e.bytes();break;case 3:r.seqno=e.bytes();break;case 4:r.topic=e.string();break;case 5:r.signature=e.bytes();break;case 6:r.key=e.bytes();break;default:e.skipType(7&t)}}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=(t,n)=>G(t,e.codec(),n)}(e.Message||(e.Message={})),function(t){let n;t.codec=()=>(null==n&&(n=jt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.ihave)for(const r of t.ihave)n.uint32(10),e.ControlIHave.codec().encode(r,n);if(null!=t.iwant)for(const r of t.iwant)n.uint32(18),e.ControlIWant.codec().encode(r,n);if(null!=t.graft)for(const r of t.graft)n.uint32(26),e.ControlGraft.codec().encode(r,n);if(null!=t.prune)for(const r of t.prune)n.uint32(34),e.ControlPrune.codec().encode(r,n);!1!==r.lengthDelimited&&n.ldelim()}),((t,n,r={})=>{const s={ihave:[],iwant:[],graft:[],prune:[]},i=null==n?t.len:t.pos+n;for(;t.pos<i;){const n=t.uint32();switch(n>>>3){case 1:if(null!=r.limits?.ihave&&s.ihave.length===r.limits.ihave)throw new Gt('decode error - map field "ihave" had too many elements',"ERR_MAX_LENGTH");s.ihave.push(e.ControlIHave.codec().decode(t,t.uint32()));break;case 2:if(null!=r.limits?.iwant&&s.iwant.length===r.limits.iwant)throw new Gt('decode error - map field "iwant" had too many elements',"ERR_MAX_LENGTH");s.iwant.push(e.ControlIWant.codec().decode(t,t.uint32()));break;case 3:if(null!=r.limits?.graft&&s.graft.length===r.limits.graft)throw new Gt('decode error - map field "graft" had too many elements',"ERR_MAX_LENGTH");s.graft.push(e.ControlGraft.codec().decode(t,t.uint32()));break;case 4:if(null!=r.limits?.prune&&s.prune.length===r.limits.prune)throw new Gt('decode error - map field "prune" had too many elements',"ERR_MAX_LENGTH");s.prune.push(e.ControlPrune.codec().decode(t,t.uint32()));break;default:t.skipType(7&n)}}return s}))),n),t.encode=e=>qt(e,t.codec()),t.decode=(e,n)=>G(e,t.codec(),n)}(e.ControlMessage||(e.ControlMessage={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.topicID&&(t.uint32(10),t.string(e.topicID)),null!=e.messageIDs)for(const n of e.messageIDs)t.uint32(18),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={messageIDs:[]},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();switch(t>>>3){case 1:r.topicID=e.string();break;case 2:if(null!=n.limits?.messageIDs&&r.messageIDs.length===n.limits.messageIDs)throw new Gt('decode error - map field "messageIDs" had too many elements',"ERR_MAX_LENGTH");r.messageIDs.push(e.bytes());break;default:e.skipType(7&t)}}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=(t,n)=>G(t,e.codec(),n)}(e.ControlIHave||(e.ControlIHave={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.messageIDs)for(const n of e.messageIDs)t.uint32(10),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={messageIDs:[]},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();if(t>>>3==1){if(null!=n.limits?.messageIDs&&r.messageIDs.length===n.limits.messageIDs)throw new Gt('decode error - map field "messageIDs" had too many elements',"ERR_MAX_LENGTH");r.messageIDs.push(e.bytes())}else e.skipType(7&t)}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=(t,n)=>G(t,e.codec(),n)}(e.ControlIWant||(e.ControlIWant={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.topicID&&(t.uint32(10),t.string(e.topicID)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();if(t>>>3==1)r.topicID=e.string();else e.skipType(7&t)}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=(t,n)=>G(t,e.codec(),n)}(e.ControlGraft||(e.ControlGraft={})),function(t){let n;t.codec=()=>(null==n&&(n=jt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.topicID&&(n.uint32(10),n.string(t.topicID)),null!=t.peers)for(const r of t.peers)n.uint32(18),e.PeerInfo.codec().encode(r,n);null!=t.backoff&&(n.uint32(24),n.uint64Number(t.backoff)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n,r={})=>{const s={peers:[]},i=null==n?t.len:t.pos+n;for(;t.pos<i;){const n=t.uint32();switch(n>>>3){case 1:s.topicID=t.string();break;case 2:if(null!=r.limits?.peers&&s.peers.length===r.limits.peers)throw new Gt('decode error - map field "peers" had too many elements',"ERR_MAX_LENGTH");s.peers.push(e.PeerInfo.codec().decode(t,t.uint32()));break;case 3:s.backoff=t.uint64Number();break;default:t.skipType(7&n)}}return s}))),n),t.encode=e=>qt(e,t.codec()),t.decode=(e,n)=>G(e,t.codec(),n)}(e.ControlPrune||(e.ControlPrune={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.peerID&&(t.uint32(10),t.bytes(e.peerID)),null!=e.signedPeerRecord&&(t.uint32(18),t.bytes(e.signedPeerRecord)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();switch(t>>>3){case 1:r.peerID=e.bytes();break;case 2:r.signedPeerRecord=e.bytes();break;default:e.skipType(7&t)}}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=(t,n)=>G(t,e.codec(),n)}(e.PeerInfo||(e.PeerInfo={})),e.codec=()=>(null==t&&(t=jt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.subscriptions)for(const r of t.subscriptions)n.uint32(10),e.SubOpts.codec().encode(r,n);if(null!=t.messages)for(const r of t.messages)n.uint32(18),e.Message.codec().encode(r,n);null!=t.control&&(n.uint32(26),e.ControlMessage.codec().encode(t.control,n)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n,r={})=>{const s={subscriptions:[],messages:[]},i=null==n?t.len:t.pos+n;for(;t.pos<i;){const n=t.uint32();switch(n>>>3){case 1:if(null!=r.limits?.subscriptions&&s.subscriptions.length===r.limits.subscriptions)throw new Gt('decode error - map field "subscriptions" had too many elements',"ERR_MAX_LENGTH");s.subscriptions.push(e.SubOpts.codec().decode(t,t.uint32()));break;case 2:if(null!=r.limits?.messages&&s.messages.length===r.limits.messages)throw new Gt('decode error - map field "messages" had too many elements',"ERR_MAX_LENGTH");s.messages.push(e.Message.codec().decode(t,t.uint32()));break;case 3:s.control=e.ControlMessage.codec().decode(t,t.uint32());break;default:t.skipType(7&n)}}return s}))),t),e.encode=t=>qt(t,e.codec()),e.decode=(t,n)=>G(t,e.codec(),n)}(Wb||(Wb={}));class sv{gossip;msgs=new Map;msgIdToStrFn;history=[];notValidatedCount=0;constructor(e,t,n){this.gossip=e,this.msgIdToStrFn=n;for(let e=0;e<t;e++)this.history[e]=[]}get size(){return this.msgs.size}put(e,t,n=!1){const{msgIdStr:r}=e;return!this.msgs.has(r)&&(this.msgs.set(r,{message:t,validated:n,originatingPeers:new Set,iwantCounts:new Map}),this.history[0].push({...e,topic:t.topic}),n||this.notValidatedCount++,!0)}observeDuplicate(e,t){const n=this.msgs.get(e);null==n||n.validated||n.originatingPeers.add(t)}get(e){return this.msgs.get(this.msgIdToStrFn(e))?.message}getWithIWantCount(e,t){const n=this.msgs.get(e);if(null==n)return null;const r=(n.iwantCounts.get(t)??0)+1;return n.iwantCounts.set(t,r),{msg:n.message,count:r}}getGossipIDs(e){const t=new Map;for(let n=0;n<this.gossip;n++)this.history[n].forEach((n=>{const r=this.msgs.get(n.msgIdStr);if(r?.validated&&e.has(n.topic)){let e=t.get(n.topic);null==e&&(e=[],t.set(n.topic,e)),e.push(n.msgId)}}));return t}validate(e){const t=this.msgs.get(e);if(null==t)return null;t.validated||this.notValidatedCount--;const{message:n,originatingPeers:r}=t;return t.validated=!0,t.originatingPeers=new Set,{message:n,originatingPeers:r}}shift(){this.history[this.history.length-1].forEach((e=>{const t=this.msgs.get(e.msgIdStr);null!=t&&(this.msgs.delete(e.msgIdStr),t.validated||this.notValidatedCount--)})),this.history.pop(),this.history.unshift([])}remove(e){const t=this.msgs.get(e);return null==t?null:(this.msgs.delete(e),t)}}function iv(e){switch(e){case un.Ignore:return Yb.Ignore;case un.Reject:return Yb.Reject;default:throw new Error("Unreachable")}}!function(e){e.StrictSign="StrictSign",e.StrictNoSign="StrictNoSign"}(jb||(jb={})),function(e){e[e.Signing=0]="Signing",e[e.Anonymous=1]="Anonymous"}(Gb||(Gb={})),function(e){e.Error="error",e.Ignore="ignore",e.Reject="reject",e.Blacklisted="blacklisted"}(Yb||(Yb={})),function(e){e.InvalidSignature="invalid_signature",e.InvalidSeqno="invalid_seqno",e.InvalidPeerId="invalid_peerid",e.SignaturePresent="signature_present",e.SeqnoPresent="seqno_present",e.FromPresent="from_present",e.TransformFailed="transform_failed"}(Qb||(Qb={})),function(e){e.duplicate="duplicate",e.invalid="invalid",e.valid="valid"}(Zb||(Zb={})),function(e){e.forward="forward",e.publish="publish"}(Jb||(Jb={})),function(e){e.Fanout="fanout",e.Random="random",e.Subscribed="subscribed",e.Outbound="outbound",e.NotEnough="not_enough",e.Opportunistic="opportunistic"}(Xb||(Xb={})),function(e){e.Dc="disconnected",e.BadScore="bad_score",e.Prune="prune",e.Excess="excess"}(ev||(ev={})),function(e){e.GraftBackoff="graft_backoff",e.BrokenPromise="broken_promise",e.MessageDeficit="message_deficit",e.IPColocation="IP_colocation"}(tv||(tv={})),function(e){e.LowScore="low_score",e.MaxIhave="max_ihave",e.MaxIasked="max_iasked"}(nv||(nv={})),function(e){e.graylist="graylist",e.publish="publish",e.gossip="gossip",e.mesh="mesh"}(rv||(rv={}));const ov="ERR_INVALID_PEER_SCORE_PARAMS",av={topics:{},topicScoreCap:10,appSpecificScore:()=>0,appSpecificWeight:10,IPColocationFactorWeight:-5,IPColocationFactorThreshold:10,IPColocationFactorWhitelist:new Set,behaviourPenaltyWeight:-10,behaviourPenaltyThreshold:0,behaviourPenaltyDecay:.2,decayInterval:1e3,decayToZero:.1,retainScore:36e5},cv={topicWeight:.5,timeInMeshWeight:1,timeInMeshQuantum:1,timeInMeshCap:3600,firstMessageDeliveriesWeight:1,firstMessageDeliveriesDecay:.5,firstMessageDeliveriesCap:2e3,meshMessageDeliveriesWeight:-1,meshMessageDeliveriesDecay:.5,meshMessageDeliveriesCap:100,meshMessageDeliveriesThreshold:20,meshMessageDeliveriesWindow:10,meshMessageDeliveriesActivation:5e3,meshFailurePenaltyWeight:-1,meshFailurePenaltyDecay:.5,invalidMessageDeliveriesWeight:-1,invalidMessageDeliveriesDecay:.3};function lv(e={}){return{...av,...e,topics:null!=e.topics?Object.entries(e.topics).reduce(((e,[t,n])=>(e[t]=function(e={}){return{...cv,...e}}(n),e)),{}):{}}}function uv(e){if(e.topicWeight<0)throw new fn("invalid topic weight; must be >= 0",ov);if(0===e.timeInMeshQuantum)throw new fn("invalid TimeInMeshQuantum; must be non zero",ov);if(e.timeInMeshWeight<0)throw new fn("invalid TimeInMeshWeight; must be positive (or 0 to disable)",ov);if(0!==e.timeInMeshWeight&&e.timeInMeshQuantum<=0)throw new fn("invalid TimeInMeshQuantum; must be positive",ov);if(0!==e.timeInMeshWeight&&e.timeInMeshCap<=0)throw new fn("invalid TimeInMeshCap; must be positive",ov);if(e.firstMessageDeliveriesWeight<0)throw new fn("invallid FirstMessageDeliveriesWeight; must be positive (or 0 to disable)",ov);if(0!==e.firstMessageDeliveriesWeight&&(e.firstMessageDeliveriesDecay<=0||e.firstMessageDeliveriesDecay>=1))throw new fn("invalid FirstMessageDeliveriesDecay; must be between 0 and 1",ov);if(0!==e.firstMessageDeliveriesWeight&&e.firstMessageDeliveriesCap<=0)throw new fn("invalid FirstMessageDeliveriesCap; must be positive",ov);if(e.meshMessageDeliveriesWeight>0)throw new fn("invalid MeshMessageDeliveriesWeight; must be negative (or 0 to disable)",ov);if(0!==e.meshMessageDeliveriesWeight&&(e.meshMessageDeliveriesDecay<=0||e.meshMessageDeliveriesDecay>=1))throw new fn("invalid MeshMessageDeliveriesDecay; must be between 0 and 1",ov);if(0!==e.meshMessageDeliveriesWeight&&e.meshMessageDeliveriesCap<=0)throw new fn("invalid MeshMessageDeliveriesCap; must be positive",ov);if(0!==e.meshMessageDeliveriesWeight&&e.meshMessageDeliveriesThreshold<=0)throw new fn("invalid MeshMessageDeliveriesThreshold; must be positive",ov);if(e.meshMessageDeliveriesWindow<0)throw new fn("invalid MeshMessageDeliveriesWindow; must be non-negative",ov);if(0!==e.meshMessageDeliveriesWeight&&e.meshMessageDeliveriesActivation<1e3)throw new fn("invalid MeshMessageDeliveriesActivation; must be at least 1s",ov);if(e.meshFailurePenaltyWeight>0)throw new fn("invalid MeshFailurePenaltyWeight; must be negative (or 0 to disable)",ov);if(0!==e.meshFailurePenaltyWeight&&(e.meshFailurePenaltyDecay<=0||e.meshFailurePenaltyDecay>=1))throw new fn("invalid MeshFailurePenaltyDecay; must be between 0 and 1",ov);if(e.invalidMessageDeliveriesWeight>0)throw new fn("invalid InvalidMessageDeliveriesWeight; must be negative (or 0 to disable)",ov);if(e.invalidMessageDeliveriesDecay<=0||e.invalidMessageDeliveriesDecay>=1)throw new fn("invalid InvalidMessageDeliveriesDecay; must be between 0 and 1",ov)}const hv={gossipThreshold:-10,publishThreshold:-50,graylistThreshold:-80,acceptPXThreshold:10,opportunisticGraftThreshold:20};function dv(e={}){return{...hv,...e}}function pv(e,t,n=(()=>!0)){const r=new Set;if(t<=0)return r;for(const s of e){if(r.size>=t)break;n(s)&&(r.add(s),e.delete(s))}return r}class fv extends Map{getDefault;constructor(e){super(),this.getDefault=e}getOrDefault(e){let t=super.get(e);return void 0===t&&(t=this.getDefault(),this.set(e,t)),t}}function gv(e,t,n,r){let s=0;Object.entries(t.topics).forEach((([e,t])=>{const r=n.topics[e];if(void 0===r)return;let i=0;if(t.inMesh){let e=t.meshTime/r.timeInMeshQuantum;e>r.timeInMeshCap&&(e=r.timeInMeshCap),i+=e*r.timeInMeshWeight}let o=t.firstMessageDeliveries;if(o>r.firstMessageDeliveriesCap&&(o=r.firstMessageDeliveriesCap),i+=o*r.firstMessageDeliveriesWeight,t.meshMessageDeliveriesActive&&t.meshMessageDeliveries<r.meshMessageDeliveriesThreshold){const e=r.meshMessageDeliveriesThreshold-t.meshMessageDeliveries;i+=e*e*r.meshMessageDeliveriesWeight}i+=t.meshFailurePenalty*r.meshFailurePenaltyWeight;i+=t.invalidMessageDeliveries*t.invalidMessageDeliveries*r.invalidMessageDeliveriesWeight,s+=i*r.topicWeight})),n.topicScoreCap>0&&s>n.topicScoreCap&&(s=n.topicScoreCap);const i=n.appSpecificScore(e);if(s+=i*n.appSpecificWeight,t.knownIPs.forEach((e=>{if(n.IPColocationFactorWhitelist.has(e))return;const t=r.get(e),i=null!=t?t.size:0;if(i>n.IPColocationFactorThreshold){const e=i-n.IPColocationFactorThreshold;s+=e*e*n.IPColocationFactorWeight}})),t.behaviourPenalty>n.behaviourPenaltyThreshold){const e=t.behaviourPenalty-n.behaviourPenaltyThreshold;s+=e*e*n.behaviourPenaltyWeight}return s}function mv(e,t){t=t||{};this._capacity=t.capacity,this._head=0,this._tail=0,Array.isArray(e)?this._fromArray(e):(this._capacityMask=3,this._list=new Array(4))}mv.prototype.peekAt=function(e){var t=e;if(t===(0|t)){var n=this.size();if(!(t>=n||t<-n))return t<0&&(t+=n),t=this._head+t&this._capacityMask,this._list[t]}},mv.prototype.get=function(e){return this.peekAt(e)},mv.prototype.peek=function(){if(this._head!==this._tail)return this._list[this._head]},mv.prototype.peekFront=function(){return this.peek()},mv.prototype.peekBack=function(){return this.peekAt(-1)},Object.defineProperty(mv.prototype,"length",{get:function(){return this.size()}}),mv.prototype.size=function(){return this._head===this._tail?0:this._head<this._tail?this._tail-this._head:this._capacityMask+1-(this._head-this._tail)},mv.prototype.unshift=function(e){if(0===arguments.length)return this.size();var t=this._list.length;return this._head=this._head-1+t&this._capacityMask,this._list[this._head]=e,this._tail===this._head&&this._growArray(),this._capacity&&this.size()>this._capacity&&this.pop(),this._head<this._tail?this._tail-this._head:this._capacityMask+1-(this._head-this._tail)},mv.prototype.shift=function(){var e=this._head;if(e!==this._tail){var t=this._list[e];return this._list[e]=void 0,this._head=e+1&this._capacityMask,e<2&&this._tail>1e4&&this._tail<=this._list.length>>>2&&this._shrinkArray(),t}},mv.prototype.push=function(e){if(0===arguments.length)return this.size();var t=this._tail;return this._list[t]=e,this._tail=t+1&this._capacityMask,this._tail===this._head&&this._growArray(),this._capacity&&this.size()>this._capacity&&this.shift(),this._head<this._tail?this._tail-this._head:this._capacityMask+1-(this._head-this._tail)},mv.prototype.pop=function(){var e=this._tail;if(e!==this._head){var t=this._list.length;this._tail=e-1+t&this._capacityMask;var n=this._list[this._tail];return this._list[this._tail]=void 0,this._head<2&&e>1e4&&e<=t>>>2&&this._shrinkArray(),n}},mv.prototype.removeOne=function(e){var t=e;if(t===(0|t)&&this._head!==this._tail){var n=this.size(),r=this._list.length;if(!(t>=n||t<-n)){t<0&&(t+=n),t=this._head+t&this._capacityMask;var s,i=this._list[t];if(e<n/2){for(s=e;s>0;s--)this._list[t]=this._list[t=t-1+r&this._capacityMask];this._list[t]=void 0,this._head=this._head+1+r&this._capacityMask}else{for(s=n-1-e;s>0;s--)this._list[t]=this._list[t=t+1+r&this._capacityMask];this._list[t]=void 0,this._tail=this._tail-1+r&this._capacityMask}return i}}},mv.prototype.remove=function(e,t){var n,r=e,s=t;if(r===(0|r)&&this._head!==this._tail){var i=this.size(),o=this._list.length;if(!(r>=i||r<-i||t<1)){if(r<0&&(r+=i),1===t||!t)return(n=new Array(1))[0]=this.removeOne(r),n;if(0===r&&r+t>=i)return n=this.toArray(),this.clear(),n;var a;for(r+t>i&&(t=i-r),n=new Array(t),a=0;a<t;a++)n[a]=this._list[this._head+r+a&this._capacityMask];if(r=this._head+r&this._capacityMask,e+t===i){for(this._tail=this._tail-t+o&this._capacityMask,a=t;a>0;a--)this._list[r=r+1+o&this._capacityMask]=void 0;return n}if(0===e){for(this._head=this._head+t+o&this._capacityMask,a=t-1;a>0;a--)this._list[r=r+1+o&this._capacityMask]=void 0;return n}if(r<i/2){for(this._head=this._head+e+t+o&this._capacityMask,a=e;a>0;a--)this.unshift(this._list[r=r-1+o&this._capacityMask]);for(r=this._head-1+o&this._capacityMask;s>0;)this._list[r=r-1+o&this._capacityMask]=void 0,s--;e<0&&(this._tail=r)}else{for(this._tail=r,r=r+t+o&this._capacityMask,a=i-(t+e);a>0;a--)this.push(this._list[r++]);for(r=this._tail;s>0;)this._list[r=r+1+o&this._capacityMask]=void 0,s--}return this._head<2&&this._tail>1e4&&this._tail<=o>>>2&&this._shrinkArray(),n}}},mv.prototype.splice=function(e,t){var n=e;if(n===(0|n)){var r=this.size();if(n<0&&(n+=r),!(n>r)){if(arguments.length>2){var s,i,o,a=arguments.length,c=this._list.length,l=2;if(!r||n<r/2){for(i=new Array(n),s=0;s<n;s++)i[s]=this._list[this._head+s&this._capacityMask];for(0===t?(o=[],n>0&&(this._head=this._head+n+c&this._capacityMask)):(o=this.remove(n,t),this._head=this._head+n+c&this._capacityMask);a>l;)this.unshift(arguments[--a]);for(s=n;s>0;s--)this.unshift(i[s-1])}else{var u=(i=new Array(r-(n+t))).length;for(s=0;s<u;s++)i[s]=this._list[this._head+n+t+s&this._capacityMask];for(0===t?(o=[],n!=r&&(this._tail=this._head+n+c&this._capacityMask)):(o=this.remove(n,t),this._tail=this._tail-u+c&this._capacityMask);l<a;)this.push(arguments[l++]);for(s=0;s<u;s++)this.push(i[s])}return o}return this.remove(n,t)}}},mv.prototype.clear=function(){this._list=new Array(this._list.length),this._head=0,this._tail=0},mv.prototype.isEmpty=function(){return this._head===this._tail},mv.prototype.toArray=function(){return this._copyArray(!1)},mv.prototype._fromArray=function(e){var t=e.length,n=this._nextPowerOf2(t);this._list=new Array(n),this._capacityMask=n-1,this._tail=t;for(var r=0;r<t;r++)this._list[r]=e[r]},mv.prototype._copyArray=function(e,t){var n=this._list,r=n.length,s=this.length;if((t|=s)==s&&this._head<this._tail)return this._list.slice(this._head,this._tail);var i,o=new Array(t),a=0;if(e||this._head>this._tail){for(i=this._head;i<r;i++)o[a++]=n[i];for(i=0;i<this._tail;i++)o[a++]=n[i]}else for(i=this._head;i<this._tail;i++)o[a++]=n[i];return o},mv.prototype._growArray=function(){if(0!=this._head){var e=this._copyArray(!0,this._list.length<<1);this._tail=this._list.length,this._head=0,this._list=e}else this._tail=this._list.length,this._list.length<<=1;this._capacityMask=this._capacityMask<<1|1},mv.prototype._shrinkArray=function(){this._list.length>>>=1,this._capacityMask>>>=1},mv.prototype._nextPowerOf2=function(e){var t=1<<Math.log(e)/Math.log(2)+1;return Math.max(t,4)};var yv,wv=Br(mv);!function(e){e[e.unknown=0]="unknown",e[e.valid=1]="valid",e[e.invalid=2]="invalid",e[e.ignored=3]="ignored"}(yv||(yv={}));class bv{records;queue;constructor(){this.records=new Map,this.queue=new wv}getRecord(e){return this.records.get(e)}ensureRecord(e){let t=this.records.get(e);if(null!=t)return t;t={status:yv.unknown,firstSeenTsMs:Date.now(),validated:0,peers:new Set},this.records.set(e,t);const n={msgId:e,expire:Date.now()+12e4};return this.queue.push(n),t}gc(){const e=Date.now();let t=this.queue.peekFront();for(;null!=t&&t.expire<e;)this.records.delete(t.msgId),this.queue.shift(),t=this.queue.peekFront()}clear(){this.records.clear(),this.queue.clear()}}class vv{params;metrics;peerStats=new Map;peerIPs=new fv((()=>new Set));scoreCache=new Map;deliveryRecords=new bv;_backgroundInterval;scoreCacheValidityMs;computeScore;log;constructor(e,t,n,r){this.params=e,this.metrics=t,function(e){for(const[t,n]of Object.entries(e.topics))try{uv(n)}catch(e){throw new fn(`invalid score parameters for topic ${t}: ${e.message}`,ov)}if(e.topicScoreCap<0)throw new fn("invalid topic score cap; must be positive (or 0 for no cap)",ov);if(null===e.appSpecificScore||void 0===e.appSpecificScore)throw new fn("missing application specific score function",ov);if(e.IPColocationFactorWeight>0)throw new fn("invalid IPColocationFactorWeight; must be negative (or 0 to disable)",ov);if(0!==e.IPColocationFactorWeight&&e.IPColocationFactorThreshold<1)throw new fn("invalid IPColocationFactorThreshold; must be at least 1",ov);if(e.behaviourPenaltyWeight>0)throw new fn("invalid BehaviourPenaltyWeight; must be negative (or 0 to disable)",ov);if(0!==e.behaviourPenaltyWeight&&(e.behaviourPenaltyDecay<=0||e.behaviourPenaltyDecay>=1))throw new fn("invalid BehaviourPenaltyDecay; must be between 0 and 1",ov);if(e.decayInterval<1e3)throw new fn("invalid DecayInterval; must be at least 1s",ov);if(e.decayToZero<=0||e.decayToZero>=1)throw new fn("invalid DecayToZero; must be between 0 and 1",ov)}(e),this.scoreCacheValidityMs=r.scoreCacheValidityMs,this.computeScore=r.computeScore??gv,this.log=n.forComponent("libp2p:gossipsub:score")}get size(){return this.peerStats.size}start(){null==this._backgroundInterval?(this._backgroundInterval=setInterval((()=>{this.background()}),this.params.decayInterval),this.log("started")):this.log("Peer score already running")}stop(){null!=this._backgroundInterval?(clearInterval(this._backgroundInterval),delete this._backgroundInterval,this.peerIPs.clear(),this.peerStats.clear(),this.deliveryRecords.clear(),this.log("stopped")):this.log("Peer score already stopped")}background(){this.refreshScores(),this.deliveryRecords.gc()}dumpPeerScoreStats(){return Object.fromEntries(Array.from(this.peerStats.entries()).map((([e,t])=>[e,t])))}messageFirstSeenTimestampMs(e){const t=this.deliveryRecords.getRecord(e);return null!=t?t.firstSeenTsMs:null}refreshScores(){const e=Date.now(),t=this.params.decayToZero;this.peerStats.forEach(((n,r)=>{n.connected?(Object.entries(n.topics).forEach((([n,r])=>{const s=this.params.topics[n];void 0!==s&&(r.firstMessageDeliveries*=s.firstMessageDeliveriesDecay,r.firstMessageDeliveries<t&&(r.firstMessageDeliveries=0),r.meshMessageDeliveries*=s.meshMessageDeliveriesDecay,r.meshMessageDeliveries<t&&(r.meshMessageDeliveries=0),r.meshFailurePenalty*=s.meshFailurePenaltyDecay,r.meshFailurePenalty<t&&(r.meshFailurePenalty=0),r.invalidMessageDeliveries*=s.invalidMessageDeliveriesDecay,r.invalidMessageDeliveries<t&&(r.invalidMessageDeliveries=0),r.inMesh&&(r.meshTime=e-r.graftTime,r.meshTime>s.meshMessageDeliveriesActivation&&(r.meshMessageDeliveriesActive=!0)))})),n.behaviourPenalty*=this.params.behaviourPenaltyDecay,n.behaviourPenalty<t&&(n.behaviourPenalty=0)):e>n.expire&&(this.removeIPsForPeer(r,n.knownIPs),this.peerStats.delete(r),this.scoreCache.delete(r))}))}score(e){this.metrics?.scoreFnCalls.inc();const t=this.peerStats.get(e);if(null==t)return 0;const n=Date.now(),r=this.scoreCache.get(e);if(null!=r&&r.cacheUntil>n)return r.score;this.metrics?.scoreFnRuns.inc();const s=this.computeScore(e,t,this.params,this.peerIPs),i=n+this.scoreCacheValidityMs;return null!=r?(this.metrics?.scoreCachedDelta.observe(Math.abs(s-r.score)),r.score=s,r.cacheUntil=i):this.scoreCache.set(e,{score:s,cacheUntil:i}),s}addPenalty(e,t,n){const r=this.peerStats.get(e);null!=r&&(r.behaviourPenalty+=t,this.metrics?.onScorePenalty(n))}addPeer(e){const t={connected:!0,expire:0,topics:{},knownIPs:new Set,behaviourPenalty:0};this.peerStats.set(e,t)}addIP(e,t){const n=this.peerStats.get(e);null!=n&&n.knownIPs.add(t),this.peerIPs.getOrDefault(t).add(e)}removeIP(e,t){const n=this.peerStats.get(e);null!=n&&n.knownIPs.delete(t);const r=this.peerIPs.get(t);null!=r&&(r.delete(e),0===r.size&&this.peerIPs.delete(t))}removePeer(e){const t=this.peerStats.get(e);if(null!=t){if(this.score(e)>0)return this.removeIPsForPeer(e,t.knownIPs),void this.peerStats.delete(e);Object.entries(t.topics).forEach((([e,t])=>{t.firstMessageDeliveries=0;const n=this.params.topics[e].meshMessageDeliveriesThreshold;if(t.inMesh&&t.meshMessageDeliveriesActive&&t.meshMessageDeliveries<n){const e=n-t.meshMessageDeliveries;t.meshFailurePenalty+=e*e}t.inMesh=!1,t.meshMessageDeliveriesActive=!1})),t.connected=!1,t.expire=Date.now()+this.params.retainScore}}graft(e,t){const n=this.peerStats.get(e);if(null!=n){const e=this.getPtopicStats(n,t);null!=e&&(e.inMesh=!0,e.graftTime=Date.now(),e.meshTime=0,e.meshMessageDeliveriesActive=!1)}}prune(e,t){const n=this.peerStats.get(e);if(null!=n){const e=this.getPtopicStats(n,t);if(null!=e){const n=this.params.topics[t].meshMessageDeliveriesThreshold;if(e.meshMessageDeliveriesActive&&e.meshMessageDeliveries<n){const t=n-e.meshMessageDeliveries;e.meshFailurePenalty+=t*t}e.meshMessageDeliveriesActive=!1,e.inMesh=!1}}}validateMessage(e){this.deliveryRecords.ensureRecord(e)}deliverMessage(e,t,n){this.markFirstMessageDelivery(e,n);const r=this.deliveryRecords.ensureRecord(t),s=Date.now();r.status===yv.unknown?(r.status=yv.valid,r.validated=s,r.peers.forEach((t=>{t!==e.toString()&&this.markDuplicateMessageDelivery(t,n)}))):this.log("unexpected delivery: message from %s was first seen %s ago and has delivery status %s",e,s-r.firstSeenTsMs,yv[r.status])}rejectInvalidMessage(e,t){this.markInvalidMessageDelivery(e,t)}rejectMessage(e,t,n,r){switch(r){case Yb.Error:return void this.markInvalidMessageDelivery(e,n);case Yb.Blacklisted:return}const s=this.deliveryRecords.ensureRecord(t);if(s.status===yv.unknown){if(r===Yb.Ignore)return s.status=yv.ignored,void s.peers.clear();s.status=yv.invalid,this.markInvalidMessageDelivery(e,n),s.peers.forEach((e=>{this.markInvalidMessageDelivery(e,n)})),s.peers.clear()}else this.log("unexpected rejection: message from %s was first seen %s ago and has delivery status %d",e,Date.now()-s.firstSeenTsMs,yv[s.status])}duplicateMessage(e,t,n){const r=this.deliveryRecords.ensureRecord(t);if(!r.peers.has(e))switch(r.status){case yv.unknown:r.peers.add(e);break;case yv.valid:r.peers.add(e),this.markDuplicateMessageDelivery(e,n,r.validated);break;case yv.invalid:this.markInvalidMessageDelivery(e,n);case yv.ignored:}}markInvalidMessageDelivery(e,t){const n=this.peerStats.get(e);if(null!=n){const e=this.getPtopicStats(n,t);null!=e&&(e.invalidMessageDeliveries+=1)}}markFirstMessageDelivery(e,t){const n=this.peerStats.get(e);if(null!=n){const e=this.getPtopicStats(n,t);if(null!=e){let n=this.params.topics[t].firstMessageDeliveriesCap;e.firstMessageDeliveries=Math.min(n,e.firstMessageDeliveries+1),e.inMesh&&(n=this.params.topics[t].meshMessageDeliveriesCap,e.meshMessageDeliveries=Math.min(n,e.meshMessageDeliveries+1))}}}markDuplicateMessageDelivery(e,t,n){const r=this.peerStats.get(e);if(null!=r){const e=void 0!==n?Date.now():0,s=this.getPtopicStats(r,t);if(null!=s&&s.inMesh){const r=this.params.topics[t];if(void 0!==n){const s=e-n,i=s>r.meshMessageDeliveriesWindow;if(this.metrics?.onDuplicateMsgDelivery(t,s,i),i)return}const i=r.meshMessageDeliveriesCap;s.meshMessageDeliveries=Math.min(i,s.meshMessageDeliveries+1)}}}removeIPsForPeer(e,t){for(const n of t){const t=this.peerIPs.get(n);null!=t&&(t.delete(e),0===t.size&&this.peerIPs.delete(n))}}getPtopicStats(e,t){let n=e.topics[t];return void 0!==n?n:void 0!==this.params.topics[t]?(n={inMesh:!1,graftTime:0,meshTime:0,firstMessageDeliveries:0,meshMessageDeliveries:0,meshMessageDeliveriesActive:!1,meshFailurePenalty:0,invalidMessageDeliveries:0},e.topics[t]=n,n):null}}function Ev(e,t,n,r,s){let i=0;const o=new Map;if(Object.entries(t.topics).forEach((([e,t])=>{const r=s.get(e)??"unknown",a=n.topics[e];if(void 0===a)return;let c=o.get(r);null==c&&(c={p1w:0,p2w:0,p3w:0,p3bw:0,p4w:0},o.set(r,c));let l=0,u=0,h=0,d=0,p=0;if(t.inMesh){l+=Math.max(t.meshTime/a.timeInMeshQuantum,a.timeInMeshCap)*a.timeInMeshWeight}let f=t.firstMessageDeliveries;if(f>a.firstMessageDeliveriesCap&&(f=a.firstMessageDeliveriesCap),u+=f*a.firstMessageDeliveriesWeight,t.meshMessageDeliveriesActive&&t.meshMessageDeliveries<a.meshMessageDeliveriesThreshold){const e=a.meshMessageDeliveriesThreshold-t.meshMessageDeliveries;h+=e*e*a.meshMessageDeliveriesWeight}d+=t.meshFailurePenalty*a.meshFailurePenaltyWeight;p+=t.invalidMessageDeliveries*t.invalidMessageDeliveries*a.invalidMessageDeliveriesWeight,i+=(l+u+h+d+p)*a.topicWeight,c.p1w+=l,c.p2w+=u,c.p3w+=h,c.p3bw+=d,c.p4w+=p})),n.topicScoreCap>0&&i>n.topicScoreCap){i=n.topicScoreCap;const e=n.topicScoreCap/i;for(const t of o.values())t.p1w*=e,t.p2w*=e,t.p3w*=e,t.p3bw*=e,t.p4w*=e}let a=0,c=0,l=0;a+=n.appSpecificScore(e)*n.appSpecificWeight,t.knownIPs.forEach((e=>{if(n.IPColocationFactorWhitelist.has(e))return;const t=r.get(e),s=null!=t?t.size:0;if(s>n.IPColocationFactorThreshold){const e=s-n.IPColocationFactorThreshold;c+=e*e*n.IPColocationFactorWeight}}));return l+=t.behaviourPenalty*t.behaviourPenalty*n.behaviourPenaltyWeight,i+=a+c+l,{byTopic:o,p5w:a,p6w:c,p7w:l,score:i}}class Sv{rawStream;pushable;closeController;maxBufferSize;constructor(e,t,n){this.rawStream=e,this.pushable=pr(),this.closeController=new AbortController,this.maxBufferSize=n.maxBufferSize??1/0,this.closeController.signal.addEventListener("abort",(()=>{e.close().catch((t=>{e.abort(t)}))})),gr(this.pushable,this.rawStream).catch(t)}get protocol(){return this.rawStream.protocol}push(e){if(this.pushable.readableLength>this.maxBufferSize)throw Error(`OutboundStream buffer full, size > ${this.maxBufferSize}`);this.pushable.push(Or.single(e))}pushPrefixed(e){if(this.pushable.readableLength>this.maxBufferSize)throw Error(`OutboundStream buffer full, size > ${this.maxBufferSize}`);this.pushable.push(e)}async close(){this.closeController.abort(),await this.pushable.return()}}class _v{source;rawStream;closeController;constructor(e,t={}){this.rawStream=e,this.closeController=new AbortController,this.closeController.signal.addEventListener("abort",(()=>{e.close().catch((t=>{e.abort(t)}))})),this.source=gr(this.rawStream,(e=>qr(e,t)))}async close(){this.closeController.abort()}}class Iv{gossipsubIWantFollowupMs;msgIdToStrFn;metrics;promises=new Map;requestMsByMsg=new Map;requestMsByMsgExpire;constructor(e,t,n){this.gossipsubIWantFollowupMs=e,this.msgIdToStrFn=t,this.metrics=n,this.requestMsByMsgExpire=10*e}get size(){return this.promises.size}get requestMsByMsgSize(){return this.requestMsByMsg.size}addPromise(e,t){const n=t[Math.floor(Math.random()*t.length)],r=this.msgIdToStrFn(n);let s=this.promises.get(r);null==s&&(s=new Map,this.promises.set(r,s));const i=Date.now();s.has(e)||(s.set(e,i+this.gossipsubIWantFollowupMs),null!=this.metrics&&(this.metrics.iwantPromiseStarted.inc(1),this.requestMsByMsg.has(r)||this.requestMsByMsg.set(r,i)))}getBrokenPromises(){const e=Date.now(),t=new Map;let n=0;return this.promises.forEach(((r,s)=>{r.forEach(((s,i)=>{s<e&&(t.set(i,(t.get(i)??0)+1),r.delete(i),n++)})),0===r.size&&this.promises.delete(s)})),this.metrics?.iwantPromiseBroken.inc(n),t}deliverMessage(e,t=!1){this.trackMessage(e);const n=this.promises.get(e);null!=n&&(this.promises.delete(e),null!=this.metrics&&(this.metrics.iwantPromiseResolved.inc(1),t&&this.metrics.iwantPromiseResolvedFromDuplicate.inc(1),this.metrics.iwantPromiseResolvedPeers.inc(n.size)))}rejectMessage(e,t){this.trackMessage(e),t!==Yb.Error&&this.promises.delete(e)}clear(){this.promises.clear()}prune(){const e=Date.now()-this.requestMsByMsgExpire;let t=0;for(const[n,r]of this.requestMsByMsg.entries()){if(!(r<e))break;this.requestMsByMsg.delete(n),t++}this.metrics?.iwantMessagePruned.inc(t)}trackMessage(e){if(null!=this.metrics){const t=this.requestMsByMsg.get(e);void 0!==t&&(this.metrics.iwantPromiseDeliveryTime.observe((Date.now()-t)/1e3),this.requestMsByMsg.delete(e))}}}const Rv=kt("libp2p-pubsub:");function Av(e=[],t){return{subscriptions:[],messages:e,control:void 0!==t?{graft:t.graft??[],prune:t.prune??[],ihave:t.ihave??[],iwant:t.iwant??[]}:void 0}}function Tv(e){return void 0===e.control&&(e.control={graft:[],prune:[],ihave:[],iwant:[]}),e}function Dv(e){if(e.length<=1)return e;for(let t=0;t<e.length;t++){const n=Math.floor(Math.random()*Math.floor(e.length)),r=e[t];e[t]=e[n],e[n]=r}return e}function kv(e){return Qt(e,"base64")}function Pv(e){if("signed"!==e.type)throw new Error("expected signed message type");if(null==e.sequenceNumber)throw Error("missing seqno field");return((e,t)=>{const n=kt(t.toString(16).padStart(16,"0"),"base16"),r=new Uint8Array(e.length+n.length);return r.set(e,0),r.set(n,e.length),r})(e.from.toBytes(),e.sequenceNumber)}async function Cv(e){return gt.encode(e.data)}var xv,Nv;!function(e){e[e.ip4=4]="ip4",e[e.ip6=41]="ip6"}(xv||(xv={}));class Mv{entries=new Map;validityMs;constructor(e){this.validityMs=e.validityMs}get size(){return this.entries.size}put(e,t){return!!this.entries.has(e)||(this.entries.set(e,{value:t,validUntilMs:Date.now()+this.validityMs}),!1)}prune(){const e=Date.now();for(const[t,n]of this.entries.entries()){if(!(n.validUntilMs<e))break;this.entries.delete(t)}}has(e){return this.entries.has(e)}get(e){const t=this.entries.get(e);return null!=t&&t.validUntilMs>=Date.now()?t.value:void 0}clear(){this.entries.clear()}}!function(e){e[e.started=0]="started",e[e.stopped=1]="stopped"}(Nv||(Nv={}));class Ov extends wn{globalSignaturePolicy;multicodecs=[qb,$b];publishConfig;dataTransform;peers=new Set;streamsInbound=new Map;streamsOutbound=new Map;outboundInflightQueue=pr({objectMode:!0});direct=new Set;floodsubPeers=new Set;seenCache;acceptFromWhitelist=new Map;topics=new Map;subscriptions=new Set;mesh=new Map;fanout=new Map;fanoutLastpub=new Map;gossip=new Map;control=new Map;peerhave=new Map;iasked=new Map;backoff=new Map;outbound=new Map;msgIdFn;fastMsgIdFn;msgIdToStrFn;fastMsgIdCache;publishedMessageIds;mcache;score;topicValidators=new Map;log;heartbeatTicks=0;gossipTracer;components;directPeerInitial=null;static multicodec=qb;opts;decodeRpcLimits;metrics;status={code:Nv.stopped};maxInboundStreams;maxOutboundStreams;runOnTransientConnection;allowedTopics;heartbeatTimer=null;constructor(e,t={}){super();const n={fallbackToFloodsub:!0,floodPublish:!0,batchPublish:!1,tagMeshPeers:!0,doPX:!1,directPeers:[],D:6,Dlo:4,Dhi:12,Dscore:4,Dout:2,Dlazy:6,heartbeatInterval:1e3,fanoutTTL:6e4,mcacheLength:5,mcacheGossip:3,seenTTL:12e4,gossipsubIWantFollowupMs:3e3,prunePeers:16,pruneBackoff:6e4,unsubcribeBackoff:1e4,graftFloodThreshold:1e4,opportunisticGraftPeers:2,opportunisticGraftTicks:60,directConnectTicks:300,...t,scoreParams:lv(t.scoreParams),scoreThresholds:dv(t.scoreThresholds)};if(this.components=e,this.decodeRpcLimits=n.decodeRpcLimits??zb,this.globalSignaturePolicy=n.globalSignaturePolicy??cn,n.fallbackToFloodsub&&this.multicodecs.push(Kb),this.log=e.logger.forComponent(n.debugName??"libp2p:gossipsub"),this.opts=n,this.direct=new Set(n.directPeers.map((e=>e.id.toString()))),this.seenCache=new Mv({validityMs:n.seenTTL}),this.publishedMessageIds=new Mv({validityMs:n.seenTTL}),null!=t.msgIdFn)this.msgIdFn=t.msgIdFn;else switch(this.globalSignaturePolicy){case cn:this.msgIdFn=Pv;break;case ln:this.msgIdFn=Cv;break;default:throw new Error(`Invalid globalSignaturePolicy: ${this.globalSignaturePolicy}`)}if(null!=t.fastMsgIdFn&&(this.fastMsgIdFn=t.fastMsgIdFn,this.fastMsgIdCache=new Mv({validityMs:n.seenTTL})),this.msgIdToStrFn=t.msgIdToStrFn??kv,this.mcache=t.messageCache??new sv(n.mcacheGossip,n.mcacheLength,this.msgIdToStrFn),null!=t.dataTransform&&(this.dataTransform=t.dataTransform),null!=t.metricsRegister){if(null==t.metricsTopicStrToLabel)throw Error("Must set metricsTopicStrToLabel with metrics");const e=Math.max(...Object.values(n.scoreParams.topics).map((e=>e.meshMessageDeliveriesWindow)),1e3),r=function(e,t,n){return{protocolsEnabled:e.gauge({name:"gossipsub_protocol",help:"Status of enabled protocols",labelNames:["protocol"]}),topicSubscriptionStatus:e.gauge({name:"gossipsub_topic_subscription_status",help:"Status of our subscription to this topic",labelNames:["topicStr"]}),topicPeersCount:e.gauge({name:"gossipsub_topic_peer_count",help:"Number of peers subscribed to each topic",labelNames:["topicStr"]}),meshPeerCounts:e.gauge({name:"gossipsub_mesh_peer_count",help:"Number of peers in our mesh",labelNames:["topicStr"]}),meshPeerInclusionEventsFanout:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_fanout_total",help:"Number of times we include peers in a topic mesh for fanout reasons",labelNames:["topic"]}),meshPeerInclusionEventsRandom:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_random_total",help:"Number of times we include peers in a topic mesh for random reasons",labelNames:["topic"]}),meshPeerInclusionEventsSubscribed:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_subscribed_total",help:"Number of times we include peers in a topic mesh for subscribed reasons",labelNames:["topic"]}),meshPeerInclusionEventsOutbound:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_outbound_total",help:"Number of times we include peers in a topic mesh for outbound reasons",labelNames:["topic"]}),meshPeerInclusionEventsNotEnough:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_not_enough_total",help:"Number of times we include peers in a topic mesh for not_enough reasons",labelNames:["topic"]}),meshPeerInclusionEventsOpportunistic:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_opportunistic_total",help:"Number of times we include peers in a topic mesh for opportunistic reasons",labelNames:["topic"]}),meshPeerInclusionEventsUnknown:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_unknown_total",help:"Number of times we include peers in a topic mesh for unknown reasons",labelNames:["topic"]}),meshPeerChurnEventsDisconnected:e.gauge({name:"gossipsub_peer_churn_events_disconnected_total",help:"Number of times we remove peers in a topic mesh for disconnected reasons",labelNames:["topic"]}),meshPeerChurnEventsBadScore:e.gauge({name:"gossipsub_peer_churn_events_bad_score_total",help:"Number of times we remove peers in a topic mesh for bad_score reasons",labelNames:["topic"]}),meshPeerChurnEventsPrune:e.gauge({name:"gossipsub_peer_churn_events_prune_total",help:"Number of times we remove peers in a topic mesh for prune reasons",labelNames:["topic"]}),meshPeerChurnEventsExcess:e.gauge({name:"gossipsub_peer_churn_events_excess_total",help:"Number of times we remove peers in a topic mesh for excess reasons",labelNames:["topic"]}),meshPeerChurnEventsUnknown:e.gauge({name:"gossipsub_peer_churn_events_unknown_total",help:"Number of times we remove peers in a topic mesh for unknown reasons",labelNames:["topic"]}),peersPerProtocol:e.gauge({name:"gossipsub_peers_per_protocol_count",help:"Peers connected for each topic",labelNames:["protocol"]}),heartbeatDuration:e.histogram({name:"gossipsub_heartbeat_duration_seconds",help:"The time it takes to complete one iteration of the heartbeat",buckets:[.01,.1,1]}),heartbeatSkipped:e.gauge({name:"gossipsub_heartbeat_skipped",help:"Heartbeat run took longer than heartbeat interval so next is skipped"}),acceptedMessagesTotal:e.gauge({name:"gossipsub_accepted_messages_total",help:"Total accepted messages for each topic",labelNames:["topic"]}),ignoredMessagesTotal:e.gauge({name:"gossipsub_ignored_messages_total",help:"Total ignored messages for each topic",labelNames:["topic"]}),rejectedMessagesTotal:e.gauge({name:"gossipsub_rejected_messages_total",help:"Total rejected messages for each topic",labelNames:["topic"]}),unknownValidationResultsTotal:e.gauge({name:"gossipsub_unknown_validation_results_total",help:"Total unknown validation results for each topic",labelNames:["topic"]}),asyncValidationMcacheHit:e.gauge({name:"gossipsub_async_validation_mcache_hit_total",help:"Async validation result reported by the user layer",labelNames:["hit"]}),asyncValidationDelayFromFirstSeenSec:e.histogram({name:"gossipsub_async_validation_delay_from_first_seen",help:"Async validation report delay from first seen in second",buckets:[.01,.03,.1,.3,1,3,10]}),asyncValidationUnknownFirstSeen:e.gauge({name:"gossipsub_async_validation_unknown_first_seen_count_total",help:"Async validation report unknown first seen value for message"}),peerReadStreamError:e.gauge({name:"gossipsub_peer_read_stream_err_count_total",help:"Peer read stream error"}),rpcRecvBytes:e.gauge({name:"gossipsub_rpc_recv_bytes_total",help:"RPC recv"}),rpcRecvCount:e.gauge({name:"gossipsub_rpc_recv_count_total",help:"RPC recv"}),rpcRecvSubscription:e.gauge({name:"gossipsub_rpc_recv_subscription_total",help:"RPC recv"}),rpcRecvMessage:e.gauge({name:"gossipsub_rpc_recv_message_total",help:"RPC recv"}),rpcRecvControl:e.gauge({name:"gossipsub_rpc_recv_control_total",help:"RPC recv"}),rpcRecvIHave:e.gauge({name:"gossipsub_rpc_recv_ihave_total",help:"RPC recv"}),rpcRecvIWant:e.gauge({name:"gossipsub_rpc_recv_iwant_total",help:"RPC recv"}),rpcRecvGraft:e.gauge({name:"gossipsub_rpc_recv_graft_total",help:"RPC recv"}),rpcRecvPrune:e.gauge({name:"gossipsub_rpc_recv_prune_total",help:"RPC recv"}),rpcDataError:e.gauge({name:"gossipsub_rpc_data_err_count_total",help:"RPC data error"}),rpcRecvError:e.gauge({name:"gossipsub_rpc_recv_err_count_total",help:"RPC recv error"}),rpcRecvNotAccepted:e.gauge({name:"gossipsub_rpc_rcv_not_accepted_total",help:"Total count of RPC dropped because acceptFrom() == false"}),rpcSentBytes:e.gauge({name:"gossipsub_rpc_sent_bytes_total",help:"RPC sent"}),rpcSentCount:e.gauge({name:"gossipsub_rpc_sent_count_total",help:"RPC sent"}),rpcSentSubscription:e.gauge({name:"gossipsub_rpc_sent_subscription_total",help:"RPC sent"}),rpcSentMessage:e.gauge({name:"gossipsub_rpc_sent_message_total",help:"RPC sent"}),rpcSentControl:e.gauge({name:"gossipsub_rpc_sent_control_total",help:"RPC sent"}),rpcSentIHave:e.gauge({name:"gossipsub_rpc_sent_ihave_total",help:"RPC sent"}),rpcSentIWant:e.gauge({name:"gossipsub_rpc_sent_iwant_total",help:"RPC sent"}),rpcSentGraft:e.gauge({name:"gossipsub_rpc_sent_graft_total",help:"RPC sent"}),rpcSentPrune:e.gauge({name:"gossipsub_rpc_sent_prune_total",help:"RPC sent"}),msgPublishCount:e.gauge({name:"gossipsub_msg_publish_count_total",help:"Total count of msg published by topic",labelNames:["topic"]}),msgPublishPeersByTopic:e.gauge({name:"gossipsub_msg_publish_peers_total",help:"Total count of peers that we publish a msg to",labelNames:["topic"]}),directPeersPublishedTotal:e.gauge({name:"gossipsub_direct_peers_published_total",help:"Total direct peers that we publish a msg to",labelNames:["topic"]}),floodsubPeersPublishedTotal:e.gauge({name:"gossipsub_floodsub_peers_published_total",help:"Total floodsub peers that we publish a msg to",labelNames:["topic"]}),meshPeersPublishedTotal:e.gauge({name:"gossipsub_mesh_peers_published_total",help:"Total mesh peers that we publish a msg to",labelNames:["topic"]}),fanoutPeersPublishedTotal:e.gauge({name:"gossipsub_fanout_peers_published_total",help:"Total fanout peers that we publish a msg to",labelNames:["topic"]}),msgPublishBytes:e.gauge({name:"gossipsub_msg_publish_bytes_total",help:"Total count of msg publish data.length bytes",labelNames:["topic"]}),msgPublishTime:e.histogram({name:"gossipsub_msg_publish_seconds",help:"Total time in seconds to publish a message",buckets:[.001,.002,.005,.01,.1,.5,1],labelNames:["topic"]}),msgForwardCount:e.gauge({name:"gossipsub_msg_forward_count_total",help:"Total count of msg forwarded by topic",labelNames:["topic"]}),msgForwardPeers:e.gauge({name:"gossipsub_msg_forward_peers_total",help:"Total count of peers that we forward a msg to",labelNames:["topic"]}),msgReceivedPreValidation:e.gauge({name:"gossipsub_msg_received_prevalidation_total",help:"Total count of recv msgs before any validation",labelNames:["topic"]}),msgReceivedError:e.gauge({name:"gossipsub_msg_received_error_total",help:"Total count of recv msgs error",labelNames:["topic"]}),prevalidationInvalidTotal:e.gauge({name:"gossipsub_pre_validation_invalid_total",help:"Total count of invalid messages received",labelNames:["topic"]}),prevalidationValidTotal:e.gauge({name:"gossipsub_pre_validation_valid_total",help:"Total count of valid messages received",labelNames:["topic"]}),prevalidationDuplicateTotal:e.gauge({name:"gossipsub_pre_validation_duplicate_total",help:"Total count of duplicate messages received",labelNames:["topic"]}),prevalidationUnknownTotal:e.gauge({name:"gossipsub_pre_validation_unknown_status_total",help:"Total count of unknown_status messages received",labelNames:["topic"]}),msgReceivedInvalid:e.gauge({name:"gossipsub_msg_received_invalid_total",help:"Tracks specific reason of invalid",labelNames:["error"]}),msgReceivedInvalidByTopic:e.gauge({name:"gossipsub_msg_received_invalid_by_topic_total",help:"Tracks specific invalid message by topic",labelNames:["topic"]}),duplicateMsgDeliveryDelay:e.histogram({name:"gossisub_duplicate_msg_delivery_delay_seconds",help:"Time since the 1st duplicated message validated",labelNames:["topic"],buckets:[.25*n.maxMeshMessageDeliveriesWindowSec,.5*n.maxMeshMessageDeliveriesWindowSec,Number(n.maxMeshMessageDeliveriesWindowSec),2*n.maxMeshMessageDeliveriesWindowSec,4*n.maxMeshMessageDeliveriesWindowSec]}),duplicateMsgLateDelivery:e.gauge({name:"gossisub_duplicate_msg_late_delivery_total",help:"Total count of late duplicate message delivery by topic, which triggers P3 penalty",labelNames:["topic"]}),duplicateMsgIgnored:e.gauge({name:"gossisub_ignored_published_duplicate_msgs_total",help:"Total count of published duplicate message ignored by topic",labelNames:["topic"]}),scoreFnCalls:e.gauge({name:"gossipsub_score_fn_calls_total",help:"Total times score() is called"}),scoreFnRuns:e.gauge({name:"gossipsub_score_fn_runs_total",help:"Total times score() call actually computed computeScore(), no cache"}),scoreCachedDelta:e.histogram({name:"gossipsub_score_cache_delta",help:"Delta of score between cached values that expired",buckets:[10,100,1e3]}),peersByScoreThreshold:e.gauge({name:"gossipsub_peers_by_score_threshold_count",help:"Current count of peers by score threshold",labelNames:["threshold"]}),score:e.avgMinMax({name:"gossipsub_score",help:"Avg min max of gossip scores"}),scoreWeights:e.avgMinMax({name:"gossipsub_score_weights",help:"Separate score weights",labelNames:["topic","p"]}),scorePerMesh:e.avgMinMax({name:"gossipsub_score_per_mesh",help:"Histogram of the scores for each mesh topic",labelNames:["topic"]}),scoringPenalties:e.gauge({name:"gossipsub_scoring_penalties_total",help:"A counter of the kind of penalties being applied to peers",labelNames:["penalty"]}),behaviourPenalty:e.histogram({name:"gossipsub_peer_stat_behaviour_penalty",help:"Current peer stat behaviour_penalty at each scrape",buckets:[.25*n.behaviourPenaltyThreshold,.5*n.behaviourPenaltyThreshold,Number(n.behaviourPenaltyThreshold),2*n.behaviourPenaltyThreshold,4*n.behaviourPenaltyThreshold]}),ihaveRcvIgnored:e.gauge({name:"gossipsub_ihave_rcv_ignored_total",help:"Total received IHAVE messages that we ignore for some reason",labelNames:["reason"]}),ihaveRcvMsgids:e.gauge({name:"gossipsub_ihave_rcv_msgids_total",help:"Total received IHAVE messages by topic",labelNames:["topic"]}),ihaveRcvNotSeenMsgids:e.gauge({name:"gossipsub_ihave_rcv_not_seen_msgids_total",help:"Total messages per topic we do not have, not actual requests",labelNames:["topic"]}),iwantRcvMsgids:e.gauge({name:"gossipsub_iwant_rcv_msgids_total",help:"Total received IWANT messages by topic",labelNames:["topic"]}),iwantRcvDonthaveMsgids:e.gauge({name:"gossipsub_iwant_rcv_dont_have_msgids_total",help:"Total requested messageIDs that we do not have"}),iwantPromiseStarted:e.gauge({name:"gossipsub_iwant_promise_sent_total",help:"Total count of started IWANT promises"}),iwantPromiseResolved:e.gauge({name:"gossipsub_iwant_promise_resolved_total",help:"Total count of resolved IWANT promises"}),iwantPromiseResolvedFromDuplicate:e.gauge({name:"gossipsub_iwant_promise_resolved_from_duplicate_total",help:"Total count of resolved IWANT promises from duplicate messages"}),iwantPromiseResolvedPeers:e.gauge({name:"gossipsub_iwant_promise_resolved_peers",help:"Total count of peers we have asked IWANT promises that are resolved"}),iwantPromiseBroken:e.gauge({name:"gossipsub_iwant_promise_broken",help:"Total count of broken IWANT promises"}),iwantMessagePruned:e.gauge({name:"gossipsub_iwant_message_pruned",help:"Total count of pruned IWANT messages"}),iwantPromiseDeliveryTime:e.histogram({name:"gossipsub_iwant_promise_delivery_seconds",help:"Histogram of delivery time of resolved IWANT promises",buckets:[.5*n.gossipPromiseExpireSec,Number(n.gossipPromiseExpireSec),2*n.gossipPromiseExpireSec,4*n.gossipPromiseExpireSec]}),iwantPromiseUntracked:e.gauge({name:"gossip_iwant_promise_untracked",help:"Total count of untracked IWANT promise"}),connectedPeersBackoffSec:e.histogram({name:"gossipsub_connected_peers_backoff_seconds",help:"Backoff time in seconds",buckets:[1,2,4,10,20,60,120]}),cacheSize:e.gauge({name:"gossipsub_cache_size",help:"Unbounded cache sizes",labelNames:["cache"]}),mcacheSize:e.gauge({name:"gossipsub_mcache_size",help:"Current mcache msg count"}),mcacheNotValidatedCount:e.gauge({name:"gossipsub_mcache_not_validated_count",help:"Current mcache msg count not validated"}),fastMsgIdCacheCollision:e.gauge({name:"gossipsub_fastmsgid_cache_collision_total",help:"Total count of key collisions on fastmsgid cache put"}),newConnectionCount:e.gauge({name:"gossipsub_new_connection_total",help:"Total new connection by status",labelNames:["status"]}),topicStrToLabel:t,toTopic(e){return this.topicStrToLabel.get(e)??e},onJoin(e){this.topicSubscriptionStatus.set({topicStr:e},1),this.meshPeerCounts.set({topicStr:e},0)},onLeave(e){this.topicSubscriptionStatus.set({topicStr:e},0),this.meshPeerCounts.set({topicStr:e},0)},onAddToMesh(e,t,n){const r=this.toTopic(e);switch(t){case Xb.Fanout:this.meshPeerInclusionEventsFanout.inc({topic:r},n);break;case Xb.Random:this.meshPeerInclusionEventsRandom.inc({topic:r},n);break;case Xb.Subscribed:this.meshPeerInclusionEventsSubscribed.inc({topic:r},n);break;case Xb.Outbound:this.meshPeerInclusionEventsOutbound.inc({topic:r},n);break;case Xb.NotEnough:this.meshPeerInclusionEventsNotEnough.inc({topic:r},n);break;case Xb.Opportunistic:this.meshPeerInclusionEventsOpportunistic.inc({topic:r},n);break;default:this.meshPeerInclusionEventsUnknown.inc({topic:r},n)}},onRemoveFromMesh(e,t,n){const r=this.toTopic(e);switch(t){case ev.Dc:this.meshPeerChurnEventsDisconnected.inc({topic:r},n);break;case ev.BadScore:this.meshPeerChurnEventsBadScore.inc({topic:r},n);break;case ev.Prune:this.meshPeerChurnEventsPrune.inc({topic:r},n);break;case ev.Excess:this.meshPeerChurnEventsExcess.inc({topic:r},n);break;default:this.meshPeerChurnEventsUnknown.inc({topic:r},n)}},onReportValidation(e,t,n){if(this.asyncValidationMcacheHit.inc({hit:null!=e?"hit":"miss"}),null!=e){const n=this.toTopic(e.message.topic);switch(t){case un.Accept:this.acceptedMessagesTotal.inc({topic:n});break;case un.Ignore:this.ignoredMessagesTotal.inc({topic:n});break;case un.Reject:this.rejectedMessagesTotal.inc({topic:n});break;default:this.unknownValidationResultsTotal.inc({topic:n})}}null!=n?this.asyncValidationDelayFromFirstSeenSec.observe((Date.now()-n)/1e3):this.asyncValidationUnknownFirstSeen.inc()},onScorePenalty(e){this.scoringPenalties.inc({penalty:e},1)},onIhaveRcv(e,t,n){const r=this.toTopic(e);this.ihaveRcvMsgids.inc({topic:r},t),this.ihaveRcvNotSeenMsgids.inc({topic:r},n)},onIwantRcv(e,t){for(const[t,n]of e){const e=this.toTopic(t);this.iwantRcvMsgids.inc({topic:e},n)}this.iwantRcvDonthaveMsgids.inc(t)},onForwardMsg(e,t){const n=this.toTopic(e);this.msgForwardCount.inc({topic:n},1),this.msgForwardPeers.inc({topic:n},t)},onPublishMsg(e,t,n,r,s){const i=this.toTopic(e);this.msgPublishCount.inc({topic:i},1),this.msgPublishBytes.inc({topic:i},n*r),this.msgPublishPeersByTopic.inc({topic:i},n),this.directPeersPublishedTotal.inc({topic:i},t.direct),this.floodsubPeersPublishedTotal.inc({topic:i},t.floodsub),this.meshPeersPublishedTotal.inc({topic:i},t.mesh),this.fanoutPeersPublishedTotal.inc({topic:i},t.fanout),this.msgPublishTime.observe({topic:i},s/1e3)},onMsgRecvPreValidation(e){const t=this.toTopic(e);this.msgReceivedPreValidation.inc({topic:t},1)},onMsgRecvError(e){const t=this.toTopic(e);this.msgReceivedError.inc({topic:t},1)},onPrevalidationResult(e,t){const n=this.toTopic(e);switch(t){case Zb.duplicate:this.prevalidationDuplicateTotal.inc({topic:n});break;case Zb.invalid:this.prevalidationInvalidTotal.inc({topic:n});break;case Zb.valid:this.prevalidationValidTotal.inc({topic:n});break;default:this.prevalidationUnknownTotal.inc({topic:n})}},onMsgRecvInvalid(e,t){const n=this.toTopic(e),r=t.reason===Yb.Error?t.error:t.reason;this.msgReceivedInvalid.inc({error:r},1),this.msgReceivedInvalidByTopic.inc({topic:n},1)},onDuplicateMsgDelivery(e,t,n){const r=this.toTopic(e);this.duplicateMsgDeliveryDelay.observe({topic:r},t/1e3),n&&this.duplicateMsgLateDelivery.inc({topic:r},1)},onPublishDuplicateMsg(e){const t=this.toTopic(e);this.duplicateMsgIgnored.inc({topic:t},1)},onPeerReadStreamError(){this.peerReadStreamError.inc(1)},onRpcRecvError(){this.rpcRecvError.inc(1)},onRpcDataError(){this.rpcDataError.inc(1)},onRpcRecv(e,t){this.rpcRecvBytes.inc(t),this.rpcRecvCount.inc(1),null!=e.subscriptions&&this.rpcRecvSubscription.inc(e.subscriptions.length),null!=e.messages&&this.rpcRecvMessage.inc(e.messages.length),null!=e.control&&(this.rpcRecvControl.inc(1),null!=e.control.ihave&&this.rpcRecvIHave.inc(e.control.ihave.length),null!=e.control.iwant&&this.rpcRecvIWant.inc(e.control.iwant.length),null!=e.control.graft&&this.rpcRecvGraft.inc(e.control.graft.length),null!=e.control.prune&&this.rpcRecvPrune.inc(e.control.prune.length))},onRpcSent(e,t){if(this.rpcSentBytes.inc(t),this.rpcSentCount.inc(1),null!=e.subscriptions&&this.rpcSentSubscription.inc(e.subscriptions.length),null!=e.messages&&this.rpcSentMessage.inc(e.messages.length),null!=e.control){const t=e.control.ihave?.length??0,n=e.control.iwant?.length??0,r=e.control.graft?.length??0,s=e.control.prune?.length??0;t>0&&this.rpcSentIHave.inc(t),n>0&&this.rpcSentIWant.inc(n),r>0&&this.rpcSentGraft.inc(r),s>0&&this.rpcSentPrune.inc(s),(t>0||n>0||r>0||s>0)&&this.rpcSentControl.inc(1)}},registerScores(e,t){let n=0,r=0,s=0,i=0;for(const o of e)o>=t.graylistThreshold&&n++,o>=t.publishThreshold&&r++,o>=t.gossipThreshold&&s++,o>=0&&i++;this.peersByScoreThreshold.set({threshold:rv.graylist},n),this.peersByScoreThreshold.set({threshold:rv.publish},r),this.peersByScoreThreshold.set({threshold:rv.gossip},s),this.peersByScoreThreshold.set({threshold:rv.mesh},i),this.score.set(e)},registerScoreWeights(e){for(const[t,n]of e.byTopic)this.scoreWeights.set({topic:t,p:"p1"},n.p1w),this.scoreWeights.set({topic:t,p:"p2"},n.p2w),this.scoreWeights.set({topic:t,p:"p3"},n.p3w),this.scoreWeights.set({topic:t,p:"p3b"},n.p3bw),this.scoreWeights.set({topic:t,p:"p4"},n.p4w);this.scoreWeights.set({p:"p5"},e.p5w),this.scoreWeights.set({p:"p6"},e.p6w),this.scoreWeights.set({p:"p7"},e.p7w)},registerScorePerMesh(e,t){const n=new Map;e.forEach(((e,t)=>{const r=this.topicStrToLabel.get(t)??"unknown";let s=n.get(r);null==s&&(s=new Set,n.set(r,s)),e.forEach((e=>s?.add(e)))}));for(const[e,r]of n){const n=[];r.forEach((e=>{n.push(t.get(e)??0)})),this.scorePerMesh.set({topic:e},n)}}}}(t.metricsRegister,t.metricsTopicStrToLabel,{gossipPromiseExpireSec:this.opts.gossipsubIWantFollowupMs/1e3,behaviourPenaltyThreshold:n.scoreParams.behaviourPenaltyThreshold,maxMeshMessageDeliveriesWindowSec:e/1e3});r.mcacheSize.addCollect((()=>{this.onScrapeMetrics(r)}));for(const e of this.multicodecs)r.protocolsEnabled.set({protocol:e},1);this.metrics=r}else this.metrics=null;this.gossipTracer=new Iv(this.opts.gossipsubIWantFollowupMs,this.msgIdToStrFn,this.metrics),this.score=new vv(this.opts.scoreParams,this.metrics,this.components.logger,{scoreCacheValidityMs:n.heartbeatInterval}),this.maxInboundStreams=t.maxInboundStreams,this.maxOutboundStreams=t.maxOutboundStreams,this.runOnTransientConnection=t.runOnTransientConnection,this.allowedTopics=null!=n.allowedTopics?new Set(n.allowedTopics):null}getPeers(){return[...this.peers.keys()].map((e=>Ss(e)))}isStarted(){return this.status.code===Nv.started}async start(){if(this.isStarted())return;this.log("starting"),this.publishConfig=await async function(e,t){switch(e){case cn:{if(null==t)throw Error("Must provide PeerId");if(null==t.privateKey)throw Error("Cannot sign message, no private key present");if(null==t.publicKey)throw Error("Cannot sign message, no public key present");const e=await Kl(t.privateKey);return{type:Gb.Signing,author:t,key:t.publicKey,privateKey:e}}case ln:return{type:Gb.Anonymous};default:throw new Error(`Unknown signature policy "${e}"`)}}(this.globalSignaturePolicy,this.components.peerId),this.outboundInflightQueue=pr({objectMode:!0}),gr(this.outboundInflightQueue,(async e=>{for await(const{peerId:t,connection:n}of e)await this.createOutboundStream(t,n)})).catch((e=>{this.log.error("outbound inflight queue error",e)})),await Promise.all(this.opts.directPeers.map((async e=>{await this.components.peerStore.merge(e.id,{multiaddrs:e.addrs})})));const e=this.components.registrar;await Promise.all(this.multicodecs.map((async t=>e.handle(t,this.onIncomingStream.bind(this),{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnTransientConnection:this.runOnTransientConnection}))));const t={onConnect:this.onPeerConnected.bind(this),onDisconnect:this.onPeerDisconnected.bind(this),notifyOnTransient:this.runOnTransientConnection},n=await Promise.all(this.multicodecs.map((async n=>e.register(n,t)))),r=setTimeout(this.runHeartbeat,100);this.status={code:Nv.started,registrarTopologyIds:n,heartbeatTimeout:r,hearbeatStartMs:Date.now()+100},this.score.start(),this.directPeerInitial=setTimeout((()=>{Promise.resolve().then((async()=>{await Promise.all(Array.from(this.direct).map((async e=>this.connect(e))))})).catch((e=>{this.log(e)}))}),1e3),this.opts.tagMeshPeers&&(this.addEventListener("gossipsub:graft",this.tagMeshPeer),this.addEventListener("gossipsub:prune",this.untagMeshPeer)),this.log("started")}async stop(){if(this.log("stopping"),this.status.code!==Nv.started)return;const{registrarTopologyIds:e}=this.status;this.status={code:Nv.stopped},this.opts.tagMeshPeers&&(this.removeEventListener("gossipsub:graft",this.tagMeshPeer),this.removeEventListener("gossipsub:prune",this.untagMeshPeer));const t=this.components.registrar;await Promise.all(this.multicodecs.map((async e=>t.unhandle(e)))),e.forEach((e=>{t.unregister(e)})),this.outboundInflightQueue.end();const n=[];for(const e of this.streamsOutbound.values())n.push(e.close());this.streamsOutbound.clear();for(const e of this.streamsInbound.values())n.push(e.close());this.streamsInbound.clear(),await Promise.all(n),this.peers.clear(),this.subscriptions.clear(),null!=this.heartbeatTimer&&(this.heartbeatTimer.cancel(),this.heartbeatTimer=null),this.score.stop(),this.mesh.clear(),this.fanout.clear(),this.fanoutLastpub.clear(),this.gossip.clear(),this.control.clear(),this.peerhave.clear(),this.iasked.clear(),this.backoff.clear(),this.outbound.clear(),this.gossipTracer.clear(),this.seenCache.clear(),null!=this.fastMsgIdCache&&this.fastMsgIdCache.clear(),null!=this.directPeerInitial&&clearTimeout(this.directPeerInitial),this.log("stopped")}dumpPeerScoreStats(){return this.score.dumpPeerScoreStats()}onIncomingStream({stream:e,connection:t}){if(!this.isStarted())return;const n=t.remotePeer;this.addPeer(n,t.direction,t.remoteAddr),this.createInboundStream(n,e),this.outboundInflightQueue.push({peerId:n,connection:t})}onPeerConnected(e,t){this.metrics?.newConnectionCount.inc({status:t.status}),this.isStarted()&&"open"===t.status&&(this.addPeer(e,t.direction,t.remoteAddr),this.outboundInflightQueue.push({peerId:e,connection:t}))}onPeerDisconnected(e){this.log("connection ended %p",e),this.removePeer(e)}async createOutboundStream(e,t){if(!this.isStarted())return;const n=e.toString();if(this.peers.has(n)&&!this.streamsOutbound.has(n))try{const r=new Sv(await t.newStream(this.multicodecs,{runOnTransientConnection:this.runOnTransientConnection}),(e=>{this.log.error("outbound pipe error",e)}),{maxBufferSize:this.opts.maxOutboundBufferSize});this.log("create outbound stream %p",e),this.streamsOutbound.set(n,r);const s=r.protocol;s===Kb&&this.floodsubPeers.add(n),this.metrics?.peersPerProtocol.inc({protocol:s},1),this.subscriptions.size>0&&(this.log("send subscriptions to",n),this.sendSubscriptions(n,Array.from(this.subscriptions),!0))}catch(e){this.log.error("createOutboundStream error",e)}}createInboundStream(e,t){if(!this.isStarted())return;const n=e.toString();if(!this.peers.has(n))return;const r=this.streamsInbound.get(n);void 0!==r&&(this.log("replacing existing inbound steam %s",n),r.close().catch((e=>{this.log.error(e)}))),this.log("create inbound stream %s",n);const s=new _v(t,{maxDataLength:this.opts.maxInboundDataLength});this.streamsInbound.set(n,s),this.pipePeerReadStream(e,s.source).catch((e=>{this.log(e)}))}addPeer(e,t,n){const r=e.toString();if(!this.peers.has(r)){this.log("new peer %p",e),this.peers.add(r),this.score.addPeer(r);const s=function(e){for(const t of e.tuples())switch(t[0]){case xv.ip4:case xv.ip6:return Vn(t[0],t[1])}return null}(n);null!==s?this.score.addIP(r,s):this.log("Added peer has no IP in current address %s %s",r,n.toString()),this.outbound.has(r)||this.outbound.set(r,"outbound"===t)}}removePeer(e){const t=e.toString();if(!this.peers.has(t))return;this.log("delete peer %p",e),this.peers.delete(t);const n=this.streamsOutbound.get(t),r=this.streamsInbound.get(t);null!=n&&this.metrics?.peersPerProtocol.inc({protocol:n.protocol},-1),n?.close().catch((e=>{this.log.error(e)})),r?.close().catch((e=>{this.log.error(e)})),this.streamsOutbound.delete(t),this.streamsInbound.delete(t);for(const e of this.topics.values())e.delete(t);for(const[e,n]of this.mesh)n.delete(t)&&this.metrics?.onRemoveFromMesh(e,ev.Dc,1);for(const e of this.fanout.values())e.delete(t);this.floodsubPeers.delete(t),this.gossip.delete(t),this.control.delete(t),this.outbound.delete(t),this.score.removePeer(t),this.acceptFromWhitelist.delete(t)}get started(){return this.status.code===Nv.started}getMeshPeers(e){const t=this.mesh.get(e);return null!=t?Array.from(t):[]}getSubscribers(e){const t=this.topics.get(e);return(null!=t?Array.from(t):[]).map((e=>Ss(e)))}getTopics(){return Array.from(this.subscriptions)}async pipePeerReadStream(e,t){try{await gr(t,(async t=>{for await(const n of t)try{const t=n.subarray(),r=Wb.decode(t,{limits:{subscriptions:this.decodeRpcLimits.maxSubscriptions,messages:this.decodeRpcLimits.maxMessages,control$:{ihave:this.decodeRpcLimits.maxIhaveMessageIDs,iwant:this.decodeRpcLimits.maxIwantMessageIDs,graft:this.decodeRpcLimits.maxControlMessages,prune:this.decodeRpcLimits.maxControlMessages,prune$:{peers:this.decodeRpcLimits.maxPeerInfos}}}});if(this.metrics?.onRpcRecv(r,t.length),this.opts.awaitRpcHandler)try{await this.handleReceivedRpc(e,r)}catch(e){this.metrics?.onRpcRecvError(),this.log(e)}else this.handleReceivedRpc(e,r).catch((e=>{this.metrics?.onRpcRecvError(),this.log(e)}))}catch(e){this.metrics?.onRpcDataError(),this.log(e)}}))}catch(t){this.metrics?.onPeerReadStreamError(),this.handlePeerReadStreamError(t,e)}}handlePeerReadStreamError(e,t){this.log.error(e),this.onPeerDisconnected(t)}async handleReceivedRpc(e,t){if(!this.acceptFrom(e.toString()))return this.log("received message from unacceptable peer %p",e),void this.metrics?.rpcRecvNotAccepted.inc();const n=null!=t.subscriptions?t.subscriptions.length:0,r=null!=t.messages?t.messages.length:0;let s=0,i=0,o=0,a=0;if(null!=t.control&&(null!=t.control.ihave&&(s=t.control.ihave.length),null!=t.control.iwant&&(i=t.control.iwant.length),null!=t.control.graft&&(o=t.control.graft.length),null!=t.control.prune&&(a=t.control.prune.length)),this.log(`rpc.from ${e.toString()} subscriptions ${n} messages ${r} ihave ${s} iwant ${i} graft ${o} prune ${a}`),null!=t.subscriptions&&t.subscriptions.length>0){const n=[];t.subscriptions.forEach((t=>{const r=t.topic,s=!0===t.subscribe;if(null!=r){if(null!=this.allowedTopics&&!this.allowedTopics.has(r))return;this.handleReceivedSubscription(e,r,s),n.push({topic:r,subscribe:s})}})),this.safeDispatchEvent("subscription-change",{detail:{peerId:e,subscriptions:n}})}for(const n of t.messages){if(null!=this.allowedTopics&&!this.allowedTopics.has(n.topic))continue;const t=this.handleReceivedMessage(e,n).catch((e=>{this.metrics?.onMsgRecvError(n.topic),this.log(e)}));this.opts.awaitRpcMessageHandler&&await t}null!=t.control&&await this.handleControlMessage(e.toString(),t.control)}handleReceivedSubscription(e,t,n){this.log("subscription update from %p topic %s",e,t);let r=this.topics.get(t);null==r&&(r=new Set,this.topics.set(t,r)),n?r.add(e.toString()):r.delete(e.toString())}async handleReceivedMessage(e,t){this.metrics?.onMsgRecvPreValidation(t.topic);const n=await this.validateReceivedMessage(e,t);this.metrics?.onPrevalidationResult(t.topic,n.code);const r=n.code;switch(r){case Zb.duplicate:return this.score.duplicateMessage(e.toString(),n.msgIdStr,t.topic),this.gossipTracer.deliverMessage(n.msgIdStr,!0),void this.mcache.observeDuplicate(n.msgIdStr,e.toString());case Zb.invalid:if(null!=n.msgIdStr){const r=n.msgIdStr;this.score.rejectMessage(e.toString(),r,t.topic,n.reason),this.gossipTracer.rejectMessage(r,n.reason)}else this.score.rejectInvalidMessage(e.toString(),t.topic);return void this.metrics?.onMsgRecvInvalid(t.topic,n);case Zb.valid:if(this.score.validateMessage(n.messageId.msgIdStr),this.gossipTracer.deliverMessage(n.messageId.msgIdStr),this.mcache.put(n.messageId,t,!this.opts.asyncValidation),this.subscriptions.has(t.topic)){this.components.peerId.equals(e)&&!this.opts.emitSelf||(super.dispatchEvent(new vn("gossipsub:message",{detail:{propagationSource:e,msgId:n.messageId.msgIdStr,msg:n.msg}})),super.dispatchEvent(new vn("message",{detail:n.msg})))}this.opts.asyncValidation||this.forwardMessage(n.messageId.msgIdStr,t,e.toString());break;default:throw new Error(`Invalid validation result: ${r}`)}}async validateReceivedMessage(e,t){const n=this.fastMsgIdFn?.(t),r=void 0!==n?this.fastMsgIdCache?.get(n):void 0;if(null!=r)return{code:Zb.duplicate,msgIdStr:r};const s=await async function(e,t){switch(e){case ln:return null!=t.signature?{valid:!1,error:Qb.SignaturePresent}:null!=t.seqno?{valid:!1,error:Qb.SeqnoPresent}:null!=t.key?{valid:!1,error:Qb.FromPresent}:{valid:!0,message:{type:"unsigned",topic:t.topic,data:t.data??new Uint8Array(0)}};case cn:{if(null==t.seqno)return{valid:!1,error:Qb.InvalidSeqno};if(8!==t.seqno.length)return{valid:!1,error:Qb.InvalidSeqno};if(null==t.signature)return{valid:!1,error:Qb.InvalidSignature};if(null==t.from)return{valid:!1,error:Qb.InvalidPeerId};let e,n;try{e=_s(t.from)}catch(e){return{valid:!1,error:Qb.InvalidPeerId}}if(null!=t.key){if(n=Fl(t.key),void 0!==e.publicKey&&!In(n.bytes,e.publicKey))return{valid:!1,error:Qb.InvalidPeerId}}else{if(null==e.publicKey)return{valid:!1,error:Qb.InvalidPeerId};n=Fl(e.publicKey)}const r={from:t.from,data:t.data,seqno:t.seqno,topic:t.topic,signature:void 0,key:void 0},s=Rn([Rv,Wb.Message.encode(r)]);return await n.verify(s,t.signature)?{valid:!0,message:{type:"signed",from:e,data:t.data??new Uint8Array(0),sequenceNumber:BigInt(`0x${Qt(t.seqno,"base16")}`),topic:t.topic,signature:t.signature,key:t.key??Vl(n)}}:{valid:!1,error:Qb.InvalidSignature}}default:throw new Error("Unreachable")}}(this.globalSignaturePolicy,t);if(!s.valid)return{code:Zb.invalid,reason:Yb.Error,error:s.error};const i=s.message;try{null!=this.dataTransform&&(i.data=this.dataTransform.inboundTransform(t.topic,i.data))}catch(e){return this.log("Invalid message, transform failed",e),{code:Zb.invalid,reason:Yb.Error,error:Qb.TransformFailed}}const o=await this.msgIdFn(i),a=this.msgIdToStrFn(o),c={msgId:o,msgIdStr:a};if(void 0!==n&&null!=this.fastMsgIdCache){this.fastMsgIdCache.put(n,a)&&this.metrics?.fastMsgIdCacheCollision.inc()}if(this.seenCache.has(a))return{code:Zb.duplicate,msgIdStr:a};this.seenCache.put(a);const l=this.topicValidators.get(t.topic);if(null!=l){let t;try{t=await l(e,i)}catch(e){const n=e.code;"ERR_TOPIC_VALIDATOR_IGNORE"===n&&(t=un.Ignore),t="ERR_TOPIC_VALIDATOR_REJECT"===n?un.Reject:un.Ignore}if(t!==un.Accept)return{code:Zb.invalid,reason:iv(t),msgIdStr:a}}return{code:Zb.valid,messageId:c,msg:i}}getScore(e){return this.score.score(e)}sendSubscriptions(e,t,n){this.sendRpc(e,{subscriptions:t.map((e=>({topic:e,subscribe:n}))),messages:[]})}async handleControlMessage(e,t){if(void 0===t)return;const n=null!=t.ihave?this.handleIHave(e,t.ihave):[],r=null!=t.iwant?this.handleIWant(e,t.iwant):[],s=null!=t.graft?await this.handleGraft(e,t.graft):[];if(null!=t.prune&&await this.handlePrune(e,t.prune),0===n.length&&0===r.length&&0===s.length)return;const i=this.sendRpc(e,Av(r,{iwant:n,prune:s})),o=n[0]?.messageIDs;null!=o&&(i?this.gossipTracer.addPromise(e,o):this.metrics?.iwantPromiseUntracked.inc(1))}acceptFrom(e){if(this.direct.has(e))return!0;const t=Date.now(),n=this.acceptFromWhitelist.get(e);if(null!=n&&n.messagesAccepted<128&&n.acceptUntil>=t)return n.messagesAccepted+=1,!0;const r=this.score.score(e);return r>=0?this.acceptFromWhitelist.set(e,{messagesAccepted:0,acceptUntil:t+1e3}):this.acceptFromWhitelist.delete(e),r>=this.opts.scoreThresholds.graylistThreshold}handleIHave(e,t){if(0===t.length)return[];const n=this.score.score(e);if(n<this.opts.scoreThresholds.gossipThreshold)return this.log("IHAVE: ignoring peer %s with score below threshold [ score = %d ]",e,n),this.metrics?.ihaveRcvIgnored.inc({reason:nv.LowScore}),[];const r=(this.peerhave.get(e)??0)+1;if(this.peerhave.set(e,r),r>10)return this.log("IHAVE: peer %s has advertised too many times (%d) within this heartbeat interval; ignoring",e,r),this.metrics?.ihaveRcvIgnored.inc({reason:nv.MaxIhave}),[];const s=this.iasked.get(e)??0;if(s>=Hb)return this.log("IHAVE: peer %s has already advertised too many messages (%d); ignoring",e,s),this.metrics?.ihaveRcvIgnored.inc({reason:nv.MaxIasked}),[];const i=new Map;if(t.forEach((({topicID:e,messageIDs:t})=>{if(null==e||null==t||!this.mesh.has(e))return;let n=0;t.forEach((e=>{const t=this.msgIdToStrFn(e);this.seenCache.has(t)||(i.set(t,e),n++)})),this.metrics?.onIhaveRcv(e,t.length,n)})),0===i.size)return[];let o=i.size;o+s>Hb&&(o=Hb-s),this.log("IHAVE: Asking for %d out of %d messages from %s",o,i.size,e);let a=Array.from(i.values());return Dv(a),a=a.slice(0,o),this.iasked.set(e,s+o),[{messageIDs:a}]}handleIWant(e,t){if(0===t.length)return[];const n=this.score.score(e);if(n<this.opts.scoreThresholds.gossipThreshold)return this.log("IWANT: ignoring peer %s with score below threshold [score = %d]",e,n),[];const r=new Map,s=new Map;let i=0;return t.forEach((({messageIDs:t})=>{t?.forEach((t=>{const n=this.msgIdToStrFn(t),o=this.mcache.getWithIWantCount(n,e);null!=o?(s.set(o.msg.topic,1+(s.get(o.msg.topic)??0)),o.count>3?this.log("IWANT: Peer %s has asked for message %s too many times: ignoring request",e,t):r.set(n,o.msg)):i++}))})),this.metrics?.onIwantRcv(s,i),0===r.size?(this.log("IWANT: Could not provide any wanted messages to %s",e),[]):(this.log("IWANT: Sending %d messages to %s",r.size,e),Array.from(r.values()))}async handleGraft(e,t){const n=[],r=this.score.score(e),s=Date.now();let i=this.opts.doPX;if(t.forEach((({topicID:t})=>{if(null==t)return;const o=this.mesh.get(t);if(null==o)return void(i=!1);if(o.has(e))return;const a=this.backoff.get(t)?.get(e);if(this.direct.has(e))this.log("GRAFT: ignoring request from direct peer %s",e),n.push(t),i=!1;else if("number"==typeof a&&s<a){this.log("GRAFT: ignoring backed off peer %s",e),this.score.addPenalty(e,1,tv.GraftBackoff),i=!1;const r=a+this.opts.graftFloodThreshold-this.opts.pruneBackoff;s<r&&this.score.addPenalty(e,1,tv.GraftBackoff),this.addBackoff(e,t),n.push(t)}else r<0?(this.log("GRAFT: ignoring peer %s with negative score: score=%d, topic=%s",e,r,t),n.push(t),i=!1,this.addBackoff(e,t)):o.size>=this.opts.Dhi&&!this.outbound.get(e)?(n.push(t),this.addBackoff(e,t)):(this.log("GRAFT: Add mesh link from %s in %s",e,t),this.score.graft(e,t),o.add(e),this.metrics?.onAddToMesh(t,Xb.Subscribed,1));this.safeDispatchEvent("gossipsub:graft",{detail:{peerId:e,topic:t,direction:"inbound"}})})),0===n.length)return[];return Promise.all(n.map((async t=>this.makePrune(e,t,i,false))))}async handlePrune(e,t){const n=this.score.score(e);for(const{topicID:r,backoff:s,peers:i}of t){if(null==r)continue;const t=this.mesh.get(r);if(null==t)return;this.log("PRUNE: Remove mesh link to %s in %s",e,r),this.score.prune(e,r),t.has(e)&&(t.delete(e),this.metrics?.onRemoveFromMesh(r,ev.Prune,1)),"number"==typeof s&&s>0?this.doAddBackoff(e,r,1e3*s):this.addBackoff(e,r),null!=i&&i.length>0&&(n<this.opts.scoreThresholds.acceptPXThreshold?this.log("PRUNE: ignoring PX from peer %s with insufficient score [score = %d, topic = %s]",e,n,r):await this.pxConnect(i)),this.safeDispatchEvent("gossipsub:prune",{detail:{peerId:e,topic:r,direction:"inbound"}})}}addBackoff(e,t){this.doAddBackoff(e,t,this.opts.pruneBackoff)}doAddBackoff(e,t,n){let r=this.backoff.get(t);null==r&&(r=new Map,this.backoff.set(t,r));const s=Date.now()+n;(r.get(e)??0)<s&&r.set(e,s)}applyIwantPenalties(){this.gossipTracer.getBrokenPromises().forEach(((e,t)=>{this.log("peer %s didn't follow up in %d IWANT requests; adding penalty",t,e),this.score.addPenalty(t,e,tv.BrokenPromise)}))}clearBackoff(){if(this.heartbeatTicks%15!=0)return;const e=Date.now();this.backoff.forEach(((t,n)=>{t.forEach(((n,r)=>{n+1*this.opts.heartbeatInterval<e&&t.delete(r)})),0===t.size&&this.backoff.delete(n)}))}async directConnect(){const e=[];this.direct.forEach((t=>{this.streamsOutbound.has(t)||e.push(t)})),await Promise.all(e.map((async e=>this.connect(e))))}async pxConnect(e){e.length>this.opts.prunePeers&&(Dv(e),e=e.slice(0,this.opts.prunePeers));const t=[];await Promise.all(e.map((async e=>{if(null==e.peerID)return;const n=_s(e.peerID),r=n.toString();if(!this.peers.has(r))if(null!=e.signedPeerRecord)try{if(!await this.components.peerStore.consumePeerRecord(e.signedPeerRecord,n))return void this.log("bogus peer record obtained through px: could not add peer record to address book");t.push(r)}catch(e){this.log("bogus peer record obtained through px: invalid signature or not a peer record")}else t.push(r)}))),0!==t.length&&await Promise.all(t.map((async e=>this.connect(e))))}async connect(e){this.log("Initiating connection with %s",e);const t=Ss(e),n=await this.components.connectionManager.openConnection(t);for(const e of this.multicodecs)for(const r of this.components.registrar.getTopologies(e))r.onConnect?.(t,n)}subscribe(e){if(this.status.code!==Nv.started)throw new Error("Pubsub has not started");if(!this.subscriptions.has(e)){this.subscriptions.add(e);for(const t of this.peers.keys())this.sendSubscriptions(t,[e],!0)}this.join(e)}unsubscribe(e){if(this.status.code!==Nv.started)throw new Error("Pubsub is not started");const t=this.subscriptions.delete(e);if(this.log("unsubscribe from %s - am subscribed %s",e,t),t)for(const t of this.peers.keys())this.sendSubscriptions(t,[e],!1);this.leave(e)}join(e){if(this.status.code!==Nv.started)throw new Error("Gossipsub has not started");if(this.mesh.has(e))return;this.log("JOIN %s",e),this.metrics?.onJoin(e);const t=new Set,n=this.backoff.get(e),r=this.fanout.get(e);if(null!=r&&(this.fanout.delete(e),this.fanoutLastpub.delete(e),r.forEach((e=>{this.direct.has(e)||!(this.score.score(e)>=0)||null!=n&&n.has(e)||t.add(e)})),this.metrics?.onAddToMesh(e,Xb.Fanout,t.size)),t.size<this.opts.D){const r=t.size;this.getRandomGossipPeers(e,this.opts.D,(e=>!t.has(e)&&!this.direct.has(e)&&this.score.score(e)>=0&&(null==n||!n.has(e)))).forEach((e=>{t.add(e)})),this.metrics?.onAddToMesh(e,Xb.Random,t.size-r)}this.mesh.set(e,t),t.forEach((t=>{this.log("JOIN: Add mesh link to %s in %s",t,e),this.sendGraft(t,e)}))}leave(e){if(this.status.code!==Nv.started)throw new Error("Gossipsub has not started");this.log("LEAVE %s",e),this.metrics?.onLeave(e);const t=this.mesh.get(e);null!=t&&(Promise.all(Array.from(t).map((async t=>{this.log("LEAVE: Remove mesh link to %s in %s",t,e),await this.sendPrune(t,e)}))).catch((e=>{this.log("Error sending prunes to mesh peers",e)})),this.mesh.delete(e))}selectPeersToForward(e,t,n){const r=new Set,s=this.topics.get(e);null!=s&&(this.direct.forEach((e=>{s.has(e)&&t!==e&&!n?.has(e)&&r.add(e)})),this.floodsubPeers.forEach((e=>{s.has(e)&&t!==e&&!n?.has(e)&&this.score.score(e)>=this.opts.scoreThresholds.publishThreshold&&r.add(e)})));const i=this.mesh.get(e);return null!=i&&i.size>0&&i.forEach((e=>{t===e||n?.has(e)||r.add(e)})),r}selectPeersToPublish(e){const t=new Set,n={direct:0,floodsub:0,mesh:0,fanout:0},r=this.topics.get(e);if(null!=r)if(this.opts.floodPublish)r.forEach((e=>{this.direct.has(e)?(t.add(e),n.direct++):this.score.score(e)>=this.opts.scoreThresholds.publishThreshold&&(t.add(e),n.floodsub++)}));else{this.direct.forEach((e=>{r.has(e)&&(t.add(e),n.direct++)})),this.floodsubPeers.forEach((e=>{r.has(e)&&this.score.score(e)>=this.opts.scoreThresholds.publishThreshold&&(t.add(e),n.floodsub++)}));const s=this.mesh.get(e);if(null!=s&&s.size>0)s.forEach((e=>{t.add(e),n.mesh++}));else{const r=this.fanout.get(e);if(null!=r&&r.size>0)r.forEach((e=>{t.add(e),n.fanout++}));else{const r=this.getRandomGossipPeers(e,this.opts.D,(e=>this.score.score(e)>=this.opts.scoreThresholds.publishThreshold));r.size>0&&(this.fanout.set(e,r),r.forEach((e=>{t.add(e),n.fanout++})))}this.fanoutLastpub.set(e,Date.now())}}return{tosend:t,tosendCount:n}}forwardMessage(e,t,n,r){null!=n&&this.score.deliverMessage(n,e,t.topic);const s=this.selectPeersToForward(t.topic,n,r);s.forEach((e=>{this.sendRpc(e,Av([t]))})),this.metrics?.onForwardMsg(t.topic,s.size)}async publish(e,t,n){const r=Date.now(),s=null!=this.dataTransform?this.dataTransform.outboundTransform(e,t):t;if(null==this.publishConfig)throw Error("PublishError.Uninitialized");const{raw:i,msg:o}=await async function(e,t,n,r){switch(e.type){case Gb.Signing:{const s={from:e.author.toBytes(),data:r,seqno:Mo(8),topic:t,signature:void 0,key:void 0},i=Rn([Rv,Wb.Message.encode(s)]);return s.signature=await e.privateKey.sign(i),s.key=e.key,{raw:s,msg:{type:"signed",from:e.author,data:n,sequenceNumber:BigInt(`0x${Qt(s.seqno,"base16")}`),topic:t,signature:s.signature,key:s.key}}}case Gb.Anonymous:return{raw:{from:void 0,data:r,seqno:void 0,topic:t,signature:void 0,key:void 0},msg:{type:"unsigned",data:n,topic:t}};default:throw new Error("Unreachable")}}(this.publishConfig,e,t,s),a=await this.msgIdFn(o),c=this.msgIdToStrFn(a),l=n?.ignoreDuplicatePublishError??this.opts.ignoreDuplicatePublishError;if(this.seenCache.has(c)){if(l)return this.metrics?.onPublishDuplicateMsg(e),{recipients:[]};throw Error("PublishError.Duplicate")}const{tosend:u,tosendCount:h}=this.selectPeersToPublish(e),d=this.opts.emitSelf&&this.subscriptions.has(e),p=n?.allowPublishToZeroTopicPeers??this.opts.allowPublishToZeroTopicPeers;if(0===u.size&&!p&&!d)throw Error("PublishError.NoPeersSubscribedToTopic");this.seenCache.put(c),this.mcache.put({msgId:a,msgIdStr:c},i,!0),this.publishedMessageIds.put(c);const f=n?.batchPublish??this.opts.batchPublish,g=Av([i]);if(f)this.sendRpcInBatch(u,g);else for(const e of u){this.sendRpc(e,g)||u.delete(e)}const m=Date.now()-r;return this.metrics?.onPublishMsg(e,h,u.size,null!=i.data?i.data.length:0,m),d&&(u.add(this.components.peerId.toString()),super.dispatchEvent(new vn("gossipsub:message",{detail:{propagationSource:this.components.peerId,msgId:c,msg:o}})),super.dispatchEvent(new vn("message",{detail:o}))),{recipients:Array.from(u.values()).map((e=>Ss(e)))}}sendRpcInBatch(e,t){const n=Wb.encode(t),r=Or.single(n);for(const s of e){const i=this.streamsOutbound.get(s);if(null!=i){try{i.pushPrefixed(r)}catch(t){e.delete(s),this.log.error(`Cannot send rpc to ${s}`,t)}this.metrics?.onRpcSent(t,n.length)}else this.log(`Cannot send RPC to ${s} as there is no open stream to it available`),e.delete(s)}}reportMessageValidationResult(e,t,n){let r;if(n===un.Accept){if(r=this.mcache.validate(e),null!=r){const{message:n,originatingPeers:s}=r;this.score.deliverMessage(t,e,n.topic),this.forwardMessage(e,r.message,t,s)}}else if(r=this.mcache.remove(e),null!=r){const s=iv(n),{message:i,originatingPeers:o}=r;this.score.rejectMessage(t,e,i.topic,s);for(const t of o)this.score.rejectMessage(t,e,i.topic,s)}const s=this.score.messageFirstSeenTimestampMs(e);this.metrics?.onReportValidation(r,n,s)}sendGraft(e,t){const n=Av([],{graft:[{topicID:t}]});this.sendRpc(e,n)}async sendPrune(e,t){const n=Av([],{prune:[await this.makePrune(e,t,this.opts.doPX,!0)]});this.sendRpc(e,n)}sendRpc(e,t){const n=this.streamsOutbound.get(e);if(null==n)return this.log(`Cannot send RPC to ${e} as there is no open stream to it available`),!1;const r=this.control.get(e);null!=r&&(this.piggybackControl(e,t,r),this.control.delete(e));const s=this.gossip.get(e);null!=s&&(this.piggybackGossip(e,t,s),this.gossip.delete(e));const i=Wb.encode(t);try{n.push(i)}catch(t){return this.log.error(`Cannot send rpc to ${e}`,t),null!=r&&this.control.set(e,r),null!=s&&this.gossip.set(e,s),!1}if(this.metrics?.onRpcSent(t,i.length),null!=t.control?.graft)for(const n of t.control?.graft)null!=n.topicID&&this.safeDispatchEvent("gossipsub:graft",{detail:{peerId:e,topic:n.topicID,direction:"outbound"}});if(null!=t.control?.prune)for(const n of t.control?.prune)null!=n.topicID&&this.safeDispatchEvent("gossipsub:prune",{detail:{peerId:e,topic:n.topicID,direction:"outbound"}});return!0}piggybackControl(e,t,n){const r=Tv(t);for(const t of n.graft)null!=t.topicID&&this.mesh.get(t.topicID)?.has(e)&&r.control.graft.push(t);for(const t of n.prune)null==t.topicID||this.mesh.get(t.topicID)?.has(e)||r.control.prune.push(t)}piggybackGossip(e,t,n){Tv(t).control.ihave=n}async sendGraftPrune(e,t,n){const r=this.opts.doPX,s=!1;for(const[i,o]of e){const e=o.map((e=>({topicID:e})));let a=[];const c=t.get(i);null!=c&&(a=await Promise.all(c.map((async e=>this.makePrune(i,e,r&&!n.get(i),s)))),t.delete(i)),this.sendRpc(i,Av([],{graft:e,prune:a}))}for(const[e,i]of t){const t=await Promise.all(i.map((async t=>this.makePrune(e,t,r&&!n.get(e),s))));this.sendRpc(e,Av([],{prune:t}))}}emitGossip(e){const t=this.mcache.getGossipIDs(new Set(e.keys()));for(const[n,r]of e)this.doEmitGossip(n,r,t.get(n)??[])}doEmitGossip(e,t,n){if(0===n.length)return;if(Dv(n),n.length>Hb&&this.log("too many messages for gossip; will truncate IHAVE list (%d messages)",n.length),0===t.size)return;let r=this.opts.Dlazy;const s=.25*t.size;let i=t;s>r&&(r=s),r>i.size?r=i.size:i=Dv(Array.from(i)).slice(0,r),i.forEach((t=>{let r=n;n.length>Hb&&(r=Dv(r.slice()).slice(0,Hb)),this.pushGossip(t,{topicID:e,messageIDs:r})}))}flush(){for(const[e,t]of this.gossip.entries())this.gossip.delete(e),this.sendRpc(e,Av([],{ihave:t}));for(const[e,t]of this.control.entries()){this.control.delete(e);const n=Av([],{graft:t.graft,prune:t.prune});this.sendRpc(e,n)}}pushGossip(e,t){this.log("Add gossip to %s",e);const n=this.gossip.get(e)??[];this.gossip.set(e,n.concat(t))}async makePrune(e,t,n,r){if(this.score.prune(e,t),this.streamsOutbound.get(e)?.protocol===$b)return{topicID:t,peers:[]};const s=r?this.opts.unsubcribeBackoff:this.opts.pruneBackoff,i=s/1e3;if(this.doAddBackoff(e,t,s),!n)return{topicID:t,peers:[],backoff:i};const o=this.getRandomGossipPeers(t,this.opts.prunePeers,(t=>t!==e&&this.score.score(t)>=0)),a=await Promise.all(Array.from(o).map((async e=>{const t=Ss(e);let n;try{n=await this.components.peerStore.get(t)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}return{peerID:t.toBytes(),signedPeerRecord:n?.peerRecordEnvelope}})));return{topicID:t,peers:a,backoff:i}}runHeartbeat=()=>{const e=this.metrics?.heartbeatDuration.startTimer();this.heartbeat().catch((e=>{this.log("Error running heartbeat",e)})).finally((()=>{if(null!=e&&e(),this.status.code===Nv.started){clearTimeout(this.status.heartbeatTimeout);let e=this.opts.heartbeatInterval-(Date.now()-this.status.hearbeatStartMs)%this.opts.heartbeatInterval;e<.25*this.opts.heartbeatInterval&&(e+=this.opts.heartbeatInterval,this.metrics?.heartbeatSkipped.inc()),this.status.heartbeatTimeout=setTimeout(this.runHeartbeat,e)}}))};async heartbeat(){const{D:e,Dlo:t,Dhi:n,Dscore:r,Dout:s,fanoutTTL:i}=this.opts;this.heartbeatTicks++;const o=new Map,a=e=>{let t=o.get(e);return void 0===t&&(t=this.score.score(e),o.set(e,t)),t},c=new Map,l=new Map,u=new Map;this.clearBackoff(),this.peerhave.clear(),this.metrics?.cacheSize.set({cache:"iasked"},this.iasked.size),this.iasked.clear(),this.applyIwantPenalties(),this.heartbeatTicks%this.opts.directConnectTicks==0&&await this.directConnect(),this.fastMsgIdCache?.prune(),this.seenCache.prune(),this.gossipTracer.prune(),this.publishedMessageIds.prune();const h=new Map;this.mesh.forEach(((i,o)=>{const d=this.topics.get(o),p=new Set,f=new Set;if(h.set(o,f),null!=d){const e=Dv(Array.from(d)),t=this.backoff.get(o);for(const n of e){const e=this.streamsOutbound.get(n);if(null!=e&&this.multicodecs.includes(e.protocol)&&!i.has(n)&&!this.direct.has(n)){const e=a(n);(null==t||!t.has(n))&&e>=0&&p.add(n),e>=this.opts.scoreThresholds.gossipThreshold&&f.add(n)}}}const g=(e,t)=>{this.log("HEARTBEAT: Remove mesh link to %s in %s",e,o),this.addBackoff(e,o),i.delete(e),a(e)>=this.opts.scoreThresholds.gossipThreshold&&f.add(e),this.metrics?.onRemoveFromMesh(o,t,1);const n=l.get(e);null==n?l.set(e,[o]):n.push(o)},m=(e,t)=>{this.log("HEARTBEAT: Add mesh link to %s in %s",e,o),this.score.graft(e,o),i.add(e),f.delete(e),this.metrics?.onAddToMesh(o,t,1);const n=c.get(e);null==n?c.set(e,[o]):n.push(o)};if(i.forEach((e=>{const t=a(e);t<0&&(this.log("HEARTBEAT: Prune peer %s with negative score: score=%d, topic=%s",e,t,o),g(e,ev.BadScore),u.set(e,!0))})),i.size<t){const t=function(e,t){return pv(e,t,(()=>!0))}(p,e-i.size);t.forEach((e=>{m(e,Xb.NotEnough)}))}if(i.size>n){let t=Array.from(i);t.sort(((e,t)=>a(t)-a(e))),t=t.slice(0,r).concat(Dv(t.slice(r)));let n=0;if(t.slice(0,e).forEach((e=>{this.outbound.get(e)&&n++})),n<s){const r=e=>{const n=t[e];for(let n=e;n>0;n--)t[n]=t[n-1];t[0]=n};if(n>0){let s=n;for(let n=1;n<e&&s>0;n++)this.outbound.get(t[n])&&(r(n),s--)}let s=e-n;for(let n=e;n<t.length&&s>0;n++)this.outbound.get(t[n])&&(r(n),s--)}t.slice(e).forEach((e=>{g(e,ev.Excess)}))}if(i.size>=t){let e=0;if(i.forEach((t=>{this.outbound.get(t)&&e++})),e<s){pv(p,s-e,(e=>!0===this.outbound.get(e))).forEach((e=>{m(e,Xb.Outbound)}))}}if(this.heartbeatTicks%this.opts.opportunisticGraftTicks==0&&i.size>1){const e=Array.from(i).sort(((e,t)=>a(e)-a(t))),t=Math.floor(i.size/2),n=a(e[t]);if(n<this.opts.scoreThresholds.opportunisticGraftThreshold){const e=pv(p,this.opts.opportunisticGraftPeers,(e=>a(e)>n));for(const t of e)this.log("HEARTBEAT: Opportunistically graft peer %s on topic %s",t,o),m(t,Xb.Opportunistic)}}}));const d=Date.now();this.fanoutLastpub.forEach(((e,t)=>{e+i<d&&(this.fanout.delete(t),this.fanoutLastpub.delete(t))})),this.fanout.forEach(((t,n)=>{const r=this.topics.get(n);t.forEach((e=>{(!r?.has(e)||a(e)<this.opts.scoreThresholds.publishThreshold)&&t.delete(e)}));const s=this.topics.get(n),i=[],o=new Set;if(h.set(n,o),null!=s){const e=Dv(Array.from(s));for(const n of e){const e=this.streamsOutbound.get(n);if(null!=e&&this.multicodecs.includes(e.protocol)&&!t.has(n)&&!this.direct.has(n)){const e=a(n);e>=this.opts.scoreThresholds.publishThreshold&&i.push(n),e>=this.opts.scoreThresholds.gossipThreshold&&o.add(n)}}}if(t.size<e){const n=e-t.size;i.slice(0,n).forEach((e=>{t.add(e),o?.delete(e)}))}})),this.emitGossip(h),await this.sendGraftPrune(c,l,u),this.flush(),this.mcache.shift(),this.dispatchEvent(new vn("gossipsub:heartbeat"))}getRandomGossipPeers(e,t,n=(()=>!0)){const r=this.topics.get(e);if(null==r)return new Set;let s=[];return r.forEach((e=>{const t=this.streamsOutbound.get(e);null!=t&&this.multicodecs.includes(t.protocol)&&n(e)&&s.push(e)})),s=Dv(s),t>0&&s.length>t&&(s=s.slice(0,t)),new Set(s)}onScrapeMetrics(e){e.mcacheSize.set(this.mcache.size),e.mcacheNotValidatedCount.set(this.mcache.notValidatedCount),e.cacheSize.set({cache:"direct"},this.direct.size),e.cacheSize.set({cache:"seenCache"},this.seenCache.size),e.cacheSize.set({cache:"fastMsgIdCache"},this.fastMsgIdCache?.size??0),e.cacheSize.set({cache:"publishedMessageIds"},this.publishedMessageIds.size),e.cacheSize.set({cache:"mcache"},this.mcache.size),e.cacheSize.set({cache:"score"},this.score.size),e.cacheSize.set({cache:"gossipTracer.promises"},this.gossipTracer.size),e.cacheSize.set({cache:"gossipTracer.requests"},this.gossipTracer.requestMsByMsgSize),e.cacheSize.set({cache:"topics"},this.topics.size),e.cacheSize.set({cache:"subscriptions"},this.subscriptions.size),e.cacheSize.set({cache:"mesh"},this.mesh.size),e.cacheSize.set({cache:"fanout"},this.fanout.size),e.cacheSize.set({cache:"peers"},this.peers.size),e.cacheSize.set({cache:"streamsOutbound"},this.streamsOutbound.size),e.cacheSize.set({cache:"streamsInbound"},this.streamsInbound.size),e.cacheSize.set({cache:"acceptFromWhitelist"},this.acceptFromWhitelist.size),e.cacheSize.set({cache:"gossip"},this.gossip.size),e.cacheSize.set({cache:"control"},this.control.size),e.cacheSize.set({cache:"peerhave"},this.peerhave.size),e.cacheSize.set({cache:"outbound"},this.outbound.size);let t=0;const n=Date.now();e.connectedPeersBackoffSec.reset();for(const r of this.backoff.values()){t+=r.size;for(const[t,s]of r.entries())this.peers.has(t)&&e.connectedPeersBackoffSec.observe(Math.max(0,s-n)/1e3)}e.cacheSize.set({cache:"backoff"},t);for(const[t,n]of this.topics)e.topicPeersCount.set({topicStr:t},n.size);for(const[t,n]of this.mesh)e.meshPeerCounts.set({topicStr:t},n.size);const r=[],s=new Map;e.behaviourPenalty.reset();for(const t of this.peers.keys()){const n=this.score.score(t);r.push(n),s.set(t,n),e.behaviourPenalty.observe(this.score.peerStats.get(t)?.behaviourPenalty??0)}e.registerScores(r,this.opts.scoreThresholds),e.registerScorePerMesh(this.mesh,s);const i=function(e,t,n,r,s){const i={byTopic:new Map,p5w:[],p6w:[],p7w:[],score:[]};for(const o of e){const e=t.get(o);if(null!=e){const t=Ev(o,e,n,r,s);for(const[e,n]of t.byTopic){let t=i.byTopic.get(e);null==t&&(t={p1w:[],p2w:[],p3w:[],p3bw:[],p4w:[]},i.byTopic.set(e,t)),t.p1w.push(n.p1w),t.p2w.push(n.p2w),t.p3w.push(n.p3w),t.p3bw.push(n.p3bw),t.p4w.push(n.p4w)}i.p5w.push(t.p5w),i.p6w.push(t.p6w),i.p7w.push(t.p7w),i.score.push(t.score)}else i.p5w.push(0),i.p6w.push(0),i.p7w.push(0),i.score.push(0)}return i}(this.peers.keys(),this.score.peerStats,this.score.params,this.score.peerIPs,e.topicStrToLabel);e.registerScoreWeights(i)}tagMeshPeer=e=>{const{peerId:t,topic:n}=e.detail;this.components.peerStore.merge(Ss(t),{tags:{[n]:{value:100}}}).catch((e=>{this.log.error("Error tagging peer %s with topic %s",t,n,e)}))};untagMeshPeer=e=>{const{peerId:t,topic:n}=e.detail;this.components.peerStore.merge(Ss(t),{tags:{[n]:void 0}}).catch((e=>{this.log.error("Error untagging peer %s with topic %s",t,n,e)}))}}function Lv(e={}){return t=>new Ov(t,e)}var Bv;!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.protocolVersion&&(t.uint32(42),t.string(e.protocolVersion)),null!=e.agentVersion&&(t.uint32(50),t.string(e.agentVersion)),null!=e.publicKey&&(t.uint32(10),t.bytes(e.publicKey)),null!=e.listenAddrs)for(const n of e.listenAddrs)t.uint32(18),t.bytes(n);if(null!=e.observedAddr&&(t.uint32(34),t.bytes(e.observedAddr)),null!=e.protocols)for(const n of e.protocols)t.uint32(26),t.string(n);null!=e.signedPeerRecord&&(t.uint32(66),t.bytes(e.signedPeerRecord)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={listenAddrs:[],protocols:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 5:n.protocolVersion=e.string();break;case 6:n.agentVersion=e.string();break;case 1:n.publicKey=e.bytes();break;case 2:n.listenAddrs.push(e.bytes());break;case 4:n.observedAddr=e.bytes();break;case 3:n.protocols.push(e.string());break;case 8:n.signedPeerRecord=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Bv||(Bv={}));const Uv={protocolPrefix:"ipfs",timeout:5e3,maxInboundStreams:1,maxOutboundStreams:1,maxObservedAddresses:10,maxMessageSize:8192,runOnConnectionOpen:!0,runOnSelfUpdate:!0,runOnTransientConnection:!0,concurrency:32};async function Fv(e,t,n,r,s){if(n("received identify from %p",r.remotePeer),null==s)throw new fn("message was null or undefined","ERR_INVALID_MESSAGE");const i={};if(s.listenAddrs.length>0&&(i.addresses=s.listenAddrs.map((e=>({isCertified:!1,multiaddr:cr(e)})))),s.protocols.length>0&&(i.protocols=s.protocols),null!=s.publicKey){i.publicKey=s.publicKey;if(!(await Is(s.publicKey)).equals(r.remotePeer))throw new fn("public key did not match remote PeerId","ERR_INVALID_PUBLIC_KEY")}let o;if(null!=s.signedPeerRecord){n("received signedPeerRecord from %p",r.remotePeer);let t=s.signedPeerRecord;const a=await Yh.openAndCertify(t,Xh.DOMAIN);let c,l=Xh.createFromProtobuf(a.payload);if(!l.peerId.equals(a.peerId))throw new fn("signing key does not match PeerId in the PeerRecord","ERR_INVALID_SIGNING_KEY");if(!r.remotePeer.equals(l.peerId))throw new fn("signing key does not match remote PeerId","ERR_INVALID_PEER_RECORD_KEY");try{c=await e.get(l.peerId)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}if(null!=c&&(i.metadata=c.metadata,null!=c.peerRecordEnvelope)){const e=await Yh.createFromProtobuf(c.peerRecordEnvelope),r=Xh.createFromProtobuf(e.payload);r.seqNumber>=l.seqNumber&&(n("sequence number was lower or equal to existing sequence number - stored: %d received: %d",r.seqNumber,l.seqNumber),l=r,t=c.peerRecordEnvelope)}i.peerRecordEnvelope=t,i.addresses=l.multiaddrs.map((e=>({isCertified:!0,multiaddr:e}))),o={seq:l.seqNumber,addresses:l.multiaddrs}}else n("%p did not send a signed peer record",r.remotePeer);if(n("patching %p with",r.remotePeer,i),await e.patch(r.remotePeer,i),null!=s.agentVersion||null!=s.protocolVersion){const t={};null!=s.agentVersion&&(t.AgentVersion=kt(s.agentVersion)),null!=s.protocolVersion&&(t.ProtocolVersion=kt(s.protocolVersion)),n("merging %p metadata",r.remotePeer,t),await e.merge(r.remotePeer,{metadata:t})}const a={peerId:r.remotePeer,protocolVersion:s.protocolVersion,agentVersion:s.agentVersion,publicKey:s.publicKey,listenAddrs:s.listenAddrs.map((e=>cr(e))),observedAddr:null==s.observedAddr?void 0:cr(s.observedAddr),protocols:s.protocols,signedPeerRecord:o,connection:r};return t.safeDispatchEvent("peer:identify",{detail:a}),a}class Vv{host;protocol;started;timeout;peerId;peerStore;registrar;addressManager;maxInboundStreams;maxOutboundStreams;maxMessageSize;maxObservedAddresses;events;runOnTransientConnection;log;constructor(e,t){var n,r;this.protocol=t.protocol,this.started=!1,this.peerId=e.peerId,this.peerStore=e.peerStore,this.registrar=e.registrar,this.addressManager=e.addressManager,this.events=e.events,this.log=t.log,this.timeout=t.timeout??Uv.timeout,this.maxInboundStreams=t.maxInboundStreams??Uv.maxInboundStreams,this.maxOutboundStreams=t.maxOutboundStreams??Uv.maxOutboundStreams,this.maxMessageSize=t.maxMessageSize??Uv.maxMessageSize,this.maxObservedAddresses=t.maxObservedAddresses??Uv.maxObservedAddresses,this.runOnTransientConnection=t.runOnTransientConnection??Uv.runOnTransientConnection,this.host={protocolVersion:`${t.protocolPrefix??Uv.protocolPrefix}/0.1.0`,agentVersion:(n=e.nodeInfo,r=t.agentVersion,null!=r||(r=`${n.name}/${n.version}`,gy||py?r+=` UserAgent=${globalThis.process.version}`:(dy||my||fy||yy)&&(r+=` UserAgent=${globalThis.navigator.userAgent}`)),r)}}isStarted(){return this.started}async start(){this.started||(await this.peerStore.merge(this.peerId,{metadata:{AgentVersion:kt(this.host.agentVersion),ProtocolVersion:kt(this.host.protocolVersion)}}),await this.registrar.handle(this.protocol,(e=>{this.handleProtocol(e).catch((e=>{this.log.error(e)}))}),{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnTransientConnection:this.runOnTransientConnection}),this.started=!0)}async stop(){await this.registrar.unhandle(this.protocol),this.started=!1}}class Kv extends Vv{connectionManager;concurrency;constructor(e,t={}){super(e,{...t,protocol:`/${t.protocolPrefix??Uv.protocolPrefix}/id/push/1.0.0`,log:e.logger.forComponent("libp2p:identify-push")}),this.connectionManager=e.connectionManager,this.concurrency=t.concurrency??Uv.concurrency,(t.runOnSelfUpdate??Uv.runOnSelfUpdate)&&e.events.addEventListener("self:peer:update",(e=>{this.push().catch((e=>{this.log.error(e)}))}))}async push(){if(!this.isStarted())return;const e=this.addressManager.getAddresses().map((e=>e.decapsulateCode(Fn("p2p").code))),t=new Xh({peerId:this.peerId,multiaddrs:e}),n=await Yh.seal(t,this.peerId),r=this.registrar.getProtocols(),s=await this.peerStore.get(this.peerId),i=Qt(s.metadata.get("AgentVersion")??kt(this.host.agentVersion)),o=Qt(s.metadata.get("ProtocolVersion")??kt(this.host.protocolVersion)),a=this;await Nd(Of(async function*(){for(const t of a.connectionManager.getConnections()){(await a.peerStore.get(t.remotePeer)).protocols.includes(a.protocol)&&(yield async()=>{let s;const c=AbortSignal.timeout(a.timeout);try{s=await t.newStream(a.protocol,{signal:c,runOnTransientConnection:a.runOnTransientConnection});const l=Iw(s,{maxDataLength:a.maxMessageSize}).pb(Bv);await l.write({listenAddrs:e.map((e=>e.bytes)),signedPeerRecord:n.marshal(),protocols:r,agentVersion:i,protocolVersion:o},{signal:c}),await s.close({signal:c})}catch(e){a.log.error("could not push identify update to peer",e),s?.abort(e)}})}}(),{concurrency:this.concurrency}))}async handleProtocol(e){const{connection:t,stream:n}=e;try{if(this.peerId.equals(t.remotePeer))throw new Error("received push from ourselves?");const e={signal:AbortSignal.timeout(this.timeout)},r=Iw(n,{maxDataLength:this.maxMessageSize}).pb(Bv),s=await r.read(e);await n.close(e),await Fv(this.peerStore,this.events,this.log,t,s)}catch(e){return this.log.error("received invalid message",e),void n.abort(e)}this.log("handled push from %p",t.remotePeer)}}class $v extends Vv{constructor(e,t={}){super(e,{...t,protocol:`/${t.protocolPrefix??Uv.protocolPrefix}/id/1.0.0`,log:e.logger.forComponent("libp2p:identify")}),(t.runOnConnectionOpen??Uv.runOnConnectionOpen)&&e.events.addEventListener("connection:open",(e=>{const t=e.detail;this.identify(t).catch((e=>{this.log.error("error during identify trigged by connection:open",e)}))}))}async _identify(e,t={}){let n;if(null==t.signal){const e=AbortSignal.timeout(this.timeout);t={...t,signal:e}}try{n=await e.newStream(this.protocol,{...t,runOnTransientConnection:this.runOnTransientConnection});const r=Iw(n,{maxDataLength:this.maxMessageSize}).pb(Bv),s=await r.read(t);return await n.close(t),s}catch(e){throw this.log.error("error while reading identify message",e),n?.abort(e),e}}async identify(e,t={}){const n=await this._identify(e,t),{publicKey:r,protocols:s,observedAddr:i}=n;if(null==r)throw new fn("public key was missing from identify message","ERR_MISSING_PUBLIC_KEY");const o=await Is(r);if(!e.remotePeer.equals(o))throw new fn("identified peer does not match the expected peer","ERR_INVALID_PEER");if(this.peerId.equals(o))throw new fn("identified peer is our own peer id?","ERR_INVALID_PEER");const a=function(e){if(null!=e&&e.length>0)try{return cr(e)}catch{}}(i);return this.log("identify completed for peer %p and protocols %o",o,s),this.log("our observed address is %a",a),null!=a&&this.addressManager.getObservedAddrs().length<(this.maxObservedAddresses??1/0)&&(this.log("storing our observed address %a",a),this.addressManager.addObservedAddr(a)),Fv(this.peerStore,this.events,this.log,e,n)}async handleProtocol(e){const{connection:t,stream:n}=e,r=AbortSignal.timeout(this.timeout);try{const e=this.peerId.publicKey??new Uint8Array(0),s=await this.peerStore.get(this.peerId),i=this.addressManager.getAddresses().map((e=>e.decapsulateCode(Fn("p2p").code)));let o=s.peerRecordEnvelope;if(i.length>0&&null==o){const e=new Xh({peerId:this.peerId,multiaddrs:i});o=(await Yh.seal(e,this.peerId)).marshal().subarray()}let a=t.remoteAddr.bytes;fp.matches(t.remoteAddr)||(a=void 0);const c=Iw(n).pb(Bv);await c.write({protocolVersion:this.host.protocolVersion,agentVersion:this.host.agentVersion,publicKey:e,listenAddrs:i.map((e=>e.bytes)),signedPeerRecord:o,observedAddr:a,protocols:s.protocols},{signal:r}),await n.close({signal:r})}catch(e){this.log.error("could not respond to identify request",e),n.abort(e)}}}function qv(e={}){return t=>new $v(t,e)}function Hv(e={}){return t=>new Kv(t,e)}const zv=36e5,Wv=36*zv,jv="/dht/provider",Gv=zv,Yv=20,Qv=3;var Zv,Jv,Xv,eE,tE,nE,rE,sE;function iE(e){const t=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0"),r=String(e.getUTCDate()).padStart(2,"0"),s=String(e.getUTCHours()).padStart(2,"0"),i=String(e.getUTCMinutes()).padStart(2,"0"),o=String(e.getUTCSeconds()).padStart(2,"0"),a=e.getUTCMilliseconds();return`${t}-${n}-${r}T${s}:${i}:${o}.${String(1e3*a*1e3).padStart(9,"0")}Z`}!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.key&&e.key.byteLength>0&&(t.uint32(10),t.bytes(e.key)),null!=e.value&&e.value.byteLength>0&&(t.uint32(18),t.bytes(e.value)),null!=e.timeReceived&&""!==e.timeReceived&&(t.uint32(42),t.string(e.timeReceived)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={key:y(0),value:y(0),timeReceived:""},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();switch(t>>>3){case 1:r.key=e.bytes();break;case 2:r.value=e.bytes();break;case 5:r.timeReceived=e.string();break;default:e.skipType(7&t)}}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=(t,n)=>G(t,e.codec(),n)}(Zv||(Zv={}));class oE{key;value;timeReceived;constructor(e,t,n){if(!(e instanceof Uint8Array))throw new Error("key must be a Uint8Array");if(!(t instanceof Uint8Array))throw new Error("value must be a Uint8Array");this.key=e,this.value=t,this.timeReceived=n}serialize(){return Zv.encode(this.prepareSerialize())}prepareSerialize(){return{key:this.key,value:this.value,timeReceived:iE(this.timeReceived)}}static deserialize(e){const t=Zv.decode(e);return new oE(t.key,t.value,new Date(t.timeReceived))}static fromDeserialized(e){const t=function(e){const t=new RegExp("(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d+)Z"),n=String(e).trim().match(t);if(null==n)throw new Error("Invalid format");const r=parseInt(n[1],10),s=parseInt(n[2],10)-1,i=parseInt(n[3],10),o=parseInt(n[4],10),a=parseInt(n[5],10),c=parseInt(n[6],10),l=parseInt(n[7].slice(0,-6),10);return new Date(Date.UTC(r,s,i,o,a,c,l))}(e.timeReceived);if(null==e.key)throw new Error("key missing from deserialized object");if(null==e.value)throw new Error("value missing from deserialized object");return new oE(e.key,e.value,t)}}function aE(e,t={}){const n={...e,name:"SEND_QUERY",type:0,messageName:e.type,messageType:e.type};return t.onProgress?.(new vn("kad-dht:query:send-query",{detail:n})),n}function cE(e,t={}){const n={...e,name:"PEER_RESPONSE",type:1,messageName:e.messageType,closer:null!=e.closer?e.closer:[],providers:null!=e.providers?e.providers:[]};return t.onProgress?.(new vn("kad-dht:query:peer-response",{detail:n})),n}function lE(e,t={}){const n={...e,name:"FINAL_PEER",type:2};return t.onProgress?.(new vn("kad-dht:query:final-peer",{detail:n})),n}function uE(e,t={}){const n={...e,name:"QUERY_ERROR",type:3};return t.onProgress?.(new vn("kad-dht:query:query-error",{detail:n})),n}function hE(e,t={}){const n={...e,name:"PROVIDER",type:4};return t.onProgress?.(new vn("kad-dht:query:provider",{detail:n})),n}function dE(e,t={}){const n={...e,name:"VALUE",type:5};return t.onProgress?.(new vn("kad-dht:query:value",{detail:n})),n}function pE(e,t={}){const n={...e,name:"DIAL_PEER",type:7};return t.onProgress?.(new vn("kad-dht:query:dial-peer",{detail:n})),n}!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.key&&(t.uint32(10),t.bytes(e.key)),null!=e.value&&(t.uint32(18),t.bytes(e.value)),null!=e.author&&(t.uint32(26),t.bytes(e.author)),null!=e.signature&&(t.uint32(34),t.bytes(e.signature)),null!=e.timeReceived&&(t.uint32(42),t.string(e.timeReceived)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.key=e.bytes();break;case 2:n.value=e.bytes();break;case 3:n.author=e.bytes();break;case 4:n.signature=e.bytes();break;case 5:n.timeReceived=e.string();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Jv||(Jv={})),function(e){e.PUT_VALUE="PUT_VALUE",e.GET_VALUE="GET_VALUE",e.ADD_PROVIDER="ADD_PROVIDER",e.GET_PROVIDERS="GET_PROVIDERS",e.FIND_NODE="FIND_NODE",e.PING="PING"}(Xv||(Xv={})),function(e){e[e.PUT_VALUE=0]="PUT_VALUE",e[e.GET_VALUE=1]="GET_VALUE",e[e.ADD_PROVIDER=2]="ADD_PROVIDER",e[e.GET_PROVIDERS=3]="GET_PROVIDERS",e[e.FIND_NODE=4]="FIND_NODE",e[e.PING=5]="PING"}(eE||(eE={})),function(e){e.codec=()=>Wt(eE)}(Xv||(Xv={})),function(e){e.NOT_CONNECTED="NOT_CONNECTED",e.CONNECTED="CONNECTED",e.CAN_CONNECT="CAN_CONNECT",e.CANNOT_CONNECT="CANNOT_CONNECT"}(tE||(tE={})),function(e){e[e.NOT_CONNECTED=0]="NOT_CONNECTED",e[e.CONNECTED=1]="CONNECTED",e[e.CAN_CONNECT=2]="CAN_CONNECT",e[e.CANNOT_CONNECT=3]="CANNOT_CONNECT"}(nE||(nE={})),function(e){e.codec=()=>Wt(nE)}(tE||(tE={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.id&&e.id.byteLength>0&&(t.uint32(10),t.bytes(e.id)),null!=e.multiaddrs)for(const n of e.multiaddrs)t.uint32(18),t.bytes(n);null!=e.connection&&(t.uint32(24),tE.codec().encode(e.connection,t)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={id:y(0),multiaddrs:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.id=e.bytes();break;case 2:n.multiaddrs.push(e.bytes());break;case 3:n.connection=tE.codec().decode(e);break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(rE||(rE={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.type&&0!==eE[e.type]&&(t.uint32(8),Xv.codec().encode(e.type,t)),null!=e.clusterLevel&&(t.uint32(80),t.int32(e.clusterLevel)),null!=e.key&&(t.uint32(18),t.bytes(e.key)),null!=e.record&&(t.uint32(26),t.bytes(e.record)),null!=e.closer)for(const n of e.closer)t.uint32(66),rE.codec().encode(n,t);if(null!=e.providers)for(const n of e.providers)t.uint32(74),rE.codec().encode(n,t);!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={type:Xv.PUT_VALUE,closer:[],providers:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.type=Xv.codec().decode(e);break;case 10:n.clusterLevel=e.int32();break;case 2:n.key=e.bytes();break;case 3:n.record=e.bytes();break;case 8:n.closer.push(rE.codec().decode(e,e.uint32()));break;case 9:n.providers.push(rE.codec().decode(e,e.uint32()));break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(sE||(sE={}));const fE={pk:function(e,t){return 0}};async function gE(e,t){const n=t.key,r=Qt(n).split("/");if(r.length<3)return;const s=e[r[1].toString()];if(null==s){const e=`No validator available for key type "${r[1]}"`;throw new fn(e,"ERR_INVALID_RECORD_KEY_TYPE")}await s(n,t.value)}const mE={pk:async(e,t)=>{if(!(e instanceof Uint8Array))throw new fn('"key" must be a Uint8Array',"ERR_INVALID_RECORD_KEY_NOT_BUFFER");if(e.byteLength<5)throw new fn("invalid public key record","ERR_INVALID_RECORD_KEY_TOO_SHORT");if("/pk/"!==Qt(e.subarray(0,4)))throw new fn("key was not prefixed with /pk/","ERR_INVALID_RECORD_KEY_BAD_PREFIX");if(!In(e.slice(4),(await gt.digest(t)).bytes))throw new fn("public key does not match passed in key","ERR_INVALID_RECORD_HASH_MISMATCH")}},yE=kt("/pk/");function wE(e){return{...e,multiaddrs:e.multiaddrs.filter((e=>{const[[t,n]]=e.stringTuples();if(53===t||54===t||55===t)return"localhost"!==n;if(4!==t&&6!==t)return!1;if(null==n)return!1;const r=Yd(n);return null==r||!r}))}}async function bE(e){return(await gt.digest(e)).digest}async function vE(e){return bE(e.toBytes())}function EE(e){return new en(`/dht/record/${Qt(e,"base32")}`,!1)}function SE(e,t){const n=new Date;return new oE(e,t,n).serialize()}class _E{log;components;validators;selectors;peerRouting;queryManager;network;constructor(e,t){const{validators:n,selectors:r,peerRouting:s,queryManager:i,network:o,logPrefix:a}=t;this.components=e,this.log=e.logger.forComponent(`${a}:content-fetching`),this.validators=n,this.selectors=r,this.peerRouting=s,this.queryManager=i,this.network=o}async getLocal(e){this.log("getLocal %b",e);const t=EE(e);this.log("fetching record for key %k",t);const n=await this.components.datastore.get(t);this.log("found %k in local datastore",t);const r=oE.deserialize(n);return await gE(this.validators,r),r}async*sendCorrectionRecord(e,t,n,r={}){this.log("sendCorrection for %b",e);const s=SE(e,n);for(const{value:i,from:o}of t){if(In(i,n)){this.log("record was ok");continue}if(this.components.peerId.equals(o)){try{const t=EE(e);this.log(`Storing corrected record for key ${t.toString()}`),await this.components.datastore.put(t,s.subarray())}catch(e){this.log.error("Failed error correcting self",e)}continue}let t=!1;const a={type:Xv.PUT_VALUE,key:e,record:s};for await(const e of this.network.sendRequest(o,a,r))"PEER_RESPONSE"===e.name&&null!=e.record&&In(e.record.value,oE.deserialize(s).value)&&(t=!0),yield e;t||(yield uE({from:o,error:new fn("value not put correctly","ERR_PUT_VALUE_INVALID")},r)),this.log.error("Failed error correcting entry")}}async*put(e,t,n={}){this.log("put key %b value %b",e,t);const r=SE(e,t),s=EE(e);this.log(`storing record for key ${s.toString()}`),await this.components.datastore.put(s,r.subarray()),yield*gr(this.peerRouting.getClosestPeers(e,{signal:n.signal}),(t=>zr(t,(t=>async()=>{if("FINAL_PEER"!==t.name)return[t];const s=[],i={type:Xv.PUT_VALUE,key:e,record:r};this.log("send put to %p",t.peer.id);for await(const e of this.network.sendRequest(t.peer.id,i,n))s.push(e),"PEER_RESPONSE"===e.name&&(null!=e.record&&In(e.record.value,oE.deserialize(r).value)||s.push(uE({from:t.peer.id,error:new fn("value not put correctly","ERR_PUT_VALUE_INVALID")},n)));return s}))),(e=>Of(e,{ordered:!1,concurrency:Qv})),(async function*(e){for await(const t of e)yield*t}))}async*get(e,t={}){this.log("get %b",e);const n=[];for await(const r of this.getMany(e,t))"VALUE"===r.name&&n.push(r),yield r;if(0===n.length)return;const r=n.map((e=>e.value));let s=0;try{s=function(e,t,n){if(0===n.length)throw new fn("No records given","ERR_NO_RECORDS_RECEIVED");const r=Qt(t).split("/");if(r.length<3)throw new fn("Record key does not have a selector function","ERR_NO_SELECTOR_FUNCTION_FOR_RECORD_KEY");const s=e[r[1].toString()];if(null==s){const e=`No selector function configured for key type "${r[1]}"`;throw new fn(e,"ERR_UNRECOGNIZED_KEY_PREFIX")}return 1===n.length?0:s(t,n)}(this.selectors,e,r)}catch(e){if("ERR_NO_SELECTOR_FUNCTION_FOR_RECORD_KEY"!==e.code)throw e}const i=r[s];if(this.log("GetValue %b %b",e,i),null==i)throw new fn("best value was not found","ERR_NOT_FOUND");yield*this.sendCorrectionRecord(e,n,i,t),yield n[s]}async*getMany(e,t={}){this.log("getMany values for %b",e);try{const n=await this.getLocal(e);yield dE({value:n.value,from:this.components.peerId},t)}catch(t){this.log("error getting local value for %b",e,t)}const n=this;yield*this.queryManager.run(e,(async function*({peer:r,signal:s}){for await(const i of n.peerRouting.getValueOrPeers(r,e,{signal:s}))yield i,"PEER_RESPONSE"===i.name&&null!=i.record&&(yield dE({from:r,value:i.record.value},t))}),t)}}function IE(e){if(null==e.id)throw new Error("Invalid peer in message");return{id:_s(e.id),multiaddrs:(e.multiaddrs??[]).map((e=>cr(e)))}}class RE{log;components;network;peerRouting;queryManager;routingTable;providers;constructor(e,t){const{network:n,peerRouting:r,queryManager:s,routingTable:i,providers:o,logPrefix:a}=t;this.components=e,this.log=e.logger.forComponent(`${a}:content-routing`),this.network=n,this.peerRouting=r,this.queryManager=s,this.routingTable=i,this.providers=o}async*provide(e,t,n={}){this.log("provide %s",e);const r=e.multihash.bytes;await this.providers.addProvider(e,this.components.peerId);const s={type:Xv.ADD_PROVIDER,key:r,providers:[(i={id:this.components.peerId,multiaddrs:t},{id:i.id.toBytes(),multiaddrs:(i.multiaddrs??[]).map((e=>e.bytes)),connection:o})]};var i,o;let a=0;const c=t=>async()=>{if("FINAL_PEER"!==t.name)return[t];const r=[];this.log("putProvider %s to %p",e,t.peer.id);try{this.log("sending provider record for %s to %p",e,t.peer.id);for await(const i of this.network.sendMessage(t.peer.id,s,n))"PEER_RESPONSE"===i.name&&(this.log("sent provider record for %s to %p",e,t.peer.id),a++),r.push(i)}catch(e){this.log.error("error sending provide record to peer %p",t.peer.id,e),r.push(uE({from:t.peer.id,error:e},n))}return r};yield*gr(this.peerRouting.getClosestPeers(r,n),(e=>zr(e,(e=>c(e)))),(e=>Of(e,{ordered:!1,concurrency:Qv})),(async function*(e){for await(const t of e)yield*t})),this.log("sent provider records to %d peers",a)}async*findProviders(e,t){const n=this.routingTable.kBucketSize;let r=0;const s=e.multihash.bytes,i=this;this.log("findProviders %c",e);const o=await this.providers.getProviders(e);if(o.length>0){const e=[];for(const t of o.slice(0,n))try{const n=await this.components.peerStore.get(t);e.push({id:t,multiaddrs:n.addresses.map((({multiaddr:e})=>e))})}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e;this.log("no peer store entry for %p",t)}if(yield cE({from:this.components.peerId,messageType:Xv.GET_PROVIDERS,providers:e},t),yield hE({from:this.components.peerId,providers:e},t),r+=e.length,r>=n)return}const a=async function*({peer:e,signal:n}){const r={type:Xv.GET_PROVIDERS,key:s};yield*i.network.sendRequest(e,r,{...t,signal:n})},c=new zh(o);for await(const i of this.queryManager.run(s,a,t))if(yield i,"PEER_RESPONSE"===i.name){this.log("Found %d provider entries for %c and %d closer peers",i.providers.length,e,i.closer.length);const s=[];for(const e of i.providers)c.has(e.id)||(c.add(e.id),s.push(e));if(s.length>0&&(yield hE({from:i.from,providers:s},t),r+=s.length,r>=n))return}}}class AE{movingAverage;variance;deviation;forecast;timespan;previousTime;constructor(e){this.timespan=e,this.movingAverage=0,this.variance=0,this.deviation=0,this.forecast=0}alpha(e,t){return 1-Math.exp(-(e-t)/this.timespan)}push(e,t=Date.now()){if(null!=this.previousTime){const n=this.alpha(t,this.previousTime),r=e-this.movingAverage,s=n*r;this.movingAverage=n*e+(1-n)*this.movingAverage,this.variance=(1-n)*(this.variance+r*s),this.deviation=Math.sqrt(this.variance),this.forecast=this.movingAverage+n*r}else this.movingAverage=e;this.previousTime=t}}class TE{success;failure;next;metric;timeoutMultiplier;failureMultiplier;minTimeout;constructor(e={}){this.success=new AE(e.interval??5e3),this.failure=new AE(e.interval??5e3),this.next=new AE(e.interval??5e3),this.failureMultiplier=e.failureMultiplier??2,this.timeoutMultiplier=e.timeoutMultiplier??1.2,this.minTimeout=e.minTimeout??2e3,null!=e.metricName&&(this.metric=e.metrics?.registerMetricGroup(e.metricName))}getTimeoutSignal(e={}){const t=Math.max(Math.round(this.next.movingAverage*(e.timeoutFactor??this.timeoutMultiplier)),this.minTimeout),n=AbortSignal.timeout(t),r=Rs([e.signal,n]);return r.start=Date.now(),r.timeout=t,r}cleanUp(e){const t=Date.now()-e.start;e.aborted?(this.failure.push(t),this.next.push(t*this.failureMultiplier),this.metric?.update({failureMovingAverage:this.failure.movingAverage,failureDeviation:this.failure.deviation,failureForecast:this.failure.forecast,failureVariance:this.failure.variance,failure:t})):(this.success.push(t),this.next.push(t),this.metric?.update({successMovingAverage:this.success.movingAverage,successDeviation:this.success.deviation,successForecast:this.success.forecast,successVariance:this.success.variance,success:t}))}}class DE extends wn{log;protocol;running;components;timeout;constructor(e,t){super();const{protocol:n}=t;this.components=e,this.log=e.logger.forComponent(`${t.logPrefix}:network`),this.running=!1,this.protocol=n,this.timeout=new TE({...t.timeout??{},metrics:e.metrics,metricName:`${t.logPrefix.replaceAll(":","_")}_network_message_send_times_milliseconds`})}async start(){this.running||(this.running=!0)}async stop(){this.running=!1}isStarted(){return this.running}async*sendRequest(e,t,n={}){if(!this.running)return;const r=t.type;if(null==r)throw new Gt("Message type was missing","ERR_INVALID_PARAMETERS");let s;this.log("sending %s to %p",t.type,e),yield pE({peer:e},n),yield aE({to:e,type:r},n);const i=this.timeout.getTimeoutSignal(n);n={...n,signal:i};try{const r=await this.components.connectionManager.openConnection(e,n);s=await r.newStream(this.protocol,n);const i=await this._writeReadMessage(s,t,n);s.close(n).catch((t=>{this.log.error("error closing stream to %p",e,t),s?.abort(t)})),yield cE({from:e,messageType:i.type,closer:i.closer.map(IE),providers:i.providers.map(IE),record:null==i.record?void 0:oE.deserialize(i.record)},n)}catch(r){s?.abort(r),this.log.error("could not send %s to %p",t.type,e,r),yield uE({from:e,error:r},n)}finally{this.timeout.cleanUp(i)}}async*sendMessage(e,t,n={}){if(!this.running)return;const r=t.type;if(null==r)throw new Gt("Message type was missing","ERR_INVALID_PARAMETERS");let s;this.log("sending %s to %p",t.type,e),yield pE({peer:e},n),yield aE({to:e,type:r},n);const i=this.timeout.getTimeoutSignal(n);n={...n,signal:i};try{const i=await this.components.connectionManager.openConnection(e,n);s=await i.newStream(this.protocol,n),await this._writeMessage(s,t,n),s.close(n).catch((t=>{this.log.error("error closing stream to %p",e,t),s?.abort(t)})),yield cE({from:e,messageType:r},n)}catch(t){s?.abort(t),yield uE({from:e,error:t},n)}finally{this.timeout.cleanUp(i)}}async _writeMessage(e,t,n){const r=Iw(e);await r.write(t,sE,n),await r.unwrap().close(n)}async _writeReadMessage(e,t,n){const r=Iw(e);await r.write(t,sE,n);const s=await r.read(sE,n);return await r.unwrap().close(n),s.closer.forEach((e=>{this.safeDispatchEvent("peer",{detail:IE(e)})})),s.providers.forEach((e=>{this.safeDispatchEvent("peer",{detail:IE(e)})})),s}}function kE(e,t){if(e.byteLength!==t.byteLength)throw new Error("Inputs should have the same length");for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return e[n]<t[n]?-1:1;return 0}class PE{originDhtKey;capacity;peerDistances;constructor(e,t){this.originDhtKey=e,this.capacity=t,this.peerDistances=[]}get length(){return this.peerDistances.length}get peers(){return this.peerDistances.map((e=>e.peer))}async add(e){const t=await vE(e.id);this.addWitKadId(e,t)}addWitKadId(e,t){if(null!=this.peerDistances.find((t=>t.peer.id.equals(e.id))))return;const n={peer:e,distance:mm(this.originDhtKey,t)};this.peerDistances.push(n),this.peerDistances.sort(((e,t)=>kE(e.distance,t.distance))),this.peerDistances=this.peerDistances.slice(0,this.capacity)}async isCloser(e){if(0===this.length)return!0;return-1===kE(mm(await vE(e),this.originDhtKey),this.peerDistances[this.peerDistances.length-1].distance)}async anyCloser(e){return 0!==e.length&&Promise.any(e.map((async e=>this.isCloser(e))))}}class CE{log;routingTable;network;validators;queryManager;peerStore;peerId;constructor(e,t){const{routingTable:n,network:r,validators:s,queryManager:i,logPrefix:o}=t;this.routingTable=n,this.network=r,this.validators=s,this.queryManager=i,this.peerStore=e.peerStore,this.peerId=e.peerId,this.log=e.logger.forComponent(`${o}:peer-routing`)}async findPeerLocal(e){let t;const n=await this.routingTable.find(e);if(null!=n){this.log("findPeerLocal found %p in routing table",e);try{t=await this.peerStore.get(n)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}}if(null==t)try{t=await this.peerStore.get(e)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}if(null!=t)return this.log("findPeerLocal found %p in peer store",e),{id:t.id,multiaddrs:t.addresses.map((e=>e.multiaddr))}}async*_getValueSingle(e,t,n={}){const r={type:Xv.GET_VALUE,key:t};yield*this.network.sendRequest(e,r,n)}async*getPublicKeyFromNode(e,t={}){const n=function(e){return Rn([yE,e.toBytes()])}(e);for await(const r of this._getValueSingle(e,n,t))if(yield r,"PEER_RESPONSE"===r.name&&null!=r.record){const n=await Is(Vl({bytes:r.record.value}));if(!n.equals(e))throw new fn("public key does not match id","ERR_PUBLIC_KEY_DOES_NOT_MATCH_ID");if(null==n.publicKey)throw new fn("public key missing","ERR_PUBLIC_KEY_MISSING");yield dE({from:e,value:n.publicKey},t)}throw new fn(`Node not responding with its public key: ${e.toString()}`,"ERR_INVALID_RECORD")}async*findPeer(e,t={}){if(this.log("findPeer %p",e),!1!==t.useCache){const n=await this.findPeerLocal(e);if(null!=n)return this.log("found local"),void(yield lE({from:this.peerId,peer:n},t))}let n=!1;if(!1!==t.useNetwork){const r=this,s=async function*({peer:n,signal:s}){const i={type:Xv.FIND_NODE,key:e.toBytes()};for await(const o of r.network.sendRequest(n,i,{...t,signal:s}))if(yield o,"PEER_RESPONSE"===o.name){const n=o.closer.find((t=>t.id.equals(e)));null!=n&&(yield lE({from:o.from,peer:n},t))}};for await(const r of this.queryManager.run(e.toBytes(),s,t))"FINAL_PEER"===r.name&&(n=!0),yield r}n||(yield uE({from:this.peerId,error:new fn("Not found","ERR_NOT_FOUND")},t))}async*getClosestPeers(e,t={}){this.log("getClosestPeers to %b",e);const n=await bE(e),r=this.routingTable.closestPeers(n),s=this,i=new PE(n,this.routingTable.kBucketSize);await Promise.all(r.map((async e=>{await i.add({id:e,multiaddrs:[]})})));const o=async function*({peer:n,signal:r}){s.log("closerPeersSingle %s from %p",Qt(e,"base32"),n);const i={type:Xv.FIND_NODE,key:e};yield*s.network.sendRequest(n,i,{...t,signal:r})};for await(const n of this.queryManager.run(e,o,t))"PEER_RESPONSE"===n.name&&await Promise.all(n.closer.map((async e=>{await i.add(e)}))),yield n;this.log("found %d peers close to %b",i.length,e);for(const e of i.peers)yield lE({from:this.peerId,peer:e},t)}async*getValueOrPeers(e,t,n={}){for await(const r of this._getValueSingle(e,t,n)){if("PEER_RESPONSE"===r.name&&null!=r.record)try{await this._verifyRecordOnline(r.record)}catch(e){const t="invalid record received, discarded";this.log(t),yield uE({from:r.from,error:new fn(t,"ERR_INVALID_RECORD")},n);continue}yield r}}async _verifyRecordOnline(e){if(null==e.timeReceived)throw new fn("invalid record received","ERR_INVALID_RECORD");await gE(this.validators,new oE(e.key,e.value,e.timeReceived))}async getCloserPeersOffline(e,t){const n=await bE(e),r=this.routingTable.closestPeers(n),s=[];for(const e of r)if(!e.equals(t))try{const t=await this.peerStore.get(e);s.push({id:e,multiaddrs:t.addresses.map((({multiaddr:e})=>e))})}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}return s.length>0?this.log("getCloserPeersOffline found %d peer(s) closer to %b than %p",s.length,e,t):this.log("getCloserPeersOffline could not find peer closer to %b than %p with %d peers in the routing table",e,t,this.routingTable.size),s}}class xE{log;datastore;cache;cleanupInterval;provideValidity;syncQueue;started;cleaner;constructor(e,t={}){const{cacheSize:n,cleanupInterval:r,provideValidity:s}=t;this.log=e.logger.forComponent("libp2p:kad-dht:providers"),this.datastore=e.datastore,this.cleanupInterval=r??Gv,this.provideValidity=s??864e5,this.cache=Vp(n??256),this.syncQueue=new Ch({concurrency:1}),this.started=!1}isStarted(){return this.started}async start(){this.started||(this.started=!0,this.cleaner=setInterval((()=>{this._cleanup().catch((e=>{this.log.error(e)}))}),this.cleanupInterval))}async stop(){this.started=!1,null!=this.cleaner&&(clearInterval(this.cleaner),this.cleaner=void 0)}async _cleanup(){await this.syncQueue.add((async()=>{const e=Date.now();let t=0,n=0;const r=new Map,s=this.datastore.batch(),i=this.datastore.query({prefix:jv});for await(const e of i)try{const{cid:i,peerId:o}=ME(e.key),a=OE(e.value).getTime(),c=Date.now(),l=c-a,u=l>this.provideValidity;if(this.log("comparing: %d - %d = %d > %d %s",c,a,l,this.provideValidity,u?"(expired)":""),u){n++,s.delete(e.key);const t=r.get(i)??new Set;t.add(o),r.set(i,t)}t++}catch(e){this.log.error(e.message)}r.size>0?(this.log("deleting %d / %d entries",n,t),await s.commit()):this.log("nothing to delete");for(const[e,t]of r){const n=NE(e),r=this.cache.get(n);if(null!=r){for(const e of t)r.delete(e);0===r.size?this.cache.remove(n):this.cache.set(n,r)}}this.log("Cleanup successful (%dms)",Date.now()-e)}))}async _getProvidersMap(e){const t=NE(e);let n=this.cache.get(t);return null==n&&(n=await async function(e,t){const n=new Map,r=e.query({prefix:NE(t)});for await(const e of r){const{peerId:t}=ME(e.key);n.set(t,OE(e.value))}return n}(this.datastore,e),this.cache.set(t,n)),n}async addProvider(e,t){await this.syncQueue.add((async()=>{this.log("%p provides %s",t,e);const n=await this._getProvidersMap(e);this.log("loaded %s provs",n.size);const r=new Date;n.set(t.toString(),r);const s=NE(e);this.cache.set(s,n),await async function(e,t,n,r){const s=[NE(t),"/",n.toString()].join(""),i=new en(s),o=C(r.getTime());await e.put(i,o)}(this.datastore,e,t,r)}))}async getProviders(e){return this.syncQueue.add((async()=>{this.log("get providers for %s",e);return[...(await this._getProvidersMap(e)).keys()].map((e=>Ss(e)))}),{throwOnTimeout:!0})}}function NE(e){const t="string"==typeof e?e:Qt(e.multihash.bytes,"base32");return`${jv}/${t}`}function ME(e){const t=e.toString().split("/");if(5!==t.length)throw new Error(`incorrectly formatted provider entry key in datastore: ${e.toString()}`);return{cid:t[3],peerId:t[4]}}function OE(e){return new Date(x(e))}class LE{disjointPaths;alpha;shutDownController;running;queries;logger;peerId;connectionManager;routingTable;initialQuerySelfHasRun;logPrefix;metrics;constructor(e,t){const{disjointPaths:n=Yv,alpha:r=Qv,logPrefix:s}=t;this.logPrefix=s,this.disjointPaths=n??Yv,this.running=!1,this.alpha=r??Qv,this.queries=0,this.initialQuerySelfHasRun=t.initialQuerySelfHasRun,this.routingTable=t.routingTable,this.logger=e.logger,this.peerId=e.peerId,this.connectionManager=e.connectionManager,null!=e.metrics&&(this.metrics={runningQueries:e.metrics.registerMetric(`${s.replaceAll(":","_")}_running_queries`),queryTime:e.metrics.registerMetric(`${s.replaceAll(":","_")}_query_time_seconds`)}),this.shutDownController=new AbortController,this.shutDownController.signal}isStarted(){return this.running}async start(){this.running=!0,this.shutDownController=new AbortController,this.shutDownController.signal}async stop(){this.running=!1,this.shutDownController.abort()}async*run(e,t,n={}){if(!this.running)throw new Error("QueryManager not started");const r=this.metrics?.queryTime.timer();if(null==n.signal){const e=AbortSignal.timeout(18e4);n={...n,signal:e}}const s=new AbortController,i=Rs([this.shutDownController.signal,s.signal,n.signal]);s.signal;const o=this.logger.forComponent(`${this.logPrefix}:query:`+Qt(e,"base58btc")),a=Date.now();let c=!1;try{!0!==n.isSelfQuery&&null!=this.initialQuerySelfHasRun&&(o("waiting for initial query-self query before continuing"),await Ar(this.initialQuerySelfHasRun.promise,i),this.initialQuerySelfHasRun=void 0),o("query:start"),this.queries++,this.metrics?.runningQueries.update(this.queries);const r=await bE(e),s=this.routingTable.closestPeers(r),a=s.slice(0,Math.min(this.disjointPaths,s.length));if(0===s.length)return void o.error("Running query with no peers");const l=new zh,u=a.map(((r,s)=>async function*(e){const{key:t,startingPeer:n,ourPeerId:r,signal:s,query:i,alpha:o,pathIndex:a,numPaths:c,queryFuncTimeout:l,log:u,peersSeen:h,connectionManager:d}=e,p=new wf({concurrency:o,sort:(e,t)=>kE(e.options.distance,t.options.distance)}),f=await bE(t);!function n(o,g){if(null==o)return;h.add(o);const m=mm(g,f);p.add((async()=>{const g=[s];null!=l&&g.push(AbortSignal.timeout(l));const y=Rs(g);try{for await(const e of i({key:t,peer:o,signal:y,pathIndex:a,numPaths:c})){if(y.aborted)return;if("PEER_RESPONSE"===e.name)for(const s of e.closer){if(h.has(s.id)){u("already seen %p in query",s.id);continue}if(r.equals(s.id)){u("not querying ourselves");continue}if(!await d.isDialable(s.multiaddrs)){u("not querying undialable peer");continue}const e=await vE(s.id);-1===kE(mm(e,f),m)?(u("querying closer peer %p",s.id),n(s.id,e)):u("skipping %p as they are not closer to %b than %p",s.id,t,o)}p.safeDispatchEvent("completed",{detail:e})}}catch(t){if(!s.aborted)return uE({from:o,error:t},e)}finally{y.clear()}}),{distance:m}).catch((e=>{u.error(e)}))}(n,await vE(n));try{for await(const e of p.toGenerator({signal:s}))null!=e&&(yield e)}catch(e){if(s.aborted)throw new fn("Query aborted","ERR_QUERY_ABORTED");throw e}}({key:e,startingPeer:r,ourPeerId:this.peerId,signal:i,query:t,pathIndex:s,numPaths:a.length,alpha:this.alpha,queryFuncTimeout:n.queryFuncTimeout,log:o,peersSeen:l,onProgress:n.onProgress,connectionManager:this.connectionManager})));for await(const e of fr(...u)){if("QUERY_ERROR"===e.name&&o.error("query error",e.error),"PEER_RESPONSE"===e.name)for(const t of[...e.closer,...e.providers])await this.connectionManager.isDialable(t.multiaddrs)&&await this.routingTable.add(t.id);yield e}c=!0}catch(e){if(this.running||"ERR_QUERY_ABORTED"!==e.code)throw e}finally{c||(o("query exited early"),s.abort()),i.clear(),this.queries--,this.metrics?.runningQueries.update(this.queries),null!=r&&r(),o("query:done in %dms",Date.now()-a)}}}function BE(e){if(null!=e[Symbol.asyncIterator])return(async()=>{let t=0;for await(const n of e)t++;return t})();{let t=0;for(const n of e)t++;return t}}class UE{log;peerId;peerRouting;routingTable;count;interval;initialInterval;queryTimeout;started;timeoutId;controller;initialQuerySelfHasRun;querySelfPromise;constructor(e,t){const{peerRouting:n,logPrefix:r,count:s,interval:i,queryTimeout:o,routingTable:a}=t;this.peerId=e.peerId,this.log=e.logger.forComponent(`${r}:query-self`),this.started=!1,this.peerRouting=n,this.routingTable=a,this.count=s??Yv,this.interval=i??3e5,this.initialInterval=t.initialInterval??1e3,this.queryTimeout=o??5e3,this.initialQuerySelfHasRun=t.initialQuerySelfHasRun}isStarted(){return this.started}start(){this.started||(this.started=!0,clearTimeout(this.timeoutId),this.timeoutId=setTimeout((()=>{this.querySelf().catch((e=>{this.log.error("error running self-query",e)}))}),this.initialInterval))}stop(){this.started=!1,null!=this.timeoutId&&clearTimeout(this.timeoutId),null!=this.controller&&this.controller.abort()}async querySelf(){if(this.started){if(null!=this.querySelfPromise)return this.log("joining existing self query"),this.querySelfPromise.promise;if(this.querySelfPromise=lr(),this.started){this.controller=new AbortController;const e=AbortSignal.timeout(this.queryTimeout),t=Rs([this.controller.signal,e]);this.controller.signal;try{0===this.routingTable.size&&(this.log("routing table was empty, waiting for some peers before running query"),await fw(this.routingTable,"peer:add",{signal:t})),this.log("run self-query, look for %d peers timing out after %dms",this.count,this.queryTimeout);const e=Date.now(),n=await gr(this.peerRouting.getClosestPeers(this.peerId.toBytes(),{signal:t,isSelfQuery:!0}),(e=>Ld(e,this.count)),(async e=>BE(e)));this.log("self-query found %d peers in %dms",n,Date.now()-e)}catch(e){this.log.error("self-query error",e)}finally{t.clear(),null!=this.initialQuerySelfHasRun&&(this.initialQuerySelfHasRun.resolve(),this.initialQuerySelfHasRun=void 0)}}this.querySelfPromise.resolve(),this.querySelfPromise=void 0,this.started&&(this.timeoutId=setTimeout((()=>{this.querySelf().catch((e=>{this.log.error("error running self-query",e)}))}),this.interval))}else this.log("skip self-query because we are not started")}}function FE(e,t){if(!(t instanceof Uint8Array))throw new TypeError(e+" is not a Uint8Array");if(32!==t.byteLength)throw new TypeError(e+" had incorrect length")}function VE(e){return Array.isArray(e?.peers)}class KE extends wn{root;localPeer;prefixLength;splitThreshold;kBucketSize;numberOfNodesToPing;constructor(e){super(),this.localPeer=e.localPeer,this.prefixLength=e.prefixLength,this.kBucketSize=e.kBucketSize??$E,this.splitThreshold=e.splitThreshold??this.kBucketSize,this.numberOfNodesToPing=e.numberOfNodesToPing??3,FE("options.localPeer.kadId",e.localPeer.kadId),this.root={prefix:"",depth:0,peers:[]}}add(e){FE("peer.kadId",e?.kadId);const t=this._determineBucket(e.kadId);if(!(this._indexOf(t,e.kadId)>-1))return t.peers.length===this.splitThreshold&&t.depth<this.prefixLength?(this._split(t),void this.add(e)):t.peers.length<this.kBucketSize?(t.peers.push(e),void this.safeDispatchEvent("added",{detail:e})):void this.safeDispatchEvent("ping",{detail:{oldContacts:t.peers.slice(0,this.numberOfNodesToPing),newContact:e}})}*closest(e,t=this.kBucketSize){const n=new PE(e,t);for(const e of this.toIterable())n.addWitKadId({id:e.peerId,multiaddrs:[]},e.kadId);yield*zr(n.peers,(e=>e.id))}count(){return function e(t){if(VE(t))return t.peers.length;let n=0;return null!=t.left&&(n+=e(t.left)),null!=t.right&&(n+=e(t.right)),n}(this.root)}get(e){const t=this._determineBucket(e),n=this._indexOf(t,e);return t.peers[n]}remove(e){const t=this._determineBucket(e),n=this._indexOf(t,e);if(n>-1){const e=t.peers.splice(n,1)[0];this.safeDispatchEvent("removed",{detail:e})}}*toIterable(){yield*function*e(t){VE(t)?yield*t.peers:(yield*e(t.left),yield*e(t.right))}(this.root)}distance(e,t){return BigInt("0x"+Qt(mm(e,t),"base16"))}_determineBucket(e){const t=Qt(e,"base2").substring(0,this.prefixLength);return function e(n,r=0){return VE(n)?n:e("0"===t[r]?n.left:n.right,r+1)}(this.root)}_indexOf(e,t){return e.peers.findIndex((e=>function(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let n=0,r=e.length;n<r;++n)if(e[n]!==t[n])return!1;return!0}(e.kadId,t)))}_split(e){const t=e.depth+1,n={prefix:"0",depth:t,peers:[]},r={prefix:"1",depth:t,peers:[]};for(const s of e.peers){"0"===Qt(s.kadId,"base2")[t]?n.peers.push(s):r.peers.push(s)}delete e.peers,e.left=n,e.right=r}}const $E=20;class qE extends wn{kBucketSize;kb;pingQueue;log;components;prefixLength;splitThreshold;pingTimeout;pingConcurrency;running;protocol;tagName;tagValue;metrics;constructor(e,t){super(),this.components=e,this.log=e.logger.forComponent(`${t.logPrefix}:routing-table`),this.kBucketSize=t.kBucketSize??$E,this.pingTimeout=t.pingTimeout??1e4,this.pingConcurrency=t.pingConcurrency??10,this.running=!1,this.protocol=t.protocol,this.tagName=t.tagName??"kad-close",this.tagValue=t.tagValue??50,this.prefixLength=t.prefixLength??32,this.splitThreshold=t.splitThreshold??$E,this.pingQueue=new bf({concurrency:this.pingConcurrency,metricName:`${t.logPrefix.replaceAll(":","_")}_ping_queue`,metrics:this.components.metrics}),this.pingQueue.addEventListener("error",(e=>{this.log.error("error pinging peer",e.detail)})),null!=this.components.metrics&&(this.metrics={routingTableSize:this.components.metrics.registerMetric(`${t.logPrefix.replaceAll(":","_")}_routing_table_size`),routingTableKadBucketTotal:this.components.metrics.registerMetric(`${t.logPrefix.replaceAll(":","_")}_routing_table_kad_bucket_total`),routingTableKadBucketAverageOccupancy:this.components.metrics.registerMetric(`${t.logPrefix.replaceAll(":","_")}_routing_table_kad_bucket_average_occupancy`),routingTableKadBucketMaxDepth:this.components.metrics.registerMetric(`${t.logPrefix.replaceAll(":","_")}_routing_table_kad_bucket_max_depth`)})}isStarted(){return this.running}async start(){this.running=!0;const e=new KE({localPeer:{kadId:await vE(this.components.peerId),peerId:this.components.peerId},kBucketSize:this.kBucketSize,prefixLength:this.prefixLength,splitThreshold:this.splitThreshold,numberOfNodesToPing:1});this.kb=e,e.addEventListener("ping",(e=>{this._onPing(e).catch((e=>{this.log.error("could not process k-bucket ping event",e)}))}));let t=0;for(const e of await this.components.peerStore.all())if(e.protocols.includes(this.protocol)){const n=await vE(e.id);this.kb.add({kadId:n,peerId:e.id}),t++}this.log("added %d peer store peers to the routing table",t),this._tagPeers(e)}async stop(){this.running=!1,this.pingQueue.clear(),this.kb=void 0}_tagPeers(e){let t=new zh;const n=function(e,t=100){let n;return()=>{clearTimeout(n),n=setTimeout((()=>{e()}),t)}}((()=>{const n=new zh(e.closest(e.localPeer.kadId,$E)),r=n.difference(t),s=t.difference(n);Promise.resolve().then((async()=>{for(const e of r)await this.components.peerStore.merge(e,{tags:{[this.tagName]:{value:this.tagValue}}});for(const e of s)await this.components.peerStore.merge(e,{tags:{[this.tagName]:void 0}})})).catch((e=>{this.log.error("Could not update peer tags",e)})),t=n}));e.addEventListener("added",(e=>{n(),this.safeDispatchEvent("peer:add",{detail:e.detail.peerId})})),e.addEventListener("removed",(e=>{n(),this.safeDispatchEvent("peer:remove",{detail:e.detail.peerId})}))}async _onPing(e){if(!this.running)return;const{oldContacts:t,newContact:n}=e.detail,r=(await Promise.all(t.map((async e=>{const t=this.pingQueue.find(e.peerId);return null!=t?t.join():this.pingQueue.add((async()=>{let t;try{const n={signal:AbortSignal.timeout(this.pingTimeout)};this.log("pinging old contact %p",e.peerId);const r=await this.components.connectionManager.openConnection(e.peerId,n);t=await r.newStream(this.protocol,n);const s=Iw(t);await s.write({type:Xv.PING},sE,n);const i=await s.read(sE,n);if(await s.unwrap().close(),i.type!==Xv.PING)throw new fn(`Incorrect message type received, expected PING got ${i.type}`,"ERR_BAD_PING_RESPONSE");return!0}catch(n){return this.running&&null!=this.kb&&(this.log.error("could not ping peer %p",e.peerId,n),this.log("evicting old contact after ping failed %p",e.peerId),this.kb.remove(e.kadId)),t?.abort(n),!1}finally{this.metrics?.routingTableSize.update(this.size)}}),{peerId:e.peerId})})))).filter((e=>e)).length;this.running&&r<t.length&&null!=this.kb&&(this.log("adding new contact %p",n.peerId),this.kb.add(n))}get size(){return null==this.kb?0:this.kb.count()}async find(e){const t=await vE(e);return this.kb?.get(t)?.peerId}closestPeer(e){const t=this.closestPeers(e,1);if(t.length>0)return t[0]}closestPeers(e,t=this.kBucketSize){return null==this.kb?[]:[...this.kb.closest(e,t)]}async add(e){if(null==this.kb)throw new Error("RoutingTable is not started");const t=await vE(e);this.kb.add({kadId:t,peerId:e}),this.log("added %p with kad id %b",e,t),this.updateMetrics()}async remove(e){if(null==this.kb)throw new Error("RoutingTable is not started");const t=await vE(e);this.kb.remove(t),this.updateMetrics()}updateMetrics(){if(null==this.metrics||null==this.kb)return;let e=0,t=0,n=0;!function r(s){if(VE(s))return s.depth>n&&(n=s.depth),t++,void(e+=s.peers.length);r(s.left),r(s.right)}(this.kb.root),this.metrics.routingTableSize.update(e),this.metrics.routingTableKadBucketTotal.update(t),this.metrics.routingTableKadBucketAverageOccupancy.update(Math.round(e/t)),this.metrics.routingTableKadBucketMaxDepth.update(n)}}var HE=[77591,22417,43971,28421,740,29829,71467,228973,196661,78537,27689,36431,44415,14362,19456,106025,96308,2882,49509,21149,87173,131409,75844,23676,121838,30291,17492,2953,7564,110620,129477,127283,53113,72417,165166,109690,21200,102125,24049,71504,90342,25307,72039,26812,26715,32264,133800,71161,88956,171987,51779,24425,16671,30251,186294,247761,14202,2121,8465,35024,4876,85917,169730,3638,256836,96184,943,18678,6583,52907,35807,112254,214097,18796,11595,9243,23554,887,268203,382004,24590,111335,11625,16619,29039,102425,69006,97976,92362,32552,63717,41433,128974,137630,59943,10019,13986,35430,33665,108037,43799,43280,38195,29078,58629,18265,14425,46832,235538,40830,77881,110717,58937,3463,325358,51300,47623,117252,19007,10170,20540,91237,294813,4951,79841,56232,36270,128547,69209,66275,100156,32063,73531,34439,80937,28892,44466,88595,216307,32583,49620,16605,82127,45807,21630,78726,20235,40163,111007,96926,5567,72083,21665,58844,39419,179767,48328,42662,51550,5251,37811,49608,81056,50854,55513,20922,18891,197409,164656,32593,71449,220474,58919,85682,67854,13758,35066,3565,61905,214793,119572,141419,21504,10302,27354,67003,46131,32668,15165,64871,34450,17821,2757,11452,34189,5160,12257,85523,560,53385,65887,119549,135620,312353,115979,122356,10867,193231,124537,54783,90675,120791,4715,142253,50943,17271,43358,25331,4917,120566,34580,12878,33786,160528,32523,4869,301307,104817,81491,23276,8832,97911,31265,52065,7998,49622,9715,43998,34091,84587,20664,69041,29419,53205,10838,58288,116145,6185,5154,141795,35924,21307,144738,43730,12085,8279,10002,119,133779,199668,72938,31768,39176,67875,38453,9700,44144,4121,116048,41733,12868,82669,92308,128,34262,11332,7712,90764,36141,13553,71312,77470,117314,96549,49135,23602,54468,28605,6327,62308,17171,67531,21319,14105,894,107722,46157,8503,51069,100472,45138,15246,14577,35609,191464,1757,13364,161349,32067,91705,81144,52339,5408,91066,21983,14157,100545,4372,26630,129112,1423,29676,213626,4397,88436,99190,6877,49958,26122,114348,60661,29818,293118,50042,179738,16400,163423,89627,31040,43973,36638,45952,5153,1894,109322,1898,134021,12402,112077,68309,190269,69866,31938,107383,11522,105232,11248,14868,39852,71707,186525,16530,38162,106212,11700,5130,16608,26998,59586,108399,230033,43683,48135,82179,2073,5015,196684,189293,16378,23452,8301,35640,11632,214551,29240,57644,33137,91949,55157,52384,117313,5090,17717,89668,49363,82238,241035,66216,29066,184088,97206,62820,26595,4241,135635,173672,8202,459,71355,146294,29587,3008,135385,141203,14803,6634,45094,69362,50925,546,51884,62011,83296,234584,44515,56050,89476,87751,19373,12691,149923,19794,13833,35846,87557,58339,2884,19145,25647,12224,11024,77338,64608,122297,53025,7205,36189,36294,170779,21750,7739,173883,75192,35664,224240,113121,30181,26267,27036,117827,92015,106516,55628,203549,67949,60462,60844,35911,20457,1820,920,19773,8738,73173,181993,38521,98254,76257,46008,92796,5384,26868,151566,22124,2411,15919,186872,180021,28099,152961,78811,80237,62352,102653,74259,184890,16792,123702,224945,29940,19512,75283,14059,112691,92811,233329,20411,138569,53341,109802,50600,134528,66747,5529,166531,31578,64732,67189,1596,126357,967,167999,206598,109752,119431,207825,78791,91938,10301,27311,24233,252343,28831,32812,66002,112267,90895,8786,8095,16824,22866,21813,60507,174833,19549,130985,117051,52110,6938,81923,123864,38061,919,18680,53534,46739,112893,161529,85429,26761,11900,81121,91968,15390,217947,56524,1713,6654,37089,85630,138866,61850,16491,75577,16884,98296,73523,6140,44645,6062,36366,29844,57946,37932,42472,5266,20834,19309,33753,127182,134259,35810,41805,45878,312001,14881,47757,49251,120050,44252,3708,25856,107864,120347,1228,36550,41682,34496,47025,8393,173365,246526,12894,161607,35670,90785,126572,2095,124731,157033,58694,554,12786,9642,4817,16136,47864,174698,66992,4639,69284,10625,40710,27763,51738,30404,264105,137904,109882,52487,42824,57514,2740,10479,146799,107390,16586,88038,174951,9410,16185,44158,5568,40658,46108,12763,97385,26175,108859,664,230732,67470,46663,14395,50750,141320,93140,15361,47997,55784,6791,307840,118569,107326,18056,58281,260415,54691,8790,73332,45633,7511,45674,143373,14031,11799,94491,35646,96544,14560,26049,32983,25791,83814,42094,231370,63955,139212,2359,169908,3108,183486,105867,28197,32941,124968,26402,88267,149768,23053,3078,19091,52924,25383,19209,111548,97361,3959,24880,235061,9099,24921,161254,151405,20508,7159,34381,20133,11434,74036,19974,34769,36585,1076,22454,17354,38727,235160,111547,96454,117448,156940,91330,37299,7310,26915,117060,51369,22620,61861,322264,106850,111694,15091,2624,40345,300446,177064,1707,27389,54792,327783,132669,183543,59003,17744,20603,151134,106923,53084,71803,279424,319816,11579,21946,16728,38274,72711,5085,83391,88646,40159,25027,34680,10752,12988,54126,30365,18338,100445,230674,44874,84974,143877,123253,139372,28082,91477,144002,13096,219729,46016,50029,42377,14601,6660,58244,58978,23918,88206,113611,64452,17541,41032,10942,12021,49189,10978,40175,37156,10947,71709,106894,112538,57007,137486,150608,152719,40615,7746,279716,13101,19524,28708,40578,72320,1096,182051,94527,51275,22833,45164,81917,77519,48508,5421,140302,37845,149830,5587,27579,5357,428725,248187,6326,206760,39814,32585,89923,44341,288753,284443,96368,31201,94189,119504,20359,52073,103216,179,27934,32801,96035,34111,34309,101326,18198,20704,210266,37643,27880,141873,106e3,19414,56614,167714,66483,107885,86602,4379,20796,75467,4987,5017,118857,26003,34308,114428,29198,6686,29697,73632,3739,69795,16798,41504,7207,30722,21436,36735,28067,28545,3239,11221,36031,41889,100010,19247,317673,29495,174554,6424,129725,53845,94986,7955,59676,2604,191497,19735,102214,62954,23844,11872,179525,261436,34492,428,78404,142035,16747,17246,27578,37021,33672,57944,26056,135760,2369,61674,122066,31327,19374,157065,40553,130982,69619,71290,38855,72100,92903,95940,51422,165999,65713,57873,50726,7288,20272,2081,42326,22624,81120,57914,79352,19447,1684,72302,11774,302559,161481,96396,13692,414988,3721,79066,56627,46883,21150,11747,12184,5856,113458,176117,84416,52079,27933,3354,59765,141359,2212,216309,2555,23458,196722,142463,45701,44548,28798,19418,215,29916,9396,10574,114226,84475,13520,18694,34056,4524,90302,62930,13539,19407,77209,7728,38088,9535,2263,23875,183945,17750,26274,67172,10585,28042,22199,7478,51331,66030,26774,192929,31434,25850,50197,52926,178158,4679,181256,70184,229600,9959,105594,72158,73974,2726,35085,78087,23284,35568,51713,155676,5401,27254,11966,17569,223253,71993,103357,111477,55722,30504,26034,46774,35392,36285,214814,41143,163465,1051,16094,81044,6636,76489,179102,20712,39178,35683,125177,54219,30617,52994,25324,50123,2543,87529,58995,10688,125199,12388,60158,125481,131646,7642,133350,65874,3438,97277,101450,10075,56344,116821,50778,60547,98016,106135,13859,14255,16300,77373,173521,8285,45932,37426,4054,114295,55947,7703,39114,52,51119,128135,19714,60715,9554,50492,88180,2823,118271,52993,122625,97919,23859,37895,25040,33614,32102,20431,3577,9275,15686,43031,157741,110358,1884,40291,125391,13736,5008,64881,87336,77381,70711,43032,49155,118587,70494,4318,10168,30126,12580,10524,280104,104001,145413,2862,84140,6603,106005,13566,12780,11251,42830,571,179910,82443,13146,469,42714,32591,265217,424024,92553,54721,134100,6007,15242,114681,59030,16718,85465,200214,85982,55174,165013,23493,56964,82529,109150,32706,27568,82442,5350,14976,13165,44890,60021,21343,33978,17264,4655,22328,27819,75730,16567,55483,14510,17926,45827,150609,3704,7385,272531,161543,76904,122163,52405,2039,19165,41623,14423,228354,3369,176360,85491,7122,35789,303724,4465,13628,2233,55311,118771,20713,10006,221519,45115,71021,35650,29775,7337,10864,20665,21142,1746,15080,1624,32449,10905,105743,229797,7701,3940,22997,178467,57208,389057,39683,59403,63344,63125,54847,69691,18336,56448,3362,37202,18282,29648,138224,35867,10495,5911,28814,26653,31514,176702,26550,45621,11734,4525,40543,73944,121080,27858,155561,14887,44670,30742,8796,107455,113472,56369,75581,183777,240095,133699,153299,8768,160464,26058,49078,103971,21875,71486,44888,17156,9678,89541,123019,102337,3972,83930,21245,87852,109660,287918,183019,686,10100,39177,283941,11274,24736,26793,26214,25995,77011,141580,4070,23742,46285,46632,30700,26669,19056,35951,115575,174034,56097,35463,87425,24575,44245,38701,82317,85922,281616,100333,147697,61503,7730,84330,8530,59917,61597,17173,9092,32658,90288,193136,39023,20381,56654,31132,7779,1919,1375,117128,30819,11169,40938,23935,115201,101155,151034,4835,11231,74550,89388,59951,91704,107312,167882,115062,12732,72738,88703,464019,158267,57995,60496,737,14371,123867,4174,243339,159946,7568,16025,134556,110916,38103,191,80226,88794,29688,27230,10454,76308,57647,77409,113483,66864,14745,19808,12023,46583,84805,16015,17102,2231,20611,3547,95740,250131,34559,108894,8498,15853,159169,148920,20942,2813,93160,45188,210613,45531,52587,149062,39782,28194,57849,60965,84954,89766,84453,100927,16501,27658,165311,103841,54192,207341,19558,20084,319622,5672,205467,98462,61849,36279,13609,147177,24726,165015,209489,59591,31157,6551,117580,75060,141146,277310,21072,22023,106474,63041,137443,122965,68371,5383,42146,98961,113467,30863,23794,4843,99630,30392,82679,13699,241612,33601,93146,24319,18643,32155,95669,40440,15333,34089,67799,142144,58245,38633,114531,117400,77861,188726,5507,2568,8853,10987,107222,2663,2421,11530,13345,30075,41785,118661,104786,17459,12490,16281,71936,193555,17431,5944,71758,26485,77317,20803,367167,158,7362,93430,11735,172445,46002,11532,54482,930,62911,2235,23004,179236,4764,101859,208113,22477,55163,95579,14098,67320,162556,90709,156949,3826,57492,4025,34092,87442,104565,6718,186015,28214,14209,10039,107186,233912,58877,81637,55265,39828,6194,145813,50831,105849,4974,88319,122296,10272,197216,95714,51540,72418,23324,91555,8743,140452,250249,51666,34124,7229,38592,129641,78169,174242,22464,149964,51450,14034,10026,95376,26190,120062,14401,8700,265,31386,143573,7203,229889,61567,4227,140981,2466,72052,10787,10062,30958,6099,38471,30103,23202,208101,70847,467,58934,32271,32984,36637,24107,30771,17109,73353,13650,2098,157040,67366,66904,106018,265380,107238,18535,44025,32681,144983,62505,91295,56120,3082,77508,10322,63023,36700,81885,224127,16721,45023,239261,111272,13852,7866,149243,204199,32309,22084,42029,38316,126644,104973,14406,43454,67322,61310,15789,40285,24026,181047,6301,70927,23319,115823,27248,66693,115875,278566,63007,146844,56841,59007,87368,180001,22370,42114,80605,12022,10374,308,25079,14689,12618,63368,7936,264973,212291,136713,95999,105801,18965,32075,48700,52230,35119,96912,32992,8586,16606,101333,101812,14969,39930,759,193090,27387,42914,12937,5058,62646,64528,38624,25743,37502,3716,4435,30352,178687,26461,132611,42002,138442,35833,59582,16345,8048,60319,49349,309,47800,49739,90482,26405,34470,63786,32479,85028,39866,47846,11649,23934,29466,2816,42864,31828,7410,74885,49632,47629,111801,90749,19536,18767,105764,59606,21223,10746,76298,22220,39408,7190,79654,64856,11602,82156,272765,17079,70089,245473,51813,184407,384678,1576,122249,5064,27481,6188,25790,74361,27541,318284,45430,31488,620,93579,45723,192118,22670,51913,4162,70244,35966,26397,16199,50899,209613,121702,287507,2993,36101,132229,67345,33062,76295,118628,78705,52316,34375,107083,107454,44863,127561,33964,3073,154010,190914,55967,39074,6272,31047,5550,41123,26154,98638,47110,19998,148091,50229,31329,59900,195442,19106,61347,73497,70015,682,45850,25776,38022,148951,6288,37411,232526,109277,27286,32342,9262,5220,16651,23175,46740,129438,78614,121925,66914,88710,127952,5563,21500,34521,10739,14863,191006,62956,17359,16749,67027,56284,69134,43301,35039,58883,54466,60823,404451,75743,59856,86979,7923,34273,83785,32142,7693,268986,197428,282681,17049,22346,22990,92245,107180,3357,37104,96724,49153,7683,31197,43267,82231,164276,23696,20848,188364,22309,24821,158707,1018,22514,70922,27792,45589,59709,10765,736,35218,63479,51987,24275,63588,55361,92929,81964,4658,20122,12330,44058,13065,311456,72224,8337,211229,38979,22590,138478,52757,32595,133600,8838,31549,94412,43391,90056,1585,94802,127271,6223,31889,137038,132910,2165,57616,230152,6080,10748,36737,74579,134062,50525,180532,119270,34556,76155,82394,52595,29258,31435,87820,67996,26943,183878,38007,2410,13526,180297,69856,3503,187396,167700,7838,16701,9199,56267,3661,37407,65994,23767,5708,62508,221700,67088,86978,46776,84434,32088,5612,9149,88244,21685,95151,46750,189612,2979,506311,2594,3628,40074,105039,78243,28523,6651,38058,71999,30992,12764,68261,108991,6165,26450,61961,13400,22426,7490,60890,109623,2070,12958,50355,67979,257096,7213,42578,52121,35716,65461,7516,124758,39268,302,64712,14977,1467,219452,2840,34229,11121,21602,19270,63574,8024,1532,17331,79839,78885,52029,180767,57957,6069,91265,61380,55767,8927,32881,287603,22149,35029,68876,6428,199567,46926,13412,104132,21434,366616,45060,110046,81924,128910,45886,52821,130416,29416,77342,21762,67329,121432,79924,11724,38625,81006,102033,28338,13326,3250,82056,82526,38212,21112,12382,111495,3263,7414,86274,93490,40844,30224,45212,24019,48411,71367,24941,76729,57776,3769,38114,202019,197745,31953,237533,33270,201580,255648,100798,44741,32241,98468,106931,10085,15090,170358,33154,66787,18819,69760,25061,234005,82660,6295,131975,16874,9076,4094,25005,17740,40908,19533,220019,44330,99792,50040,19619,13950,55228,24423,31253,95308,103177,184795,28590,82285,5059,3210,75525,49894,70007,56178,10580,36051,139681,21617,98736,3555,106306,164189,37352,63915,47824,24883,145530,61904,28444,11483,19837,145446,30420,112972,85939,11835,191233,2262,20705,58630,1753,148334,1197,144714,6887,11223,107667,60879,77914,4151,57417,81594,96681,169430,1784,20444,95138,254041,27038,596,7117,72808,13759,3353,126776,21074,55322,27081,36942,39547,139830,179275,4453,713,8722,71399,19204,25785,22794,23923,104114,11291,25458,102309,88396,75288,230440,206396,104551,58447,130857,37247,94734,31548,176529,226077,65159,20104,10096,66881,94191,237909,27109,37404,1520,27421,25220,113003,23423,24884,50585,6286,231877,150800,11789,3226,90004,60642,5053,202400,61442,132531,175329,57138,30116,103847,9973,75367,16452,32360,59119,21246,10191,164804,23305,61051,37348,154530,13214,5468,50403,66754,130976,50559,80515,14436,155492,84017,5472,43107,41240,2890,90431,70188,382,76234,48040,50211,281038,237007,32115,142178,1536,22761,96429,1811,31243,1679,49143,55209,17402,235054,61494,7462,77030,34925,87609,78002,9499,9027,73289,201078,101379,63544,27666,5469,10642,30029,49816,132979,95620,58086,351930,116300,2110,2043,30845,6154,11279,16727,4122,2277,27281,4971,3650,39060,61970,65951,39674,75686,38151,11370,130809,177895,32665,63725,122267,7857,39618,118483,44792,157755,178624,136994,24260,41308,22471,12404,21707,12486,30473,52781,50246,20247,39065,909,56825,103158,128603,31542,1089,41935,32744,12428,37963,84420,33134,72921,208449,42622,168151,127335,147107,46699,38216,12591,94342,85814,31423,24944,2605,87542,67473,192551,4496,56321,91819,17630,6300,256183,114569,202090,33209,35289,34897,24967,40520,43470,5344,10199,34810,14283,10381,10017,62923,49924,23233,64539,13051,35686,19698,11570,135555,120868,44924,87065,52318,52335,47586,140906,245885,109834,78668,9065,46990,25258,72022,61243,40838,4545,146387,10537,11557,17470,36930,68104,46711,24264,79401,81043,18225,120488,24746,84338,81652,28266,13776,21878,46973,1047,230465,73357,95777,24973,210160,62210,58404,110633,169651,6937,41870,9909,26822,191062,76553,27519,96256,239070,2478,205678,67955,58532,20601,50120,19148,78501,195724,110740,8249,109665,27446,30568,57631,31425,49752,32820,65504,50079,3663,102256,219898,23849,211315,14645,4359,91767,9528,12449,49366,7941,49763,107848,8930,27086,50686,9744,10447,81935,39513,46514,1670,29229,6172,22312,137280,97759,9806,14445,22976,56458,73391,34983,93760,174219,52573,33149,59747,2429,136277,75123,165263,91040,7446,57632,48633,97140,246081,84766,151684,79918,93268,120346,54059,54875,77858,32996,103590,45276,11968,19600,25849,17159,132907,42828,16817,4913,99462,103303,27395,5737,74184,20749,21160,14377,77062,131403,158735,10999,27799,77785,9320,34366,51593,61070,33746,47048,29268,36675,30262,53297,9832,82e3,20188,122292,39917,7331,18160,68301,185935,134830,15031,4935,10004,165845,185534,46923,30109,44134,122631,18874,22903,112790,26561,18549,348902,82871,140345,255565,135390,63556,103747,145055,179600,145662,296111,61661,211987,23952,52342,126343,48450,32919,44277,82185,9591,62139,205363,376969,394874,108461,18040,120885,14798,39863,16571,16794,58271,81025,55206,14640,118656,6361,44092,85970,6262,153863,108244,180200,72264,79947,38044,10050,5735,61221,80712,5471,115689,11391,11661,184257,20010,60116,30320,19327,134598,45455,27542,18004,125092,452272,1549,91523,46567,180063,156026,2608,11174,58848,37788,65907,80194,30490,5786,40775,119519,106241,11323,156297,8425,61495,2617,29675,2425,59886,112582,49142,59618,4863,50597,86710,50650,168632,27693,85641,83643,18993,25768,84284,28090,93592,36627,312804,43381,9887,9402,100931,97165,3311,173330,66805,28935,4963,184460,3201,78102,19126,21607,37496,24938,22615,16153,32862,134792,153318,61120,6067,2812,12826,12792,23825,37559,64662,202250,102694,155488,85881,149193,46233,65383,15521,106982,11358,176786,25752,39717,34208,24510,32464,77742,39371,72028,138229,60688,71386,102834,132477,2208,11548,63670,271279,28351,30338,38620,32491,99845,143885,152266,13252,2825,178663,108097,1775,78201,14897,113573,163346,62292,171129,22183,96598,38733,64971,166776,117445,9968,146393,44677,74867,20908,97328,12761,25656,26785,9148,112344,26115,99176,110121,22437,49547,6180,79320,5835,31392,43328,33377,75870,119860,69497,80273,7325,155219,43167,111173,28347,20222,3763,71752,55041,47252,14618,28088,15012,97805,194698,54636,2036,41349,6173,96604,61530,51859,43782,13361,24334,22668,24792,7070,23441,16789,3209,36211,208475,26242,32880,122181,182407,21444,31060,88459,29929,77907,12716,10934,97005,20599,31690,8403,58445,30303,22700,10336,86731,103115,337709,72556,46788,112566,47684,67089,53548,36874,56487,41387,125985,26893,40071,106683,73712,18787,40105,72992,67246,137276,50802,36790,70328,138827,22466,39263,183295,29858,50975,9322,57397,10654,24364,30383,55799,41600,23584,127295,296610,129078,143558,244131,86397,36049,1085,80677,3820,108139,5476,34767,24683,7758,13060,7239,131671,250593,59556,103392,29810,4188,252323,39404,116877,7651,43600,40338,13554,157253,39196,25978,144387,61211,234,50104,6129,10449,93777,9240,356378,274148,4439,72970,3724,147770,78680,62570,115877,40027,40547,36817,224392,64609,34795,165027,67440,2477,37206,23431,50754,164797,46018,94995,170982,27051,7957,22767,3674,27900,56419,18930,60701,41302,2692,84749,339721,61996,111094,80221,50129,1045,8153,62945,19202,8250,37208,37418,32560,79477,41106,88569,33963,36693,5892,30570,1581,66471,49647,11922,160717,29442,5643,114865,82962,95982,132098,22633,22838,94726,54556,28566,205039,162340,33216,16849,35847,221339,94851,26533,71469,1805,3804,12935,45483,71020,36310,65381,192960,34240,35165,59773,1248,46954,155332,96864,4246,388800,16129,57133,74592,44807,442014,38203,42574,80818,91592,26377,36424,65760,977,77387,22628,147610,28018,30561,98454,6969,119628,63648,18170,36854,26601,64018,22027,37279,51395,152934,21153,9430,58760,194742,5330,55115,34158,28917,174111,13171,122326,1526,43896,66094,25325,4234,148354,11450,275,18999,112191,44365,22723,68409,8733,57746,96565,75007,14196,108844,29475,88599,177563,100792,106156,86323,93726,14248,135341,194131,40126,47099,14779,8272,39597,95983,171398,65882,28052,10393,47213,40689,22120,72212,106829,34964,109146,753,648,21660,30047,17527,181025,5619,145357,4085,216883,9359,186951,24779,53931,24545,36197,223296,62628,168101,4243,107313,30321,26642,13049,51059,31027,107912,807,73550,26551,84369,122422,165872,49754,74213,234264,33151,52014,33100,87183,22365,52500,40013,23302,5652,72723,21404,26107,48434,587,94049,168493,96418,32871,70860,31709,25128,443,71597,166253,15670,70994,26341,133675,28280,75491,54756,47955,56028,26182,11952,113272,472197,64640,110753,17919,337,50642,22576,142,87371,53391,93210,126694,15285,19642,85667,14148,1506,42092,52962,33243,11970,20734,135843,57044,58880,13002,219134,22876,64754,232519,4257,43120,321573,24799,64526,124728,52579,81472,70831,276848,17403,74359,23021,182101,74597,23744,148267,12055,7976,5349,11772,67540,167347,65318,18720,127832,108238,22828,90233,9987,259080,118185,73209,79270,13775,90100,137742,90799,70569,15699,19961,9087,67475,57872,39731,8810,134897,131868,146849,19898,3334,2281,167061,91073,60356,467742,74712,188,53179,137679,92769,29241,9537,132595,80119,1041,88962,5976,40171,44911,102859,139059,104558,98987,47761,19272,71472,113864,175377,73338,10857,23402,23758,1591,139864,5644,4076,118760,16427,134198,18853,20291,100849,37423,22038,36677,19071,195521,57445,11069,31869,55718,66882,148490,44,41296,75242,49704,166810,9906,20943,122258,49112,105667,15969,10344,6408,187694,21399,72742,58970,14867,14376,81889,41856,23225,15042,56993,16074,131389,74276,72407,53875,383108,53597,37363,68993,44854,122548,430927,198279,38430,80409,12245,2981,628,2818,17760,37437,238229,7968,46892,2200,3730,34190,65983,37959,112291,87850,70827,6522,20750,73913,111621,41652,19587,2780,58668,25916,85259,18200,168962,95781,42445,102050,7776,57662,103313,47742,96358,41964,66174,100396,29069,204735,19679,27978,7479,40264,22534,61183,36081,107436,58223,14680,23002,101311,24716,124108,12908,5646,31750,40380,14215,232799,102772,14122,96775,61398,50917,12096,149880,67833,598749,124194,155871,49216,790,14677,65319,56917,7440,145744,95701,12206,49405,129269,76199,45732,9767,11058,9047,210885,11051,7392,26307,2130,8132,147526,20802,232698,115660,50060,59789,57344,107623,80343,112676,23291,9866,160971,34032,118291,15719,59730,164911,28975,2659,58046,78480,21854,66209,53863,109085,116045,29021,46481,107552,22130,18764,70254,31272,11300,52460,43933,84738,20721,53869,190840,79673,105300,7561,321817,66924,13940,33281,101046,183181,32176,71878,5678,62924,79535,56646,40303,19559,27703,93042,73368,42187,3670,37376,46440,7023,36816,109628,20680,5940,276440,275233,170848,112093,136996,14984,20226,111441,77693,112960,48577,39370,55707,50314,123404,26570,54281,61372,123391,4857,35928,246740,132507,106646,44241,7196,92258,9825,37688,51197,303141,5590,15476,132986,10955,85782,34486,26696,7991,28813,18858,39546,11703,11365,38185,5716,93555,11925,40121,60002,6985,10976,171384,3887,43394,13337,56346,6381,252336,39573,75042,53711,1028,31781,44295,95925,131713,7214,68125,43571,70954,213234,1628,8760,13391,65485,17320,56038,1710,25248,60803,57399,19839,3870,326,281556,50945,72400,21460,316244,75619,56246,98775,481,13513,55765,50427,7388,123519,32929,57908,27124,61316,101097,57467,30228,48792,10788,20402,37318,50526,155730,34456,158065,145305,17832,43733,64052,4506,35072,205355,177028,184004,187081,68616,35938,83703,10367,36892,93186,260137,51934,89970,4985,23445,26755,21558,7948,78741,23376,124405,85594,68596,57536,49351,12619,56593,132668,99924,109728,71844,71935,196018,65464,17617,14987,89701,143773,33997,8687,22701,33258,2914,4436,72108,85610,9671,49067,2327,82988,1361,1672,44033,35777,30269,24057,10605,82236,616,15793,13919,47249,112086,116698,9484,80207,90574,33304,68624,93127,56101,42210,160929,4827,38995,38095,4701,125119,5027,33680,9236,231236,14135,87837,23318,70261,78893,30151,81482,14332,1084,74256,27532,46644,79185,3148,62615,6981,55672,31668,36825,1849,14536,37446,14738,23779,43058,162749,72199,1168,21346,5592,85932,85302,9668,18351,57135,150360,2080,228015,77953,34670,119302,151751,31009,106725,84265,45214,59289,74178,113071,263206,111009,4021,44449,188119,192629,123592,392506,292847,114487,12831,205858,9852,20780,79648,75767,357014,97721,18166,21005,67950,33226,204009,16536,2987,11335,66717,144910,47950,17262,55060,15063,2934,51038,26775,178497,66008,3427,49433,128592,20036,157553,63861,3089,23015,51210,28696,35933,49942,71135,231518,99620,17248,21835,176536,20676,16944,38700,165831,233253,295625,36723,13023,52745,10907,19423,67972,125868,95473,82875,1183,108455,52685,33417,64095,21433,52438,33191,127809,44505,211823,7810,2752,95548,162031,7185,91196,47563,61721,33359,17897,23682,42806,178101,22874,49707,199897,75419,82456,8618,11171,79712,116847,18783,44190,46564,5346,59046,95032,7893,14916,3214,26800,24172,121453,34362,10250,17408,18888,4840,68696,22831,13162,36005,32512,14800,62357,41723,45046,27247,37486,5372,2564,34261,298500,66509,133920,89138,31305,117697,19097,108304,81386,84106,23802,46411,63304,946,51417,41777,41041,19501,115864,60743,294354,37955,94165,18116,1156,17937,20645,57114,90804,58042,48643,92288,9861,2557,88546,61333,101008,12853,5148,87856,4152,144503,73841,18718,9789,147565,10846,42085,12789,30223,8993,56352,67203,2448,28215,6052,23540,126319,75933,36689,80235,23231,23561,21383,38800,77548,102798,21234,31468,158608,46188,63960,191679,8051,67014,11185,170078,42186,28827,34777,41930,212079,12421,34750,24111,110344,73918,45171,70826,141949,40063,23979,24254,37309,26724,27179,24718,83648,54938,14591,17425,29525,102675,48975,48654,12316,8929,60640,41709,50168,63264,89812,50716,48632,38755,138583,160123,55579,71829,24230,233277,46322,39650,166388,34718,24108,98252,7031,106695,62498,18258,35062,217827,78731,34824,33354,19520,60852,2432,60224,8587,2836,62955,702,20227,42285,40560,95592,62486,11094,53035,143291,18842,46177,77994,1770,9657,107422,172915,32655,128716,25886,25164,156740,119928,165875,85817,11007,89110,33956,12652,65156,180266,8494,36889,19958,20955,96,1264,118288,135769,44754,86671,5632,19026,168220,289120,33569,93821,66144,70635,7687,5642,2714,55445,56636,71545,184182,93133,7332,37389,12643,52315,22729,11014,158742,17050,152889,50178,34601,41945,52136,9948,26914,63548,95721,115951,40759,8960,158258,38938,49232,48325,42234,81523,253019,66128,40978,20048,238048,38760,62928,122560,118532,43687,137472,163689,26680,9878,17448,51035,16211,60834,36749,29178,14241,59868,150086,2305,26477,42422,34342,165341,83279,33894,14257,29928,12743,13957,125571,89134,66712,10952,16507,147839,30146,7249,16565,45399,39874,114565,215780,31990,230881,171477,102,196546,44538,10880,84948,281705,86651,10617,31395,2342,453658,43569,60561,132901,21845,17727,58556,258242,22262,58728,4008,77997,11806,37431,30599,81375,109137,185787,114085,217292,97453,169085,30593,60212,11544,102056,65580,2384,91655,4855,95725,7295,157994,16228,20669,53276,141590,105246,17334,25440,76067,17967,39321,38911,11362,28559,63807,21627,26468,85816,40120,1025,15234,58319,69516,66512,124548,75845,78873,22137,46681,51242,85683,32909,76747,35555,43396,101465,1765,73094,1077,2962,39028,66777,57831,42048,15828,13962,36041,63657,52412,5242,58846,2141,5506,219012,134451,3936,182230,17558,17153,152237,22621,49377,170216,35257,68233,65374,6510,11126,212151,7184,2480,22517,3437,33073,30156,16557,3768,55067,86829,91e3,12350,148650,66017,79424,70885,49066,28250,21369,51213,34533,11510,3258,18176,18465,84413,6315,36411,163765,4346,356,107618,598,13727,285026,162695,8749,14583,7132,63521,184253,32378,25991,5604,30961,53675,4874,84693,5086,34811,26978,56564,7904,33519,51221,113942,69253,6664,125563,22055,220680,102008,742,51930,19494,176108,44424,35123,13025,75685,11759,74335,22250,181453,131147,16984,132115,154311,11991,76452,52609,85351,196,30969,9198,74919,2529,56838,71779,29187,116304,3504,62330,41190,86153,28393,254926,104228,105189,13264,84359,3574,12415,8534,57147,10175,188174,59504,60932,66318,16407,107921,17638,99103,49278,28403,39786,145865,8462,3558,43406,142271,29139,21989,36552,93955,72365,7176,13556,106185,37957,321774,17782,129017,51154,27938,24952,1935,39366,2791,33489,41582,56078,24558,9311,5449,218786,27808,190429,68013,36020,86003,29735,3404,87348,119357,115714,2324,86796,81973,40992,43376,93621,28784,16808,36367,2517,2909,191926,24978,55303,53308,205724,60068,3098,21375,64784,23949,26579,63121,12319,80145,39967,97861,6757,70143,67642,37082,34698,69140,122883,46151,62187,80934,429,19437,135071,137885,222647,13331,154065,327,61778,74257,40116,37493,14855,85079,237641,42342,102164,199965,71204,4662,29368,5042,113914,122214,8955,13149,102503,43173,5659,163787,69003,307084,63392,171080,21390,81918,86666,36622,24126,28887,5736,28054,207170,163428,79891,346467,95363,38980,111806,80828,9200,19288,294896,114468,87405,111715,141705,7015,72754,68463,48738,243147,33397,101210,37051,98801,82847,20397,4940,185559,18716,54718,83491,11725,40803,1128,12128,23060,5174,7745,67007,46701,1571,27807,180186,256996,18975,16837,7877,212758,250379,15440,87954,57755,24719,124057,83461,258,50864,8874,29038,71289,31627,15429,9005,4061,113851,107716,82819,13651,79656,117851,17539,111446,12938,39724,190787,4352,15402,21070,62708,8539,23777,73853,13552,38810,86117,16285,56400,1718,75342,142863,29033,378,110113,180321,32586,23606,26393,160984,207987,23783,8406,16904,24596,47274,11693,46539,60524,78595,48423,31718,20170,9009,146268,15183,191060,172765,1349,138436,37365,10970,40509,225817,20021,70394,152138,21541,66559,66544,89352,2725,17258,91345,7313,3815,115868,8660,40362,4071,103524,39388,118275,21950,6549,38226,32754,209574,29201,43495,18028,20296,40597,18370,47520,202450,24134,2219,8195,69545,38041,136934,46374,19041,159811,84865,58620,846,98749,13569,30714,97246,32186,4479,27355,92973,35214,151491,75963,37631,1561,27200,238083,23182,60756,12291,25766,39355,102333,87362,65741,59906,19538,201575,48772,102938,24438,292580,39964,66366,9004,61379,50548,37622,38732,28379,68180,76622,17488,69849,5963,7219,48143,43413,55358,540,58691,29506,19245,52193,48621,5518,13048,118625,44755,191081,42061,89197,2259,60665,66994,71210,51232,3585,142096,55024,7892,8345,58653,463307,65658,64319,137941,136323,53499,12746,43492,6978,95163,29925,60175,5128,7352,41463,184756,121146,20473,18426,4598,5309,54580,14277,121151,10691,56711,43880,63409,76682,11830,172218,264898,32632,66536,81062,31649,25788,92774,60222,11100,63159,9432,224657,25240,53613,152,138620,163829,2397,85345,12501,37507,64932,38575,43522,65789,80198,78796,35226,3851,108891,73311,3060,28391,93671,39663,46142,30982,66041,37281,68157,26553,71872,81142,211527,39747,118119,22695,2859,11066,20232,168911,7933,197005,17066,111071,44434,133994,120798,12766,227798,45756,132852,29917,36076,55352,65281,129800,41958,18944,84678,18580,168093,132621,39997,54092,27740,32354,3770,114118,103242,43918,15899,18574,145944,3190,123469,219903,24169,100571,62403,16776,92779,14535,17168,16475,14304,37231,1712,28218,242754,61688,28980,1318,51359,222657,99200,67989,31772,23932,35351,201251,49041,27306,19128,40135,3986,77333,19649,120683,151927,21081,7076,78375,77501,101599,8011,89585,96715,58179,5378,102138,106793,26051,217276,4197,16297,27014,46721,13322,22806,5278,29629,70632,9647,71519,58818,40603,128530,8903,36770,56900,31483,26935,43845,34265,34920,87658,6114,84767,64250,47318,50720,19264,162514,33357,13117,6705,46696,75032,71054,87004,42035,69138,11903,99854,102328,19611,34525,69312,6431,49842,101600,133178,108751,41829,89939,225664,48916,99556,9195,130387,5960,36857,116724,53518,94002,39077,53996,6945,22261,64291,8314,152785,57588,16522,9091,5048,87671,35441,39509,1945,12423,158923,178413,37549,14095,1475,73188,62878,4819,24012,68534,42606,4010,120809,57497,59564,101758,103718,32701,80116,12345,95834,46918,21468,53213,15665,31200,3867,5140,96013,250744,21016,10069,13968,35449,180829,27683,39704,59956,22893,3115,26293,32785,75934,62445,141162,62720,2018,83638,19949,114012,95006,3330,99829,130935,309272,9565,55874,121727,37017,23586,319858,40970,27602,8625,112329,61060,100088,118525,25922,16232,1907,60671,51583,44553,80993,5262,94679,8676,940,20736,11823,3020,16476,12340,152600,97416,3703,25744,66826,16245,16876,46446,84798,74227,176020,45192,61955,75496,23946,23626,40372,26036,6149,11822,30582,16541,41914,82385,232823,40921,80773,14930,3631,7517,39619,4348,36180,126106,138939,62611,1477,113512,47321,25052,14546,118881,29060,23589,128322,36795,18401,137921,104699,267929,36194,172791,18113,4766,188215,30083,332586,94089,5805,77909,22194,68234,154976,43220,40660,70001,184893,138095,11128,103010,22663,5108,212615,8485,5565,49222,54614,26530,42639,16319,55062,152662,105595,21114,22216,10294,68158,10436,86950,7206,62115,3977,3657,59874,456,118617,18156,106663,112229,80992,17442,8217,55551,5133,34344,251927,51153,39364,201321,7816,66803,23057,156724,145664,14276,95705,979,2796,6875,13429,212525,50602,26276,28284,3424,19465,52397,46963,31420,51399,206476,92317,48851,637,100820,83349,10317,60227,21972,6908,282439,32857,224767,95629,83882,42106,87338,69757,29840,68709,37665,45244,114577,49188,175943,54009,186746,106158,70168,3358,234002,50555,9221,129338,9562,20118,32923,78479,118280,65752,4977,10474,102174,60947,129006,10570,83451,8598,8078,159367,123785,80438,16742,5905,5281,181513,42402,6977,163136,93179,42191,14968,50421,112401,105440,33456,57347,121611,4221,94954,36517,24046,27796,6255,33394,72990,135408,116627,1233,57874,25654,95419,68156,401399,313338,55208,45573,93124,119251,47200,38196,11909,130667,45391,73904,64964,167846,4137,115606,52036,62214,7969,160925,7187,1132,134835,40309,73195,64494,80472,444841,61111,26500,45323,40743,53625,52797,22659,15631,29739,36706,28841,39147,102836,26794,10536,14845,87305,45874,12241,127587,83833,57183,79722,30844,41304,84655,20825,92500,3722,25655,27811,10157,81634,31362,34088,92487,70123,22190,185100,72658,139035,192523,88241,2078,230490,44528,85638,100198,22088,29982,291233,241062,13865,4445,137791,37835,107218,31726,19718,38234,72528,23046,19177,66695,5109,17251,28077,5617,21554,47839,72425,133825,1486,73065,181275,141508,21768,62971,63082,2512,34200,9904,120309,6392,91243,68416,268253,41199,116757,138551,185526,41246,28986,4093,19057,17295,4148,245766,122360,35356,112075,20301,75441,10998,7977,19769,62922,937,63547,100196,26427,157820,20983,236696,22935,8140,90315,156004,47204,140973,7726,45097,52725,22636,23436,257282,105247,522,88389,216031,202204,46812,211666,19693,68828,81691,45925,11256,30292,372,5236,167826,88328,232776,151611,5360,82104,18841,80393,25465,18285,20320,72377,31730,33160,45803,38715,27705,37379,24163,18360,103586,4015,32305,269494,91252,20080,36567,54650,7797,57073,12650,31164,42209,6375,261663,105528,81661,106002,2800,5375,17247,43151,4442,15727,194619,100855,144898,62320,78465,39929,16454,1967,28311,61363,17219,9395,8745,121445,76939,80385,162380,22009,54191,44248,16299,122830,48151,74429,78291,64755,14238,44966,2511,17712,67954,93583,829,105899,49935,84750,11591,33185,85447,42717,27409,208542,28965,62052,52525,5597,25694,65594,16343,63224,276188,12475,9331,127507,38522,57287,24128,133161,79723,105548,133695,48917,27558,43278,46520,13778,141954,110785,83366,17715,46317,105763,66298,147013,41086,94180,16478,220447,44611,730,19722,78975,117889,125643,26254,16574,18480,65006,15806,38549,246418,46052,36056,8440,34984,30170,3163,59800,4458,115442,4283,41970,33507,104078,1653,22,121158,276486,3655,6338,24048,133421,23641,2161,24422,36006,8086,10675,181474,12307,29514,59143,14729,52509,87128,122470,19446,80852,33314,24573,119864,14237,9652,57779,6612,51851,15284,98871,90581,124466,156831,21190,22015,71380,161906,87247,69201,18392,17908,108470,72962,40719,14338,17911,95260,43339,20610,78916,20710,72451,11315,31448,17263,58853,178878,48111,116002,45497,80506,82605,85880,36300,121755,25215,36118,301929,88728,405223,276136,553,34704,212438,49970,78329,922,20711,25036,257130,38295,145369,18128,15385,30829,55656,48345,8012,3561,28004,122041,192900,58338,112508,41085,29976,87040,47117,23905,4336,92061,138880,97407,42083,172121,6256,25192,172671,5,93568,1420,12677,31605,56743,40620,6015,78415,231077,31298,80026,13902,19048,24924,170586,32955,176119,87859,36731,6773,27711,24658,26475,115216,133207,93250,95820,88522,8317,5714,124047,55219,86860,19677,23961,22928,162209,8904,225992,359835,56084,96201,29392,96558,86071,93643,55114,13347,8183,95129,82012,2017,123336,34219,115554,157159,47747,101684,41008,18735,193781,104151,226906,7552,179874,124113,31159,21162,44010,14771,51268,166128,31382,73124,77438,92830,205709,12113,1292,38937,13114,1334,2118,15597,69581,14449,21934,76618,48728,67038,14967,51495,24243,87736,147249,26720,11119,46063,43749,5843,44147,152629,133428,65703,14269,45604,57982,28672,55616,45957,8438,95433,37698,220862,132034,39456,61870,4161,26501,73560,56418,9845,4654,20916,10456,88920,119358,9015,65931,96507,48029,38534,21676,109081,43078,34943,25089,6131,28766,23665,5477,10255,16695,67,45778,42443,42770,29534,23733,100513,62617,42630,48746,14191,43753,50295,26007,8792,57243,43119,54725,164253,58250,112304,131796,25165,4651,3188,24831,47748,3705,19540,13211,102095,5593,18699,23666,32005,117571,33541,60584,74573,86311,99443,25172,27222,168938,7143,11853,53560,18834,19960,86522,28217,53266,117700,72989,34323,18721,66450,34346,74056,47217,202002,46269,9429,68582,75458,37823,82843,96652,32549,145144,27958,19820,158086,31955,201406,135379,31207,192545,12950,51704,9094,248263,76147,64028,110009,79407,89345,99284,223492,47966,26848,15359,201137,2861,110507,71231,72297,31851,118777,71039,151051,240855,16333,50766,14727,7939,4149,80908,418780,88378,59276,1327,7284,38576,79814,65820,42199,84860,49574,62596,12396,70598,40117,8648,7994,16836,7630,14047,359699,106878,525,29037,28064,13380,11675,50669,74216,103539,180314,27449,56299,172344,19274,7301,246099,32043,19422,36506,129317,6806,30140,4614,46639,66926,932,86600,6322,27847,233103,10541,39025,34887,3517,12972,26220,2031,66561,115015,48658,47596,12714,33845,3893,16165,35237,89983,14769,11962,147224,47018,29977,27979,5552,82338,86023,131368,1218,24853,237840,132193,15455,40873,3668,65351,53388,15229,59889,272245,47934,11858,34347,18038,90853,86981,300602,19343,114181,29362,84921,6095,106059,79472,38015,1206,48741,6208,8e4,21916,17423,6002,108083,24479,34931,56661,9511,26995,100694,163853,35997,81254,58321,18919,171890,86877,91341,74503,70477,53412,7027,59281,39892,131302,5864,15947,61301,67466,162369,47956,27874,35624,282324,21270,111847,102548,41482,30955,116737,28264,8592,55458,22301,75090,29821,30697,51709,3041,19208,8038,24634,30467,87509,126428,19389,18814,152686,20701,83474,45832,80891,105808,11378,153223,120770,98186,150633,49838,9141,12755,30962,5260,74490,21256,31678,65062,33326,289838,187831,20595,89768,2805,58535,10844,70085,12090,2451,138068,98544,24461,4511,6754,41684,28203,3383,65355,82833,30161,83924,234361,128424,28921,222594,33975,125491,34069,11508,67464,144226,41850,98703,34371,7901,21254,38398,65651,23549,53883,213340,123269,12028,71764,177701,28758,2623,68395,11549,15232,68603,9660,63116,36079,57093,31198,20475,48467,89984,35619,186847,107469,31389,43631,73867,41949,68841,114250,1605,30564,63403,17588,27680,99533,12641,70325,50428,73426,78379,11855,91651,72081,91720,60198,15743,12065,83398,140046,6761,46598,45900,5068,886,62448,148968,37347,19405,9680,15819,43496,63370,75667,163700,37639,3633,22774,34341,183131,134335,37200,23915,7054,14194,12970,26438,13350,285521,25594,8219,104410,91039,168804,138480,149734,15907,33818,61132,60082,4622,110187,56736,13551,73571,3945,73463,65498,17758,263266,17593,2710,27585,54469,38200,45367,63754,28881,3473,12791,98287,31895,65787,4463,94536,24951,36332,59901,28803,52130,86403,7668,181822,74831,18977,9850,177206,145485,109798,7292,31421,26280,77211,58511,12507,127004,11113,147,8729,56208,43066,79926,129937,31345,83947,39915,46146,98763,42566,1337,13192,18323,105163,80570,117753,16555,72883,11077,159438,40764,70933,83329,26066,12276,72059,21655,173836,126713,69454,153482,91585,70644,102558,110483,6764,127864,190133,3961,101798,20945,71138,82402,90884,69669,44753,923,16939,59700,164258,25969,27082,31399,43846,6306,246093,51342,6153,151581,202801,182731,56475,162188,89426,141356,14355,121815,27536,28023,65257,77523,106668,127314,24947,12790,38796,169698,23555,10725,44573,183083,42088,62716,43265,105958,32050,44067,50118,1668,3874,6243,318411,16599,1691,94999,52378,28671,216728,123258,2059,34969,69225,5913,136280,171443,141515,91662,22175,135282,80020,92270,1663,4808,4482,3495,34691,5226,109830,108512,17342,107488,11606,123190,100247,29666,146527,113014,15794,30894,13224,39585,243192,22351,9903,7836,47699,11078,25468,122291,48821,26780,122679,75521,81450,630,4895,92900,55074,74293,17441,3563,111657,103102,51613,12318,52370,36191,68245,34269,40445,41354,122901,168604,182500,62012,42557,11259,24428,115113,86345,12362,3909,78430,86852,134602,20459,47853,93879,22577,7659,3688,38555,13349,17381,56715,91639,12493,10895,92438,3142,37057,28928,2004,36427,32268,34222,209974,10432,67436,41989,173518,107930,27079,62729,30908,55558,5828,45031,14902,53546,8204,144263,60255,14520,88212,86582,109589,69356,8064,47449,8505,66558,16886,4844,52817,111260,215129,12941,91118,650,20770,6273,73089,40618,62790,2873,35002,14023,97208,19386,102646,36993,143736,135457,35385,113601,17893,32627,84439,100619,56016,6581,57264,172160,45452,111710,203627,70131,24100,322787,1996,35665,70078,22358,90922,83658,4097,63200,58499,14542,99153,52159,6615,12414,63415,31986,16823,1579,65405,137809,8841,16898,48082,259,33014,42375,12260,179850,73667,91389,98882,29532,17311,326251,41092,5928,20742,44964,48019,43505,9317,49265,6643,192712,48424,163487,19861,20113,70848,31928,105333,23685,78563,14638,54755,7158,24142,44018,20774,125255,20331,24280,10163,1285,2336,39851,4299,117269,46714,63816,87779,159624,11731,9971,990,137317,108831,50994,74554,162680,23640,131597,146962,170620,34829,91205,21184,1913,63616,18427,93136,156592,17519,67565,115882,138220,78622,88535,18115,2711,33554,109492,54298,971,24914,25863,36363,45715,27099,194995,14299,178181,111488,72395,322385,157719,130787,11897,81843,83999,11369,49280,118604,40922,61332,110343,53407,75639,40582,300440,54722,25637,13694,48248,48278,194521,56203,52779,48783,72627,10953,376,16733,280238,26351,230789,15132,25168,137270,3588,63704,73376,94031,74284,19443,159557,9697,39901,13351,119050,15406,146455,3460,29556,75195,37673,102524,92329,47289,98413,15311,100684,56345,7116,95480,11590,7200,167,23610,58426,17730,136656,27944,53151,2701,8824,103124,3017,90744,113588,53216,79736,65940,26931,498,29568,80540,143543,21292,1740,59268,16561,180816,42323,50174,40890,52866,10703,57169,4700,17191,4424,93511,49698,166650,26972,48631,165169,82879,69326,202970,4007,2376,231325,139592,22119,62851,37504,68816,58345,67398,186643,43331,277416,53749,15746,23102,17432,4793,151138,48822,54265,48203,198688,14305,54287,2291,18018,113378,123260,7180,97549,87027,120085,2920,76080,8190,102005,5641,64580,14955,59802,54028,58884,19367,81779,412567,85957,97053,103637,78871,29364,27637,141728,4767,30686,112738,130146,42745,12730,105040,14844,232,210944,36581,152317,135543,29744,3129,55647,58149,46319,27265,17499,28005,59948,7170,34138,5702,293047,110892,408,91760,218674,18469,46095,81403,14389,4610,35672,73060,11006,74848,104820,118143,190357,20043,105358,141735,5115,27093,45924,123073,52599,29433,9616,238350,78610,24851,58858,26769,31969,24613,18294,4982,32735,39639,143563,112073,202205,12567,4873,88601,44897,81503,101648,81362,34662,85277,17574,48173,21435,221188,40215,39576,80786,26544,64668,81841,10731,37733,247986,149188,127703,495,18382,54388,72446,43071,30974,198723,89608,41360,190,33045,8386,31658,19992,237838,119015,137622,50890,100913,6460,116233,267230,26621,104129,65114,14190,41542,14888,85962,23342,23041,26453,43725,71809,45186,4770,46452,53894,56616,221286,18973,9038,109299,55365,19366,26863,18808,60909,69353,41738,83463,12100,68561,72860,3980,13796,49340,12332,31311,27418,4255,53430,18976,45523,510,14224,30477,26581,4530,3651,101663,139840,22709,150861,31996,63923,120623,262522,3076,10528,2929,14672,130238,18087,9816,121894,100308,25085,55111,14565,18952,53293,2042,369988,23674,61789,133529,28783,108293,35477,47119,36448,71049,40015,33055,78598,198442,1833,159937,40654,77444,189245,113153,8621,18599,38553,35223,166072,2375,11659,21786,89523,6032,12116,63046,159398,18454,3678,32521,47626,11411,103527,38896,42946,15696,26370,10185,8413,37080,165583,4331,63555,14907,72220,50056,6623,62236,36565,49783,10049,17503,100581,55951,146244,24724,9626,17969,25524,109300,173965,99994,101056,46459,43647,53737,277968,8347,123521,74858,33829,44762,77574,877,81377,222525,123532,30602,43881,53145,2973,16284,81940,61281,127044,63620,9875,14756,114829,19032,9202,52759,119141,23928,120551,19607,3599,33401,76821,73233,117430,39968,36539,7071,5446,121735,194059,15206,45283,6706,15603,65615,1207,165723,92275,34773,104447,8396,32353,205240,164323,13600,60555,79205,25532,22907,33410,57480,107111,69630,32137,47832,70913,33161,20321,2371,117348,10714,86246,1625,11763,17900,268,78457,99175,97940,101092,86660,32221,14041,128504,125080,53744,124263,31017,13897,403,31859,21964,5633,111630,5547,77329,17961,18241,84995,25984,12983,67491,62168,47262,5241,297,51191,7351,8967,147212,82060,16821,782,11033,82431,62957,5026,43459,77963,203477,53528,6247,191852,87774,74164,215654,13467,1522,219964,28589,244104,16242,117821,67725,72570,156792,17186,15979,26990,44128,193014,35276,57125,16212,166451,68017,6905,77608,16364,53777,75921,76426,37975,26203,269296,64099,84122,12077,38533,830,4407,20139,963,43028,38902,42911,37503,83343,85045,16979,1165,60835,137387,58380,86990,110066,134540,56331,193845,81238,17922,163093,38744,110641,12502,56404,34862,26865,125964,12965,111648,25547,7771,27196,136980,9555,29551,107158,57885,18831,37705,35505,101742,13970,102109,62548,124657,23328,11124,89592,146376,248050,6241,22033,18337,80685,29898,11908,216623,67721,106162,146610,21377,15085,91552,42041,62560,122532,125336,102365,121537,142559,29693,223919,11515,110495,18776,22494,5895,185059,103592,229351,51220,100102,37027,257855,29359,54123,36066,106493,12244,79258,32002,432,56205,94836,90182,6726,14762,29391,48938,26864,38083,60364,3310,60192,14766,205567,57504,110760,22649,24666,46333,21517,3430,13135,28873,27052,158809,11597,20529,6695,23138,22960,37137,45574,6545,305877,43423,26153,24769,59844,14501,10430,134352,56169,13213,103432,49523,35181,13435,12408,129475,64620,230854,77390,51990,15653,83248,33466,44571,117828,51481,2187,10559,68019,18021,54895,48247,18354,33737,4554,108595,37288,39767,116707,9175,3726,108877,21616,83684,49862,1938,8543,276466,20134,108498,48770,102254,31914,131520,185291,100559,51890,209,19526,76471,50544,71814,99351,8172,198526,28816,20419,9109,98389,136777,76479,75596,30635,165417,48216,120220,25955,211071,39314,24308,32164,2559,146280,43403,9233,17947,90585,1786,86920,125662,2457,64741,32152,32918,122882,78538,44001,31723,56426,23375,103172,88177,145697,52506,49319,68016,31664,41488,18486,110400,7030,28241,986,109199,19900,42147,56864,65287,49183,7858,24e3,30453,840,16673,25907,68916,89927,6309,158335,36407,199737,130464,13137,59603,201778,195292,21015,42466,179062,172561,89492,11075,180407,31868,72493,20998,60217,9865,19530,39274,130266,54539,21623,12535,13505,40641,73375,4087,85633,2153,3117,70680,55788,92096,47509,98493,37490,271936,151475,3032,16171,96642,34106,78425,125761,19591,3366,19316,54508,24183,50786,194248,91528,33253,34622,108355,41741,705,3814,3883,108929,13203,67831,10142,59754,68208,29128,84820,56880,38794,24972,48571,40821,40476,18137,164254,24064,236309,79181,11282,395,39169,2013,51587,28551,9645,701,109513,115899,113566,12762,62045,58322,103726,41343,40866,244102,143816,2490,70346,40973,52618,15412,30720,104315,38917,42027,93676,17513,107418,20706,123890,13399,97727,24044,87962,65606,44250,98044,65276,74790,101473,19350,91570,1326,87790,172042,7577,100813,86896,85891,41512,108130,27794,14875,71431,12835,156250,58135,3759,22476,42176,115873,34686,56523,73643,108505,51491,20838,12721,32863,45700,29496,13700,34294,55360,29206,155942,123812,7706,163234,203,132720,49358,144431,8130,175788,35818,3270,76832,25710,54095,97274,28779,94621,74396,19092,128242,58067,20885,14670,93255,15107,63291,23654,126900,129421,59294,262659,9798,3251,67344,28600,44629,50672,29072,26999,31526,23183,49175,165843,175455,17282,175411,32022,45989,30298,90690,78118,83156,23749,35636,31317,7069,80381,94561,133756,14960,97404,6138,41065,78041,32843,16601,34123,9559,146529,123377,96395,54441,42012,84257,123541,10745,22139,106459,11720,150883,172651,154996,110538,4728,53447,25704,2009,71152,119354,21166,66604,1429,216162,8637,122250,63520,27180,29172,36124,276428,107787,77184,4680,14952,104903,24418,14793,51561,52931,8371,26342,48526,7118,92066,67280,40653,8847,34597,105438,14198,50163,61188,146286,50315,41205,170829,161496,585,197359,95056,1687,365794,91349,48507,5804,49263,5146,104902,96365,117343,132222,46084,96919,16875,8073,262381,79982,52663,13928,16056,153908,15145,109256,132308,18763,24904,167644,13618,40750,18686,147124,114709,150038,52849,2938,12568,48617,8778,5459,44202,44591,74914,17183,248689,13878,7822,80060,23116,194037,18487,2067,7798,43077,33678,244028,31320,74273,2794,19466,8218,36280,183997,48124,19416,29656,19280,98734,7715,18311,30701,133602,150307,126956,7378,2933,79903,13178,12593,86571,26604,92446,13574,44205,65699,427599,21118,8245,14407,27877,47936,33542,7916,26460,117762,21596,37818,2249,127359,209394,60044,47677,308089,36791,154971,31417,6998,150042,174360,12255,43009,29335,48739,3912,101398,53340,2580,146939,151295,45360,125275,15273,45383,27456,48761,23314,8750,60801,85823,104759,27894,123685,66968,39480,26917,55290,83305,2696,98390,57569,145853,340733,4919,20024,52268,30884,7413,203685,70989,112855,4129,50536,349518,68205,332641,159581,135361,236026,37563,176404,64899,6578,122033,63871,1850,85234,82089,66124,74145,121098,107351,12687,36881,117334,13136,14698,85933,93866,18047,32620,310,15094,46e3,88451,23632,36645,27940,87618,80520,58892,20976,27702,140090,96075,67841,103292,238964,87778,107338,17019,83427,67522,7302,8261,47570,116787,8730,80484,61772,174422,56005,131193,52875,14588,28471,59817,9586,15720,158155,51307,109734,15196,11025,59331,3884,52626,102602,84797,25158,27314,4437,20488,76214,189248,35023,114952,157376,2827,62439,102878,129749,36405,10329,109339,108633,36662,1254,13267,5470,87105,58004,15397,10434,159667,21864,52022,179464,3013,32147,31496,116832,18494,105502,129227,107267,50033,13481,9954,24267,22141,16257,116154,36185,950,115685,11305,176708,2048,178671,112573,287867,162328,497663,95170,50979,193861,50987,30368,136257,31830,46549,15119,169876,23788,17462,249887,57377,1949,35448,14791,43769,210091,3783,34612,282103,88380,245190,5457,20491,98908,11402,86899,117916,16028,162584,60644,320177,156096,31065,55876,22e3,77655,9992,23397,13757,317623,63978,215255,2443,17648,93231,27388,104529,93807,55505,140477,12046,112040,70887,40152,94365,112353,25063,114679,266061,71248,119555,15589,2244,617,14129,211431,70110,100652,7777,4383,85911,89221,21010,120615,58357,86405,37554,41647,18,15143,69662,60491,14714,186134,148344,42347,5410,168175,44535,42449,343894,129417,99682,20659,27272,140483,63455,222159,17536,13722,42637,62324,11976,114691,148109,2283,32057,182393,4295,147364,33705,2075,44303,30274,28331,63740,69740,29148,10346,44862,33716,73937,153333,12930,38784,247159,2515,41053,20256,83368,256189,54639,115240,5096,24661,175419,153552,26516,141,138176,63885,34115,47222,55709,2765,28479,38875,236608,12229,22921,77291,54426,45388,2860,57787,114579,295139,105782,17826,71066,19119,54364,69385,16568,12323,28057,33346,34919,124763,155533,101386,31644,8627,49001,303600,29868,63213,9103,77280,71333,9696,138789,37059,24823,5057,21352,32368,114208,56803,19424,10445,58514,8661,209508,26187,171838,10460,63454,14016,122504,41328,21329,46618,32493,38225,7855,31763,7945,29876,8734,6438,24205,97490,139977,130740,47323,33195,85390,57194,13813,60600,21313,96251,7699,27584,170521,139271,1363,4402,336738,129223,84983,69150,13147,3590,163929,207225,155260,55916,20288,4503,8398,98490,11773,27512,37113,84976,86558,28365,11756,116005,182148,13733,115313,47644,67208,85069,9347,14995,226141,14704,101835,41159,35314,13113,63526,214039,29978,50446,83339,17440,129441,72522,118641,97816,24907,73844,15717,118884,167255,96509,162793,30847,36849,51297,78974,77793,10427,1873,2972,9999,35074,28190,64297,146836,46298,60038,163007,108919,61219,2403,75022,127339,4233,110389,69022,9833,128097,88016,79390,222936,22570,94657,28462,56956,38803,81536,30474,152794,19566,16481,147408,74574,81895,20731,1918,1366,76367,187321,54494,24366,21690,61696,33283,107477,77499,31112,414383,74362,18463,218441,120929,59848,258629,201924,69269,454,19989,13054,59894,3623,58908,20681,35723,78523,102680,38988,184112,108087,50944,132704,52966,21699,18860,96349,201411,82697,85395,95658,5093,6427,177894,44191,32755,26961,155739,6249,31310,81030,26574,84311,120155,86730,113535,7424,48888,13516,45747,98098,20077,183995,81945,43210,26704,40420,75831,45648,11180,6855,57927,65528,124096,34851,2598,156633,107572,127352,38169,123845,60142,62722,105584,232364,23211,68120,1601,22169,89299,747,258039,80572,7258,152249,11862,101204,8834,121434,33761,19175,133142,46343,40178,48723,3589,41977,30210,38868,62257,10087,82658,87827,90646,16415,47552,351723,28298,72225,91146,272760,1701,11295,1652,109651,300747,51863,198800,29446,11794,32345,37538,22356,33102,37590,113544,37970,11478,179743,25454,103417,59905,221970,105196,145604,7817,164809,102360,16974,75840,255333,56902,6659,1954,645,59400,67769,7689,18675,5215,13793,20536,27852,3387,29523,259718,16860,94625,43143,29245,15848,233581,22685,63631,78557,22836,133302,84513,1348,51826,47129,98836,58284,1830,1749,94642,10933,6145,12506,10975,13879,103781,144434,10268,28409,32346,52968,121567,107374,77268,23686,35097,10501,155275,15303,47136,21102,168741,55332,90385,15996,84817,681,137803,25054,142275,6163,38175,8056,124296,240642,65621,4934,178205,16101,62803,60964,18230,100622,76465,44689,14545,9543,47514,16852,93380,28048,12047,107106,37575,101485,77047,57326,34819,96137,76916,6469,46264,115983,75768,87668,69942,13027,165,8373,114231,26434,52844,42799,182044,23580,146254,38081,43236,33883,146220,382894,14606,46035,36481,166621,35417,95382,2957,59384,60428,36358,66343,75378,22267,22950,83528,17577,56474,25285,4619,179691,75355,95836,53295,34588,171410,4487,14679,84208,44015,18562,109133,54101,11531,86052,174479,303157,28095,9953,35642,14564,39802,16145,77606,117406,53038,121117,53624,22062,1212,7632,127157,237292,189087,10478,127345,102515,181997,86752,87623,10966,121602,68783,68681,83042,114380,138349,191305,67176,50085,39016,1427,42384,1412,67118,122616,72389,25260,2237,13576,137346,19938,20304,2191,68759,5373,61364,238507,75814,23931,69565,38993,131741,38364,12528,87762,5679,129853,5310,186831,32653,90338,260176,389531,108118,26843,43985,50175,30563,25106,56965,18130,140428,4542,165503,117991,24219,229605,1819,129663,1240,3797,76093,18398,71339,51919,93043,27175,47060,216257,6483,35051,1217,16512,80798,129064,13225,69339,8548,237079,72298,2575,34280,51379,117910,55671,53345,247552,29486,39328,140821,34681,57045,60177,5004,90269,78522,2479,322607,48474,61296,13057,31558,4678,59271,6699,27044,31988,35944,12503,83480,4389,136508,3781,114121,70279,4488,155829,42214,2898,68191,75695,305850,45041,74344,106509,30087,17429,93292,12477,290,23080,114802,35714,18751,26554,105424,17775,2144,2412,100610,65192,113975,52975,180272,135050,129815,76238,106483,21440,63186,4260,46189,9711,28249,4169,23429,23390,8324,141585,63809,67668,38457,38063,39226,59972,1189,203916,62368,14403,16949,61767,85801,1739,40147,35049,76757,33124,62102,15780,103593,103009,53484,22952,67973,114645,6566,5245,50462,7601,8288,3513,194571,80276,1908,54592,5124,58571,2513,6800,273997,193904,1119,17991,117245,2508,129156,82366,26278,71465,63341,56943,39662,106116,94966,156875,9736,2204,122308,94418,27134,1280,24539,49022,45314,3764,50904,46424,30699,28087,293839,9400,33646,40165,822,147499,50263,116179,29085,11863,31314,5578,17797,5104,12454,1604,15342,219206,10232,67800,94261,25872,13565,90339,78971,75377,26649,41184,47695,11514,35369,20767,14227,41953,309396,148270,147938,33074,14453,27499,109019,39018,25738,240196,158931,52820,8612,95853,21524,137010,84901,70869,70021,116794,48404,38771,6732,1070,70990,187297,49140,5238,576,3564,253975,16027,16483,2811,37775,19034,25259,4053,2e3,70083,95774,19713,33431,92703,91314,42381,288770,48194,95985,3991,77418,13406,241328,245086,56533,35275,62725,9246,51924,70181,95331,16163,31410,79016,39312,120878,119371,275987,80124,27712,9186,220,23598,146167,85209,68238,282190,57048,31273,30555,80913,17594,75779,59160,135002,101219,189377,29225,96735,60126,62522,104e3,27620,86814,17240,147533,11001,5425,43682,410,49460,87270,69480,46315,59448,1816,76201,9431,11788,87960,29063,65539,47347,11678,33846,7008,196704,9895,6753,8633,120892,59970,572824,115934,6646,202559,892,48351,37611,251282,57823,67263,57750,26527,34485,90747,7685,88370,6144,64182,1709,41969,21458,62327,181657,49247,225330,122600,114574,107124,85361,111833,63243,71420,15655,191178,72430,18063,51425,54002,12364,53225,86557,18193,97580,41232,138398,67821,128724,8944,233212,101353,52099,42127,14006,120107,32789,32132,3498,18123,33758,56058,5779,128760,59888,98869,18445,84702,51911,13234,218379,20093,39031,8074,70195,20708,23462,24355,131384,60189,26390,10403,41060,7140,10781,49410,42261,87202,82566,41663,43105,60276,2768,5733,74176,28329,2297,145430,131632,83615,122915,105441,655,224102,5284,136426,67763,16294,188511,32538,61049,27893,3394,13951,159099,28542,17930,145360,9492,190122,32285,78855,26440,13570,58648,73908,4239,124561,2444,74172,53131,11468,10794,73566,11623,35343,64710,30481,4163,10328,38309,29901,10538,154377,76132,92405,24839,11679,3465,13449,11637,7824,2337,57754,1260,14458,41118,19878,38661,13416,159180,37074,163164,54137,28627,52134,184900,8520,40385,29546,30502,22386,66527,107458,6850,24022,47983,30603,35083,8934,304066,39500,9,28261,33026,77251,9374,44833,116312,34990,29236,63563,125639,135405,165398,159055,55690,88141,69643,236964,31983,25572,20436,36746,60896,31850,16179,11828,5888,3043,66368,9750,31167,7915,53111,36430,1333,64344,93659,20061,60596,180191,51630,6792,30244,43509,101058,22409,420,44210,109783,43223,27030,72477,72831,32679,29235,7675,47556,12258,39907,149412,84926,118247,24692,71717,105038,86009,45941,41189,89453,29856,52543,30627,226798,67303,59230,67415,34408,1367,99685,16867,128419,52147,4111,125381,117881,16173,44093,102224,31575,23234,24870,83790,127407,239098,3200,994,1255,100903,242275,117266,55116,38205,16140,29662,11307,40414,208793,123355,56470,4862,75600,30119,58218,70828,24075,26974,7802,192353,4851,5475,78720,66596,3409,28573,64396,30381,30690,59859,88256,5406,99945,103064,34463,37727,24238,86643,60088,4057,23741,5967,162904,38240,28356,93858,25510,122879,6897,3278,7057,11971,4400,35461,211413,21395,59615,39471,87233,55795,128426,3051,22470,41950,14705,3974,180108,80476,78442,204996,91987,15634,67610,139015,142373,35611,51134,10387,4353,153456,57749,181039,14183,68447,151532,21107,36452,20551,3186,46247,46383,129666,88736,140662,146243,2066,8360,7978,64818,106963,17896,47801,10723,114821,223295,74192,3293,3393,16987,74064,11277,91622,4270,29828,27951,387869,103235,1374,61988,120083,477,145892,128378,11779,211263,61354,18221,17869,46530,83061,108538,157981,90608,67199,95080,49064,195814,12302,66307,10348,231346,160732,112859,63633,146558,21271,31037,198802,47622,12862,95710,3910,77850,73961,85585,34752,61e3,4082,24595,103679,71107,8208,79568,150019,16615,24961,139857,32664,197366,4559,54735,32696,4126,162019,75698,13916,70108,159638,19834,9349,24675,175560,49643,18206,52459,27992,10809,88865,401975,133172,29e3,34558,30915,3658,25834,42430,36562,125265,18182,10155,40149,97082,208980,19575,60853,90529,66545,9600,789,46420,2317,88593,55595,98980,115302,5742,169155,1073,177901,3472,11189,63711,78643,65472,50459,127979,93,42202,67053,21720,157650,11145,141378,42033,22824,85705,79114,35584,15974,1510,54172,28562,12451,104226,19190,97151,73024,20948,5151,81741,21499,29006,84183,198074,54003,45120,170125,26240,35177,28389,64863,79974,60778,176915,232183,45342,2038,80253,41564,40703,32689,5430,100689,5366,23007,134279,14266,26712,73993,24934,64242,52113,102887,61801,46415,201049,54251,62133,122757,164883,30815,139966,2319,30842,766,13362,10287,134518,86111,81665,82440,28333,43019,18963,8804,161944,23439,102144,101145,80029,39052,248708,30350,117340,11878,128467,974,138625,63961,5237,74778,61834,67040,43814,13690,65947,33809,232476,115258,181745,28824,94013,9510,10246,93722,81976,7217,114383,3493,16014,69045,72692,12145,80981,9507,6692,1620,60820,330444,35474,33962,4797,7053,295463,46445,27026,12491,77988,49524,35675,90947,29114,166705,101385,133782,32704,6186,84595,176031,185623,45966,151302,63069,1699,107491,947,15458,74452,196212,6046,10498,12163,10239,35191,243951,9277,9090,29539,54460,22820,26514,112549,60372,51753,48756,21812,70861,260326,41,44222,10441,16961,48148,138771,216194,5914,52153,53400,212036,56519,26245,10117,45888,15294,138019,90913,26368,43842,42111,23348,6082,194845,161089,156206,51546,11647,30759,302912,262094,8635,78876,26535,35283,54183,31183,85484,147873,12989,5197,6356,72894,65347,20150,27370,73787,1493,45918,12366,190217,20724,13858,10981,67449,81213,7553,14115,72242,271517,11842,48310,88743,143726,22177,3290,243231,58452,62937,12592,1654,40066,33477,13751,9921,128442,15868,7106,75236,83773,10775,36938,10482,170465,17368,17469,161508,32752,98340,800,19824,264456,3901,87319,2867,26782,9630,113102,185815,24197,44584,86366,40224,3636,140916,31731,267731,9567,53678,72984,29389,27963,17106,50282,284911,60170,8322,12608,23374,89652,5268,39044,229766,8869,151350,31436,177342,12269,183212,120418,116270,2843,78888,69192,7865,184099,1086,129897,18383,70508,20242,18508,229924,124569,35749,50589,55626,9884,83115,40971,30671,18135,14452,38861,17844,201826,5549,26413,17189,13561,38539,10679,143331,3314,36785,171194,49685,187713,67506,4618,104039,17060,195080,50648,33159,19238,67559,134840,28599,157523,17130,38064,117398,94355,31918,13575,34538,40326,13997,3494,348283,62481,26862,3603,104426,244363,153709,112487,304612,199674,41239,35545,54869,293005,28223,26277,26899,4533,18518,15492,38587,80488,70485,160395,263,60162,11382,222152,4696,250751,51921,182609,10707,48463,46243,1227,49111,111564,46502,33342,56846,68541,63559,858,139927,16654,229375,76759,26478,33205,95828,23399,92945,2637,35630,28470,143992,50214,14174,21456,166191,65665,1711,21594,78019,97599,111701,36,147151,110246,189022,43021,30397,40757,131935,42065,73335,48039,26596,28984,15102,2361,7421,202167,69744,43766,52826,3642,83304,33873,75140,63169,192389,36551,92748,13039,123959,233220,21738,84447,77230,20228,187852,19095,25799,92136,108774,29237,53947,2299,118106,2687,8830,42331,202924,33667,2023,73763,30704,19363,19779,16737,35629,48081,24068,101013,162338,291912,13749,24745,328289,167679,70086,48299,23306,16732,17801,43322,54589,3586,63653,43624,53474,925,109177,251316,43805,13082,19511,86565,142182,92461,17117,101033,103319,64589,4022,4351,235897,5352,82705,107142,46391,156084,5860,61365,10558,13045,7717,18357,33922,12590,33065,6928,46993,783,46937,67846,8952,26295,6107,119656,18799,17458,50747,4229,179559,112727,118080,20683,41464,125468,51560,49749,44231,7359,35339,62988,136487,67015,5208,29150,24956,105186,48858,6143,18097,6972,16404,73489,58742,97196,36357,164616,5834,32267,13746,147733,15113,132091,34127,106298,39729,106426,22294,9780,15602,36213,71502,42808,66802,599,60755,5851,39120,67363,108623,126368,72770,91263,32486,30596,151717,7951,52002,43103,11768,68942,40901,39344,24037,127500,116890,48403,16926,86750,17745,48648,159545,34460,58419,5634,114317,67865,31462,23352,24010,98185,125708,69686,68337,13610,26271,70691,2980,4768,27225,102402,75453,28106,8104,6931,1176,6274,6475,112635,22498,6176,238686,26832,28893,90319,14441,15682,15087,39517,45270,109134,104440,45965,47645,81772,7876,52683,87720,12898,4505,185665,2769,113401,15664,57592,105229,137381,97059,119268,6876,43309,33886,128363,35476,144249,67013,143587,83367,25703,91436,59347,53236,2289,16519,19844,46309,58558,99834,23313,218816,231303,36388,51333,183535,109792,139277,54306,90139,18235,8275,32710,37677,82464,86025,92204,88842,117723,37570,128723,234242,76350,73795,34896,148247,58424,11105,11744,45746,63372,17118,49772,199520,81902,38004,22911,33752,3125,1995,53792,4689,26909,108150,146062,69674,41811,161444,84855,8999,28561,16731,93937,3189,21967,24890,22943,1356,145300,51569,28802,517,118679,31703,40607,48098,108854,25003,10233,73969,177495,5248,24516,215347,146192,48712,60626,69188,40735,5866,586,101541,6509,47590,52129,5969,222045,110933,25733,24223,65339,62812,2414,155418,35819,16022,78423,43138,20995,128255,240673,46745,236093,72176,57085,97841,61248,107,36068,193177,105427,55726,215229,20446,47228,100420,87091,14429,121708,23605,21157,187721,21880,2997,203976,99166,95068,25877,7724,98925,83401,4829,13182,18229,13718,239662,38653,116505,153497,30589,89029,38962,181302,43853,78872,180301,4786,248240,7401,106136,112590,77745,19731,60880,77789,125748,135487,5975,48627,34084,12419,215770,47557,254582,10364,106495,21856,67539,88981,38805,21428,48732,42316,12149,16078,52808,25327,51322,33850,51147,12253,122354,46077,56483,254553,115417,81834,150991,94662,86668,7381,12841,100650,18218,15741,22372,68294,50705,15535,84660,61887,22553,72299,31361,24824,17743,46820,64288,31582,77006,111674,116384,30760,80920,86149,77192,51979,79691,60342,122805,103800,240873,160744,233114,78962,54920,8608,3484,316104,72548,24337,5088,230040,21926,10172,36838,26,86221,83458,102176,12062,17571,41929,41170,28428,68239,41750,103930,2634,18313,53019,34825,97837,63115,24606,73157,152474,14715,91439,37033,109806,140259,30668,174760,380,135597,95673,136073,65073,134249,13829,17279,122305,4420,46444,10237,64848,203623,70728,10349,182885,65075,24519,25783,40318,34139,22222,63394,55266,102764,41422,20126,65100,90408,53640,35128,48932,11192,38935,96839,34782,39492,19396,41332,6250,5511,19492,51304,25936,104466,54099,73771,86115,5080,7669,30891,111700,13931,25276,72289,135447,14820,258641,25265,31005,281179,75286,393,95359,14623,13584,6680,101227,80173,44933,76666,54542,13244,39348,458,25379,109451,134348,81143,6959,65554,12027,51311,8716,57589,140731,28467,23316,17272,30458,25980,55229,77197,83798,28302,114784,7428,34548,26241,14712,39336,103304,18928,54080,12870,334,87722,15208,16895,142098,114262,39820,83913,57817,28682,7721,14900,108672,11250,62246,42849,415188,1724,26555,24549,25505,26443,107450,145899,61035,43528,6901,60726,65906,267741,21338,147590,42079,18924,73017,135236,15393,5206,4026,84185,1531,5988,113890,82647,303391,7386,69844,71611,189865,76523,31877,13315,19314,198575,32821,1928,67641,25913,104475,103489,3297,70391,18406,15446,113347,19295,93790,27856,1792,167471,116449,8541,4408,41757,63233,25765,86680,64501,27034,24816,34975,6079,4486,49693,36229,16917,21581,62426,27862,11612,54284,35702,194034,355,24277,48262,87411,70504,310164,118018,12516,47559,43502,57433,107139,9290,66533,80863,14634,34312,91725,28606,21342,67241,72355,43244,375789,37402,174015,105070,8342,44167,67494,1890,16365,11723,271002,1865,47918,8350,45564,27742,25110,125803,8553,49504,81925,62211,4534,15491,19011,80373,206920,667,102405,128623,245524,5553,113309,192739,65766,19567,22832,261958,29679,21293,71134,20962,105123,24721,860,21752,33448,18372,157167,94822,35770,173224,232737,75729,28937,46828,28062,25453,5207,140366,36665,30652,6169,67920,150458,92040,23186,184604,92330,20891,176492,49427,27828,38305,42495,143982,49560,25503,90043,29747,65328,47830,12932,11068,77721,9003,25213,94205,140426,46090,89945,138173,192691,33329,112232,129905,35709,27514,1841,19957,31411,127476,53572,17497,173549,55063,175135,19841,69314,5192,237921,117660,150697,4060,273045,50414,98940,65348,153665,164423,58804,156695,48994,213928,86036,28608,8355,39574,34540,16927,135680,18374,151587,10830,53805,16878,16623,4282,48030,8537,14986,46102,13062,72897,72,33050,108227,39451,45935,651,113320,40535,95176,57450,48843,5003,19019,10407,211163,3848,1068,4988,32091,30095,41692,15099,43602,107434,50744,7627,171349,16313,150832,352665,207750,33937,38256,51091,156e3,87889,90663,84175,24908,114900,50365,31494,83829,5398,169342,47521,54818,18935,8356,43094,41212,174536,10082,92550,6678,60614,23355,69721,14796,34149,128830,58187,3179,208,40325,28399,225029,401412,51150,31580,207268,6657,10993,69818,64282,289845,23308,12961,38447,6681,52944,31855,2572,47646,120728,179148,37240,45196,218274,4816,3695,21961,50084,35209,18073,51452,27004,6100,33941,1377,84831,171214,85,141510,9078,99227,32610,6417,11718,49868,65579,87902,73018,49062,46280,61742,21512,40862,107733,15941,29168,157765,144919,14487,5767,158014,140070,7241,573,71584,16921,223566,40331,179473,35081,47926,140885,41508,52104,59180,42310,32811,29048,123517,102413,80208,10104,14746,12649,153641,126022,37965,113017,4171,83,142592,2809,6362,50416,71323,116894,260776,16204,1524,5760,30351,12658,20703,54403,36083,45408,74772,4946,14485,50759,111222,10890,2195,167147,92962,130534,16283,177256,35016,15472,210156,151187,73922,117691,43250,52051,37392,24811,24358,30830,5775,818,21969,1476,127322,151783,58392,31021,106913,65215,89407,90802,28531,11690,20234,95249,44602,37256,18707,11928,5161,4410,26571,51903,49768,22008,25252,65780,209499,68769,203726,13249,137363,48845,86823,6658,5674,31881,1083,1823,108676,34518,166752,13791,14287,91576,91429,8665,11529,26401,16191,91972,30964,5254,28486,54697,79613,66520,18447,22870,45203,194466,22822,51703,12278,76716,44595,73455,33546,12235,144843,36154,51247,11116,33040,3180,225753,60864,1972,28469,12891,28879,10338,144157,56294,353058,38302,41447,87532,110616,27065,168438,6557,1213,50804,144643,24817,2390,136531,38174,247513,16190,4059,122791,131994,137430,39506,57650,16305,5188,54309,106128,20628,88071,67394,395446,250285,66176,91254,1399,114196,43915,60230,44853,27206,106353,43013,18733,345105,226453,51202,16607,57106,117175,35492,10476,89598,127439,15187,39624,13688,61570,10615,31111,59370,6238,175252,32143,224492,41388,95408,34384,148238,78307,38959,9340,160091,61443,15737,11216,41244,170,38299,102443,113097,26382,14027,33707,3957,76300,66160,19431,18900,6952,1717,108656,82206,188021,257335,27295,43999,41210,31777,46956,57457,12657,11489,15697,48060,204748,53583,82422,284790,30503,137341,8120,19615,220311,15991,10217,63424,9808,67431,70976,98221,4491,15177,28535,144789,751,13230,2394,1504,33977,132104,30316,22230,931,97193,185240,24826,22687,174322,15307,22988,1390,188745,180325,29580,59068,74903,18994,29195,79,15436,7622,38462,11566,138710,44828,45774,37768,99236,68137,84083,19282,22698,17134,74807,126662,173497,46248,16938,119735,3212,28292,213652,49013,9975,32180,45660,86250,4801,68788,95490,77482,113751,11994,44624,94452,46839,128497,100316,5798,58588,73184,202987,65417,37790,88524,1606,43156,97964,105717,34947,11203,100060,37742,130074,93653,107799,94311,196106,41347,8035,10780,16390,27883,118236,167395,1979,25006,19375,31628,18916,144723,78502,114047,103107,86492,107686,5844,20934,206963,23556,22591,16562,146333,20167,10471,117434,33085,2863,9740,36669,41849,37271,22790,18209,28979,8231,12952,54408,21731,25130,45208,55748,138120,75826,414,29593,9925,292865,25999,683,123149,7036,92159,86055,61827,103680,23176,54918,58466,57578,13305,5709,86479,16697,31064,17660,200919,10770,49793,33423,32370,52047,16488,62555,6459,8426,83493,7763,59725,82812,18628,67760,79405,68557,9612,7673,28102,56517,69620,171797,32458,29541,15870,81109,32080,207644,71495,21202,11039,91036,61230,2810,130800,32260,4613,60590,37112,75214,33979,126402,155062,30642,63875,12810,194463,82799,47664,16725,36685,43367,61099,449,172150,102867,21691,301838,36745,7130,18671,57316,34852,38034,54182,35578,65900,99486,19771,3456,2658,16914,99866,28390,28109,8262,21147,34353,20006,4228,137085,1675,203023,283196,198286,214375,163329,290603,152574,40471,83506,30068,14730,23177,131539,34759,27668,32178,71896,104799,116305,85430,119262,42860,25160,8911,23428,49437,105322,6519,16203,6349,74711,1230,38045,8540,75165,44736,25909,51026,317034,4984,32281,91312,27060,44431,17817,45363,155937,239085,35697,59784,91993,29531,126740,213757,76560,167776,285273,24262,8237,65030,41160,74437,48804,118916,13159,37842,1031,75349,1478,11655,108777,23435,277425,101734,67469,70231,124711,43532,28514,65526,54956,1e3,21882,17728,25302,40952,52214,149632,1999,2111,3259,63362,89961,220561,39777,26335,9063,10572,12416,34551,34623,38604,24723,5947,15588,69927,66252,119177,69173,46629,28714,70715,212408,20521,406913,74380,11716,50659,50862,37009,88460,130101,7210,53853,538,65120,151950,55806,163748,52837,13153,21100,16674,64536,6091,138201,44837,58547,3723,163,2177,32288,85454,34033,8497,14282,25742,10535,10741,79559,117493,243787,49337,100718,79495,40139,42956,7551,55433,15421,31509,23034,45081,547,61176,53434,328001,8470,36263,30145,4519,74173,53935,11845,73774,60211,78025,3,4102,73782,109293,315332,48412,26683,13714,6865,20128,18490,104141,325,39470,171970,115860,15707,7268,73301,74336,31370,2368,111827,107757,136231,142844,97138,96638,84053,38691,23801,1588,10573,122098,77039,240,186135,146101,11996,18143,112963,46171,155836,348769,47795,121213,116266,132515,3344,144804,31286,99187,255838,129694,35894,48779,55235,148582,71967,65282,15174,13920,47080,6147,108242,157593,125025,7136,1286,28957,127956,28402,98813,20805,7532,109417,40610,5041,32958,15142,18408,108596,33543,50517,27748,80114,233434,91447,487,37094,100048,30541,43477,10639,89862,155868,37667,8726,60684,237903,73408,99589,12190,38739,97348,3914,13594,2680,149016,13907,30171,28343,23530,115225,61104,35821,147679,14337,4297,244282,24085,326976,56428,7851,21303,131620,71446,83253,68692,111870,5224,15813,38197,49026,45057,13660,3306,76345,40671,27905,91072,996,68527,62085,91351,122634,55109,168209,2024,27560,112707,17352,8306,167115,169921,166958,5031,46020,11844,67284,19130,76185,6920,32849,5450,14610,22451,21002,17392,31872,66682,84796,13709,40210,59898,12029,8719,53564,21462,91884,21647,88379,194428,12754,37797,132826,160016,22567,54383,53186,77611,31107,8339,4694,19185,90355,23597,17222,140675,28442,23668,55977,9128,61555,28774,155229,17658,9390,24379,69357,15752,127381,239631,62460,93181,55913,45133,140155,18676,25249,33164,29581,82837,67223,22362,29975,7317,52813,1943,29613,20012,207130,49617,49651,5636,15334,36313,29226,28084,95247,72072,19e3,224932,15811,114,32127,38097,37508,88507,37225,27359,91626,12193,69279,20608,11055,88156,92808,2152,57259,55275,72789,24475,104414,1708,9882,3818,48661,66897,1631,34806,227930,85815,87753,18321,250664,72733,25107,206797,50891,8082,196411,92596,96764,152823,65514,22819,387277,62176,51225,40329,15563,189,3659,73670,64357,51793,275136,33482,86653,74615,67058,11318,125720,15388,22388,8267,1730,102663,170910,40784,7144,85373,13040,7088,94309,583,44224,140424,77439,18496,164026,36578,4722,9151,5824,63365,26510,35199,40500,79277,32495,44614,35233,9566,203293,152144,7097,2330,183480,98629,13423,330887,44130,68600,30939,97829,31012,345465,56747,94879,4939,160027,149761,99423,46099,32251,15332,8761,96094,128555,5763,235318,222223,55729,30241,55420,201746,3987,81382,8259,49325,23287,7719,24633,251100,92311,18591,110533,64759,170260,393860,7175,21144,132887,3593,75346,101277,91109,16387,259187,11627,57459,173829,44694,55780,49797,89192,120443,62622,3904,14814,23887,1027,112258,64955,99800,11132,66353,36202,48624,18158,88481,96882,43059,11040,2455,7077,21651,181159,99126,100434,61388,68186,19161,110468,120052,8819,55324,41494,7014,37689,3618,87729,92615,207943,9823,128657,12587,15857,6379,67628,51216,71775,157617,63244,1503,3864,218754,110864,5769,21492,7243,1192,87921,85529,31512,18537,42698,35350,73510,84474,34301,8991,21013,35034,566,38832,19838,35586,37216,39413,55006,12178,59742,856,84563,6900,25632,17437,49786,30723,13847,70845,4044,7843,23944,235976,55530,48942,6518,20939,73769,192653,52936,95207,23895,132542,142982,22632,87452,48042,54018,178468,10728,26230,23559,363,81269,142012,5718,346258,31456,84333,246476,51018,66692,101804,120570,39962,30373,70593,2864,60541,19425,54209,104092,7201,31545,48018,25865,15442,46257,40443,8328,6451,111782,47527,97754,33046,470,245116,31095,39,91934,87208,73470,36708,36521,12801,70624,36272,8892,79768,12427,55454,103756,5908,52390,62962,22720,141138,94634,41689,128402,126390,6628,106394,35527,134394,82727,254651,194502,148064,89549,3202,28359,957,21954,27906,49840,142747,8307,24206,48978,1186,71728,133038,71474,91306,6333,110959,74600,70387,18983,62609,56057,22970,1147,135850,1321,28834,3578,59715,102227,32827,81415,99952,55636,257598,390,22702,35701,85872,402916,39216,189795,14929,19467,10112,144422,61514,5279,63421,134686,41436,8424,51925,10598,132295,124416,4604,194739,210929,57866,31829,51626,50007,9976,91878,61906,56168,81906,60918,61859,40017,23059,16887,40927,62064,12785,32893,32913,21782,93965,20169,44387,79084,38463,11457,93950,27127,157050,2697,337088,5116,54128,48255,33279,8821,27352,25515,124022,65710,28906,38557,33390,1722,104435,72215,38551,12094,30978,25113,6671,37355,175109,42862,98024,65406,221276,59624,118012,64637,78760,86697,21426,1639,40350,12584,67193,84144,31396,7863,143011,69629,63112,9454,28666,65798,46372,134721,6314,51402,30837,151922,2847,38676,38008,92823,136245,17540,5504,109295,205242,37606,5211,214892,1586,20670,208711,137743,19328,40652,16995,20023,14657,154919,34422,12996,13918,38221,47690,16398,2959,37680,89122,6721,198469,91876,172043,83898,101992,26084,94570,3635,76958,22853,76497,38266,176590,168403,44464,142840,79180,184594,1984,41806,83147,11985,6546,366068,59732,24533,271505,8736,39084,222992,93429,28962,58985,86665,8432,30028,14548,32439,54424,165029,55175,27458,69046,121277,46168,33732,20661,24581,135574,123110,37556,79260,72611,16957,12939,46162,58238,44907,72936,253758,41324,32518,96480,11949,124438,65280,43256,34107,53533,43531,37037,28366,45970,32741,173438,6121,194202,62969,26355,30314,58370,28455,1848,50519,82830,90393,21761,295490,10936,256940,133568,44050,20269,4089,27457,21610,219460,36743,14821,101388,52005,13124,30979,140816,167362,26054,18458,60789,34917,40447,26606,33422,9066,3452,83614,5761,20263,137238,25038,91310,101,52322,74548,42572,38084,214054,186568,31802,17665,30620,141936,37730,14420,4265,187218,49640,188208,51441,55388,96452,66659,40869,42039,60967,221027,19234,178581,29105,96050,9165,196118,157335,3738,40354,117436,2965,34136,59659,15570,50843,230035,31444,71260,43886,18316,5387,38500,168508,17406,32174,8828,103373,143806,90367,3560,18719,122310,16508,26719,2541,105429,6645,37998,73190,10591,235916,49737,87112,233941,53188,32193,79154,4544,52905,126477,7580,63501,57314,3216,31337,6541,103083,60846,49,9756,15481,1355,43840,14319,13743,27486,10222,73114,230718,418644,16706,6674,279748,23058,45273,295831,86306,2743,5535,88773,21829,35253,120938,31153,3169,16839,42847,8751,80974,33942,36867,35514,16485,26474,77775,56877,5391,48346,3882,108713,31403,27804,55248,26235,43821,136104,40118,175507,28034,203908,18732,1788,34030,106427,36958,54359,7251,44936,15356,69139,455,157915,22173,140291,50348,43275,82066,49621,54952,15216,36226,96695,66855,6936,1987,8227,196087,4631,68827,99004,47541,110265,17953,147605,110242,58520,31312,38724,329975,642,3155,34497,75937,6207,73843,6120,17249,51429,117746,3218,910,68961,319671,14938,29555,34700,1649,66673,72268,9655,76800,153087,6941,210168,27130,35398,1780,73242,3135,56689,19556,165307,8765,35967,121458,13333,70453,17350,117253,22265,13340,44265,39869,441,3742,135025,23581,33309,16543,17731,13291,157637,283005,21408,101360,63887,52312,83873,5338,233779,23759,186949,34531,177320,38069,156465,91004,19353,59852,68160,14891,1338,1072,29823,1950,28901,81407,313445,73038,84807,162348,240257,37162,138934,16111,58013,41253,102951,16457,96056,19541,56402,67217,41638,94381,89674,29481,37456,80815,151579,13937,13683,132537,19699,134545,67020,29816,222341,141235,427578,48868,129557,233342,23077,87871,16213,18728,16184,9469,37913,19680,2798,171356,178328,13216,50049,72690,71904,124644,55455,7504,29052,41036,266546,19899,30391,188755,8659,59469,16,104298,112943,53865,76203,138226,68857,139953,14125,107625,119795,173133,4398,50273,48808,54390,16466,122086,31835,67035,50971,48859,7508,46427,66477,73021,84615,39985,83076,46779,201569,53336,36443,60865,168164,143810,51393,25548,169307,32896,24485,38424,21837,29087,275813,51674,6714,64883,46169,187369,55186,76192,12852,12018,62134,31067,118303,16542,12125,10579,4928,26291,43854,7091,10946,253716,109062,39283,17261,113012,258512,47764,125126,32646,55892,80279,201623,149872,3192,385,1208,48750,5376,58738,22335,5427,82416,47811,32435,143086,38930,94128,59975,156037,37977,38224,62485,7698,50405,71027,16462,21559,136153,34131,107506,162069,63703,3101,215029,40407,4178,3774,9187,80019,17880,97926,67579,2600,18405,8351,47924,86638,70820,92206,86453,29610,42241,119200,3198,15466,67813,57863,35454,4779,99518,4649,104641,144269,33730,38073,65864,6838,109456,193298,154007,5623,45741,30846,182578,25573,157224,1543,58575,138703,146140,44971,49356,18275,59064,20300,13122,11848,24453,11973,9797,86843,2919,25530,49210,1130,161220,76788,75373,85604,34926,36014,17777,17255,51533,11676,92226,51845,119859,21525,5936,18507,28050,1140,31418,14857,34207,47859,10750,36382,32079,106909,59426,87757,38393,110042,15965,97104,33757,35344,97993,53979,33651,45407,41884,82515,173089,7177,58371,35365,47543,51927,35587,10670,23544,29306,84233,39976,76076,62097,9007,8668,28119,78281,120790,19835,143020,54968,18670,64959,20649,34469,42570,33001,136570,87796,120044,1106,58700,63951,127623,12805,83057,40212,31773,49850,7361,54336,347524,101314,23751,19569,48791,29174,49369,20467,7465,75842,38281,623,112457,60210,28849,51003,94720,6426,90047,85560,43761,3579,85105,34607,90410,118528,7224,42907,111163,18168,6960,161135,191298,5247,100584,127552,171568,20121,91173,12636,54615,20199,63730,98105,2396,40387,14438,125012,4765,33235,12865,45299,37728,82098,77872,114037,59253,19675,24838,398016,102561,11446,17069,57508,178277,65836,99941,26114,2585,271882,136866,50126,11027,155648,118367,14585,8910,123015,335383,40434,41016,53021,14439,87098,176860,201543,121888,2358,9286,5739,22666,54270,37884,169381,33984,93859,16124,89364,72207,51639,76366,99029,65812,2198,12147,174891,194289,6986,30252,88822,21284,11445,288337,160821,33034,100869,43852,25761,52882,1144,103809,1924,84458,86079,43411,13542,139276,18141,34978,41298,7276,26481,173800,33210,17951,142652,33616,33677,2210,19941,98568,2486,192414,80136,12058,235883,50963,249638,29572,27221,47034,6124,72107,63346,97620,158513,299699,40388,23235,37176,224244,198386,121323,67992,23827,63170,17838,106622,158590,26807,5345,23489,91891,55474,74834,37981,13058,5977,72552,34706,26828,145172,19904,21367,34043,960,77092,91381,4733,47446,7680,41697,5170,16960,14741,46101,13656,473,51842,37433,11103,11551,121951,13191,97536,165932,50397,51628,129028,9069,44885,6590,59195,47045,32940,225472,90345,21833,13303,29407,96615,141951,5198,6028,18395,7181,3861,14966,156358,167182,36529,55253,25942,173153,30959,27261,50691,150176,162201,38467,48462,80602,42163,118482,168,108756,26011,17166,54149,456538,22512,91374,13816,90358,131615,18132,226707,1824,28139,26860,42253,93877,77351,65575,8980,80574,22020,27948,40422,91324,76376,13528,39281,91685,82215,122541,144066,1983,193851,17283,26320,2739,194978,4790,26845,42627,61300,65815,174612,55133,4200,191130,79771,158321,52280,166796,221620,62461,11278,4067,88152,83409,31717,121367,13522,47325,37945,10406,174348,249321,154101,64912,29938,51775,17220,15776,166138,78890,84425,54121,42861,16368,24572,291647,10197,32073,22651,11677,97509,26952,35787,18424,41910,71614,94977,72318,41594,70024,275419,37702,60199,7335,39107,61315,18271,18394,33768,87884,104277,123724,7277,56288,71981,189803,49320,3352,6798,14240,8954,69220,94433,57372,28620,68863,193727,85575,42309,41667,67689,42081,22543,44824,12719,28540,114236,101553,27638,27296,4300,5353,4663,19379,94098,3758,95888,95144,80344,87320,28447,259518,12718,71391,152731,37063,24132,31911,104896,15672,103782,1521,4945,72541,23717,122632,15619,87175,206120,29428,189780,61416,28350,44457,972,1175,47233,198738,95789,41907,21953,97034,59341,22864,53713,16873,32971,20693,20954,31336,21477,16169,38370,16412,9019,3841,24599,21938,17085,6484,81198,76413,5849,72514,12320,65247,276175,37234,59796,52642,16312,57349,198507,94148,46134,18958,125552,1747,18725,151873,14901,5490,68287,29470,3689,64794,40814,26018,25692,54450,2703,88278,124886,173087,174e3,24159,179477,24276,46004,201876,209202,445,52876,31948,30206,157610,39180,18439,44124,50469,5774,96278,222758,200216,50290,45486,20435,46986,46276,140133,142326,15569,13363,47522,92583,2182,7135,16853,22998,30272,4952,63263,35623,39096,53789,44864,20053,110392,124213,4630,16087,28221,127787,25839,77481,44693,13464,113146,6983,27069,55717,50102,4760,7107,26186,66507,59145,36032,104182,71328,29425,64317,50781,47465,94298,69706,74899,22754,120756,25108,93077,56834,73286,39928,16218,41699,176763,7555,70819,50083,26895,23315,26014,16773,123079,41712,5719,31516,90427,158540,85051,183128,40864,27505,55392,9058,45224,96857,30901,136622,96557,56304,120061,11501,151448,5773,89743,7769,86069,2935,18471,41628,10114,33660,110170,49479,26745,92846,33221,26731,18795,87076,8550,2100,29972,120289,3077,72490,33784,2630,208722,50861,63483,79029,6419,39467,14302,45286,64207,9686,67513,44170,1050,77246,59266,17055,53801,7150,11111,42432,4278,94579,362117,36175,42902,41933,39002,98489,22913,74161,84773,57036,17556,162288,74485,178760,93867,73635,128860,50362,261,67455,80001,46080,35662,4368,25247,19230,74393,22588,1822,27682,235324,13798,85998,13194,235067,23514,71669,147632,23191,134748,214683,105101,1518,25489,247114,7380,54842,26922,3971,26361,20844,68642,170517,77339,123255,8963,77818,150998,48466,36806,2732,23261,11741,236162,18243,126216,28690,50546,16385,92760,197383,246558,201295,88255,67588,71687,176076,172653,169058,33906,63747,24835,157621,43338,30050,46152,132741,2770,51371,94835,6614,15112,11749,56936,1250,19027,399017,58036,100215,23388,55815,308768,124152,94803,9521,64186,8971,28,30427,62163,7616,103838,35079,29203,131235,7743,17389,10882,37420,61460,228512,85363,41581,131077,62822,119647,10130,54445,26925,19968,29016,24446,74028,24176,61448,67185,9254,8563,119129,9771,99184,37716,39514,10532,221512,258753,218630,55980,23394,32141,61924,66749,32411,3741,36475,26678,77010,44946,91203,128749,116953,20476,49625,53116,13735,102335,29376,51946,83407,67892,59212,34685,21083,1546,112982,32972,74397,1078,190545,16082,86140,58591,89611,101531,10061,105104,76319,20035,17551,52611,169061,190842,100780,23907,90413,115619,9675,34710,193435,49443,129734,11183,258877,16318,136182,126808,44635,27304,192375,2599,125648,47051,12091,23814,721,58800,40137,66726,97930,60877,74487,7942,54326,9841,41428,13762,8211,85383,6950,99177,79806,201786,296464,124087,13144,29741,41721,47634,55088,254286,106408,17041,99064,12942,64086,45233,14005,2612,55827,255,7984,13980,38574,12776,46654,73499,249951,2101,26676,25996,132326,116415,119062,50449,31033,23038,11589,179252,20007,14860,129270,21143,17796,144715,60106,70758,69842,34674,282133,44014,16774,57268,38528,24053,46373,201667,28327,471023,51889,102667,21193,114909,84132,69317,96723,67969,16134,68145,15058,28765,32035,2524,101089,98664,25045,76571,14957,86040,118506,262428,154764,81573,39681,283900,73287,127825,544,80448,52347,38512,175971,15180,45467,33086,46552,48894,81107,43213,36672,54025,76703,8053,7608,13299,56619,20752,238099,54164,105133,1444,32942,953,37564,8e3,66316,119463,106817,404,13667,149108,128597,31267,10269,49836,106150,1484,52330,76965,160486,171648,38456,31263,22424,37738,66245,67467,143369,60471,75610,20895,115528,86070,60854,40796,49347,18989,15030,11371,37578,15779,79867,10187,86462,46402,155626,93200,40229,7090,57547,108053,99598,11088,47505,41218,206017,2173,20988,30219,22919,80563,57566,42369,93141,41675,2407,182519,120495,27154,16702,29456,14349,7958,16688,117177,140375,42467,261919,74916,153569,10836,34742,49526,7621,105997,12212,2270,392377,7755,17959,25086,232152,138791,33847,13860,35316,5811,1344,71259,50452,207539,92635,50359,5821,33674,30255,2086,2587,96264,17543,42,6029,9580,43007,139248,82831,12917,29607,25786,51467,42137,85161,100698,31561,88989,121990,278500,3602,109344,37982,15279,116442,28936,30880,87894,58079,128661,126731,67392,28051,146885,4861,16216,97344,42827,147561,153948,22684,21335,47685,1853,43349,15185,59642,10229,25520,187921,108972,5579,98037,24945,6697,19193,63734,137934,75056,89740,19767,224268,56138,63643,151661,39313,70618,84031,89723,84074,13703,85626,35460,8867,64845,3439,57906,99776,63968,49270,81130,34356,16210,23547,36446,34090,140028,72439,2221,22163,57058,363492,113754,18913,95451,48663,54464,54037,176097,68425,3023,34906,29482,117389,341780,80431,58330,16753,92616,60907,94846,147486,4498,48646,7773,46801,7778,18946,464978,47558,33223,177444,7328,15626,63337,94700,11743,9351,255024,39098,16447,42647,96230,39769,58840,10068,63439,35800,65843,58823,413844,9156,51258,7434,61791,85018,6872,3692,28096,7121,33024,6009,75532,31997,192535,9661,3304,9547,14753,31987,25314,55689,15896,20430,39472,31340,99744,25398,115569,54883,28719,205423,23071,57855,64638,149867,25671,82403,37616,20668,39989,77996,74948,140555,175248,64810,36515,46595,4958,248773,24045,28728,136673,168704,20804,114833,100325,27135,21205,96151,153134,45992,7093,13992,76047,1980,19432,145001,75159,87462,17710,1013,45556,34297,144882,20648,26061,11319,129567,108555,18872,464580,33386,22717,65948,167189,5603,135042,79542,8801,202632,18114,91882,5973,5239,67315,4431,60916,47819,71693,32597,32606,18183,45072,80329,76385,24749,51305,40314,156514,14693,130345,13168,66214,18029,12858,34801,27628,14544,10823,40522,40185,33739,148694,23548,9923,61012,28859,17933,19442,34364,99849,164107,141167,30629,21054,6744,36491,8096,42474,41706,155060,30650,10600,163442,1143,96655,61390,52359,7559,51568,64256,203854,4467,22453,14504,436398,7878,6980,8293,63610,293747,16167,35763,19627,147603,15419,18032,110744,51346,33681,54571,40472,48615,39073,21604,13754,173027,92560,11083,47299,63062,11813,52007,29883,9734,139722,15953,1550,20651,13616,49306,16113,90089,92326,7584,30712,72424,164858,6831,152871,55746,197721,34167,196442,6022,112107,55215,7538,123381,4920,43539,77165,8939,50392,34192,20225,79762,22505,58667,40770,29788,97180,82835,4568,8579,13273,363569,35898,49983,436,36598,3237,131691,62418,35591,8101,4073,379438,65218,76072,33887,2968,27573,212619,288680,68278,72851,150504,217896,6913,121339,22017,35340,51072,43616,75043,31437,10833,81487,4364,22968,41454,106687,85446,19863,109625,149241,524,141850,214404,54376,657,237023,9401,108137,53800,32474,49712,53334,126876,27337,45552,177696,8269,15036,12097,42240,2328,125374,119295,99715,2500,19624,39441,27220,102691,60957,94543,39101,18566,67362,13975,78230,25017,34017,239007,90027,39351,41681,35354,43822,1043,916,58587,141983,94818,38799,75459,41114,67432,16195,36606,59568,22272,126769,31424,68659,12287,134302,257977,5756,207285,95637,47248,117689,19583,77451,22373,12200,54993,117118,34244,29386,34562,53819,71267,64172,77665,49368,7716,59301,25749,45426,194789,17297,2650,1766,32501,45198,20403,20984,6600,14171,94604,19037,5402,29896,9938,59935,109708,88081,145182,44844,39167,352626,164173,35374,45982,6122,154,73419,220487,53834,53601,17992,8609,229321,5610,68098,66815,71012,95069,140968,27396,8957,134489,24656,86659,56598,134852,17316,123838,255436,6613,41610,138033,81452,32023,32396,123687,63398,8693,29712,30407,19296,121188,3551,36099,20032,111948,56624,16547,27453,35916,15378,52039,56849,13489,22214,73177,53097,277349,2157,14029,187886,10260,141743,246460,91880,50869,3788,49486,133566,54950,33120,129337,53768,18333,9525,26902,312251,10297,9020,70759,16647,112432,59260,84609,9818,82766,73569,468,46001,75780,55028,52106,11498,43645,108069,17150,17753,29417,16705,31799,9606,289,122254,115975,8620,6133,255357,56908,14456,133464,43554,79224,11247,29630,160,12756,25464,65960,350428,62521,321796,100359,67358,35169,46172,113128,48988,88868,31094,33266,6847,60887,98188,49659,69117,92977,220228,13947,80181,35103,62170,97351,13475,2440,199768,19498,36597,46971,25234,67806,62881,84717,73648,181966,10488,94149,21550,26655,63436,48375,14405,165650,9621,24439,28043,42735,4490,29963,56674,45373,1934,262446,50855,67098,26898,5261,52696,40644,33900,9440,180286,87162,22940,19704,26936,69769,10254,101759,27406,12243,48e3,73926,113215,54935,5726,192787,4312,106216,9366,11550,52949,23457,212271,277152,133895,108374,6191,96477,29980,218916,58024,54696,40853,91124,65894,91170,65908,252552,6793,29212,15389,44516,122515,52617,35058,9017,103536,39510,49136,19242,130652,662077,74699,47024,31422,8517,73351,24399,13867,128360,4810,4434,61779,111983,61036,17798,110240,59722,102960,39688,10001,23803,23039,176498,56659,44814,134295,17188,77577,74466,226175,102472,154333,63900,111747,18062,41171,79669,32773,408933,42562,28931,30907,107388,43487,2946,240310,23938,24354,319,184983,7927,6488,1422,10790,68809,68209,64775,4361,202,17123,59634,51200,44391,18188,17843,2619,74278,3230,9540,47187,21702,36274,56894,43907,16310,34790,16866,6150,5561,13587,107545,108873,126867,86986,28640,33427,19017,5762,80637,17430,46903,2047,131055,25958,13558,5444,47152,13900,44563,122857,45348,70863,39593,54332,38068,33637,318,40310,143467,18502,24520,11377,62013,28942,27246,28269,83545,17999,59015,90707,30065,15161,34720,1263,37008,2012,6060,98575,92933,5721,299,199555,24578,29223,2985,743,115825,109523,136657,47454,26378,53586,3733,174945,93340,244456,5693,37386,28782,89767,27545,23573,18798,136425,34320,84778,20041,48453,38215,7477,71958,40621,8773,5874,187927,105965,51100,43533,18083,8443,10180,43597,2003,183999,69689,12216,129696,146188,62389,34044,68410,12765,43273,26949,266807,3345,34477,79197,5688,47539,213110,21634,22257,50092,32222,42346,39530,63668,98,134978,74022,5152,59088,174145,37220,9934,9545,118937,5724,87240,19875,15784,40143,23263,87513,181654,285152,37881,263241,4966,43934,10433,186657,6470,74416,225854,25908,142677,246262,32280,6192,75890,45546,143264,135305,29742,47013,77787,11732,126658,8763,37950,21806,57557,113464,89465,108995,164574,23894,22996,23169,15369,23117,17642,130607,40503,36239,280990,44666,9981,40427,147487,26869,168452,32886,32991,46798,240839,15111,70502,65697,88548,44145,28701,48767,31139,206777,35659,181164,166262,14554,171445,31786,66523,76607,17956,6507,31279,90476,116611,167918,6560,1243,115324,80128,41867,55897,187323,37069,32596,189444,145931,13390,105530,65709,26805,6999,55714,41300,22915,68951,22138,21120,22264,10058,19945,33635,56123,99085,10032,5818,6016,46649,57476,35264,94413,112522,262288,93686,83038,14341,23204,28807,66084,77987,6101,126673,7133,38126,5923,122091,170240,97772,46874,215746,43948,41622,3272,55596,8332,146411,251315,13533,8561,81521,115449,48616,175175,2063,186556,3036,134537,75772,29728,82360,22973,186559,86348,89100,38388,82297,45610,2613,87082,9986,177812,57884,23591,47485,42543,33582,44713,74439,257444,252451,31825,35631,38540,33066,5147,13973,4343,51830,70378,22827,26448,95560,36896,241741,48067,203953,298860,61620,20450,3220,67272,6586,107662,100160,108684,6929,57226,4762,7457,1320,40404,77204,99309,62750,208653,59977,44e3,74315,34332,5819,172217,64904,114077,18147,84012,1791,98456,90930,21446,116669,103938,7422,85140,59713,5768,326211,16239,75411,13229,29398,10758,236107,1539,112472,95979,152154,151294,306,21196,38146,10700,6891,84282,109646,56492,40539,6589,119491,51354,30685,140209,136906,29622,73617,49553,70525,51671,166869,139616,74395,37439,49595,45678,11959,33211,86560,52434,9282,62690,112155,130810,5243,108261,99970,265613,72551,80049,6391,33365,90721,66737,69872,87011,1860,9032,112544,60905,37371,89015,140351,19076,850,373531,2802,36725,218795,72062,28990,16550,24614,7815,6187,26336,33373,32162,42791,73555,32062,23386,10244,56392,49442,27076,136262,12412,14883,1134,33675,97153,199281,15608,100152,74072,47942,254301,36451,16026,10687,65067,56708,254030,30290,50490,13864,57941,259331,35588,23485,43486,24869,21620,92971,22072,88645,1048,182050,13343,32452,14825,19509,3325,216938,45740,99716,189082,53740,78245,25609,24311,176777,47340,308354,40669,66085,14102,125339,9225,128709,97207,1271,200933,78439,113451,88975,18324,46521,11819,18570,141756,72512,170020,52754,63550,118515,103073,93330,32736,50499,14722,31600,68452,398867,29316,172786,18417,104924,2606,5670,84818,16288,67106,59580,82929,607401,291,85829,359,15897,35830,50696,65630,52672,22115,356968,29895,40837,231192,34024,38957,26722,406,23335,124952,72068,68804,13268,147101,164740,276569,162596,66943,11569,26654,66358,4777,23229,102127,5848,978,2921,59666,5371,28212,90108,42938,39320,2499,4271,108792,33510,125072,71653,65239,38250,66357,38577,13964,86251,35708,50755,36010,29448,12209,3844,38222,206337,100876,67827,137088,14167,252225,84163,195270,1306,5703,54198,779,46802,22028,51124,86759,70560,113164,35685,162145,45471,34561,422,2611,6464,47486,19223,38246,9191,18331,89942,243642,212364,15893,17518,22617,6409,30046,126182,59716,36560,104428,18846,26592,19458,50793,147333,30826,1388,27647,10922,14495,33545,19269,135828,39727,41601,46931,233379,49169,131130,182112,16276,82381,118209,142445,128310,19672,28740,82907,33436,3118,102206,28723,24819,41937,38854,5157,3881,111491,1142,9776,421673,152241,29309,14961,87854,6054,15424,3796,82656,54996,2108,55367,239450,154525,9643,118103,106041,64601,68549,48707,30266,25772,18740,9462,229669,91798,112152,191327,14493,72828,8175,66636,236474,25817,87351,129027,76653,20422,22983,71240,27846,44661,12399,46158,77704,53101,35032,11072,17300,109294,33638,24408,1895,11241,760,17584,82479,125877,63150,141075,34259,23274,81698,15732,43577,48340,91584,14688,16379,24481,150280,96420,262050,48635,43727,61819,56268,72003,88178,17281,79912,13218,122519,125295,166396,11811,2171,118930,67746,17636,178278,174656,95661,173039,83845,79689,17473,98555,127696,203415,54730,22925,232239,9309,12136,175026,20740,180188,10747,39816,314017,266131,10040,175732,112550,220651,31974,37393,888,23008,86799,4303,64905,148467,75337,251,3284,370102,50264,9835,5438,23655,4481,29851,329,12855,7162,64931,78141,12804,42372,296771,83547,18624,34874,86271,3360,48665,77735,88767,11463,63527,28889,22258,29140,194315,113924,25499,6406,31334,1845,4802,49184,43455,35469,127594,92970,61038,115005,38840,87761,106838,8811,20572,55637,11162,96721,132425,108925,2948,125457,36356,3502,75270,27622,127192,2561,123095,49394,61155,16897,110064,9699,89448,53356,19628,220310,21622,83036,9885,112214,6087,26713,17901,161912,91492,3440,68594,9266,92238,8087,6866,150194,72175,80701,13459,31836,43243,239700,95846,44749,50647,21945,230538,120612,132371,244604,5193,105637,34661,41341,68775,85393,1874,8771,33718,49672,77403,595452,99507,6490,58895,128742,7704,39239,73217,43816,62824,37804,199976,22361,80005,87514,94832,14089,4574,139975,59142,75523,100268,43906,53442,15152,2547,186002,17011,19513,204282,3343,60568,128318,119250,4298,51871,41336,71759,21921,45074,98169,145889,99427,11350,1237,5520,28799,7803,53702,21026,136352,38293,128690,12158,90132,44600,10184,26957,39459,126025,78904,82999,59373,39301,150198,120529,153042,20177,50089,14764,271571,30530,123161,38975,101562,22941,5648,124654,109243,69817,71675,49162,106884,21241,107795,30258,16572,188262,141456,7688,60718,8271,11044,32440,104608,103419,236109,93156,43293,128929,42107,67180,25201,115254,185488,130954,72813,167547,20537,39969,38432,22582,184022,1139,27199,5655,17767,97412,122606,209377,27070,35871,326617,188954,42680,73512,80911,22629,3011,95021,315242,157737,383,41821,41808,19335,27950,15674,25677,110950,35375,76835,59108,57370,35262,16569,160415,37706,78086,32041,49691,137143,9782,172080,50148,77917,6323,10110,69172,17711,21795,59511,76184,135114,31046,132319,59105,157578,20549,80778,57649,158421,65143,4575,72235,21899,10797,92745,34035,106079,80159,4508,78304,25350,75457,46458,32937,25623,47,8531,104751,84953,8138,36508,187199,66310,115274,13253,32461,38536,1916,42007,187160,35055,26325,84394,35963,94216,45590,97782];class zE{log;peerRouting;routingTable;refreshInterval;refreshQueryTimeout;commonPrefixLengthRefreshedAt;refreshTimeoutId;constructor(e,t){const{peerRouting:n,routingTable:r,refreshInterval:s,refreshQueryTimeout:i,logPrefix:o}=t;this.log=e.logger.forComponent(`${o}:routing-table:refresh`),this.peerRouting=n,this.routingTable=r,this.refreshInterval=s??3e5,this.refreshQueryTimeout=i??3e4,this.commonPrefixLengthRefreshedAt=[],this.refreshTable=this.refreshTable.bind(this)}async afterStart(){this.log(`refreshing routing table every ${this.refreshInterval}ms`),this.refreshTable(!0)}async stop(){null!=this.refreshTimeoutId&&clearTimeout(this.refreshTimeoutId)}refreshTable(e=!1){this.log("refreshing routing table");const t=this._maxCommonPrefix(),n=this._getTrackedCommonPrefixLengthsForRefresh(t);this.log(`max common prefix length ${t}`),this.log(`tracked CPLs [ ${n.map((e=>e.toISOString())).join(", ")} ]`),Promise.all(n.map((async(r,s)=>{try{if(await this._refreshCommonPrefixLength(s,r,e),0===this._numPeersForCpl(t)){const t=Math.min(2*(s+1),n.length-1);for(let n=s+1;n<t+1;n++)try{await this._refreshCommonPrefixLength(n,r,e)}catch(e){this.log.error(e)}}}catch(e){this.log.error(e)}}))).catch((e=>{this.log.error(e)})).then((()=>{this.refreshTimeoutId=setTimeout(this.refreshTable,this.refreshInterval),null!=this.refreshTimeoutId.unref&&this.refreshTimeoutId.unref()})).catch((e=>{this.log.error(e)}))}async _refreshCommonPrefixLength(e,t,n){if(!n&&t.getTime()>Date.now()-this.refreshInterval)return void this.log("not running refresh for cpl %s as time since last refresh not above interval",e);const r=await this._generateRandomPeerId(e);this.log("starting refreshing cpl %s with key %p (routing table size was %s)",e,r,this.routingTable.size);const s=AbortSignal.timeout(this.refreshQueryTimeout),i=await BE(this.peerRouting.getClosestPeers(r.toBytes(),{signal:s}));this.log(`found ${i} peers that were close to imaginary peer %p`,r),this.log("finished refreshing cpl %s with key %p (routing table size is now %s)",e,r,this.routingTable.size)}_getTrackedCommonPrefixLengthsForRefresh(e){e>15&&(e=15);const t=[];for(let n=0;n<=e;n++)t[n]=this.commonPrefixLengthRefreshedAt[n]??new Date;return t}async _generateRandomPeerId(e){if(null==this.routingTable.kb)throw new Error("Routing table not started");const t=Mo(2),n=(t[1]<<8)+t[0];return _s(await this._makePeerId(this.routingTable.kb.localPeer.kadId,n,e))}async _makePeerId(e,t,n){if(n>15)throw new Error("Cannot generate peer ID for common prefix length greater than 15");const r=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint16(0,!1),s=65535<<16-(n+1),i=HE[(r^32768>>n)&s|t&~s],o=new ArrayBuffer(34),a=new DataView(o,0,o.byteLength);return a.setUint8(0,gt.code),a.setUint8(1,32),a.setUint32(2,i,!1),new Uint8Array(a.buffer,a.byteOffset,a.byteLength)}_maxCommonPrefix(){let e=0;for(const t of this._prefixLengths())t>e&&(e=t);return e}_numPeersForCpl(e){let t=0;for(const n of this._prefixLengths())n===e&&t++;return t}*_prefixLengths(){if(null!=this.routingTable.kb)for(const{kadId:e}of this.routingTable.kb.toIterable()){const t=mm(this.routingTable.kb.localPeer.kadId,e);let n=0;for(const e of t){if(0!==e)break;n++}yield n}}}class WE{providers;log;constructor(e,t){this.log=e.logger.forComponent(`${t.logPrefix}:rpc:handlers:add-provider`),this.providers=t.providers}async handle(e,t){if(this.log("start"),null==t.key||0===t.key.length)throw new fn("Missing key","ERR_MISSING_KEY");let n;try{n=bt.decode(t.key)}catch(e){throw new fn("Invalid CID","ERR_INVALID_CID")}null!=t.providers&&0!==t.providers.length||this.log.error("no providers found in message"),await Promise.all(t.providers.map((async t=>{e.equals(t.id)?t.multiaddrs.length<1?this.log("no valid addresses for provider %p. Ignore",e):(this.log("received provider %p for %s (addrs %s)",e,n,t.multiaddrs.map((e=>cr(e).toString()))),await this.providers.addProvider(n,_s(t.id))):this.log("invalid provider peer %p from %p",t.id,e)})))}}class jE{peerRouting;peerInfoMapper;peerId;addressManager;log;constructor(e,t){const{peerRouting:n,logPrefix:r}=t;this.log=e.logger.forComponent(`${r}:rpc:handlers:find-node`),this.peerId=e.peerId,this.addressManager=e.addressManager,this.peerRouting=n,this.peerInfoMapper=t.peerInfoMapper}async handle(e,t){if(this.log("incoming request from %p for peers closer to %b",e,t.key),null==t.key)throw new fn("Invalid FIND_NODE message received - key was missing","ERR_INVALID_MESSAGE");const n=await this.peerRouting.getCloserPeersOffline(t.key,e);In(this.peerId.toBytes(),t.key)&&n.push({id:this.peerId,multiaddrs:this.addressManager.getAddresses().map((e=>e.decapsulateCode(Fn("p2p").code)))});const r={type:Xv.FIND_NODE,clusterLevel:t.clusterLevel,closer:n.map(this.peerInfoMapper).filter((({multiaddrs:e})=>e.length)).map((e=>({id:e.id.toBytes(),multiaddrs:e.multiaddrs.map((e=>e.bytes))}))),providers:[]};return 0===r.closer.length&&this.log("could not find any peers closer to %b than %p",t.key,e),r}}class GE{peerRouting;providers;peerStore;peerInfoMapper;log;constructor(e,t){const{peerRouting:n,providers:r,logPrefix:s}=t;this.log=e.logger.forComponent(`${s}:rpc:handlers:get-providers`),this.peerStore=e.peerStore,this.peerRouting=n,this.providers=r,this.peerInfoMapper=t.peerInfoMapper}async handle(e,t){if(null==t.key)throw new fn("Invalid GET_PROVIDERS message received - key was missing","ERR_INVALID_MESSAGE");let n;try{n=bt.decode(t.key)}catch(e){throw new fn("Invalid CID","ERR_INVALID_CID")}this.log("%p asking for providers for %s",e,n);const[r,s]=await Promise.all([this.providers.getProviders(n),this.peerRouting.getCloserPeersOffline(t.key,e)]),i=await this._getPeers(r),o=await this._getPeers(s.map((({id:e})=>e))),a={type:Xv.GET_PROVIDERS,key:t.key,clusterLevel:t.clusterLevel,closer:o.map(this.peerInfoMapper).filter((({multiaddrs:e})=>e.length)).map((e=>({id:e.id.toBytes(),multiaddrs:e.multiaddrs.map((e=>e.bytes))}))),providers:i.map(this.peerInfoMapper).filter((({multiaddrs:e})=>e.length)).map((e=>({id:e.id.toBytes(),multiaddrs:e.multiaddrs.map((e=>e.bytes))})))};return this.log("got %s providers %s closerPeers",a.providers.length,a.closer.length),a}async _getAddresses(e){return[]}async _getPeers(e){const t=[];for(const n of e)try{const e=await this.peerStore.get(n),r=this.peerInfoMapper({id:n,multiaddrs:e.addresses.map((({multiaddr:e})=>e))});r.multiaddrs.length>0&&t.push(r)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}return t}}class YE{peerStore;datastore;peerRouting;log;constructor(e,t){this.log=e.logger.forComponent(`${t.logPrefix}:rpc:handlers:get-value`),this.peerStore=e.peerStore,this.datastore=e.datastore,this.peerRouting=t.peerRouting}async handle(e,t){const n=t.key;if(this.log("%p asked for key %b",e,n),null==n||0===n.length)throw new fn("Invalid key","ERR_INVALID_KEY");const r={type:Xv.GET_VALUE,key:n,clusterLevel:t.clusterLevel,closer:[],providers:[]};if(function(e){return"/pk/"===Qt(e.subarray(0,4))}(n)){this.log("is public key");const e=function(e){return _s(e.subarray(4))}(n);let t;try{const n=await this.peerStore.get(e);if(null==n.id.publicKey)throw new fn("No public key found in key book","ERR_NOT_FOUND");t=n.id.publicKey}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}if(null!=t)return this.log("returning found public key"),r.record=new oE(n,t,new Date).serialize(),r}const[s,i]=await Promise.all([this._checkLocalDatastore(n),this.peerRouting.getCloserPeersOffline(n,e)]);return null!=s&&(this.log("had record for %b in local datastore",n),r.record=s.serialize()),i.length>0&&(this.log("had %s closer peers in routing table",i.length),r.closer=i.map((e=>({id:e.id.toBytes(),multiaddrs:e.multiaddrs.map((e=>e.bytes))})))),r}async _checkLocalDatastore(e){this.log("checkLocalDatastore looking for %b",e);const t=EE(e);let n;try{n=await this.datastore.get(t)}catch(e){if("ERR_NOT_FOUND"===e.code)return;throw e}const r=oE.deserialize(n);if(null==r)throw new fn("Invalid record","ERR_INVALID_RECORD");if(!(null==r.timeReceived||Date.now()-r.timeReceived.getTime()>Wv))return r;await this.datastore.delete(t)}}class QE{log;constructor(e,t){this.log=e.logger.forComponent(`${t.logPrefix}:rpc:handlers:ping`)}async handle(e,t){return this.log("ping from %p",e),t}}class ZE{components;validators;log;constructor(e,t){const{validators:n}=t;this.components=e,this.log=e.logger.forComponent(`${t.logPrefix}:rpc:handlers:put-value`),this.validators=n}async handle(e,t){const n=t.key;if(this.log("%p asked us to store value for key %b",e,n),null==t.record){const t=`Empty record from: ${e.toString()}`;throw this.log.error(t),new fn(t,"ERR_EMPTY_RECORD")}try{const e=oE.deserialize(t.record);await gE(this.validators,e),e.timeReceived=new Date;const r=EE(e.key);await this.components.datastore.put(r,e.serialize().subarray()),this.log("put record for %b into datastore under key %k",n,r)}catch(e){this.log("did not put record for key %b into datastore %o",n,e)}return t}}class JE{handlers;routingTable;log;constructor(e,t){const{providers:n,peerRouting:r,validators:s,logPrefix:i,peerInfoMapper:o}=t;this.log=e.logger.forComponent(`${i}:rpc`),this.routingTable=t.routingTable,this.handlers={[Xv.GET_VALUE.toString()]:new YE(e,{peerRouting:r,logPrefix:i}),[Xv.PUT_VALUE.toString()]:new ZE(e,{validators:s,logPrefix:i}),[Xv.FIND_NODE.toString()]:new jE(e,{peerRouting:r,logPrefix:i,peerInfoMapper:o}),[Xv.ADD_PROVIDER.toString()]:new WE(e,{providers:n,logPrefix:i}),[Xv.GET_PROVIDERS.toString()]:new GE(e,{peerRouting:r,providers:n,logPrefix:i,peerInfoMapper:o}),[Xv.PING.toString()]:new QE(e,{logPrefix:i})}}async handleMessage(e,t){try{await this.routingTable.add(e)}catch(e){this.log.error("Failed to update the kbucket store",e)}const n=this.handlers[t.type];if(null!=n)return n.handle(e,t);this.log.error(`no handler found for message type: ${t.type}`)}onIncomingStream(e){Promise.resolve().then((async()=>{const{stream:t,connection:n}=e,r=n.remotePeer;try{await this.routingTable.add(r)}catch(e){this.log.error(e)}const s=this;await gr(t,(e=>qr(e)),(async function*(e){for await(const t of e){const e=sE.decode(t);s.log("incoming %s from %p",e.type,r);const n=await s.handleMessage(r,e);null!=n&&(yield sE.encode(n))}}),(e=>Or(e)),t)})).catch((e=>{this.log.error(e)}))}}class XE extends wn{log;components;protocol;running;registrarId;constructor(e,t){super();const{protocol:n,logPrefix:r}=t;this.components=e,this.log=e.logger.forComponent(`${r}:topology-listener`),this.running=!1,this.protocol=n}isStarted(){return this.running}async start(){this.running||(this.running=!0,this.registrarId=await this.components.registrar.register(this.protocol,{onConnect:e=>{this.log("observed peer %p with protocol %s",e,this.protocol),this.dispatchEvent(new vn("peer",{detail:e}))}}))}async stop(){this.running=!1,null!=this.registrarId&&(this.components.registrar.unregister(this.registrarId),this.registrarId=void 0)}}class eS{dht;constructor(e){this.dht=e}async provide(e,t={}){await Nd(this.dht.provide(e,t))}async*findProviders(e,t={}){for await(const n of this.dht.findProviders(e,t))"PROVIDER"===n.name&&(yield*n.providers)}async put(e,t,n){await Nd(this.dht.put(e,t,n))}async get(e,t){for await(const n of this.dht.get(e,t))if("VALUE"===n.name)return n.value;throw new fn("Not found","ERR_NOT_FOUND")}}class tS{dht;constructor(e){this.dht=e}async findPeer(e,t={}){for await(const n of this.dht.findPeer(e,t))if("FINAL_PEER"===n.name)return n.peer;throw new fn("Not found","ERR_NOT_FOUND")}async*getClosestPeers(e,t={}){for await(const n of this.dht.getClosestPeers(e,t))"FINAL_PEER"===n.name&&(yield n.peer)}}class nS extends wn{protocol;routingTable;providers;network;peerRouting;components;log;running;kBucketSize;clientMode;validators;selectors;queryManager;contentFetching;contentRouting;routingTableRefresh;rpc;topologyListener;querySelf;maxInboundStreams;maxOutboundStreams;dhtContentRouting;dhtPeerRouting;peerInfoMapper;constructor(e,t){super();const{kBucketSize:n,clientMode:r,validators:s,selectors:i,querySelfInterval:o,protocol:a,logPrefix:c,pingTimeout:l,pingConcurrency:u,maxInboundStreams:h,maxOutboundStreams:d,providers:p}=t,f=c??"libp2p:kad-dht";this.running=!1,this.components=e,this.log=e.logger.forComponent(f),this.protocol=a??"/ipfs/kad/1.0.0",this.kBucketSize=n??20,this.clientMode=r??!0,this.maxInboundStreams=h??32,this.maxOutboundStreams=d??64,this.peerInfoMapper=t.peerInfoMapper??wE,this.routingTable=new qE(e,{kBucketSize:n,pingTimeout:l,pingConcurrency:u,protocol:this.protocol,logPrefix:f}),this.providers=new xE(e,p??{}),this.validators={...mE,...s},this.selectors={...fE,...i},this.network=new DE(e,{protocol:this.protocol,logPrefix:f});const g=lr();!0===t.allowQueryWithZeroPeers&&g.resolve(),this.queryManager=new LE(e,{disjointPaths:Math.ceil(this.kBucketSize/2),logPrefix:f,initialQuerySelfHasRun:g,routingTable:this.routingTable}),this.peerRouting=new CE(e,{routingTable:this.routingTable,network:this.network,validators:this.validators,queryManager:this.queryManager,logPrefix:f}),this.contentFetching=new _E(e,{validators:this.validators,selectors:this.selectors,peerRouting:this.peerRouting,queryManager:this.queryManager,network:this.network,logPrefix:f}),this.contentRouting=new RE(e,{network:this.network,peerRouting:this.peerRouting,queryManager:this.queryManager,routingTable:this.routingTable,providers:this.providers,logPrefix:f}),this.routingTableRefresh=new zE(e,{peerRouting:this.peerRouting,routingTable:this.routingTable,logPrefix:f}),this.rpc=new JE(e,{routingTable:this.routingTable,providers:this.providers,peerRouting:this.peerRouting,validators:this.validators,logPrefix:f,peerInfoMapper:this.peerInfoMapper}),this.topologyListener=new XE(e,{protocol:this.protocol,logPrefix:f}),this.querySelf=new UE(e,{peerRouting:this.peerRouting,interval:o,initialInterval:t.initialQuerySelfInterval,logPrefix:f,initialQuerySelfHasRun:g,routingTable:this.routingTable}),this.network.addEventListener("peer",(e=>{const t=e.detail;this.onPeerConnect(t).catch((e=>{this.log.error("could not add %p to routing table",t.id,e)})),this.dispatchEvent(new vn("peer",{detail:t}))})),this.topologyListener.addEventListener("peer",(e=>{const t=e.detail;Promise.resolve().then((async()=>{const e=await this.components.peerStore.get(t),n={id:t,multiaddrs:e.addresses.map((({multiaddr:e})=>e)),protocols:e.protocols};await this.onPeerConnect(n)})).catch((e=>{this.log.error("could not add %p to routing table",t,e)}))})),this.dhtPeerRouting=new tS(this),this.dhtContentRouting=new eS(this),null==t.clientMode&&e.events.addEventListener("self:peer:update",(e=>{this.log("received update of self-peer info"),Promise.resolve().then((async()=>{const t=e.detail.peer.addresses.some((({multiaddr:e})=>function(e){const t=e.stringTuples();for(const e of t)if(290===e[0])return!1;if(54===t[0][0]||55===t[0][0]||56===t[0][0])return!0;if(4===t[0][0]||41===t[0][0]){const e=Yd(`${t[0][1]}`);return null==e||!e}return!1}(e))),n=this.getMode();t&&"client"===n?await this.setMode("server"):"server"!==n||t||await this.setMode("client")})).catch((e=>{this.log.error("error setting dht server mode",e)}))}))}get[nn](){return this.dhtContentRouting}get[an](){return this.dhtPeerRouting}get[rn](){return this}async onPeerConnect(e){if(this.log("peer %p connected",e.id),0!==(e=this.peerInfoMapper(e)).multiaddrs.length)try{await this.routingTable.add(e.id)}catch(t){this.log.error("could not add %p to routing table",e.id,t)}else this.log("ignoring %p as there were no valid addresses in %s after filtering",e.id,e.multiaddrs.map((e=>e.toString())))}isStarted(){return this.running}getMode(){return this.clientMode?"client":"server"}async setMode(e){await this.components.registrar.unhandle(this.protocol),"client"===e?(this.log("enabling client mode"),this.clientMode=!0):(this.log("enabling server mode"),this.clientMode=!1,await this.components.registrar.handle(this.protocol,this.rpc.onIncomingStream.bind(this.rpc),{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams}))}async start(){this.running=!0,await this.setMode(this.clientMode?"client":"server"),await async function(...e){const t=[];for(const n of e)En(n)&&t.push(n);await Promise.all(t.map((async e=>{null!=e.beforeStart&&await e.beforeStart()}))),await Promise.all(t.map((async e=>{await e.start()}))),await Promise.all(t.map((async e=>{null!=e.afterStart&&await e.afterStart()})))}(this.querySelf,this.providers,this.queryManager,this.network,this.routingTable,this.topologyListener,this.routingTableRefresh)}async stop(){this.running=!1,await async function(...e){const t=[];for(const n of e)En(n)&&t.push(n);await Promise.all(t.map((async e=>{null!=e.beforeStop&&await e.beforeStop()}))),await Promise.all(t.map((async e=>{await e.stop()}))),await Promise.all(t.map((async e=>{null!=e.afterStop&&await e.afterStop()})))}(this.querySelf,this.providers,this.queryManager,this.network,this.routingTable,this.routingTableRefresh,this.topologyListener)}async*put(e,t,n={}){yield*this.contentFetching.put(e,t,n)}async*get(e,t={}){yield*this.contentFetching.get(e,t)}async*provide(e,t={}){yield*this.contentRouting.provide(e,this.components.addressManager.getAddresses(),t)}async*findProviders(e,t={}){yield*this.contentRouting.findProviders(e,t)}async*findPeer(e,t={}){yield*this.peerRouting.findPeer(e,t)}async*getClosestPeers(e,t={}){yield*this.peerRouting.getClosestPeers(e,t)}async refreshRoutingTable(){this.routingTableRefresh.refreshTable(!0)}}var rS;function sS(e){return t=>new nS(t,e)}!function(e){e[e.SEND_QUERY=0]="SEND_QUERY",e[e.PEER_RESPONSE=1]="PEER_RESPONSE",e[e.FINAL_PEER=2]="FINAL_PEER",e[e.QUERY_ERROR=3]="QUERY_ERROR",e[e.PROVIDER=4]="PROVIDER",e[e.VALUE=5]="VALUE",e[e.ADD_PEER=6]="ADD_PEER",e[e.DIAL_PEER=7]="DIAL_PEER"}(rS||(rS={}));const iS=ds("libp2p:simple-metrics");class oS{value=0;update(e){this.value=e}increment(e=1){this.value+=e}decrement(e=1){this.value-=e}reset(){this.value=0}timer(){const e=Date.now();return()=>{this.value=Date.now()-e}}}class aS{values={};update(e){Object.entries(e).forEach((([e,t])=>{this.values[e]=t}))}increment(e){Object.entries(e).forEach((([e,t])=>{this.values[e]=this.values[e]??0;const n="number"==typeof t?t:1;this.values[e]+=Number(n)}))}decrement(e){Object.entries(e).forEach((([e,t])=>{this.values[e]=this.values[e]??0;const n="number"==typeof t?t:1;this.values[e]-=Number(n)}))}reset(){this.values={}}timer(e){const t=Date.now();return()=>{this.values[e]=Date.now()-t}}}class cS{metrics=new Map;transferStats;started;interval;intervalMs;onMetrics;constructor(e,t){this.started=!1,this._emitMetrics=this._emitMetrics.bind(this),this.intervalMs=t.intervalMs??1e3,this.onMetrics=t.onMetrics,this.transferStats=new Map}isStarted(){return this.started}start(){this.started=!0,this.interval=setInterval(this._emitMetrics,this.intervalMs)}stop(){this.started=!1,clearInterval(this.interval)}_emitMetrics(){Promise.resolve().then((async()=>{const e={};for(const[t,n]of this.metrics.entries())e[t]=n instanceof oS?n.value:n instanceof aS?n.values:await n();this.onMetrics(structuredClone(e))})).catch((e=>{iS.error("could not invoke onMetrics callback",e)}))}_incrementValue(e,t){const n=this.transferStats.get(e)??0;this.transferStats.set(e,n+t)}_track(e,t){const n=this,r=e.sink;e.sink=async function(e){await r(cb(e,(e=>{n._incrementValue(`${t} sent`,e.byteLength)})))};const s=e.source;e.source=cb(s,(e=>{n._incrementValue(`${t} received`,e.byteLength)}))}trackMultiaddrConnection(e){this._track(e,"global")}trackProtocolStream(e,t){null!=e.protocol&&this._track(e,e.protocol)}registerMetric(e,t={}){if(null==e||""===e.trim())throw new Error("Metric name is required");if(null!=t?.calculate)return void this.metrics.set(e,t.calculate);const n=new oS;return this.metrics.set(e,n),n}registerMetricGroup(e,t={}){if(null==e||""===e.trim())throw new Error("Metric name is required");if(null!=t?.calculate)return void this.metrics.set(e,t.calculate);const n=new aS;return this.metrics.set(e,n),n}registerCounter(e,t={}){if(null==e||""===e.trim())throw new Error("Metric name is required");if(null!=t?.calculate)return void this.metrics.set(e,t.calculate);const n=new oS;return this.metrics.set(e,n),n}registerCounterGroup(e,t={}){if(null==e||""===e.trim())throw new Error("Metric name is required");if(null!=t?.calculate)return void this.metrics.set(e,t.calculate);const n=new aS;return this.metrics.set(e,n),n}}function lS(e){return t=>new cS(t,e)}
|
|
81
|
+
for(;;){const{done:e,value:c}=await t.read();if(e)break;if(a.length>=r.maxInboundStreams)i(`too many inbound streams open - ${a.length}/${r.maxInboundStreams}, closing new incoming stream`),c.writable.close().catch((e=>{i.error(`failed to close inbound stream that crossed our maxInboundStream limit: ${e.message}`)})),c.readable.cancel().catch((e=>{i.error(`failed to close inbound stream that crossed our maxInboundStream limit: ${e.message}`)}));else{const e=await Fm(c,String(s++),"inbound",a,o?.onStreamEnd,n);a.push(e),o?.onIncomingStream?.(e)}}}));const c={protocol:"webtransport",streams:a,newStream:async t=>{i("new outgoing stream",t);const r=await e.createBidirectionalStream(),c=await Fm(r,String(s++),o?.direction??"outbound",a,o?.onStreamEnd,n);return a.push(c),c},close:async()=>{i("closing webtransport muxer gracefully"),e.close()},abort:t=>{i("closing webtransport muxer with err:",t),e.close()},...Vm()};return c}}}const $m=Object.values(It).map((e=>e.decoder)).reduce(((e,t)=>e.or(t)));function qm(e){if(!kp.matches(e))throw new fn("Invalid multiaddr, was not a WebTransport address","ERR_INVALID_MULTIADDR");const t=e.stringTuples(),n=t.filter((([e,t])=>e===Fn("certhash").code)).map((([e,t])=>{return n=t??"",ut($m.decode(n));var n})),r=t.filter((([e,t])=>e===Fn("p2p").code)).map((([e,t])=>Is(t??"")))[0],s=e.toOptions();let i=s.host;return 6===s.family&&i?.includes(":")&&(i=`[${i}]`),{url:`https://${i}:${s.port}`,certhashes:n,remotePeer:r}}var Hm=WebTransport;class zm{log;components;config;metrics;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:webtransport"),this.components=e,this.config={...t,maxInboundStreams:t.maxInboundStreams??1e3,certificates:t.certificates??[]},null!=e.metrics&&(this.metrics={dialerEvents:e.metrics.registerCounterGroup("libp2p_webtransport_dialer_events_total",{label:"event",help:"Total count of WebTransport dialer events by type"})})}[Symbol.toStringTag]="@libp2p/webtransport";[hn]=!0;async dial(e,t){if(!0===t?.signal?.aborted)throw new pn;this.log("dialing %s",e);const n=this.components.peerId;if(void 0===n)throw new fn("Need a local peerid","ERR_INVALID_PARAMETERS");t=t??{};const{url:r,certhashes:s,remotePeer:i}=qm(e);let o,a,c=()=>{},l=!1,u=!1,h=!1;try{this.metrics?.dialerEvents.increment({pending:!0});const d=new Hm(`${r}/.well-known/libp2p-webtransport?type=noise`,{serverCertificateHashes:s.map((e=>({algorithm:"sha-256",value:e.digest})))});if(c=e=>{if(!l)try{this.metrics?.dialerEvents.increment({[e]:!0}),d.close()}catch(e){this.log.error("error closing wt session",e)}finally{null!=a&&(a.timeline.close=Date.now()),l=!0}},o=()=>{c(u?"noise_timeout":"ready_timeout")},t.signal?.addEventListener("abort",o,{once:!0}),this.log("wait for session to be ready"),await Promise.race([d.closed,d.ready]),this.log("session became ready"),u=!0,this.metrics?.dialerEvents.increment({ready:!0}),d.closed.catch((e=>{this.log.error("error on remote wt session close",e)})).finally((()=>{c("remote_close")})),h=await Ar(this.authenticateWebTransport(d,n,i,s),t.signal),!h)throw new fn("Failed to authenticate webtransport","ERR_AUTHENTICATION_FAILED");return this.metrics?.dialerEvents.increment({open:!0}),a={close:async()=>{this.log("closing webtransport"),c("close")},abort:e=>{this.log("aborting webtransport due to passed err",e),c("abort")},remoteAddr:e,timeline:{open:Date.now()},log:this.components.logger.forComponent("libp2p:webtransport:maconn"),...Vm()},await t.upgrader.upgradeOutbound(a,{skipEncryption:!0,muxerFactory:Km(d,d.incomingBidirectionalStreams.getReader(),this.components.logger,this.config),skipProtection:!0})}catch(e){throw this.log.error("caught wt session err",e),c(h?"upgrade_error":u?"noise_error":"ready_error"),e}finally{null!=o&&t.signal?.removeEventListener("abort",o)}}async authenticateWebTransport(e,t,n,r=[],s){if(!0===s?.aborted)throw new pn;const i=await e.createBidirectionalStream(),o=i.writable.getWriter(),a=i.readable.getReader(),c={source:async function*(){for(;;){const e=await a.read();if(null!=e.value&&(yield e.value),e.done)break}}(),sink:async e=>{for await(const t of e){await Ar(o.ready,s);const e=t instanceof Uint8Array?t:t.subarray();o.write(e).catch((e=>{this.log.error("could not write chunk during authentication of WebTransport stream",e)}))}}},l=Mm()(this.components),{remoteExtensions:u}=await l.secureOutbound(t,c,n);if(o.close().catch((e=>{this.log.error(`Failed to close authentication stream writer: ${e.message}`)})),a.cancel().catch((e=>{this.log.error(`Failed to close authentication stream reader: ${e.message}`)})),h=u?.webtransportCerthashes??[],(d=r.map((e=>e.bytes))).filter((e=>Boolean(h.find((t=>In(e,t)))))).length!==d.length)throw new Error("Our certhashes are not a subset of the remote's reported certhashes");var h,d;return!0}createListener(e){return function(e){throw new Error("Not implemented")}(this.components,(this.config.certificates,this.config.maxInboundStreams))}listenFilter(){return[]}dialFilter(e){return e.filter((e=>{if(!kp.exactMatch(e))return!1;const{url:t,certhashes:n}=qm(e);return null!=t&&n.length>0}))}}function Wm(e={}){return t=>new zm(t,e)}const jm=[Fn("tcp").code,Fn("dns").code,Fn("dnsaddr").code,Fn("dns4").code,Fn("dns6").code];function Gm(e){let t;try{t=Fn("sni").code}catch(e){return null}for(const[n,r]of e)if(n===t&&void 0!==r)return r;return null}function Ym(e){return e.some((([e,t])=>e===Fn("tls").code))}function Qm(e,t,n){const r=Jm[Fn(e).name];if(void 0===r)throw new Error(`Can't interpret protocol ${Fn(e).name}`);const s=r(t,n);return e===Fn("ip6").code?`[${s}]`:s}const Jm={ip4:(e,t)=>e,ip6:(e,t)=>0===t.length?e:`[${e}]`,tcp:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`tcp://${Qm(n[0],n[1]??"",t)}:${e}`},udp:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`udp://${Qm(n[0],n[1]??"",t)}:${e}`},dnsaddr:(e,t)=>e,dns4:(e,t)=>e,dns6:(e,t)=>e,dns:(e,t)=>e,ipfs:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${Qm(n[0],n[1]??"",t)}/ipfs/${e}`},p2p:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${Qm(n[0],n[1]??"",t)}/p2p/${e}`},http:(e,t)=>{const n=Ym(t),r=Gm(t);if(n&&null!==r)return`https://${r}`;const s=n?"https://":"http://",i=t.pop();if(void 0===i)throw new Error("Unexpected end of multiaddr");let o=Qm(i[0],i[1]??"",t);return o=o.replace("tcp://",""),`${s}${o}`},"http-path":(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${Qm(n[0],n[1]??"",t)}/${decodeURIComponent(e)}`},tls:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return Qm(n[0],n[1]??"",t)},sni:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return Qm(n[0],n[1]??"",t)},https:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");let r=Qm(n[0],n[1]??"",t);return r=r.replace("tcp://",""),`https://${r}`},ws:(e,t)=>{const n=Ym(t),r=Gm(t);if(n&&null!==r)return`wss://${r}`;const s=n?"wss://":"ws://",i=t.pop();if(void 0===i)throw new Error("Unexpected end of multiaddr");let o=Qm(i[0],i[1]??"",t);return o=o.replace("tcp://",""),`${s}${o}`},wss:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");let r=Qm(n[0],n[1]??"",t);return r=r.replace("tcp://",""),`wss://${r}`},"p2p-websocket-star":(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${Qm(n[0],n[1]??"",t)}/p2p-websocket-star`},"p2p-webrtc-star":(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${Qm(n[0],n[1]??"",t)}/p2p-webrtc-star`},"p2p-webrtc-direct":(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${Qm(n[0],n[1]??"",t)}/p2p-webrtc-direct`}};var Zm=async e=>{if(e.readyState>=2)throw new Error("socket closed");1!==e.readyState&&await new Promise(((t,n)=>{function r(){e.removeEventListener("open",s),e.removeEventListener("error",i)}function s(){r(),t()}function i(t){r(),n(t.error??new Error(`connect ECONNREFUSED ${e.url}`))}e.addEventListener("open",s),e.addEventListener("error",i)}))},Xm=(e,t)=>{(t=t??{}).closeOnEnd=!1!==t.closeOnEnd;return async n=>{for await(const t of n){try{await Zm(e)}catch(e){if("socket closed"===e.message)break;throw e}if(e.readyState===e.CLOSING||e.readyState===e.CLOSED)break;e.send(t)}null!=t.closeOnEnd&&e.readyState<=1&&await new Promise(((t,n)=>{e.addEventListener("close",(e=>{if(e.wasClean||1006===e.code)t();else{const t=Object.assign(new Error("ws error"),{event:e});n(t)}})),setTimeout((()=>{e.close()}))}))}},ey={},ty={};Object.defineProperty(ty,"__esModule",{value:!0});class ny{constructor(){this.pullQueue=[],this.pushQueue=[],this.eventHandlers={},this.isPaused=!1,this.isStopped=!1}push(e){if(this.isStopped)return;const t={value:e,done:!1};if(this.pullQueue.length){const e=this.pullQueue.shift();e&&e.resolve(t)}else this.pushQueue.push(Promise.resolve(t)),void 0!==this.highWaterMark&&this.pushQueue.length>=this.highWaterMark&&!this.isPaused&&(this.isPaused=!0,this.eventHandlers.highWater?this.eventHandlers.highWater():console&&console.warn(`EventIterator queue reached ${this.pushQueue.length} items`))}stop(){if(!this.isStopped){this.isStopped=!0,this.remove();for(const e of this.pullQueue)e.resolve({value:void 0,done:!0});this.pullQueue.length=0}}fail(e){if(!this.isStopped)if(this.isStopped=!0,this.remove(),this.pullQueue.length){for(const t of this.pullQueue)t.reject(e);this.pullQueue.length=0}else{const t=Promise.reject(e);t.catch((()=>{})),this.pushQueue.push(t)}}remove(){Promise.resolve().then((()=>{this.removeCallback&&this.removeCallback()}))}[Symbol.asyncIterator](){return{next:e=>{const t=this.pushQueue.shift();return t?(void 0!==this.lowWaterMark&&this.pushQueue.length<=this.lowWaterMark&&this.isPaused&&(this.isPaused=!1,this.eventHandlers.lowWater&&this.eventHandlers.lowWater()),t):this.isStopped?Promise.resolve({value:void 0,done:!0}):new Promise(((e,t)=>{this.pullQueue.push({resolve:e,reject:t})}))},return:()=>(this.isStopped=!0,this.pushQueue.length=0,this.remove(),Promise.resolve({value:void 0,done:!0}))}}}let ry=class{constructor(e,{highWaterMark:t=100,lowWaterMark:n=1}={}){const r=new ny;r.highWaterMark=t,r.lowWaterMark=n,r.removeCallback=e({push:e=>r.push(e),stop:()=>r.stop(),fail:e=>r.fail(e),on:(e,t)=>{r.eventHandlers[e]=t}})||(()=>{}),this[Symbol.asyncIterator]=()=>r[Symbol.asyncIterator](),Object.freeze(this)}};ty.EventIterator=ry,ty.default=ry,Object.defineProperty(ey,"__esModule",{value:!0});const sy=ty;var iy=ey.EventIterator=sy.EventIterator;function oy(e){return e instanceof ArrayBuffer||"ArrayBuffer"===e?.constructor?.name&&"number"==typeof e?.byteLength}ey.subscribe=function(e,t,n){return new sy.EventIterator((({push:n})=>(this.addEventListener(e,n,t),()=>this.removeEventListener(e,n,t))),n)},ey.default=sy.EventIterator;var ay=(e,t)=>{t=t??{};const n=(e=>{e.binaryType="arraybuffer";const t=async()=>{await new Promise(((t,n)=>{if(s)return void t();if(null!=r)return void n(r);const i=t=>{e.removeEventListener("open",o),e.removeEventListener("error",a),t()},o=()=>{i(t)},a=t=>{i((()=>{n(t.error??new Error(`connect ECONNREFUSED ${e.url}`))}))};e.addEventListener("open",o),e.addEventListener("error",a)}))},n=async function*(){const n=new iy((({push:t,stop:n,fail:r})=>{const s=e=>{let n=null;"string"==typeof e.data&&(n=kt(e.data)),oy(e.data)&&(n=new Uint8Array(e.data)),e.data instanceof Uint8Array&&(n=e.data),null!=n&&t(n)},i=e=>{r(e.error??new Error("Socket error"))};return e.addEventListener("message",s),e.addEventListener("error",i),e.addEventListener("close",n),()=>{e.removeEventListener("message",s),e.removeEventListener("error",i),e.removeEventListener("close",n)}}),{highWaterMark:1/0});await t();for await(const e of n)yield oy(e)?new Uint8Array(e):e}();let r,s=1===e.readyState;return e.addEventListener("open",(()=>{s=!0,r=null})),e.addEventListener("close",(()=>{s=!1,r=null})),e.addEventListener("error",(t=>{s||(r=t.error??new Error(`connect ECONNREFUSED ${e.url}`))})),Object.assign(n,{connected:t})})(e);let r=t.remoteAddress,s=t.remotePort;if(null!=e.url)try{const t=new URL(e.url);r=t.hostname,s=parseInt(t.port,10)}catch{}if(null==r||null==s)throw new Error("Remote connection did not have address and/or port");return{sink:Xm(e,t),source:n,connected:async()=>{await n.connected()},close:async()=>{e.readyState!==e.CONNECTING&&e.readyState!==e.OPEN||await new Promise((t=>{e.addEventListener("close",(()=>{t()})),e.close()}))},destroy:()=>{null!=e.terminate?e.terminate():e.close()},remoteAddress:r,remotePort:s,socket:e}},cy=WebSocket;const ly={"http:":"ws:","https:":"wss:"};function uy(e,t){t=t??{};const n=((e,t)=>{if(e.startsWith("//")&&(e=`${t?.protocol??"ws:"}${e}`),e.startsWith("/")&&null!=t){const n=t.protocol??"ws:",r=t.host,s=null!=t.port&&!0!==r?.endsWith(`:${t.port}`)?`:${t.port}`:"";e=`${n}//${r}${s}${e}`}const n=new URL(e);for(const[e,t]of Object.entries(ly))n.protocol===e&&(n.protocol=t);return n})(e,"undefined"==typeof window?void 0:window.location),r=new cy(n.toString(),t.websocket);return ay(r,t)}var hy=Br((function(){return"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0)}));const dy="object"==typeof window&&"object"==typeof document&&9===document.nodeType,py=hy(),fy=dy&&!py,gy=py&&!dy,my=py&&dy,yy=void 0!==globalThis.process&&void 0!==globalThis.process.release&&"node"===globalThis.process.release.name&&!py,wy="function"==typeof importScripts&&"undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope;void 0!==globalThis.process&&void 0!==globalThis.process.env&&globalThis.process.env.NODE_ENV;const by="undefined"!=typeof navigator&&"ReactNative"===navigator.product,vy=Qy("dns4"),Ey=Qy("dns6"),Sy=Qy("dnsaddr"),_y=Yy(Qy("dns"),Sy,vy,Ey),Iy=Yy(Qy("ip4"),Qy("ip6")),Ry=Yy(Gy(Iy,Qy("tcp")),Gy(_y,Qy("tcp"))),Ay=Gy(Iy,Qy("udp")),Ty=Gy(Ay,Qy("utp")),Dy=Gy(Ay,Qy("quic")),ky=Gy(Ay,Qy("quic-v1")),Py=Yy(Gy(Ry,Qy("ws")),Gy(_y,Qy("ws"))),Cy=Yy(Gy(Py,Qy("p2p")),Py),xy=Yy(Gy(Ry,Qy("wss")),Gy(_y,Qy("wss")),Gy(Ry,Qy("tls"),Qy("ws")),Gy(_y,Qy("tls"),Qy("ws"))),Ny=Yy(Gy(xy,Qy("p2p")),xy),My=Yy(Gy(Ry,Qy("http")),Gy(Iy,Qy("http")),Gy(_y,Qy("http"))),Oy=Yy(Gy(Ry,Qy("https")),Gy(Iy,Qy("https")),Gy(_y,Qy("https"))),Ly=Gy(Ay,Qy("webrtc-direct"),Qy("certhash")),By=Yy(Gy(Ly,Qy("p2p")),Ly),Uy=Gy(ky,Qy("webtransport"),Qy("certhash"),Qy("certhash")),Fy=Yy(Gy(Uy,Qy("p2p")),Uy),Vy=Yy(Gy(Cy,Qy("p2p-webrtc-star"),Qy("p2p")),Gy(Ny,Qy("p2p-webrtc-star"),Qy("p2p")),Gy(Cy,Qy("p2p-webrtc-star")),Gy(Ny,Qy("p2p-webrtc-star"))),Ky=Yy(Gy(My,Qy("p2p-webrtc-direct"),Qy("p2p")),Gy(Oy,Qy("p2p-webrtc-direct"),Qy("p2p")),Gy(My,Qy("p2p-webrtc-direct")),Gy(Oy,Qy("p2p-webrtc-direct"))),$y=Yy(Py,xy,My,Oy,Vy,Ky,Ry,Ty,Dy,_y,By,Fy),qy=Yy(Gy($y,Qy("p2p")),Vy,Ky,By,Fy,Qy("p2p")),Hy=Yy(Gy(qy,Qy("p2p-circuit"),qy),Gy(qy,Qy("p2p-circuit")),Gy(Qy("p2p-circuit"),qy),Gy($y,Qy("p2p-circuit")),Gy(Qy("p2p-circuit"),$y),Qy("p2p-circuit")),zy=()=>Yy(Gy(Hy,zy),Hy),Wy=zy();function jy(e){return function(t){let n;try{n=cr(t)}catch(e){return!1}const r=e(n.protoNames());return null!==r&&(!0===r||!1===r?r:0===r.length)}}function Gy(...e){function t(t){if(t.length<e.length)return null;let n=t;return e.some((e=>(n="function"==typeof e?e().partialMatch(t):e.partialMatch(t),Array.isArray(n)&&(t=n),null===n))),n}return{toString:function(){return"{ "+e.join(" ")+" }"},input:e,matches:jy(t),partialMatch:t}}function Yy(...e){function t(t){let n=null;return e.some((e=>{const r="function"==typeof e?e().partialMatch(t):e.partialMatch(t);return null!=r&&(n=r,!0)})),n}return{toString:function(){return"{ "+e.join(" ")+" }"},input:e,matches:jy(t),partialMatch:t}}function Qy(e){const t=e;return{toString:function(){return t},matches:function(e){let n;try{n=cr(e)}catch(e){return!1}const r=n.protoNames();return 1===r.length&&r[0]===t},partialMatch:function(e){return 0===e.length?null:e[0]===t?e.slice(1):null}}}class Jy{log;init;logger;constructor(e,t){this.log=e.logger.forComponent("libp2p:websockets"),this.logger=e.logger,this.init=t}[hn]=!0;[Symbol.toStringTag]="@libp2p/websockets";[Sn]=["@libp2p/transport"];async dial(e,t){this.log("dialing %s",e),t=t??{};const n=function(e,t,n){const r=n.logger.forComponent("libp2p:websockets:maconn"),s={log:r,async sink(t){try{await e.sink(async function*(){for await(const e of t)e instanceof Uint8Array?yield e:yield e.subarray()}())}catch(e){"aborted"!==e.type&&r.error(e)}},source:e.source,remoteAddr:t,timeline:{open:Date.now()},async close(t={}){const n=Date.now();if(null==t.signal){const e=AbortSignal.timeout(500);t={...t,signal:e}}const i=()=>{const{host:e,port:t}=s.remoteAddr.toOptions();r("timeout closing stream to %s:%s after %dms, destroying it manually",e,t,Date.now()-n),this.abort(new fn("Socket close timeout","ERR_SOCKET_CLOSE_TIMEOUT"))};t.signal?.addEventListener("abort",i);try{await e.close()}catch(e){r.error("error closing WebSocket gracefully",e),this.abort(e)}finally{t.signal?.removeEventListener("abort",i),s.timeline.close=Date.now()}},abort(t){const{host:n,port:i}=s.remoteAddr.toOptions();r("timeout closing stream to %s:%s due to error",n,i,t),e.destroy(),s.timeline.close=Date.now()}};return e.socket.addEventListener("close",(()=>{null==s.timeline.close&&(s.timeline.close=Date.now())}),{once:!0}),s}(await this._connect(e,t),e,{logger:this.logger});this.log("new outbound connection %s",n.remoteAddr);const r=await t.upgrader.upgradeOutbound(n);return this.log("outbound connection %s upgraded",n.remoteAddr),r}async _connect(e,t){if(!0===t?.signal?.aborted)throw new pn;const n=e.toOptions();this.log("dialing %s:%s",n.host,n.port);const r=lr(),s=uy(function(e,t){const n=cr(e).stringTuples(),r=n.pop();if(void 0===r)throw new Error("Unexpected end of multiaddr");const s=Fn(r[0]),i=Jm[s.name];if(null==i)throw new Error(`No interpreter found for ${s.name}`);let o=i(r[1]??"",n);return jm.includes(r[0])&&(o=o.replace(/^.*:\/\//,""),o="443"===r[1]?`https://${o}`:`http://${o}`),(o.startsWith("http://")||o.startsWith("https://"))&&(o=new URL(o).toString(),o.endsWith("/")&&(o=o.substring(0,o.length-1))),o}(e),this.init);if(s.socket.addEventListener("error",(()=>{const t=new fn(`Could not connect to ${e.toString()}`,"ERR_CONNECTION_FAILED");this.log.error("connection error:",t),r.reject(t)})),null==t.signal)return await Promise.race([s.connected(),r.promise]),this.log("connected %s",e),s;let i;const o=new Promise(((e,n)=>{i=()=>{n(new pn),s.close().catch((e=>{this.log.error("error closing raw socket",e)}))},!0!==t?.signal?.aborted?t?.signal?.addEventListener("abort",i):i()}));try{await Promise.race([o,r.promise,s.connected()])}finally{null!=i&&t?.signal?.removeEventListener("abort",i)}return this.log("connected %s",e),s}createListener(e){return function(){throw new Error("WebSocket Servers can not be created in the browser!")}(this.logger,this.init)}listenFilter(e){return e=Array.isArray(e)?e:[e],null!=this.init?.filter?this.init?.filter(e):fy||wy?function(e){return e.filter((e=>{if(e.protoCodes().includes(290))return!1;const t=e.decapsulateCode(421);return Ny.matches(t)}))}(e):function(e){return e.filter((e=>{if(e.protoCodes().includes(290))return!1;const t=e.decapsulateCode(421);return Cy.matches(t)||Ny.matches(t)}))}(e)}dialFilter(e){return this.listenFilter(e)}}function Zy(e={}){return t=>new Jy(t,e)}var Xy;!function(e){e.ERR_ALREADY_ABORTED="ERR_ALREADY_ABORTED",e.ERR_DATA_CHANNEL="ERR_DATA_CHANNEL",e.ERR_CONNECTION_CLOSED="ERR_CONNECTION_CLOSED",e.ERR_HASH_NOT_SUPPORTED="ERR_HASH_NOT_SUPPORTED",e.ERR_INVALID_MULTIADDR="ERR_INVALID_MULTIADDR",e.ERR_INVALID_FINGERPRINT="ERR_INVALID_FINGERPRINT",e.ERR_INVALID_PARAMETERS="ERR_INVALID_PARAMETERS",e.ERR_NOT_IMPLEMENTED="ERR_NOT_IMPLEMENTED",e.ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS="ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS",e.ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS="ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS"}(Xy||(Xy={}));var ew=function(e,t,n){if(n||2===arguments.length)for(var r,s=0,i=t.length;s<i;s++)!r&&s in t||(r||(r=Array.prototype.slice.call(t,0,s)),r[s]=t[s]);return e.concat(r||Array.prototype.slice.call(t))},tw=function(e,t,n){this.name=e,this.version=t,this.os=n,this.type="browser"},nw=function(e){this.version=e,this.type="node",this.name="node",this.os=process.platform},rw=function(e,t,n,r){this.name=e,this.version=t,this.os=n,this.bot=r,this.type="bot-device"},sw=function(){this.type="bot",this.bot=!0,this.name="bot",this.version=null,this.os=null},iw=function(){this.type="react-native",this.name="react-native",this.version=null,this.os=null},ow=/(nuhk|curl|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask\ Jeeves\/Teoma|ia_archiver)/,aw=3,cw=[["aol",/AOLShield\/([0-9\._]+)/],["edge",/Edge\/([0-9\._]+)/],["edge-ios",/EdgiOS\/([0-9\._]+)/],["yandexbrowser",/YaBrowser\/([0-9\._]+)/],["kakaotalk",/KAKAOTALK\s([0-9\.]+)/],["samsung",/SamsungBrowser\/([0-9\.]+)/],["silk",/\bSilk\/([0-9._-]+)\b/],["miui",/MiuiBrowser\/([0-9\.]+)$/],["beaker",/BeakerBrowser\/([0-9\.]+)/],["edge-chromium",/EdgA?\/([0-9\.]+)/],["chromium-webview",/(?!Chrom.*OPR)wv\).*Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/],["chrome",/(?!Chrom.*OPR)Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/],["phantomjs",/PhantomJS\/([0-9\.]+)(:?\s|$)/],["crios",/CriOS\/([0-9\.]+)(:?\s|$)/],["firefox",/Firefox\/([0-9\.]+)(?:\s|$)/],["fxios",/FxiOS\/([0-9\.]+)/],["opera-mini",/Opera Mini.*Version\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)(?:\s|$)/],["opera",/OPR\/([0-9\.]+)(:?\s|$)/],["pie",/^Microsoft Pocket Internet Explorer\/(\d+\.\d+)$/],["pie",/^Mozilla\/\d\.\d+\s\(compatible;\s(?:MSP?IE|MSInternet Explorer) (\d+\.\d+);.*Windows CE.*\)$/],["netfront",/^Mozilla\/\d\.\d+.*NetFront\/(\d.\d)/],["ie",/Trident\/7\.0.*rv\:([0-9\.]+).*\).*Gecko$/],["ie",/MSIE\s([0-9\.]+);.*Trident\/[4-7].0/],["ie",/MSIE\s(7\.0)/],["bb10",/BB10;\sTouch.*Version\/([0-9\.]+)/],["android",/Android\s([0-9\.]+)/],["ios",/Version\/([0-9\._]+).*Mobile.*Safari.*/],["safari",/Version\/([0-9\._]+).*Safari/],["facebook",/FB[AS]V\/([0-9\.]+)/],["instagram",/Instagram\s([0-9\.]+)/],["ios-webview",/AppleWebKit\/([0-9\.]+).*Mobile/],["ios-webview",/AppleWebKit\/([0-9\.]+).*Gecko\)$/],["curl",/^curl\/([0-9\.]+)$/],["searchbot",/alexa|bot|crawl(er|ing)|facebookexternalhit|feedburner|google web preview|nagios|postrank|pingdom|slurp|spider|yahoo!|yandex/]],lw=[["iOS",/iP(hone|od|ad)/],["Android OS",/Android/],["BlackBerry OS",/BlackBerry|BB10/],["Windows Mobile",/IEMobile/],["Amazon OS",/Kindle/],["Windows 3.11",/Win16/],["Windows 95",/(Windows 95)|(Win95)|(Windows_95)/],["Windows 98",/(Windows 98)|(Win98)/],["Windows 2000",/(Windows NT 5.0)|(Windows 2000)/],["Windows XP",/(Windows NT 5.1)|(Windows XP)/],["Windows Server 2003",/(Windows NT 5.2)/],["Windows Vista",/(Windows NT 6.0)/],["Windows 7",/(Windows NT 6.1)/],["Windows 8",/(Windows NT 6.2)/],["Windows 8.1",/(Windows NT 6.3)/],["Windows 10",/(Windows NT 10.0)/],["Windows ME",/Windows ME/],["Windows CE",/Windows CE|WinCE|Microsoft Pocket Internet Explorer/],["Open BSD",/OpenBSD/],["Sun OS",/SunOS/],["Chrome OS",/CrOS/],["Linux",/(Linux)|(X11)/],["Mac OS",/(Mac_PowerPC)|(Macintosh)/],["QNX",/QNX/],["BeOS",/BeOS/],["OS/2",/OS\/2/]];const uw="undefined"==typeof document&&"undefined"!=typeof navigator&&"ReactNative"===navigator.product?new iw:"undefined"!=typeof navigator?function(e){var t=function(e){return""!==e&&cw.reduce((function(t,n){var r=n[0],s=n[1];if(t)return t;var i=s.exec(e);return!!i&&[r,i]}),!1)}(e);if(!t)return null;var n=t[0],r=t[1];if("searchbot"===n)return new sw;var s=r[1]&&r[1].split(".").join("_").split("_").slice(0,3);s?s.length<aw&&(s=ew(ew([],s,!0),function(e){for(var t=[],n=0;n<e;n++)t.push("0");return t}(aw-s.length),!0)):s=[];var i=s.join("."),o=function(e){for(var t=0,n=lw.length;t<n;t++){var r=lw[t],s=r[0];if(r[1].exec(e))return s}return null}(e),a=ow.exec(e);return a&&a[1]?new rw(n,i,o,a[1]):new tw(n,i,o)}(navigator.userAgent):function(){var e="undefined"!=typeof process&&process.version;return e?new nw(process.version.slice(1)):null}(),hw=null!=uw&&"firefox"===uw.name,dw=async function*(){},pw=async e=>{};class fw{log;peerConnection;remoteAddr;timeline;metrics;source=dw();sink=pw;constructor(e,t){this.log=e.logger.forComponent("libp2p:webrtc:maconn"),this.remoteAddr=t.remoteAddr,this.timeline=t.timeline,this.peerConnection=t.peerConnection;const n=this.peerConnection.connectionState;this.peerConnection.onconnectionstatechange=()=>{this.log.trace("peer connection state change",this.peerConnection.connectionState,"initial state",n),"disconnected"!==this.peerConnection.connectionState&&"failed"!==this.peerConnection.connectionState&&"closed"!==this.peerConnection.connectionState||(this.timeline.close=Date.now())}}async close(e){this.log.trace("closing connection"),this.peerConnection.close(),this.timeline.close=Date.now(),this.metrics?.increment({close:!0})}abort(e){this.log.error("closing connection due to error",e),this.peerConnection.close(),this.timeline.close=Date.now(),this.metrics?.increment({abort:!0})}}const gw=e=>{const t=e.addEventListener||e.on||e.addListener,n=e.removeEventListener||e.off||e.removeListener;if(!t||!n)throw new TypeError("Emitter is not compatible");return{addListener:t.bind(e),removeListener:n.bind(e)}};function mw(e,t,n){"function"==typeof n&&(n={filter:n});const r=function(e,t,n){let r;const s=new Promise(((s,i)=>{if(!((n={rejectionEvents:["error"],multiArgs:!1,resolveImmediately:!1,...n}).count>=0)||n.count!==Number.POSITIVE_INFINITY&&!Number.isInteger(n.count))throw new TypeError("The `count` option should be at least 0 or more");n.signal?.throwIfAborted();const o=[t].flat(),a=[],{addListener:c,removeListener:l}=gw(e),u=(...e)=>{const t=n.multiArgs?e:e[0];n.filter&&!n.filter(t)||(a.push(t),n.count===a.length&&(r(),s(a)))},h=e=>{r(),i(e)};r=()=>{for(const e of o)l(e,u);for(const e of n.rejectionEvents)l(e,h)};for(const e of o)c(e,u);for(const e of n.rejectionEvents)c(e,h);n.signal&&n.signal.addEventListener("abort",(()=>{h(n.signal.reason)}),{once:!0}),n.resolveImmediately&&s(a)}));if(s.cancel=r,"number"==typeof n.timeout){const e=Ch(s,{milliseconds:n.timeout});return e.cancel=r,e}return s}(e,t,n={...n,count:1,resolveImmediately:!1}),s=r.then((e=>e[0]));return s.cancel=r.cancel,s}var yw;!function(e){let t,n;!function(e){e.FIN="FIN",e.STOP_SENDING="STOP_SENDING",e.RESET="RESET",e.FIN_ACK="FIN_ACK"}(e.Flag||(e.Flag={})),function(e){e[e.FIN=0]="FIN",e[e.STOP_SENDING=1]="STOP_SENDING",e[e.RESET=2]="RESET",e[e.FIN_ACK=3]="FIN_ACK"}(t||(t={})),function(e){e.codec=()=>Wt(t)}(e.Flag||(e.Flag={})),e.codec=()=>(null==n&&(n=jt(((t,n,r={})=>{!1!==r.lengthDelimited&&n.fork(),null!=t.flag&&(n.uint32(8),e.Flag.codec().encode(t.flag,n)),null!=t.message&&(n.uint32(18),n.bytes(t.message)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.flag=e.Flag.codec().decode(t);break;case 2:r.message=t.bytes();break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(yw||(yw={}));class ww extends Bm{channel;incomingData;maxBufferedAmount;bufferedAmountLowEventTimeout;maxMessageSize;receiveFinAck;finAckTimeout;openTimeout;constructor(e){const t=e.onEnd;switch(e.onEnd=e=>{this.log.trace("readable and writeable ends closed",this.status),Promise.resolve((async()=>{if(null==this.timeline.abort&&null===this.timeline.reset)try{await Ch(this.receiveFinAck.promise,{milliseconds:this.finAckTimeout})}catch(e){this.log.error("error receiving FIN_ACK",e)}})).then((()=>{this.incomingData.end(),t?.(e)})).catch((e=>{this.log.error("error ending stream",e)}))},super(e),this.channel=e.channel,this.channel.binaryType="arraybuffer",this.incomingData=pr(),this.bufferedAmountLowEventTimeout=e.bufferedAmountLowEventTimeout??3e4,this.maxBufferedAmount=e.maxBufferedAmount??16777216,this.maxMessageSize=(e.maxMessageSize??16384)-5-2,this.receiveFinAck=lr(),this.finAckTimeout=e.closeTimeout??5e3,this.openTimeout=e.openTimeout??5e3,this.channel.readyState){case"open":this.timeline.open=(new Date).getTime();break;case"closed":case"closing":void 0!==this.timeline.close&&0!==this.timeline.close||(this.timeline.close=Date.now());break;case"connecting":break;default:throw this.log.error("unknown datachannel state %s",this.channel.readyState),new fn("Unknown datachannel state","ERR_INVALID_STATE")}this.channel.onopen=e=>{this.timeline.open=(new Date).getTime()},this.channel.onclose=e=>{this.receiveFinAck.resolve(),this.close().catch((e=>{this.log.error("error closing stream after channel closed",e)}))},this.channel.onerror=e=>{const t=e.error;this.abort(t)},this.channel.onmessage=async e=>{const{data:t}=e;null!==t&&0!==t.byteLength&&this.incomingData.push(new Uint8Array(t,0,t.byteLength))};const n=this;Promise.resolve().then((async()=>{for await(const e of qr(this.incomingData)){const t=n.processIncomingProtobuf(e);null!=t&&n.sourcePush(new Ir(t))}})).catch((e=>{this.log.error("error processing incoming data channel messages",e)}))}sendNewStream(){}async _sendMessage(e,t=!0){if(t&&this.channel.bufferedAmount>this.maxBufferedAmount)try{this.log('channel buffer is %d, wait for "bufferedamountlow" event',this.channel.bufferedAmount),await mw(this.channel,"bufferedamountlow",{timeout:this.bufferedAmountLowEventTimeout})}catch(e){if(e instanceof Th)throw new fn(`Timed out waiting for DataChannel buffer to clear after ${this.bufferedAmountLowEventTimeout}ms`,"ERR_BUFFER_CLEAR_TIMEOUT");throw e}if("closed"===this.channel.readyState||"closing"===this.channel.readyState)throw new fn(`Invalid datachannel state - ${this.channel.readyState}`,"ERR_INVALID_STATE");"open"!==this.channel.readyState&&(this.log('channel state is "%s" and not "open", waiting for "open" event before sending data',this.channel.readyState),await mw(this.channel,"open",{timeout:this.openTimeout}),this.log('channel state is now "%s", sending data',this.channel.readyState)),this.channel.send(e.subarray())}async sendData(e){for(e=e.sublist();e.byteLength>0;){const t=Math.min(e.byteLength,this.maxMessageSize),n=e.subarray(0,t),r=yw.encode({message:n}),s=Or.single(r);await this._sendMessage(s),e.consume(t)}}async sendReset(){await this._sendFlag(yw.Flag.RESET)}async sendCloseWrite(e){if(await this._sendFlag(yw.Flag.FIN)){this.log.trace("awaiting FIN_ACK");try{await Ar(this.receiveFinAck.promise,e?.signal,{errorMessage:"sending close-write was aborted before FIN_ACK was received",errorCode:"ERR_FIN_ACK_NOT_RECEIVED"})}catch(e){this.log.error("failed to await FIN_ACK",e)}}else this.log.trace("sending FIN failed, not awaiting FIN_ACK");this.receiveFinAck.resolve()}async sendCloseRead(){await this._sendFlag(yw.Flag.STOP_SENDING)}processIncomingProtobuf(e){const t=yw.decode(e);if(void 0!==t.flag&&(this.log.trace('incoming flag %s, write status "%s", read status "%s"',t.flag,this.writeStatus,this.readStatus),t.flag===yw.Flag.FIN&&(this.remoteCloseWrite(),this.log.trace("sending FIN_ACK"),this._sendFlag(yw.Flag.FIN_ACK).catch((e=>{this.log.error("error sending FIN_ACK immediately",e)}))),t.flag===yw.Flag.RESET&&this.reset(),t.flag===yw.Flag.STOP_SENDING&&this.remoteCloseRead(),t.flag===yw.Flag.FIN_ACK&&(this.log.trace("received FIN_ACK"),this.receiveFinAck.resolve())),"ready"===this.readStatus)return t.message}async _sendFlag(e){if("open"!==this.channel.readyState)return this.log.trace('not sending flag %s because channel is "%s" and not "open"',this.channel.readyState,e.toString()),!1;this.log.trace("sending flag %s",e.toString());const t=yw.encode({flag:e}),n=Or.single(t);try{return await this._sendMessage(n,!1),!0}catch(t){this.log.error("could not send flag %s",e.toString(),t)}return!1}}function bw(e){const{channel:t,direction:n}=e;return new ww({id:"inbound"===n?`i${t.id}`:`r${t.id}`,log:e.logger.forComponent(`libp2p:webrtc:stream:${n}:${t.id}`),...e})}const vw="/webrtc";class Ew{protocol;peerConnection;bufferedStreams=[];metrics;dataChannelOptions;components;log;constructor(e,t){this.components=e,this.peerConnection=t.peerConnection,this.metrics=t.metrics,this.protocol=t.protocol??vw,this.dataChannelOptions=t.dataChannelOptions??{},this.log=e.logger.forComponent("libp2p:webrtc:datachannelmuxerfactory"),this.peerConnection.ondatachannel=({channel:t})=>{if(this.log.trace('incoming early datachannel with channel id %d and label "%s"',t.id),"init"===t.label)return this.log.trace("closing early init channel"),void t.close();const n={},r=bw({channel:t,direction:"inbound",onEnd:e=>{n.onEnd(e)},logger:e.logger,...this.dataChannelOptions});n.stream=r,n.channel=t,n.onEnd=()=>{this.bufferedStreams=this.bufferedStreams.filter((e=>e.stream.id!==r.id))},this.bufferedStreams.push(n)}}createStreamMuxer(e){return new Sw(this.components,{...e,peerConnection:this.peerConnection,dataChannelOptions:this.dataChannelOptions,metrics:this.metrics,streams:this.bufferedStreams,protocol:this.protocol})}}class Sw{init;streams;protocol;log;peerConnection;dataChannelOptions;metrics;logger;constructor(e,t){this.init=t,this.log=e.logger.forComponent("libp2p:webrtc:muxer"),this.logger=e.logger,this.streams=t.streams.map((e=>e.stream)),this.peerConnection=t.peerConnection,this.protocol=t.protocol??vw,this.metrics=t.metrics,this.dataChannelOptions=t.dataChannelOptions??{},this.peerConnection.ondatachannel=({channel:e})=>{if(this.log.trace("incoming datachannel with channel id %d",e.id),"init"===e.label)return this.log.trace("closing init channel"),void e.close();const n=bw({channel:e,direction:"inbound",onEnd:()=>{this.log("incoming channel %s ended with state %s",e.id,e.readyState),this.#L(n,e)},logger:this.logger,...this.dataChannelOptions});this.streams.push(n),this.metrics?.increment({incoming_stream:!0}),t?.onIncomingStream?.(n)},this.init.streams.length>0&&queueMicrotask((()=>{this.init.streams.forEach((e=>{e.onEnd=()=>{this.log("incoming early channel %s ended with state %s",e.channel.id,e.channel.readyState),this.#L(e.stream,e.channel)},this.metrics?.increment({incoming_stream:!0}),this.init?.onIncomingStream?.(e.stream)}))}))}#L(e,t){this.log.trace("stream %s %s %s onEnd",e.direction,e.id,e.protocol),function(e,t,n=3e4,r){"open"===e.readyState&&Promise.resolve().then((async()=>{if(e.bufferedAmount>0){r.log("%s drain channel with %d buffered bytes",t,e.bufferedAmount);const s=lr();let i=!1;e.bufferedAmountLowThreshold=0;const o=()=>{i||(r.log("%s drain channel closed before drain",t),s.resolve())};e.addEventListener("close",o,{once:!0}),e.addEventListener("bufferedamountlow",(()=>{i=!0,e.removeEventListener("close",o),s.resolve()})),await Ch(s.promise,{milliseconds:n})}})).then((async()=>{"open"===e.readyState&&e.close()})).catch((e=>{r.log.error("error closing outbound stream",e)}))}(t,`${e.direction} ${e.id} ${e.protocol}`,this.dataChannelOptions.drainTimeout,{log:this.log}),this.streams=this.streams.filter((t=>t.id!==e.id)),this.metrics?.increment({stream_end:!0}),this.init?.onStreamEnd?.(e)}async close(e){try{await Promise.all(this.streams.map((async t=>t.close(e))))}catch(e){this.abort(e)}}abort(e){for(const t of this.streams)t.abort(e)}source=dw();sink=pw;newStream(){const e=this.peerConnection.createDataChannel("");this.log.trace("opened outgoing datachannel with channel id %s",e.id);const t=bw({channel:e,direction:"outbound",onEnd:()=>{this.log("outgoing channel %s ended with state %s",e.id,e.readyState),this.#L(t,e)},logger:this.logger,...this.dataChannelOptions});return this.streams.push(t),this.metrics?.increment({outgoing_stream:!0}),t}}const _w=globalThis.RTCPeerConnection,Iw=globalThis.RTCSessionDescription,Rw=globalThis.RTCIceCandidate;function Aw(e,t){const n=xr(e,t),r={read:async(e,t)=>{const r=await n.read(t);return e.decode(r)},write:async(e,t,r)=>{await n.write(t.encode(e),r)},writeV:async(e,t,r)=>{await n.writeV(e.map((e=>t.encode(e))),r)},pb:e=>({read:async t=>r.read(e,t),write:async(t,n)=>r.write(t,e,n),writeV:async(t,n)=>r.writeV(t,e,n),unwrap:()=>r}),unwrap:()=>n.unwrap()};return r}var Tw;!function(e){let t,n;!function(e){e.SDP_OFFER="SDP_OFFER",e.SDP_ANSWER="SDP_ANSWER",e.ICE_CANDIDATE="ICE_CANDIDATE"}(e.Type||(e.Type={})),function(e){e[e.SDP_OFFER=0]="SDP_OFFER",e[e.SDP_ANSWER=1]="SDP_ANSWER",e[e.ICE_CANDIDATE=2]="ICE_CANDIDATE"}(t||(t={})),function(e){e.codec=()=>Wt(t)}(e.Type||(e.Type={})),e.codec=()=>(null==n&&(n=jt(((t,n,r={})=>{!1!==r.lengthDelimited&&n.fork(),null!=t.type&&(n.uint32(8),e.Type.codec().encode(t.type,n)),null!=t.data&&(n.uint32(18),n.string(t.data)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.type=e.Type.codec().decode(t);break;case 2:r.data=t.string();break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Tw||(Tw={}));const Dw=async(e,t,n)=>{try{const r=lr();for(!function(e,t){e[hw?"oniceconnectionstatechange":"onconnectionstatechange"]=n=>{switch(function(e){return hw?e.iceConnectionState:e.connectionState}(e)){case"connected":t.resolve();break;case"failed":case"disconnected":case"closed":t.reject(new fn("RTCPeerConnection was closed","ERR_CONNECTION_CLOSED_BEFORE_CONNECTED"))}}}(e,r);;){const s=await Promise.race([r.promise,t.read({signal:n.signal}).catch((()=>{}))]);if(null==s){n.signal?.throwIfAborted();break}if(s.type!==Tw.Type.ICE_CANDIDATE)throw new fn("ICE candidate message expected","ERR_NOT_ICE_CANDIDATE");const i=JSON.parse(s.data??"null");if(""===i||null===i){n.log.trace("end-of-candidates received");continue}const o=new Rw(i);n.log.trace("%s received new ICE candidate %o",n.direction,i);try{await e.addIceCandidate(o)}catch(e){n.log.error("%s bad candidate received",n.direction,i,e)}}}catch(e){if(n.log.error("%s error parsing ICE candidate",n.direction,e),!0===n.signal?.aborted)throw e}};async function kw({rtcConfiguration:e,dataChannel:t,signal:n,metrics:r,multiaddr:s,connectionManager:i,transportManager:o,log:a,logger:c}){const{baseAddr:l}=function(e){const t=e.toString().split(Cw+"/");if(2!==t.length)throw new fn("webrtc protocol was not present in multiaddr",Xy.ERR_INVALID_MULTIADDR);if(!t[0].includes(xw))throw new fn("p2p-circuit protocol was not present in multiaddr",Xy.ERR_INVALID_MULTIADDR);let n=cr(t[0]);const r=cr("/"+t[1]).getPeerId();if(null==r)throw new fn("destination peer id was missing",Xy.ERR_INVALID_MULTIADDR);const s=n.protos().pop();if(void 0===s)throw new fn("invalid multiaddr",Xy.ERR_INVALID_MULTIADDR);"p2p"!==s.name&&(n=n.encapsulate(`/p2p/${r}`));return{baseAddr:n,peerId:Is(r)}}(s);r?.dialerEvents.increment({open:!0}),a.trace("dialing base address: %a",l);const u=l.getPeerId();if(null==u)throw new fn("Relay peer was missing","ERR_INVALID_ADDRESS");const h=i.getConnections(Is(u));let d,p=!1;0===h.length?(d=await o.dial(l,{signal:n}),p=!0):d=h[0];try{const r=await d.newStream(Nw,{signal:n,runOnTransientConnection:!0}),i=Aw(r).pb(Tw),o=new _w(e),l=new Ew({logger:c},{peerConnection:o,dataChannelOptions:t});try{const e=o.createDataChannel("init");o.onicecandidate=({candidate:e})=>{const t=JSON.stringify(e?.toJSON()??null);a.trace("initiator sending ICE candidate %o",e),i.write({type:Tw.Type.ICE_CANDIDATE,data:t},{signal:n}).catch((e=>{a.error("error sending ICE candidate",e)}))},o.onicecandidateerror=e=>{a.error("initiator ICE candidate error",e)};const t=await o.createOffer().catch((e=>{throw a.error("could not execute createOffer",e),new fn("Failed to set createOffer","ERR_SDP_HANDSHAKE_FAILED")}));a.trace("initiator send SDP offer %s",t.sdp),await i.write({type:Tw.Type.SDP_OFFER,data:t.sdp},{signal:n}),await o.setLocalDescription(t).catch((e=>{throw a.error("could not execute setLocalDescription",e),new fn("Failed to set localDescription","ERR_SDP_HANDSHAKE_FAILED")}));const c=await i.read({signal:n});if(c.type!==Tw.Type.SDP_ANSWER)throw new fn("Remote should send an SDP answer","ERR_SDP_HANDSHAKE_FAILED");a.trace("initiator receive SDP answer %s",c.data);const u=new Iw({type:"answer",sdp:c.data});return await o.setRemoteDescription(u).catch((e=>{throw a.error("could not execute setRemoteDescription",e),new fn("Failed to set remoteDescription","ERR_SDP_HANDSHAKE_FAILED")})),a.trace("initiator read candidates until connected"),await Dw(o,i,{direction:"initiator",signal:n,log:a}),a.trace("initiator connected, closing init channel"),e.close(),a.trace("closing signalling channel"),await r.close({signal:n}),a.trace("initiator connected to remote address %s",s),{remoteAddress:s,peerConnection:o,muxerFactory:l}}catch(e){throw a.error("outgoing signalling error",e),o.close(),r.abort(e),e}finally{o.onicecandidate=null,o.onicecandidateerror=null}}finally{if(p)try{await d.close({signal:n})}catch(e){d.abort(e)}}}class Pw extends wn{peerId;transportManager;shutdownController;constructor(e,t){super(),this.peerId=e.peerId,this.transportManager=e.transportManager,this.shutdownController=t.shutdownController}async listen(){this.safeDispatchEvent("listening",{})}getAddrs(){return this.transportManager.getListeners().filter((e=>e!==this)).map((e=>e.getAddrs().filter((e=>Wy.matches(e))).map((e=>e.encapsulate(`/webrtc/p2p/${this.peerId}`))))).flat()}async close(){this.shutdownController.abort(),this.safeDispatchEvent("close",{})}}const Cw="/webrtc",xw="/p2p-circuit",Nw="/webrtc-signaling/0.0.1";class Mw{components;init;log;_started=!1;metrics;shutdownController;constructor(e,t={}){this.components=e,this.init=t,this.log=e.logger.forComponent("libp2p:webrtc"),this.shutdownController=new AbortController,this.shutdownController.signal,null!=e.metrics&&(this.metrics={dialerEvents:e.metrics.registerCounterGroup("libp2p_webrtc_dialer_events_total",{label:"event",help:"Total count of WebRTC dialer events by type"}),listenerEvents:e.metrics.registerCounterGroup("libp2p_webrtc_listener_events_total",{label:"event",help:"Total count of WebRTC listener events by type"})})}[hn]=!0;[Symbol.toStringTag]="@libp2p/webrtc";[Sn]=["@libp2p/transport"];[_n]=["@libp2p/identify","@libp2p/circuit-relay-v2-transport"];isStarted(){return this._started}async start(){await this.components.registrar.handle(Nw,(e=>{this._onProtocol(e).catch((t=>{this.log.error("failed to handle incoming connect from %p",e.connection.remotePeer,t)}))}),{runOnTransientConnection:!0}),this._started=!0}async stop(){await this.components.registrar.unhandle(Nw),this._started=!1}createListener(e){return new Pw(this.components,{shutdownController:this.shutdownController})}listenFilter(e){return e.filter(xp.exactMatch)}dialFilter(e){return this.listenFilter(e)}async dial(e,t){this.log.trace("dialing address: %a",e);const{remoteAddress:n,peerConnection:r,muxerFactory:s}=await kw({rtcConfiguration:"function"==typeof this.init.rtcConfiguration?await this.init.rtcConfiguration():this.init.rtcConfiguration,dataChannel:this.init.dataChannel,multiaddr:e,dataChannelOptions:this.init.dataChannel,signal:t.signal,connectionManager:this.components.connectionManager,transportManager:this.components.transportManager,log:this.log,logger:this.components.logger}),i=new fw(this.components,{peerConnection:r,timeline:{open:Date.now()},remoteAddr:n,metrics:this.metrics?.dialerEvents}),o=await t.upgrader.upgradeOutbound(i,{skipProtection:!0,skipEncryption:!0,muxerFactory:s});return this._closeOnShutdown(r,i),o}async _onProtocol({connection:e,stream:t}){const n=AbortSignal.timeout(this.init.inboundConnectionTimeout??3e4),r=new _w("function"==typeof this.init.rtcConfiguration?await this.init.rtcConfiguration():this.init.rtcConfiguration),s=new Ew(this.components,{peerConnection:r,dataChannelOptions:this.init.dataChannel});try{const{remoteAddress:i}=await async function({peerConnection:e,stream:t,signal:n,connection:r,log:s}){s.trace("new inbound signaling stream");const i=Aw(t).pb(Tw);try{e.onicecandidate=({candidate:e})=>{const t=JSON.stringify(e?.toJSON()??null);s.trace("recipient sending ICE candidate %s",t),i.write({type:Tw.Type.ICE_CANDIDATE,data:t},{signal:n}).catch((e=>{s.error("error sending ICE candidate",e)}))};const t=await i.read({signal:n});if(t.type!==Tw.Type.SDP_OFFER)throw new fn(`expected message type SDP_OFFER, received: ${t.type??"undefined"} `,"ERR_SDP_HANDSHAKE_FAILED");s.trace("recipient receive SDP offer %s",t.data);const r=new Iw({type:"offer",sdp:t.data});await e.setRemoteDescription(r).catch((e=>{throw s.error("could not execute setRemoteDescription",e),new fn("Failed to set remoteDescription","ERR_SDP_HANDSHAKE_FAILED")}));const o=await e.createAnswer().catch((e=>{throw s.error("could not execute createAnswer",e),new fn("Failed to create answer","ERR_SDP_HANDSHAKE_FAILED")}));s.trace("recipient send SDP answer %s",o.sdp),await i.write({type:Tw.Type.SDP_ANSWER,data:o.sdp},{signal:n}),await e.setLocalDescription(o).catch((e=>{throw s.error("could not execute setLocalDescription",e),new fn("Failed to set localDescription","ERR_SDP_HANDSHAKE_FAILED")})),s.trace("recipient read candidates until connected"),await Dw(e,i,{direction:"recipient",signal:n,log:s})}catch(t){if("connected"!==e.connectionState)throw s.error("error while handling signaling stream from peer %a",r.remoteAddr,t),e.close(),t;s("error while handling signaling stream from peer %a, ignoring as the RTCPeerConnection is already connected",r.remoteAddr,t)}const o=cr(`/webrtc/p2p/${r.remoteAddr.getPeerId()}`);return s.trace("recipient connected to remote address %s",o),{remoteAddress:o}}({peerConnection:r,connection:e,stream:t,signal:n,log:this.log});await t.close({signal:n});const o=new fw(this.components,{peerConnection:r,timeline:{open:(new Date).getTime()},remoteAddr:i,metrics:this.metrics?.listenerEvents});await this.components.upgrader.upgradeInbound(o,{skipEncryption:!0,skipProtection:!0,muxerFactory:s}),this._closeOnShutdown(r,o)}catch(e){throw this.log.error("incoming signalling error",e),r.close(),t.abort(e),e}}_closeOnShutdown(e,t){const n=()=>{t.close().catch((e=>{this.log.error("could not close WebRTCMultiaddrConnection",e)}))};this.shutdownController.signal.addEventListener("abort",n),e.addEventListener("close",(()=>{this.shutdownController.signal.removeEventListener("abort",n)}))}}var Ow;function Lw(e,t){if(Cp.matches(e))return!1;return null!=t.dialTransportForMultiaddr(e)&&(!!pp.matches(e)||!!yp.matches(e)&&!1===Jd(e.toOptions().host))}!function(e){let t,n;!function(e){e.UNUSED="UNUSED",e.CONNECT="CONNECT",e.SYNC="SYNC"}(e.Type||(e.Type={})),function(e){e[e.UNUSED=0]="UNUSED",e[e.CONNECT=100]="CONNECT",e[e.SYNC=300]="SYNC"}(t||(t={})),function(e){e.codec=()=>Wt(t)}(e.Type||(e.Type={})),e.codec=()=>(null==n&&(n=jt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.type&&(n.uint32(8),e.Type.codec().encode(t.type,n)),null!=t.observedAddresses)for(const e of t.observedAddresses)n.uint32(18),n.bytes(e);!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={observedAddresses:[]},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.type=e.Type.codec().decode(t);break;case 2:r.observedAddresses.push(t.bytes());break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Ow||(Ow={}));const Bw=5e3,Uw=3,Fw=1,Vw=1;class Kw{started;timeout;retries;maxInboundStreams;maxOutboundStreams;peerStore;registrar;connectionManager;addressManager;transportManager;topologyId;log;constructor(e,t){this.log=e.logger.forComponent("libp2p:dcutr"),this.started=!1,this.peerStore=e.peerStore,this.registrar=e.registrar,this.addressManager=e.addressManager,this.connectionManager=e.connectionManager,this.transportManager=e.transportManager,this.timeout=t.timeout??Bw,this.retries=t.retries??Uw,this.maxInboundStreams=t.maxInboundStreams??Fw,this.maxOutboundStreams=t.maxOutboundStreams??Vw}[Symbol.toStringTag]="@libp2p/dcutr";[_n]=["@libp2p/identify"];isStarted(){return this.started}async start(){this.started||(this.topologyId=await this.registrar.register($w,{notifyOnTransient:!0,onConnect:(e,t)=>{t.transient&&"inbound"===t.direction&&this.upgradeInbound(t).catch((e=>{this.log.error("error during outgoing DCUtR attempt",e)}))}}),await this.registrar.handle($w,(e=>{this.handleIncomingUpgrade(e.stream,e.connection).catch((t=>{this.log.error("error during incoming DCUtR attempt",t),e.stream.abort(t)}))}),{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnTransientConnection:!0}),this.started=!0)}async stop(){await this.registrar.unhandle($w),null!=this.topologyId&&this.registrar.unregister(this.topologyId),this.started=!1}async upgradeInbound(e){if(await this.attemptUnilateralConnectionUpgrade(e))return;let t;for(let n=0;n<this.retries;n++){const r={signal:AbortSignal.timeout(this.timeout)};try{t=await e.newStream([$w],{signal:r.signal,runOnTransientConnection:!0});const n=Aw(t,{maxDataLength:4096}).pb(Ow);this.log("B sending connect to %p",e.remotePeer);const s=Date.now();await n.write({type:Ow.Type.CONNECT,observedAddresses:this.addressManager.getAddresses().map((e=>e.bytes))},r),this.log("B receiving connect from %p",e.remotePeer);const i=await n.read(r);if(i.type!==Ow.Type.CONNECT)throw this.log("A sent wrong message type"),new fn("DCUtR message type was incorrect",yn);const o=this.getDialableMultiaddrs(i.observedAddresses);if(0===o.length)throw this.log("A did not have any dialable multiaddrs"),new fn("DCUtR connect message had no multiaddrs",yn);const a=Date.now()-s;this.log("A sending sync, rtt %dms",a),await n.write({type:Ow.Type.SYNC,observedAddresses:[]},r),this.log("A waiting for half RTT"),await df(a/2),this.log("B dialing",o);const c=await this.connectionManager.openConnection(o,{signal:r.signal,priority:100});this.log("DCUtR to %p succeeded to address %a, closing relayed connection",e.remotePeer,c.remoteAddr),await e.close(r);break}catch(e){if(this.log.error("error while attempting DCUtR on attempt %d of %d",n+1,this.retries,e),t?.abort(e),n===this.retries)throw e}finally{null!=t&&await t.close(r)}}}async attemptUnilateralConnectionUpgrade(e){const t=(await this.peerStore.get(e.remotePeer)).addresses.map((t=>{const n=t.multiaddr;return null==n.getPeerId()?n.encapsulate(`/p2p/${e.remotePeer}`):n})).filter((e=>Lw(e,this.transportManager)));if(t.length>0){const n=AbortSignal.timeout(this.timeout);try{this.log("attempting unilateral connection upgrade to %a",t);const r=await this.connectionManager.openConnection(t,{signal:n,force:!0});if(r.transient)throw new Error("Could not open a new, non-transient, connection");return this.log("unilateral connection upgrade to %p succeeded via %a, closing relayed connection",e.remotePeer,r.remoteAddr),await e.close({signal:n}),!0}catch(n){this.log.error("unilateral connection upgrade to %p on addresses %a failed",e.remotePeer,t,n)}}else this.log("peer %p has no public addresses, not attempting unilateral connection upgrade",e.remotePeer);return!1}async handleIncomingUpgrade(e,t){const n={signal:AbortSignal.timeout(this.timeout)};try{const r=Aw(e,{maxDataLength:4096}).pb(Ow);this.log("A receiving connect");const s=await r.read(n);if(s.type!==Ow.Type.CONNECT)throw this.log("B sent wrong message type"),new fn("DCUtR message type was incorrect",yn);if(0===s.observedAddresses.length)throw this.log("B sent no multiaddrs"),new fn("DCUtR connect message had no multiaddrs",yn);const i=this.getDialableMultiaddrs(s.observedAddresses);if(0===i.length)throw this.log("B had no dialable multiaddrs"),new fn("DCUtR connect message had no dialable multiaddrs",yn);this.log("A sending connect"),await r.write({type:Ow.Type.CONNECT,observedAddresses:this.addressManager.getAddresses().map((e=>e.bytes))}),this.log("A receiving sync");if((await r.read(n)).type!==Ow.Type.SYNC)throw new fn("DCUtR message type was incorrect",yn);this.log("A dialing",i);const o=await this.connectionManager.openConnection(i,{signal:n.signal,priority:100,force:!0});this.log("DCUtR to %p succeeded via %a, closing relayed connection",t.remotePeer,o.remoteAddr),await t.close(n)}catch(n){this.log.error("incoming DCUtR from %p failed",t.remotePeer,n),e.abort(n)}finally{await e.close(n)}}getDialableMultiaddrs(e){const t=[];for(const n of e)if(null!=n&&0!==n.length)try{const e=cr(n);if(!Lw(e,this.transportManager))continue;t.push(e)}catch{}return t}}const $w="/libp2p/dcutr";function qw(e={}){return t=>new Kw(t,e)}const Hw="ERR_INVALID_FRAME",zw="ERR_UNREQUESTED_PING",Ww="ERR_NOT_MATCHING_PING",jw="ERR_STREAM_ALREADY_EXISTS",Gw="ERR_DECODE_INVALID_VERSION",Yw="ERR_BOTH_CLIENTS",Qw="ERR_RECV_WINDOW_EXCEEDED",Jw=new Set([Hw,zw,Ww,jw,Gw,Yw,Qw]),Zw="ERR_INVALID_CONFIG",Xw="ERR_MUXER_LOCAL_CLOSED",eb="ERR_MUXER_REMOTE_CLOSED",tb=262144,nb={enableKeepAlive:!0,keepAliveInterval:3e4,maxInboundStreams:1e3,maxOutboundStreams:1e3,initialStreamWindowSize:tb,maxStreamWindowSize:16777216,maxMessageSize:65536};var rb,sb;!function(e){e[e.Data=0]="Data",e[e.WindowUpdate=1]="WindowUpdate",e[e.Ping=2]="Ping",e[e.GoAway=3]="GoAway"}(rb||(rb={})),function(e){e[e.SYN=1]="SYN",e[e.ACK=2]="ACK",e[e.FIN=4]="FIN",e[e.RST=8]="RST"}(sb||(sb={})),Object.values(sb).filter((e=>"string"!=typeof e));var ib;!function(e){e[e.NormalTermination=0]="NormalTermination",e[e.ProtocolError=1]="ProtocolError",e[e.InternalError=2]="InternalError"}(ib||(ib={}));const ob=2**24;class ab{source;buffer;frameInProgress;constructor(e){this.source=function(e){if(void 0!==e[Symbol.iterator]){const t=e[Symbol.iterator]();return t.return=void 0,{[Symbol.iterator]:()=>t}}if(void 0!==e[Symbol.asyncIterator]){const t=e[Symbol.asyncIterator]();return t.return=void 0,{[Symbol.asyncIterator]:()=>t}}throw new Error("a source must be either an iterable or an async iterable")}(e),this.buffer=new Ir,this.frameInProgress=!1}async*emitFrames(){for await(const e of this.source)for(this.buffer.append(e);;){const e=this.readHeader();if(void 0===e)break;const{type:t,length:n}=e;t===rb.Data?(this.frameInProgress=!0,yield{header:e,readData:this.readBytes.bind(this,n)}):yield{header:e}}}readHeader(){if(this.frameInProgress)throw new fn("decoding frame already in progress","ERR_DECODE_IN_PROGRESS");if(this.buffer.length<12)return;const e=function(e){if(0!==e[0])throw new fn("Invalid frame version",Gw);return{type:e[1],flag:(e[2]<<8)+e[3],streamID:e[4]*ob+(e[5]<<16)+(e[6]<<8)+e[7],length:e[8]*ob+(e[9]<<16)+(e[10]<<8)+e[11]}}(this.buffer.subarray(0,12));return this.buffer.consume(12),e}async readBytes(e){if(this.buffer.length<e)for await(const t of this.source)if(this.buffer.append(t),this.buffer.length>=e)break;const t=this.buffer.sublist(0,e);return this.buffer.consume(e),this.frameInProgress=!1,t}}function cb(e){const t=new Uint8Array(12);return t[1]=e.type,t[2]=e.flag>>>8,t[3]=e.flag,t[4]=e.streamID>>>24,t[5]=e.streamID>>>16,t[6]=e.streamID>>>8,t[7]=e.streamID,t[8]=e.length>>>24,t[9]=e.length>>>16,t[10]=e.length>>>8,t[11]=e.length,t}function lb(e){return null!=e?.then}function ub(e,t){let n=0;if(null!=e[Symbol.asyncIterator])return async function*(){for await(const r of e){const e=t(r,n++);lb(e)&&await e,yield r}}();const r=Hr(e),{value:s,done:i}=r.next();if(!0===i)return function*(){}();const o=t(s,n++);if("function"==typeof o?.then)return async function*(){yield s;for await(const e of r){const r=t(e,n++);lb(r)&&await r,yield e}}();const a=t;return function*(){yield s;for(const e of r)a(e,n++),yield e}()}var hb;!function(e){e[e.Init=0]="Init",e[e.SYNSent=1]="SYNSent",e[e.SYNReceived=2]="SYNReceived",e[e.Established=3]="Established",e[e.Finished=4]="Finished"}(hb||(hb={}));class db extends Bm{name;state;config;_id;sendWindowCapacity;sendWindowCapacityUpdate;recvWindow;recvWindowCapacity;epochStart;getRTT;sendFrame;constructor(e){super({...e,onEnd:t=>{this.state=hb.Finished,e.onEnd?.(t)}}),this.config=e.config,this._id=parseInt(e.id,10),this.name=e.name,this.state=e.state,this.sendWindowCapacity=tb,this.recvWindow=this.config.initialStreamWindowSize,this.recvWindowCapacity=this.recvWindow,this.epochStart=Date.now(),this.getRTT=e.getRTT,this.sendFrame=e.sendFrame,this.source=ub(this.source,(()=>{this.sendWindowUpdate()}))}async sendNewStream(){}async sendData(e,t={}){for(e=e.sublist();0!==e.byteLength;){if(0===this.sendWindowCapacity&&(this.log?.trace("wait for send window capacity, status %s",this.status),await this.waitForSendWindowCapacity(t),"closed"===this.status||"aborted"===this.status||"reset"===this.status))return void this.log?.trace("%s while waiting for send window capacity",this.status);const n=Math.min(this.sendWindowCapacity,this.config.maxMessageSize-12,e.length),r=this.getSendFlags();this.sendFrame({type:rb.Data,flag:r,streamID:this._id,length:n},e.sublist(0,n)),this.sendWindowCapacity-=n,e.consume(n)}}async sendReset(){this.sendFrame({type:rb.WindowUpdate,flag:sb.RST,streamID:this._id,length:0})}async sendCloseWrite(){const e=this.getSendFlags()|sb.FIN;this.sendFrame({type:rb.WindowUpdate,flag:e,streamID:this._id,length:0})}async sendCloseRead(){}async waitForSendWindowCapacity(e={}){if(this.sendWindowCapacity>0)return;let t,n;const r=()=>{"open"===this.status||"closing"===this.status?n(new fn("stream aborted","ERR_STREAM_ABORT")):t()};e.signal?.addEventListener("abort",r);try{await new Promise(((e,r)=>{this.sendWindowCapacityUpdate=()=>{e()},n=r,t=e}))}finally{e.signal?.removeEventListener("abort",r)}}handleWindowUpdate(e){this.log?.trace("stream received window update id=%s",this._id),this.processFlags(e.flag);const t=this.sendWindowCapacity;this.sendWindowCapacity+=e.length,0===t&&e.length>0&&this.sendWindowCapacityUpdate?.()}async handleData(e,t){if(this.log?.trace("stream received data id=%s",this._id),this.processFlags(e.flag),this.recvWindowCapacity<e.length)throw new fn("receive window exceeded",Qw,{available:this.recvWindowCapacity,recv:e.length});const n=await t();this.recvWindowCapacity-=e.length,this.sourcePush(n)}processFlags(e){(e&sb.ACK)===sb.ACK&&this.state===hb.SYNSent&&(this.state=hb.Established),(e&sb.FIN)===sb.FIN&&this.remoteCloseWrite(),(e&sb.RST)===sb.RST&&this.reset()}getSendFlags(){switch(this.state){case hb.Init:return this.state=hb.SYNSent,sb.SYN;case hb.SYNReceived:return this.state=hb.Established,sb.ACK;default:return 0}}sendWindowUpdate(){const e=this.getSendFlags(),t=Date.now(),n=this.getRTT();if(0===e&&n>-1&&t-this.epochStart<4*n&&(this.recvWindow=Math.min(2*this.recvWindow,this.config.maxStreamWindowSize)),this.recvWindowCapacity>=this.recvWindow&&0===e)return;const r=this.recvWindow-this.recvWindowCapacity;this.recvWindowCapacity=this.recvWindow,this.epochStart=t,this.sendFrame({type:rb.WindowUpdate,flag:e,streamID:this._id,length:r})}}const pb="/yamux/1.0.0";class fb{protocol=pb;_components;_init;constructor(e,t={}){this._components=e,this._init=t}createStreamMuxer(e){return new gb(this._components,{...this._init,...e})}}class gb{protocol=pb;source;sink;config;log;logger;closeController;nextStreamID;_streams;nextPingID;activePing;rtt;client;localGoAway;remoteGoAway;numInboundStreams;numOutboundStreams;onIncomingStream;onStreamEnd;constructor(e,t){this.client="outbound"===t.direction,this.config={...nb,...t},this.logger=e.logger,this.log=this.logger.forComponent("libp2p:yamux"),function(e){if(e.keepAliveInterval<=0)throw new fn("keep-alive interval must be positive",Zw);if(e.maxInboundStreams<0)throw new fn("max inbound streams must be larger or equal 0",Zw);if(e.maxOutboundStreams<0)throw new fn("max outbound streams must be larger or equal 0",Zw);if(e.initialStreamWindowSize<tb)throw new fn("InitialStreamWindowSize must be larger or equal 256 kB",Zw);if(e.maxStreamWindowSize<e.initialStreamWindowSize)throw new fn("MaxStreamWindowSize must be larger than the InitialStreamWindowSize",Zw);if(e.maxStreamWindowSize>2**32-1)throw new fn("MaxStreamWindowSize must be less than equal MAX_UINT32",Zw);if(e.maxMessageSize<1024)throw new fn("MaxMessageSize must be greater than a kilobyte",Zw)}(this.config),this.closeController=new AbortController,this.closeController.signal,this.onIncomingStream=t.onIncomingStream,this.onStreamEnd=t.onStreamEnd,this._streams=new Map,this.source=pr({onEnd:()=>{this.log?.trace("muxer source ended"),this._streams.forEach((e=>{e.destroy()}))}}),this.sink=async e=>{const t=()=>{const t=Om(e);if(null!=t.return){const e=t.return();null!=(n=e)&&"function"==typeof n.then&&e.catch((e=>{this.log?.("could not cause sink source to return",e)}))}var n};let n,r;try{const r=new ab(e);try{this.closeController.signal.addEventListener("abort",t);for await(const e of r.emitFrames())await this.handleFrame(e.header,e.readData)}finally{this.closeController.signal.removeEventListener("abort",t)}n=ib.NormalTermination}catch(e){const t=e.code;Jw.has(t)?(this.log?.error("protocol error in sink",e),n=ib.ProtocolError):(this.log?.error("internal error in sink",e),n=ib.InternalError),r=e}this.log?.trace("muxer sink ended"),null!=r?this.abort(r,n):await this.close({reason:n})},this.numInboundStreams=0,this.numOutboundStreams=0,this.nextStreamID=this.client?1:2,this.nextPingID=0,this.rtt=-1,this.log?.trace("muxer created"),this.config.enableKeepAlive&&this.keepAliveLoop().catch((e=>this.log?.error("keepalive error: %s",e))),this.ping().catch((e=>this.log?.error("ping error: %s",e)))}get streams(){return Array.from(this._streams.values())}newStream(e){if(void 0!==this.remoteGoAway)throw new fn("muxer closed remotely",eb);if(void 0!==this.localGoAway)throw new fn("muxer closed locally",Xw);const t=this.nextStreamID;if(this.nextStreamID+=2,this.numOutboundStreams>=this.config.maxOutboundStreams)throw new fn("max outbound streams exceeded","ERROR_MAX_OUTBOUND_STREAMS_EXCEEDED");this.log?.trace("new outgoing stream id=%s",t);const n=this._newStream(t,e,hb.Init,"outbound");return this._streams.set(t,n),this.numOutboundStreams++,n.sendWindowUpdate(),n}async ping(){if(void 0!==this.remoteGoAway)throw new fn("muxer closed remotely",eb);if(void 0!==this.localGoAway)throw new fn("muxer closed locally",Xw);if(void 0===this.activePing){let e=()=>{};this.activePing={id:this.nextPingID++,promise:new Promise(((t,n)=>{const r=()=>{n(new fn("muxer closed locally",Xw))};this.closeController.signal.addEventListener("abort",r,{once:!0}),e=()=>{this.closeController.signal.removeEventListener("abort",r),t()}})),resolve:e};const t=Date.now();this.sendPing(this.activePing.id);try{await this.activePing.promise}finally{delete this.activePing}const n=Date.now();this.rtt=n-t}else await this.activePing.promise;return this.rtt}getRTT(){return this.rtt}async close(e={}){if(this.closeController.signal.aborted)return;const t=e?.reason??ib.NormalTermination;if(this.log?.trace("muxer close reason=%s",t),null==e.signal){const t=AbortSignal.timeout(500);e={...e,signal:t}}try{await Promise.all([...this._streams.values()].map((async t=>t.close(e)))),this.sendGoAway(t),this._closeMuxer()}catch(e){this.abort(e)}}abort(e,t){if(!this.closeController.signal.aborted){t=t??ib.InternalError,this.log?.error("muxer abort reason=%s error=%s",t,e);for(const t of this._streams.values())t.abort(e);this.sendGoAway(t),this._closeMuxer()}}isClosed(){return this.closeController.signal.aborted}_closeMuxer(){this.closeController.abort(),this.source.end()}_newStream(e,t,n,r){if(null!=this._streams.get(e))throw new fn("Stream already exists",jw,{id:e});const s=new db({id:e.toString(),name:t,state:n,direction:r,sendFrame:this.sendFrame.bind(this),onEnd:()=>{this.closeStream(e),this.onStreamEnd?.(s)},log:this.logger.forComponent(`libp2p:yamux:${r}:${e}`),config:this.config,getRTT:this.getRTT.bind(this)});return s}closeStream(e){this.client===(e%2==0)?this.numInboundStreams--:this.numOutboundStreams--,this._streams.delete(e)}async keepAliveLoop(){const e=new Promise(((e,t)=>{this.closeController.signal.addEventListener("abort",t,{once:!0})}));for(this.log?.trace("muxer keepalive enabled interval=%s",this.config.keepAliveInterval);;){let t;try{await Promise.race([e,new Promise((e=>{t=setTimeout(e,this.config.keepAliveInterval)}))]),this.ping().catch((e=>this.log?.error("ping error: %s",e)))}catch(e){return void clearInterval(t)}}}async handleFrame(e,t){const{streamID:n,type:r,length:s}=e;if(this.log?.trace("received frame %o",e),0===n)switch(r){case rb.Ping:return void this.handlePing(e);case rb.GoAway:return void this.handleGoAway(s);default:throw new fn("Invalid frame type",Hw,{header:e})}else switch(e.type){case rb.Data:case rb.WindowUpdate:return void await this.handleStreamMessage(e,t);default:throw new fn("Invalid frame type",Hw,{header:e})}}handlePing(e){if(e.flag===sb.SYN)this.log?.trace("received ping request pingId=%s",e.length),this.sendPing(e.length,sb.ACK);else{if(e.flag!==sb.ACK)throw new fn("Invalid frame flag",Hw,{header:e});this.log?.trace("received ping response pingId=%s",e.length),this.handlePingResponse(e.length)}}handlePingResponse(e){if(void 0===this.activePing)throw new fn("ping not requested",zw);if(this.activePing.id!==e)throw new fn("ping doesn't match our id",Ww);this.activePing.resolve()}handleGoAway(e){this.log?.trace("received GoAway reason=%s",ib[e]??"unknown"),this.remoteGoAway=e;for(const e of this._streams.values())e.reset();this._closeMuxer()}async handleStreamMessage(e,t){const{streamID:n,flag:r,type:s}=e;(r&sb.SYN)===sb.SYN&&this.incomingStream(n);const i=this._streams.get(n);if(void 0!==i)switch(s){case rb.WindowUpdate:return void i.handleWindowUpdate(e);case rb.Data:if(void 0===t)throw new Error("unreachable");return void await i.handleData(e,t);default:throw new Error("unreachable")}else if(s===rb.Data){if(this.log?.("discarding data for stream id=%s",n),void 0===t)throw new Error("unreachable");await t()}else this.log?.("frame for missing stream id=%s",n)}incomingStream(e){if(this.client!==(e%2==0))throw new fn("both endpoints are clients",Yw);if(this._streams.has(e))return;if(this.log?.trace("new incoming stream id=%s",e),void 0!==this.localGoAway)return void this.sendFrame({type:rb.WindowUpdate,flag:sb.RST,streamID:e,length:0});if(this.numInboundStreams>=this.config.maxInboundStreams)return this.log?.("maxIncomingStreams exceeded, forcing stream reset"),void this.sendFrame({type:rb.WindowUpdate,flag:sb.RST,streamID:e,length:0});const t=this._newStream(e,void 0,hb.SYNReceived,"inbound");this.numInboundStreams++,this._streams.set(e,t),this.onIncomingStream?.(t)}sendFrame(e,t){if(this.log?.trace("sending frame %o",e),e.type===rb.Data){if(void 0===t)throw new fn("invalid frame",Hw);this.source.push(new Ir(cb(e),t))}else this.source.push(cb(e))}sendPing(e,t=sb.SYN){t===sb.SYN?this.log?.trace("sending ping request pingId=%s",e):this.log?.trace("sending ping response pingId=%s",e),this.sendFrame({type:rb.Ping,flag:t,streamID:0,length:e})}sendGoAway(e=ib.NormalTermination){this.log?.("sending GoAway reason=%s",ib[e]),this.localGoAway=e,this.sendFrame({type:rb.GoAway,flag:0,streamID:0,length:e})}}function mb(e={}){return t=>new fb(t,e)}function yb(e=0){return null!=globalThis.Buffer?.alloc?(t=globalThis.Buffer.alloc(e),null!=globalThis.Buffer?new Uint8Array(t.buffer,t.byteOffset,t.byteLength):t):new Uint8Array(e);var t}var wb;!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.publicKey&&e.publicKey.byteLength>0&&(t.uint32(10),t.bytes(e.publicKey)),null!=e.addrs)for(const n of e.addrs)t.uint32(18),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={publicKey:yb(0),addrs:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.publicKey=e.bytes();break;case 2:n.addrs.push(e.bytes());break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(wb||(wb={}));class bb extends wn{[rn]=!0;[Symbol.toStringTag]="@libp2p/pubsub-peer-discovery";interval;listenOnly;topics;intervalId;components;log;constructor(e,t={}){super();const{interval:n,topics:r,listenOnly:s}=t;this.components=e,this.interval=n??1e4,this.listenOnly=s??!1,this.log=e.logger.forComponent("libp2p:discovery:pubsub"),Array.isArray(r)&&r.length>0?this.topics=r:this.topics=["_peer-discovery._p2p._pubsub"],this._onMessage=this._onMessage.bind(this)}isStarted(){return null!=this.intervalId}start(){}afterStart(){if(null!=this.intervalId)return;const e=this.components.pubsub;if(null==e)throw new Error("PubSub not configured");for(const t of this.topics)e.subscribe(t),e.addEventListener("message",this._onMessage);this.listenOnly||(this._broadcast(),this.intervalId=setInterval((()=>{this._broadcast()}),this.interval))}beforeStop(){const e=this.components.pubsub;if(null==e)throw new Error("PubSub not configured");for(const t of this.topics)e.unsubscribe(t),e.removeEventListener("message",this._onMessage)}stop(){null!=this.intervalId&&(clearInterval(this.intervalId),this.intervalId=void 0)}_broadcast(){const e=this.components.peerId;if(null==e.publicKey)throw new Error("PeerId was missing public key");const t={publicKey:e.publicKey,addrs:this.components.addressManager.getAddresses().map((e=>e.bytes))},n=wb.encode(t),r=this.components.pubsub;if(null==r)throw new Error("PubSub not configured");for(const e of this.topics)0!==r.getSubscribers(e).length?(this.log("broadcasting our peer data on topic %s",e),r.publish(e,n)):this.log("skipping broadcasting our peer data on topic %s because there are no peers present",e)}_onMessage(e){if(!this.isStarted())return;const t=e.detail;if(!this.topics.includes(t.topic))return;const n=wb.decode(t.data);As(n.publicKey).then((e=>{e.equals(this.components.peerId)||(this.log("discovered peer %p on %s",e,t.topic),this.safeDispatchEvent("peer",{detail:{id:e,multiaddrs:n.addrs.map((e=>cr(e)))}}))})).catch((e=>{this.log.error(e)}))}}function vb(e={}){return t=>new bb(t,e)}const Eb="circuit-relay-relay";BigInt(1<<17);const Sb="/libp2p/circuit/relay/0.2.0/hop",_b="/libp2p/circuit/relay/0.2.0/stop",Ib="ERR_RELAYED_DIAL";var Rb,Ab,Tb,Db,kb,Pb,Cb,xb;function Nb(e){const t=e*BigInt(1e3),n=(new Date).getTime();return Number(t-BigInt(n))}!function(e){let t,n;!function(e){e.RESERVE="RESERVE",e.CONNECT="CONNECT",e.STATUS="STATUS"}(e.Type||(e.Type={})),function(e){e[e.RESERVE=0]="RESERVE",e[e.CONNECT=1]="CONNECT",e[e.STATUS=2]="STATUS"}(t||(t={})),function(e){e.codec=()=>Wt(t)}(e.Type||(e.Type={})),e.codec=()=>(null==n&&(n=jt(((t,n,r={})=>{!1!==r.lengthDelimited&&n.fork(),null!=t.type&&(n.uint32(8),e.Type.codec().encode(t.type,n)),null!=t.peer&&(n.uint32(18),Tb.codec().encode(t.peer,n)),null!=t.reservation&&(n.uint32(26),Db.codec().encode(t.reservation,n)),null!=t.limit&&(n.uint32(34),kb.codec().encode(t.limit,n)),null!=t.status&&(n.uint32(40),Pb.codec().encode(t.status,n)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.type=e.Type.codec().decode(t);break;case 2:r.peer=Tb.codec().decode(t,t.uint32());break;case 3:r.reservation=Db.codec().decode(t,t.uint32());break;case 4:r.limit=kb.codec().decode(t,t.uint32());break;case 5:r.status=Pb.codec().decode(t);break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Rb||(Rb={})),function(e){let t,n;!function(e){e.CONNECT="CONNECT",e.STATUS="STATUS"}(e.Type||(e.Type={})),function(e){e[e.CONNECT=0]="CONNECT",e[e.STATUS=1]="STATUS"}(t||(t={})),function(e){e.codec=()=>Wt(t)}(e.Type||(e.Type={})),e.codec=()=>(null==n&&(n=jt(((t,n,r={})=>{!1!==r.lengthDelimited&&n.fork(),null!=t.type&&(n.uint32(8),e.Type.codec().encode(t.type,n)),null!=t.peer&&(n.uint32(18),Tb.codec().encode(t.peer,n)),null!=t.limit&&(n.uint32(26),kb.codec().encode(t.limit,n)),null!=t.status&&(n.uint32(32),Pb.codec().encode(t.status,n)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.type=e.Type.codec().decode(t);break;case 2:r.peer=Tb.codec().decode(t,t.uint32());break;case 3:r.limit=kb.codec().decode(t,t.uint32());break;case 4:r.status=Pb.codec().decode(t);break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Ab||(Ab={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.id&&e.id.byteLength>0&&(t.uint32(10),t.bytes(e.id)),null!=e.addrs)for(const n of e.addrs)t.uint32(18),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={id:new Uint8Array(0),addrs:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.id=e.bytes();break;case 2:n.addrs.push(e.bytes());break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Tb||(Tb={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.expire&&0n!==e.expire&&(t.uint32(8),t.uint64(e.expire)),null!=e.addrs)for(const n of e.addrs)t.uint32(18),t.bytes(n);null!=e.voucher&&(t.uint32(26),t.bytes(e.voucher)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={expire:0n,addrs:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.expire=e.uint64();break;case 2:n.addrs.push(e.bytes());break;case 3:n.voucher=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Db||(Db={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.duration&&(t.uint32(8),t.uint32(e.duration)),null!=e.data&&(t.uint32(16),t.uint64(e.data)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.duration=e.uint32();break;case 2:n.data=e.uint64();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(kb||(kb={})),function(e){e.UNUSED="UNUSED",e.OK="OK",e.RESERVATION_REFUSED="RESERVATION_REFUSED",e.RESOURCE_LIMIT_EXCEEDED="RESOURCE_LIMIT_EXCEEDED",e.PERMISSION_DENIED="PERMISSION_DENIED",e.CONNECTION_FAILED="CONNECTION_FAILED",e.NO_RESERVATION="NO_RESERVATION",e.MALFORMED_MESSAGE="MALFORMED_MESSAGE",e.UNEXPECTED_MESSAGE="UNEXPECTED_MESSAGE"}(Pb||(Pb={})),function(e){e[e.UNUSED=0]="UNUSED",e[e.OK=100]="OK",e[e.RESERVATION_REFUSED=200]="RESERVATION_REFUSED",e[e.RESOURCE_LIMIT_EXCEEDED=201]="RESOURCE_LIMIT_EXCEEDED",e[e.PERMISSION_DENIED=202]="PERMISSION_DENIED",e[e.CONNECTION_FAILED=203]="CONNECTION_FAILED",e[e.NO_RESERVATION=204]="NO_RESERVATION",e[e.MALFORMED_MESSAGE=400]="MALFORMED_MESSAGE",e[e.UNEXPECTED_MESSAGE=401]="UNEXPECTED_MESSAGE"}(Cb||(Cb={})),function(e){e.codec=()=>Wt(Cb)}(Pb||(Pb={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.relay&&e.relay.byteLength>0&&(t.uint32(10),t.bytes(e.relay)),null!=e.peer&&e.peer.byteLength>0&&(t.uint32(18),t.bytes(e.peer)),null!=e.expiration&&0n!==e.expiration&&(t.uint32(24),t.uint64(e.expiration)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={relay:new Uint8Array(0),peer:new Uint8Array(0),expiration:0n},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.relay=e.bytes();break;case 2:n.peer=e.bytes();break;case 3:n.expiration=e.uint64();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(xb||(xb={}));class Mb extends wn{peerId;peerStore;contentRouting;registrar;started;topologyId;log;constructor(e){super(),this.log=e.logger.forComponent("libp2p:circuit-relay:discover-relays"),this.started=!1,this.peerId=e.peerId,this.peerStore=e.peerStore,this.contentRouting=e.contentRouting,this.registrar=e.registrar}isStarted(){return this.started}async start(){this.topologyId=await this.registrar.register(Sb,{notifyOnTransient:!0,onConnect:e=>{this.safeDispatchEvent("relay:discover",{detail:e})}}),this.started=!0}afterStart(){this.discover().catch((e=>{this.log.error("error discovering relays",e)}))}stop(){null!=this.topologyId&&this.registrar.unregister(this.topologyId),this.started=!1}async discover(){this.log("searching peer store for relays");const e=await this.peerStore.all({filters:[e=>e.protocols.includes(Sb)],orders:[()=>Math.random()<.5?1:-1]});for(const t of e)this.log("found relay peer %p in content peer store",t.id),this.safeDispatchEvent("relay:discover",{detail:t.id});this.log("found %d relay peers in peer store",e.length);try{this.log("searching content routing for relays");const e=await async function(e){const t=(new TextEncoder).encode(e),n=await gt.digest(t);return bt.createV0(n)}("/libp2p/relay");let t=0;for await(const n of this.contentRouting.findProviders(e))if(n.multiaddrs.length>0&&!n.id.equals(this.peerId)){const e=n.id;t++,await this.peerStore.merge(e,{multiaddrs:n.multiaddrs}),this.log("found relay peer %p in content routing",e),this.safeDispatchEvent("relay:discover",{detail:e})}this.log("found %d relay peers in content routing",t)}catch(e){this.log.error("failed when finding relays on the network",e)}}}class Ob extends wn{peerId;connectionManager;transportManager;peerStore;events;reserveQueue;reservations;maxDiscoveredRelays;maxReservationQueueLength;reservationCompletionTimeout;started;log;constructor(e,t){super(),this.log=e.logger.forComponent("libp2p:circuit-relay:transport:reservation-store"),this.peerId=e.peerId,this.connectionManager=e.connectionManager,this.transportManager=e.transportManager,this.peerStore=e.peerStore,this.events=e.events,this.reservations=new Wh,this.maxDiscoveredRelays=t?.discoverRelays??0,this.maxReservationQueueLength=t?.maxReservationQueueLength??100,this.reservationCompletionTimeout=t?.reservationCompletionTimeout??1e4,this.started=!1,this.reserveQueue=new Ef({concurrency:t?.reservationConcurrency??1,metricName:"libp2p_relay_reservation_queue",metrics:e.metrics}),this.events.addEventListener("peer:disconnect",(e=>{this.#B(e.detail)}))}isStarted(){return this.started}start(){this.started=!0}stop(){this.reserveQueue.clear(),this.reservations.forEach((({timeout:e})=>{clearTimeout(e)})),this.reservations.clear(),this.started=!1}async addRelay(e,t){this.peerId.equals(e)?this.log("not trying to use self as relay"):this.reserveQueue.size>this.maxReservationQueueLength?this.log("not adding relay as the queue is full"):this.reserveQueue.has(e)?this.log("relay peer is already in the reservation queue"):(this.log("add relay %p",e),await this.reserveQueue.add((async()=>{try{const n=this.reservations.get(e);if(null!=n){if(Nb(n.reservation.expire)>6e5)return void this.log("already have reservation on relay peer %p and it expires in more than 10 minutes",e);clearTimeout(n.timeout),this.reservations.delete(e)}if("discovered"===t&&[...this.reservations.values()].reduce(((e,t)=>("discovered"===t.type&&e++,e)),0)>=this.maxDiscoveredRelays)return void this.log("already have enough discovered relays");const r=AbortSignal.timeout(this.reservationCompletionTimeout),s=await this.connectionManager.openConnection(e,{signal:r});if(s.remoteAddr.protoNames().includes("p2p-circuit"))return void this.log("not creating reservation over relayed connection");const i=await this.#U(s,{signal:r});this.log("created reservation on relay peer %p",e);const o=Nb(i.expire),a=Math.min(Math.max(o-3e5,3e4),Math.pow(2,31)-1),c=setTimeout((()=>{this.addRelay(e,t).catch((t=>{this.log.error("could not refresh reservation to relay %p",e,t)}))}),a);this.reservations.set(e,{timeout:c,reservation:i,type:t}),await this.peerStore.merge(e,{tags:{[Eb]:{value:1,ttl:o}}}),await this.transportManager.listen([cr(`/p2p/${e.toString()}/p2p-circuit`)])}catch(t){this.log.error("could not reserve slot on %p",e,t);const n=this.reservations.get(e);null!=n&&clearTimeout(n.timeout),this.reservations.delete(e)}}),{peerId:e}))}hasReservation(e){return this.reservations.has(e)}getReservation(e){return this.reservations.get(e)?.reservation}async#U(e,t){t.signal?.throwIfAborted(),this.log("requesting reservation from %p",e.remotePeer);const n=await e.newStream(Sb,t),r=Aw(n).pb(Rb);let s;await r.write({type:Rb.Type.RESERVE},t);try{s=await r.read(t)}catch(t){throw this.log.error("error parsing reserve message response from %p because",e.remotePeer,t),n.abort(t),t}finally{await n.close()}if(s.status===Pb.OK&&null!=s.reservation){let t=!1;const n=e.remoteAddr.bytes;for(const e of s.reservation.addrs)if(In(n,e)){t=!0;break}return t||s.reservation.addrs.push(n),s.reservation}const i=`reservation failed with status ${s.status??"undefined"}`;throw this.log.error(i),new Error(i)}#B(e){const t=this.reservations.get(e);null!=t&&(this.log("connection to relay %p closed, removing reservation from local store",e),clearTimeout(t.timeout),this.reservations.delete(e),this.safeDispatchEvent("relay:removed",{detail:e}),this.reservations.size<this.maxDiscoveredRelays&&(this.log("not enough relays %d/%d",this.reservations.size,this.maxDiscoveredRelays),this.safeDispatchEvent("relay:not-enough-relays",{})))}}function Lb(e){const{stream:t,remoteAddr:n,logger:r}=e,s=r.forComponent("libp2p:stream:converter");let i=!1,o=!1;const a=t.close.bind(t);t.close=async e=>{await a(e),h(!0)};const c=t.abort.bind(t);t.abort=e=>{c(e),h(!0)};const l=t.sink.bind(t);t.sink=async e=>{try{await l(e)}catch(e){"aborted"!==e.type&&s.error("%s error in sink",n,e)}finally{o=!0,h()}};const u={log:s,sink:t.sink,source:async function*(){try{for await(const e of t.source)e instanceof Uint8Array?yield e:yield*e}finally{i=!0,h()}}(),remoteAddr:n,timeline:{open:Date.now(),close:void 0},close:t.close,abort:t.abort};function h(e){!0===e&&(i=!0,o=!0),i&&o&&null==u.timeline.close&&(u.timeline.close=Date.now())}return u}class Bb extends wn{connectionManager;relayStore;listeningAddrs;log;constructor(e){super(),this.log=e.logger.forComponent("libp2p:circuit-relay:transport:listener"),this.connectionManager=e.connectionManager,this.relayStore=e.relayStore,this.listeningAddrs=new Wh,this.relayStore.addEventListener("relay:removed",this._onRemoveRelayPeer)}_onRemoveRelayPeer=e=>{this.#F(e.detail)};async listen(e){this.log("listen on %a",e);const t=e.decapsulate("/p2p-circuit"),n=await this.connectionManager.openConnection(t);if(!this.relayStore.hasReservation(n.remotePeer))return this.log("making reservation on peer %p",n.remotePeer),void await this.relayStore.addRelay(n.remotePeer,"configured");const r=this.relayStore.getReservation(n.remotePeer);if(null==r)throw new fn("Did not have reservation after making reservation","ERR_NO_RESERVATION");this.listeningAddrs.has(n.remotePeer)?this.log("already listening on relay %p",n.remotePeer):(this.listeningAddrs.set(n.remotePeer,r.addrs.map((e=>cr(e).encapsulate("/p2p-circuit")))),this.safeDispatchEvent("listening",{}))}getAddrs(){return[...this.listeningAddrs.values()].flat()}async close(){}#F(e){const t=this.listeningAddrs.has(e);this.log("relay peer removed %p - had reservation",e,t),this.listeningAddrs.delete(e),t&&(this.log.trace("removing relay event listener for peer %p",e),this.relayStore.removeEventListener("relay:removed",this._onRemoveRelayPeer),this.safeDispatchEvent("close",{}))}}const Ub=300,Fb=300,Vb=3e4;class Kb{discovery;registrar;peerStore;connectionManager;transportManager;peerId;upgrader;addressManager;connectionGater;reservationStore;logger;maxInboundStopStreams;maxOutboundStopStreams;stopTimeout;started;log;constructor(e,t){this.log=e.logger.forComponent("libp2p:circuit-relay:transport"),this.registrar=e.registrar,this.peerStore=e.peerStore,this.connectionManager=e.connectionManager,this.transportManager=e.transportManager,this.logger=e.logger,this.peerId=e.peerId,this.upgrader=e.upgrader,this.addressManager=e.addressManager,this.connectionGater=e.connectionGater,this.maxInboundStopStreams=t.maxInboundStopStreams??Ub,this.maxOutboundStopStreams=t.maxOutboundStopStreams??Fb,this.stopTimeout=t.stopTimeout??Vb,null!=t.discoverRelays&&t.discoverRelays>0&&(this.discovery=new Mb(e),this.discovery.addEventListener("relay:discover",(e=>{this.reservationStore.addRelay(e.detail,"discovered").catch((t=>{this.log.error("could not add discovered relay %p",e.detail,t)}))}))),this.reservationStore=new Ob(e,t),this.reservationStore.addEventListener("relay:not-enough-relays",(()=>{this.discovery?.discover().catch((e=>{this.log.error("could not discover relays",e)}))})),this.started=!1}isStarted(){return this.started}async start(){this.reservationStore.start(),await this.registrar.handle(_b,(e=>{this.onStop(e).catch((t=>{this.log.error("error while handling STOP protocol",t),e.stream.abort(t)}))}),{maxInboundStreams:this.maxInboundStopStreams,maxOutboundStreams:this.maxOutboundStopStreams,runOnTransientConnection:!0}),await(this.discovery?.start()),this.started=!0}afterStart(){this.discovery?.afterStart()}async stop(){this.discovery?.stop(),this.reservationStore.stop(),await this.registrar.unhandle(_b),this.started=!1}[hn]=!0;[Symbol.toStringTag]="libp2p/circuit-relay-v2";async dial(e,t={}){if(1!==e.protoCodes().filter((e=>290===e)).length){const t="Invalid circuit relay address";throw this.log.error(t,e),new fn(t,Ib)}const n=e.toString().split("/p2p-circuit"),r=cr(n[0]),s=cr(n[n.length-1]),i=r.getPeerId(),o=s.getPeerId();if(null==i||null==o){const t=`Circuit relay dial to ${e.toString()} failed as address did not have peer ids`;throw this.log.error(t),new fn(t,Ib)}const a=Is(i),c=Is(o);let l=!1;let u,h=this.connectionManager.getConnections(a)[0];null==h&&(await this.peerStore.merge(a,{multiaddrs:[r]}),h=await this.connectionManager.openConnection(a,t),l=!0);try{return u=await h.newStream(Sb),await this.connectV2({stream:u,connection:h,destinationPeer:c,destinationAddr:s,relayAddr:r,ma:e,disconnectOnFailure:l})}catch(e){throw this.log.error("circuit relay dial to destination %p via relay %p failed",c,a,e),null!=u&&u.abort(e),l&&await h.close(),e}}async connectV2({stream:e,connection:t,destinationPeer:n,destinationAddr:r,relayAddr:s,ma:i,disconnectOnFailure:o}){try{const t=Aw(e),o=t.pb(Rb);await o.write({type:Rb.Type.CONNECT,peer:{id:n.toBytes(),addrs:[cr(r).bytes]}});const a=await o.read();if(a.status!==Pb.OK)throw new fn(`failed to connect via relay with status ${a?.status?.toString()??"undefined"}`,"ERR_HOP_REQUEST_FAILED");const c=Lb({stream:t.unwrap(),remoteAddr:i,localAddr:s.encapsulate(`/p2p-circuit/p2p/${this.peerId.toString()}`),logger:this.logger});return this.log("new outbound transient connection %a",c.remoteAddr),await this.upgrader.upgradeOutbound(c,{transient:!0})}catch(e){throw this.log.error(`Circuit relay dial to destination ${n.toString()} via relay ${t.remotePeer.toString()} failed`,e),o&&await t.close(),e}}createListener(e){return function(e){return new Bb(e)}({connectionManager:this.connectionManager,relayStore:this.reservationStore,logger:this.logger})}listenFilter(e){return(e=Array.isArray(e)?e:[e]).filter((e=>Wy.matches(e)))}dialFilter(e){return this.listenFilter(e)}async onStop({connection:e,stream:t}){if(!this.reservationStore.hasReservation(e.remotePeer))try{this.log("dialed via relay we did not have a reservation on, start listening on that relay address"),await this.transportManager.listen([e.remoteAddr.encapsulate("/p2p-circuit")])}catch(e){this.log.error("failed to listen on a relay peer we were dialed via but did not have a reservation on",e)}const n=AbortSignal.timeout(this.stopTimeout),r=Aw(t).pb(Ab),s=await r.read({signal:n});if(this.log("new circuit relay v2 stop stream from %p with type %s",e.remotePeer,s.type),void 0===s?.type)return this.log.error("type was missing from circuit v2 stop protocol request from %s",e.remotePeer),await r.write({type:Ab.Type.STATUS,status:Pb.MALFORMED_MESSAGE},{signal:n}),void await t.close();if(s.type!==Ab.Type.CONNECT)return this.log.error("invalid stop connect request via peer %p",e.remotePeer),await r.write({type:Ab.Type.STATUS,status:Pb.UNEXPECTED_MESSAGE},{signal:n}),void await t.close();if(!(e=>{if(null==e.peer)return!1;try{e.peer.addrs.forEach(cr)}catch{return!1}return!0})(s))return this.log.error("invalid stop connect request via peer %p",e.remotePeer),await r.write({type:Ab.Type.STATUS,status:Pb.MALFORMED_MESSAGE},{signal:n}),void await t.close();const i=Rs(s.peer.id);if(!0===await(this.connectionGater.denyInboundRelayedConnection?.(e.remotePeer,i)))return this.log.error("connection gater denied inbound relayed connection from %p",e.remotePeer),await r.write({type:Ab.Type.STATUS,status:Pb.PERMISSION_DENIED},{signal:n}),void await t.close();this.log.trace("sending success response to %p",e.remotePeer),await r.write({type:Ab.Type.STATUS,status:Pb.OK},{signal:n});const o=e.remoteAddr.encapsulate(`/p2p-circuit/p2p/${i.toString()}`),a=this.addressManager.getAddresses()[0],c=Lb({stream:r.unwrap().unwrap(),remoteAddr:o,localAddr:a,logger:this.logger});this.log("new inbound transient connection %a",c.remoteAddr),await this.upgrader.upgradeInbound(c,{transient:!0}),this.log("%s connection %a upgraded","inbound",c.remoteAddr)}}function $b(e={}){return t=>new Kb(t,e)}const qb="/floodsub/1.0.0",Hb="/meshsub/1.0.0",zb="/meshsub/1.1.0",Wb=5e3,jb={maxSubscriptions:1/0,maxMessages:1/0,maxIhaveMessageIDs:1/0,maxIwantMessageIDs:1/0,maxControlMessages:1/0,maxPeerInfos:1/0};var Gb,Yb,Qb,Jb,Zb,Xb,ev,tv,nv,rv,sv,iv;!function(e){let t;!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.subscribe&&(t.uint32(8),t.bool(e.subscribe)),null!=e.topic&&(t.uint32(18),t.string(e.topic)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();switch(t>>>3){case 1:r.subscribe=e.bool();break;case 2:r.topic=e.string();break;default:e.skipType(7&t)}}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=(t,n)=>G(t,e.codec(),n)}(e.SubOpts||(e.SubOpts={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.from&&(t.uint32(10),t.bytes(e.from)),null!=e.data&&(t.uint32(18),t.bytes(e.data)),null!=e.seqno&&(t.uint32(26),t.bytes(e.seqno)),null!=e.topic&&""!==e.topic&&(t.uint32(34),t.string(e.topic)),null!=e.signature&&(t.uint32(42),t.bytes(e.signature)),null!=e.key&&(t.uint32(50),t.bytes(e.key)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={topic:""},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();switch(t>>>3){case 1:r.from=e.bytes();break;case 2:r.data=e.bytes();break;case 3:r.seqno=e.bytes();break;case 4:r.topic=e.string();break;case 5:r.signature=e.bytes();break;case 6:r.key=e.bytes();break;default:e.skipType(7&t)}}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=(t,n)=>G(t,e.codec(),n)}(e.Message||(e.Message={})),function(t){let n;t.codec=()=>(null==n&&(n=jt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.ihave)for(const r of t.ihave)n.uint32(10),e.ControlIHave.codec().encode(r,n);if(null!=t.iwant)for(const r of t.iwant)n.uint32(18),e.ControlIWant.codec().encode(r,n);if(null!=t.graft)for(const r of t.graft)n.uint32(26),e.ControlGraft.codec().encode(r,n);if(null!=t.prune)for(const r of t.prune)n.uint32(34),e.ControlPrune.codec().encode(r,n);!1!==r.lengthDelimited&&n.ldelim()}),((t,n,r={})=>{const s={ihave:[],iwant:[],graft:[],prune:[]},i=null==n?t.len:t.pos+n;for(;t.pos<i;){const n=t.uint32();switch(n>>>3){case 1:if(null!=r.limits?.ihave&&s.ihave.length===r.limits.ihave)throw new Gt('decode error - map field "ihave" had too many elements',"ERR_MAX_LENGTH");s.ihave.push(e.ControlIHave.codec().decode(t,t.uint32()));break;case 2:if(null!=r.limits?.iwant&&s.iwant.length===r.limits.iwant)throw new Gt('decode error - map field "iwant" had too many elements',"ERR_MAX_LENGTH");s.iwant.push(e.ControlIWant.codec().decode(t,t.uint32()));break;case 3:if(null!=r.limits?.graft&&s.graft.length===r.limits.graft)throw new Gt('decode error - map field "graft" had too many elements',"ERR_MAX_LENGTH");s.graft.push(e.ControlGraft.codec().decode(t,t.uint32()));break;case 4:if(null!=r.limits?.prune&&s.prune.length===r.limits.prune)throw new Gt('decode error - map field "prune" had too many elements',"ERR_MAX_LENGTH");s.prune.push(e.ControlPrune.codec().decode(t,t.uint32()));break;default:t.skipType(7&n)}}return s}))),n),t.encode=e=>qt(e,t.codec()),t.decode=(e,n)=>G(e,t.codec(),n)}(e.ControlMessage||(e.ControlMessage={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.topicID&&(t.uint32(10),t.string(e.topicID)),null!=e.messageIDs)for(const n of e.messageIDs)t.uint32(18),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={messageIDs:[]},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();switch(t>>>3){case 1:r.topicID=e.string();break;case 2:if(null!=n.limits?.messageIDs&&r.messageIDs.length===n.limits.messageIDs)throw new Gt('decode error - map field "messageIDs" had too many elements',"ERR_MAX_LENGTH");r.messageIDs.push(e.bytes());break;default:e.skipType(7&t)}}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=(t,n)=>G(t,e.codec(),n)}(e.ControlIHave||(e.ControlIHave={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.messageIDs)for(const n of e.messageIDs)t.uint32(10),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={messageIDs:[]},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();if(t>>>3==1){if(null!=n.limits?.messageIDs&&r.messageIDs.length===n.limits.messageIDs)throw new Gt('decode error - map field "messageIDs" had too many elements',"ERR_MAX_LENGTH");r.messageIDs.push(e.bytes())}else e.skipType(7&t)}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=(t,n)=>G(t,e.codec(),n)}(e.ControlIWant||(e.ControlIWant={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.topicID&&(t.uint32(10),t.string(e.topicID)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();if(t>>>3==1)r.topicID=e.string();else e.skipType(7&t)}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=(t,n)=>G(t,e.codec(),n)}(e.ControlGraft||(e.ControlGraft={})),function(t){let n;t.codec=()=>(null==n&&(n=jt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.topicID&&(n.uint32(10),n.string(t.topicID)),null!=t.peers)for(const r of t.peers)n.uint32(18),e.PeerInfo.codec().encode(r,n);null!=t.backoff&&(n.uint32(24),n.uint64Number(t.backoff)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n,r={})=>{const s={peers:[]},i=null==n?t.len:t.pos+n;for(;t.pos<i;){const n=t.uint32();switch(n>>>3){case 1:s.topicID=t.string();break;case 2:if(null!=r.limits?.peers&&s.peers.length===r.limits.peers)throw new Gt('decode error - map field "peers" had too many elements',"ERR_MAX_LENGTH");s.peers.push(e.PeerInfo.codec().decode(t,t.uint32()));break;case 3:s.backoff=t.uint64Number();break;default:t.skipType(7&n)}}return s}))),n),t.encode=e=>qt(e,t.codec()),t.decode=(e,n)=>G(e,t.codec(),n)}(e.ControlPrune||(e.ControlPrune={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.peerID&&(t.uint32(10),t.bytes(e.peerID)),null!=e.signedPeerRecord&&(t.uint32(18),t.bytes(e.signedPeerRecord)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();switch(t>>>3){case 1:r.peerID=e.bytes();break;case 2:r.signedPeerRecord=e.bytes();break;default:e.skipType(7&t)}}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=(t,n)=>G(t,e.codec(),n)}(e.PeerInfo||(e.PeerInfo={})),e.codec=()=>(null==t&&(t=jt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.subscriptions)for(const r of t.subscriptions)n.uint32(10),e.SubOpts.codec().encode(r,n);if(null!=t.messages)for(const r of t.messages)n.uint32(18),e.Message.codec().encode(r,n);null!=t.control&&(n.uint32(26),e.ControlMessage.codec().encode(t.control,n)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n,r={})=>{const s={subscriptions:[],messages:[]},i=null==n?t.len:t.pos+n;for(;t.pos<i;){const n=t.uint32();switch(n>>>3){case 1:if(null!=r.limits?.subscriptions&&s.subscriptions.length===r.limits.subscriptions)throw new Gt('decode error - map field "subscriptions" had too many elements',"ERR_MAX_LENGTH");s.subscriptions.push(e.SubOpts.codec().decode(t,t.uint32()));break;case 2:if(null!=r.limits?.messages&&s.messages.length===r.limits.messages)throw new Gt('decode error - map field "messages" had too many elements',"ERR_MAX_LENGTH");s.messages.push(e.Message.codec().decode(t,t.uint32()));break;case 3:s.control=e.ControlMessage.codec().decode(t,t.uint32());break;default:t.skipType(7&n)}}return s}))),t),e.encode=t=>qt(t,e.codec()),e.decode=(t,n)=>G(t,e.codec(),n)}(Gb||(Gb={}));class ov{gossip;msgs=new Map;msgIdToStrFn;history=[];notValidatedCount=0;constructor(e,t,n){this.gossip=e,this.msgIdToStrFn=n;for(let e=0;e<t;e++)this.history[e]=[]}get size(){return this.msgs.size}put(e,t,n=!1){const{msgIdStr:r}=e;return!this.msgs.has(r)&&(this.msgs.set(r,{message:t,validated:n,originatingPeers:new Set,iwantCounts:new Map}),this.history[0].push({...e,topic:t.topic}),n||this.notValidatedCount++,!0)}observeDuplicate(e,t){const n=this.msgs.get(e);null==n||n.validated||n.originatingPeers.add(t)}get(e){return this.msgs.get(this.msgIdToStrFn(e))?.message}getWithIWantCount(e,t){const n=this.msgs.get(e);if(null==n)return null;const r=(n.iwantCounts.get(t)??0)+1;return n.iwantCounts.set(t,r),{msg:n.message,count:r}}getGossipIDs(e){const t=new Map;for(let n=0;n<this.gossip;n++)this.history[n].forEach((n=>{const r=this.msgs.get(n.msgIdStr);if(r?.validated&&e.has(n.topic)){let e=t.get(n.topic);null==e&&(e=[],t.set(n.topic,e)),e.push(n.msgId)}}));return t}validate(e){const t=this.msgs.get(e);if(null==t)return null;t.validated||this.notValidatedCount--;const{message:n,originatingPeers:r}=t;return t.validated=!0,t.originatingPeers=new Set,{message:n,originatingPeers:r}}shift(){this.history[this.history.length-1].forEach((e=>{const t=this.msgs.get(e.msgIdStr);null!=t&&(this.msgs.delete(e.msgIdStr),t.validated||this.notValidatedCount--)})),this.history.pop(),this.history.unshift([])}remove(e){const t=this.msgs.get(e);return null==t?null:(this.msgs.delete(e),t)}}function av(e){switch(e){case un.Ignore:return Jb.Ignore;case un.Reject:return Jb.Reject;default:throw new Error("Unreachable")}}!function(e){e.StrictSign="StrictSign",e.StrictNoSign="StrictNoSign"}(Yb||(Yb={})),function(e){e[e.Signing=0]="Signing",e[e.Anonymous=1]="Anonymous"}(Qb||(Qb={})),function(e){e.Error="error",e.Ignore="ignore",e.Reject="reject",e.Blacklisted="blacklisted"}(Jb||(Jb={})),function(e){e.InvalidSignature="invalid_signature",e.InvalidSeqno="invalid_seqno",e.InvalidPeerId="invalid_peerid",e.SignaturePresent="signature_present",e.SeqnoPresent="seqno_present",e.FromPresent="from_present",e.TransformFailed="transform_failed"}(Zb||(Zb={})),function(e){e.duplicate="duplicate",e.invalid="invalid",e.valid="valid"}(Xb||(Xb={})),function(e){e.forward="forward",e.publish="publish"}(ev||(ev={})),function(e){e.Fanout="fanout",e.Random="random",e.Subscribed="subscribed",e.Outbound="outbound",e.NotEnough="not_enough",e.Opportunistic="opportunistic"}(tv||(tv={})),function(e){e.Dc="disconnected",e.BadScore="bad_score",e.Prune="prune",e.Excess="excess"}(nv||(nv={})),function(e){e.GraftBackoff="graft_backoff",e.BrokenPromise="broken_promise",e.MessageDeficit="message_deficit",e.IPColocation="IP_colocation"}(rv||(rv={})),function(e){e.LowScore="low_score",e.MaxIhave="max_ihave",e.MaxIasked="max_iasked"}(sv||(sv={})),function(e){e.graylist="graylist",e.publish="publish",e.gossip="gossip",e.mesh="mesh"}(iv||(iv={}));const cv="ERR_INVALID_PEER_SCORE_PARAMS",lv={topics:{},topicScoreCap:10,appSpecificScore:()=>0,appSpecificWeight:10,IPColocationFactorWeight:-5,IPColocationFactorThreshold:10,IPColocationFactorWhitelist:new Set,behaviourPenaltyWeight:-10,behaviourPenaltyThreshold:0,behaviourPenaltyDecay:.2,decayInterval:1e3,decayToZero:.1,retainScore:36e5},uv={topicWeight:.5,timeInMeshWeight:1,timeInMeshQuantum:1,timeInMeshCap:3600,firstMessageDeliveriesWeight:1,firstMessageDeliveriesDecay:.5,firstMessageDeliveriesCap:2e3,meshMessageDeliveriesWeight:-1,meshMessageDeliveriesDecay:.5,meshMessageDeliveriesCap:100,meshMessageDeliveriesThreshold:20,meshMessageDeliveriesWindow:10,meshMessageDeliveriesActivation:5e3,meshFailurePenaltyWeight:-1,meshFailurePenaltyDecay:.5,invalidMessageDeliveriesWeight:-1,invalidMessageDeliveriesDecay:.3};function hv(e={}){return{...lv,...e,topics:null!=e.topics?Object.entries(e.topics).reduce(((e,[t,n])=>(e[t]=function(e={}){return{...uv,...e}}(n),e)),{}):{}}}function dv(e){if(e.topicWeight<0)throw new fn("invalid topic weight; must be >= 0",cv);if(0===e.timeInMeshQuantum)throw new fn("invalid TimeInMeshQuantum; must be non zero",cv);if(e.timeInMeshWeight<0)throw new fn("invalid TimeInMeshWeight; must be positive (or 0 to disable)",cv);if(0!==e.timeInMeshWeight&&e.timeInMeshQuantum<=0)throw new fn("invalid TimeInMeshQuantum; must be positive",cv);if(0!==e.timeInMeshWeight&&e.timeInMeshCap<=0)throw new fn("invalid TimeInMeshCap; must be positive",cv);if(e.firstMessageDeliveriesWeight<0)throw new fn("invallid FirstMessageDeliveriesWeight; must be positive (or 0 to disable)",cv);if(0!==e.firstMessageDeliveriesWeight&&(e.firstMessageDeliveriesDecay<=0||e.firstMessageDeliveriesDecay>=1))throw new fn("invalid FirstMessageDeliveriesDecay; must be between 0 and 1",cv);if(0!==e.firstMessageDeliveriesWeight&&e.firstMessageDeliveriesCap<=0)throw new fn("invalid FirstMessageDeliveriesCap; must be positive",cv);if(e.meshMessageDeliveriesWeight>0)throw new fn("invalid MeshMessageDeliveriesWeight; must be negative (or 0 to disable)",cv);if(0!==e.meshMessageDeliveriesWeight&&(e.meshMessageDeliveriesDecay<=0||e.meshMessageDeliveriesDecay>=1))throw new fn("invalid MeshMessageDeliveriesDecay; must be between 0 and 1",cv);if(0!==e.meshMessageDeliveriesWeight&&e.meshMessageDeliveriesCap<=0)throw new fn("invalid MeshMessageDeliveriesCap; must be positive",cv);if(0!==e.meshMessageDeliveriesWeight&&e.meshMessageDeliveriesThreshold<=0)throw new fn("invalid MeshMessageDeliveriesThreshold; must be positive",cv);if(e.meshMessageDeliveriesWindow<0)throw new fn("invalid MeshMessageDeliveriesWindow; must be non-negative",cv);if(0!==e.meshMessageDeliveriesWeight&&e.meshMessageDeliveriesActivation<1e3)throw new fn("invalid MeshMessageDeliveriesActivation; must be at least 1s",cv);if(e.meshFailurePenaltyWeight>0)throw new fn("invalid MeshFailurePenaltyWeight; must be negative (or 0 to disable)",cv);if(0!==e.meshFailurePenaltyWeight&&(e.meshFailurePenaltyDecay<=0||e.meshFailurePenaltyDecay>=1))throw new fn("invalid MeshFailurePenaltyDecay; must be between 0 and 1",cv);if(e.invalidMessageDeliveriesWeight>0)throw new fn("invalid InvalidMessageDeliveriesWeight; must be negative (or 0 to disable)",cv);if(e.invalidMessageDeliveriesDecay<=0||e.invalidMessageDeliveriesDecay>=1)throw new fn("invalid InvalidMessageDeliveriesDecay; must be between 0 and 1",cv)}const pv={gossipThreshold:-10,publishThreshold:-50,graylistThreshold:-80,acceptPXThreshold:10,opportunisticGraftThreshold:20};function fv(e={}){return{...pv,...e}}function gv(e,t,n=(()=>!0)){const r=new Set;if(t<=0)return r;for(const s of e){if(r.size>=t)break;n(s)&&(r.add(s),e.delete(s))}return r}class mv extends Map{getDefault;constructor(e){super(),this.getDefault=e}getOrDefault(e){let t=super.get(e);return void 0===t&&(t=this.getDefault(),this.set(e,t)),t}}function yv(e,t,n,r){let s=0;Object.entries(t.topics).forEach((([e,t])=>{const r=n.topics[e];if(void 0===r)return;let i=0;if(t.inMesh){let e=t.meshTime/r.timeInMeshQuantum;e>r.timeInMeshCap&&(e=r.timeInMeshCap),i+=e*r.timeInMeshWeight}let o=t.firstMessageDeliveries;if(o>r.firstMessageDeliveriesCap&&(o=r.firstMessageDeliveriesCap),i+=o*r.firstMessageDeliveriesWeight,t.meshMessageDeliveriesActive&&t.meshMessageDeliveries<r.meshMessageDeliveriesThreshold){const e=r.meshMessageDeliveriesThreshold-t.meshMessageDeliveries;i+=e*e*r.meshMessageDeliveriesWeight}i+=t.meshFailurePenalty*r.meshFailurePenaltyWeight;i+=t.invalidMessageDeliveries*t.invalidMessageDeliveries*r.invalidMessageDeliveriesWeight,s+=i*r.topicWeight})),n.topicScoreCap>0&&s>n.topicScoreCap&&(s=n.topicScoreCap);const i=n.appSpecificScore(e);if(s+=i*n.appSpecificWeight,t.knownIPs.forEach((e=>{if(n.IPColocationFactorWhitelist.has(e))return;const t=r.get(e),i=null!=t?t.size:0;if(i>n.IPColocationFactorThreshold){const e=i-n.IPColocationFactorThreshold;s+=e*e*n.IPColocationFactorWeight}})),t.behaviourPenalty>n.behaviourPenaltyThreshold){const e=t.behaviourPenalty-n.behaviourPenaltyThreshold;s+=e*e*n.behaviourPenaltyWeight}return s}function wv(e,t){t=t||{};this._capacity=t.capacity,this._head=0,this._tail=0,Array.isArray(e)?this._fromArray(e):(this._capacityMask=3,this._list=new Array(4))}wv.prototype.peekAt=function(e){var t=e;if(t===(0|t)){var n=this.size();if(!(t>=n||t<-n))return t<0&&(t+=n),t=this._head+t&this._capacityMask,this._list[t]}},wv.prototype.get=function(e){return this.peekAt(e)},wv.prototype.peek=function(){if(this._head!==this._tail)return this._list[this._head]},wv.prototype.peekFront=function(){return this.peek()},wv.prototype.peekBack=function(){return this.peekAt(-1)},Object.defineProperty(wv.prototype,"length",{get:function(){return this.size()}}),wv.prototype.size=function(){return this._head===this._tail?0:this._head<this._tail?this._tail-this._head:this._capacityMask+1-(this._head-this._tail)},wv.prototype.unshift=function(e){if(0===arguments.length)return this.size();var t=this._list.length;return this._head=this._head-1+t&this._capacityMask,this._list[this._head]=e,this._tail===this._head&&this._growArray(),this._capacity&&this.size()>this._capacity&&this.pop(),this._head<this._tail?this._tail-this._head:this._capacityMask+1-(this._head-this._tail)},wv.prototype.shift=function(){var e=this._head;if(e!==this._tail){var t=this._list[e];return this._list[e]=void 0,this._head=e+1&this._capacityMask,e<2&&this._tail>1e4&&this._tail<=this._list.length>>>2&&this._shrinkArray(),t}},wv.prototype.push=function(e){if(0===arguments.length)return this.size();var t=this._tail;return this._list[t]=e,this._tail=t+1&this._capacityMask,this._tail===this._head&&this._growArray(),this._capacity&&this.size()>this._capacity&&this.shift(),this._head<this._tail?this._tail-this._head:this._capacityMask+1-(this._head-this._tail)},wv.prototype.pop=function(){var e=this._tail;if(e!==this._head){var t=this._list.length;this._tail=e-1+t&this._capacityMask;var n=this._list[this._tail];return this._list[this._tail]=void 0,this._head<2&&e>1e4&&e<=t>>>2&&this._shrinkArray(),n}},wv.prototype.removeOne=function(e){var t=e;if(t===(0|t)&&this._head!==this._tail){var n=this.size(),r=this._list.length;if(!(t>=n||t<-n)){t<0&&(t+=n),t=this._head+t&this._capacityMask;var s,i=this._list[t];if(e<n/2){for(s=e;s>0;s--)this._list[t]=this._list[t=t-1+r&this._capacityMask];this._list[t]=void 0,this._head=this._head+1+r&this._capacityMask}else{for(s=n-1-e;s>0;s--)this._list[t]=this._list[t=t+1+r&this._capacityMask];this._list[t]=void 0,this._tail=this._tail-1+r&this._capacityMask}return i}}},wv.prototype.remove=function(e,t){var n,r=e,s=t;if(r===(0|r)&&this._head!==this._tail){var i=this.size(),o=this._list.length;if(!(r>=i||r<-i||t<1)){if(r<0&&(r+=i),1===t||!t)return(n=new Array(1))[0]=this.removeOne(r),n;if(0===r&&r+t>=i)return n=this.toArray(),this.clear(),n;var a;for(r+t>i&&(t=i-r),n=new Array(t),a=0;a<t;a++)n[a]=this._list[this._head+r+a&this._capacityMask];if(r=this._head+r&this._capacityMask,e+t===i){for(this._tail=this._tail-t+o&this._capacityMask,a=t;a>0;a--)this._list[r=r+1+o&this._capacityMask]=void 0;return n}if(0===e){for(this._head=this._head+t+o&this._capacityMask,a=t-1;a>0;a--)this._list[r=r+1+o&this._capacityMask]=void 0;return n}if(r<i/2){for(this._head=this._head+e+t+o&this._capacityMask,a=e;a>0;a--)this.unshift(this._list[r=r-1+o&this._capacityMask]);for(r=this._head-1+o&this._capacityMask;s>0;)this._list[r=r-1+o&this._capacityMask]=void 0,s--;e<0&&(this._tail=r)}else{for(this._tail=r,r=r+t+o&this._capacityMask,a=i-(t+e);a>0;a--)this.push(this._list[r++]);for(r=this._tail;s>0;)this._list[r=r+1+o&this._capacityMask]=void 0,s--}return this._head<2&&this._tail>1e4&&this._tail<=o>>>2&&this._shrinkArray(),n}}},wv.prototype.splice=function(e,t){var n=e;if(n===(0|n)){var r=this.size();if(n<0&&(n+=r),!(n>r)){if(arguments.length>2){var s,i,o,a=arguments.length,c=this._list.length,l=2;if(!r||n<r/2){for(i=new Array(n),s=0;s<n;s++)i[s]=this._list[this._head+s&this._capacityMask];for(0===t?(o=[],n>0&&(this._head=this._head+n+c&this._capacityMask)):(o=this.remove(n,t),this._head=this._head+n+c&this._capacityMask);a>l;)this.unshift(arguments[--a]);for(s=n;s>0;s--)this.unshift(i[s-1])}else{var u=(i=new Array(r-(n+t))).length;for(s=0;s<u;s++)i[s]=this._list[this._head+n+t+s&this._capacityMask];for(0===t?(o=[],n!=r&&(this._tail=this._head+n+c&this._capacityMask)):(o=this.remove(n,t),this._tail=this._tail-u+c&this._capacityMask);l<a;)this.push(arguments[l++]);for(s=0;s<u;s++)this.push(i[s])}return o}return this.remove(n,t)}}},wv.prototype.clear=function(){this._list=new Array(this._list.length),this._head=0,this._tail=0},wv.prototype.isEmpty=function(){return this._head===this._tail},wv.prototype.toArray=function(){return this._copyArray(!1)},wv.prototype._fromArray=function(e){var t=e.length,n=this._nextPowerOf2(t);this._list=new Array(n),this._capacityMask=n-1,this._tail=t;for(var r=0;r<t;r++)this._list[r]=e[r]},wv.prototype._copyArray=function(e,t){var n=this._list,r=n.length,s=this.length;if((t|=s)==s&&this._head<this._tail)return this._list.slice(this._head,this._tail);var i,o=new Array(t),a=0;if(e||this._head>this._tail){for(i=this._head;i<r;i++)o[a++]=n[i];for(i=0;i<this._tail;i++)o[a++]=n[i]}else for(i=this._head;i<this._tail;i++)o[a++]=n[i];return o},wv.prototype._growArray=function(){if(0!=this._head){var e=this._copyArray(!0,this._list.length<<1);this._tail=this._list.length,this._head=0,this._list=e}else this._tail=this._list.length,this._list.length<<=1;this._capacityMask=this._capacityMask<<1|1},wv.prototype._shrinkArray=function(){this._list.length>>>=1,this._capacityMask>>>=1},wv.prototype._nextPowerOf2=function(e){var t=1<<Math.log(e)/Math.log(2)+1;return Math.max(t,4)};var bv,vv=Br(wv);!function(e){e[e.unknown=0]="unknown",e[e.valid=1]="valid",e[e.invalid=2]="invalid",e[e.ignored=3]="ignored"}(bv||(bv={}));class Ev{records;queue;constructor(){this.records=new Map,this.queue=new vv}getRecord(e){return this.records.get(e)}ensureRecord(e){let t=this.records.get(e);if(null!=t)return t;t={status:bv.unknown,firstSeenTsMs:Date.now(),validated:0,peers:new Set},this.records.set(e,t);const n={msgId:e,expire:Date.now()+12e4};return this.queue.push(n),t}gc(){const e=Date.now();let t=this.queue.peekFront();for(;null!=t&&t.expire<e;)this.records.delete(t.msgId),this.queue.shift(),t=this.queue.peekFront()}clear(){this.records.clear(),this.queue.clear()}}class Sv{params;metrics;peerStats=new Map;peerIPs=new mv((()=>new Set));scoreCache=new Map;deliveryRecords=new Ev;_backgroundInterval;scoreCacheValidityMs;computeScore;log;constructor(e,t,n,r){this.params=e,this.metrics=t,function(e){for(const[t,n]of Object.entries(e.topics))try{dv(n)}catch(e){throw new fn(`invalid score parameters for topic ${t}: ${e.message}`,cv)}if(e.topicScoreCap<0)throw new fn("invalid topic score cap; must be positive (or 0 for no cap)",cv);if(null===e.appSpecificScore||void 0===e.appSpecificScore)throw new fn("missing application specific score function",cv);if(e.IPColocationFactorWeight>0)throw new fn("invalid IPColocationFactorWeight; must be negative (or 0 to disable)",cv);if(0!==e.IPColocationFactorWeight&&e.IPColocationFactorThreshold<1)throw new fn("invalid IPColocationFactorThreshold; must be at least 1",cv);if(e.behaviourPenaltyWeight>0)throw new fn("invalid BehaviourPenaltyWeight; must be negative (or 0 to disable)",cv);if(0!==e.behaviourPenaltyWeight&&(e.behaviourPenaltyDecay<=0||e.behaviourPenaltyDecay>=1))throw new fn("invalid BehaviourPenaltyDecay; must be between 0 and 1",cv);if(e.decayInterval<1e3)throw new fn("invalid DecayInterval; must be at least 1s",cv);if(e.decayToZero<=0||e.decayToZero>=1)throw new fn("invalid DecayToZero; must be between 0 and 1",cv)}(e),this.scoreCacheValidityMs=r.scoreCacheValidityMs,this.computeScore=r.computeScore??yv,this.log=n.forComponent("libp2p:gossipsub:score")}get size(){return this.peerStats.size}start(){null==this._backgroundInterval?(this._backgroundInterval=setInterval((()=>{this.background()}),this.params.decayInterval),this.log("started")):this.log("Peer score already running")}stop(){null!=this._backgroundInterval?(clearInterval(this._backgroundInterval),delete this._backgroundInterval,this.peerIPs.clear(),this.peerStats.clear(),this.deliveryRecords.clear(),this.log("stopped")):this.log("Peer score already stopped")}background(){this.refreshScores(),this.deliveryRecords.gc()}dumpPeerScoreStats(){return Object.fromEntries(Array.from(this.peerStats.entries()).map((([e,t])=>[e,t])))}messageFirstSeenTimestampMs(e){const t=this.deliveryRecords.getRecord(e);return null!=t?t.firstSeenTsMs:null}refreshScores(){const e=Date.now(),t=this.params.decayToZero;this.peerStats.forEach(((n,r)=>{n.connected?(Object.entries(n.topics).forEach((([n,r])=>{const s=this.params.topics[n];void 0!==s&&(r.firstMessageDeliveries*=s.firstMessageDeliveriesDecay,r.firstMessageDeliveries<t&&(r.firstMessageDeliveries=0),r.meshMessageDeliveries*=s.meshMessageDeliveriesDecay,r.meshMessageDeliveries<t&&(r.meshMessageDeliveries=0),r.meshFailurePenalty*=s.meshFailurePenaltyDecay,r.meshFailurePenalty<t&&(r.meshFailurePenalty=0),r.invalidMessageDeliveries*=s.invalidMessageDeliveriesDecay,r.invalidMessageDeliveries<t&&(r.invalidMessageDeliveries=0),r.inMesh&&(r.meshTime=e-r.graftTime,r.meshTime>s.meshMessageDeliveriesActivation&&(r.meshMessageDeliveriesActive=!0)))})),n.behaviourPenalty*=this.params.behaviourPenaltyDecay,n.behaviourPenalty<t&&(n.behaviourPenalty=0)):e>n.expire&&(this.removeIPsForPeer(r,n.knownIPs),this.peerStats.delete(r),this.scoreCache.delete(r))}))}score(e){this.metrics?.scoreFnCalls.inc();const t=this.peerStats.get(e);if(null==t)return 0;const n=Date.now(),r=this.scoreCache.get(e);if(null!=r&&r.cacheUntil>n)return r.score;this.metrics?.scoreFnRuns.inc();const s=this.computeScore(e,t,this.params,this.peerIPs),i=n+this.scoreCacheValidityMs;return null!=r?(this.metrics?.scoreCachedDelta.observe(Math.abs(s-r.score)),r.score=s,r.cacheUntil=i):this.scoreCache.set(e,{score:s,cacheUntil:i}),s}addPenalty(e,t,n){const r=this.peerStats.get(e);null!=r&&(r.behaviourPenalty+=t,this.metrics?.onScorePenalty(n))}addPeer(e){const t={connected:!0,expire:0,topics:{},knownIPs:new Set,behaviourPenalty:0};this.peerStats.set(e,t)}addIP(e,t){const n=this.peerStats.get(e);null!=n&&n.knownIPs.add(t),this.peerIPs.getOrDefault(t).add(e)}removeIP(e,t){const n=this.peerStats.get(e);null!=n&&n.knownIPs.delete(t);const r=this.peerIPs.get(t);null!=r&&(r.delete(e),0===r.size&&this.peerIPs.delete(t))}removePeer(e){const t=this.peerStats.get(e);if(null!=t){if(this.score(e)>0)return this.removeIPsForPeer(e,t.knownIPs),void this.peerStats.delete(e);Object.entries(t.topics).forEach((([e,t])=>{t.firstMessageDeliveries=0;const n=this.params.topics[e].meshMessageDeliveriesThreshold;if(t.inMesh&&t.meshMessageDeliveriesActive&&t.meshMessageDeliveries<n){const e=n-t.meshMessageDeliveries;t.meshFailurePenalty+=e*e}t.inMesh=!1,t.meshMessageDeliveriesActive=!1})),t.connected=!1,t.expire=Date.now()+this.params.retainScore}}graft(e,t){const n=this.peerStats.get(e);if(null!=n){const e=this.getPtopicStats(n,t);null!=e&&(e.inMesh=!0,e.graftTime=Date.now(),e.meshTime=0,e.meshMessageDeliveriesActive=!1)}}prune(e,t){const n=this.peerStats.get(e);if(null!=n){const e=this.getPtopicStats(n,t);if(null!=e){const n=this.params.topics[t].meshMessageDeliveriesThreshold;if(e.meshMessageDeliveriesActive&&e.meshMessageDeliveries<n){const t=n-e.meshMessageDeliveries;e.meshFailurePenalty+=t*t}e.meshMessageDeliveriesActive=!1,e.inMesh=!1}}}validateMessage(e){this.deliveryRecords.ensureRecord(e)}deliverMessage(e,t,n){this.markFirstMessageDelivery(e,n);const r=this.deliveryRecords.ensureRecord(t),s=Date.now();r.status===bv.unknown?(r.status=bv.valid,r.validated=s,r.peers.forEach((t=>{t!==e.toString()&&this.markDuplicateMessageDelivery(t,n)}))):this.log("unexpected delivery: message from %s was first seen %s ago and has delivery status %s",e,s-r.firstSeenTsMs,bv[r.status])}rejectInvalidMessage(e,t){this.markInvalidMessageDelivery(e,t)}rejectMessage(e,t,n,r){switch(r){case Jb.Error:return void this.markInvalidMessageDelivery(e,n);case Jb.Blacklisted:return}const s=this.deliveryRecords.ensureRecord(t);if(s.status===bv.unknown){if(r===Jb.Ignore)return s.status=bv.ignored,void s.peers.clear();s.status=bv.invalid,this.markInvalidMessageDelivery(e,n),s.peers.forEach((e=>{this.markInvalidMessageDelivery(e,n)})),s.peers.clear()}else this.log("unexpected rejection: message from %s was first seen %s ago and has delivery status %d",e,Date.now()-s.firstSeenTsMs,bv[s.status])}duplicateMessage(e,t,n){const r=this.deliveryRecords.ensureRecord(t);if(!r.peers.has(e))switch(r.status){case bv.unknown:r.peers.add(e);break;case bv.valid:r.peers.add(e),this.markDuplicateMessageDelivery(e,n,r.validated);break;case bv.invalid:this.markInvalidMessageDelivery(e,n);case bv.ignored:}}markInvalidMessageDelivery(e,t){const n=this.peerStats.get(e);if(null!=n){const e=this.getPtopicStats(n,t);null!=e&&(e.invalidMessageDeliveries+=1)}}markFirstMessageDelivery(e,t){const n=this.peerStats.get(e);if(null!=n){const e=this.getPtopicStats(n,t);if(null!=e){let n=this.params.topics[t].firstMessageDeliveriesCap;e.firstMessageDeliveries=Math.min(n,e.firstMessageDeliveries+1),e.inMesh&&(n=this.params.topics[t].meshMessageDeliveriesCap,e.meshMessageDeliveries=Math.min(n,e.meshMessageDeliveries+1))}}}markDuplicateMessageDelivery(e,t,n){const r=this.peerStats.get(e);if(null!=r){const e=void 0!==n?Date.now():0,s=this.getPtopicStats(r,t);if(null!=s&&s.inMesh){const r=this.params.topics[t];if(void 0!==n){const s=e-n,i=s>r.meshMessageDeliveriesWindow;if(this.metrics?.onDuplicateMsgDelivery(t,s,i),i)return}const i=r.meshMessageDeliveriesCap;s.meshMessageDeliveries=Math.min(i,s.meshMessageDeliveries+1)}}}removeIPsForPeer(e,t){for(const n of t){const t=this.peerIPs.get(n);null!=t&&(t.delete(e),0===t.size&&this.peerIPs.delete(n))}}getPtopicStats(e,t){let n=e.topics[t];return void 0!==n?n:void 0!==this.params.topics[t]?(n={inMesh:!1,graftTime:0,meshTime:0,firstMessageDeliveries:0,meshMessageDeliveries:0,meshMessageDeliveriesActive:!1,meshFailurePenalty:0,invalidMessageDeliveries:0},e.topics[t]=n,n):null}}function _v(e,t,n,r,s){let i=0;const o=new Map;if(Object.entries(t.topics).forEach((([e,t])=>{const r=s.get(e)??"unknown",a=n.topics[e];if(void 0===a)return;let c=o.get(r);null==c&&(c={p1w:0,p2w:0,p3w:0,p3bw:0,p4w:0},o.set(r,c));let l=0,u=0,h=0,d=0,p=0;if(t.inMesh){l+=Math.max(t.meshTime/a.timeInMeshQuantum,a.timeInMeshCap)*a.timeInMeshWeight}let f=t.firstMessageDeliveries;if(f>a.firstMessageDeliveriesCap&&(f=a.firstMessageDeliveriesCap),u+=f*a.firstMessageDeliveriesWeight,t.meshMessageDeliveriesActive&&t.meshMessageDeliveries<a.meshMessageDeliveriesThreshold){const e=a.meshMessageDeliveriesThreshold-t.meshMessageDeliveries;h+=e*e*a.meshMessageDeliveriesWeight}d+=t.meshFailurePenalty*a.meshFailurePenaltyWeight;p+=t.invalidMessageDeliveries*t.invalidMessageDeliveries*a.invalidMessageDeliveriesWeight,i+=(l+u+h+d+p)*a.topicWeight,c.p1w+=l,c.p2w+=u,c.p3w+=h,c.p3bw+=d,c.p4w+=p})),n.topicScoreCap>0&&i>n.topicScoreCap){i=n.topicScoreCap;const e=n.topicScoreCap/i;for(const t of o.values())t.p1w*=e,t.p2w*=e,t.p3w*=e,t.p3bw*=e,t.p4w*=e}let a=0,c=0,l=0;a+=n.appSpecificScore(e)*n.appSpecificWeight,t.knownIPs.forEach((e=>{if(n.IPColocationFactorWhitelist.has(e))return;const t=r.get(e),s=null!=t?t.size:0;if(s>n.IPColocationFactorThreshold){const e=s-n.IPColocationFactorThreshold;c+=e*e*n.IPColocationFactorWeight}}));return l+=t.behaviourPenalty*t.behaviourPenalty*n.behaviourPenaltyWeight,i+=a+c+l,{byTopic:o,p5w:a,p6w:c,p7w:l,score:i}}class Iv{rawStream;pushable;closeController;maxBufferSize;constructor(e,t,n){this.rawStream=e,this.pushable=pr(),this.closeController=new AbortController,this.maxBufferSize=n.maxBufferSize??1/0,this.closeController.signal.addEventListener("abort",(()=>{e.close().catch((t=>{e.abort(t)}))})),gr(this.pushable,this.rawStream).catch(t)}get protocol(){return this.rawStream.protocol}push(e){if(this.pushable.readableLength>this.maxBufferSize)throw Error(`OutboundStream buffer full, size > ${this.maxBufferSize}`);this.pushable.push(Or.single(e))}pushPrefixed(e){if(this.pushable.readableLength>this.maxBufferSize)throw Error(`OutboundStream buffer full, size > ${this.maxBufferSize}`);this.pushable.push(e)}async close(){this.closeController.abort(),await this.pushable.return()}}class Rv{source;rawStream;closeController;constructor(e,t={}){this.rawStream=e,this.closeController=new AbortController,this.closeController.signal.addEventListener("abort",(()=>{e.close().catch((t=>{e.abort(t)}))})),this.source=gr(this.rawStream,(e=>qr(e,t)))}async close(){this.closeController.abort()}}class Av{gossipsubIWantFollowupMs;msgIdToStrFn;metrics;promises=new Map;requestMsByMsg=new Map;requestMsByMsgExpire;constructor(e,t,n){this.gossipsubIWantFollowupMs=e,this.msgIdToStrFn=t,this.metrics=n,this.requestMsByMsgExpire=10*e}get size(){return this.promises.size}get requestMsByMsgSize(){return this.requestMsByMsg.size}addPromise(e,t){const n=t[Math.floor(Math.random()*t.length)],r=this.msgIdToStrFn(n);let s=this.promises.get(r);null==s&&(s=new Map,this.promises.set(r,s));const i=Date.now();s.has(e)||(s.set(e,i+this.gossipsubIWantFollowupMs),null!=this.metrics&&(this.metrics.iwantPromiseStarted.inc(1),this.requestMsByMsg.has(r)||this.requestMsByMsg.set(r,i)))}getBrokenPromises(){const e=Date.now(),t=new Map;let n=0;return this.promises.forEach(((r,s)=>{r.forEach(((s,i)=>{s<e&&(t.set(i,(t.get(i)??0)+1),r.delete(i),n++)})),0===r.size&&this.promises.delete(s)})),this.metrics?.iwantPromiseBroken.inc(n),t}deliverMessage(e,t=!1){this.trackMessage(e);const n=this.promises.get(e);null!=n&&(this.promises.delete(e),null!=this.metrics&&(this.metrics.iwantPromiseResolved.inc(1),t&&this.metrics.iwantPromiseResolvedFromDuplicate.inc(1),this.metrics.iwantPromiseResolvedPeers.inc(n.size)))}rejectMessage(e,t){this.trackMessage(e),t!==Jb.Error&&this.promises.delete(e)}clear(){this.promises.clear()}prune(){const e=Date.now()-this.requestMsByMsgExpire;let t=0;for(const[n,r]of this.requestMsByMsg.entries()){if(!(r<e))break;this.requestMsByMsg.delete(n),t++}this.metrics?.iwantMessagePruned.inc(t)}trackMessage(e){if(null!=this.metrics){const t=this.requestMsByMsg.get(e);void 0!==t&&(this.metrics.iwantPromiseDeliveryTime.observe((Date.now()-t)/1e3),this.requestMsByMsg.delete(e))}}}const Tv=kt("libp2p-pubsub:");function Dv(e=[],t){return{subscriptions:[],messages:e,control:void 0!==t?{graft:t.graft??[],prune:t.prune??[],ihave:t.ihave??[],iwant:t.iwant??[]}:void 0}}function kv(e){return void 0===e.control&&(e.control={graft:[],prune:[],ihave:[],iwant:[]}),e}function Pv(e){if(e.length<=1)return e;for(let t=0;t<e.length;t++){const n=Math.floor(Math.random()*Math.floor(e.length)),r=e[t];e[t]=e[n],e[n]=r}return e}function Cv(e){return Qt(e,"base64")}function xv(e){if("signed"!==e.type)throw new Error("expected signed message type");if(null==e.sequenceNumber)throw Error("missing seqno field");return((e,t)=>{const n=kt(t.toString(16).padStart(16,"0"),"base16"),r=new Uint8Array(e.length+n.length);return r.set(e,0),r.set(n,e.length),r})(e.from.toBytes(),e.sequenceNumber)}async function Nv(e){return gt.encode(e.data)}var Mv,Ov;!function(e){e[e.ip4=4]="ip4",e[e.ip6=41]="ip6"}(Mv||(Mv={}));class Lv{entries=new Map;validityMs;constructor(e){this.validityMs=e.validityMs}get size(){return this.entries.size}put(e,t){return!!this.entries.has(e)||(this.entries.set(e,{value:t,validUntilMs:Date.now()+this.validityMs}),!1)}prune(){const e=Date.now();for(const[t,n]of this.entries.entries()){if(!(n.validUntilMs<e))break;this.entries.delete(t)}}has(e){return this.entries.has(e)}get(e){const t=this.entries.get(e);return null!=t&&t.validUntilMs>=Date.now()?t.value:void 0}clear(){this.entries.clear()}}!function(e){e[e.started=0]="started",e[e.stopped=1]="stopped"}(Ov||(Ov={}));class Bv extends wn{globalSignaturePolicy;multicodecs=[zb,Hb];publishConfig;dataTransform;peers=new Set;streamsInbound=new Map;streamsOutbound=new Map;outboundInflightQueue=pr({objectMode:!0});direct=new Set;floodsubPeers=new Set;seenCache;acceptFromWhitelist=new Map;topics=new Map;subscriptions=new Set;mesh=new Map;fanout=new Map;fanoutLastpub=new Map;gossip=new Map;control=new Map;peerhave=new Map;iasked=new Map;backoff=new Map;outbound=new Map;msgIdFn;fastMsgIdFn;msgIdToStrFn;fastMsgIdCache;publishedMessageIds;mcache;score;topicValidators=new Map;log;heartbeatTicks=0;gossipTracer;components;directPeerInitial=null;static multicodec=zb;opts;decodeRpcLimits;metrics;status={code:Ov.stopped};maxInboundStreams;maxOutboundStreams;runOnTransientConnection;allowedTopics;heartbeatTimer=null;constructor(e,t={}){super();const n={fallbackToFloodsub:!0,floodPublish:!0,batchPublish:!1,tagMeshPeers:!0,doPX:!1,directPeers:[],D:6,Dlo:4,Dhi:12,Dscore:4,Dout:2,Dlazy:6,heartbeatInterval:1e3,fanoutTTL:6e4,mcacheLength:5,mcacheGossip:3,seenTTL:12e4,gossipsubIWantFollowupMs:3e3,prunePeers:16,pruneBackoff:6e4,unsubcribeBackoff:1e4,graftFloodThreshold:1e4,opportunisticGraftPeers:2,opportunisticGraftTicks:60,directConnectTicks:300,...t,scoreParams:hv(t.scoreParams),scoreThresholds:fv(t.scoreThresholds)};if(this.components=e,this.decodeRpcLimits=n.decodeRpcLimits??jb,this.globalSignaturePolicy=n.globalSignaturePolicy??cn,n.fallbackToFloodsub&&this.multicodecs.push(qb),this.log=e.logger.forComponent(n.debugName??"libp2p:gossipsub"),this.opts=n,this.direct=new Set(n.directPeers.map((e=>e.id.toString()))),this.seenCache=new Lv({validityMs:n.seenTTL}),this.publishedMessageIds=new Lv({validityMs:n.seenTTL}),null!=t.msgIdFn)this.msgIdFn=t.msgIdFn;else switch(this.globalSignaturePolicy){case cn:this.msgIdFn=xv;break;case ln:this.msgIdFn=Nv;break;default:throw new Error(`Invalid globalSignaturePolicy: ${this.globalSignaturePolicy}`)}if(null!=t.fastMsgIdFn&&(this.fastMsgIdFn=t.fastMsgIdFn,this.fastMsgIdCache=new Lv({validityMs:n.seenTTL})),this.msgIdToStrFn=t.msgIdToStrFn??Cv,this.mcache=t.messageCache??new ov(n.mcacheGossip,n.mcacheLength,this.msgIdToStrFn),null!=t.dataTransform&&(this.dataTransform=t.dataTransform),null!=t.metricsRegister){if(null==t.metricsTopicStrToLabel)throw Error("Must set metricsTopicStrToLabel with metrics");const e=Math.max(...Object.values(n.scoreParams.topics).map((e=>e.meshMessageDeliveriesWindow)),1e3),r=function(e,t,n){return{protocolsEnabled:e.gauge({name:"gossipsub_protocol",help:"Status of enabled protocols",labelNames:["protocol"]}),topicSubscriptionStatus:e.gauge({name:"gossipsub_topic_subscription_status",help:"Status of our subscription to this topic",labelNames:["topicStr"]}),topicPeersCount:e.gauge({name:"gossipsub_topic_peer_count",help:"Number of peers subscribed to each topic",labelNames:["topicStr"]}),meshPeerCounts:e.gauge({name:"gossipsub_mesh_peer_count",help:"Number of peers in our mesh",labelNames:["topicStr"]}),meshPeerInclusionEventsFanout:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_fanout_total",help:"Number of times we include peers in a topic mesh for fanout reasons",labelNames:["topic"]}),meshPeerInclusionEventsRandom:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_random_total",help:"Number of times we include peers in a topic mesh for random reasons",labelNames:["topic"]}),meshPeerInclusionEventsSubscribed:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_subscribed_total",help:"Number of times we include peers in a topic mesh for subscribed reasons",labelNames:["topic"]}),meshPeerInclusionEventsOutbound:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_outbound_total",help:"Number of times we include peers in a topic mesh for outbound reasons",labelNames:["topic"]}),meshPeerInclusionEventsNotEnough:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_not_enough_total",help:"Number of times we include peers in a topic mesh for not_enough reasons",labelNames:["topic"]}),meshPeerInclusionEventsOpportunistic:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_opportunistic_total",help:"Number of times we include peers in a topic mesh for opportunistic reasons",labelNames:["topic"]}),meshPeerInclusionEventsUnknown:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_unknown_total",help:"Number of times we include peers in a topic mesh for unknown reasons",labelNames:["topic"]}),meshPeerChurnEventsDisconnected:e.gauge({name:"gossipsub_peer_churn_events_disconnected_total",help:"Number of times we remove peers in a topic mesh for disconnected reasons",labelNames:["topic"]}),meshPeerChurnEventsBadScore:e.gauge({name:"gossipsub_peer_churn_events_bad_score_total",help:"Number of times we remove peers in a topic mesh for bad_score reasons",labelNames:["topic"]}),meshPeerChurnEventsPrune:e.gauge({name:"gossipsub_peer_churn_events_prune_total",help:"Number of times we remove peers in a topic mesh for prune reasons",labelNames:["topic"]}),meshPeerChurnEventsExcess:e.gauge({name:"gossipsub_peer_churn_events_excess_total",help:"Number of times we remove peers in a topic mesh for excess reasons",labelNames:["topic"]}),meshPeerChurnEventsUnknown:e.gauge({name:"gossipsub_peer_churn_events_unknown_total",help:"Number of times we remove peers in a topic mesh for unknown reasons",labelNames:["topic"]}),peersPerProtocol:e.gauge({name:"gossipsub_peers_per_protocol_count",help:"Peers connected for each topic",labelNames:["protocol"]}),heartbeatDuration:e.histogram({name:"gossipsub_heartbeat_duration_seconds",help:"The time it takes to complete one iteration of the heartbeat",buckets:[.01,.1,1]}),heartbeatSkipped:e.gauge({name:"gossipsub_heartbeat_skipped",help:"Heartbeat run took longer than heartbeat interval so next is skipped"}),acceptedMessagesTotal:e.gauge({name:"gossipsub_accepted_messages_total",help:"Total accepted messages for each topic",labelNames:["topic"]}),ignoredMessagesTotal:e.gauge({name:"gossipsub_ignored_messages_total",help:"Total ignored messages for each topic",labelNames:["topic"]}),rejectedMessagesTotal:e.gauge({name:"gossipsub_rejected_messages_total",help:"Total rejected messages for each topic",labelNames:["topic"]}),unknownValidationResultsTotal:e.gauge({name:"gossipsub_unknown_validation_results_total",help:"Total unknown validation results for each topic",labelNames:["topic"]}),asyncValidationMcacheHit:e.gauge({name:"gossipsub_async_validation_mcache_hit_total",help:"Async validation result reported by the user layer",labelNames:["hit"]}),asyncValidationDelayFromFirstSeenSec:e.histogram({name:"gossipsub_async_validation_delay_from_first_seen",help:"Async validation report delay from first seen in second",buckets:[.01,.03,.1,.3,1,3,10]}),asyncValidationUnknownFirstSeen:e.gauge({name:"gossipsub_async_validation_unknown_first_seen_count_total",help:"Async validation report unknown first seen value for message"}),peerReadStreamError:e.gauge({name:"gossipsub_peer_read_stream_err_count_total",help:"Peer read stream error"}),rpcRecvBytes:e.gauge({name:"gossipsub_rpc_recv_bytes_total",help:"RPC recv"}),rpcRecvCount:e.gauge({name:"gossipsub_rpc_recv_count_total",help:"RPC recv"}),rpcRecvSubscription:e.gauge({name:"gossipsub_rpc_recv_subscription_total",help:"RPC recv"}),rpcRecvMessage:e.gauge({name:"gossipsub_rpc_recv_message_total",help:"RPC recv"}),rpcRecvControl:e.gauge({name:"gossipsub_rpc_recv_control_total",help:"RPC recv"}),rpcRecvIHave:e.gauge({name:"gossipsub_rpc_recv_ihave_total",help:"RPC recv"}),rpcRecvIWant:e.gauge({name:"gossipsub_rpc_recv_iwant_total",help:"RPC recv"}),rpcRecvGraft:e.gauge({name:"gossipsub_rpc_recv_graft_total",help:"RPC recv"}),rpcRecvPrune:e.gauge({name:"gossipsub_rpc_recv_prune_total",help:"RPC recv"}),rpcDataError:e.gauge({name:"gossipsub_rpc_data_err_count_total",help:"RPC data error"}),rpcRecvError:e.gauge({name:"gossipsub_rpc_recv_err_count_total",help:"RPC recv error"}),rpcRecvNotAccepted:e.gauge({name:"gossipsub_rpc_rcv_not_accepted_total",help:"Total count of RPC dropped because acceptFrom() == false"}),rpcSentBytes:e.gauge({name:"gossipsub_rpc_sent_bytes_total",help:"RPC sent"}),rpcSentCount:e.gauge({name:"gossipsub_rpc_sent_count_total",help:"RPC sent"}),rpcSentSubscription:e.gauge({name:"gossipsub_rpc_sent_subscription_total",help:"RPC sent"}),rpcSentMessage:e.gauge({name:"gossipsub_rpc_sent_message_total",help:"RPC sent"}),rpcSentControl:e.gauge({name:"gossipsub_rpc_sent_control_total",help:"RPC sent"}),rpcSentIHave:e.gauge({name:"gossipsub_rpc_sent_ihave_total",help:"RPC sent"}),rpcSentIWant:e.gauge({name:"gossipsub_rpc_sent_iwant_total",help:"RPC sent"}),rpcSentGraft:e.gauge({name:"gossipsub_rpc_sent_graft_total",help:"RPC sent"}),rpcSentPrune:e.gauge({name:"gossipsub_rpc_sent_prune_total",help:"RPC sent"}),msgPublishCount:e.gauge({name:"gossipsub_msg_publish_count_total",help:"Total count of msg published by topic",labelNames:["topic"]}),msgPublishPeersByTopic:e.gauge({name:"gossipsub_msg_publish_peers_total",help:"Total count of peers that we publish a msg to",labelNames:["topic"]}),directPeersPublishedTotal:e.gauge({name:"gossipsub_direct_peers_published_total",help:"Total direct peers that we publish a msg to",labelNames:["topic"]}),floodsubPeersPublishedTotal:e.gauge({name:"gossipsub_floodsub_peers_published_total",help:"Total floodsub peers that we publish a msg to",labelNames:["topic"]}),meshPeersPublishedTotal:e.gauge({name:"gossipsub_mesh_peers_published_total",help:"Total mesh peers that we publish a msg to",labelNames:["topic"]}),fanoutPeersPublishedTotal:e.gauge({name:"gossipsub_fanout_peers_published_total",help:"Total fanout peers that we publish a msg to",labelNames:["topic"]}),msgPublishBytes:e.gauge({name:"gossipsub_msg_publish_bytes_total",help:"Total count of msg publish data.length bytes",labelNames:["topic"]}),msgPublishTime:e.histogram({name:"gossipsub_msg_publish_seconds",help:"Total time in seconds to publish a message",buckets:[.001,.002,.005,.01,.1,.5,1],labelNames:["topic"]}),msgForwardCount:e.gauge({name:"gossipsub_msg_forward_count_total",help:"Total count of msg forwarded by topic",labelNames:["topic"]}),msgForwardPeers:e.gauge({name:"gossipsub_msg_forward_peers_total",help:"Total count of peers that we forward a msg to",labelNames:["topic"]}),msgReceivedPreValidation:e.gauge({name:"gossipsub_msg_received_prevalidation_total",help:"Total count of recv msgs before any validation",labelNames:["topic"]}),msgReceivedError:e.gauge({name:"gossipsub_msg_received_error_total",help:"Total count of recv msgs error",labelNames:["topic"]}),prevalidationInvalidTotal:e.gauge({name:"gossipsub_pre_validation_invalid_total",help:"Total count of invalid messages received",labelNames:["topic"]}),prevalidationValidTotal:e.gauge({name:"gossipsub_pre_validation_valid_total",help:"Total count of valid messages received",labelNames:["topic"]}),prevalidationDuplicateTotal:e.gauge({name:"gossipsub_pre_validation_duplicate_total",help:"Total count of duplicate messages received",labelNames:["topic"]}),prevalidationUnknownTotal:e.gauge({name:"gossipsub_pre_validation_unknown_status_total",help:"Total count of unknown_status messages received",labelNames:["topic"]}),msgReceivedInvalid:e.gauge({name:"gossipsub_msg_received_invalid_total",help:"Tracks specific reason of invalid",labelNames:["error"]}),msgReceivedInvalidByTopic:e.gauge({name:"gossipsub_msg_received_invalid_by_topic_total",help:"Tracks specific invalid message by topic",labelNames:["topic"]}),duplicateMsgDeliveryDelay:e.histogram({name:"gossisub_duplicate_msg_delivery_delay_seconds",help:"Time since the 1st duplicated message validated",labelNames:["topic"],buckets:[.25*n.maxMeshMessageDeliveriesWindowSec,.5*n.maxMeshMessageDeliveriesWindowSec,Number(n.maxMeshMessageDeliveriesWindowSec),2*n.maxMeshMessageDeliveriesWindowSec,4*n.maxMeshMessageDeliveriesWindowSec]}),duplicateMsgLateDelivery:e.gauge({name:"gossisub_duplicate_msg_late_delivery_total",help:"Total count of late duplicate message delivery by topic, which triggers P3 penalty",labelNames:["topic"]}),duplicateMsgIgnored:e.gauge({name:"gossisub_ignored_published_duplicate_msgs_total",help:"Total count of published duplicate message ignored by topic",labelNames:["topic"]}),scoreFnCalls:e.gauge({name:"gossipsub_score_fn_calls_total",help:"Total times score() is called"}),scoreFnRuns:e.gauge({name:"gossipsub_score_fn_runs_total",help:"Total times score() call actually computed computeScore(), no cache"}),scoreCachedDelta:e.histogram({name:"gossipsub_score_cache_delta",help:"Delta of score between cached values that expired",buckets:[10,100,1e3]}),peersByScoreThreshold:e.gauge({name:"gossipsub_peers_by_score_threshold_count",help:"Current count of peers by score threshold",labelNames:["threshold"]}),score:e.avgMinMax({name:"gossipsub_score",help:"Avg min max of gossip scores"}),scoreWeights:e.avgMinMax({name:"gossipsub_score_weights",help:"Separate score weights",labelNames:["topic","p"]}),scorePerMesh:e.avgMinMax({name:"gossipsub_score_per_mesh",help:"Histogram of the scores for each mesh topic",labelNames:["topic"]}),scoringPenalties:e.gauge({name:"gossipsub_scoring_penalties_total",help:"A counter of the kind of penalties being applied to peers",labelNames:["penalty"]}),behaviourPenalty:e.histogram({name:"gossipsub_peer_stat_behaviour_penalty",help:"Current peer stat behaviour_penalty at each scrape",buckets:[.25*n.behaviourPenaltyThreshold,.5*n.behaviourPenaltyThreshold,Number(n.behaviourPenaltyThreshold),2*n.behaviourPenaltyThreshold,4*n.behaviourPenaltyThreshold]}),ihaveRcvIgnored:e.gauge({name:"gossipsub_ihave_rcv_ignored_total",help:"Total received IHAVE messages that we ignore for some reason",labelNames:["reason"]}),ihaveRcvMsgids:e.gauge({name:"gossipsub_ihave_rcv_msgids_total",help:"Total received IHAVE messages by topic",labelNames:["topic"]}),ihaveRcvNotSeenMsgids:e.gauge({name:"gossipsub_ihave_rcv_not_seen_msgids_total",help:"Total messages per topic we do not have, not actual requests",labelNames:["topic"]}),iwantRcvMsgids:e.gauge({name:"gossipsub_iwant_rcv_msgids_total",help:"Total received IWANT messages by topic",labelNames:["topic"]}),iwantRcvDonthaveMsgids:e.gauge({name:"gossipsub_iwant_rcv_dont_have_msgids_total",help:"Total requested messageIDs that we do not have"}),iwantPromiseStarted:e.gauge({name:"gossipsub_iwant_promise_sent_total",help:"Total count of started IWANT promises"}),iwantPromiseResolved:e.gauge({name:"gossipsub_iwant_promise_resolved_total",help:"Total count of resolved IWANT promises"}),iwantPromiseResolvedFromDuplicate:e.gauge({name:"gossipsub_iwant_promise_resolved_from_duplicate_total",help:"Total count of resolved IWANT promises from duplicate messages"}),iwantPromiseResolvedPeers:e.gauge({name:"gossipsub_iwant_promise_resolved_peers",help:"Total count of peers we have asked IWANT promises that are resolved"}),iwantPromiseBroken:e.gauge({name:"gossipsub_iwant_promise_broken",help:"Total count of broken IWANT promises"}),iwantMessagePruned:e.gauge({name:"gossipsub_iwant_message_pruned",help:"Total count of pruned IWANT messages"}),iwantPromiseDeliveryTime:e.histogram({name:"gossipsub_iwant_promise_delivery_seconds",help:"Histogram of delivery time of resolved IWANT promises",buckets:[.5*n.gossipPromiseExpireSec,Number(n.gossipPromiseExpireSec),2*n.gossipPromiseExpireSec,4*n.gossipPromiseExpireSec]}),iwantPromiseUntracked:e.gauge({name:"gossip_iwant_promise_untracked",help:"Total count of untracked IWANT promise"}),connectedPeersBackoffSec:e.histogram({name:"gossipsub_connected_peers_backoff_seconds",help:"Backoff time in seconds",buckets:[1,2,4,10,20,60,120]}),cacheSize:e.gauge({name:"gossipsub_cache_size",help:"Unbounded cache sizes",labelNames:["cache"]}),mcacheSize:e.gauge({name:"gossipsub_mcache_size",help:"Current mcache msg count"}),mcacheNotValidatedCount:e.gauge({name:"gossipsub_mcache_not_validated_count",help:"Current mcache msg count not validated"}),fastMsgIdCacheCollision:e.gauge({name:"gossipsub_fastmsgid_cache_collision_total",help:"Total count of key collisions on fastmsgid cache put"}),newConnectionCount:e.gauge({name:"gossipsub_new_connection_total",help:"Total new connection by status",labelNames:["status"]}),topicStrToLabel:t,toTopic(e){return this.topicStrToLabel.get(e)??e},onJoin(e){this.topicSubscriptionStatus.set({topicStr:e},1),this.meshPeerCounts.set({topicStr:e},0)},onLeave(e){this.topicSubscriptionStatus.set({topicStr:e},0),this.meshPeerCounts.set({topicStr:e},0)},onAddToMesh(e,t,n){const r=this.toTopic(e);switch(t){case tv.Fanout:this.meshPeerInclusionEventsFanout.inc({topic:r},n);break;case tv.Random:this.meshPeerInclusionEventsRandom.inc({topic:r},n);break;case tv.Subscribed:this.meshPeerInclusionEventsSubscribed.inc({topic:r},n);break;case tv.Outbound:this.meshPeerInclusionEventsOutbound.inc({topic:r},n);break;case tv.NotEnough:this.meshPeerInclusionEventsNotEnough.inc({topic:r},n);break;case tv.Opportunistic:this.meshPeerInclusionEventsOpportunistic.inc({topic:r},n);break;default:this.meshPeerInclusionEventsUnknown.inc({topic:r},n)}},onRemoveFromMesh(e,t,n){const r=this.toTopic(e);switch(t){case nv.Dc:this.meshPeerChurnEventsDisconnected.inc({topic:r},n);break;case nv.BadScore:this.meshPeerChurnEventsBadScore.inc({topic:r},n);break;case nv.Prune:this.meshPeerChurnEventsPrune.inc({topic:r},n);break;case nv.Excess:this.meshPeerChurnEventsExcess.inc({topic:r},n);break;default:this.meshPeerChurnEventsUnknown.inc({topic:r},n)}},onReportValidation(e,t,n){if(this.asyncValidationMcacheHit.inc({hit:null!=e?"hit":"miss"}),null!=e){const n=this.toTopic(e.message.topic);switch(t){case un.Accept:this.acceptedMessagesTotal.inc({topic:n});break;case un.Ignore:this.ignoredMessagesTotal.inc({topic:n});break;case un.Reject:this.rejectedMessagesTotal.inc({topic:n});break;default:this.unknownValidationResultsTotal.inc({topic:n})}}null!=n?this.asyncValidationDelayFromFirstSeenSec.observe((Date.now()-n)/1e3):this.asyncValidationUnknownFirstSeen.inc()},onScorePenalty(e){this.scoringPenalties.inc({penalty:e},1)},onIhaveRcv(e,t,n){const r=this.toTopic(e);this.ihaveRcvMsgids.inc({topic:r},t),this.ihaveRcvNotSeenMsgids.inc({topic:r},n)},onIwantRcv(e,t){for(const[t,n]of e){const e=this.toTopic(t);this.iwantRcvMsgids.inc({topic:e},n)}this.iwantRcvDonthaveMsgids.inc(t)},onForwardMsg(e,t){const n=this.toTopic(e);this.msgForwardCount.inc({topic:n},1),this.msgForwardPeers.inc({topic:n},t)},onPublishMsg(e,t,n,r,s){const i=this.toTopic(e);this.msgPublishCount.inc({topic:i},1),this.msgPublishBytes.inc({topic:i},n*r),this.msgPublishPeersByTopic.inc({topic:i},n),this.directPeersPublishedTotal.inc({topic:i},t.direct),this.floodsubPeersPublishedTotal.inc({topic:i},t.floodsub),this.meshPeersPublishedTotal.inc({topic:i},t.mesh),this.fanoutPeersPublishedTotal.inc({topic:i},t.fanout),this.msgPublishTime.observe({topic:i},s/1e3)},onMsgRecvPreValidation(e){const t=this.toTopic(e);this.msgReceivedPreValidation.inc({topic:t},1)},onMsgRecvError(e){const t=this.toTopic(e);this.msgReceivedError.inc({topic:t},1)},onPrevalidationResult(e,t){const n=this.toTopic(e);switch(t){case Xb.duplicate:this.prevalidationDuplicateTotal.inc({topic:n});break;case Xb.invalid:this.prevalidationInvalidTotal.inc({topic:n});break;case Xb.valid:this.prevalidationValidTotal.inc({topic:n});break;default:this.prevalidationUnknownTotal.inc({topic:n})}},onMsgRecvInvalid(e,t){const n=this.toTopic(e),r=t.reason===Jb.Error?t.error:t.reason;this.msgReceivedInvalid.inc({error:r},1),this.msgReceivedInvalidByTopic.inc({topic:n},1)},onDuplicateMsgDelivery(e,t,n){const r=this.toTopic(e);this.duplicateMsgDeliveryDelay.observe({topic:r},t/1e3),n&&this.duplicateMsgLateDelivery.inc({topic:r},1)},onPublishDuplicateMsg(e){const t=this.toTopic(e);this.duplicateMsgIgnored.inc({topic:t},1)},onPeerReadStreamError(){this.peerReadStreamError.inc(1)},onRpcRecvError(){this.rpcRecvError.inc(1)},onRpcDataError(){this.rpcDataError.inc(1)},onRpcRecv(e,t){this.rpcRecvBytes.inc(t),this.rpcRecvCount.inc(1),null!=e.subscriptions&&this.rpcRecvSubscription.inc(e.subscriptions.length),null!=e.messages&&this.rpcRecvMessage.inc(e.messages.length),null!=e.control&&(this.rpcRecvControl.inc(1),null!=e.control.ihave&&this.rpcRecvIHave.inc(e.control.ihave.length),null!=e.control.iwant&&this.rpcRecvIWant.inc(e.control.iwant.length),null!=e.control.graft&&this.rpcRecvGraft.inc(e.control.graft.length),null!=e.control.prune&&this.rpcRecvPrune.inc(e.control.prune.length))},onRpcSent(e,t){if(this.rpcSentBytes.inc(t),this.rpcSentCount.inc(1),null!=e.subscriptions&&this.rpcSentSubscription.inc(e.subscriptions.length),null!=e.messages&&this.rpcSentMessage.inc(e.messages.length),null!=e.control){const t=e.control.ihave?.length??0,n=e.control.iwant?.length??0,r=e.control.graft?.length??0,s=e.control.prune?.length??0;t>0&&this.rpcSentIHave.inc(t),n>0&&this.rpcSentIWant.inc(n),r>0&&this.rpcSentGraft.inc(r),s>0&&this.rpcSentPrune.inc(s),(t>0||n>0||r>0||s>0)&&this.rpcSentControl.inc(1)}},registerScores(e,t){let n=0,r=0,s=0,i=0;for(const o of e)o>=t.graylistThreshold&&n++,o>=t.publishThreshold&&r++,o>=t.gossipThreshold&&s++,o>=0&&i++;this.peersByScoreThreshold.set({threshold:iv.graylist},n),this.peersByScoreThreshold.set({threshold:iv.publish},r),this.peersByScoreThreshold.set({threshold:iv.gossip},s),this.peersByScoreThreshold.set({threshold:iv.mesh},i),this.score.set(e)},registerScoreWeights(e){for(const[t,n]of e.byTopic)this.scoreWeights.set({topic:t,p:"p1"},n.p1w),this.scoreWeights.set({topic:t,p:"p2"},n.p2w),this.scoreWeights.set({topic:t,p:"p3"},n.p3w),this.scoreWeights.set({topic:t,p:"p3b"},n.p3bw),this.scoreWeights.set({topic:t,p:"p4"},n.p4w);this.scoreWeights.set({p:"p5"},e.p5w),this.scoreWeights.set({p:"p6"},e.p6w),this.scoreWeights.set({p:"p7"},e.p7w)},registerScorePerMesh(e,t){const n=new Map;e.forEach(((e,t)=>{const r=this.topicStrToLabel.get(t)??"unknown";let s=n.get(r);null==s&&(s=new Set,n.set(r,s)),e.forEach((e=>s?.add(e)))}));for(const[e,r]of n){const n=[];r.forEach((e=>{n.push(t.get(e)??0)})),this.scorePerMesh.set({topic:e},n)}}}}(t.metricsRegister,t.metricsTopicStrToLabel,{gossipPromiseExpireSec:this.opts.gossipsubIWantFollowupMs/1e3,behaviourPenaltyThreshold:n.scoreParams.behaviourPenaltyThreshold,maxMeshMessageDeliveriesWindowSec:e/1e3});r.mcacheSize.addCollect((()=>{this.onScrapeMetrics(r)}));for(const e of this.multicodecs)r.protocolsEnabled.set({protocol:e},1);this.metrics=r}else this.metrics=null;this.gossipTracer=new Av(this.opts.gossipsubIWantFollowupMs,this.msgIdToStrFn,this.metrics),this.score=new Sv(this.opts.scoreParams,this.metrics,this.components.logger,{scoreCacheValidityMs:n.heartbeatInterval}),this.maxInboundStreams=t.maxInboundStreams,this.maxOutboundStreams=t.maxOutboundStreams,this.runOnTransientConnection=t.runOnTransientConnection,this.allowedTopics=null!=n.allowedTopics?new Set(n.allowedTopics):null}getPeers(){return[...this.peers.keys()].map((e=>Is(e)))}isStarted(){return this.status.code===Ov.started}async start(){if(this.isStarted())return;this.log("starting"),this.publishConfig=await async function(e,t){switch(e){case cn:{if(null==t)throw Error("Must provide PeerId");if(null==t.privateKey)throw Error("Cannot sign message, no private key present");if(null==t.publicKey)throw Error("Cannot sign message, no public key present");const e=await ql(t.privateKey);return{type:Qb.Signing,author:t,key:t.publicKey,privateKey:e}}case ln:return{type:Qb.Anonymous};default:throw new Error(`Unknown signature policy "${e}"`)}}(this.globalSignaturePolicy,this.components.peerId),this.outboundInflightQueue=pr({objectMode:!0}),gr(this.outboundInflightQueue,(async e=>{for await(const{peerId:t,connection:n}of e)await this.createOutboundStream(t,n)})).catch((e=>{this.log.error("outbound inflight queue error",e)})),await Promise.all(this.opts.directPeers.map((async e=>{await this.components.peerStore.merge(e.id,{multiaddrs:e.addrs})})));const e=this.components.registrar;await Promise.all(this.multicodecs.map((async t=>e.handle(t,this.onIncomingStream.bind(this),{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnTransientConnection:this.runOnTransientConnection}))));const t={onConnect:this.onPeerConnected.bind(this),onDisconnect:this.onPeerDisconnected.bind(this),notifyOnTransient:this.runOnTransientConnection},n=await Promise.all(this.multicodecs.map((async n=>e.register(n,t)))),r=setTimeout(this.runHeartbeat,100);this.status={code:Ov.started,registrarTopologyIds:n,heartbeatTimeout:r,hearbeatStartMs:Date.now()+100},this.score.start(),this.directPeerInitial=setTimeout((()=>{Promise.resolve().then((async()=>{await Promise.all(Array.from(this.direct).map((async e=>this.connect(e))))})).catch((e=>{this.log(e)}))}),1e3),this.opts.tagMeshPeers&&(this.addEventListener("gossipsub:graft",this.tagMeshPeer),this.addEventListener("gossipsub:prune",this.untagMeshPeer)),this.log("started")}async stop(){if(this.log("stopping"),this.status.code!==Ov.started)return;const{registrarTopologyIds:e}=this.status;this.status={code:Ov.stopped},this.opts.tagMeshPeers&&(this.removeEventListener("gossipsub:graft",this.tagMeshPeer),this.removeEventListener("gossipsub:prune",this.untagMeshPeer));const t=this.components.registrar;await Promise.all(this.multicodecs.map((async e=>t.unhandle(e)))),e.forEach((e=>{t.unregister(e)})),this.outboundInflightQueue.end();const n=[];for(const e of this.streamsOutbound.values())n.push(e.close());this.streamsOutbound.clear();for(const e of this.streamsInbound.values())n.push(e.close());this.streamsInbound.clear(),await Promise.all(n),this.peers.clear(),this.subscriptions.clear(),null!=this.heartbeatTimer&&(this.heartbeatTimer.cancel(),this.heartbeatTimer=null),this.score.stop(),this.mesh.clear(),this.fanout.clear(),this.fanoutLastpub.clear(),this.gossip.clear(),this.control.clear(),this.peerhave.clear(),this.iasked.clear(),this.backoff.clear(),this.outbound.clear(),this.gossipTracer.clear(),this.seenCache.clear(),null!=this.fastMsgIdCache&&this.fastMsgIdCache.clear(),null!=this.directPeerInitial&&clearTimeout(this.directPeerInitial),this.log("stopped")}dumpPeerScoreStats(){return this.score.dumpPeerScoreStats()}onIncomingStream({stream:e,connection:t}){if(!this.isStarted())return;const n=t.remotePeer;this.addPeer(n,t.direction,t.remoteAddr),this.createInboundStream(n,e),this.outboundInflightQueue.push({peerId:n,connection:t})}onPeerConnected(e,t){this.metrics?.newConnectionCount.inc({status:t.status}),this.isStarted()&&"open"===t.status&&(this.addPeer(e,t.direction,t.remoteAddr),this.outboundInflightQueue.push({peerId:e,connection:t}))}onPeerDisconnected(e){this.log("connection ended %p",e),this.removePeer(e)}async createOutboundStream(e,t){if(!this.isStarted())return;const n=e.toString();if(this.peers.has(n)&&!this.streamsOutbound.has(n))try{const r=new Iv(await t.newStream(this.multicodecs,{runOnTransientConnection:this.runOnTransientConnection}),(e=>{this.log.error("outbound pipe error",e)}),{maxBufferSize:this.opts.maxOutboundBufferSize});this.log("create outbound stream %p",e),this.streamsOutbound.set(n,r);const s=r.protocol;s===qb&&this.floodsubPeers.add(n),this.metrics?.peersPerProtocol.inc({protocol:s},1),this.subscriptions.size>0&&(this.log("send subscriptions to",n),this.sendSubscriptions(n,Array.from(this.subscriptions),!0))}catch(e){this.log.error("createOutboundStream error",e)}}createInboundStream(e,t){if(!this.isStarted())return;const n=e.toString();if(!this.peers.has(n))return;const r=this.streamsInbound.get(n);void 0!==r&&(this.log("replacing existing inbound steam %s",n),r.close().catch((e=>{this.log.error(e)}))),this.log("create inbound stream %s",n);const s=new Rv(t,{maxDataLength:this.opts.maxInboundDataLength});this.streamsInbound.set(n,s),this.pipePeerReadStream(e,s.source).catch((e=>{this.log(e)}))}addPeer(e,t,n){const r=e.toString();if(!this.peers.has(r)){this.log("new peer %p",e),this.peers.add(r),this.score.addPeer(r);const s=function(e){for(const t of e.tuples())switch(t[0]){case Mv.ip4:case Mv.ip6:return Vn(t[0],t[1])}return null}(n);null!==s?this.score.addIP(r,s):this.log("Added peer has no IP in current address %s %s",r,n.toString()),this.outbound.has(r)||this.outbound.set(r,"outbound"===t)}}removePeer(e){const t=e.toString();if(!this.peers.has(t))return;this.log("delete peer %p",e),this.peers.delete(t);const n=this.streamsOutbound.get(t),r=this.streamsInbound.get(t);null!=n&&this.metrics?.peersPerProtocol.inc({protocol:n.protocol},-1),n?.close().catch((e=>{this.log.error(e)})),r?.close().catch((e=>{this.log.error(e)})),this.streamsOutbound.delete(t),this.streamsInbound.delete(t);for(const e of this.topics.values())e.delete(t);for(const[e,n]of this.mesh)n.delete(t)&&this.metrics?.onRemoveFromMesh(e,nv.Dc,1);for(const e of this.fanout.values())e.delete(t);this.floodsubPeers.delete(t),this.gossip.delete(t),this.control.delete(t),this.outbound.delete(t),this.score.removePeer(t),this.acceptFromWhitelist.delete(t)}get started(){return this.status.code===Ov.started}getMeshPeers(e){const t=this.mesh.get(e);return null!=t?Array.from(t):[]}getSubscribers(e){const t=this.topics.get(e);return(null!=t?Array.from(t):[]).map((e=>Is(e)))}getTopics(){return Array.from(this.subscriptions)}async pipePeerReadStream(e,t){try{await gr(t,(async t=>{for await(const n of t)try{const t=n.subarray(),r=Gb.decode(t,{limits:{subscriptions:this.decodeRpcLimits.maxSubscriptions,messages:this.decodeRpcLimits.maxMessages,control$:{ihave:this.decodeRpcLimits.maxIhaveMessageIDs,iwant:this.decodeRpcLimits.maxIwantMessageIDs,graft:this.decodeRpcLimits.maxControlMessages,prune:this.decodeRpcLimits.maxControlMessages,prune$:{peers:this.decodeRpcLimits.maxPeerInfos}}}});if(this.metrics?.onRpcRecv(r,t.length),this.opts.awaitRpcHandler)try{await this.handleReceivedRpc(e,r)}catch(e){this.metrics?.onRpcRecvError(),this.log(e)}else this.handleReceivedRpc(e,r).catch((e=>{this.metrics?.onRpcRecvError(),this.log(e)}))}catch(e){this.metrics?.onRpcDataError(),this.log(e)}}))}catch(t){this.metrics?.onPeerReadStreamError(),this.handlePeerReadStreamError(t,e)}}handlePeerReadStreamError(e,t){this.log.error(e),this.onPeerDisconnected(t)}async handleReceivedRpc(e,t){if(!this.acceptFrom(e.toString()))return this.log("received message from unacceptable peer %p",e),void this.metrics?.rpcRecvNotAccepted.inc();const n=null!=t.subscriptions?t.subscriptions.length:0,r=null!=t.messages?t.messages.length:0;let s=0,i=0,o=0,a=0;if(null!=t.control&&(null!=t.control.ihave&&(s=t.control.ihave.length),null!=t.control.iwant&&(i=t.control.iwant.length),null!=t.control.graft&&(o=t.control.graft.length),null!=t.control.prune&&(a=t.control.prune.length)),this.log(`rpc.from ${e.toString()} subscriptions ${n} messages ${r} ihave ${s} iwant ${i} graft ${o} prune ${a}`),null!=t.subscriptions&&t.subscriptions.length>0){const n=[];t.subscriptions.forEach((t=>{const r=t.topic,s=!0===t.subscribe;if(null!=r){if(null!=this.allowedTopics&&!this.allowedTopics.has(r))return;this.handleReceivedSubscription(e,r,s),n.push({topic:r,subscribe:s})}})),this.safeDispatchEvent("subscription-change",{detail:{peerId:e,subscriptions:n}})}for(const n of t.messages){if(null!=this.allowedTopics&&!this.allowedTopics.has(n.topic))continue;const t=this.handleReceivedMessage(e,n).catch((e=>{this.metrics?.onMsgRecvError(n.topic),this.log(e)}));this.opts.awaitRpcMessageHandler&&await t}null!=t.control&&await this.handleControlMessage(e.toString(),t.control)}handleReceivedSubscription(e,t,n){this.log("subscription update from %p topic %s",e,t);let r=this.topics.get(t);null==r&&(r=new Set,this.topics.set(t,r)),n?r.add(e.toString()):r.delete(e.toString())}async handleReceivedMessage(e,t){this.metrics?.onMsgRecvPreValidation(t.topic);const n=await this.validateReceivedMessage(e,t);this.metrics?.onPrevalidationResult(t.topic,n.code);const r=n.code;switch(r){case Xb.duplicate:return this.score.duplicateMessage(e.toString(),n.msgIdStr,t.topic),this.gossipTracer.deliverMessage(n.msgIdStr,!0),void this.mcache.observeDuplicate(n.msgIdStr,e.toString());case Xb.invalid:if(null!=n.msgIdStr){const r=n.msgIdStr;this.score.rejectMessage(e.toString(),r,t.topic,n.reason),this.gossipTracer.rejectMessage(r,n.reason)}else this.score.rejectInvalidMessage(e.toString(),t.topic);return void this.metrics?.onMsgRecvInvalid(t.topic,n);case Xb.valid:if(this.score.validateMessage(n.messageId.msgIdStr),this.gossipTracer.deliverMessage(n.messageId.msgIdStr),this.mcache.put(n.messageId,t,!this.opts.asyncValidation),this.subscriptions.has(t.topic)){this.components.peerId.equals(e)&&!this.opts.emitSelf||(super.dispatchEvent(new vn("gossipsub:message",{detail:{propagationSource:e,msgId:n.messageId.msgIdStr,msg:n.msg}})),super.dispatchEvent(new vn("message",{detail:n.msg})))}this.opts.asyncValidation||this.forwardMessage(n.messageId.msgIdStr,t,e.toString());break;default:throw new Error(`Invalid validation result: ${r}`)}}async validateReceivedMessage(e,t){const n=this.fastMsgIdFn?.(t),r=void 0!==n?this.fastMsgIdCache?.get(n):void 0;if(null!=r)return{code:Xb.duplicate,msgIdStr:r};const s=await async function(e,t){switch(e){case ln:return null!=t.signature?{valid:!1,error:Zb.SignaturePresent}:null!=t.seqno?{valid:!1,error:Zb.SeqnoPresent}:null!=t.key?{valid:!1,error:Zb.FromPresent}:{valid:!0,message:{type:"unsigned",topic:t.topic,data:t.data??new Uint8Array(0)}};case cn:{if(null==t.seqno)return{valid:!1,error:Zb.InvalidSeqno};if(8!==t.seqno.length)return{valid:!1,error:Zb.InvalidSeqno};if(null==t.signature)return{valid:!1,error:Zb.InvalidSignature};if(null==t.from)return{valid:!1,error:Zb.InvalidPeerId};let e,n;try{e=Rs(t.from)}catch(e){return{valid:!1,error:Zb.InvalidPeerId}}if(null!=t.key){if(n=Kl(t.key),void 0!==e.publicKey&&!In(n.bytes,e.publicKey))return{valid:!1,error:Zb.InvalidPeerId}}else{if(null==e.publicKey)return{valid:!1,error:Zb.InvalidPeerId};n=Kl(e.publicKey)}const r={from:t.from,data:t.data,seqno:t.seqno,topic:t.topic,signature:void 0,key:void 0},s=Rn([Tv,Gb.Message.encode(r)]);return await n.verify(s,t.signature)?{valid:!0,message:{type:"signed",from:e,data:t.data??new Uint8Array(0),sequenceNumber:BigInt(`0x${Qt(t.seqno,"base16")}`),topic:t.topic,signature:t.signature,key:t.key??$l(n)}}:{valid:!1,error:Zb.InvalidSignature}}default:throw new Error("Unreachable")}}(this.globalSignaturePolicy,t);if(!s.valid)return{code:Xb.invalid,reason:Jb.Error,error:s.error};const i=s.message;try{null!=this.dataTransform&&(i.data=this.dataTransform.inboundTransform(t.topic,i.data))}catch(e){return this.log("Invalid message, transform failed",e),{code:Xb.invalid,reason:Jb.Error,error:Zb.TransformFailed}}const o=await this.msgIdFn(i),a=this.msgIdToStrFn(o),c={msgId:o,msgIdStr:a};if(void 0!==n&&null!=this.fastMsgIdCache){this.fastMsgIdCache.put(n,a)&&this.metrics?.fastMsgIdCacheCollision.inc()}if(this.seenCache.has(a))return{code:Xb.duplicate,msgIdStr:a};this.seenCache.put(a);const l=this.topicValidators.get(t.topic);if(null!=l){let t;try{t=await l(e,i)}catch(e){const n=e.code;"ERR_TOPIC_VALIDATOR_IGNORE"===n&&(t=un.Ignore),t="ERR_TOPIC_VALIDATOR_REJECT"===n?un.Reject:un.Ignore}if(t!==un.Accept)return{code:Xb.invalid,reason:av(t),msgIdStr:a}}return{code:Xb.valid,messageId:c,msg:i}}getScore(e){return this.score.score(e)}sendSubscriptions(e,t,n){this.sendRpc(e,{subscriptions:t.map((e=>({topic:e,subscribe:n}))),messages:[]})}async handleControlMessage(e,t){if(void 0===t)return;const n=null!=t.ihave?this.handleIHave(e,t.ihave):[],r=null!=t.iwant?this.handleIWant(e,t.iwant):[],s=null!=t.graft?await this.handleGraft(e,t.graft):[];if(null!=t.prune&&await this.handlePrune(e,t.prune),0===n.length&&0===r.length&&0===s.length)return;const i=this.sendRpc(e,Dv(r,{iwant:n,prune:s})),o=n[0]?.messageIDs;null!=o&&(i?this.gossipTracer.addPromise(e,o):this.metrics?.iwantPromiseUntracked.inc(1))}acceptFrom(e){if(this.direct.has(e))return!0;const t=Date.now(),n=this.acceptFromWhitelist.get(e);if(null!=n&&n.messagesAccepted<128&&n.acceptUntil>=t)return n.messagesAccepted+=1,!0;const r=this.score.score(e);return r>=0?this.acceptFromWhitelist.set(e,{messagesAccepted:0,acceptUntil:t+1e3}):this.acceptFromWhitelist.delete(e),r>=this.opts.scoreThresholds.graylistThreshold}handleIHave(e,t){if(0===t.length)return[];const n=this.score.score(e);if(n<this.opts.scoreThresholds.gossipThreshold)return this.log("IHAVE: ignoring peer %s with score below threshold [ score = %d ]",e,n),this.metrics?.ihaveRcvIgnored.inc({reason:sv.LowScore}),[];const r=(this.peerhave.get(e)??0)+1;if(this.peerhave.set(e,r),r>10)return this.log("IHAVE: peer %s has advertised too many times (%d) within this heartbeat interval; ignoring",e,r),this.metrics?.ihaveRcvIgnored.inc({reason:sv.MaxIhave}),[];const s=this.iasked.get(e)??0;if(s>=Wb)return this.log("IHAVE: peer %s has already advertised too many messages (%d); ignoring",e,s),this.metrics?.ihaveRcvIgnored.inc({reason:sv.MaxIasked}),[];const i=new Map;if(t.forEach((({topicID:e,messageIDs:t})=>{if(null==e||null==t||!this.mesh.has(e))return;let n=0;t.forEach((e=>{const t=this.msgIdToStrFn(e);this.seenCache.has(t)||(i.set(t,e),n++)})),this.metrics?.onIhaveRcv(e,t.length,n)})),0===i.size)return[];let o=i.size;o+s>Wb&&(o=Wb-s),this.log("IHAVE: Asking for %d out of %d messages from %s",o,i.size,e);let a=Array.from(i.values());return Pv(a),a=a.slice(0,o),this.iasked.set(e,s+o),[{messageIDs:a}]}handleIWant(e,t){if(0===t.length)return[];const n=this.score.score(e);if(n<this.opts.scoreThresholds.gossipThreshold)return this.log("IWANT: ignoring peer %s with score below threshold [score = %d]",e,n),[];const r=new Map,s=new Map;let i=0;return t.forEach((({messageIDs:t})=>{t?.forEach((t=>{const n=this.msgIdToStrFn(t),o=this.mcache.getWithIWantCount(n,e);null!=o?(s.set(o.msg.topic,1+(s.get(o.msg.topic)??0)),o.count>3?this.log("IWANT: Peer %s has asked for message %s too many times: ignoring request",e,t):r.set(n,o.msg)):i++}))})),this.metrics?.onIwantRcv(s,i),0===r.size?(this.log("IWANT: Could not provide any wanted messages to %s",e),[]):(this.log("IWANT: Sending %d messages to %s",r.size,e),Array.from(r.values()))}async handleGraft(e,t){const n=[],r=this.score.score(e),s=Date.now();let i=this.opts.doPX;if(t.forEach((({topicID:t})=>{if(null==t)return;const o=this.mesh.get(t);if(null==o)return void(i=!1);if(o.has(e))return;const a=this.backoff.get(t)?.get(e);if(this.direct.has(e))this.log("GRAFT: ignoring request from direct peer %s",e),n.push(t),i=!1;else if("number"==typeof a&&s<a){this.log("GRAFT: ignoring backed off peer %s",e),this.score.addPenalty(e,1,rv.GraftBackoff),i=!1;const r=a+this.opts.graftFloodThreshold-this.opts.pruneBackoff;s<r&&this.score.addPenalty(e,1,rv.GraftBackoff),this.addBackoff(e,t),n.push(t)}else r<0?(this.log("GRAFT: ignoring peer %s with negative score: score=%d, topic=%s",e,r,t),n.push(t),i=!1,this.addBackoff(e,t)):o.size>=this.opts.Dhi&&!this.outbound.get(e)?(n.push(t),this.addBackoff(e,t)):(this.log("GRAFT: Add mesh link from %s in %s",e,t),this.score.graft(e,t),o.add(e),this.metrics?.onAddToMesh(t,tv.Subscribed,1));this.safeDispatchEvent("gossipsub:graft",{detail:{peerId:e,topic:t,direction:"inbound"}})})),0===n.length)return[];return Promise.all(n.map((async t=>this.makePrune(e,t,i,false))))}async handlePrune(e,t){const n=this.score.score(e);for(const{topicID:r,backoff:s,peers:i}of t){if(null==r)continue;const t=this.mesh.get(r);if(null==t)return;this.log("PRUNE: Remove mesh link to %s in %s",e,r),this.score.prune(e,r),t.has(e)&&(t.delete(e),this.metrics?.onRemoveFromMesh(r,nv.Prune,1)),"number"==typeof s&&s>0?this.doAddBackoff(e,r,1e3*s):this.addBackoff(e,r),null!=i&&i.length>0&&(n<this.opts.scoreThresholds.acceptPXThreshold?this.log("PRUNE: ignoring PX from peer %s with insufficient score [score = %d, topic = %s]",e,n,r):await this.pxConnect(i)),this.safeDispatchEvent("gossipsub:prune",{detail:{peerId:e,topic:r,direction:"inbound"}})}}addBackoff(e,t){this.doAddBackoff(e,t,this.opts.pruneBackoff)}doAddBackoff(e,t,n){let r=this.backoff.get(t);null==r&&(r=new Map,this.backoff.set(t,r));const s=Date.now()+n;(r.get(e)??0)<s&&r.set(e,s)}applyIwantPenalties(){this.gossipTracer.getBrokenPromises().forEach(((e,t)=>{this.log("peer %s didn't follow up in %d IWANT requests; adding penalty",t,e),this.score.addPenalty(t,e,rv.BrokenPromise)}))}clearBackoff(){if(this.heartbeatTicks%15!=0)return;const e=Date.now();this.backoff.forEach(((t,n)=>{t.forEach(((n,r)=>{n+1*this.opts.heartbeatInterval<e&&t.delete(r)})),0===t.size&&this.backoff.delete(n)}))}async directConnect(){const e=[];this.direct.forEach((t=>{this.streamsOutbound.has(t)||e.push(t)})),await Promise.all(e.map((async e=>this.connect(e))))}async pxConnect(e){e.length>this.opts.prunePeers&&(Pv(e),e=e.slice(0,this.opts.prunePeers));const t=[];await Promise.all(e.map((async e=>{if(null==e.peerID)return;const n=Rs(e.peerID),r=n.toString();if(!this.peers.has(r))if(null!=e.signedPeerRecord)try{if(!await this.components.peerStore.consumePeerRecord(e.signedPeerRecord,n))return void this.log("bogus peer record obtained through px: could not add peer record to address book");t.push(r)}catch(e){this.log("bogus peer record obtained through px: invalid signature or not a peer record")}else t.push(r)}))),0!==t.length&&await Promise.all(t.map((async e=>this.connect(e))))}async connect(e){this.log("Initiating connection with %s",e);const t=Is(e),n=await this.components.connectionManager.openConnection(t);for(const e of this.multicodecs)for(const r of this.components.registrar.getTopologies(e))r.onConnect?.(t,n)}subscribe(e){if(this.status.code!==Ov.started)throw new Error("Pubsub has not started");if(!this.subscriptions.has(e)){this.subscriptions.add(e);for(const t of this.peers.keys())this.sendSubscriptions(t,[e],!0)}this.join(e)}unsubscribe(e){if(this.status.code!==Ov.started)throw new Error("Pubsub is not started");const t=this.subscriptions.delete(e);if(this.log("unsubscribe from %s - am subscribed %s",e,t),t)for(const t of this.peers.keys())this.sendSubscriptions(t,[e],!1);this.leave(e)}join(e){if(this.status.code!==Ov.started)throw new Error("Gossipsub has not started");if(this.mesh.has(e))return;this.log("JOIN %s",e),this.metrics?.onJoin(e);const t=new Set,n=this.backoff.get(e),r=this.fanout.get(e);if(null!=r&&(this.fanout.delete(e),this.fanoutLastpub.delete(e),r.forEach((e=>{this.direct.has(e)||!(this.score.score(e)>=0)||null!=n&&n.has(e)||t.add(e)})),this.metrics?.onAddToMesh(e,tv.Fanout,t.size)),t.size<this.opts.D){const r=t.size;this.getRandomGossipPeers(e,this.opts.D,(e=>!t.has(e)&&!this.direct.has(e)&&this.score.score(e)>=0&&(null==n||!n.has(e)))).forEach((e=>{t.add(e)})),this.metrics?.onAddToMesh(e,tv.Random,t.size-r)}this.mesh.set(e,t),t.forEach((t=>{this.log("JOIN: Add mesh link to %s in %s",t,e),this.sendGraft(t,e)}))}leave(e){if(this.status.code!==Ov.started)throw new Error("Gossipsub has not started");this.log("LEAVE %s",e),this.metrics?.onLeave(e);const t=this.mesh.get(e);null!=t&&(Promise.all(Array.from(t).map((async t=>{this.log("LEAVE: Remove mesh link to %s in %s",t,e),await this.sendPrune(t,e)}))).catch((e=>{this.log("Error sending prunes to mesh peers",e)})),this.mesh.delete(e))}selectPeersToForward(e,t,n){const r=new Set,s=this.topics.get(e);null!=s&&(this.direct.forEach((e=>{s.has(e)&&t!==e&&!n?.has(e)&&r.add(e)})),this.floodsubPeers.forEach((e=>{s.has(e)&&t!==e&&!n?.has(e)&&this.score.score(e)>=this.opts.scoreThresholds.publishThreshold&&r.add(e)})));const i=this.mesh.get(e);return null!=i&&i.size>0&&i.forEach((e=>{t===e||n?.has(e)||r.add(e)})),r}selectPeersToPublish(e){const t=new Set,n={direct:0,floodsub:0,mesh:0,fanout:0},r=this.topics.get(e);if(null!=r)if(this.opts.floodPublish)r.forEach((e=>{this.direct.has(e)?(t.add(e),n.direct++):this.score.score(e)>=this.opts.scoreThresholds.publishThreshold&&(t.add(e),n.floodsub++)}));else{this.direct.forEach((e=>{r.has(e)&&(t.add(e),n.direct++)})),this.floodsubPeers.forEach((e=>{r.has(e)&&this.score.score(e)>=this.opts.scoreThresholds.publishThreshold&&(t.add(e),n.floodsub++)}));const s=this.mesh.get(e);if(null!=s&&s.size>0)s.forEach((e=>{t.add(e),n.mesh++}));else{const r=this.fanout.get(e);if(null!=r&&r.size>0)r.forEach((e=>{t.add(e),n.fanout++}));else{const r=this.getRandomGossipPeers(e,this.opts.D,(e=>this.score.score(e)>=this.opts.scoreThresholds.publishThreshold));r.size>0&&(this.fanout.set(e,r),r.forEach((e=>{t.add(e),n.fanout++})))}this.fanoutLastpub.set(e,Date.now())}}return{tosend:t,tosendCount:n}}forwardMessage(e,t,n,r){null!=n&&this.score.deliverMessage(n,e,t.topic);const s=this.selectPeersToForward(t.topic,n,r);s.forEach((e=>{this.sendRpc(e,Dv([t]))})),this.metrics?.onForwardMsg(t.topic,s.size)}async publish(e,t,n){const r=Date.now(),s=null!=this.dataTransform?this.dataTransform.outboundTransform(e,t):t;if(null==this.publishConfig)throw Error("PublishError.Uninitialized");const{raw:i,msg:o}=await async function(e,t,n,r){switch(e.type){case Qb.Signing:{const s={from:e.author.toBytes(),data:r,seqno:Lo(8),topic:t,signature:void 0,key:void 0},i=Rn([Tv,Gb.Message.encode(s)]);return s.signature=await e.privateKey.sign(i),s.key=e.key,{raw:s,msg:{type:"signed",from:e.author,data:n,sequenceNumber:BigInt(`0x${Qt(s.seqno,"base16")}`),topic:t,signature:s.signature,key:s.key}}}case Qb.Anonymous:return{raw:{from:void 0,data:r,seqno:void 0,topic:t,signature:void 0,key:void 0},msg:{type:"unsigned",data:n,topic:t}};default:throw new Error("Unreachable")}}(this.publishConfig,e,t,s),a=await this.msgIdFn(o),c=this.msgIdToStrFn(a),l=n?.ignoreDuplicatePublishError??this.opts.ignoreDuplicatePublishError;if(this.seenCache.has(c)){if(l)return this.metrics?.onPublishDuplicateMsg(e),{recipients:[]};throw Error("PublishError.Duplicate")}const{tosend:u,tosendCount:h}=this.selectPeersToPublish(e),d=this.opts.emitSelf&&this.subscriptions.has(e),p=n?.allowPublishToZeroTopicPeers??this.opts.allowPublishToZeroTopicPeers;if(0===u.size&&!p&&!d)throw Error("PublishError.NoPeersSubscribedToTopic");this.seenCache.put(c),this.mcache.put({msgId:a,msgIdStr:c},i,!0),this.publishedMessageIds.put(c);const f=n?.batchPublish??this.opts.batchPublish,g=Dv([i]);if(f)this.sendRpcInBatch(u,g);else for(const e of u){this.sendRpc(e,g)||u.delete(e)}const m=Date.now()-r;return this.metrics?.onPublishMsg(e,h,u.size,null!=i.data?i.data.length:0,m),d&&(u.add(this.components.peerId.toString()),super.dispatchEvent(new vn("gossipsub:message",{detail:{propagationSource:this.components.peerId,msgId:c,msg:o}})),super.dispatchEvent(new vn("message",{detail:o}))),{recipients:Array.from(u.values()).map((e=>Is(e)))}}sendRpcInBatch(e,t){const n=Gb.encode(t),r=Or.single(n);for(const s of e){const i=this.streamsOutbound.get(s);if(null!=i){try{i.pushPrefixed(r)}catch(t){e.delete(s),this.log.error(`Cannot send rpc to ${s}`,t)}this.metrics?.onRpcSent(t,n.length)}else this.log(`Cannot send RPC to ${s} as there is no open stream to it available`),e.delete(s)}}reportMessageValidationResult(e,t,n){let r;if(n===un.Accept){if(r=this.mcache.validate(e),null!=r){const{message:n,originatingPeers:s}=r;this.score.deliverMessage(t,e,n.topic),this.forwardMessage(e,r.message,t,s)}}else if(r=this.mcache.remove(e),null!=r){const s=av(n),{message:i,originatingPeers:o}=r;this.score.rejectMessage(t,e,i.topic,s);for(const t of o)this.score.rejectMessage(t,e,i.topic,s)}const s=this.score.messageFirstSeenTimestampMs(e);this.metrics?.onReportValidation(r,n,s)}sendGraft(e,t){const n=Dv([],{graft:[{topicID:t}]});this.sendRpc(e,n)}async sendPrune(e,t){const n=Dv([],{prune:[await this.makePrune(e,t,this.opts.doPX,!0)]});this.sendRpc(e,n)}sendRpc(e,t){const n=this.streamsOutbound.get(e);if(null==n)return this.log(`Cannot send RPC to ${e} as there is no open stream to it available`),!1;const r=this.control.get(e);null!=r&&(this.piggybackControl(e,t,r),this.control.delete(e));const s=this.gossip.get(e);null!=s&&(this.piggybackGossip(e,t,s),this.gossip.delete(e));const i=Gb.encode(t);try{n.push(i)}catch(t){return this.log.error(`Cannot send rpc to ${e}`,t),null!=r&&this.control.set(e,r),null!=s&&this.gossip.set(e,s),!1}if(this.metrics?.onRpcSent(t,i.length),null!=t.control?.graft)for(const n of t.control?.graft)null!=n.topicID&&this.safeDispatchEvent("gossipsub:graft",{detail:{peerId:e,topic:n.topicID,direction:"outbound"}});if(null!=t.control?.prune)for(const n of t.control?.prune)null!=n.topicID&&this.safeDispatchEvent("gossipsub:prune",{detail:{peerId:e,topic:n.topicID,direction:"outbound"}});return!0}piggybackControl(e,t,n){const r=kv(t);for(const t of n.graft)null!=t.topicID&&this.mesh.get(t.topicID)?.has(e)&&r.control.graft.push(t);for(const t of n.prune)null==t.topicID||this.mesh.get(t.topicID)?.has(e)||r.control.prune.push(t)}piggybackGossip(e,t,n){kv(t).control.ihave=n}async sendGraftPrune(e,t,n){const r=this.opts.doPX,s=!1;for(const[i,o]of e){const e=o.map((e=>({topicID:e})));let a=[];const c=t.get(i);null!=c&&(a=await Promise.all(c.map((async e=>this.makePrune(i,e,r&&!n.get(i),s)))),t.delete(i)),this.sendRpc(i,Dv([],{graft:e,prune:a}))}for(const[e,i]of t){const t=await Promise.all(i.map((async t=>this.makePrune(e,t,r&&!n.get(e),s))));this.sendRpc(e,Dv([],{prune:t}))}}emitGossip(e){const t=this.mcache.getGossipIDs(new Set(e.keys()));for(const[n,r]of e)this.doEmitGossip(n,r,t.get(n)??[])}doEmitGossip(e,t,n){if(0===n.length)return;if(Pv(n),n.length>Wb&&this.log("too many messages for gossip; will truncate IHAVE list (%d messages)",n.length),0===t.size)return;let r=this.opts.Dlazy;const s=.25*t.size;let i=t;s>r&&(r=s),r>i.size?r=i.size:i=Pv(Array.from(i)).slice(0,r),i.forEach((t=>{let r=n;n.length>Wb&&(r=Pv(r.slice()).slice(0,Wb)),this.pushGossip(t,{topicID:e,messageIDs:r})}))}flush(){for(const[e,t]of this.gossip.entries())this.gossip.delete(e),this.sendRpc(e,Dv([],{ihave:t}));for(const[e,t]of this.control.entries()){this.control.delete(e);const n=Dv([],{graft:t.graft,prune:t.prune});this.sendRpc(e,n)}}pushGossip(e,t){this.log("Add gossip to %s",e);const n=this.gossip.get(e)??[];this.gossip.set(e,n.concat(t))}async makePrune(e,t,n,r){if(this.score.prune(e,t),this.streamsOutbound.get(e)?.protocol===Hb)return{topicID:t,peers:[]};const s=r?this.opts.unsubcribeBackoff:this.opts.pruneBackoff,i=s/1e3;if(this.doAddBackoff(e,t,s),!n)return{topicID:t,peers:[],backoff:i};const o=this.getRandomGossipPeers(t,this.opts.prunePeers,(t=>t!==e&&this.score.score(t)>=0)),a=await Promise.all(Array.from(o).map((async e=>{const t=Is(e);let n;try{n=await this.components.peerStore.get(t)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}return{peerID:t.toBytes(),signedPeerRecord:n?.peerRecordEnvelope}})));return{topicID:t,peers:a,backoff:i}}runHeartbeat=()=>{const e=this.metrics?.heartbeatDuration.startTimer();this.heartbeat().catch((e=>{this.log("Error running heartbeat",e)})).finally((()=>{if(null!=e&&e(),this.status.code===Ov.started){clearTimeout(this.status.heartbeatTimeout);let e=this.opts.heartbeatInterval-(Date.now()-this.status.hearbeatStartMs)%this.opts.heartbeatInterval;e<.25*this.opts.heartbeatInterval&&(e+=this.opts.heartbeatInterval,this.metrics?.heartbeatSkipped.inc()),this.status.heartbeatTimeout=setTimeout(this.runHeartbeat,e)}}))};async heartbeat(){const{D:e,Dlo:t,Dhi:n,Dscore:r,Dout:s,fanoutTTL:i}=this.opts;this.heartbeatTicks++;const o=new Map,a=e=>{let t=o.get(e);return void 0===t&&(t=this.score.score(e),o.set(e,t)),t},c=new Map,l=new Map,u=new Map;this.clearBackoff(),this.peerhave.clear(),this.metrics?.cacheSize.set({cache:"iasked"},this.iasked.size),this.iasked.clear(),this.applyIwantPenalties(),this.heartbeatTicks%this.opts.directConnectTicks==0&&await this.directConnect(),this.fastMsgIdCache?.prune(),this.seenCache.prune(),this.gossipTracer.prune(),this.publishedMessageIds.prune();const h=new Map;this.mesh.forEach(((i,o)=>{const d=this.topics.get(o),p=new Set,f=new Set;if(h.set(o,f),null!=d){const e=Pv(Array.from(d)),t=this.backoff.get(o);for(const n of e){const e=this.streamsOutbound.get(n);if(null!=e&&this.multicodecs.includes(e.protocol)&&!i.has(n)&&!this.direct.has(n)){const e=a(n);(null==t||!t.has(n))&&e>=0&&p.add(n),e>=this.opts.scoreThresholds.gossipThreshold&&f.add(n)}}}const g=(e,t)=>{this.log("HEARTBEAT: Remove mesh link to %s in %s",e,o),this.addBackoff(e,o),i.delete(e),a(e)>=this.opts.scoreThresholds.gossipThreshold&&f.add(e),this.metrics?.onRemoveFromMesh(o,t,1);const n=l.get(e);null==n?l.set(e,[o]):n.push(o)},m=(e,t)=>{this.log("HEARTBEAT: Add mesh link to %s in %s",e,o),this.score.graft(e,o),i.add(e),f.delete(e),this.metrics?.onAddToMesh(o,t,1);const n=c.get(e);null==n?c.set(e,[o]):n.push(o)};if(i.forEach((e=>{const t=a(e);t<0&&(this.log("HEARTBEAT: Prune peer %s with negative score: score=%d, topic=%s",e,t,o),g(e,nv.BadScore),u.set(e,!0))})),i.size<t){const t=function(e,t){return gv(e,t,(()=>!0))}(p,e-i.size);t.forEach((e=>{m(e,tv.NotEnough)}))}if(i.size>n){let t=Array.from(i);t.sort(((e,t)=>a(t)-a(e))),t=t.slice(0,r).concat(Pv(t.slice(r)));let n=0;if(t.slice(0,e).forEach((e=>{this.outbound.get(e)&&n++})),n<s){const r=e=>{const n=t[e];for(let n=e;n>0;n--)t[n]=t[n-1];t[0]=n};if(n>0){let s=n;for(let n=1;n<e&&s>0;n++)this.outbound.get(t[n])&&(r(n),s--)}let s=e-n;for(let n=e;n<t.length&&s>0;n++)this.outbound.get(t[n])&&(r(n),s--)}t.slice(e).forEach((e=>{g(e,nv.Excess)}))}if(i.size>=t){let e=0;if(i.forEach((t=>{this.outbound.get(t)&&e++})),e<s){gv(p,s-e,(e=>!0===this.outbound.get(e))).forEach((e=>{m(e,tv.Outbound)}))}}if(this.heartbeatTicks%this.opts.opportunisticGraftTicks==0&&i.size>1){const e=Array.from(i).sort(((e,t)=>a(e)-a(t))),t=Math.floor(i.size/2),n=a(e[t]);if(n<this.opts.scoreThresholds.opportunisticGraftThreshold){const e=gv(p,this.opts.opportunisticGraftPeers,(e=>a(e)>n));for(const t of e)this.log("HEARTBEAT: Opportunistically graft peer %s on topic %s",t,o),m(t,tv.Opportunistic)}}}));const d=Date.now();this.fanoutLastpub.forEach(((e,t)=>{e+i<d&&(this.fanout.delete(t),this.fanoutLastpub.delete(t))})),this.fanout.forEach(((t,n)=>{const r=this.topics.get(n);t.forEach((e=>{(!r?.has(e)||a(e)<this.opts.scoreThresholds.publishThreshold)&&t.delete(e)}));const s=this.topics.get(n),i=[],o=new Set;if(h.set(n,o),null!=s){const e=Pv(Array.from(s));for(const n of e){const e=this.streamsOutbound.get(n);if(null!=e&&this.multicodecs.includes(e.protocol)&&!t.has(n)&&!this.direct.has(n)){const e=a(n);e>=this.opts.scoreThresholds.publishThreshold&&i.push(n),e>=this.opts.scoreThresholds.gossipThreshold&&o.add(n)}}}if(t.size<e){const n=e-t.size;i.slice(0,n).forEach((e=>{t.add(e),o?.delete(e)}))}})),this.emitGossip(h),await this.sendGraftPrune(c,l,u),this.flush(),this.mcache.shift(),this.dispatchEvent(new vn("gossipsub:heartbeat"))}getRandomGossipPeers(e,t,n=(()=>!0)){const r=this.topics.get(e);if(null==r)return new Set;let s=[];return r.forEach((e=>{const t=this.streamsOutbound.get(e);null!=t&&this.multicodecs.includes(t.protocol)&&n(e)&&s.push(e)})),s=Pv(s),t>0&&s.length>t&&(s=s.slice(0,t)),new Set(s)}onScrapeMetrics(e){e.mcacheSize.set(this.mcache.size),e.mcacheNotValidatedCount.set(this.mcache.notValidatedCount),e.cacheSize.set({cache:"direct"},this.direct.size),e.cacheSize.set({cache:"seenCache"},this.seenCache.size),e.cacheSize.set({cache:"fastMsgIdCache"},this.fastMsgIdCache?.size??0),e.cacheSize.set({cache:"publishedMessageIds"},this.publishedMessageIds.size),e.cacheSize.set({cache:"mcache"},this.mcache.size),e.cacheSize.set({cache:"score"},this.score.size),e.cacheSize.set({cache:"gossipTracer.promises"},this.gossipTracer.size),e.cacheSize.set({cache:"gossipTracer.requests"},this.gossipTracer.requestMsByMsgSize),e.cacheSize.set({cache:"topics"},this.topics.size),e.cacheSize.set({cache:"subscriptions"},this.subscriptions.size),e.cacheSize.set({cache:"mesh"},this.mesh.size),e.cacheSize.set({cache:"fanout"},this.fanout.size),e.cacheSize.set({cache:"peers"},this.peers.size),e.cacheSize.set({cache:"streamsOutbound"},this.streamsOutbound.size),e.cacheSize.set({cache:"streamsInbound"},this.streamsInbound.size),e.cacheSize.set({cache:"acceptFromWhitelist"},this.acceptFromWhitelist.size),e.cacheSize.set({cache:"gossip"},this.gossip.size),e.cacheSize.set({cache:"control"},this.control.size),e.cacheSize.set({cache:"peerhave"},this.peerhave.size),e.cacheSize.set({cache:"outbound"},this.outbound.size);let t=0;const n=Date.now();e.connectedPeersBackoffSec.reset();for(const r of this.backoff.values()){t+=r.size;for(const[t,s]of r.entries())this.peers.has(t)&&e.connectedPeersBackoffSec.observe(Math.max(0,s-n)/1e3)}e.cacheSize.set({cache:"backoff"},t);for(const[t,n]of this.topics)e.topicPeersCount.set({topicStr:t},n.size);for(const[t,n]of this.mesh)e.meshPeerCounts.set({topicStr:t},n.size);const r=[],s=new Map;e.behaviourPenalty.reset();for(const t of this.peers.keys()){const n=this.score.score(t);r.push(n),s.set(t,n),e.behaviourPenalty.observe(this.score.peerStats.get(t)?.behaviourPenalty??0)}e.registerScores(r,this.opts.scoreThresholds),e.registerScorePerMesh(this.mesh,s);const i=function(e,t,n,r,s){const i={byTopic:new Map,p5w:[],p6w:[],p7w:[],score:[]};for(const o of e){const e=t.get(o);if(null!=e){const t=_v(o,e,n,r,s);for(const[e,n]of t.byTopic){let t=i.byTopic.get(e);null==t&&(t={p1w:[],p2w:[],p3w:[],p3bw:[],p4w:[]},i.byTopic.set(e,t)),t.p1w.push(n.p1w),t.p2w.push(n.p2w),t.p3w.push(n.p3w),t.p3bw.push(n.p3bw),t.p4w.push(n.p4w)}i.p5w.push(t.p5w),i.p6w.push(t.p6w),i.p7w.push(t.p7w),i.score.push(t.score)}else i.p5w.push(0),i.p6w.push(0),i.p7w.push(0),i.score.push(0)}return i}(this.peers.keys(),this.score.peerStats,this.score.params,this.score.peerIPs,e.topicStrToLabel);e.registerScoreWeights(i)}tagMeshPeer=e=>{const{peerId:t,topic:n}=e.detail;this.components.peerStore.merge(Is(t),{tags:{[n]:{value:100}}}).catch((e=>{this.log.error("Error tagging peer %s with topic %s",t,n,e)}))};untagMeshPeer=e=>{const{peerId:t,topic:n}=e.detail;this.components.peerStore.merge(Is(t),{tags:{[n]:void 0}}).catch((e=>{this.log.error("Error untagging peer %s with topic %s",t,n,e)}))}}function Uv(e={}){return t=>new Bv(t,e)}var Fv;!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.protocolVersion&&(t.uint32(42),t.string(e.protocolVersion)),null!=e.agentVersion&&(t.uint32(50),t.string(e.agentVersion)),null!=e.publicKey&&(t.uint32(10),t.bytes(e.publicKey)),null!=e.listenAddrs)for(const n of e.listenAddrs)t.uint32(18),t.bytes(n);if(null!=e.observedAddr&&(t.uint32(34),t.bytes(e.observedAddr)),null!=e.protocols)for(const n of e.protocols)t.uint32(26),t.string(n);null!=e.signedPeerRecord&&(t.uint32(66),t.bytes(e.signedPeerRecord)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={listenAddrs:[],protocols:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 5:n.protocolVersion=e.string();break;case 6:n.agentVersion=e.string();break;case 1:n.publicKey=e.bytes();break;case 2:n.listenAddrs.push(e.bytes());break;case 4:n.observedAddr=e.bytes();break;case 3:n.protocols.push(e.string());break;case 8:n.signedPeerRecord=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(Fv||(Fv={}));const Vv={protocolPrefix:"ipfs",timeout:5e3,maxInboundStreams:1,maxOutboundStreams:1,maxObservedAddresses:10,maxMessageSize:8192,runOnConnectionOpen:!0,runOnSelfUpdate:!0,runOnTransientConnection:!0,concurrency:32};async function Kv(e,t,n,r,s){if(n("received identify from %p",r.remotePeer),null==s)throw new fn("message was null or undefined","ERR_INVALID_MESSAGE");const i={};if(s.listenAddrs.length>0&&(i.addresses=s.listenAddrs.map((e=>({isCertified:!1,multiaddr:cr(e)})))),s.protocols.length>0&&(i.protocols=s.protocols),null!=s.publicKey){i.publicKey=s.publicKey;if(!(await As(s.publicKey)).equals(r.remotePeer))throw new fn("public key did not match remote PeerId","ERR_INVALID_PUBLIC_KEY")}let o;if(null!=s.signedPeerRecord){n("received signedPeerRecord from %p",r.remotePeer);let t=s.signedPeerRecord;const a=await Jh.openAndCertify(t,td.DOMAIN);let c,l=td.createFromProtobuf(a.payload);if(!l.peerId.equals(a.peerId))throw new fn("signing key does not match PeerId in the PeerRecord","ERR_INVALID_SIGNING_KEY");if(!r.remotePeer.equals(l.peerId))throw new fn("signing key does not match remote PeerId","ERR_INVALID_PEER_RECORD_KEY");try{c=await e.get(l.peerId)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}if(null!=c&&(i.metadata=c.metadata,null!=c.peerRecordEnvelope)){const e=await Jh.createFromProtobuf(c.peerRecordEnvelope),r=td.createFromProtobuf(e.payload);r.seqNumber>=l.seqNumber&&(n("sequence number was lower or equal to existing sequence number - stored: %d received: %d",r.seqNumber,l.seqNumber),l=r,t=c.peerRecordEnvelope)}i.peerRecordEnvelope=t,i.addresses=l.multiaddrs.map((e=>({isCertified:!0,multiaddr:e}))),o={seq:l.seqNumber,addresses:l.multiaddrs}}else n("%p did not send a signed peer record",r.remotePeer);if(n("patching %p with",r.remotePeer,i),await e.patch(r.remotePeer,i),null!=s.agentVersion||null!=s.protocolVersion){const t={};null!=s.agentVersion&&(t.AgentVersion=kt(s.agentVersion)),null!=s.protocolVersion&&(t.ProtocolVersion=kt(s.protocolVersion)),n("merging %p metadata",r.remotePeer,t),await e.merge(r.remotePeer,{metadata:t})}const a={peerId:r.remotePeer,protocolVersion:s.protocolVersion,agentVersion:s.agentVersion,publicKey:s.publicKey,listenAddrs:s.listenAddrs.map((e=>cr(e))),observedAddr:null==s.observedAddr?void 0:cr(s.observedAddr),protocols:s.protocols,signedPeerRecord:o,connection:r};return t.safeDispatchEvent("peer:identify",{detail:a}),a}class $v{host;protocol;started;timeout;peerId;peerStore;registrar;addressManager;maxInboundStreams;maxOutboundStreams;maxMessageSize;maxObservedAddresses;events;runOnTransientConnection;log;constructor(e,t){var n,r;this.protocol=t.protocol,this.started=!1,this.peerId=e.peerId,this.peerStore=e.peerStore,this.registrar=e.registrar,this.addressManager=e.addressManager,this.events=e.events,this.log=t.log,this.timeout=t.timeout??Vv.timeout,this.maxInboundStreams=t.maxInboundStreams??Vv.maxInboundStreams,this.maxOutboundStreams=t.maxOutboundStreams??Vv.maxOutboundStreams,this.maxMessageSize=t.maxMessageSize??Vv.maxMessageSize,this.maxObservedAddresses=t.maxObservedAddresses??Vv.maxObservedAddresses,this.runOnTransientConnection=t.runOnTransientConnection??Vv.runOnTransientConnection,this.host={protocolVersion:`${t.protocolPrefix??Vv.protocolPrefix}/0.1.0`,agentVersion:(n=e.nodeInfo,r=t.agentVersion,null!=r||(r=`${n.name}/${n.version}`,yy||gy?r+=` UserAgent=${globalThis.process.version}`:(fy||wy||my||by)&&(r+=` UserAgent=${globalThis.navigator.userAgent}`)),r)}}isStarted(){return this.started}async start(){this.started||(await this.peerStore.merge(this.peerId,{metadata:{AgentVersion:kt(this.host.agentVersion),ProtocolVersion:kt(this.host.protocolVersion)}}),await this.registrar.handle(this.protocol,(e=>{this.handleProtocol(e).catch((e=>{this.log.error(e)}))}),{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnTransientConnection:this.runOnTransientConnection}),this.started=!0)}async stop(){await this.registrar.unhandle(this.protocol),this.started=!1}}class qv extends $v{connectionManager;concurrency;constructor(e,t={}){super(e,{...t,protocol:`/${t.protocolPrefix??Vv.protocolPrefix}/id/push/1.0.0`,log:e.logger.forComponent("libp2p:identify-push")}),this.connectionManager=e.connectionManager,this.concurrency=t.concurrency??Vv.concurrency,(t.runOnSelfUpdate??Vv.runOnSelfUpdate)&&e.events.addEventListener("self:peer:update",(e=>{this.push().catch((e=>{this.log.error(e)}))}))}async push(){if(!this.isStarted())return;const e=this.addressManager.getAddresses().map((e=>e.decapsulateCode(Fn("p2p").code))),t=new td({peerId:this.peerId,multiaddrs:e}),n=await Jh.seal(t,this.peerId),r=this.registrar.getProtocols(),s=await this.peerStore.get(this.peerId),i=Qt(s.metadata.get("AgentVersion")??kt(this.host.agentVersion)),o=Qt(s.metadata.get("ProtocolVersion")??kt(this.host.protocolVersion)),a=this;await Od(Bf(async function*(){for(const t of a.connectionManager.getConnections()){(await a.peerStore.get(t.remotePeer)).protocols.includes(a.protocol)&&(yield async()=>{let s;const c=AbortSignal.timeout(a.timeout);try{s=await t.newStream(a.protocol,{signal:c,runOnTransientConnection:a.runOnTransientConnection});const l=Aw(s,{maxDataLength:a.maxMessageSize}).pb(Fv);await l.write({listenAddrs:e.map((e=>e.bytes)),signedPeerRecord:n.marshal(),protocols:r,agentVersion:i,protocolVersion:o},{signal:c}),await s.close({signal:c})}catch(e){a.log.error("could not push identify update to peer",e),s?.abort(e)}})}}(),{concurrency:this.concurrency}))}async handleProtocol(e){const{connection:t,stream:n}=e;try{if(this.peerId.equals(t.remotePeer))throw new Error("received push from ourselves?");const e={signal:AbortSignal.timeout(this.timeout)},r=Aw(n,{maxDataLength:this.maxMessageSize}).pb(Fv),s=await r.read(e);await n.close(e),await Kv(this.peerStore,this.events,this.log,t,s)}catch(e){return this.log.error("received invalid message",e),void n.abort(e)}this.log("handled push from %p",t.remotePeer)}}class Hv extends $v{constructor(e,t={}){super(e,{...t,protocol:`/${t.protocolPrefix??Vv.protocolPrefix}/id/1.0.0`,log:e.logger.forComponent("libp2p:identify")}),(t.runOnConnectionOpen??Vv.runOnConnectionOpen)&&e.events.addEventListener("connection:open",(e=>{const t=e.detail;this.identify(t).catch((e=>{this.log.error("error during identify trigged by connection:open",e)}))}))}async _identify(e,t={}){let n;if(null==t.signal){const e=AbortSignal.timeout(this.timeout);t={...t,signal:e}}try{n=await e.newStream(this.protocol,{...t,runOnTransientConnection:this.runOnTransientConnection});const r=Aw(n,{maxDataLength:this.maxMessageSize}).pb(Fv),s=await r.read(t);return await n.close(t),s}catch(e){throw this.log.error("error while reading identify message",e),n?.abort(e),e}}async identify(e,t={}){const n=await this._identify(e,t),{publicKey:r,protocols:s,observedAddr:i}=n;if(null==r)throw new fn("public key was missing from identify message","ERR_MISSING_PUBLIC_KEY");const o=await As(r);if(!e.remotePeer.equals(o))throw new fn("identified peer does not match the expected peer","ERR_INVALID_PEER");if(this.peerId.equals(o))throw new fn("identified peer is our own peer id?","ERR_INVALID_PEER");const a=function(e){if(null!=e&&e.length>0)try{return cr(e)}catch{}}(i);return this.log("identify completed for peer %p and protocols %o",o,s),this.log("our observed address is %a",a),null!=a&&this.addressManager.getObservedAddrs().length<(this.maxObservedAddresses??1/0)&&(this.log("storing our observed address %a",a),this.addressManager.addObservedAddr(a)),Kv(this.peerStore,this.events,this.log,e,n)}async handleProtocol(e){const{connection:t,stream:n}=e,r=AbortSignal.timeout(this.timeout);try{const e=this.peerId.publicKey??new Uint8Array(0),s=await this.peerStore.get(this.peerId),i=this.addressManager.getAddresses().map((e=>e.decapsulateCode(Fn("p2p").code)));let o=s.peerRecordEnvelope;if(i.length>0&&null==o){const e=new td({peerId:this.peerId,multiaddrs:i});o=(await Jh.seal(e,this.peerId)).marshal().subarray()}let a=t.remoteAddr.bytes;mp.matches(t.remoteAddr)||(a=void 0);const c=Aw(n).pb(Fv);await c.write({protocolVersion:this.host.protocolVersion,agentVersion:this.host.agentVersion,publicKey:e,listenAddrs:i.map((e=>e.bytes)),signedPeerRecord:o,observedAddr:a,protocols:s.protocols},{signal:r}),await n.close({signal:r})}catch(e){this.log.error("could not respond to identify request",e),n.abort(e)}}}function zv(e={}){return t=>new Hv(t,e)}function Wv(e={}){return t=>new qv(t,e)}const jv=36e5,Gv=36*jv,Yv="/dht/provider",Qv=jv,Jv=20,Zv=3;var Xv,eE,tE,nE,rE,sE,iE,oE;function aE(e){const t=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0"),r=String(e.getUTCDate()).padStart(2,"0"),s=String(e.getUTCHours()).padStart(2,"0"),i=String(e.getUTCMinutes()).padStart(2,"0"),o=String(e.getUTCSeconds()).padStart(2,"0"),a=e.getUTCMilliseconds();return`${t}-${n}-${r}T${s}:${i}:${o}.${String(1e3*a*1e3).padStart(9,"0")}Z`}!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.key&&e.key.byteLength>0&&(t.uint32(10),t.bytes(e.key)),null!=e.value&&e.value.byteLength>0&&(t.uint32(18),t.bytes(e.value)),null!=e.timeReceived&&""!==e.timeReceived&&(t.uint32(42),t.string(e.timeReceived)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={key:y(0),value:y(0),timeReceived:""},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();switch(t>>>3){case 1:r.key=e.bytes();break;case 2:r.value=e.bytes();break;case 5:r.timeReceived=e.string();break;default:e.skipType(7&t)}}return r}))),t),e.encode=t=>qt(t,e.codec()),e.decode=(t,n)=>G(t,e.codec(),n)}(Xv||(Xv={}));class cE{key;value;timeReceived;constructor(e,t,n){if(!(e instanceof Uint8Array))throw new Error("key must be a Uint8Array");if(!(t instanceof Uint8Array))throw new Error("value must be a Uint8Array");this.key=e,this.value=t,this.timeReceived=n}serialize(){return Xv.encode(this.prepareSerialize())}prepareSerialize(){return{key:this.key,value:this.value,timeReceived:aE(this.timeReceived)}}static deserialize(e){const t=Xv.decode(e);return new cE(t.key,t.value,new Date(t.timeReceived))}static fromDeserialized(e){const t=function(e){const t=new RegExp("(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d+)Z"),n=String(e).trim().match(t);if(null==n)throw new Error("Invalid format");const r=parseInt(n[1],10),s=parseInt(n[2],10)-1,i=parseInt(n[3],10),o=parseInt(n[4],10),a=parseInt(n[5],10),c=parseInt(n[6],10),l=parseInt(n[7].slice(0,-6),10);return new Date(Date.UTC(r,s,i,o,a,c,l))}(e.timeReceived);if(null==e.key)throw new Error("key missing from deserialized object");if(null==e.value)throw new Error("value missing from deserialized object");return new cE(e.key,e.value,t)}}function lE(e,t={}){const n={...e,name:"SEND_QUERY",type:0,messageName:e.type,messageType:e.type};return t.onProgress?.(new vn("kad-dht:query:send-query",{detail:n})),n}function uE(e,t={}){const n={...e,name:"PEER_RESPONSE",type:1,messageName:e.messageType,closer:null!=e.closer?e.closer:[],providers:null!=e.providers?e.providers:[]};return t.onProgress?.(new vn("kad-dht:query:peer-response",{detail:n})),n}function hE(e,t={}){const n={...e,name:"FINAL_PEER",type:2};return t.onProgress?.(new vn("kad-dht:query:final-peer",{detail:n})),n}function dE(e,t={}){const n={...e,name:"QUERY_ERROR",type:3};return t.onProgress?.(new vn("kad-dht:query:query-error",{detail:n})),n}function pE(e,t={}){const n={...e,name:"PROVIDER",type:4};return t.onProgress?.(new vn("kad-dht:query:provider",{detail:n})),n}function fE(e,t={}){const n={...e,name:"VALUE",type:5};return t.onProgress?.(new vn("kad-dht:query:value",{detail:n})),n}function gE(e,t={}){const n={...e,name:"DIAL_PEER",type:7};return t.onProgress?.(new vn("kad-dht:query:dial-peer",{detail:n})),n}!function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.key&&(t.uint32(10),t.bytes(e.key)),null!=e.value&&(t.uint32(18),t.bytes(e.value)),null!=e.author&&(t.uint32(26),t.bytes(e.author)),null!=e.signature&&(t.uint32(34),t.bytes(e.signature)),null!=e.timeReceived&&(t.uint32(42),t.string(e.timeReceived)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.key=e.bytes();break;case 2:n.value=e.bytes();break;case 3:n.author=e.bytes();break;case 4:n.signature=e.bytes();break;case 5:n.timeReceived=e.string();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(eE||(eE={})),function(e){e.PUT_VALUE="PUT_VALUE",e.GET_VALUE="GET_VALUE",e.ADD_PROVIDER="ADD_PROVIDER",e.GET_PROVIDERS="GET_PROVIDERS",e.FIND_NODE="FIND_NODE",e.PING="PING"}(tE||(tE={})),function(e){e[e.PUT_VALUE=0]="PUT_VALUE",e[e.GET_VALUE=1]="GET_VALUE",e[e.ADD_PROVIDER=2]="ADD_PROVIDER",e[e.GET_PROVIDERS=3]="GET_PROVIDERS",e[e.FIND_NODE=4]="FIND_NODE",e[e.PING=5]="PING"}(nE||(nE={})),function(e){e.codec=()=>Wt(nE)}(tE||(tE={})),function(e){e.NOT_CONNECTED="NOT_CONNECTED",e.CONNECTED="CONNECTED",e.CAN_CONNECT="CAN_CONNECT",e.CANNOT_CONNECT="CANNOT_CONNECT"}(rE||(rE={})),function(e){e[e.NOT_CONNECTED=0]="NOT_CONNECTED",e[e.CONNECTED=1]="CONNECTED",e[e.CAN_CONNECT=2]="CAN_CONNECT",e[e.CANNOT_CONNECT=3]="CANNOT_CONNECT"}(sE||(sE={})),function(e){e.codec=()=>Wt(sE)}(rE||(rE={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.id&&e.id.byteLength>0&&(t.uint32(10),t.bytes(e.id)),null!=e.multiaddrs)for(const n of e.multiaddrs)t.uint32(18),t.bytes(n);null!=e.connection&&(t.uint32(24),rE.codec().encode(e.connection,t)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={id:y(0),multiaddrs:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.id=e.bytes();break;case 2:n.multiaddrs.push(e.bytes());break;case 3:n.connection=rE.codec().decode(e);break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(iE||(iE={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.type&&0!==nE[e.type]&&(t.uint32(8),tE.codec().encode(e.type,t)),null!=e.clusterLevel&&(t.uint32(80),t.int32(e.clusterLevel)),null!=e.key&&(t.uint32(18),t.bytes(e.key)),null!=e.record&&(t.uint32(26),t.bytes(e.record)),null!=e.closer)for(const n of e.closer)t.uint32(66),iE.codec().encode(n,t);if(null!=e.providers)for(const n of e.providers)t.uint32(74),iE.codec().encode(n,t);!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={type:tE.PUT_VALUE,closer:[],providers:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.type=tE.codec().decode(e);break;case 10:n.clusterLevel=e.int32();break;case 2:n.key=e.bytes();break;case 3:n.record=e.bytes();break;case 8:n.closer.push(iE.codec().decode(e,e.uint32()));break;case 9:n.providers.push(iE.codec().decode(e,e.uint32()));break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>qt(t,e.codec()),e.decode=t=>G(t,e.codec())}(oE||(oE={}));const mE={pk:function(e,t){return 0}};async function yE(e,t){const n=t.key,r=Qt(n).split("/");if(r.length<3)return;const s=e[r[1].toString()];if(null==s){const e=`No validator available for key type "${r[1]}"`;throw new fn(e,"ERR_INVALID_RECORD_KEY_TYPE")}await s(n,t.value)}const wE={pk:async(e,t)=>{if(!(e instanceof Uint8Array))throw new fn('"key" must be a Uint8Array',"ERR_INVALID_RECORD_KEY_NOT_BUFFER");if(e.byteLength<5)throw new fn("invalid public key record","ERR_INVALID_RECORD_KEY_TOO_SHORT");if("/pk/"!==Qt(e.subarray(0,4)))throw new fn("key was not prefixed with /pk/","ERR_INVALID_RECORD_KEY_BAD_PREFIX");if(!In(e.slice(4),(await gt.digest(t)).bytes))throw new fn("public key does not match passed in key","ERR_INVALID_RECORD_HASH_MISMATCH")}},bE=kt("/pk/");function vE(e){return{...e,multiaddrs:e.multiaddrs.filter((e=>{const[[t,n]]=e.stringTuples();if(53===t||54===t||55===t)return"localhost"!==n;if(4!==t&&6!==t)return!1;if(null==n)return!1;const r=Jd(n);return null==r||!r}))}}async function EE(e){return(await gt.digest(e)).digest}async function SE(e){return EE(e.toBytes())}function _E(e){return new en(`/dht/record/${Qt(e,"base32")}`,!1)}function IE(e,t){const n=new Date;return new cE(e,t,n).serialize()}class RE{log;components;validators;selectors;peerRouting;queryManager;network;constructor(e,t){const{validators:n,selectors:r,peerRouting:s,queryManager:i,network:o,logPrefix:a}=t;this.components=e,this.log=e.logger.forComponent(`${a}:content-fetching`),this.validators=n,this.selectors=r,this.peerRouting=s,this.queryManager=i,this.network=o}async getLocal(e){this.log("getLocal %b",e);const t=_E(e);this.log("fetching record for key %k",t);const n=await this.components.datastore.get(t);this.log("found %k in local datastore",t);const r=cE.deserialize(n);return await yE(this.validators,r),r}async*sendCorrectionRecord(e,t,n,r={}){this.log("sendCorrection for %b",e);const s=IE(e,n);for(const{value:i,from:o}of t){if(In(i,n)){this.log("record was ok");continue}if(this.components.peerId.equals(o)){try{const t=_E(e);this.log(`Storing corrected record for key ${t.toString()}`),await this.components.datastore.put(t,s.subarray())}catch(e){this.log.error("Failed error correcting self",e)}continue}let t=!1;const a={type:tE.PUT_VALUE,key:e,record:s};for await(const e of this.network.sendRequest(o,a,r))"PEER_RESPONSE"===e.name&&null!=e.record&&In(e.record.value,cE.deserialize(s).value)&&(t=!0),yield e;t||(yield dE({from:o,error:new fn("value not put correctly","ERR_PUT_VALUE_INVALID")},r)),this.log.error("Failed error correcting entry")}}async*put(e,t,n={}){this.log("put key %b value %b",e,t);const r=IE(e,t),s=_E(e);this.log(`storing record for key ${s.toString()}`),await this.components.datastore.put(s,r.subarray()),yield*gr(this.peerRouting.getClosestPeers(e,{signal:n.signal}),(t=>zr(t,(t=>async()=>{if("FINAL_PEER"!==t.name)return[t];const s=[],i={type:tE.PUT_VALUE,key:e,record:r};this.log("send put to %p",t.peer.id);for await(const e of this.network.sendRequest(t.peer.id,i,n))s.push(e),"PEER_RESPONSE"===e.name&&(null!=e.record&&In(e.record.value,cE.deserialize(r).value)||s.push(dE({from:t.peer.id,error:new fn("value not put correctly","ERR_PUT_VALUE_INVALID")},n)));return s}))),(e=>Bf(e,{ordered:!1,concurrency:Zv})),(async function*(e){for await(const t of e)yield*t}))}async*get(e,t={}){this.log("get %b",e);const n=[];for await(const r of this.getMany(e,t))"VALUE"===r.name&&n.push(r),yield r;if(0===n.length)return;const r=n.map((e=>e.value));let s=0;try{s=function(e,t,n){if(0===n.length)throw new fn("No records given","ERR_NO_RECORDS_RECEIVED");const r=Qt(t).split("/");if(r.length<3)throw new fn("Record key does not have a selector function","ERR_NO_SELECTOR_FUNCTION_FOR_RECORD_KEY");const s=e[r[1].toString()];if(null==s){const e=`No selector function configured for key type "${r[1]}"`;throw new fn(e,"ERR_UNRECOGNIZED_KEY_PREFIX")}return 1===n.length?0:s(t,n)}(this.selectors,e,r)}catch(e){if("ERR_NO_SELECTOR_FUNCTION_FOR_RECORD_KEY"!==e.code)throw e}const i=r[s];if(this.log("GetValue %b %b",e,i),null==i)throw new fn("best value was not found","ERR_NOT_FOUND");yield*this.sendCorrectionRecord(e,n,i,t),yield n[s]}async*getMany(e,t={}){this.log("getMany values for %b",e);try{const n=await this.getLocal(e);yield fE({value:n.value,from:this.components.peerId},t)}catch(t){this.log("error getting local value for %b",e,t)}const n=this;yield*this.queryManager.run(e,(async function*({peer:r,signal:s}){for await(const i of n.peerRouting.getValueOrPeers(r,e,{signal:s}))yield i,"PEER_RESPONSE"===i.name&&null!=i.record&&(yield fE({from:r,value:i.record.value},t))}),t)}}function AE(e){if(null==e.id)throw new Error("Invalid peer in message");return{id:Rs(e.id),multiaddrs:(e.multiaddrs??[]).map((e=>cr(e)))}}class TE{log;components;network;peerRouting;queryManager;routingTable;providers;constructor(e,t){const{network:n,peerRouting:r,queryManager:s,routingTable:i,providers:o,logPrefix:a}=t;this.components=e,this.log=e.logger.forComponent(`${a}:content-routing`),this.network=n,this.peerRouting=r,this.queryManager=s,this.routingTable=i,this.providers=o}async*provide(e,t,n={}){this.log("provide %s",e);const r=e.multihash.bytes;await this.providers.addProvider(e,this.components.peerId);const s={type:tE.ADD_PROVIDER,key:r,providers:[(i={id:this.components.peerId,multiaddrs:t},{id:i.id.toBytes(),multiaddrs:(i.multiaddrs??[]).map((e=>e.bytes)),connection:o})]};var i,o;let a=0;const c=t=>async()=>{if("FINAL_PEER"!==t.name)return[t];const r=[];this.log("putProvider %s to %p",e,t.peer.id);try{this.log("sending provider record for %s to %p",e,t.peer.id);for await(const i of this.network.sendMessage(t.peer.id,s,n))"PEER_RESPONSE"===i.name&&(this.log("sent provider record for %s to %p",e,t.peer.id),a++),r.push(i)}catch(e){this.log.error("error sending provide record to peer %p",t.peer.id,e),r.push(dE({from:t.peer.id,error:e},n))}return r};yield*gr(this.peerRouting.getClosestPeers(r,n),(e=>zr(e,(e=>c(e)))),(e=>Bf(e,{ordered:!1,concurrency:Zv})),(async function*(e){for await(const t of e)yield*t})),this.log("sent provider records to %d peers",a)}async*findProviders(e,t){const n=this.routingTable.kBucketSize;let r=0;const s=e.multihash.bytes,i=this;this.log("findProviders %c",e);const o=await this.providers.getProviders(e);if(o.length>0){const e=[];for(const t of o.slice(0,n))try{const n=await this.components.peerStore.get(t);e.push({id:t,multiaddrs:n.addresses.map((({multiaddr:e})=>e))})}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e;this.log("no peer store entry for %p",t)}if(yield uE({from:this.components.peerId,messageType:tE.GET_PROVIDERS,providers:e},t),yield pE({from:this.components.peerId,providers:e},t),r+=e.length,r>=n)return}const a=async function*({peer:e,signal:n}){const r={type:tE.GET_PROVIDERS,key:s};yield*i.network.sendRequest(e,r,{...t,signal:n})},c=new jh(o);for await(const i of this.queryManager.run(s,a,t))if(yield i,"PEER_RESPONSE"===i.name){this.log("Found %d provider entries for %c and %d closer peers",i.providers.length,e,i.closer.length);const s=[];for(const e of i.providers)c.has(e.id)||(c.add(e.id),s.push(e));if(s.length>0&&(yield pE({from:i.from,providers:s},t),r+=s.length,r>=n))return}}}class DE{movingAverage;variance;deviation;forecast;timespan;previousTime;constructor(e){this.timespan=e,this.movingAverage=0,this.variance=0,this.deviation=0,this.forecast=0}alpha(e,t){return 1-Math.exp(-(e-t)/this.timespan)}push(e,t=Date.now()){if(null!=this.previousTime){const n=this.alpha(t,this.previousTime),r=e-this.movingAverage,s=n*r;this.movingAverage=n*e+(1-n)*this.movingAverage,this.variance=(1-n)*(this.variance+r*s),this.deviation=Math.sqrt(this.variance),this.forecast=this.movingAverage+n*r}else this.movingAverage=e;this.previousTime=t}}class kE{success;failure;next;metric;timeoutMultiplier;failureMultiplier;minTimeout;constructor(e={}){this.success=new DE(e.interval??5e3),this.failure=new DE(e.interval??5e3),this.next=new DE(e.interval??5e3),this.failureMultiplier=e.failureMultiplier??2,this.timeoutMultiplier=e.timeoutMultiplier??1.2,this.minTimeout=e.minTimeout??2e3,null!=e.metricName&&(this.metric=e.metrics?.registerMetricGroup(e.metricName))}getTimeoutSignal(e={}){const t=Math.max(Math.round(this.next.movingAverage*(e.timeoutFactor??this.timeoutMultiplier)),this.minTimeout),n=AbortSignal.timeout(t),r=Ts([e.signal,n]);return r.start=Date.now(),r.timeout=t,r}cleanUp(e){const t=Date.now()-e.start;e.aborted?(this.failure.push(t),this.next.push(t*this.failureMultiplier),this.metric?.update({failureMovingAverage:this.failure.movingAverage,failureDeviation:this.failure.deviation,failureForecast:this.failure.forecast,failureVariance:this.failure.variance,failure:t})):(this.success.push(t),this.next.push(t),this.metric?.update({successMovingAverage:this.success.movingAverage,successDeviation:this.success.deviation,successForecast:this.success.forecast,successVariance:this.success.variance,success:t}))}}class PE extends wn{log;protocol;running;components;timeout;constructor(e,t){super();const{protocol:n}=t;this.components=e,this.log=e.logger.forComponent(`${t.logPrefix}:network`),this.running=!1,this.protocol=n,this.timeout=new kE({...t.timeout??{},metrics:e.metrics,metricName:`${t.logPrefix.replaceAll(":","_")}_network_message_send_times_milliseconds`})}async start(){this.running||(this.running=!0)}async stop(){this.running=!1}isStarted(){return this.running}async*sendRequest(e,t,n={}){if(!this.running)return;const r=t.type;if(null==r)throw new Gt("Message type was missing","ERR_INVALID_PARAMETERS");let s;this.log("sending %s to %p",t.type,e),yield gE({peer:e},n),yield lE({to:e,type:r},n);const i=this.timeout.getTimeoutSignal(n);n={...n,signal:i};try{const r=await this.components.connectionManager.openConnection(e,n);s=await r.newStream(this.protocol,n);const i=await this._writeReadMessage(s,t,n);s.close(n).catch((t=>{this.log.error("error closing stream to %p",e,t),s?.abort(t)})),yield uE({from:e,messageType:i.type,closer:i.closer.map(AE),providers:i.providers.map(AE),record:null==i.record?void 0:cE.deserialize(i.record)},n)}catch(r){s?.abort(r),this.log.error("could not send %s to %p",t.type,e,r),yield dE({from:e,error:r},n)}finally{this.timeout.cleanUp(i)}}async*sendMessage(e,t,n={}){if(!this.running)return;const r=t.type;if(null==r)throw new Gt("Message type was missing","ERR_INVALID_PARAMETERS");let s;this.log("sending %s to %p",t.type,e),yield gE({peer:e},n),yield lE({to:e,type:r},n);const i=this.timeout.getTimeoutSignal(n);n={...n,signal:i};try{const i=await this.components.connectionManager.openConnection(e,n);s=await i.newStream(this.protocol,n),await this._writeMessage(s,t,n),s.close(n).catch((t=>{this.log.error("error closing stream to %p",e,t),s?.abort(t)})),yield uE({from:e,messageType:r},n)}catch(t){s?.abort(t),yield dE({from:e,error:t},n)}finally{this.timeout.cleanUp(i)}}async _writeMessage(e,t,n){const r=Aw(e);await r.write(t,oE,n),await r.unwrap().close(n)}async _writeReadMessage(e,t,n){const r=Aw(e);await r.write(t,oE,n);const s=await r.read(oE,n);return await r.unwrap().close(n),s.closer.forEach((e=>{this.safeDispatchEvent("peer",{detail:AE(e)})})),s.providers.forEach((e=>{this.safeDispatchEvent("peer",{detail:AE(e)})})),s}}function CE(e,t){if(e.byteLength!==t.byteLength)throw new Error("Inputs should have the same length");for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return e[n]<t[n]?-1:1;return 0}class xE{originDhtKey;capacity;peerDistances;constructor(e,t){this.originDhtKey=e,this.capacity=t,this.peerDistances=[]}get length(){return this.peerDistances.length}get peers(){return this.peerDistances.map((e=>e.peer))}async add(e){const t=await SE(e.id);this.addWitKadId(e,t)}addWitKadId(e,t){if(null!=this.peerDistances.find((t=>t.peer.id.equals(e.id))))return;const n={peer:e,distance:wm(this.originDhtKey,t)};this.peerDistances.push(n),this.peerDistances.sort(((e,t)=>CE(e.distance,t.distance))),this.peerDistances=this.peerDistances.slice(0,this.capacity)}async isCloser(e){if(0===this.length)return!0;return-1===CE(wm(await SE(e),this.originDhtKey),this.peerDistances[this.peerDistances.length-1].distance)}async anyCloser(e){return 0!==e.length&&Promise.any(e.map((async e=>this.isCloser(e))))}}class NE{log;routingTable;network;validators;queryManager;peerStore;peerId;constructor(e,t){const{routingTable:n,network:r,validators:s,queryManager:i,logPrefix:o}=t;this.routingTable=n,this.network=r,this.validators=s,this.queryManager=i,this.peerStore=e.peerStore,this.peerId=e.peerId,this.log=e.logger.forComponent(`${o}:peer-routing`)}async findPeerLocal(e){let t;const n=await this.routingTable.find(e);if(null!=n){this.log("findPeerLocal found %p in routing table",e);try{t=await this.peerStore.get(n)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}}if(null==t)try{t=await this.peerStore.get(e)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}if(null!=t)return this.log("findPeerLocal found %p in peer store",e),{id:t.id,multiaddrs:t.addresses.map((e=>e.multiaddr))}}async*_getValueSingle(e,t,n={}){const r={type:tE.GET_VALUE,key:t};yield*this.network.sendRequest(e,r,n)}async*getPublicKeyFromNode(e,t={}){const n=function(e){return Rn([bE,e.toBytes()])}(e);for await(const r of this._getValueSingle(e,n,t))if(yield r,"PEER_RESPONSE"===r.name&&null!=r.record){const n=await As($l({bytes:r.record.value}));if(!n.equals(e))throw new fn("public key does not match id","ERR_PUBLIC_KEY_DOES_NOT_MATCH_ID");if(null==n.publicKey)throw new fn("public key missing","ERR_PUBLIC_KEY_MISSING");yield fE({from:e,value:n.publicKey},t)}throw new fn(`Node not responding with its public key: ${e.toString()}`,"ERR_INVALID_RECORD")}async*findPeer(e,t={}){if(this.log("findPeer %p",e),!1!==t.useCache){const n=await this.findPeerLocal(e);if(null!=n)return this.log("found local"),void(yield hE({from:this.peerId,peer:n},t))}let n=!1;if(!1!==t.useNetwork){const r=this,s=async function*({peer:n,signal:s}){const i={type:tE.FIND_NODE,key:e.toBytes()};for await(const o of r.network.sendRequest(n,i,{...t,signal:s}))if(yield o,"PEER_RESPONSE"===o.name){const n=o.closer.find((t=>t.id.equals(e)));null!=n&&(yield hE({from:o.from,peer:n},t))}};for await(const r of this.queryManager.run(e.toBytes(),s,t))"FINAL_PEER"===r.name&&(n=!0),yield r}n||(yield dE({from:this.peerId,error:new fn("Not found","ERR_NOT_FOUND")},t))}async*getClosestPeers(e,t={}){this.log("getClosestPeers to %b",e);const n=await EE(e),r=this.routingTable.closestPeers(n),s=this,i=new xE(n,this.routingTable.kBucketSize);await Promise.all(r.map((async e=>{await i.add({id:e,multiaddrs:[]})})));const o=async function*({peer:n,signal:r}){s.log("closerPeersSingle %s from %p",Qt(e,"base32"),n);const i={type:tE.FIND_NODE,key:e};yield*s.network.sendRequest(n,i,{...t,signal:r})};for await(const n of this.queryManager.run(e,o,t))"PEER_RESPONSE"===n.name&&await Promise.all(n.closer.map((async e=>{await i.add(e)}))),yield n;this.log("found %d peers close to %b",i.length,e);for(const e of i.peers)yield hE({from:this.peerId,peer:e},t)}async*getValueOrPeers(e,t,n={}){for await(const r of this._getValueSingle(e,t,n)){if("PEER_RESPONSE"===r.name&&null!=r.record)try{await this._verifyRecordOnline(r.record)}catch(e){const t="invalid record received, discarded";this.log(t),yield dE({from:r.from,error:new fn(t,"ERR_INVALID_RECORD")},n);continue}yield r}}async _verifyRecordOnline(e){if(null==e.timeReceived)throw new fn("invalid record received","ERR_INVALID_RECORD");await yE(this.validators,new cE(e.key,e.value,e.timeReceived))}async getCloserPeersOffline(e,t){const n=await EE(e),r=this.routingTable.closestPeers(n),s=[];for(const e of r)if(!e.equals(t))try{const t=await this.peerStore.get(e);s.push({id:e,multiaddrs:t.addresses.map((({multiaddr:e})=>e))})}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}return s.length>0?this.log("getCloserPeersOffline found %d peer(s) closer to %b than %p",s.length,e,t):this.log("getCloserPeersOffline could not find peer closer to %b than %p with %d peers in the routing table",e,t,this.routingTable.size),s}}class ME{log;datastore;cache;cleanupInterval;provideValidity;syncQueue;started;cleaner;constructor(e,t={}){const{cacheSize:n,cleanupInterval:r,provideValidity:s}=t;this.log=e.logger.forComponent("libp2p:kad-dht:providers"),this.datastore=e.datastore,this.cleanupInterval=r??Qv,this.provideValidity=s??864e5,this.cache=$p(n??256),this.syncQueue=new Nh({concurrency:1}),this.started=!1}isStarted(){return this.started}async start(){this.started||(this.started=!0,this.cleaner=setInterval((()=>{this._cleanup().catch((e=>{this.log.error(e)}))}),this.cleanupInterval))}async stop(){this.started=!1,null!=this.cleaner&&(clearInterval(this.cleaner),this.cleaner=void 0)}async _cleanup(){await this.syncQueue.add((async()=>{const e=Date.now();let t=0,n=0;const r=new Map,s=this.datastore.batch(),i=this.datastore.query({prefix:Yv});for await(const e of i)try{const{cid:i,peerId:o}=LE(e.key),a=BE(e.value).getTime(),c=Date.now(),l=c-a,u=l>this.provideValidity;if(this.log("comparing: %d - %d = %d > %d %s",c,a,l,this.provideValidity,u?"(expired)":""),u){n++,s.delete(e.key);const t=r.get(i)??new Set;t.add(o),r.set(i,t)}t++}catch(e){this.log.error(e.message)}r.size>0?(this.log("deleting %d / %d entries",n,t),await s.commit()):this.log("nothing to delete");for(const[e,t]of r){const n=OE(e),r=this.cache.get(n);if(null!=r){for(const e of t)r.delete(e);0===r.size?this.cache.remove(n):this.cache.set(n,r)}}this.log("Cleanup successful (%dms)",Date.now()-e)}))}async _getProvidersMap(e){const t=OE(e);let n=this.cache.get(t);return null==n&&(n=await async function(e,t){const n=new Map,r=e.query({prefix:OE(t)});for await(const e of r){const{peerId:t}=LE(e.key);n.set(t,BE(e.value))}return n}(this.datastore,e),this.cache.set(t,n)),n}async addProvider(e,t){await this.syncQueue.add((async()=>{this.log("%p provides %s",t,e);const n=await this._getProvidersMap(e);this.log("loaded %s provs",n.size);const r=new Date;n.set(t.toString(),r);const s=OE(e);this.cache.set(s,n),await async function(e,t,n,r){const s=[OE(t),"/",n.toString()].join(""),i=new en(s),o=C(r.getTime());await e.put(i,o)}(this.datastore,e,t,r)}))}async getProviders(e){return this.syncQueue.add((async()=>{this.log("get providers for %s",e);return[...(await this._getProvidersMap(e)).keys()].map((e=>Is(e)))}),{throwOnTimeout:!0})}}function OE(e){const t="string"==typeof e?e:Qt(e.multihash.bytes,"base32");return`${Yv}/${t}`}function LE(e){const t=e.toString().split("/");if(5!==t.length)throw new Error(`incorrectly formatted provider entry key in datastore: ${e.toString()}`);return{cid:t[3],peerId:t[4]}}function BE(e){return new Date(x(e))}class UE{disjointPaths;alpha;shutDownController;running;queries;logger;peerId;connectionManager;routingTable;initialQuerySelfHasRun;logPrefix;metrics;constructor(e,t){const{disjointPaths:n=Jv,alpha:r=Zv,logPrefix:s}=t;this.logPrefix=s,this.disjointPaths=n??Jv,this.running=!1,this.alpha=r??Zv,this.queries=0,this.initialQuerySelfHasRun=t.initialQuerySelfHasRun,this.routingTable=t.routingTable,this.logger=e.logger,this.peerId=e.peerId,this.connectionManager=e.connectionManager,null!=e.metrics&&(this.metrics={runningQueries:e.metrics.registerMetric(`${s.replaceAll(":","_")}_running_queries`),queryTime:e.metrics.registerMetric(`${s.replaceAll(":","_")}_query_time_seconds`)}),this.shutDownController=new AbortController,this.shutDownController.signal}isStarted(){return this.running}async start(){this.running=!0,this.shutDownController=new AbortController,this.shutDownController.signal}async stop(){this.running=!1,this.shutDownController.abort()}async*run(e,t,n={}){if(!this.running)throw new Error("QueryManager not started");const r=this.metrics?.queryTime.timer();if(null==n.signal){const e=AbortSignal.timeout(18e4);n={...n,signal:e}}const s=new AbortController,i=Ts([this.shutDownController.signal,s.signal,n.signal]);s.signal;const o=this.logger.forComponent(`${this.logPrefix}:query:`+Qt(e,"base58btc")),a=Date.now();let c=!1;try{!0!==n.isSelfQuery&&null!=this.initialQuerySelfHasRun&&(o("waiting for initial query-self query before continuing"),await Ar(this.initialQuerySelfHasRun.promise,i),this.initialQuerySelfHasRun=void 0),o("query:start"),this.queries++,this.metrics?.runningQueries.update(this.queries);const r=await EE(e),s=this.routingTable.closestPeers(r),a=s.slice(0,Math.min(this.disjointPaths,s.length));if(0===s.length)return void o.error("Running query with no peers");const l=new jh,u=a.map(((r,s)=>async function*(e){const{key:t,startingPeer:n,ourPeerId:r,signal:s,query:i,alpha:o,pathIndex:a,numPaths:c,queryFuncTimeout:l,log:u,peersSeen:h,connectionManager:d}=e,p=new vf({concurrency:o,sort:(e,t)=>CE(e.options.distance,t.options.distance)}),f=await EE(t);!function n(o,g){if(null==o)return;h.add(o);const m=wm(g,f);p.add((async()=>{const g=[s];null!=l&&g.push(AbortSignal.timeout(l));const y=Ts(g);try{for await(const e of i({key:t,peer:o,signal:y,pathIndex:a,numPaths:c})){if(y.aborted)return;if("PEER_RESPONSE"===e.name)for(const s of e.closer){if(h.has(s.id)){u("already seen %p in query",s.id);continue}if(r.equals(s.id)){u("not querying ourselves");continue}if(!await d.isDialable(s.multiaddrs)){u("not querying undialable peer");continue}const e=await SE(s.id);-1===CE(wm(e,f),m)?(u("querying closer peer %p",s.id),n(s.id,e)):u("skipping %p as they are not closer to %b than %p",s.id,t,o)}p.safeDispatchEvent("completed",{detail:e})}}catch(t){if(!s.aborted)return dE({from:o,error:t},e)}finally{y.clear()}}),{distance:m}).catch((e=>{u.error(e)}))}(n,await SE(n));try{for await(const e of p.toGenerator({signal:s}))null!=e&&(yield e)}catch(e){if(s.aborted)throw new fn("Query aborted","ERR_QUERY_ABORTED");throw e}}({key:e,startingPeer:r,ourPeerId:this.peerId,signal:i,query:t,pathIndex:s,numPaths:a.length,alpha:this.alpha,queryFuncTimeout:n.queryFuncTimeout,log:o,peersSeen:l,onProgress:n.onProgress,connectionManager:this.connectionManager})));for await(const e of fr(...u)){if("QUERY_ERROR"===e.name&&o.error("query error",e.error),"PEER_RESPONSE"===e.name)for(const t of[...e.closer,...e.providers])await this.connectionManager.isDialable(t.multiaddrs)&&await this.routingTable.add(t.id);yield e}c=!0}catch(e){if(this.running||"ERR_QUERY_ABORTED"!==e.code)throw e}finally{c||(o("query exited early"),s.abort()),i.clear(),this.queries--,this.metrics?.runningQueries.update(this.queries),null!=r&&r(),o("query:done in %dms",Date.now()-a)}}}function FE(e){if(null!=e[Symbol.asyncIterator])return(async()=>{let t=0;for await(const n of e)t++;return t})();{let t=0;for(const n of e)t++;return t}}class VE{log;peerId;peerRouting;routingTable;count;interval;initialInterval;queryTimeout;started;timeoutId;controller;initialQuerySelfHasRun;querySelfPromise;constructor(e,t){const{peerRouting:n,logPrefix:r,count:s,interval:i,queryTimeout:o,routingTable:a}=t;this.peerId=e.peerId,this.log=e.logger.forComponent(`${r}:query-self`),this.started=!1,this.peerRouting=n,this.routingTable=a,this.count=s??Jv,this.interval=i??3e5,this.initialInterval=t.initialInterval??1e3,this.queryTimeout=o??5e3,this.initialQuerySelfHasRun=t.initialQuerySelfHasRun}isStarted(){return this.started}start(){this.started||(this.started=!0,clearTimeout(this.timeoutId),this.timeoutId=setTimeout((()=>{this.querySelf().catch((e=>{this.log.error("error running self-query",e)}))}),this.initialInterval))}stop(){this.started=!1,null!=this.timeoutId&&clearTimeout(this.timeoutId),null!=this.controller&&this.controller.abort()}async querySelf(){if(this.started){if(null!=this.querySelfPromise)return this.log("joining existing self query"),this.querySelfPromise.promise;if(this.querySelfPromise=lr(),this.started){this.controller=new AbortController;const e=AbortSignal.timeout(this.queryTimeout),t=Ts([this.controller.signal,e]);this.controller.signal;try{0===this.routingTable.size&&(this.log("routing table was empty, waiting for some peers before running query"),await mw(this.routingTable,"peer:add",{signal:t})),this.log("run self-query, look for %d peers timing out after %dms",this.count,this.queryTimeout);const e=Date.now(),n=await gr(this.peerRouting.getClosestPeers(this.peerId.toBytes(),{signal:t,isSelfQuery:!0}),(e=>Ud(e,this.count)),(async e=>FE(e)));this.log("self-query found %d peers in %dms",n,Date.now()-e)}catch(e){this.log.error("self-query error",e)}finally{t.clear(),null!=this.initialQuerySelfHasRun&&(this.initialQuerySelfHasRun.resolve(),this.initialQuerySelfHasRun=void 0)}}this.querySelfPromise.resolve(),this.querySelfPromise=void 0,this.started&&(this.timeoutId=setTimeout((()=>{this.querySelf().catch((e=>{this.log.error("error running self-query",e)}))}),this.interval))}else this.log("skip self-query because we are not started")}}function KE(e,t){if(!(t instanceof Uint8Array))throw new TypeError(e+" is not a Uint8Array");if(32!==t.byteLength)throw new TypeError(e+" had incorrect length")}function $E(e){return Array.isArray(e?.peers)}class qE extends wn{root;localPeer;prefixLength;splitThreshold;kBucketSize;numberOfNodesToPing;constructor(e){super(),this.localPeer=e.localPeer,this.prefixLength=e.prefixLength,this.kBucketSize=e.kBucketSize??HE,this.splitThreshold=e.splitThreshold??this.kBucketSize,this.numberOfNodesToPing=e.numberOfNodesToPing??3,KE("options.localPeer.kadId",e.localPeer.kadId),this.root={prefix:"",depth:0,peers:[]}}add(e){KE("peer.kadId",e?.kadId);const t=this._determineBucket(e.kadId);if(!(this._indexOf(t,e.kadId)>-1))return t.peers.length===this.splitThreshold&&t.depth<this.prefixLength?(this._split(t),void this.add(e)):t.peers.length<this.kBucketSize?(t.peers.push(e),void this.safeDispatchEvent("added",{detail:e})):void this.safeDispatchEvent("ping",{detail:{oldContacts:t.peers.slice(0,this.numberOfNodesToPing),newContact:e}})}*closest(e,t=this.kBucketSize){const n=new xE(e,t);for(const e of this.toIterable())n.addWitKadId({id:e.peerId,multiaddrs:[]},e.kadId);yield*zr(n.peers,(e=>e.id))}count(){return function e(t){if($E(t))return t.peers.length;let n=0;return null!=t.left&&(n+=e(t.left)),null!=t.right&&(n+=e(t.right)),n}(this.root)}get(e){const t=this._determineBucket(e),n=this._indexOf(t,e);return t.peers[n]}remove(e){const t=this._determineBucket(e),n=this._indexOf(t,e);if(n>-1){const e=t.peers.splice(n,1)[0];this.safeDispatchEvent("removed",{detail:e})}}*toIterable(){yield*function*e(t){$E(t)?yield*t.peers:(yield*e(t.left),yield*e(t.right))}(this.root)}distance(e,t){return BigInt("0x"+Qt(wm(e,t),"base16"))}_determineBucket(e){const t=Qt(e,"base2").substring(0,this.prefixLength);return function e(n,r=0){return $E(n)?n:e("0"===t[r]?n.left:n.right,r+1)}(this.root)}_indexOf(e,t){return e.peers.findIndex((e=>function(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let n=0,r=e.length;n<r;++n)if(e[n]!==t[n])return!1;return!0}(e.kadId,t)))}_split(e){const t=e.depth+1,n={prefix:"0",depth:t,peers:[]},r={prefix:"1",depth:t,peers:[]};for(const s of e.peers){"0"===Qt(s.kadId,"base2")[t]?n.peers.push(s):r.peers.push(s)}delete e.peers,e.left=n,e.right=r}}const HE=20;class zE extends wn{kBucketSize;kb;pingQueue;log;components;prefixLength;splitThreshold;pingTimeout;pingConcurrency;running;protocol;tagName;tagValue;metrics;constructor(e,t){super(),this.components=e,this.log=e.logger.forComponent(`${t.logPrefix}:routing-table`),this.kBucketSize=t.kBucketSize??HE,this.pingTimeout=t.pingTimeout??1e4,this.pingConcurrency=t.pingConcurrency??10,this.running=!1,this.protocol=t.protocol,this.tagName=t.tagName??"kad-close",this.tagValue=t.tagValue??50,this.prefixLength=t.prefixLength??32,this.splitThreshold=t.splitThreshold??HE,this.pingQueue=new Ef({concurrency:this.pingConcurrency,metricName:`${t.logPrefix.replaceAll(":","_")}_ping_queue`,metrics:this.components.metrics}),this.pingQueue.addEventListener("error",(e=>{this.log.error("error pinging peer",e.detail)})),null!=this.components.metrics&&(this.metrics={routingTableSize:this.components.metrics.registerMetric(`${t.logPrefix.replaceAll(":","_")}_routing_table_size`),routingTableKadBucketTotal:this.components.metrics.registerMetric(`${t.logPrefix.replaceAll(":","_")}_routing_table_kad_bucket_total`),routingTableKadBucketAverageOccupancy:this.components.metrics.registerMetric(`${t.logPrefix.replaceAll(":","_")}_routing_table_kad_bucket_average_occupancy`),routingTableKadBucketMaxDepth:this.components.metrics.registerMetric(`${t.logPrefix.replaceAll(":","_")}_routing_table_kad_bucket_max_depth`)})}isStarted(){return this.running}async start(){this.running=!0;const e=new qE({localPeer:{kadId:await SE(this.components.peerId),peerId:this.components.peerId},kBucketSize:this.kBucketSize,prefixLength:this.prefixLength,splitThreshold:this.splitThreshold,numberOfNodesToPing:1});this.kb=e,e.addEventListener("ping",(e=>{this._onPing(e).catch((e=>{this.log.error("could not process k-bucket ping event",e)}))}));let t=0;for(const e of await this.components.peerStore.all())if(e.protocols.includes(this.protocol)){const n=await SE(e.id);this.kb.add({kadId:n,peerId:e.id}),t++}this.log("added %d peer store peers to the routing table",t),this._tagPeers(e)}async stop(){this.running=!1,this.pingQueue.clear(),this.kb=void 0}_tagPeers(e){let t=new jh;const n=function(e,t=100){let n;return()=>{clearTimeout(n),n=setTimeout((()=>{e()}),t)}}((()=>{const n=new jh(e.closest(e.localPeer.kadId,HE)),r=n.difference(t),s=t.difference(n);Promise.resolve().then((async()=>{for(const e of r)await this.components.peerStore.merge(e,{tags:{[this.tagName]:{value:this.tagValue}}});for(const e of s)await this.components.peerStore.merge(e,{tags:{[this.tagName]:void 0}})})).catch((e=>{this.log.error("Could not update peer tags",e)})),t=n}));e.addEventListener("added",(e=>{n(),this.safeDispatchEvent("peer:add",{detail:e.detail.peerId})})),e.addEventListener("removed",(e=>{n(),this.safeDispatchEvent("peer:remove",{detail:e.detail.peerId})}))}async _onPing(e){if(!this.running)return;const{oldContacts:t,newContact:n}=e.detail,r=(await Promise.all(t.map((async e=>{const t=this.pingQueue.find(e.peerId);return null!=t?t.join():this.pingQueue.add((async()=>{let t;try{const n={signal:AbortSignal.timeout(this.pingTimeout)};this.log("pinging old contact %p",e.peerId);const r=await this.components.connectionManager.openConnection(e.peerId,n);t=await r.newStream(this.protocol,n);const s=Aw(t);await s.write({type:tE.PING},oE,n);const i=await s.read(oE,n);if(await s.unwrap().close(),i.type!==tE.PING)throw new fn(`Incorrect message type received, expected PING got ${i.type}`,"ERR_BAD_PING_RESPONSE");return!0}catch(n){return this.running&&null!=this.kb&&(this.log.error("could not ping peer %p",e.peerId,n),this.log("evicting old contact after ping failed %p",e.peerId),this.kb.remove(e.kadId)),t?.abort(n),!1}finally{this.metrics?.routingTableSize.update(this.size)}}),{peerId:e.peerId})})))).filter((e=>e)).length;this.running&&r<t.length&&null!=this.kb&&(this.log("adding new contact %p",n.peerId),this.kb.add(n))}get size(){return null==this.kb?0:this.kb.count()}async find(e){const t=await SE(e);return this.kb?.get(t)?.peerId}closestPeer(e){const t=this.closestPeers(e,1);if(t.length>0)return t[0]}closestPeers(e,t=this.kBucketSize){return null==this.kb?[]:[...this.kb.closest(e,t)]}async add(e){if(null==this.kb)throw new Error("RoutingTable is not started");const t=await SE(e);this.kb.add({kadId:t,peerId:e}),this.log("added %p with kad id %b",e,t),this.updateMetrics()}async remove(e){if(null==this.kb)throw new Error("RoutingTable is not started");const t=await SE(e);this.kb.remove(t),this.updateMetrics()}updateMetrics(){if(null==this.metrics||null==this.kb)return;let e=0,t=0,n=0;!function r(s){if($E(s))return s.depth>n&&(n=s.depth),t++,void(e+=s.peers.length);r(s.left),r(s.right)}(this.kb.root),this.metrics.routingTableSize.update(e),this.metrics.routingTableKadBucketTotal.update(t),this.metrics.routingTableKadBucketAverageOccupancy.update(Math.round(e/t)),this.metrics.routingTableKadBucketMaxDepth.update(n)}}var WE=[77591,22417,43971,28421,740,29829,71467,228973,196661,78537,27689,36431,44415,14362,19456,106025,96308,2882,49509,21149,87173,131409,75844,23676,121838,30291,17492,2953,7564,110620,129477,127283,53113,72417,165166,109690,21200,102125,24049,71504,90342,25307,72039,26812,26715,32264,133800,71161,88956,171987,51779,24425,16671,30251,186294,247761,14202,2121,8465,35024,4876,85917,169730,3638,256836,96184,943,18678,6583,52907,35807,112254,214097,18796,11595,9243,23554,887,268203,382004,24590,111335,11625,16619,29039,102425,69006,97976,92362,32552,63717,41433,128974,137630,59943,10019,13986,35430,33665,108037,43799,43280,38195,29078,58629,18265,14425,46832,235538,40830,77881,110717,58937,3463,325358,51300,47623,117252,19007,10170,20540,91237,294813,4951,79841,56232,36270,128547,69209,66275,100156,32063,73531,34439,80937,28892,44466,88595,216307,32583,49620,16605,82127,45807,21630,78726,20235,40163,111007,96926,5567,72083,21665,58844,39419,179767,48328,42662,51550,5251,37811,49608,81056,50854,55513,20922,18891,197409,164656,32593,71449,220474,58919,85682,67854,13758,35066,3565,61905,214793,119572,141419,21504,10302,27354,67003,46131,32668,15165,64871,34450,17821,2757,11452,34189,5160,12257,85523,560,53385,65887,119549,135620,312353,115979,122356,10867,193231,124537,54783,90675,120791,4715,142253,50943,17271,43358,25331,4917,120566,34580,12878,33786,160528,32523,4869,301307,104817,81491,23276,8832,97911,31265,52065,7998,49622,9715,43998,34091,84587,20664,69041,29419,53205,10838,58288,116145,6185,5154,141795,35924,21307,144738,43730,12085,8279,10002,119,133779,199668,72938,31768,39176,67875,38453,9700,44144,4121,116048,41733,12868,82669,92308,128,34262,11332,7712,90764,36141,13553,71312,77470,117314,96549,49135,23602,54468,28605,6327,62308,17171,67531,21319,14105,894,107722,46157,8503,51069,100472,45138,15246,14577,35609,191464,1757,13364,161349,32067,91705,81144,52339,5408,91066,21983,14157,100545,4372,26630,129112,1423,29676,213626,4397,88436,99190,6877,49958,26122,114348,60661,29818,293118,50042,179738,16400,163423,89627,31040,43973,36638,45952,5153,1894,109322,1898,134021,12402,112077,68309,190269,69866,31938,107383,11522,105232,11248,14868,39852,71707,186525,16530,38162,106212,11700,5130,16608,26998,59586,108399,230033,43683,48135,82179,2073,5015,196684,189293,16378,23452,8301,35640,11632,214551,29240,57644,33137,91949,55157,52384,117313,5090,17717,89668,49363,82238,241035,66216,29066,184088,97206,62820,26595,4241,135635,173672,8202,459,71355,146294,29587,3008,135385,141203,14803,6634,45094,69362,50925,546,51884,62011,83296,234584,44515,56050,89476,87751,19373,12691,149923,19794,13833,35846,87557,58339,2884,19145,25647,12224,11024,77338,64608,122297,53025,7205,36189,36294,170779,21750,7739,173883,75192,35664,224240,113121,30181,26267,27036,117827,92015,106516,55628,203549,67949,60462,60844,35911,20457,1820,920,19773,8738,73173,181993,38521,98254,76257,46008,92796,5384,26868,151566,22124,2411,15919,186872,180021,28099,152961,78811,80237,62352,102653,74259,184890,16792,123702,224945,29940,19512,75283,14059,112691,92811,233329,20411,138569,53341,109802,50600,134528,66747,5529,166531,31578,64732,67189,1596,126357,967,167999,206598,109752,119431,207825,78791,91938,10301,27311,24233,252343,28831,32812,66002,112267,90895,8786,8095,16824,22866,21813,60507,174833,19549,130985,117051,52110,6938,81923,123864,38061,919,18680,53534,46739,112893,161529,85429,26761,11900,81121,91968,15390,217947,56524,1713,6654,37089,85630,138866,61850,16491,75577,16884,98296,73523,6140,44645,6062,36366,29844,57946,37932,42472,5266,20834,19309,33753,127182,134259,35810,41805,45878,312001,14881,47757,49251,120050,44252,3708,25856,107864,120347,1228,36550,41682,34496,47025,8393,173365,246526,12894,161607,35670,90785,126572,2095,124731,157033,58694,554,12786,9642,4817,16136,47864,174698,66992,4639,69284,10625,40710,27763,51738,30404,264105,137904,109882,52487,42824,57514,2740,10479,146799,107390,16586,88038,174951,9410,16185,44158,5568,40658,46108,12763,97385,26175,108859,664,230732,67470,46663,14395,50750,141320,93140,15361,47997,55784,6791,307840,118569,107326,18056,58281,260415,54691,8790,73332,45633,7511,45674,143373,14031,11799,94491,35646,96544,14560,26049,32983,25791,83814,42094,231370,63955,139212,2359,169908,3108,183486,105867,28197,32941,124968,26402,88267,149768,23053,3078,19091,52924,25383,19209,111548,97361,3959,24880,235061,9099,24921,161254,151405,20508,7159,34381,20133,11434,74036,19974,34769,36585,1076,22454,17354,38727,235160,111547,96454,117448,156940,91330,37299,7310,26915,117060,51369,22620,61861,322264,106850,111694,15091,2624,40345,300446,177064,1707,27389,54792,327783,132669,183543,59003,17744,20603,151134,106923,53084,71803,279424,319816,11579,21946,16728,38274,72711,5085,83391,88646,40159,25027,34680,10752,12988,54126,30365,18338,100445,230674,44874,84974,143877,123253,139372,28082,91477,144002,13096,219729,46016,50029,42377,14601,6660,58244,58978,23918,88206,113611,64452,17541,41032,10942,12021,49189,10978,40175,37156,10947,71709,106894,112538,57007,137486,150608,152719,40615,7746,279716,13101,19524,28708,40578,72320,1096,182051,94527,51275,22833,45164,81917,77519,48508,5421,140302,37845,149830,5587,27579,5357,428725,248187,6326,206760,39814,32585,89923,44341,288753,284443,96368,31201,94189,119504,20359,52073,103216,179,27934,32801,96035,34111,34309,101326,18198,20704,210266,37643,27880,141873,106e3,19414,56614,167714,66483,107885,86602,4379,20796,75467,4987,5017,118857,26003,34308,114428,29198,6686,29697,73632,3739,69795,16798,41504,7207,30722,21436,36735,28067,28545,3239,11221,36031,41889,100010,19247,317673,29495,174554,6424,129725,53845,94986,7955,59676,2604,191497,19735,102214,62954,23844,11872,179525,261436,34492,428,78404,142035,16747,17246,27578,37021,33672,57944,26056,135760,2369,61674,122066,31327,19374,157065,40553,130982,69619,71290,38855,72100,92903,95940,51422,165999,65713,57873,50726,7288,20272,2081,42326,22624,81120,57914,79352,19447,1684,72302,11774,302559,161481,96396,13692,414988,3721,79066,56627,46883,21150,11747,12184,5856,113458,176117,84416,52079,27933,3354,59765,141359,2212,216309,2555,23458,196722,142463,45701,44548,28798,19418,215,29916,9396,10574,114226,84475,13520,18694,34056,4524,90302,62930,13539,19407,77209,7728,38088,9535,2263,23875,183945,17750,26274,67172,10585,28042,22199,7478,51331,66030,26774,192929,31434,25850,50197,52926,178158,4679,181256,70184,229600,9959,105594,72158,73974,2726,35085,78087,23284,35568,51713,155676,5401,27254,11966,17569,223253,71993,103357,111477,55722,30504,26034,46774,35392,36285,214814,41143,163465,1051,16094,81044,6636,76489,179102,20712,39178,35683,125177,54219,30617,52994,25324,50123,2543,87529,58995,10688,125199,12388,60158,125481,131646,7642,133350,65874,3438,97277,101450,10075,56344,116821,50778,60547,98016,106135,13859,14255,16300,77373,173521,8285,45932,37426,4054,114295,55947,7703,39114,52,51119,128135,19714,60715,9554,50492,88180,2823,118271,52993,122625,97919,23859,37895,25040,33614,32102,20431,3577,9275,15686,43031,157741,110358,1884,40291,125391,13736,5008,64881,87336,77381,70711,43032,49155,118587,70494,4318,10168,30126,12580,10524,280104,104001,145413,2862,84140,6603,106005,13566,12780,11251,42830,571,179910,82443,13146,469,42714,32591,265217,424024,92553,54721,134100,6007,15242,114681,59030,16718,85465,200214,85982,55174,165013,23493,56964,82529,109150,32706,27568,82442,5350,14976,13165,44890,60021,21343,33978,17264,4655,22328,27819,75730,16567,55483,14510,17926,45827,150609,3704,7385,272531,161543,76904,122163,52405,2039,19165,41623,14423,228354,3369,176360,85491,7122,35789,303724,4465,13628,2233,55311,118771,20713,10006,221519,45115,71021,35650,29775,7337,10864,20665,21142,1746,15080,1624,32449,10905,105743,229797,7701,3940,22997,178467,57208,389057,39683,59403,63344,63125,54847,69691,18336,56448,3362,37202,18282,29648,138224,35867,10495,5911,28814,26653,31514,176702,26550,45621,11734,4525,40543,73944,121080,27858,155561,14887,44670,30742,8796,107455,113472,56369,75581,183777,240095,133699,153299,8768,160464,26058,49078,103971,21875,71486,44888,17156,9678,89541,123019,102337,3972,83930,21245,87852,109660,287918,183019,686,10100,39177,283941,11274,24736,26793,26214,25995,77011,141580,4070,23742,46285,46632,30700,26669,19056,35951,115575,174034,56097,35463,87425,24575,44245,38701,82317,85922,281616,100333,147697,61503,7730,84330,8530,59917,61597,17173,9092,32658,90288,193136,39023,20381,56654,31132,7779,1919,1375,117128,30819,11169,40938,23935,115201,101155,151034,4835,11231,74550,89388,59951,91704,107312,167882,115062,12732,72738,88703,464019,158267,57995,60496,737,14371,123867,4174,243339,159946,7568,16025,134556,110916,38103,191,80226,88794,29688,27230,10454,76308,57647,77409,113483,66864,14745,19808,12023,46583,84805,16015,17102,2231,20611,3547,95740,250131,34559,108894,8498,15853,159169,148920,20942,2813,93160,45188,210613,45531,52587,149062,39782,28194,57849,60965,84954,89766,84453,100927,16501,27658,165311,103841,54192,207341,19558,20084,319622,5672,205467,98462,61849,36279,13609,147177,24726,165015,209489,59591,31157,6551,117580,75060,141146,277310,21072,22023,106474,63041,137443,122965,68371,5383,42146,98961,113467,30863,23794,4843,99630,30392,82679,13699,241612,33601,93146,24319,18643,32155,95669,40440,15333,34089,67799,142144,58245,38633,114531,117400,77861,188726,5507,2568,8853,10987,107222,2663,2421,11530,13345,30075,41785,118661,104786,17459,12490,16281,71936,193555,17431,5944,71758,26485,77317,20803,367167,158,7362,93430,11735,172445,46002,11532,54482,930,62911,2235,23004,179236,4764,101859,208113,22477,55163,95579,14098,67320,162556,90709,156949,3826,57492,4025,34092,87442,104565,6718,186015,28214,14209,10039,107186,233912,58877,81637,55265,39828,6194,145813,50831,105849,4974,88319,122296,10272,197216,95714,51540,72418,23324,91555,8743,140452,250249,51666,34124,7229,38592,129641,78169,174242,22464,149964,51450,14034,10026,95376,26190,120062,14401,8700,265,31386,143573,7203,229889,61567,4227,140981,2466,72052,10787,10062,30958,6099,38471,30103,23202,208101,70847,467,58934,32271,32984,36637,24107,30771,17109,73353,13650,2098,157040,67366,66904,106018,265380,107238,18535,44025,32681,144983,62505,91295,56120,3082,77508,10322,63023,36700,81885,224127,16721,45023,239261,111272,13852,7866,149243,204199,32309,22084,42029,38316,126644,104973,14406,43454,67322,61310,15789,40285,24026,181047,6301,70927,23319,115823,27248,66693,115875,278566,63007,146844,56841,59007,87368,180001,22370,42114,80605,12022,10374,308,25079,14689,12618,63368,7936,264973,212291,136713,95999,105801,18965,32075,48700,52230,35119,96912,32992,8586,16606,101333,101812,14969,39930,759,193090,27387,42914,12937,5058,62646,64528,38624,25743,37502,3716,4435,30352,178687,26461,132611,42002,138442,35833,59582,16345,8048,60319,49349,309,47800,49739,90482,26405,34470,63786,32479,85028,39866,47846,11649,23934,29466,2816,42864,31828,7410,74885,49632,47629,111801,90749,19536,18767,105764,59606,21223,10746,76298,22220,39408,7190,79654,64856,11602,82156,272765,17079,70089,245473,51813,184407,384678,1576,122249,5064,27481,6188,25790,74361,27541,318284,45430,31488,620,93579,45723,192118,22670,51913,4162,70244,35966,26397,16199,50899,209613,121702,287507,2993,36101,132229,67345,33062,76295,118628,78705,52316,34375,107083,107454,44863,127561,33964,3073,154010,190914,55967,39074,6272,31047,5550,41123,26154,98638,47110,19998,148091,50229,31329,59900,195442,19106,61347,73497,70015,682,45850,25776,38022,148951,6288,37411,232526,109277,27286,32342,9262,5220,16651,23175,46740,129438,78614,121925,66914,88710,127952,5563,21500,34521,10739,14863,191006,62956,17359,16749,67027,56284,69134,43301,35039,58883,54466,60823,404451,75743,59856,86979,7923,34273,83785,32142,7693,268986,197428,282681,17049,22346,22990,92245,107180,3357,37104,96724,49153,7683,31197,43267,82231,164276,23696,20848,188364,22309,24821,158707,1018,22514,70922,27792,45589,59709,10765,736,35218,63479,51987,24275,63588,55361,92929,81964,4658,20122,12330,44058,13065,311456,72224,8337,211229,38979,22590,138478,52757,32595,133600,8838,31549,94412,43391,90056,1585,94802,127271,6223,31889,137038,132910,2165,57616,230152,6080,10748,36737,74579,134062,50525,180532,119270,34556,76155,82394,52595,29258,31435,87820,67996,26943,183878,38007,2410,13526,180297,69856,3503,187396,167700,7838,16701,9199,56267,3661,37407,65994,23767,5708,62508,221700,67088,86978,46776,84434,32088,5612,9149,88244,21685,95151,46750,189612,2979,506311,2594,3628,40074,105039,78243,28523,6651,38058,71999,30992,12764,68261,108991,6165,26450,61961,13400,22426,7490,60890,109623,2070,12958,50355,67979,257096,7213,42578,52121,35716,65461,7516,124758,39268,302,64712,14977,1467,219452,2840,34229,11121,21602,19270,63574,8024,1532,17331,79839,78885,52029,180767,57957,6069,91265,61380,55767,8927,32881,287603,22149,35029,68876,6428,199567,46926,13412,104132,21434,366616,45060,110046,81924,128910,45886,52821,130416,29416,77342,21762,67329,121432,79924,11724,38625,81006,102033,28338,13326,3250,82056,82526,38212,21112,12382,111495,3263,7414,86274,93490,40844,30224,45212,24019,48411,71367,24941,76729,57776,3769,38114,202019,197745,31953,237533,33270,201580,255648,100798,44741,32241,98468,106931,10085,15090,170358,33154,66787,18819,69760,25061,234005,82660,6295,131975,16874,9076,4094,25005,17740,40908,19533,220019,44330,99792,50040,19619,13950,55228,24423,31253,95308,103177,184795,28590,82285,5059,3210,75525,49894,70007,56178,10580,36051,139681,21617,98736,3555,106306,164189,37352,63915,47824,24883,145530,61904,28444,11483,19837,145446,30420,112972,85939,11835,191233,2262,20705,58630,1753,148334,1197,144714,6887,11223,107667,60879,77914,4151,57417,81594,96681,169430,1784,20444,95138,254041,27038,596,7117,72808,13759,3353,126776,21074,55322,27081,36942,39547,139830,179275,4453,713,8722,71399,19204,25785,22794,23923,104114,11291,25458,102309,88396,75288,230440,206396,104551,58447,130857,37247,94734,31548,176529,226077,65159,20104,10096,66881,94191,237909,27109,37404,1520,27421,25220,113003,23423,24884,50585,6286,231877,150800,11789,3226,90004,60642,5053,202400,61442,132531,175329,57138,30116,103847,9973,75367,16452,32360,59119,21246,10191,164804,23305,61051,37348,154530,13214,5468,50403,66754,130976,50559,80515,14436,155492,84017,5472,43107,41240,2890,90431,70188,382,76234,48040,50211,281038,237007,32115,142178,1536,22761,96429,1811,31243,1679,49143,55209,17402,235054,61494,7462,77030,34925,87609,78002,9499,9027,73289,201078,101379,63544,27666,5469,10642,30029,49816,132979,95620,58086,351930,116300,2110,2043,30845,6154,11279,16727,4122,2277,27281,4971,3650,39060,61970,65951,39674,75686,38151,11370,130809,177895,32665,63725,122267,7857,39618,118483,44792,157755,178624,136994,24260,41308,22471,12404,21707,12486,30473,52781,50246,20247,39065,909,56825,103158,128603,31542,1089,41935,32744,12428,37963,84420,33134,72921,208449,42622,168151,127335,147107,46699,38216,12591,94342,85814,31423,24944,2605,87542,67473,192551,4496,56321,91819,17630,6300,256183,114569,202090,33209,35289,34897,24967,40520,43470,5344,10199,34810,14283,10381,10017,62923,49924,23233,64539,13051,35686,19698,11570,135555,120868,44924,87065,52318,52335,47586,140906,245885,109834,78668,9065,46990,25258,72022,61243,40838,4545,146387,10537,11557,17470,36930,68104,46711,24264,79401,81043,18225,120488,24746,84338,81652,28266,13776,21878,46973,1047,230465,73357,95777,24973,210160,62210,58404,110633,169651,6937,41870,9909,26822,191062,76553,27519,96256,239070,2478,205678,67955,58532,20601,50120,19148,78501,195724,110740,8249,109665,27446,30568,57631,31425,49752,32820,65504,50079,3663,102256,219898,23849,211315,14645,4359,91767,9528,12449,49366,7941,49763,107848,8930,27086,50686,9744,10447,81935,39513,46514,1670,29229,6172,22312,137280,97759,9806,14445,22976,56458,73391,34983,93760,174219,52573,33149,59747,2429,136277,75123,165263,91040,7446,57632,48633,97140,246081,84766,151684,79918,93268,120346,54059,54875,77858,32996,103590,45276,11968,19600,25849,17159,132907,42828,16817,4913,99462,103303,27395,5737,74184,20749,21160,14377,77062,131403,158735,10999,27799,77785,9320,34366,51593,61070,33746,47048,29268,36675,30262,53297,9832,82e3,20188,122292,39917,7331,18160,68301,185935,134830,15031,4935,10004,165845,185534,46923,30109,44134,122631,18874,22903,112790,26561,18549,348902,82871,140345,255565,135390,63556,103747,145055,179600,145662,296111,61661,211987,23952,52342,126343,48450,32919,44277,82185,9591,62139,205363,376969,394874,108461,18040,120885,14798,39863,16571,16794,58271,81025,55206,14640,118656,6361,44092,85970,6262,153863,108244,180200,72264,79947,38044,10050,5735,61221,80712,5471,115689,11391,11661,184257,20010,60116,30320,19327,134598,45455,27542,18004,125092,452272,1549,91523,46567,180063,156026,2608,11174,58848,37788,65907,80194,30490,5786,40775,119519,106241,11323,156297,8425,61495,2617,29675,2425,59886,112582,49142,59618,4863,50597,86710,50650,168632,27693,85641,83643,18993,25768,84284,28090,93592,36627,312804,43381,9887,9402,100931,97165,3311,173330,66805,28935,4963,184460,3201,78102,19126,21607,37496,24938,22615,16153,32862,134792,153318,61120,6067,2812,12826,12792,23825,37559,64662,202250,102694,155488,85881,149193,46233,65383,15521,106982,11358,176786,25752,39717,34208,24510,32464,77742,39371,72028,138229,60688,71386,102834,132477,2208,11548,63670,271279,28351,30338,38620,32491,99845,143885,152266,13252,2825,178663,108097,1775,78201,14897,113573,163346,62292,171129,22183,96598,38733,64971,166776,117445,9968,146393,44677,74867,20908,97328,12761,25656,26785,9148,112344,26115,99176,110121,22437,49547,6180,79320,5835,31392,43328,33377,75870,119860,69497,80273,7325,155219,43167,111173,28347,20222,3763,71752,55041,47252,14618,28088,15012,97805,194698,54636,2036,41349,6173,96604,61530,51859,43782,13361,24334,22668,24792,7070,23441,16789,3209,36211,208475,26242,32880,122181,182407,21444,31060,88459,29929,77907,12716,10934,97005,20599,31690,8403,58445,30303,22700,10336,86731,103115,337709,72556,46788,112566,47684,67089,53548,36874,56487,41387,125985,26893,40071,106683,73712,18787,40105,72992,67246,137276,50802,36790,70328,138827,22466,39263,183295,29858,50975,9322,57397,10654,24364,30383,55799,41600,23584,127295,296610,129078,143558,244131,86397,36049,1085,80677,3820,108139,5476,34767,24683,7758,13060,7239,131671,250593,59556,103392,29810,4188,252323,39404,116877,7651,43600,40338,13554,157253,39196,25978,144387,61211,234,50104,6129,10449,93777,9240,356378,274148,4439,72970,3724,147770,78680,62570,115877,40027,40547,36817,224392,64609,34795,165027,67440,2477,37206,23431,50754,164797,46018,94995,170982,27051,7957,22767,3674,27900,56419,18930,60701,41302,2692,84749,339721,61996,111094,80221,50129,1045,8153,62945,19202,8250,37208,37418,32560,79477,41106,88569,33963,36693,5892,30570,1581,66471,49647,11922,160717,29442,5643,114865,82962,95982,132098,22633,22838,94726,54556,28566,205039,162340,33216,16849,35847,221339,94851,26533,71469,1805,3804,12935,45483,71020,36310,65381,192960,34240,35165,59773,1248,46954,155332,96864,4246,388800,16129,57133,74592,44807,442014,38203,42574,80818,91592,26377,36424,65760,977,77387,22628,147610,28018,30561,98454,6969,119628,63648,18170,36854,26601,64018,22027,37279,51395,152934,21153,9430,58760,194742,5330,55115,34158,28917,174111,13171,122326,1526,43896,66094,25325,4234,148354,11450,275,18999,112191,44365,22723,68409,8733,57746,96565,75007,14196,108844,29475,88599,177563,100792,106156,86323,93726,14248,135341,194131,40126,47099,14779,8272,39597,95983,171398,65882,28052,10393,47213,40689,22120,72212,106829,34964,109146,753,648,21660,30047,17527,181025,5619,145357,4085,216883,9359,186951,24779,53931,24545,36197,223296,62628,168101,4243,107313,30321,26642,13049,51059,31027,107912,807,73550,26551,84369,122422,165872,49754,74213,234264,33151,52014,33100,87183,22365,52500,40013,23302,5652,72723,21404,26107,48434,587,94049,168493,96418,32871,70860,31709,25128,443,71597,166253,15670,70994,26341,133675,28280,75491,54756,47955,56028,26182,11952,113272,472197,64640,110753,17919,337,50642,22576,142,87371,53391,93210,126694,15285,19642,85667,14148,1506,42092,52962,33243,11970,20734,135843,57044,58880,13002,219134,22876,64754,232519,4257,43120,321573,24799,64526,124728,52579,81472,70831,276848,17403,74359,23021,182101,74597,23744,148267,12055,7976,5349,11772,67540,167347,65318,18720,127832,108238,22828,90233,9987,259080,118185,73209,79270,13775,90100,137742,90799,70569,15699,19961,9087,67475,57872,39731,8810,134897,131868,146849,19898,3334,2281,167061,91073,60356,467742,74712,188,53179,137679,92769,29241,9537,132595,80119,1041,88962,5976,40171,44911,102859,139059,104558,98987,47761,19272,71472,113864,175377,73338,10857,23402,23758,1591,139864,5644,4076,118760,16427,134198,18853,20291,100849,37423,22038,36677,19071,195521,57445,11069,31869,55718,66882,148490,44,41296,75242,49704,166810,9906,20943,122258,49112,105667,15969,10344,6408,187694,21399,72742,58970,14867,14376,81889,41856,23225,15042,56993,16074,131389,74276,72407,53875,383108,53597,37363,68993,44854,122548,430927,198279,38430,80409,12245,2981,628,2818,17760,37437,238229,7968,46892,2200,3730,34190,65983,37959,112291,87850,70827,6522,20750,73913,111621,41652,19587,2780,58668,25916,85259,18200,168962,95781,42445,102050,7776,57662,103313,47742,96358,41964,66174,100396,29069,204735,19679,27978,7479,40264,22534,61183,36081,107436,58223,14680,23002,101311,24716,124108,12908,5646,31750,40380,14215,232799,102772,14122,96775,61398,50917,12096,149880,67833,598749,124194,155871,49216,790,14677,65319,56917,7440,145744,95701,12206,49405,129269,76199,45732,9767,11058,9047,210885,11051,7392,26307,2130,8132,147526,20802,232698,115660,50060,59789,57344,107623,80343,112676,23291,9866,160971,34032,118291,15719,59730,164911,28975,2659,58046,78480,21854,66209,53863,109085,116045,29021,46481,107552,22130,18764,70254,31272,11300,52460,43933,84738,20721,53869,190840,79673,105300,7561,321817,66924,13940,33281,101046,183181,32176,71878,5678,62924,79535,56646,40303,19559,27703,93042,73368,42187,3670,37376,46440,7023,36816,109628,20680,5940,276440,275233,170848,112093,136996,14984,20226,111441,77693,112960,48577,39370,55707,50314,123404,26570,54281,61372,123391,4857,35928,246740,132507,106646,44241,7196,92258,9825,37688,51197,303141,5590,15476,132986,10955,85782,34486,26696,7991,28813,18858,39546,11703,11365,38185,5716,93555,11925,40121,60002,6985,10976,171384,3887,43394,13337,56346,6381,252336,39573,75042,53711,1028,31781,44295,95925,131713,7214,68125,43571,70954,213234,1628,8760,13391,65485,17320,56038,1710,25248,60803,57399,19839,3870,326,281556,50945,72400,21460,316244,75619,56246,98775,481,13513,55765,50427,7388,123519,32929,57908,27124,61316,101097,57467,30228,48792,10788,20402,37318,50526,155730,34456,158065,145305,17832,43733,64052,4506,35072,205355,177028,184004,187081,68616,35938,83703,10367,36892,93186,260137,51934,89970,4985,23445,26755,21558,7948,78741,23376,124405,85594,68596,57536,49351,12619,56593,132668,99924,109728,71844,71935,196018,65464,17617,14987,89701,143773,33997,8687,22701,33258,2914,4436,72108,85610,9671,49067,2327,82988,1361,1672,44033,35777,30269,24057,10605,82236,616,15793,13919,47249,112086,116698,9484,80207,90574,33304,68624,93127,56101,42210,160929,4827,38995,38095,4701,125119,5027,33680,9236,231236,14135,87837,23318,70261,78893,30151,81482,14332,1084,74256,27532,46644,79185,3148,62615,6981,55672,31668,36825,1849,14536,37446,14738,23779,43058,162749,72199,1168,21346,5592,85932,85302,9668,18351,57135,150360,2080,228015,77953,34670,119302,151751,31009,106725,84265,45214,59289,74178,113071,263206,111009,4021,44449,188119,192629,123592,392506,292847,114487,12831,205858,9852,20780,79648,75767,357014,97721,18166,21005,67950,33226,204009,16536,2987,11335,66717,144910,47950,17262,55060,15063,2934,51038,26775,178497,66008,3427,49433,128592,20036,157553,63861,3089,23015,51210,28696,35933,49942,71135,231518,99620,17248,21835,176536,20676,16944,38700,165831,233253,295625,36723,13023,52745,10907,19423,67972,125868,95473,82875,1183,108455,52685,33417,64095,21433,52438,33191,127809,44505,211823,7810,2752,95548,162031,7185,91196,47563,61721,33359,17897,23682,42806,178101,22874,49707,199897,75419,82456,8618,11171,79712,116847,18783,44190,46564,5346,59046,95032,7893,14916,3214,26800,24172,121453,34362,10250,17408,18888,4840,68696,22831,13162,36005,32512,14800,62357,41723,45046,27247,37486,5372,2564,34261,298500,66509,133920,89138,31305,117697,19097,108304,81386,84106,23802,46411,63304,946,51417,41777,41041,19501,115864,60743,294354,37955,94165,18116,1156,17937,20645,57114,90804,58042,48643,92288,9861,2557,88546,61333,101008,12853,5148,87856,4152,144503,73841,18718,9789,147565,10846,42085,12789,30223,8993,56352,67203,2448,28215,6052,23540,126319,75933,36689,80235,23231,23561,21383,38800,77548,102798,21234,31468,158608,46188,63960,191679,8051,67014,11185,170078,42186,28827,34777,41930,212079,12421,34750,24111,110344,73918,45171,70826,141949,40063,23979,24254,37309,26724,27179,24718,83648,54938,14591,17425,29525,102675,48975,48654,12316,8929,60640,41709,50168,63264,89812,50716,48632,38755,138583,160123,55579,71829,24230,233277,46322,39650,166388,34718,24108,98252,7031,106695,62498,18258,35062,217827,78731,34824,33354,19520,60852,2432,60224,8587,2836,62955,702,20227,42285,40560,95592,62486,11094,53035,143291,18842,46177,77994,1770,9657,107422,172915,32655,128716,25886,25164,156740,119928,165875,85817,11007,89110,33956,12652,65156,180266,8494,36889,19958,20955,96,1264,118288,135769,44754,86671,5632,19026,168220,289120,33569,93821,66144,70635,7687,5642,2714,55445,56636,71545,184182,93133,7332,37389,12643,52315,22729,11014,158742,17050,152889,50178,34601,41945,52136,9948,26914,63548,95721,115951,40759,8960,158258,38938,49232,48325,42234,81523,253019,66128,40978,20048,238048,38760,62928,122560,118532,43687,137472,163689,26680,9878,17448,51035,16211,60834,36749,29178,14241,59868,150086,2305,26477,42422,34342,165341,83279,33894,14257,29928,12743,13957,125571,89134,66712,10952,16507,147839,30146,7249,16565,45399,39874,114565,215780,31990,230881,171477,102,196546,44538,10880,84948,281705,86651,10617,31395,2342,453658,43569,60561,132901,21845,17727,58556,258242,22262,58728,4008,77997,11806,37431,30599,81375,109137,185787,114085,217292,97453,169085,30593,60212,11544,102056,65580,2384,91655,4855,95725,7295,157994,16228,20669,53276,141590,105246,17334,25440,76067,17967,39321,38911,11362,28559,63807,21627,26468,85816,40120,1025,15234,58319,69516,66512,124548,75845,78873,22137,46681,51242,85683,32909,76747,35555,43396,101465,1765,73094,1077,2962,39028,66777,57831,42048,15828,13962,36041,63657,52412,5242,58846,2141,5506,219012,134451,3936,182230,17558,17153,152237,22621,49377,170216,35257,68233,65374,6510,11126,212151,7184,2480,22517,3437,33073,30156,16557,3768,55067,86829,91e3,12350,148650,66017,79424,70885,49066,28250,21369,51213,34533,11510,3258,18176,18465,84413,6315,36411,163765,4346,356,107618,598,13727,285026,162695,8749,14583,7132,63521,184253,32378,25991,5604,30961,53675,4874,84693,5086,34811,26978,56564,7904,33519,51221,113942,69253,6664,125563,22055,220680,102008,742,51930,19494,176108,44424,35123,13025,75685,11759,74335,22250,181453,131147,16984,132115,154311,11991,76452,52609,85351,196,30969,9198,74919,2529,56838,71779,29187,116304,3504,62330,41190,86153,28393,254926,104228,105189,13264,84359,3574,12415,8534,57147,10175,188174,59504,60932,66318,16407,107921,17638,99103,49278,28403,39786,145865,8462,3558,43406,142271,29139,21989,36552,93955,72365,7176,13556,106185,37957,321774,17782,129017,51154,27938,24952,1935,39366,2791,33489,41582,56078,24558,9311,5449,218786,27808,190429,68013,36020,86003,29735,3404,87348,119357,115714,2324,86796,81973,40992,43376,93621,28784,16808,36367,2517,2909,191926,24978,55303,53308,205724,60068,3098,21375,64784,23949,26579,63121,12319,80145,39967,97861,6757,70143,67642,37082,34698,69140,122883,46151,62187,80934,429,19437,135071,137885,222647,13331,154065,327,61778,74257,40116,37493,14855,85079,237641,42342,102164,199965,71204,4662,29368,5042,113914,122214,8955,13149,102503,43173,5659,163787,69003,307084,63392,171080,21390,81918,86666,36622,24126,28887,5736,28054,207170,163428,79891,346467,95363,38980,111806,80828,9200,19288,294896,114468,87405,111715,141705,7015,72754,68463,48738,243147,33397,101210,37051,98801,82847,20397,4940,185559,18716,54718,83491,11725,40803,1128,12128,23060,5174,7745,67007,46701,1571,27807,180186,256996,18975,16837,7877,212758,250379,15440,87954,57755,24719,124057,83461,258,50864,8874,29038,71289,31627,15429,9005,4061,113851,107716,82819,13651,79656,117851,17539,111446,12938,39724,190787,4352,15402,21070,62708,8539,23777,73853,13552,38810,86117,16285,56400,1718,75342,142863,29033,378,110113,180321,32586,23606,26393,160984,207987,23783,8406,16904,24596,47274,11693,46539,60524,78595,48423,31718,20170,9009,146268,15183,191060,172765,1349,138436,37365,10970,40509,225817,20021,70394,152138,21541,66559,66544,89352,2725,17258,91345,7313,3815,115868,8660,40362,4071,103524,39388,118275,21950,6549,38226,32754,209574,29201,43495,18028,20296,40597,18370,47520,202450,24134,2219,8195,69545,38041,136934,46374,19041,159811,84865,58620,846,98749,13569,30714,97246,32186,4479,27355,92973,35214,151491,75963,37631,1561,27200,238083,23182,60756,12291,25766,39355,102333,87362,65741,59906,19538,201575,48772,102938,24438,292580,39964,66366,9004,61379,50548,37622,38732,28379,68180,76622,17488,69849,5963,7219,48143,43413,55358,540,58691,29506,19245,52193,48621,5518,13048,118625,44755,191081,42061,89197,2259,60665,66994,71210,51232,3585,142096,55024,7892,8345,58653,463307,65658,64319,137941,136323,53499,12746,43492,6978,95163,29925,60175,5128,7352,41463,184756,121146,20473,18426,4598,5309,54580,14277,121151,10691,56711,43880,63409,76682,11830,172218,264898,32632,66536,81062,31649,25788,92774,60222,11100,63159,9432,224657,25240,53613,152,138620,163829,2397,85345,12501,37507,64932,38575,43522,65789,80198,78796,35226,3851,108891,73311,3060,28391,93671,39663,46142,30982,66041,37281,68157,26553,71872,81142,211527,39747,118119,22695,2859,11066,20232,168911,7933,197005,17066,111071,44434,133994,120798,12766,227798,45756,132852,29917,36076,55352,65281,129800,41958,18944,84678,18580,168093,132621,39997,54092,27740,32354,3770,114118,103242,43918,15899,18574,145944,3190,123469,219903,24169,100571,62403,16776,92779,14535,17168,16475,14304,37231,1712,28218,242754,61688,28980,1318,51359,222657,99200,67989,31772,23932,35351,201251,49041,27306,19128,40135,3986,77333,19649,120683,151927,21081,7076,78375,77501,101599,8011,89585,96715,58179,5378,102138,106793,26051,217276,4197,16297,27014,46721,13322,22806,5278,29629,70632,9647,71519,58818,40603,128530,8903,36770,56900,31483,26935,43845,34265,34920,87658,6114,84767,64250,47318,50720,19264,162514,33357,13117,6705,46696,75032,71054,87004,42035,69138,11903,99854,102328,19611,34525,69312,6431,49842,101600,133178,108751,41829,89939,225664,48916,99556,9195,130387,5960,36857,116724,53518,94002,39077,53996,6945,22261,64291,8314,152785,57588,16522,9091,5048,87671,35441,39509,1945,12423,158923,178413,37549,14095,1475,73188,62878,4819,24012,68534,42606,4010,120809,57497,59564,101758,103718,32701,80116,12345,95834,46918,21468,53213,15665,31200,3867,5140,96013,250744,21016,10069,13968,35449,180829,27683,39704,59956,22893,3115,26293,32785,75934,62445,141162,62720,2018,83638,19949,114012,95006,3330,99829,130935,309272,9565,55874,121727,37017,23586,319858,40970,27602,8625,112329,61060,100088,118525,25922,16232,1907,60671,51583,44553,80993,5262,94679,8676,940,20736,11823,3020,16476,12340,152600,97416,3703,25744,66826,16245,16876,46446,84798,74227,176020,45192,61955,75496,23946,23626,40372,26036,6149,11822,30582,16541,41914,82385,232823,40921,80773,14930,3631,7517,39619,4348,36180,126106,138939,62611,1477,113512,47321,25052,14546,118881,29060,23589,128322,36795,18401,137921,104699,267929,36194,172791,18113,4766,188215,30083,332586,94089,5805,77909,22194,68234,154976,43220,40660,70001,184893,138095,11128,103010,22663,5108,212615,8485,5565,49222,54614,26530,42639,16319,55062,152662,105595,21114,22216,10294,68158,10436,86950,7206,62115,3977,3657,59874,456,118617,18156,106663,112229,80992,17442,8217,55551,5133,34344,251927,51153,39364,201321,7816,66803,23057,156724,145664,14276,95705,979,2796,6875,13429,212525,50602,26276,28284,3424,19465,52397,46963,31420,51399,206476,92317,48851,637,100820,83349,10317,60227,21972,6908,282439,32857,224767,95629,83882,42106,87338,69757,29840,68709,37665,45244,114577,49188,175943,54009,186746,106158,70168,3358,234002,50555,9221,129338,9562,20118,32923,78479,118280,65752,4977,10474,102174,60947,129006,10570,83451,8598,8078,159367,123785,80438,16742,5905,5281,181513,42402,6977,163136,93179,42191,14968,50421,112401,105440,33456,57347,121611,4221,94954,36517,24046,27796,6255,33394,72990,135408,116627,1233,57874,25654,95419,68156,401399,313338,55208,45573,93124,119251,47200,38196,11909,130667,45391,73904,64964,167846,4137,115606,52036,62214,7969,160925,7187,1132,134835,40309,73195,64494,80472,444841,61111,26500,45323,40743,53625,52797,22659,15631,29739,36706,28841,39147,102836,26794,10536,14845,87305,45874,12241,127587,83833,57183,79722,30844,41304,84655,20825,92500,3722,25655,27811,10157,81634,31362,34088,92487,70123,22190,185100,72658,139035,192523,88241,2078,230490,44528,85638,100198,22088,29982,291233,241062,13865,4445,137791,37835,107218,31726,19718,38234,72528,23046,19177,66695,5109,17251,28077,5617,21554,47839,72425,133825,1486,73065,181275,141508,21768,62971,63082,2512,34200,9904,120309,6392,91243,68416,268253,41199,116757,138551,185526,41246,28986,4093,19057,17295,4148,245766,122360,35356,112075,20301,75441,10998,7977,19769,62922,937,63547,100196,26427,157820,20983,236696,22935,8140,90315,156004,47204,140973,7726,45097,52725,22636,23436,257282,105247,522,88389,216031,202204,46812,211666,19693,68828,81691,45925,11256,30292,372,5236,167826,88328,232776,151611,5360,82104,18841,80393,25465,18285,20320,72377,31730,33160,45803,38715,27705,37379,24163,18360,103586,4015,32305,269494,91252,20080,36567,54650,7797,57073,12650,31164,42209,6375,261663,105528,81661,106002,2800,5375,17247,43151,4442,15727,194619,100855,144898,62320,78465,39929,16454,1967,28311,61363,17219,9395,8745,121445,76939,80385,162380,22009,54191,44248,16299,122830,48151,74429,78291,64755,14238,44966,2511,17712,67954,93583,829,105899,49935,84750,11591,33185,85447,42717,27409,208542,28965,62052,52525,5597,25694,65594,16343,63224,276188,12475,9331,127507,38522,57287,24128,133161,79723,105548,133695,48917,27558,43278,46520,13778,141954,110785,83366,17715,46317,105763,66298,147013,41086,94180,16478,220447,44611,730,19722,78975,117889,125643,26254,16574,18480,65006,15806,38549,246418,46052,36056,8440,34984,30170,3163,59800,4458,115442,4283,41970,33507,104078,1653,22,121158,276486,3655,6338,24048,133421,23641,2161,24422,36006,8086,10675,181474,12307,29514,59143,14729,52509,87128,122470,19446,80852,33314,24573,119864,14237,9652,57779,6612,51851,15284,98871,90581,124466,156831,21190,22015,71380,161906,87247,69201,18392,17908,108470,72962,40719,14338,17911,95260,43339,20610,78916,20710,72451,11315,31448,17263,58853,178878,48111,116002,45497,80506,82605,85880,36300,121755,25215,36118,301929,88728,405223,276136,553,34704,212438,49970,78329,922,20711,25036,257130,38295,145369,18128,15385,30829,55656,48345,8012,3561,28004,122041,192900,58338,112508,41085,29976,87040,47117,23905,4336,92061,138880,97407,42083,172121,6256,25192,172671,5,93568,1420,12677,31605,56743,40620,6015,78415,231077,31298,80026,13902,19048,24924,170586,32955,176119,87859,36731,6773,27711,24658,26475,115216,133207,93250,95820,88522,8317,5714,124047,55219,86860,19677,23961,22928,162209,8904,225992,359835,56084,96201,29392,96558,86071,93643,55114,13347,8183,95129,82012,2017,123336,34219,115554,157159,47747,101684,41008,18735,193781,104151,226906,7552,179874,124113,31159,21162,44010,14771,51268,166128,31382,73124,77438,92830,205709,12113,1292,38937,13114,1334,2118,15597,69581,14449,21934,76618,48728,67038,14967,51495,24243,87736,147249,26720,11119,46063,43749,5843,44147,152629,133428,65703,14269,45604,57982,28672,55616,45957,8438,95433,37698,220862,132034,39456,61870,4161,26501,73560,56418,9845,4654,20916,10456,88920,119358,9015,65931,96507,48029,38534,21676,109081,43078,34943,25089,6131,28766,23665,5477,10255,16695,67,45778,42443,42770,29534,23733,100513,62617,42630,48746,14191,43753,50295,26007,8792,57243,43119,54725,164253,58250,112304,131796,25165,4651,3188,24831,47748,3705,19540,13211,102095,5593,18699,23666,32005,117571,33541,60584,74573,86311,99443,25172,27222,168938,7143,11853,53560,18834,19960,86522,28217,53266,117700,72989,34323,18721,66450,34346,74056,47217,202002,46269,9429,68582,75458,37823,82843,96652,32549,145144,27958,19820,158086,31955,201406,135379,31207,192545,12950,51704,9094,248263,76147,64028,110009,79407,89345,99284,223492,47966,26848,15359,201137,2861,110507,71231,72297,31851,118777,71039,151051,240855,16333,50766,14727,7939,4149,80908,418780,88378,59276,1327,7284,38576,79814,65820,42199,84860,49574,62596,12396,70598,40117,8648,7994,16836,7630,14047,359699,106878,525,29037,28064,13380,11675,50669,74216,103539,180314,27449,56299,172344,19274,7301,246099,32043,19422,36506,129317,6806,30140,4614,46639,66926,932,86600,6322,27847,233103,10541,39025,34887,3517,12972,26220,2031,66561,115015,48658,47596,12714,33845,3893,16165,35237,89983,14769,11962,147224,47018,29977,27979,5552,82338,86023,131368,1218,24853,237840,132193,15455,40873,3668,65351,53388,15229,59889,272245,47934,11858,34347,18038,90853,86981,300602,19343,114181,29362,84921,6095,106059,79472,38015,1206,48741,6208,8e4,21916,17423,6002,108083,24479,34931,56661,9511,26995,100694,163853,35997,81254,58321,18919,171890,86877,91341,74503,70477,53412,7027,59281,39892,131302,5864,15947,61301,67466,162369,47956,27874,35624,282324,21270,111847,102548,41482,30955,116737,28264,8592,55458,22301,75090,29821,30697,51709,3041,19208,8038,24634,30467,87509,126428,19389,18814,152686,20701,83474,45832,80891,105808,11378,153223,120770,98186,150633,49838,9141,12755,30962,5260,74490,21256,31678,65062,33326,289838,187831,20595,89768,2805,58535,10844,70085,12090,2451,138068,98544,24461,4511,6754,41684,28203,3383,65355,82833,30161,83924,234361,128424,28921,222594,33975,125491,34069,11508,67464,144226,41850,98703,34371,7901,21254,38398,65651,23549,53883,213340,123269,12028,71764,177701,28758,2623,68395,11549,15232,68603,9660,63116,36079,57093,31198,20475,48467,89984,35619,186847,107469,31389,43631,73867,41949,68841,114250,1605,30564,63403,17588,27680,99533,12641,70325,50428,73426,78379,11855,91651,72081,91720,60198,15743,12065,83398,140046,6761,46598,45900,5068,886,62448,148968,37347,19405,9680,15819,43496,63370,75667,163700,37639,3633,22774,34341,183131,134335,37200,23915,7054,14194,12970,26438,13350,285521,25594,8219,104410,91039,168804,138480,149734,15907,33818,61132,60082,4622,110187,56736,13551,73571,3945,73463,65498,17758,263266,17593,2710,27585,54469,38200,45367,63754,28881,3473,12791,98287,31895,65787,4463,94536,24951,36332,59901,28803,52130,86403,7668,181822,74831,18977,9850,177206,145485,109798,7292,31421,26280,77211,58511,12507,127004,11113,147,8729,56208,43066,79926,129937,31345,83947,39915,46146,98763,42566,1337,13192,18323,105163,80570,117753,16555,72883,11077,159438,40764,70933,83329,26066,12276,72059,21655,173836,126713,69454,153482,91585,70644,102558,110483,6764,127864,190133,3961,101798,20945,71138,82402,90884,69669,44753,923,16939,59700,164258,25969,27082,31399,43846,6306,246093,51342,6153,151581,202801,182731,56475,162188,89426,141356,14355,121815,27536,28023,65257,77523,106668,127314,24947,12790,38796,169698,23555,10725,44573,183083,42088,62716,43265,105958,32050,44067,50118,1668,3874,6243,318411,16599,1691,94999,52378,28671,216728,123258,2059,34969,69225,5913,136280,171443,141515,91662,22175,135282,80020,92270,1663,4808,4482,3495,34691,5226,109830,108512,17342,107488,11606,123190,100247,29666,146527,113014,15794,30894,13224,39585,243192,22351,9903,7836,47699,11078,25468,122291,48821,26780,122679,75521,81450,630,4895,92900,55074,74293,17441,3563,111657,103102,51613,12318,52370,36191,68245,34269,40445,41354,122901,168604,182500,62012,42557,11259,24428,115113,86345,12362,3909,78430,86852,134602,20459,47853,93879,22577,7659,3688,38555,13349,17381,56715,91639,12493,10895,92438,3142,37057,28928,2004,36427,32268,34222,209974,10432,67436,41989,173518,107930,27079,62729,30908,55558,5828,45031,14902,53546,8204,144263,60255,14520,88212,86582,109589,69356,8064,47449,8505,66558,16886,4844,52817,111260,215129,12941,91118,650,20770,6273,73089,40618,62790,2873,35002,14023,97208,19386,102646,36993,143736,135457,35385,113601,17893,32627,84439,100619,56016,6581,57264,172160,45452,111710,203627,70131,24100,322787,1996,35665,70078,22358,90922,83658,4097,63200,58499,14542,99153,52159,6615,12414,63415,31986,16823,1579,65405,137809,8841,16898,48082,259,33014,42375,12260,179850,73667,91389,98882,29532,17311,326251,41092,5928,20742,44964,48019,43505,9317,49265,6643,192712,48424,163487,19861,20113,70848,31928,105333,23685,78563,14638,54755,7158,24142,44018,20774,125255,20331,24280,10163,1285,2336,39851,4299,117269,46714,63816,87779,159624,11731,9971,990,137317,108831,50994,74554,162680,23640,131597,146962,170620,34829,91205,21184,1913,63616,18427,93136,156592,17519,67565,115882,138220,78622,88535,18115,2711,33554,109492,54298,971,24914,25863,36363,45715,27099,194995,14299,178181,111488,72395,322385,157719,130787,11897,81843,83999,11369,49280,118604,40922,61332,110343,53407,75639,40582,300440,54722,25637,13694,48248,48278,194521,56203,52779,48783,72627,10953,376,16733,280238,26351,230789,15132,25168,137270,3588,63704,73376,94031,74284,19443,159557,9697,39901,13351,119050,15406,146455,3460,29556,75195,37673,102524,92329,47289,98413,15311,100684,56345,7116,95480,11590,7200,167,23610,58426,17730,136656,27944,53151,2701,8824,103124,3017,90744,113588,53216,79736,65940,26931,498,29568,80540,143543,21292,1740,59268,16561,180816,42323,50174,40890,52866,10703,57169,4700,17191,4424,93511,49698,166650,26972,48631,165169,82879,69326,202970,4007,2376,231325,139592,22119,62851,37504,68816,58345,67398,186643,43331,277416,53749,15746,23102,17432,4793,151138,48822,54265,48203,198688,14305,54287,2291,18018,113378,123260,7180,97549,87027,120085,2920,76080,8190,102005,5641,64580,14955,59802,54028,58884,19367,81779,412567,85957,97053,103637,78871,29364,27637,141728,4767,30686,112738,130146,42745,12730,105040,14844,232,210944,36581,152317,135543,29744,3129,55647,58149,46319,27265,17499,28005,59948,7170,34138,5702,293047,110892,408,91760,218674,18469,46095,81403,14389,4610,35672,73060,11006,74848,104820,118143,190357,20043,105358,141735,5115,27093,45924,123073,52599,29433,9616,238350,78610,24851,58858,26769,31969,24613,18294,4982,32735,39639,143563,112073,202205,12567,4873,88601,44897,81503,101648,81362,34662,85277,17574,48173,21435,221188,40215,39576,80786,26544,64668,81841,10731,37733,247986,149188,127703,495,18382,54388,72446,43071,30974,198723,89608,41360,190,33045,8386,31658,19992,237838,119015,137622,50890,100913,6460,116233,267230,26621,104129,65114,14190,41542,14888,85962,23342,23041,26453,43725,71809,45186,4770,46452,53894,56616,221286,18973,9038,109299,55365,19366,26863,18808,60909,69353,41738,83463,12100,68561,72860,3980,13796,49340,12332,31311,27418,4255,53430,18976,45523,510,14224,30477,26581,4530,3651,101663,139840,22709,150861,31996,63923,120623,262522,3076,10528,2929,14672,130238,18087,9816,121894,100308,25085,55111,14565,18952,53293,2042,369988,23674,61789,133529,28783,108293,35477,47119,36448,71049,40015,33055,78598,198442,1833,159937,40654,77444,189245,113153,8621,18599,38553,35223,166072,2375,11659,21786,89523,6032,12116,63046,159398,18454,3678,32521,47626,11411,103527,38896,42946,15696,26370,10185,8413,37080,165583,4331,63555,14907,72220,50056,6623,62236,36565,49783,10049,17503,100581,55951,146244,24724,9626,17969,25524,109300,173965,99994,101056,46459,43647,53737,277968,8347,123521,74858,33829,44762,77574,877,81377,222525,123532,30602,43881,53145,2973,16284,81940,61281,127044,63620,9875,14756,114829,19032,9202,52759,119141,23928,120551,19607,3599,33401,76821,73233,117430,39968,36539,7071,5446,121735,194059,15206,45283,6706,15603,65615,1207,165723,92275,34773,104447,8396,32353,205240,164323,13600,60555,79205,25532,22907,33410,57480,107111,69630,32137,47832,70913,33161,20321,2371,117348,10714,86246,1625,11763,17900,268,78457,99175,97940,101092,86660,32221,14041,128504,125080,53744,124263,31017,13897,403,31859,21964,5633,111630,5547,77329,17961,18241,84995,25984,12983,67491,62168,47262,5241,297,51191,7351,8967,147212,82060,16821,782,11033,82431,62957,5026,43459,77963,203477,53528,6247,191852,87774,74164,215654,13467,1522,219964,28589,244104,16242,117821,67725,72570,156792,17186,15979,26990,44128,193014,35276,57125,16212,166451,68017,6905,77608,16364,53777,75921,76426,37975,26203,269296,64099,84122,12077,38533,830,4407,20139,963,43028,38902,42911,37503,83343,85045,16979,1165,60835,137387,58380,86990,110066,134540,56331,193845,81238,17922,163093,38744,110641,12502,56404,34862,26865,125964,12965,111648,25547,7771,27196,136980,9555,29551,107158,57885,18831,37705,35505,101742,13970,102109,62548,124657,23328,11124,89592,146376,248050,6241,22033,18337,80685,29898,11908,216623,67721,106162,146610,21377,15085,91552,42041,62560,122532,125336,102365,121537,142559,29693,223919,11515,110495,18776,22494,5895,185059,103592,229351,51220,100102,37027,257855,29359,54123,36066,106493,12244,79258,32002,432,56205,94836,90182,6726,14762,29391,48938,26864,38083,60364,3310,60192,14766,205567,57504,110760,22649,24666,46333,21517,3430,13135,28873,27052,158809,11597,20529,6695,23138,22960,37137,45574,6545,305877,43423,26153,24769,59844,14501,10430,134352,56169,13213,103432,49523,35181,13435,12408,129475,64620,230854,77390,51990,15653,83248,33466,44571,117828,51481,2187,10559,68019,18021,54895,48247,18354,33737,4554,108595,37288,39767,116707,9175,3726,108877,21616,83684,49862,1938,8543,276466,20134,108498,48770,102254,31914,131520,185291,100559,51890,209,19526,76471,50544,71814,99351,8172,198526,28816,20419,9109,98389,136777,76479,75596,30635,165417,48216,120220,25955,211071,39314,24308,32164,2559,146280,43403,9233,17947,90585,1786,86920,125662,2457,64741,32152,32918,122882,78538,44001,31723,56426,23375,103172,88177,145697,52506,49319,68016,31664,41488,18486,110400,7030,28241,986,109199,19900,42147,56864,65287,49183,7858,24e3,30453,840,16673,25907,68916,89927,6309,158335,36407,199737,130464,13137,59603,201778,195292,21015,42466,179062,172561,89492,11075,180407,31868,72493,20998,60217,9865,19530,39274,130266,54539,21623,12535,13505,40641,73375,4087,85633,2153,3117,70680,55788,92096,47509,98493,37490,271936,151475,3032,16171,96642,34106,78425,125761,19591,3366,19316,54508,24183,50786,194248,91528,33253,34622,108355,41741,705,3814,3883,108929,13203,67831,10142,59754,68208,29128,84820,56880,38794,24972,48571,40821,40476,18137,164254,24064,236309,79181,11282,395,39169,2013,51587,28551,9645,701,109513,115899,113566,12762,62045,58322,103726,41343,40866,244102,143816,2490,70346,40973,52618,15412,30720,104315,38917,42027,93676,17513,107418,20706,123890,13399,97727,24044,87962,65606,44250,98044,65276,74790,101473,19350,91570,1326,87790,172042,7577,100813,86896,85891,41512,108130,27794,14875,71431,12835,156250,58135,3759,22476,42176,115873,34686,56523,73643,108505,51491,20838,12721,32863,45700,29496,13700,34294,55360,29206,155942,123812,7706,163234,203,132720,49358,144431,8130,175788,35818,3270,76832,25710,54095,97274,28779,94621,74396,19092,128242,58067,20885,14670,93255,15107,63291,23654,126900,129421,59294,262659,9798,3251,67344,28600,44629,50672,29072,26999,31526,23183,49175,165843,175455,17282,175411,32022,45989,30298,90690,78118,83156,23749,35636,31317,7069,80381,94561,133756,14960,97404,6138,41065,78041,32843,16601,34123,9559,146529,123377,96395,54441,42012,84257,123541,10745,22139,106459,11720,150883,172651,154996,110538,4728,53447,25704,2009,71152,119354,21166,66604,1429,216162,8637,122250,63520,27180,29172,36124,276428,107787,77184,4680,14952,104903,24418,14793,51561,52931,8371,26342,48526,7118,92066,67280,40653,8847,34597,105438,14198,50163,61188,146286,50315,41205,170829,161496,585,197359,95056,1687,365794,91349,48507,5804,49263,5146,104902,96365,117343,132222,46084,96919,16875,8073,262381,79982,52663,13928,16056,153908,15145,109256,132308,18763,24904,167644,13618,40750,18686,147124,114709,150038,52849,2938,12568,48617,8778,5459,44202,44591,74914,17183,248689,13878,7822,80060,23116,194037,18487,2067,7798,43077,33678,244028,31320,74273,2794,19466,8218,36280,183997,48124,19416,29656,19280,98734,7715,18311,30701,133602,150307,126956,7378,2933,79903,13178,12593,86571,26604,92446,13574,44205,65699,427599,21118,8245,14407,27877,47936,33542,7916,26460,117762,21596,37818,2249,127359,209394,60044,47677,308089,36791,154971,31417,6998,150042,174360,12255,43009,29335,48739,3912,101398,53340,2580,146939,151295,45360,125275,15273,45383,27456,48761,23314,8750,60801,85823,104759,27894,123685,66968,39480,26917,55290,83305,2696,98390,57569,145853,340733,4919,20024,52268,30884,7413,203685,70989,112855,4129,50536,349518,68205,332641,159581,135361,236026,37563,176404,64899,6578,122033,63871,1850,85234,82089,66124,74145,121098,107351,12687,36881,117334,13136,14698,85933,93866,18047,32620,310,15094,46e3,88451,23632,36645,27940,87618,80520,58892,20976,27702,140090,96075,67841,103292,238964,87778,107338,17019,83427,67522,7302,8261,47570,116787,8730,80484,61772,174422,56005,131193,52875,14588,28471,59817,9586,15720,158155,51307,109734,15196,11025,59331,3884,52626,102602,84797,25158,27314,4437,20488,76214,189248,35023,114952,157376,2827,62439,102878,129749,36405,10329,109339,108633,36662,1254,13267,5470,87105,58004,15397,10434,159667,21864,52022,179464,3013,32147,31496,116832,18494,105502,129227,107267,50033,13481,9954,24267,22141,16257,116154,36185,950,115685,11305,176708,2048,178671,112573,287867,162328,497663,95170,50979,193861,50987,30368,136257,31830,46549,15119,169876,23788,17462,249887,57377,1949,35448,14791,43769,210091,3783,34612,282103,88380,245190,5457,20491,98908,11402,86899,117916,16028,162584,60644,320177,156096,31065,55876,22e3,77655,9992,23397,13757,317623,63978,215255,2443,17648,93231,27388,104529,93807,55505,140477,12046,112040,70887,40152,94365,112353,25063,114679,266061,71248,119555,15589,2244,617,14129,211431,70110,100652,7777,4383,85911,89221,21010,120615,58357,86405,37554,41647,18,15143,69662,60491,14714,186134,148344,42347,5410,168175,44535,42449,343894,129417,99682,20659,27272,140483,63455,222159,17536,13722,42637,62324,11976,114691,148109,2283,32057,182393,4295,147364,33705,2075,44303,30274,28331,63740,69740,29148,10346,44862,33716,73937,153333,12930,38784,247159,2515,41053,20256,83368,256189,54639,115240,5096,24661,175419,153552,26516,141,138176,63885,34115,47222,55709,2765,28479,38875,236608,12229,22921,77291,54426,45388,2860,57787,114579,295139,105782,17826,71066,19119,54364,69385,16568,12323,28057,33346,34919,124763,155533,101386,31644,8627,49001,303600,29868,63213,9103,77280,71333,9696,138789,37059,24823,5057,21352,32368,114208,56803,19424,10445,58514,8661,209508,26187,171838,10460,63454,14016,122504,41328,21329,46618,32493,38225,7855,31763,7945,29876,8734,6438,24205,97490,139977,130740,47323,33195,85390,57194,13813,60600,21313,96251,7699,27584,170521,139271,1363,4402,336738,129223,84983,69150,13147,3590,163929,207225,155260,55916,20288,4503,8398,98490,11773,27512,37113,84976,86558,28365,11756,116005,182148,13733,115313,47644,67208,85069,9347,14995,226141,14704,101835,41159,35314,13113,63526,214039,29978,50446,83339,17440,129441,72522,118641,97816,24907,73844,15717,118884,167255,96509,162793,30847,36849,51297,78974,77793,10427,1873,2972,9999,35074,28190,64297,146836,46298,60038,163007,108919,61219,2403,75022,127339,4233,110389,69022,9833,128097,88016,79390,222936,22570,94657,28462,56956,38803,81536,30474,152794,19566,16481,147408,74574,81895,20731,1918,1366,76367,187321,54494,24366,21690,61696,33283,107477,77499,31112,414383,74362,18463,218441,120929,59848,258629,201924,69269,454,19989,13054,59894,3623,58908,20681,35723,78523,102680,38988,184112,108087,50944,132704,52966,21699,18860,96349,201411,82697,85395,95658,5093,6427,177894,44191,32755,26961,155739,6249,31310,81030,26574,84311,120155,86730,113535,7424,48888,13516,45747,98098,20077,183995,81945,43210,26704,40420,75831,45648,11180,6855,57927,65528,124096,34851,2598,156633,107572,127352,38169,123845,60142,62722,105584,232364,23211,68120,1601,22169,89299,747,258039,80572,7258,152249,11862,101204,8834,121434,33761,19175,133142,46343,40178,48723,3589,41977,30210,38868,62257,10087,82658,87827,90646,16415,47552,351723,28298,72225,91146,272760,1701,11295,1652,109651,300747,51863,198800,29446,11794,32345,37538,22356,33102,37590,113544,37970,11478,179743,25454,103417,59905,221970,105196,145604,7817,164809,102360,16974,75840,255333,56902,6659,1954,645,59400,67769,7689,18675,5215,13793,20536,27852,3387,29523,259718,16860,94625,43143,29245,15848,233581,22685,63631,78557,22836,133302,84513,1348,51826,47129,98836,58284,1830,1749,94642,10933,6145,12506,10975,13879,103781,144434,10268,28409,32346,52968,121567,107374,77268,23686,35097,10501,155275,15303,47136,21102,168741,55332,90385,15996,84817,681,137803,25054,142275,6163,38175,8056,124296,240642,65621,4934,178205,16101,62803,60964,18230,100622,76465,44689,14545,9543,47514,16852,93380,28048,12047,107106,37575,101485,77047,57326,34819,96137,76916,6469,46264,115983,75768,87668,69942,13027,165,8373,114231,26434,52844,42799,182044,23580,146254,38081,43236,33883,146220,382894,14606,46035,36481,166621,35417,95382,2957,59384,60428,36358,66343,75378,22267,22950,83528,17577,56474,25285,4619,179691,75355,95836,53295,34588,171410,4487,14679,84208,44015,18562,109133,54101,11531,86052,174479,303157,28095,9953,35642,14564,39802,16145,77606,117406,53038,121117,53624,22062,1212,7632,127157,237292,189087,10478,127345,102515,181997,86752,87623,10966,121602,68783,68681,83042,114380,138349,191305,67176,50085,39016,1427,42384,1412,67118,122616,72389,25260,2237,13576,137346,19938,20304,2191,68759,5373,61364,238507,75814,23931,69565,38993,131741,38364,12528,87762,5679,129853,5310,186831,32653,90338,260176,389531,108118,26843,43985,50175,30563,25106,56965,18130,140428,4542,165503,117991,24219,229605,1819,129663,1240,3797,76093,18398,71339,51919,93043,27175,47060,216257,6483,35051,1217,16512,80798,129064,13225,69339,8548,237079,72298,2575,34280,51379,117910,55671,53345,247552,29486,39328,140821,34681,57045,60177,5004,90269,78522,2479,322607,48474,61296,13057,31558,4678,59271,6699,27044,31988,35944,12503,83480,4389,136508,3781,114121,70279,4488,155829,42214,2898,68191,75695,305850,45041,74344,106509,30087,17429,93292,12477,290,23080,114802,35714,18751,26554,105424,17775,2144,2412,100610,65192,113975,52975,180272,135050,129815,76238,106483,21440,63186,4260,46189,9711,28249,4169,23429,23390,8324,141585,63809,67668,38457,38063,39226,59972,1189,203916,62368,14403,16949,61767,85801,1739,40147,35049,76757,33124,62102,15780,103593,103009,53484,22952,67973,114645,6566,5245,50462,7601,8288,3513,194571,80276,1908,54592,5124,58571,2513,6800,273997,193904,1119,17991,117245,2508,129156,82366,26278,71465,63341,56943,39662,106116,94966,156875,9736,2204,122308,94418,27134,1280,24539,49022,45314,3764,50904,46424,30699,28087,293839,9400,33646,40165,822,147499,50263,116179,29085,11863,31314,5578,17797,5104,12454,1604,15342,219206,10232,67800,94261,25872,13565,90339,78971,75377,26649,41184,47695,11514,35369,20767,14227,41953,309396,148270,147938,33074,14453,27499,109019,39018,25738,240196,158931,52820,8612,95853,21524,137010,84901,70869,70021,116794,48404,38771,6732,1070,70990,187297,49140,5238,576,3564,253975,16027,16483,2811,37775,19034,25259,4053,2e3,70083,95774,19713,33431,92703,91314,42381,288770,48194,95985,3991,77418,13406,241328,245086,56533,35275,62725,9246,51924,70181,95331,16163,31410,79016,39312,120878,119371,275987,80124,27712,9186,220,23598,146167,85209,68238,282190,57048,31273,30555,80913,17594,75779,59160,135002,101219,189377,29225,96735,60126,62522,104e3,27620,86814,17240,147533,11001,5425,43682,410,49460,87270,69480,46315,59448,1816,76201,9431,11788,87960,29063,65539,47347,11678,33846,7008,196704,9895,6753,8633,120892,59970,572824,115934,6646,202559,892,48351,37611,251282,57823,67263,57750,26527,34485,90747,7685,88370,6144,64182,1709,41969,21458,62327,181657,49247,225330,122600,114574,107124,85361,111833,63243,71420,15655,191178,72430,18063,51425,54002,12364,53225,86557,18193,97580,41232,138398,67821,128724,8944,233212,101353,52099,42127,14006,120107,32789,32132,3498,18123,33758,56058,5779,128760,59888,98869,18445,84702,51911,13234,218379,20093,39031,8074,70195,20708,23462,24355,131384,60189,26390,10403,41060,7140,10781,49410,42261,87202,82566,41663,43105,60276,2768,5733,74176,28329,2297,145430,131632,83615,122915,105441,655,224102,5284,136426,67763,16294,188511,32538,61049,27893,3394,13951,159099,28542,17930,145360,9492,190122,32285,78855,26440,13570,58648,73908,4239,124561,2444,74172,53131,11468,10794,73566,11623,35343,64710,30481,4163,10328,38309,29901,10538,154377,76132,92405,24839,11679,3465,13449,11637,7824,2337,57754,1260,14458,41118,19878,38661,13416,159180,37074,163164,54137,28627,52134,184900,8520,40385,29546,30502,22386,66527,107458,6850,24022,47983,30603,35083,8934,304066,39500,9,28261,33026,77251,9374,44833,116312,34990,29236,63563,125639,135405,165398,159055,55690,88141,69643,236964,31983,25572,20436,36746,60896,31850,16179,11828,5888,3043,66368,9750,31167,7915,53111,36430,1333,64344,93659,20061,60596,180191,51630,6792,30244,43509,101058,22409,420,44210,109783,43223,27030,72477,72831,32679,29235,7675,47556,12258,39907,149412,84926,118247,24692,71717,105038,86009,45941,41189,89453,29856,52543,30627,226798,67303,59230,67415,34408,1367,99685,16867,128419,52147,4111,125381,117881,16173,44093,102224,31575,23234,24870,83790,127407,239098,3200,994,1255,100903,242275,117266,55116,38205,16140,29662,11307,40414,208793,123355,56470,4862,75600,30119,58218,70828,24075,26974,7802,192353,4851,5475,78720,66596,3409,28573,64396,30381,30690,59859,88256,5406,99945,103064,34463,37727,24238,86643,60088,4057,23741,5967,162904,38240,28356,93858,25510,122879,6897,3278,7057,11971,4400,35461,211413,21395,59615,39471,87233,55795,128426,3051,22470,41950,14705,3974,180108,80476,78442,204996,91987,15634,67610,139015,142373,35611,51134,10387,4353,153456,57749,181039,14183,68447,151532,21107,36452,20551,3186,46247,46383,129666,88736,140662,146243,2066,8360,7978,64818,106963,17896,47801,10723,114821,223295,74192,3293,3393,16987,74064,11277,91622,4270,29828,27951,387869,103235,1374,61988,120083,477,145892,128378,11779,211263,61354,18221,17869,46530,83061,108538,157981,90608,67199,95080,49064,195814,12302,66307,10348,231346,160732,112859,63633,146558,21271,31037,198802,47622,12862,95710,3910,77850,73961,85585,34752,61e3,4082,24595,103679,71107,8208,79568,150019,16615,24961,139857,32664,197366,4559,54735,32696,4126,162019,75698,13916,70108,159638,19834,9349,24675,175560,49643,18206,52459,27992,10809,88865,401975,133172,29e3,34558,30915,3658,25834,42430,36562,125265,18182,10155,40149,97082,208980,19575,60853,90529,66545,9600,789,46420,2317,88593,55595,98980,115302,5742,169155,1073,177901,3472,11189,63711,78643,65472,50459,127979,93,42202,67053,21720,157650,11145,141378,42033,22824,85705,79114,35584,15974,1510,54172,28562,12451,104226,19190,97151,73024,20948,5151,81741,21499,29006,84183,198074,54003,45120,170125,26240,35177,28389,64863,79974,60778,176915,232183,45342,2038,80253,41564,40703,32689,5430,100689,5366,23007,134279,14266,26712,73993,24934,64242,52113,102887,61801,46415,201049,54251,62133,122757,164883,30815,139966,2319,30842,766,13362,10287,134518,86111,81665,82440,28333,43019,18963,8804,161944,23439,102144,101145,80029,39052,248708,30350,117340,11878,128467,974,138625,63961,5237,74778,61834,67040,43814,13690,65947,33809,232476,115258,181745,28824,94013,9510,10246,93722,81976,7217,114383,3493,16014,69045,72692,12145,80981,9507,6692,1620,60820,330444,35474,33962,4797,7053,295463,46445,27026,12491,77988,49524,35675,90947,29114,166705,101385,133782,32704,6186,84595,176031,185623,45966,151302,63069,1699,107491,947,15458,74452,196212,6046,10498,12163,10239,35191,243951,9277,9090,29539,54460,22820,26514,112549,60372,51753,48756,21812,70861,260326,41,44222,10441,16961,48148,138771,216194,5914,52153,53400,212036,56519,26245,10117,45888,15294,138019,90913,26368,43842,42111,23348,6082,194845,161089,156206,51546,11647,30759,302912,262094,8635,78876,26535,35283,54183,31183,85484,147873,12989,5197,6356,72894,65347,20150,27370,73787,1493,45918,12366,190217,20724,13858,10981,67449,81213,7553,14115,72242,271517,11842,48310,88743,143726,22177,3290,243231,58452,62937,12592,1654,40066,33477,13751,9921,128442,15868,7106,75236,83773,10775,36938,10482,170465,17368,17469,161508,32752,98340,800,19824,264456,3901,87319,2867,26782,9630,113102,185815,24197,44584,86366,40224,3636,140916,31731,267731,9567,53678,72984,29389,27963,17106,50282,284911,60170,8322,12608,23374,89652,5268,39044,229766,8869,151350,31436,177342,12269,183212,120418,116270,2843,78888,69192,7865,184099,1086,129897,18383,70508,20242,18508,229924,124569,35749,50589,55626,9884,83115,40971,30671,18135,14452,38861,17844,201826,5549,26413,17189,13561,38539,10679,143331,3314,36785,171194,49685,187713,67506,4618,104039,17060,195080,50648,33159,19238,67559,134840,28599,157523,17130,38064,117398,94355,31918,13575,34538,40326,13997,3494,348283,62481,26862,3603,104426,244363,153709,112487,304612,199674,41239,35545,54869,293005,28223,26277,26899,4533,18518,15492,38587,80488,70485,160395,263,60162,11382,222152,4696,250751,51921,182609,10707,48463,46243,1227,49111,111564,46502,33342,56846,68541,63559,858,139927,16654,229375,76759,26478,33205,95828,23399,92945,2637,35630,28470,143992,50214,14174,21456,166191,65665,1711,21594,78019,97599,111701,36,147151,110246,189022,43021,30397,40757,131935,42065,73335,48039,26596,28984,15102,2361,7421,202167,69744,43766,52826,3642,83304,33873,75140,63169,192389,36551,92748,13039,123959,233220,21738,84447,77230,20228,187852,19095,25799,92136,108774,29237,53947,2299,118106,2687,8830,42331,202924,33667,2023,73763,30704,19363,19779,16737,35629,48081,24068,101013,162338,291912,13749,24745,328289,167679,70086,48299,23306,16732,17801,43322,54589,3586,63653,43624,53474,925,109177,251316,43805,13082,19511,86565,142182,92461,17117,101033,103319,64589,4022,4351,235897,5352,82705,107142,46391,156084,5860,61365,10558,13045,7717,18357,33922,12590,33065,6928,46993,783,46937,67846,8952,26295,6107,119656,18799,17458,50747,4229,179559,112727,118080,20683,41464,125468,51560,49749,44231,7359,35339,62988,136487,67015,5208,29150,24956,105186,48858,6143,18097,6972,16404,73489,58742,97196,36357,164616,5834,32267,13746,147733,15113,132091,34127,106298,39729,106426,22294,9780,15602,36213,71502,42808,66802,599,60755,5851,39120,67363,108623,126368,72770,91263,32486,30596,151717,7951,52002,43103,11768,68942,40901,39344,24037,127500,116890,48403,16926,86750,17745,48648,159545,34460,58419,5634,114317,67865,31462,23352,24010,98185,125708,69686,68337,13610,26271,70691,2980,4768,27225,102402,75453,28106,8104,6931,1176,6274,6475,112635,22498,6176,238686,26832,28893,90319,14441,15682,15087,39517,45270,109134,104440,45965,47645,81772,7876,52683,87720,12898,4505,185665,2769,113401,15664,57592,105229,137381,97059,119268,6876,43309,33886,128363,35476,144249,67013,143587,83367,25703,91436,59347,53236,2289,16519,19844,46309,58558,99834,23313,218816,231303,36388,51333,183535,109792,139277,54306,90139,18235,8275,32710,37677,82464,86025,92204,88842,117723,37570,128723,234242,76350,73795,34896,148247,58424,11105,11744,45746,63372,17118,49772,199520,81902,38004,22911,33752,3125,1995,53792,4689,26909,108150,146062,69674,41811,161444,84855,8999,28561,16731,93937,3189,21967,24890,22943,1356,145300,51569,28802,517,118679,31703,40607,48098,108854,25003,10233,73969,177495,5248,24516,215347,146192,48712,60626,69188,40735,5866,586,101541,6509,47590,52129,5969,222045,110933,25733,24223,65339,62812,2414,155418,35819,16022,78423,43138,20995,128255,240673,46745,236093,72176,57085,97841,61248,107,36068,193177,105427,55726,215229,20446,47228,100420,87091,14429,121708,23605,21157,187721,21880,2997,203976,99166,95068,25877,7724,98925,83401,4829,13182,18229,13718,239662,38653,116505,153497,30589,89029,38962,181302,43853,78872,180301,4786,248240,7401,106136,112590,77745,19731,60880,77789,125748,135487,5975,48627,34084,12419,215770,47557,254582,10364,106495,21856,67539,88981,38805,21428,48732,42316,12149,16078,52808,25327,51322,33850,51147,12253,122354,46077,56483,254553,115417,81834,150991,94662,86668,7381,12841,100650,18218,15741,22372,68294,50705,15535,84660,61887,22553,72299,31361,24824,17743,46820,64288,31582,77006,111674,116384,30760,80920,86149,77192,51979,79691,60342,122805,103800,240873,160744,233114,78962,54920,8608,3484,316104,72548,24337,5088,230040,21926,10172,36838,26,86221,83458,102176,12062,17571,41929,41170,28428,68239,41750,103930,2634,18313,53019,34825,97837,63115,24606,73157,152474,14715,91439,37033,109806,140259,30668,174760,380,135597,95673,136073,65073,134249,13829,17279,122305,4420,46444,10237,64848,203623,70728,10349,182885,65075,24519,25783,40318,34139,22222,63394,55266,102764,41422,20126,65100,90408,53640,35128,48932,11192,38935,96839,34782,39492,19396,41332,6250,5511,19492,51304,25936,104466,54099,73771,86115,5080,7669,30891,111700,13931,25276,72289,135447,14820,258641,25265,31005,281179,75286,393,95359,14623,13584,6680,101227,80173,44933,76666,54542,13244,39348,458,25379,109451,134348,81143,6959,65554,12027,51311,8716,57589,140731,28467,23316,17272,30458,25980,55229,77197,83798,28302,114784,7428,34548,26241,14712,39336,103304,18928,54080,12870,334,87722,15208,16895,142098,114262,39820,83913,57817,28682,7721,14900,108672,11250,62246,42849,415188,1724,26555,24549,25505,26443,107450,145899,61035,43528,6901,60726,65906,267741,21338,147590,42079,18924,73017,135236,15393,5206,4026,84185,1531,5988,113890,82647,303391,7386,69844,71611,189865,76523,31877,13315,19314,198575,32821,1928,67641,25913,104475,103489,3297,70391,18406,15446,113347,19295,93790,27856,1792,167471,116449,8541,4408,41757,63233,25765,86680,64501,27034,24816,34975,6079,4486,49693,36229,16917,21581,62426,27862,11612,54284,35702,194034,355,24277,48262,87411,70504,310164,118018,12516,47559,43502,57433,107139,9290,66533,80863,14634,34312,91725,28606,21342,67241,72355,43244,375789,37402,174015,105070,8342,44167,67494,1890,16365,11723,271002,1865,47918,8350,45564,27742,25110,125803,8553,49504,81925,62211,4534,15491,19011,80373,206920,667,102405,128623,245524,5553,113309,192739,65766,19567,22832,261958,29679,21293,71134,20962,105123,24721,860,21752,33448,18372,157167,94822,35770,173224,232737,75729,28937,46828,28062,25453,5207,140366,36665,30652,6169,67920,150458,92040,23186,184604,92330,20891,176492,49427,27828,38305,42495,143982,49560,25503,90043,29747,65328,47830,12932,11068,77721,9003,25213,94205,140426,46090,89945,138173,192691,33329,112232,129905,35709,27514,1841,19957,31411,127476,53572,17497,173549,55063,175135,19841,69314,5192,237921,117660,150697,4060,273045,50414,98940,65348,153665,164423,58804,156695,48994,213928,86036,28608,8355,39574,34540,16927,135680,18374,151587,10830,53805,16878,16623,4282,48030,8537,14986,46102,13062,72897,72,33050,108227,39451,45935,651,113320,40535,95176,57450,48843,5003,19019,10407,211163,3848,1068,4988,32091,30095,41692,15099,43602,107434,50744,7627,171349,16313,150832,352665,207750,33937,38256,51091,156e3,87889,90663,84175,24908,114900,50365,31494,83829,5398,169342,47521,54818,18935,8356,43094,41212,174536,10082,92550,6678,60614,23355,69721,14796,34149,128830,58187,3179,208,40325,28399,225029,401412,51150,31580,207268,6657,10993,69818,64282,289845,23308,12961,38447,6681,52944,31855,2572,47646,120728,179148,37240,45196,218274,4816,3695,21961,50084,35209,18073,51452,27004,6100,33941,1377,84831,171214,85,141510,9078,99227,32610,6417,11718,49868,65579,87902,73018,49062,46280,61742,21512,40862,107733,15941,29168,157765,144919,14487,5767,158014,140070,7241,573,71584,16921,223566,40331,179473,35081,47926,140885,41508,52104,59180,42310,32811,29048,123517,102413,80208,10104,14746,12649,153641,126022,37965,113017,4171,83,142592,2809,6362,50416,71323,116894,260776,16204,1524,5760,30351,12658,20703,54403,36083,45408,74772,4946,14485,50759,111222,10890,2195,167147,92962,130534,16283,177256,35016,15472,210156,151187,73922,117691,43250,52051,37392,24811,24358,30830,5775,818,21969,1476,127322,151783,58392,31021,106913,65215,89407,90802,28531,11690,20234,95249,44602,37256,18707,11928,5161,4410,26571,51903,49768,22008,25252,65780,209499,68769,203726,13249,137363,48845,86823,6658,5674,31881,1083,1823,108676,34518,166752,13791,14287,91576,91429,8665,11529,26401,16191,91972,30964,5254,28486,54697,79613,66520,18447,22870,45203,194466,22822,51703,12278,76716,44595,73455,33546,12235,144843,36154,51247,11116,33040,3180,225753,60864,1972,28469,12891,28879,10338,144157,56294,353058,38302,41447,87532,110616,27065,168438,6557,1213,50804,144643,24817,2390,136531,38174,247513,16190,4059,122791,131994,137430,39506,57650,16305,5188,54309,106128,20628,88071,67394,395446,250285,66176,91254,1399,114196,43915,60230,44853,27206,106353,43013,18733,345105,226453,51202,16607,57106,117175,35492,10476,89598,127439,15187,39624,13688,61570,10615,31111,59370,6238,175252,32143,224492,41388,95408,34384,148238,78307,38959,9340,160091,61443,15737,11216,41244,170,38299,102443,113097,26382,14027,33707,3957,76300,66160,19431,18900,6952,1717,108656,82206,188021,257335,27295,43999,41210,31777,46956,57457,12657,11489,15697,48060,204748,53583,82422,284790,30503,137341,8120,19615,220311,15991,10217,63424,9808,67431,70976,98221,4491,15177,28535,144789,751,13230,2394,1504,33977,132104,30316,22230,931,97193,185240,24826,22687,174322,15307,22988,1390,188745,180325,29580,59068,74903,18994,29195,79,15436,7622,38462,11566,138710,44828,45774,37768,99236,68137,84083,19282,22698,17134,74807,126662,173497,46248,16938,119735,3212,28292,213652,49013,9975,32180,45660,86250,4801,68788,95490,77482,113751,11994,44624,94452,46839,128497,100316,5798,58588,73184,202987,65417,37790,88524,1606,43156,97964,105717,34947,11203,100060,37742,130074,93653,107799,94311,196106,41347,8035,10780,16390,27883,118236,167395,1979,25006,19375,31628,18916,144723,78502,114047,103107,86492,107686,5844,20934,206963,23556,22591,16562,146333,20167,10471,117434,33085,2863,9740,36669,41849,37271,22790,18209,28979,8231,12952,54408,21731,25130,45208,55748,138120,75826,414,29593,9925,292865,25999,683,123149,7036,92159,86055,61827,103680,23176,54918,58466,57578,13305,5709,86479,16697,31064,17660,200919,10770,49793,33423,32370,52047,16488,62555,6459,8426,83493,7763,59725,82812,18628,67760,79405,68557,9612,7673,28102,56517,69620,171797,32458,29541,15870,81109,32080,207644,71495,21202,11039,91036,61230,2810,130800,32260,4613,60590,37112,75214,33979,126402,155062,30642,63875,12810,194463,82799,47664,16725,36685,43367,61099,449,172150,102867,21691,301838,36745,7130,18671,57316,34852,38034,54182,35578,65900,99486,19771,3456,2658,16914,99866,28390,28109,8262,21147,34353,20006,4228,137085,1675,203023,283196,198286,214375,163329,290603,152574,40471,83506,30068,14730,23177,131539,34759,27668,32178,71896,104799,116305,85430,119262,42860,25160,8911,23428,49437,105322,6519,16203,6349,74711,1230,38045,8540,75165,44736,25909,51026,317034,4984,32281,91312,27060,44431,17817,45363,155937,239085,35697,59784,91993,29531,126740,213757,76560,167776,285273,24262,8237,65030,41160,74437,48804,118916,13159,37842,1031,75349,1478,11655,108777,23435,277425,101734,67469,70231,124711,43532,28514,65526,54956,1e3,21882,17728,25302,40952,52214,149632,1999,2111,3259,63362,89961,220561,39777,26335,9063,10572,12416,34551,34623,38604,24723,5947,15588,69927,66252,119177,69173,46629,28714,70715,212408,20521,406913,74380,11716,50659,50862,37009,88460,130101,7210,53853,538,65120,151950,55806,163748,52837,13153,21100,16674,64536,6091,138201,44837,58547,3723,163,2177,32288,85454,34033,8497,14282,25742,10535,10741,79559,117493,243787,49337,100718,79495,40139,42956,7551,55433,15421,31509,23034,45081,547,61176,53434,328001,8470,36263,30145,4519,74173,53935,11845,73774,60211,78025,3,4102,73782,109293,315332,48412,26683,13714,6865,20128,18490,104141,325,39470,171970,115860,15707,7268,73301,74336,31370,2368,111827,107757,136231,142844,97138,96638,84053,38691,23801,1588,10573,122098,77039,240,186135,146101,11996,18143,112963,46171,155836,348769,47795,121213,116266,132515,3344,144804,31286,99187,255838,129694,35894,48779,55235,148582,71967,65282,15174,13920,47080,6147,108242,157593,125025,7136,1286,28957,127956,28402,98813,20805,7532,109417,40610,5041,32958,15142,18408,108596,33543,50517,27748,80114,233434,91447,487,37094,100048,30541,43477,10639,89862,155868,37667,8726,60684,237903,73408,99589,12190,38739,97348,3914,13594,2680,149016,13907,30171,28343,23530,115225,61104,35821,147679,14337,4297,244282,24085,326976,56428,7851,21303,131620,71446,83253,68692,111870,5224,15813,38197,49026,45057,13660,3306,76345,40671,27905,91072,996,68527,62085,91351,122634,55109,168209,2024,27560,112707,17352,8306,167115,169921,166958,5031,46020,11844,67284,19130,76185,6920,32849,5450,14610,22451,21002,17392,31872,66682,84796,13709,40210,59898,12029,8719,53564,21462,91884,21647,88379,194428,12754,37797,132826,160016,22567,54383,53186,77611,31107,8339,4694,19185,90355,23597,17222,140675,28442,23668,55977,9128,61555,28774,155229,17658,9390,24379,69357,15752,127381,239631,62460,93181,55913,45133,140155,18676,25249,33164,29581,82837,67223,22362,29975,7317,52813,1943,29613,20012,207130,49617,49651,5636,15334,36313,29226,28084,95247,72072,19e3,224932,15811,114,32127,38097,37508,88507,37225,27359,91626,12193,69279,20608,11055,88156,92808,2152,57259,55275,72789,24475,104414,1708,9882,3818,48661,66897,1631,34806,227930,85815,87753,18321,250664,72733,25107,206797,50891,8082,196411,92596,96764,152823,65514,22819,387277,62176,51225,40329,15563,189,3659,73670,64357,51793,275136,33482,86653,74615,67058,11318,125720,15388,22388,8267,1730,102663,170910,40784,7144,85373,13040,7088,94309,583,44224,140424,77439,18496,164026,36578,4722,9151,5824,63365,26510,35199,40500,79277,32495,44614,35233,9566,203293,152144,7097,2330,183480,98629,13423,330887,44130,68600,30939,97829,31012,345465,56747,94879,4939,160027,149761,99423,46099,32251,15332,8761,96094,128555,5763,235318,222223,55729,30241,55420,201746,3987,81382,8259,49325,23287,7719,24633,251100,92311,18591,110533,64759,170260,393860,7175,21144,132887,3593,75346,101277,91109,16387,259187,11627,57459,173829,44694,55780,49797,89192,120443,62622,3904,14814,23887,1027,112258,64955,99800,11132,66353,36202,48624,18158,88481,96882,43059,11040,2455,7077,21651,181159,99126,100434,61388,68186,19161,110468,120052,8819,55324,41494,7014,37689,3618,87729,92615,207943,9823,128657,12587,15857,6379,67628,51216,71775,157617,63244,1503,3864,218754,110864,5769,21492,7243,1192,87921,85529,31512,18537,42698,35350,73510,84474,34301,8991,21013,35034,566,38832,19838,35586,37216,39413,55006,12178,59742,856,84563,6900,25632,17437,49786,30723,13847,70845,4044,7843,23944,235976,55530,48942,6518,20939,73769,192653,52936,95207,23895,132542,142982,22632,87452,48042,54018,178468,10728,26230,23559,363,81269,142012,5718,346258,31456,84333,246476,51018,66692,101804,120570,39962,30373,70593,2864,60541,19425,54209,104092,7201,31545,48018,25865,15442,46257,40443,8328,6451,111782,47527,97754,33046,470,245116,31095,39,91934,87208,73470,36708,36521,12801,70624,36272,8892,79768,12427,55454,103756,5908,52390,62962,22720,141138,94634,41689,128402,126390,6628,106394,35527,134394,82727,254651,194502,148064,89549,3202,28359,957,21954,27906,49840,142747,8307,24206,48978,1186,71728,133038,71474,91306,6333,110959,74600,70387,18983,62609,56057,22970,1147,135850,1321,28834,3578,59715,102227,32827,81415,99952,55636,257598,390,22702,35701,85872,402916,39216,189795,14929,19467,10112,144422,61514,5279,63421,134686,41436,8424,51925,10598,132295,124416,4604,194739,210929,57866,31829,51626,50007,9976,91878,61906,56168,81906,60918,61859,40017,23059,16887,40927,62064,12785,32893,32913,21782,93965,20169,44387,79084,38463,11457,93950,27127,157050,2697,337088,5116,54128,48255,33279,8821,27352,25515,124022,65710,28906,38557,33390,1722,104435,72215,38551,12094,30978,25113,6671,37355,175109,42862,98024,65406,221276,59624,118012,64637,78760,86697,21426,1639,40350,12584,67193,84144,31396,7863,143011,69629,63112,9454,28666,65798,46372,134721,6314,51402,30837,151922,2847,38676,38008,92823,136245,17540,5504,109295,205242,37606,5211,214892,1586,20670,208711,137743,19328,40652,16995,20023,14657,154919,34422,12996,13918,38221,47690,16398,2959,37680,89122,6721,198469,91876,172043,83898,101992,26084,94570,3635,76958,22853,76497,38266,176590,168403,44464,142840,79180,184594,1984,41806,83147,11985,6546,366068,59732,24533,271505,8736,39084,222992,93429,28962,58985,86665,8432,30028,14548,32439,54424,165029,55175,27458,69046,121277,46168,33732,20661,24581,135574,123110,37556,79260,72611,16957,12939,46162,58238,44907,72936,253758,41324,32518,96480,11949,124438,65280,43256,34107,53533,43531,37037,28366,45970,32741,173438,6121,194202,62969,26355,30314,58370,28455,1848,50519,82830,90393,21761,295490,10936,256940,133568,44050,20269,4089,27457,21610,219460,36743,14821,101388,52005,13124,30979,140816,167362,26054,18458,60789,34917,40447,26606,33422,9066,3452,83614,5761,20263,137238,25038,91310,101,52322,74548,42572,38084,214054,186568,31802,17665,30620,141936,37730,14420,4265,187218,49640,188208,51441,55388,96452,66659,40869,42039,60967,221027,19234,178581,29105,96050,9165,196118,157335,3738,40354,117436,2965,34136,59659,15570,50843,230035,31444,71260,43886,18316,5387,38500,168508,17406,32174,8828,103373,143806,90367,3560,18719,122310,16508,26719,2541,105429,6645,37998,73190,10591,235916,49737,87112,233941,53188,32193,79154,4544,52905,126477,7580,63501,57314,3216,31337,6541,103083,60846,49,9756,15481,1355,43840,14319,13743,27486,10222,73114,230718,418644,16706,6674,279748,23058,45273,295831,86306,2743,5535,88773,21829,35253,120938,31153,3169,16839,42847,8751,80974,33942,36867,35514,16485,26474,77775,56877,5391,48346,3882,108713,31403,27804,55248,26235,43821,136104,40118,175507,28034,203908,18732,1788,34030,106427,36958,54359,7251,44936,15356,69139,455,157915,22173,140291,50348,43275,82066,49621,54952,15216,36226,96695,66855,6936,1987,8227,196087,4631,68827,99004,47541,110265,17953,147605,110242,58520,31312,38724,329975,642,3155,34497,75937,6207,73843,6120,17249,51429,117746,3218,910,68961,319671,14938,29555,34700,1649,66673,72268,9655,76800,153087,6941,210168,27130,35398,1780,73242,3135,56689,19556,165307,8765,35967,121458,13333,70453,17350,117253,22265,13340,44265,39869,441,3742,135025,23581,33309,16543,17731,13291,157637,283005,21408,101360,63887,52312,83873,5338,233779,23759,186949,34531,177320,38069,156465,91004,19353,59852,68160,14891,1338,1072,29823,1950,28901,81407,313445,73038,84807,162348,240257,37162,138934,16111,58013,41253,102951,16457,96056,19541,56402,67217,41638,94381,89674,29481,37456,80815,151579,13937,13683,132537,19699,134545,67020,29816,222341,141235,427578,48868,129557,233342,23077,87871,16213,18728,16184,9469,37913,19680,2798,171356,178328,13216,50049,72690,71904,124644,55455,7504,29052,41036,266546,19899,30391,188755,8659,59469,16,104298,112943,53865,76203,138226,68857,139953,14125,107625,119795,173133,4398,50273,48808,54390,16466,122086,31835,67035,50971,48859,7508,46427,66477,73021,84615,39985,83076,46779,201569,53336,36443,60865,168164,143810,51393,25548,169307,32896,24485,38424,21837,29087,275813,51674,6714,64883,46169,187369,55186,76192,12852,12018,62134,31067,118303,16542,12125,10579,4928,26291,43854,7091,10946,253716,109062,39283,17261,113012,258512,47764,125126,32646,55892,80279,201623,149872,3192,385,1208,48750,5376,58738,22335,5427,82416,47811,32435,143086,38930,94128,59975,156037,37977,38224,62485,7698,50405,71027,16462,21559,136153,34131,107506,162069,63703,3101,215029,40407,4178,3774,9187,80019,17880,97926,67579,2600,18405,8351,47924,86638,70820,92206,86453,29610,42241,119200,3198,15466,67813,57863,35454,4779,99518,4649,104641,144269,33730,38073,65864,6838,109456,193298,154007,5623,45741,30846,182578,25573,157224,1543,58575,138703,146140,44971,49356,18275,59064,20300,13122,11848,24453,11973,9797,86843,2919,25530,49210,1130,161220,76788,75373,85604,34926,36014,17777,17255,51533,11676,92226,51845,119859,21525,5936,18507,28050,1140,31418,14857,34207,47859,10750,36382,32079,106909,59426,87757,38393,110042,15965,97104,33757,35344,97993,53979,33651,45407,41884,82515,173089,7177,58371,35365,47543,51927,35587,10670,23544,29306,84233,39976,76076,62097,9007,8668,28119,78281,120790,19835,143020,54968,18670,64959,20649,34469,42570,33001,136570,87796,120044,1106,58700,63951,127623,12805,83057,40212,31773,49850,7361,54336,347524,101314,23751,19569,48791,29174,49369,20467,7465,75842,38281,623,112457,60210,28849,51003,94720,6426,90047,85560,43761,3579,85105,34607,90410,118528,7224,42907,111163,18168,6960,161135,191298,5247,100584,127552,171568,20121,91173,12636,54615,20199,63730,98105,2396,40387,14438,125012,4765,33235,12865,45299,37728,82098,77872,114037,59253,19675,24838,398016,102561,11446,17069,57508,178277,65836,99941,26114,2585,271882,136866,50126,11027,155648,118367,14585,8910,123015,335383,40434,41016,53021,14439,87098,176860,201543,121888,2358,9286,5739,22666,54270,37884,169381,33984,93859,16124,89364,72207,51639,76366,99029,65812,2198,12147,174891,194289,6986,30252,88822,21284,11445,288337,160821,33034,100869,43852,25761,52882,1144,103809,1924,84458,86079,43411,13542,139276,18141,34978,41298,7276,26481,173800,33210,17951,142652,33616,33677,2210,19941,98568,2486,192414,80136,12058,235883,50963,249638,29572,27221,47034,6124,72107,63346,97620,158513,299699,40388,23235,37176,224244,198386,121323,67992,23827,63170,17838,106622,158590,26807,5345,23489,91891,55474,74834,37981,13058,5977,72552,34706,26828,145172,19904,21367,34043,960,77092,91381,4733,47446,7680,41697,5170,16960,14741,46101,13656,473,51842,37433,11103,11551,121951,13191,97536,165932,50397,51628,129028,9069,44885,6590,59195,47045,32940,225472,90345,21833,13303,29407,96615,141951,5198,6028,18395,7181,3861,14966,156358,167182,36529,55253,25942,173153,30959,27261,50691,150176,162201,38467,48462,80602,42163,118482,168,108756,26011,17166,54149,456538,22512,91374,13816,90358,131615,18132,226707,1824,28139,26860,42253,93877,77351,65575,8980,80574,22020,27948,40422,91324,76376,13528,39281,91685,82215,122541,144066,1983,193851,17283,26320,2739,194978,4790,26845,42627,61300,65815,174612,55133,4200,191130,79771,158321,52280,166796,221620,62461,11278,4067,88152,83409,31717,121367,13522,47325,37945,10406,174348,249321,154101,64912,29938,51775,17220,15776,166138,78890,84425,54121,42861,16368,24572,291647,10197,32073,22651,11677,97509,26952,35787,18424,41910,71614,94977,72318,41594,70024,275419,37702,60199,7335,39107,61315,18271,18394,33768,87884,104277,123724,7277,56288,71981,189803,49320,3352,6798,14240,8954,69220,94433,57372,28620,68863,193727,85575,42309,41667,67689,42081,22543,44824,12719,28540,114236,101553,27638,27296,4300,5353,4663,19379,94098,3758,95888,95144,80344,87320,28447,259518,12718,71391,152731,37063,24132,31911,104896,15672,103782,1521,4945,72541,23717,122632,15619,87175,206120,29428,189780,61416,28350,44457,972,1175,47233,198738,95789,41907,21953,97034,59341,22864,53713,16873,32971,20693,20954,31336,21477,16169,38370,16412,9019,3841,24599,21938,17085,6484,81198,76413,5849,72514,12320,65247,276175,37234,59796,52642,16312,57349,198507,94148,46134,18958,125552,1747,18725,151873,14901,5490,68287,29470,3689,64794,40814,26018,25692,54450,2703,88278,124886,173087,174e3,24159,179477,24276,46004,201876,209202,445,52876,31948,30206,157610,39180,18439,44124,50469,5774,96278,222758,200216,50290,45486,20435,46986,46276,140133,142326,15569,13363,47522,92583,2182,7135,16853,22998,30272,4952,63263,35623,39096,53789,44864,20053,110392,124213,4630,16087,28221,127787,25839,77481,44693,13464,113146,6983,27069,55717,50102,4760,7107,26186,66507,59145,36032,104182,71328,29425,64317,50781,47465,94298,69706,74899,22754,120756,25108,93077,56834,73286,39928,16218,41699,176763,7555,70819,50083,26895,23315,26014,16773,123079,41712,5719,31516,90427,158540,85051,183128,40864,27505,55392,9058,45224,96857,30901,136622,96557,56304,120061,11501,151448,5773,89743,7769,86069,2935,18471,41628,10114,33660,110170,49479,26745,92846,33221,26731,18795,87076,8550,2100,29972,120289,3077,72490,33784,2630,208722,50861,63483,79029,6419,39467,14302,45286,64207,9686,67513,44170,1050,77246,59266,17055,53801,7150,11111,42432,4278,94579,362117,36175,42902,41933,39002,98489,22913,74161,84773,57036,17556,162288,74485,178760,93867,73635,128860,50362,261,67455,80001,46080,35662,4368,25247,19230,74393,22588,1822,27682,235324,13798,85998,13194,235067,23514,71669,147632,23191,134748,214683,105101,1518,25489,247114,7380,54842,26922,3971,26361,20844,68642,170517,77339,123255,8963,77818,150998,48466,36806,2732,23261,11741,236162,18243,126216,28690,50546,16385,92760,197383,246558,201295,88255,67588,71687,176076,172653,169058,33906,63747,24835,157621,43338,30050,46152,132741,2770,51371,94835,6614,15112,11749,56936,1250,19027,399017,58036,100215,23388,55815,308768,124152,94803,9521,64186,8971,28,30427,62163,7616,103838,35079,29203,131235,7743,17389,10882,37420,61460,228512,85363,41581,131077,62822,119647,10130,54445,26925,19968,29016,24446,74028,24176,61448,67185,9254,8563,119129,9771,99184,37716,39514,10532,221512,258753,218630,55980,23394,32141,61924,66749,32411,3741,36475,26678,77010,44946,91203,128749,116953,20476,49625,53116,13735,102335,29376,51946,83407,67892,59212,34685,21083,1546,112982,32972,74397,1078,190545,16082,86140,58591,89611,101531,10061,105104,76319,20035,17551,52611,169061,190842,100780,23907,90413,115619,9675,34710,193435,49443,129734,11183,258877,16318,136182,126808,44635,27304,192375,2599,125648,47051,12091,23814,721,58800,40137,66726,97930,60877,74487,7942,54326,9841,41428,13762,8211,85383,6950,99177,79806,201786,296464,124087,13144,29741,41721,47634,55088,254286,106408,17041,99064,12942,64086,45233,14005,2612,55827,255,7984,13980,38574,12776,46654,73499,249951,2101,26676,25996,132326,116415,119062,50449,31033,23038,11589,179252,20007,14860,129270,21143,17796,144715,60106,70758,69842,34674,282133,44014,16774,57268,38528,24053,46373,201667,28327,471023,51889,102667,21193,114909,84132,69317,96723,67969,16134,68145,15058,28765,32035,2524,101089,98664,25045,76571,14957,86040,118506,262428,154764,81573,39681,283900,73287,127825,544,80448,52347,38512,175971,15180,45467,33086,46552,48894,81107,43213,36672,54025,76703,8053,7608,13299,56619,20752,238099,54164,105133,1444,32942,953,37564,8e3,66316,119463,106817,404,13667,149108,128597,31267,10269,49836,106150,1484,52330,76965,160486,171648,38456,31263,22424,37738,66245,67467,143369,60471,75610,20895,115528,86070,60854,40796,49347,18989,15030,11371,37578,15779,79867,10187,86462,46402,155626,93200,40229,7090,57547,108053,99598,11088,47505,41218,206017,2173,20988,30219,22919,80563,57566,42369,93141,41675,2407,182519,120495,27154,16702,29456,14349,7958,16688,117177,140375,42467,261919,74916,153569,10836,34742,49526,7621,105997,12212,2270,392377,7755,17959,25086,232152,138791,33847,13860,35316,5811,1344,71259,50452,207539,92635,50359,5821,33674,30255,2086,2587,96264,17543,42,6029,9580,43007,139248,82831,12917,29607,25786,51467,42137,85161,100698,31561,88989,121990,278500,3602,109344,37982,15279,116442,28936,30880,87894,58079,128661,126731,67392,28051,146885,4861,16216,97344,42827,147561,153948,22684,21335,47685,1853,43349,15185,59642,10229,25520,187921,108972,5579,98037,24945,6697,19193,63734,137934,75056,89740,19767,224268,56138,63643,151661,39313,70618,84031,89723,84074,13703,85626,35460,8867,64845,3439,57906,99776,63968,49270,81130,34356,16210,23547,36446,34090,140028,72439,2221,22163,57058,363492,113754,18913,95451,48663,54464,54037,176097,68425,3023,34906,29482,117389,341780,80431,58330,16753,92616,60907,94846,147486,4498,48646,7773,46801,7778,18946,464978,47558,33223,177444,7328,15626,63337,94700,11743,9351,255024,39098,16447,42647,96230,39769,58840,10068,63439,35800,65843,58823,413844,9156,51258,7434,61791,85018,6872,3692,28096,7121,33024,6009,75532,31997,192535,9661,3304,9547,14753,31987,25314,55689,15896,20430,39472,31340,99744,25398,115569,54883,28719,205423,23071,57855,64638,149867,25671,82403,37616,20668,39989,77996,74948,140555,175248,64810,36515,46595,4958,248773,24045,28728,136673,168704,20804,114833,100325,27135,21205,96151,153134,45992,7093,13992,76047,1980,19432,145001,75159,87462,17710,1013,45556,34297,144882,20648,26061,11319,129567,108555,18872,464580,33386,22717,65948,167189,5603,135042,79542,8801,202632,18114,91882,5973,5239,67315,4431,60916,47819,71693,32597,32606,18183,45072,80329,76385,24749,51305,40314,156514,14693,130345,13168,66214,18029,12858,34801,27628,14544,10823,40522,40185,33739,148694,23548,9923,61012,28859,17933,19442,34364,99849,164107,141167,30629,21054,6744,36491,8096,42474,41706,155060,30650,10600,163442,1143,96655,61390,52359,7559,51568,64256,203854,4467,22453,14504,436398,7878,6980,8293,63610,293747,16167,35763,19627,147603,15419,18032,110744,51346,33681,54571,40472,48615,39073,21604,13754,173027,92560,11083,47299,63062,11813,52007,29883,9734,139722,15953,1550,20651,13616,49306,16113,90089,92326,7584,30712,72424,164858,6831,152871,55746,197721,34167,196442,6022,112107,55215,7538,123381,4920,43539,77165,8939,50392,34192,20225,79762,22505,58667,40770,29788,97180,82835,4568,8579,13273,363569,35898,49983,436,36598,3237,131691,62418,35591,8101,4073,379438,65218,76072,33887,2968,27573,212619,288680,68278,72851,150504,217896,6913,121339,22017,35340,51072,43616,75043,31437,10833,81487,4364,22968,41454,106687,85446,19863,109625,149241,524,141850,214404,54376,657,237023,9401,108137,53800,32474,49712,53334,126876,27337,45552,177696,8269,15036,12097,42240,2328,125374,119295,99715,2500,19624,39441,27220,102691,60957,94543,39101,18566,67362,13975,78230,25017,34017,239007,90027,39351,41681,35354,43822,1043,916,58587,141983,94818,38799,75459,41114,67432,16195,36606,59568,22272,126769,31424,68659,12287,134302,257977,5756,207285,95637,47248,117689,19583,77451,22373,12200,54993,117118,34244,29386,34562,53819,71267,64172,77665,49368,7716,59301,25749,45426,194789,17297,2650,1766,32501,45198,20403,20984,6600,14171,94604,19037,5402,29896,9938,59935,109708,88081,145182,44844,39167,352626,164173,35374,45982,6122,154,73419,220487,53834,53601,17992,8609,229321,5610,68098,66815,71012,95069,140968,27396,8957,134489,24656,86659,56598,134852,17316,123838,255436,6613,41610,138033,81452,32023,32396,123687,63398,8693,29712,30407,19296,121188,3551,36099,20032,111948,56624,16547,27453,35916,15378,52039,56849,13489,22214,73177,53097,277349,2157,14029,187886,10260,141743,246460,91880,50869,3788,49486,133566,54950,33120,129337,53768,18333,9525,26902,312251,10297,9020,70759,16647,112432,59260,84609,9818,82766,73569,468,46001,75780,55028,52106,11498,43645,108069,17150,17753,29417,16705,31799,9606,289,122254,115975,8620,6133,255357,56908,14456,133464,43554,79224,11247,29630,160,12756,25464,65960,350428,62521,321796,100359,67358,35169,46172,113128,48988,88868,31094,33266,6847,60887,98188,49659,69117,92977,220228,13947,80181,35103,62170,97351,13475,2440,199768,19498,36597,46971,25234,67806,62881,84717,73648,181966,10488,94149,21550,26655,63436,48375,14405,165650,9621,24439,28043,42735,4490,29963,56674,45373,1934,262446,50855,67098,26898,5261,52696,40644,33900,9440,180286,87162,22940,19704,26936,69769,10254,101759,27406,12243,48e3,73926,113215,54935,5726,192787,4312,106216,9366,11550,52949,23457,212271,277152,133895,108374,6191,96477,29980,218916,58024,54696,40853,91124,65894,91170,65908,252552,6793,29212,15389,44516,122515,52617,35058,9017,103536,39510,49136,19242,130652,662077,74699,47024,31422,8517,73351,24399,13867,128360,4810,4434,61779,111983,61036,17798,110240,59722,102960,39688,10001,23803,23039,176498,56659,44814,134295,17188,77577,74466,226175,102472,154333,63900,111747,18062,41171,79669,32773,408933,42562,28931,30907,107388,43487,2946,240310,23938,24354,319,184983,7927,6488,1422,10790,68809,68209,64775,4361,202,17123,59634,51200,44391,18188,17843,2619,74278,3230,9540,47187,21702,36274,56894,43907,16310,34790,16866,6150,5561,13587,107545,108873,126867,86986,28640,33427,19017,5762,80637,17430,46903,2047,131055,25958,13558,5444,47152,13900,44563,122857,45348,70863,39593,54332,38068,33637,318,40310,143467,18502,24520,11377,62013,28942,27246,28269,83545,17999,59015,90707,30065,15161,34720,1263,37008,2012,6060,98575,92933,5721,299,199555,24578,29223,2985,743,115825,109523,136657,47454,26378,53586,3733,174945,93340,244456,5693,37386,28782,89767,27545,23573,18798,136425,34320,84778,20041,48453,38215,7477,71958,40621,8773,5874,187927,105965,51100,43533,18083,8443,10180,43597,2003,183999,69689,12216,129696,146188,62389,34044,68410,12765,43273,26949,266807,3345,34477,79197,5688,47539,213110,21634,22257,50092,32222,42346,39530,63668,98,134978,74022,5152,59088,174145,37220,9934,9545,118937,5724,87240,19875,15784,40143,23263,87513,181654,285152,37881,263241,4966,43934,10433,186657,6470,74416,225854,25908,142677,246262,32280,6192,75890,45546,143264,135305,29742,47013,77787,11732,126658,8763,37950,21806,57557,113464,89465,108995,164574,23894,22996,23169,15369,23117,17642,130607,40503,36239,280990,44666,9981,40427,147487,26869,168452,32886,32991,46798,240839,15111,70502,65697,88548,44145,28701,48767,31139,206777,35659,181164,166262,14554,171445,31786,66523,76607,17956,6507,31279,90476,116611,167918,6560,1243,115324,80128,41867,55897,187323,37069,32596,189444,145931,13390,105530,65709,26805,6999,55714,41300,22915,68951,22138,21120,22264,10058,19945,33635,56123,99085,10032,5818,6016,46649,57476,35264,94413,112522,262288,93686,83038,14341,23204,28807,66084,77987,6101,126673,7133,38126,5923,122091,170240,97772,46874,215746,43948,41622,3272,55596,8332,146411,251315,13533,8561,81521,115449,48616,175175,2063,186556,3036,134537,75772,29728,82360,22973,186559,86348,89100,38388,82297,45610,2613,87082,9986,177812,57884,23591,47485,42543,33582,44713,74439,257444,252451,31825,35631,38540,33066,5147,13973,4343,51830,70378,22827,26448,95560,36896,241741,48067,203953,298860,61620,20450,3220,67272,6586,107662,100160,108684,6929,57226,4762,7457,1320,40404,77204,99309,62750,208653,59977,44e3,74315,34332,5819,172217,64904,114077,18147,84012,1791,98456,90930,21446,116669,103938,7422,85140,59713,5768,326211,16239,75411,13229,29398,10758,236107,1539,112472,95979,152154,151294,306,21196,38146,10700,6891,84282,109646,56492,40539,6589,119491,51354,30685,140209,136906,29622,73617,49553,70525,51671,166869,139616,74395,37439,49595,45678,11959,33211,86560,52434,9282,62690,112155,130810,5243,108261,99970,265613,72551,80049,6391,33365,90721,66737,69872,87011,1860,9032,112544,60905,37371,89015,140351,19076,850,373531,2802,36725,218795,72062,28990,16550,24614,7815,6187,26336,33373,32162,42791,73555,32062,23386,10244,56392,49442,27076,136262,12412,14883,1134,33675,97153,199281,15608,100152,74072,47942,254301,36451,16026,10687,65067,56708,254030,30290,50490,13864,57941,259331,35588,23485,43486,24869,21620,92971,22072,88645,1048,182050,13343,32452,14825,19509,3325,216938,45740,99716,189082,53740,78245,25609,24311,176777,47340,308354,40669,66085,14102,125339,9225,128709,97207,1271,200933,78439,113451,88975,18324,46521,11819,18570,141756,72512,170020,52754,63550,118515,103073,93330,32736,50499,14722,31600,68452,398867,29316,172786,18417,104924,2606,5670,84818,16288,67106,59580,82929,607401,291,85829,359,15897,35830,50696,65630,52672,22115,356968,29895,40837,231192,34024,38957,26722,406,23335,124952,72068,68804,13268,147101,164740,276569,162596,66943,11569,26654,66358,4777,23229,102127,5848,978,2921,59666,5371,28212,90108,42938,39320,2499,4271,108792,33510,125072,71653,65239,38250,66357,38577,13964,86251,35708,50755,36010,29448,12209,3844,38222,206337,100876,67827,137088,14167,252225,84163,195270,1306,5703,54198,779,46802,22028,51124,86759,70560,113164,35685,162145,45471,34561,422,2611,6464,47486,19223,38246,9191,18331,89942,243642,212364,15893,17518,22617,6409,30046,126182,59716,36560,104428,18846,26592,19458,50793,147333,30826,1388,27647,10922,14495,33545,19269,135828,39727,41601,46931,233379,49169,131130,182112,16276,82381,118209,142445,128310,19672,28740,82907,33436,3118,102206,28723,24819,41937,38854,5157,3881,111491,1142,9776,421673,152241,29309,14961,87854,6054,15424,3796,82656,54996,2108,55367,239450,154525,9643,118103,106041,64601,68549,48707,30266,25772,18740,9462,229669,91798,112152,191327,14493,72828,8175,66636,236474,25817,87351,129027,76653,20422,22983,71240,27846,44661,12399,46158,77704,53101,35032,11072,17300,109294,33638,24408,1895,11241,760,17584,82479,125877,63150,141075,34259,23274,81698,15732,43577,48340,91584,14688,16379,24481,150280,96420,262050,48635,43727,61819,56268,72003,88178,17281,79912,13218,122519,125295,166396,11811,2171,118930,67746,17636,178278,174656,95661,173039,83845,79689,17473,98555,127696,203415,54730,22925,232239,9309,12136,175026,20740,180188,10747,39816,314017,266131,10040,175732,112550,220651,31974,37393,888,23008,86799,4303,64905,148467,75337,251,3284,370102,50264,9835,5438,23655,4481,29851,329,12855,7162,64931,78141,12804,42372,296771,83547,18624,34874,86271,3360,48665,77735,88767,11463,63527,28889,22258,29140,194315,113924,25499,6406,31334,1845,4802,49184,43455,35469,127594,92970,61038,115005,38840,87761,106838,8811,20572,55637,11162,96721,132425,108925,2948,125457,36356,3502,75270,27622,127192,2561,123095,49394,61155,16897,110064,9699,89448,53356,19628,220310,21622,83036,9885,112214,6087,26713,17901,161912,91492,3440,68594,9266,92238,8087,6866,150194,72175,80701,13459,31836,43243,239700,95846,44749,50647,21945,230538,120612,132371,244604,5193,105637,34661,41341,68775,85393,1874,8771,33718,49672,77403,595452,99507,6490,58895,128742,7704,39239,73217,43816,62824,37804,199976,22361,80005,87514,94832,14089,4574,139975,59142,75523,100268,43906,53442,15152,2547,186002,17011,19513,204282,3343,60568,128318,119250,4298,51871,41336,71759,21921,45074,98169,145889,99427,11350,1237,5520,28799,7803,53702,21026,136352,38293,128690,12158,90132,44600,10184,26957,39459,126025,78904,82999,59373,39301,150198,120529,153042,20177,50089,14764,271571,30530,123161,38975,101562,22941,5648,124654,109243,69817,71675,49162,106884,21241,107795,30258,16572,188262,141456,7688,60718,8271,11044,32440,104608,103419,236109,93156,43293,128929,42107,67180,25201,115254,185488,130954,72813,167547,20537,39969,38432,22582,184022,1139,27199,5655,17767,97412,122606,209377,27070,35871,326617,188954,42680,73512,80911,22629,3011,95021,315242,157737,383,41821,41808,19335,27950,15674,25677,110950,35375,76835,59108,57370,35262,16569,160415,37706,78086,32041,49691,137143,9782,172080,50148,77917,6323,10110,69172,17711,21795,59511,76184,135114,31046,132319,59105,157578,20549,80778,57649,158421,65143,4575,72235,21899,10797,92745,34035,106079,80159,4508,78304,25350,75457,46458,32937,25623,47,8531,104751,84953,8138,36508,187199,66310,115274,13253,32461,38536,1916,42007,187160,35055,26325,84394,35963,94216,45590,97782];class jE{log;peerRouting;routingTable;refreshInterval;refreshQueryTimeout;commonPrefixLengthRefreshedAt;refreshTimeoutId;constructor(e,t){const{peerRouting:n,routingTable:r,refreshInterval:s,refreshQueryTimeout:i,logPrefix:o}=t;this.log=e.logger.forComponent(`${o}:routing-table:refresh`),this.peerRouting=n,this.routingTable=r,this.refreshInterval=s??3e5,this.refreshQueryTimeout=i??3e4,this.commonPrefixLengthRefreshedAt=[],this.refreshTable=this.refreshTable.bind(this)}async afterStart(){this.log(`refreshing routing table every ${this.refreshInterval}ms`),this.refreshTable(!0)}async stop(){null!=this.refreshTimeoutId&&clearTimeout(this.refreshTimeoutId)}refreshTable(e=!1){this.log("refreshing routing table");const t=this._maxCommonPrefix(),n=this._getTrackedCommonPrefixLengthsForRefresh(t);this.log(`max common prefix length ${t}`),this.log(`tracked CPLs [ ${n.map((e=>e.toISOString())).join(", ")} ]`),Promise.all(n.map((async(r,s)=>{try{if(await this._refreshCommonPrefixLength(s,r,e),0===this._numPeersForCpl(t)){const t=Math.min(2*(s+1),n.length-1);for(let n=s+1;n<t+1;n++)try{await this._refreshCommonPrefixLength(n,r,e)}catch(e){this.log.error(e)}}}catch(e){this.log.error(e)}}))).catch((e=>{this.log.error(e)})).then((()=>{this.refreshTimeoutId=setTimeout(this.refreshTable,this.refreshInterval),null!=this.refreshTimeoutId.unref&&this.refreshTimeoutId.unref()})).catch((e=>{this.log.error(e)}))}async _refreshCommonPrefixLength(e,t,n){if(!n&&t.getTime()>Date.now()-this.refreshInterval)return void this.log("not running refresh for cpl %s as time since last refresh not above interval",e);const r=await this._generateRandomPeerId(e);this.log("starting refreshing cpl %s with key %p (routing table size was %s)",e,r,this.routingTable.size);const s=AbortSignal.timeout(this.refreshQueryTimeout),i=await FE(this.peerRouting.getClosestPeers(r.toBytes(),{signal:s}));this.log(`found ${i} peers that were close to imaginary peer %p`,r),this.log("finished refreshing cpl %s with key %p (routing table size is now %s)",e,r,this.routingTable.size)}_getTrackedCommonPrefixLengthsForRefresh(e){e>15&&(e=15);const t=[];for(let n=0;n<=e;n++)t[n]=this.commonPrefixLengthRefreshedAt[n]??new Date;return t}async _generateRandomPeerId(e){if(null==this.routingTable.kb)throw new Error("Routing table not started");const t=Lo(2),n=(t[1]<<8)+t[0];return Rs(await this._makePeerId(this.routingTable.kb.localPeer.kadId,n,e))}async _makePeerId(e,t,n){if(n>15)throw new Error("Cannot generate peer ID for common prefix length greater than 15");const r=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint16(0,!1),s=65535<<16-(n+1),i=WE[(r^32768>>n)&s|t&~s],o=new ArrayBuffer(34),a=new DataView(o,0,o.byteLength);return a.setUint8(0,gt.code),a.setUint8(1,32),a.setUint32(2,i,!1),new Uint8Array(a.buffer,a.byteOffset,a.byteLength)}_maxCommonPrefix(){let e=0;for(const t of this._prefixLengths())t>e&&(e=t);return e}_numPeersForCpl(e){let t=0;for(const n of this._prefixLengths())n===e&&t++;return t}*_prefixLengths(){if(null!=this.routingTable.kb)for(const{kadId:e}of this.routingTable.kb.toIterable()){const t=wm(this.routingTable.kb.localPeer.kadId,e);let n=0;for(const e of t){if(0!==e)break;n++}yield n}}}class GE{providers;log;constructor(e,t){this.log=e.logger.forComponent(`${t.logPrefix}:rpc:handlers:add-provider`),this.providers=t.providers}async handle(e,t){if(this.log("start"),null==t.key||0===t.key.length)throw new fn("Missing key","ERR_MISSING_KEY");let n;try{n=bt.decode(t.key)}catch(e){throw new fn("Invalid CID","ERR_INVALID_CID")}null!=t.providers&&0!==t.providers.length||this.log.error("no providers found in message"),await Promise.all(t.providers.map((async t=>{e.equals(t.id)?t.multiaddrs.length<1?this.log("no valid addresses for provider %p. Ignore",e):(this.log("received provider %p for %s (addrs %s)",e,n,t.multiaddrs.map((e=>cr(e).toString()))),await this.providers.addProvider(n,Rs(t.id))):this.log("invalid provider peer %p from %p",t.id,e)})))}}class YE{peerRouting;peerInfoMapper;peerId;addressManager;log;constructor(e,t){const{peerRouting:n,logPrefix:r}=t;this.log=e.logger.forComponent(`${r}:rpc:handlers:find-node`),this.peerId=e.peerId,this.addressManager=e.addressManager,this.peerRouting=n,this.peerInfoMapper=t.peerInfoMapper}async handle(e,t){if(this.log("incoming request from %p for peers closer to %b",e,t.key),null==t.key)throw new fn("Invalid FIND_NODE message received - key was missing","ERR_INVALID_MESSAGE");const n=await this.peerRouting.getCloserPeersOffline(t.key,e);In(this.peerId.toBytes(),t.key)&&n.push({id:this.peerId,multiaddrs:this.addressManager.getAddresses().map((e=>e.decapsulateCode(Fn("p2p").code)))});const r={type:tE.FIND_NODE,clusterLevel:t.clusterLevel,closer:n.map(this.peerInfoMapper).filter((({multiaddrs:e})=>e.length)).map((e=>({id:e.id.toBytes(),multiaddrs:e.multiaddrs.map((e=>e.bytes))}))),providers:[]};return 0===r.closer.length&&this.log("could not find any peers closer to %b than %p",t.key,e),r}}class QE{peerRouting;providers;peerStore;peerInfoMapper;log;constructor(e,t){const{peerRouting:n,providers:r,logPrefix:s}=t;this.log=e.logger.forComponent(`${s}:rpc:handlers:get-providers`),this.peerStore=e.peerStore,this.peerRouting=n,this.providers=r,this.peerInfoMapper=t.peerInfoMapper}async handle(e,t){if(null==t.key)throw new fn("Invalid GET_PROVIDERS message received - key was missing","ERR_INVALID_MESSAGE");let n;try{n=bt.decode(t.key)}catch(e){throw new fn("Invalid CID","ERR_INVALID_CID")}this.log("%p asking for providers for %s",e,n);const[r,s]=await Promise.all([this.providers.getProviders(n),this.peerRouting.getCloserPeersOffline(t.key,e)]),i=await this._getPeers(r),o=await this._getPeers(s.map((({id:e})=>e))),a={type:tE.GET_PROVIDERS,key:t.key,clusterLevel:t.clusterLevel,closer:o.map(this.peerInfoMapper).filter((({multiaddrs:e})=>e.length)).map((e=>({id:e.id.toBytes(),multiaddrs:e.multiaddrs.map((e=>e.bytes))}))),providers:i.map(this.peerInfoMapper).filter((({multiaddrs:e})=>e.length)).map((e=>({id:e.id.toBytes(),multiaddrs:e.multiaddrs.map((e=>e.bytes))})))};return this.log("got %s providers %s closerPeers",a.providers.length,a.closer.length),a}async _getAddresses(e){return[]}async _getPeers(e){const t=[];for(const n of e)try{const e=await this.peerStore.get(n),r=this.peerInfoMapper({id:n,multiaddrs:e.addresses.map((({multiaddr:e})=>e))});r.multiaddrs.length>0&&t.push(r)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}return t}}class JE{peerStore;datastore;peerRouting;log;constructor(e,t){this.log=e.logger.forComponent(`${t.logPrefix}:rpc:handlers:get-value`),this.peerStore=e.peerStore,this.datastore=e.datastore,this.peerRouting=t.peerRouting}async handle(e,t){const n=t.key;if(this.log("%p asked for key %b",e,n),null==n||0===n.length)throw new fn("Invalid key","ERR_INVALID_KEY");const r={type:tE.GET_VALUE,key:n,clusterLevel:t.clusterLevel,closer:[],providers:[]};if(function(e){return"/pk/"===Qt(e.subarray(0,4))}(n)){this.log("is public key");const e=function(e){return Rs(e.subarray(4))}(n);let t;try{const n=await this.peerStore.get(e);if(null==n.id.publicKey)throw new fn("No public key found in key book","ERR_NOT_FOUND");t=n.id.publicKey}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}if(null!=t)return this.log("returning found public key"),r.record=new cE(n,t,new Date).serialize(),r}const[s,i]=await Promise.all([this._checkLocalDatastore(n),this.peerRouting.getCloserPeersOffline(n,e)]);return null!=s&&(this.log("had record for %b in local datastore",n),r.record=s.serialize()),i.length>0&&(this.log("had %s closer peers in routing table",i.length),r.closer=i.map((e=>({id:e.id.toBytes(),multiaddrs:e.multiaddrs.map((e=>e.bytes))})))),r}async _checkLocalDatastore(e){this.log("checkLocalDatastore looking for %b",e);const t=_E(e);let n;try{n=await this.datastore.get(t)}catch(e){if("ERR_NOT_FOUND"===e.code)return;throw e}const r=cE.deserialize(n);if(null==r)throw new fn("Invalid record","ERR_INVALID_RECORD");if(!(null==r.timeReceived||Date.now()-r.timeReceived.getTime()>Gv))return r;await this.datastore.delete(t)}}class ZE{log;constructor(e,t){this.log=e.logger.forComponent(`${t.logPrefix}:rpc:handlers:ping`)}async handle(e,t){return this.log("ping from %p",e),t}}class XE{components;validators;log;constructor(e,t){const{validators:n}=t;this.components=e,this.log=e.logger.forComponent(`${t.logPrefix}:rpc:handlers:put-value`),this.validators=n}async handle(e,t){const n=t.key;if(this.log("%p asked us to store value for key %b",e,n),null==t.record){const t=`Empty record from: ${e.toString()}`;throw this.log.error(t),new fn(t,"ERR_EMPTY_RECORD")}try{const e=cE.deserialize(t.record);await yE(this.validators,e),e.timeReceived=new Date;const r=_E(e.key);await this.components.datastore.put(r,e.serialize().subarray()),this.log("put record for %b into datastore under key %k",n,r)}catch(e){this.log("did not put record for key %b into datastore %o",n,e)}return t}}class eS{handlers;routingTable;log;constructor(e,t){const{providers:n,peerRouting:r,validators:s,logPrefix:i,peerInfoMapper:o}=t;this.log=e.logger.forComponent(`${i}:rpc`),this.routingTable=t.routingTable,this.handlers={[tE.GET_VALUE.toString()]:new JE(e,{peerRouting:r,logPrefix:i}),[tE.PUT_VALUE.toString()]:new XE(e,{validators:s,logPrefix:i}),[tE.FIND_NODE.toString()]:new YE(e,{peerRouting:r,logPrefix:i,peerInfoMapper:o}),[tE.ADD_PROVIDER.toString()]:new GE(e,{providers:n,logPrefix:i}),[tE.GET_PROVIDERS.toString()]:new QE(e,{peerRouting:r,providers:n,logPrefix:i,peerInfoMapper:o}),[tE.PING.toString()]:new ZE(e,{logPrefix:i})}}async handleMessage(e,t){try{await this.routingTable.add(e)}catch(e){this.log.error("Failed to update the kbucket store",e)}const n=this.handlers[t.type];if(null!=n)return n.handle(e,t);this.log.error(`no handler found for message type: ${t.type}`)}onIncomingStream(e){Promise.resolve().then((async()=>{const{stream:t,connection:n}=e,r=n.remotePeer;try{await this.routingTable.add(r)}catch(e){this.log.error(e)}const s=this;await gr(t,(e=>qr(e)),(async function*(e){for await(const t of e){const e=oE.decode(t);s.log("incoming %s from %p",e.type,r);const n=await s.handleMessage(r,e);null!=n&&(yield oE.encode(n))}}),(e=>Or(e)),t)})).catch((e=>{this.log.error(e)}))}}class tS extends wn{log;components;protocol;running;registrarId;constructor(e,t){super();const{protocol:n,logPrefix:r}=t;this.components=e,this.log=e.logger.forComponent(`${r}:topology-listener`),this.running=!1,this.protocol=n}isStarted(){return this.running}async start(){this.running||(this.running=!0,this.registrarId=await this.components.registrar.register(this.protocol,{onConnect:e=>{this.log("observed peer %p with protocol %s",e,this.protocol),this.dispatchEvent(new vn("peer",{detail:e}))}}))}async stop(){this.running=!1,null!=this.registrarId&&(this.components.registrar.unregister(this.registrarId),this.registrarId=void 0)}}class nS{dht;constructor(e){this.dht=e}async provide(e,t={}){await Od(this.dht.provide(e,t))}async*findProviders(e,t={}){for await(const n of this.dht.findProviders(e,t))"PROVIDER"===n.name&&(yield*n.providers)}async put(e,t,n){await Od(this.dht.put(e,t,n))}async get(e,t){for await(const n of this.dht.get(e,t))if("VALUE"===n.name)return n.value;throw new fn("Not found","ERR_NOT_FOUND")}}class rS{dht;constructor(e){this.dht=e}async findPeer(e,t={}){for await(const n of this.dht.findPeer(e,t))if("FINAL_PEER"===n.name)return n.peer;throw new fn("Not found","ERR_NOT_FOUND")}async*getClosestPeers(e,t={}){for await(const n of this.dht.getClosestPeers(e,t))"FINAL_PEER"===n.name&&(yield n.peer)}}class sS extends wn{protocol;routingTable;providers;network;peerRouting;components;log;running;kBucketSize;clientMode;validators;selectors;queryManager;contentFetching;contentRouting;routingTableRefresh;rpc;topologyListener;querySelf;maxInboundStreams;maxOutboundStreams;dhtContentRouting;dhtPeerRouting;peerInfoMapper;constructor(e,t){super();const{kBucketSize:n,clientMode:r,validators:s,selectors:i,querySelfInterval:o,protocol:a,logPrefix:c,pingTimeout:l,pingConcurrency:u,maxInboundStreams:h,maxOutboundStreams:d,providers:p}=t,f=c??"libp2p:kad-dht";this.running=!1,this.components=e,this.log=e.logger.forComponent(f),this.protocol=a??"/ipfs/kad/1.0.0",this.kBucketSize=n??20,this.clientMode=r??!0,this.maxInboundStreams=h??32,this.maxOutboundStreams=d??64,this.peerInfoMapper=t.peerInfoMapper??vE,this.routingTable=new zE(e,{kBucketSize:n,pingTimeout:l,pingConcurrency:u,protocol:this.protocol,logPrefix:f}),this.providers=new ME(e,p??{}),this.validators={...wE,...s},this.selectors={...mE,...i},this.network=new PE(e,{protocol:this.protocol,logPrefix:f});const g=lr();!0===t.allowQueryWithZeroPeers&&g.resolve(),this.queryManager=new UE(e,{disjointPaths:Math.ceil(this.kBucketSize/2),logPrefix:f,initialQuerySelfHasRun:g,routingTable:this.routingTable}),this.peerRouting=new NE(e,{routingTable:this.routingTable,network:this.network,validators:this.validators,queryManager:this.queryManager,logPrefix:f}),this.contentFetching=new RE(e,{validators:this.validators,selectors:this.selectors,peerRouting:this.peerRouting,queryManager:this.queryManager,network:this.network,logPrefix:f}),this.contentRouting=new TE(e,{network:this.network,peerRouting:this.peerRouting,queryManager:this.queryManager,routingTable:this.routingTable,providers:this.providers,logPrefix:f}),this.routingTableRefresh=new jE(e,{peerRouting:this.peerRouting,routingTable:this.routingTable,logPrefix:f}),this.rpc=new eS(e,{routingTable:this.routingTable,providers:this.providers,peerRouting:this.peerRouting,validators:this.validators,logPrefix:f,peerInfoMapper:this.peerInfoMapper}),this.topologyListener=new tS(e,{protocol:this.protocol,logPrefix:f}),this.querySelf=new VE(e,{peerRouting:this.peerRouting,interval:o,initialInterval:t.initialQuerySelfInterval,logPrefix:f,initialQuerySelfHasRun:g,routingTable:this.routingTable}),this.network.addEventListener("peer",(e=>{const t=e.detail;this.onPeerConnect(t).catch((e=>{this.log.error("could not add %p to routing table",t.id,e)})),this.dispatchEvent(new vn("peer",{detail:t}))})),this.topologyListener.addEventListener("peer",(e=>{const t=e.detail;Promise.resolve().then((async()=>{const e=await this.components.peerStore.get(t),n={id:t,multiaddrs:e.addresses.map((({multiaddr:e})=>e)),protocols:e.protocols};await this.onPeerConnect(n)})).catch((e=>{this.log.error("could not add %p to routing table",t,e)}))})),this.dhtPeerRouting=new rS(this),this.dhtContentRouting=new nS(this),null==t.clientMode&&e.events.addEventListener("self:peer:update",(e=>{this.log("received update of self-peer info"),Promise.resolve().then((async()=>{const t=e.detail.peer.addresses.some((({multiaddr:e})=>function(e){const t=e.stringTuples();for(const e of t)if(290===e[0])return!1;if(54===t[0][0]||55===t[0][0]||56===t[0][0])return!0;if(4===t[0][0]||41===t[0][0]){const e=Jd(`${t[0][1]}`);return null==e||!e}return!1}(e))),n=this.getMode();t&&"client"===n?await this.setMode("server"):"server"!==n||t||await this.setMode("client")})).catch((e=>{this.log.error("error setting dht server mode",e)}))}))}get[nn](){return this.dhtContentRouting}get[an](){return this.dhtPeerRouting}get[rn](){return this}async onPeerConnect(e){if(this.log("peer %p connected",e.id),0!==(e=this.peerInfoMapper(e)).multiaddrs.length)try{await this.routingTable.add(e.id)}catch(t){this.log.error("could not add %p to routing table",e.id,t)}else this.log("ignoring %p as there were no valid addresses in %s after filtering",e.id,e.multiaddrs.map((e=>e.toString())))}isStarted(){return this.running}getMode(){return this.clientMode?"client":"server"}async setMode(e){await this.components.registrar.unhandle(this.protocol),"client"===e?(this.log("enabling client mode"),this.clientMode=!0):(this.log("enabling server mode"),this.clientMode=!1,await this.components.registrar.handle(this.protocol,this.rpc.onIncomingStream.bind(this.rpc),{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams}))}async start(){this.running=!0,await this.setMode(this.clientMode?"client":"server"),await async function(...e){const t=[];for(const n of e)En(n)&&t.push(n);await Promise.all(t.map((async e=>{null!=e.beforeStart&&await e.beforeStart()}))),await Promise.all(t.map((async e=>{await e.start()}))),await Promise.all(t.map((async e=>{null!=e.afterStart&&await e.afterStart()})))}(this.querySelf,this.providers,this.queryManager,this.network,this.routingTable,this.topologyListener,this.routingTableRefresh)}async stop(){this.running=!1,await async function(...e){const t=[];for(const n of e)En(n)&&t.push(n);await Promise.all(t.map((async e=>{null!=e.beforeStop&&await e.beforeStop()}))),await Promise.all(t.map((async e=>{await e.stop()}))),await Promise.all(t.map((async e=>{null!=e.afterStop&&await e.afterStop()})))}(this.querySelf,this.providers,this.queryManager,this.network,this.routingTable,this.routingTableRefresh,this.topologyListener)}async*put(e,t,n={}){yield*this.contentFetching.put(e,t,n)}async*get(e,t={}){yield*this.contentFetching.get(e,t)}async*provide(e,t={}){yield*this.contentRouting.provide(e,this.components.addressManager.getAddresses(),t)}async*findProviders(e,t={}){yield*this.contentRouting.findProviders(e,t)}async*findPeer(e,t={}){yield*this.peerRouting.findPeer(e,t)}async*getClosestPeers(e,t={}){yield*this.peerRouting.getClosestPeers(e,t)}async refreshRoutingTable(){this.routingTableRefresh.refreshTable(!0)}}var iS;function oS(e){return t=>new sS(t,e)}!function(e){e[e.SEND_QUERY=0]="SEND_QUERY",e[e.PEER_RESPONSE=1]="PEER_RESPONSE",e[e.FINAL_PEER=2]="FINAL_PEER",e[e.QUERY_ERROR=3]="QUERY_ERROR",e[e.PROVIDER=4]="PROVIDER",e[e.VALUE=5]="VALUE",e[e.ADD_PEER=6]="ADD_PEER",e[e.DIAL_PEER=7]="DIAL_PEER"}(iS||(iS={}));const aS=fs("libp2p:simple-metrics");class cS{value=0;update(e){this.value=e}increment(e=1){this.value+=e}decrement(e=1){this.value-=e}reset(){this.value=0}timer(){const e=Date.now();return()=>{this.value=Date.now()-e}}}class lS{values={};update(e){Object.entries(e).forEach((([e,t])=>{this.values[e]=t}))}increment(e){Object.entries(e).forEach((([e,t])=>{this.values[e]=this.values[e]??0;const n="number"==typeof t?t:1;this.values[e]+=Number(n)}))}decrement(e){Object.entries(e).forEach((([e,t])=>{this.values[e]=this.values[e]??0;const n="number"==typeof t?t:1;this.values[e]-=Number(n)}))}reset(){this.values={}}timer(e){const t=Date.now();return()=>{this.values[e]=Date.now()-t}}}class uS{metrics=new Map;transferStats;started;interval;intervalMs;onMetrics;constructor(e,t){this.started=!1,this._emitMetrics=this._emitMetrics.bind(this),this.intervalMs=t.intervalMs??1e3,this.onMetrics=t.onMetrics,this.transferStats=new Map}isStarted(){return this.started}start(){this.started=!0,this.interval=setInterval(this._emitMetrics,this.intervalMs)}stop(){this.started=!1,clearInterval(this.interval)}_emitMetrics(){Promise.resolve().then((async()=>{const e={};for(const[t,n]of this.metrics.entries())e[t]=n instanceof cS?n.value:n instanceof lS?n.values:await n();this.onMetrics(structuredClone(e))})).catch((e=>{aS.error("could not invoke onMetrics callback",e)}))}_incrementValue(e,t){const n=this.transferStats.get(e)??0;this.transferStats.set(e,n+t)}_track(e,t){const n=this,r=e.sink;e.sink=async function(e){await r(ub(e,(e=>{n._incrementValue(`${t} sent`,e.byteLength)})))};const s=e.source;e.source=ub(s,(e=>{n._incrementValue(`${t} received`,e.byteLength)}))}trackMultiaddrConnection(e){this._track(e,"global")}trackProtocolStream(e,t){null!=e.protocol&&this._track(e,e.protocol)}registerMetric(e,t={}){if(null==e||""===e.trim())throw new Error("Metric name is required");if(null!=t?.calculate)return void this.metrics.set(e,t.calculate);const n=new cS;return this.metrics.set(e,n),n}registerMetricGroup(e,t={}){if(null==e||""===e.trim())throw new Error("Metric name is required");if(null!=t?.calculate)return void this.metrics.set(e,t.calculate);const n=new lS;return this.metrics.set(e,n),n}registerCounter(e,t={}){if(null==e||""===e.trim())throw new Error("Metric name is required");if(null!=t?.calculate)return void this.metrics.set(e,t.calculate);const n=new cS;return this.metrics.set(e,n),n}registerCounterGroup(e,t={}){if(null==e||""===e.trim())throw new Error("Metric name is required");if(null!=t?.calculate)return void this.metrics.set(e,t.calculate);const n=new lS;return this.metrics.set(e,n),n}}function hS(e){return t=>new uS(t,e)}
|
|
82
82
|
//! WebPEER.js -- https://github.com/nuzulul/webpeerjs
|
|
83
|
-
class uS{#V;#K;#$;#q;#H;#z;#W;#j;#G;#Y;#Q;#Z;#J;#X;#ee;#te;#ne;#re;#se;#ie;#oe;#ae;id;status;IPFS;address;peers;constructor(e,r,a){this.#V=e,this.#H=r,this.#z=new Map,this.#K=new Map,this.#$=[],this.#q=new Map,this.#W=new Map,this.#j=!1,this.#G=new Map,this.address=[],this.#Y={},this.#Q=new Map,this.#Z=[],this.#J=new Map,this.#X=new Map,this.#ee=new Map,this.#te=[],this.#ne=!0,this.#re=[],this.#se=new Map,this.#ie=(new Date).getTime(),this.#oe=(new Date).getTime(),this.#ae=[],this.peers=this.#Z,this.status=function(e){return e.status}(this.#V),this.status="unconnected",this.IPFS=function(e,t){return{libp2p:e,discoveredPeers:t}}(this.#V,this.#K),this.id=this.#V.peerId.toString();for(const e of o)this.#V.services.pubsub.subscribe(e);for(const e of s)this.#V.services.pubsub.subscribe(e);this.#V.addEventListener("peer:connect",(async e=>{const t=e.detail.toString(),n=this.#V.getConnections().map((e=>({id:e.remotePeer.toString(),addr:e.remoteAddr.toString()}))).find((e=>e.id==t)).addr;if(g.includes(t)&&(this.#X.has(t)&&!this.#X.get(t).includes("/wss/")||!n.includes("webtransport")||await this.#H.put(new en(t),(new TextEncoder).encode(n))),this.#X.set(t,n),f.includes(t)&&setTimeout((()=>{this.#ce(),this.#le(),setTimeout((()=>{this.#ce(),this.#le()}),5e3)}),1e3),this.#$.includes(t)){setTimeout((()=>{this.#ue()}),1e4),setTimeout((()=>{this.#ue()}),15e3);let e=[n];if(this.#Q.has(t)){const n={addrs:e,last:(new Date).getTime()};this.#Q.set(t,n)}else if(this.#oe<1e4){this.#he(t);const n={addrs:e,last:(new Date).getTime()};this.#Q.set(t,n),this.#de()}}})),this.#V.services.pubsub.addEventListener("message",(e=>{if("signed"===e.detail.type){const n=e.detail.topic,r=e.detail.from.toString();try{if((n===o||i.includes(n))&&(this.#oe=(new Date).getTime()),i.includes(n)){const e=(new Date).getTime(),t=15e3;e-this.#ie>t&&this.#le(),this.#ie=e}if(this.#$.includes(r)){if(this.#Q.has(r)){const e=this.#Q.get(r).addrs,t={addrs:e,last:(new Date).getTime()};this.#Q.set(r,t)}else if(this.#oe<1e4){this.#he(r);const e=this.#q.get(r),t={addrs:e,last:(new Date).getTime()};this.#Q.set(r,t),this.#de()}if(!this.#pe(r))if(this.#X.has(r)){let e=[];const t=cr(this.#X.get(r));e.push(t),this.#fe(e)}else if(this.#K.has(r)){const e=this.#K.get(r);let t=[];for(const n of e){if(!n.includes("webrtc"))continue;const e=cr(n);t.push(e)}this.#fe(t)}else if(this.#Q.has(r)){const e=this.#Q.get(r).addrs;let t=[];for(const n of e){if(!n.includes("webrtc"))continue;const e=cr(n);t.push(e)}this.#fe(t)}}const s=Yt.decode(e.detail.data);if(s.addrs.length>1&&this.#V.getPeers().length<50){let e=[];for(const t of s.addrs){const n=cr(t);n.toString().includes("webtransport")&&n.toString().includes("certhash")&&e.push(n)}this.#fe(e)}const a=Yr(s.addrs[0]),c=JSON.parse(a),l=c.prefix,u=c.room,h=c.rooms,d=c.message,p=c.msgId,f=c.signal,g=c.id,m=c.address;if(g!=r)return;if(l===t){if(this.#oe=(new Date).getTime(),this.#$.includes(g)||this.#$.push(g),this.#Q.has(g))m&&m.length>0&&this.#q.set(g,m);else{this.#he(g);const e={addrs:m,last:(new Date).getTime()};this.#Q.set(g,e),m&&m.length>0&&this.#q.set(g,m),this.#de()}if(u&&this.#Y[u]&&(this.#Y[u].members.includes(g)||this.#Q.has(g)&&(this.#Y[u].members.push(g),this.#Y[u].onMembers(this.#Y[u].members)),d)){const e=p+g;this.#re.includes(e)||(this.#re.push(e),this.#Y[u].onMessage(d,g))}if(h)for(const e of h)this.#Y[e]&&(this.#Y[e].members.includes(g)||this.#Q.has(g)&&(this.#Y[e].members.push(g),this.#Y[e].onMembers(this.#Y[e].members)));f&&"announce"==f&&setTimeout((()=>{this.#ue("")}),1e3)}else if("hybrid"===l){const e=25;if(m.length>0&&(!this.#X.has(g)||this.#Q.size<e)){let e=[];for(const t of m){const n=cr(t);e.push(n)}this.#fe(e)}}}catch(e){Gr(e)}}})),this.#V.addEventListener("peer:discovery",(e=>{const t=e.detail.multiaddrs,n=e.detail.id;if(0!=t.length){let r=[];for(const s of t){let i;i=t.toString().includes(e.detail.id.toString())?s.toString():s.toString()+"/p2p/"+n,r.push(i)}if(this.#K.set(n.toString(),r),t.toString().includes("certhash")&&t.toString().includes("webtransport")&&t.toString().includes("p2p-circuit")&&!this.#X.has(n)){let e=[];for(const t of r){if(!t.includes("webrtc"))continue;const n=cr(t);e.push(n)}this.#fe(e)}}})),this.#V.addEventListener("peer:disconnect",(async e=>{const t=e.detail.string;if(this.#ee.has(t)){let e=this.#ee.get(t);if(e++,this.#ee.set(t,e),e>5){if(p.includes(t))return}else if(e>10&&(this.#z.has(t)&&this.#z.delete(t),!this.#$.includes(t)&&!this.#G.has(t)))return}else this.#ee.set(t,0);let n=[];for(const e of this.#se.values())n.push(e.id);if(this.#$.includes(t)){let e=[];const n=cr(this.#X.get(t));e.push(n),this.#fe(e)}else if(this.#G.has(t)){const e=this.#X.get(t);if(e.includes("/wss/"))return;let n=[];const r=cr(e);n.push(r),this.#fe(n)}else if(n.includes(t)){let e=[];const n=cr(this.#X.get(t));e.push(n),this.#fe(e)}else{cr(this.#X.get(t))}})),this.#V.addEventListener("self:peer:update",(({detail:{peer:e}})=>{const t=e.id.toString(),n=[];e.addresses.forEach((e=>{const r=e.multiaddr.toString()+"/p2p/"+t;r.includes("webtransport")&&r.includes("certhash")&&n.push(r)})),this.address=n,this.#ue(),this.#ce()})),this.#V.addEventListener("peer:identify",(async e=>{const t=e.detail.peerId.toString();if(p.includes(t)){if(e.detail.connection.remoteAddr.toString().includes("/wss/")){let n=[],r=[];for(const s of e.detail.listenAddrs){if(!s.toString().includes("webtransport"))continue;const e=s.toString()+"/p2p/"+t,i=cr(e);n.push(e),r.push(i)}this.#G.set(t,n),await this.#V.hangUp(Ss(t)),this.#fe(r)}}if(e.detail.protocols.includes(n)){const t=e.detail.peerId.toString();let n=[];for(const r of e.detail.listenAddrs){const e=r.toString()+"/p2p/"+t;cr(e),e.includes("webtransport")&&n.push(e)}if(this.#Q.has(t)){const e={addrs:n,last:(new Date).getTime()};this.#Q.set(t,e)}const r="peer-exchange";this.#ge(t,r)}})),this.#me(),this.#ye(),this.#we(),this.#be(),this.#ve(),a((e=>{const t=function(e){try{const t=e.libp2p_webtransport_dialer_events_total,n=(t.pending??0)-(ts.pending??0),r=(t.ready_error??0)-(ts.ready_error??0),s=(t.noise_error??0)-(ts.noise_error??0),i=(t.upgrade_error??0)-(ts.upgrade_error??0),o=(t.close??0)-(ts.close??0),a=(t.ready??0)-(ts.ready??0),c=(t.abort??0)-(ts.abort??0),l=(t.ready_timeout??0)-(ts.ready_timeout??0),u=(t.noise_timeout??0)-(ts.noise_timeout??0),h=(t.open??0)-(ts.open??0),d=(t.remote_close??0)-(ts.remote_close??0);es.pending+=n,es.pending-=l,es.pending-=u,es.pending-=r,es.pending-=s,es.pending-=i,es.pending-=h,es.open+=h,es.open-=o,es.open-=d,es.open-=c,es.ready_error=r,es.noise_error=s,es.upgrade_error=i,es.ready_timeout=l,es.noise_timeout=u,es.close=o,es.abort=c,es.remote_close=d,Xr.success+=a,Xr.readyErrored+=r,Xr.noiseErrored+=s,Xr.upgradeErrored+=i,Xr.readyTimedout+=l,Xr.noiseTimedout+=u;const p=Xr.readyErrored+Xr.noiseErrored+Xr.upgradeErrored,f=Xr.readyTimedout+Xr.noiseTimedout;return ts=t,ss=p+f,es.open,es.pending,ss-rs>30&&ns&&(ns=!1,console.warn("Peer dial is temporary disabled"),setTimeout((()=>{ns||(ns=!0,rs=ss,console.warn("Peer dial is enabled"))}),36e4)),ns}catch{console.debug("Metrics error")}}(e);this.#ne=t})),setTimeout((()=>{this.#Ee(),setInterval((()=>{this.#Ee()}),5e3)}),1e4),setInterval((()=>{this.#Se()}),5e3),setInterval((()=>{this.#ce(),this.#_e(),this.#Ie()}),1e4)}#Re=()=>{};onConnect=e=>this.#Re=e;#Ae=()=>{};onDisconnect=e=>this.#Ae=e;joinRoom=e=>{if(this.#Y[e])return[this.#Y[e].sendMessage,this.#Y[e].listenMessage,this.#Y[e].onMembersChange];if(!e)throw jr("room is required");{let n=[];n=o,this.#Y[e]={onMessage:()=>{},listenMessage:t=>this.#Y[e]={...this.#Y[e],onMessage:t},sendMessage:async r=>{const s=(new Date).getTime(),i=Qr(JSON.stringify({prefix:t,room:e,message:r,id:this.#V.peerId.toString(),msgId:s}));if(i.byteLength>10240)throw jr("message too large");const o={publicKey:this.#V.peerId.publicKey,addrs:[i]},a=Yt.encode(o);for(const e of n)await this.#V.services.pubsub.publish(e,a)},members:[this.id],onMembers:()=>{},onMembersChange:t=>{this.#Y[e]={...this.#Y[e],onMembers:t},this.#Y[e].onMembers(this.#Y[e].members),this.#ue()}}}return[this.#Y[e].sendMessage,this.#Y[e].listenMessage,this.#Y[e].onMembersChange]};dial(e){let t=[];const n=cr(e);t.push(n),this.#fe(t)}#_e(){let e=!1;for(const t of f)this.#pe(t)&&(e=!0);if(!e)for(const e of f)if("connected"!==this.status&&this.#X.has(e)){let t=[];const n=cr(this.#X.get(e));t.push(n),this.#fe(t)}}#Ie(){if("connected"===this.status)return;if(this.#q.size<1)return;const e=Array.from(this.#q.keys()),t=e[Math.floor(Math.random()*e.length)],n=this.#q.get(t);let r=[];for(const e of n){const t=cr(e);r.push(t)}this.#fe(r)}#he(e){this.#ae.includes(e)||(this.#ae.push(e),this.#Re(e),setTimeout((()=>{const t=this.#ae.indexOf(e);t>-1&&this.#ae.splice(t,1)}),5e3))}#de(){this.#Z.length=0;for(const e of this.#Q){const t={id:e[0],address:e[1].addrs};this.#Z.push(t)}this.#Q.size>0?this.status="connected":this.status="unconnected",this.#ue()}async#ve(){await this.#V.handle(n,(async({connection:e,stream:t})=>{try{const r=await gr(t.source,(e=>qr(e)),(e=>zr(e,(e=>Yr(e.subarray())))),(async function(e){let t="";for await(const n of e)t+=n.toString();return t})),s=e.remotePeer.toString();let i=JSON.parse(r),o={protocol:n,command:null,data:null};if("peer-exchange"===i.command){if(i.protocol==n){const t=[e.remoteAddr.toString()];if(this.#Q.has(s)){const e={addrs:t,last:(new Date).getTime()};this.#Q.set(s,e)}else{this.#$.includes(s)||this.#$.push(s),this.#he(s);const e={addrs:t,last:(new Date).getTime()};this.#Q.set(s,e),this.#de()}}if(null!=i.data){this.#se.set(s,i.data);let e=[];const t=cr(i.data.addr),n=i.data.id;e.push(t),this.#fe(e),this.#z.has(n)}const t=Array.from(this.#z.keys()),r=t[Math.floor(Math.random()*t.length)],a=this.#z.get(r);o.command=i.command,o.data={id:r,addr:a}}gr(JSON.stringify(o),(e=>zr(e,(e=>Qr(e)))),(e=>Or(e)),t.sink)}catch(e){Gr(e)}}),{maxInboundStreams:100,maxOutboundStreams:100,runOnTransientConnection:h}),await this.#V.register(n,{})}async#ge(e,t){const r=this.#V.getConnections().map((e=>({id:e.remotePeer.toString(),addr:e.remoteAddr.toString()}))).find((t=>t.id==e)).addr,s=cr(r);let i={protocol:n,command:null,data:null};if("peer-exchange"===t){if(this.#se.has(e))return;const n=Array.from(this.#z.keys()),r=n[Math.floor(Math.random()*n.length)],s=this.#z.get(r);i.command=t,i.data={id:r,addr:s}}const o=JSON.stringify(i);try{const t=await this.#V.dialProtocol(s,n,{runOnTransientConnection:h}),i=await gr(o,(e=>zr(e,(e=>Qr(e)))),(e=>Or(e)),t,(e=>qr(e)),(e=>zr(e,(e=>Yr(e.subarray())))),(async function(e){let t="";for await(const n of e)t+=n.toString();return t})),a=JSON.parse(i);if(a.protocol==n){const t=[r];if(this.#Q.has(e)){const n={addrs:t,last:(new Date).getTime()};this.#Q.set(e,n)}else{this.#$.includes(e)||this.#$.push(e),this.#he(e);const n={addrs:t,last:(new Date).getTime()};this.#Q.set(e,n),this.#de()}}if("peer-exchange"==a.command&&null!=a.data){this.#se.set(e,a.data);let t=[];const n=cr(a.data.addr),r=a.data.id;t.push(n),this.#fe(t),this.#z.has(r)}}catch(e){Gr(e)}}async#Te(){if(navigator.onLine&&this.#ne)for(const e of f)if(!this.#pe(e)&&!this.#X.has(e)){const t=Ss(e);for await(const e of this.#V.services.aminoDHT.findPeer(t))if("FINAL_PEER"===e.name){let t=[],n=[];const r=e.peer.id.toString();for(const s of e.peer.multiaddrs){const e=s.toString()+"/p2p/"+r,i=cr(e);n.push(e),t.push(i)}this.#G.set(r,n),this.#pe(r)||this.#fe(t)}}}#Se(){const e=(new Date).getTime();for(const t of this.#Q){const n=t[0],r=e-t[1].last;if(r>1e4&&!this.#pe(n)||r>6e4){this.#Q.delete(n),this.#de(),this.#Ae(n);const e=Object.keys(this.#Y);for(const t of e)if(this.#Y[t].members.includes(n)){const e=this.#Y[t].members.indexOf(n);this.#Y[t].members.splice(e,1),this.#Y[t].onMembers(this.#Y[t].members)}}}}#pe(e){let t=[];for(const e of this.#V.getPeers())t.push(e.toString());return!!t.includes(e)}async#fe(e){if(e.length>0){const t=e[0].toString().split("/").pop();if(this.#te.map((e=>e[0].toString().split("/").pop())).includes(t))return;if("connected"===this.status&&p.includes(t))return;const n=this.#Q.size,r=this.#V.getPeers().length,s=r-n,i=25;if(this.#$.includes(t)){if(n>i)return}else if(s>i-5||r>45){let e=[];for(const t of this.#V.getPeers())e.push(t.toString());const n=e[Math.floor(Math.random()*e.length)];f.includes(t)||await this.#V.hangUp(Ss(n))}this.#$.includes(t)||g.includes(t)||f.includes(t)?this.#te.unshift(e):this.#te.push(e)}}#Ee(){if(!this.#ne||!navigator.onLine||"hidden"===document.visibilityState&&"ontouchstart"in document.documentElement)return;let e=[];for(const t of this.#V.getDialQueue()){const n=t.peerId.string;e.push(n)}if(!(e.length>5))for(let t=0;t<5;t++){const t=this.#te.shift();if(!(null!=t&&t.length>0))break;{const n=t[0].toString().split("/").pop();if(this.#pe(n))continue;if(e.includes(n))continue;this.#De(t),this.#j&&this.#ke(t)}}}async#ce(){const e=s,t=JSON.stringify({prefix:"hybrid",id:this.#V.peerId.toString(),address:this.address}),n={publicKey:this.#V.peerId.publicKey,addrs:[Qr(t)]},r=Yt.encode(n);for(const t of e)await this.#V.services.pubsub.publish(t,r)}async#le(){let e=[];e=o;const n=JSON.stringify({prefix:t,signal:"announce",id:this.#V.peerId.toString(),address:this.address,rooms:Object.keys(this.#Y)}),r={publicKey:this.#V.peerId.publicKey,addrs:[Qr(n)]},s=Yt.encode(r);for(const t of e)await this.#V.services.pubsub.publish(t,s)}async#ue(){let e=[];e=o;const n=JSON.stringify({prefix:t,signal:"ping",id:this.#V.peerId.toString(),address:this.address,rooms:Object.keys(this.#Y)}),r={publicKey:this.#V.peerId.publicKey,addrs:[Qr(n)]},s=Yt.encode(r);for(const t of e)await this.#V.services.pubsub.publish(t,s)}#be(){setInterval((()=>{const e=g,t=Math.floor(Math.random()*e.length);let n=[];n.push(e[t]);for(const e of f)n.push(e);for(const e of n)if(null!=e&&!this.#pe(e))if(this.#X.has(e)){let t=[];const n=cr(this.#X.get(e));t.push(n),this.#fe(t)}else if(this.#G.has(e)){let t=[];const n=this.#G.get(e);for(const e of n){const n=cr(e);t.push(n)}this.#fe(t)}else{const t=m,n=t.findIndex((t=>t.Peers[0].ID==e));if(n>-1){const r=t[n].Peers[0].Addrs;let s=[];for(const t of r){const n=cr(t+"/p2p/"+e);s.push(n)}this.#fe(s)}}}),45e3)}async#we(){for await(const{key:e,value:t}of this.#H.query({})){const n=e.toString().split("/")[1],r=(new TextDecoder).decode(t);this.#z.set(n,r)}setInterval((async()=>{const e=this.#V.getConnections();for(const t of e){const e=t.remotePeer,n=t.remoteAddr,r=t.timeline.upgraded,s=3e5,i=(new Date).getTime();if(i-r>s){const t=n.toString(),r=e.toString();this.#$.includes(r)||g.includes(r)||this.#z.has(r)||t.includes("p2p-circuit")||!t.includes("webtransport")||(await this.#H.put(new en(r),(new TextEncoder).encode(t)),this.#z.set(r,t))}if(i-r>6e4){const t=e.toString();this.#W.has(t)||this.#W.set(t,0)}}for(const e of this.#z){const t=e[0],n=e[1];if(this.#pe(t))this.#J.set(t,0);else{if(this.#J.has(t)){let e=this.#J.get(t);if(e++,this.#J.set(t,e),e>5){this.#X.has(t)||g.includes(t)||!navigator.onLine||setTimeout((async()=>{this.#z.has(t)&&!this.#X.has(t)&&(this.#z.delete(t),await this.#H.delete(new en(t)))}),6e4);continue}}else this.#J.set(t,0);let e=[];const r=cr(n);e.push(r),this.#fe(e)}}const t=Array.from(this.#W.keys());for(const e of t)if(this.#pe(e))this.#W.set(e,0);else{let t=this.#W.get(e);if(t<15||t<25&&this.#G.has(e)){let n=[];const r=cr(this.#X.get(e));n.push(r),this.#fe(n),t++,this.#W.set(e,t)}}}),15e3)}#ye(){setInterval((()=>{0==this.#V.getPeers().length&&this.#me()}),12e4)}#me(){setTimeout((()=>{this.#Pe(),setTimeout((()=>{this.#Ce()}),2e4),setTimeout((()=>{this.#Te()}),3e4),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#xe(),setTimeout((()=>{this.#Te()}),3e4),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#Ne(),setTimeout((()=>{this.#Te()}),15e3),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#Me(),setTimeout((()=>{this.#Te()}),15e3),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#Oe(),setTimeout((()=>{this.#Te()}),15e3))}),u))}),u))}),u))}),u)}),5e3)}async#Pe(){if(!navigator.onLine)return;if(!this.#ne)return;let e=!0;for(const t of g)if(this.#z.has(t)){e=!1;let n=[],r=[];const s=t,i=this.#z.get(t),o=cr(i);r.push(i),n.push(o),this.#G.set(s,r),this.#pe(s)||this.#fe(n)}if(e)for(const e of g){const t=$h(a),n=await Zr(t.getPeers(Ss(e)));if(!n)continue;const r=n.Addrs,s=n.ID;let i=[],o=[];for(const e of r){const t=e.toString()+"/p2p/"+s.toString(),n=cr(t);o.push(t),i.push(n)}this.#G.set(s,o),this.#pe(s)||this.#fe(i)}}async#Ce(){if(!navigator.onLine)return;if(!this.#ne)return;let e=!0;for(const t of g)if(this.#z.has(t)&&(e=!1),!this.#X.has(t)&&(this.#z.has(t)||e)){const e=$h(a),n=await Zr(e.getPeers(Ss(t)));if(!n){navigator.onLine&&await this.#H.delete(new en(t));continue}const r=n.Addrs,s=n.ID;let i=[],o=[];for(const e of r){const t=e.toString()+"/p2p/"+s.toString(),n=cr(t);o.push(t),i.push(n)}this.#G.set(s,o),this.#pe(s)||this.#fe(i)}}async#xe(){if(!navigator.onLine)return;if(!this.#ne)return;const e=$h(a),t=g,n=await Promise.all(t.map((t=>Zr(e.getPeers(Ss(t))))));for(const e of n){if(!e)return;const t=e.Addrs,n=e.ID;let r=[],s=[];for(const e of t){const t=e.toString()+"/p2p/"+n.toString(),i=cr(t);s.push(t),r.push(i)}this.#G.set(n,s),this.#pe(n)||this.#fe(r)}}#Ne(){if(!navigator.onLine)return;if(!this.#ne)return;const e=m;for(const t of e){const e=t.Peers[0].Addrs,n=t.Peers[0].ID;let r=[],s=[];for(const t of e){if(!t.includes("wss"))continue;const e=t+"/p2p/"+n,i=cr(e);s.push(e),r.push(i)}this.#G.set(n,s),this.#j=!0,this.#pe(n)||this.#fe(r)}}async#Me(){if(!navigator.onLine)return;if(!this.#ne)return;const e=c,t=l,n=await fetch(e+"?name="+t+"&type=txt"),r=(await n.json()).Answer,s=[];for(const e of r){const t=e.data.split("/").pop();s.push(t)}const i=$h(a),o=await Promise.all(s.map((e=>Zr(i.getPeers(Ss(e))))));for(const e of o){const t=e.Addrs,n=e.ID;let r=[],s=[];for(const e of t){const t=e.toString()+"/p2p/"+n.toString(),i=cr(t);s.push(t),r.push(i)}this.#G.set(n,s),this.#j=!0,this.#pe(n)||this.#fe(r)}}async#Oe(){if(!navigator.onLine)return;if(!this.#ne)return;const e=c,t=l,n=await fetch(e+"?name="+t+"&type=txt"),r=(await n.json()).Answer;for(const e of r){const t=e.data.split("/"),n=t.pop(),r="_dnsaddr."+t[2];this.#Le(n,r)}}async#Le(e,t){const n=c,r=await fetch(n+"?name="+t+"&type=txt"),s=(await r.json()).Answer;let i=[],o=[];for(const e of s){const t=e.data.split("=")[1],n=cr(t);i.push(n),o.push(t)}this.#j=!0,this.#G.set(e,o),this.#G.set(e,o),this.#pe(e)||(this.#fe(i),this.#ke(i))}async#De(e){const t=e.filter((e=>e.protoNames().includes("webtransport")&&e.protoNames().includes("certhash")));for(const e of t)try{return void await this.#V.dial(e)}catch(e){Gr(e)}}async#ke(e){const t=e.filter((e=>e.protoNames().includes("wss")));for(const e of t)try{return void await this.#V.dial(e)}catch(e){Gr(e)}}static async createWebpeer(){const e=new Sg(r);await e.open();const t=m;for(const e of t){const t=e.Peers[0].Addrs;e.Peers[0].ID;for(const e of t)e.includes("webtransport")&&e.includes("certhash")}let n=()=>{};let s=[];s.push("/webrtc");const o=atob("dHVybjpyZWxheTEuZXhwcmVzc3R1cm4uY29tOjM0Nzg="),a=atob("ZWZJSllZNjdDNElRMzFZQUlP"),c=atob("Vk01SmdhODlkYjJaWU9aSA=="),l=atob("dHVybjpzdGFuZGFyZC5yZWxheS5tZXRlcmVkLmNhOjgw"),u=atob("ZmZlNmIxOThjOGMxYjM5ODg1OWFiOGY4"),p=atob("aWpkQjVTcTIwREVsZzdDRg=="),f=await new Promise((e=>{let t=!1,n=!1;const r=setTimeout((()=>{let r=[];if(t)r.push(t);else{const e={urls:"stun:global.stun.twilio.com:3478"};r.push(e)}if(n)r.push(n);else{const e={urls:l,username:u,credential:p};r.push(e)}e(r)}),5e3);function s(){if(t&&n){let s=[];s.push(t),s.push(n),clearTimeout(r),e(s)}}const i=new RTCPeerConnection({iceServers:[{urls:d},{urls:o,username:a,credential:c}]});i.onicecandidate=e=>{e.candidate&&("srflx"==e.candidate.type&&(t={urls:d},s()),"relay"==e.candidate.type&&(n={urls:o,username:a,credential:c},s()))},i.onicecandidateerror=e=>{console.debug(e)},i.createDataChannel("webpeerjs"),i.createOffer().then((e=>i.setLocalDescription(e)))})),g=await async function(e={}){const t=await Jf(e);return!1!==e.start&&await t.start(),t}({addresses:{listen:s},transports:[Hm(),Qy(),(y={rtcConfiguration:{iceServers:f}},e=>new xw(e,y)),Vb({discoverRelays:1,reservationConcurrency:1,maxReservationQueueLength:3})],connectionManager:{maxConnections:50,minConnections:0,autoDialInterval:6e4,autoDialConcurrency:0,autoDialMaxQueueLength:0,autoDialPriority:1e3,autoDialDiscoveredPeersDebounce:6e4,maxParallelDials:3,dialTimeout:5e3,maxIncomingPendingConnections:5,maxDialQueueLength:10,inboundConnectionThreshold:3,maxPeerAddrsToDial:2,inboundUpgradeTimeout:5e3},connectionEncryption:[xm()],streamMuxers:[fb({maxInboundStreams:100,maxOutboundStreams:100})],connectionGater:{filterMultiaddrForPeer:async(e,t)=>{const n=t.toString();return!n.includes("/ip4/127.0.0.1")&&!n.includes("/ip6/")},denyDialMultiaddr:async e=>{const t=e.toString();return!(!t.includes("/ip4/127.0.0.1")&&!t.includes("/ip6/"))}},peerDiscovery:[wb({interval:5e3,topics:i,listenOnly:!1})],services:{pubsub:Lv({allowPublishToZeroTopicPeers:!0,msgIdFn:Jr,ignoreDuplicatePublishError:!0,runOnTransientConnection:h}),identify:qv(),identifyPush:Hv(),aminoDHT:sS({protocol:"/ipfs/kad/1.0.0",peerInfoMapper:wE,clientMode:!1}),dcutr:Kw()},peerStore:{persistence:!0,threshold:1},metrics:lS({onMetrics:e=>{n(e)},intervalMs:1e3})});var y;return await g.services.aminoDHT.setMode("server"),new uS(g,e,(e=>n=e))}}export{uS as webpeerjs};
|
|
83
|
+
class dS{#V;#K;#$;#q;#H;#z;#W;#j;#G;#Y;#Q;#J;#Z;#X;#ee;#te;#ne;#re;#se;#ie;#oe;#ae;#ce;id;status;IPFS;address;peers;constructor(e,r,a,c,l){this.#V=e,this.#H=r,this.#ce=c,this.#z=new Map,this.#K=new Map,this.#$=[],this.#q=new Map,this.#W=new Map,this.#j=!1,this.#G=new Map,this.address=[],this.#Y={},this.#Q=new Map,this.#J=[],this.#Z=new Map,this.#X=new Map,this.#ee=new Map,this.#te=[],this.#ne=!0,this.#re=[],this.#se=new Map,this.#ie=(new Date).getTime(),this.#oe=(new Date).getTime(),this.#ae=[],this.peers=this.#J,this.status=function(e){return e.status}(this.#V),this.status="unconnected",this.IPFS=function(e,t){return{libp2p:e,discoveredPeers:t}}(this.#V,this.#K),this.id=this.#V.peerId.toString();for(const e of o)this.#V.services.pubsub.subscribe(e);for(const e of s)this.#V.services.pubsub.subscribe(e);this.#V.addEventListener("peer:connect",(async e=>{const t=e.detail.toString(),n=this.#V.getConnections().map((e=>({id:e.remotePeer.toString(),addr:e.remoteAddr.toString()}))).find((e=>e.id==t)).addr;if(g.includes(t)&&(this.#X.has(t)&&!this.#X.get(t).includes("/wss/")||!n.includes("webtransport")||await this.#H.put(new en(t),(new TextEncoder).encode(n))),this.#X.set(t,n),f.includes(t)&&setTimeout((()=>{this.#le(),this.#ue(),setTimeout((()=>{this.#le(),this.#ue()}),5e3)}),1e3),this.#$.includes(t)){setTimeout((()=>{this.#he()}),1e4),setTimeout((()=>{this.#he()}),15e3);let e=[n];if(this.#Q.has(t)){const n={addrs:e,last:(new Date).getTime()};this.#Q.set(t,n)}else if(this.#oe<1e4){this.#de(t);const n={addrs:e,last:(new Date).getTime()};this.#Q.set(t,n),this.#pe()}}})),this.#V.services.pubsub.addEventListener("message",(e=>{if("signed"===e.detail.type){const n=e.detail.topic,r=e.detail.from.toString();try{if((n===o||i.includes(n))&&(this.#oe=(new Date).getTime()),i.includes(n)){const e=(new Date).getTime(),t=15e3;e-this.#ie>t&&this.#ue(),this.#ie=e}if(this.#$.includes(r)){if(this.#Q.has(r)){const e=this.#Q.get(r).addrs,t={addrs:e,last:(new Date).getTime()};this.#Q.set(r,t)}else if(this.#oe<1e4){this.#de(r);const e=this.#q.get(r),t={addrs:e,last:(new Date).getTime()};this.#Q.set(r,t),this.#pe()}if(!this.#fe(r))if(this.#X.has(r)){let e=[];const t=cr(this.#X.get(r));e.push(t),this.#ge(e)}else if(this.#K.has(r)){const e=this.#K.get(r);let t=[];for(const n of e){if(!n.includes("webrtc"))continue;const e=cr(n);t.push(e)}this.#ge(t)}else if(this.#Q.has(r)){const e=this.#Q.get(r).addrs;let t=[];for(const n of e){if(!n.includes("webrtc"))continue;const e=cr(n);t.push(e)}this.#ge(t)}}const s=Yt.decode(e.detail.data);if(s.addrs.length>1&&this.#V.getPeers().length<50){let e=[];for(const t of s.addrs){const n=cr(t);n.toString().includes("webtransport")&&n.toString().includes("certhash")&&e.push(n)}this.#ge(e)}const a=Gr(s.addrs[0]),c=JSON.parse(a),l=c.prefix,u=c.room,h=c.rooms,d=c.message,p=c.msgId,f=c.signal,g=c.id,m=c.address;if(g!=r)return;if(l===t){if(this.#oe=(new Date).getTime(),this.#$.includes(g)||this.#$.push(g),this.#Q.has(g))m&&m.length>0&&this.#q.set(g,m);else{this.#de(g);const e={addrs:m,last:(new Date).getTime()};this.#Q.set(g,e),m&&m.length>0&&this.#q.set(g,m),this.#pe()}if(u&&this.#Y[u]&&(this.#Y[u].members.includes(g)||this.#Q.has(g)&&(this.#Y[u].members.push(g),this.#Y[u].onMembers(this.#Y[u].members)),d)){const e=p+g;this.#re.includes(e)||(this.#re.push(e),this.#Y[u].onMessage(d,g))}if(h)for(const e of h)this.#Y[e]&&(this.#Y[e].members.includes(g)||this.#Q.has(g)&&(this.#Y[e].members.push(g),this.#Y[e].onMembers(this.#Y[e].members)));f&&"announce"==f&&setTimeout((()=>{this.#he("")}),1e3)}else if("hybrid"===l){const e=25;if(m.length>0&&(!this.#X.has(g)||this.#Q.size<e)){let e=[];for(const t of m){const n=cr(t);e.push(n)}this.#ge(e)}}}catch(e){}}})),this.#V.addEventListener("peer:discovery",(e=>{const t=e.detail.multiaddrs,n=e.detail.id;if(0!=t.length){let r=[];for(const s of t){let i;i=t.toString().includes(e.detail.id.toString())?s.toString():s.toString()+"/p2p/"+n,r.push(i)}if(this.#K.set(n.toString(),r),t.toString().includes("certhash")&&t.toString().includes("webtransport")&&t.toString().includes("p2p-circuit")&&!this.#X.has(n)){let e=[];for(const t of r){if(!t.includes("webrtc"))continue;const n=cr(t);e.push(n)}this.#ge(e)}}})),this.#V.addEventListener("peer:disconnect",(async e=>{const t=e.detail.string;if(this.#ee.has(t)){let e=this.#ee.get(t);if(e++,this.#ee.set(t,e),e>5){if(p.includes(t))return}else if(e>10&&(this.#z.has(t)&&this.#z.delete(t),!this.#$.includes(t)&&!this.#G.has(t)))return}else this.#ee.set(t,0);let n=[];for(const e of this.#se.values())n.push(e.id);if(this.#$.includes(t)){let e=[];const n=cr(this.#X.get(t));e.push(n),this.#ge(e)}else if(this.#G.has(t)){const e=this.#X.get(t);if(e.includes("/wss/"))return;let n=[];const r=cr(e);n.push(r),this.#ge(n)}else if(n.includes(t)){let e=[];const n=cr(this.#X.get(t));e.push(n),this.#ge(e)}else{cr(this.#X.get(t))}})),this.#V.addEventListener("self:peer:update",(({detail:{peer:e}})=>{const t=e.id.toString(),n=[];e.addresses.forEach((e=>{const r=e.multiaddr.toString()+"/p2p/"+t;r.includes("webtransport")&&r.includes("certhash")&&n.push(r)})),n.reverse(),this.address=n,this.#he(),this.#le()})),this.#V.addEventListener("peer:identify",(async e=>{const t=e.detail.peerId.toString();if(p.includes(t)){if(e.detail.connection.remoteAddr.toString().includes("/wss/")){let n=[],r=[];for(const s of e.detail.listenAddrs){if(!s.toString().includes("webtransport"))continue;const e=s.toString()+"/p2p/"+t,i=cr(e);n.push(e),r.push(i)}this.#G.set(t,n),await this.#V.hangUp(Is(t)),this.#ge(r)}}if(e.detail.protocols.includes(n)){const t=e.detail.peerId.toString();let n=[];for(const r of e.detail.listenAddrs){const e=r.toString()+"/p2p/"+t;cr(e),e.includes("webtransport")&&n.push(e)}if(this.#Q.has(t)){const e={addrs:n,last:(new Date).getTime()};this.#Q.set(t,e)}const r="peer-exchange";this.#me(t,r)}})),this.#ye(),this.#we(),this.#be(),this.#ve(),this.#Ee(),a((e=>{const t=function(e){if(Jr)return{isDialEnabled:rs,isAutoDialEnabled:is};try{const t=e.libp2p_webtransport_dialer_events_total,n=(t.pending??0)-(ts.pending??0),r=(t.ready_error??0)-(ts.ready_error??0),s=(t.noise_error??0)-(ts.noise_error??0),i=(t.upgrade_error??0)-(ts.upgrade_error??0),o=(t.close??0)-(ts.close??0),a=(t.ready??0)-(ts.ready??0),c=(t.abort??0)-(ts.abort??0),l=(t.ready_timeout??0)-(ts.ready_timeout??0),u=(t.noise_timeout??0)-(ts.noise_timeout??0),h=(t.open??0)-(ts.open??0),d=(t.remote_close??0)-(ts.remote_close??0);es.pending+=n,es.pending-=l,es.pending-=u,es.pending-=r,es.pending-=s,es.pending-=i,es.pending-=h,es.open+=h,es.open-=o,es.open-=d,es.open-=c,es.ready_error=r,es.noise_error=s,es.upgrade_error=i,es.ready_timeout=l,es.noise_timeout=u,es.close=o,es.abort=c,es.remote_close=d,Xr.success+=a,Xr.readyErrored+=r,Xr.noiseErrored+=s,Xr.upgradeErrored+=i,Xr.readyTimedout+=l,Xr.noiseTimedout+=u;const p=Xr.readyErrored+Xr.noiseErrored+Xr.upgradeErrored,f=Xr.readyTimedout+Xr.noiseTimedout;if(ts=t,ns=p+f,ns-ss>55&&rs&&(rs=!1,console.warn("Peer dial is temporary disabled"),is&&(is=!1,console.warn("Peer autodial is temporary disabled")),setTimeout((()=>{rs||(rs=!0,ss=ns,console.warn("Peer dial is resumed"),is||(is=!0,os=ns,console.warn("Peer autodial is resumed")))}),36e4)),ns-os>45&&is){is=!1,console.warn("Peer autodial is temporary disabled");const e=ns;setTimeout((()=>{!is&&rs&&(is=!0,os=ns,console.warn("Peer autodial is resumed"),rs&&(ss=e))}),36e4)}return{isDialEnabled:rs,isAutoDialEnabled:is}}catch{console.debug("Metrics error")}}(e);this.#ne=t.isDialEnabled,l(t.isAutoDialEnabled)})),setTimeout((()=>{this.#Se(),setInterval((()=>{this.#Se()}),5e3)}),1e4),setInterval((()=>{this.#_e()}),5e3),setInterval((()=>{this.#le(),this.#Ie(),this.#Re()}),1e4)}#Ae=()=>{};onConnect=e=>this.#Ae=e;#Te=()=>{};onDisconnect=e=>this.#Te=e;joinRoom=e=>{if(this.#Y[e])return[this.#Y[e].sendMessage,this.#Y[e].listenMessage,this.#Y[e].onMembersChange];if(!e)throw jr("room is required");{let n=[];n=o,this.#Y[e]={onMessage:()=>{},listenMessage:t=>this.#Y[e]={...this.#Y[e],onMessage:t},sendMessage:async r=>{const s=(new Date).getTime(),i=Yr(JSON.stringify({prefix:t,room:e,message:r,id:this.#V.peerId.toString(),msgId:s}));if(i.byteLength>102400)throw jr("message too large");const o={publicKey:this.#V.peerId.publicKey,addrs:[i]},a=Yt.encode(o);for(const e of n)await this.#V.services.pubsub.publish(e,a)},members:[this.id],onMembers:()=>{},onMembersChange:t=>{this.#Y[e]={...this.#Y[e],onMembers:t},this.#Y[e].onMembers(this.#Y[e].members),this.#he()}}}return[this.#Y[e].sendMessage,this.#Y[e].listenMessage,this.#Y[e].onMembersChange]};dial(e){let t=[];const n=cr(e);t.push(n),this.#ge(t)}#Ie(){let e=!1;for(const t of f)this.#fe(t)&&(e=!0);if(!e)for(const e of f)if("connected"!==this.status&&this.#X.has(e)){let t=[];const n=cr(this.#X.get(e));t.push(n),this.#ge(t)}}#Re(){if("connected"===this.status)return;if(this.#q.size<1)return;const e=Array.from(this.#q.keys()),t=e[Math.floor(Math.random()*e.length)],n=this.#q.get(t);let r=[];for(const e of n){const t=cr(e);r.push(t)}this.#ge(r)}#de(e){this.#ae.includes(e)||(this.#ae.push(e),this.#Ae(e),setTimeout((()=>{const t=this.#ae.indexOf(e);t>-1&&this.#ae.splice(t,1)}),5e3))}#pe(){this.#J.length=0;for(const e of this.#Q){const t={id:e[0],address:e[1].addrs};this.#J.push(t)}this.#Q.size>0?this.status="connected":this.status="unconnected",this.#he()}async#Ee(){await this.#V.handle(n,(async({connection:e,stream:t})=>{try{const r=await gr(t.source,(e=>qr(e)),(e=>zr(e,(e=>Gr(e.subarray())))),(async function(e){let t="";for await(const n of e)t+=n.toString();return t})),s=e.remotePeer.toString();let i=JSON.parse(r),o={protocol:n,command:null,data:null};if("peer-exchange"===i.command){if(i.protocol==n){const t=[e.remoteAddr.toString()];if(this.#Q.has(s)){const e={addrs:t,last:(new Date).getTime()};this.#Q.set(s,e)}else{this.#$.includes(s)||this.#$.push(s),this.#de(s);const e={addrs:t,last:(new Date).getTime()};this.#Q.set(s,e),this.#pe()}}if(null!=i.data){this.#se.set(s,i.data);let e=[];const t=cr(i.data.addr),n=i.data.id;e.push(t),this.#ge(e),this.#z.has(n)}const t=Array.from(this.#z.keys()),r=t[Math.floor(Math.random()*t.length)],a=this.#z.get(r);o.command=i.command,o.data={id:r,addr:a}}gr(JSON.stringify(o),(e=>zr(e,(e=>Yr(e)))),(e=>Or(e)),t.sink)}catch(e){}}),{maxInboundStreams:100,maxOutboundStreams:100,runOnTransientConnection:h}),await this.#V.register(n,{})}async#me(e,t){const r=this.#V.getConnections().map((e=>({id:e.remotePeer.toString(),addr:e.remoteAddr.toString()}))).find((t=>t.id==e)).addr,s=cr(r);let i={protocol:n,command:null,data:null};if("peer-exchange"===t){if(this.#se.has(e))return;const n=Array.from(this.#z.keys()),r=n[Math.floor(Math.random()*n.length)],s=this.#z.get(r);i.command=t,i.data={id:r,addr:s}}const o=JSON.stringify(i);try{const t=await this.#V.dialProtocol(s,n,{runOnTransientConnection:h}),i=await gr(o,(e=>zr(e,(e=>Yr(e)))),(e=>Or(e)),t,(e=>qr(e)),(e=>zr(e,(e=>Gr(e.subarray())))),(async function(e){let t="";for await(const n of e)t+=n.toString();return t})),a=JSON.parse(i);if(a.protocol==n){const t=[r];if(this.#Q.has(e)){const n={addrs:t,last:(new Date).getTime()};this.#Q.set(e,n)}else{this.#$.includes(e)||this.#$.push(e),this.#de(e);const n={addrs:t,last:(new Date).getTime()};this.#Q.set(e,n),this.#pe()}}if("peer-exchange"==a.command&&null!=a.data){this.#se.set(e,a.data);let t=[];const n=cr(a.data.addr),r=a.data.id;t.push(n),this.#ge(t),this.#z.has(r)}}catch(e){}}async#De(){if(navigator.onLine&&this.#ne)for(const e of f)if(!this.#fe(e)&&!this.#X.has(e)){const t=Is(e);for await(const e of this.#V.services.aminoDHT.findPeer(t))if("FINAL_PEER"===e.name){let t=[],n=[];const r=e.peer.id.toString();for(const s of e.peer.multiaddrs){const e=s.toString()+"/p2p/"+r,i=cr(e);n.push(e),t.push(i)}this.#G.set(r,n),this.#fe(r)||this.#ge(t)}}}#_e(){const e=(new Date).getTime();for(const t of this.#Q){const n=t[0],r=e-t[1].last;if(r>1e4&&!this.#fe(n)||r>6e4){this.#Q.delete(n),this.#pe(),this.#Te(n);const e=Object.keys(this.#Y);for(const t of e)if(this.#Y[t].members.includes(n)){const e=this.#Y[t].members.indexOf(n);this.#Y[t].members.splice(e,1),this.#Y[t].onMembers(this.#Y[t].members)}}}}#fe(e){let t=[];for(const e of this.#V.getPeers())t.push(e.toString());return!!t.includes(e)}async#ge(e){if(e.length>0){const t=e[0].toString().split("/").pop();if(this.#te.map((e=>e[0].toString().split("/").pop())).includes(t))return;if("connected"===this.status&&p.includes(t))return;const n=this.#Q.size,r=this.#V.getPeers().length,s=r-n,i=25;if(this.#$.includes(t)){if(n>i)return}else if(s>i-5||r>45){let e=[];for(const t of this.#V.getPeers())e.push(t.toString());const n=e[Math.floor(Math.random()*e.length)];f.includes(t)||await this.#V.hangUp(Is(n))}this.#$.includes(t)||g.includes(t)||f.includes(t)?this.#te.unshift(e):this.#te.push(e)}}#Se(){if(!this.#ne||!navigator.onLine||"hidden"===document.visibilityState&&"ontouchstart"in document.documentElement)return;let e=[];for(const t of this.#V.getDialQueue()){const n=t.peerId.string;e.push(n)}if(!(e.length>5))for(let t=0;t<5;t++){const t=this.#te.shift();if(!(null!=t&&t.length>0))break;{const n=t[0].toString().split("/").pop();if(this.#fe(n))continue;if(e.includes(n))continue;this.#ke(t),this.#j&&this.#Pe(t)}}}async#le(){const e=s,t=JSON.stringify({prefix:"hybrid",id:this.#V.peerId.toString(),address:this.address}),n={publicKey:this.#V.peerId.publicKey,addrs:[Yr(t)]},r=Yt.encode(n);for(const t of e)await this.#V.services.pubsub.publish(t,r)}async#ue(){let e=[];e=o;const n=JSON.stringify({prefix:t,signal:"announce",id:this.#V.peerId.toString(),address:this.address,rooms:Object.keys(this.#Y)}),r={publicKey:this.#V.peerId.publicKey,addrs:[Yr(n)]},s=Yt.encode(r);for(const t of e)await this.#V.services.pubsub.publish(t,s)}async#he(){let e=[];e=o;const n=JSON.stringify({prefix:t,signal:"ping",id:this.#V.peerId.toString(),address:this.address,rooms:Object.keys(this.#Y)}),r={publicKey:this.#V.peerId.publicKey,addrs:[Yr(n)]},s=Yt.encode(r);for(const t of e)await this.#V.services.pubsub.publish(t,s)}#ve(){setInterval((()=>{const e=g,t=Math.floor(Math.random()*e.length);let n=[];n.push(e[t]);for(const e of f)n.push(e);for(const e of n)if(null!=e&&!this.#fe(e))if(this.#X.has(e)){let t=[];const n=cr(this.#X.get(e));t.push(n),this.#ge(t)}else if(this.#G.has(e)){let t=[];const n=this.#G.get(e);for(const e of n){const n=cr(e);t.push(n)}this.#ge(t)}else{const t=m,n=t.findIndex((t=>t.Peers[0].ID==e));if(n>-1){const r=t[n].Peers[0].Addrs;let s=[];for(const t of r){const n=cr(t+"/p2p/"+e);s.push(n)}this.#ge(s)}}}),45e3)}async#be(){for await(const{key:e,value:t}of this.#H.query({})){const n=e.toString().split("/")[1],r=(new TextDecoder).decode(t);this.#z.set(n,r)}setInterval((async()=>{const e=this.#V.getConnections();for(const t of e){const e=t.remotePeer,n=t.remoteAddr,r=t.timeline.upgraded,s=3e5,i=(new Date).getTime();if(i-r>s){const t=n.toString(),r=e.toString();this.#$.includes(r)||g.includes(r)||this.#z.has(r)||t.includes("p2p-circuit")||!t.includes("webtransport")||(await this.#H.put(new en(r),(new TextEncoder).encode(t)),this.#z.set(r,t))}if(i-r>6e4){const t=e.toString();this.#W.has(t)||this.#W.set(t,0)}}for(const e of this.#z){const t=e[0],n=e[1];if(this.#fe(t))this.#Z.set(t,0);else{if(this.#Z.has(t)){let e=this.#Z.get(t);if(e++,this.#Z.set(t,e),e>5){this.#X.has(t)||g.includes(t)||!navigator.onLine||setTimeout((async()=>{this.#z.has(t)&&!this.#X.has(t)&&(this.#z.delete(t),await this.#H.delete(new en(t)))}),6e4);continue}}else this.#Z.set(t,0);let e=[];const r=cr(n);e.push(r),this.#ge(e)}}const t=Array.from(this.#W.keys());for(const e of t)if(this.#fe(e))this.#W.set(e,0);else{let t=this.#W.get(e);if(t<15||t<25&&this.#G.has(e)){let n=[];const r=cr(this.#X.get(e));n.push(r),this.#ge(n),t++,this.#W.set(e,t)}}}),15e3)}#we(){setInterval((()=>{0==this.#V.getPeers().length&&this.#ye()}),12e4)}#ye(){setTimeout((()=>{this.#Ce(),setTimeout((()=>{this.#xe()}),2e4),setTimeout((()=>{this.#De()}),3e4),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#Ne(),setTimeout((()=>{this.#De()}),3e4),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#Me(),setTimeout((()=>{this.#De()}),15e3),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#Oe(),setTimeout((()=>{this.#De()}),15e3),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#Le(),setTimeout((()=>{this.#De()}),15e3))}),u))}),u))}),u))}),u)}),5e3)}async#Ce(){if(!navigator.onLine)return;if(!this.#ne)return;let e=!0;for(const t of g)if(this.#z.has(t)){e=!1;let n=[],r=[];const s=t,i=this.#z.get(t),o=cr(i);r.push(i),n.push(o),this.#G.set(s,r),this.#fe(s)||this.#ge(n)}if(e)for(const e of g){const t=Hh(a),n=await Qr(t.getPeers(Is(e)));if(!n)continue;const r=n.Addrs,s=n.ID;let i=[],o=[];for(const e of r){const t=e.toString()+"/p2p/"+s.toString(),n=cr(t);o.push(t),i.push(n)}this.#G.set(s,o),this.#fe(s)||this.#ge(i)}}async#xe(){if(!navigator.onLine)return;if(!this.#ne)return;let e=!0;for(const t of g)if(this.#z.has(t)&&(e=!1),!this.#X.has(t)&&(this.#z.has(t)||e)){const e=Hh(a),n=await Qr(e.getPeers(Is(t)));if(!n){navigator.onLine&&await this.#H.delete(new en(t));continue}const r=n.Addrs,s=n.ID;let i=[],o=[];for(const e of r){const t=e.toString()+"/p2p/"+s.toString(),n=cr(t);o.push(t),i.push(n)}this.#G.set(s,o),this.#fe(s)||this.#ge(i)}}async#Ne(){if(!navigator.onLine)return;if(!this.#ne)return;const e=Hh(a),t=g,n=await Promise.all(t.map((t=>Qr(e.getPeers(Is(t))))));for(const e of n){if(!e)return;const t=e.Addrs,n=e.ID;let r=[],s=[];for(const e of t){const t=e.toString()+"/p2p/"+n.toString(),i=cr(t);s.push(t),r.push(i)}this.#G.set(n,s),this.#fe(n)||this.#ge(r)}}#Me(){if(!navigator.onLine)return;if(!this.#ne)return;const e=m;for(const t of e){const e=t.Peers[0].Addrs,n=t.Peers[0].ID;let r=[],s=[];for(const t of e){if(!t.includes("wss"))continue;const e=t+"/p2p/"+n,i=cr(e);s.push(e),r.push(i)}this.#G.set(n,s),this.#j=!0,this.#ce(!0),this.#fe(n)||this.#ge(r)}}async#Oe(){if(!navigator.onLine)return;if(!this.#ne)return;const e=c,t=l,n=await fetch(e+"?name="+t+"&type=txt"),r=(await n.json()).Answer,s=[];for(const e of r){const t=e.data.split("/").pop();s.push(t)}const i=Hh(a),o=await Promise.all(s.map((e=>Qr(i.getPeers(Is(e))))));for(const e of o){const t=e.Addrs,n=e.ID;let r=[],s=[];for(const e of t){const t=e.toString()+"/p2p/"+n.toString(),i=cr(t);s.push(t),r.push(i)}this.#G.set(n,s),this.#j=!0,this.#ce(!0),this.#fe(n)||this.#ge(r)}}async#Le(){if(console.log("#dialKnownDNSonly()"),!navigator.onLine)return;if(!this.#ne)return;const e=c,t=l,n=await fetch(e+"?name="+t+"&type=txt"),r=(await n.json()).Answer;for(const e of r){const t=e.data.split("/"),n=t.pop(),r="_dnsaddr."+t[2];this.#Be(n,r)}}async#Be(e,t){const n=c,r=await fetch(n+"?name="+t+"&type=txt"),s=(await r.json()).Answer;let i=[],o=[];for(const e of s){const t=e.data.split("=")[1],n=cr(t);i.push(n),o.push(t)}this.#j=!0,this.#ce(!0),this.#G.set(e,o),this.#G.set(e,o),this.#fe(e)||(this.#ge(i),this.#Pe(i))}async#ke(e){const t=e.filter((e=>e.protoNames().includes("webtransport")&&e.protoNames().includes("certhash")));for(const e of t)try{return void await this.#V.dial(e)}catch(e){}}async#Pe(e){const t=e.filter((e=>e.protoNames().includes("wss")));for(const e of t)try{return void await this.#V.dial(e)}catch(e){}}static async createWebpeer(){const e=new Ig(r);await e.open();const t=m;for(const e of t){const t=e.Peers[0].Addrs;e.Peers[0].ID;for(const e of t)e.includes("webtransport")&&e.includes("certhash")}let n=()=>{};let s=!1,o=()=>{};o=e=>{s=e};let a=!0,c=()=>{};(e=>{c=e})((e=>{a=e}));let l=[];l.push("/webrtc");const u=atob("dHVybjp0dXJuMDEuYnJpZS5maTo1MzQ5"),p=atob("YnJpZQ=="),f=atob("Zmk="),g=atob("dHVybjpyZWxheTEuZXhwcmVzc3R1cm4uY29tOjM0Nzg="),y=atob("ZWZJSllZNjdDNElRMzFZQUlP"),w=atob("Vk01SmdhODlkYjJaWU9aSA=="),b=await new Promise((e=>{let t=!1,n=!1;const r=setTimeout((()=>{let r=[];if(t)r.push(t);else{const e={urls:"stun:global.stun.twilio.com:3478"};r.push(e)}if(n)r.push(n);else{const e={urls:g,username:y,credential:w};r.push(e)}e(r)}),5e3);function s(){if(t&&n){let s=[];s.push(t),s.push(n),clearTimeout(r),e(s)}}const i=new RTCPeerConnection({iceServers:[{urls:d},{urls:u,username:p,credential:f}]});i.onicecandidate=e=>{e.candidate&&("srflx"==e.candidate.type&&(t={urls:d},s()),"relay"==e.candidate.type&&(n={urls:u,username:p,credential:f},s()))},i.onicecandidateerror=e=>{console.debug(e)},i.createDataChannel("webpeerjs"),i.createOffer().then((e=>i.setLocalDescription(e)))})),v=await async function(e={}){const t=await eg(e);return!1!==e.start&&await t.start(),t}({addresses:{listen:l},transports:[Wm(),Zy(),(E={rtcConfiguration:{iceServers:b}},e=>new Mw(e,E)),$b({discoverRelays:1,reservationConcurrency:1,maxReservationQueueLength:3})],connectionManager:{maxConnections:50,minConnections:0,autoDialInterval:6e4,autoDialConcurrency:0,autoDialMaxQueueLength:0,autoDialPriority:1e3,autoDialDiscoveredPeersDebounce:6e4,maxParallelDials:3,dialTimeout:5e3,maxIncomingPendingConnections:5,maxDialQueueLength:10,inboundConnectionThreshold:3,maxPeerAddrsToDial:2,inboundUpgradeTimeout:5e3},connectionEncryption:[Mm()],streamMuxers:[mb({maxInboundStreams:100,maxOutboundStreams:100})],connectionGater:{filterMultiaddrForPeer:async(e,t)=>{const n=t.toString();return!n.includes("/ip4/127.0.0.1")&&!n.includes("/ip6/")&&(n.includes("/ws/")||n.includes("/wss/")?s:a)},denyDialMultiaddr:async e=>{const t=e.toString();return!(!t.includes("/ip4/127.0.0.1")&&!t.includes("/ip6/"))||(t.includes("/ws/")||t.includes("/wss/")?!s:!a)}},peerDiscovery:[vb({interval:5e3,topics:i,listenOnly:!1})],services:{pubsub:Uv({allowPublishToZeroTopicPeers:!0,msgIdFn:Zr,ignoreDuplicatePublishError:!0,runOnTransientConnection:h}),identify:zv(),identifyPush:Wv(),aminoDHT:oS({protocol:"/ipfs/kad/1.0.0",peerInfoMapper:vE,clientMode:!1}),dcutr:qw()},peerStore:{persistence:!0,threshold:1},metrics:hS({onMetrics:e=>{n(e)},intervalMs:1e3})});var E;return await v.services.aminoDHT.setMode("server"),new dS(v,e,(e=>n=e),o,c)}}export{dS as webpeerjs};
|