webpeerjs 0.1.3 โ 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/esm/webpeerjs.js +18 -18
- package/dist/umd/webpeerjs.js +19 -19
- package/package.json +1 -1
- package/src/config.js +12 -2
- package/src/utils.js +1 -0
- package/src/webpeerjs.js +117 -13
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=["_peer-discovery._p2p._pubsub",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=!0,d=["QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN","QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb","QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt","QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ"],p=["12D3KooWFhXabKDwALpzqMbto94sB7rvmZ6M28hs9Y9xSopDKwQr"],f=d.concat(p),g=[{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 m(e=0){return new Uint8Array(e)}function y(e=0){return new Uint8Array(e)}const w=Math.pow(2,7),b=Math.pow(2,14),v=Math.pow(2,21),E=Math.pow(2,28),S=Math.pow(2,35),_=Math.pow(2,42),I=Math.pow(2,49),R=128,A=127;function T(e){if(e<w)return 1;if(e<b)return 2;if(e<v)return 3;if(e<E)return 4;if(e<S)return 5;if(e<_)return 6;if(e<I)return 7;if(null!=Number.MAX_SAFE_INTEGER&&e>Number.MAX_SAFE_INTEGER)throw new RangeError("Could not encode varint");return 8}function D(e,t,n=0){switch(T(e)){case 8:t[n++]=255&e|R,e/=128;case 7:t[n++]=255&e|R,e/=128;case 6:t[n++]=255&e|R,e/=128;case 5:t[n++]=255&e|R,e/=128;case 4:t[n++]=255&e|R,e>>>=7;case 3:t[n++]=255&e|R,e>>>=7;case 2:t[n++]=255&e|R,e>>>=7;case 1:t[n++]=255&e,e>>>=7;break;default:throw new Error("unreachable")}return t}function k(e,t){let n=e[t],r=0;if(r+=n&A,n<R)return r;if(n=e[t+1],r+=(n&A)<<7,n<R)return r;if(n=e[t+2],r+=(n&A)<<14,n<R)return r;if(n=e[t+3],r+=(n&A)<<21,n<R)return r;if(n=e[t+4],r+=(n&A)*E,n<R)return r;if(n=e[t+5],r+=(n&A)*S,n<R)return r;if(n=e[t+6],r+=(n&A)*_,n<R)return r;if(n=e[t+7],r+=(n&A)*I,n<R)return r;throw new RangeError("Could not decode varint")}function P(e,t,n=0){return null==t&&(t=y(T(e))),t instanceof Uint8Array?D(e,t,n):function(e,t,n=0){switch(T(e)){case 8:t.set(n++,255&e|R),e/=128;case 7:t.set(n++,255&e|R),e/=128;case 6:t.set(n++,255&e|R),e/=128;case 5:t.set(n++,255&e|R),e/=128;case 4:t.set(n++,255&e|R),e>>>=7;case 3:t.set(n++,255&e|R),e>>>=7;case 2:t.set(n++,255&e|R),e>>>=7;case 1:t.set(n++,255&e),e>>>=7;break;default:throw new Error("unreachable")}return t}(e,t,n)}function C(e,t=0){return e instanceof Uint8Array?k(e,t):function(e,t){let n=e.get(t),r=0;if(r+=n&A,n<R)return r;if(n=e.get(t+1),r+=(n&A)<<7,n<R)return r;if(n=e.get(t+2),r+=(n&A)<<14,n<R)return r;if(n=e.get(t+3),r+=(n&A)<<21,n<R)return r;if(n=e.get(t+4),r+=(n&A)*E,n<R)return r;if(n=e.get(t+5),r+=(n&A)*S,n<R)return r;if(n=e.get(t+6),r+=(n&A)*_,n<R)return r;if(n=e.get(t+7),r+=(n&A)*I,n<R)return r;throw new RangeError("Could not decode varint")}(e,t)}const x=new Float32Array([-0]),N=new Uint8Array(x.buffer);function M(e,t,n){x[0]=e,t[n]=N[0],t[n+1]=N[1],t[n+2]=N[2],t[n+3]=N[3]}const O=new Float64Array([-0]),L=new Uint8Array(O.buffer);function B(e,t,n){O[0]=e,t[n]=L[0],t[n+1]=L[1],t[n+2]=L[2],t[n+3]=L[3],t[n+4]=L[4],t[n+5]=L[5],t[n+6]=L[6],t[n+7]=L[7]}const U=BigInt(Number.MAX_SAFE_INTEGER),F=BigInt(Number.MIN_SAFE_INTEGER);class V{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 K;if(e<U&&e>F)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>$&&(r=0n,++n>$&&(n=0n))),new V(Number(r),Number(n))}static fromNumber(e){if(0===e)return K;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 V(n,r)}static from(e){return"number"==typeof e?V.fromNumber(e):"bigint"==typeof e?V.fromBigInt(e):"string"==typeof e?V.fromBigInt(BigInt(e)):null!=e.low||null!=e.high?new V(e.low>>>0,e.high>>>0):K}}const K=new V(0,0);K.toBigInt=function(){return 0n},K.zzEncode=K.zzDecode=function(){return this},K.length=function(){return 1};const $=4294967296n;function q(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 H(e,t){return RangeError(`index out of range: ${e.pos} + ${t??1} > ${e.len}`)}function z(e,t){return(e[t-4]|e[t-3]<<8|e[t-2]<<16|e[t-1]<<24)>>>0}class W{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,H(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 H(this,4);return z(this.buf,this.pos+=4)}sfixed32(){if(this.pos+4>this.len)throw H(this,4);return 0|z(this.buf,this.pos+=4)}float(){if(this.pos+4>this.len)throw H(this,4);const e=(t=this.buf,n=this.pos,N[0]=t[n],N[1]=t[n+1],N[2]=t[n+2],N[3]=t[n+3],x[0]);var t,n;return this.pos+=4,e}double(){if(this.pos+8>this.len)throw H(this,4);const e=(t=this.buf,n=this.pos,L[0]=t[n],L[1]=t[n+1],L[2]=t[n+2],L[3]=t[n+3],L[4]=t[n+4],L[5]=t[n+5],L[6]=t[n+6],L[7]=t[n+7],O[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 H(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 H(this,e);this.pos+=e}else do{if(this.pos>=this.len)throw H(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 V(0,0);let t=0;if(!(this.len-this.pos>4)){for(;t<3;++t){if(this.pos>=this.len)throw H(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 H(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 H(this,8);const e=z(this.buf,this.pos+=4),t=z(this.buf,this.pos+=4);return new V(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=k(this.buf,this.pos);return this.pos+=T(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 j(e,t,n){const r=function(e){return new W(e instanceof Uint8Array?e:e.subarray())}(e);return t.decode(r,void 0,n)}function G(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 Y=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`)}}},Q=Y;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 Z=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 ee(this,e)}};class X{decoders;constructor(e){this.decoders=e}or(e){return ee(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 ee(e,t){return new X({...e.decoders??{[e.prefix]:e},...t.decoders??{[t.prefix]:t}})}class te{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 Z(e,t,r)}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}}function ne({name:e,prefix:t,encode:n,decode:r}){return new te(e,t,n,r)}function re({name:e,prefix:t,alphabet:n}){const{encode:r,decode:s}=Q(n,e);return ne({prefix:t,name:e,encode:r,decode:e=>G(s(e))})}function se({name:e,prefix:t,bitsPerChar:n,alphabet:r}){return ne({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 ie=re({prefix:"9",name:"base10",alphabet:"0123456789"});var oe=Object.freeze({__proto__:null,base10:ie});const ae=se({prefix:"f",name:"base16",alphabet:"0123456789abcdef",bitsPerChar:4}),ce=se({prefix:"F",name:"base16upper",alphabet:"0123456789ABCDEF",bitsPerChar:4});var le=Object.freeze({__proto__:null,base16:ae,base16upper:ce});const ue=se({prefix:"0",name:"base2",alphabet:"01",bitsPerChar:1});var he=Object.freeze({__proto__:null,base2:ue});const de=Array.from("๐๐ชโ๐ฐ๐๐๐๐๐๐๐๐๐๐๐๐๐โ๐ป๐ฅ๐พ๐ฟ๐โค๐๐คฃ๐๐๐๐ญ๐๐๐
๐๐๐ฅ๐ฅฐ๐๐๐๐ข๐ค๐๐๐ช๐โบ๐๐ค๐๐๐๐๐น๐คฆ๐๐โโจ๐คท๐ฑ๐๐ธ๐๐๐๐๐๐๐๐๐คฉ๐๐๐ค๐๐ฏ๐๐๐ถ๐๐คญโฃ๐๐๐๐ช๐๐ฅ๐๐๐ฉ๐ก๐คช๐๐ฅณ๐ฅ๐คค๐๐๐ณโ๐๐๐ด๐๐ฌ๐๐๐ท๐ป๐โญโ
๐ฅบ๐๐๐ค๐ฆโ๐ฃ๐๐โน๐๐๐ โ๐๐บ๐๐ป๐๐๐๐๐น๐ฃ๐ซ๐๐๐ต๐ค๐๐ด๐ค๐ผ๐ซโฝ๐คโ๐๐คซ๐๐ฎ๐๐ป๐๐ถ๐๐ฒ๐ฟ๐งก๐โก๐๐โโ๐๐ฐ๐คจ๐ถ๐ค๐ถ๐ฐ๐๐ข๐ค๐๐จ๐จ๐คฌโ๐๐บ๐ค๐๐๐ฑ๐๐ถ๐ฅดโถโกโ๐๐ธโฌ๐จ๐๐ฆ๐ท๐บโ ๐
๐๐ต๐๐คฒ๐ค ๐คง๐๐ต๐
๐ง๐พ๐๐๐ค๐๐คฏ๐ทโ๐ง๐ฏ๐๐๐ค๐๐โ๐ด๐ฃ๐ธ๐๐๐ฅ๐คข๐
๐ก๐ฉ๐๐ธ๐ป๐ค๐คฎ๐ผ๐ฅต๐ฉ๐๐๐ผ๐๐ฃ๐ฅ"),pe=de.reduce(((e,t,n)=>(e[n]=t,e)),[]),fe=de.reduce(((e,t,n)=>(e[t.codePointAt(0)]=n,e)),[]);const ge=ne({prefix:"๐",name:"base256emoji",encode:function(e){return e.reduce(((e,t)=>e+=pe[t]),"")},decode:function(e){const t=[];for(const n of e){const e=fe[n.codePointAt(0)];if(void 0===e)throw new Error(`Non-base256emoji character: ${n}`);t.push(e)}return new Uint8Array(t)}});var me=Object.freeze({__proto__:null,base256emoji:ge});const ye=se({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5}),we=se({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5}),be=se({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5}),ve=se({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5}),Ee=se({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5}),Se=se({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5}),_e=se({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5}),Ie=se({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5}),Re=se({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});var Ae=Object.freeze({__proto__:null,base32:ye,base32hex:Ee,base32hexpad:_e,base32hexpadupper:Ie,base32hexupper:Se,base32pad:be,base32padupper:ve,base32upper:we,base32z:Re});const Te=re({prefix:"k",name:"base36",alphabet:"0123456789abcdefghijklmnopqrstuvwxyz"}),De=re({prefix:"K",name:"base36upper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"});var ke=Object.freeze({__proto__:null,base36:Te,base36upper:De});const Pe=re({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),Ce=re({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var xe=Object.freeze({__proto__:null,base58btc:Pe,base58flickr:Ce});const Ne=se({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),Me=se({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),Oe=se({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),Le=se({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});var Be=Object.freeze({__proto__:null,base64:Ne,base64pad:Me,base64url:Oe,base64urlpad:Le});const Ue=se({prefix:"7",name:"base8",alphabet:"01234567",bitsPerChar:3});var Fe=Object.freeze({__proto__:null,base8:Ue});const Ve=ne({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 Ke=Object.freeze({__proto__:null,identity:Ve});new TextEncoder,new TextDecoder;var $e=function e(t,n,r){n=n||[];var s=r=r||0;for(;t>=ze;)n[r++]=255&t|qe,t/=128;for(;t&He;)n[r++]=255&t|qe,t>>>=7;return n[r]=0|t,e.bytes=r-s+1,n},qe=128,He=-128,ze=Math.pow(2,31);var We=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&Ge)<<i:(r&Ge)*Math.pow(2,i),i+=7}while(r>=je);return e.bytes=o-n,s},je=128,Ge=127;var Ye=Math.pow(2,7),Qe=Math.pow(2,14),Je=Math.pow(2,21),Ze=Math.pow(2,28),Xe=Math.pow(2,35),et=Math.pow(2,42),tt=Math.pow(2,49),nt=Math.pow(2,56),rt=Math.pow(2,63),st={encode:$e,decode:We,encodingLength:function(e){return e<Ye?1:e<Qe?2:e<Je?3:e<Ze?4:e<Xe?5:e<et?6:e<tt?7:e<nt?8:e<rt?9:10}};function it(e,t=0){return[st.decode(e,t),st.decode.bytes]}function ot(e,t,n=0){return st.encode(e,t,n),t}function at(e){return st.encodingLength(e)}function ct(e,t){const n=t.byteLength,r=at(e),s=r+at(n),i=new Uint8Array(s+n);return ot(e,i,0),ot(n,i,r),i.set(t,s),new ut(e,n,t,i)}function lt(e){const t=G(e),[n,r]=it(t),[s,i]=it(t.subarray(r)),o=t.subarray(r+i);if(o.byteLength!==s)throw new Error("Incorrect length");return new ut(n,s,o,t)}class ut{code;size;digest;bytes;constructor(e,t,n,r){this.code=e,this.size=t,this.digest=n,this.bytes=r}}const ht=G;const dt={code:0,name:"identity",encode:ht,digest:function(e){return ct(0,ht(e))}};class pt{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?ct(this.code,t):t.then((e=>ct(this.code,e)))}throw Error("Unknown type, must be binary type")}}const ft=function({name:e,code:t,encode:n}){return new pt(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 gt(e,t){const{bytes:n,version:r}=e;return 0===r?function(e,t,n){const{prefix:r}=n;if(r!==Pe.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,yt(e),t??Pe.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,yt(e),t??ye.encoder)}const mt=new WeakMap;function yt(e){const t=mt.get(e);if(null==t){const t=new Map;return mt.set(e,t),t}return t}class wt{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!==bt)throw new Error("Cannot convert a non dag-pb CID to CIDv0");if(t.code!==vt)throw new Error("Cannot convert non sha2-256 multihash CID to CIDv0");return wt.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=ct(e,t);return wt.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 wt.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 gt(this,e)}toJSON(){return{"/":gt(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 wt)return t;if(null!=t["/"]&&t["/"]===t.bytes||t.asCID===t){const{version:e,code:n,multihash:r,bytes:s}=t;return new wt(e,n,r,s??Et(e,n,r.bytes))}if(!0===t[St]){const{version:e,multihash:n,code:r}=t,s=lt(n);return wt.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!==bt)throw new Error(`Version 0 CID must use dag-pb (code: ${bt}) block encoding`);return new wt(e,t,n,n.bytes);case 1:{const r=Et(e,t,n.bytes);return new wt(e,t,n,r)}default:throw new Error("Invalid version")}}static createV0(e){return wt.create(0,bt,e)}static createV1(e,t){return wt.create(1,e,t)}static decode(e){const[t,n]=wt.decodeFirst(e);if(0!==n.length)throw new Error("Incorrect length");return t}static decodeFirst(e){const t=wt.inspectBytes(e),n=t.size-t.multihashSize,r=G(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 ut(t.multihashCode,t.digestSize,s,r);return[0===t.version?wt.createV0(i):wt.createV1(t.codec,i),e.subarray(t.size)]}static inspectBytes(e){let t=0;const n=()=>{const[n,r]=it(e.subarray(t));return t+=r,n};let r=n(),s=bt;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??Pe;return[Pe.prefix,n.decode(`${Pe.prefix}${e}`)]}case Pe.prefix:{const n=t??Pe;return[Pe.prefix,n.decode(e)]}case ye.prefix:{const n=t??ye;return[ye.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=wt.decode(r);if(0===s.version&&"Q"!==e[0])throw Error("Version 0 CID string must not include multibase prefix");return yt(s).set(n,e),s}}const bt=112,vt=18;function Et(e,t,n){const r=at(e),s=r+at(t),i=new Uint8Array(s+n.byteLength);return ot(e,i,0),ot(t,i,r),i.set(n,s),i}const St=Symbol.for("@ipld/js-cid/CID"),_t={...Ke,...he,...Fe,...oe,...le,...Ae,...ke,...xe,...Be,...me};function It(e,t,n,r){return{name:e,prefix:t,encoder:{name:e,prefix:t,encode:n},decoder:{decode:r}}}const Rt=It("utf8","u",(e=>"u"+new TextDecoder("utf8").decode(e)),(e=>(new TextEncoder).encode(e.substring(1)))),At=It("ascii","a",(e=>{let t="a";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return t}),(e=>{const t=y((e=e.substring(1)).length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);return t})),Tt={utf8:Rt,"utf-8":Rt,hex:_t.base16,latin1:At,ascii:At,binary:At,..._t};function Dt(e,t="utf8"){const n=Tt[t];if(null==n)throw new Error(`Unsupported encoding "${t}"`);return n.decoder.decode(`${n.prefix}${e}`)}class kt{fn;len;next;val;constructor(e,t,n){this.fn=e,this.len=t,this.next=void 0,this.val=n}}function Pt(){}class Ct{head;tail;len;next;constructor(e){this.head=e.head,this.tail=e.tail,this.len=e.len,this.next=e.states}}const xt=function(e){const t=8192;let n,r=t;return function(e){if(e<1||e>4096)return y(e);r+e>t&&(n=y(t),r=0);const s=n.subarray(r,r+=e);return 7&r&&(r=1+(7|r)),s}}();class Nt{len;head;tail;states;constructor(){this.len=0,this.head=new kt(Pt,0,0),this.tail=this.head,this.states=null}_push(e,t,n){return this.tail=this.tail.next=new kt(e,t,n),this.len+=t,this}uint32(e){return this.len+=(this.tail=this.tail.next=new Lt((e>>>=0)<128?1:e<16384?2:e<2097152?3:e<268435456?4:5,e)).len,this}int32(e){return e<0?this._push(Bt,10,V.fromNumber(e)):this.uint32(e)}sint32(e){return this.uint32((e<<1^e>>31)>>>0)}uint64(e){const t=V.fromBigInt(e);return this._push(Bt,t.length(),t)}uint64Number(e){return this._push(D,T(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=V.fromBigInt(e).zzEncode();return this._push(Bt,t.length(),t)}sint64Number(e){const t=V.fromNumber(e).zzEncode();return this._push(Bt,t.length(),t)}sint64String(e){return this.sint64(BigInt(e))}bool(e){return this._push(Mt,1,e?1:0)}fixed32(e){return this._push(Ut,4,e>>>0)}sfixed32(e){return this.fixed32(e)}fixed64(e){const t=V.fromBigInt(e);return this._push(Ut,4,t.lo)._push(Ut,4,t.hi)}fixed64Number(e){const t=V.fromNumber(e);return this._push(Ut,4,t.lo)._push(Ut,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(M,4,e)}double(e){return this._push(B,8,e)}bytes(e){const t=e.length>>>0;return 0===t?this._push(Mt,1,0):this.uint32(t)._push(Ft,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(q,t,e):this._push(Mt,1,0)}fork(){return this.states=new Ct(this),this.head=this.tail=new kt(Pt,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 kt(Pt,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?y(n):xt(n));var n;let r=0;for(;null!=e;)e.fn(e.val,t,r),r+=e.len,e=e.next;return t}}function Mt(e,t,n){t[n]=255&e}function Ot(e,t,n){for(;e>127;)t[n++]=127&e|128,e>>>=7;t[n]=e}class Lt extends kt{next;constructor(e,t){super(Ot,e,t),this.next=void 0}}function Bt(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 Ut(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 Ft(e,t,n){t.set(e,n)}function Vt(e,t,n){t.set(e,n)}function Kt(e,t,n){e.length<40?q(e,t,n):null!=t.utf8Write?t.utf8Write(e,n):t.set(Dt(e),n)}function $t(e,t){const n=new Nt;return t.encode(e,n,{lengthDelimited:!1}),n.finish()}var qt;function Ht(e,t,n,r){return{name:e,type:t,encode:n,decode:r}}function zt(e){function t(t){if(null==e[t.toString()])throw new Error("Invalid enum value");return e[t]}return Ht("enum",qt.VARINT,(function(e,n){const r=t(e);n.int32(r)}),(function(e){return t(e.int32())}))}function Wt(e,t){return Ht("message",qt.LENGTH_DELIMITED,e,t)}null!=globalThis.Buffer&&(Nt.prototype.bytes=function(e){const t=e.length>>>0;return this.uint32(t),t>0&&this._push(Vt,t,e),this},Nt.prototype.string=function(e){const t=globalThis.Buffer.byteLength(e);return this.uint32(t),t>0&&this._push(Kt,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"}(qt||(qt={}));let jt=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=["_peer-discovery._p2p._pubsub",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}};
|
|
3
3
|
//! WebPEER.js -- https://github.com/nuzulul/webpeerjs
|
|
4
|
-
var Gt;function Yt(e,t="utf8"){const n=Tt[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=Wt(((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:m(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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(Gt||(Gt={}));const Qt="/",Jt=(new TextEncoder).encode(Qt),Zt=Jt[0];class Xt{_buf;constructor(e,t){if("string"==typeof e)this._buf=Dt(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]!==Zt)throw new Error("Invalid key")}toString(e="utf8"){return Yt(this._buf,e)}uint8Array(){return this._buf}get[Symbol.toStringTag](){return`Key(${this.toString()})`}static withNamespaces(e){return new Xt(e.join(Qt))}static random(){return new Xt(Math.random().toString().substring(2))}static asKey(e){return e instanceof Uint8Array||"string"==typeof e?new Xt(e):"function"==typeof e.uint8Array?new Xt(e.uint8Array()):null}clean(){if(null!=this._buf&&0!==this._buf.byteLength||(this._buf=Jt),this._buf[0]!==Zt){const e=new Uint8Array(this._buf.byteLength+1);e.fill(Zt,0,1),e.set(this._buf,1),this._buf=e}for(;this._buf.byteLength>1&&this._buf[this._buf.byteLength-1]===Zt;)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 Xt.withNamespaces(this.list().slice().reverse())}namespaces(){return this.list()}baseNamespace(){const e=this.namespaces();return e[e.length-1]}list(){return this.toString().split(Qt).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 Xt(this.toString()+":"+e)}path(){let e=this.parent().toString();return e.endsWith(Qt)||(e+=Qt),e+=this.type(),new Xt(e)}parent(){const e=this.list();return 1===e.length?new Xt(Qt):new Xt(e.slice(0,-1).join(Qt))}child(e){return this.toString()===Qt?e:e.toString()===Qt?this:new Xt(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 Xt.withNamespaces([...this.namespaces(),...(t=e.map((e=>e.namespaces())),[].concat(...t))]);var t}}const en=Symbol.for("@libp2p/connection"),tn=Symbol.for("@libp2p/content-routing"),nn=Symbol.for("@libp2p/peer-discovery"),rn=Symbol.for("@libp2p/peer-id");function sn(e){return null!=e&&Boolean(e[rn])}const on=Symbol.for("@libp2p/peer-routing"),an="StrictSign",cn="StrictNoSign";var ln;!function(e){e.Accept="accept",e.Ignore="ignore",e.Reject="reject"}(ln||(ln={}));const un=Symbol.for("@libp2p/transport");var hn;!function(e){e[e.FATAL_ALL=0]="FATAL_ALL",e[e.NO_FATAL=1]="NO_FATAL"}(hn||(hn={}));let dn=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"},pn=class extends Error{code;props;constructor(e,t,n){super(e),this.code=t,this.name=n?.name??"CodeError",this.props=n??{}}};class fn extends AggregateError{code;props;constructor(e,t,n,r){super(e,t),this.code=n,this.name=r?.name??"AggregateCodeError",this.props=r??{}}}const gn="ERR_TIMEOUT",mn="ERR_INVALID_MESSAGE";class yn 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 bn(e,t))}}class wn extends Event{detail;constructor(e,t){super(e,t),this.detail=t?.detail}}const bn=globalThis.CustomEvent??wn;function vn(e){return null!=e&&"function"==typeof e.start&&"function"==typeof e.stop}const En=Symbol.for("@libp2p/service-capabilities"),Sn=Symbol.for("@libp2p/service-dependencies");function _n(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 In(e,t){null==t&&(t=e.reduce(((e,t)=>e+t.length),0));const n=y(t);let r=0;for(const t of e)n.set(t,r),r+=t.length;return n}const Rn=45,An=15,Tn=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 Dn(e){return Boolean(function(e){if(!(e.length>An))return Tn.new(e).parseWith((()=>Tn.readIPv4Addr()))}(e))}function kn(e){return Boolean(function(e){if(e.includes("%")&&(e=e.split("%")[0]),!(e.length>Rn))return Tn.new(e).parseWith((()=>Tn.readIPv6Addr()))}(e))}function Pn(e){return Boolean(function(e){if(e.includes("%")&&(e=e.split("%")[0]),!(e.length>Rn))return Tn.new(e).parseWith((()=>Tn.readIPAddr()))}(e))}const Cn=Dn,xn=kn,Nn=function(e){let t=0;if(e=e.toString().trim(),Cn(e)){const n=new Uint8Array(t+4);return e.split(/\./g).forEach((e=>{n[t++]=255&parseInt(e,10)})),n}if(xn(e)){const n=e.split(":",8);let r;for(r=0;r<n.length;r++){let e;Cn(n[r])&&(e=Nn(n[r]),n[r]=Yt(e.slice(0,2),"base16")),null!=e&&++r<8&&n.splice(r,0,Yt(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")},Mn=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""},On=-1,Ln={},Bn={};function Un(e){if("number"==typeof e){if(null!=Bn[e])return Bn[e];throw new Error(`no protocol with code: ${e}`)}if("string"==typeof e){if(null!=Ln[e])return Ln[e];throw new Error(`no protocol with name: ${e}`)}throw new Error("invalid protocol id type: "+typeof e)}function Fn(e,t){switch(Un(e).code){case 4:case 41:return function(e){const t=Mn(e,0,e.length);if(null==t)throw new Error("ipBuff is required");if(!Pn(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 jn(t);case 6:case 273:case 33:case 132:return zn(t).toString();case 421:return function(e){const t=C(e),n=e.slice(T(t));if(n.length!==t)throw new Error("inconsistent lengths");return Yt(n,"base58btc")}(t);case 444:case 445:return Gn(t);case 466:return function(e){const t=C(e),n=e.slice(T(t));if(n.length!==t)throw new Error("inconsistent lengths");return"u"+Yt(n,"base64url")}(t);case 481:return globalThis.encodeURIComponent(jn(t));default:return Yt(t,"base16")}}function Vn(e,t){switch(Un(e).code){case 4:case 41:return qn(t);case 42:case 53:case 54:case 55:case 56:case 400:case 449:case 777:return Wn(t);case 6:case 273:case 33:case 132:return Hn(parseInt(t,10));case 421:return function(e){let t;t="Q"===e[0]||"1"===e[0]?lt(Pe.decode(`z${e}`)).bytes:wt.parse(e).multihash.bytes;const n=Uint8Array.from(P(t.length));return In([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=ye.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=Hn(r);return In([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=ye.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=Hn(r);return In([n,s],n.length+s.length)}(t);case 466:return function(e){const t=$n.decode(e),n=Uint8Array.from(P(t.length));return In([n,t],n.length+t.length)}(t);case 481:return Wn(globalThis.decodeURIComponent(t));default:return Dt(t,"base16")}}[[4,32,"ip4"],[6,16,"tcp"],[33,16,"dccp"],[41,128,"ip6"],[42,On,"ip6zone"],[43,8,"ipcidr"],[53,On,"dns",!0],[54,On,"dns4",!0],[55,On,"dns6",!0],[56,On,"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,On,"unix",!1,!0],[421,On,"ipfs"],[421,On,"p2p"],[443,0,"https"],[444,96,"onion"],[445,296,"onion3"],[446,On,"garlic64"],[448,0,"tls"],[449,On,"sni"],[460,0,"quic"],[461,0,"quic-v1"],[465,0,"webtransport"],[466,On,"certhash"],[477,0,"ws"],[478,0,"wss"],[479,0,"p2p-websocket-star"],[480,0,"http"],[481,On,"http-path"],[777,On,"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);Bn[t.code]=t,Ln[t.name]=t})),Un("ip4"),Un("ip6"),Un("ipcidr");const Kn=Object.values(_t).map((e=>e.decoder)),$n=function(){let e=Kn[0].or(Kn[1]);return Kn.slice(2).forEach((t=>e=e.or(t))),e}();function qn(e){if(!Pn(e))throw new Error("invalid ip address");return Nn(e)}function Hn(e){const t=new ArrayBuffer(2);return new DataView(t).setUint16(0,e),new Uint8Array(t)}function zn(e){return new DataView(e.buffer).getUint16(e.byteOffset)}function Wn(e){const t=Dt(e),n=Uint8Array.from(P(t.length));return In([n,t],n.length+t.length)}function jn(e){const t=C(e);if((e=e.slice(T(t))).length!==t)throw new Error("inconsistent lengths");return Yt(e)}function Gn(e){const t=e.slice(0,e.length-2),n=e.slice(e.length-2);return`${Yt(t,"base32")}:${zn(n)}`}function Yn(e){const t=[],n=[];let r=null,s=0;for(;s<e.length;){const i=C(e,s),o=T(i),a=Un(i),c=Zn(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 er("Invalid address Uint8Array: "+Yt(e,"base16"));t.push([i,l]);const u=Fn(i,l);if(n.push([i,u]),!0===a.path){r=u;break}}return{bytes:Uint8Array.from(e),string:Qn(n),tuples:t,stringTuples:n,path:r}}function Qn(e){const t=[];return e.map((e=>{const n=Un(e[0]);return t.push(n.name),e.length>1&&null!=e[1]&&t.push(e[1]),null})),Xn(t.join("/"))}function Jn(e){return In(e.map((e=>{const t=Un(e[0]);let n=Uint8Array.from(P(t.code));return e.length>1&&null!=e[1]&&(n=In([n,e[1]])),n})))}function Zn(e,t){if(e.size>0)return e.size/8;if(0===e.size)return 0;{const e=C(t instanceof Uint8Array?t:Uint8Array.from(t));return e+T(e)}}function Xn(e){return"/"+e.trim().split("/").filter((e=>e)).join("/")}function er(e){return new Error("Error parsing address: "+e)}const tr=Symbol.for("nodejs.util.inspect.custom"),nr=Symbol.for("@multiformats/js-multiaddr/multiaddr"),rr=[Un("dns").code,Un("dns4").code,Un("dns6").code,Un("dnsaddr").code];class sr{bytes;#t;#n;#r;#s;[nr]=!0;constructor(e){let t;if(null==e&&(e=""),e instanceof Uint8Array)t=Yn(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=Xn(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=Un(s[i]);if(0===o.size){t.push([o.code]),n.push([o.code]);continue}if(i++,i>=s.length)throw er("invalid address: "+e);if(!0===o.path){r=Xn(s.slice(i).join("/")),t.push([o.code,Vn(o.code,r)]),n.push([o.code,r]);break}const a=Vn(o.code,s[i]);t.push([o.code,a]),n.push([o.code,Fn(o.code,a)])}return{string:Qn(n),bytes:Jn(t),tuples:t,stringTuples:n,path:r}}(e)}else{if(!or(e))throw new Error("addr must be a string, Buffer, or another Multiaddr");t=Yn(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=Un("tcp"),o=Un("udp"),a=Un("ip4"),c=Un("ip6"),l=Un("dns6"),u=Un("ip6zone");for(const[h,d]of this.stringTuples())h===u.code&&(s=`%${d??""}`),rr.includes(h)&&(t=i.name,r=443,n=`${d??""}${s}`,e=h===l.code?6:4),h!==i.code&&h!==o.code||(t=Un(h).name,r=parseInt(d??"")),h!==a.code&&h!==c.code||(t=Un(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({},Un(e))))}protoCodes(){return this.#n.map((([e])=>e))}protoNames(){return this.#n.map((([e])=>Un(e).name))}tuples(){return this.#n}stringTuples(){return this.#r}encapsulate(e){return e=new sr(e),new sr(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 sr(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 sr(Jn(t.slice(0,n)));return this}getPeerId(){try{let e=[];this.stringTuples().forEach((([t,n])=>{t===Ln.p2p.code&&e.push([t,n]),t===Ln["p2p-circuit"].code&&(e=[])}));const t=e.pop();if(null!=t?.[1]){const e=t[1];return"Q"===e[0]||"1"===e[0]?Yt(Pe.decode(`z${e}`),"base58btc"):Yt(wt.parse(e).multihash.bytes,"base58btc")}return null}catch(e){return null}}getPath(){return this.#s}equals(e){return _n(this.bytes,e.bytes)}async resolve(e){const t=this.protos().find((e=>e.resolvable));if(null==t)return[this];const n=ir.get(t.name);if(null==n)throw new pn(`no available resolver for ${t.name}`,"ERR_NO_AVAILABLE_RESOLVER");return(await n(this,e)).map((e=>ar(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))}[tr](){return`Multiaddr(${this.#t})`}}const ir=new Map;function or(e){return Boolean(e?.[nr])}function ar(e){return new sr(e)}function cr(){const e={};return e.promise=new Promise(((t,n)=>{e.resolve=t,e.reject=n})),e}class lr{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 ur{size;hwm;head;tail;constructor(e={}){this.hwm=e.splitLimit??16,this.head=new lr(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 lr(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 hr=class extends Error{type;code;constructor(e,t){super(e??"The operation was aborted"),this.type="aborted",this.code=t??"ABORT_ERR"}};function dr(e={}){return function(e,t){t=t??{};let n,r,s,i=t.onEnd,o=new ur,a=cr();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=cr()}))}},l=e=>null!=r?r(e):(o.push(e),n),u=e=>(o=new ur,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 ur,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 hr)},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 pr(...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=dr({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 fr(e,...t){if(null==e)throw new Error("Empty pipeline");if(wr(e)){const t=e;e=()=>t.source}else if(yr(e)||mr(e)){const t=e;e=()=>t}const n=[e,...t];if(n.length>1&&wr(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++)wr(n[e])&&(n[e]=br(n[e]));return gr(...n)}const gr=(...e)=>{let t;for(;e.length>0;)t=e.shift()(t);return t},mr=e=>null!=e?.[Symbol.asyncIterator],yr=e=>null!=e?.[Symbol.iterator],wr=e=>null!=e&&(null!=e.sink&&null!=e.source),br=e=>t=>{const n=e.sink(t);if(null!=n?.then){const t=dr({objectMode:!0});let r;n.then((()=>{t.end()}),(e=>{t.end(e)}));const s=e.source;if(mr(s))r=async function*(){yield*s,t.end()};else{if(!yr(s))throw new Error("Unknown duplex source type - must be Iterable or AsyncIterable");r=function*(){yield*s,t.end()}}return pr(t,r())}return e.source},vr=Symbol.for("@achingbrain/uint8arraylist");function Er(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 Sr(e){return Boolean(e?.[vr])}class _r{bufs;length;[vr]=!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(!Sr(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(!Sr(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=Er(this.bufs,e);return t.buf[t.index]}set(e,t){const n=Er(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(!Sr(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 In(n,r)}subarray(e,t){const{bufs:n,length:r}=this._subList(e,t);return 1===n.length?n[0]:In(n,r)}sublist(e,t){const{bufs:n,length:r}=this._subList(e,t),s=new _r;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(!(Sr(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=y(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=m(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=m(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=m(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=y(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=m(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=m(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=m(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=m(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=m(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 _r))return!1;if(e.bufs.length!==this.bufs.length)return!1;for(let t=0;t<this.bufs.length;t++)if(!_n(this.bufs[t],e.bufs[t]))return!1;return!0}static fromUint8Arrays(e,t){const n=new _r;return n.bufs=e,null==t&&(t=e.reduce(((e,t)=>e+t.byteLength),0)),n.length=t,n}}let Ir=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 Rr(e,t,n){if(null==t)return e;if(t.aborted)return Promise.reject(new Ir(n?.errorMessage,n?.errorCode));let r;const s=new Ir(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 Ar{readNext;haveNext;ended;nextResult;constructor(){this.ended=!1,this.readNext=cr(),this.haveNext=cr()}[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=cr(),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=cr(),await Rr(this.readNext.promise,t?.signal,t)}}let Tr=class extends Error{code;constructor(e,t){super(e),this.code=t}},Dr=class extends Tr{type;constructor(e){super(e,"ABORT_ERR"),this.type="aborted"}};function kr(e,t){const n=new Ar;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 _r,i={read:async(e,t)=>{let n;t?.signal?.throwIfAborted();const i=new Promise(((e,r)=>{n=()=>{r(new Dr("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 _r:t}for(;s.byteLength<e;){const{value:e,done:t}=await Promise.race([r.next(),i]);if(!0===t)throw new Tr("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 Pr extends Error{code;constructor(e,t){super(e),this.code=t}}function Cr(e,t={}){const n=kr(e,t);null!=t.maxDataLength&&null==t.maxLengthLength&&(t.maxLengthLength=T(t.maxDataLength));const r=t?.lengthDecoder??C,s=t?.lengthEncoder??P;return{read:async e=>{let s=-1;const i=new _r;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 Pr("message length length too long","ERR_MSG_LENGTH_TOO_LONG");if(s>-1)break}if(null!=t?.maxDataLength&&s>t.maxDataLength)throw new Pr("message length too long","ERR_MSG_DATA_TOO_LONG");return n.read(s,e)},write:async(e,t)=>{await n.write(new _r(s(e.byteLength),e),t)},writeV:async(e,t)=>{const r=new _r(...e.flatMap((e=>[s(e.byteLength),e])));await n.write(r,t)},unwrap:()=>n.unwrap()}}function xr(e){return null!=e[Symbol.asyncIterator]}const Nr=e=>{const t=T(e),n=y(t);return P(e,n),Nr.bytes=t,n};function Mr(e,t){const n=(t=t??{}).lengthEncoder??Nr;function*r(e){const t=n(e.byteLength);t instanceof Uint8Array?yield t:yield*t,e instanceof Uint8Array?yield e:yield*e}return xr(e)?async function*(){for await(const t of e)yield*r(t)}():function*(){for(const t of e)yield*r(t)}()}Nr.bytes=0,Mr.single=(e,t)=>{const n=(t=t??{}).lengthEncoder??Nr;return new _r(n(e.byteLength),e)};var Or="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Lr(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function Br(e,t){for(const n in t)Object.defineProperty(e,n,{value:t[n],enumerable:!0,configurable:!0});return e}var Ur=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 Br(e,n)}catch(t){n.message=e.message,n.stack=e.stack;const r=function(){};r.prototype=Object.create(Object.getPrototypeOf(e));return Br(new r,n)}},Fr=Lr(Ur);var Vr;!function(e){e[e.LENGTH=0]="LENGTH",e[e.DATA=1]="DATA"}(Vr||(Vr={}));const Kr=e=>{const t=C(e);return Kr.bytes=T(t),t};function $r(e,t){const n=new _r;let r=Vr.LENGTH,s=-1;const i=t?.lengthDecoder??Kr,o=t?.maxLengthLength??8,a=t?.maxDataLength??4194304;function*c(){for(;n.byteLength>0;){if(r===Vr.LENGTH)try{if(s=i(n),s<0)throw Fr(new Error("invalid message length"),"ERR_INVALID_MSG_LENGTH");if(s>a)throw Fr(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=Vr.DATA}catch(e){if(e instanceof RangeError){if(n.byteLength>o)throw Fr(new Error("message length length too long"),"ERR_MSG_LENGTH_TOO_LONG");break}throw e}if(r===Vr.DATA){if(n.byteLength<s)break;const e=n.sublist(0,s);n.consume(s),null!=t?.onData&&t.onData(e),yield e,r=Vr.LENGTH}}}return xr(e)?async function*(){for await(const t of e)n.append(t),yield*c();if(n.byteLength>0)throw Fr(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 Fr(new Error("unexpected end of input"),"ERR_UNEXPECTED_EOF")}()}function qr(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 Hr(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=qr(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 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++)}()}
|
|
5
5
|
//! WebPEER.js -- https://github.com/nuzulul/webpeerjs
|
|
6
|
-
Kr.bytes=0,$r.fromReader=(e,t)=>{let n=1;return $r(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 zr=t,Wr=e=>new Error(`${zr}: ${e}`);function jr(e){return(new TextDecoder).decode(e)}function Gr(e){return(new TextEncoder).encode(e)}async function Yr(e){for await(const t of e)return t}async function Qr(e){const t=e,n=(new TextEncoder).encode(t.sequenceNumber.toString());return await ft.encode(n)}let Jr={readyErrored:0,noiseErrored:0,upgradeErrored:0,readyTimedout:0,noiseTimedout:0,success:0},Zr={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},Xr={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},es=!0,ts=0,ns=0;var rs,ss,is={exports:{}};function os(){if(ss)return rs;ss=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 rs=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 as=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=os(),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=as(t);const{formatters:n}=e.exports;n.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}(is,is.exports);var cs=Lr(is.exports);function ls(){return{forComponent:e=>us(e)}}function us(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 cs.enabled(`${e}:trace`)&&null!=cs.names.map((e=>e.toString())).find((e=>e.includes(":trace")))&&(t=cs(`${e}:trace`)),Object.assign(cs(e),{error:cs(`${e}:error`),trace:t})}cs.formatters.b=e=>null==e?"undefined":Pe.baseEncode(e),cs.formatters.t=e=>null==e?"undefined":ye.baseEncode(e),cs.formatters.m=e=>null==e?"undefined":Ne.baseEncode(e),cs.formatters.p=e=>null==e?"undefined":e.toString(),cs.formatters.c=e=>null==e?"undefined":e.toString(),cs.formatters.k=e=>null==e?"undefined":e.toString(),cs.formatters.a=e=>null==e?"undefined":e.toString();const hs=Symbol.for("nodejs.util.inspect.custom"),ds=Object.values(_t).map((e=>e.decoder)).reduce(((e,t)=>e.or(t)),_t.identity.decoder),ps=114,fs=36,gs=37;class ms{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()})`}[rn]=!0;toString(){return null==this.string&&(this.string=Pe.encode(this.multihash.bytes).slice(1)),this.string}toCID(){return wt.createV1(ps,this.multihash)}toBytes(){return this.multihash.bytes}toJSON(){return this.toString()}equals(e){if(null==e)return!1;if(e instanceof Uint8Array)return _n(this.multihash.bytes,e);if("string"==typeof e)return vs(e).equals(this);if(null!=e?.multihash?.bytes)return _n(this.multihash.bytes,e.multihash.bytes);throw new Error("not valid Id")}[hs](){return`PeerId(${this.toString()})`}}class ys extends ms{type="RSA";publicKey;constructor(e){super({...e,type:"RSA"}),this.publicKey=e.publicKey}}class ws extends ms{type="Ed25519";publicKey;constructor(e){super({...e,type:"Ed25519"}),this.publicKey=e.multihash.digest}}class bs extends ms{type="secp256k1";publicKey;constructor(e){super({...e,type:"secp256k1"}),this.publicKey=e.multihash.digest}}function vs(e,t){if(t=t??ds,"1"===e.charAt(0)||"Q"===e.charAt(0)){const t=lt(Pe.decode(`z${e}`));return e.startsWith("12D")?new ws({multihash:t}):e.startsWith("16U")?new bs({multihash:t}):new ys({multihash:t})}return Es(ds.decode(e))}function Es(e){try{const t=lt(e);if(t.code===dt.code){if(t.digest.length===fs)return new ws({multihash:t});if(t.digest.length===gs)return new bs({multihash:t})}if(t.code===ft.code)return new ys({multihash:t})}catch{return function(e){if(null==e||null==e.multihash||null==e.version||1===e.version&&e.code!==ps)throw new Error("Supplied PeerID CID is invalid");const t=e.multihash;if(t.code===ft.code)return new ys({multihash:e.multihash});if(t.code===dt.code){if(t.digest.length===fs)return new ws({multihash:e.multihash});if(t.digest.length===gs)return new bs({multihash:e.multihash})}throw new Error("Supplied PeerID CID is invalid")}(wt.decode(e))}throw new Error("Supplied PeerID CID is invalid")}async function Ss(e,t){return e.length===fs?new ws({multihash:ct(dt.code,e),privateKey:t}):e.length===gs?new bs({multihash:ct(dt.code,e),privateKey:t}):new ys({multihash:await ft.digest(e),publicKey:e,privateKey:t})}function _s(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*Is(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 Rs(e){return null!=e&&("function"==typeof e.then&&"function"==typeof e.catch&&"function"==typeof e.finally)}function As(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`positive integer expected, not ${e}`)}function Ts(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 Ds(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");As(e.outputLen),As(e.blockLen)}function ks(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 Ps="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,Cs=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),xs=(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}async function Zr(e){const t=e,n=(new TextEncoder).encode(t.sequenceNumber.toString());return await gt.encode(n)}let Jr={readyErrored:0,noiseErrored:0,upgradeErrored:0,readyTimedout:0,noiseTimedout:0,success:0},Xr={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},es={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},ts=!0,ns=0,rs=0;var ss,is,os={exports:{}};function as(){if(is)return ss;is=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 ss=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 cs=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=as(),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=cs(t);const{formatters:n}=e.exports;n.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}(os,os.exports);var ls=Br(os.exports);function us(){return{forComponent:e=>hs(e)}}function hs(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 ls.enabled(`${e}:trace`)&&null!=ls.names.map((e=>e.toString())).find((e=>e.includes(":trace")))&&(t=ls(`${e}:trace`)),Object.assign(ls(e),{error:ls(`${e}:error`),trace:t})}ls.formatters.b=e=>null==e?"undefined":Ce.baseEncode(e),ls.formatters.t=e=>null==e?"undefined":we.baseEncode(e),ls.formatters.m=e=>null==e?"undefined":Me.baseEncode(e),ls.formatters.p=e=>null==e?"undefined":e.toString(),ls.formatters.c=e=>null==e?"undefined":e.toString(),ls.formatters.k=e=>null==e?"undefined":e.toString(),ls.formatters.a=e=>null==e?"undefined":e.toString();const ds=Symbol.for("nodejs.util.inspect.custom"),ps=Object.values(It).map((e=>e.decoder)).reduce(((e,t)=>e.or(t)),It.identity.decoder),fs=114,gs=36,ms=37;class ys{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(fs,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 Es(e).equals(this);if(null!=e?.multihash?.bytes)return In(this.multihash.bytes,e.multihash.bytes);throw new Error("not valid Id")}[ds](){return`PeerId(${this.toString()})`}}class ws extends ys{type="RSA";publicKey;constructor(e){super({...e,type:"RSA"}),this.publicKey=e.publicKey}}class bs extends ys{type="Ed25519";publicKey;constructor(e){super({...e,type:"Ed25519"}),this.publicKey=e.multihash.digest}}class vs extends ys{type="secp256k1";publicKey;constructor(e){super({...e,type:"secp256k1"}),this.publicKey=e.multihash.digest}}function Es(e,t){if(t=t??ps,"1"===e.charAt(0)||"Q"===e.charAt(0)){const t=ut(Ce.decode(`z${e}`));return e.startsWith("12D")?new bs({multihash:t}):e.startsWith("16U")?new vs({multihash:t}):new ws({multihash:t})}return Ss(ps.decode(e))}function Ss(e){try{const t=ut(e);if(t.code===pt.code){if(t.digest.length===gs)return new bs({multihash:t});if(t.digest.length===ms)return new vs({multihash:t})}if(t.code===gt.code)return new ws({multihash:t})}catch{return function(e){if(null==e||null==e.multihash||null==e.version||1===e.version&&e.code!==fs)throw new Error("Supplied PeerID CID is invalid");const t=e.multihash;if(t.code===gt.code)return new ws({multihash:e.multihash});if(t.code===pt.code){if(t.digest.length===gs)return new bs({multihash:e.multihash});if(t.digest.length===ms)return new vs({multihash:e.multihash})}throw new Error("Supplied PeerID CID is invalid")}(bt.decode(e))}throw new Error("Supplied PeerID CID is invalid")}async function _s(e,t){return e.length===gs?new bs({multihash:lt(pt.code,e),privateKey:t}):e.length===ms?new vs({multihash:lt(pt.code,e),privateKey:t}):new ws({multihash:await gt.digest(e),publicKey:e,privateKey:t})}function Is(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*Rs(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 As(e){return null!=e&&("function"==typeof e.then&&"function"==typeof e.catch&&"function"==typeof e.finally)}function Ts(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`positive integer expected, not ${e}`)}function Ds(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 ks(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");Ts(e.outputLen),Ts(e.blockLen)}function Ps(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 Cs="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,xs=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),Ns=(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 Ms=async()=>{};async function Os(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 Ms(),r+=e)}}function Ls(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function Bs(e){return"string"==typeof e&&(e=Ls(e)),Ds(e),e}function Us(...e){let t=0;for(let n=0;n<e.length;n++){const r=e[n];Ds(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 Fs{clone(){return this._cloneInto()}}const Vs={}.toString;function Ks(e){const t=t=>e().update(Bs(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}function $s(e=32){if(Cs&&"function"==typeof Cs.getRandomValues)return Cs.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}const qs=(e,t,n)=>e&t^e&n^t&n;class Hs extends Fs{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=xs(this.buffer)}update(e){Ps(this);const{view:t,buffer:n,blockLen:r}=this,s=(e=Bs(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=xs(e);for(;r<=s-i;i+=r)this.process(t,i)}}return this.length+=e.length,this.roundClean(),this}digestInto(e){Ps(this),function(e,t){Ds(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=xs(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 zs=BigInt(2**32-1),Ws=BigInt(32);function js(e,t=!1){return t?{h:Number(e&zs),l:Number(e>>Ws&zs)}:{h:0|Number(e>>Ws&zs),l:0|Number(e&zs)}}const Gs={fromBig:js,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}=js(e[s],t);[n[s],r[s]]=[i,o]}return[n,r]},toBig:(e,t)=>BigInt(e>>>0)<<Ws|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)},[Ys,Qs]=(()=>Gs.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)))))(),Zs=new Uint32Array(80),Js=new Uint32Array(80);class Xs extends Hs{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)Zs[n]=e.getUint32(t),Js[n]=e.getUint32(t+=4);for(let e=16;e<80;e++){const t=0|Zs[e-15],n=0|Js[e-15],r=Gs.rotrSH(t,n,1)^Gs.rotrSH(t,n,8)^Gs.shrSH(t,n,7),s=Gs.rotrSL(t,n,1)^Gs.rotrSL(t,n,8)^Gs.shrSL(t,n,7),i=0|Zs[e-2],o=0|Js[e-2],a=Gs.rotrSH(i,o,19)^Gs.rotrBH(i,o,61)^Gs.shrSH(i,o,6),c=Gs.rotrSL(i,o,19)^Gs.rotrBL(i,o,61)^Gs.shrSL(i,o,6),l=Gs.add4L(s,c,Js[e-7],Js[e-16]),u=Gs.add4H(l,r,a,Zs[e-7],Zs[e-16]);Zs[e]=0|u,Js[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=Gs.rotrSH(u,h,14)^Gs.rotrSH(u,h,18)^Gs.rotrBH(u,h,41),w=Gs.rotrSL(u,h,14)^Gs.rotrSL(u,h,18)^Gs.rotrBL(u,h,41),b=u&d^~u&f,v=h&p^~h&g,E=Gs.add5L(y,w,v,Qs[e],Js[e]),S=Gs.add5H(E,m,t,b,Ys[e],Zs[e]),_=0|E,I=Gs.rotrSH(n,r,28)^Gs.rotrBH(n,r,34)^Gs.rotrBH(n,r,39),R=Gs.rotrSL(n,r,28)^Gs.rotrBL(n,r,34)^Gs.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}=Gs.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=Gs.add3L(_,R,T);n=Gs.add3H(D,S,I,A),r=0|D}({h:n,l:r}=Gs.add(0|this.Ah,0|this.Al,0|n,0|r)),({h:s,l:i}=Gs.add(0|this.Bh,0|this.Bl,0|s,0|i)),({h:o,l:a}=Gs.add(0|this.Ch,0|this.Cl,0|o,0|a)),({h:c,l:l}=Gs.add(0|this.Dh,0|this.Dl,0|c,0|l)),({h:u,l:h}=Gs.add(0|this.Eh,0|this.El,0|u,0|h)),({h:d,l:p}=Gs.add(0|this.Fh,0|this.Fl,0|d,0|p)),({h:f,l:g}=Gs.add(0|this.Gh,0|this.Gl,0|f,0|g)),({h:m,l:y}=Gs.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(){Zs.fill(0),Js.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 ei=Ks((()=>new Xs)),ti=BigInt(0),ni=BigInt(1),ri=BigInt(2);
|
|
8
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */function si(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name}function ii(e){if(!si(e))throw new Error("Uint8Array expected")}const oi=Array.from({length:256},((e,t)=>t.toString(16).padStart(2,"0")));function ai(e){ii(e);let t="";for(let n=0;n<e.length;n++)t+=oi[e[n]];return t}function ci(e){const t=e.toString(16);return 1&t.length?`0${t}`:t}function li(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);return BigInt(""===e?"0":`0x${e}`)}const ui={_0:48,_9:57,_A:65,_F:70,_a:97,_f:102};function hi(e){return e>=ui._0&&e<=ui._9?e-ui._0:e>=ui._A&&e<=ui._F?e-(ui._A-10):e>=ui._a&&e<=ui._f?e-(ui._a-10):void 0}function di(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=hi(e.charCodeAt(s)),i=hi(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 pi(e){return li(ai(e))}function fi(e){return ii(e),li(ai(Uint8Array.from(e).reverse()))}function gi(e,t){return di(e.toString(16).padStart(2*t,"0"))}function mi(e,t){return gi(e,t).reverse()}function yi(e,t,n){let r;if("string"==typeof t)try{r=di(t)}catch(n){throw new Error(`${e} must be valid hex string, got "${t}". Cause: ${n}`)}else{if(!si(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 wi(...e){let t=0;for(let n=0;n<e.length;n++){const r=e[n];ii(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 bi=e=>(ri<<BigInt(e-1))-ni,vi=e=>new Uint8Array(e),Ei=e=>Uint8Array.from(e);function Si(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=vi(e),s=vi(e),i=0;const o=()=>{r.fill(1),s.fill(0),i=0},a=(...e)=>n(s,r,...e),c=(e=vi())=>{s=a(Ei([0]),e),r=a(),0!==e.length&&(s=a(Ei([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 wi(...n)};return(e,t)=>{let n;for(o(),c(e);!(n=t(l()));)c();return o(),n}}const _i={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||si(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 Ii(e,t,n={}){const r=(t,n,r)=>{const s=_i[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 Ri=Object.freeze({__proto__:null,abytes:ii,bitGet:function(e,t){return e>>BigInt(t)&ni},bitLen:function(e){let t;for(t=0;e>ti;e>>=ni,t+=1);return t},bitMask:bi,bitSet:function(e,t,n){return e|(n?ni:ti)<<BigInt(t)},bytesToHex:ai,bytesToNumberBE:pi,bytesToNumberLE:fi,concatBytes:wi,createHmacDrbg:Si,ensureBytes:yi,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:di,hexToNumber:li,isBytes:si,numberToBytesBE:gi,numberToBytesLE:mi,numberToHexUnpadded:ci,numberToVarBytesBE:function(e){return di(ci(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:Ii});
|
|
9
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const Ai=BigInt(0),Ti=BigInt(1),Di=BigInt(2),ki=BigInt(3),Pi=BigInt(4),Ci=BigInt(5),xi=BigInt(8);function Ni(e,t){const n=e%t;return n>=Ai?n:t+n}function Mi(e,t,n){if(n<=Ai||t<Ai)throw new Error("Expected power/modulo > 0");if(n===Ti)return Ai;let r=Ti;for(;t>Ai;)t&Ti&&(r=r*e%n),e=e*e%n,t>>=Ti;return r}function Oi(e,t,n){let r=e;for(;t-- >Ai;)r*=r,r%=n;return r}function Li(e,t){if(e===Ai||t<=Ai)throw new Error(`invert: expected positive integers, got n=${e} mod=${t}`);let n=Ni(e,t),r=t,s=Ai,i=Ti;for(;n!==Ai;){const e=r%n,t=s-i*(r/n);r=n,n=e,s=i,i=t}if(r!==Ti)throw new Error("invert: does not exist");return Ni(s,t)}function Bi(e){if(e%Pi===ki){const t=(e+Ti)/Pi;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%xi===Ci){const t=(e-Ci)/xi;return function(e,n){const r=e.mul(n,Di),s=e.pow(r,t),i=e.mul(n,s),o=e.mul(e.mul(i,Di),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-Ti)/Di;let n,r,s;for(n=e-Ti,r=0;n%Di===Ai;n/=Di,r++);for(s=Di;s<e&&Mi(s,t,e)!==e-Ti;s++);if(1===r){const t=(e+Ti)/Pi;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+Ti)/Di;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,Ti<<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 Ui=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function Fi(e,t){const n=void 0!==t?t:e.toString(2).length;return{nBitLength:n,nByteLength:Math.ceil(n/8)}}function Vi(e,t,n=!1,r={}){if(e<=Ai)throw new Error(`Expected Field ORDER > 0, got ${e}`);const{nBitLength:s,nByteLength:i}=Fi(e,t);if(i>2048)throw new Error("Field lengths over 2048 bytes are not supported");const o=Bi(e),a=Object.freeze({ORDER:e,BITS:s,BYTES:i,MASK:bi(s),ZERO:Ai,ONE:Ti,create:t=>Ni(t,e),isValid:t=>{if("bigint"!=typeof t)throw new Error("Invalid field element: expected bigint, got "+typeof t);return Ai<=t&&t<e},is0:e=>e===Ai,isOdd:e=>(e&Ti)===Ti,neg:t=>Ni(-t,e),eql:(e,t)=>e===t,sqr:t=>Ni(t*t,e),add:(t,n)=>Ni(t+n,e),sub:(t,n)=>Ni(t-n,e),mul:(t,n)=>Ni(t*n,e),pow:(e,t)=>function(e,t,n){if(n<Ai)throw new Error("Expected power > 0");if(n===Ai)return e.ONE;if(n===Ti)return t;let r=e.ONE,s=t;for(;n>Ai;)n&Ti&&(r=e.mul(r,s)),s=e.sqr(s),n>>=Ti;return r}(a,e,t),div:(t,n)=>Ni(t*Li(n,e),e),sqrN:e=>e*e,addN:(e,t)=>e+t,subN:(e,t)=>e-t,mulN:(e,t)=>e*t,inv:t=>Li(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?mi(e,i):gi(e,i),fromBytes:e=>{if(e.length!==i)throw new Error(`Fp.fromBytes: expected ${i}, got ${e.length}`);return n?fi(e):pi(e)}});return Object.freeze(a)}function Ki(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 $i(e){const t=Ki(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 to=BigInt("57896044618658097711785492504343953926634992332820282019728792003956564819949"),no=BigInt("19681161376707505956807079304988542015446066515923890162744021073123829784752");BigInt(0);const ro=BigInt(1),so=BigInt(2),io=BigInt(5),oo=BigInt(10),ao=BigInt(20),co=BigInt(40),lo=BigInt(80);function uo(e){const t=to,n=e*e%t*e%t,r=Mi(n,so,t)*n%t,s=Mi(r,ro,t)*e%t,i=Mi(s,io,t)*s%t,o=Mi(i,oo,t)*i%t,a=Mi(o,ao,t)*o%t,c=Mi(a,co,t)*a%t,l=Mi(c,lo,t)*c%t,u=Mi(l,lo,t)*c%t,h=Mi(u,oo,t)*i%t;return{pow_p_5_8:Mi(h,so,t)*e%t,b2:n}}function ho(e){return e[0]&=248,e[31]&=127,e[31]|=64,e}const po=Fi(to,void 0,!0),fo={a:BigInt(-1),d:BigInt("37095705934669439343138083508754565189542113879843219016388785533085940283555"),Fp:po,n:BigInt("7237005577332262213973186563042994240857116359379907606001950938285454250989"),h:BigInt(8),Gx:BigInt("15112221349535400772501151409588531511454012693041857206046113283949847762202"),Gy:BigInt("46316835694926478169428394003475163141307993866256225615783033603165251855960"),hash:Xs,randomBytes:Ks,adjustScalarBytes:ho,uvRatio:function(e,t){const n=to,r=xi(t*t*t,n),s=xi(r*r*t,n);let i=xi(e*r*uo(e*s).pow_p_5_8,n);const o=xi(t*i*i,n),a=i,c=xi(i*no,n),l=o===e,u=o===xi(-e,n),h=o===xi(-e*no,n);return l&&(i=a),(u||h)&&(i=c),(xi(i,n)&Ai)===Ai&&(i=xi(-i,n)),{isValid:l||u,value:i}}},go=Ji(fo);const mo=(()=>eo({P:to,a:BigInt(486662),montgomeryBits:255,nByteLength:32,Gu:BigInt(9),powPminus2:e=>{const t=to,{pow_p_5_8:n,b2:r}=uo(e);return xi(Mi(n,BigInt(3),t)*r,t)},adjustScalarBytes:ho,randomBytes:Ks}))(),yo=(po.ORDER+BigInt(3))/BigInt(8);po.pow(so,yo),po.sqrt(po.neg(po.ONE)),po.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)}(po,po.neg(BigInt(486664))),BigInt("25063068953384623474111414158702152701244531502492656460079210482610430750235"),BigInt("54469307008909316920995813868745141605393597292927456921205312896311721017578"),BigInt("1159843021668779879193775521855586647937357759715417654439879720876111806838"),BigInt("40440834346308536858101042469323190826248399146238708352240133220865137265952"),BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");const wo=64,bo=32;function vo(e,t){const n=new Uint8Array(wo);for(let r=0;r<bo;r++)n[r]=e[r],n[bo+r]=t[r];return n}var Eo={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 So={alg:"A128GCM",ext:!0,k:"scm9jmO_4BJAgdwWGVulLg",key_ops:["encrypt","decrypt"],kty:"oct"};async function _o(e,t){const n=function(e){const t="AES-GCM";let n=16;const r="SHA-256",s=32767,i=Eo.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=Dt(o)),0===o.length){u=await i.subtle.importKey("jwk",So,{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",So,{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 In([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=Dt(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",So,{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 Ne.encode(r)}var Io,Ro,Ao,To;!function(e){e.RSA="RSA",e.Ed25519="Ed25519",e.Secp256k1="Secp256k1"}(Io||(Io={})),function(e){e[e.RSA=0]="RSA",e[e.Ed25519=1]="Ed25519",e[e.Secp256k1=2]="Secp256k1"}(Ro||(Ro={})),function(e){e.codec=()=>zt(Ro)}(Io||(Io={})),function(e){let t;e.codec=()=>(null==t&&(t=Wt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.Type&&(t.uint32(8),Io.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=Io.codec().decode(e);break;case 2:n.Data=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(Ao||(Ao={})),function(e){let t;e.codec=()=>(null==t&&(t=Wt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.Type&&(t.uint32(8),Io.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=Io.codec().decode(e);break;case 2:n.Data=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(To||(To={}));class Do{_key;constructor(e){this._key=Po(e,32)}verify(e,t){return function(e,t,n){return go.verify(t,n instanceof Uint8Array?n:n.subarray(),e)}(this._key,t,e)}marshal(){return this._key}get bytes(){return Ao.encode({Type:Io.Ed25519,Data:this.marshal()}).subarray()}equals(e){return _n(this.bytes,e.bytes)}hash(){const e=ft.digest(this.bytes);return Rs(e)?e.then((({bytes:e})=>e)):e.bytes}}class ko{_key;_publicKey;constructor(e,t){this._key=Po(e,wo),this._publicKey=Po(t,32)}sign(e){return function(e,t){const n=e.subarray(0,bo);return go.sign(t instanceof Uint8Array?t:t.subarray(),n)}(this._key,e)}get public(){return new Do(this._publicKey)}marshal(){return this._key}get bytes(){return To.encode({Type:Io.Ed25519,Data:this.marshal()}).subarray()}equals(e){return _n(this.bytes,e.bytes)}async hash(){const e=ft.digest(this.bytes);let t;return Rs(e)?({bytes:t}=await e):t=e.bytes,t}async id(){const e=dt.digest(this.public.bytes);return Pe.encode(e.bytes).substring(1)}async export(e,t="libp2p-key"){if("libp2p-key"===t)return _o(this.bytes,e);throw new pn(`export format '${t}' is not supported`,"ERR_INVALID_EXPORT_FORMAT")}}function Po(e,t){if((e=Uint8Array.from(e??[])).length!==t)throw new pn(`Key must be a Uint8Array of length ${t}, got ${e.length}`,"ERR_INVALID_KEY_TYPE");return e}var Co=Object.freeze({__proto__:null,Ed25519PrivateKey:ko,Ed25519PublicKey:Do,generateKeyPair:async function(){const{privateKey:e,publicKey:t}=function(){const e=go.utils.randomPrivateKey(),t=go.getPublicKey(e);return{privateKey:vo(e,t),publicKey:t}}();return new ko(e,t)},generateKeyPairFromSeed:async function(e){const{privateKey:t,publicKey:n}=function(e){if(e.length!==bo)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=go.getPublicKey(t);return{privateKey:vo(t,n),publicKey:n}}(e);return new ko(t,n)},unmarshalEd25519PrivateKey:function(e){if(e.length>wo){const t=(e=Po(e,wo+32)).subarray(0,wo),n=e.subarray(wo,e.length);return new ko(t,n)}const t=(e=Po(e,wo)).subarray(0,wo),n=e.subarray(32);return new ko(t,n)},unmarshalEd25519PublicKey:function(e){return e=Po(e,32),new Do(e)}});function xo(e){if(isNaN(e)||e<=0)throw new pn("random bytes length must be a Number bigger than 0","ERR_INVALID_LENGTH");return Ks(e)}class No extends Us{constructor(e,t){super(),this.finished=!1,this.destroyed=!1,Ds(e);const n=Ls(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 ks(this),this.iHash.update(e),this}digestInto(e){ks(this),Ts(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 Mo=(e,t,n)=>new No(e,t).update(n).digest();function Oo(e,t,n,r){Ds(e);const s=function(e,t){if(void 0!==t&&"[object Object]"!==Fs.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(As(i),As(o),As(a),i<1)throw new Error("PBKDF2: iterations (c) should be >= 1");const c=Ls(t),l=Ls(n),u=new Uint8Array(o),h=Mo.create(e,c),d=h._cloneInto().update(l);return{c:i,dkLen:o,asyncTick:a,DK:u,PRF:h,PRFSalt:d}}Mo.create=(e,t)=>new No(e,t);class Lo{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=Lo.toUint8Array(e),r=Lo.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 Bo="string",Uo=/^[0-9a-f]+$/i,Fo=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Vo=/^[a-zA-Z0-9-_]+$/;class Ko{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=Lo.toUint8Array(e);let n="";for(let e=0;e<t.length;e++)n+=String.fromCharCode(t[e]);return decodeURIComponent(escape(n))}}class $o{static toString(e,t=!1){const n=Lo.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 qo{static isHex(e){return typeof e===Bo&&Uo.test(e)}static isBase64(e){return typeof e===Bo&&Fo.test(e)}static isBase64Url(e){return typeof e===Bo&&Vo.test(e)}static ToString(e,t="utf8"){const n=Lo.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 $o.toString(n,!0);case"utf16":case"utf16be":return $o.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 $o.fromString(e,!0);case"utf16":case"utf16be":return $o.fromString(e);default:throw new Error(`Unknown type of encoding '${t}'`)}}static ToBase64(e){const t=Lo.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(!qo.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(!qo.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=qo.DEFAULT_UTF8_ENCODING){switch(t){case"ascii":return this.FromBinary(e);case"utf8":return Ko.fromString(e);case"utf16":case"utf16be":return $o.fromString(e);case"utf16le":case"usc2":return $o.fromString(e,!0);default:throw new Error(`Unknown type of encoding '${t}'`)}}static ToUtf8String(e,t=qo.DEFAULT_UTF8_ENCODING){switch(t){case"ascii":return this.ToBinary(e);case"utf8":return Ko.toString(e);case"utf16":case"utf16be":return $o.toString(e);case"utf16le":case"usc2":return $o.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=Lo.toUint8Array(e);let n="";for(let e=0;e<t.length;e++)n+=String.fromCharCode(t[e]);return n}static ToHex(e){const t=Lo.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(!qo.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 $o.toString(e,t)}static FromUtf16String(e,t=!1){return $o.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,""))||""}}qo.DEFAULT_UTF8_ENCODING="utf8";var Ho=Lo,zo=qo;
|
|
11
|
+
const qi=BigInt(0),Hi=BigInt(1);function zi(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>qi;)n&Hi&&(r=r.add(s)),s=s.double(),n>>=Hi;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+=Hi);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 Wi(e){return function(e){const t=Ui.reduce(((e,t)=>(e[t]="function",e)),{ORDER:"bigint",MASK:"bigint",BYTES:"isSafeInteger",BITS:"isSafeInteger"});Ii(e,t)}(e.Fp),Ii(e,{n:"bigint",h:"bigint",Gx:"field",Gy:"field"},{nBitLength:"isSafeInteger",nByteLength:"isSafeInteger"}),Object.freeze({...Fi(e.n,e.nBitLength),...e,p:e.Fp.ORDER})}
|
|
12
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const ji=BigInt(0),Gi=BigInt(1),Yi=BigInt(2),Qi=BigInt(8),Zi={zip215:!0};function Ji(e){const t=function(e){const t=Wi(e);return Ii(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=Yi<<BigInt(8*a)-Gi,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:ji}}}),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&&ji<e,g=(e,t)=>f(e)&&f(t)&&e<t,m=e=>e===ji||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===ji?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,Gi,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(Yi*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===ji)return this.double();const r=u(o*Yi*d),p=u(a*Yi*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===ji?_:this.equals(_)||t===Gi?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?Qi:n.inv(s));const o=u(t*e),a=u(r*e),c=u(s*e);if(i)return{x:ji,y:Gi};if(c!==Gi)throw new Error("invZ was invalid");return{x:o,y:a}}clearCofactor(){const{h:e}=t;return e===Gi?this:this.multiplyUnsafe(e)}static fromHex(e,r=!1){const{d:s,a:i}=t,o=n.BYTES,a=(e=yi("pointHex",e,o)).slice(),c=e[o-1];a[o-1]=-129&c;const d=fi(a);d===ji||y(d,r?l:n.ORDER);const p=u(d*d),f=u(p-Gi),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&Gi)===Gi,v=!!(128&c);if(!r&&w===ji&&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=mi(t,n.BYTES);return r[r.length-1]|=e&Gi?128:0,r}toHex(){return ai(this.toRawBytes())}}E.BASE=new E(t.Gx,t.Gy,Gi,u(t.Gx*t.Gy)),E.ZERO=new E(ji,Gi,Gi,ji);const{BASE:S,ZERO:_}=E,I=zi(E,8*a);function R(e){return Ni(e,r)}function A(e){return R(fi(e))}function T(e){const t=a;e=yi("private key",e,t);const n=yi("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=wi(...t);return A(i(p(n,yi("context",e),!!s)))}const k=Zi;S._setWindowSize(8);return{CURVE:t,getPublicKey:function(e){return T(e).pointBytes},sign:function(e,t,r={}){e=yi("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),yi("result",wi(u,mi(h,n.BYTES)),2*a)},verify:function(e,t,r,i=k){const{context:o,zip215:a}=i,c=n.BYTES;e=yi("signature",e,2*c),t=yi("message",t),s&&(t=s(t));const l=fi(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 Xi=BigInt(0),eo=BigInt(1);function to(e){const t=(Ii(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=>Ni(e,r),i=t.montgomeryBits,o=Math.ceil(i/8),a=t.nByteLength,c=t.adjustScalarBytes||(e=>e),l=t.powPminus2||(e=>Mi(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&&Xi<=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 mi(s(e),o)}function f(e,t){const n=function(e){const t=yi("u coordinate",e,o);return 32===a&&(t[31]&=127),fi(t)}(t),r=function(e){const t=yi("scalar",e),n=t.length;if(n!==o&&n!==a)throw new Error(`Expected ${o} or ${a} bytes, got ${n}`);return fi(c(t))}(e),f=function(e,t){const n=h(e),r=h(t),o=n;let a,c=eo,p=Xi,f=n,g=eo,m=Xi;for(let e=BigInt(i-1);e>=Xi;e--){const t=r>>e&eo;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===Xi)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 no=BigInt("57896044618658097711785492504343953926634992332820282019728792003956564819949"),ro=BigInt("19681161376707505956807079304988542015446066515923890162744021073123829784752");BigInt(0);const so=BigInt(1),io=BigInt(2),oo=BigInt(5),ao=BigInt(10),co=BigInt(20),lo=BigInt(40),uo=BigInt(80);function ho(e){const t=no,n=e*e%t*e%t,r=Oi(n,io,t)*n%t,s=Oi(r,so,t)*e%t,i=Oi(s,oo,t)*s%t,o=Oi(i,ao,t)*i%t,a=Oi(o,co,t)*o%t,c=Oi(a,lo,t)*a%t,l=Oi(c,uo,t)*c%t,u=Oi(l,uo,t)*c%t,h=Oi(u,ao,t)*i%t;return{pow_p_5_8:Oi(h,io,t)*e%t,b2:n}}function po(e){return e[0]&=248,e[31]&=127,e[31]|=64,e}const fo=Vi(no,void 0,!0),go={a:BigInt(-1),d:BigInt("37095705934669439343138083508754565189542113879843219016388785533085940283555"),Fp:fo,n:BigInt("7237005577332262213973186563042994240857116359379907606001950938285454250989"),h:BigInt(8),Gx:BigInt("15112221349535400772501151409588531511454012693041857206046113283949847762202"),Gy:BigInt("46316835694926478169428394003475163141307993866256225615783033603165251855960"),hash:ei,randomBytes:$s,adjustScalarBytes:po,uvRatio:function(e,t){const n=no,r=Ni(t*t*t,n),s=Ni(r*r*t,n);let i=Ni(e*r*ho(e*s).pow_p_5_8,n);const o=Ni(t*i*i,n),a=i,c=Ni(i*ro,n),l=o===e,u=o===Ni(-e,n),h=o===Ni(-e*ro,n);return l&&(i=a),(u||h)&&(i=c),(Ni(i,n)&Ti)===Ti&&(i=Ni(-i,n)),{isValid:l||u,value:i}}},mo=Ji(go);const yo=(()=>to({P:no,a:BigInt(486662),montgomeryBits:255,nByteLength:32,Gu:BigInt(9),powPminus2:e=>{const t=no,{pow_p_5_8:n,b2:r}=ho(e);return Ni(Oi(n,BigInt(3),t)*r,t)},adjustScalarBytes:po,randomBytes:$s}))(),wo=(fo.ORDER+BigInt(3))/BigInt(8);fo.pow(io,wo),fo.sqrt(fo.neg(fo.ONE)),fo.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)}(fo,fo.neg(BigInt(486664))),BigInt("25063068953384623474111414158702152701244531502492656460079210482610430750235"),BigInt("54469307008909316920995813868745141605393597292927456921205312896311721017578"),BigInt("1159843021668779879193775521855586647937357759715417654439879720876111806838"),BigInt("40440834346308536858101042469323190826248399146238708352240133220865137265952"),BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");const bo=64,vo=32;function Eo(e,t){const n=new Uint8Array(bo);for(let r=0;r<vo;r++)n[r]=e[r],n[vo+r]=t[r];return n}var So={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 _o={alg:"A128GCM",ext:!0,k:"scm9jmO_4BJAgdwWGVulLg",key_ops:["encrypt","decrypt"],kty:"oct"};async function Io(e,t){const n=function(e){const t="AES-GCM";let n=16;const r="SHA-256",s=32767,i=So.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",_o,{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",_o,{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",_o,{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 Ro,Ao,To,Do;!function(e){e.RSA="RSA",e.Ed25519="Ed25519",e.Secp256k1="Secp256k1"}(Ro||(Ro={})),function(e){e[e.RSA=0]="RSA",e[e.Ed25519=1]="Ed25519",e[e.Secp256k1=2]="Secp256k1"}(Ao||(Ao={})),function(e){e.codec=()=>Wt(Ao)}(Ro||(Ro={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.Type&&(t.uint32(8),Ro.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=Ro.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())}(To||(To={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.Type&&(t.uint32(8),Ro.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=Ro.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={}));class ko{_key;constructor(e){this._key=Co(e,32)}verify(e,t){return function(e,t,n){return mo.verify(t,n instanceof Uint8Array?n:n.subarray(),e)}(this._key,t,e)}marshal(){return this._key}get bytes(){return To.encode({Type:Ro.Ed25519,Data:this.marshal()}).subarray()}equals(e){return In(this.bytes,e.bytes)}hash(){const e=gt.digest(this.bytes);return As(e)?e.then((({bytes:e})=>e)):e.bytes}}class Po{_key;_publicKey;constructor(e,t){this._key=Co(e,bo),this._publicKey=Co(t,32)}sign(e){return function(e,t){const n=e.subarray(0,vo);return mo.sign(t instanceof Uint8Array?t:t.subarray(),n)}(this._key,e)}get public(){return new ko(this._publicKey)}marshal(){return this._key}get bytes(){return Do.encode({Type:Ro.Ed25519,Data:this.marshal()}).subarray()}equals(e){return In(this.bytes,e.bytes)}async hash(){const e=gt.digest(this.bytes);let t;return As(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 Io(this.bytes,e);throw new fn(`export format '${t}' is not supported`,"ERR_INVALID_EXPORT_FORMAT")}}function Co(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 xo=Object.freeze({__proto__:null,Ed25519PrivateKey:Po,Ed25519PublicKey:ko,generateKeyPair:async function(){const{privateKey:e,publicKey:t}=function(){const e=mo.utils.randomPrivateKey(),t=mo.getPublicKey(e);return{privateKey:Eo(e,t),publicKey:t}}();return new Po(e,t)},generateKeyPairFromSeed:async function(e){const{privateKey:t,publicKey:n}=function(e){if(e.length!==vo)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=mo.getPublicKey(t);return{privateKey:Eo(t,n),publicKey:n}}(e);return new Po(t,n)},unmarshalEd25519PrivateKey:function(e){if(e.length>bo){const t=(e=Co(e,bo+32)).subarray(0,bo),n=e.subarray(bo,e.length);return new Po(t,n)}const t=(e=Co(e,bo)).subarray(0,bo),n=e.subarray(32);return new Po(t,n)},unmarshalEd25519PublicKey:function(e){return e=Co(e,32),new ko(e)}});function No(e){if(isNaN(e)||e<=0)throw new fn("random bytes length must be a Number bigger than 0","ERR_INVALID_LENGTH");return $s(e)}class Mo extends Fs{constructor(e,t){super(),this.finished=!1,this.destroyed=!1,ks(e);const n=Bs(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 Ps(this),this.iHash.update(e),this}digestInto(e){Ps(this),Ds(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 Oo=(e,t,n)=>new Mo(e,t).update(n).digest();function Lo(e,t,n,r){ks(e);const s=function(e,t){if(void 0!==t&&"[object Object]"!==Vs.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(Ts(i),Ts(o),Ts(a),i<1)throw new Error("PBKDF2: iterations (c) should be >= 1");const c=Bs(t),l=Bs(n),u=new Uint8Array(o),h=Oo.create(e,c),d=h._cloneInto().update(l);return{c:i,dkLen:o,asyncTick:a,DK:u,PRF:h,PRFSalt:d}}Oo.create=(e,t)=>new Mo(e,t);class Bo{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=Bo.toUint8Array(e),r=Bo.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 Uo="string",Fo=/^[0-9a-f]+$/i,Vo=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Ko=/^[a-zA-Z0-9-_]+$/;class $o{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=Bo.toUint8Array(e);let n="";for(let e=0;e<t.length;e++)n+=String.fromCharCode(t[e]);return decodeURIComponent(escape(n))}}class qo{static toString(e,t=!1){const n=Bo.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 Ho{static isHex(e){return typeof e===Uo&&Fo.test(e)}static isBase64(e){return typeof e===Uo&&Vo.test(e)}static isBase64Url(e){return typeof e===Uo&&Ko.test(e)}static ToString(e,t="utf8"){const n=Bo.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 qo.toString(n,!0);case"utf16":case"utf16be":return qo.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 qo.fromString(e,!0);case"utf16":case"utf16be":return qo.fromString(e);default:throw new Error(`Unknown type of encoding '${t}'`)}}static ToBase64(e){const t=Bo.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(!Ho.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(!Ho.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=Ho.DEFAULT_UTF8_ENCODING){switch(t){case"ascii":return this.FromBinary(e);case"utf8":return $o.fromString(e);case"utf16":case"utf16be":return qo.fromString(e);case"utf16le":case"usc2":return qo.fromString(e,!0);default:throw new Error(`Unknown type of encoding '${t}'`)}}static ToUtf8String(e,t=Ho.DEFAULT_UTF8_ENCODING){switch(t){case"ascii":return this.ToBinary(e);case"utf8":return $o.toString(e);case"utf16":case"utf16be":return qo.toString(e);case"utf16le":case"usc2":return qo.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=Bo.toUint8Array(e);let n="";for(let e=0;e<t.length;e++)n+=String.fromCharCode(t[e]);return n}static ToHex(e){const t=Bo.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(!Ho.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 qo.toString(e,t)}static FromUtf16String(e,t=!1){return qo.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,""))||""}}Ho.DEFAULT_UTF8_ENCODING="utf8";var zo=Bo,Wo=Ho;
|
|
15
15
|
/*!
|
|
16
16
|
Copyright (c) Peculiar Ventures, LLC
|
|
17
17
|
*/
|
|
18
|
-
function
|
|
18
|
+
function jo(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 Go(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 Yo(...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 Qo(){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=jo(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 jo(i,8)-r}function Zo(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 Wo(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 Jo(){if("undefined"==typeof BigInt)throw new Error("BigInt is not defined. Your environment doesn't implement BigInt.")}function Zo(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 Xo(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 ea{constructor(){this.items=[]}write(e){this.items.push(e)}final(){return Zo(this.items)}}const ta=[new Uint8Array([1])],na="0123456789",ra="",sa=new ArrayBuffer(0),ia=new Uint8Array(0),oa="EndOfContent",aa="OCTET STRING",ca="BIT STRING";function la(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?Ho.toUint8Array(n.valueHex):ia}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(!Xo(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",sa)}toJSON(){return{...super.toJSON(),isHexOnly:this.isHexOnly,valueHex:zo.ToHex(this.valueHexView)}}}).NAME="hexBlock",t}class ua{constructor({blockLength:e=0,error:t="",warnings:n=[],valueBeforeDecode:r=ia}={}){this.blockLength=e,this.error=t,this.warnings=n,this.valueBeforeDecodeView=Ho.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:zo.ToHex(this.valueBeforeDecodeView)}}}ua.NAME="baseBlock";class ha extends ua{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'")}}ha.NAME="valueBlock";class da extends(la(ua)){constructor({idBlock:e={}}={}){var t,n,r,s;super(),e?(this.isHexOnly=null!==(t=e.isHexOnly)&&void 0!==t&&t,this.valueHexView=e.valueHex?Ho.toUint8Array(e.valueHex):ia,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",sa}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=Ho.toUint8Array(e);if(!Xo(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=Wo(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}}}da.NAME="identificationBlock";class pa extends ua{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=Ho.toUint8Array(e);if(!Xo(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=Wo(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",sa;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}}}pa.NAME="lengthBlock";const fa={};class ga extends ua{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 da(r),this.lenBlock=new pa(r),this.valueBlock=s?new s(r):new ha(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 ea;t||ma(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?sa: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():zo.ToHex(this.toBER())}onAsciiEncoding(){return`${this.constructor.NAME} : ${zo.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 ma(e){if(e instanceof fa.Constructed)for(const t of e.valueBlock.value)ma(t)&&(e.lenBlock.isIndefiniteForm=!0);return!!e.lenBlock.isIndefiniteForm}ga.NAME="BaseBlock";class ya extends ga{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}'`}}ya.NAME="BaseStringBlock";class wa extends(la(ha)){constructor({isHexOnly:e=!0,...t}={}){super(t),this.isHexOnly=e}}var ba,va,Ea,Sa,_a;wa.NAME="PrimitiveValueBlock";class Ia extends ga{constructor(e={}){super(e,wa),this.idBlock.isConstructed=!1}}function Ra(e,t=0,n=e.length){const r=t;let s=new ga({},ha);const i=new ua;if(!Xo(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=ga;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=fa.EndOfContent;break;case 1:a=fa.Boolean;break;case 2:a=fa.Integer;break;case 3:a=fa.BitString;break;case 4:a=fa.OctetString;break;case 5:a=fa.Null;break;case 6:a=fa.ObjectIdentifier;break;case 10:a=fa.Enumerated;break;case 12:a=fa.Utf8String;break;case 13:a=fa.RelativeObjectIdentifier;break;case 14:a=fa.TIME;break;case 15:return s.error="[UNIVERSAL 15] is reserved by ASN.1 standard",{offset:-1,result:s};case 16:a=fa.Sequence;break;case 17:a=fa.Set;break;case 18:a=fa.NumericString;break;case 19:a=fa.PrintableString;break;case 20:a=fa.TeletexString;break;case 21:a=fa.VideotexString;break;case 22:a=fa.IA5String;break;case 23:a=fa.UTCTime;break;case 24:a=fa.GeneralizedTime;break;case 25:a=fa.GraphicString;break;case 26:a=fa.VisibleString;break;case 27:a=fa.GeneralString;break;case 28:a=fa.UniversalString;break;case 29:a=fa.CharacterString;break;case 30:a=fa.BmpString;break;case 31:a=fa.DATE;break;case 32:a=fa.TimeOfDay;break;case 33:a=fa.DateTime;break;case 34:a=fa.Duration;break;default:{const e=s.idBlock.isConstructed?new fa.Constructed:new fa.Primitive;e.idBlock=s.idBlock,e.lenBlock=s.lenBlock,e.warnings=s.warnings,s=e}}}else a=s.idBlock.isConstructed?fa.Constructed:fa.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 Aa(e){if(!e.byteLength){const e=new ga({},ha);return e.error="Input buffer has zero length",{offset:-1,result:e}}return Ra(Ho.toUint8Array(e).slice(),0,e.byteLength)}function Ta(e,t){return e?1:t}ba=Ia,fa.Primitive=ba,Ia.NAME="PRIMITIVE";class Da extends ha{constructor({value:e=[],isIndefiniteForm:t=!1,...n}={}){super(n),this.value=e,this.isIndefiniteForm=t}fromBER(e,t,n){const r=Ho.toUint8Array(e);if(!Xo(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(;Ta(this.isIndefiniteForm,n)>0;){const e=Ra(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===oa)break}return this.isIndefiniteForm&&(this.value[this.value.length-1].constructor.NAME===oa?this.value.pop():this.warnings.push("No EndOfContent block encoded")),s}toBER(e,t){const n=t||new ea;for(let t=0;t<this.value.length;t++)this.value[t].toBER(e,n);return t?sa:n.final()}toJSON(){const e={...super.toJSON(),isIndefiniteForm:this.isIndefiniteForm,value:[]};for(const t of this.value)e.value.push(t.toJSON());return e}}Da.NAME="ConstructedValueBlock";class ka extends ga{constructor(e={}){super(e,Da),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} :`}}va=ka,fa.Constructed=va,ka.NAME="CONSTRUCTED";class Pa extends ha{fromBER(e,t,n){return t}toBER(e){return sa}}Pa.override="EndOfContentValueBlock";class Ca extends ga{constructor(e={}){super(e,Pa),this.idBlock.tagClass=1,this.idBlock.tagNumber=0}}Ea=Ca,fa.EndOfContent=Ea,Ca.NAME=oa;class xa extends ga{constructor(e={}){super(e,ha),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}`}}Sa=xa,fa.Null=Sa,xa.NAME="NULL";class Na extends(la(ha)){constructor({value:e,...t}={}){super(t),t.valueHex?this.valueHexView=Ho.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=Ho.toUint8Array(e);return Xo(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,Yo.call(this),this.blockLength=n,t+n):-1}toBER(){return this.valueHexView.slice()}toJSON(){return{...super.toJSON(),value:this.value}}}Na.NAME="BooleanValueBlock";let Ma=class extends ga{constructor(e={}){super(e,Na),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}`}};_a=Ma,fa.Boolean=_a,Ma.NAME="BOOLEAN";class Oa extends(la(Da)){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=Da.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===oa){if(this.isIndefiniteForm)break;return this.error="EndOfContent is unexpected, OCTET STRING may consists of OCTET STRINGs only",-1}if(t!==aa)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?Da.prototype.toBER.call(this,e,t):e?new ArrayBuffer(this.valueHexView.byteLength):this.valueHexView.slice().buffer}toJSON(){return{...super.toJSON(),isConstructed:this.isConstructed}}}var La,Ba,Ua,Fa,Va,Ka,$a,qa,Ha;Oa.NAME="OctetStringValueBlock";class za extends ga{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},Oa),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=Ra(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?ka.prototype.onAsciiEncoding.call(this):`${this.constructor.NAME} : ${zo.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 za&&e.push(t.valueBlock.valueHexView);return Ho.concat(e)}}La=za,fa.OctetString=La,za.NAME=aa;class Wa extends(la(Da)){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=Da.prototype.fromBER.call(this,e,t,n),-1===r)return r;for(const e of this.value){const t=e.constructor.NAME;if(t===oa){if(this.isIndefiniteForm)break;return this.error="EndOfContent is unexpected, BIT STRING may consists of BIT STRINGs only",-1}if(t!==ca)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=Ho.toUint8Array(e);if(!Xo(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=Ra(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 Da.prototype.toBER.call(this,e,t);if(e)return new ArrayBuffer(this.valueHexView.byteLength+1);if(!this.valueHexView.byteLength)return sa;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}}}Wa.NAME="BitStringValueBlock";class ja extends ga{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},Wa),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 ka.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 Ga(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=Go(new Uint8Array([l%10]),i);else i[o-u]=l%10}return n[0]>0&&(i=Go(n,i)),i}function Ya(e){if(e>=ta.length)for(let t=ta.length;t<=e;t++){const e=new Uint8Array([0]);let n=ta[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=Go(e,n)),ta.push(n)}return ta[e]}function Qa(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()}Ba=ja,fa.BitString=Ba,ja.NAME=ca;class Ja extends(la(ha)){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=Yo.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=Qa(Ya(r),n),i="-";else n=Ga(n,Ya(r));r++,t>>=1}}for(let e=0;e<n.length;e++)n[e]&&(o=!0),o&&(i+=na.charAt(n[e]));return!1===o&&(i+=na.charAt(0)),i}}Ua=Ja,Ja.NAME="IntegerValueBlock",Object.defineProperty(Ua.prototype,"valueHex",{set:function(e){this.valueHexView=new Uint8Array(e),this.setValueHex()},get:function(){return this.valueHexView.slice().buffer}});class Za extends ga{constructor(e={}){super(e,Ja),this.idBlock.tagClass=1,this.idBlock.tagNumber=2}toBigInt(){return Jo(),BigInt(this.valueBlock.toString())}static fromBigInt(e){Jo();const t=BigInt(e),n=new ea,r=t.toString(16).replace(/^-/,""),s=new Uint8Array(zo.FromHex(r));if(t<0){const e=new Uint8Array(s.length+(128&s[0]?1:0));e[0]|=128;const r=BigInt(`0x${zo.ToHex(e)}`)+t,i=Ho.toUint8Array(zo.FromHex(r.toString(16)));i[0]|=128,n.write(i)}else 128&s[0]&&n.write(new Uint8Array([0])),n.write(s);return new Za({valueHex:n.final()})}convertToDER(){const e=new Za({valueHex:this.valueBlock.valueHexView});return e.valueBlock.toDER(),e}convertFromDER(){return new Za({valueHex:0===this.valueBlock.valueHexView[0]?this.valueBlock.valueHexView.subarray(1):this.valueBlock.valueHexView})}onAsciiEncoding(){return`${this.constructor.NAME} : ${this.valueBlock.toString()}`}}Fa=Za,fa.Integer=Fa,Za.NAME="INTEGER";class Xa extends Za{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=10}}Va=Xa,fa.Enumerated=Va,Xa.NAME="ENUMERATED";class ec extends(la(ha)){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=Ho.toUint8Array(e);if(!Xo(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=Wo(this.valueHexView,7):(this.isHexOnly=!0,this.warnings.push("Too big SID for decoding, hex only")),t+this.blockLength)}set valueBigInt(e){Jo();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",sa;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=zo.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}}}ec.NAME="sidBlock";class tc extends ha{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 ec;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,sa;t.push(r)}return Zo(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 ec;if(r>Number.MAX_SAFE_INTEGER){Jo();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}}tc.NAME="ObjectIdentifierValueBlock";class nc extends ga{constructor(e={}){super(e,tc),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()}}}Ka=nc,fa.ObjectIdentifier=Ka,nc.NAME="OBJECT IDENTIFIER";class rc extends(la(ua)){constructor({valueDec:e=0,...t}={}){super(t),this.valueDec=e}fromBER(e,t,n){if(0===n)return t;const r=Ho.toUint8Array(e);if(!Xo(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=Wo(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",sa;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?zo.ToHex(this.valueHexView):this.valueDec.toString(),e}toJSON(){return{...super.toJSON(),valueDec:this.valueDec}}}rc.NAME="relativeSidBlock";class sc extends ha{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 rc;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,sa;n.push(r)}return Zo(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 rc;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}}sc.NAME="RelativeObjectIdentifierValueBlock";class ic extends ga{constructor(e={}){super(e,sc),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()}}}$a=ic,fa.RelativeObjectIdentifier=$a,ic.NAME="RelativeObjectIdentifier";class oc extends ka{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=16}}qa=oc,fa.Sequence=qa,oc.NAME="SEQUENCE";let ac=class extends ka{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=17}};Ha=ac,fa.Set=Ha,ac.NAME="SET";class cc extends(la(ha)){constructor({...e}={}){super(e),this.isHexOnly=!0,this.value=ra}toJSON(){return{...super.toJSON(),value:this.value}}}cc.NAME="StringValueBlock";class lc extends cc{}lc.NAME="SimpleStringValueBlock";class uc extends ya{constructor({...e}={}){super(e,lc)}fromBuffer(e){this.valueBlock.value=String.fromCharCode.apply(null,Ho.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}}uc.NAME="SIMPLE STRING";class hc extends uc{fromBuffer(e){this.valueBlock.valueHexView=Ho.toUint8Array(e);try{this.valueBlock.value=zo.ToUtf8String(e)}catch(t){this.warnings.push(`Error during "decodeURIComponent": ${t}, using raw string`),this.valueBlock.value=zo.ToBinary(e)}}fromString(e){this.valueBlock.valueHexView=new Uint8Array(zo.FromUtf8String(e)),this.valueBlock.value=e}}var dc,pc,fc,gc,mc,yc,wc,bc,vc,Ec,Sc,_c,Ic,Rc,Ac,Tc,Dc,kc,Pc;hc.NAME="Utf8StringValueBlock";class Cc extends hc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=12}}dc=Cc,fa.Utf8String=dc,Cc.NAME="UTF8String";class xc extends uc{fromBuffer(e){this.valueBlock.value=zo.ToUtf16String(e),this.valueBlock.valueHexView=Ho.toUint8Array(e)}fromString(e){this.valueBlock.value=e,this.valueBlock.valueHexView=new Uint8Array(zo.FromUtf16String(e))}}xc.NAME="BmpStringValueBlock";class Nc extends xc{constructor({...e}={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=30}}pc=Nc,fa.BmpString=pc,Nc.NAME="BMPString";class Mc extends uc{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}}Mc.NAME="UniversalStringValueBlock";class Oc extends Mc{constructor({...e}={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=28}}fc=Oc,fa.UniversalString=fc,Oc.NAME="UniversalString";class Lc extends uc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=18}}gc=Lc,fa.NumericString=gc,Lc.NAME="NumericString";class Bc extends uc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=19}}mc=Bc,fa.PrintableString=mc,Bc.NAME="PrintableString";class Uc extends uc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=20}}yc=Uc,fa.TeletexString=yc,Uc.NAME="TeletexString";class Fc extends uc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=21}}wc=Fc,fa.VideotexString=wc,Fc.NAME="VideotexString";class Vc extends uc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=22}}bc=Vc,fa.IA5String=bc,Vc.NAME="IA5String";class Kc extends uc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=25}}vc=Kc,fa.GraphicString=vc,Kc.NAME="GraphicString";class $c extends uc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=26}}Ec=$c,fa.VisibleString=Ec,$c.NAME="VisibleString";class qc extends uc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=27}}Sc=qc,fa.GeneralString=Sc,qc.NAME="GeneralString";class Hc extends uc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=29}}_c=Hc,fa.CharacterString=_c,Hc.NAME="CharacterString";class zc extends $c{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,Ho.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]=Qo(this.year<2e3?this.year-1900:this.year-2e3,2),e[1]=Qo(this.month,2),e[2]=Qo(this.day,2),e[3]=Qo(this.hour,2),e[4]=Qo(this.minute,2),e[5]=Qo(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}}}Ic=zc,fa.UTCTime=Ic,zc.NAME="UTCTime";class Wc extends zc{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(Qo(this.year,4)),e.push(Qo(this.month,2)),e.push(Qo(this.day,2)),e.push(Qo(this.hour,2)),e.push(Qo(this.minute,2)),e.push(Qo(this.second,2)),0!==this.millisecond&&(e.push("."),e.push(Qo(this.millisecond,3))),e.push("Z"),e.join("")}return super.toString(e)}toJSON(){return{...super.toJSON(),millisecond:this.millisecond}}}Rc=Wc,fa.GeneralizedTime=Rc,Wc.NAME="GeneralizedTime";class jc extends Cc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=31}}Ac=jc,fa.DATE=Ac,jc.NAME="DATE";class Gc extends Cc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=32}}Tc=Gc,fa.TimeOfDay=Tc,Gc.NAME="TimeOfDay";class Yc extends Cc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=33}}Dc=Yc,fa.DateTime=Dc,Yc.NAME="DateTime";class Qc extends Cc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=34}}kc=Qc,fa.Duration=kc,Qc.NAME="Duration";class Jc extends Cc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=14}}function Zc(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 Xc(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(""))}Pc=Jc,fa.TIME=Pc,Jc.NAME="TIME";async function el(e,t){const n=Eo.get(),r=new oc({value:[new Za({value:0}),new oc({value:[new nc({value:"1.2.840.113549.1.1.1"}),new xa]}),new za({valueHex:e.marshal()})]}).toBER(),s=new Uint8Array(r,0,r.byteLength),i=xo(16),o=await async function(e,t,n,r){const{c:s,dkLen:i,asyncTick:o,DK:a,PRF:c,PRFSalt:l}=Oo(e,t,n,r);let u;const h=new Uint8Array(4),d=Cs(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 Ms(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 Jo(){if("undefined"==typeof BigInt)throw new Error("BigInt is not defined. Your environment doesn't implement BigInt.")}function Xo(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 ea(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 ta{constructor(){this.items=[]}write(e){this.items.push(e)}final(){return Xo(this.items)}}const na=[new Uint8Array([1])],ra="0123456789",sa="",ia=new ArrayBuffer(0),oa=new Uint8Array(0),aa="EndOfContent",ca="OCTET STRING",la="BIT STRING";function ua(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?zo.toUint8Array(n.valueHex):oa}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(!ea(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",ia)}toJSON(){return{...super.toJSON(),isHexOnly:this.isHexOnly,valueHex:Wo.ToHex(this.valueHexView)}}}).NAME="hexBlock",t}class ha{constructor({blockLength:e=0,error:t="",warnings:n=[],valueBeforeDecode:r=oa}={}){this.blockLength=e,this.error=t,this.warnings=n,this.valueBeforeDecodeView=zo.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:Wo.ToHex(this.valueBeforeDecodeView)}}}ha.NAME="baseBlock";class da extends ha{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'")}}da.NAME="valueBlock";class pa extends(ua(ha)){constructor({idBlock:e={}}={}){var t,n,r,s;super(),e?(this.isHexOnly=null!==(t=e.isHexOnly)&&void 0!==t&&t,this.valueHexView=e.valueHex?zo.toUint8Array(e.valueHex):oa,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",ia}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=Go(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=zo.toUint8Array(e);if(!ea(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=jo(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}}}pa.NAME="identificationBlock";class fa extends ha{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=zo.toUint8Array(e);if(!ea(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=jo(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=Go(this.length,8);if(r.byteLength>127)return this.error="Too big length",ia;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}}}fa.NAME="lengthBlock";const ga={};class ma extends ha{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 pa(r),this.lenBlock=new fa(r),this.valueBlock=s?new s(r):new da(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 ta;t||ya(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?ia: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():Wo.ToHex(this.toBER())}onAsciiEncoding(){return`${this.constructor.NAME} : ${Wo.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 ya(e){if(e instanceof ga.Constructed)for(const t of e.valueBlock.value)ya(t)&&(e.lenBlock.isIndefiniteForm=!0);return!!e.lenBlock.isIndefiniteForm}ma.NAME="BaseBlock";class wa extends ma{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}'`}}wa.NAME="BaseStringBlock";class ba extends(ua(da)){constructor({isHexOnly:e=!0,...t}={}){super(t),this.isHexOnly=e}}var va,Ea,Sa,_a,Ia;ba.NAME="PrimitiveValueBlock";class Ra extends ma{constructor(e={}){super(e,ba),this.idBlock.isConstructed=!1}}function Aa(e,t=0,n=e.length){const r=t;let s=new ma({},da);const i=new ha;if(!ea(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=ma;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=ga.EndOfContent;break;case 1:a=ga.Boolean;break;case 2:a=ga.Integer;break;case 3:a=ga.BitString;break;case 4:a=ga.OctetString;break;case 5:a=ga.Null;break;case 6:a=ga.ObjectIdentifier;break;case 10:a=ga.Enumerated;break;case 12:a=ga.Utf8String;break;case 13:a=ga.RelativeObjectIdentifier;break;case 14:a=ga.TIME;break;case 15:return s.error="[UNIVERSAL 15] is reserved by ASN.1 standard",{offset:-1,result:s};case 16:a=ga.Sequence;break;case 17:a=ga.Set;break;case 18:a=ga.NumericString;break;case 19:a=ga.PrintableString;break;case 20:a=ga.TeletexString;break;case 21:a=ga.VideotexString;break;case 22:a=ga.IA5String;break;case 23:a=ga.UTCTime;break;case 24:a=ga.GeneralizedTime;break;case 25:a=ga.GraphicString;break;case 26:a=ga.VisibleString;break;case 27:a=ga.GeneralString;break;case 28:a=ga.UniversalString;break;case 29:a=ga.CharacterString;break;case 30:a=ga.BmpString;break;case 31:a=ga.DATE;break;case 32:a=ga.TimeOfDay;break;case 33:a=ga.DateTime;break;case 34:a=ga.Duration;break;default:{const e=s.idBlock.isConstructed?new ga.Constructed:new ga.Primitive;e.idBlock=s.idBlock,e.lenBlock=s.lenBlock,e.warnings=s.warnings,s=e}}}else a=s.idBlock.isConstructed?ga.Constructed:ga.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 Ta(e){if(!e.byteLength){const e=new ma({},da);return e.error="Input buffer has zero length",{offset:-1,result:e}}return Aa(zo.toUint8Array(e).slice(),0,e.byteLength)}function Da(e,t){return e?1:t}va=Ra,ga.Primitive=va,Ra.NAME="PRIMITIVE";class ka extends da{constructor({value:e=[],isIndefiniteForm:t=!1,...n}={}){super(n),this.value=e,this.isIndefiniteForm=t}fromBER(e,t,n){const r=zo.toUint8Array(e);if(!ea(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(;Da(this.isIndefiniteForm,n)>0;){const e=Aa(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===aa)break}return this.isIndefiniteForm&&(this.value[this.value.length-1].constructor.NAME===aa?this.value.pop():this.warnings.push("No EndOfContent block encoded")),s}toBER(e,t){const n=t||new ta;for(let t=0;t<this.value.length;t++)this.value[t].toBER(e,n);return t?ia:n.final()}toJSON(){const e={...super.toJSON(),isIndefiniteForm:this.isIndefiniteForm,value:[]};for(const t of this.value)e.value.push(t.toJSON());return e}}ka.NAME="ConstructedValueBlock";class Pa extends ma{constructor(e={}){super(e,ka),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} :`}}Ea=Pa,ga.Constructed=Ea,Pa.NAME="CONSTRUCTED";class Ca extends da{fromBER(e,t,n){return t}toBER(e){return ia}}Ca.override="EndOfContentValueBlock";class xa extends ma{constructor(e={}){super(e,Ca),this.idBlock.tagClass=1,this.idBlock.tagNumber=0}}Sa=xa,ga.EndOfContent=Sa,xa.NAME=aa;class Na extends ma{constructor(e={}){super(e,da),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}`}}_a=Na,ga.Null=_a,Na.NAME="NULL";class Ma extends(ua(da)){constructor({value:e,...t}={}){super(t),t.valueHex?this.valueHexView=zo.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=zo.toUint8Array(e);return ea(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,Qo.call(this),this.blockLength=n,t+n):-1}toBER(){return this.valueHexView.slice()}toJSON(){return{...super.toJSON(),value:this.value}}}Ma.NAME="BooleanValueBlock";let Oa=class extends ma{constructor(e={}){super(e,Ma),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}`}};Ia=Oa,ga.Boolean=Ia,Oa.NAME="BOOLEAN";class La extends(ua(ka)){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=ka.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===aa){if(this.isIndefiniteForm)break;return this.error="EndOfContent is unexpected, OCTET STRING may consists of OCTET STRINGs only",-1}if(t!==ca)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?ka.prototype.toBER.call(this,e,t):e?new ArrayBuffer(this.valueHexView.byteLength):this.valueHexView.slice().buffer}toJSON(){return{...super.toJSON(),isConstructed:this.isConstructed}}}var Ba,Ua,Fa,Va,Ka,$a,qa,Ha,za;La.NAME="OctetStringValueBlock";class Wa extends ma{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},La),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=Aa(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?Pa.prototype.onAsciiEncoding.call(this):`${this.constructor.NAME} : ${Wo.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 Wa&&e.push(t.valueBlock.valueHexView);return zo.concat(e)}}Ba=Wa,ga.OctetString=Ba,Wa.NAME=ca;class ja extends(ua(ka)){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=ka.prototype.fromBER.call(this,e,t,n),-1===r)return r;for(const e of this.value){const t=e.constructor.NAME;if(t===aa){if(this.isIndefiniteForm)break;return this.error="EndOfContent is unexpected, BIT STRING may consists of BIT STRINGs only",-1}if(t!==la)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=zo.toUint8Array(e);if(!ea(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=Aa(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 ka.prototype.toBER.call(this,e,t);if(e)return new ArrayBuffer(this.valueHexView.byteLength+1);if(!this.valueHexView.byteLength)return ia;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}}}ja.NAME="BitStringValueBlock";class Ga extends ma{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},ja),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 Pa.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 Ya(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=Yo(new Uint8Array([l%10]),i);else i[o-u]=l%10}return n[0]>0&&(i=Yo(n,i)),i}function Qa(e){if(e>=na.length)for(let t=na.length;t<=e;t++){const e=new Uint8Array([0]);let n=na[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=Yo(e,n)),na.push(n)}return na[e]}function Za(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()}Ua=Ga,ga.BitString=Ua,Ga.NAME=la;class Ja extends(ua(da)){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=Qo.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=Go(n-t,8,r);return new Uint8Array(e)[0]|=128,e}let s=Go(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=Za(Qa(r),n),i="-";else n=Ya(n,Qa(r));r++,t>>=1}}for(let e=0;e<n.length;e++)n[e]&&(o=!0),o&&(i+=ra.charAt(n[e]));return!1===o&&(i+=ra.charAt(0)),i}}Fa=Ja,Ja.NAME="IntegerValueBlock",Object.defineProperty(Fa.prototype,"valueHex",{set:function(e){this.valueHexView=new Uint8Array(e),this.setValueHex()},get:function(){return this.valueHexView.slice().buffer}});class Xa extends ma{constructor(e={}){super(e,Ja),this.idBlock.tagClass=1,this.idBlock.tagNumber=2}toBigInt(){return Jo(),BigInt(this.valueBlock.toString())}static fromBigInt(e){Jo();const t=BigInt(e),n=new ta,r=t.toString(16).replace(/^-/,""),s=new Uint8Array(Wo.FromHex(r));if(t<0){const e=new Uint8Array(s.length+(128&s[0]?1:0));e[0]|=128;const r=BigInt(`0x${Wo.ToHex(e)}`)+t,i=zo.toUint8Array(Wo.FromHex(r.toString(16)));i[0]|=128,n.write(i)}else 128&s[0]&&n.write(new Uint8Array([0])),n.write(s);return new Xa({valueHex:n.final()})}convertToDER(){const e=new Xa({valueHex:this.valueBlock.valueHexView});return e.valueBlock.toDER(),e}convertFromDER(){return new Xa({valueHex:0===this.valueBlock.valueHexView[0]?this.valueBlock.valueHexView.subarray(1):this.valueBlock.valueHexView})}onAsciiEncoding(){return`${this.constructor.NAME} : ${this.valueBlock.toString()}`}}Va=Xa,ga.Integer=Va,Xa.NAME="INTEGER";class ec extends Xa{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=10}}Ka=ec,ga.Enumerated=Ka,ec.NAME="ENUMERATED";class tc extends(ua(da)){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=zo.toUint8Array(e);if(!ea(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=jo(this.valueHexView,7):(this.isHexOnly=!0,this.warnings.push("Too big SID for decoding, hex only")),t+this.blockLength)}set valueBigInt(e){Jo();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=Go(this.valueDec,7);if(0===t.byteLength)return this.error="Error during encoding SID value",ia;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=Wo.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}}}tc.NAME="sidBlock";class nc extends da{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 tc;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,ia;t.push(r)}return Xo(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 tc;if(r>Number.MAX_SAFE_INTEGER){Jo();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}}nc.NAME="ObjectIdentifierValueBlock";class rc extends ma{constructor(e={}){super(e,nc),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()}}}$a=rc,ga.ObjectIdentifier=$a,rc.NAME="OBJECT IDENTIFIER";class sc extends(ua(ha)){constructor({valueDec:e=0,...t}={}){super(t),this.valueDec=e}fromBER(e,t,n){if(0===n)return t;const r=zo.toUint8Array(e);if(!ea(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=jo(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=Go(this.valueDec,7);if(0===t.byteLength)return this.error="Error during encoding SID value",ia;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?Wo.ToHex(this.valueHexView):this.valueDec.toString(),e}toJSON(){return{...super.toJSON(),valueDec:this.valueDec}}}sc.NAME="relativeSidBlock";class ic extends da{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;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,ia;n.push(r)}return Xo(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 sc;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}}ic.NAME="RelativeObjectIdentifierValueBlock";class oc extends ma{constructor(e={}){super(e,ic),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()}}}qa=oc,ga.RelativeObjectIdentifier=qa,oc.NAME="RelativeObjectIdentifier";class ac extends Pa{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=16}}Ha=ac,ga.Sequence=Ha,ac.NAME="SEQUENCE";let cc=class extends Pa{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=17}};za=cc,ga.Set=za,cc.NAME="SET";class lc extends(ua(da)){constructor({...e}={}){super(e),this.isHexOnly=!0,this.value=sa}toJSON(){return{...super.toJSON(),value:this.value}}}lc.NAME="StringValueBlock";class uc extends lc{}uc.NAME="SimpleStringValueBlock";class hc extends wa{constructor({...e}={}){super(e,uc)}fromBuffer(e){this.valueBlock.value=String.fromCharCode.apply(null,zo.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}}hc.NAME="SIMPLE STRING";class dc extends hc{fromBuffer(e){this.valueBlock.valueHexView=zo.toUint8Array(e);try{this.valueBlock.value=Wo.ToUtf8String(e)}catch(t){this.warnings.push(`Error during "decodeURIComponent": ${t}, using raw string`),this.valueBlock.value=Wo.ToBinary(e)}}fromString(e){this.valueBlock.valueHexView=new Uint8Array(Wo.FromUtf8String(e)),this.valueBlock.value=e}}var pc,fc,gc,mc,yc,wc,bc,vc,Ec,Sc,_c,Ic,Rc,Ac,Tc,Dc,kc,Pc,Cc;dc.NAME="Utf8StringValueBlock";class xc extends dc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=12}}pc=xc,ga.Utf8String=pc,xc.NAME="UTF8String";class Nc extends hc{fromBuffer(e){this.valueBlock.value=Wo.ToUtf16String(e),this.valueBlock.valueHexView=zo.toUint8Array(e)}fromString(e){this.valueBlock.value=e,this.valueBlock.valueHexView=new Uint8Array(Wo.FromUtf16String(e))}}Nc.NAME="BmpStringValueBlock";class Mc extends Nc{constructor({...e}={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=30}}fc=Mc,ga.BmpString=fc,Mc.NAME="BMPString";class Oc extends hc{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=Go(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}}Oc.NAME="UniversalStringValueBlock";class Lc extends Oc{constructor({...e}={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=28}}gc=Lc,ga.UniversalString=gc,Lc.NAME="UniversalString";class Bc extends hc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=18}}mc=Bc,ga.NumericString=mc,Bc.NAME="NumericString";class Uc extends hc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=19}}yc=Uc,ga.PrintableString=yc,Uc.NAME="PrintableString";class Fc extends hc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=20}}wc=Fc,ga.TeletexString=wc,Fc.NAME="TeletexString";class Vc extends hc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=21}}bc=Vc,ga.VideotexString=bc,Vc.NAME="VideotexString";class Kc extends hc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=22}}vc=Kc,ga.IA5String=vc,Kc.NAME="IA5String";class $c extends hc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=25}}Ec=$c,ga.GraphicString=Ec,$c.NAME="GraphicString";class qc extends hc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=26}}Sc=qc,ga.VisibleString=Sc,qc.NAME="VisibleString";class Hc extends hc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=27}}_c=Hc,ga.GeneralString=_c,Hc.NAME="GeneralString";class zc extends hc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=29}}Ic=zc,ga.CharacterString=Ic,zc.NAME="CharacterString";class Wc extends qc{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,zo.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]=Zo(this.year<2e3?this.year-1900:this.year-2e3,2),e[1]=Zo(this.month,2),e[2]=Zo(this.day,2),e[3]=Zo(this.hour,2),e[4]=Zo(this.minute,2),e[5]=Zo(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}}}Rc=Wc,ga.UTCTime=Rc,Wc.NAME="UTCTime";class jc extends Wc{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(Zo(this.year,4)),e.push(Zo(this.month,2)),e.push(Zo(this.day,2)),e.push(Zo(this.hour,2)),e.push(Zo(this.minute,2)),e.push(Zo(this.second,2)),0!==this.millisecond&&(e.push("."),e.push(Zo(this.millisecond,3))),e.push("Z"),e.join("")}return super.toString(e)}toJSON(){return{...super.toJSON(),millisecond:this.millisecond}}}Ac=jc,ga.GeneralizedTime=Ac,jc.NAME="GeneralizedTime";class Gc extends xc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=31}}Tc=Gc,ga.DATE=Tc,Gc.NAME="DATE";class Yc extends xc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=32}}Dc=Yc,ga.TimeOfDay=Dc,Yc.NAME="TimeOfDay";class Qc extends xc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=33}}kc=Qc,ga.DateTime=kc,Qc.NAME="DateTime";class Zc extends xc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=34}}Pc=Zc,ga.Duration=Pc,Zc.NAME="Duration";class Jc extends xc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=14}}function Xc(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 el(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(""))}Cc=Jc,ga.TIME=Cc,Jc.NAME="TIME";async function tl(e,t){const n=So.get(),r=new ac({value:[new Xa({value:0}),new ac({value:[new rc({value:"1.2.840.113549.1.1.1"}),new Na]}),new Wa({valueHex:e.marshal()})]}).toBER(),s=new Uint8Array(r,0,r.byteLength),i=No(16),o=await async function(e,t,n,r){const{c:s,dkLen:i,asyncTick:o,DK:a,PRF:c,PRFSalt:l}=Lo(e,t,n,r);let u;const h=new Uint8Array(4),d=xs(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 Os(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 Wo(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:fl,hexToBytes:gl}=Ii,ml={Err:class extends Error{constructor(e=""){super(e)}},_parseInt(e){const{Err:t}=ml;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:fl(r),l:e.subarray(n+2)}},toSig(e){const{Err:t}=ml,n="string"==typeof e?gl(e):e;si(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}=ml._parseInt(n.subarray(2)),{d:o,l:a}=ml._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}`}},yl=BigInt(0),wl=BigInt(1);BigInt(2);const bl=BigInt(3);function vl(e){const t=function(e){const t=zi(e);_i(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 yi(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&&yl<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(ri(e)&&(e=oi(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:di(mi("private key",e,r))}catch(t){throw new Error(`private key must be ${r} bytes, hex or bigint, not ${typeof e}`)}return s&&(o=xi(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(mi("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,bl),{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,bl);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===yl)return r;if(a(e),e===wl)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>yl||l>yl;)o&wl&&(u=u.add(f)),l&wl&&(d=d.add(f)),f=f.double(),o>>=wl,l>>=wl;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!==yl&&t!==wl&&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===wl)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===wl?this:n?n(h,this):this.multiplyUnsafe(t.h)}toRawBytes(e=!0){return this.assertValidity(),r(h,this,e)}toHex(e=!0){return oi(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=Hi(h,t.endo?Math.ceil(d/2):d);return{CURVE:t,ProjectivePoint:h,normPrivateKeyToScalar:c,weierstrassEquation:i,isWithinCurveOrder:o}}function El(e){const t=function(e){const t=zi(e);return _i(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 xi(e,r)}function a(e){return Oi(e,r)}const{ProjectivePoint:c,normPrivateKeyToScalar:l,weierstrassEquation:u,isWithinCurveOrder:h}=vl({...t,toBytes(e,t,r){const s=t.toAffine(),i=n.toBytes(s.x),o=yi;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=di(o);if(!(yl<(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&wl)===wl)&&(s=n.neg(s)),{x:e,y:s}}var a}}),d=e=>oi(fi(e,t.nByteLength));function p(e){return e>r>>wl}const f=(e,t,n)=>di(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=mi("compactSignature",e,2*n),new g(f(e,0,n),f(e,n,2*n))}static fromDER(e){const{r:t,s:n}=ml.toSig(mi("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(mi("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 hi(this.toDERHex())}toDERHex(){return ml.hexFromSig({r:this.r,s:this.s})}toCompactRawBytes(){return hi(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=Ki(t.n);return function(e,t,n=!1){const r=e.length,s=Vi(t),i=Ki(t);if(r<16||r<i||r>1024)throw new Error(`expected ${i}-1024 bytes of input, got ${r}`);const o=xi(n?di(e):pi(e),t-Ai)+Ai;return n?gi(o,s):fi(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=ri(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=di(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=wi(t.nBitLength);function E(e){if("bigint"!=typeof e)throw new Error("bigint expected");if(!(yl<=e&&e<v))throw new Error(`bigint expected < 2^${t.nBitLength}`);return fi(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=mi("msgHash",e),f&&(e=mi("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(mi("extraEntropy",e))}const I=yi(...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===yl)return;const i=o(n*o(R+s*v));if(i===yl)return;let l=(r.x===s?0:2)|Number(r.y&wl),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 Ei(o.hash.outputLen,o.nByteLength,o.hmac)(s,i)},verify:function(e,n,r,s=I){const i=e;if(n=mi("msgHash",n),r=mi("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||ri(i))try{h=g.fromDER(i)}catch(e){if(!(e instanceof ml.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
|
+
*/(ei,t,i,{c:1e4,dkLen:32}),a=No(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 ac({value:[new Wa({valueHex:i}),new Xa({value:1e4}),new Xa({value:32}),new ac({value:[new rc({value:"1.2.840.113549.2.11"}),new Na]})]}),h=new ac({value:[new rc({value:"1.2.840.113549.1.5.13"}),new ac({value:[new ac({value:[new rc({value:"1.2.840.113549.1.5.12"}),u]}),new ac({value:[new rc({value:"2.16.840.1.101.3.4.1.42"}),new Wa({valueHex:a})]})]})]}),d=new ac({value:[h,new Wa({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 nl(e){const t=[await So.get().subtle.importKey("jwk",e,{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!0,["sign"]),await sl(e)],n=await rl({privateKey:t[0],publicKey:t[1]});return{privateKey:n[0],publicKey:n[1]}}async function rl(e){if(null==e.privateKey||null==e.publicKey)throw new fn("Private and public key are required","ERR_INVALID_PARAMETERS");return Promise.all([So.get().subtle.exportKey("jwk",e.privateKey),So.get().subtle.exportKey("jwk",e.publicKey)])}async function sl(e){return So.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 il(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 ol=8192;class al{_key;constructor(e){this._key=e}verify(e,t){return async function(e,t,n){const r=await So.get().subtle.importKey("jwk",e,{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!1,["verify"]);return So.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 ac({value:[new ac({value:[new rc({value:"1.2.840.113549.1.1.1"}),new Na]}),new Ga({valueHex:new ac({value:[Xa.fromBigInt(el(kt(e.n,"base64url"))),Xa.fromBigInt(el(kt(e.e,"base64url")))]}).toBER()})]}).toBER();return new Uint8Array(t,0,t.byteLength)}(this._key)}get bytes(){return To.encode({Type:Ro.RSA,Data:this.marshal()}).subarray()}equals(e){return In(this.bytes,e.bytes)}hash(){const e=gt.digest(this.bytes);return As(e)?e.then((({bytes:e})=>e)):e.bytes}}class cl{_key;_publicKey;constructor(e,t){this._key=e,this._publicKey=t}genSecret(){return No(16)}sign(e){return async function(e,t){const n=await So.get().subtle.importKey("jwk",e,{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!1,["sign"]),r=await So.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 al(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 ac({value:[new Xa({value:0}),Xa.fromBigInt(el(kt(e.n,"base64url"))),Xa.fromBigInt(el(kt(e.e,"base64url"))),Xa.fromBigInt(el(kt(e.d,"base64url"))),Xa.fromBigInt(el(kt(e.p,"base64url"))),Xa.fromBigInt(el(kt(e.q,"base64url"))),Xa.fromBigInt(el(kt(e.dp,"base64url"))),Xa.fromBigInt(el(kt(e.dq,"base64url"))),Xa.fromBigInt(el(kt(e.qi,"base64url")))]}).toBER();return new Uint8Array(t,0,t.byteLength)}(this._key)}get bytes(){return Do.encode({Type:Ro.RSA,Data:this.marshal()}).subarray()}equals(e){return In(this.bytes,e.bytes)}hash(){const e=gt.digest(this.bytes);return As(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 tl(this,e);if("libp2p-key"===t)return Io(this.bytes,e);throw new fn(`export format '${t}' is not supported`,"ERR_INVALID_EXPORT_FORMAT")}}var ll=Object.freeze({__proto__:null,MAX_RSA_KEY_SIZE:ol,RsaPrivateKey:cl,RsaPublicKey:al,fromJwk:async function(e){if(il(e)>ol)throw new fn("key size is too large","ERR_KEY_SIZE_TOO_LARGE");const t=await nl(e);return new cl(t.privateKey,t.publicKey)},generateKeyPair:async function(e){if(e>ol)throw new fn("key size is too large","ERR_KEY_SIZE_TOO_LARGE");const t=await async function(e){const t=await So.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 rl(t);return{privateKey:n[0],publicKey:n[1]}}(e);return new cl(t.privateKey,t.publicKey)},unmarshalRsaPrivateKey:async function(e){const t=function(e){const{result:t}=Ta(e),n=t.valueBlock.value;return{n:Qt(Xc(n[1].toBigInt()),"base64url"),e:Qt(Xc(n[2].toBigInt()),"base64url"),d:Qt(Xc(n[3].toBigInt()),"base64url"),p:Qt(Xc(n[4].toBigInt()),"base64url"),q:Qt(Xc(n[5].toBigInt()),"base64url"),dp:Qt(Xc(n[6].toBigInt()),"base64url"),dq:Qt(Xc(n[7].toBigInt()),"base64url"),qi:Qt(Xc(n[8].toBigInt()),"base64url"),kty:"RSA",alg:"RS256"}}(e);if(il(t)>ol)throw new fn("key size is too large","ERR_KEY_SIZE_TOO_LARGE");const n=await nl(t);return new cl(n.privateKey,n.publicKey)},unmarshalRsaPublicKey:function(e){const t=function(e){const{result:t}=Ta(e),n=t.valueBlock.value[1].valueBlock.value[0].valueBlock.value;return{kty:"RSA",n:Qt(Xc(n[0].toBigInt()),"base64url"),e:Qt(Xc(n[1].toBigInt()),"base64url")}}(e);if(il(t)>ol)throw new fn("key size is too large","ERR_KEY_SIZE_TOO_LARGE");return new al(t)}});const ul=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]),hl=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),dl=new Uint32Array(64);class pl extends Hs{constructor(){super(64,32,8,!1),this.A=0|hl[0],this.B=0|hl[1],this.C=0|hl[2],this.D=0|hl[3],this.E=0|hl[4],this.F=0|hl[5],this.G=0|hl[6],this.H=0|hl[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)dl[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){const t=dl[e-15],n=dl[e-2],r=Ns(t,7)^Ns(t,18)^t>>>3,s=Ns(n,17)^Ns(n,19)^n>>>10;dl[e]=s+dl[e-7]+r+dl[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+(Ns(o,6)^Ns(o,11)^Ns(o,25))+((u=o)&a^~u&c)+ul[e]+dl[e]|0,h=(Ns(n,2)^Ns(n,13)^Ns(n,22))+qs(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(){dl.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}}const fl=Ks((()=>new pl));
|
|
76
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const{bytesToNumberBE:gl,hexToBytes:ml}=Ri,yl={Err:class extends Error{constructor(e=""){super(e)}},_parseInt(e){const{Err:t}=yl;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:gl(r),l:e.subarray(n+2)}},toSig(e){const{Err:t}=yl,n="string"==typeof e?ml(e):e;ii(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}=yl._parseInt(n.subarray(2)),{d:o,l:a}=yl._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}`}},wl=BigInt(0),bl=BigInt(1);BigInt(2);const vl=BigInt(3);function El(e){const t=function(e){const t=Wi(e);Ii(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 wi(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&&wl<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(si(e)&&(e=ai(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:pi(yi("private key",e,r))}catch(t){throw new Error(`private key must be ${r} bytes, hex or bigint, not ${typeof e}`)}return s&&(o=Ni(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(yi("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,vl),{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,vl);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===wl)return r;if(a(e),e===bl)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>wl||l>wl;)o&bl&&(u=u.add(f)),l&bl&&(d=d.add(f)),f=f.double(),o>>=bl,l>>=bl;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!==wl&&t!==bl&&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===bl)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===bl?this:n?n(h,this):this.multiplyUnsafe(t.h)}toRawBytes(e=!0){return this.assertValidity(),r(h,this,e)}toHex(e=!0){return ai(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=zi(h,t.endo?Math.ceil(d/2):d);return{CURVE:t,ProjectivePoint:h,normPrivateKeyToScalar:c,weierstrassEquation:i,isWithinCurveOrder:o}}function Sl(e){const t=function(e){const t=Wi(e);return Ii(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 Ni(e,r)}function a(e){return Li(e,r)}const{ProjectivePoint:c,normPrivateKeyToScalar:l,weierstrassEquation:u,isWithinCurveOrder:h}=El({...t,toBytes(e,t,r){const s=t.toAffine(),i=n.toBytes(s.x),o=wi;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=pi(o);if(!(wl<(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&bl)===bl)&&(s=n.neg(s)),{x:e,y:s}}var a}}),d=e=>ai(gi(e,t.nByteLength));function p(e){return e>r>>bl}const f=(e,t,n)=>pi(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=yi("compactSignature",e,2*n),new g(f(e,0,n),f(e,n,2*n))}static fromDER(e){const{r:t,s:n}=yl.toSig(yi("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(yi("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 di(this.toDERHex())}toDERHex(){return yl.hexFromSig({r:this.r,s:this.s})}toCompactRawBytes(){return di(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=$i(t.n);return function(e,t,n=!1){const r=e.length,s=Ki(t),i=$i(t);if(r<16||r<i||r>1024)throw new Error(`expected ${i}-1024 bytes of input, got ${r}`);const o=Ni(n?pi(e):fi(e),t-Ti)+Ti;return n?mi(o,s):gi(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=si(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=pi(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=bi(t.nBitLength);function E(e){if("bigint"!=typeof e)throw new Error("bigint expected");if(!(wl<=e&&e<v))throw new Error(`bigint expected < 2^${t.nBitLength}`);return gi(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=yi("msgHash",e),f&&(e=yi("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(yi("extraEntropy",e))}const I=wi(...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===wl)return;const i=o(n*o(R+s*v));if(i===wl)return;let l=(r.x===s?0:2)|Number(r.y&bl),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 Si(o.hash.outputLen,o.nByteLength,o.hmac)(s,i)},verify:function(e,n,r,s=I){const i=e;if(n=yi("msgHash",n),r=yi("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||si(i))try{h=g.fromDER(i)}catch(e){if(!(e instanceof yl.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 _l(e){return{hash:e,hmac:(t,...n)=>Oo(e,t,Us(...n)),randomBytes:$s}}BigInt(4);
|
|
78
78
|
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
79
|
-
const _l=BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),Il=BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),Rl=BigInt(1),Al=BigInt(2),Tl=(e,t)=>(e+t/Al)/t;const Dl=Fi(_l,void 0,void 0,{sqrt:function(e){const t=_l,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=Mi(u,n,t)*u%t,d=Mi(h,n,t)*u%t,p=Mi(d,Al,t)*l%t,f=Mi(p,s,t)*p%t,g=Mi(f,i,t)*f%t,m=Mi(g,a,t)*g%t,y=Mi(m,c,t)*m%t,w=Mi(y,a,t)*g%t,b=Mi(w,n,t)*u%t,v=Mi(b,o,t)*f%t,E=Mi(v,r,t)*l%t,S=Mi(E,Al,t);if(!Dl.eql(Dl.sqr(S),e))throw new Error("Cannot find square root");return S}}),kl=function(e,t){const n=t=>El({...e,...Sl(t)});return Object.freeze({...n(t),create:n})}({a:BigInt(0),b:BigInt(7),Fp:Dl,n:Il,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),h:BigInt(1),lowS:!0,endo:{beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar:e=>{const t=Il,n=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),r=-Rl*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),s=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),i=n,o=BigInt("0x100000000000000000000000000000000"),a=Tl(i*e,t),c=Tl(-r*e,t);let l=xi(e-a*n-c*s,t),u=xi(-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}}}},pl);function Pl(e){try{kl.ProjectivePoint.fromHex(e)}catch(e){throw new pn(String(e),"ERR_INVALID_PUBLIC_KEY")}}BigInt(0),kl.ProjectivePoint;class Cl{_key;constructor(e){Pl(e),this._key=e}verify(e,t){return function(e,t,n){const r=ft.digest(n instanceof Uint8Array?n:n.subarray());if(Rs(r))return r.then((({digest:n})=>kl.verify(t,n,e))).catch((e=>{throw new pn(String(e),"ERR_INVALID_INPUT")}));try{return kl.verify(t,r.digest,e)}catch(e){throw new pn(String(e),"ERR_INVALID_INPUT")}}(this._key,t,e)}marshal(){return e=this._key,kl.ProjectivePoint.fromHex(e).toRawBytes(!0);var e}get bytes(){return Ao.encode({Type:Io.Secp256k1,Data:this.marshal()}).subarray()}equals(e){return _n(this.bytes,e.bytes)}async hash(){const e=ft.digest(this.bytes);let t;return Rs(e)?({bytes:t}=await e):t=e.bytes,t}}class xl{_key;_publicKey;constructor(e,t){this._key=e,this._publicKey=t??function(e){try{return kl.getPublicKey(e,!0)}catch(e){throw new pn(String(e),"ERR_INVALID_PRIVATE_KEY")}}(e),function(e){try{kl.getPublicKey(e,!0)}catch(e){throw new pn(String(e),"ERR_INVALID_PRIVATE_KEY")}}(this._key),Pl(this._publicKey)}sign(e){return function(e,t){const n=ft.digest(t instanceof Uint8Array?t:t.subarray());if(Rs(n))return n.then((({digest:t})=>kl.sign(t,e).toDERRawBytes())).catch((e=>{throw new pn(String(e),"ERR_INVALID_INPUT")}));try{return kl.sign(n.digest,e).toDERRawBytes()}catch(e){throw new pn(String(e),"ERR_INVALID_INPUT")}}(this._key,e)}get public(){return new Cl(this._publicKey)}marshal(){return this._key}get bytes(){return To.encode({Type:Io.Secp256k1,Data:this.marshal()}).subarray()}equals(e){return _n(this.bytes,e.bytes)}hash(){const e=ft.digest(this.bytes);return Rs(e)?e.then((({bytes:e})=>e)):e.bytes}async id(){return Yt(await this.public.hash(),"base58btc")}async export(e,t="libp2p-key"){if("libp2p-key"===t)return _o(this.bytes,e);throw new pn(`export format '${t}' is not supported`,"ERR_INVALID_EXPORT_FORMAT")}}var Nl=Object.freeze({__proto__:null,Secp256k1PrivateKey:xl,Secp256k1PublicKey:Cl,generateKeyPair:async function(){const e=kl.utils.randomPrivateKey();return new xl(e)},unmarshalSecp256k1PrivateKey:function(e){return new xl(e)},unmarshalSecp256k1PublicKey:function(e){return new Cl(e)}});const Ml={rsa:cl,ed25519:Co,secp256k1:Nl};function Ol(e){const t=Object.keys(Ml).join(" / ");return new pn(`invalid or unsupported key type ${e}. Must be ${t}`,"ERR_UNSUPPORTED_KEY_TYPE")}function Ll(e){if("rsa"===(e=e.toLowerCase())||"ed25519"===e||"secp256k1"===e)return Ml[e];throw Ol(e)}function Bl(e){const t=Ao.decode(e),n=t.Data??new Uint8Array;switch(t.Type){case Io.RSA:return Ml.rsa.unmarshalRsaPublicKey(n);case Io.Ed25519:return Ml.ed25519.unmarshalEd25519PublicKey(n);case Io.Secp256k1:return Ml.secp256k1.unmarshalSecp256k1PublicKey(n);default:throw Ol(t.Type??"unknown")}}function Ul(e,t){return Ll(t=(t??"rsa").toLowerCase()),e.bytes}async function Fl(e){const t=To.decode(e),n=t.Data??new Uint8Array;switch(t.Type){case Io.RSA:return Ml.rsa.unmarshalRsaPrivateKey(n);case Io.Ed25519:return Ml.ed25519.unmarshalEd25519PrivateKey(n);case Io.Secp256k1:return Ml.secp256k1.unmarshalSecp256k1PrivateKey(n);default:throw Ol(t.Type??"RSA")}}var Vl,Kl={exports:{}};Vl=Kl,function(){Vl.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 $l=Lr(Kl.exports);const ql="ERR_UNRECOGNIZED_VALIDITY",Hl="ERR_SIGNATURE_VERIFICATION",zl="ERR_UNDEFINED_PARAMETER";var Wl;!function(e){let t,n;(e.ValidityType||(e.ValidityType={})).EOL="EOL",function(e){e[e.EOL=0]="EOL"}(t||(t={})),function(e){e.codec=()=>zt(t)}(e.ValidityType||(e.ValidityType={})),e.codec=()=>(null==n&&(n=Wt(((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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(Wl||(Wl={}));const jl=["string","number","bigint","symbol"],Gl=["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 Yl(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(Gl.includes(t))return t;return}(e);return n||"Object"}class Ql{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}}Ql.uint=new Ql(0,"uint",!0),Ql.negint=new Ql(1,"negint",!0),Ql.bytes=new Ql(2,"bytes",!0),Ql.string=new Ql(3,"string",!0),Ql.array=new Ql(4,"array",!1),Ql.map=new Ql(5,"map",!1),Ql.tag=new Ql(6,"tag",!1),Ql.float=new Ql(7,"float",!0),Ql.false=new Ql(7,"false",!0),Ql.true=new Ql(7,"true",!0),Ql.null=new Ql(7,"null",!0),Ql.undefined=new Ql(7,"undefined",!0),Ql.break=new Ql(7,"break",!0);class Jl{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 Zl=globalThis.process&&!globalThis.process.browser&&globalThis.Buffer&&"function"==typeof globalThis.Buffer.isBuffer,Xl=new TextDecoder,eu=new TextEncoder;function tu(e){return Zl&&globalThis.Buffer.isBuffer(e)}const nu=Zl?(e,t,n)=>n-t>64?globalThis.Buffer.from(e.subarray(t,n)).toString("utf8"):ou(e,t,n):(e,t,n)=>n-t>64?Xl.decode(e.subarray(t,n)):ou(e,t,n),ru=Zl?e=>e.length>64?globalThis.Buffer.from(e):iu(e):e=>e.length>64?eu.encode(e):iu(e),su=Zl?(e,t,n)=>tu(e)?new Uint8Array(e.subarray(t,n)):e.slice(t,n):(e,t,n)=>e.slice(t,n);function iu(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 ou(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<=au)return String.fromCharCode.apply(String,e);let n="",r=0;for(;r<t;)n+=String.fromCharCode.apply(String,e.slice(r,r+=au));return n}(r)}const au=4096;const cu="CBOR decode error:",lu="CBOR encode error:";function uu(e,t,n){if(e.length-t<n)throw new Error(`${cu} not enough data for type`)}const hu=[24,256,65536,4294967296,BigInt("18446744073709551616")];function du(e,t,n){uu(e,t,1);const r=e[t];if(!0===n.strict&&r<hu[0])throw new Error(`${cu} integer encoded in more bytes than necessary (strict decode)`);return r}function pu(e,t,n){uu(e,t,2);const r=e[t]<<8|e[t+1];if(!0===n.strict&&r<hu[1])throw new Error(`${cu} integer encoded in more bytes than necessary (strict decode)`);return r}function fu(e,t,n){uu(e,t,4);const r=16777216*e[t]+(e[t+1]<<16)+(e[t+2]<<8)+e[t+3];if(!0===n.strict&&r<hu[2])throw new Error(`${cu} integer encoded in more bytes than necessary (strict decode)`);return r}function gu(e,t,n){uu(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<hu[3])throw new Error(`${cu} 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(`${cu} integers outside of the safe integer range are not supported`)}function mu(e,t){return yu(e,0,t.value)}function yu(e,t,n){if(n<hu[0]){const r=Number(n);e.push([t|r])}else if(n<hu[1]){const r=Number(n);e.push([24|t,r])}else if(n<hu[2]){const r=Number(n);e.push([25|t,r>>>8,255&r])}else if(n<hu[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<hu[4]))throw new Error(`${cu} 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)}}}mu.encodedSize=function(e){return yu.encodedSize(e.value)},yu.encodedSize=function(e){return e<hu[0]?1:e<hu[1]?2:e<hu[2]?3:e<hu[3]?5:9},mu.compareTokens=function(e,t){return e.value<t.value?-1:e.value>t.value?1:0};const wu=BigInt(-1),bu=BigInt(1);function vu(e,t){const n=t.value,r="bigint"==typeof n?n*wu-bu:-1*n-1;yu(e,t.type.majorEncoded,r)}function Eu(e,t,n,r){uu(e,t,n+r);const s=su(e,t+n,t+n+r);return new Jl(Ql.bytes,s,n+r)}function Su(e,t,n,r){return Eu(e,t,1,n)}function _u(e){return void 0===e.encodedBytes&&(e.encodedBytes=e.type===Ql.string?ru(e.value):e.value),e.encodedBytes}function Iu(e,t){const n=_u(t);yu(e,t.type.majorEncoded,n.length),e.push(n)}function Ru(e,t,n,r,s){const i=n+r;uu(e,t,i);const o=new Jl(Ql.string,nu(e,t+n,t+i),i);return!0===s.retainStringBytes&&(o.byteValue=su(e,t+n,t+i)),o}function Au(e,t,n,r){return Ru(e,t,1,n,r)}vu.encodedSize=function(e){const t=e.value,n="bigint"==typeof t?t*wu-bu:-1*t-1;return n<hu[0]?1:n<hu[1]?2:n<hu[2]?3:n<hu[3]?5:9},vu.compareTokens=function(e,t){return e.value<t.value?1:e.value>t.value?-1:0},Iu.encodedSize=function(e){const t=_u(e);return yu.encodedSize(t.length)+t.length},Iu.compareTokens=function(e,t){return n=_u(e),r=_u(t),n.length<r.length?-1:n.length>r.length?1:function(e,t){if(tu(e)&&tu(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 Tu=Iu;function Du(e,t,n,r){return new Jl(Ql.array,r,n)}function ku(e,t,n,r){return Du(0,0,1,n)}function Pu(e,t){yu(e,Ql.array.majorEncoded,t.value)}function Cu(e,t,n,r){return new Jl(Ql.map,r,n)}function xu(e,t,n,r){return Cu(0,0,1,n)}function Nu(e,t){yu(e,Ql.map.majorEncoded,t.value)}function Mu(e,t,n,r){return new Jl(Ql.tag,n,1)}function Ou(e,t){yu(e,Ql.tag.majorEncoded,t.value)}Pu.compareTokens=mu.compareTokens,Pu.encodedSize=function(e){return yu.encodedSize(e.value)},Nu.compareTokens=mu.compareTokens,Nu.encodedSize=function(e){return yu.encodedSize(e.value)},Ou.compareTokens=mu.compareTokens,Ou.encodedSize=function(e){return yu.encodedSize(e.value)};const Lu=20,Bu=21,Uu=22,Fu=23;function Vu(e,t,n){if(n){if(!1===n.allowNaN&&Number.isNaN(e))throw new Error(`${cu} NaN values are not supported`);if(!1===n.allowInfinity&&(e===1/0||e===-1/0))throw new Error(`${cu} Infinity values are not supported`)}return new Jl(Ql.float,e,t)}function Ku(e,t,n){const r=t.value;if(!1===r)e.push([Ql.float.majorEncoded|Lu]);else if(!0===r)e.push([Ql.float.majorEncoded|Bu]);else if(null===r)e.push([Ql.float.majorEncoded|Uu]);else if(void 0===r)e.push([Ql.float.majorEncoded|Fu]);else{let t,i=!1;n&&!0===n.float64||(zu(r),t=Wu(Hu,1),r===t||Number.isNaN(r)?(Hu[0]=249,e.push(Hu.slice(0,3)),i=!0):(ju(r),t=Gu(Hu,1),r===t&&(Hu[0]=250,e.push(Hu.slice(0,5)),i=!0))),i||(s=r,qu.setFloat64(0,s,!1),t=Yu(Hu,1),Hu[0]=251,e.push(Hu.slice(0,9)))}var s}Ku.encodedSize=function(e,t){const n=e.value;if(!1===n||!0===n||null==n)return 1;if(!t||!0!==t.float64){zu(n);let e=Wu(Hu,1);if(n===e||Number.isNaN(n))return 3;if(ju(n),e=Gu(Hu,1),n===e)return 5}return 9};const $u=new ArrayBuffer(9),qu=new DataView($u,1),Hu=new Uint8Array($u,0);function zu(e){if(e===1/0)qu.setUint16(0,31744,!1);else if(e===-1/0)qu.setUint16(0,64512,!1);else if(Number.isNaN(e))qu.setUint16(0,32256,!1);else{qu.setFloat32(0,e);const t=qu.getUint32(0),n=(2139095040&t)>>23,r=8388607&t;if(255===n)qu.setUint16(0,31744,!1);else if(0===n)qu.setUint16(0,(2147483648&e)>>16|r>>13,!1);else{const e=n-127;e<-24?qu.setUint16(0,0):e<-14?qu.setUint16(0,(2147483648&t)>>16|1<<24+e,!1):qu.setUint16(0,(2147483648&t)>>16|e+15<<10|r>>13,!1)}}}function Wu(e,t){if(e.length-t<2)throw new Error(`${cu} 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){qu.setFloat32(0,e,!1)}function Gu(e,t){if(e.length-t<4)throw new Error(`${cu} not enough data for float32`);const n=(e.byteOffset||0)+t;return new DataView(e.buffer,n,4).getFloat32(0,!1)}function Yu(e,t){if(e.length-t<8)throw new Error(`${cu} not enough data for float64`);const n=(e.byteOffset||0)+t;return new DataView(e.buffer,n,8).getFloat64(0,!1)}function Qu(e,t,n){throw new Error(`${cu} encountered invalid minor (${n}) for major ${e[t]>>>5}`)}function Ju(e){return()=>{throw new Error(`${cu} ${e}`)}}Ku.compareTokens=mu.compareTokens;const Zu=[];for(let e=0;e<=23;e++)Zu[e]=Qu;Zu[24]=function(e,t,n,r){return new Jl(Ql.uint,du(e,t+1,r),2)},Zu[25]=function(e,t,n,r){return new Jl(Ql.uint,pu(e,t+1,r),3)},Zu[26]=function(e,t,n,r){return new Jl(Ql.uint,fu(e,t+1,r),5)},Zu[27]=function(e,t,n,r){return new Jl(Ql.uint,gu(e,t+1,r),9)},Zu[28]=Qu,Zu[29]=Qu,Zu[30]=Qu,Zu[31]=Qu;for(let e=32;e<=55;e++)Zu[e]=Qu;Zu[56]=function(e,t,n,r){return new Jl(Ql.negint,-1-du(e,t+1,r),2)},Zu[57]=function(e,t,n,r){return new Jl(Ql.negint,-1-pu(e,t+1,r),3)},Zu[58]=function(e,t,n,r){return new Jl(Ql.negint,-1-fu(e,t+1,r),5)},Zu[59]=function(e,t,n,r){const s=gu(e,t+1,r);if("bigint"!=typeof s){const e=-1-s;if(e>=Number.MIN_SAFE_INTEGER)return new Jl(Ql.negint,e,9)}if(!0!==r.allowBigInt)throw new Error(`${cu} integers outside of the safe integer range are not supported`);return new Jl(Ql.negint,wu-BigInt(s),9)},Zu[60]=Qu,Zu[61]=Qu,Zu[62]=Qu,Zu[63]=Qu;for(let e=64;e<=87;e++)Zu[e]=Su;Zu[88]=function(e,t,n,r){return Eu(e,t,2,du(e,t+1,r))},Zu[89]=function(e,t,n,r){return Eu(e,t,3,pu(e,t+1,r))},Zu[90]=function(e,t,n,r){return Eu(e,t,5,fu(e,t+1,r))},Zu[91]=function(e,t,n,r){const s=gu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${cu} 64-bit integer bytes lengths not supported`);return Eu(e,t,9,s)},Zu[92]=Qu,Zu[93]=Qu,Zu[94]=Qu,Zu[95]=Ju("indefinite length bytes/strings are not supported");for(let e=96;e<=119;e++)Zu[e]=Au;Zu[120]=function(e,t,n,r){return Ru(e,t,2,du(e,t+1,r),r)},Zu[121]=function(e,t,n,r){return Ru(e,t,3,pu(e,t+1,r),r)},Zu[122]=function(e,t,n,r){return Ru(e,t,5,fu(e,t+1,r),r)},Zu[123]=function(e,t,n,r){const s=gu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${cu} 64-bit integer string lengths not supported`);return Ru(e,t,9,s,r)},Zu[124]=Qu,Zu[125]=Qu,Zu[126]=Qu,Zu[127]=Ju("indefinite length bytes/strings are not supported");for(let e=128;e<=151;e++)Zu[e]=ku;Zu[152]=function(e,t,n,r){return Du(0,0,2,du(e,t+1,r))},Zu[153]=function(e,t,n,r){return Du(0,0,3,pu(e,t+1,r))},Zu[154]=function(e,t,n,r){return Du(0,0,5,fu(e,t+1,r))},Zu[155]=function(e,t,n,r){const s=gu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${cu} 64-bit integer array lengths not supported`);return Du(0,0,9,s)},Zu[156]=Qu,Zu[157]=Qu,Zu[158]=Qu,Zu[159]=function(e,t,n,r){if(!1===r.allowIndefinite)throw new Error(`${cu} indefinite length items not allowed`);return Du(0,0,1,1/0)};for(let e=160;e<=183;e++)Zu[e]=xu;Zu[184]=function(e,t,n,r){return Cu(0,0,2,du(e,t+1,r))},Zu[185]=function(e,t,n,r){return Cu(0,0,3,pu(e,t+1,r))},Zu[186]=function(e,t,n,r){return Cu(0,0,5,fu(e,t+1,r))},Zu[187]=function(e,t,n,r){const s=gu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${cu} 64-bit integer map lengths not supported`);return Cu(0,0,9,s)},Zu[188]=Qu,Zu[189]=Qu,Zu[190]=Qu,Zu[191]=function(e,t,n,r){if(!1===r.allowIndefinite)throw new Error(`${cu} indefinite length items not allowed`);return Cu(0,0,1,1/0)};for(let e=192;e<=215;e++)Zu[e]=Mu;Zu[216]=function(e,t,n,r){return new Jl(Ql.tag,du(e,t+1,r),2)},Zu[217]=function(e,t,n,r){return new Jl(Ql.tag,pu(e,t+1,r),3)},Zu[218]=function(e,t,n,r){return new Jl(Ql.tag,fu(e,t+1,r),5)},Zu[219]=function(e,t,n,r){return new Jl(Ql.tag,gu(e,t+1,r),9)},Zu[220]=Qu,Zu[221]=Qu,Zu[222]=Qu,Zu[223]=Qu;for(let e=224;e<=243;e++)Zu[e]=Ju("simple values are not supported");Zu[244]=Qu,Zu[245]=Qu,Zu[246]=Qu,Zu[247]=function(e,t,n,r){if(!1===r.allowUndefined)throw new Error(`${cu} undefined values are not supported`);return!0===r.coerceUndefinedToNull?new Jl(Ql.null,null,1):new Jl(Ql.undefined,void 0,1)},Zu[248]=Ju("simple values are not supported"),Zu[249]=function(e,t,n,r){return Vu(Wu(e,t+1),3,r)},Zu[250]=function(e,t,n,r){return Vu(Gu(e,t+1),5,r)},Zu[251]=function(e,t,n,r){return Vu(Yu(e,t+1),9,r)},Zu[252]=Qu,Zu[253]=Qu,Zu[254]=Qu,Zu[255]=function(e,t,n,r){if(!1===r.allowIndefinite)throw new Error(`${cu} indefinite length items not allowed`);return new Jl(Ql.break,void 0,1)};const Xu=[];for(let e=0;e<24;e++)Xu[e]=new Jl(Ql.uint,e,1);for(let e=-1;e>=-24;e--)Xu[31-e]=new Jl(Ql.negint,e,1);Xu[64]=new Jl(Ql.bytes,new Uint8Array(0),1),Xu[96]=new Jl(Ql.string,"",1),Xu[128]=new Jl(Ql.array,0,1),Xu[160]=new Jl(Ql.map,0,1),Xu[244]=new Jl(Ql.false,!1,1),Xu[245]=new Jl(Ql.true,!0,1),Xu[246]=new Jl(Ql.null,null,1),function(){const e=[];e[Ql.uint.major]=mu,e[Ql.negint.major]=vu,e[Ql.bytes.major]=Iu,e[Ql.string.major]=Tu,e[Ql.array.major]=Pu,e[Ql.map.major]=Nu,e[Ql.tag.major]=Ou,e[Ql.float.major]=Ku}();class eh{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(`${lu} object contains circular references`);return new eh(t,e)}}const th={null:new Jl(Ql.null,null),undefined:new Jl(Ql.undefined,void 0),true:new Jl(Ql.true,!0),false:new Jl(Ql.false,!1),emptyArray:new Jl(Ql.array,0),emptyMap:new Jl(Ql.map,0)},nh={number:(e,t,n,r)=>Number.isInteger(e)&&Number.isSafeInteger(e)?new Jl(e>=0?Ql.uint:Ql.negint,e):new Jl(Ql.float,e),bigint:(e,t,n,r)=>e>=BigInt(0)?new Jl(Ql.uint,e):new Jl(Ql.negint,e),Uint8Array:(e,t,n,r)=>new Jl(Ql.bytes,e),string:(e,t,n,r)=>new Jl(Ql.string,e),boolean:(e,t,n,r)=>e?th.true:th.false,null:(e,t,n,r)=>th.null,undefined:(e,t,n,r)=>th.undefined,ArrayBuffer:(e,t,n,r)=>new Jl(Ql.bytes,new Uint8Array(e)),DataView:(e,t,n,r)=>new Jl(Ql.bytes,new Uint8Array(e.buffer,e.byteOffset,e.byteLength)),Array(e,t,n,r){if(!e.length)return!0===n.addBreakTokens?[th.emptyArray,new Jl(Ql.break)]:th.emptyArray;r=eh.createCheck(r,e);const s=[];let i=0;for(const t of e)s[i++]=rh(t,n,r);return n.addBreakTokens?[new Jl(Ql.array,e.length),s,new Jl(Ql.break)]:[new Jl(Ql.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?[th.emptyMap,new Jl(Ql.break)]:th.emptyMap;r=eh.createCheck(r,e);const a=[];let c=0;for(const t of i)a[c++]=[rh(t,n,r),rh(s?e.get(t):e[t],n,r)];return function(e,t){t.mapSorter&&e.sort(t.mapSorter)}(a,n),n.addBreakTokens?[new Jl(Ql.map,o),a,new Jl(Ql.break)]:[new Jl(Ql.map,o),a]}};nh.Map=nh.Object,nh.Buffer=nh.Uint8Array;for(const e of"Uint8Clamped Uint16 Uint32 Int8 Int16 Int32 BigUint64 BigInt64 Float32 Float64".split(" "))nh[`${e}Array`]=nh.DataView;function rh(e,t={},n){const r=Yl(e),s=t&&t.typeEncoders&&t.typeEncoders[r]||nh[r];if("function"==typeof s){const i=s(e,r,t,n);if(null!=i)return i}const i=nh[r];if(!i)throw new Error(`${lu} unsupported type: ${r}`);return i(e,r,t,n)}const sh={strict:!1,allowIndefinite:!0,allowUndefined:!0,allowBigInt:!0};class ih{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=Xu[e];if(void 0===t){const n=Zu[e];if(!n)throw new Error(`${cu} 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 oh=Symbol.for("DONE"),ah=Symbol.for("BREAK");function ch(e,t){if(e.done())return oh;const n=e.next();if(n.type===Ql.break)return ah;if(n.type.terminal)return n.value;if(n.type===Ql.array)return function(e,t,n){const r=[];for(let s=0;s<e.value;s++){const i=ch(t,n);if(i===ah){if(e.value===1/0)break;throw new Error(`${cu} got unexpected break to lengthed array`)}if(i===oh)throw new Error(`${cu} found array but not enough entries (got ${s}, expected ${e.value})`);r[s]=i}return r}(n,e,t);if(n.type===Ql.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=ch(t,n);if(a===ah){if(e.value===1/0)break;throw new Error(`${cu} got unexpected break to lengthed map`)}if(a===oh)throw new Error(`${cu} found map but not enough entries (got ${o} [no key], expected ${e.value})`);if(!0!==r&&"string"!=typeof a)throw new Error(`${cu} non-string keys not supported (got ${typeof a})`);if(!0===n.rejectDuplicateMapKeys&&(r&&i.has(a)||!r&&a in s))throw new Error(`${cu} found repeat map key "${a}"`);const c=ch(t,n);if(c===oh)throw new Error(`${cu} 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===Ql.tag){if(t.tags&&"function"==typeof t.tags[n.value]){const r=ch(e,t);return t.tags[n.value](r)}throw new Error(`${cu} tag not supported (${n.value})`)}throw new Error("unsupported")}function lh(e,t){const[n,r]=function(e,t){if(!(e instanceof Uint8Array))throw new Error(`${cu} data to decode must be a Uint8Array`);const n=(t=Object.assign({},sh,t)).tokenizer||new ih(e,t),r=ch(n,t);if(r===oh)throw new Error(`${cu} did not find any content to decode`);if(r===ah)throw new Error(`${cu} got unexpected break`);return[r,e.subarray(n.pos())]}(e,t);if(r.length>0)throw new Error(`${cu} too many terminals, data makes no sense`);return n}const uh=us("ipns:utils"),hh=Dt("/ipns/"),dh=e=>"signatureV1"in e?Wl.encode({value:Dt(e.value),signatureV1:e.signatureV1,validityType:e.validityType,validity:Dt(e.validity),sequence:e.sequence,ttl:e.ttl,pubKey:e.pubKey,signatureV2:e.signatureV2,data:e.data}):Wl.encode({pubKey:e.pubKey,signatureV2:e.signatureV2,data:e.data});function ph(e){const t=Wl.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 Fr(new Error("missing data or signatureV2"),Hl);const n=fh(t.data),r=gh(n.Value),s=Yt(n.Validity);if(null!=t.value&&null!=t.signatureV1)return mh(t),{value:r,validityType:Wl.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:Wl.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 fh=e=>{const t=lh(e);if(0!==t.ValidityType)throw Fr(new Error("Unknown validity type"),ql);return t.ValidityType=Wl.ValidityType.EOL,Number.isInteger(t.Sequence)&&(t.Sequence=BigInt(t.Sequence)),Number.isInteger(t.TTL)&&(t.TTL=BigInt(t.TTL)),t},gh=e=>{if(null!=e){if(sn(e))return`/ipns/${e.toCID().toString(Te)}`;if(e instanceof Uint8Array){const t=Yt(e);t.startsWith("/")&&(e=t)}const t=e.toString().trim();if(t.startsWith("/")&&t.length>1)return t;const n=wt.asCID(e);if(null!=n)return 114===n.code?`/ipns/${n.toString(Te)}`:`/ipfs/${n.toV1().toString()}`;try{return e instanceof Uint8Array?`/ipfs/${wt.decode(e).toV1().toString()}`:`/ipfs/${wt.parse(t).toV1().toString()}`}catch{}}throw Fr(new Error("Value must be a valid content path starting with /"),"ERR_INVALID_VALUE")},mh=e=>{if(null==e.data)throw Fr(new Error("Record data is missing"),"ERR_INVALID_RECORD_DATA");const t=fh(e.data);if(!_n(t.Value,e.value??new Uint8Array(0)))throw Fr(new Error('Field "value" did not match between protobuf and CBOR'),Hl);if(!_n(t.Validity,e.validity??new Uint8Array(0)))throw Fr(new Error('Field "validity" did not match between protobuf and CBOR'),Hl);if(t.ValidityType!==e.validityType)throw Fr(new Error('Field "validityType" did not match between protobuf and CBOR'),Hl);if(t.Sequence!==e.sequence)throw Fr(new Error('Field "sequence" did not match between protobuf and CBOR'),Hl);if(t.TTL!==e.ttl)throw Fr(new Error('Field "ttl" did not match between protobuf and CBOR'),Hl)},yh=us("ipns:validator"),wh=async(e,t)=>{const n=ph(t);let r;try{const t=(s=n.data,In([Dt("ipns-signature:"),s]));r=await e.verify(t,n.signatureV2)}catch(e){r=!1}var s;if(!r)throw yh.error("record signature verification failed"),Fr(new Error("record signature verification failed"),Hl);if(n.validityType===Wl.ValidityType.EOL){if($l.fromString(n.validity).toDate().getTime()<Date.now())throw yh.error("record has expired"),Fr(new Error("record has expired"),"ERR_IPNS_EXPIRED_RECORD")}else if(null!=n.validityType)throw yh.error("unrecognized validity type"),Fr(new Error("unrecognized validity type"),ql);yh("ipns record for %s is valid",n.value)};async function bh(e,t){if(t.byteLength>10240)throw Fr(new Error("record too large"),"ERR_RECORD_TOO_LARGE");const n=(e=>Es(e.slice(hh.length)))(e),r=ph(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 uh.error(e),Fr(e,zl)}let n;if(null!=t.pubKey){try{n=Bl(t.pubKey)}catch(e){throw uh.error(e),e}if(!(await Ss(t.pubKey)).equals(e))throw Fr(new Error("Embedded public key did not match PeerID"),"ERR_INVALID_EMBEDDED_KEY")}else null!=e.publicKey&&(n=Bl(e.publicKey));if(null!=n)return n;throw Fr(new Error("no public key is available"),zl)})(n,r);await wh(s,t)}async function*vh(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 Eh={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}(Eh);var Sh=Lr(Eh.exports);class _h extends Error{constructor(e){super(e),this.name="TimeoutError"}}let Ih=class extends Error{constructor(e){super(),this.name="AbortError",this.message=e}};const Rh=e=>void 0===globalThis.DOMException?new Ih(e):new DOMException(e),Ah=e=>{const t=void 0===e.reason?Rh("This operation was aborted."):e.reason;return t instanceof Error?t:Rh(t)};function Th(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(Ah(e)),e.addEventListener("abort",(()=>{c(Ah(e))}))}if(n===Number.POSITIVE_INFINITY)return void e.then(a,c);const l=new _h;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 Dh=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 kh extends Sh{#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:Dh,...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=Th(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 _h&&!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 Ph(e){if(null!=e[Symbol.asyncIterator])return(async()=>{for await(const t of e)return t})();for(const t of e)return t}const Ch=Dt("/ipns/");function xh(e){return _n(e.subarray(0,Ch.byteLength),Ch)}const Nh=e=>Es(e.slice(Ch.length));class Mh{client;constructor(e){this.client=e}async*findProviders(e,t={}){yield*Hr(this.client.getProviders(e,t),(e=>({id:e.ID,multiaddrs:e.Addrs??[]})))}async provide(){}async put(e,t,n){if(!xh(e))return;const r=Nh(e),s=ph(t);await this.client.putIPNS(r,s,n)}async get(e,t){if(!xh(e))throw new pn("Not found","ERR_NOT_FOUND");const n=Nh(e);try{const e=await this.client.getIPNS(n,t);return dh(e)}catch(e){if("ERR_BAD_RESPONSE"===e.code)throw new pn("Not found","ERR_NOT_FOUND");throw e}}}class Oh{client;constructor(e){this.client=e}async findPeer(e,t={}){const n=await Ph(this.client.getPeers(e,t));if(null!=n)return{id:n.ID,multiaddrs:n.Addrs??[]};throw new pn("Not found","ERR_NOT_FOUND")}async*getClosestPeers(e,t={}){}}const Lh=us("delegated-routing-v1-http-api-client"),Bh=4,Uh=3e4;class Fh{started;httpQueue;shutDownController;clientUrl;timeout;contentRouting;peerRouting;constructor(e,t={}){this.started=!1,this.shutDownController=new AbortController,this.shutDownController.signal,this.httpQueue=new kh({concurrency:t.concurrentRequests??Bh}),this.clientUrl=e instanceof URL?e:new URL(e),this.timeout=t.timeout??Uh,this.contentRouting=new Mh(this),this.peerRouting=new Oh(this)}get[tn](){return this.contentRouting}get[on](){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={}){Lh("getProviders starts: %c",e);const n=AbortSignal.timeout(this.timeout),r=_s([this.shutDownController.signal,n,t.signal]),s=cr(),i=cr();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 pn("No matching records found.","ERR_NOT_FOUND");if(422===i.status)throw new pn("Request does not conform to schema or semantic constraints.","ERR_INVALID_REQUEST");if(null==i.body)throw new pn("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 vh(Is(i.body))){const t=this.#P(e);null!=t&&(yield t)}}catch(e){Lh.error("getProviders errored:",e)}finally{r.clear(),i.resolve(),Lh("getProviders finished: %c",e)}}async*getPeers(e,t={}){Lh("getPeers starts: %c",e);const n=AbortSignal.timeout(this.timeout),r=_s([this.shutDownController.signal,n,t.signal]),s=cr(),i=cr();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 pn("No matching records found.","ERR_NOT_FOUND");if(422===i.status)throw new pn("Request does not conform to schema or semantic constraints.","ERR_INVALID_REQUEST");if(null==i.body)throw new pn("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 vh(Is(i.body))){const t=this.#P(e);null!=t&&(yield t)}}catch(e){Lh.error("getPeers errored:",e)}finally{r.clear(),i.resolve(),Lh("getPeers finished: %c",e)}}async getIPNS(e,t={}){Lh("getIPNS starts: %c",e);const n=AbortSignal.timeout(this.timeout),r=_s([this.shutDownController.signal,n,t.signal]),s=cr(),i=cr();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(Lh("getIPNS GET %s %d",o,i.status),404===i.status)throw new pn("No matching records found.","ERR_NOT_FOUND");if(422===i.status)throw new pn("Request does not conform to schema or semantic constraints.","ERR_INVALID_REQUEST");if(null==i.body)throw new pn("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 bh((e=>In([hh,e.toBytes()]))(e),c),ph(c)}catch(e){throw Lh.error("getIPNS GET %s error:",o,e),e}finally{r.clear(),i.resolve(),Lh("getIPNS finished: %c",e)}}async putIPNS(e,t,n={}){Lh("putIPNS starts: %c",e);const r=AbortSignal.timeout(this.timeout),s=_s([this.shutDownController.signal,r,n.signal]),i=cr(),o=cr();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:dh(t),signal:s},n=await fetch(a,e);if(Lh("putIPNS PUT %s %d",a,n.status),200!==n.status)throw new pn("PUT ipns response had status other than 200","ERR_BAD_RESPONSE")}catch(e){throw Lh.error("putIPNS PUT %s error:",a,e.stack),e}finally{s.clear(),o.resolve(),Lh("putIPNS finished: %c",e)}}#P(e){const t=[],n=e.Addrs?.map(ar)??[];return null!=e.Protocols&&t.push(...e.Protocols),null!=e.Protocol&&(t.push(e.Protocol),delete e.Protocol),{...e,Schema:"peer",ID:vs(e.ID),Addrs:n,Protocols:t}}}function Vh(e,t={}){return new Fh(new URL(e),t)}function Kh(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 $h{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 Kh(this.map.entries(),(e=>[vs(e[0]),e[1]]))}forEach(e){this.map.forEach(((t,n)=>{e(t,vs(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 Kh(this.map.keys(),(e=>vs(e)))}values(){return this.map.values()}get size(){return this.map.size}}class qh{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 Kh(this.set.entries(),(e=>{const t=vs(e[0]);return[t,t]}))}forEach(e){this.set.forEach((t=>{const n=vs(t);e(n,n,this)}))}has(e){return this.set.has(e.toString())}values(){return Kh(this.set.values(),(e=>vs(e)))}intersection(e){const t=new qh;for(const n of e)this.has(n)&&t.add(n);return t}difference(e){const t=new qh;for(const n of this)e.has(n)||t.add(n);return t}union(e){const t=new qh;for(const n of e)t.add(n);for(const e of this)t.add(e);return t}}const Hh=async()=>{const e=await async function(e,t){return Ll(e).generateKeyPair(2048)}("Ed25519"),t=await async function(e){return Ss(Ul(e.public),function(e,t){return Ll(t=(t??"rsa").toLowerCase()),e.bytes}(e))}(e);if("Ed25519"===t.type)return t;throw new Error(`Generated unexpected PeerId type "${t.type}"`)};const zh="ERR_SIGNATURE_NOT_VALID";var Wh;!function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(Wh||(Wh={}));class jh{static createFromProtobuf=async e=>{const t=Wh.decode(e),n=await Ss(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=Gh(n,r,s),o=await Fl(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 pn("envelope signature is not valid for the given domain",zh);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=Wh.encode({publicKey:this.peerId.publicKey,payloadType:this.payloadType,payload:this.payload.subarray(),signature:this.signature})),this.marshaled}equals(e){return _n(this.marshal(),e.marshal())}async validate(e){const t=Gh(e,this.payloadType,this.payload);if(null==this.peerId.publicKey)throw new Error("Missing public key");return Bl(this.peerId.publicKey).verify(t.subarray(),this.signature)}}const Gh=(e,t,n)=>{const r=Dt(e),s=P(r.byteLength),i=P(t.length),o=P(n.length);return new _r(s,r,i,t,o,n)};const Yh=Uint8Array.from([3,1]);var Qh;!function(e){let t;!function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(e.AddressInfo||(e.AddressInfo={})),e.codec=()=>(null==t&&(t=Wt(((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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(Qh||(Qh={}));class Jh{static createFromProtobuf=e=>{const t=Qh.decode(e),n=Es(t.peerId),r=(t.addresses??[]).map((e=>ar(e.multiaddr))),s=t.seq;return new Jh({peerId:n,multiaddrs:r,seqNumber:s})};static DOMAIN="libp2p-peer-record";static CODEC=Yh;peerId;multiaddrs;seqNumber;domain=Jh.DOMAIN;codec=Jh.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=Qh.encode({peerId:this.peerId.toBytes(),seq:BigInt(this.seqNumber),addresses:this.multiaddrs.map((e=>({multiaddr:e.bytes})))})),this.marshaled}equals(e){return e instanceof Jh&&(!!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 Zh(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 Xh={},ed=e=>{e.addEventListener("message",(t=>{ed.dispatchEvent("message",e,t)})),null!=e.port&&e.port.addEventListener("message",(t=>{ed.dispatchEvent("message",e,t)}))};ed.addEventListener=(e,t)=>{null==Xh[e]&&(Xh[e]=[]),Xh[e].push(t)},ed.removeEventListener=(e,t)=>{null!=Xh[e]&&(Xh[e]=Xh[e].filter((e=>e===t)))},ed.dispatchEvent=function(e,t,n){null!=Xh[e]&&Xh[e].forEach((e=>e(t,n)))};const td="lock:worker:request-read",nd="lock:worker:release-read",rd="lock:master:grant-read",sd="lock:worker:request-write",id="lock:worker:release-write",od="lock:master:grant-write",ad=(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)}))}}}))},cd=(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)}))},ld={singleProcess:!1};const ud={};let hd;async function dd(e,t){let n;const r=new Promise((e=>{n=e}));return e.add((async()=>Th((async()=>{await new Promise((e=>{n((()=>{e()}))}))})(),{milliseconds:t.timeout}))),r}const pd={name:"lock",concurrency:1/0,timeout:846e5,singleProcess:!1};function fd(e){const t=Object.assign({},pd,e);return null==hd&&(hd=(e=>{if(e=Object.assign({},ld,e),Boolean(globalThis.document)||e.singleProcess){const e=new EventTarget;return ed.addEventListener("message",ad(e,"requestReadLock",td,nd,rd)),ed.addEventListener("message",ad(e,"requestWriteLock",sd,id,od)),e}return{isWorker:!0,readLock:e=>cd(e,td,rd,nd),writeLock:e=>cd(e,sd,od,id)}})(t),!0!==hd.isWorker&&(hd.addEventListener("requestReadLock",(e=>{null!=ud[e.data.name]&&ud[e.data.name].readLock().then((async t=>e.data.handler().finally((()=>{t()}))))})),hd.addEventListener("requestWriteLock",(async e=>{null!=ud[e.data.name]&&ud[e.data.name].writeLock().then((async t=>e.data.handler().finally((()=>{t()}))))})))),null==ud[t.name]&&(ud[t.name]=((e,t)=>{if(!0===hd.isWorker)return{readLock:hd.readLock(e,t),writeLock:hd.writeLock(e,t)};const n=new kh({concurrency:1});let r;return{async readLock(){if(null!=r)return dd(r,t);r=new kh({concurrency:t.concurrency,autoStart:!1});const e=r,s=dd(r,t);return n.add((async()=>{e.start(),await e.onIdle().then((()=>{r===e&&(r=null)}))})),s},writeLock:async()=>(r=null,dd(n,t))}})(t.name,t)),ud[t.name]}const gd={ERR_INVALID_PARAMETERS:"ERR_INVALID_PARAMETERS"};var md,yd,wd;function bd(e,t){const n=md.decode(t);null!=n.publicKey&&null==e.publicKey&&(e=function(e){if("RSA"===e.type)return new ys(e);if("Ed25519"===e.type)return new ws(e);if("secp256k1"===e.type)return new bs(e);throw new pn("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:ar(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=Wt(((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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(e.Peer$metadataEntry||(e.Peer$metadataEntry={})),function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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),wd.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=wd.codec().decode(e,e.uint32());break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(e.Peer$tagsEntry||(e.Peer$tagsEntry={})),e.codec=()=>(null==t&&(t=Wt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.addresses)for(const e of t.addresses)n.uint32(10),yd.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(yd.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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(md||(md={})),function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(yd||(yd={})),function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(wd||(wd={}));const vd="/peers/";function Ed(e){if(!sn(e)||null==e.type)throw new pn("Invalid PeerId",gd.ERR_INVALID_PARAMETERS);const t=e.toCID().toString();return new Xt(`${vd}${t}`)}async function Sd(e,t,n){const r=new Map;for(const s of n){if(null==s)continue;if(s.multiaddr instanceof Uint8Array&&(s.multiaddr=ar(s.multiaddr)),!or(s.multiaddr))throw new pn("Multiaddr was invalid",gd.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 _d(e,t,n,r){if(null==t)throw new pn("Invalid PeerData",gd.ERR_INVALID_PARAMETERS);if(null!=t.publicKey&&null!=e.publicKey&&!_n(t.publicKey,e.publicKey))throw new pn("publicKey bytes do not match peer id publicKey bytes",gd.ERR_INVALID_PARAMETERS);const s=r.existingPeer;if(null!=s&&!e.equals(s.id))throw new pn("peer id did not match existing peer id",gd.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=Id(t.metadata instanceof Map?[...t.metadata.entries()]:Object.entries(t.metadata),{validate:Rd})}if(null!=t.tags){c=Id(t.tags instanceof Map?[...t.tags.entries()]:Object.entries(t.tags),{validate:Ad,map:Td})}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=Id([...a.entries()],{validate:Rd})}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=Id([...n.entries()],{validate:Ad,map:Td})}null!=t.peerRecordEnvelope&&(l=t.peerRecordEnvelope)}const u={addresses:await Sd(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 Id(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 Rd(e,t){if("string"!=typeof e)throw new pn("Metadata key must be a string",gd.ERR_INVALID_PARAMETERS);if(!(t instanceof Uint8Array))throw new pn("Metadata value must be a Uint8Array",gd.ERR_INVALID_PARAMETERS)}function Ad(e,t){if("string"!=typeof e)throw new pn("Tag name must be a string",gd.ERR_INVALID_PARAMETERS);if(null!=t.value){if(parseInt(`${t.value}`,10)!==t.value)throw new pn("Tag value must be an integer",gd.ERR_INVALID_PARAMETERS);if(t.value<0||t.value>100)throw new pn("Tag value must be between 0-100",gd.ERR_INVALID_PARAMETERS)}if(null!=t.ttl){if(parseInt(`${t.ttl}`,10)!==t.ttl)throw new pn("Tag ttl must be an integer",gd.ERR_INVALID_PARAMETERS);if(t.ttl<0)throw new pn("Tag ttl must be between greater than 0",gd.ERR_INVALID_PARAMETERS)}}function Td(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 Dd(e,t,n){const r=e.toString().split("/")[2],s=Es(ye.decode(r)),i=n.get(s);if(null!=i)return i;const o=bd(s,t);return n.set(s,o),o}class kd{peerId;datastore;lock;addressFilter;constructor(e,t={}){this.peerId=e.peerId,this.datastore=e.datastore,this.addressFilter=t.addressFilter,this.lock=fd({name:"peer-store",singleProcess:!0})}async has(e){return this.datastore.has(Ed(e))}async delete(e){if(this.peerId.equals(e))throw new pn("Cannot delete self peer",gd.ERR_INVALID_PARAMETERS);await this.datastore.delete(Ed(e))}async load(e){return bd(e,await this.datastore.get(Ed(e)))}async save(e,t){const{existingBuf:n,existingPeer:r}=await this.#C(e),s=await _d(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 _d(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 _d(e,t,"merge",{addressFilter:this.addressFilter,existingPeer:r});return this.#x(e,s,n,r)}async*all(e){const t=new $h;for await(const{key:n,value:r}of this.datastore.query(function(e,t){return null==e?{}:{prefix:vd,filters:(e.filters??[]).map((e=>({key:n,value:r})=>e(Dd(n,r,t)))),orders:(e.orders??[]).map((e=>(n,r)=>e(Dd(n.key,n.value,t),Dd(r.key,r.value,t))))}}(e??{},t))){const e=Dd(n,r,t);e.id.equals(this.peerId)||(yield e)}}async#C(e){try{const t=await this.datastore.get(Ed(e));return{existingBuf:t,existingPeer:bd(e,t)}}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}return{}}async#x(e,t,n,r){const s=md.encode(t);return null!=n&&_n(s,n)?{peer:bd(e,s),previous:r,updated:!1}:(await this.datastore.put(Ed(e),s),{peer:bd(e,s),previous:r,updated:!0})}}class Pd{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 kd(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 Zh(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,Jh.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=Jh.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=Jh.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 Cd(e){if(null!=e[Symbol.asyncIterator])return(async()=>{for await(const t of e);})();for(const t of e);}function xd(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=qr(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 Nd(e,t){return null!=e[Symbol.asyncIterator]?async function*(){const n=await Zh(e);yield*n.sort(t)}():function*(){const n=Zh(e);yield*n.sort(t)}()}function Md(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 Od{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 Cd(this.putMany(e,n)),e=[],await Cd(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=xd(n,(e=>e.key.toString().startsWith(t)))}if(Array.isArray(e.filters)&&(n=e.filters.reduce(((e,t)=>xd(e,t)),n)),Array.isArray(e.orders)&&(n=e.orders.reduce(((e,t)=>Nd(e,t)),n)),null!=e.offset){let t=0;const r=e.offset;n=xd(n,(()=>t++>=r))}return null!=e.limit&&(n=Md(n,e.limit)),n}queryKeys(e,t){let n=this._allKeys(e,t);if(null!=e.prefix){const t=e.prefix;n=xd(n,(e=>e.toString().startsWith(t)))}if(Array.isArray(e.filters)&&(n=e.filters.reduce(((e,t)=>xd(e,t)),n)),Array.isArray(e.orders)&&(n=e.orders.reduce(((e,t)=>Nd(e,t)),n)),null!=e.offset){const t=e.offset;let r=0;n=xd(n,(()=>r++>=t))}return null!=e.limit&&(n=Md(n,e.limit)),n}}function Ld(e){return e=e??new Error("Read failed"),Fr(e,"ERR_DB_READ_FAILED")}function Bd(e){return e=e??new Error("Not Found"),Fr(e,"ERR_NOT_FOUND")}class Ud extends Od{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 Bd();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 Xt(e),value:t}}*_allKeys(){for(const e of this.data.keys())yield new Xt(e)}}const Fd=e=>e;function Vd(e,t){const n=e.getPeerId();if(null!=n){vs(n).equals(t)&&(e=e.decapsulate(ar(`/p2p/${t.toString()}`)))}return e}class Kd{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??Fd,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])=>ar(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=>ar(e)))}getAnnounceAddrs(){return Array.from(this.announce).map((e=>ar(e)))}getObservedAddrs(){return Array.from(this.observed).map((([e])=>ar(e)))}addObservedAddr(e){const t=(e=Vd(e,this.components.peerId)).toString();this.observed.has(t)||this.observed.set(t,{confident:!1})}confirmObservedAddr(e){const t=(e=Vd(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=Vd(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=>ar(e)))).map((e=>!0===e.protos().pop()?.path||e.getPeerId()===this.components.peerId.toString()?e:e.encapsulate(`/p2p/${this.components.peerId.toString()}`)))}}class $d{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=ls())}isStarted(){return this._started}async _invokeStartableMethod(e){await Promise.all(Object.values(this.components).filter((e=>vn(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 qd=["metrics","connectionProtector","dns"],Hd=["components","isStarted","beforeStart","start","afterStart","beforeStop","stop","afterStop","then","_invokeStartableMethod"];var zd;(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}(),zd=e}).call(Or);const Wd=["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 zd(e)));function jd(e){return Dn(e)?function(e){for(const t of Wd)if(t.contains(e))return!0;return!1}(e):kn(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 Gd(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 Yd=e=>({match:t=>!(t.length<1)&&(!!e(t[0])&&t.slice(1)),pattern:"fn"}),Qd=e=>({match:t=>Yd((t=>t===e)).match(t),pattern:e}),Jd=()=>({match:e=>Yd((e=>"string"==typeof e)).match(e),pattern:"{string}"}),Zd=()=>({match:e=>Yd((e=>!isNaN(parseInt(e)))).match(e),pattern:"{number}"}),Xd=()=>({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{Pe.decode(`z${e[1]}`)}catch(e){return!1}return e.slice(2)},pattern:"/p2p/{peerid}"}),ep=()=>({match:e=>{if(e.length<2)return!1;if("certhash"!==e[0])return!1;try{Oe.decode(e[1])}catch{return!1}return e.slice(2)},pattern:"/certhash/{certhash}"}),tp=e=>({match:t=>{const n=e.match(t);return!1===n?t:n},pattern:`optional(${e.pattern})`}),np=(...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(", ")})`}),rp=(...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 sp(...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 ip=rp(Qd("dns4"),Jd()),op=rp(Qd("dns6"),Jd()),ap=rp(Qd("dnsaddr"),Jd()),cp=rp(Qd("dns"),Jd()),lp=sp(np(cp,ap,ip,op)),up=np(rp(Qd("ip4"),Yd(Dn)),rp(Qd("ip6"),Yd(kn))),hp=np(up,cp,ip,op,ap),dp=sp(hp),pp=sp(up),fp=rp(hp,Qd("tcp"),Zd()),gp=rp(hp,Qd("udp"),Zd()),mp=np(fp,gp),yp=rp(gp,Qd("quic")),wp=rp(gp,Qd("quic-v1")),bp=np(yp,wp),vp=np(hp,fp,gp,yp,wp),Ep=np(rp(vp,Qd("ws"),tp(Xd()))),Sp=np(rp(vp,Qd("wss"),tp(Xd())),rp(vp,Qd("tls"),Qd("ws"),tp(Xd()))),_p=rp(mp,Qd("webrtc-direct"),ep(),tp(ep()),tp(Xd())),Ip=rp(wp,Qd("webtransport"),tp(ep()),tp(ep()),tp(Xd())),Rp=sp(Ip),Ap=np(Ep,Sp,rp(fp,tp(Xd())),rp(bp,tp(Xd())),rp(hp,tp(Xd())),_p,Ip,Xd()),Tp=sp(rp(Ap,Qd("p2p-circuit"),Xd())),Dp=sp(np(rp(Ap,Qd("p2p-circuit"),Qd("webrtc"),Xd()),rp(Ap,Qd("webrtc"),tp(Xd())),Qd("webrtc")));function kp(e){try{const{address:t}=e.nodeAddress();return Boolean(jd(t))}catch{return!0}}function Pp(e,t){const n=function(e,t){const n=kp(e.multiaddr),r=kp(t.multiaddr);return n&&!r?1:!n&&r?-1:0}(e,t);if(0!==n)return n;const r=function(e,t){const n=Tp.exactMatch(e.multiaddr),r=Tp.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}np(rp(hp,Qd("tcp"),Zd(),Qd("http"),tp(Xd())),rp(hp,Qd("http"),tp(Xd()))),np(rp(hp,Qd("tcp"),np(rp(Qd("443"),Qd("http")),rp(Zd(),Qd("https"))),tp(Xd())),rp(hp,Qd("tls"),Qd("http"),tp(Xd())),rp(hp,Qd("https"),tp(Xd())));class Cp extends Event{constructor(e,t){super(e),this.detail=t}}function xp(e){const t=[Kp.A];return null==e?t:Array.isArray(e)?0===e.length?t:e:[e]}const Np=60;function Mp(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:Kp[e.type]}))),Answer:(e.Answer??e.answers??[]).map((e=>({name:e.name,type:Kp[e.type],TTL:e.TTL??e.ttl??Np,data:e.data instanceof Uint8Array?Yt(e.data):e.data})))}}const Op=4;function Lp(e,t={}){const n=new kh({concurrency:t.queryConcurrency??Op});return async(t,r={})=>{const s=new URLSearchParams;s.set("name",t),xp(r.types).forEach((e=>{s.append("type",Kp[e])})),r.onProgress?.(new Cp("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=Mp(await t.json());return r.onProgress?.(new Cp("dns:response",{detail:n})),n}),{signal:r.signal});if(null==i)throw new Error("No DNS response received");return i}}var Bp=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)}}},Up=Lr(Bp);class Fp{lru;constructor(e){this.lru=Up(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 Mp({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:Kp[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??Np),value:t}),this.lru.set(n,r)}remove(e,t){const n=`${e.toLowerCase()}-${t}`;this.lru.remove(n)}clear(){this.lru.clear()}}let Vp=class{resolvers;cache;constructor(e){var t;this.resolvers={},this.cache=(t=e.cacheSize??1e3,new Fp(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["."]=[Lp("https://cloudflare-dns.com/dns-query"),Lp("https://dns.google/resolve")])}async query(e,t={}){const n=xp(t.types),r=!1!==t.cached?this.cache.get(e,n):void 0;if(null!=r)return t.onProgress?.(new Cp("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 Cp("dns:error",{detail:e}))}}if(1===o.length)throw o[0];throw new AggregateError(o,`DNS lookup of ${e} ${n} failed`)}};var Kp;!function(e){e[e.A=1]="A",e[e.CNAME=5]="CNAME",e[e.TXT=16]="TXT",e[e.AAAA=28]="AAAA"}(Kp||(Kp={}));const{code:$p}=Un("dnsaddr"),qp=async function(e,t={}){const n=t.maxRecursiveDepth??32;if(0===n)throw new pn("Max recursive depth reached","ERR_MAX_RECURSIVE_DEPTH_REACHED");const[,r]=e.stringTuples().find((([e])=>e===$p))??[],s=t?.dns??function(e={}){return new Vp(e)}(),i=await s.query(`_dnsaddr.${r}`,{signal:t?.signal,types:[Kp.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=ar(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 Hp=e=>{if("[object Object]"!==Object.prototype.toString.call(e))return!1;const t=Object.getPrototypeOf(e);return null===t||t===Object.prototype},{hasOwnProperty:zp}=Object.prototype,{propertyIsEnumerable:Wp}=Object,jp=(e,t,n)=>Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0}),Gp=Or,Yp={concatArrays:!1,ignoreUndefined:!1},Qp=e=>{const t=[];for(const n in e)zp.call(e,n)&&t.push(n);if(Object.getOwnPropertySymbols){const n=Object.getOwnPropertySymbols(e);for(const r of n)Wp.call(e,r)&&t.push(r)}return t};function Jp(e){return Array.isArray(e)?function(e){const t=e.slice(0,0);return Qp(e).forEach((n=>{jp(t,n,Jp(e[n]))})),t}(e):Hp(e)?function(e){const t=null===Object.getPrototypeOf(e)?Object.create(null):{};return Qp(e).forEach((n=>{jp(t,n,Jp(e[n]))})),t}(e):e}const Zp=(e,t,n,r)=>(n.forEach((n=>{void 0===t[n]&&r.ignoreUndefined||(n in e&&e[n]!==Object.getPrototypeOf(e)?jp(e,n,ef(e[n],t[n],r)):jp(e,n,Jp(t[n])))})),e),Xp=(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++)zp.call(t,n)&&(i.push(String(n)),jp(r,s++,t===e?t[n]:Jp(t[n])));r=Zp(r,t,Qp(t).filter((e=>!i.includes(e))),n)})),r};function ef(e,t,n){return n.concatArrays&&Array.isArray(e)&&Array.isArray(t)?Xp(e,t,n):Hp(t)&&Hp(e)?Zp(e,t,Qp(t),n):Jp(t)}var tf,nf,rf=Lr((function(...e){const t=ef(Jp(Yp),this!==Gp&&this||{},Yp);let n={_:{}};for(const r of e)if(void 0!==r){if(!Hp(r))throw new TypeError("`"+r+"` is not an Option Object");n=ef(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"}(tf||(tf={})),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"}(nf||(nf={}));const sf={addresses:{listen:[],announce:[],noAnnounce:[],announceFilter:e=>e},connectionManager:{resolvers:{dnsaddr:qp},addressSorter:Pp},transportManager:{faultTolerance:hn.FATAL_ALL}};const of=()=>{const e=new Error("Delay aborted");return e.name="AbortError",e},af=new WeakMap;const cf=function({clearTimeout:e,setTimeout:t}={}){return(n,{value:r,signal:s}={})=>{if(s?.aborted)return Promise.reject(of());let i,o,a;const c=e??clearTimeout,l=()=>{c(i),a(of())},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}),af.set(u,(()=>{c(i),i=null,o()})),u}}();class lf{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 uf}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 pn("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 cf(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 uf{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 hf(e){if(sn(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:vs(n),e.forEach((e=>{if(!or(e))throw new pn("Invalid Multiaddr",nf.ERR_INVALID_MULTIADDR);const n=e.getPeerId();if(null==n){if(null!=t)throw new pn("Multiaddrs must all have the same peer id or have no peer id",nf.ERR_INVALID_PARAMETERS)}else{const e=vs(n);if(null==t||!t.equals(e))throw new pn("Multiaddrs must all have the same peer id or have no peer id",nf.ERR_INVALID_PARAMETERS)}}))}return{peerId:t,multiaddrs:e}}class df 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 pf(e,t,n,r){const s=new df(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 ff{deferred;signal;constructor(e){this.signal=e,this.deferred=cr(),this.onAbort=this.onAbort.bind(this),this.signal?.addEventListener("abort",this.onAbort)}onAbort(){this.deferred.reject(this.signal?.reason??new dn)}cleanup(){this.signal?.removeEventListener("abort",this.onAbort)}}class gf{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 dn),this.cleanup())}async join(e={}){const t=new ff(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 Rr(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 mf extends yn{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 gf(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 dn)})),this.clear()}async onEmpty(e){0!==this.size&&await pf(this,"empty",e?.signal)}async onSizeLessThan(e,t){this.size<e||await pf(this,"next",t?.signal,{filter:()=>this.size<e})}async onIdle(e){0===this.pending&&0===this.size||await pf(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=dr({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 pn("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 yf extends mf{has(e){return null!=this.find(e)}find(e){return this.queue.find((t=>e.equals(t.options.peerId)))}}const wf="last-dial-failure",bf=42e4,vf={minConnections:5,maxQueueLength:100,autoDialConcurrency:25,autoDialPriority:0,autoDialInterval:5e3,autoDialPeerRetryThreshold:bf,autoDialDiscoveredPeersDebounce:10};class Ef{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??vf.minConnections,this.autoDialPriority=t.autoDialPriority??vf.autoDialPriority,this.autoDialIntervalMs=t.autoDialInterval??vf.autoDialInterval,this.autoDialMaxQueueLength=t.maxQueueLength??vf.maxQueueLength,this.autoDialPeerRetryThresholdMs=t.autoDialPeerRetryThreshold??vf.autoDialPeerRetryThreshold,this.autoDialDiscoveredPeersDebounce=t.autoDialDiscoveredPeersDebounce??vf.autoDialDiscoveredPeersDebounce,this.log=e.logger.forComponent("libp2p:connection-manager:auto-dial"),this.started=!1,this.running=!1,this.queue=new yf({concurrency:t.autoDialConcurrency??vf.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 qh(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 $h;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(wf);if(null==t)return!0;const n=parseInt(Yt(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 Sf=["/ipfs/id/1.0.0","/ipfs/id/push/1.0.0","/libp2p/autonat/1.0.0","/libp2p/dcutr"];const _f={maxConnections:100,allow:[]};class If{maxConnections;connectionManager;peerStore;allow;events;log;constructor(e,t={}){this.maxConnections=t.maxConnections??_f.maxConnections,this.allow=t.allow??_f.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 $h;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??Sf;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 Rf extends mf{constructor(e={}){super({...e,sort:(e,t)=>e.options.priority>t.options.priority?-1:e.options.priority<t.options.priority?1:0})}}const Af={addressSorter:Pp,maxParallelDials:50,maxDialQueueLength:500,maxPeerAddrsToDial:25,dialTimeout:5e3,resolvers:{dnsaddr:qp}};class Tf{queue;components;addressSorter;maxPeerAddrsToDial;maxDialQueueLength;dialTimeout;shutDownController;connections;log;constructor(e,t={}){this.addressSorter=t.addressSorter??Af.addressSorter,this.maxPeerAddrsToDial=t.maxPeerAddrsToDial??Af.maxPeerAddrsToDial,this.maxDialQueueLength=t.maxDialQueueLength??Af.maxDialQueueLength,this.dialTimeout=t.dialTimeout??Af.dialTimeout,this.connections=t.connections??new $h,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??{}))ir.set(e,n);this.queue=new Rf({concurrency:t.maxParallelDials??Af.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}=hf(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 pn("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 pn("Peer had more than maxPeerAddrsToDial",nf.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:{[wf]:Dt(Date.now().toString())}})}catch(e){this.log.error("could not update last dial failure key for %p",n,e)}if(t.aborted)throw new pn(e.message,gn);i.push(e)}}if(1===i.length)throw i[0];throw new fn(i,"All multiaddr dials failed",nf.ERR_TRANSPORT_DIAL_FAILED)}finally{t.clear()}}),{peerId:n,priority:t.priority??Df,multiaddrs:new Set(r.map((e=>e.toString()))),signal:t.signal})}createDialAbortController(e){const t=_s([AbortSignal.timeout(this.dialTimeout),this.shutDownController.signal,e]);return t}async calculateMultiaddrs(e,t=new Set,n={}){const r=[...t].map((e=>({multiaddr:ar(e),isCertified:!1})));if(null!=e){if(this.components.peerId.equals(e))throw new pn("Tried to dial self",nf.ERR_DIALED_SELF);if(!0===await(this.components.connectionGater.denyDialPeer?.(e)))throw new pn("The dial request is blocked by gater.allowDialPeer",nf.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!==nf.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!==nf.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 ir.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 pn("The dial request has no valid addresses",nf.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 pn("The connection gater denied all addresses in the dial request",nf.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=>!Tp.matches(e.multiaddr)))}catch(e){this.log.trace("error calculating if multiaddr(s) were dialable",e)}return!1}}const Df=50,kf={minConnections:5,maxConnections:100,inboundConnectionThreshold:5,maxIncomingPendingConnections:10,autoDialConcurrency:25,autoDialPriority:0,autoDialMaxQueueLength:100,autoDialPeerRetryThreshold:bf,autoDialDiscoveredPeersDebounce:10};class Pf{started;connections;allow;deny;maxIncomingPendingConnections;incomingPendingConnections;maxConnections;dialQueue;autoDial;connectionPruner;inboundConnectionRateLimiter;peerStore;metrics;events;log;constructor(e,t={}){this.maxConnections=t.maxConnections??kf.maxConnections;const n=t.minConnections??kf.minConnections;if(this.maxConnections<n)throw new pn("Connection Manager maxConnections must be greater than minConnections",nf.ERR_INVALID_PARAMETERS);this.connections=new $h,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=>ar(e))),this.deny=(t.deny??[]).map((e=>ar(e))),this.incomingPendingConnections=0,this.maxIncomingPendingConnections=t.maxIncomingPendingConnections??kf.maxIncomingPendingConnections,this.inboundConnectionRateLimiter=new lf({points:t.inboundConnectionThreshold??kf.inboundConnectionThreshold,duration:1}),this.autoDial=new Ef({connectionManager:this,peerStore:e.peerStore,events:e.events,logger:e.logger},{minConnections:n,autoDialConcurrency:t.autoDialConcurrency??kf.autoDialConcurrency,autoDialPriority:t.autoDialPriority??kf.autoDialPriority,autoDialPeerRetryThreshold:t.autoDialPeerRetryThreshold??kf.autoDialPeerRetryThreshold,autoDialDiscoveredPeersDebounce:t.autoDialDiscoveredPeersDebounce??kf.autoDialDiscoveredPeersDebounce,maxQueueLength:t.autoDialMaxQueueLength??kf.autoDialMaxQueueLength}),this.connectionPruner=new If({connectionManager:this,peerStore:e.peerStore,events:e.events,logger:e.logger},{maxConnections:this.maxConnections,allow:this.allow}),this.dialQueue=new Tf(e,{addressSorter:t.addressSorter??Pp,maxParallelDials:t.maxParallelDials??50,maxDialQueueLength:t.maxDialQueueLength??500,maxPeerAddrsToDial:t.maxPeerAddrsToDial??25,dialTimeout:t.dialTimeout??5e3,resolvers:t.resolvers??{dnsaddr:qp},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 pn("Not started",nf.ERR_NODE_NOT_STARTED);t.signal?.throwIfAborted();const{peerId:n}=hf(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??Df});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=>ar(e)))})))}async isDialable(e,t={}){return this.dialQueue.isDialable(e,t)}}class Cf{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 pn("No content routers available",nf.ERR_NO_ROUTERS_AVAILABLE);const n=this,r=new qh;for await(const s of pr(...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 pn("No content routers available",nf.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 pn(tf.NOT_STARTED_YET,nf.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 pn(tf.NOT_STARTED_YET,nf.ERR_NODE_NOT_STARTED);return Promise.any(this.routers.map((async n=>n.get(e,t))))}}const xf=globalThis.CustomEvent??Event;async function*Nf(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=cr(),c=cr(),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=cr(),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 xf("task-complete"))}),(t=>{e.done=!0,e.err=t,s.dispatchEvent(new xf("task-complete"))}))}l=!0,s.dispatchEvent(new xf("task-complete"))}catch(e){o=e,s.dispatchEvent(new xf("task-complete"))}}));;){if(h()||(c=cr(),await c.promise),null!=o)throw o;if(r?yield*d():yield*p(),l&&0===i.length)break}}class Mf{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 pn("No peer routers available",nf.ERR_NO_ROUTERS_AVAILABLE);if(e.toString()===this.peerId.toString())throw new pn("Should not try to find self",nf.ERR_FIND_SELF);const n=this,r=pr(...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 pn(tf.NOT_FOUND,nf.ERR_NOT_FOUND)}async*getClosestPeers(e,t={}){if(0===this.routers.length)throw new pn("No peer routers available",nf.ERR_NO_ROUTERS_AVAILABLE);const n=this,r=new qh;for await(const s of Nf(async function*(){const r=pr(...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 Of extends yn{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=_s([this.shutdownController.signal,e?.signal]);try{for(;;){this.needNext?.resolve(),this.needNext=cr();const e=await pf(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=_s([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(xo(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 Rr(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 Lf{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 pn(`No handler registered for protocol ${e}`,nf.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 pn(`Handler already registered for protocol ${e}`,nf.ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED);const r=rf.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 pn("invalid topology",nf.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!==nf.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 Bf 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 Uf{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 Bf({name:t,metrics:n}):new Map,r}({name:"libp2p_transport_manager_listeners",metrics:this.components.metrics}),this.faultTolerance=t.faultTolerance??hn.FATAL_ALL}add(e){const t=e[Symbol.toStringTag];if(null==t)throw new pn("Transport must have a valid tag",nf.ERR_INVALID_KEY);if(this.transports.has(t))throw new pn(`There is already a transport with the tag ${t}`,nf.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 pn(`No transport available for address ${String(e)}`,nf.ERR_TRANSPORT_UNAVAILABLE);try{return await n.dial(e,{...t,upgrader:this.components.upgrader})}catch(e){throw null==e.code&&(e.code=nf.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 pn("Not started",nf.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!==hn.NO_FATAL)throw new pn(`Transport (${n}) could not listen on any available address`,nf.ERR_NO_VALID_ADDRESSES)}if(t.length===this.transports.size){const e=`no valid addresses were provided for transports [${t.join(", ")}]`;if(this.faultTolerance===hn.FATAL_ALL)throw new pn(e,nf.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 Ff="/multistream/1.0.0",Vf=1024,Kf=Dt("\n");async function $f(e,t,n){await e.write(t,n)}async function qf(e,t){const n=await async function(e,t){const n=await e.read(t);if(0===n.byteLength||n.get(n.byteLength-1)!==Kf[0])throw t.log.error("Invalid mss message - missing newline",n),new pn("missing newline","ERR_INVALID_MULTISTREAM_SELECT_MESSAGE");return n.sublist(0,-1)}(e,t);return Yt(n.subarray())}async function Hf(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=cr();let c=!1,l=!1;const u=cr();let h=!1,d=!1;const p=cr(),f=Cr({sink:r,source:s},{...n,maxDataLength:Vf});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',Ff,t),await f.writeV([Dt(`${Ff}\n`),Dt(`${t}\n`)]),n.log.trace('optimistic: wrote ["%s", "%s", data] in source',Ff,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 qf(f,n);if(n.log.trace('optimistic: read multistream select header "%s"',e),e===Ff&&(e=await qf(f,n)),n.log.trace('optimistic: read protocol "%s", expecting "%s"',e,t),e!==t)throw new pn("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',Ff,t,s.byteLength);const e=`${t}\n`;yield new _r(Uint8Array.from([19]),Dt(`${Ff}\n`),P(e.length),Dt(e),s).subarray(),n.log.trace('optimistic: wrote ["%s", "%s", data(%d)] in sink',Ff,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 Rr(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=Cr(e,{...n,maxDataLength:Vf}),s=t.shift();if(null==s)throw new Error("At least one protocol must be specified");n.log.trace('select: write ["%s", "%s"]',Ff,s);const i=Dt(`${Ff}\n`),o=Dt(`${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 qf(r,n);if(n.log.trace('select: read "%s"',a),a===Ff&&(n.log.trace("select: reading protocol response"),a=await qf(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 $f(r,Dt(`${e}\n`),n),n.log.trace("select: reading protocol response");const t=await qf(r,n);if(n.log.trace('select: read "%s" for "%s"',t,e),t===e)return{stream:r.unwrap(),protocol:e}}throw new pn("protocol selection failed","ERR_UNSUPPORTED_PROTOCOL")}async function zf(e,t,n){t=Array.isArray(t)?t:[t],n.log.trace("handle: available protocols %s",t);const r=Cr(e,{...n,maxDataLength:Vf,maxLengthLength:2});for(;;){n.log.trace("handle: reading incoming string");const e=await qf(r,n);if(n.log.trace('handle: read "%s"',e),e!==Ff){if(t.includes(e))return n.log.trace('handle: respond with "%s" for "%s"',e,e),await $f(r,Dt(`${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 $f(r,Dt("na\n"),n),n.log('handle: responded with "na" for "%s"',e);else{const s=new _r(...t.map((e=>Mr.single(Dt(`${e}\n`)))),Dt("\n"));n.log.trace('handle: respond with "%s" for %s',t,e),await $f(r,s,n),n.log.trace('handle: responded with "%s" for %s',t,e)}}else n.log.trace('handle: respond with "%s" for "%s"',Ff,e),await $f(r,Dt(`${Ff}\n`),n),n.log.trace('handle: responded with "%s" for "%s"',Ff,e)}}class Wf{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";[en]=!0;get streams(){return this._getStreams()}async newStream(e,t){if("closing"===this.status)throw new pn("the connection is being closed","ERR_CONNECTION_BEING_CLOSED");if("closed"===this.status)throw new pn("the connection is closed","ERR_CONNECTION_CLOSED");if(Array.isArray(e)||(e=[e]),this.transient&&!0!==t?.runOnTransientConnection)throw new pn("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 Gf{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 pn(`The multiaddr connection is blocked by gater.${n}`,nf.ERR_CONNECTION_INTERCEPTED)}async upgradeInbound(e,t){if(!await this.components.connectionManager.acceptIncomingConnection(e))throw new pn("connection denied",nf.ERR_CONNECTION_DENIED);let n,r,s,i,o;const a=AbortSignal.timeout(this.inboundUpgradeTimeout),c=()=>{e.abort(new pn("inbound upgrade timeout",gn))};a.addEventListener("abort",c,{once:!0});try{if(!0===await(this.components.connectionGater.denyInboundConnection?.(e)))throw new pn("The multiaddr connection is blocked by gater.acceptConnection",nf.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 pn("inbound connection that skipped encryption must have a peer id",nf.ERR_INVALID_MULTIADDR);const n=vs(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=vs(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 pn("Encryption was skipped but no peer id was passed",nf.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 zf(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!==nf.ERR_NO_HANDLER_FOR_PROTOCOL)throw e}return 32}(r,this.components.registrar);if(jf(r,"inbound",u)===s){const t=new pn(`Too many inbound protocol streams for protocol "${r}" - limit ${s}`,nf.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 pn("Stream is not multiplexed",nf.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 Hf(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!==nf.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 pn(`Too many outbound protocol streams for protocol "${s}" - ${a}/${o}`,nf.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 pn(String(t),nf.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 pn("connection is not multiplexed",nf.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 Wf(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 pn("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 zf(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 pn(t.message,nf.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 Hf(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 pn(n.message,nf.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 Hf(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 pn(String(t),nf.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 zf(e,n,{log:e.log});return{stream:r,muxerFactory:t.get(s)}}catch(t){throw e.log.error("error multiplexing inbound connection",t),new pn(String(t),nf.ERR_MUXER_UNAVAILABLE)}}}class Yf extends yn{peerId;peerStore;contentRouting;peerRouting;metrics;services;logger;status;components;log;constructor(e){super(),this.status="stopped";const t=new yn,n=t.dispatchEvent.bind(t);t.dispatchEvent=e=>{const t=n(e),r=this.dispatchEvent(new bn(e.type,{detail:e.detail}));return t||r},this.peerId=e.peerId,this.logger=e.logger??ls(),this.log=this.logger.forComponent("libp2p"),this.services={};const r=this.components=function(e={}){const t=new $d(e);return new Proxy(t,{get(e,n,r){if("string"==typeof n&&!Hd.includes(n)){const e=t.components[n];if(null==e&&!qd.includes(n))throw new pn(`${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 Ud,connectionGater:Gd(e.connectionGater),dns:e.dns});this.peerStore=this.configureComponent("peerStore",new Pd(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 Gf(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 Uf(this.components,e.transportManager)),this.configureComponent("connectionManager",new Pf(this.components,e.connectionManager)),this.configureComponent("registrar",new Lf(this.components)),this.configureComponent("addressManager",new Kd(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 Mf(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 Cf(this.components,{routers:i})),this.configureComponent("randomWalk",new Of(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[tn]&&(this.log("registering service %s for content routing",t),i.push(n[tn])),null!=n[on]&&(this.log("registering service %s for peer routing",t),s.push(n[on])),null!=n[nn]&&(this.log("registering service %s for peer discovery",t),n[nn].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 qh;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 pn("no protocols were provided to open a stream",nf.ERR_INVALID_PROTOCOLS_FOR_STREAM);if(0===(t=Array.isArray(t)?t:[t]).length)throw new pn("no protocols were provided to open a stream",nf.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={}){or(e)&&(e=vs(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!==nf.ERR_NOT_FOUND)throw e}const n=In([Dt("/pk/"),e.multihash.digest]),r=await this.contentRouting.get(n,t);return Bl(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(nf.ERR_DISCOVERED_SELF))}}async function Qf(e={}){const t=e.peerId??=await Hh();if(null==t.privateKey)throw new pn("peer id was missing private key","ERR_MISSING_PRIVATE_KEY");return e.privateKey??=await Fl(t.privateKey),new Yf(await async function(e){const t=rf(sf,e);if(null===t.connectionProtector&&null!=globalThis.process?.env?.LIBP2P_FORCE_PNET)throw new pn(tf.ERR_PROTECTOR_REQUIRED,nf.ERR_PROTECTOR_REQUIRED);if(!(await Ss(t.privateKey.public.bytes,t.privateKey.bytes)).equals(t.peerId))throw new pn("Private key doesn't match peer id",nf.ERR_INVALID_KEY);return t}(e))}new Xt("SHARDING"),us("datastore:core:tiered");const Jf=(e,t)=>t.some((t=>e instanceof t));let Zf,Xf;const eg=new WeakMap,tg=new WeakMap,ng=new WeakMap;let rg={get(e,t,n){if(e instanceof IDBTransaction){if("done"===t)return eg.get(e);if("store"===t)return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return ag(e[t])},set:(e,t,n)=>(e[t]=n,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function sg(e){rg=e(rg)}function ig(e){return(Xf||(Xf=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(e)?function(...t){return e.apply(cg(this),t),ag(this.request)}:function(...t){return ag(e.apply(cg(this),t))}}function og(e){return"function"==typeof e?ig(e):(e instanceof IDBTransaction&&function(e){if(eg.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)}));eg.set(e,t)}(e),Jf(e,Zf||(Zf=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction]))?new Proxy(e,rg):e)}function ag(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(ag(e.result)),r()},i=()=>{n(e.error),r()};e.addEventListener("success",s),e.addEventListener("error",i)}));return ng.set(t,e),t}(e);if(tg.has(e))return tg.get(e);const t=og(e);return t!==e&&(tg.set(e,t),ng.set(t,e)),t}const cg=e=>ng.get(e);const lg=["get","getKey","getAll","getAllKeys","count"],ug=["put","add","delete","clear"],hg=new Map;function dg(e,t){if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(hg.get(t))return hg.get(t);const n=t.replace(/FromIndex$/,""),r=t!==n,s=ug.includes(n);if(!(n in(r?IDBIndex:IDBObjectStore).prototype)||!s&&!lg.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 hg.set(t,i),i}sg((e=>({...e,get:(t,n,r)=>dg(t,n)||e.get(t,n,r),has:(t,n)=>!!dg(t,n)||e.has(t,n)})));const pg=["continue","continuePrimaryKey","advance"],fg={},gg=new WeakMap,mg=new WeakMap,yg={get(e,t){if(!pg.includes(t))return e[t];let n=fg[t];return n||(n=fg[t]=function(...e){gg.set(this,mg.get(this)[t](...e))}),n}};async function*wg(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;const n=new Proxy(t,yg);for(mg.set(n,t),ng.set(n,cg(t));t;)yield n,t=await(gg.get(n)||t.continue()),gg.delete(n)}function bg(e,t){return t===Symbol.asyncIterator&&Jf(e,[IDBIndex,IDBObjectStore,IDBCursor])||"iterate"===t&&Jf(e,[IDBIndex,IDBObjectStore])}sg((e=>({...e,get:(t,n,r)=>bg(t,n)?wg:e.get(t,n,r),has:(t,n)=>bg(t,n)||e.has(t,n)})));class vg extends Od{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=ag(o);return r&&o.addEventListener("upgradeneeded",(e=>{r(ag(o.result),e.oldVersion,e.newVersion,ag(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"),Fr(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"),Fr(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 Ld(e)}if(void 0===t)throw Bd();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 Ld(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"),Fr(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)=>xd(e,t)),t)),Array.isArray(e.orders)&&(t=e.orders.reduce(((e,t)=>Nd(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)=>xd(e,t)),t)),Array.isArray(e.orders)&&(t=e.orders.reduce(((e,t)=>Nd(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 Xt(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))),ag(n).then((()=>{}))}(this.location)}}function Eg(){const e=cr();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 Sg=65535,_g=Boolean(globalThis.process?.env?.DUMP_SESSION_KEYS),Ig=e=>new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4));function Rg(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 Ag(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function Tg(e){if("string"==typeof e)e=Ag(e);else{if(!Rg(e))throw new Error("expected Uint8Array, got "+typeof e);e=e.slice()}return e}const Dg=e=>"[object Object]"===Object.prototype.toString.call(e)&&e.constructor===Object;function kg(e,t){if(!Rg(e))throw new Error("Uint8Array expected");if("number"==typeof t&&e.length!==t)throw new Error(`Uint8Array length ${t} expected`)}const Pg=(e,t)=>(Object.assign(t,e),t);function Cg(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 xg(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`wrong positive integer: ${e}`)}function Ng(e){if("boolean"!=typeof e)throw new Error(`boolean expected, not ${e}`)}function Mg(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 Og(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 Lg=(e,t)=>255&e[t++]|(255&e[t++])<<8;class Bg{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,kg(e=Tg(e),32);const t=Lg(e,0),n=Lg(e,2),r=Lg(e,4),s=Lg(e,6),i=Lg(e,8),o=Lg(e,10),a=Lg(e,12),c=Lg(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]=Lg(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=Lg(e,t+0),y=Lg(e,t+2),w=Lg(e,t+4),b=Lg(e,t+6),v=Lg(e,t+8),E=Lg(e,t+10),S=Lg(e,t+12),_=Lg(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){Og(this);const{buffer:t,blockLen:n}=this,r=(e=Tg(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){Og(this),function(e,t){Mg(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 Ug=function(e){const t=(t,n)=>e(n).update(Tg(t)).digest(),n=e(new Uint8Array(32));return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=t=>e(t),t}((e=>new Bg(e))),Fg=Ag("expand 16-byte k"),Vg=Ag("expand 32-byte k"),Kg=Ig(Fg),$g=Ig(Vg);function qg(e,t){return e<<t|e>>>32-t}function Hg(e){return e.byteOffset%4==0}const zg=64,Wg=16,jg=2**32-1,Gg=new Uint32Array;function Yg(e,t){const{allowShortKeys:n,extendNonceFn:r,counterLength:s,counterRight:i,rounds:o}=function(e,t){if(void 0!==t&&("object"!=typeof t||!Dg(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 xg(s),xg(o),Ng(i),Ng(n),(t,a,c,l,u=0)=>{Mg(t),Mg(a),Mg(c);const h=c.length;if(l||(l=new Uint8Array(h)),Mg(l),xg(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=$g;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=Kg,d.push(p)}Hg(a)||(a=a.slice(),d.push(a));const m=Ig(p);if(r){if(24!==a.length)throw new Error("arx: extended nonce must be 24 bytes");r(f,m,Ig(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=Ig(a);for(!function(e,t,n,r,s,i,o,a){const c=s.length,l=new Uint8Array(zg),u=Ig(l),h=Hg(s)&&Hg(i),d=h?Ig(s):Gg,p=h?Ig(i):Gg;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(zg,c-f);if(h&&g===zg){const e=f/4;if(f%4!=0)throw new Error("arx: invalid block position");for(let t,n=0;n<Wg;n++)t=e+n,p[t]=d[t]^u[n];f+=zg}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 Qg(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=qg(M^S,16),P=P+M|0,A=qg(A^P,12),S=S+A|0,M=qg(M^S,8),P=P+M|0,A=qg(A^P,7),_=_+T|0,O=qg(O^_,16),C=C+O|0,T=qg(T^C,12),_=_+T|0,O=qg(O^_,8),C=C+O|0,T=qg(T^C,7),I=I+D|0,L=qg(L^I,16),x=x+L|0,D=qg(D^x,12),I=I+D|0,L=qg(L^I,8),x=x+L|0,D=qg(D^x,7),R=R+k|0,B=qg(B^R,16),N=N+B|0,k=qg(k^N,12),R=R+k|0,B=qg(B^R,8),N=N+B|0,k=qg(k^N,7),S=S+T|0,B=qg(B^S,16),x=x+B|0,T=qg(T^x,12),S=S+T|0,B=qg(B^S,8),x=x+B|0,T=qg(T^x,7),_=_+D|0,M=qg(M^_,16),N=N+M|0,D=qg(D^N,12),_=_+D|0,M=qg(M^_,8),N=N+M|0,D=qg(D^N,7),I=I+k|0,O=qg(O^I,16),P=P+O|0,k=qg(k^P,12),I=I+k|0,O=qg(O^I,8),P=P+O|0,k=qg(k^P,7),R=R+A|0,L=qg(L^R,16),C=C+L|0,A=qg(A^C,12),R=R+A|0,L=qg(L^R,8),C=C+L|0,A=qg(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 Jg=Yg(Qg,{counterRight:!1,counterLength:4,allowShortKeys:!1}),Zg=new Uint8Array(16),Xg=(e,t)=>{e.update(t);const n=t.length%16;n&&e.update(Zg.subarray(n))},em=new Uint8Array(32);function tm(e,t,n,r,s){const i=e(t,n,em),o=Ug.create(i);s&&Xg(o,s),Xg(o,r);const a=new Uint8Array(16),c=(l=a,new DataView(l.buffer,l.byteOffset,l.byteLength));var l;Cg(c,0,BigInt(s?s.length:0),!0),Cg(c,8,BigInt(r.length),!0),o.update(a);const u=o.digest();return i.fill(0),u}const nm=Pg({blockSize:64,nonceLength:12,tagLength:16},(rm=Jg,(e,t,n)=>{const r=16;return kg(e,32),kg(t),{encrypt:(s,i)=>{const o=s.length,a=o+r;i?kg(i,a):i=new Uint8Array(a),rm(e,t,s,i,1);const c=tm(rm,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?kg(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),tm(rm,e,t,c,n)))throw new Error("invalid tag");return rm(e,t,c,i,1),i}}}));var rm;const sm=new Uint8Array([0]),im=new Uint8Array;const om={hashSHA256:e=>pl(e.subarray()),getHKDF(e,t){const n=function(e,t,n){return Ds(e),void 0===n&&(n=new Uint8Array(e.outputLen)),Mo(e,Ls(n),Ls(t))}(pl,t,e),r=function(e,t,n,r=32){if(Ds(e),As(r),r>255*e.outputLen)throw new Error("Length should be <= 255*HashLen");const s=Math.ceil(r/e.outputLen);void 0===n&&(n=im);const i=new Uint8Array(s*e.outputLen),o=Mo.create(e,t),a=o._cloneInto(),c=new Uint8Array(o.outputLen);for(let t=0;t<s;t++)sm[0]=t+1,a.update(0===t?im:c).update(n).update(sm).digestInto(c),i.set(c,e.outputLen*t),o._cloneInto(a);return o.destroy(),a.destroy(),c.fill(0),sm.fill(0),i.slice(0,r)}(pl,n,void 0,96),s=r;return[s.subarray(0,32),s.subarray(32,64),s.subarray(64,96)]},generateX25519KeyPair(){const e=mo.utils.randomPrivateKey();return{publicKey:mo.getPublicKey(e),privateKey:e}},generateX25519KeyPairFromSeed:e=>({publicKey:mo.getPublicKey(e),privateKey:e}),generateX25519SharedKey:(e,t)=>mo.getSharedSecret(e.subarray(),t.subarray()),chaCha20Poly1305Encrypt:(e,t,n,r)=>nm(r,t,n).encrypt(e.subarray()),chaCha20Poly1305Decrypt:(e,t,n,r,s)=>nm(r,t,n).decrypt(e.subarray(),s)},am=om;const cm=e=>{const t=y(2);return t[0]=e>>8,t[1]=e,t};cm.bytes=2;const lm=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 um(e,t){t.enabled&&_g&&(e?(t(`LOCAL_STATIC_PUBLIC_KEY ${Yt(e.publicKey,"hex")}`),t(`LOCAL_STATIC_PRIVATE_KEY ${Yt(e.privateKey,"hex")}`)):t("Missing local static keys."))}function hm(e,t){t.enabled&&_g&&(e?(t(`LOCAL_PUBLIC_EPHEMERAL_KEY ${Yt(e.publicKey,"hex")}`),t(`LOCAL_PRIVATE_EPHEMERAL_KEY ${Yt(e.privateKey,"hex")}`)):t("Missing local ephemeral keys."))}function dm(e,t){t.enabled&&_g&&t(e?`REMOTE_EPHEMERAL_PUBLIC_KEY ${Yt(e.subarray(),"hex")}`:"Missing remote ephemeral keys.")}function pm(e,t,n){n.enabled&&_g&&(n(`CIPHER_STATE_1 ${e.n.getUint64()} ${e.k&&Yt(e.k,"hex")}`),n(`CIPHER_STATE_2 ${t.n.getUint64()} ${t.k&&Yt(t.k,"hex")}`))}function fm(e,t){if(e.length!==t.length)throw new Error("Inputs should have the same length");const n=y(e.length);for(let r=0;r<e.length;r++)n[r]=e[r]^t[r];return n}lm.bytes=2;class gm extends Error{code;constructor(e="Unexpected Peer"){super(e),this.code=gm.code}static code="ERR_UNEXPECTED_PEER"}class mm extends Error{code;constructor(e="Invalid crypto exchange"){super(e),this.code=mm.code}static code="ERR_INVALID_CRYPTO_EXCHANGE"}class ym{n;bytes;view;constructor(e=0){this.n=e,this.bytes=m(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 wm=m(0);class bm{k;n;crypto;constructor(e,t=void 0,n=0){this.crypto=e,this.k=t,this.n=new ym(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 vm{cs;ck;h;crypto;constructor(e,t){this.crypto=e;const n=Dt(t,"utf-8");this.h=function(e,t){if(t.length<=32){const e=m(32);return e.set(t),e}return e.hash(t)}(e,n),this.ck=this.h,this.cs=new bm(e)}mixKey(e){const[t,n]=this.crypto.hkdf(this.ck,e);this.ck=t,this.cs=new bm(this.crypto,n)}mixHash(e){this.h=this.crypto.hash(new _r(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,wm);return[new bm(this.crypto,e),new bm(this.crypto,t)]}}class Em{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 vm(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 Sm extends Em{writeMessageA(e){return new _r(this.writeE(),this.ss.encryptAndHash(e))}writeMessageB(e){const t=this.writeE();this.writeEE();const n=this.writeS();return this.writeES(),new _r(t,n,this.ss.encryptAndHash(e))}writeMessageC(e){const t=this.writeS();return this.writeSE(),new _r(t,this.ss.encryptAndHash(e))}readMessageA(e){try{return this.readE(e),this.ss.decryptAndHash(e.sublist(32))}catch(e){throw new mm(`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 mm(`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 mm(`handshake stage 2 validation fail: ${e.message}`)}}}var _m,Im;async function Rm(e,t,n){const r=await e.sign(Tm(t));return Im.encode({identityKey:e.public.bytes,identitySig:r,extensions:n})}async function Am(e,t,n){try{const r=Im.decode(e);if(n){const e=n.subarray();if(!_n(e,r.identityKey))throw new Error(`Payload identity key ${Yt(r.identityKey,"hex")} does not match expected remote identity key ${Yt(e,"hex")}`)}if(!t)throw new Error("Remote static does not exist");const s=Tm(t),i=Bl(r.identityKey);if(!await i.verify(s,r.identitySig))throw new Error("Invalid payload signature");return r}catch(e){throw new gm(e.message)}}function Tm(e){const t=Dt("noise-libp2p-static-key:");return e instanceof Uint8Array?In([t,e],t.length+e.length):(e.prepend(t),e)}async function Dm(e){const{log:t,connection:n,crypto:r,privateKey:s,prologue:i,s:o,remoteIdentityKey:a,extensions:c}=e,l=await Rm(s,o.publicKey,c),u=new Sm({crypto:r,protocolName:"Noise_XX_25519_ChaChaPoly_SHA256",initiator:!0,prologue:i,s:o});um(u.s,t),t.trace("Stage 0 - Initiator starting to send first message."),await n.write(u.writeMessageA(wm)),t.trace("Stage 0 - Initiator finished sending first message."),hm(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."),dm(u.re,t),d=u.rs,(p=t).enabled&&_g&&p(d?`REMOTE_STATIC_PUBLIC_KEY ${Yt(d.subarray(),"hex")}`:"Missing remote static public key."),t.trace("Initiator going to check remote's signature...");const f=await Am(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 pm(g,m,t),{payload:f,encrypt:e=>g.encryptWithAd(wm,e),decrypt:(e,t)=>m.decryptWithAd(wm,e,t)}}!function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(_m||(_m={})),function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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),_m.codec().encode(e.extensions,t)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={identityKey:m(0),identitySig:m(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=_m.codec().decode(e,e.uint32());break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(Im||(Im={}));class km{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??am;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??m(0)}async secureOutbound(e,t,n){const r=Cr(t,{lengthEncoder:cm,lengthDecoder:lm,maxDataLength:Sg});if(!e.privateKey)throw new pn("local peerId does not contain private key","ERR_NO_PRIVATE_KEY");const s=await Fl(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 Ss(o.payload.identityKey)}}async secureInbound(e,t,n){const r=Cr(t,{lengthEncoder:cm,lengthDecoder:lm,maxDataLength:Sg});if(!e.privateKey)throw new pn("local peerId does not contain private key","ERR_NO_PRIVATE_KEY");const s=await Fl(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 Ss(o.payload.identityKey)}}async performHandshakeInitiator(e,t,n){let r;try{r=await Dm({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 Rm(s,o.publicKey,c),u=new Sm({crypto:r,protocolName:"Noise_XX_25519_ChaChaPoly_SHA256",initiator:!1,prologue:i,s:o});um(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."),dm(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."),hm(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 Am(h,u.rs,a),[p,f]=u.ss.split();return pm(p,f,t),{payload:d,encrypt:e=>f.encryptWithAd(wm,e),decrypt:(e,t)=>p.decryptWithAd(wm,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=Eg(),t=Eg();return[{source:e.source,sink:t.sink},{source:t.source,sink:e.sink}]}(),s=e.unwrap();return await fr(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 _r(cm(s.byteLength),s)}}}(t,this.metrics),s,(e=>$r(e,{lengthDecoder:lm})),function(e,t){return async function*(n){for await(const r of n)for(let n=0;n<r.length;n+=Sg){let s=n+Sg;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 Pm(e={}){return t=>new km(t,e)}function Cm(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 xm(e){return null!=e&&("function"==typeof e.then&&"function"==typeof e.catch&&"function"==typeof e.finally)}class Nm{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=cr(),this.closed=cr(),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=dr({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 pn(`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);xm(e)&&await e}const n=()=>{!function(e,t){const n=Cm(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 _r(n):n;const e=this.sendData(n,t);xm(e)&&(this.sendingData=cr(),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 Rr(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 Rr(this.sink([]),e.signal)),"writing"===this.writeStatus&&(null!=this.sendingData&&await Rr(this.sendingData.promise,e.signal),this.log.trace("aborting source passed to .sink"),this.sinkController.abort(),await Rr(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();xm(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 pn("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 Mm extends Nm{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 _r(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 Rr(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 Rr(this.writer.abort(),e?.signal),this.log("sendReset aborted writer")}async sendCloseWrite(e){this.log("sendCloseWrite closing writer"),await Rr(this.writer.close(),e?.signal),this.log("sendCloseWrite closed writer")}async sendCloseRead(e){this.log("sendCloseRead cancelling reader"),await Rr(this.reader.cancel(),e?.signal),this.log("sendCloseRead cancelled reader")}}async function Om(e,t,n,r,s,i){const o=i.forComponent(`libp2p:webtransport:stream:${n}:${t}`),a=new Mm({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 Lm(){return{source:{[Symbol.asyncIterator]:()=>({next:async()=>new Promise((()=>{}))})},sink:async e=>new Promise((()=>{}))}}function Bm(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 Il=BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),Rl=BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),Al=BigInt(1),Tl=BigInt(2),Dl=(e,t)=>(e+t/Tl)/t;const kl=Vi(Il,void 0,void 0,{sqrt:function(e){const t=Il,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=Oi(u,n,t)*u%t,d=Oi(h,n,t)*u%t,p=Oi(d,Tl,t)*l%t,f=Oi(p,s,t)*p%t,g=Oi(f,i,t)*f%t,m=Oi(g,a,t)*g%t,y=Oi(m,c,t)*m%t,w=Oi(y,a,t)*g%t,b=Oi(w,n,t)*u%t,v=Oi(b,o,t)*f%t,E=Oi(v,r,t)*l%t,S=Oi(E,Tl,t);if(!kl.eql(kl.sqr(S),e))throw new Error("Cannot find square root");return S}}),Pl=function(e,t){const n=t=>Sl({...e,..._l(t)});return Object.freeze({...n(t),create:n})}({a:BigInt(0),b:BigInt(7),Fp:kl,n:Rl,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),h:BigInt(1),lowS:!0,endo:{beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar:e=>{const t=Rl,n=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),r=-Al*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),s=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),i=n,o=BigInt("0x100000000000000000000000000000000"),a=Dl(i*e,t),c=Dl(-r*e,t);let l=Ni(e-a*n-c*s,t),u=Ni(-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}}}},fl);function Cl(e){try{Pl.ProjectivePoint.fromHex(e)}catch(e){throw new fn(String(e),"ERR_INVALID_PUBLIC_KEY")}}BigInt(0),Pl.ProjectivePoint;class xl{_key;constructor(e){Cl(e),this._key=e}verify(e,t){return function(e,t,n){const r=gt.digest(n instanceof Uint8Array?n:n.subarray());if(As(r))return r.then((({digest:n})=>Pl.verify(t,n,e))).catch((e=>{throw new fn(String(e),"ERR_INVALID_INPUT")}));try{return Pl.verify(t,r.digest,e)}catch(e){throw new fn(String(e),"ERR_INVALID_INPUT")}}(this._key,t,e)}marshal(){return e=this._key,Pl.ProjectivePoint.fromHex(e).toRawBytes(!0);var e}get bytes(){return To.encode({Type:Ro.Secp256k1,Data:this.marshal()}).subarray()}equals(e){return In(this.bytes,e.bytes)}async hash(){const e=gt.digest(this.bytes);let t;return As(e)?({bytes:t}=await e):t=e.bytes,t}}class Nl{_key;_publicKey;constructor(e,t){this._key=e,this._publicKey=t??function(e){try{return Pl.getPublicKey(e,!0)}catch(e){throw new fn(String(e),"ERR_INVALID_PRIVATE_KEY")}}(e),function(e){try{Pl.getPublicKey(e,!0)}catch(e){throw new fn(String(e),"ERR_INVALID_PRIVATE_KEY")}}(this._key),Cl(this._publicKey)}sign(e){return function(e,t){const n=gt.digest(t instanceof Uint8Array?t:t.subarray());if(As(n))return n.then((({digest:t})=>Pl.sign(t,e).toDERRawBytes())).catch((e=>{throw new fn(String(e),"ERR_INVALID_INPUT")}));try{return Pl.sign(n.digest,e).toDERRawBytes()}catch(e){throw new fn(String(e),"ERR_INVALID_INPUT")}}(this._key,e)}get public(){return new xl(this._publicKey)}marshal(){return this._key}get bytes(){return Do.encode({Type:Ro.Secp256k1,Data:this.marshal()}).subarray()}equals(e){return In(this.bytes,e.bytes)}hash(){const e=gt.digest(this.bytes);return As(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 Io(this.bytes,e);throw new fn(`export format '${t}' is not supported`,"ERR_INVALID_EXPORT_FORMAT")}}var Ml=Object.freeze({__proto__:null,Secp256k1PrivateKey:Nl,Secp256k1PublicKey:xl,generateKeyPair:async function(){const e=Pl.utils.randomPrivateKey();return new Nl(e)},unmarshalSecp256k1PrivateKey:function(e){return new Nl(e)},unmarshalSecp256k1PublicKey:function(e){return new xl(e)}});const Ol={rsa:ll,ed25519:xo,secp256k1:Ml};function Ll(e){const t=Object.keys(Ol).join(" / ");return new fn(`invalid or unsupported key type ${e}. Must be ${t}`,"ERR_UNSUPPORTED_KEY_TYPE")}function Bl(e){if("rsa"===(e=e.toLowerCase())||"ed25519"===e||"secp256k1"===e)return Ol[e];throw Ll(e)}function Ul(e){const t=To.decode(e),n=t.Data??new Uint8Array;switch(t.Type){case Ro.RSA:return Ol.rsa.unmarshalRsaPublicKey(n);case Ro.Ed25519:return Ol.ed25519.unmarshalEd25519PublicKey(n);case Ro.Secp256k1:return Ol.secp256k1.unmarshalSecp256k1PublicKey(n);default:throw Ll(t.Type??"unknown")}}function Fl(e,t){return Bl(t=(t??"rsa").toLowerCase()),e.bytes}async function Vl(e){const t=Do.decode(e),n=t.Data??new Uint8Array;switch(t.Type){case Ro.RSA:return Ol.rsa.unmarshalRsaPrivateKey(n);case Ro.Ed25519:return Ol.ed25519.unmarshalEd25519PrivateKey(n);case Ro.Secp256k1:return Ol.secp256k1.unmarshalSecp256k1PrivateKey(n);default:throw Ll(t.Type??"RSA")}}var Kl,$l={exports:{}};Kl=$l,function(){Kl.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 ql=Br($l.exports);const Hl="ERR_UNRECOGNIZED_VALIDITY",zl="ERR_SIGNATURE_VERIFICATION",Wl="ERR_UNDEFINED_PARAMETER";var jl;!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())}(jl||(jl={}));const Gl=["string","number","bigint","symbol"],Yl=["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 Ql(e){if(null===e)return"null";if(void 0===e)return"undefined";if(!0===e||!1===e)return"boolean";const t=typeof e;if(Gl.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(Yl.includes(t))return t;return}(e);return n||"Object"}class Zl{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}}Zl.uint=new Zl(0,"uint",!0),Zl.negint=new Zl(1,"negint",!0),Zl.bytes=new Zl(2,"bytes",!0),Zl.string=new Zl(3,"string",!0),Zl.array=new Zl(4,"array",!1),Zl.map=new Zl(5,"map",!1),Zl.tag=new Zl(6,"tag",!1),Zl.float=new Zl(7,"float",!0),Zl.false=new Zl(7,"false",!0),Zl.true=new Zl(7,"true",!0),Zl.null=new Zl(7,"null",!0),Zl.undefined=new Zl(7,"undefined",!0),Zl.break=new Zl(7,"break",!0);class Jl{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 Xl=globalThis.process&&!globalThis.process.browser&&globalThis.Buffer&&"function"==typeof globalThis.Buffer.isBuffer,eu=new TextDecoder,tu=new TextEncoder;function nu(e){return Xl&&globalThis.Buffer.isBuffer(e)}const ru=Xl?(e,t,n)=>n-t>64?globalThis.Buffer.from(e.subarray(t,n)).toString("utf8"):au(e,t,n):(e,t,n)=>n-t>64?eu.decode(e.subarray(t,n)):au(e,t,n),su=Xl?e=>e.length>64?globalThis.Buffer.from(e):ou(e):e=>e.length>64?tu.encode(e):ou(e),iu=Xl?(e,t,n)=>nu(e)?new Uint8Array(e.subarray(t,n)):e.slice(t,n):(e,t,n)=>e.slice(t,n);function ou(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 au(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<=cu)return String.fromCharCode.apply(String,e);let n="",r=0;for(;r<t;)n+=String.fromCharCode.apply(String,e.slice(r,r+=cu));return n}(r)}const cu=4096;const lu="CBOR decode error:",uu="CBOR encode error:";function hu(e,t,n){if(e.length-t<n)throw new Error(`${lu} not enough data for type`)}const du=[24,256,65536,4294967296,BigInt("18446744073709551616")];function pu(e,t,n){hu(e,t,1);const r=e[t];if(!0===n.strict&&r<du[0])throw new Error(`${lu} integer encoded in more bytes than necessary (strict decode)`);return r}function fu(e,t,n){hu(e,t,2);const r=e[t]<<8|e[t+1];if(!0===n.strict&&r<du[1])throw new Error(`${lu} integer encoded in more bytes than necessary (strict decode)`);return r}function gu(e,t,n){hu(e,t,4);const r=16777216*e[t]+(e[t+1]<<16)+(e[t+2]<<8)+e[t+3];if(!0===n.strict&&r<du[2])throw new Error(`${lu} integer encoded in more bytes than necessary (strict decode)`);return r}function mu(e,t,n){hu(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<du[3])throw new Error(`${lu} 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(`${lu} integers outside of the safe integer range are not supported`)}function yu(e,t){return wu(e,0,t.value)}function wu(e,t,n){if(n<du[0]){const r=Number(n);e.push([t|r])}else if(n<du[1]){const r=Number(n);e.push([24|t,r])}else if(n<du[2]){const r=Number(n);e.push([25|t,r>>>8,255&r])}else if(n<du[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<du[4]))throw new Error(`${lu} 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)}}}yu.encodedSize=function(e){return wu.encodedSize(e.value)},wu.encodedSize=function(e){return e<du[0]?1:e<du[1]?2:e<du[2]?3:e<du[3]?5:9},yu.compareTokens=function(e,t){return e.value<t.value?-1:e.value>t.value?1:0};const bu=BigInt(-1),vu=BigInt(1);function Eu(e,t){const n=t.value,r="bigint"==typeof n?n*bu-vu:-1*n-1;wu(e,t.type.majorEncoded,r)}function Su(e,t,n,r){hu(e,t,n+r);const s=iu(e,t+n,t+n+r);return new Jl(Zl.bytes,s,n+r)}function _u(e,t,n,r){return Su(e,t,1,n)}function Iu(e){return void 0===e.encodedBytes&&(e.encodedBytes=e.type===Zl.string?su(e.value):e.value),e.encodedBytes}function Ru(e,t){const n=Iu(t);wu(e,t.type.majorEncoded,n.length),e.push(n)}function Au(e,t,n,r,s){const i=n+r;hu(e,t,i);const o=new Jl(Zl.string,ru(e,t+n,t+i),i);return!0===s.retainStringBytes&&(o.byteValue=iu(e,t+n,t+i)),o}function Tu(e,t,n,r){return Au(e,t,1,n,r)}Eu.encodedSize=function(e){const t=e.value,n="bigint"==typeof t?t*bu-vu:-1*t-1;return n<du[0]?1:n<du[1]?2:n<du[2]?3:n<du[3]?5:9},Eu.compareTokens=function(e,t){return e.value<t.value?1:e.value>t.value?-1:0},Ru.encodedSize=function(e){const t=Iu(e);return wu.encodedSize(t.length)+t.length},Ru.compareTokens=function(e,t){return n=Iu(e),r=Iu(t),n.length<r.length?-1:n.length>r.length?1:function(e,t){if(nu(e)&&nu(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 Du=Ru;function ku(e,t,n,r){return new Jl(Zl.array,r,n)}function Pu(e,t,n,r){return ku(0,0,1,n)}function Cu(e,t){wu(e,Zl.array.majorEncoded,t.value)}function xu(e,t,n,r){return new Jl(Zl.map,r,n)}function Nu(e,t,n,r){return xu(0,0,1,n)}function Mu(e,t){wu(e,Zl.map.majorEncoded,t.value)}function Ou(e,t,n,r){return new Jl(Zl.tag,n,1)}function Lu(e,t){wu(e,Zl.tag.majorEncoded,t.value)}Cu.compareTokens=yu.compareTokens,Cu.encodedSize=function(e){return wu.encodedSize(e.value)},Mu.compareTokens=yu.compareTokens,Mu.encodedSize=function(e){return wu.encodedSize(e.value)},Lu.compareTokens=yu.compareTokens,Lu.encodedSize=function(e){return wu.encodedSize(e.value)};const Bu=20,Uu=21,Fu=22,Vu=23;function Ku(e,t,n){if(n){if(!1===n.allowNaN&&Number.isNaN(e))throw new Error(`${lu} NaN values are not supported`);if(!1===n.allowInfinity&&(e===1/0||e===-1/0))throw new Error(`${lu} Infinity values are not supported`)}return new Jl(Zl.float,e,t)}function $u(e,t,n){const r=t.value;if(!1===r)e.push([Zl.float.majorEncoded|Bu]);else if(!0===r)e.push([Zl.float.majorEncoded|Uu]);else if(null===r)e.push([Zl.float.majorEncoded|Fu]);else if(void 0===r)e.push([Zl.float.majorEncoded|Vu]);else{let t,i=!1;n&&!0===n.float64||(Wu(r),t=ju(zu,1),r===t||Number.isNaN(r)?(zu[0]=249,e.push(zu.slice(0,3)),i=!0):(Gu(r),t=Yu(zu,1),r===t&&(zu[0]=250,e.push(zu.slice(0,5)),i=!0))),i||(s=r,Hu.setFloat64(0,s,!1),t=Qu(zu,1),zu[0]=251,e.push(zu.slice(0,9)))}var s}$u.encodedSize=function(e,t){const n=e.value;if(!1===n||!0===n||null==n)return 1;if(!t||!0!==t.float64){Wu(n);let e=ju(zu,1);if(n===e||Number.isNaN(n))return 3;if(Gu(n),e=Yu(zu,1),n===e)return 5}return 9};const qu=new ArrayBuffer(9),Hu=new DataView(qu,1),zu=new Uint8Array(qu,0);function Wu(e){if(e===1/0)Hu.setUint16(0,31744,!1);else if(e===-1/0)Hu.setUint16(0,64512,!1);else if(Number.isNaN(e))Hu.setUint16(0,32256,!1);else{Hu.setFloat32(0,e);const t=Hu.getUint32(0),n=(2139095040&t)>>23,r=8388607&t;if(255===n)Hu.setUint16(0,31744,!1);else if(0===n)Hu.setUint16(0,(2147483648&e)>>16|r>>13,!1);else{const e=n-127;e<-24?Hu.setUint16(0,0):e<-14?Hu.setUint16(0,(2147483648&t)>>16|1<<24+e,!1):Hu.setUint16(0,(2147483648&t)>>16|e+15<<10|r>>13,!1)}}}function ju(e,t){if(e.length-t<2)throw new Error(`${lu} 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 Gu(e){Hu.setFloat32(0,e,!1)}function Yu(e,t){if(e.length-t<4)throw new Error(`${lu} not enough data for float32`);const n=(e.byteOffset||0)+t;return new DataView(e.buffer,n,4).getFloat32(0,!1)}function Qu(e,t){if(e.length-t<8)throw new Error(`${lu} not enough data for float64`);const n=(e.byteOffset||0)+t;return new DataView(e.buffer,n,8).getFloat64(0,!1)}function Zu(e,t,n){throw new Error(`${lu} encountered invalid minor (${n}) for major ${e[t]>>>5}`)}function Ju(e){return()=>{throw new Error(`${lu} ${e}`)}}$u.compareTokens=yu.compareTokens;const Xu=[];for(let e=0;e<=23;e++)Xu[e]=Zu;Xu[24]=function(e,t,n,r){return new Jl(Zl.uint,pu(e,t+1,r),2)},Xu[25]=function(e,t,n,r){return new Jl(Zl.uint,fu(e,t+1,r),3)},Xu[26]=function(e,t,n,r){return new Jl(Zl.uint,gu(e,t+1,r),5)},Xu[27]=function(e,t,n,r){return new Jl(Zl.uint,mu(e,t+1,r),9)},Xu[28]=Zu,Xu[29]=Zu,Xu[30]=Zu,Xu[31]=Zu;for(let e=32;e<=55;e++)Xu[e]=Zu;Xu[56]=function(e,t,n,r){return new Jl(Zl.negint,-1-pu(e,t+1,r),2)},Xu[57]=function(e,t,n,r){return new Jl(Zl.negint,-1-fu(e,t+1,r),3)},Xu[58]=function(e,t,n,r){return new Jl(Zl.negint,-1-gu(e,t+1,r),5)},Xu[59]=function(e,t,n,r){const s=mu(e,t+1,r);if("bigint"!=typeof s){const e=-1-s;if(e>=Number.MIN_SAFE_INTEGER)return new Jl(Zl.negint,e,9)}if(!0!==r.allowBigInt)throw new Error(`${lu} integers outside of the safe integer range are not supported`);return new Jl(Zl.negint,bu-BigInt(s),9)},Xu[60]=Zu,Xu[61]=Zu,Xu[62]=Zu,Xu[63]=Zu;for(let e=64;e<=87;e++)Xu[e]=_u;Xu[88]=function(e,t,n,r){return Su(e,t,2,pu(e,t+1,r))},Xu[89]=function(e,t,n,r){return Su(e,t,3,fu(e,t+1,r))},Xu[90]=function(e,t,n,r){return Su(e,t,5,gu(e,t+1,r))},Xu[91]=function(e,t,n,r){const s=mu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${lu} 64-bit integer bytes lengths not supported`);return Su(e,t,9,s)},Xu[92]=Zu,Xu[93]=Zu,Xu[94]=Zu,Xu[95]=Ju("indefinite length bytes/strings are not supported");for(let e=96;e<=119;e++)Xu[e]=Tu;Xu[120]=function(e,t,n,r){return Au(e,t,2,pu(e,t+1,r),r)},Xu[121]=function(e,t,n,r){return Au(e,t,3,fu(e,t+1,r),r)},Xu[122]=function(e,t,n,r){return Au(e,t,5,gu(e,t+1,r),r)},Xu[123]=function(e,t,n,r){const s=mu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${lu} 64-bit integer string lengths not supported`);return Au(e,t,9,s,r)},Xu[124]=Zu,Xu[125]=Zu,Xu[126]=Zu,Xu[127]=Ju("indefinite length bytes/strings are not supported");for(let e=128;e<=151;e++)Xu[e]=Pu;Xu[152]=function(e,t,n,r){return ku(0,0,2,pu(e,t+1,r))},Xu[153]=function(e,t,n,r){return ku(0,0,3,fu(e,t+1,r))},Xu[154]=function(e,t,n,r){return ku(0,0,5,gu(e,t+1,r))},Xu[155]=function(e,t,n,r){const s=mu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${lu} 64-bit integer array lengths not supported`);return ku(0,0,9,s)},Xu[156]=Zu,Xu[157]=Zu,Xu[158]=Zu,Xu[159]=function(e,t,n,r){if(!1===r.allowIndefinite)throw new Error(`${lu} indefinite length items not allowed`);return ku(0,0,1,1/0)};for(let e=160;e<=183;e++)Xu[e]=Nu;Xu[184]=function(e,t,n,r){return xu(0,0,2,pu(e,t+1,r))},Xu[185]=function(e,t,n,r){return xu(0,0,3,fu(e,t+1,r))},Xu[186]=function(e,t,n,r){return xu(0,0,5,gu(e,t+1,r))},Xu[187]=function(e,t,n,r){const s=mu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${lu} 64-bit integer map lengths not supported`);return xu(0,0,9,s)},Xu[188]=Zu,Xu[189]=Zu,Xu[190]=Zu,Xu[191]=function(e,t,n,r){if(!1===r.allowIndefinite)throw new Error(`${lu} indefinite length items not allowed`);return xu(0,0,1,1/0)};for(let e=192;e<=215;e++)Xu[e]=Ou;Xu[216]=function(e,t,n,r){return new Jl(Zl.tag,pu(e,t+1,r),2)},Xu[217]=function(e,t,n,r){return new Jl(Zl.tag,fu(e,t+1,r),3)},Xu[218]=function(e,t,n,r){return new Jl(Zl.tag,gu(e,t+1,r),5)},Xu[219]=function(e,t,n,r){return new Jl(Zl.tag,mu(e,t+1,r),9)},Xu[220]=Zu,Xu[221]=Zu,Xu[222]=Zu,Xu[223]=Zu;for(let e=224;e<=243;e++)Xu[e]=Ju("simple values are not supported");Xu[244]=Zu,Xu[245]=Zu,Xu[246]=Zu,Xu[247]=function(e,t,n,r){if(!1===r.allowUndefined)throw new Error(`${lu} undefined values are not supported`);return!0===r.coerceUndefinedToNull?new Jl(Zl.null,null,1):new Jl(Zl.undefined,void 0,1)},Xu[248]=Ju("simple values are not supported"),Xu[249]=function(e,t,n,r){return Ku(ju(e,t+1),3,r)},Xu[250]=function(e,t,n,r){return Ku(Yu(e,t+1),5,r)},Xu[251]=function(e,t,n,r){return Ku(Qu(e,t+1),9,r)},Xu[252]=Zu,Xu[253]=Zu,Xu[254]=Zu,Xu[255]=function(e,t,n,r){if(!1===r.allowIndefinite)throw new Error(`${lu} indefinite length items not allowed`);return new Jl(Zl.break,void 0,1)};const eh=[];for(let e=0;e<24;e++)eh[e]=new Jl(Zl.uint,e,1);for(let e=-1;e>=-24;e--)eh[31-e]=new Jl(Zl.negint,e,1);eh[64]=new Jl(Zl.bytes,new Uint8Array(0),1),eh[96]=new Jl(Zl.string,"",1),eh[128]=new Jl(Zl.array,0,1),eh[160]=new Jl(Zl.map,0,1),eh[244]=new Jl(Zl.false,!1,1),eh[245]=new Jl(Zl.true,!0,1),eh[246]=new Jl(Zl.null,null,1),function(){const e=[];e[Zl.uint.major]=yu,e[Zl.negint.major]=Eu,e[Zl.bytes.major]=Ru,e[Zl.string.major]=Du,e[Zl.array.major]=Cu,e[Zl.map.major]=Mu,e[Zl.tag.major]=Lu,e[Zl.float.major]=$u}();class th{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(`${uu} object contains circular references`);return new th(t,e)}}const nh={null:new Jl(Zl.null,null),undefined:new Jl(Zl.undefined,void 0),true:new Jl(Zl.true,!0),false:new Jl(Zl.false,!1),emptyArray:new Jl(Zl.array,0),emptyMap:new Jl(Zl.map,0)},rh={number:(e,t,n,r)=>Number.isInteger(e)&&Number.isSafeInteger(e)?new Jl(e>=0?Zl.uint:Zl.negint,e):new Jl(Zl.float,e),bigint:(e,t,n,r)=>e>=BigInt(0)?new Jl(Zl.uint,e):new Jl(Zl.negint,e),Uint8Array:(e,t,n,r)=>new Jl(Zl.bytes,e),string:(e,t,n,r)=>new Jl(Zl.string,e),boolean:(e,t,n,r)=>e?nh.true:nh.false,null:(e,t,n,r)=>nh.null,undefined:(e,t,n,r)=>nh.undefined,ArrayBuffer:(e,t,n,r)=>new Jl(Zl.bytes,new Uint8Array(e)),DataView:(e,t,n,r)=>new Jl(Zl.bytes,new Uint8Array(e.buffer,e.byteOffset,e.byteLength)),Array(e,t,n,r){if(!e.length)return!0===n.addBreakTokens?[nh.emptyArray,new Jl(Zl.break)]:nh.emptyArray;r=th.createCheck(r,e);const s=[];let i=0;for(const t of e)s[i++]=sh(t,n,r);return n.addBreakTokens?[new Jl(Zl.array,e.length),s,new Jl(Zl.break)]:[new Jl(Zl.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?[nh.emptyMap,new Jl(Zl.break)]:nh.emptyMap;r=th.createCheck(r,e);const a=[];let c=0;for(const t of i)a[c++]=[sh(t,n,r),sh(s?e.get(t):e[t],n,r)];return function(e,t){t.mapSorter&&e.sort(t.mapSorter)}(a,n),n.addBreakTokens?[new Jl(Zl.map,o),a,new Jl(Zl.break)]:[new Jl(Zl.map,o),a]}};rh.Map=rh.Object,rh.Buffer=rh.Uint8Array;for(const e of"Uint8Clamped Uint16 Uint32 Int8 Int16 Int32 BigUint64 BigInt64 Float32 Float64".split(" "))rh[`${e}Array`]=rh.DataView;function sh(e,t={},n){const r=Ql(e),s=t&&t.typeEncoders&&t.typeEncoders[r]||rh[r];if("function"==typeof s){const i=s(e,r,t,n);if(null!=i)return i}const i=rh[r];if(!i)throw new Error(`${uu} unsupported type: ${r}`);return i(e,r,t,n)}const ih={strict:!1,allowIndefinite:!0,allowUndefined:!0,allowBigInt:!0};class oh{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=eh[e];if(void 0===t){const n=Xu[e];if(!n)throw new Error(`${lu} 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 ah=Symbol.for("DONE"),ch=Symbol.for("BREAK");function lh(e,t){if(e.done())return ah;const n=e.next();if(n.type===Zl.break)return ch;if(n.type.terminal)return n.value;if(n.type===Zl.array)return function(e,t,n){const r=[];for(let s=0;s<e.value;s++){const i=lh(t,n);if(i===ch){if(e.value===1/0)break;throw new Error(`${lu} got unexpected break to lengthed array`)}if(i===ah)throw new Error(`${lu} found array but not enough entries (got ${s}, expected ${e.value})`);r[s]=i}return r}(n,e,t);if(n.type===Zl.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=lh(t,n);if(a===ch){if(e.value===1/0)break;throw new Error(`${lu} got unexpected break to lengthed map`)}if(a===ah)throw new Error(`${lu} found map but not enough entries (got ${o} [no key], expected ${e.value})`);if(!0!==r&&"string"!=typeof a)throw new Error(`${lu} non-string keys not supported (got ${typeof a})`);if(!0===n.rejectDuplicateMapKeys&&(r&&i.has(a)||!r&&a in s))throw new Error(`${lu} found repeat map key "${a}"`);const c=lh(t,n);if(c===ah)throw new Error(`${lu} 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===Zl.tag){if(t.tags&&"function"==typeof t.tags[n.value]){const r=lh(e,t);return t.tags[n.value](r)}throw new Error(`${lu} tag not supported (${n.value})`)}throw new Error("unsupported")}function uh(e,t){const[n,r]=function(e,t){if(!(e instanceof Uint8Array))throw new Error(`${lu} data to decode must be a Uint8Array`);const n=(t=Object.assign({},ih,t)).tokenizer||new oh(e,t),r=lh(n,t);if(r===ah)throw new Error(`${lu} did not find any content to decode`);if(r===ch)throw new Error(`${lu} got unexpected break`);return[r,e.subarray(n.pos())]}(e,t);if(r.length>0)throw new Error(`${lu} too many terminals, data makes no sense`);return n}const hh=hs("ipns:utils"),dh=kt("/ipns/"),ph=e=>"signatureV1"in e?jl.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}):jl.encode({pubKey:e.pubKey,signatureV2:e.signatureV2,data:e.data});function fh(e){const t=jl.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"),zl);const n=gh(t.data),r=mh(n.Value),s=Qt(n.Validity);if(null!=t.value&&null!=t.signatureV1)return yh(t),{value:r,validityType:jl.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:jl.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 gh=e=>{const t=uh(e);if(0!==t.ValidityType)throw Vr(new Error("Unknown validity type"),Hl);return t.ValidityType=jl.ValidityType.EOL,Number.isInteger(t.Sequence)&&(t.Sequence=BigInt(t.Sequence)),Number.isInteger(t.TTL)&&(t.TTL=BigInt(t.TTL)),t},mh=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")},yh=e=>{if(null==e.data)throw Vr(new Error("Record data is missing"),"ERR_INVALID_RECORD_DATA");const t=gh(e.data);if(!In(t.Value,e.value??new Uint8Array(0)))throw Vr(new Error('Field "value" did not match between protobuf and CBOR'),zl);if(!In(t.Validity,e.validity??new Uint8Array(0)))throw Vr(new Error('Field "validity" did not match between protobuf and CBOR'),zl);if(t.ValidityType!==e.validityType)throw Vr(new Error('Field "validityType" did not match between protobuf and CBOR'),zl);if(t.Sequence!==e.sequence)throw Vr(new Error('Field "sequence" did not match between protobuf and CBOR'),zl);if(t.TTL!==e.ttl)throw Vr(new Error('Field "ttl" did not match between protobuf and CBOR'),zl)},wh=hs("ipns:validator"),bh=async(e,t)=>{const n=fh(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 wh.error("record signature verification failed"),Vr(new Error("record signature verification failed"),zl);if(n.validityType===jl.ValidityType.EOL){if(ql.fromString(n.validity).toDate().getTime()<Date.now())throw wh.error("record has expired"),Vr(new Error("record has expired"),"ERR_IPNS_EXPIRED_RECORD")}else if(null!=n.validityType)throw wh.error("unrecognized validity type"),Vr(new Error("unrecognized validity type"),Hl);wh("ipns record for %s is valid",n.value)};async function vh(e,t){if(t.byteLength>10240)throw Vr(new Error("record too large"),"ERR_RECORD_TOO_LARGE");const n=(e=>Ss(e.slice(dh.length)))(e),r=fh(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 hh.error(e),Vr(e,Wl)}let n;if(null!=t.pubKey){try{n=Ul(t.pubKey)}catch(e){throw hh.error(e),e}if(!(await _s(t.pubKey)).equals(e))throw Vr(new Error("Embedded public key did not match PeerID"),"ERR_INVALID_EMBEDDED_KEY")}else null!=e.publicKey&&(n=Ul(e.publicKey));if(null!=n)return n;throw Vr(new Error("no public key is available"),Wl)})(n,r);await bh(s,t)}async function*Eh(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 Sh={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}(Sh);var _h=Br(Sh.exports);class Ih extends Error{constructor(e){super(e),this.name="TimeoutError"}}let Rh=class extends Error{constructor(e){super(),this.name="AbortError",this.message=e}};const Ah=e=>void 0===globalThis.DOMException?new Rh(e):new DOMException(e),Th=e=>{const t=void 0===e.reason?Ah("This operation was aborted."):e.reason;return t instanceof Error?t:Ah(t)};function Dh(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(Th(e)),e.addEventListener("abort",(()=>{c(Th(e))}))}if(n===Number.POSITIVE_INFINITY)return void e.then(a,c);const l=new Ih;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 kh=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 Ph extends _h{#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:kh,...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=Dh(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 Ih&&!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 Ch(e){if(null!=e[Symbol.asyncIterator])return(async()=>{for await(const t of e)return t})();for(const t of e)return t}const xh=kt("/ipns/");function Nh(e){return In(e.subarray(0,xh.byteLength),xh)}const Mh=e=>Ss(e.slice(xh.length));class Oh{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(!Nh(e))return;const r=Mh(e),s=fh(t);await this.client.putIPNS(r,s,n)}async get(e,t){if(!Nh(e))throw new fn("Not found","ERR_NOT_FOUND");const n=Mh(e);try{const e=await this.client.getIPNS(n,t);return ph(e)}catch(e){if("ERR_BAD_RESPONSE"===e.code)throw new fn("Not found","ERR_NOT_FOUND");throw e}}}class Lh{client;constructor(e){this.client=e}async findPeer(e,t={}){const n=await Ch(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 Bh=hs("delegated-routing-v1-http-api-client"),Uh=4,Fh=3e4;class Vh{started;httpQueue;shutDownController;clientUrl;timeout;contentRouting;peerRouting;constructor(e,t={}){this.started=!1,this.shutDownController=new AbortController,this.shutDownController.signal,this.httpQueue=new Ph({concurrency:t.concurrentRequests??Uh}),this.clientUrl=e instanceof URL?e:new URL(e),this.timeout=t.timeout??Fh,this.contentRouting=new Oh(this),this.peerRouting=new Lh(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={}){Bh("getProviders starts: %c",e);const n=AbortSignal.timeout(this.timeout),r=Is([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 Eh(Rs(i.body))){const t=this.#P(e);null!=t&&(yield t)}}catch(e){Bh.error("getProviders errored:",e)}finally{r.clear(),i.resolve(),Bh("getProviders finished: %c",e)}}async*getPeers(e,t={}){Bh("getPeers starts: %c",e);const n=AbortSignal.timeout(this.timeout),r=Is([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 Eh(Rs(i.body))){const t=this.#P(e);null!=t&&(yield t)}}catch(e){Bh.error("getPeers errored:",e)}finally{r.clear(),i.resolve(),Bh("getPeers finished: %c",e)}}async getIPNS(e,t={}){Bh("getIPNS starts: %c",e);const n=AbortSignal.timeout(this.timeout),r=Is([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(Bh("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 vh((e=>Rn([dh,e.toBytes()]))(e),c),fh(c)}catch(e){throw Bh.error("getIPNS GET %s error:",o,e),e}finally{r.clear(),i.resolve(),Bh("getIPNS finished: %c",e)}}async putIPNS(e,t,n={}){Bh("putIPNS starts: %c",e);const r=AbortSignal.timeout(this.timeout),s=Is([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:ph(t),signal:s},n=await fetch(a,e);if(Bh("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 Bh.error("putIPNS PUT %s error:",a,e.stack),e}finally{s.clear(),o.resolve(),Bh("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:Es(e.ID),Addrs:n,Protocols:t}}}function Kh(e,t={}){return new Vh(new URL(e),t)}function $h(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 qh{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 $h(this.map.entries(),(e=>[Es(e[0]),e[1]]))}forEach(e){this.map.forEach(((t,n)=>{e(t,Es(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 $h(this.map.keys(),(e=>Es(e)))}values(){return this.map.values()}get size(){return this.map.size}}class Hh{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 $h(this.set.entries(),(e=>{const t=Es(e[0]);return[t,t]}))}forEach(e){this.set.forEach((t=>{const n=Es(t);e(n,n,this)}))}has(e){return this.set.has(e.toString())}values(){return $h(this.set.values(),(e=>Es(e)))}intersection(e){const t=new Hh;for(const n of e)this.has(n)&&t.add(n);return t}difference(e){const t=new Hh;for(const n of this)e.has(n)||t.add(n);return t}union(e){const t=new Hh;for(const n of e)t.add(n);for(const e of this)t.add(e);return t}}const zh=async()=>{const e=await async function(e,t){return Bl(e).generateKeyPair(2048)}("Ed25519"),t=await async function(e){return _s(Fl(e.public),function(e,t){return Bl(t=(t??"rsa").toLowerCase()),e.bytes}(e))}(e);if("Ed25519"===t.type)return t;throw new Error(`Generated unexpected PeerId type "${t.type}"`)};const Wh="ERR_SIGNATURE_NOT_VALID";var jh;!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())}(jh||(jh={}));class Gh{static createFromProtobuf=async e=>{const t=jh.decode(e),n=await _s(t.publicKey);return new Gh({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=Yh(n,r,s),o=await Vl(t.privateKey),a=await o.sign(i.subarray());return new Gh({peerId:t,payloadType:r,payload:s,signature:a})};static openAndCertify=async(e,t)=>{const n=await Gh.createFromProtobuf(e);if(!await n.validate(t))throw new fn("envelope signature is not valid for the given domain",Wh);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=jh.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=Yh(e,this.payloadType,this.payload);if(null==this.peerId.publicKey)throw new Error("Missing public key");return Ul(this.peerId.publicKey).verify(t.subarray(),this.signature)}}const Yh=(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 Qh=Uint8Array.from([3,1]);var Zh;!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())}(Zh||(Zh={}));class Jh{static createFromProtobuf=e=>{const t=Zh.decode(e),n=Ss(t.peerId),r=(t.addresses??[]).map((e=>cr(e.multiaddr))),s=t.seq;return new Jh({peerId:n,multiaddrs:r,seqNumber:s})};static DOMAIN="libp2p-peer-record";static CODEC=Qh;peerId;multiaddrs;seqNumber;domain=Jh.DOMAIN;codec=Jh.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=Zh.encode({peerId:this.peerId.toBytes(),seq:BigInt(this.seqNumber),addresses:this.multiaddrs.map((e=>({multiaddr:e.bytes})))})),this.marshaled}equals(e){return e instanceof Jh&&(!!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 Xh(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 ed={},td=e=>{e.addEventListener("message",(t=>{td.dispatchEvent("message",e,t)})),null!=e.port&&e.port.addEventListener("message",(t=>{td.dispatchEvent("message",e,t)}))};td.addEventListener=(e,t)=>{null==ed[e]&&(ed[e]=[]),ed[e].push(t)},td.removeEventListener=(e,t)=>{null!=ed[e]&&(ed[e]=ed[e].filter((e=>e===t)))},td.dispatchEvent=function(e,t,n){null!=ed[e]&&ed[e].forEach((e=>e(t,n)))};const nd="lock:worker:request-read",rd="lock:worker:release-read",sd="lock:master:grant-read",id="lock:worker:request-write",od="lock:worker:release-write",ad="lock:master:grant-write",cd=(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)}))}}}))},ld=(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)}))},ud={singleProcess:!1};const hd={};let dd;async function pd(e,t){let n;const r=new Promise((e=>{n=e}));return e.add((async()=>Dh((async()=>{await new Promise((e=>{n((()=>{e()}))}))})(),{milliseconds:t.timeout}))),r}const fd={name:"lock",concurrency:1/0,timeout:846e5,singleProcess:!1};function gd(e){const t=Object.assign({},fd,e);return null==dd&&(dd=(e=>{if(e=Object.assign({},ud,e),Boolean(globalThis.document)||e.singleProcess){const e=new EventTarget;return td.addEventListener("message",cd(e,"requestReadLock",nd,rd,sd)),td.addEventListener("message",cd(e,"requestWriteLock",id,od,ad)),e}return{isWorker:!0,readLock:e=>ld(e,nd,sd,rd),writeLock:e=>ld(e,id,ad,od)}})(t),!0!==dd.isWorker&&(dd.addEventListener("requestReadLock",(e=>{null!=hd[e.data.name]&&hd[e.data.name].readLock().then((async t=>e.data.handler().finally((()=>{t()}))))})),dd.addEventListener("requestWriteLock",(async e=>{null!=hd[e.data.name]&&hd[e.data.name].writeLock().then((async t=>e.data.handler().finally((()=>{t()}))))})))),null==hd[t.name]&&(hd[t.name]=((e,t)=>{if(!0===dd.isWorker)return{readLock:dd.readLock(e,t),writeLock:dd.writeLock(e,t)};const n=new Ph({concurrency:1});let r;return{async readLock(){if(null!=r)return pd(r,t);r=new Ph({concurrency:t.concurrency,autoStart:!1});const e=r,s=pd(r,t);return n.add((async()=>{e.start(),await e.onIdle().then((()=>{r===e&&(r=null)}))})),s},writeLock:async()=>(r=null,pd(n,t))}})(t.name,t)),hd[t.name]}const md={ERR_INVALID_PARAMETERS:"ERR_INVALID_PARAMETERS"};var yd,wd,bd;function vd(e,t){const n=yd.decode(t);null!=n.publicKey&&null==e.publicKey&&(e=function(e){if("RSA"===e.type)return new ws(e);if("Ed25519"===e.type)return new bs(e);if("secp256k1"===e.type)return new vs(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),bd.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=bd.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),wd.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(wd.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())}(yd||(yd={})),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())}(wd||(wd={})),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())}(bd||(bd={}));const Ed="/peers/";function Sd(e){if(!on(e)||null==e.type)throw new fn("Invalid PeerId",md.ERR_INVALID_PARAMETERS);const t=e.toCID().toString();return new en(`${Ed}${t}`)}async function _d(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",md.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 Id(e,t,n,r){if(null==t)throw new fn("Invalid PeerData",md.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",md.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",md.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=Rd(t.metadata instanceof Map?[...t.metadata.entries()]:Object.entries(t.metadata),{validate:Ad})}if(null!=t.tags){c=Rd(t.tags instanceof Map?[...t.tags.entries()]:Object.entries(t.tags),{validate:Td,map:Dd})}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=Rd([...a.entries()],{validate:Ad})}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=Rd([...n.entries()],{validate:Td,map:Dd})}null!=t.peerRecordEnvelope&&(l=t.peerRecordEnvelope)}const u={addresses:await _d(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 Rd(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 Ad(e,t){if("string"!=typeof e)throw new fn("Metadata key must be a string",md.ERR_INVALID_PARAMETERS);if(!(t instanceof Uint8Array))throw new fn("Metadata value must be a Uint8Array",md.ERR_INVALID_PARAMETERS)}function Td(e,t){if("string"!=typeof e)throw new fn("Tag name must be a string",md.ERR_INVALID_PARAMETERS);if(null!=t.value){if(parseInt(`${t.value}`,10)!==t.value)throw new fn("Tag value must be an integer",md.ERR_INVALID_PARAMETERS);if(t.value<0||t.value>100)throw new fn("Tag value must be between 0-100",md.ERR_INVALID_PARAMETERS)}if(null!=t.ttl){if(parseInt(`${t.ttl}`,10)!==t.ttl)throw new fn("Tag ttl must be an integer",md.ERR_INVALID_PARAMETERS);if(t.ttl<0)throw new fn("Tag ttl must be between greater than 0",md.ERR_INVALID_PARAMETERS)}}function Dd(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 kd(e,t,n){const r=e.toString().split("/")[2],s=Ss(we.decode(r)),i=n.get(s);if(null!=i)return i;const o=vd(s,t);return n.set(s,o),o}class Pd{peerId;datastore;lock;addressFilter;constructor(e,t={}){this.peerId=e.peerId,this.datastore=e.datastore,this.addressFilter=t.addressFilter,this.lock=gd({name:"peer-store",singleProcess:!0})}async has(e){return this.datastore.has(Sd(e))}async delete(e){if(this.peerId.equals(e))throw new fn("Cannot delete self peer",md.ERR_INVALID_PARAMETERS);await this.datastore.delete(Sd(e))}async load(e){return vd(e,await this.datastore.get(Sd(e)))}async save(e,t){const{existingBuf:n,existingPeer:r}=await this.#C(e),s=await Id(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 Id(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 Id(e,t,"merge",{addressFilter:this.addressFilter,existingPeer:r});return this.#x(e,s,n,r)}async*all(e){const t=new qh;for await(const{key:n,value:r}of this.datastore.query(function(e,t){return null==e?{}:{prefix:Ed,filters:(e.filters??[]).map((e=>({key:n,value:r})=>e(kd(n,r,t)))),orders:(e.orders??[]).map((e=>(n,r)=>e(kd(n.key,n.value,t),kd(r.key,r.value,t))))}}(e??{},t))){const e=kd(n,r,t);e.id.equals(this.peerId)||(yield e)}}async#C(e){try{const t=await this.datastore.get(Sd(e));return{existingBuf:t,existingPeer:vd(e,t)}}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}return{}}async#x(e,t,n,r){const s=yd.encode(t);return null!=n&&In(s,n)?{peer:vd(e,s),previous:r,updated:!1}:(await this.datastore.put(Sd(e),s),{peer:vd(e,s),previous:r,updated:!0})}}class Cd{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 Pd(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 Xh(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 Gh.openAndCertify(e,Jh.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=Jh.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 Gh.createFromProtobuf(s.peerRecordEnvelope),t=Jh.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 xd(e){if(null!=e[Symbol.asyncIterator])return(async()=>{for await(const t of e);})();for(const t of e);}function Nd(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 Md(e,t){return null!=e[Symbol.asyncIterator]?async function*(){const n=await Xh(e);yield*n.sort(t)}():function*(){const n=Xh(e);yield*n.sort(t)}()}function Od(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 Ld{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 xd(this.putMany(e,n)),e=[],await xd(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=Nd(n,(e=>e.key.toString().startsWith(t)))}if(Array.isArray(e.filters)&&(n=e.filters.reduce(((e,t)=>Nd(e,t)),n)),Array.isArray(e.orders)&&(n=e.orders.reduce(((e,t)=>Md(e,t)),n)),null!=e.offset){let t=0;const r=e.offset;n=Nd(n,(()=>t++>=r))}return null!=e.limit&&(n=Od(n,e.limit)),n}queryKeys(e,t){let n=this._allKeys(e,t);if(null!=e.prefix){const t=e.prefix;n=Nd(n,(e=>e.toString().startsWith(t)))}if(Array.isArray(e.filters)&&(n=e.filters.reduce(((e,t)=>Nd(e,t)),n)),Array.isArray(e.orders)&&(n=e.orders.reduce(((e,t)=>Md(e,t)),n)),null!=e.offset){const t=e.offset;let r=0;n=Nd(n,(()=>r++>=t))}return null!=e.limit&&(n=Od(n,e.limit)),n}}function Bd(e){return e=e??new Error("Read failed"),Vr(e,"ERR_DB_READ_FAILED")}function Ud(e){return e=e??new Error("Not Found"),Vr(e,"ERR_NOT_FOUND")}class Fd extends Ld{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 Ud();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 Vd=e=>e;function Kd(e,t){const n=e.getPeerId();if(null!=n){Es(n).equals(t)&&(e=e.decapsulate(cr(`/p2p/${t.toString()}`)))}return e}class $d{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??Vd,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=Kd(e,this.components.peerId)).toString();this.observed.has(t)||this.observed.set(t,{confident:!1})}confirmObservedAddr(e){const t=(e=Kd(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=Kd(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 qd{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=us())}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 Hd=["metrics","connectionProtector","dns"],zd=["components","isStarted","beforeStart","start","afterStart","beforeStop","stop","afterStop","then","_invokeStartableMethod"];var Wd;(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}(),Wd=e}).call(Lr);const jd=["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 Wd(e)));function Gd(e){return kn(e)?function(e){for(const t of jd)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 Yd(e={}){return{denyDialPeer:async()=>!1,denyDialMultiaddr:async e=>{const t=e.stringTuples();return(4===t[0][0]||41===t[0][0])&&Boolean(Gd(`${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 Qd=e=>({match:t=>!(t.length<1)&&(!!e(t[0])&&t.slice(1)),pattern:"fn"}),Zd=e=>({match:t=>Qd((t=>t===e)).match(t),pattern:e}),Jd=()=>({match:e=>Qd((e=>"string"==typeof e)).match(e),pattern:"{string}"}),Xd=()=>({match:e=>Qd((e=>!isNaN(parseInt(e)))).match(e),pattern:"{number}"}),ep=()=>({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}"}),tp=()=>({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}"}),np=e=>({match:t=>{const n=e.match(t);return!1===n?t:n},pattern:`optional(${e.pattern})`}),rp=(...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(", ")})`}),sp=(...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 ip(...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 op=sp(Zd("dns4"),Jd()),ap=sp(Zd("dns6"),Jd()),cp=sp(Zd("dnsaddr"),Jd()),lp=sp(Zd("dns"),Jd()),up=ip(rp(lp,cp,op,ap)),hp=rp(sp(Zd("ip4"),Qd(kn)),sp(Zd("ip6"),Qd(Pn))),dp=rp(hp,lp,op,ap,cp),pp=ip(dp),fp=ip(hp),gp=sp(dp,Zd("tcp"),Xd()),mp=sp(dp,Zd("udp"),Xd()),yp=rp(gp,mp),wp=sp(mp,Zd("quic")),bp=sp(mp,Zd("quic-v1")),vp=rp(wp,bp),Ep=rp(dp,gp,mp,wp,bp),Sp=rp(sp(Ep,Zd("ws"),np(ep()))),_p=rp(sp(Ep,Zd("wss"),np(ep())),sp(Ep,Zd("tls"),Zd("ws"),np(ep()))),Ip=sp(yp,Zd("webrtc-direct"),tp(),np(tp()),np(ep())),Rp=sp(bp,Zd("webtransport"),np(tp()),np(tp()),np(ep())),Ap=ip(Rp),Tp=rp(Sp,_p,sp(gp,np(ep())),sp(vp,np(ep())),sp(dp,np(ep())),Ip,Rp,ep()),Dp=ip(sp(Tp,Zd("p2p-circuit"),ep())),kp=ip(rp(sp(Tp,Zd("p2p-circuit"),Zd("webrtc"),ep()),sp(Tp,Zd("webrtc"),np(ep())),Zd("webrtc")));function Pp(e){try{const{address:t}=e.nodeAddress();return Boolean(Gd(t))}catch{return!0}}function Cp(e,t){const n=function(e,t){const n=Pp(e.multiaddr),r=Pp(t.multiaddr);return n&&!r?1:!n&&r?-1:0}(e,t);if(0!==n)return n;const r=function(e,t){const n=Dp.exactMatch(e.multiaddr),r=Dp.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}rp(sp(dp,Zd("tcp"),Xd(),Zd("http"),np(ep())),sp(dp,Zd("http"),np(ep()))),rp(sp(dp,Zd("tcp"),rp(sp(Zd("443"),Zd("http")),sp(Xd(),Zd("https"))),np(ep())),sp(dp,Zd("tls"),Zd("http"),np(ep())),sp(dp,Zd("https"),np(ep())));class xp extends Event{constructor(e,t){super(e),this.detail=t}}function Np(e){const t=[$p.A];return null==e?t:Array.isArray(e)?0===e.length?t:e:[e]}const Mp=60;function Op(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:$p[e.type]}))),Answer:(e.Answer??e.answers??[]).map((e=>({name:e.name,type:$p[e.type],TTL:e.TTL??e.ttl??Mp,data:e.data instanceof Uint8Array?Qt(e.data):e.data})))}}const Lp=4;function Bp(e,t={}){const n=new Ph({concurrency:t.queryConcurrency??Lp});return async(t,r={})=>{const s=new URLSearchParams;s.set("name",t),Np(r.types).forEach((e=>{s.append("type",$p[e])})),r.onProgress?.(new xp("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=Op(await t.json());return r.onProgress?.(new xp("dns:response",{detail:n})),n}),{signal:r.signal});if(null==i)throw new Error("No DNS response received");return i}}var Up=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)}}},Fp=Br(Up);class Vp{lru;constructor(e){this.lru=Fp(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 Op({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:$p[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??Mp),value:t}),this.lru.set(n,r)}remove(e,t){const n=`${e.toLowerCase()}-${t}`;this.lru.remove(n)}clear(){this.lru.clear()}}let Kp=class{resolvers;cache;constructor(e){var t;this.resolvers={},this.cache=(t=e.cacheSize??1e3,new Vp(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["."]=[Bp("https://cloudflare-dns.com/dns-query"),Bp("https://dns.google/resolve")])}async query(e,t={}){const n=Np(t.types),r=!1!==t.cached?this.cache.get(e,n):void 0;if(null!=r)return t.onProgress?.(new xp("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 xp("dns:error",{detail:e}))}}if(1===o.length)throw o[0];throw new AggregateError(o,`DNS lookup of ${e} ${n} failed`)}};var $p;!function(e){e[e.A=1]="A",e[e.CNAME=5]="CNAME",e[e.TXT=16]="TXT",e[e.AAAA=28]="AAAA"}($p||($p={}));const{code:qp}=Fn("dnsaddr"),Hp=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===qp))??[],s=t?.dns??function(e={}){return new Kp(e)}(),i=await s.query(`_dnsaddr.${r}`,{signal:t?.signal,types:[$p.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 zp=e=>{if("[object Object]"!==Object.prototype.toString.call(e))return!1;const t=Object.getPrototypeOf(e);return null===t||t===Object.prototype},{hasOwnProperty:Wp}=Object.prototype,{propertyIsEnumerable:jp}=Object,Gp=(e,t,n)=>Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0}),Yp=Lr,Qp={concatArrays:!1,ignoreUndefined:!1},Zp=e=>{const t=[];for(const n in e)Wp.call(e,n)&&t.push(n);if(Object.getOwnPropertySymbols){const n=Object.getOwnPropertySymbols(e);for(const r of n)jp.call(e,r)&&t.push(r)}return t};function Jp(e){return Array.isArray(e)?function(e){const t=e.slice(0,0);return Zp(e).forEach((n=>{Gp(t,n,Jp(e[n]))})),t}(e):zp(e)?function(e){const t=null===Object.getPrototypeOf(e)?Object.create(null):{};return Zp(e).forEach((n=>{Gp(t,n,Jp(e[n]))})),t}(e):e}const Xp=(e,t,n,r)=>(n.forEach((n=>{void 0===t[n]&&r.ignoreUndefined||(n in e&&e[n]!==Object.getPrototypeOf(e)?Gp(e,n,tf(e[n],t[n],r)):Gp(e,n,Jp(t[n])))})),e),ef=(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++)Wp.call(t,n)&&(i.push(String(n)),Gp(r,s++,t===e?t[n]:Jp(t[n])));r=Xp(r,t,Zp(t).filter((e=>!i.includes(e))),n)})),r};function tf(e,t,n){return n.concatArrays&&Array.isArray(e)&&Array.isArray(t)?ef(e,t,n):zp(t)&&zp(e)?Xp(e,t,Zp(t),n):Jp(t)}var nf,rf,sf=Br((function(...e){const t=tf(Jp(Qp),this!==Yp&&this||{},Qp);let n={_:{}};for(const r of e)if(void 0!==r){if(!zp(r))throw new TypeError("`"+r+"` is not an Option Object");n=tf(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"}(nf||(nf={})),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"}(rf||(rf={}));const of={addresses:{listen:[],announce:[],noAnnounce:[],announceFilter:e=>e},connectionManager:{resolvers:{dnsaddr:Hp},addressSorter:Cp},transportManager:{faultTolerance:dn.FATAL_ALL}};const af=()=>{const e=new Error("Delay aborted");return e.name="AbortError",e},cf=new WeakMap;const lf=function({clearTimeout:e,setTimeout:t}={}){return(n,{value:r,signal:s}={})=>{if(s?.aborted)return Promise.reject(af());let i,o,a;const c=e??clearTimeout,l=()=>{c(i),a(af())},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}),cf.set(u,(()=>{c(i),i=null,o()})),u}}();class uf{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 hf}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 lf(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 hf{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 df(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:Es(n),e.forEach((e=>{if(!ar(e))throw new fn("Invalid Multiaddr",rf.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",rf.ERR_INVALID_PARAMETERS)}else{const e=Es(n);if(null==t||!t.equals(e))throw new fn("Multiaddrs must all have the same peer id or have no peer id",rf.ERR_INVALID_PARAMETERS)}}))}return{peerId:t,multiaddrs:e}}class pf 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 ff(e,t,n,r){const s=new pf(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 gf{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 mf{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 gf(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 yf 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 mf(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 ff(this,"empty",e?.signal)}async onSizeLessThan(e,t){this.size<e||await ff(this,"next",t?.signal,{filter:()=>this.size<e})}async onIdle(e){0===this.pending&&0===this.size||await ff(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 wf extends yf{has(e){return null!=this.find(e)}find(e){return this.queue.find((t=>e.equals(t.options.peerId)))}}const bf="last-dial-failure",vf=42e4,Ef={minConnections:5,maxQueueLength:100,autoDialConcurrency:25,autoDialPriority:0,autoDialInterval:5e3,autoDialPeerRetryThreshold:vf,autoDialDiscoveredPeersDebounce:10};class Sf{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??Ef.minConnections,this.autoDialPriority=t.autoDialPriority??Ef.autoDialPriority,this.autoDialIntervalMs=t.autoDialInterval??Ef.autoDialInterval,this.autoDialMaxQueueLength=t.maxQueueLength??Ef.maxQueueLength,this.autoDialPeerRetryThresholdMs=t.autoDialPeerRetryThreshold??Ef.autoDialPeerRetryThreshold,this.autoDialDiscoveredPeersDebounce=t.autoDialDiscoveredPeersDebounce??Ef.autoDialDiscoveredPeersDebounce,this.log=e.logger.forComponent("libp2p:connection-manager:auto-dial"),this.started=!1,this.running=!1,this.queue=new wf({concurrency:t.autoDialConcurrency??Ef.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 Hh(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 qh;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(bf);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 _f=["/ipfs/id/1.0.0","/ipfs/id/push/1.0.0","/libp2p/autonat/1.0.0","/libp2p/dcutr"];const If={maxConnections:100,allow:[]};class Rf{maxConnections;connectionManager;peerStore;allow;events;log;constructor(e,t={}){this.maxConnections=t.maxConnections??If.maxConnections,this.allow=t.allow??If.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 qh;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??_f;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 Af extends yf{constructor(e={}){super({...e,sort:(e,t)=>e.options.priority>t.options.priority?-1:e.options.priority<t.options.priority?1:0})}}const Tf={addressSorter:Cp,maxParallelDials:50,maxDialQueueLength:500,maxPeerAddrsToDial:25,dialTimeout:5e3,resolvers:{dnsaddr:Hp}};class Df{queue;components;addressSorter;maxPeerAddrsToDial;maxDialQueueLength;dialTimeout;shutDownController;connections;log;constructor(e,t={}){this.addressSorter=t.addressSorter??Tf.addressSorter,this.maxPeerAddrsToDial=t.maxPeerAddrsToDial??Tf.maxPeerAddrsToDial,this.maxDialQueueLength=t.maxDialQueueLength??Tf.maxDialQueueLength,this.dialTimeout=t.dialTimeout??Tf.dialTimeout,this.connections=t.connections??new qh,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 Af({concurrency:t.maxParallelDials??Tf.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}=df(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",rf.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:{[bf]: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",rf.ERR_TRANSPORT_DIAL_FAILED)}finally{t.clear()}}),{peerId:n,priority:t.priority??kf,multiaddrs:new Set(r.map((e=>e.toString()))),signal:t.signal})}createDialAbortController(e){const t=Is([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",rf.ERR_DIALED_SELF);if(!0===await(this.components.connectionGater.denyDialPeer?.(e)))throw new fn("The dial request is blocked by gater.allowDialPeer",rf.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!==rf.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!==rf.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",rf.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",rf.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=>!Dp.matches(e.multiaddr)))}catch(e){this.log.trace("error calculating if multiaddr(s) were dialable",e)}return!1}}const kf=50,Pf={minConnections:5,maxConnections:100,inboundConnectionThreshold:5,maxIncomingPendingConnections:10,autoDialConcurrency:25,autoDialPriority:0,autoDialMaxQueueLength:100,autoDialPeerRetryThreshold:vf,autoDialDiscoveredPeersDebounce:10};class Cf{started;connections;allow;deny;maxIncomingPendingConnections;incomingPendingConnections;maxConnections;dialQueue;autoDial;connectionPruner;inboundConnectionRateLimiter;peerStore;metrics;events;log;constructor(e,t={}){this.maxConnections=t.maxConnections??Pf.maxConnections;const n=t.minConnections??Pf.minConnections;if(this.maxConnections<n)throw new fn("Connection Manager maxConnections must be greater than minConnections",rf.ERR_INVALID_PARAMETERS);this.connections=new qh,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??Pf.maxIncomingPendingConnections,this.inboundConnectionRateLimiter=new uf({points:t.inboundConnectionThreshold??Pf.inboundConnectionThreshold,duration:1}),this.autoDial=new Sf({connectionManager:this,peerStore:e.peerStore,events:e.events,logger:e.logger},{minConnections:n,autoDialConcurrency:t.autoDialConcurrency??Pf.autoDialConcurrency,autoDialPriority:t.autoDialPriority??Pf.autoDialPriority,autoDialPeerRetryThreshold:t.autoDialPeerRetryThreshold??Pf.autoDialPeerRetryThreshold,autoDialDiscoveredPeersDebounce:t.autoDialDiscoveredPeersDebounce??Pf.autoDialDiscoveredPeersDebounce,maxQueueLength:t.autoDialMaxQueueLength??Pf.autoDialMaxQueueLength}),this.connectionPruner=new Rf({connectionManager:this,peerStore:e.peerStore,events:e.events,logger:e.logger},{maxConnections:this.maxConnections,allow:this.allow}),this.dialQueue=new Df(e,{addressSorter:t.addressSorter??Cp,maxParallelDials:t.maxParallelDials??50,maxDialQueueLength:t.maxDialQueueLength??500,maxPeerAddrsToDial:t.maxPeerAddrsToDial??25,dialTimeout:t.dialTimeout??5e3,resolvers:t.resolvers??{dnsaddr:Hp},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",rf.ERR_NODE_NOT_STARTED);t.signal?.throwIfAborted();const{peerId:n}=df(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??kf});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 xf{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",rf.ERR_NO_ROUTERS_AVAILABLE);const n=this,r=new Hh;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",rf.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(nf.NOT_STARTED_YET,rf.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(nf.NOT_STARTED_YET,rf.ERR_NODE_NOT_STARTED);return Promise.any(this.routers.map((async n=>n.get(e,t))))}}const Nf=globalThis.CustomEvent??Event;async function*Mf(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 Nf("task-complete"))}),(t=>{e.done=!0,e.err=t,s.dispatchEvent(new Nf("task-complete"))}))}l=!0,s.dispatchEvent(new Nf("task-complete"))}catch(e){o=e,s.dispatchEvent(new Nf("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 Of{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",rf.ERR_NO_ROUTERS_AVAILABLE);if(e.toString()===this.peerId.toString())throw new fn("Should not try to find self",rf.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(nf.NOT_FOUND,rf.ERR_NOT_FOUND)}async*getClosestPeers(e,t={}){if(0===this.routers.length)throw new fn("No peer routers available",rf.ERR_NO_ROUTERS_AVAILABLE);const n=this,r=new Hh;for await(const s of Mf(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 Lf 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=Is([this.shutdownController.signal,e?.signal]);try{for(;;){this.needNext?.resolve(),this.needNext=lr();const e=await ff(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=Is([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(No(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 Bf{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}`,rf.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}`,rf.ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED);const r=sf.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",rf.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!==rf.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 Uf 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 Ff{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 Uf({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",rf.ERR_INVALID_KEY);if(this.transports.has(t))throw new fn(`There is already a transport with the tag ${t}`,rf.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)}`,rf.ERR_TRANSPORT_UNAVAILABLE);try{return await n.dial(e,{...t,upgrader:this.components.upgrader})}catch(e){throw null==e.code&&(e.code=rf.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",rf.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`,rf.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,rf.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 Vf="/multistream/1.0.0",Kf=1024,$f=kt("\n");async function qf(e,t,n){await e.write(t,n)}async function Hf(e,t){const n=await async function(e,t){const n=await e.read(t);if(0===n.byteLength||n.get(n.byteLength-1)!==$f[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 zf(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:Kf});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',Vf,t),await f.writeV([kt(`${Vf}\n`),kt(`${t}\n`)]),n.log.trace('optimistic: wrote ["%s", "%s", data] in source',Vf,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 Hf(f,n);if(n.log.trace('optimistic: read multistream select header "%s"',e),e===Vf&&(e=await Hf(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',Vf,t,s.byteLength);const e=`${t}\n`;yield new Ir(Uint8Array.from([19]),kt(`${Vf}\n`),C(e.length),kt(e),s).subarray(),n.log.trace('optimistic: wrote ["%s", "%s", data(%d)] in sink',Vf,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:Kf}),s=t.shift();if(null==s)throw new Error("At least one protocol must be specified");n.log.trace('select: write ["%s", "%s"]',Vf,s);const i=kt(`${Vf}\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 Hf(r,n);if(n.log.trace('select: read "%s"',a),a===Vf&&(n.log.trace("select: reading protocol response"),a=await Hf(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 qf(r,kt(`${e}\n`),n),n.log.trace("select: reading protocol response");const t=await Hf(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 Wf(e,t,n){t=Array.isArray(t)?t:[t],n.log.trace("handle: available protocols %s",t);const r=xr(e,{...n,maxDataLength:Kf,maxLengthLength:2});for(;;){n.log.trace("handle: reading incoming string");const e=await Hf(r,n);if(n.log.trace('handle: read "%s"',e),e!==Vf){if(t.includes(e))return n.log.trace('handle: respond with "%s" for "%s"',e,e),await qf(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 qf(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 qf(r,s,n),n.log.trace('handle: responded with "%s" for %s',t,e)}}else n.log.trace('handle: respond with "%s" for "%s"',Vf,e),await qf(r,kt(`${Vf}\n`),n),n.log.trace('handle: responded with "%s" for "%s"',Vf,e)}}class jf{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 Gf(e,t,n){let r=0;return n.streams.forEach((n=>{n.direction===t&&n.protocol===e&&r++})),r}class Yf{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}`,rf.ERR_CONNECTION_INTERCEPTED)}async upgradeInbound(e,t){if(!await this.components.connectionManager.acceptIncomingConnection(e))throw new fn("connection denied",rf.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",rf.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",rf.ERR_INVALID_MULTIADDR);const n=Es(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=Es(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",rf.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 Wf(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!==rf.ERR_NO_HANDLER_FOR_PROTOCOL)throw e}return 32}(r,this.components.registrar);if(Gf(r,"inbound",u)===s){const t=new fn(`Too many inbound protocol streams for protocol "${r}" - limit ${s}`,rf.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",rf.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 zf(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!==rf.ERR_NO_HANDLER_FOR_PROTOCOL)throw e}return n.maxOutboundStreams??64}(s,this.components.registrar,t),a=Gf(s,"outbound",u);if(a>=o){const e=new fn(`Too many outbound protocol streams for protocol "${s}" - ${a}/${o}`,rf.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),rf.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",rf.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 jf(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 Wf(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,rf.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 zf(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,rf.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 zf(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),rf.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 Wf(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),rf.ERR_MUXER_UNAVAILABLE)}}}class Qf 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??us(),this.log=this.logger.forComponent("libp2p"),this.services={};const r=this.components=function(e={}){const t=new qd(e);return new Proxy(t,{get(e,n,r){if("string"==typeof n&&!zd.includes(n)){const e=t.components[n];if(null==e&&!Hd.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 Fd,connectionGater:Yd(e.connectionGater),dns:e.dns});this.peerStore=this.configureComponent("peerStore",new Cd(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 Yf(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 Ff(this.components,e.transportManager)),this.configureComponent("connectionManager",new Cf(this.components,e.connectionManager)),this.configureComponent("registrar",new Bf(this.components)),this.configureComponent("addressManager",new $d(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 Of(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 xf(this.components,{routers:i})),this.configureComponent("randomWalk",new Lf(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 Hh;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",rf.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",rf.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=Es(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!==rf.ERR_NOT_FOUND)throw e}const n=Rn([kt("/pk/"),e.multihash.digest]),r=await this.contentRouting.get(n,t);return Ul(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(rf.ERR_DISCOVERED_SELF))}}async function Zf(e={}){const t=e.peerId??=await zh();if(null==t.privateKey)throw new fn("peer id was missing private key","ERR_MISSING_PRIVATE_KEY");return e.privateKey??=await Vl(t.privateKey),new Qf(await async function(e){const t=sf(of,e);if(null===t.connectionProtector&&null!=globalThis.process?.env?.LIBP2P_FORCE_PNET)throw new fn(nf.ERR_PROTECTOR_REQUIRED,rf.ERR_PROTECTOR_REQUIRED);if(!(await _s(t.privateKey.public.bytes,t.privateKey.bytes)).equals(t.peerId))throw new fn("Private key doesn't match peer id",rf.ERR_INVALID_KEY);return t}(e))}new en("SHARDING"),hs("datastore:core:tiered");const Jf=(e,t)=>t.some((t=>e instanceof t));let Xf,eg;const tg=new WeakMap,ng=new WeakMap,rg=new WeakMap;let sg={get(e,t,n){if(e instanceof IDBTransaction){if("done"===t)return tg.get(e);if("store"===t)return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return cg(e[t])},set:(e,t,n)=>(e[t]=n,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function ig(e){sg=e(sg)}function og(e){return(eg||(eg=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(e)?function(...t){return e.apply(lg(this),t),cg(this.request)}:function(...t){return cg(e.apply(lg(this),t))}}function ag(e){return"function"==typeof e?og(e):(e instanceof IDBTransaction&&function(e){if(tg.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)}));tg.set(e,t)}(e),Jf(e,Xf||(Xf=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction]))?new Proxy(e,sg):e)}function cg(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(cg(e.result)),r()},i=()=>{n(e.error),r()};e.addEventListener("success",s),e.addEventListener("error",i)}));return rg.set(t,e),t}(e);if(ng.has(e))return ng.get(e);const t=ag(e);return t!==e&&(ng.set(e,t),rg.set(t,e)),t}const lg=e=>rg.get(e);const ug=["get","getKey","getAll","getAllKeys","count"],hg=["put","add","delete","clear"],dg=new Map;function pg(e,t){if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(dg.get(t))return dg.get(t);const n=t.replace(/FromIndex$/,""),r=t!==n,s=hg.includes(n);if(!(n in(r?IDBIndex:IDBObjectStore).prototype)||!s&&!ug.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 dg.set(t,i),i}ig((e=>({...e,get:(t,n,r)=>pg(t,n)||e.get(t,n,r),has:(t,n)=>!!pg(t,n)||e.has(t,n)})));const fg=["continue","continuePrimaryKey","advance"],gg={},mg=new WeakMap,yg=new WeakMap,wg={get(e,t){if(!fg.includes(t))return e[t];let n=gg[t];return n||(n=gg[t]=function(...e){mg.set(this,yg.get(this)[t](...e))}),n}};async function*bg(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;const n=new Proxy(t,wg);for(yg.set(n,t),rg.set(n,lg(t));t;)yield n,t=await(mg.get(n)||t.continue()),mg.delete(n)}function vg(e,t){return t===Symbol.asyncIterator&&Jf(e,[IDBIndex,IDBObjectStore,IDBCursor])||"iterate"===t&&Jf(e,[IDBIndex,IDBObjectStore])}ig((e=>({...e,get:(t,n,r)=>vg(t,n)?bg:e.get(t,n,r),has:(t,n)=>vg(t,n)||e.has(t,n)})));class Eg extends Ld{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=cg(o);return r&&o.addEventListener("upgradeneeded",(e=>{r(cg(o.result),e.oldVersion,e.newVersion,cg(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 Bd(e)}if(void 0===t)throw Ud();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 Bd(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)=>Nd(e,t)),t)),Array.isArray(e.orders)&&(t=e.orders.reduce(((e,t)=>Md(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)=>Nd(e,t)),t)),Array.isArray(e.orders)&&(t=e.orders.reduce(((e,t)=>Md(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))),cg(n).then((()=>{}))}(this.location)}}function Sg(){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 _g=65535,Ig=Boolean(globalThis.process?.env?.DUMP_SESSION_KEYS),Rg=e=>new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4));function Ag(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 Tg(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function Dg(e){if("string"==typeof e)e=Tg(e);else{if(!Ag(e))throw new Error("expected Uint8Array, got "+typeof e);e=e.slice()}return e}const kg=e=>"[object Object]"===Object.prototype.toString.call(e)&&e.constructor===Object;function Pg(e,t){if(!Ag(e))throw new Error("Uint8Array expected");if("number"==typeof t&&e.length!==t)throw new Error(`Uint8Array length ${t} expected`)}const Cg=(e,t)=>(Object.assign(t,e),t);function xg(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 Ng(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`wrong positive integer: ${e}`)}function Mg(e){if("boolean"!=typeof e)throw new Error(`boolean expected, not ${e}`)}function Og(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 Lg(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 Bg=(e,t)=>255&e[t++]|(255&e[t++])<<8;class Ug{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,Pg(e=Dg(e),32);const t=Bg(e,0),n=Bg(e,2),r=Bg(e,4),s=Bg(e,6),i=Bg(e,8),o=Bg(e,10),a=Bg(e,12),c=Bg(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]=Bg(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=Bg(e,t+0),y=Bg(e,t+2),w=Bg(e,t+4),b=Bg(e,t+6),v=Bg(e,t+8),E=Bg(e,t+10),S=Bg(e,t+12),_=Bg(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){Lg(this);const{buffer:t,blockLen:n}=this,r=(e=Dg(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){Lg(this),function(e,t){Og(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 Fg=function(e){const t=(t,n)=>e(n).update(Dg(t)).digest(),n=e(new Uint8Array(32));return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=t=>e(t),t}((e=>new Ug(e))),Vg=Tg("expand 16-byte k"),Kg=Tg("expand 32-byte k"),$g=Rg(Vg),qg=Rg(Kg);function Hg(e,t){return e<<t|e>>>32-t}function zg(e){return e.byteOffset%4==0}const Wg=64,jg=16,Gg=2**32-1,Yg=new Uint32Array;function Qg(e,t){const{allowShortKeys:n,extendNonceFn:r,counterLength:s,counterRight:i,rounds:o}=function(e,t){if(void 0!==t&&("object"!=typeof t||!kg(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 Ng(s),Ng(o),Mg(i),Mg(n),(t,a,c,l,u=0)=>{Og(t),Og(a),Og(c);const h=c.length;if(l||(l=new Uint8Array(h)),Og(l),Ng(u),u<0||u>=Gg)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=qg;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=$g,d.push(p)}zg(a)||(a=a.slice(),d.push(a));const m=Rg(p);if(r){if(24!==a.length)throw new Error("arx: extended nonce must be 24 bytes");r(f,m,Rg(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=Rg(a);for(!function(e,t,n,r,s,i,o,a){const c=s.length,l=new Uint8Array(Wg),u=Rg(l),h=zg(s)&&zg(i),d=h?Rg(s):Yg,p=h?Rg(i):Yg;for(let f=0;f<c;o++){if(e(t,n,r,u,o,a),o>=Gg)throw new Error("arx: counter overflow");const g=Math.min(Wg,c-f);if(h&&g===Wg){const e=f/4;if(f%4!=0)throw new Error("arx: invalid block position");for(let t,n=0;n<jg;n++)t=e+n,p[t]=d[t]^u[n];f+=Wg}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 Zg(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=Hg(M^S,16),P=P+M|0,A=Hg(A^P,12),S=S+A|0,M=Hg(M^S,8),P=P+M|0,A=Hg(A^P,7),_=_+T|0,O=Hg(O^_,16),C=C+O|0,T=Hg(T^C,12),_=_+T|0,O=Hg(O^_,8),C=C+O|0,T=Hg(T^C,7),I=I+D|0,L=Hg(L^I,16),x=x+L|0,D=Hg(D^x,12),I=I+D|0,L=Hg(L^I,8),x=x+L|0,D=Hg(D^x,7),R=R+k|0,B=Hg(B^R,16),N=N+B|0,k=Hg(k^N,12),R=R+k|0,B=Hg(B^R,8),N=N+B|0,k=Hg(k^N,7),S=S+T|0,B=Hg(B^S,16),x=x+B|0,T=Hg(T^x,12),S=S+T|0,B=Hg(B^S,8),x=x+B|0,T=Hg(T^x,7),_=_+D|0,M=Hg(M^_,16),N=N+M|0,D=Hg(D^N,12),_=_+D|0,M=Hg(M^_,8),N=N+M|0,D=Hg(D^N,7),I=I+k|0,O=Hg(O^I,16),P=P+O|0,k=Hg(k^P,12),I=I+k|0,O=Hg(O^I,8),P=P+O|0,k=Hg(k^P,7),R=R+A|0,L=Hg(L^R,16),C=C+L|0,A=Hg(A^C,12),R=R+A|0,L=Hg(L^R,8),C=C+L|0,A=Hg(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 Jg=Qg(Zg,{counterRight:!1,counterLength:4,allowShortKeys:!1}),Xg=new Uint8Array(16),em=(e,t)=>{e.update(t);const n=t.length%16;n&&e.update(Xg.subarray(n))},tm=new Uint8Array(32);function nm(e,t,n,r,s){const i=e(t,n,tm),o=Fg.create(i);s&&em(o,s),em(o,r);const a=new Uint8Array(16),c=(l=a,new DataView(l.buffer,l.byteOffset,l.byteLength));var l;xg(c,0,BigInt(s?s.length:0),!0),xg(c,8,BigInt(r.length),!0),o.update(a);const u=o.digest();return i.fill(0),u}const rm=Cg({blockSize:64,nonceLength:12,tagLength:16},(sm=Jg,(e,t,n)=>{const r=16;return Pg(e,32),Pg(t),{encrypt:(s,i)=>{const o=s.length,a=o+r;i?Pg(i,a):i=new Uint8Array(a),sm(e,t,s,i,1);const c=nm(sm,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?Pg(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),nm(sm,e,t,c,n)))throw new Error("invalid tag");return sm(e,t,c,i,1),i}}}));var sm;const im=new Uint8Array([0]),om=new Uint8Array;const am={hashSHA256:e=>fl(e.subarray()),getHKDF(e,t){const n=function(e,t,n){return ks(e),void 0===n&&(n=new Uint8Array(e.outputLen)),Oo(e,Bs(n),Bs(t))}(fl,t,e),r=function(e,t,n,r=32){if(ks(e),Ts(r),r>255*e.outputLen)throw new Error("Length should be <= 255*HashLen");const s=Math.ceil(r/e.outputLen);void 0===n&&(n=om);const i=new Uint8Array(s*e.outputLen),o=Oo.create(e,t),a=o._cloneInto(),c=new Uint8Array(o.outputLen);for(let t=0;t<s;t++)im[0]=t+1,a.update(0===t?om:c).update(n).update(im).digestInto(c),i.set(c,e.outputLen*t),o._cloneInto(a);return o.destroy(),a.destroy(),c.fill(0),im.fill(0),i.slice(0,r)}(fl,n,void 0,96),s=r;return[s.subarray(0,32),s.subarray(32,64),s.subarray(64,96)]},generateX25519KeyPair(){const e=yo.utils.randomPrivateKey();return{publicKey:yo.getPublicKey(e),privateKey:e}},generateX25519KeyPairFromSeed:e=>({publicKey:yo.getPublicKey(e),privateKey:e}),generateX25519SharedKey:(e,t)=>yo.getSharedSecret(e.subarray(),t.subarray()),chaCha20Poly1305Encrypt:(e,t,n,r)=>rm(r,t,n).encrypt(e.subarray()),chaCha20Poly1305Decrypt:(e,t,n,r,s)=>rm(r,t,n).decrypt(e.subarray(),s)},cm=am;const lm=e=>{const t=w(2);return t[0]=e>>8,t[1]=e,t};lm.bytes=2;const um=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 hm(e,t){t.enabled&&Ig&&(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 dm(e,t){t.enabled&&Ig&&(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 pm(e,t){t.enabled&&Ig&&t(e?`REMOTE_EPHEMERAL_PUBLIC_KEY ${Qt(e.subarray(),"hex")}`:"Missing remote ephemeral keys.")}function fm(e,t,n){n.enabled&&Ig&&(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 gm(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}um.bytes=2;class mm extends Error{code;constructor(e="Unexpected Peer"){super(e),this.code=mm.code}static code="ERR_UNEXPECTED_PEER"}class ym extends Error{code;constructor(e="Invalid crypto exchange"){super(e),this.code=ym.code}static code="ERR_INVALID_CRYPTO_EXCHANGE"}class wm{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 bm=y(0);class vm{k;n;crypto;constructor(e,t=void 0,n=0){this.crypto=e,this.k=t,this.n=new wm(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 Em{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 vm(e)}mixKey(e){const[t,n]=this.crypto.hkdf(this.ck,e);this.ck=t,this.cs=new vm(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,bm);return[new vm(this.crypto,e),new vm(this.crypto,t)]}}class Sm{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 Em(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 _m extends Sm{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 ym(`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 ym(`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 ym(`handshake stage 2 validation fail: ${e.message}`)}}}var Im,Rm;async function Am(e,t,n){const r=await e.sign(Dm(t));return Rm.encode({identityKey:e.public.bytes,identitySig:r,extensions:n})}async function Tm(e,t,n){try{const r=Rm.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=Dm(t),i=Ul(r.identityKey);if(!await i.verify(s,r.identitySig))throw new Error("Invalid payload signature");return r}catch(e){throw new mm(e.message)}}function Dm(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 km(e){const{log:t,connection:n,crypto:r,privateKey:s,prologue:i,s:o,remoteIdentityKey:a,extensions:c}=e,l=await Am(s,o.publicKey,c),u=new _m({crypto:r,protocolName:"Noise_XX_25519_ChaChaPoly_SHA256",initiator:!0,prologue:i,s:o});hm(u.s,t),t.trace("Stage 0 - Initiator starting to send first message."),await n.write(u.writeMessageA(bm)),t.trace("Stage 0 - Initiator finished sending first message."),dm(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."),pm(u.re,t),d=u.rs,(p=t).enabled&&Ig&&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 Tm(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 fm(g,m,t),{payload:f,encrypt:e=>g.encryptWithAd(bm,e),decrypt:(e,t)=>m.decryptWithAd(bm,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())}(Im||(Im={})),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),Im.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=Im.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())}(Rm||(Rm={}));class Pm{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??cm;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:lm,lengthDecoder:um,maxDataLength:_g});if(!e.privateKey)throw new fn("local peerId does not contain private key","ERR_NO_PRIVATE_KEY");const s=await Vl(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 _s(o.payload.identityKey)}}async secureInbound(e,t,n){const r=xr(t,{lengthEncoder:lm,lengthDecoder:um,maxDataLength:_g});if(!e.privateKey)throw new fn("local peerId does not contain private key","ERR_NO_PRIVATE_KEY");const s=await Vl(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 _s(o.payload.identityKey)}}async performHandshakeInitiator(e,t,n){let r;try{r=await km({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 Am(s,o.publicKey,c),u=new _m({crypto:r,protocolName:"Noise_XX_25519_ChaChaPoly_SHA256",initiator:!1,prologue:i,s:o});hm(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."),pm(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."),dm(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 Tm(h,u.rs,a),[p,f]=u.ss.split();return fm(p,f,t),{payload:d,encrypt:e=>f.encryptWithAd(bm,e),decrypt:(e,t)=>p.decryptWithAd(bm,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=Sg(),t=Sg();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(lm(s.byteLength),s)}}}(t,this.metrics),s,(e=>qr(e,{lengthDecoder:um})),function(e,t){return async function*(n){for await(const r of n)for(let n=0;n<r.length;n+=_g){let s=n+_g;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 Cm(e={}){return t=>new Pm(t,e)}function xm(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 Nm(e){return null!=e&&("function"==typeof e.then&&"function"==typeof e.catch&&"function"==typeof e.finally)}class Mm{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);Nm(e)&&await e}const n=()=>{!function(e,t){const n=xm(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);Nm(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();Nm(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 Om extends Mm{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 Lm(e,t,n,r,s,i){const o=i.forComponent(`libp2p:webtransport:stream:${n}:${t}`),a=new Om({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 Bm(){return{source:{[Symbol.asyncIterator]:()=>({next:async()=>new Promise((()=>{}))})},sink:async e=>new Promise((()=>{}))}}function Um(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 Om(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 Om(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()},...Lm()};return c}}}const Um=Object.values(_t).map((e=>e.decoder)).reduce(((e,t)=>e.or(t)));function Fm(e){if(!Rp.matches(e))throw new pn("Invalid multiaddr, was not a WebTransport address","ERR_INVALID_MULTIADDR");const t=e.stringTuples(),n=t.filter((([e,t])=>e===Un("certhash").code)).map((([e,t])=>{return n=t??"",lt(Um.decode(n));var n})),r=t.filter((([e,t])=>e===Un("p2p").code)).map((([e,t])=>vs(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 Vm=WebTransport;class Km{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";[un]=!0;async dial(e,t){if(!0===t?.signal?.aborted)throw new dn;this.log("dialing %s",e);const n=this.components.peerId;if(void 0===n)throw new pn("Need a local peerid","ERR_INVALID_PARAMETERS");t=t??{};const{url:r,certhashes:s,remotePeer:i}=Fm(e);let o,a,c=()=>{},l=!1,u=!1,h=!1;try{this.metrics?.dialerEvents.increment({pending:!0});const d=new Vm(`${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 Rr(this.authenticateWebTransport(d,n,i,s),t.signal),!h)throw new pn("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"),...Lm()},await t.upgrader.upgradeOutbound(a,{skipEncryption:!0,muxerFactory:Bm(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 dn;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 Rr(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=Pm()(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=>_n(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(!Rp.exactMatch(e))return!1;const{url:t,certhashes:n}=Fm(e);return null!=t&&n.length>0}))}}function $m(e={}){return t=>new Km(t,e)}const qm=[Un("tcp").code,Un("dns").code,Un("dnsaddr").code,Un("dns4").code,Un("dns6").code];function Hm(e){let t;try{t=Un("sni").code}catch(e){return null}for(const[n,r]of e)if(n===t&&void 0!==r)return r;return null}function zm(e){return e.some((([e,t])=>e===Un("tls").code))}function Wm(e,t,n){const r=jm[Un(e).name];if(void 0===r)throw new Error(`Can't interpret protocol ${Un(e).name}`);const s=r(t,n);return e===Un("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://${Wm(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://${Wm(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`${Wm(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`${Wm(n[0],n[1]??"",t)}/p2p/${e}`},http:(e,t)=>{const n=zm(t),r=Hm(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=Wm(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`${Wm(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 Wm(n[0],n[1]??"",t)},sni:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return Wm(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=Wm(n[0],n[1]??"",t);return r=r.replace("tcp://",""),`https://${r}`},ws:(e,t)=>{const n=zm(t),r=Hm(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=Wm(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=Wm(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`${Wm(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`${Wm(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`${Wm(n[0],n[1]??"",t)}/p2p-webrtc-direct`}};var Gm=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)}))},Ym=(e,t)=>{(t=t??{}).closeOnEnd=!1!==t.closeOnEnd;return async n=>{for await(const t of n){try{await Gm(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()}))}))}},Qm={},Jm={};Object.defineProperty(Jm,"__esModule",{value:!0});class Zm{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 Xm=class{constructor(e,{highWaterMark:t=100,lowWaterMark:n=1}={}){const r=new Zm;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)}};Jm.EventIterator=Xm,Jm.default=Xm,Object.defineProperty(Qm,"__esModule",{value:!0});const ey=Jm;var ty=Qm.EventIterator=ey.EventIterator;function ny(e){return e instanceof ArrayBuffer||"ArrayBuffer"===e?.constructor?.name&&"number"==typeof e?.byteLength}Qm.subscribe=function(e,t,n){return new ey.EventIterator((({push:n})=>(this.addEventListener(e,n,t),()=>this.removeEventListener(e,n,t))),n)},Qm.default=ey.EventIterator;var ry=(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 ty((({push:t,stop:n,fail:r})=>{const s=e=>{let n=null;"string"==typeof e.data&&(n=Dt(e.data)),ny(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 ny(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:Ym(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}},sy=WebSocket;const iy={"http:":"ws:","https:":"wss:"};function oy(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(iy))n.protocol===e&&(n.protocol=t);return n})(e,"undefined"==typeof window?void 0:window.location),r=new sy(n.toString(),t.websocket);return ry(r,t)}var ay=Lr((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 cy="object"==typeof window&&"object"==typeof document&&9===document.nodeType,ly=ay(),uy=cy&&!ly,hy=ly&&!cy,dy=ly&&cy,py=void 0!==globalThis.process&&void 0!==globalThis.process.release&&"node"===globalThis.process.release.name&&!ly,fy="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 gy="undefined"!=typeof navigator&&"ReactNative"===navigator.product,my=Wy("dns4"),yy=Wy("dns6"),wy=Wy("dnsaddr"),by=zy(Wy("dns"),wy,my,yy),vy=zy(Wy("ip4"),Wy("ip6")),Ey=zy(Hy(vy,Wy("tcp")),Hy(by,Wy("tcp"))),Sy=Hy(vy,Wy("udp")),_y=Hy(Sy,Wy("utp")),Iy=Hy(Sy,Wy("quic")),Ry=Hy(Sy,Wy("quic-v1")),Ay=zy(Hy(Ey,Wy("ws")),Hy(by,Wy("ws"))),Ty=zy(Hy(Ay,Wy("p2p")),Ay),Dy=zy(Hy(Ey,Wy("wss")),Hy(by,Wy("wss")),Hy(Ey,Wy("tls"),Wy("ws")),Hy(by,Wy("tls"),Wy("ws"))),ky=zy(Hy(Dy,Wy("p2p")),Dy),Py=zy(Hy(Ey,Wy("http")),Hy(vy,Wy("http")),Hy(by,Wy("http"))),Cy=zy(Hy(Ey,Wy("https")),Hy(vy,Wy("https")),Hy(by,Wy("https"))),xy=Hy(Sy,Wy("webrtc-direct"),Wy("certhash")),Ny=zy(Hy(xy,Wy("p2p")),xy),My=Hy(Ry,Wy("webtransport"),Wy("certhash"),Wy("certhash")),Oy=zy(Hy(My,Wy("p2p")),My),Ly=zy(Hy(Ty,Wy("p2p-webrtc-star"),Wy("p2p")),Hy(ky,Wy("p2p-webrtc-star"),Wy("p2p")),Hy(Ty,Wy("p2p-webrtc-star")),Hy(ky,Wy("p2p-webrtc-star"))),By=zy(Hy(Py,Wy("p2p-webrtc-direct"),Wy("p2p")),Hy(Cy,Wy("p2p-webrtc-direct"),Wy("p2p")),Hy(Py,Wy("p2p-webrtc-direct")),Hy(Cy,Wy("p2p-webrtc-direct"))),Uy=zy(Ay,Dy,Py,Cy,Ly,By,Ey,_y,Iy,by,Ny,Oy),Fy=zy(Hy(Uy,Wy("p2p")),Ly,By,Ny,Oy,Wy("p2p")),Vy=zy(Hy(Fy,Wy("p2p-circuit"),Fy),Hy(Fy,Wy("p2p-circuit")),Hy(Wy("p2p-circuit"),Fy),Hy(Uy,Wy("p2p-circuit")),Hy(Wy("p2p-circuit"),Uy),Wy("p2p-circuit")),Ky=()=>zy(Hy(Vy,Ky),Vy),$y=Ky();function qy(e){return function(t){let n;try{n=ar(t)}catch(e){return!1}const r=e(n.protoNames());return null!==r&&(!0===r||!1===r?r:0===r.length)}}function Hy(...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:qy(t),partialMatch:t}}function zy(...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:qy(t),partialMatch:t}}function Wy(e){const t=e;return{toString:function(){return t},matches:function(e){let n;try{n=ar(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}[un]=!0;[Symbol.toStringTag]="@libp2p/websockets";[En]=["@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 pn("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 dn;const n=e.toOptions();this.log("dialing %s:%s",n.host,n.port);const r=cr(),s=oy(function(e,t){const n=ar(e).stringTuples(),r=n.pop();if(void 0===r)throw new Error("Unexpected end of multiaddr");const s=Un(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 qm.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 pn(`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 dn),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):uy||fy?function(e){return e.filter((e=>{if(e.protoCodes().includes(290))return!1;const t=e.decapsulateCode(421);return ky.matches(t)}))}(e):function(e){return e.filter((e=>{if(e.protoCodes().includes(290))return!1;const t=e.decapsulateCode(421);return Ty.matches(t)||ky.matches(t)}))}(e)}dialFilter(e){return this.listenFilter(e)}}function Gy(e={}){return t=>new jy(t,e)}var Yy;!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"}(Yy||(Yy={}));var Qy=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))},Jy=function(e,t,n){this.name=e,this.version=t,this.os=n,this.type="browser"},Zy=function(e){this.version=e,this.type="node",this.name="node",this.os=process.platform},Xy=function(e,t,n,r){this.name=e,this.version=t,this.os=n,this.bot=r,this.type="bot-device"},ew=function(){this.type="bot",this.bot=!0,this.name="bot",this.version=null,this.os=null},tw=function(){this.type="react-native",this.name="react-native",this.version=null,this.os=null},nw=/(nuhk|curl|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask\ Jeeves\/Teoma|ia_archiver)/,rw=3,sw=[["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/]],iw=[["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 ow="undefined"==typeof document&&"undefined"!=typeof navigator&&"ReactNative"===navigator.product?new tw:"undefined"!=typeof navigator?function(e){var t=function(e){return""!==e&&sw.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 ew;var s=r[1]&&r[1].split(".").join("_").split("_").slice(0,3);s?s.length<rw&&(s=Qy(Qy([],s,!0),function(e){for(var t=[],n=0;n<e;n++)t.push("0");return t}(rw-s.length),!0)):s=[];var i=s.join("."),o=function(e){for(var t=0,n=iw.length;t<n;t++){var r=iw[t],s=r[0];if(r[1].exec(e))return s}return null}(e),a=nw.exec(e);return a&&a[1]?new Xy(n,i,o,a[1]):new Jy(n,i,o)}(navigator.userAgent):function(){var e="undefined"!=typeof process&&process.version;return e?new Zy(process.version.slice(1)):null}(),aw=null!=ow&&"firefox"===ow.name,cw=async function*(){},lw=async e=>{};class uw{log;peerConnection;remoteAddr;timeline;metrics;source=cw();sink=lw;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 hw=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 dw(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}=hw(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=Th(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 pw;!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=()=>zt(t)}(e.Flag||(e.Flag={})),e.codec=()=>(null==n&&(n=Wt(((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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(pw||(pw={}));class fw extends Nm{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 Th(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=dr(),this.bufferedAmountLowEventTimeout=e.bufferedAmountLowEventTimeout??3e4,this.maxBufferedAmount=e.maxBufferedAmount??16777216,this.maxMessageSize=(e.maxMessageSize??16384)-5-2,this.receiveFinAck=cr(),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 pn("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 $r(this.incomingData)){const t=n.processIncomingProtobuf(e);null!=t&&n.sourcePush(new _r(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 dw(this.channel,"bufferedamountlow",{timeout:this.bufferedAmountLowEventTimeout})}catch(e){if(e instanceof _h)throw new pn(`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 pn(`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 dw(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=pw.encode({message:n}),s=Mr.single(r);await this._sendMessage(s),e.consume(t)}}async sendReset(){await this._sendFlag(pw.Flag.RESET)}async sendCloseWrite(e){if(await this._sendFlag(pw.Flag.FIN)){this.log.trace("awaiting FIN_ACK");try{await Rr(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(pw.Flag.STOP_SENDING)}processIncomingProtobuf(e){const t=pw.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===pw.Flag.FIN&&(this.remoteCloseWrite(),this.log.trace("sending FIN_ACK"),this._sendFlag(pw.Flag.FIN_ACK).catch((e=>{this.log.error("error sending FIN_ACK immediately",e)}))),t.flag===pw.Flag.RESET&&this.reset(),t.flag===pw.Flag.STOP_SENDING&&this.remoteCloseRead(),t.flag===pw.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=pw.encode({flag:e}),n=Mr.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 gw(e){const{channel:t,direction:n}=e;return new fw({id:"inbound"===n?`i${t.id}`:`r${t.id}`,log:e.logger.forComponent(`libp2p:webrtc:stream:${n}:${t.id}`),...e})}const mw="/webrtc";class yw{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??mw,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=gw({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 ww(this.components,{...e,peerConnection:this.peerConnection,dataChannelOptions:this.dataChannelOptions,metrics:this.metrics,streams:this.bufferedStreams,protocol:this.protocol})}}class ww{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??mw,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=gw({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=cr();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 Th(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=cw();sink=lw;newStream(){const e=this.peerConnection.createDataChannel("");this.log.trace("opened outgoing datachannel with channel id %s",e.id);const t=gw({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 bw=globalThis.RTCPeerConnection,vw=globalThis.RTCSessionDescription,Ew=globalThis.RTCIceCandidate;function Sw(e,t){const n=Cr(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 _w;!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=()=>zt(t)}(e.Type||(e.Type={})),e.codec=()=>(null==n&&(n=Wt(((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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(_w||(_w={}));const Iw=async(e,t,n)=>{try{const r=cr();for(!function(e,t){e[aw?"oniceconnectionstatechange":"onconnectionstatechange"]=n=>{switch(function(e){return aw?e.iceConnectionState:e.connectionState}(e)){case"connected":t.resolve();break;case"failed":case"disconnected":case"closed":t.reject(new pn("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!==_w.Type.ICE_CANDIDATE)throw new pn("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 Ew(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 Rw({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(Tw+"/");if(2!==t.length)throw new pn("webrtc protocol was not present in multiaddr",Yy.ERR_INVALID_MULTIADDR);if(!t[0].includes(Dw))throw new pn("p2p-circuit protocol was not present in multiaddr",Yy.ERR_INVALID_MULTIADDR);let n=ar(t[0]);const r=ar("/"+t[1]).getPeerId();if(null==r)throw new pn("destination peer id was missing",Yy.ERR_INVALID_MULTIADDR);const s=n.protos().pop();if(void 0===s)throw new pn("invalid multiaddr",Yy.ERR_INVALID_MULTIADDR);"p2p"!==s.name&&(n=n.encapsulate(`/p2p/${r}`));return{baseAddr:n,peerId:vs(r)}}(s);r?.dialerEvents.increment({open:!0}),a.trace("dialing base address: %a",l);const u=l.getPeerId();if(null==u)throw new pn("Relay peer was missing","ERR_INVALID_ADDRESS");const h=i.getConnections(vs(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(kw,{signal:n,runOnTransientConnection:!0}),i=Sw(r).pb(_w),o=new bw(e),l=new yw({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:_w.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 pn("Failed to set createOffer","ERR_SDP_HANDSHAKE_FAILED")}));a.trace("initiator send SDP offer %s",t.sdp),await i.write({type:_w.Type.SDP_OFFER,data:t.sdp},{signal:n}),await o.setLocalDescription(t).catch((e=>{throw a.error("could not execute setLocalDescription",e),new pn("Failed to set localDescription","ERR_SDP_HANDSHAKE_FAILED")}));const c=await i.read({signal:n});if(c.type!==_w.Type.SDP_ANSWER)throw new pn("Remote should send an SDP answer","ERR_SDP_HANDSHAKE_FAILED");a.trace("initiator receive SDP answer %s",c.data);const u=new vw({type:"answer",sdp:c.data});return await o.setRemoteDescription(u).catch((e=>{throw a.error("could not execute setRemoteDescription",e),new pn("Failed to set remoteDescription","ERR_SDP_HANDSHAKE_FAILED")})),a.trace("initiator read candidates until connected"),await Iw(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 Aw extends yn{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=>$y.matches(e))).map((e=>e.encapsulate(`/webrtc/p2p/${this.peerId}`))))).flat()}async close(){this.shutdownController.abort(),this.safeDispatchEvent("close",{})}}const Tw="/webrtc",Dw="/p2p-circuit",kw="/webrtc-signaling/0.0.1";class Pw{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"})})}[un]=!0;[Symbol.toStringTag]="@libp2p/webrtc";[En]=["@libp2p/transport"];[Sn]=["@libp2p/identify","@libp2p/circuit-relay-v2-transport"];isStarted(){return this._started}async start(){await this.components.registrar.handle(kw,(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(kw),this._started=!1}createListener(e){return new Aw(this.components,{shutdownController:this.shutdownController})}listenFilter(e){return e.filter(Dp.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 Rw({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 uw(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 bw("function"==typeof this.init.rtcConfiguration?await this.init.rtcConfiguration():this.init.rtcConfiguration),s=new yw(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=Sw(t).pb(_w);try{e.onicecandidate=({candidate:e})=>{const t=JSON.stringify(e?.toJSON()??null);s.trace("recipient sending ICE candidate %s",t),i.write({type:_w.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!==_w.Type.SDP_OFFER)throw new pn(`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 vw({type:"offer",sdp:t.data});await e.setRemoteDescription(r).catch((e=>{throw s.error("could not execute setRemoteDescription",e),new pn("Failed to set remoteDescription","ERR_SDP_HANDSHAKE_FAILED")}));const o=await e.createAnswer().catch((e=>{throw s.error("could not execute createAnswer",e),new pn("Failed to create answer","ERR_SDP_HANDSHAKE_FAILED")}));s.trace("recipient send SDP answer %s",o.sdp),await i.write({type:_w.Type.SDP_ANSWER,data:o.sdp},{signal:n}),await e.setLocalDescription(o).catch((e=>{throw s.error("could not execute setLocalDescription",e),new pn("Failed to set localDescription","ERR_SDP_HANDSHAKE_FAILED")})),s.trace("recipient read candidates until connected"),await Iw(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=ar(`/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 uw(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 Cw;function xw(e,t){if(Tp.matches(e))return!1;return null!=t.dialTransportForMultiaddr(e)&&(!!lp.matches(e)||!!pp.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=()=>zt(t)}(e.Type||(e.Type={})),e.codec=()=>(null==n&&(n=Wt(((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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(Cw||(Cw={}));const Nw=5e3,Mw=3,Ow=1,Lw=1;class Bw{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??Nw,this.retries=t.retries??Mw,this.maxInboundStreams=t.maxInboundStreams??Ow,this.maxOutboundStreams=t.maxOutboundStreams??Lw}[Symbol.toStringTag]="@libp2p/dcutr";[Sn]=["@libp2p/identify"];isStarted(){return this.started}async start(){this.started||(this.topologyId=await this.registrar.register(Uw,{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(Uw,(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(Uw),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([Uw],{signal:r.signal,runOnTransientConnection:!0});const n=Sw(t,{maxDataLength:4096}).pb(Cw);this.log("B sending connect to %p",e.remotePeer);const s=Date.now();await n.write({type:Cw.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!==Cw.Type.CONNECT)throw this.log("A sent wrong message type"),new pn("DCUtR message type was incorrect",mn);const o=this.getDialableMultiaddrs(i.observedAddresses);if(0===o.length)throw this.log("A did not have any dialable multiaddrs"),new pn("DCUtR connect message had no multiaddrs",mn);const a=Date.now()-s;this.log("A sending sync, rtt %dms",a),await n.write({type:Cw.Type.SYNC,observedAddresses:[]},r),this.log("A waiting for half RTT"),await cf(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=>xw(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=Sw(e,{maxDataLength:4096}).pb(Cw);this.log("A receiving connect");const s=await r.read(n);if(s.type!==Cw.Type.CONNECT)throw this.log("B sent wrong message type"),new pn("DCUtR message type was incorrect",mn);if(0===s.observedAddresses.length)throw this.log("B sent no multiaddrs"),new pn("DCUtR connect message had no multiaddrs",mn);const i=this.getDialableMultiaddrs(s.observedAddresses);if(0===i.length)throw this.log("B had no dialable multiaddrs"),new pn("DCUtR connect message had no dialable multiaddrs",mn);this.log("A sending connect"),await r.write({type:Cw.Type.CONNECT,observedAddresses:this.addressManager.getAddresses().map((e=>e.bytes))}),this.log("A receiving sync");if((await r.read(n)).type!==Cw.Type.SYNC)throw new pn("DCUtR message type was incorrect",mn);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=ar(n);if(!xw(e,this.transportManager))continue;t.push(e)}catch{}return t}}const Uw="/libp2p/dcutr";function Fw(e={}){return t=>new Bw(t,e)}const Vw="ERR_INVALID_FRAME",Kw="ERR_UNREQUESTED_PING",$w="ERR_NOT_MATCHING_PING",qw="ERR_STREAM_ALREADY_EXISTS",Hw="ERR_DECODE_INVALID_VERSION",zw="ERR_BOTH_CLIENTS",Ww="ERR_RECV_WINDOW_EXCEEDED",jw=new Set([Vw,Kw,$w,qw,Hw,zw,Ww]),Gw="ERR_INVALID_CONFIG",Yw="ERR_MUXER_LOCAL_CLOSED",Qw="ERR_MUXER_REMOTE_CLOSED",Jw=262144,Zw={enableKeepAlive:!0,keepAliveInterval:3e4,maxInboundStreams:1e3,maxOutboundStreams:1e3,initialStreamWindowSize:Jw,maxStreamWindowSize:16777216,maxMessageSize:65536};var Xw,eb;!function(e){e[e.Data=0]="Data",e[e.WindowUpdate=1]="WindowUpdate",e[e.Ping=2]="Ping",e[e.GoAway=3]="GoAway"}(Xw||(Xw={})),function(e){e[e.SYN=1]="SYN",e[e.ACK=2]="ACK",e[e.FIN=4]="FIN",e[e.RST=8]="RST"}(eb||(eb={})),Object.values(eb).filter((e=>"string"!=typeof e));var tb;!function(e){e[e.NormalTermination=0]="NormalTermination",e[e.ProtocolError=1]="ProtocolError",e[e.InternalError=2]="InternalError"}(tb||(tb={}));const nb=2**24;class rb{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 _r,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===Xw.Data?(this.frameInProgress=!0,yield{header:e,readData:this.readBytes.bind(this,n)}):yield{header:e}}}readHeader(){if(this.frameInProgress)throw new pn("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 pn("Invalid frame version",Hw);return{type:e[1],flag:(e[2]<<8)+e[3],streamID:e[4]*nb+(e[5]<<16)+(e[6]<<8)+e[7],length:e[8]*nb+(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 sb(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 ib(e){return null!=e?.then}function ob(e,t){let n=0;if(null!=e[Symbol.asyncIterator])return async function*(){for await(const r of e){const e=t(r,n++);ib(e)&&await e,yield r}}();const r=qr(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++);ib(r)&&await r,yield e}}();const a=t;return function*(){yield s;for(const e of r)a(e,n++),yield e}()}var ab;!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"}(ab||(ab={}));class cb extends Nm{name;state;config;_id;sendWindowCapacity;sendWindowCapacityUpdate;recvWindow;recvWindowCapacity;epochStart;getRTT;sendFrame;constructor(e){super({...e,onEnd:t=>{this.state=ab.Finished,e.onEnd?.(t)}}),this.config=e.config,this._id=parseInt(e.id,10),this.name=e.name,this.state=e.state,this.sendWindowCapacity=Jw,this.recvWindow=this.config.initialStreamWindowSize,this.recvWindowCapacity=this.recvWindow,this.epochStart=Date.now(),this.getRTT=e.getRTT,this.sendFrame=e.sendFrame,this.source=ob(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:Xw.Data,flag:r,streamID:this._id,length:n},e.sublist(0,n)),this.sendWindowCapacity-=n,e.consume(n)}}async sendReset(){this.sendFrame({type:Xw.WindowUpdate,flag:eb.RST,streamID:this._id,length:0})}async sendCloseWrite(){const e=this.getSendFlags()|eb.FIN;this.sendFrame({type:Xw.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 pn("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 pn("receive window exceeded",Ww,{available:this.recvWindowCapacity,recv:e.length});const n=await t();this.recvWindowCapacity-=e.length,this.sourcePush(n)}processFlags(e){(e&eb.ACK)===eb.ACK&&this.state===ab.SYNSent&&(this.state=ab.Established),(e&eb.FIN)===eb.FIN&&this.remoteCloseWrite(),(e&eb.RST)===eb.RST&&this.reset()}getSendFlags(){switch(this.state){case ab.Init:return this.state=ab.SYNSent,eb.SYN;case ab.SYNReceived:return this.state=ab.Established,eb.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:Xw.WindowUpdate,flag:e,streamID:this._id,length:r})}}const lb="/yamux/1.0.0";class ub{protocol=lb;_components;_init;constructor(e,t={}){this._components=e,this._init=t}createStreamMuxer(e){return new hb(this._components,{...this._init,...e})}}class hb{protocol=lb;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={...Zw,...t},this.logger=e.logger,this.log=this.logger.forComponent("libp2p:yamux"),function(e){if(e.keepAliveInterval<=0)throw new pn("keep-alive interval must be positive",Gw);if(e.maxInboundStreams<0)throw new pn("max inbound streams must be larger or equal 0",Gw);if(e.maxOutboundStreams<0)throw new pn("max outbound streams must be larger or equal 0",Gw);if(e.initialStreamWindowSize<Jw)throw new pn("InitialStreamWindowSize must be larger or equal 256 kB",Gw);if(e.maxStreamWindowSize<e.initialStreamWindowSize)throw new pn("MaxStreamWindowSize must be larger than the InitialStreamWindowSize",Gw);if(e.maxStreamWindowSize>2**32-1)throw new pn("MaxStreamWindowSize must be less than equal MAX_UINT32",Gw);if(e.maxMessageSize<1024)throw new pn("MaxMessageSize must be greater than a kilobyte",Gw)}(this.config),this.closeController=new AbortController,this.closeController.signal,this.onIncomingStream=t.onIncomingStream,this.onStreamEnd=t.onStreamEnd,this._streams=new Map,this.source=dr({onEnd:()=>{this.log?.trace("muxer source ended"),this._streams.forEach((e=>{e.destroy()}))}}),this.sink=async e=>{const t=()=>{const t=Cm(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 rb(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=tb.NormalTermination}catch(e){const t=e.code;jw.has(t)?(this.log?.error("protocol error in sink",e),n=tb.ProtocolError):(this.log?.error("internal error in sink",e),n=tb.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 pn("muxer closed remotely",Qw);if(void 0!==this.localGoAway)throw new pn("muxer closed locally",Yw);const t=this.nextStreamID;if(this.nextStreamID+=2,this.numOutboundStreams>=this.config.maxOutboundStreams)throw new pn("max outbound streams exceeded","ERROR_MAX_OUTBOUND_STREAMS_EXCEEDED");this.log?.trace("new outgoing stream id=%s",t);const n=this._newStream(t,e,ab.Init,"outbound");return this._streams.set(t,n),this.numOutboundStreams++,n.sendWindowUpdate(),n}async ping(){if(void 0!==this.remoteGoAway)throw new pn("muxer closed remotely",Qw);if(void 0!==this.localGoAway)throw new pn("muxer closed locally",Yw);if(void 0===this.activePing){let e=()=>{};this.activePing={id:this.nextPingID++,promise:new Promise(((t,n)=>{const r=()=>{n(new pn("muxer closed locally",Yw))};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??tb.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??tb.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 pn("Stream already exists",qw,{id:e});const s=new cb({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 Xw.Ping:return void this.handlePing(e);case Xw.GoAway:return void this.handleGoAway(s);default:throw new pn("Invalid frame type",Vw,{header:e})}else switch(e.type){case Xw.Data:case Xw.WindowUpdate:return void await this.handleStreamMessage(e,t);default:throw new pn("Invalid frame type",Vw,{header:e})}}handlePing(e){if(e.flag===eb.SYN)this.log?.trace("received ping request pingId=%s",e.length),this.sendPing(e.length,eb.ACK);else{if(e.flag!==eb.ACK)throw new pn("Invalid frame flag",Vw,{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 pn("ping not requested",Kw);if(this.activePing.id!==e)throw new pn("ping doesn't match our id",$w);this.activePing.resolve()}handleGoAway(e){this.log?.trace("received GoAway reason=%s",tb[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&eb.SYN)===eb.SYN&&this.incomingStream(n);const i=this._streams.get(n);if(void 0!==i)switch(s){case Xw.WindowUpdate:return void i.handleWindowUpdate(e);case Xw.Data:if(void 0===t)throw new Error("unreachable");return void await i.handleData(e,t);default:throw new Error("unreachable")}else if(s===Xw.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 pn("both endpoints are clients",zw);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:Xw.WindowUpdate,flag:eb.RST,streamID:e,length:0});if(this.numInboundStreams>=this.config.maxInboundStreams)return this.log?.("maxIncomingStreams exceeded, forcing stream reset"),void this.sendFrame({type:Xw.WindowUpdate,flag:eb.RST,streamID:e,length:0});const t=this._newStream(e,void 0,ab.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===Xw.Data){if(void 0===t)throw new pn("invalid frame",Vw);this.source.push(new _r(sb(e),t))}else this.source.push(sb(e))}sendPing(e,t=eb.SYN){t===eb.SYN?this.log?.trace("sending ping request pingId=%s",e):this.log?.trace("sending ping response pingId=%s",e),this.sendFrame({type:Xw.Ping,flag:t,streamID:0,length:e})}sendGoAway(e=tb.NormalTermination){this.log?.("sending GoAway reason=%s",tb[e]),this.localGoAway=e,this.sendFrame({type:Xw.GoAway,flag:0,streamID:0,length:e})}}function db(e={}){return t=>new ub(t,e)}function pb(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 fb;!function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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:pb(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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(fb||(fb={}));class gb extends yn{[nn]=!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=fb.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=fb.decode(t.data);Ss(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=>ar(e)))}}))})).catch((e=>{this.log.error(e)}))}}function mb(e={}){return t=>new gb(t,e)}const yb="circuit-relay-relay";BigInt(1<<17);const wb="/libp2p/circuit/relay/0.2.0/hop",bb="/libp2p/circuit/relay/0.2.0/stop",vb="ERR_RELAYED_DIAL";var Eb,Sb,_b,Ib,Rb,Ab,Tb,Db;function kb(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=()=>zt(t)}(e.Type||(e.Type={})),e.codec=()=>(null==n&&(n=Wt(((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),_b.codec().encode(t.peer,n)),null!=t.reservation&&(n.uint32(26),Ib.codec().encode(t.reservation,n)),null!=t.limit&&(n.uint32(34),Rb.codec().encode(t.limit,n)),null!=t.status&&(n.uint32(40),Ab.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=_b.codec().decode(t,t.uint32());break;case 3:r.reservation=Ib.codec().decode(t,t.uint32());break;case 4:r.limit=Rb.codec().decode(t,t.uint32());break;case 5:r.status=Ab.codec().decode(t);break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(Eb||(Eb={})),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=()=>zt(t)}(e.Type||(e.Type={})),e.codec=()=>(null==n&&(n=Wt(((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),_b.codec().encode(t.peer,n)),null!=t.limit&&(n.uint32(26),Rb.codec().encode(t.limit,n)),null!=t.status&&(n.uint32(32),Ab.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=_b.codec().decode(t,t.uint32());break;case 3:r.limit=Rb.codec().decode(t,t.uint32());break;case 4:r.status=Ab.codec().decode(t);break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(Sb||(Sb={})),function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(_b||(_b={})),function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(Ib||(Ib={})),function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(Rb||(Rb={})),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"}(Ab||(Ab={})),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"}(Tb||(Tb={})),function(e){e.codec=()=>zt(Tb)}(Ab||(Ab={})),function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(Db||(Db={}));class Pb extends yn{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(wb,{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(wb)],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 ft.digest(t);return wt.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 Cb extends yn{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 $h,this.maxDiscoveredRelays=t?.discoverRelays??0,this.maxReservationQueueLength=t?.maxReservationQueueLength??100,this.reservationCompletionTimeout=t?.reservationCompletionTimeout??1e4,this.started=!1,this.reserveQueue=new yf({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(kb(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=kb(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:{[yb]:{value:1,ttl:o}}}),await this.transportManager.listen([ar(`/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(wb,t),r=Sw(n).pb(Eb);let s;await r.write({type:Eb.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===Ab.OK&&null!=s.reservation){let t=!1;const n=e.remoteAddr.bytes;for(const e of s.reservation.addrs)if(_n(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 xb(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 Nb extends yn{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 $h,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 pn("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=>ar(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 Mb=300,Ob=300,Lb=3e4;class Bb{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??Mb,this.maxOutboundStopStreams=t.maxOutboundStopStreams??Ob,this.stopTimeout=t.stopTimeout??Lb,null!=t.discoverRelays&&t.discoverRelays>0&&(this.discovery=new Pb(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 Cb(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(bb,(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(bb),this.started=!1}[un]=!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 pn(t,vb)}const n=e.toString().split("/p2p-circuit"),r=ar(n[0]),s=ar(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 pn(t,vb)}const a=vs(i),c=vs(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(wb),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=Sw(e),o=t.pb(Eb);await o.write({type:Eb.Type.CONNECT,peer:{id:n.toBytes(),addrs:[ar(r).bytes]}});const a=await o.read();if(a.status!==Ab.OK)throw new pn(`failed to connect via relay with status ${a?.status?.toString()??"undefined"}`,"ERR_HOP_REQUEST_FAILED");const c=xb({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 Nb(e)}({connectionManager:this.connectionManager,relayStore:this.reservationStore,logger:this.logger})}listenFilter(e){return(e=Array.isArray(e)?e:[e]).filter((e=>$y.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=Sw(t).pb(Sb),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:Sb.Type.STATUS,status:Ab.MALFORMED_MESSAGE},{signal:n}),void await t.close();if(s.type!==Sb.Type.CONNECT)return this.log.error("invalid stop connect request via peer %p",e.remotePeer),await r.write({type:Sb.Type.STATUS,status:Ab.UNEXPECTED_MESSAGE},{signal:n}),void await t.close();if(!(e=>{if(null==e.peer)return!1;try{e.peer.addrs.forEach(ar)}catch{return!1}return!0})(s))return this.log.error("invalid stop connect request via peer %p",e.remotePeer),await r.write({type:Sb.Type.STATUS,status:Ab.MALFORMED_MESSAGE},{signal:n}),void await t.close();const i=Es(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:Sb.Type.STATUS,status:Ab.PERMISSION_DENIED},{signal:n}),void await t.close();this.log.trace("sending success response to %p",e.remotePeer),await r.write({type:Sb.Type.STATUS,status:Ab.OK},{signal:n});const o=e.remoteAddr.encapsulate(`/p2p-circuit/p2p/${i.toString()}`),a=this.addressManager.getAddresses()[0],c=xb({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 Ub(e={}){return t=>new Bb(t,e)}const Fb="/floodsub/1.0.0",Vb="/meshsub/1.0.0",Kb="/meshsub/1.1.0",$b=5e3,qb={maxSubscriptions:1/0,maxMessages:1/0,maxIhaveMessageIDs:1/0,maxIwantMessageIDs:1/0,maxControlMessages:1/0,maxPeerInfos:1/0};var Hb,zb,Wb,jb,Gb,Yb,Qb,Jb,Zb,Xb,ev,tv;!function(e){let t;!function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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=>$t(t,e.codec()),e.decode=(t,n)=>j(t,e.codec(),n)}(e.SubOpts||(e.SubOpts={})),function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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=>$t(t,e.codec()),e.decode=(t,n)=>j(t,e.codec(),n)}(e.Message||(e.Message={})),function(t){let n;t.codec=()=>(null==n&&(n=Wt(((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 jt('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 jt('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 jt('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 jt('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=>$t(e,t.codec()),t.decode=(e,n)=>j(e,t.codec(),n)}(e.ControlMessage||(e.ControlMessage={})),function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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 jt('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=>$t(t,e.codec()),e.decode=(t,n)=>j(t,e.codec(),n)}(e.ControlIHave||(e.ControlIHave={})),function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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 jt('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=>$t(t,e.codec()),e.decode=(t,n)=>j(t,e.codec(),n)}(e.ControlIWant||(e.ControlIWant={})),function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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=>$t(t,e.codec()),e.decode=(t,n)=>j(t,e.codec(),n)}(e.ControlGraft||(e.ControlGraft={})),function(t){let n;t.codec=()=>(null==n&&(n=Wt(((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 jt('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=>$t(e,t.codec()),t.decode=(e,n)=>j(e,t.codec(),n)}(e.ControlPrune||(e.ControlPrune={})),function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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=>$t(t,e.codec()),e.decode=(t,n)=>j(t,e.codec(),n)}(e.PeerInfo||(e.PeerInfo={})),e.codec=()=>(null==t&&(t=Wt(((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 jt('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 jt('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=>$t(t,e.codec()),e.decode=(t,n)=>j(t,e.codec(),n)}(Hb||(Hb={}));class nv{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 rv(e){switch(e){case ln.Ignore:return jb.Ignore;case ln.Reject:return jb.Reject;default:throw new Error("Unreachable")}}!function(e){e.StrictSign="StrictSign",e.StrictNoSign="StrictNoSign"}(zb||(zb={})),function(e){e[e.Signing=0]="Signing",e[e.Anonymous=1]="Anonymous"}(Wb||(Wb={})),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"}(Gb||(Gb={})),function(e){e.duplicate="duplicate",e.invalid="invalid",e.valid="valid"}(Yb||(Yb={})),function(e){e.forward="forward",e.publish="publish"}(Qb||(Qb={})),function(e){e.Fanout="fanout",e.Random="random",e.Subscribed="subscribed",e.Outbound="outbound",e.NotEnough="not_enough",e.Opportunistic="opportunistic"}(Jb||(Jb={})),function(e){e.Dc="disconnected",e.BadScore="bad_score",e.Prune="prune",e.Excess="excess"}(Zb||(Zb={})),function(e){e.GraftBackoff="graft_backoff",e.BrokenPromise="broken_promise",e.MessageDeficit="message_deficit",e.IPColocation="IP_colocation"}(Xb||(Xb={})),function(e){e.LowScore="low_score",e.MaxIhave="max_ihave",e.MaxIasked="max_iasked"}(ev||(ev={})),function(e){e.graylist="graylist",e.publish="publish",e.gossip="gossip",e.mesh="mesh"}(tv||(tv={}));const sv="ERR_INVALID_PEER_SCORE_PARAMS",iv={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},ov={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 av(e={}){return{...iv,...e,topics:null!=e.topics?Object.entries(e.topics).reduce(((e,[t,n])=>(e[t]=function(e={}){return{...ov,...e}}(n),e)),{}):{}}}function cv(e){if(e.topicWeight<0)throw new pn("invalid topic weight; must be >= 0",sv);if(0===e.timeInMeshQuantum)throw new pn("invalid TimeInMeshQuantum; must be non zero",sv);if(e.timeInMeshWeight<0)throw new pn("invalid TimeInMeshWeight; must be positive (or 0 to disable)",sv);if(0!==e.timeInMeshWeight&&e.timeInMeshQuantum<=0)throw new pn("invalid TimeInMeshQuantum; must be positive",sv);if(0!==e.timeInMeshWeight&&e.timeInMeshCap<=0)throw new pn("invalid TimeInMeshCap; must be positive",sv);if(e.firstMessageDeliveriesWeight<0)throw new pn("invallid FirstMessageDeliveriesWeight; must be positive (or 0 to disable)",sv);if(0!==e.firstMessageDeliveriesWeight&&(e.firstMessageDeliveriesDecay<=0||e.firstMessageDeliveriesDecay>=1))throw new pn("invalid FirstMessageDeliveriesDecay; must be between 0 and 1",sv);if(0!==e.firstMessageDeliveriesWeight&&e.firstMessageDeliveriesCap<=0)throw new pn("invalid FirstMessageDeliveriesCap; must be positive",sv);if(e.meshMessageDeliveriesWeight>0)throw new pn("invalid MeshMessageDeliveriesWeight; must be negative (or 0 to disable)",sv);if(0!==e.meshMessageDeliveriesWeight&&(e.meshMessageDeliveriesDecay<=0||e.meshMessageDeliveriesDecay>=1))throw new pn("invalid MeshMessageDeliveriesDecay; must be between 0 and 1",sv);if(0!==e.meshMessageDeliveriesWeight&&e.meshMessageDeliveriesCap<=0)throw new pn("invalid MeshMessageDeliveriesCap; must be positive",sv);if(0!==e.meshMessageDeliveriesWeight&&e.meshMessageDeliveriesThreshold<=0)throw new pn("invalid MeshMessageDeliveriesThreshold; must be positive",sv);if(e.meshMessageDeliveriesWindow<0)throw new pn("invalid MeshMessageDeliveriesWindow; must be non-negative",sv);if(0!==e.meshMessageDeliveriesWeight&&e.meshMessageDeliveriesActivation<1e3)throw new pn("invalid MeshMessageDeliveriesActivation; must be at least 1s",sv);if(e.meshFailurePenaltyWeight>0)throw new pn("invalid MeshFailurePenaltyWeight; must be negative (or 0 to disable)",sv);if(0!==e.meshFailurePenaltyWeight&&(e.meshFailurePenaltyDecay<=0||e.meshFailurePenaltyDecay>=1))throw new pn("invalid MeshFailurePenaltyDecay; must be between 0 and 1",sv);if(e.invalidMessageDeliveriesWeight>0)throw new pn("invalid InvalidMessageDeliveriesWeight; must be negative (or 0 to disable)",sv);if(e.invalidMessageDeliveriesDecay<=0||e.invalidMessageDeliveriesDecay>=1)throw new pn("invalid InvalidMessageDeliveriesDecay; must be between 0 and 1",sv)}const lv={gossipThreshold:-10,publishThreshold:-50,graylistThreshold:-80,acceptPXThreshold:10,opportunisticGraftThreshold:20};function uv(e={}){return{...lv,...e}}function hv(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 dv 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 pv(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 fv(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))}fv.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]}},fv.prototype.get=function(e){return this.peekAt(e)},fv.prototype.peek=function(){if(this._head!==this._tail)return this._list[this._head]},fv.prototype.peekFront=function(){return this.peek()},fv.prototype.peekBack=function(){return this.peekAt(-1)},Object.defineProperty(fv.prototype,"length",{get:function(){return this.size()}}),fv.prototype.size=function(){return this._head===this._tail?0:this._head<this._tail?this._tail-this._head:this._capacityMask+1-(this._head-this._tail)},fv.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)},fv.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}},fv.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)},fv.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}},fv.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}}},fv.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}}},fv.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)}}},fv.prototype.clear=function(){this._list=new Array(this._list.length),this._head=0,this._tail=0},fv.prototype.isEmpty=function(){return this._head===this._tail},fv.prototype.toArray=function(){return this._copyArray(!1)},fv.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]},fv.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},fv.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},fv.prototype._shrinkArray=function(){this._list.length>>>=1,this._capacityMask>>>=1},fv.prototype._nextPowerOf2=function(e){var t=1<<Math.log(e)/Math.log(2)+1;return Math.max(t,4)};var gv,mv=Lr(fv);!function(e){e[e.unknown=0]="unknown",e[e.valid=1]="valid",e[e.invalid=2]="invalid",e[e.ignored=3]="ignored"}(gv||(gv={}));class yv{records;queue;constructor(){this.records=new Map,this.queue=new mv}getRecord(e){return this.records.get(e)}ensureRecord(e){let t=this.records.get(e);if(null!=t)return t;t={status:gv.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 wv{params;metrics;peerStats=new Map;peerIPs=new dv((()=>new Set));scoreCache=new Map;deliveryRecords=new yv;_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{cv(n)}catch(e){throw new pn(`invalid score parameters for topic ${t}: ${e.message}`,sv)}if(e.topicScoreCap<0)throw new pn("invalid topic score cap; must be positive (or 0 for no cap)",sv);if(null===e.appSpecificScore||void 0===e.appSpecificScore)throw new pn("missing application specific score function",sv);if(e.IPColocationFactorWeight>0)throw new pn("invalid IPColocationFactorWeight; must be negative (or 0 to disable)",sv);if(0!==e.IPColocationFactorWeight&&e.IPColocationFactorThreshold<1)throw new pn("invalid IPColocationFactorThreshold; must be at least 1",sv);if(e.behaviourPenaltyWeight>0)throw new pn("invalid BehaviourPenaltyWeight; must be negative (or 0 to disable)",sv);if(0!==e.behaviourPenaltyWeight&&(e.behaviourPenaltyDecay<=0||e.behaviourPenaltyDecay>=1))throw new pn("invalid BehaviourPenaltyDecay; must be between 0 and 1",sv);if(e.decayInterval<1e3)throw new pn("invalid DecayInterval; must be at least 1s",sv);if(e.decayToZero<=0||e.decayToZero>=1)throw new pn("invalid DecayToZero; must be between 0 and 1",sv)}(e),this.scoreCacheValidityMs=r.scoreCacheValidityMs,this.computeScore=r.computeScore??pv,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===gv.unknown?(r.status=gv.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,gv[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===gv.unknown){if(r===jb.Ignore)return s.status=gv.ignored,void s.peers.clear();s.status=gv.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,gv[s.status])}duplicateMessage(e,t,n){const r=this.deliveryRecords.ensureRecord(t);if(!r.peers.has(e))switch(r.status){case gv.unknown:r.peers.add(e);break;case gv.valid:r.peers.add(e),this.markDuplicateMessageDelivery(e,n,r.validated);break;case gv.invalid:this.markInvalidMessageDelivery(e,n);case gv.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 bv(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 vv{rawStream;pushable;closeController;maxBufferSize;constructor(e,t,n){this.rawStream=e,this.pushable=dr(),this.closeController=new AbortController,this.maxBufferSize=n.maxBufferSize??1/0,this.closeController.signal.addEventListener("abort",(()=>{e.close().catch((t=>{e.abort(t)}))})),fr(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(Mr.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 Ev{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=fr(this.rawStream,(e=>$r(e,t)))}async close(){this.closeController.abort()}}class Sv{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 _v=Dt("libp2p-pubsub:");function Iv(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 Rv(e){return void 0===e.control&&(e.control={graft:[],prune:[],ihave:[],iwant:[]}),e}function Av(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 Tv(e){return Yt(e,"base64")}function Dv(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=Dt(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 kv(e){return ft.encode(e.data)}var Pv,Cv;!function(e){e[e.ip4=4]="ip4",e[e.ip6=41]="ip6"}(Pv||(Pv={}));class xv{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"}(Cv||(Cv={}));class Nv extends yn{globalSignaturePolicy;multicodecs=[Kb,Vb];publishConfig;dataTransform;peers=new Set;streamsInbound=new Map;streamsOutbound=new Map;outboundInflightQueue=dr({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=Kb;opts;decodeRpcLimits;metrics;status={code:Cv.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:av(t.scoreParams),scoreThresholds:uv(t.scoreThresholds)};if(this.components=e,this.decodeRpcLimits=n.decodeRpcLimits??qb,this.globalSignaturePolicy=n.globalSignaturePolicy??an,n.fallbackToFloodsub&&this.multicodecs.push(Fb),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 xv({validityMs:n.seenTTL}),this.publishedMessageIds=new xv({validityMs:n.seenTTL}),null!=t.msgIdFn)this.msgIdFn=t.msgIdFn;else switch(this.globalSignaturePolicy){case an:this.msgIdFn=Dv;break;case cn:this.msgIdFn=kv;break;default:throw new Error(`Invalid globalSignaturePolicy: ${this.globalSignaturePolicy}`)}if(null!=t.fastMsgIdFn&&(this.fastMsgIdFn=t.fastMsgIdFn,this.fastMsgIdCache=new xv({validityMs:n.seenTTL})),this.msgIdToStrFn=t.msgIdToStrFn??Tv,this.mcache=t.messageCache??new nv(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 Jb.Fanout:this.meshPeerInclusionEventsFanout.inc({topic:r},n);break;case Jb.Random:this.meshPeerInclusionEventsRandom.inc({topic:r},n);break;case Jb.Subscribed:this.meshPeerInclusionEventsSubscribed.inc({topic:r},n);break;case Jb.Outbound:this.meshPeerInclusionEventsOutbound.inc({topic:r},n);break;case Jb.NotEnough:this.meshPeerInclusionEventsNotEnough.inc({topic:r},n);break;case Jb.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 Zb.Dc:this.meshPeerChurnEventsDisconnected.inc({topic:r},n);break;case Zb.BadScore:this.meshPeerChurnEventsBadScore.inc({topic:r},n);break;case Zb.Prune:this.meshPeerChurnEventsPrune.inc({topic:r},n);break;case Zb.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 ln.Accept:this.acceptedMessagesTotal.inc({topic:n});break;case ln.Ignore:this.ignoredMessagesTotal.inc({topic:n});break;case ln.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 Yb.duplicate:this.prevalidationDuplicateTotal.inc({topic:n});break;case Yb.invalid:this.prevalidationInvalidTotal.inc({topic:n});break;case Yb.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:tv.graylist},n),this.peersByScoreThreshold.set({threshold:tv.publish},r),this.peersByScoreThreshold.set({threshold:tv.gossip},s),this.peersByScoreThreshold.set({threshold:tv.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 Sv(this.opts.gossipsubIWantFollowupMs,this.msgIdToStrFn,this.metrics),this.score=new wv(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=>vs(e)))}isStarted(){return this.status.code===Cv.started}async start(){if(this.isStarted())return;this.log("starting"),this.publishConfig=await async function(e,t){switch(e){case an:{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 Fl(t.privateKey);return{type:Wb.Signing,author:t,key:t.publicKey,privateKey:e}}case cn:return{type:Wb.Anonymous};default:throw new Error(`Unknown signature policy "${e}"`)}}(this.globalSignaturePolicy,this.components.peerId),this.outboundInflightQueue=dr({objectMode:!0}),fr(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:Cv.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!==Cv.started)return;const{registrarTopologyIds:e}=this.status;this.status={code:Cv.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 vv(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===Fb&&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 Ev(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 Pv.ip4:case Pv.ip6:return Fn(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,Zb.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===Cv.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=>vs(e)))}getTopics(){return Array.from(this.subscriptions)}async pipePeerReadStream(e,t){try{await fr(t,(async t=>{for await(const n of t)try{const t=n.subarray(),r=Hb.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 Yb.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 Yb.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 Yb.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 bn("gossipsub:message",{detail:{propagationSource:e,msgId:n.messageId.msgIdStr,msg:n.msg}})),super.dispatchEvent(new bn("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:Yb.duplicate,msgIdStr:r};const s=await async function(e,t){switch(e){case cn:return null!=t.signature?{valid:!1,error:Gb.SignaturePresent}:null!=t.seqno?{valid:!1,error:Gb.SeqnoPresent}:null!=t.key?{valid:!1,error:Gb.FromPresent}:{valid:!0,message:{type:"unsigned",topic:t.topic,data:t.data??new Uint8Array(0)}};case an:{if(null==t.seqno)return{valid:!1,error:Gb.InvalidSeqno};if(8!==t.seqno.length)return{valid:!1,error:Gb.InvalidSeqno};if(null==t.signature)return{valid:!1,error:Gb.InvalidSignature};if(null==t.from)return{valid:!1,error:Gb.InvalidPeerId};let e,n;try{e=Es(t.from)}catch(e){return{valid:!1,error:Gb.InvalidPeerId}}if(null!=t.key){if(n=Bl(t.key),void 0!==e.publicKey&&!_n(n.bytes,e.publicKey))return{valid:!1,error:Gb.InvalidPeerId}}else{if(null==e.publicKey)return{valid:!1,error:Gb.InvalidPeerId};n=Bl(e.publicKey)}const r={from:t.from,data:t.data,seqno:t.seqno,topic:t.topic,signature:void 0,key:void 0},s=In([_v,Hb.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${Yt(t.seqno,"base16")}`),topic:t.topic,signature:t.signature,key:t.key??Ul(n)}}:{valid:!1,error:Gb.InvalidSignature}}default:throw new Error("Unreachable")}}(this.globalSignaturePolicy,t);if(!s.valid)return{code:Yb.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:Yb.invalid,reason:jb.Error,error:Gb.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:Yb.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=ln.Ignore),t="ERR_TOPIC_VALIDATOR_REJECT"===n?ln.Reject:ln.Ignore}if(t!==ln.Accept)return{code:Yb.invalid,reason:rv(t),msgIdStr:a}}return{code:Yb.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,Iv(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:ev.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:ev.MaxIhave}),[];const s=this.iasked.get(e)??0;if(s>=$b)return this.log("IHAVE: peer %s has already advertised too many messages (%d); ignoring",e,s),this.metrics?.ihaveRcvIgnored.inc({reason:ev.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>$b&&(o=$b-s),this.log("IHAVE: Asking for %d out of %d messages from %s",o,i.size,e);let a=Array.from(i.values());return Av(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,Xb.GraftBackoff),i=!1;const r=a+this.opts.graftFloodThreshold-this.opts.pruneBackoff;s<r&&this.score.addPenalty(e,1,Xb.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,Jb.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,Zb.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,Xb.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&&(Av(e),e=e.slice(0,this.opts.prunePeers));const t=[];await Promise.all(e.map((async e=>{if(null==e.peerID)return;const n=Es(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=vs(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!==Cv.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!==Cv.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!==Cv.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,Jb.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,Jb.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!==Cv.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,Iv([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 Wb.Signing:{const s={from:e.author.toBytes(),data:r,seqno:xo(8),topic:t,signature:void 0,key:void 0},i=In([_v,Hb.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${Yt(s.seqno,"base16")}`),topic:t,signature:s.signature,key:s.key}}}case Wb.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=Iv([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 bn("gossipsub:message",{detail:{propagationSource:this.components.peerId,msgId:c,msg:o}})),super.dispatchEvent(new bn("message",{detail:o}))),{recipients:Array.from(u.values()).map((e=>vs(e)))}}sendRpcInBatch(e,t){const n=Hb.encode(t),r=Mr.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===ln.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=rv(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=Iv([],{graft:[{topicID:t}]});this.sendRpc(e,n)}async sendPrune(e,t){const n=Iv([],{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=Hb.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=Rv(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){Rv(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,Iv([],{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,Iv([],{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(Av(n),n.length>$b&&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=Av(Array.from(i)).slice(0,r),i.forEach((t=>{let r=n;n.length>$b&&(r=Av(r.slice()).slice(0,$b)),this.pushGossip(t,{topicID:e,messageIDs:r})}))}flush(){for(const[e,t]of this.gossip.entries())this.gossip.delete(e),this.sendRpc(e,Iv([],{ihave:t}));for(const[e,t]of this.control.entries()){this.control.delete(e);const n=Iv([],{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===Vb)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=vs(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===Cv.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=Av(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,Zb.BadScore),u.set(e,!0))})),i.size<t){const t=function(e,t){return hv(e,t,(()=>!0))}(p,e-i.size);t.forEach((e=>{m(e,Jb.NotEnough)}))}if(i.size>n){let t=Array.from(i);t.sort(((e,t)=>a(t)-a(e))),t=t.slice(0,r).concat(Av(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,Zb.Excess)}))}if(i.size>=t){let e=0;if(i.forEach((t=>{this.outbound.get(t)&&e++})),e<s){hv(p,s-e,(e=>!0===this.outbound.get(e))).forEach((e=>{m(e,Jb.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=hv(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,Jb.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=Av(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 bn("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=Av(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=bv(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(vs(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(vs(t),{tags:{[n]:void 0}}).catch((e=>{this.log.error("Error untagging peer %s with topic %s",t,n,e)}))}}function Mv(e={}){return t=>new Nv(t,e)}var Ov;!function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(Ov||(Ov={}));const Lv={protocolPrefix:"ipfs",timeout:5e3,maxInboundStreams:1,maxOutboundStreams:1,maxObservedAddresses:10,maxMessageSize:8192,runOnConnectionOpen:!0,runOnSelfUpdate:!0,runOnTransientConnection:!0,concurrency:32};async function Bv(e,t,n,r,s){if(n("received identify from %p",r.remotePeer),null==s)throw new pn("message was null or undefined","ERR_INVALID_MESSAGE");const i={};if(s.listenAddrs.length>0&&(i.addresses=s.listenAddrs.map((e=>({isCertified:!1,multiaddr:ar(e)})))),s.protocols.length>0&&(i.protocols=s.protocols),null!=s.publicKey){i.publicKey=s.publicKey;if(!(await Ss(s.publicKey)).equals(r.remotePeer))throw new pn("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,Jh.DOMAIN);let c,l=Jh.createFromProtobuf(a.payload);if(!l.peerId.equals(a.peerId))throw new pn("signing key does not match PeerId in the PeerRecord","ERR_INVALID_SIGNING_KEY");if(!r.remotePeer.equals(l.peerId))throw new pn("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=Jh.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=Dt(s.agentVersion)),null!=s.protocolVersion&&(t.ProtocolVersion=Dt(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=>ar(e))),observedAddr:null==s.observedAddr?void 0:ar(s.observedAddr),protocols:s.protocols,signedPeerRecord:o,connection:r};return t.safeDispatchEvent("peer:identify",{detail:a}),a}class Uv{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??Lv.timeout,this.maxInboundStreams=t.maxInboundStreams??Lv.maxInboundStreams,this.maxOutboundStreams=t.maxOutboundStreams??Lv.maxOutboundStreams,this.maxMessageSize=t.maxMessageSize??Lv.maxMessageSize,this.maxObservedAddresses=t.maxObservedAddresses??Lv.maxObservedAddresses,this.runOnTransientConnection=t.runOnTransientConnection??Lv.runOnTransientConnection,this.host={protocolVersion:`${t.protocolPrefix??Lv.protocolPrefix}/0.1.0`,agentVersion:(n=e.nodeInfo,r=t.agentVersion,null!=r||(r=`${n.name}/${n.version}`,py||hy?r+=` UserAgent=${globalThis.process.version}`:(uy||fy||dy||gy)&&(r+=` UserAgent=${globalThis.navigator.userAgent}`)),r)}}isStarted(){return this.started}async start(){this.started||(await this.peerStore.merge(this.peerId,{metadata:{AgentVersion:Dt(this.host.agentVersion),ProtocolVersion:Dt(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 Fv extends Uv{connectionManager;concurrency;constructor(e,t={}){super(e,{...t,protocol:`/${t.protocolPrefix??Lv.protocolPrefix}/id/push/1.0.0`,log:e.logger.forComponent("libp2p:identify-push")}),this.connectionManager=e.connectionManager,this.concurrency=t.concurrency??Lv.concurrency,(t.runOnSelfUpdate??Lv.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(Un("p2p").code))),t=new Jh({peerId:this.peerId,multiaddrs:e}),n=await jh.seal(t,this.peerId),r=this.registrar.getProtocols(),s=await this.peerStore.get(this.peerId),i=Yt(s.metadata.get("AgentVersion")??Dt(this.host.agentVersion)),o=Yt(s.metadata.get("ProtocolVersion")??Dt(this.host.protocolVersion)),a=this;await Cd(Nf(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=Sw(s,{maxDataLength:a.maxMessageSize}).pb(Ov);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=Sw(n,{maxDataLength:this.maxMessageSize}).pb(Ov),s=await r.read(e);await n.close(e),await Bv(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 Vv extends Uv{constructor(e,t={}){super(e,{...t,protocol:`/${t.protocolPrefix??Lv.protocolPrefix}/id/1.0.0`,log:e.logger.forComponent("libp2p:identify")}),(t.runOnConnectionOpen??Lv.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=Sw(n,{maxDataLength:this.maxMessageSize}).pb(Ov),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 pn("public key was missing from identify message","ERR_MISSING_PUBLIC_KEY");const o=await Ss(r);if(!e.remotePeer.equals(o))throw new pn("identified peer does not match the expected peer","ERR_INVALID_PEER");if(this.peerId.equals(o))throw new pn("identified peer is our own peer id?","ERR_INVALID_PEER");const a=function(e){if(null!=e&&e.length>0)try{return ar(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)),Bv(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(Un("p2p").code)));let o=s.peerRecordEnvelope;if(i.length>0&&null==o){const e=new Jh({peerId:this.peerId,multiaddrs:i});o=(await jh.seal(e,this.peerId)).marshal().subarray()}let a=t.remoteAddr.bytes;dp.matches(t.remoteAddr)||(a=void 0);const c=Sw(n).pb(Ov);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 Kv(e={}){return t=>new Vv(t,e)}function $v(e={}){return t=>new Fv(t,e)}const qv=36e5,Hv=36*qv,zv="/dht/provider",Wv=qv,jv=20,Gv=3;var Yv,Qv,Jv,Zv,Xv,eE,tE,nE;function rE(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=Wt(((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:m(0),value:m(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=>$t(t,e.codec()),e.decode=(t,n)=>j(t,e.codec(),n)}(Yv||(Yv={}));class sE{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 Yv.encode(this.prepareSerialize())}prepareSerialize(){return{key:this.key,value:this.value,timeReceived:rE(this.timeReceived)}}static deserialize(e){const t=Yv.decode(e);return new sE(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 sE(e.key,e.value,t)}}function iE(e,t={}){const n={...e,name:"SEND_QUERY",type:0,messageName:e.type,messageType:e.type};return t.onProgress?.(new bn("kad-dht:query:send-query",{detail:n})),n}function oE(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 bn("kad-dht:query:peer-response",{detail:n})),n}function aE(e,t={}){const n={...e,name:"FINAL_PEER",type:2};return t.onProgress?.(new bn("kad-dht:query:final-peer",{detail:n})),n}function cE(e,t={}){const n={...e,name:"QUERY_ERROR",type:3};return t.onProgress?.(new bn("kad-dht:query:query-error",{detail:n})),n}function lE(e,t={}){const n={...e,name:"PROVIDER",type:4};return t.onProgress?.(new bn("kad-dht:query:provider",{detail:n})),n}function uE(e,t={}){const n={...e,name:"VALUE",type:5};return t.onProgress?.(new bn("kad-dht:query:value",{detail:n})),n}function hE(e,t={}){const n={...e,name:"DIAL_PEER",type:7};return t.onProgress?.(new bn("kad-dht:query:dial-peer",{detail:n})),n}!function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(Qv||(Qv={})),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"}(Jv||(Jv={})),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"}(Zv||(Zv={})),function(e){e.codec=()=>zt(Zv)}(Jv||(Jv={})),function(e){e.NOT_CONNECTED="NOT_CONNECTED",e.CONNECTED="CONNECTED",e.CAN_CONNECT="CAN_CONNECT",e.CANNOT_CONNECT="CANNOT_CONNECT"}(Xv||(Xv={})),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"}(eE||(eE={})),function(e){e.codec=()=>zt(eE)}(Xv||(Xv={})),function(e){let t;e.codec=()=>(null==t&&(t=Wt(((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),Xv.codec().encode(e.connection,t)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={id:m(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=Xv.codec().decode(e);break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(tE||(tE={})),function(e){let t;e.codec=()=>(null==t&&(t=Wt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.type&&0!==Zv[e.type]&&(t.uint32(8),Jv.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),tE.codec().encode(n,t);if(null!=e.providers)for(const n of e.providers)t.uint32(74),tE.codec().encode(n,t);!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={type:Jv.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=Jv.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(tE.codec().decode(e,e.uint32()));break;case 9:n.providers.push(tE.codec().decode(e,e.uint32()));break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>$t(t,e.codec()),e.decode=t=>j(t,e.codec())}(nE||(nE={}));const dE={pk:function(e,t){return 0}};async function pE(e,t){const n=t.key,r=Yt(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 pn(e,"ERR_INVALID_RECORD_KEY_TYPE")}await s(n,t.value)}const fE={pk:async(e,t)=>{if(!(e instanceof Uint8Array))throw new pn('"key" must be a Uint8Array',"ERR_INVALID_RECORD_KEY_NOT_BUFFER");if(e.byteLength<5)throw new pn("invalid public key record","ERR_INVALID_RECORD_KEY_TOO_SHORT");if("/pk/"!==Yt(e.subarray(0,4)))throw new pn("key was not prefixed with /pk/","ERR_INVALID_RECORD_KEY_BAD_PREFIX");if(!_n(e.slice(4),(await ft.digest(t)).bytes))throw new pn("public key does not match passed in key","ERR_INVALID_RECORD_HASH_MISMATCH")}},gE=Dt("/pk/");function mE(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 yE(e){return(await ft.digest(e)).digest}async function wE(e){return yE(e.toBytes())}function bE(e){return new Xt(`/dht/record/${Yt(e,"base32")}`,!1)}function vE(e,t){const n=new Date;return new sE(e,t,n).serialize()}class EE{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=bE(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=sE.deserialize(n);return await pE(this.validators,r),r}async*sendCorrectionRecord(e,t,n,r={}){this.log("sendCorrection for %b",e);const s=vE(e,n);for(const{value:i,from:o}of t){if(_n(i,n)){this.log("record was ok");continue}if(this.components.peerId.equals(o)){try{const t=bE(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:Jv.PUT_VALUE,key:e,record:s};for await(const e of this.network.sendRequest(o,a,r))"PEER_RESPONSE"===e.name&&null!=e.record&&_n(e.record.value,sE.deserialize(s).value)&&(t=!0),yield e;t||(yield cE({from:o,error:new pn("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=vE(e,t),s=bE(e);this.log(`storing record for key ${s.toString()}`),await this.components.datastore.put(s,r.subarray()),yield*fr(this.peerRouting.getClosestPeers(e,{signal:n.signal}),(t=>Hr(t,(t=>async()=>{if("FINAL_PEER"!==t.name)return[t];const s=[],i={type:Jv.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&&_n(e.record.value,sE.deserialize(r).value)||s.push(cE({from:t.peer.id,error:new pn("value not put correctly","ERR_PUT_VALUE_INVALID")},n)));return s}))),(e=>Nf(e,{ordered:!1,concurrency:Gv})),(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 pn("No records given","ERR_NO_RECORDS_RECEIVED");const r=Yt(t).split("/");if(r.length<3)throw new pn("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 pn(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 pn("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 uE({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 uE({from:r,value:i.record.value},t))}),t)}}function SE(e){if(null==e.id)throw new Error("Invalid peer in message");return{id:Es(e.id),multiaddrs:(e.multiaddrs??[]).map((e=>ar(e)))}}class _E{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:Jv.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(cE({from:t.peer.id,error:e},n))}return r};yield*fr(this.peerRouting.getClosestPeers(r,n),(e=>Hr(e,(e=>c(e)))),(e=>Nf(e,{ordered:!1,concurrency:Gv})),(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 oE({from:this.components.peerId,messageType:Jv.GET_PROVIDERS,providers:e},t),yield lE({from:this.components.peerId,providers:e},t),r+=e.length,r>=n)return}const a=async function*({peer:e,signal:n}){const r={type:Jv.GET_PROVIDERS,key:s};yield*i.network.sendRequest(e,r,{...t,signal:n})},c=new qh(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 lE({from:i.from,providers:s},t),r+=s.length,r>=n))return}}}class IE{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 RE{success;failure;next;metric;timeoutMultiplier;failureMultiplier;minTimeout;constructor(e={}){this.success=new IE(e.interval??5e3),this.failure=new IE(e.interval??5e3),this.next=new IE(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=_s([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 AE extends yn{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 RE({...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 jt("Message type was missing","ERR_INVALID_PARAMETERS");let s;this.log("sending %s to %p",t.type,e),yield hE({peer:e},n),yield iE({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 oE({from:e,messageType:i.type,closer:i.closer.map(SE),providers:i.providers.map(SE),record:null==i.record?void 0:sE.deserialize(i.record)},n)}catch(r){s?.abort(r),this.log.error("could not send %s to %p",t.type,e,r),yield cE({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 jt("Message type was missing","ERR_INVALID_PARAMETERS");let s;this.log("sending %s to %p",t.type,e),yield hE({peer:e},n),yield iE({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 oE({from:e,messageType:r},n)}catch(t){s?.abort(t),yield cE({from:e,error:t},n)}finally{this.timeout.cleanUp(i)}}async _writeMessage(e,t,n){const r=Sw(e);await r.write(t,nE,n),await r.unwrap().close(n)}async _writeReadMessage(e,t,n){const r=Sw(e);await r.write(t,nE,n);const s=await r.read(nE,n);return await r.unwrap().close(n),s.closer.forEach((e=>{this.safeDispatchEvent("peer",{detail:SE(e)})})),s.providers.forEach((e=>{this.safeDispatchEvent("peer",{detail:SE(e)})})),s}}function TE(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 DE{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 wE(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:fm(this.originDhtKey,t)};this.peerDistances.push(n),this.peerDistances.sort(((e,t)=>TE(e.distance,t.distance))),this.peerDistances=this.peerDistances.slice(0,this.capacity)}async isCloser(e){if(0===this.length)return!0;return-1===TE(fm(await wE(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 kE{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:Jv.GET_VALUE,key:t};yield*this.network.sendRequest(e,r,n)}async*getPublicKeyFromNode(e,t={}){const n=function(e){return In([gE,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 Ss(Ul({bytes:r.record.value}));if(!n.equals(e))throw new pn("public key does not match id","ERR_PUBLIC_KEY_DOES_NOT_MATCH_ID");if(null==n.publicKey)throw new pn("public key missing","ERR_PUBLIC_KEY_MISSING");yield uE({from:e,value:n.publicKey},t)}throw new pn(`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 aE({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:Jv.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 aE({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 cE({from:this.peerId,error:new pn("Not found","ERR_NOT_FOUND")},t))}async*getClosestPeers(e,t={}){this.log("getClosestPeers to %b",e);const n=await yE(e),r=this.routingTable.closestPeers(n),s=this,i=new DE(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",Yt(e,"base32"),n);const i={type:Jv.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 aE({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 cE({from:r.from,error:new pn(t,"ERR_INVALID_RECORD")},n);continue}yield r}}async _verifyRecordOnline(e){if(null==e.timeReceived)throw new pn("invalid record received","ERR_INVALID_RECORD");await pE(this.validators,new sE(e.key,e.value,e.timeReceived))}async getCloserPeersOffline(e,t){const n=await yE(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 PE{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??Wv,this.provideValidity=s??864e5,this.cache=Up(n??256),this.syncQueue=new kh({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:zv});for await(const e of i)try{const{cid:i,peerId:o}=xE(e.key),a=NE(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=CE(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=CE(e);let n=this.cache.get(t);return null==n&&(n=await async function(e,t){const n=new Map,r=e.query({prefix:CE(t)});for await(const e of r){const{peerId:t}=xE(e.key);n.set(t,NE(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=CE(e);this.cache.set(s,n),await async function(e,t,n,r){const s=[CE(t),"/",n.toString()].join(""),i=new Xt(s),o=P(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=>vs(e)))}),{throwOnTimeout:!0})}}function CE(e){const t="string"==typeof e?e:Yt(e.multihash.bytes,"base32");return`${zv}/${t}`}function xE(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 NE(e){return new Date(C(e))}class ME{disjointPaths;alpha;shutDownController;running;queries;logger;peerId;connectionManager;routingTable;initialQuerySelfHasRun;logPrefix;metrics;constructor(e,t){const{disjointPaths:n=jv,alpha:r=Gv,logPrefix:s}=t;this.logPrefix=s,this.disjointPaths=n??jv,this.running=!1,this.alpha=r??Gv,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=_s([this.shutDownController.signal,s.signal,n.signal]);s.signal;const o=this.logger.forComponent(`${this.logPrefix}:query:`+Yt(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 Rr(this.initialQuerySelfHasRun.promise,i),this.initialQuerySelfHasRun=void 0),o("query:start"),this.queries++,this.metrics?.runningQueries.update(this.queries);const r=await yE(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 qh,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 mf({concurrency:o,sort:(e,t)=>TE(e.options.distance,t.options.distance)}),f=await yE(t);!function n(o,g){if(null==o)return;h.add(o);const m=fm(g,f);p.add((async()=>{const g=[s];null!=l&&g.push(AbortSignal.timeout(l));const y=_s(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 wE(s.id);-1===TE(fm(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 cE({from:o,error:t},e)}finally{y.clear()}}),{distance:m}).catch((e=>{u.error(e)}))}(n,await wE(n));try{for await(const e of p.toGenerator({signal:s}))null!=e&&(yield e)}catch(e){if(s.aborted)throw new pn("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 pr(...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 OE(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 LE{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=cr(),this.started){this.controller=new AbortController;const e=AbortSignal.timeout(this.queryTimeout),t=_s([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 dw(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 fr(this.peerRouting.getClosestPeers(this.peerId.toBytes(),{signal:t,isSelfQuery:!0}),(e=>Md(e,this.count)),(async e=>OE(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 BE(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 UE(e){return Array.isArray(e?.peers)}class FE extends yn{root;localPeer;prefixLength;splitThreshold;kBucketSize;numberOfNodesToPing;constructor(e){super(),this.localPeer=e.localPeer,this.prefixLength=e.prefixLength,this.kBucketSize=e.kBucketSize??VE,this.splitThreshold=e.splitThreshold??this.kBucketSize,this.numberOfNodesToPing=e.numberOfNodesToPing??3,BE("options.localPeer.kadId",e.localPeer.kadId),this.root={prefix:"",depth:0,peers:[]}}add(e){BE("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 DE(e,t);for(const e of this.toIterable())n.addWitKadId({id:e.peerId,multiaddrs:[]},e.kadId);yield*Hr(n.peers,(e=>e.id))}count(){return function e(t){if(UE(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){UE(t)?yield*t.peers:(yield*e(t.left),yield*e(t.right))}(this.root)}distance(e,t){return BigInt("0x"+Yt(fm(e,t),"base16"))}_determineBucket(e){const t=Yt(e,"base2").substring(0,this.prefixLength);return function e(n,r=0){return UE(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"===Yt(s.kadId,"base2")[t]?n.peers.push(s):r.peers.push(s)}delete e.peers,e.left=n,e.right=r}}const VE=20;class KE extends yn{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??VE,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??VE,this.pingQueue=new yf({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 FE({localPeer:{kadId:await wE(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 wE(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 qh;const n=function(e,t=100){let n;return()=>{clearTimeout(n),n=setTimeout((()=>{e()}),t)}}((()=>{const n=new qh(e.closest(e.localPeer.kadId,VE)),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=Sw(t);await s.write({type:Jv.PING},nE,n);const i=await s.read(nE,n);if(await s.unwrap().close(),i.type!==Jv.PING)throw new pn(`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 wE(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 wE(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 wE(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(UE(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 $E=[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 qE{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 OE(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=xo(2),n=(t[1]<<8)+t[0];return Es(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=$E[(r^32768>>n)&s|t&~s],o=new ArrayBuffer(34),a=new DataView(o,0,o.byteLength);return a.setUint8(0,ft.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=fm(this.routingTable.kb.localPeer.kadId,e);let n=0;for(const e of t){if(0!==e)break;n++}yield n}}}class HE{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 pn("Missing key","ERR_MISSING_KEY");let n;try{n=wt.decode(t.key)}catch(e){throw new pn("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=>ar(e).toString()))),await this.providers.addProvider(n,Es(t.id))):this.log("invalid provider peer %p from %p",t.id,e)})))}}class zE{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 pn("Invalid FIND_NODE message received - key was missing","ERR_INVALID_MESSAGE");const n=await this.peerRouting.getCloserPeersOffline(t.key,e);_n(this.peerId.toBytes(),t.key)&&n.push({id:this.peerId,multiaddrs:this.addressManager.getAddresses().map((e=>e.decapsulateCode(Un("p2p").code)))});const r={type:Jv.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 WE{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 pn("Invalid GET_PROVIDERS message received - key was missing","ERR_INVALID_MESSAGE");let n;try{n=wt.decode(t.key)}catch(e){throw new pn("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:Jv.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 pn("Invalid key","ERR_INVALID_KEY");const r={type:Jv.GET_VALUE,key:n,clusterLevel:t.clusterLevel,closer:[],providers:[]};if(function(e){return"/pk/"===Yt(e.subarray(0,4))}(n)){this.log("is public key");const e=function(e){return Es(e.subarray(4))}(n);let t;try{const n=await this.peerStore.get(e);if(null==n.id.publicKey)throw new pn("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 sE(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=bE(e);let n;try{n=await this.datastore.get(t)}catch(e){if("ERR_NOT_FOUND"===e.code)return;throw e}const r=sE.deserialize(n);if(null==r)throw new pn("Invalid record","ERR_INVALID_RECORD");if(!(null==r.timeReceived||Date.now()-r.timeReceived.getTime()>Hv))return r;await this.datastore.delete(t)}}class GE{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 YE{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 pn(t,"ERR_EMPTY_RECORD")}try{const e=sE.deserialize(t.record);await pE(this.validators,e),e.timeReceived=new Date;const r=bE(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 QE{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={[Jv.GET_VALUE.toString()]:new jE(e,{peerRouting:r,logPrefix:i}),[Jv.PUT_VALUE.toString()]:new YE(e,{validators:s,logPrefix:i}),[Jv.FIND_NODE.toString()]:new zE(e,{peerRouting:r,logPrefix:i,peerInfoMapper:o}),[Jv.ADD_PROVIDER.toString()]:new HE(e,{providers:n,logPrefix:i}),[Jv.GET_PROVIDERS.toString()]:new WE(e,{peerRouting:r,providers:n,logPrefix:i,peerInfoMapper:o}),[Jv.PING.toString()]:new GE(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 fr(t,(e=>$r(e)),(async function*(e){for await(const t of e){const e=nE.decode(t);s.log("incoming %s from %p",e.type,r);const n=await s.handleMessage(r,e);null!=n&&(yield nE.encode(n))}}),(e=>Mr(e)),t)})).catch((e=>{this.log.error(e)}))}}class JE extends yn{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 bn("peer",{detail:e}))}}))}async stop(){this.running=!1,null!=this.registrarId&&(this.components.registrar.unregister(this.registrarId),this.registrarId=void 0)}}class ZE{dht;constructor(e){this.dht=e}async provide(e,t={}){await Cd(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 Cd(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 pn("Not found","ERR_NOT_FOUND")}}class XE{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 pn("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 eS extends yn{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??mE,this.routingTable=new KE(e,{kBucketSize:n,pingTimeout:l,pingConcurrency:u,protocol:this.protocol,logPrefix:f}),this.providers=new PE(e,p??{}),this.validators={...fE,...s},this.selectors={...dE,...i},this.network=new AE(e,{protocol:this.protocol,logPrefix:f});const g=cr();!0===t.allowQueryWithZeroPeers&&g.resolve(),this.queryManager=new ME(e,{disjointPaths:Math.ceil(this.kBucketSize/2),logPrefix:f,initialQuerySelfHasRun:g,routingTable:this.routingTable}),this.peerRouting=new kE(e,{routingTable:this.routingTable,network:this.network,validators:this.validators,queryManager:this.queryManager,logPrefix:f}),this.contentFetching=new EE(e,{validators:this.validators,selectors:this.selectors,peerRouting:this.peerRouting,queryManager:this.queryManager,network:this.network,logPrefix:f}),this.contentRouting=new _E(e,{network:this.network,peerRouting:this.peerRouting,queryManager:this.queryManager,routingTable:this.routingTable,providers:this.providers,logPrefix:f}),this.routingTableRefresh=new qE(e,{peerRouting:this.peerRouting,routingTable:this.routingTable,logPrefix:f}),this.rpc=new QE(e,{routingTable:this.routingTable,providers:this.providers,peerRouting:this.peerRouting,validators:this.validators,logPrefix:f,peerInfoMapper:this.peerInfoMapper}),this.topologyListener=new JE(e,{protocol:this.protocol,logPrefix:f}),this.querySelf=new LE(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 bn("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 XE(this),this.dhtContentRouting=new ZE(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[tn](){return this.dhtContentRouting}get[on](){return this.dhtPeerRouting}get[nn](){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)vn(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)vn(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 tS;function nS(e){return t=>new eS(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"}(tS||(tS={}));const rS=us("libp2p:simple-metrics");class sS{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 iS{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 oS{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 sS?n.value:n instanceof iS?n.values:await n();this.onMetrics(structuredClone(e))})).catch((e=>{rS.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(ob(e,(e=>{n._incrementValue(`${t} sent`,e.byteLength)})))};const s=e.source;e.source=ob(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 sS;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 iS;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 sS;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 iS;return this.metrics.set(e,n),n}}function aS(e){return t=>new oS(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 Lm(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 Lm(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()},...Bm()};return c}}}const Fm=Object.values(It).map((e=>e.decoder)).reduce(((e,t)=>e.or(t)));function Vm(e){if(!Ap.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(Fm.decode(n));var n})),r=t.filter((([e,t])=>e===Fn("p2p").code)).map((([e,t])=>Es(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 Km=WebTransport;class $m{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}=Vm(e);let o,a,c=()=>{},l=!1,u=!1,h=!1;try{this.metrics?.dialerEvents.increment({pending:!0});const d=new Km(`${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"),...Bm()},await t.upgrader.upgradeOutbound(a,{skipEncryption:!0,muxerFactory:Um(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=Cm()(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(!Ap.exactMatch(e))return!1;const{url:t,certhashes:n}=Vm(e);return null!=t&&n.length>0}))}}function qm(e={}){return t=>new $m(t,e)}const Hm=[Fn("tcp").code,Fn("dns").code,Fn("dnsaddr").code,Fn("dns4").code,Fn("dns6").code];function zm(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 Wm(e){return e.some((([e,t])=>e===Fn("tls").code))}function jm(e,t,n){const r=Gm[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 Gm={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://${jm(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://${jm(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`${jm(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`${jm(n[0],n[1]??"",t)}/p2p/${e}`},http:(e,t)=>{const n=Wm(t),r=zm(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=jm(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`${jm(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 jm(n[0],n[1]??"",t)},sni:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return jm(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=jm(n[0],n[1]??"",t);return r=r.replace("tcp://",""),`https://${r}`},ws:(e,t)=>{const n=Wm(t),r=zm(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=jm(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=jm(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`${jm(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`${jm(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`${jm(n[0],n[1]??"",t)}/p2p-webrtc-direct`}};var Ym=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)}))},Qm=(e,t)=>{(t=t??{}).closeOnEnd=!1!==t.closeOnEnd;return async n=>{for await(const t of n){try{await Ym(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()}))}))}},Zm={},Jm={};Object.defineProperty(Jm,"__esModule",{value:!0});class Xm{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 ey=class{constructor(e,{highWaterMark:t=100,lowWaterMark:n=1}={}){const r=new Xm;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)}};Jm.EventIterator=ey,Jm.default=ey,Object.defineProperty(Zm,"__esModule",{value:!0});const ty=Jm;var ny=Zm.EventIterator=ty.EventIterator;function ry(e){return e instanceof ArrayBuffer||"ArrayBuffer"===e?.constructor?.name&&"number"==typeof e?.byteLength}Zm.subscribe=function(e,t,n){return new ty.EventIterator((({push:n})=>(this.addEventListener(e,n,t),()=>this.removeEventListener(e,n,t))),n)},Zm.default=ty.EventIterator;var sy=(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 ny((({push:t,stop:n,fail:r})=>{const s=e=>{let n=null;"string"==typeof e.data&&(n=kt(e.data)),ry(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 ry(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:Qm(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}},iy=WebSocket;const oy={"http:":"ws:","https:":"wss:"};function ay(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(oy))n.protocol===e&&(n.protocol=t);return n})(e,"undefined"==typeof window?void 0:window.location),r=new iy(n.toString(),t.websocket);return sy(r,t)}var cy=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 ly="object"==typeof window&&"object"==typeof document&&9===document.nodeType,uy=cy(),hy=ly&&!uy,dy=uy&&!ly,py=uy&&ly,fy=void 0!==globalThis.process&&void 0!==globalThis.process.release&&"node"===globalThis.process.release.name&&!uy,gy="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 my="undefined"!=typeof navigator&&"ReactNative"===navigator.product,yy=jy("dns4"),wy=jy("dns6"),by=jy("dnsaddr"),vy=Wy(jy("dns"),by,yy,wy),Ey=Wy(jy("ip4"),jy("ip6")),Sy=Wy(zy(Ey,jy("tcp")),zy(vy,jy("tcp"))),_y=zy(Ey,jy("udp")),Iy=zy(_y,jy("utp")),Ry=zy(_y,jy("quic")),Ay=zy(_y,jy("quic-v1")),Ty=Wy(zy(Sy,jy("ws")),zy(vy,jy("ws"))),Dy=Wy(zy(Ty,jy("p2p")),Ty),ky=Wy(zy(Sy,jy("wss")),zy(vy,jy("wss")),zy(Sy,jy("tls"),jy("ws")),zy(vy,jy("tls"),jy("ws"))),Py=Wy(zy(ky,jy("p2p")),ky),Cy=Wy(zy(Sy,jy("http")),zy(Ey,jy("http")),zy(vy,jy("http"))),xy=Wy(zy(Sy,jy("https")),zy(Ey,jy("https")),zy(vy,jy("https"))),Ny=zy(_y,jy("webrtc-direct"),jy("certhash")),My=Wy(zy(Ny,jy("p2p")),Ny),Oy=zy(Ay,jy("webtransport"),jy("certhash"),jy("certhash")),Ly=Wy(zy(Oy,jy("p2p")),Oy),By=Wy(zy(Dy,jy("p2p-webrtc-star"),jy("p2p")),zy(Py,jy("p2p-webrtc-star"),jy("p2p")),zy(Dy,jy("p2p-webrtc-star")),zy(Py,jy("p2p-webrtc-star"))),Uy=Wy(zy(Cy,jy("p2p-webrtc-direct"),jy("p2p")),zy(xy,jy("p2p-webrtc-direct"),jy("p2p")),zy(Cy,jy("p2p-webrtc-direct")),zy(xy,jy("p2p-webrtc-direct"))),Fy=Wy(Ty,ky,Cy,xy,By,Uy,Sy,Iy,Ry,vy,My,Ly),Vy=Wy(zy(Fy,jy("p2p")),By,Uy,My,Ly,jy("p2p")),Ky=Wy(zy(Vy,jy("p2p-circuit"),Vy),zy(Vy,jy("p2p-circuit")),zy(jy("p2p-circuit"),Vy),zy(Fy,jy("p2p-circuit")),zy(jy("p2p-circuit"),Fy),jy("p2p-circuit")),$y=()=>Wy(zy(Ky,$y),Ky),qy=$y();function Hy(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 zy(...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:Hy(t),partialMatch:t}}function Wy(...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:Hy(t),partialMatch:t}}function jy(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 Gy{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=ay(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=Gm[s.name];if(null==i)throw new Error(`No interpreter found for ${s.name}`);let o=i(r[1]??"",n);return Hm.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):hy||gy?function(e){return e.filter((e=>{if(e.protoCodes().includes(290))return!1;const t=e.decapsulateCode(421);return Py.matches(t)}))}(e):function(e){return e.filter((e=>{if(e.protoCodes().includes(290))return!1;const t=e.decapsulateCode(421);return Dy.matches(t)||Py.matches(t)}))}(e)}dialFilter(e){return this.listenFilter(e)}}function Yy(e={}){return t=>new Gy(t,e)}var Qy;!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"}(Qy||(Qy={}));var Zy=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))},Jy=function(e,t,n){this.name=e,this.version=t,this.os=n,this.type="browser"},Xy=function(e){this.version=e,this.type="node",this.name="node",this.os=process.platform},ew=function(e,t,n,r){this.name=e,this.version=t,this.os=n,this.bot=r,this.type="bot-device"},tw=function(){this.type="bot",this.bot=!0,this.name="bot",this.version=null,this.os=null},nw=function(){this.type="react-native",this.name="react-native",this.version=null,this.os=null},rw=/(nuhk|curl|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask\ Jeeves\/Teoma|ia_archiver)/,sw=3,iw=[["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/]],ow=[["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 aw="undefined"==typeof document&&"undefined"!=typeof navigator&&"ReactNative"===navigator.product?new nw:"undefined"!=typeof navigator?function(e){var t=function(e){return""!==e&&iw.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 tw;var s=r[1]&&r[1].split(".").join("_").split("_").slice(0,3);s?s.length<sw&&(s=Zy(Zy([],s,!0),function(e){for(var t=[],n=0;n<e;n++)t.push("0");return t}(sw-s.length),!0)):s=[];var i=s.join("."),o=function(e){for(var t=0,n=ow.length;t<n;t++){var r=ow[t],s=r[0];if(r[1].exec(e))return s}return null}(e),a=rw.exec(e);return a&&a[1]?new ew(n,i,o,a[1]):new Jy(n,i,o)}(navigator.userAgent):function(){var e="undefined"!=typeof process&&process.version;return e?new Xy(process.version.slice(1)):null}(),cw=null!=aw&&"firefox"===aw.name,lw=async function*(){},uw=async e=>{};class hw{log;peerConnection;remoteAddr;timeline;metrics;source=lw();sink=uw;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 dw=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 pw(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}=dw(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=Dh(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 fw;!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())}(fw||(fw={}));class gw extends Mm{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 Dh(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 pw(this.channel,"bufferedamountlow",{timeout:this.bufferedAmountLowEventTimeout})}catch(e){if(e instanceof Ih)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 pw(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=fw.encode({message:n}),s=Or.single(r);await this._sendMessage(s),e.consume(t)}}async sendReset(){await this._sendFlag(fw.Flag.RESET)}async sendCloseWrite(e){if(await this._sendFlag(fw.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(fw.Flag.STOP_SENDING)}processIncomingProtobuf(e){const t=fw.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===fw.Flag.FIN&&(this.remoteCloseWrite(),this.log.trace("sending FIN_ACK"),this._sendFlag(fw.Flag.FIN_ACK).catch((e=>{this.log.error("error sending FIN_ACK immediately",e)}))),t.flag===fw.Flag.RESET&&this.reset(),t.flag===fw.Flag.STOP_SENDING&&this.remoteCloseRead(),t.flag===fw.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=fw.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 mw(e){const{channel:t,direction:n}=e;return new gw({id:"inbound"===n?`i${t.id}`:`r${t.id}`,log:e.logger.forComponent(`libp2p:webrtc:stream:${n}:${t.id}`),...e})}const yw="/webrtc";class ww{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??yw,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=mw({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 bw(this.components,{...e,peerConnection:this.peerConnection,dataChannelOptions:this.dataChannelOptions,metrics:this.metrics,streams:this.bufferedStreams,protocol:this.protocol})}}class bw{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??yw,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=mw({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 Dh(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=lw();sink=uw;newStream(){const e=this.peerConnection.createDataChannel("");this.log.trace("opened outgoing datachannel with channel id %s",e.id);const t=mw({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 vw=globalThis.RTCPeerConnection,Ew=globalThis.RTCSessionDescription,Sw=globalThis.RTCIceCandidate;function _w(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 Iw;!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())}(Iw||(Iw={}));const Rw=async(e,t,n)=>{try{const r=lr();for(!function(e,t){e[cw?"oniceconnectionstatechange":"onconnectionstatechange"]=n=>{switch(function(e){return cw?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!==Iw.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 Sw(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 Aw({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(Dw+"/");if(2!==t.length)throw new fn("webrtc protocol was not present in multiaddr",Qy.ERR_INVALID_MULTIADDR);if(!t[0].includes(kw))throw new fn("p2p-circuit protocol was not present in multiaddr",Qy.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",Qy.ERR_INVALID_MULTIADDR);const s=n.protos().pop();if(void 0===s)throw new fn("invalid multiaddr",Qy.ERR_INVALID_MULTIADDR);"p2p"!==s.name&&(n=n.encapsulate(`/p2p/${r}`));return{baseAddr:n,peerId:Es(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(Es(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(Pw,{signal:n,runOnTransientConnection:!0}),i=_w(r).pb(Iw),o=new vw(e),l=new ww({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:Iw.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:Iw.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!==Iw.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 Ew({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 Rw(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 Tw 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=>qy.matches(e))).map((e=>e.encapsulate(`/webrtc/p2p/${this.peerId}`))))).flat()}async close(){this.shutdownController.abort(),this.safeDispatchEvent("close",{})}}const Dw="/webrtc",kw="/p2p-circuit",Pw="/webrtc-signaling/0.0.1";class Cw{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(Pw,(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(Pw),this._started=!1}createListener(e){return new Tw(this.components,{shutdownController:this.shutdownController})}listenFilter(e){return e.filter(kp.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 Aw({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 hw(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 vw("function"==typeof this.init.rtcConfiguration?await this.init.rtcConfiguration():this.init.rtcConfiguration),s=new ww(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=_w(t).pb(Iw);try{e.onicecandidate=({candidate:e})=>{const t=JSON.stringify(e?.toJSON()??null);s.trace("recipient sending ICE candidate %s",t),i.write({type:Iw.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!==Iw.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 Ew({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:Iw.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 Rw(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 hw(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 xw;function Nw(e,t){if(Dp.matches(e))return!1;return null!=t.dialTransportForMultiaddr(e)&&(!!up.matches(e)||!!fp.matches(e)&&!1===Gd(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())}(xw||(xw={}));const Mw=5e3,Ow=3,Lw=1,Bw=1;class Uw{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??Mw,this.retries=t.retries??Ow,this.maxInboundStreams=t.maxInboundStreams??Lw,this.maxOutboundStreams=t.maxOutboundStreams??Bw}[Symbol.toStringTag]="@libp2p/dcutr";[_n]=["@libp2p/identify"];isStarted(){return this.started}async start(){this.started||(this.topologyId=await this.registrar.register(Fw,{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(Fw,(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(Fw),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([Fw],{signal:r.signal,runOnTransientConnection:!0});const n=_w(t,{maxDataLength:4096}).pb(xw);this.log("B sending connect to %p",e.remotePeer);const s=Date.now();await n.write({type:xw.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!==xw.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:xw.Type.SYNC,observedAddresses:[]},r),this.log("A waiting for half RTT"),await lf(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=>Nw(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=_w(e,{maxDataLength:4096}).pb(xw);this.log("A receiving connect");const s=await r.read(n);if(s.type!==xw.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:xw.Type.CONNECT,observedAddresses:this.addressManager.getAddresses().map((e=>e.bytes))}),this.log("A receiving sync");if((await r.read(n)).type!==xw.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(!Nw(e,this.transportManager))continue;t.push(e)}catch{}return t}}const Fw="/libp2p/dcutr";function Vw(e={}){return t=>new Uw(t,e)}const Kw="ERR_INVALID_FRAME",$w="ERR_UNREQUESTED_PING",qw="ERR_NOT_MATCHING_PING",Hw="ERR_STREAM_ALREADY_EXISTS",zw="ERR_DECODE_INVALID_VERSION",Ww="ERR_BOTH_CLIENTS",jw="ERR_RECV_WINDOW_EXCEEDED",Gw=new Set([Kw,$w,qw,Hw,zw,Ww,jw]),Yw="ERR_INVALID_CONFIG",Qw="ERR_MUXER_LOCAL_CLOSED",Zw="ERR_MUXER_REMOTE_CLOSED",Jw=262144,Xw={enableKeepAlive:!0,keepAliveInterval:3e4,maxInboundStreams:1e3,maxOutboundStreams:1e3,initialStreamWindowSize:Jw,maxStreamWindowSize:16777216,maxMessageSize:65536};var eb,tb;!function(e){e[e.Data=0]="Data",e[e.WindowUpdate=1]="WindowUpdate",e[e.Ping=2]="Ping",e[e.GoAway=3]="GoAway"}(eb||(eb={})),function(e){e[e.SYN=1]="SYN",e[e.ACK=2]="ACK",e[e.FIN=4]="FIN",e[e.RST=8]="RST"}(tb||(tb={})),Object.values(tb).filter((e=>"string"!=typeof e));var nb;!function(e){e[e.NormalTermination=0]="NormalTermination",e[e.ProtocolError=1]="ProtocolError",e[e.InternalError=2]="InternalError"}(nb||(nb={}));const rb=2**24;class sb{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===eb.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",zw);return{type:e[1],flag:(e[2]<<8)+e[3],streamID:e[4]*rb+(e[5]<<16)+(e[6]<<8)+e[7],length:e[8]*rb+(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 ib(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 ob(e){return null!=e?.then}function ab(e,t){let n=0;if(null!=e[Symbol.asyncIterator])return async function*(){for await(const r of e){const e=t(r,n++);ob(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++);ob(r)&&await r,yield e}}();const a=t;return function*(){yield s;for(const e of r)a(e,n++),yield e}()}var cb;!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"}(cb||(cb={}));class lb extends Mm{name;state;config;_id;sendWindowCapacity;sendWindowCapacityUpdate;recvWindow;recvWindowCapacity;epochStart;getRTT;sendFrame;constructor(e){super({...e,onEnd:t=>{this.state=cb.Finished,e.onEnd?.(t)}}),this.config=e.config,this._id=parseInt(e.id,10),this.name=e.name,this.state=e.state,this.sendWindowCapacity=Jw,this.recvWindow=this.config.initialStreamWindowSize,this.recvWindowCapacity=this.recvWindow,this.epochStart=Date.now(),this.getRTT=e.getRTT,this.sendFrame=e.sendFrame,this.source=ab(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:eb.Data,flag:r,streamID:this._id,length:n},e.sublist(0,n)),this.sendWindowCapacity-=n,e.consume(n)}}async sendReset(){this.sendFrame({type:eb.WindowUpdate,flag:tb.RST,streamID:this._id,length:0})}async sendCloseWrite(){const e=this.getSendFlags()|tb.FIN;this.sendFrame({type:eb.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",jw,{available:this.recvWindowCapacity,recv:e.length});const n=await t();this.recvWindowCapacity-=e.length,this.sourcePush(n)}processFlags(e){(e&tb.ACK)===tb.ACK&&this.state===cb.SYNSent&&(this.state=cb.Established),(e&tb.FIN)===tb.FIN&&this.remoteCloseWrite(),(e&tb.RST)===tb.RST&&this.reset()}getSendFlags(){switch(this.state){case cb.Init:return this.state=cb.SYNSent,tb.SYN;case cb.SYNReceived:return this.state=cb.Established,tb.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:eb.WindowUpdate,flag:e,streamID:this._id,length:r})}}const ub="/yamux/1.0.0";class hb{protocol=ub;_components;_init;constructor(e,t={}){this._components=e,this._init=t}createStreamMuxer(e){return new db(this._components,{...this._init,...e})}}class db{protocol=ub;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={...Xw,...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",Yw);if(e.maxInboundStreams<0)throw new fn("max inbound streams must be larger or equal 0",Yw);if(e.maxOutboundStreams<0)throw new fn("max outbound streams must be larger or equal 0",Yw);if(e.initialStreamWindowSize<Jw)throw new fn("InitialStreamWindowSize must be larger or equal 256 kB",Yw);if(e.maxStreamWindowSize<e.initialStreamWindowSize)throw new fn("MaxStreamWindowSize must be larger than the InitialStreamWindowSize",Yw);if(e.maxStreamWindowSize>2**32-1)throw new fn("MaxStreamWindowSize must be less than equal MAX_UINT32",Yw);if(e.maxMessageSize<1024)throw new fn("MaxMessageSize must be greater than a kilobyte",Yw)}(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=xm(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 sb(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=nb.NormalTermination}catch(e){const t=e.code;Gw.has(t)?(this.log?.error("protocol error in sink",e),n=nb.ProtocolError):(this.log?.error("internal error in sink",e),n=nb.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",Zw);if(void 0!==this.localGoAway)throw new fn("muxer closed locally",Qw);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,cb.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",Zw);if(void 0!==this.localGoAway)throw new fn("muxer closed locally",Qw);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",Qw))};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??nb.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??nb.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",Hw,{id:e});const s=new lb({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 eb.Ping:return void this.handlePing(e);case eb.GoAway:return void this.handleGoAway(s);default:throw new fn("Invalid frame type",Kw,{header:e})}else switch(e.type){case eb.Data:case eb.WindowUpdate:return void await this.handleStreamMessage(e,t);default:throw new fn("Invalid frame type",Kw,{header:e})}}handlePing(e){if(e.flag===tb.SYN)this.log?.trace("received ping request pingId=%s",e.length),this.sendPing(e.length,tb.ACK);else{if(e.flag!==tb.ACK)throw new fn("Invalid frame flag",Kw,{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",$w);if(this.activePing.id!==e)throw new fn("ping doesn't match our id",qw);this.activePing.resolve()}handleGoAway(e){this.log?.trace("received GoAway reason=%s",nb[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&tb.SYN)===tb.SYN&&this.incomingStream(n);const i=this._streams.get(n);if(void 0!==i)switch(s){case eb.WindowUpdate:return void i.handleWindowUpdate(e);case eb.Data:if(void 0===t)throw new Error("unreachable");return void await i.handleData(e,t);default:throw new Error("unreachable")}else if(s===eb.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",Ww);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:eb.WindowUpdate,flag:tb.RST,streamID:e,length:0});if(this.numInboundStreams>=this.config.maxInboundStreams)return this.log?.("maxIncomingStreams exceeded, forcing stream reset"),void this.sendFrame({type:eb.WindowUpdate,flag:tb.RST,streamID:e,length:0});const t=this._newStream(e,void 0,cb.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===eb.Data){if(void 0===t)throw new fn("invalid frame",Kw);this.source.push(new Ir(ib(e),t))}else this.source.push(ib(e))}sendPing(e,t=tb.SYN){t===tb.SYN?this.log?.trace("sending ping request pingId=%s",e):this.log?.trace("sending ping response pingId=%s",e),this.sendFrame({type:eb.Ping,flag:t,streamID:0,length:e})}sendGoAway(e=nb.NormalTermination){this.log?.("sending GoAway reason=%s",nb[e]),this.localGoAway=e,this.sendFrame({type:eb.GoAway,flag:0,streamID:0,length:e})}}function pb(e={}){return t=>new hb(t,e)}function fb(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 gb;!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:fb(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())}(gb||(gb={}));class mb 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=gb.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=gb.decode(t.data);_s(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 yb(e={}){return t=>new mb(t,e)}const wb="circuit-relay-relay";BigInt(1<<17);const bb="/libp2p/circuit/relay/0.2.0/hop",vb="/libp2p/circuit/relay/0.2.0/stop",Eb="ERR_RELAYED_DIAL";var Sb,_b,Ib,Rb,Ab,Tb,Db,kb;function Pb(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),Ib.codec().encode(t.peer,n)),null!=t.reservation&&(n.uint32(26),Rb.codec().encode(t.reservation,n)),null!=t.limit&&(n.uint32(34),Ab.codec().encode(t.limit,n)),null!=t.status&&(n.uint32(40),Tb.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=Ib.codec().decode(t,t.uint32());break;case 3:r.reservation=Rb.codec().decode(t,t.uint32());break;case 4:r.limit=Ab.codec().decode(t,t.uint32());break;case 5:r.status=Tb.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())}(Sb||(Sb={})),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),Ib.codec().encode(t.peer,n)),null!=t.limit&&(n.uint32(26),Ab.codec().encode(t.limit,n)),null!=t.status&&(n.uint32(32),Tb.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=Ib.codec().decode(t,t.uint32());break;case 3:r.limit=Ab.codec().decode(t,t.uint32());break;case 4:r.status=Tb.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;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())}(Ib||(Ib={})),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())}(Rb||(Rb={})),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())}(Ab||(Ab={})),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"}(Tb||(Tb={})),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"}(Db||(Db={})),function(e){e.codec=()=>Wt(Db)}(Tb||(Tb={})),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())}(kb||(kb={}));class Cb 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(bb,{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(bb)],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 xb 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 qh,this.maxDiscoveredRelays=t?.discoverRelays??0,this.maxReservationQueueLength=t?.maxReservationQueueLength??100,this.reservationCompletionTimeout=t?.reservationCompletionTimeout??1e4,this.started=!1,this.reserveQueue=new wf({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(Pb(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=Pb(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:{[wb]:{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(bb,t),r=_w(n).pb(Sb);let s;await r.write({type:Sb.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===Tb.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 Nb(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 Mb 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 qh,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 Ob=300,Lb=300,Bb=3e4;class Ub{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??Ob,this.maxOutboundStopStreams=t.maxOutboundStopStreams??Lb,this.stopTimeout=t.stopTimeout??Bb,null!=t.discoverRelays&&t.discoverRelays>0&&(this.discovery=new Cb(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 xb(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(vb,(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(vb),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,Eb)}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,Eb)}const a=Es(i),c=Es(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(bb),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=_w(e),o=t.pb(Sb);await o.write({type:Sb.Type.CONNECT,peer:{id:n.toBytes(),addrs:[cr(r).bytes]}});const a=await o.read();if(a.status!==Tb.OK)throw new fn(`failed to connect via relay with status ${a?.status?.toString()??"undefined"}`,"ERR_HOP_REQUEST_FAILED");const c=Nb({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 Mb(e)}({connectionManager:this.connectionManager,relayStore:this.reservationStore,logger:this.logger})}listenFilter(e){return(e=Array.isArray(e)?e:[e]).filter((e=>qy.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=_w(t).pb(_b),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:_b.Type.STATUS,status:Tb.MALFORMED_MESSAGE},{signal:n}),void await t.close();if(s.type!==_b.Type.CONNECT)return this.log.error("invalid stop connect request via peer %p",e.remotePeer),await r.write({type:_b.Type.STATUS,status:Tb.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:_b.Type.STATUS,status:Tb.MALFORMED_MESSAGE},{signal:n}),void await t.close();const i=Ss(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:_b.Type.STATUS,status:Tb.PERMISSION_DENIED},{signal:n}),void await t.close();this.log.trace("sending success response to %p",e.remotePeer),await r.write({type:_b.Type.STATUS,status:Tb.OK},{signal:n});const o=e.remoteAddr.encapsulate(`/p2p-circuit/p2p/${i.toString()}`),a=this.addressManager.getAddresses()[0],c=Nb({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 Fb(e={}){return t=>new Ub(t,e)}const Vb="/floodsub/1.0.0",Kb="/meshsub/1.0.0",$b="/meshsub/1.1.0",qb=5e3,Hb={maxSubscriptions:1/0,maxMessages:1/0,maxIhaveMessageIDs:1/0,maxIwantMessageIDs:1/0,maxControlMessages:1/0,maxPeerInfos:1/0};var zb,Wb,jb,Gb,Yb,Qb,Zb,Jb,Xb,ev,tv,nv;!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)}(zb||(zb={}));class rv{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 sv(e){switch(e){case un.Ignore:return Gb.Ignore;case un.Reject:return Gb.Reject;default:throw new Error("Unreachable")}}!function(e){e.StrictSign="StrictSign",e.StrictNoSign="StrictNoSign"}(Wb||(Wb={})),function(e){e[e.Signing=0]="Signing",e[e.Anonymous=1]="Anonymous"}(jb||(jb={})),function(e){e.Error="error",e.Ignore="ignore",e.Reject="reject",e.Blacklisted="blacklisted"}(Gb||(Gb={})),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"}(Yb||(Yb={})),function(e){e.duplicate="duplicate",e.invalid="invalid",e.valid="valid"}(Qb||(Qb={})),function(e){e.forward="forward",e.publish="publish"}(Zb||(Zb={})),function(e){e.Fanout="fanout",e.Random="random",e.Subscribed="subscribed",e.Outbound="outbound",e.NotEnough="not_enough",e.Opportunistic="opportunistic"}(Jb||(Jb={})),function(e){e.Dc="disconnected",e.BadScore="bad_score",e.Prune="prune",e.Excess="excess"}(Xb||(Xb={})),function(e){e.GraftBackoff="graft_backoff",e.BrokenPromise="broken_promise",e.MessageDeficit="message_deficit",e.IPColocation="IP_colocation"}(ev||(ev={})),function(e){e.LowScore="low_score",e.MaxIhave="max_ihave",e.MaxIasked="max_iasked"}(tv||(tv={})),function(e){e.graylist="graylist",e.publish="publish",e.gossip="gossip",e.mesh="mesh"}(nv||(nv={}));const iv="ERR_INVALID_PEER_SCORE_PARAMS",ov={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},av={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 cv(e={}){return{...ov,...e,topics:null!=e.topics?Object.entries(e.topics).reduce(((e,[t,n])=>(e[t]=function(e={}){return{...av,...e}}(n),e)),{}):{}}}function lv(e){if(e.topicWeight<0)throw new fn("invalid topic weight; must be >= 0",iv);if(0===e.timeInMeshQuantum)throw new fn("invalid TimeInMeshQuantum; must be non zero",iv);if(e.timeInMeshWeight<0)throw new fn("invalid TimeInMeshWeight; must be positive (or 0 to disable)",iv);if(0!==e.timeInMeshWeight&&e.timeInMeshQuantum<=0)throw new fn("invalid TimeInMeshQuantum; must be positive",iv);if(0!==e.timeInMeshWeight&&e.timeInMeshCap<=0)throw new fn("invalid TimeInMeshCap; must be positive",iv);if(e.firstMessageDeliveriesWeight<0)throw new fn("invallid FirstMessageDeliveriesWeight; must be positive (or 0 to disable)",iv);if(0!==e.firstMessageDeliveriesWeight&&(e.firstMessageDeliveriesDecay<=0||e.firstMessageDeliveriesDecay>=1))throw new fn("invalid FirstMessageDeliveriesDecay; must be between 0 and 1",iv);if(0!==e.firstMessageDeliveriesWeight&&e.firstMessageDeliveriesCap<=0)throw new fn("invalid FirstMessageDeliveriesCap; must be positive",iv);if(e.meshMessageDeliveriesWeight>0)throw new fn("invalid MeshMessageDeliveriesWeight; must be negative (or 0 to disable)",iv);if(0!==e.meshMessageDeliveriesWeight&&(e.meshMessageDeliveriesDecay<=0||e.meshMessageDeliveriesDecay>=1))throw new fn("invalid MeshMessageDeliveriesDecay; must be between 0 and 1",iv);if(0!==e.meshMessageDeliveriesWeight&&e.meshMessageDeliveriesCap<=0)throw new fn("invalid MeshMessageDeliveriesCap; must be positive",iv);if(0!==e.meshMessageDeliveriesWeight&&e.meshMessageDeliveriesThreshold<=0)throw new fn("invalid MeshMessageDeliveriesThreshold; must be positive",iv);if(e.meshMessageDeliveriesWindow<0)throw new fn("invalid MeshMessageDeliveriesWindow; must be non-negative",iv);if(0!==e.meshMessageDeliveriesWeight&&e.meshMessageDeliveriesActivation<1e3)throw new fn("invalid MeshMessageDeliveriesActivation; must be at least 1s",iv);if(e.meshFailurePenaltyWeight>0)throw new fn("invalid MeshFailurePenaltyWeight; must be negative (or 0 to disable)",iv);if(0!==e.meshFailurePenaltyWeight&&(e.meshFailurePenaltyDecay<=0||e.meshFailurePenaltyDecay>=1))throw new fn("invalid MeshFailurePenaltyDecay; must be between 0 and 1",iv);if(e.invalidMessageDeliveriesWeight>0)throw new fn("invalid InvalidMessageDeliveriesWeight; must be negative (or 0 to disable)",iv);if(e.invalidMessageDeliveriesDecay<=0||e.invalidMessageDeliveriesDecay>=1)throw new fn("invalid InvalidMessageDeliveriesDecay; must be between 0 and 1",iv)}const uv={gossipThreshold:-10,publishThreshold:-50,graylistThreshold:-80,acceptPXThreshold:10,opportunisticGraftThreshold:20};function hv(e={}){return{...uv,...e}}function dv(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 pv 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 fv(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 gv(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))}gv.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]}},gv.prototype.get=function(e){return this.peekAt(e)},gv.prototype.peek=function(){if(this._head!==this._tail)return this._list[this._head]},gv.prototype.peekFront=function(){return this.peek()},gv.prototype.peekBack=function(){return this.peekAt(-1)},Object.defineProperty(gv.prototype,"length",{get:function(){return this.size()}}),gv.prototype.size=function(){return this._head===this._tail?0:this._head<this._tail?this._tail-this._head:this._capacityMask+1-(this._head-this._tail)},gv.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)},gv.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}},gv.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)},gv.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}},gv.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}}},gv.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}}},gv.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)}}},gv.prototype.clear=function(){this._list=new Array(this._list.length),this._head=0,this._tail=0},gv.prototype.isEmpty=function(){return this._head===this._tail},gv.prototype.toArray=function(){return this._copyArray(!1)},gv.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]},gv.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},gv.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},gv.prototype._shrinkArray=function(){this._list.length>>>=1,this._capacityMask>>>=1},gv.prototype._nextPowerOf2=function(e){var t=1<<Math.log(e)/Math.log(2)+1;return Math.max(t,4)};var mv,yv=Br(gv);!function(e){e[e.unknown=0]="unknown",e[e.valid=1]="valid",e[e.invalid=2]="invalid",e[e.ignored=3]="ignored"}(mv||(mv={}));class wv{records;queue;constructor(){this.records=new Map,this.queue=new yv}getRecord(e){return this.records.get(e)}ensureRecord(e){let t=this.records.get(e);if(null!=t)return t;t={status:mv.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 bv{params;metrics;peerStats=new Map;peerIPs=new pv((()=>new Set));scoreCache=new Map;deliveryRecords=new wv;_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{lv(n)}catch(e){throw new fn(`invalid score parameters for topic ${t}: ${e.message}`,iv)}if(e.topicScoreCap<0)throw new fn("invalid topic score cap; must be positive (or 0 for no cap)",iv);if(null===e.appSpecificScore||void 0===e.appSpecificScore)throw new fn("missing application specific score function",iv);if(e.IPColocationFactorWeight>0)throw new fn("invalid IPColocationFactorWeight; must be negative (or 0 to disable)",iv);if(0!==e.IPColocationFactorWeight&&e.IPColocationFactorThreshold<1)throw new fn("invalid IPColocationFactorThreshold; must be at least 1",iv);if(e.behaviourPenaltyWeight>0)throw new fn("invalid BehaviourPenaltyWeight; must be negative (or 0 to disable)",iv);if(0!==e.behaviourPenaltyWeight&&(e.behaviourPenaltyDecay<=0||e.behaviourPenaltyDecay>=1))throw new fn("invalid BehaviourPenaltyDecay; must be between 0 and 1",iv);if(e.decayInterval<1e3)throw new fn("invalid DecayInterval; must be at least 1s",iv);if(e.decayToZero<=0||e.decayToZero>=1)throw new fn("invalid DecayToZero; must be between 0 and 1",iv)}(e),this.scoreCacheValidityMs=r.scoreCacheValidityMs,this.computeScore=r.computeScore??fv,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===mv.unknown?(r.status=mv.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,mv[r.status])}rejectInvalidMessage(e,t){this.markInvalidMessageDelivery(e,t)}rejectMessage(e,t,n,r){switch(r){case Gb.Error:return void this.markInvalidMessageDelivery(e,n);case Gb.Blacklisted:return}const s=this.deliveryRecords.ensureRecord(t);if(s.status===mv.unknown){if(r===Gb.Ignore)return s.status=mv.ignored,void s.peers.clear();s.status=mv.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,mv[s.status])}duplicateMessage(e,t,n){const r=this.deliveryRecords.ensureRecord(t);if(!r.peers.has(e))switch(r.status){case mv.unknown:r.peers.add(e);break;case mv.valid:r.peers.add(e),this.markDuplicateMessageDelivery(e,n,r.validated);break;case mv.invalid:this.markInvalidMessageDelivery(e,n);case mv.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 vv(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 Ev{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 Sv{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 _v{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!==Gb.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 Iv=kt("libp2p-pubsub:");function Rv(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 Av(e){return void 0===e.control&&(e.control={graft:[],prune:[],ihave:[],iwant:[]}),e}function Tv(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 Dv(e){return Qt(e,"base64")}function kv(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 Pv(e){return gt.encode(e.data)}var Cv,xv;!function(e){e[e.ip4=4]="ip4",e[e.ip6=41]="ip6"}(Cv||(Cv={}));class Nv{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"}(xv||(xv={}));class Mv extends wn{globalSignaturePolicy;multicodecs=[$b,Kb];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=$b;opts;decodeRpcLimits;metrics;status={code:xv.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:cv(t.scoreParams),scoreThresholds:hv(t.scoreThresholds)};if(this.components=e,this.decodeRpcLimits=n.decodeRpcLimits??Hb,this.globalSignaturePolicy=n.globalSignaturePolicy??cn,n.fallbackToFloodsub&&this.multicodecs.push(Vb),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 Nv({validityMs:n.seenTTL}),this.publishedMessageIds=new Nv({validityMs:n.seenTTL}),null!=t.msgIdFn)this.msgIdFn=t.msgIdFn;else switch(this.globalSignaturePolicy){case cn:this.msgIdFn=kv;break;case ln:this.msgIdFn=Pv;break;default:throw new Error(`Invalid globalSignaturePolicy: ${this.globalSignaturePolicy}`)}if(null!=t.fastMsgIdFn&&(this.fastMsgIdFn=t.fastMsgIdFn,this.fastMsgIdCache=new Nv({validityMs:n.seenTTL})),this.msgIdToStrFn=t.msgIdToStrFn??Dv,this.mcache=t.messageCache??new rv(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 Jb.Fanout:this.meshPeerInclusionEventsFanout.inc({topic:r},n);break;case Jb.Random:this.meshPeerInclusionEventsRandom.inc({topic:r},n);break;case Jb.Subscribed:this.meshPeerInclusionEventsSubscribed.inc({topic:r},n);break;case Jb.Outbound:this.meshPeerInclusionEventsOutbound.inc({topic:r},n);break;case Jb.NotEnough:this.meshPeerInclusionEventsNotEnough.inc({topic:r},n);break;case Jb.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 Xb.Dc:this.meshPeerChurnEventsDisconnected.inc({topic:r},n);break;case Xb.BadScore:this.meshPeerChurnEventsBadScore.inc({topic:r},n);break;case Xb.Prune:this.meshPeerChurnEventsPrune.inc({topic:r},n);break;case Xb.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 Qb.duplicate:this.prevalidationDuplicateTotal.inc({topic:n});break;case Qb.invalid:this.prevalidationInvalidTotal.inc({topic:n});break;case Qb.valid:this.prevalidationValidTotal.inc({topic:n});break;default:this.prevalidationUnknownTotal.inc({topic:n})}},onMsgRecvInvalid(e,t){const n=this.toTopic(e),r=t.reason===Gb.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:nv.graylist},n),this.peersByScoreThreshold.set({threshold:nv.publish},r),this.peersByScoreThreshold.set({threshold:nv.gossip},s),this.peersByScoreThreshold.set({threshold:nv.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 _v(this.opts.gossipsubIWantFollowupMs,this.msgIdToStrFn,this.metrics),this.score=new bv(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=>Es(e)))}isStarted(){return this.status.code===xv.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 Vl(t.privateKey);return{type:jb.Signing,author:t,key:t.publicKey,privateKey:e}}case ln:return{type:jb.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:xv.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!==xv.started)return;const{registrarTopologyIds:e}=this.status;this.status={code:xv.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 Ev(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===Vb&&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 Sv(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 Cv.ip4:case Cv.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,Xb.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===xv.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=>Es(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=zb.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 Qb.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 Qb.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 Qb.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:Qb.duplicate,msgIdStr:r};const s=await async function(e,t){switch(e){case ln:return null!=t.signature?{valid:!1,error:Yb.SignaturePresent}:null!=t.seqno?{valid:!1,error:Yb.SeqnoPresent}:null!=t.key?{valid:!1,error:Yb.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:Yb.InvalidSeqno};if(8!==t.seqno.length)return{valid:!1,error:Yb.InvalidSeqno};if(null==t.signature)return{valid:!1,error:Yb.InvalidSignature};if(null==t.from)return{valid:!1,error:Yb.InvalidPeerId};let e,n;try{e=Ss(t.from)}catch(e){return{valid:!1,error:Yb.InvalidPeerId}}if(null!=t.key){if(n=Ul(t.key),void 0!==e.publicKey&&!In(n.bytes,e.publicKey))return{valid:!1,error:Yb.InvalidPeerId}}else{if(null==e.publicKey)return{valid:!1,error:Yb.InvalidPeerId};n=Ul(e.publicKey)}const r={from:t.from,data:t.data,seqno:t.seqno,topic:t.topic,signature:void 0,key:void 0},s=Rn([Iv,zb.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??Fl(n)}}:{valid:!1,error:Yb.InvalidSignature}}default:throw new Error("Unreachable")}}(this.globalSignaturePolicy,t);if(!s.valid)return{code:Qb.invalid,reason:Gb.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:Qb.invalid,reason:Gb.Error,error:Yb.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:Qb.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:Qb.invalid,reason:sv(t),msgIdStr:a}}return{code:Qb.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,Rv(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:tv.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:tv.MaxIhave}),[];const s=this.iasked.get(e)??0;if(s>=qb)return this.log("IHAVE: peer %s has already advertised too many messages (%d); ignoring",e,s),this.metrics?.ihaveRcvIgnored.inc({reason:tv.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>qb&&(o=qb-s),this.log("IHAVE: Asking for %d out of %d messages from %s",o,i.size,e);let a=Array.from(i.values());return Tv(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,ev.GraftBackoff),i=!1;const r=a+this.opts.graftFloodThreshold-this.opts.pruneBackoff;s<r&&this.score.addPenalty(e,1,ev.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,Jb.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,Xb.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,ev.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&&(Tv(e),e=e.slice(0,this.opts.prunePeers));const t=[];await Promise.all(e.map((async e=>{if(null==e.peerID)return;const n=Ss(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=Es(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!==xv.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!==xv.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!==xv.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,Jb.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,Jb.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!==xv.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,Rv([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 jb.Signing:{const s={from:e.author.toBytes(),data:r,seqno:No(8),topic:t,signature:void 0,key:void 0},i=Rn([Iv,zb.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 jb.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=Rv([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=>Es(e)))}}sendRpcInBatch(e,t){const n=zb.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=sv(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=Rv([],{graft:[{topicID:t}]});this.sendRpc(e,n)}async sendPrune(e,t){const n=Rv([],{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=zb.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=Av(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){Av(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,Rv([],{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,Rv([],{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(Tv(n),n.length>qb&&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=Tv(Array.from(i)).slice(0,r),i.forEach((t=>{let r=n;n.length>qb&&(r=Tv(r.slice()).slice(0,qb)),this.pushGossip(t,{topicID:e,messageIDs:r})}))}flush(){for(const[e,t]of this.gossip.entries())this.gossip.delete(e),this.sendRpc(e,Rv([],{ihave:t}));for(const[e,t]of this.control.entries()){this.control.delete(e);const n=Rv([],{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===Kb)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=Es(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===xv.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=Tv(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,Xb.BadScore),u.set(e,!0))})),i.size<t){const t=function(e,t){return dv(e,t,(()=>!0))}(p,e-i.size);t.forEach((e=>{m(e,Jb.NotEnough)}))}if(i.size>n){let t=Array.from(i);t.sort(((e,t)=>a(t)-a(e))),t=t.slice(0,r).concat(Tv(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,Xb.Excess)}))}if(i.size>=t){let e=0;if(i.forEach((t=>{this.outbound.get(t)&&e++})),e<s){dv(p,s-e,(e=>!0===this.outbound.get(e))).forEach((e=>{m(e,Jb.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=dv(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,Jb.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=Tv(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=Tv(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=vv(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(Es(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(Es(t),{tags:{[n]:void 0}}).catch((e=>{this.log.error("Error untagging peer %s with topic %s",t,n,e)}))}}function Ov(e={}){return t=>new Mv(t,e)}var Lv;!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())}(Lv||(Lv={}));const Bv={protocolPrefix:"ipfs",timeout:5e3,maxInboundStreams:1,maxOutboundStreams:1,maxObservedAddresses:10,maxMessageSize:8192,runOnConnectionOpen:!0,runOnSelfUpdate:!0,runOnTransientConnection:!0,concurrency:32};async function Uv(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 _s(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 Gh.openAndCertify(t,Jh.DOMAIN);let c,l=Jh.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 Gh.createFromProtobuf(c.peerRecordEnvelope),r=Jh.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 Fv{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??Bv.timeout,this.maxInboundStreams=t.maxInboundStreams??Bv.maxInboundStreams,this.maxOutboundStreams=t.maxOutboundStreams??Bv.maxOutboundStreams,this.maxMessageSize=t.maxMessageSize??Bv.maxMessageSize,this.maxObservedAddresses=t.maxObservedAddresses??Bv.maxObservedAddresses,this.runOnTransientConnection=t.runOnTransientConnection??Bv.runOnTransientConnection,this.host={protocolVersion:`${t.protocolPrefix??Bv.protocolPrefix}/0.1.0`,agentVersion:(n=e.nodeInfo,r=t.agentVersion,null!=r||(r=`${n.name}/${n.version}`,fy||dy?r+=` UserAgent=${globalThis.process.version}`:(hy||gy||py||my)&&(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 Vv extends Fv{connectionManager;concurrency;constructor(e,t={}){super(e,{...t,protocol:`/${t.protocolPrefix??Bv.protocolPrefix}/id/push/1.0.0`,log:e.logger.forComponent("libp2p:identify-push")}),this.connectionManager=e.connectionManager,this.concurrency=t.concurrency??Bv.concurrency,(t.runOnSelfUpdate??Bv.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 Jh({peerId:this.peerId,multiaddrs:e}),n=await Gh.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 xd(Mf(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=_w(s,{maxDataLength:a.maxMessageSize}).pb(Lv);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=_w(n,{maxDataLength:this.maxMessageSize}).pb(Lv),s=await r.read(e);await n.close(e),await Uv(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 Kv extends Fv{constructor(e,t={}){super(e,{...t,protocol:`/${t.protocolPrefix??Bv.protocolPrefix}/id/1.0.0`,log:e.logger.forComponent("libp2p:identify")}),(t.runOnConnectionOpen??Bv.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=_w(n,{maxDataLength:this.maxMessageSize}).pb(Lv),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 _s(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)),Uv(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 Jh({peerId:this.peerId,multiaddrs:i});o=(await Gh.seal(e,this.peerId)).marshal().subarray()}let a=t.remoteAddr.bytes;pp.matches(t.remoteAddr)||(a=void 0);const c=_w(n).pb(Lv);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 $v(e={}){return t=>new Kv(t,e)}function qv(e={}){return t=>new Vv(t,e)}const Hv=36e5,zv=36*Hv,Wv="/dht/provider",jv=Hv,Gv=20,Yv=3;var Qv,Zv,Jv,Xv,eE,tE,nE,rE;function sE(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)}(Qv||(Qv={}));class iE{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 Qv.encode(this.prepareSerialize())}prepareSerialize(){return{key:this.key,value:this.value,timeReceived:sE(this.timeReceived)}}static deserialize(e){const t=Qv.decode(e);return new iE(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 iE(e.key,e.value,t)}}function oE(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 aE(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 cE(e,t={}){const n={...e,name:"FINAL_PEER",type:2};return t.onProgress?.(new vn("kad-dht:query:final-peer",{detail:n})),n}function lE(e,t={}){const n={...e,name:"QUERY_ERROR",type:3};return t.onProgress?.(new vn("kad-dht:query:query-error",{detail:n})),n}function uE(e,t={}){const n={...e,name:"PROVIDER",type:4};return t.onProgress?.(new vn("kad-dht:query:provider",{detail:n})),n}function hE(e,t={}){const n={...e,name:"VALUE",type:5};return t.onProgress?.(new vn("kad-dht:query:value",{detail:n})),n}function dE(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())}(Zv||(Zv={})),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"}(Jv||(Jv={})),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"}(Xv||(Xv={})),function(e){e.codec=()=>Wt(Xv)}(Jv||(Jv={})),function(e){e.NOT_CONNECTED="NOT_CONNECTED",e.CONNECTED="CONNECTED",e.CAN_CONNECT="CAN_CONNECT",e.CANNOT_CONNECT="CANNOT_CONNECT"}(eE||(eE={})),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"}(tE||(tE={})),function(e){e.codec=()=>Wt(tE)}(eE||(eE={})),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),eE.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=eE.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())}(nE||(nE={})),function(e){let t;e.codec=()=>(null==t&&(t=jt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.type&&0!==Xv[e.type]&&(t.uint32(8),Jv.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),nE.codec().encode(n,t);if(null!=e.providers)for(const n of e.providers)t.uint32(74),nE.codec().encode(n,t);!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={type:Jv.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=Jv.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(nE.codec().decode(e,e.uint32()));break;case 9:n.providers.push(nE.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())}(rE||(rE={}));const pE={pk:function(e,t){return 0}};async function fE(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 gE={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")}},mE=kt("/pk/");function yE(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=Gd(n);return null==r||!r}))}}async function wE(e){return(await gt.digest(e)).digest}async function bE(e){return wE(e.toBytes())}function vE(e){return new en(`/dht/record/${Qt(e,"base32")}`,!1)}function EE(e,t){const n=new Date;return new iE(e,t,n).serialize()}class SE{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=vE(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=iE.deserialize(n);return await fE(this.validators,r),r}async*sendCorrectionRecord(e,t,n,r={}){this.log("sendCorrection for %b",e);const s=EE(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=vE(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:Jv.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,iE.deserialize(s).value)&&(t=!0),yield e;t||(yield lE({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=EE(e,t),s=vE(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:Jv.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,iE.deserialize(r).value)||s.push(lE({from:t.peer.id,error:new fn("value not put correctly","ERR_PUT_VALUE_INVALID")},n)));return s}))),(e=>Mf(e,{ordered:!1,concurrency:Yv})),(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 hE({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 hE({from:r,value:i.record.value},t))}),t)}}function _E(e){if(null==e.id)throw new Error("Invalid peer in message");return{id:Ss(e.id),multiaddrs:(e.multiaddrs??[]).map((e=>cr(e)))}}class IE{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:Jv.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(lE({from:t.peer.id,error:e},n))}return r};yield*gr(this.peerRouting.getClosestPeers(r,n),(e=>zr(e,(e=>c(e)))),(e=>Mf(e,{ordered:!1,concurrency:Yv})),(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 aE({from:this.components.peerId,messageType:Jv.GET_PROVIDERS,providers:e},t),yield uE({from:this.components.peerId,providers:e},t),r+=e.length,r>=n)return}const a=async function*({peer:e,signal:n}){const r={type:Jv.GET_PROVIDERS,key:s};yield*i.network.sendRequest(e,r,{...t,signal:n})},c=new Hh(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 uE({from:i.from,providers:s},t),r+=s.length,r>=n))return}}}class RE{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 AE{success;failure;next;metric;timeoutMultiplier;failureMultiplier;minTimeout;constructor(e={}){this.success=new RE(e.interval??5e3),this.failure=new RE(e.interval??5e3),this.next=new RE(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=Is([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 TE 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 AE({...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 dE({peer:e},n),yield oE({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 aE({from:e,messageType:i.type,closer:i.closer.map(_E),providers:i.providers.map(_E),record:null==i.record?void 0:iE.deserialize(i.record)},n)}catch(r){s?.abort(r),this.log.error("could not send %s to %p",t.type,e,r),yield lE({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 dE({peer:e},n),yield oE({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 aE({from:e,messageType:r},n)}catch(t){s?.abort(t),yield lE({from:e,error:t},n)}finally{this.timeout.cleanUp(i)}}async _writeMessage(e,t,n){const r=_w(e);await r.write(t,rE,n),await r.unwrap().close(n)}async _writeReadMessage(e,t,n){const r=_w(e);await r.write(t,rE,n);const s=await r.read(rE,n);return await r.unwrap().close(n),s.closer.forEach((e=>{this.safeDispatchEvent("peer",{detail:_E(e)})})),s.providers.forEach((e=>{this.safeDispatchEvent("peer",{detail:_E(e)})})),s}}function DE(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 kE{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 bE(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:gm(this.originDhtKey,t)};this.peerDistances.push(n),this.peerDistances.sort(((e,t)=>DE(e.distance,t.distance))),this.peerDistances=this.peerDistances.slice(0,this.capacity)}async isCloser(e){if(0===this.length)return!0;return-1===DE(gm(await bE(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 PE{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:Jv.GET_VALUE,key:t};yield*this.network.sendRequest(e,r,n)}async*getPublicKeyFromNode(e,t={}){const n=function(e){return Rn([mE,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 _s(Fl({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 hE({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 cE({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:Jv.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 cE({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 lE({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 wE(e),r=this.routingTable.closestPeers(n),s=this,i=new kE(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:Jv.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 cE({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 lE({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 fE(this.validators,new iE(e.key,e.value,e.timeReceived))}async getCloserPeersOffline(e,t){const n=await wE(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 CE{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??jv,this.provideValidity=s??864e5,this.cache=Fp(n??256),this.syncQueue=new Ph({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:Wv});for await(const e of i)try{const{cid:i,peerId:o}=NE(e.key),a=ME(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=xE(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=xE(e);let n=this.cache.get(t);return null==n&&(n=await async function(e,t){const n=new Map,r=e.query({prefix:xE(t)});for await(const e of r){const{peerId:t}=NE(e.key);n.set(t,ME(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=xE(e);this.cache.set(s,n),await async function(e,t,n,r){const s=[xE(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=>Es(e)))}),{throwOnTimeout:!0})}}function xE(e){const t="string"==typeof e?e:Qt(e.multihash.bytes,"base32");return`${Wv}/${t}`}function NE(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 ME(e){return new Date(x(e))}class OE{disjointPaths;alpha;shutDownController;running;queries;logger;peerId;connectionManager;routingTable;initialQuerySelfHasRun;logPrefix;metrics;constructor(e,t){const{disjointPaths:n=Gv,alpha:r=Yv,logPrefix:s}=t;this.logPrefix=s,this.disjointPaths=n??Gv,this.running=!1,this.alpha=r??Yv,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=Is([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 wE(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 Hh,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 yf({concurrency:o,sort:(e,t)=>DE(e.options.distance,t.options.distance)}),f=await wE(t);!function n(o,g){if(null==o)return;h.add(o);const m=gm(g,f);p.add((async()=>{const g=[s];null!=l&&g.push(AbortSignal.timeout(l));const y=Is(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 bE(s.id);-1===DE(gm(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 lE({from:o,error:t},e)}finally{y.clear()}}),{distance:m}).catch((e=>{u.error(e)}))}(n,await bE(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 LE(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 BE{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??Gv,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=Is([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 pw(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=>Od(e,this.count)),(async e=>LE(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 UE(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 FE(e){return Array.isArray(e?.peers)}class VE extends wn{root;localPeer;prefixLength;splitThreshold;kBucketSize;numberOfNodesToPing;constructor(e){super(),this.localPeer=e.localPeer,this.prefixLength=e.prefixLength,this.kBucketSize=e.kBucketSize??KE,this.splitThreshold=e.splitThreshold??this.kBucketSize,this.numberOfNodesToPing=e.numberOfNodesToPing??3,UE("options.localPeer.kadId",e.localPeer.kadId),this.root={prefix:"",depth:0,peers:[]}}add(e){UE("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 kE(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(FE(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){FE(t)?yield*t.peers:(yield*e(t.left),yield*e(t.right))}(this.root)}distance(e,t){return BigInt("0x"+Qt(gm(e,t),"base16"))}_determineBucket(e){const t=Qt(e,"base2").substring(0,this.prefixLength);return function e(n,r=0){return FE(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 KE=20;class $E 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??KE,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??KE,this.pingQueue=new wf({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 VE({localPeer:{kadId:await bE(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 bE(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 Hh;const n=function(e,t=100){let n;return()=>{clearTimeout(n),n=setTimeout((()=>{e()}),t)}}((()=>{const n=new Hh(e.closest(e.localPeer.kadId,KE)),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=_w(t);await s.write({type:Jv.PING},rE,n);const i=await s.read(rE,n);if(await s.unwrap().close(),i.type!==Jv.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 bE(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 bE(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 bE(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(FE(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 qE=[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 HE{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 LE(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=No(2),n=(t[1]<<8)+t[0];return Ss(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=qE[(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=gm(this.routingTable.kb.localPeer.kadId,e);let n=0;for(const e of t){if(0!==e)break;n++}yield n}}}class zE{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,Ss(t.id))):this.log("invalid provider peer %p from %p",t.id,e)})))}}class WE{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:Jv.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 jE{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:Jv.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 GE{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:Jv.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 Ss(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 iE(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=vE(e);let n;try{n=await this.datastore.get(t)}catch(e){if("ERR_NOT_FOUND"===e.code)return;throw e}const r=iE.deserialize(n);if(null==r)throw new fn("Invalid record","ERR_INVALID_RECORD");if(!(null==r.timeReceived||Date.now()-r.timeReceived.getTime()>zv))return r;await this.datastore.delete(t)}}class YE{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 QE{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=iE.deserialize(t.record);await fE(this.validators,e),e.timeReceived=new Date;const r=vE(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 ZE{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={[Jv.GET_VALUE.toString()]:new GE(e,{peerRouting:r,logPrefix:i}),[Jv.PUT_VALUE.toString()]:new QE(e,{validators:s,logPrefix:i}),[Jv.FIND_NODE.toString()]:new WE(e,{peerRouting:r,logPrefix:i,peerInfoMapper:o}),[Jv.ADD_PROVIDER.toString()]:new zE(e,{providers:n,logPrefix:i}),[Jv.GET_PROVIDERS.toString()]:new jE(e,{peerRouting:r,providers:n,logPrefix:i,peerInfoMapper:o}),[Jv.PING.toString()]:new YE(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=rE.decode(t);s.log("incoming %s from %p",e.type,r);const n=await s.handleMessage(r,e);null!=n&&(yield rE.encode(n))}}),(e=>Or(e)),t)})).catch((e=>{this.log.error(e)}))}}class JE 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 XE{dht;constructor(e){this.dht=e}async provide(e,t={}){await xd(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 xd(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 eS{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 tS 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??yE,this.routingTable=new $E(e,{kBucketSize:n,pingTimeout:l,pingConcurrency:u,protocol:this.protocol,logPrefix:f}),this.providers=new CE(e,p??{}),this.validators={...gE,...s},this.selectors={...pE,...i},this.network=new TE(e,{protocol:this.protocol,logPrefix:f});const g=lr();!0===t.allowQueryWithZeroPeers&&g.resolve(),this.queryManager=new OE(e,{disjointPaths:Math.ceil(this.kBucketSize/2),logPrefix:f,initialQuerySelfHasRun:g,routingTable:this.routingTable}),this.peerRouting=new PE(e,{routingTable:this.routingTable,network:this.network,validators:this.validators,queryManager:this.queryManager,logPrefix:f}),this.contentFetching=new SE(e,{validators:this.validators,selectors:this.selectors,peerRouting:this.peerRouting,queryManager:this.queryManager,network:this.network,logPrefix:f}),this.contentRouting=new IE(e,{network:this.network,peerRouting:this.peerRouting,queryManager:this.queryManager,routingTable:this.routingTable,providers:this.providers,logPrefix:f}),this.routingTableRefresh=new HE(e,{peerRouting:this.peerRouting,routingTable:this.routingTable,logPrefix:f}),this.rpc=new ZE(e,{routingTable:this.routingTable,providers:this.providers,peerRouting:this.peerRouting,validators:this.validators,logPrefix:f,peerInfoMapper:this.peerInfoMapper}),this.topologyListener=new JE(e,{protocol:this.protocol,logPrefix:f}),this.querySelf=new BE(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 eS(this),this.dhtContentRouting=new XE(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=Gd(`${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 nS;function rS(e){return t=>new tS(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"}(nS||(nS={}));const sS=hs("libp2p:simple-metrics");class iS{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 oS{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 aS{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 iS?n.value:n instanceof oS?n.values:await n();this.onMetrics(structuredClone(e))})).catch((e=>{sS.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(ab(e,(e=>{n._incrementValue(`${t} sent`,e.byteLength)})))};const s=e.source;e.source=ab(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 iS;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 oS;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 iS;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 oS;return this.metrics.set(e,n),n}}function cS(e){return t=>new aS(t,e)}
|
|
82
82
|
//! WebPEER.js -- https://github.com/nuzulul/webpeerjs
|
|
83
|
-
class cS{#V;#K;#$;#q;#H;#z;#W;#j;#G;#Y;#Q;#J;#Z;#X;#ee;#te;#ne;#re;#se;id;status;IPFS;address;peers;constructor(e,r,i){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.#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.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=>{e.detail;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(f.includes(t)&&(this.#X.has(t)&&!this.#X.get(t).includes("/wss/")||!n.includes("webtransport")||await this.#H.put(new Xt(t),(new TextEncoder).encode(n))),this.#X.set(t,n),p.includes(t)&&setTimeout((()=>{this.#ie(),this.#oe(),setTimeout((()=>{this.#ie(),this.#oe()}),5e3)}),1e3),this.#$.includes(t)){let e=[n];if(this.#Q.has(t)){const n={addrs:e,last:(new Date).getTime()};this.#Q.set(t,n)}else{this.#ae(t);const n={addrs:e,last:(new Date).getTime()};this.#Q.set(t,n),this.#ce()}}})),this.#V.services.pubsub.addEventListener("message",(e=>{if("signed"===e.detail.type){e.detail.topic;const n=e.detail.from.toString();try{if(this.#$.includes(n)){if(this.#Q.has(n)){const e=this.#Q.get(n).addrs,t={addrs:e,last:(new Date).getTime()};this.#Q.set(n,t)}else{this.#ae(n);const e=this.#q.get(n),t={addrs:e,last:(new Date).getTime()};this.#Q.set(n,t),this.#ce()}if(!this.#le(n))if(this.#X.has(n)){let e=[];const t=ar(this.#X.get(n));e.push(t),this.#ue(e)}else if(this.#K.has(n)){const e=this.#K.get(n);let t=[];for(const n of e){if(!n.includes("webrtc"))continue;const e=ar(n);t.push(e)}this.#ue(t)}else if(this.#Q.has(n)){const e=this.#Q.get(n).addrs;let t=[];for(const n of e){if(!n.includes("webrtc"))continue;const e=ar(n);t.push(e)}this.#ue(t)}}const r=jr(Gt.decode(e.detail.data).addrs[0]),s=JSON.parse(r),i=s.prefix,o=s.room,a=s.rooms,c=s.message,l=s.msgId,u=s.signal,h=s.id;if(h!=n)return;let d=s.address;if(i===t){if(this.#$.includes(h)||this.#$.push(h),!this.#Q.has(h)){this.#ae(h),d=[];const e={addrs:d,last:(new Date).getTime()};this.#Q.set(h,e),this.#q.set(h,d),this.#ce()}if(o&&this.#Y[o]&&(this.#Y[o].members.includes(h)||this.#Q.has(h)&&(this.#Y[o].members.push(h),this.#Y[o].onMembers(this.#Y[o].members)),c)){const e=l+h;this.#re.includes(e)||(this.#re.push(e),this.#Y[o].onMessage(c,h))}if(a)for(const e of a)this.#Y[e]&&(this.#Y[e].members.includes(h)||this.#Q.has(h)&&(this.#Y[e].members.push(h),this.#Y[e].onMembers(this.#Y[e].members)));u&&"announce"==u&&setTimeout((()=>{this.#he("")}),1e3)}else if("hybrid"===i&&d.length>0&&!this.#X.has(h)){let e=[];for(const t of d){const n=ar(t);e.push(n)}this.#ue(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=ar(t);e.push(n)}this.#ue(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>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=ar(this.#X.get(t));e.push(n),this.#ue(e)}else if(this.#G.has(t)){const e=this.#X.get(t);if(e.includes("/wss/"))return;let n=[];const r=ar(e);n.push(r),this.#ue(n)}else if(n.includes(t)){let e=[];const n=ar(this.#X.get(t));e.push(n),this.#ue(e)}else{ar(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.#he(),this.#ie()})),this.#V.addEventListener("peer:identify",(async e=>{const t=e.detail.peerId.toString();if(d.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=ar(e);n.push(e),r.push(i)}this.#G.set(t,n),await this.#V.hangUp(vs(t)),this.#ue(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;ar(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.#de(t,r)}})),this.#pe(),this.#fe(),this.#ge(),this.#me(),this.#ye(),i((e=>{const t=function(e){try{const t=e.libp2p_webtransport_dialer_events_total,n=(t.pending??0)-(Xr.pending??0),r=(t.ready_error??0)-(Xr.ready_error??0),s=(t.noise_error??0)-(Xr.noise_error??0),i=(t.upgrade_error??0)-(Xr.upgrade_error??0),o=(t.close??0)-(Xr.close??0),a=(t.ready??0)-(Xr.ready??0),c=(t.abort??0)-(Xr.abort??0),l=(t.ready_timeout??0)-(Xr.ready_timeout??0),u=(t.noise_timeout??0)-(Xr.noise_timeout??0),h=(t.open??0)-(Xr.open??0),d=(t.remote_close??0)-(Xr.remote_close??0);Zr.pending+=n,Zr.pending-=l,Zr.pending-=u,Zr.pending-=r,Zr.pending-=s,Zr.pending-=i,Zr.pending-=h,Zr.open+=h,Zr.open-=o,Zr.open-=d,Zr.open-=c,Zr.ready_error=r,Zr.noise_error=s,Zr.upgrade_error=i,Zr.ready_timeout=l,Zr.noise_timeout=u,Zr.close=o,Zr.abort=c,Zr.remote_close=d,Jr.success+=a,Jr.readyErrored+=r,Jr.noiseErrored+=s,Jr.upgradeErrored+=i,Jr.readyTimedout+=l,Jr.noiseTimedout+=u;const p=Jr.readyErrored+Jr.noiseErrored+Jr.upgradeErrored,f=Jr.readyTimedout+Jr.noiseTimedout;return Xr=t,ns=p+f,Zr.open,Zr.pending,ns-ts>30&&es&&(es=!1,JSON.stringify({isDialEnabled:es,fail:ns,lastfailtreshold:ts}),console.warn("dial disabled"),setTimeout((()=>{es||(es=!0,ts=ns,JSON.stringify({isDialEnabled:es,fail:ns,lastfailtreshold:ts}),console.warn("dial enabled"))}),36e4)),es}catch{console.debug("Metrics error")}}(e);this.#ne=t})),setTimeout((()=>{this.#we(),setInterval((()=>{this.#we()}),5e3)}),1e4),setInterval((()=>{this.#be()}),5e3),setInterval((()=>{this.#ie()}),1e4)}#ae=()=>{};onConnect=e=>this.#ae=e;#ve=()=>{};onDisconnect=e=>this.#ve=e;joinRoom=e=>{if(this.#Y[e])return[this.#Y[e].sendMessage,this.#Y[e].listenMessage,this.#Y[e].onMembersChange];if(!e)throw Wr("room is required");{let n=[];n=s,this.#Y[e]={onMessage:()=>{},listenMessage:t=>this.#Y[e]={...this.#Y[e],onMessage:t},sendMessage:async r=>{const s=(new Date).getTime(),i=Gr(JSON.stringify({prefix:t,room:e,message:r,id:this.#V.peerId.toString(),msgId:s}));if(i.byteLength>102400)throw Wr("data too large");const o={publicKey:this.#V.peerId.publicKey,addrs:[i]},a=Gt.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=ar(e);t.push(n),this.#ue(t)}#ce(){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#ye(){await this.#V.handle(n,(async({connection:e,stream:t,protocol:r})=>{try{const r=await fr(t.source,(e=>$r(e)),(e=>Hr(e,(e=>jr(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.#ae(s);const e={addrs:t,last:(new Date).getTime()};this.#Q.set(s,e),this.#ce()}}if(null!=i.data){this.#se.set(s,i.data);let e=[];const t=ar(i.data.addr),n=i.data.id;e.push(t),this.#ue(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}}fr(JSON.stringify(o),(e=>Hr(e,(e=>Gr(e)))),(e=>Mr(e)),t.sink)}catch(e){}}),{maxInboundStreams:100,maxOutboundStreams:100,runOnTransientConnection:h}),await this.#V.register(n,{onConnect:(e,t)=>{},onDisconnect:(e,t)=>{}})}async#de(e,t){const r=this.#V.getConnections().map((e=>({id:e.remotePeer.toString(),addr:e.remoteAddr.toString()}))).find((t=>t.id==e)).addr,s=ar(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 fr(o,(e=>Hr(e,(e=>Gr(e)))),(e=>Mr(e)),t,(e=>$r(e)),(e=>Hr(e,(e=>jr(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.#ae(e);const n={addrs:t,last:(new Date).getTime()};this.#Q.set(e,n),this.#ce()}}if("peer-exchange"==a.command&&null!=a.data){this.#se.set(e,a.data);let t=[];const n=ar(a.data.addr),r=a.data.id;t.push(n),this.#ue(t),this.#z.has(r)}}catch(e){}}async#Ee(){if(navigator.onLine&&this.#ne)for(const e of p)if(!this.#le(e)&&!this.#X.has(e)){const t=vs(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=ar(e);n.push(e),t.push(i)}this.#G.set(r,n),this.#le(r)||this.#ue(t)}}}#be(){const e=(new Date).getTime();for(const t of this.#Q){const n=t[0],r=e-t[1].last;if(r>25e3&&!this.#le(n)||r>6e4){this.#Q.delete(n),this.#ce(),this.#ve(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)}}}}#le(e){let t=[];for(const e of this.#V.getPeers())t.push(e.toString());return!!t.includes(e)}#ue(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;const n=this.#Q.size,r=this.#V.getPeers().length-n,s=50;if(this.#$.includes(t)){if(n>s)return}else if(r>s)return;this.#$.includes(t)||f.includes(t)||p.includes(t)?this.#te.unshift(e):this.#te.push(e)}}#we(){if(!this.#ne||!navigator.onLine)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.#le(n))continue;if(e.includes(n))continue;this.#Se(t),this.#j&&this.#_e(t)}}}async#ie(){const e=s,t=JSON.stringify({prefix:"hybrid",id:this.#V.peerId.toString(),address:this.address}),n={publicKey:this.#V.peerId.publicKey,addrs:[Gr(t)]},r=Gt.encode(n);for(const t of e)await this.#V.services.pubsub.publish(t,r)}async#oe(){let e=[];e=s;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:[Gr(n)]},i=Gt.encode(r);for(const t of e)await this.#V.services.pubsub.publish(t,i)}async#he(){let e=[];e=s;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:[Gr(n)]},i=Gt.encode(r);for(const t of e)await this.#V.services.pubsub.publish(t,i)}#me(){setInterval((()=>{const e=f,t=Math.floor(Math.random()*e.length);let n=[];n.push(e[t]);for(const e of p)n.push(e);for(const e of n)if(null!=e&&!this.#le(e))if(this.#X.has(e)){let t=[];const n=ar(this.#X.get(e));t.push(n),this.#ue(t)}else if(this.#G.has(e)){let t=[];const n=this.#G.get(e);for(const e of n){const n=ar(e);t.push(n)}this.#ue(t)}else{const t=g,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=ar(t+"/p2p/"+e);s.push(n)}this.#ue(s)}}}),45e3)}async#ge(){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)||f.includes(r)||this.#z.has(r)||t.includes("p2p-circuit")||!t.includes("webtransport")||(await this.#H.put(new Xt(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.#le(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)||f.includes(t)||!navigator.onLine||setTimeout((async()=>{this.#z.has(t)&&!this.#X.has(t)&&(this.#z.delete(t),await this.#H.delete(new Xt(t)))}),6e4);continue}}else this.#Z.set(t,0);let e=[];const r=ar(n);e.push(r),this.#ue(e)}}const t=Array.from(this.#W.keys());for(const e of t)if(this.#le(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=ar(this.#X.get(e));n.push(r),this.#ue(n),t++,this.#W.set(e,t)}}}),15e3)}#fe(){setInterval((()=>{0==this.#V.getPeers().length&&this.#pe()}),12e4)}#pe(){setTimeout((()=>{this.#Ie(),setTimeout((()=>{this.#Re()}),5e4),setTimeout((()=>{this.#Ee()}),6e4),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#Ae(),setTimeout((()=>{this.#Ee()}),6e4),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#Te(),setTimeout((()=>{this.#Ee()}),15e3),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#De(),setTimeout((()=>{this.#Ee()}),15e3),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#ke(),setTimeout((()=>{this.#Ee()}),15e3))}),u))}),u))}),u))}),u)}),5e3)}async#Ie(){if(!navigator.onLine)return;if(!this.#ne)return;let e=!0;for(const t of f)if(this.#z.has(t)){e=!1;let n=[],r=[];const s=t,i=this.#z.get(t),o=ar(i);r.push(i),n.push(o),this.#G.set(s,r),this.#le(s)||this.#ue(n)}if(e)for(const e of f){const t=Vh(a),n=await Yr(t.getPeers(vs(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=ar(t);o.push(t),i.push(n)}this.#G.set(s,o),this.#le(s)||this.#ue(i)}}async#Re(){if(!navigator.onLine)return;if(!this.#ne)return;let e=!0;for(const t of f)if(this.#z.has(t)&&(e=!1),!this.#X.has(t)&&(this.#z.has(t)||e)){const e=Vh(a),n=await Yr(e.getPeers(vs(t)));if(!n){navigator.onLine&&await this.#H.delete(new Xt(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=ar(t);o.push(t),i.push(n)}this.#G.set(s,o),this.#le(s)||this.#ue(i)}}async#Ae(){if(!navigator.onLine)return;if(!this.#ne)return;const e=Vh(a),t=f,n=await Promise.all(t.map((t=>Yr(e.getPeers(vs(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=ar(t);s.push(t),r.push(i)}this.#G.set(n,s),this.#le(n)||this.#ue(r)}}#Te(){if(!navigator.onLine)return;if(!this.#ne)return;const e=g;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=ar(e);s.push(e),r.push(i)}this.#G.set(n,s),this.#j=!0,this.#le(n)||this.#ue(r)}}async#De(){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=Vh(a),o=await Promise.all(s.map((e=>Yr(i.getPeers(vs(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=ar(t);s.push(t),r.push(i)}this.#G.set(n,s),this.#j=!0,this.#le(n)||this.#ue(r)}}async#ke(){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.#Pe(n,r)}}async#Pe(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=ar(t);i.push(n),o.push(t)}this.#j=!0,this.#G.set(e,o),this.#G.set(e,o),this.#le(e)||(this.#ue(i),this.#_e(i))}async#Se(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#_e(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 vg(r);await e.open();const t=g;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=()=>{};const s=await async function(e={}){const t=await Qf(e);return!1!==e.start&&await t.start(),t}({addresses:{listen:[]},transports:[$m(),Gy(),(o={rtcConfiguration:{iceServers:[{urls:["stun:stun.l.google.com:19302","stun:global.stun.twilio.com:3478"]}]}},e=>new Pw(e,o)),Ub({discoverRelays:1,reservationConcurrency:1,maxReservationQueueLength:3})],connectionManager:{maxConnections:100,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:[Pm()],streamMuxers:[db({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:[mb({interval:1e4,topics:i,listenOnly:!1})],services:{pubsub:Mv({allowPublishToZeroTopicPeers:!0,msgIdFn:Qr,ignoreDuplicatePublishError:!0,runOnTransientConnection:h}),identify:Kv(),identifyPush:$v(),aminoDHT:nS({protocol:"/ipfs/kad/1.0.0",peerInfoMapper:mE,clientMode:!1}),dcutr:Fw()},peerStore:{persistence:!0,threshold:1},metrics:aS({onMetrics:e=>{n(e)},intervalMs:1e3})});var o;return await s.services.aminoDHT.setMode("server"),new cS(s,e,(e=>n=e))}}export{cS as webpeerjs};
|
|
83
|
+
class lS{#V;#K;#$;#q;#H;#z;#W;#j;#G;#Y;#Q;#Z;#J;#X;#ee;#te;#ne;#re;#se;id;status;IPFS;address;peers;constructor(e,r,i){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.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=>{e.detail;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.#ie(),this.#oe(),setTimeout((()=>{this.#ie(),this.#oe()}),5e3)}),1e3),this.#$.includes(t)){let e=[n];if(this.#Q.has(t)){const n={addrs:e,last:(new Date).getTime()};this.#Q.set(t,n)}else{this.#ae(t);const n={addrs:e,last:(new Date).getTime()};this.#Q.set(t,n),this.#ce()}}})),this.#V.services.pubsub.addEventListener("message",(e=>{if("signed"===e.detail.type){e.detail.topic;const n=e.detail.from.toString();try{if(this.#$.includes(n)){if(this.#Q.has(n)){const e=this.#Q.get(n).addrs,t={addrs:e,last:(new Date).getTime()};this.#Q.set(n,t)}else{this.#ae(n);const e=this.#q.get(n),t={addrs:e,last:(new Date).getTime()};this.#Q.set(n,t),this.#ce()}if(!this.#le(n))if(this.#X.has(n)){let e=[];const t=cr(this.#X.get(n));e.push(t),this.#ue(e)}else if(this.#K.has(n)){const e=this.#K.get(n);let t=[];for(const n of e){if(!n.includes("webrtc"))continue;const e=cr(n);t.push(e)}this.#ue(t)}else if(this.#Q.has(n)){const e=this.#Q.get(n).addrs;let t=[];for(const n of e){if(!n.includes("webrtc"))continue;const e=cr(n);t.push(e)}this.#ue(t)}}const r=Gr(Yt.decode(e.detail.data).addrs[0]),s=JSON.parse(r),i=s.prefix,o=s.room,a=s.rooms,c=s.message,l=s.msgId,u=s.signal,h=s.id;if(h!=n)return;let d=s.address;if(i===t){if(this.#$.includes(h)||this.#$.push(h),!this.#Q.has(h)){this.#ae(h),d=[];const e={addrs:d,last:(new Date).getTime()};this.#Q.set(h,e),this.#q.set(h,d),this.#ce()}if(o&&this.#Y[o]&&(this.#Y[o].members.includes(h)||this.#Q.has(h)&&(this.#Y[o].members.push(h),this.#Y[o].onMembers(this.#Y[o].members)),c)){const e=l+h;this.#re.includes(e)||(this.#re.push(e),this.#Y[o].onMessage(c,h))}if(a)for(const e of a)this.#Y[e]&&(this.#Y[e].members.includes(h)||this.#Q.has(h)&&(this.#Y[e].members.push(h),this.#Y[e].onMembers(this.#Y[e].members)));u&&"announce"==u&&setTimeout((()=>{this.#he("")}),1e3)}else if("hybrid"===i&&d.length>0&&!this.#X.has(h)){let e=[];for(const t of d){const n=cr(t);e.push(n)}this.#ue(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.#ue(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>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.#ue(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.#ue(n)}else if(n.includes(t)){let e=[];const n=cr(this.#X.get(t));e.push(n),this.#ue(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.#he(),this.#ie()})),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(Es(t)),this.#ue(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.#de(t,r)}})),this.#pe(),this.#fe(),this.#ge(),this.#me(),this.#ye(),i((e=>{const t=function(e){try{const t=e.libp2p_webtransport_dialer_events_total,n=(t.pending??0)-(es.pending??0),r=(t.ready_error??0)-(es.ready_error??0),s=(t.noise_error??0)-(es.noise_error??0),i=(t.upgrade_error??0)-(es.upgrade_error??0),o=(t.close??0)-(es.close??0),a=(t.ready??0)-(es.ready??0),c=(t.abort??0)-(es.abort??0),l=(t.ready_timeout??0)-(es.ready_timeout??0),u=(t.noise_timeout??0)-(es.noise_timeout??0),h=(t.open??0)-(es.open??0),d=(t.remote_close??0)-(es.remote_close??0);Xr.pending+=n,Xr.pending-=l,Xr.pending-=u,Xr.pending-=r,Xr.pending-=s,Xr.pending-=i,Xr.pending-=h,Xr.open+=h,Xr.open-=o,Xr.open-=d,Xr.open-=c,Xr.ready_error=r,Xr.noise_error=s,Xr.upgrade_error=i,Xr.ready_timeout=l,Xr.noise_timeout=u,Xr.close=o,Xr.abort=c,Xr.remote_close=d,Jr.success+=a,Jr.readyErrored+=r,Jr.noiseErrored+=s,Jr.upgradeErrored+=i,Jr.readyTimedout+=l,Jr.noiseTimedout+=u;const p=Jr.readyErrored+Jr.noiseErrored+Jr.upgradeErrored,f=Jr.readyTimedout+Jr.noiseTimedout;return es=t,rs=p+f,Xr.open,Xr.pending,rs-ns>30&&ts&&(ts=!1,JSON.stringify({isDialEnabled:ts,fail:rs,lastfailtreshold:ns}),console.warn("dial disabled"),setTimeout((()=>{ts||(ts=!0,ns=rs,JSON.stringify({isDialEnabled:ts,fail:rs,lastfailtreshold:ns}),console.warn("dial enabled"))}),36e4)),ts}catch{console.debug("Metrics error")}}(e);this.#ne=t})),setTimeout((()=>{this.#we(),setInterval((()=>{this.#we()}),5e3)}),1e4),setInterval((()=>{this.#be()}),5e3),setInterval((()=>{this.#ie()}),1e4)}#ae=()=>{};onConnect=e=>this.#ae=e;#ve=()=>{};onDisconnect=e=>this.#ve=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>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.#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.#ue(t)}#ce(){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.#he()}async#ye(){await this.#V.handle(n,(async({connection:e,stream:t,protocol:r})=>{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.#ae(s);const e={addrs:t,last:(new Date).getTime()};this.#Q.set(s,e),this.#ce()}}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.#ue(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,{onConnect:(e,t)=>{},onDisconnect:(e,t)=>{}})}async#de(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.#ae(e);const n={addrs:t,last:(new Date).getTime()};this.#Q.set(e,n),this.#ce()}}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.#ue(t),this.#z.has(r)}}catch(e){}}async#Ee(){if(navigator.onLine&&this.#ne)for(const e of f)if(!this.#le(e)&&!this.#X.has(e)){const t=Es(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.#le(r)||this.#ue(t)}}}#be(){const e=(new Date).getTime();for(const t of this.#Q){const n=t[0],r=e-t[1].last;if(r>25e3&&!this.#le(n)||r>6e4){this.#Q.delete(n),this.#ce(),this.#ve(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)}}}}#le(e){let t=[];for(const e of this.#V.getPeers())t.push(e.toString());return!!t.includes(e)}async#ue(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;const n=this.#Q.size,r=this.#V.getPeers().length-n,s=25;if(this.#$.includes(t)){if(n>s)return}else if(r>s){let e=[];for(const t of this.#V.getPeers())e.push(t.toString());const t=e[Math.floor(Math.random()*e.length)];await this.#V.hangUp(Es(t))}this.#$.includes(t)||g.includes(t)||f.includes(t)?this.#te.unshift(e):this.#te.push(e)}}#we(){if(!this.#ne||!navigator.onLine)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.#le(n))continue;if(e.includes(n))continue;this.#Se(t),this.#j&&this.#_e(t)}}}async#ie(){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#oe(){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)}#me(){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.#le(e))if(this.#X.has(e)){let t=[];const n=cr(this.#X.get(e));t.push(n),this.#ue(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.#ue(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.#ue(s)}}}),45e3)}async#ge(){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.#le(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.#ue(e)}}const t=Array.from(this.#W.keys());for(const e of t)if(this.#le(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.#ue(n),t++,this.#W.set(e,t)}}}),15e3)}#fe(){setInterval((()=>{0==this.#V.getPeers().length&&this.#pe()}),12e4)}#pe(){setTimeout((()=>{this.#Ie(),setTimeout((()=>{this.#Re()}),2e4),setTimeout((()=>{this.#Ee()}),3e4),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#Ae(),setTimeout((()=>{this.#Ee()}),3e4),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#Te(),setTimeout((()=>{this.#Ee()}),15e3),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#De(),setTimeout((()=>{this.#Ee()}),15e3),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#ke(),setTimeout((()=>{this.#Ee()}),15e3))}),u))}),u))}),u))}),u)}),5e3)}async#Ie(){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.#le(s)||this.#ue(n)}if(e)for(const e of g){const t=Kh(a),n=await Qr(t.getPeers(Es(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.#le(s)||this.#ue(i)}}async#Re(){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=Kh(a),n=await Qr(e.getPeers(Es(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.#le(s)||this.#ue(i)}}async#Ae(){if(!navigator.onLine)return;if(!this.#ne)return;const e=Kh(a),t=g,n=await Promise.all(t.map((t=>Qr(e.getPeers(Es(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.#le(n)||this.#ue(r)}}#Te(){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.#le(n)||this.#ue(r)}}async#De(){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=Kh(a),o=await Promise.all(s.map((e=>Qr(i.getPeers(Es(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.#le(n)||this.#ue(r)}}async#ke(){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.#Pe(n,r)}}async#Pe(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.#le(e)||(this.#ue(i),this.#_e(i))}async#Se(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#_e(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 Eg(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=>{},i.createDataChannel("webpeerjs"),i.createOffer().then((e=>i.setLocalDescription(e)))})),g=await async function(e={}){const t=await Zf(e);return!1!==e.start&&await t.start(),t}({addresses:{listen:s},transports:[qm(),Yy(),(y={rtcConfiguration:{iceServers:f}},e=>new Cw(e,y)),Fb({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:[Cm()],streamMuxers:[pb({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:[yb({interval:1e4,topics:i,listenOnly:!1})],services:{pubsub:Ov({allowPublishToZeroTopicPeers:!0,msgIdFn:Zr,ignoreDuplicatePublishError:!0,runOnTransientConnection:h}),identify:$v(),identifyPush:qv(),aminoDHT:rS({protocol:"/ipfs/kad/1.0.0",peerInfoMapper:yE,clientMode:!1}),dcutr:Vw()},peerStore:{persistence:!0,threshold:1},metrics:cS({onMetrics:e=>{n(e)},intervalMs:1e3})});var y;return await g.services.aminoDHT.setMode("server"),new lS(g,e,(e=>n=e))}}export{lS as webpeerjs};
|