@pixagram/lacerta-db 0.13.0 → 0.13.2

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.
@@ -1,4 +1,4 @@
1
- (e=>{var t={};function i(s){var r;return(t[s]||(r=t[s]={i:s,l:!1,exports:{}},e[s].call(r.exports,r,r.exports,i),r.l=!0,r)).exports}i.m=e,i.c=t,i.d=function(e,t,s){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(i.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)i.d(s,r,function(t){return e[t]}.bind(null,r));return s},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=2)})([function(e,t){var i={},s=new Float32Array(4);function r(e,t){if((0|e)!==e)throw new TypeError("Lane index must be an int32");if(e<0||t<=e)throw new RangeError("Lane index must be in bounds")}new Int32Array(s.buffer),new Int16Array(s.buffer),new Int8Array(s.buffer),new Uint32Array(s.buffer),new Uint16Array(s.buffer),new Uint8Array(s.buffer),void 0!==i.Int8x16&&void 0!==i.Int8x16.extractLane||(i.Int8x16=function(e,t,s,r,a,n,o,h,l,c,d,_,u,f,m,p){if(!(this instanceof i.Int8x16))return new i.Int8x16(e,t,s,r,a,n,o,h,l,c,d,_,u,f,m,p);this.s_=new Int8Array([e,t,s,r,a,n,o,h,l,c,d,_,u,f,m,p])},i.Int8x16.check=function(e){if(e instanceof i.Int8x16)return e;throw new TypeError("Argument is not a Int8x16.")},i.Int8x16.splat=function(e){return new i.Int8x16(e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e)},i.Int8x16.extractLane=function(e,t){return e=i.Int8x16.check(e),r(t,16),e.s_[t]},i.Int8x16.replaceLane=function(e,t,s){return e=i.Int8x16.check(e),r(t,16),(e=Array.from(e.s_))[t]=s,new i.Int8x16(...e)},i.Int8x16.shuffle=function(e,t,s,a,n,o,h,l,c,d,_,u,f,m,p,y,w,g){var b=[s,a,n,o,h,l,c,d,_,u,f,m,p,y,w,g],v=[];e=i.Int8x16.check(e),t=i.Int8x16.check(t);for(var S=0;S<16;S++){var A=b[S];r(A,32),v[S]=A<16?e.s_[A]:t.s_[A-16]}return new i.Int8x16(...v)}),void 0!==i.Uint8x16&&void 0!==i.Uint8x16.extractLane||(i.Uint8x16=function(e,t,s,r,a,n,o,h,l,c,d,_,u,f,m,p){if(!(this instanceof i.Uint8x16))return new i.Uint8x16(e,t,s,r,a,n,o,h,l,c,d,_,u,f,m,p);this.s_=new Uint8Array([e,t,s,r,a,n,o,h,l,c,d,_,u,f,m,p])},i.Uint8x16.check=function(e){if(e instanceof i.Uint8x16)return e;throw new TypeError("Argument is not a Uint8x16.")},i.Uint8x16.splat=function(e){return new i.Uint8x16(e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e)},i.Uint8x16.extractLane=function(e,t){return e=i.Uint8x16.check(e),r(t,16),e.s_[t]},i.Uint8x16.load=function(e,t){if(t<0||t*e.BYTES_PER_ELEMENT+16>e.byteLength)throw new RangeError("The value of index is invalid.");return new i.Uint8x16(...e.subarray(t,t+16))},i.Uint8x16.store=function(e,t,i){if(t<0||t*e.BYTES_PER_ELEMENT+16>e.byteLength)throw new RangeError("The value of index is invalid.");return e.set(i.s_,t),i},i.Uint8x16.shuffle=function(e,t,s,a,n,o,h,l,c,d,_,u,f,m,p,y,w,g){var b=[s,a,n,o,h,l,c,d,_,u,f,m,p,y,w,g],v=[];e=i.Uint8x16.check(e),t=i.Uint8x16.check(t);for(var S=0;S<16;S++){var A=b[S];r(A,32),v[S]=A<16?e.s_[A]:t.s_[A-16]}return new i.Uint8x16(...v)},i.Uint8x16.and=function(e,t){for(var s=[],r=0;r<16;++r)s[r]=e.s_[r]&t.s_[r];return new i.Uint8x16(...s)},i.Uint8x16.or=function(e,t){for(var s=[],r=0;r<16;++r)s[r]=e.s_[r]|t.s_[r];return new i.Uint8x16(...s)},i.Uint8x16.shiftLeftByScalar=function(e,t){for(var s=[],r=0;r<16;++r)s[r]=e.s_[r]<<t;return new i.Uint8x16(...s)},i.Uint8x16.shiftRightByScalar=function(e,t){for(var s=[],r=0;r<16;++r)s[r]=e.s_[r]>>>t;return new i.Uint8x16(...s)}),e.exports=class{constructor(){this.ENC_SHUFFLE=i.Int8x16(10,11,9,10,7,8,6,7,4,5,3,4,1,2,0,1),this.ENC_LUT="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",this.ENC_LUT_SIMD=[i.Uint8x16.splat(0),i.Uint8x16.splat(0),i.Uint8x16.splat(0),i.Uint8x16.splat(0)];for(let t=0;t<4;t++){var e=this.ENC_LUT.substring(16*t,16*(t+1));this.ENC_LUT_SIMD[t]=i.Uint8x16(...Array.from(e).map(e=>e.charCodeAt(0)))}this.DEC_DELTA_ASSO=i.Uint8x16(1,1,1,1,1,1,1,1,0,0,0,0,0,15,0,15),this.DEC_DELTA_VALUES=i.Int8x16(0,0,0,19,4,191,191,185,185,0,16,195,191,191,185,185),this.DEC_SHUFFLE=i.Int8x16(-1,-1,-1,-1,12,13,14,8,9,10,4,5,6,0,1,2),this.SCALAR_ENC_LUT="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",this.SCALAR_DEC_LUT={};for(let e=0;e<this.SCALAR_ENC_LUT.length;e++)this.SCALAR_DEC_LUT[this.SCALAR_ENC_LUT.charAt(e)]=e;this.SCALAR_DEC_LUT["="]=0}_scalar_encode(e){let t="";for(let a=0;a<e.length;a+=3){var i=e[a],s=a+1<e.length?e[a+1]:0,r=a+2<e.length?e[a+2]:0;t+=this.SCALAR_ENC_LUT[i>>2]+this.SCALAR_ENC_LUT[(3&i)<<4|s>>4],a+1<e.length?t+=this.SCALAR_ENC_LUT[(15&s)<<2|r>>6]:t+="=",a+2<e.length?t+=this.SCALAR_ENC_LUT[63&r]:t+="="}return t}encode(e){var t=e.length,i=4*Math.ceil(t/3),s=new Uint8Array(i);let r=0,a=0;for(;r+12<=t;){var n=e.subarray(r,r+12),o=new Uint8Array(16);o[0]=n[0]>>2,o[1]=(3&n[0])<<4|n[1]>>4,o[2]=(15&n[1])<<2|n[2]>>6,o[3]=63&n[2],o[4]=n[3]>>2,o[5]=(3&n[3])<<4|n[4]>>4,o[6]=(15&n[4])<<2|n[5]>>6,o[7]=63&n[5],o[8]=n[6]>>2,o[9]=(3&n[6])<<4|n[7]>>4,o[10]=(15&n[7])<<2|n[8]>>6,o[11]=63&n[8],o[12]=n[9]>>2,o[13]=(3&n[9])<<4|n[10]>>4,o[14]=(15&n[10])<<2|n[11]>>6,o[15]=63&n[11];for(let e=0;e<16;e++)s[a+e]=this.SCALAR_ENC_LUT.charCodeAt(o[e]);r+=12,a+=16}let h=(new TextDecoder).decode(s.subarray(0,a));return r<t&&(h+=this._scalar_encode(e.subarray(r))),h}_scalar_decode(e){e=e.replace(/=+$/,"");var t=Math.floor(3*e.length/4),i=new Uint8Array(t);let s=0;for(let h=0;h<e.length;h+=4){var r=this.SCALAR_DEC_LUT[e[h]],a=this.SCALAR_DEC_LUT[e[h+1]],n=h+2<e.length?this.SCALAR_DEC_LUT[e[h+2]]:0,o=h+3<e.length?this.SCALAR_DEC_LUT[e[h+3]]:0;i[s++]=r<<2|a>>4,s<t&&(i[s++]=(15&a)<<4|n>>2),s<t&&(i[s++]=(3&n)<<6|o)}return i}decode(e){var t=e.length;if(t%4!=0)throw new Error("Invalid Base64 string length.");var i=(e.match(/=/g)||[]).length,s=new Uint8Array(3*t/4-i);let r=0,a=0;for(var n;r+16<=t-i;){var o=Array.from(e.substring(r,r+16)).map(e=>this.SCALAR_DEC_LUT[e]),h=new Uint8Array(12);h[0]=o[0]<<2|o[1]>>4,h[1]=(15&o[1])<<4|o[2]>>2,h[2]=(3&o[2])<<6|o[3],h[3]=o[4]<<2|o[5]>>4,h[4]=(15&o[5])<<4|o[6]>>2,h[5]=(3&o[6])<<6|o[7],h[6]=o[8]<<2|o[9]>>4,h[7]=(15&o[9])<<4|o[10]>>2,h[8]=(3&o[10])<<6|o[11],h[9]=o[12]<<2|o[13]>>4,h[10]=(15&o[13])<<4|o[14]>>2,h[11]=(3&o[14])<<6|o[15],s.set(h,a),r+=16,a+=12}return r<t&&(n=this._scalar_decode(e.substring(r)),s.set(n,a)),s}}},function(e,t,i){i.r(t);let s=new Array(128);for(let e=0;e<128;e++){var r=[];for(let t=0;t<e;t++)r.push(`b[o+${t}]`);s[e]=new Function("b","o",`return String.fromCharCode(${r.join(",")});`)}let a=new Float32Array(1),n=new Map,o=new Map;for(var h of["asyncIterator","hasInstance","isConcatSpreadable","iterator","match","matchAll","replace","search","species","split","toPrimitive","toStringTag","unscopables"]){var l=Symbol[h];l&&(n.set(l,h),o.set(h,l))}let c=1,d=16,_=17,u=18,f=19,m=20,p=21,y=22,w=23,g=24,b=25,v=26,S=32,A=33,x=34,I=35,z=48,k=49,D=50,C=51,M=52,E=53,T=54,U=55,B=64,V=65,F=66,L=67,P=68,O=69,K=70,N=71,$=80,j=81,q=82,R=83,H=84,G=85,W=105,X=106,Q=112,Y=113,J=114,Z=128,ee=129,te=144,ie=145,se=160,re=161,ae=162,ne=163,oe=164,he=165,le=166,ce=167,de=168,_e=176,ue=192,fe=193,me=208,pe=209,ye=224,we=225,ge=226,be=227,ve=240,Se=[],Ae=[];var xe,Ie,ze;for([xe,Ie,ze]of[[96,1,"Uint8Array"],[97,1,"Int8Array"],[98,1,"Uint8ClampedArray"],[99,2,"Uint16Array"],[100,2,"Int16Array"],[101,4,"Uint32Array"],[102,4,"Int32Array"],[103,4,"Float32Array"],[104,8,"Float64Array"],[105,8,"BigInt64Array"],[106,8,"BigUint64Array"],[107,1,"DataView"],[67,1,null],[68,2,null],[69,4,null],[70,4,null],[71,8,null]])Se[xe]=Ie,ze&&globalThis[ze]&&(Ae[xe]=globalThis[ze]);let ke=new Map;var De,Ce,Me=["Uint8Array","Int8Array","Uint8ClampedArray","Uint16Array","Int16Array","Uint32Array","Int32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array","DataView"];for([De,Ce]of[[Date,te],[RegExp,_e],[Map,Z],[Set,ee],[ArrayBuffer,Q]])ke.set(De,Ce);for(let e=0;e<Me.length;e++){var Ee=globalThis[Me[e]];Ee&&ke.set(Ee,96+e)}globalThis.SharedArrayBuffer&&ke.set(SharedArrayBuffer,J);let Te={[se]:Error,[re]:EvalError,[ae]:RangeError,[ne]:ReferenceError,[oe]:SyntaxError,[he]:TypeError,[le]:URIError},Ue=new Map([["Error",se],["EvalError",re],["RangeError",ae],["ReferenceError",ne],["SyntaxError",oe],["TypeError",he],["URIError",le],["AggregateError",ce]]),Be=1413632566,Ve=Symbol.for("__TurboSerial_Ctor");var Fe=i(0),Le=i.n(Fe);i.d(t,"LacertaDB",(function(){return gt})),i.d(t,"Database",(function(){return wt})),i.d(t,"Collection",(function(){return yt})),i.d(t,"Document",(function(){return lt})),i.d(t,"MigrationManager",(function(){return mt})),i.d(t,"PerformanceMonitor",(function(){return pt})),i.d(t,"LacertaDBError",(function(){return $e})),i.d(t,"OPFSUtility",(function(){return rt})),i.d(t,"IndexManager",(function(){return st})),i.d(t,"CacheStrategy",(function(){return He})),i.d(t,"LRUCache",(function(){return je})),i.d(t,"LFUCache",(function(){return qe})),i.d(t,"TTLCache",(function(){return Re})),i.d(t,"BTreeIndex",(function(){return et})),i.d(t,"TextIndex",(function(){return tt})),i.d(t,"GeoIndex",(function(){return it})),i.d(t,"SecureDatabaseEncryption",(function(){return Qe})),i.d(t,"QuickStore",(function(){return Oe})),i.d(t,"AsyncMutex",(function(){return Ne})),i.d(t,"IndexedDBConnectionPool",(function(){return Ke})),i.d(t,"BrowserCompressionUtility",(function(){return Ge})),i.d(t,"BrowserEncryptionUtility",(function(){return Xe})),
1
+ (e=>{var t={};function i(s){var r;return(t[s]||(r=t[s]={i:s,l:!1,exports:{}},e[s].call(r.exports,r,r.exports,i),r.l=!0,r)).exports}i.m=e,i.c=t,i.d=function(e,t,s){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(i.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)i.d(s,r,function(t){return e[t]}.bind(null,r));return s},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=2)})([function(e,t){var i={},s=new Float32Array(4);function r(e,t){if((0|e)!==e)throw new TypeError("Lane index must be an int32");if(e<0||t<=e)throw new RangeError("Lane index must be in bounds")}new Int32Array(s.buffer),new Int16Array(s.buffer),new Int8Array(s.buffer),new Uint32Array(s.buffer),new Uint16Array(s.buffer),new Uint8Array(s.buffer),void 0!==i.Int8x16&&void 0!==i.Int8x16.extractLane||(i.Int8x16=function(e,t,s,r,a,n,o,h,l,c,d,_,u,f,p,m){if(!(this instanceof i.Int8x16))return new i.Int8x16(e,t,s,r,a,n,o,h,l,c,d,_,u,f,p,m);this.s_=new Int8Array([e,t,s,r,a,n,o,h,l,c,d,_,u,f,p,m])},i.Int8x16.check=function(e){if(e instanceof i.Int8x16)return e;throw new TypeError("Argument is not a Int8x16.")},i.Int8x16.splat=function(e){return new i.Int8x16(e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e)},i.Int8x16.extractLane=function(e,t){return e=i.Int8x16.check(e),r(t,16),e.s_[t]},i.Int8x16.replaceLane=function(e,t,s){return e=i.Int8x16.check(e),r(t,16),(e=Array.from(e.s_))[t]=s,new i.Int8x16(...e)},i.Int8x16.shuffle=function(e,t,s,a,n,o,h,l,c,d,_,u,f,p,m,y,w,g){var v=[s,a,n,o,h,l,c,d,_,u,f,p,m,y,w,g],b=[];e=i.Int8x16.check(e),t=i.Int8x16.check(t);for(var S=0;S<16;S++){var x=v[S];r(x,32),b[S]=x<16?e.s_[x]:t.s_[x-16]}return new i.Int8x16(...b)}),void 0!==i.Uint8x16&&void 0!==i.Uint8x16.extractLane||(i.Uint8x16=function(e,t,s,r,a,n,o,h,l,c,d,_,u,f,p,m){if(!(this instanceof i.Uint8x16))return new i.Uint8x16(e,t,s,r,a,n,o,h,l,c,d,_,u,f,p,m);this.s_=new Uint8Array([e,t,s,r,a,n,o,h,l,c,d,_,u,f,p,m])},i.Uint8x16.check=function(e){if(e instanceof i.Uint8x16)return e;throw new TypeError("Argument is not a Uint8x16.")},i.Uint8x16.splat=function(e){return new i.Uint8x16(e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e)},i.Uint8x16.extractLane=function(e,t){return e=i.Uint8x16.check(e),r(t,16),e.s_[t]},i.Uint8x16.load=function(e,t){if(t<0||t*e.BYTES_PER_ELEMENT+16>e.byteLength)throw new RangeError("The value of index is invalid.");return new i.Uint8x16(...e.subarray(t,t+16))},i.Uint8x16.store=function(e,t,i){if(t<0||t*e.BYTES_PER_ELEMENT+16>e.byteLength)throw new RangeError("The value of index is invalid.");return e.set(i.s_,t),i},i.Uint8x16.shuffle=function(e,t,s,a,n,o,h,l,c,d,_,u,f,p,m,y,w,g){var v=[s,a,n,o,h,l,c,d,_,u,f,p,m,y,w,g],b=[];e=i.Uint8x16.check(e),t=i.Uint8x16.check(t);for(var S=0;S<16;S++){var x=v[S];r(x,32),b[S]=x<16?e.s_[x]:t.s_[x-16]}return new i.Uint8x16(...b)},i.Uint8x16.and=function(e,t){for(var s=[],r=0;r<16;++r)s[r]=e.s_[r]&t.s_[r];return new i.Uint8x16(...s)},i.Uint8x16.or=function(e,t){for(var s=[],r=0;r<16;++r)s[r]=e.s_[r]|t.s_[r];return new i.Uint8x16(...s)},i.Uint8x16.shiftLeftByScalar=function(e,t){for(var s=[],r=0;r<16;++r)s[r]=e.s_[r]<<t;return new i.Uint8x16(...s)},i.Uint8x16.shiftRightByScalar=function(e,t){for(var s=[],r=0;r<16;++r)s[r]=e.s_[r]>>>t;return new i.Uint8x16(...s)}),e.exports=class{constructor(){this.ENC_SHUFFLE=i.Int8x16(10,11,9,10,7,8,6,7,4,5,3,4,1,2,0,1),this.ENC_LUT="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",this.ENC_LUT_SIMD=[i.Uint8x16.splat(0),i.Uint8x16.splat(0),i.Uint8x16.splat(0),i.Uint8x16.splat(0)];for(let t=0;t<4;t++){var e=this.ENC_LUT.substring(16*t,16*(t+1));this.ENC_LUT_SIMD[t]=i.Uint8x16(...Array.from(e).map(e=>e.charCodeAt(0)))}this.DEC_DELTA_ASSO=i.Uint8x16(1,1,1,1,1,1,1,1,0,0,0,0,0,15,0,15),this.DEC_DELTA_VALUES=i.Int8x16(0,0,0,19,4,191,191,185,185,0,16,195,191,191,185,185),this.DEC_SHUFFLE=i.Int8x16(-1,-1,-1,-1,12,13,14,8,9,10,4,5,6,0,1,2),this.SCALAR_ENC_LUT="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",this.SCALAR_DEC_LUT={};for(let e=0;e<this.SCALAR_ENC_LUT.length;e++)this.SCALAR_DEC_LUT[this.SCALAR_ENC_LUT.charAt(e)]=e;this.SCALAR_DEC_LUT["="]=0}_scalar_encode(e){let t="";for(let a=0;a<e.length;a+=3){var i=e[a],s=a+1<e.length?e[a+1]:0,r=a+2<e.length?e[a+2]:0;t+=this.SCALAR_ENC_LUT[i>>2]+this.SCALAR_ENC_LUT[(3&i)<<4|s>>4],a+1<e.length?t+=this.SCALAR_ENC_LUT[(15&s)<<2|r>>6]:t+="=",a+2<e.length?t+=this.SCALAR_ENC_LUT[63&r]:t+="="}return t}encode(e){var t=e.length,i=4*Math.ceil(t/3),s=new Uint8Array(i);let r=0,a=0;for(;r+12<=t;){var n=e.subarray(r,r+12),o=new Uint8Array(16);o[0]=n[0]>>2,o[1]=(3&n[0])<<4|n[1]>>4,o[2]=(15&n[1])<<2|n[2]>>6,o[3]=63&n[2],o[4]=n[3]>>2,o[5]=(3&n[3])<<4|n[4]>>4,o[6]=(15&n[4])<<2|n[5]>>6,o[7]=63&n[5],o[8]=n[6]>>2,o[9]=(3&n[6])<<4|n[7]>>4,o[10]=(15&n[7])<<2|n[8]>>6,o[11]=63&n[8],o[12]=n[9]>>2,o[13]=(3&n[9])<<4|n[10]>>4,o[14]=(15&n[10])<<2|n[11]>>6,o[15]=63&n[11];for(let e=0;e<16;e++)s[a+e]=this.SCALAR_ENC_LUT.charCodeAt(o[e]);r+=12,a+=16}let h=(new TextDecoder).decode(s.subarray(0,a));return r<t&&(h+=this._scalar_encode(e.subarray(r))),h}_scalar_decode(e){e=e.replace(/=+$/,"");var t=Math.floor(3*e.length/4),i=new Uint8Array(t);let s=0;for(let h=0;h<e.length;h+=4){var r=this.SCALAR_DEC_LUT[e[h]],a=this.SCALAR_DEC_LUT[e[h+1]],n=h+2<e.length?this.SCALAR_DEC_LUT[e[h+2]]:0,o=h+3<e.length?this.SCALAR_DEC_LUT[e[h+3]]:0;i[s++]=r<<2|a>>4,s<t&&(i[s++]=(15&a)<<4|n>>2),s<t&&(i[s++]=(3&n)<<6|o)}return i}decode(e){var t=e.length;if(t%4!=0)throw new Error("Invalid Base64 string length.");var i=(e.match(/=/g)||[]).length,s=new Uint8Array(3*t/4-i);let r=0,a=0;for(var n;r+16<=t-i;){var o=Array.from(e.substring(r,r+16)).map(e=>this.SCALAR_DEC_LUT[e]),h=new Uint8Array(12);h[0]=o[0]<<2|o[1]>>4,h[1]=(15&o[1])<<4|o[2]>>2,h[2]=(3&o[2])<<6|o[3],h[3]=o[4]<<2|o[5]>>4,h[4]=(15&o[5])<<4|o[6]>>2,h[5]=(3&o[6])<<6|o[7],h[6]=o[8]<<2|o[9]>>4,h[7]=(15&o[9])<<4|o[10]>>2,h[8]=(3&o[10])<<6|o[11],h[9]=o[12]<<2|o[13]>>4,h[10]=(15&o[13])<<4|o[14]>>2,h[11]=(3&o[14])<<6|o[15],s.set(h,a),r+=16,a+=12}return r<t&&(n=this._scalar_decode(e.substring(r)),s.set(n,a)),s}}},function(e,t,i){i.r(t);let s=new Array(128);for(let e=0;e<128;e++){var r=[];for(let t=0;t<e;t++)r.push(`b[o+${t}]`);s[e]=new Function("b","o",`return String.fromCharCode(${r.join(",")});`)}let a=new Float32Array(1),n=new Map,o=new Map;for(var h of["asyncIterator","hasInstance","isConcatSpreadable","iterator","match","matchAll","replace","search","species","split","toPrimitive","toStringTag","unscopables"]){var l=Symbol[h];l&&(n.set(l,h),o.set(h,l))}let c=1,d=16,_=17,u=18,f=19,p=20,m=21,y=22,w=23,g=24,v=25,b=26,S=32,x=33,A=34,I=35,z=48,k=49,D=50,C=51,M=52,E=53,T=54,B=55,V=64,U=65,L=66,F=67,P=68,O=69,N=70,K=71,$=80,j=81,R=82,q=83,H=84,G=85,W=105,X=106,Q=112,Y=113,J=114,Z=128,ee=129,te=144,ie=145,se=160,re=161,ae=162,ne=163,oe=164,he=165,le=166,ce=167,de=168,_e=176,ue=192,fe=193,pe=208,me=209,ye=224,we=225,ge=226,ve=227,be=240,Se=[],xe=[];var Ae,Ie,ze;for([Ae,Ie,ze]of[[96,1,"Uint8Array"],[97,1,"Int8Array"],[98,1,"Uint8ClampedArray"],[99,2,"Uint16Array"],[100,2,"Int16Array"],[101,4,"Uint32Array"],[102,4,"Int32Array"],[103,4,"Float32Array"],[104,8,"Float64Array"],[105,8,"BigInt64Array"],[106,8,"BigUint64Array"],[107,1,"DataView"],[67,1,null],[68,2,null],[69,4,null],[70,4,null],[71,8,null]])Se[Ae]=Ie,ze&&globalThis[ze]&&(xe[Ae]=globalThis[ze]);let ke=new Map;var De,Ce,Me=["Uint8Array","Int8Array","Uint8ClampedArray","Uint16Array","Int16Array","Uint32Array","Int32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array","DataView"];for([De,Ce]of[[Date,te],[RegExp,_e],[Map,Z],[Set,ee],[ArrayBuffer,Q]])ke.set(De,Ce);for(let e=0;e<Me.length;e++){var Ee=globalThis[Me[e]];Ee&&ke.set(Ee,96+e)}globalThis.SharedArrayBuffer&&ke.set(SharedArrayBuffer,J);let Te={[se]:Error,[re]:EvalError,[ae]:RangeError,[ne]:ReferenceError,[oe]:SyntaxError,[he]:TypeError,[le]:URIError},Be=new Map([["Error",se],["EvalError",re],["RangeError",ae],["ReferenceError",ne],["SyntaxError",oe],["TypeError",he],["URIError",le],["AggregateError",ce]]),Ve=1413632566,Ue=Symbol.for("__TurboSerial_Ctor");var Le=i(0),Fe=i.n(Le);i.d(t,"LacertaDB",(function(){return vt})),i.d(t,"Database",(function(){return gt})),i.d(t,"Collection",(function(){return wt})),i.d(t,"Document",(function(){return ct})),i.d(t,"MigrationManager",(function(){return mt})),i.d(t,"PerformanceMonitor",(function(){return yt})),i.d(t,"LacertaDBError",(function(){return $e})),i.d(t,"OPFSUtility",(function(){return at})),i.d(t,"IndexManager",(function(){return rt})),i.d(t,"CacheStrategy",(function(){return He})),i.d(t,"LRUCache",(function(){return je})),i.d(t,"LFUCache",(function(){return Re})),i.d(t,"TTLCache",(function(){return qe})),i.d(t,"BTreeIndex",(function(){return et})),i.d(t,"TextIndex",(function(){return tt})),i.d(t,"GeoIndex",(function(){return it})),i.d(t,"HashIndex",(function(){return st})),i.d(t,"SecureDatabaseEncryption",(function(){return Qe})),i.d(t,"QuickStore",(function(){return Oe})),i.d(t,"AsyncMutex",(function(){return Ke})),i.d(t,"IndexedDBConnectionPool",(function(){return Ne})),i.d(t,"BrowserCompressionUtility",(function(){return Ge})),i.d(t,"BrowserEncryptionUtility",(function(){return Xe})),
2
2
  /**
3
3
  * LacertaDB V0.13.0 - Production Library
4
4
  * @module LacertaDB
@@ -6,4 +6,4 @@
6
6
  * @license MIT
7
7
  * @author Pixagram SA
8
8
  */
9
- "undefined"==typeof window||window.requestIdleCallback||(window.requestIdleCallback=function(e){return setTimeout(e,0)},window.cancelIdleCallback=clearTimeout);let Pe={compression:!1,preservePropertyDescriptors:!1,deduplication:!1,simdOptimization:!0,detectCircular:!1,shareArrayBuffers:!1,allowFunction:!1,serializeFunctions:!1,memoryPoolSize:262144};class Oe{constructor(e,t,i,s=null){this._dbName=e,this._serializer=t,this._base64=i,this._idb=s,this._metaKey="quickstore_"+e,this._docs=new Map,this._hydrated=!1,this._dirtyDocs=new Set,this._dirtyIndex=!1,this._saveTimer=null}destroy(){this._saveTimer&&("undefined"!=typeof window&&window.cancelIdleCallback?window.cancelIdleCallback(this._saveTimer):clearTimeout(this._saveTimer),this._saveTimer=null)}async hydrateFromIDB(){if(!this._hydrated){if(this._idb&&this._idb.objectStoreNames.contains("__meta"))try{var e=await wt._readMeta(this._idb,this._metaKey);if(e&&e.docs){var t=this._base64.decode(e.docs),i=this._serializer.deserialize(t);if(Array.isArray(i))for(var[s,r]of i)this._docs.set(s,r)}}catch(e){console.warn("QuickStore IDB hydration failed, trying localStorage fallback.",e),this._hydrateFromLocalStorage()}else this._hydrateFromLocalStorage();this._hydrated=!0}}_hydrateFromLocalStorage(){var e=`lacertadb_${this._dbName}_quickstore_`,t=e+"index",i=localStorage.getItem(t);if(i)try{var s,r,a,n=this._base64.decode(i);for(s of this._serializer.deserialize(n)){var o=e+"data_"+s,h=localStorage.getItem(o);if(h)try{var l=this._base64.decode(h);this._docs.set(s,this._serializer.deserialize(l))}catch(e){}}for(r of(this._dirtyIndex=!0,this._docs.keys()))this._dirtyDocs.add(r);for(a of(this._persistDirty(),localStorage.removeItem(t),this._docs.keys()))localStorage.removeItem(e+"data_"+a)}catch(e){console.warn("QuickStore localStorage hydration failed.",e)}}_ensureHydrated(){this._hydrated||(this._hydrated=!0)}_scheduleSave(){var e;this._saveTimer||(e=()=>{this._saveTimer=null,this._persistDirty()},"undefined"!=typeof window&&window.requestIdleCallback?this._saveTimer=window.requestIdleCallback(e):this._saveTimer=setTimeout(e,200))}_persistDirty(){if((0!==this._dirtyDocs.size||this._dirtyIndex)&&(this._dirtyDocs.clear(),this._dirtyIndex=!1,this._idb)&&this._idb.objectStoreNames.contains("__meta"))try{var e=Array.from(this._docs.entries()),t=this._serializer.serialize(e),i=this._base64.encode(t);wt._writeMeta(this._idb,this._metaKey,{docs:i}).catch(e=>{console.error("QuickStore IDB save failed:",e)})}catch(e){console.error("QuickStore serialization failed:",e)}}add(e,t){this._ensureHydrated();var i=!this._docs.has(e);return this._docs.set(e,t),this._dirtyDocs.add(e),i&&(this._dirtyIndex=!0),this._scheduleSave(),!0}get(e){return this._ensureHydrated(),void 0!==(e=this._docs.get(e))?e:null}update(e,t){return this.add(e,t)}delete(e){this._ensureHydrated(),this._docs.has(e)&&(this._docs.delete(e),this._dirtyDocs.add(e),this._dirtyIndex=!0,this._scheduleSave())}getAll(){this._ensureHydrated();var e,t,i=[];for([e,t]of this._docs)i.push({_id:e,...t});return i}query(e={}){return 0===Object.keys(e).length?this.getAll():this.getAll().filter(t=>ut.evaluate(t,e))}clear(){this._ensureHydrated(),this._docs.clear(),this._dirtyDocs.clear(),this._dirtyIndex=!1,this._saveTimer&&("undefined"!=typeof window&&window.cancelIdleCallback?window.cancelIdleCallback(this._saveTimer):clearTimeout(this._saveTimer),this._saveTimer=null),this._idb&&this._idb.objectStoreNames.contains("__meta")&&wt._writeMeta(this._idb,this._metaKey,{docs:null}).catch(()=>{});var e=`lacertadb_${this._dbName}_quickstore_index`;try{localStorage.removeItem(e)}catch(e){}}get size(){return this._ensureHydrated(),this._docs.size}}class Ke{constructor(){this._connections=new Map,this._refCounts=new Map}async getConnection(e,t=1,i){let s=e+"_v"+t;var r;return this._connections.has(s)?(this._refCounts.set(s,(this._refCounts.get(s)||0)+1),this._connections.get(s)):((r=await new Promise((s,r)=>{let a=indexedDB.open(e,t);a.onerror=()=>r(new $e("Failed to open database","DATABASE_OPEN_FAILED",a.error)),a.onsuccess=()=>s(a.result),a.onupgradeneeded=e=>{i&&i(e.target.result,e.oldVersion,e.newVersion)}})).onclose=()=>{this._connections.delete(s),this._refCounts.delete(s)},this._connections.set(s,r),this._refCounts.set(s,1),r)}releaseConnection(e,t=1){var i;e=e+"_v"+t;(t=this._refCounts.get(e)||0)<=1?(i=this._connections.get(e))&&(i.close(),this._connections.delete(e),this._refCounts.delete(e)):this._refCounts.set(e,t-1)}closeAll(){for(var e of this._connections.values())e.close();this._connections.clear(),this._refCounts.clear()}}new Ke;class Ne{constructor(){this._queue=[],this._headIndex=0,this._locked=!1}acquire(){return new Promise(e=>{this._queue.push(e),this._dispatch()})}release(){this._locked=!1,this._dispatch()}async runExclusive(e){var t=await this.acquire();try{return await e()}finally{t()}}_dispatch(){this._locked||this._headIndex>=this._queue.length||(this._locked=!0,(0,this._queue[this._headIndex++])(()=>this.release()),1e3<this._headIndex&&this._headIndex>this._queue.length>>>1&&(this._queue=this._queue.slice(this._headIndex),this._headIndex=0))}}class $e extends Error{constructor(e,t,i){super(e),this.name="LacertaDBError",this.code=t,this.originalError=i||null,this._ts=Date.now()}get timestamp(){return new Date(this._ts).toISOString()}}class je{constructor(e=100,t=null){this._maxSize=e,this._ttl=t,this._cache=new Map}get(e){var t=this._cache.get(e);return t?this._ttl&&Date.now()-t.ts>this._ttl?(this._cache.delete(e),null):(this._cache.delete(e),this._cache.set(e,t),t.value):null}set(e,t){this._cache.has(e)?this._cache.delete(e):this._cache.size>=this._maxSize&&this._cache.delete(this._cache.keys().next().value),this._cache.set(e,{value:t,ts:Date.now()})}delete(e){return this._cache.delete(e)}clear(){this._cache.clear()}has(e){return null!==this.get(e)}get size(){return this._cache.size}}class qe{constructor(e=100,t=null){this._maxSize=e,this._ttl=t,this._cache=new Map,this._frequencies=new Map,this._timestamps=new Map,this._buckets=new Map,this._minFreq=0}get(e){if(!this._cache.has(e))return null;if(this._ttl){var t=this._timestamps.get(e);if(Date.now()-t>this._ttl)return this.delete(e),null}var i=(t=this._frequencies.get(e)||1)+1,s=(this._frequencies.set(e,i),this._buckets.get(t));return s&&(s.delete(e),0===s.size)&&(this._buckets.delete(t),this._minFreq===t)&&(this._minFreq=i),this._buckets.has(i)||this._buckets.set(i,new Set),this._buckets.get(i).add(e),this._cache.get(e)}set(e,t){var i;this._maxSize<=0||(this._cache.has(e)?(this._cache.set(e,t),this.get(e)):(this._cache.size>=this._maxSize&&(i=this._buckets.get(this._minFreq))&&0<i.size&&(i=i.values().next().value,this.delete(i)),this._cache.set(e,t),this._frequencies.set(e,1),this._timestamps.set(e,Date.now()),this._buckets.has(1)||this._buckets.set(1,new Set),this._buckets.get(1).add(e),this._minFreq=1))}delete(e){var t,i;return!!this._cache.has(e)&&(t=this._frequencies.get(e)||1,(i=this._buckets.get(t))&&(i.delete(e),0===i.size)&&this._buckets.delete(t),this._frequencies.delete(e),this._timestamps.delete(e),this._cache.delete(e))}clear(){this._cache.clear(),this._frequencies.clear(),this._timestamps.clear(),this._buckets.clear(),this._minFreq=0}has(e){return null!==this.get(e)}get size(){return this._cache.size}}class Re{constructor(e=6e4){this._ttl=e,this._cache=new Map,this._sweepTimer=null,this._scheduleSweep()}get(e){var t=this._cache.get(e);return t?Date.now()-t.ts>this._ttl?(this._cache.delete(e),null):t.value:null}set(e,t){this._cache.set(e,{value:t,ts:Date.now()})}delete(e){return this._cache.delete(e)}clear(){this._cache.clear()}has(e){return null!==this.get(e)}get size(){return this._cache.size}_scheduleSweep(){if("undefined"!=typeof globalThis){let e=t=>{if(0!==this._cache.size){var i=Date.now(),s=this._cache.entries();let e=s.next();for(;!e.done&&0<t.timeRemaining();){var[r,a]=e.value;i-a.ts>this._ttl&&this._cache.delete(r),e=s.next()}}this._sweepTimer=requestIdleCallback(e,{timeout:this._ttl})};this._sweepTimer=requestIdleCallback(e,{timeout:this._ttl})}}destroy(){this._sweepTimer&&(("undefined"!=typeof cancelIdleCallback?cancelIdleCallback:clearTimeout)(this._sweepTimer),this._sweepTimer=null),this._cache.clear()}}class He{constructor(e={}){this._config=e,this._cache=this._createCache()}get cache(){return this._cache||(this._cache=this._createCache()),this._cache}_createCache(){var e=this._config.type||"lru",t=this._config.maxSize||100,i=this._config.ttl;return"none"===e||!1===this._config.enabled?null:"ttl"===e?new Re(i):new("lfu"===e?qe:je)(t,i)}get(e){return this.cache?this.cache.get(e):null}set(e,t){this.cache&&this.cache.set(e,t)}delete(e){this.cache&&this.cache.delete(e)}clear(){this.cache&&this.cache.clear()}updateStrategy(e){this._config={...this._config,...e},this._cache=null}destroy(){this._cache&&this._cache.destroy?this._cache.destroy():this._cache&&this._cache.clear&&this._cache.clear(),this._cache=null}}class Ge{async compress(e){if(!(e instanceof Uint8Array))throw new TypeError("Input must be Uint8Array");try{var t=new Response(e).body.pipeThrough(new CompressionStream("deflate")),i=await new Response(t).arrayBuffer(),s=new Uint8Array(i.byteLength+1);return s[0]=1,s.set(new Uint8Array(i),1),s}catch(i){return(t=new Uint8Array(e.byteLength+1))[0]=0,t.set(e,1),t}}async decompress(e){if(!(e instanceof Uint8Array))throw new TypeError("Input must be Uint8Array");if(0===e.length)return e;var t=e[0],i=e.slice(1);if(0===t)return i;if(1!==t)return e;try{var s=new Response(i).body.pipeThrough(new DecompressionStream("deflate")),r=await new Response(s).arrayBuffer();return new Uint8Array(r)}catch(t){return console.error("Decompression failed",t),e}}compressSync(e){if(e instanceof Uint8Array)return e;throw new TypeError("Input must be Uint8Array")}decompressSync(e){if(e instanceof Uint8Array)return e;throw new TypeError("Input must be Uint8Array")}}let We=new Ge;class Xe{async encrypt(e,t){var i=new TextEncoder,s=crypto.getRandomValues(new Uint8Array(16)),r=crypto.getRandomValues(new Uint8Array(12));i=i.encode(t),t=await crypto.subtle.importKey("raw",i,"PBKDF2",!1,["deriveBits","deriveKey"]),i=await crypto.subtle.deriveKey({name:"PBKDF2",salt:s,iterations:6e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"]),t=await crypto.subtle.encrypt({name:"AES-GCM",iv:r},i,e);return(i=new Uint8Array(s.length+r.length+t.byteLength)).set(s,0),i.set(r,s.length),i.set(new Uint8Array(t),s.length+r.length),i}async decrypt(e,t){var i=new TextEncoder,s=e.slice(0,16),r=e.slice(16,28);e=e.slice(28),i=i.encode(t),t=await crypto.subtle.importKey("raw",i,"PBKDF2",!1,["deriveBits","deriveKey"]),i=await crypto.subtle.deriveKey({name:"PBKDF2",salt:s,iterations:6e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"]),s=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},i,e);return new Uint8Array(s)}}class Qe{constructor(e={},t,i){this._iterations=e.iterations||6e5,this._hashAlgorithm=e.hashAlgorithm||"SHA-256",this._keyLength=e.keyLength||256,this._saltLength=e.saltLength||32,this._initialized=!1,this._serializer=t,this._base64=i,this._masterKey=null,this._hmacKey=null,this._salt=null,this._wrappedKeyBlob=null}get initialized(){return this._initialized}async initialize(e,t=null){if(this._initialized)throw new Error("Database encryption already initialized");if(e=(new TextEncoder).encode(e),t){this._salt=this._base64.decode(t.salt);var i=await this._deriveKEK(e,this._salt),s=(t=this._base64.decode(t.wrappedKey)).slice(0,12);t=t.slice(12);try{var r=await crypto.subtle.decrypt({name:"AES-GCM",iv:s},i,t);await this._importMasterKeys(r)}catch(e){throw new Error("Invalid PIN or corrupted key data")}}else this._salt=crypto.getRandomValues(new Uint8Array(this._saltLength)),s=await this._deriveKEK(e,this._salt),i=crypto.getRandomValues(new Uint8Array(64)),await this._importMasterKeys(i.buffer),t=crypto.getRandomValues(new Uint8Array(12)),r=await crypto.subtle.encrypt({name:"AES-GCM",iv:t},s,i),(e=new Uint8Array(12+r.byteLength)).set(t,0),e.set(new Uint8Array(r),12),this._wrappedKeyBlob=this._base64.encode(e);return this._initialized=!0,this.exportMetadata()}async _deriveKEK(e,t){return e=await crypto.subtle.importKey("raw",e,"PBKDF2",!1,["deriveBits","deriveKey"]),crypto.subtle.deriveKey({name:"PBKDF2",salt:t,iterations:this._iterations,hash:this._hashAlgorithm},e,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}async _importMasterKeys(e){var t=(e=new Uint8Array(e)).slice(0,32);e=e.slice(32,64);this._masterKey=await crypto.subtle.importKey("raw",t,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),this._hmacKey=await crypto.subtle.importKey("raw",e,{name:"HMAC",hash:"SHA-256"},!0,["sign","verify"])}async _exportMasterKeys(){var e=await crypto.subtle.exportKey("raw",this._masterKey),t=await crypto.subtle.exportKey("raw",this._hmacKey),i=new Uint8Array(64);return i.set(new Uint8Array(e),0),i.set(new Uint8Array(t),32),i}async changePin(e,t){if(!this._initialized)throw new Error("Database encryption not initialized");e=await this._deriveKEK((new TextEncoder).encode(e),this._salt);var i=(s=this._base64.decode(this._wrappedKeyBlob)).slice(0,12),s=s.slice(12);try{await crypto.subtle.decrypt({name:"AES-GCM",iv:i},e,s)}catch(e){throw new Error("Invalid old PIN")}return i=crypto.getRandomValues(new Uint8Array(this._saltLength)),e=await this._deriveKEK((new TextEncoder).encode(t),i),s=await this._exportMasterKeys(),t=crypto.getRandomValues(new Uint8Array(12)),e=await crypto.subtle.encrypt({name:"AES-GCM",iv:t},e,s),(s=new Uint8Array(12+e.byteLength)).set(t,0),s.set(new Uint8Array(e),12),this._salt=i,this._wrappedKeyBlob=this._base64.encode(s),this.exportMetadata()}async encrypt(e){if(!this._initialized)throw new Error("Database encryption not initialized");let t;t="string"==typeof e?(new TextEncoder).encode(e):e instanceof Uint8Array?e:this._serializer.serialize(e);e=crypto.getRandomValues(new Uint8Array(12));var i=await crypto.subtle.encrypt({name:"AES-GCM",iv:e},this._masterKey,t),s=((s=new Uint8Array(e.length+i.byteLength)).set(e,0),s.set(new Uint8Array(i),e.length),await crypto.subtle.sign("HMAC",this._hmacKey,s)),r=new Uint8Array(e.length+i.byteLength+32);return r.set(e,0),r.set(new Uint8Array(i),e.length),r.set(new Uint8Array(s),e.length+i.byteLength),r}async decrypt(e){if(!this._initialized)throw new Error("Database encryption not initialized");if(!(e instanceof Uint8Array))throw new TypeError("Encrypted data must be Uint8Array");var t=e.slice(0,12),i=e.slice(-32),s=(e=e.slice(12,-32),new Uint8Array(t.length+e.length));if(i=(s.set(t,0),s.set(e,t.length),await crypto.subtle.verify("HMAC",this._hmacKey,i,s)))return s=await crypto.subtle.decrypt({name:"AES-GCM",iv:t},this._masterKey,e),new Uint8Array(s);throw new Error("HMAC verification failed - data may be tampered")}async encryptPrivateKey(e,t=""){if(!this._initialized)throw new Error("Database encryption not initialized");t=(s=new TextEncoder).encode(t);let i;i="string"==typeof e?s.encode(e):e instanceof Uint8Array?e:this._serializer.serialize(e);var s=crypto.getRandomValues(new Uint8Array(12)),r=(e=await crypto.subtle.encrypt({name:"AES-GCM",iv:s,additionalData:t,tagLength:128},this._masterKey,i),new Uint32Array([t.length])),a=new Uint8Array(16+t.length+e.byteLength);return a.set(s,0),a.set(new Uint8Array(r.buffer),12),a.set(t,16),a.set(new Uint8Array(e),16+t.length),this._base64.encode(a)}async decryptPrivateKey(e,t=""){if(!this._initialized)throw new Error("Database encryption not initialized");var i=(e=this._base64.decode(e)).slice(0,12),s=e.slice(12,16),r=(s=new Uint32Array(s.buffer)[0],e.slice(16,16+s));e=e.slice(16+s),s=(new TextEncoder).encode(t);if(this._arrayEquals(r,s))return t=await crypto.subtle.decrypt({name:"AES-GCM",iv:i,additionalData:r,tagLength:128},this._masterKey,e),(new TextDecoder).decode(t);throw new Error("Additional authentication data mismatch")}static generateSecurePIN(e=6){for(var t=[],i=new Uint8Array(1);t.length<e;)crypto.getRandomValues(i),i[0]<250&&t.push((i[0]%10).toString());return t.join("")}destroy(){this._masterKey=null,this._hmacKey=null,this._initialized=!1}_arrayEquals(e,t){if(e.length!==t.length)return!1;let i=0;for(let s=0;s<e.length;s++)i|=e[s]^t[s];return 0===i}exportMetadata(){return{salt:this._base64.encode(this._salt),wrappedKey:this._wrappedKeyBlob,iterations:this._iterations,algorithm:"AES-GCM-256",kdf:"PBKDF2",hashAlgorithm:this._hashAlgorithm,keyLength:this._keyLength,saltLength:this._saltLength}}importMetadata(e){}}class Ye{constructor(e,t=4){this.boundary=e,this.capacity=t,this.points=[],this.divided=!1}insert(e){return!!this._contains(this.boundary,e)&&(this.points.length<this.capacity?(this.points.push(e),!0):(this.divided||this._subdivide(),this.northeast.insert(e)||this.northwest.insert(e)||this.southeast.insert(e)||this.southwest.insert(e)))}query(e,t=[]){if(this._intersects(this.boundary,e)){for(var i of this.points)this._contains(e,i)&&t.push(i);this.divided&&(this.northwest.query(e,t),this.northeast.query(e,t),this.southwest.query(e,t),this.southeast.query(e,t))}return t}remove(e){this.points=this.points.filter(t=>t.data!==e),this.divided&&(this.northwest.remove(e),this.northeast.remove(e),this.southwest.remove(e),this.southeast.remove(e))}_subdivide(){var{x:e,y:t,w:i,h:s}=this.boundary,i=i/2,s=s/2;this.northeast=new Ye({x:e+i,y:t-s,w:i,h:s},this.capacity),this.northwest=new Ye({x:e-i,y:t-s,w:i,h:s},this.capacity),this.southeast=new Ye({x:e+i,y:t+s,w:i,h:s},this.capacity),this.southwest=new Ye({x:e-i,y:t+s,w:i,h:s},this.capacity),this.divided=!0}_contains(e,t){return t.x>=e.x-e.w&&t.x<=e.x+e.w&&t.y>=e.y-e.h&&t.y<=e.y+e.h}_intersects(e,t){return!(t.x-t.w>e.x+e.w||t.x+t.w<e.x-e.w||t.y-t.h>e.y+e.h||t.y+t.h<e.y-e.h)}}function Je(e,t){var i,s;return e===t?0:(i=typeof e)==(s=typeof t)?"number"==i?e<t?-1:1:"string"==i?e<t?-1:t<e?1:0:(e=String(e))<(t=String(t))?-1:t<e?1:0:i<s?-1:1}class Ze{constructor(e,t){this.keys=new Array(2*e-1),this.values=new Array(2*e-1),this.children=new Array(2*e),this.n=0,this.leaf=t,this.order=e}search(e){let t=0;for(;t<this.n&&0<Je(e,this.keys[t]);)t++;return t<this.n&&0===Je(e,this.keys[t])?this.values[t]:!this.leaf&&this.children[t]?this.children[t].search(e):null}rangeSearch(e,t,i,s=!1,r=!1){let a=0;if(null!==e)for(;a<this.n&&Je(this.keys[a],e)<0;)a++;for(;a<this.n;a++){if(null!==t){var n=Je(this.keys[a],t);if(r?0<=n:0<n)return void(!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,s,r))}!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,s,r);n=null===e?1:Je(this.keys[a],e);var o=null===t?-1:Je(this.keys[a],t);(null===e||(s?0<n:0<=n))&&(null===t||(r?o<0:o<=0))&&this.values[a]&&this.values[a].forEach(e=>i.push(e))}!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,s,r)}insertNonFull(e,t){let i=this.n-1;if(this.leaf){for(;0<=i&&0<Je(this.keys[i],e);)this.keys[i+1]=this.keys[i],this.values[i+1]=this.values[i],i--;0<=i&&0===Je(this.keys[i],e)?(this.values[i]||(this.values[i]=new Set),this.values[i].add(t)):(this.keys[i+1]=e,this.values[i+1]=new Set([t]),this.n++)}else{for(;0<=i&&0<Je(this.keys[i],e);)i--;if(0<=i&&0===Je(this.keys[i],e))this.values[i]||(this.values[i]=new Set),this.values[i].add(t);else{if(i++,this.children[i]&&this.children[i].n===2*this.order-1){this.splitChild(i,this.children[i]);var s=Je(this.keys[i],e);if(0===s)return this.values[i]||(this.values[i]=new Set),void this.values[i].add(t);s<0&&i++}this.children[i]&&this.children[i].insertNonFull(e,t)}}}splitChild(e,t){var i=new Ze(this.order,t.leaf);i.n=this.order-1;for(let e=0;e<this.order-1;e++)i.keys[e]=t.keys[e+this.order],i.values[e]=t.values[e+this.order];if(!t.leaf)for(let e=0;e<this.order;e++)i.children[e]=t.children[e+this.order];var s=t.keys[this.order-1],r=t.values[this.order-1];t.n=this.order-1;for(let e=this.order-1;e<2*this.order-1;e++)t.keys[e]=void 0,t.values[e]=void 0;if(!t.leaf)for(let e=this.order;e<2*this.order;e++)t.children[e]=void 0;for(let t=this.n;t>=e+1;t--)this.children[t+1]=this.children[t];this.children[e+1]=i;for(let t=this.n-1;t>=e;t--)this.keys[t+1]=this.keys[t],this.values[t+1]=this.values[t];this.keys[e]=s,this.values[e]=r,this.n++}_getPredecessor(e){let t=this.children[e];for(;!t.leaf;)t=t.children[t.n];return{key:t.keys[t.n-1],value:t.values[t.n-1]}}_getSuccessor(e){let t=this.children[e+1];for(;!t.leaf;)t=t.children[0];return{key:t.keys[0],value:t.values[0]}}_merge(e){var t=this.children[e],i=this.children[e+1],s=this.order;t.keys[s-1]=this.keys[e],t.values[s-1]=this.values[e];for(let e=0;e<i.n;e++)t.keys[s+e]=i.keys[e],t.values[s+e]=i.values[e];if(!t.leaf)for(let e=0;e<=i.n;e++)t.children[s+e]=i.children[e];t.n+=i.n+1;for(let t=e;t<this.n-1;t++)this.keys[t]=this.keys[t+1],this.values[t]=this.values[t+1];for(let t=e+1;t<this.n;t++)this.children[t]=this.children[t+1];this.keys[this.n-1]=void 0,this.values[this.n-1]=void 0,this.children[this.n]=void 0,this.n--}_borrowFromPrev(e){var t=this.children[e],i=this.children[e-1];for(let e=t.n-1;0<=e;e--)t.keys[e+1]=t.keys[e],t.values[e+1]=t.values[e];if(!t.leaf)for(let e=t.n;0<=e;e--)t.children[e+1]=t.children[e];t.keys[0]=this.keys[e-1],t.values[0]=this.values[e-1],t.leaf||(t.children[0]=i.children[i.n],i.children[i.n]=void 0),this.keys[e-1]=i.keys[i.n-1],this.values[e-1]=i.values[i.n-1],i.keys[i.n-1]=void 0,i.values[i.n-1]=void 0,t.n++,i.n--}_borrowFromNext(e){var t=this.children[e],i=this.children[e+1];t.keys[t.n]=this.keys[e],t.values[t.n]=this.values[e],t.leaf||(t.children[t.n+1]=i.children[0]),this.keys[e]=i.keys[0],this.values[e]=i.values[0];for(let e=0;e<i.n-1;e++)i.keys[e]=i.keys[e+1],i.values[e]=i.values[e+1];if(!i.leaf){for(let e=0;e<i.n;e++)i.children[e]=i.children[e+1];i.children[i.n]=void 0}i.keys[i.n-1]=void 0,i.values[i.n-1]=void 0,t.n++,i.n--}_fill(e){var t=this.order;0<e&&this.children[e-1]&&this.children[e-1].n>=t?this._borrowFromPrev(e):e<this.n&&this.children[e+1]&&this.children[e+1].n>=t?this._borrowFromNext(e):e<this.n?this._merge(e):this._merge(e-1)}_removeFromLeaf(e){for(let t=e;t<this.n-1;t++)this.keys[t]=this.keys[t+1],this.values[t]=this.values[t+1];this.keys[this.n-1]=void 0,this.values[this.n-1]=void 0,this.n--}_removeFromInternal(e){var t,i=this.order,s=this.keys[e];this.children[e]&&this.children[e].n>=i?(t=this._getPredecessor(e),this.keys[e]=t.key,this.values[e]=t.value,this.children[e]._remove(t.key,null,!0)):this.children[e+1]&&this.children[e+1].n>=i?(t=this._getSuccessor(e),this.keys[e]=t.key,this.values[e]=t.value,this.children[e+1]._remove(t.key,null,!0)):(this._merge(e),this.children[e]._remove(s,null,!0))}_remove(e,t,i){let s=0;for(;s<this.n&&0<Je(e,this.keys[s]);)s++;var r;if(s<this.n&&0===Je(e,this.keys[s])){let e=i;return!e&&this.values[s]&&(this.values[s].delete(t),e=0===this.values[s].size),!!e&&(this.leaf?this._removeFromLeaf(s):this._removeFromInternal(s),!0)}return!this.leaf&&(r=s===this.n,this.children[s]&&this.children[s].n<this.order&&this._fill(s),r&&s>this.n?!!this.children[s-1]&&this.children[s-1]._remove(e,t,i):!!this.children[s]&&this.children[s]._remove(e,t,i))}remove(e,t){return this._remove(e,t,!1)}removeKey(e){return this._remove(e,null,!0)}verify(){var e,t=[];for(let e=0;e<this.n;e++)null==this.keys[e]&&t.push(`Invalid key (${this.keys[e]}) at index `+e);for(let e=1;e<this.n;e++)Je(this.keys[e],this.keys[e-1])<=0&&t.push("Key order violation at index "+e);if(!this.leaf)for(let i=0;i<=this.n;i++)this.children[i]&&(e=this.children[i].verify(),t.push(...e));return t}}class et{constructor(e=4){this._root=null,this._order=e,this._size=0}insert(e,t){if(!(null==e||"number"==typeof e&&isNaN(e))){if(this._root){var i=this._root.search(e);if(i&&i.has(t))return}if(this._root)if(this._root.n===2*this._order-1){(i=new Ze(this._order,!1)).children[0]=this._root,i.splitChild(0,this._root);let r=0;var s=Je(i.keys[0],e);0===s?(i.values[0]||(i.values[0]=new Set),i.values[0].add(t)):(s<0&&r++,i.children[r].insertNonFull(e,t)),this._root=i}else this._root.insertNonFull(e,t);else this._root=new Ze(this._order,!0),this._root.keys[0]=e,this._root.values[0]=new Set([t]),this._root.n=1;this._size++}}find(e){return this._root&&(e=this._root.search(e))?Array.from(e):[]}contains(e){return!!this._root&&null!==this._root.search(e)}range(e,t,i=!1,s=!1){return this._root?(this._root.rangeSearch(e,t,e=[],i,s),e):[]}rangeFrom(e,t=!1){return this._root?(this._root.rangeSearch(e,null,e=[],t,!1),e):[]}rangeTo(e,t=!1){return this._root?(this._root.rangeSearch(null,e,e=[],!1,t),e):[]}remove(e,t){var i;this._root&&(i=this._root.search(e))&&i.has(t)&&(this._root.remove(e,t),0===this._root.n&&!this._root.leaf&&this._root.children[0]&&(this._root=this._root.children[0]),this._size--)}verify(){var e;return this._root?(0<(e=this._root.verify()).length&&console.warn("BTree index issues detected (rebuild required):",e),{healthy:0===e.length,issues:e,requiresRebuild:0<e.length}):{healthy:!0,issues:[]}}clear(){this._root=null,this._size=0}get size(){return this._size}toSortedEntries(){var e;return this._root?(this._collectInOrder(this._root,e=[]),e):[]}_collectInOrder(e,t){for(let i=0;i<e.n;i++)!e.leaf&&e.children[i]&&this._collectInOrder(e.children[i],t),e.values[i]&&0<e.values[i].size&&t.push([e.keys[i],Array.from(e.values[i])]);!e.leaf&&e.children[e.n]&&this._collectInOrder(e.children[e.n],t)}static fromSortedEntries(e,t=4){var i=new et(t);for(let t=0;t<e.length;t++){var[s,r]=e[t];if(null!=s)for(let e=0;e<r.length;e++)i.insert(s,r[e])}return i}}class tt{constructor(){this._invertedIndex=new Map,this._docTokens=new Map,this._segmenter="undefined"!=typeof Intl&&Intl.Segmenter?new Intl.Segmenter(void 0,{granularity:"word"}):null}addDocument(e,t){if("string"==typeof e){var i;e=this._tokenize(e);for(i of(this._docTokens.set(t,new Set(e)),e))this._invertedIndex.has(i)||this._invertedIndex.set(i,new Set),this._invertedIndex.get(i).add(t)}}removeDocument(e){var t=this._docTokens.get(e);if(t){for(var i of t){var s=this._invertedIndex.get(i);s&&(s.delete(e),0===s.size)&&this._invertedIndex.delete(i)}this._docTokens.delete(e)}}updateDocument(e,t){this.removeDocument(e),this.addDocument(t,e)}search(e){var t;if(0===(e=this._tokenize(e)).length)return[];let i=null;for(t of e){var s=this._invertedIndex.get(t);if(!s||0===s.size)return[];if(null===i)i=new Set(s);else{if(i.size<=s.size){var r,a=new Set;for(r of i)s.has(r)&&a.add(r);i=a}else{var n,o=new Set;for(n of s)i.has(n)&&o.add(n);i=o}if(0===i.size)return[]}}return i?Array.from(i):[]}_tokenize(e){if(this._segmenter){var t,i=[];for(t of this._segmenter.segment(e.toLowerCase()))t.isWordLike&&i.push(t.segment);return i.filter(e=>1<e.length)}return e.toLowerCase().replace(/[^\w\s]/g," ").split(/\s+/).filter(e=>1<e.length)}get size(){return this._docTokens.size}}class it{constructor(){this._tree=new Ye({x:0,y:0,w:180,h:90}),this._size=0}addPoint(e,t){e&&"number"==typeof e.lat&&"number"==typeof e.lng&&(this._tree.insert({x:e.lng,y:e.lat,data:t}),this._size++)}removePoint(e){this._tree.remove(e),0<this._size&&this._size--}updatePoint(e,t){this.removePoint(e),this.addPoint(t,e)}findNear(e,t){var i,s=t/111,r={x:e.lng,y:e.lat,w:s,h:s},a=[],n=s*s;for(i of this._tree.query(r)){var o=i.x-e.lng,h=i.y-e.lat;n<o*o+h*h||(o=this._haversine(e,{lat:i.y,lng:i.x}))<=t&&a.push({docId:i.data,distance:o})}return a.sort((e,t)=>e.distance-t.distance).map(e=>e.docId)}findWithin(e){var t=(e.maxLng-e.minLng)/2,i=(e.maxLat-e.minLat)/2;return this._tree.query({x:e.minLng+t,y:e.minLat+i,w:t,h:i}).map(e=>e.data)}_haversine(e,t){var i=this._toRad(t.lat-e.lat),s=this._toRad(t.lng-e.lng);i=Math.sin(i/2)*Math.sin(i/2)+Math.cos(this._toRad(e.lat))*Math.cos(this._toRad(t.lat))*Math.sin(s/2)*Math.sin(s/2);return 2*Math.atan2(Math.sqrt(i),Math.sqrt(1-i))*6371}_toRad(e){return e*(Math.PI/180)}get size(){return this._size}}class st{constructor(e){this._collection=e,this._serializer=e.database._serializer,this._base64=e.database._base64,this._indexes=new Map,this._indexData=new Map,this._indexQueue=[],this._processing=!1,this._dirtyIndexes=new Set,this._persistTimer=null,this._persistDelay=2e3}get indexes(){return this._indexes}static get IDX_PREFIX(){return"__lacerta_idx_"}async createIndex(e,t={}){var i=t.name||e;if(this._indexes.has(i))throw new Error(`Index '${i}' already exists`);return e={fieldPath:e,unique:t.unique||!1,sparse:t.sparse||!1,type:t.type||"btree",hashed:t.hashed||!1,collation:t.collation||null,createdAt:Date.now()},this._indexes.set(i,e),await this.rebuildIndex(i),this._saveIndexMetadata(),i}async rebuildIndex(e){var t=this._indexes.get(e);if(!t)throw new Error(`Index '${e}' not found`);var i=this._createIndexStructure(t.type);this._indexData.set(e,i);let s=null;for(;;){var r,a,n=await this._collection._indexedDB.getBatch(this._collection._db,this._collection._storeName,s,200);if(0===n.length)break;for(r of n)if("string"==typeof r._id&&r._id.startsWith(st.IDX_PREFIX))s=r._id;else{s=r._id;let e=r;r.packedData&&(await(a=new lt(r,{compressed:r._compressed,encrypted:r._encrypted},this._serializer)).unpack(this._collection.database.encryption),e=a.objectOutput());let n=this._getFieldValue(e,t.fieldPath);t.sparse&&null==n||t.unique&&i.has&&i.has(n)||(t.hashed&&"btree"===t.type&&(n=await this._hashVal(n)),this._addToIndex(i,n,e._id,t.type))}}await this._persistIndex(e)}async _restoreIndex(e){var t=this._indexes.get(e);if(!t||"btree"!==t.type)return!1;try{var i,s=""+st.IDX_PREFIX+e,r=await this._collection._indexedDB.get(this._collection._db,this._collection._storeName,s);return!!(r&&r._entries&&Array.isArray(r._entries))&&((i=et.fromSortedEntries(r._entries,4)).verify().healthy?(this._indexData.set(e,i),!0):(console.warn(`[IndexManager] Persisted index '${e}' is corrupt, will rebuild`),!1))}catch(e){return!1}}async _persistIndex(e){var t=this._indexData.get(e);if(t&&t instanceof et)try{var i={_id:""+st.IDX_PREFIX+e,_entries:t.toSortedEntries(),_persisted_at:Date.now(),_size:t.size};await this._collection._indexedDB.put(this._collection._db,this._collection._storeName,i)}catch(t){console.warn(`[IndexManager] Failed to persist index '${e}':`,t.message)}}_schedulePersist(e){this._dirtyIndexes.add(e),this._persistTimer||(this._persistTimer=setTimeout(async()=>{this._persistTimer=null;var e,t=Array.from(this._dirtyIndexes);for(e of(this._dirtyIndexes.clear(),t))await this._persistIndex(e)},this._persistDelay))}async flushPersistence(){this._persistTimer&&(clearTimeout(this._persistTimer),this._persistTimer=null);var e,t=Array.from(this._dirtyIndexes);for(e of(this._dirtyIndexes.clear(),t))await this._persistIndex(e)}_createIndexStructure(e){switch(e){case"btree":return new et;case"hash":return new Map;case"text":return new tt;case"geo":return new it;default:return new Map}}_addToIndex(e,t,i,s){switch(s){case"btree":e.insert(t,i);break;case"hash":e.has(t)||e.set(t,new Set),e.get(t).add(i);break;case"text":e.addDocument(t,i);break;case"geo":e.addPoint(t,i)}}async _hashVal(e){return e=(new TextEncoder).encode(String(e)),e=await crypto.subtle.digest("SHA-256",e),this._base64.encode(new Uint8Array(e))}async updateIndexForDocument(e,t,i){for(var[s,r]of this._indexes){var a,n=this._indexData.get(s);if(n){let o=t?this._getFieldValue(t,r.fieldPath):void 0,h=i?this._getFieldValue(i,r.fieldPath):void 0;if(r.hashed&&(o=o&&await this._hashVal(o),h=h&&await this._hashVal(h)),o!==h){switch(r.type){case"btree":void 0!==o&&n.remove(o,e),void 0!==h&&n.insert(h,e);break;case"hash":void 0!==o&&(a=n.get(o))&&(a.delete(e),0===a.size)&&n.delete(o),void 0!==h&&(n.has(h)||n.set(h,new Set),n.get(h).add(e));break;case"text":(o||h)&&n.updateDocument(e,h||"");break;case"geo":o&&n.removePoint(e),h&&n.addPoint(h,e)}"btree"===r.type&&this._schedulePersist(s)}}}}async query(e,t){var i=this._indexes.get(e),s=this._indexData.get(e);if(i&&s)return i.hashed&&"object"!=typeof t&&(t=await this._hashVal(t)),this._queryIndex(s,t,i.type);throw new Error(`Index '${e}' not found`)}_queryIndex(e,t,i){switch(i){case"btree":return this._queryBTree(e,t);case"hash":return this._queryHash(e,t);case"text":return this._queryText(e,t);case"geo":return this._queryGeo(e,t);default:return[]}}_queryBTree(e,t){if("object"!=typeof t||null===t)return e.find(t);let i=new Set;void 0!==t.$eq&&e.find(t.$eq).forEach(e=>i.add(e));var s,r=void 0!==t.$gte,a=void 0!==t.$gt,n=void 0!==t.$lte,o=void 0!==t.$lt;return(r||a||n||o)&&(s=r?t.$gte:a?t.$gt:null,t=n?t.$lte:o?t.$lt:null,e.range(s,t,!r&&a,!n&&o).forEach(e=>i.add(e))),Array.from(i)}_queryHash(e,t){var i;if(void 0!==t.$eq)return(i=e.get(t.$eq))?Array.from(i):[];if(void 0===t.$in)return[];{let i=new Set;for(var s of t.$in)(s=e.get(s))&&s.forEach(e=>i.add(e));return Array.from(i)}}_queryText(e,t){return t.$search?e.search(t.$search):[]}_queryGeo(e,t){return t.$near?e.findNear(t.$near.coordinates,t.$near.maxDistance||1e3):t.$within?e.findWithin(t.$within):[]}dropIndex(e){this._indexes.delete(e),this._indexData.delete(e),this._dirtyIndexes.delete(e),this._saveIndexMetadata(),e=""+st.IDX_PREFIX+e,this._collection._indexedDB.delete(this._collection._db,this._collection._storeName,e).catch(()=>{})}_getFieldValue(e,t){return ut.getFieldValue(e,t)}async _saveIndexMetadata(){var e=`idxmeta_${this._collection.database.name}_`+this._collection.name,t={indexes:Array.from(this._indexes.entries()).map(([e,t])=>({name:e,...t}))},i=(t=this._serializer.serialize(t),t=this._base64.encode(t),this._collection._db);i&&i.objectStoreNames.contains("__meta")?wt._writeMeta(i,e,{data:t}).catch(e=>{console.warn("IndexManager metadata IDB save failed:",e)}):(i=`lacertadb_${this._collection.database.name}_${this._collection.name}_indexes`,localStorage.setItem(i,t))}async loadIndexMetadata(){var e=`idxmeta_${this._collection.database.name}_`+this._collection.name;let t=null;var i=this._collection._db;if(i&&i.objectStoreNames.contains("__meta"))try{var s=await wt._readMeta(i,e);s&&s.data&&(t=s.data)}catch(e){}if(!t&&(i=`lacertadb_${this._collection.database.name}_${this._collection.name}_indexes`,e=localStorage.getItem(i))&&(t=e,localStorage.removeItem(i)),t)try{var r=this._base64.decode(t),a=this._serializer.deserialize(r);if(a&&Array.isArray(a.indexes)){for(var n of a.indexes){let{name:e,...t}=n;this._indexes.set(e,t)}var o,h,l=[];for([o,h]of this._indexes)"btree"===h.type&&await this._restoreIndex(o)||l.push(o);if(0<l.length)for(var c of l)await this.rebuildIndex(c)}}catch(e){console.error("Failed to load index metadata:",e)}}getIndexStats(){var e,t,i={};for([e,t]of this._indexes){var s=this._indexData.get(e);i[e]={...t,size:s&&(s.size||s.length)||0,memoryUsage:this._estimateMemoryUsage(s)}}return i}_estimateMemoryUsage(e){return e?e instanceof Map?100*e.size:e instanceof et?120*e.size:0:0}async verifyIndexes(){var e,t,i={};for([e,t]of this._indexes){var s=this._indexData.get(e);s?s.verify?((s=s.verify()).requiresRebuild&&(await this.rebuildIndex(e),s.rebuilt=!0),i[e]=s):i[e]={status:"ok"}:(i[e]={status:"missing",rebuilt:!0},await this.rebuildIndex(e))}return i}destroy(){for(var[e,t]of(this._persistTimer&&(clearTimeout(this._persistTimer),this._persistTimer=null),this._indexData))t&&t.clear&&t.clear();this._indexData.clear(),this._indexes.clear(),this._dirtyIndexes.clear(),this._indexQueue=[],this._processing=!1}}class rt{async saveAttachments(e,t,i,s){try{var r,a,n=[],o=await(await(await(await navigator.storage.getDirectory()).getDirectoryHandle(e,{create:!0})).getDirectoryHandle(t,{create:!0})).getDirectoryHandle(i,{create:!0});for([r,a]of s.entries()){var h=r+"_"+(a.name||"file"),l=await(await o.getFileHandle(h,{create:!0})).createWritable();let s;if(a.data instanceof Uint8Array)s=a.data;else if(a.data instanceof ArrayBuffer)s=new Uint8Array(a.data);else{if(!(a.data instanceof Blob))throw new TypeError("Unsupported attachment data type");s=new Uint8Array(await a.data.arrayBuffer())}var c=new Blob([s],{type:a.type||"application/octet-stream"}),d=(await l.write(c),await l.close(),`/${e}/${t}/${i}/`+h);n.push({path:d,name:a.name,type:a.type,size:s.byteLength,originalName:a.originalName||a.name})}return n}catch(s){throw new $e("Failed to save attachments","ATTACHMENT_SAVE_FAILED",s)}}async getAttachments(e){var t,i=[],s=await navigator.storage.getDirectory();for(t of e)try{var r=t.path.split("/").filter(e=>e);let e=s;for(let t=0;t<r.length-1;t++)e=await e.getDirectoryHandle(r[t]);var a=await(await(await e.getFileHandle(r[r.length-1])).getFile()).arrayBuffer();i.push({name:t.originalName||t.name,type:t.type,data:new Uint8Array(a),size:t.size})}catch(e){console.error("Failed to get attachment: "+t.path,e)}return i}async deleteAttachments(e,t,i){try{await(await(await(await navigator.storage.getDirectory()).getDirectoryHandle(e)).getDirectoryHandle(t)).removeEntry(i,{recursive:!0})}catch(e){"NotFoundError"!==e.name&&console.error(`Failed to delete attachments for ${i}:`,e)}}static async prepareAttachment(e,t){let i;if(e instanceof File||e instanceof Blob){var s=await e.arrayBuffer();i=new Uint8Array(s)}else if(e instanceof ArrayBuffer)i=new Uint8Array(e);else{if(!(e instanceof Uint8Array))throw new TypeError("Unsupported file type for attachment");i=e}return{name:t||e.name||"unnamed",type:e.type||"application/octet-stream",data:i,originalName:e.name||t}}}class at{constructor(){this._mutex=new Ne}async performTransaction(e,t,i,s,r=3){return"readonly"===i?this._runTx(e,t,i,s,r):this._mutex.runExclusive(()=>this._runTx(e,t,i,s,r))}async _runTx(e,t,i,s,r){let a;for(let n=0;n<r;n++)try{return await new Promise((r,a)=>{let n,o=e.transaction(t,i);o.oncomplete=()=>r(n),o.onerror=()=>a(o.error),o.onabort=()=>a(new Error("Transaction aborted"));try{var h=s(o);h instanceof Promise?h.then(e=>{n=e}).catch(a):n=h}catch(r){a(r)}})}catch(e){a=e,n<r-1&&await new Promise(e=>setTimeout(e,2**n*100))}throw new $e("Transaction failed after retries","TRANSACTION_FAILED",a)}_promisifyRequest(e){return new Promise((t,i)=>{let s=e();s.onsuccess=()=>t(s.result),s.onerror=()=>i(s.error),s.onabort=()=>i(new DOMException("Request aborted","AbortError"))})}async getBatch(e,t,i,s){return this.performTransaction(e,[t],"readonly",e=>{let r,a=e.objectStore(t);return null!=i&&(r=IDBKeyRange.lowerBound(i,!0)),this._promisifyRequest(()=>a.getAll(r,s))})}add(e,t,i,s){return this.performTransaction(e,[t],"readwrite",e=>{let r=e.objectStore(t);return this._promisifyRequest(()=>void 0!==s?r.add(i,s):r.add(i))})}put(e,t,i,s){return this.performTransaction(e,[t],"readwrite",e=>{let r=e.objectStore(t);return this._promisifyRequest(()=>void 0!==s?r.put(i,s):r.put(i))})}get(e,t,i){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).get(i)))}getAll(e,t,i,s){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).getAll(i,s)))}delete(e,t,i){return this.performTransaction(e,[t],"readwrite",e=>this._promisifyRequest(()=>e.objectStore(t).delete(i)))}clear(e,t){return this.performTransaction(e,[t],"readwrite",e=>this._promisifyRequest(()=>e.objectStore(t).clear()))}count(e,t,i){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).count(i)))}async batchOperation(e,t,i="documents"){return new Promise((s,r)=>{let a=new Array(t.length),n=e.transaction([i],"readwrite");var o=n.objectStore(i);n.oncomplete=()=>s(a),n.onerror=()=>{for(let t=0;t<a.length;t++){var e;a[t]||(a[t]={success:!1,error:(null==(e=n.error)?void 0:e.message)||"Transaction failed"})}r(new $e("Batch transaction failed","TRANSACTION_FAILED",n.error))},n.onabort=()=>{for(let e=0;e<a.length;e++)a[e]||(a[e]={success:!1,error:"Transaction aborted"});r(new $e("Batch transaction aborted","TRANSACTION_ABORTED"))};for(let e=0;e<t.length;e++){var h=t[e];let i;try{switch(h.type){case"add":i=o.add(h.data);break;case"put":i=o.put(h.data);break;case"delete":i=o.delete(h.key);break;default:a[e]={success:!1,error:"Unknown operation type: "+h.type};continue}let t=e;i.onsuccess=()=>{a[t]={success:!0,result:i.result}},i.onerror=e=>{var s;a[t]={success:!1,error:(null==(s=i.error)?void 0:s.message)||"Request failed"},e.preventDefault(),e.stopPropagation()}}catch(s){a[e]={success:!1,error:s.message}}}})}}let nt="0123456789ABCDEFGHJKMNPQRSTVWXYZ",ot=0,ht=new Uint8Array(10);class lt{constructor(e={},t={},i){this._id=e._id||this._generateId(),this._created=e._created||Date.now(),this._modified=e._modified||Date.now(),this._permanent=e._permanent||t.permanent||!1,this._encrypted=!1,this._compressed=e._compressed||t.compressed||!1,this._attachments=e._attachments||[],this._data=null,this._packedData=e.packedData||null,this._compression=We,this._serializer=i,e.data&&(this.data=e.data)}get data(){return this._data||{}}set data(e){this._data=e}_generateId(){{let s="",r=t=Date.now();for(let e=9;0<=e;e--)s=nt[31&r]+s,r=Math.floor(r/32);if(t===ot){let t=1;for(let i=9;0<=i&&t;i--){var e=ht[i]+t;ht[i]=255&e,t=e>>>8}}else crypto.getRandomValues(ht),ot=t;var t="",i=ht;return s+(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t+=nt[(248&i[0])>>>3])+nt[(7&i[0])<<2|(192&i[1])>>>6])+nt[(62&i[1])>>>1])+nt[(1&i[1])<<4|(240&i[2])>>>4])+nt[(15&i[2])<<1|(128&i[3])>>>7])+nt[(124&i[3])>>>2])+nt[(3&i[3])<<3|(224&i[4])>>>5])+nt[31&i[4]])+nt[(248&i[5])>>>3])+nt[(7&i[5])<<2|(192&i[6])>>>6])+nt[(62&i[6])>>>1])+nt[(1&i[6])<<4|(240&i[7])>>>4])+nt[(15&i[7])<<1|(128&i[8])>>>7])+nt[(124&i[8])>>>2])+nt[(3&i[8])<<3|(224&i[9])>>>5])+nt[31&i[9]])}}async pack(e=null){try{let t=this._serializer.serialize(this.data);return this._compressed&&(t=await this._compression.compress(t)),e&&(t=await e.encrypt(t),this._encrypted=!0),this._packedData=t}catch(e){throw new $e("Failed to pack document","PACK_FAILED",e)}}async unpack(e=null){try{let t=this._packedData;if(this._encrypted&&e&&(t=await e.decrypt(t)),!(t=this._compressed?await this._compression.decompress(t):t)||0===t.length)throw new Error("Empty unpacked data");if(this.data=this._serializer.deserialize(t),"object"!=typeof this.data||null===this.data)throw new Error("Invalid deserialized data");return this.data}catch(e){return console.error("Document unpack failed:",e),this.data={},this.data}}packSync(){let e=this._serializer.serialize(this.data);return this._compressed&&(e=this._compression.compressSync(e)),this._packedData=e}unpackSync(){if(this._encrypted)throw new $e("Synchronous decryption not supported","SYNC_DECRYPT_NOT_SUPPORTED");let e=this._packedData;return this._compressed&&(e=this._compression.decompressSync(e)),this.data=this._serializer.deserialize(e),this.data}objectOutput(e=!1){var t={_id:this._id,_created:this._created,_modified:this._modified,_permanent:this._permanent,...this.data};return e&&0<this._attachments.length&&(t._attachments=this._attachments),t}databaseOutput(){return{_id:this._id,_created:this._created,_modified:this._modified,_permanent:this._permanent,_encrypted:this._encrypted,_compressed:this._compressed,_attachments:this._attachments,packedData:this._packedData}}}class ct{constructor(e,t={},i,s,r,a=null){this.name=e,this._serializer=i,this._base64=s,this._dbName=r,this._idb=a,this._metaKey=r?`collmeta_${r}_`+e:null,this.sizeKB=t.sizeKB||0,this.length=t.length||0,this.createdAt=t.createdAt||Date.now(),this.modifiedAt=t.modifiedAt||Date.now(),this._docSizes=new Map(t._docSizes||[]),this._docModified=new Map(t._docModified||[]),this._docPermanent=new Map(t._docPermanent||[]),this._docAttachments=new Map(t._docAttachments||[]),this._dirty=!1,this._saveTimer=null}setIDB(e){this._idb=e}addDocument(e,t,i=!1,s=0){this._docSizes.set(e,t),this._docModified.set(e,Date.now()),this._docPermanent.set(e,i),this._docAttachments.set(e,s),this.sizeKB+=t,this.length++,this.modifiedAt=Date.now(),this._scheduleSave()}updateDocument(e,t,i=!1,s=0){var r=this._docSizes.get(e)||0;this.sizeKB=this.sizeKB-r+t,this._docSizes.set(e,t),this._docModified.set(e,Date.now()),this._docPermanent.set(e,i),this._docAttachments.set(e,s),this.modifiedAt=Date.now(),this._scheduleSave()}removeDocument(e){var t=this._docSizes.get(e)||0;this.sizeKB-=t,this.length--,this._docSizes.delete(e),this._docModified.delete(e),this._docPermanent.delete(e),this._docAttachments.delete(e),this.modifiedAt=Date.now(),this._scheduleSave()}getOldestNonPermanentDocuments(e){var t,i,s=[];for([t,i]of this._docModified)this._docPermanent.get(t)||s.push({id:t,modified:i});return s.sort((e,t)=>e.modified-t.modified),s.slice(0,e).map(e=>e.id)}getDocumentSize(e){return this._docSizes.get(e)||0}isDocumentPermanent(e){return this._docPermanent.get(e)||!1}hasDocument(e){return this._docSizes.has(e)}getAggregateSnapshot(){return{sizeKB:this.sizeKB,length:this.length,createdAt:this.createdAt,modifiedAt:this.modifiedAt}}_scheduleSave(){var e;this._dirty=!0,this._saveTimer||(e=()=>{this._saveTimer=null,this._dirty&&this._persistToStorage()},"undefined"!=typeof window&&window.requestIdleCallback?this._saveTimer=window.requestIdleCallback(e):this._saveTimer=setTimeout(e,300))}_flushSync(){this._dirty&&this._persistToStorage()}_persistToStorage(){if(this._metaKey&&this._serializer&&this._base64){var e={sizeKB:this.sizeKB,length:this.length,createdAt:this.createdAt,modifiedAt:this.modifiedAt,_docSizes:Array.from(this._docSizes.entries()),_docModified:Array.from(this._docModified.entries()),_docPermanent:Array.from(this._docPermanent.entries()),_docAttachments:Array.from(this._docAttachments.entries())};try{var t,i=this._serializer.serialize(e),s=this._base64.encode(i);this._idb&&this._idb.objectStoreNames.contains("__meta")?wt._writeMeta(this._idb,this._metaKey,{data:s}).catch(e=>{console.warn("CollectionMetadata IDB save failed:",e)}):(t=`lacertadb_${this._dbName}_${this.name}_collmeta`,localStorage.setItem(t,s)),this._dirty=!1}catch(e){if("QuotaExceededError"===e.name){console.warn("CollectionMetadata: quota exceeded, saving aggregates only");try{var r={sizeKB:this.sizeKB,length:this.length,createdAt:this.createdAt,modifiedAt:this.modifiedAt},a=this._serializer.serialize(r),n=this._base64.encode(a);this._idb&&this._idb.objectStoreNames.contains("__meta")&&wt._writeMeta(this._idb,this._metaKey,{data:n}).catch(()=>{}),this._dirty=!1}catch(e){console.error("CollectionMetadata: fallback save also failed:",e)}}else console.error("CollectionMetadata save failed:",e)}}}static async loadAsync(e,t,i,s,r){var a=`collmeta_${e}_`+t;if(r&&r.objectStoreNames.contains("__meta"))try{var n,o,h=await wt._readMeta(r,a);if(h&&h.data)return n=s.decode(h.data),o=i.deserialize(n),new ct(t,o,i,s,e,r)}catch(e){console.warn("CollectionMetadata IDB load failed, trying localStorage:",e)}if(a=`lacertadb_${e}_${t}_collmeta`,h=localStorage.getItem(a))try{var l=s.decode(h),c=i.deserialize(l),d=new ct(t,c,i,s,e,r);return d._dirty=!0,d._persistToStorage(),localStorage.removeItem(a),d}catch(e){console.warn("CollectionMetadata localStorage corrupted, resetting:",e)}return new ct(t,{},i,s,e,r)}static load(e,t,i,s){var r=localStorage.getItem(`lacertadb_${e}_${t}_collmeta`);if(r)try{var a=s.decode(r),n=i.deserialize(a);return new ct(t,n,i,s,e)}catch(e){console.warn("CollectionMetadata corrupted, resetting:",e)}return new ct(t,{},i,s,e)}destroy(){this._flushSync(),this._saveTimer&&("undefined"!=typeof window&&window.cancelIdleCallback?window.cancelIdleCallback(this._saveTimer):clearTimeout(this._saveTimer),this._saveTimer=null)}clear(){this.sizeKB=0,this.length=0,this.modifiedAt=Date.now(),this._docSizes.clear(),this._docModified.clear(),this._docPermanent.clear(),this._docAttachments.clear(),this._dirty=!0,this._flushSync()}}class dt{constructor(e,t={},i,s,r=null){this.name=e,this._serializer=i,this._base64=s,this._idb=r,this._metaKey="dbmeta_"+e,this.collections=(t=t&&"object"==typeof t?t:{}).collections||{},this.totalSizeKB=t.totalSizeKB||0,this.totalLength=t.totalLength||0,this.modifiedAt=t.modifiedAt||Date.now(),this._dirty=!1,this._saveTimer=null}setIDB(e){this._idb=e}static async loadAsync(e,t,i,s){var r="dbmeta_"+e;if(s&&s.objectStoreNames.contains("__meta"))try{var a=await wt._readMeta(s,r);if(a&&a.data){var n=i.decode(a.data),o=t.deserialize(n);if(o&&"object"==typeof o)return new dt(e,o,t,i,s)}}catch(e){console.warn("DatabaseMetadata IDB load failed, trying localStorage:",e)}if(r=`lacertadb_${e}_metadata`,a=localStorage.getItem(r))try{var h,l=i.decode(a),c=t.deserialize(l);if(c&&"object"==typeof c)return(h=new dt(e,c,t,i,s))._dirty=!0,h._persistToStorage(),localStorage.removeItem(r),h}catch(e){console.error("Failed to load metadata from localStorage:",e)}return new dt(e,{},t,i,s)}static load(e,t,i){var s=localStorage.getItem(`lacertadb_${e}_metadata`);if(s)try{var r=i.decode(s),a=t.deserialize(r);if(a&&"object"==typeof a)return new dt(e,a,t,i)}catch(e){console.error("Failed to load metadata:",e)}return new dt(e,{},t,i)}setCollection(e){this.collections[e.name]=e.getAggregateSnapshot(),this._recalculate(),this._scheduleSave()}removeCollection(e){delete this.collections[e],this._recalculate(),this._scheduleSave()}_recalculate(){for(var e in this.totalSizeKB=0,this.totalLength=0,this.collections)e=this.collections[e],this.totalSizeKB+=e.sizeKB,this.totalLength+=e.length;this.modifiedAt=Date.now()}_scheduleSave(){var e;this._dirty=!0,this._saveTimer||(e=()=>{this._saveTimer=null,this._dirty&&this._persistToStorage()},"undefined"!=typeof window&&window.requestIdleCallback?this._saveTimer=window.requestIdleCallback(e):this._saveTimer=setTimeout(e,300))}_flushSync(){this._dirty&&this._persistToStorage()}_persistToStorage(){try{var e,t={collections:this.collections,totalSizeKB:this.totalSizeKB,totalLength:this.totalLength,modifiedAt:this.modifiedAt},i=this._serializer.serialize(t),s=this._base64.encode(i);this._idb&&this._idb.objectStoreNames.contains("__meta")?wt._writeMeta(this._idb,this._metaKey,{data:s}).catch(e=>{console.warn("DatabaseMetadata IDB save failed:",e)}):(e=`lacertadb_${this.name}_metadata`,localStorage.setItem(e,s)),this._dirty=!1}catch(e){"QuotaExceededError"===e.name?(console.error("CRITICAL: Metadata save failed — quota exceeded for db:",this.name),"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("lacertadb:quotaexceeded",{detail:{db:this.name}}))):console.error("Failed to save metadata:",e)}}save(){this._dirty=!0,this._flushSync()}destroy(){this._flushSync(),this._saveTimer&&("undefined"!=typeof window&&window.cancelIdleCallback?window.cancelIdleCallback(this._saveTimer):clearTimeout(this._saveTimer),this._saveTimer=null)}}class _t{constructor(e,t={},i,s,r=null){this.dbName=e,this._serializer=i,this._base64=s,this._idb=r,this._metaKey="settings_"+e,this.sizeLimitKB=null!=t.sizeLimitKB?t.sizeLimitKB:1/0,i=this.sizeLimitKB===1/0?1/0:.8*this.sizeLimitKB,this.bufferLimitKB=null!=t.bufferLimitKB?t.bufferLimitKB:i,this.freeSpaceEvery=this.sizeLimitKB===1/0?0:t.freeSpaceEvery||1e4}setIDB(e){this._idb=e}static async loadAsync(e,t,i,s){var r="settings_"+e;if(s&&s.objectStoreNames.contains("__meta"))try{var a,n,o=await wt._readMeta(s,r);if(o&&o.data)return a=i.decode(o.data),n=t.deserialize(a),new _t(e,n,t,i,s)}catch(e){console.warn("Settings IDB load failed, trying localStorage:",e)}if(r=`lacertadb_${e}_settings`,o=localStorage.getItem(r))try{var h=i.decode(o),l=t.deserialize(h),c=new _t(e,l,t,i,s);return c.save(),localStorage.removeItem(r),c}catch(e){console.error("Failed to load settings from localStorage:",e)}return new _t(e,{},t,i,s)}static load(e,t,i){var s=localStorage.getItem(`lacertadb_${e}_settings`);if(s)try{var r=i.decode(s),a=t.deserialize(r);return new _t(e,a,t,i)}catch(e){console.error("Failed to load settings:",e)}return new _t(e,{},t,i)}save(){try{var e,t={sizeLimitKB:this.sizeLimitKB,bufferLimitKB:this.bufferLimitKB,freeSpaceEvery:this.freeSpaceEvery},i=this._serializer.serialize(t),s=this._base64.encode(i);this._idb&&this._idb.objectStoreNames.contains("__meta")?wt._writeMeta(this._idb,this._metaKey,{data:s}).catch(e=>{console.warn("Settings IDB save failed:",e)}):(e=`lacertadb_${this.dbName}_settings`,localStorage.setItem(e,s))}catch(e){"QuotaExceededError"===e.name?(console.error("CRITICAL: Settings save failed — quota exceeded"),"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("lacertadb:quotaexceeded",{detail:{source:"settings",db:this.dbName}}))):console.error("Settings save failed:",e)}}updateSettings(e){Object.assign(this,e),void 0!==e.sizeLimitKB&&void 0===e.bufferLimitKB&&(this.bufferLimitKB=this.sizeLimitKB===1/0?1/0:.8*this.sizeLimitKB),this.sizeLimitKB===1/0&&(this.freeSpaceEvery=0),this.save()}}let ut=new class{constructor(){this._pathCache=new Map,this.operators={$eq:(e,t)=>e===t,$ne:(e,t)=>e!==t,$gt:(e,t)=>t<e,$gte:(e,t)=>t<=e,$lt:(e,t)=>e<t,$lte:(e,t)=>e<=t,$in:(e,t)=>Array.isArray(t)&&t.includes(e),$nin:(e,t)=>Array.isArray(t)&&!t.includes(e),$and:(e,t)=>t.every(t=>this.evaluate(e,t)),$or:(e,t)=>t.some(t=>this.evaluate(e,t)),$not:(e,t)=>!this.evaluate(e,t),$nor:(e,t)=>!t.some(t=>this.evaluate(e,t)),$exists:(e,t)=>void 0!==e===t,$type:(e,t)=>typeof e===t,$all:(e,t)=>Array.isArray(e)&&t.every(t=>e.includes(t)),$elemMatch:(e,t)=>Array.isArray(e)&&e.some(e=>this.evaluate({value:e},{value:t})),$size:(e,t)=>Array.isArray(e)&&e.length===t,$regex:(e,t)=>{if("string"!=typeof e)return!1;try{return new RegExp(t).test(e)}catch{return!1}},$text:(e,t)=>"string"==typeof e&&e.toLowerCase().includes(t.toLowerCase())}}evaluate(e,t){for(var i in t){var s=t[i];if(i.startsWith("$")){var r=this.operators[i];if(!r||!r(e,s))return!1}else{var a=this.getFieldValue(e,i);if("object"!=typeof s||null===s||Array.isArray(s)){if(a!==s)return!1}else for(var n in s)if(n.startsWith("$")){var o=this.operators[n];if(!o||!o(a,s[n]))return!1}}}return!0}_getParsedPath(e){let t=this._pathCache.get(e);if(void 0===t&&(t=-1===e.indexOf(".")?null:e.split("."),this._pathCache.set(e,t),2e3<this._pathCache.size)){var i=this._pathCache.keys();for(let e=0;e<500;e++)i.next();var s,r,a=new Map;for([s,r]of this._pathCache)a.set(s,r);this._pathCache=a}return t}getFieldValue(e,t){var i=this._getParsedPath(t);if(null===i)return null==e?void 0:e[t];let s=e;for(let e=0;e<i.length;e++){if(null==s)return;s=s[i[e]]}return s}};let ft=new class{constructor(){this.stages={$match:(e,t)=>e.filter(e=>ut.evaluate(e,t)),$project:(e,t)=>e.map(e=>{var i,s={};for(i in t){var r=t[i];1===r||!0===r?s[i]=ut.getFieldValue(e,i):"string"==typeof r&&r.startsWith("$")&&(s[i]=ut.getFieldValue(e,r.substring(1)))}if(Object.values(t).some(e=>0===e||!1===e)){var a=Object.keys(t).filter(e=>0===t[e]||!1===t[e]);let i={...e};return a.forEach(e=>delete i[e]),i}return s}),$sort:(e,t)=>[...e].sort((e,i)=>{for(var s in t){var r=t[s],a=ut.getFieldValue(e,s);if(a<(s=ut.getFieldValue(i,s)))return-r;if(s<a)return r}return 0}),$limit:(e,t)=>e.slice(0,t),$skip:(e,t)=>e.slice(t),$group:(e,t)=>{var i,s=new Map,r=t._id;let a=e=>{var t;return null==e?"\0null":"string"==(t=typeof e)?""+e:"number"==t||"boolean"==t?""+e:Array.isArray(e)?"["+e.join(",")+"]":"{"+Object.keys(e).sort().map(t=>t+":"+a(e[t])).join(",")+"}"},n=(e,t)=>{if("string"==typeof t&&t.startsWith("$"))return ut.getFieldValue(e,t.substring(1));if(null===t||"object"!=typeof t||Array.isArray(t))return t;var i,s={};for(i in t)s[i]=n(e,t[i]);return s};for(i of e){let e;e="string"==typeof r?r.startsWith("$")?ut.getFieldValue(i,r.substring(1)):r:null!==r&&"object"==typeof r?a(n(i,r)):r,s.has(e)||s.set(e,{_id:e,docs:[]}),s.get(e).docs.push(i)}var o,h=[];for(o of s.values()){var l,c={_id:o._id};for(l in t)if("_id"!==l){var d=t[l],_=Object.keys(d)[0];let e=d[_].toString().replace("$","");switch(_){case"$sum":c[l]=o.docs.reduce((t,i)=>t+(ut.getFieldValue(i,e)||0),0);break;case"$avg":var u=o.docs.reduce((t,i)=>t+(ut.getFieldValue(i,e)||0),0);c[l]=u/o.docs.length;break;case"$count":c[l]=o.docs.length;break;case"$max":c[l]=Math.max(...o.docs.map(t=>ut.getFieldValue(t,e)));break;case"$min":c[l]=Math.min(...o.docs.map(t=>ut.getFieldValue(t,e)))}}h.push(c)}return h},$lookup:async(e,t,i)=>{var s,r,a,n,o=new Set;for(s of e){var h=ut.getFieldValue(s,t.localField);null!=h&&o.add(h)}let l=await i.getCollection(t.from),c=new Map;if(0<o.size){let e=!1;for([r,a]of l._indexManager.indexes)if(a.fieldPath===t.foreignField){var d,_,u=await l._indexManager.query(r,{$in:Array.from(o)});for(d of await Promise.all(u.map(e=>l.get(e).catch(()=>null))))d&&(_=ut.getFieldValue(d,t.foreignField),c.has(_)||c.set(_,[]),c.get(_).push(d));e=!0;break}if(!e)for(n of await l.query({[t.foreignField]:{$in:Array.from(o)}})){var f=ut.getFieldValue(n,t.foreignField);c.has(f)||c.set(f,[]),c.get(f).push(n)}}return e.map(e=>{var i=ut.getFieldValue(e,t.localField);return{...e,[t.as]:c.get(i)||[]}})}}}async execute(e,t,i){let s=e;for(var r of t){var a=Object.keys(r)[0],n=(r=r[a],this.stages[a]);if(!n)throw new Error("Unknown aggregation stage: "+a);s="$lookup"===a?await n(s,r,i):n(s,r)}return s}};class mt{constructor(e){this.database=e,this.migrations=[],this.currentVersion=this._loadVersion()}_loadVersion(){return localStorage.getItem(`lacertadb_${this.database.name}_version`)||"1.0.0"}_saveVersion(e){localStorage.setItem(`lacertadb_${this.database.name}_version`,e),this.currentVersion=e}addMigration(e){this.migrations.push(e)}_compareVersions(e,t){var i=e.split(".").map(Number),s=t.split(".").map(Number),r=Math.max(i.length,s.length);for(let e=0;e<r;e++){var a=i[e]||0,n=s[e]||0;if(n<a)return 1;if(a<n)return-1}return 0}async runMigrations(e){var t;for(t of this.migrations.filter(t=>0<this._compareVersions(t.version,this.currentVersion)&&this._compareVersions(t.version,e)<=0).sort((e,t)=>this._compareVersions(e.version,t.version)))await this._applyMigration(t,"up"),this._saveVersion(t.version)}async rollback(e){var t;for(t of this.migrations.filter(t=>t.down&&0<this._compareVersions(t.version,e)&&this._compareVersions(t.version,this.currentVersion)<=0).sort((e,t)=>this._compareVersions(t.version,e.version)))await this._applyMigration(t,"down");this._saveVersion(e)}async _applyMigration(e,t){var i;for(i of(console.log(`${"up"===t?"Running":"Rolling back"} migration: ${e.name} (v${e.version})`),await this.database.listCollections())){var s,r=await this.database.getCollection(i);for(s of await r.getAll()){var a=await e[t](s);a&&await r.update(s._id,a)}}}}class pt{constructor(){this._metrics={operations:[],latencies:[],cacheHits:0,cacheMisses:0,memoryUsage:[]},this._monitoring=!1,this._monitoringInterval=null}startMonitoring(){this._monitoring||(this._monitoring=!0,this._monitoringInterval=setInterval(()=>this._collectMetrics(),1e3))}stopMonitoring(){this._monitoring&&(this._monitoring=!1,clearInterval(this._monitoringInterval),this._monitoringInterval=null)}recordOperation(e,t){this._monitoring&&(this._metrics.operations.push({type:e,duration:t,timestamp:Date.now()}),this._metrics.latencies.push(t),100<this._metrics.operations.length&&this._metrics.operations.shift(),100<this._metrics.latencies.length)&&this._metrics.latencies.shift()}recordCacheHit(){this._metrics.cacheHits++}recordCacheMiss(){this._metrics.cacheMisses++}_collectMetrics(){performance&&performance.memory&&(this._metrics.memoryUsage.push({used:performance.memory.usedJSHeapSize,total:performance.memory.totalJSHeapSize,limit:performance.memory.jsHeapSizeLimit,timestamp:Date.now()}),60<this._metrics.memoryUsage.length)&&this._metrics.memoryUsage.shift()}getStats(){var e=this._metrics.operations.filter(e=>Date.now()-e.timestamp<1e3).length,t=this._metrics.latencies.reduce((e,t)=>e+t,0),i=(t=0<this._metrics.latencies.length?t/this._metrics.latencies.length:0,0<(i=this._metrics.cacheHits+this._metrics.cacheMisses)?this._metrics.cacheHits/i*100:0),s=(s=0<this._metrics.memoryUsage.length?this._metrics.memoryUsage[this._metrics.memoryUsage.length-1]:null)?s.used/1048576:0;return{opsPerSec:e,avgLatency:t.toFixed(2),cacheHitRate:i.toFixed(1),memoryUsageMB:s.toFixed(2)}}getOptimizationTips(){var e=[],t=this.getStats();return 100<t.avgLatency&&e.push("High average latency detected. Consider enabling compression and indexing frequently queried fields."),t.cacheHitRate<50&&20<this._metrics.cacheHits+this._metrics.cacheMisses&&e.push("Low cache hit rate. Consider increasing cache size or optimizing query patterns."),10<this._metrics.memoryUsage.length&&10485760<(t=this._metrics.memoryUsage.slice(-10))[t.length-1].used-t[0].used&&e.push("Memory usage is increasing rapidly. Check for memory leaks or consider batch processing."),0<e.length?e:["Performance is optimal. No issues detected."]}}class yt{constructor(e,t){this.name=e,this.database=t,this._serializer=t._serializer,this._base64=t._base64,this._db=null,this._storeName=e,this._metadata=null,this._settings=t.settings,this._indexedDB=new at,this._opfs=new rt,this._cleanupInterval=null,this._events=new Map,this._indexManager=new st(this),this._cacheStrategy=new He({type:"lru",maxSize:100,ttl:6e4,enabled:!0}),this._docCache=new je(200),this._pendingIndexes=[],this._performanceMonitor=t.performanceMonitor,this._initialized=!1}get settings(){return this._settings}get metadata(){return this._metadata}get initialized(){return this._initialized}async init(){if(!this._initialized){if(await this.database._ensureStore(this._storeName),this._db=this.database._db,this._metadata=await ct.loadAsync(this.database.name,this.name,this._serializer,this._base64,this._db),await this._indexManager.loadIndexMetadata(),0<this._pendingIndexes.length){for(var{fieldPath:e,options:t}of this._pendingIndexes)this._indexManager.indexes.has(t.name||e)||await this._indexManager.createIndex(e,t).catch(()=>{});this._pendingIndexes=[]}0<this._settings.freeSpaceEvery&&this._settings.sizeLimitKB!==1/0&&(this._cleanupInterval=setInterval(()=>this._freeSpace(),this._settings.freeSpaceEvery)),this._initialized=!0}return this}async createIndex(e,t={}){return this._initialized?this._indexManager.createIndex(e,t):(this._pendingIndexes.push({fieldPath:e,options:t}),t.name||e)}async dropIndex(e){return this._indexManager.dropIndex(e)}async getIndexes(){return this._indexManager.getIndexStats()}async verifyIndexes(){return this._indexManager.verifyIndexes()}configureCacheStrategy(e){this._cacheStrategy.updateStrategy(e)}async add(e,t={}){if(this._initialized||await this.init(),t.encrypted&&!this.database.isEncrypted)throw new $e("Document-level encryption requires database-level encryption. Use getSecureDatabase() to create an encrypted database.","ENCRYPTION_NOT_INITIALIZED");await this._trigger("beforeAdd",e);e=new lt({data:e,_id:t.id},{compressed:t.compressed||!1,permanent:t.permanent||!1},this._serializer),(t=t.attachments)&&0<t.length&&(t=await Promise.all(t.map(e=>e instanceof File||e instanceof Blob?rt.prepareAttachment(e,e.name):Promise.resolve(e))),e._attachments=await this._opfs.saveAttachments(this.database.name,this.name,e._id,t)),await e.pack(this.database.encryption),t=e.databaseOutput();var i=(await this._indexedDB.add(this._db,this._storeName,t),e.objectOutput());await this._indexManager.updateIndexForDocument(e._id,null,i),t=t.packedData.byteLength/1024;return this._metadata.addDocument(e._id,t,e._permanent,e._attachments.length),this.database.metadata.setCollection(this._metadata),await this._checkSpaceLimit(),await this._trigger("afterAdd",e),this._cacheStrategy.clear(),this._docCache.set(e._id,i),e._id}async get(e,t={}){var i,s;if((this._initialized||await this.init(),!t.includeAttachments)&&(s=this._docCache.get(e)))return s;if(s=await this._indexedDB.get(this._db,this._storeName,e))return i=new lt(s,{encrypted:s._encrypted,compressed:s._compressed},this._serializer),s.packedData&&await i.unpack(this.database.encryption),t.includeAttachments&&0<i._attachments.length&&(i.data._attachments=await this._opfs.getAttachments(i._attachments)),await this._trigger("afterGet",i),s=i.objectOutput(t.includeAttachments),t.includeAttachments||this._docCache.set(e,s),s;throw new $e(`Document with id '${e}' not found.`,"DOCUMENT_NOT_FOUND")}async getAll(e={}){return this._initialized||await this.init(),e=(await this._indexedDB.getAll(this._db,this._storeName,void 0,e.limit)).filter(e=>!("string"==typeof e._id&&e._id.startsWith(st.IDX_PREFIX))),Promise.all(e.map(async e=>{try{var t=new lt(e,{encrypted:e._encrypted,compressed:e._compressed},this._serializer);return e.packedData&&await t.unpack(this.database.encryption),t.objectOutput()}catch(t){return console.error(`Failed to unpack document ${e._id}:`,t),null}})).then(e=>e.filter(Boolean))}async update(e,t,i={}){this._initialized||await this.init(),await this._trigger("beforeUpdate",{docId:e,updates:t});var s,r,a=await this._indexedDB.get(this._db,this._storeName,e);if(a)return r=new lt(a,{},this._serializer),a.packedData&&await r.unpack(this.database.encryption),s=r.objectOutput(),r={...r.data,...t},(t=new lt({_id:e,_created:a._created,data:r},{compressed:void 0!==i.compressed?i.compressed:a._compressed,permanent:void 0!==i.permanent?i.permanent:a._permanent},this._serializer))._modified=Date.now(),(r=i.attachments)&&0<r.length?(await this._opfs.deleteAttachments(this.database.name,this.name,e),i=await Promise.all(r.map(e=>e instanceof File||e instanceof Blob?rt.prepareAttachment(e,e.name):Promise.resolve(e))),t._attachments=await this._opfs.saveAttachments(this.database.name,this.name,t._id,i)):t._attachments=a._attachments,await t.pack(this.database.encryption),r=t.databaseOutput(),await this._indexedDB.put(this._db,this._storeName,r),i=t.objectOutput(),await this._indexManager.updateIndexForDocument(t._id,s,i),a=r.packedData.byteLength/1024,this._metadata.updateDocument(t._id,a,t._permanent,t._attachments.length),this.database.metadata.setCollection(this._metadata),await this._trigger("afterUpdate",t),this._cacheStrategy.clear(),this._docCache.set(t._id,i),t._id;throw new $e(`Document with id '${e}' not found for update.`,"DOCUMENT_NOT_FOUND")}async delete(e,t={}){this._initialized||await this.init(),await this._trigger("beforeDelete",e);var i=await this._indexedDB.get(this._db,this._storeName,e);if(!i)throw new $e("Document not found for deletion","DOCUMENT_NOT_FOUND");if(i._permanent&&!t.force)throw new $e("Cannot delete a permanent document. Use options.force = true to force deletion.","PERMANENT_DOCUMENT_PROTECTION");i._permanent&&t.force&&console.warn("Force deleting permanent document: "+e),t=await this.get(e),await this._indexManager.updateIndexForDocument(e,t,null),await this._indexedDB.delete(this._db,this._storeName,e),(t=i._attachments)&&0<t.length&&await this._opfs.deleteAttachments(this.database.name,this.name,e),this._metadata.removeDocument(e),this.database.metadata.setCollection(this._metadata),await this._trigger("afterDelete",e),this._cacheStrategy.clear(),this._docCache.delete(e)}async query(e={},t={}){this._initialized||await this.init();var i,s,r=performance.now(),a=function(e,t){e=JSON.stringify({f:e,o:t},(e,t)=>{if(!t||"object"!=typeof t||Array.isArray(t))return t;var i,s={};for(i of Object.keys(t).sort())s[i]=t[i];return s});{var[i,t=0]=[e];let n=0|t;var s=(t=i.length)>>>2;for(let e=0;e<s;e++){var r=e<<2;r=65535&i.charCodeAt(r)|(65535&i.charCodeAt(1+r))<<8|(65535&i.charCodeAt(2+r))<<16|(65535&i.charCodeAt(3+r))<<24,r=Math.imul(r,3432918353);n=(n^=r=Math.imul(r<<15|r>>>17,461845907))<<13|n>>>19,n=Math.imul(n,5)+3864292196|0}let o=0;var a=s<<2;switch(3&t){case 3:o^=(65535&i.charCodeAt(2+a))<<16;case 2:o^=(65535&i.charCodeAt(1+a))<<8;case 1:o^=65535&i.charCodeAt(a),o=(o=Math.imul(o,3432918353))<<15|o>>>17,o=Math.imul(o,461845907),n^=o}return n=(n^=t)^n>>>16,n=Math.imul(n,2246822507),n^=n>>>13,n=Math.imul(n,3266489909),(n^=n>>>16)>>>0}}(e,t),n=this._cacheStrategy.get(a);if(n)return this._performanceMonitor&&this._performanceMonitor.recordCacheHit(),n;this._performanceMonitor&&this._performanceMonitor.recordCacheMiss();let o,h=!1;for([i,s]of this._indexManager.indexes){var l=e[s.fieldPath];if(void 0!==l){l=await this._indexManager.query(i,l),o=(o=await Promise.all(l.map(e=>this.get(e).catch(()=>null)))).filter(Boolean),h=!0;break}}return h||(o=await this.getAll(t),0<Object.keys(e).length&&(o=o.filter(t=>ut.evaluate(t,e)))),t.sort&&(o=ft.stages.$sort(o,t.sort)),t.skip&&(o=ft.stages.$skip(o,t.skip)),t.limit&&(o=ft.stages.$limit(o,t.limit)),t.projection&&(o=ft.stages.$project(o,t.projection)),this._performanceMonitor&&this._performanceMonitor.recordOperation(h?"indexed-query":"full-scan-query",performance.now()-r),this._cacheStrategy.set(a,o),o}async aggregate(e){this._initialized||await this.init();var t=performance.now();let i,s=e;return 0<e.length&&e[0].$match?(i=await this.query(e[0].$match),s=e.slice(1)):i=await this.getAll(),e=await ft.execute(i,s,this.database),this._performanceMonitor&&this._performanceMonitor.recordOperation("aggregate",performance.now()-t),e}async batchAdd(e,t={}){this._initialized||await this.init();var i=performance.now(),s=[];let r=[];var a,n=!this.database.encryption&&!t.compressed;for(a of e){var o=new lt({data:a},{compressed:t.compressed||!1,permanent:t.permanent||!1},this._serializer);n?o.packSync():await o.pack(this.database.encryption),s.push({type:"add",data:o.databaseOutput()}),r.push(o)}var h,l,c,d=await this._indexedDB.batchOperation(this._db,s,this._storeName);for(let e=0;e<r.length;e++)d[e].success&&(l=(h=r[e]).objectOutput(),await this._indexManager.updateIndexForDocument(h._id,null,l),c=h._packedData.byteLength/1024,this._metadata.addDocument(h._id,c,h._permanent,0),this._docCache.set(h._id,l));return this.database.metadata.setCollection(this._metadata),this._performanceMonitor&&this._performanceMonitor.recordOperation("batchAdd",performance.now()-i),d.map((e,t)=>({...e,id:r[t]._id}))}async batchUpdate(e,t={}){this._initialized||await this.init();var i=performance.now(),s=[],r=[];let a=[];var n,o,h=[],l=!this.database.encryption&&!t.compressed,c=e.map(e=>e.id),d=new Map;for(n of await this._indexedDB.getAll(this._db,this._storeName))n._id&&c.includes(n._id)&&d.set(n._id,n);for(o of e){var _,u=d.get(o.id);u?(_=new lt(u,{},this._serializer),u.packedData&&await _.unpack(this.database.encryption),r.push(_.objectOutput()),_={..._.data,...o.data},(_=new lt({_id:o.id,_created:u._created,data:_},{compressed:void 0!==t.compressed?t.compressed:u._compressed,permanent:void 0!==t.permanent?t.permanent:u._permanent},this._serializer))._modified=Date.now(),_._attachments=u._attachments,l?_.packSync():await _.pack(this.database.encryption),a.push(_),s.push({type:"put",data:_.databaseOutput()})):h.push({success:!1,id:o.id,error:"Document not found"})}if(0===s.length)return h;var f,m,p,y=await this._indexedDB.batchOperation(this._db,s,this._storeName);for(let e=0;e<a.length;e++)y[e].success&&(m=(f=a[e]).objectOutput(),await this._indexManager.updateIndexForDocument(f._id,r[e],m),p=f._packedData.byteLength/1024,this._metadata.updateDocument(f._id,p,f._permanent,f._attachments.length),this._docCache.set(f._id,m));return this.database.metadata.setCollection(this._metadata),this._cacheStrategy.clear(),this._performanceMonitor&&this._performanceMonitor.recordOperation("batchUpdate",performance.now()-i),[...y.map((e,t)=>({...e,id:a[t]._id})),...h]}async batchDelete(e){this._initialized||await this.init();var t=performance.now(),i=(e=e.map(e=>"string"==typeof e?{id:e,options:{}}:{id:e.id,options:e.options||{}}),[]);let s=[];var r,a,n=[];for({id:r,options:a}of e){var o,h=await this._indexedDB.get(this._db,this._storeName,r);h?h._permanent&&!a.force?n.push({success:!1,id:r,error:"Cannot delete permanent document without force flag"}):(o=await this.get(r),s.push({id:r,fullDoc:o,stored:h}),i.push({type:"delete",key:r})):n.push({success:!1,id:r,error:"Document not found"})}if(0===i.length)return n;var l,c,d,_=await this._indexedDB.batchOperation(this._db,i,this._storeName);for(let e=0;e<s.length;e++)_[e].success&&(({id:l,fullDoc:c,stored:d}=s[e]),await this._indexManager.updateIndexForDocument(l,c,null),d._attachments&&0<d._attachments.length&&await this._opfs.deleteAttachments(this.database.name,this.name,l),this._metadata.removeDocument(l),this._docCache.delete(l));return this.database.metadata.setCollection(this._metadata),this._cacheStrategy.clear(),this._performanceMonitor&&this._performanceMonitor.recordOperation("batchDelete",performance.now()-t),[..._.map((e,t)=>({...e,id:s[t].id})),...n]}async _checkSpaceLimit(){this._settings.sizeLimitKB!==1/0&&this._metadata.sizeKB>this._settings.bufferLimitKB&&await this._freeSpace()}async _freeSpace(){for(var e=.8*this._settings.bufferLimitKB;this._metadata.sizeKB>e;){var t=this._metadata.getOldestNonPermanentDocuments(10);if(0===t.length)break;await this.batchDelete(t)}}on(e,t){this._events.has(e)||this._events.set(e,[]),this._events.get(e).push(t)}off(e,t){var i;this._events.has(e)&&(i=this._events.get(e).filter(e=>e!==t),this._events.set(e,i))}async _trigger(e,t){if((e=this._events.get(e))&&0!==e.length)for(var i of e)await i(t)}clearCache(){this._cacheStrategy.clear(),this._docCache.clear()}async clear(e={}){if(this._initialized||await this.init(),e.force)for(var t of(await this._indexedDB.clear(this._db,this._storeName),this._metadata&&this._metadata.destroy(),this._metadata=new ct(this.name,{},this._serializer,this._base64,this.database.name,this._db),this._metadata._flushSync(),this.database.metadata.setCollection(this._metadata),this._cacheStrategy.clear(),this._docCache.clear(),this._indexManager.indexes.keys()))await this._indexManager.rebuildIndex(t);else e=(await this.getAll()).filter(e=>!e._permanent),await this.batchDelete(e.map(e=>e._id));this._cleanupInterval&&(clearInterval(this._cleanupInterval),this._cleanupInterval=null,0<this._settings.freeSpaceEvery)&&this._settings.sizeLimitKB!==1/0&&(this._cleanupInterval=setInterval(()=>this._freeSpace(),this._settings.freeSpaceEvery))}destroy(){this._metadata&&this._metadata.destroy(),this._indexManager&&(this._indexManager.flushPersistence().catch(()=>{}),this._indexManager.destroy()),this._cleanupInterval&&(clearInterval(this._cleanupInterval),this._cleanupInterval=null),this._cacheStrategy&&this._cacheStrategy.destroy(),this._docCache&&this._docCache.clear(),this._db=null,this._events.clear()}}class wt{constructor(e,t,i,s){this.name=e,this._collections=new Map,this._metadata=null,this._settings=null,this._quickStore=null,this._performanceMonitor=t,this._serializer=i,this._base64=s,this._db=null,this._idbVersion=0,this._knownStores=new Set,this._ensureStorePromise=null,this._idbVersionKey=`lacertadb_${e}_idb_version`,this._idbStoresKey=`lacertadb_${e}_idb_stores`,this._encryption=null}get collections(){return this._collections}get metadata(){return this._metadata}get settings(){return this._settings}get quickStore(){return this._quickStore}get performanceMonitor(){return this._performanceMonitor}get encryption(){return this._encryption}get isEncrypted(){return!!this._encryption}async _getConnection(){if(!this._db){try{this._idbVersion=parseInt(localStorage.getItem(this._idbVersionKey),10)||1;var e,t,i=localStorage.getItem(this._idbStoresKey);i&&(e=this._base64.decode(i),t=this._serializer.deserialize(e),this._knownStores=new Set(t))}catch(e){this._idbVersion=1}this._db=await this._openIDB(this._idbVersion)}return this._db}async _openIDB(e){let t=this._knownStores;return new Promise((i,s)=>{let r=indexedDB.open("lacertadb_"+this.name,e);r.onerror=()=>s(new $e("Failed to open database","DATABASE_OPEN_FAILED",r.error)),r.onsuccess=()=>i(r.result),r.onupgradeneeded=e=>{var i,s=e.target.result;for(i of(s.objectStoreNames.contains("__meta")||s.createObjectStore("__meta",{keyPath:"_id"}),t))s.objectStoreNames.contains(i)||s.createObjectStore(i,{keyPath:"_id"}).createIndex("modified","_modified",{unique:!1})}})}async _ensureStore(e){if(this._db&&this._db.objectStoreNames.contains(e))this._knownStores.add(e);else if(this._knownStores.add(e),!(this._ensureStorePromise&&(await this._ensureStorePromise,this._db)&&this._db.objectStoreNames.contains(e))){var t,i=[];for(t of this._knownStores)this._db&&this._db.objectStoreNames.contains(t)||i.push(t);if(0!==i.length){this._ensureStorePromise=(async()=>{this._idbVersion++,localStorage.setItem(this._idbVersionKey,String(this._idbVersion));var e=this._serializer.serialize(Array.from(this._knownStores));e=this._base64.encode(e);localStorage.setItem(this._idbStoresKey,e),this._db&&(this._db.close(),this._db=null),this._db=await this._openIDB(this._idbVersion)})();try{await this._ensureStorePromise}finally{this._ensureStorePromise=null}}}}async init(e={}){return await this._getConnection(),this._db.objectStoreNames.contains("__meta")||await this._ensureStore("__meta"),this._metadata=await dt.loadAsync(this.name,this._serializer,this._base64,this._db),this._settings=await _t.loadAsync(this.name,this._serializer,this._base64,this._db),this._quickStore=new Oe(this.name,this._serializer,this._base64,this._db),await this._quickStore.hydrateFromIDB(),await this._migrateOldDatabases(),e.pin&&await this._initializeEncryption(e.pin,e.salt,e.encryptionConfig),this}static async _readMeta(e,t){return e&&e.objectStoreNames.contains("__meta")?new Promise(i=>{try{let s=e.transaction("__meta","readonly").objectStore("__meta").get(t);s.onsuccess=()=>i(s.result||null),s.onerror=()=>i(null)}catch(e){i(null)}}):null}static async _writeMeta(e,t,i){if(e&&e.objectStoreNames.contains("__meta"))return new Promise(s=>{try{var r=e.transaction("__meta","readwrite"),a=r.objectStore("__meta"),n={_id:t,...i},o=a.put(n);o.onsuccess=()=>s(),o.onerror=()=>s(),r.oncomplete=()=>s()}catch(r){s()}})}async _initializeEncryption(e,t=0,i={}){var s=`lacertadb_${this.name}_encryption`;let r=null;var a=((a=localStorage.getItem(s))&&(a=this._base64.decode(a),r=this._serializer.deserialize(a)),this._encryption=new Qe(i,this._serializer,this._base64),await this._encryption.initialize(e,r));r||(i=this._serializer.serialize(a),e=this._base64.encode(i),localStorage.setItem(s,e))}async changePin(e,t){if(this._encryption)return e=await this._encryption.changePin(e,t),t=`lacertadb_${this.name}_encryption`,e=this._serializer.serialize(e),e=this._base64.encode(e),localStorage.setItem(t,e),!0;throw new Error("Database is not encrypted")}async storePrivateKey(e,t,i=""){if(!this._encryption)throw new Error("Database must be encrypted to store private keys");t=await this._encryption.encryptPrivateKey(t,i);let s=await this.getCollection("__private_keys__").catch(()=>null);return await(s=s||await this.createCollection("__private_keys__")).add({name:e,key:t,createdAt:Date.now()},{id:e,permanent:!0}),!0}async getPrivateKey(e,t=""){if(!this._encryption)throw new Error("Database must be encrypted to retrieve private keys");var i=await(await this.getCollection("__private_keys__")).get(e);if(i)return this._encryption.decryptPrivateKey(i.key,t);throw new Error(`Private key '${e}' not found`)}async createCollection(e,t){if(this._collections.has(e))throw new $e(`Collection '${e}' already exists.`,"COLLECTION_EXISTS");await this._ensureStore(e);var i=new yt(e,this);return this._collections.set(e,i),this._metadata.collections[e]||this._metadata.setCollection(new ct(e,{},this._serializer,this._base64,this.name,this._db)),i}async getCollection(e){var t;if(this._collections.has(e))return(t=this._collections.get(e)).initialized||await t.init(),t;if(this._metadata.collections[e])return await this._ensureStore(e),t=new yt(e,this),this._collections.set(e,t),await t.init(),t;throw new $e(`Collection '${e}' not found.`,"COLLECTION_NOT_FOUND")}ensureCollection(e){if(this._collections.has(e))return this._collections.get(e);if(!this._knownStores.has(e)){this._knownStores.add(e);try{var t=this._serializer.serialize(Array.from(this._knownStores)),i=this._base64.encode(t);localStorage.setItem(this._idbStoresKey,i)}catch(e){}}return t=new yt(e,this),this._collections.set(e,t),this._metadata.collections[e]||this._metadata.setCollection(new ct(e,{},this._serializer,this._base64,this.name,this._db)),t}async dropCollection(e){var t;if(this._collections.has(e)&&((t=this._collections.get(e)).initialized&&(await t.clear({force:!0}),t.destroy()),this._collections.delete(e)),this._metadata.removeCollection(e),localStorage.removeItem(`lacertadb_${this.name}_${e}_collmeta`),localStorage.removeItem(`lacertadb_${this.name}_${e}_indexes`),this._db&&this._knownStores.has(e))try{await(new at).clear(this._db,e)}catch(e){}let i=this.name+"_"+e;try{await new Promise((e,t)=>{var s=indexedDB.deleteDatabase(i);s.onsuccess=e,s.onerror=e,s.onblocked=e})}catch(e){}}async _migrateOldDatabases(){var e=`lacertadb_${this.name}_consolidated`;if(!localStorage.getItem(e)){var t=Object.keys(this._metadata.collections||{});if(0!==t.length){let r=0;for(let a of t){let t=this.name+"_"+a;try{let e=await new Promise((e,i)=>{let s=indexedDB.open(t,1);s.onerror=()=>e(null),s.onsuccess=()=>e(s.result),s.onupgradeneeded=t=>{0===t.oldVersion&&(t.target.transaction.abort(),e(null))}});if(e)if(e.objectStoreNames.contains("documents")){var i=await new Promise((t,i)=>{let s=e.transaction("documents","readonly").objectStore("documents").getAll();s.onsuccess=()=>t(s.result||[]),s.onerror=()=>t([])});if(e.close(),0!==i.length){await this._ensureStore(a);var s=new at;let e=i.map(e=>({type:"put",data:e}));await s.performTransaction(this._db,[a],"readwrite",t=>{let i=t.objectStore(a);return t=e.map(e=>new Promise((t,s)=>{var r=i.put(e.data);r.onsuccess=()=>t(),r.onerror=()=>t()})),Promise.all(t)}),await new Promise(e=>{var i=indexedDB.deleteDatabase(t);i.onsuccess=e,i.onerror=e,i.onblocked=e}),r++}}else e.close();else indexedDB.deleteDatabase(t)}catch(e){console.warn(`[LacertaDB] Migration of '${a}' failed:`,e.message)}}0<r&&console.log(`[LacertaDB] Migrated ${r} collections to consolidated database`)}localStorage.setItem(e,"1")}}listCollections(){return Object.keys(this._metadata.collections)}getStats(){return{name:this.name,totalSizeKB:this._metadata.totalSizeKB,totalDocuments:this._metadata.totalLength,collections:Object.entries(this._metadata.collections).map(([e,t])=>({name:e,sizeKB:t.sizeKB,documents:t.length,createdAt:new Date(t.createdAt).toISOString(),modifiedAt:new Date(t.modifiedAt).toISOString()}))}}updateSettings(e){this._settings.updateSettings(e)}async export(e="json",t=null){var i,s,r,a={version:"0.12.0",database:this.name,timestamp:Date.now(),collections:{}};for(i of this.listCollections()){var n=await this.getCollection(i);a.collections[i]=await n.getAll()}if("json"===e)return r=this._serializer.serialize(a),this._base64.encode(r);if("encrypted"===e&&t)return r=new Xe,s=this._serializer.serialize(a),r=await r.encrypt(s,t),this._base64.encode(r);throw new $e("Unsupported export format: "+e,"INVALID_FORMAT")}async import(e,t="json",i=null){let s;try{var r,a=this._base64.decode(e);s="encrypted"===t&&i?(r=await(new Xe).decrypt(a,i),this._serializer.deserialize(r)):this._serializer.deserialize(a)}catch(e){throw new $e("Failed to parse import data","IMPORT_PARSE_FAILED",e)}for(var n in s.collections){var o=s.collections[n];let t;try{t=await this.createCollection(n)}catch(e){if("COLLECTION_EXISTS"!==e.code)throw e;t=await this.getCollection(n)}await t.batchAdd(o)}return e=Object.values(s.collections).reduce((e,t)=>e+t.length,0),{collections:Object.keys(s.collections).length,documents:e}}async clearAll(){await Promise.all([...this._collections.keys()].map(e=>this.dropCollection(e))),this._collections.clear(),this._metadata&&this._metadata.destroy(),this._metadata=new dt(this.name,{},this._serializer,this._base64,this._db),this._metadata.save(),this._quickStore.clear()}async destroy(){for(var e of this._collections.values())e.initialized&&(await e.clear({force:!0}),e.destroy());this._collections.clear(),this._db&&(this._db.close(),this._db=null),this._quickStore&&this._quickStore.destroy(),this._metadata&&this._metadata.destroy(),this._encryption&&this._encryption.destroy(),this._metadata=null,this._settings=null,this._quickStore=null,this._performanceMonitor=null}}class gt{constructor(e={}){this._databases=new Map,this._performanceMonitor=new pt,e={...Pe,...e.turboSerial||{}},this._serializer=new class{constructor(e={}){this.options={compression:e.compression||!1,deduplication:!1!==e.deduplication,shareArrayBuffers:!1!==e.shareArrayBuffers,simdOptimization:!1!==e.simdOptimization,detectCircular:!1!==e.detectCircular,allowFunction:e.allowFunction||!1,serializeFunctions:e.serializeFunctions||!1,preservePropertyDescriptors:!1!==e.preservePropertyDescriptors,sortKeys:e.sortKeys||!1,memoryPoolSize:e.memoryPoolSize||65536,...e},this.options.allowFunction||(this.options.serializeFunctions=!1),e=Math.max(this.options.memoryPoolSize,65536),this.buf=new Uint8Array(e),this.dv=new DataView(this.buf.buffer),this.f64=new Float64Array(this.buf.buffer),this.f32=new Float32Array(this.buf.buffer),this.i32=new Int32Array(this.buf.buffer),this.i16=new Int16Array(this.buf.buffer),this.pos=0,this.enc=new TextEncoder,this.dec=new TextDecoder,this.refs=new Map,this.ancestors=new WeakSet,this.strings=new Map,this.buffers=new Map,this.deserializeRefs=null,this.deserializeStrings=null,this.deserializeBuffers=null,this.buffer=null,this.view=null}_grow(e){var t=this.pos+e;if(!(t<=this.buf.length)){let i=this.buf.length;for(;i<t;)i<<=1;(e=new Uint8Array(i)).set(this.buf.subarray(0,this.pos)),this.buf=e,this.dv=new DataView(e.buffer),this.f64=new Float64Array(e.buffer),this.f32=new Float32Array(e.buffer),this.i32=new Int32Array(e.buffer),this.i16=new Int16Array(e.buffer)}}serialize(e){return this.resetState(),this._grow(17),this.dv.setUint32(0,Be,!0),this.buf[4]=7,this.pos=17,this.writeValue(e),this.dv.setUint32(5,this.refs.size,!0),this.dv.setUint32(9,this.strings.size,!0),this.dv.setUint32(13,this.buffers.size,!0),this.buf.slice(0,this.pos)}deserialize(e){if(this.buffer=e.constructor===Uint8Array?e:new Uint8Array(e),this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength),this.pos=0,this.view.getUint32(0,!0)!==Be)throw new Error("Invalid TurboSerial data");if(7===(e=this.buffer[4])){var t=this.view.getUint32(5,!0),i=this.view.getUint32(9,!0),s=this.view.getUint32(13,!0);this.deserializeRefs=new Array(t),this.deserializeStrings=new Array(i),this.deserializeBuffers=new Array(s),this._drIdx=0,this._dsIdx=0,this._dbIdx=0,this.pos=17}else{if(6!==e)throw new Error("Unsupported version: "+e);this.deserializeRefs=[],this.deserializeStrings=[],this.deserializeBuffers=[],this._drIdx=-1,this.pos=5}return this.readValue()}resetState(){this.pos=0,this.refs.clear(),this.ancestors=new WeakSet,this.strings.clear(),this.buffers.clear()}resetMemory(e={}){return e=e.shrink?Math.max(this.options.memoryPoolSize||65536,256):this.buf.length,this.buf=new Uint8Array(e),this.dv=new DataView(this.buf.buffer),this.f64=new Float64Array(this.buf.buffer),this.f32=new Float32Array(this.buf.buffer),this.i32=new Int32Array(this.buf.buffer),this.i16=new Int16Array(this.buf.buffer),this.pos=0,this.refs.clear(),this.ancestors=new WeakSet,this.strings.clear(),this.buffers.clear(),this.deserializeRefs&&(this.deserializeRefs.length=0,this.deserializeRefs=null),this.deserializeStrings&&(this.deserializeStrings.length=0,this.deserializeStrings=null),this.deserializeBuffers&&(this.deserializeBuffers.length=0,this.deserializeBuffers=null),this}_wV(e){var t=this.buf;let i=this.pos;if((e>>>=0)<128)t[i]=e,this.pos=i+1;else if(e<16384)t[i]=127&e|128,t[i+1]=e>>>7,this.pos=i+2;else{for(;128<=e;)t[i++]=127&e|128,e>>>=7;t[i++]=e,this.pos=i}}writeValue(e){if(null===e)this._grow(1),this.buf[this.pos++]=0;else if(void 0===e)this._grow(1),this.buf[this.pos++]=1;else{var t=typeof e;if("boolean"==t)this._grow(1),this.buf[this.pos++]=e?3:2;else if("number"==t)this._wNum(e);else if("string"==t)this._wStrDedup(e);else if("bigint"==t)this._wBigInt(e);else if("symbol"==t)this._grow(2),void 0!==(i=Symbol.keyFor(e))?(this.buf[this.pos++]=we,this.writeValue(i)):n.has(e)?(this.buf[this.pos++]=ge,this.writeValue(n.get(e))):void 0===e.description?this.buf[this.pos++]=be:(this.buf[this.pos++]=ye,this.writeValue(e.description));else if("function"==t)this._grow(1),this.buf[this.pos++]=this.options.allowFunction?ve:c;else{var i=this.refs.get(e);if(void 0!==i)this._grow(6),this.options.detectCircular&&this.ancestors.has(e)?this.buf[this.pos++]=pe:this.buf[this.pos++]=me,this._wV(i);else{if((this.options.deduplication||this.options.detectCircular)&&this.refs.set(e,this.refs.size),this.options.shareArrayBuffers&&e.constructor===ArrayBuffer){if(void 0!==(t=this.buffers.get(e)))return this._grow(6),this.buf[this.pos++]=Y,void this._wV(t);this.buffers.set(e,this.buffers.size)}this.options.detectCircular&&this.ancestors.add(e),this._wObj(e),this.options.detectCircular&&this.ancestors.delete(e)}}}}_wStrDedup(e){if(this.options.deduplication&&3<e.length){var t=this.strings.get(e);if(void 0!==t)return this._grow(6),this.buf[this.pos++]=U,void this._wV(t);this.strings.set(e,this.strings.size)}this._wStr(e)}_wNum(e){this._grow(10);var t,i=this.pos;e!=e?(this.buf[i]=y,this.pos=i+1):e===1/0?(this.buf[i]=w,this.pos=i+1):e===-1/0?(this.buf[i]=g,this.pos=i+1):0===e&&1/e<0?(this.buf[i]=b,this.pos=i+1):e===(t=0|e)?-128<=t&&t<=127?(this.buf[i]=d,this.buf[i+1]=255&t,this.pos=i+2):-32768<=t&&t<=32767?(this.buf[i]=_,this.dv.setInt16(i+1,t,!0),this.pos=i+3):(this.buf[i]=u,this.dv.setInt32(i+1,t,!0),this.pos=i+5):e===(t=e>>>0)?(this.buf[i]=f,this.dv.setUint32(i+1,t,!0),this.pos=i+5):(a[0]=e,a[0]===e?(this.buf[i]=m,this.dv.setFloat32(i+1,e,!0),this.pos=i+5):(this.buf[i]=p,this.dv.setFloat64(i+1,e,!0),this.pos=i+9))}_wBigInt(e){this._grow(10);var t=e<0n,i=t?-e:e;if(i<=0x7fffffffffffffffn)this.buf[this.pos++]=t?A:S,this.dv.setBigInt64(this.pos,e,!0),this.pos+=8;else{this.buf[this.pos++]=t?I:x;let e=i,s=0,r=i;for(;0n<r;)s++,r>>=8n;this._grow(s+5),this._wV(s);for(let t=0;t<s;t++)this.buf[this.pos++]=Number(0xffn&e),e>>=8n}}_wStr(e){var t=e.length;if(0===t)this._grow(1),this.buf[this.pos++]=z;else if(t<128){let s=1;for(let i=0;i<t;i++)if(127<e.charCodeAt(i)){s=0;break}if(s){this._grow(t+2);var i=this.pos;this.buf[i++]=t<16?k:D,this.buf[i++]=t;for(let s=0;s<t;s++)this.buf[i+s]=e.charCodeAt(s);return void(this.pos=i+t)}let r=3*t,a=(this._grow(7+r),this.pos+2),n=this.enc.encodeInto(e,this.buf.subarray(a,a+r)).written,o=this.pos;this.buf[o++]=n<16?M:n<256?E:T,n<256?(this.buf[o++]=n,this.pos=a+n):(this.pos=o,this._wV(n),o=this.pos,this.buf.copyWithin(o,a,a+n),this.pos=o+n)}else{let i=3*t;this._grow(i+7);let s=this.pos+6,r=this.enc.encodeInto(e,this.buf.subarray(s,s+i)).written,a=this.pos;r===t?(this.buf[a++]=t<256?D:C,t<256?this.buf[a++]=t:(this.pos=a,this._wV(t),a=this.pos)):(this.buf[a++]=r<256?E:T,r<256?this.buf[a++]=r:(this.pos=a,this._wV(r),a=this.pos)),a!==s&&this.buf.copyWithin(a,s,s+r),this.pos=a+r}}_wObj(e){if(Array.isArray(e))this._wArr(e);else{var t=e.constructor;if(void 0!==(t=ke.get(t))){if(t===te)return this._grow(9),void((a=e.getTime())!=a?this.buf[this.pos++]=ie:(this.buf[this.pos++]=te,this.dv.setFloat64(this.pos,a,!0),this.pos+=8));if(t===_e)return this._grow(1),this.buf[this.pos++]=_e,this.writeValue(e.source),void this.writeValue(e.flags);if(t===Z){for(var[i,s]of(this._grow(6),this.buf[this.pos++]=Z,this._wV(e.size),e))this.writeValue(i),this.writeValue(s);return}if(t===ee){for(var r of(this._grow(6),this.buf[this.pos++]=ee,this._wV(e.size),e))this.writeValue(r);return}if(t===Q||t===J)return this._grow(6),this.buf[this.pos++]=t,a=new Uint8Array(e),this._wV(a.length),this._grow(a.length),this.buf.set(a,this.pos),void(this.pos+=a.length);if(96==(240&t))return void this._wTypedArr(e,t)}if(e.constructor===Error||e.constructor&&Ue.has(e.constructor.name)){this._grow(2);var a=Ue.get(e.constructor.name)||de;if(this.buf[this.pos++]=a,this.writeValue(e.message||""),this.writeValue(e.stack||""),a===ce&&e.errors)for(var n of(this._wV(e.errors.length),e.errors))this.writeValue(n)}else"undefined"==typeof Blob||e.constructor!==Blob&&e.constructor!==("undefined"!=typeof File?File:null)?this._wPlainObj(e):(this._grow(12),this.buf[this.pos++]="undefined"!=typeof File&&e.constructor===File?fe:ue,this._wV(0),this._wV(0))}}_wArr(e){var t=e.length;if(0===t)this._grow(1),this.buf[this.pos++]=B;else if(Object.keys(e).length!==t){this._grow(12),this.buf[this.pos++]=F,this._wV(t);var i,s=[];for(let i=0;i<t;i++)i in e&&s.push(i);for(i of(this._wV(s.length),s))this._wV(i),this.writeValue(e[i])}else if(!(this.options.simdOptimization&&8<=t&&"number"==typeof e[0]&&this._wPackedArr(e,t))){this._grow(6),this.buf[this.pos++]=V,this._wV(t);for(let i=0;i<t;i++)this.writeValue(e[i])}}_wPackedArr(e,t){let i,s=1,r=e[0],n=e[0],o=1;for(let i=0;i<t;i++){var h=e[i];if("number"!=typeof h)return!1;h!==(0|h)&&(s=0),h<r&&(r=h),h>n&&(n=h),o&&(a[0]=h,a[0]!==h)&&(o=0)}i=s?(l=Math.max(Math.abs(r),Math.abs(n)))<=127?L:l<=32767?P:O:o?K:N;var l=Se[i]||1;this._grow(6+t*l),this.buf[this.pos++]=i,this._wV(t);let c=this.pos;switch(i){case L:for(let i=0;i<t;i++)this.buf[c++]=255&e[i];break;case P:for(let i=0;i<t;i++)this.dv.setInt16(c,e[i],!0),c+=2;break;case O:for(let i=0;i<t;i++)this.dv.setInt32(c,e[i],!0),c+=4;break;case K:for(let i=0;i<t;i++)this.dv.setFloat32(c,e[i],!0),c+=4;break;case N:for(let i=0;i<t;i++)this.dv.setFloat64(c,e[i],!0),c+=8}return this.pos=c,!0}_wTypedArr(e,t){this._grow(12),this.buf[this.pos++]=t;var i=e.buffer;if(this.options.shareArrayBuffers){var s=this.buffers.get(i);if(void 0!==s)return this.buf[this.pos++]=1,this._wV(s),this._wV(e.byteOffset),void this._wV(e.length);this.buffers.set(i,this.buffers.size)}if(this.buf[this.pos++]=0,this._wV(e.byteOffset),this._wV(e.length),s=Se[t]||1,t===W||t===X){this._grow(8*e.length);for(let t=0;t<e.length;t++)this.dv.setBigInt64(this.pos,e[t],!0),this.pos+=8}else t=e.length*s,this._grow(t),s=new Uint8Array(i,e.byteOffset,t),this.buf.set(s,this.pos),this.pos+=t}_wPlainObj(e){var t=Object.getPrototypeOf(e),i=(t=e.constructor===Object||t===Object.prototype||null===t,Object.keys(e));if(0===i.length&&t)this._grow(1),this.buf[this.pos++]=$;else if(t){if(this.options.preservePropertyDescriptors){var s;t=[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)];let i=!1;for(s of t){var r=Object.getOwnPropertyDescriptor(e,s);if(r.get||r.set||!r.enumerable||!r.writable||!r.configurable){i=!0;break}}if(i)return void this._wDescriptorObj(e,t)}let n=!1;if(this.options.allowFunction)for(let t=0;t<i.length;t++)if("function"==typeof e[i[t]]){n=!0;break}if(n)this._wMethodObj(e,i);else{this._grow(6),this.buf[this.pos++]=q,this.options.sortKeys&&i.sort();let t=i.length;if(!this.options.serializeFunctions)for(let s=t=0;s<i.length;s++)"function"!=typeof e[i[s]]&&t++;this._wV(t);for(let t=0;t<i.length;t++){var a=e[i[t]];!this.options.serializeFunctions&&"function"==typeof a||(this.writeValue(i[t]),this.writeValue(a))}}}else this._wConstructorObj(e,i)}_wDescriptorObj(e,t){this._grow(6),this.buf[this.pos++]=H;var i;t=t.filter(t=>{try{var i=Object.getOwnPropertyDescriptor(e,t);return i&&(this.options.serializeFunctions||!i.get&&!i.set&&"function"!=typeof i.value)}catch(t){return!1}});for(i of(this._wV(t.length),t)){this.writeValue(i);var s=Object.getOwnPropertyDescriptor(e,i);let t=0;s.enumerable&&(t|=1),s.writable&&(t|=2),s.configurable&&(t|=4),s.get&&(t|=8),s.set&&(t|=16),this._grow(1),this.buf[this.pos++]=t,s.get||s.set?(s.get&&this.writeValue(s.get),s.set&&this.writeValue(s.set)):this.writeValue(s.value)}}_wMethodObj(e,t){this._grow(6),this.buf[this.pos++]=G;var i,s,r,a,n=[];for(i of t)try{var o=e[i];n.push([i,o,"function"==typeof o])}catch(e){}for([s,r,a]of(this._wV(n.length),n))this.writeValue(s),this._grow(1),this.buf[this.pos++]=a?1:0,a&&this.options.serializeFunctions?(this.writeValue(r.toString()),this.writeValue(r.name||"")):a?(this._grow(1),this.buf[this.pos++]=ve):this.writeValue(r)}_wConstructorObj(e,t){this._grow(6),this.buf[this.pos++]=R,this.writeValue((null==(s=e.constructor)?void 0:s.name)||"");var i,s=this.options.serializeFunctions?t:t.filter(t=>{try{return"function"!=typeof e[t]}catch(t){return!1}});for(i of(this._wV(s.length),s))this.writeValue(i),this.writeValue(e[i])}_pushRef(e){0<=this._drIdx?this.deserializeRefs[this._drIdx++]=e:this.deserializeRefs.push(e)}_pushStr(e){0<=this._dsIdx?this.deserializeStrings[this._dsIdx++]=e:this.deserializeStrings.push(e)}_pushBuf(e){0<=this._dbIdx?this.deserializeBuffers[this._dbIdx++]=e:this.deserializeBuffers.push(e)}readValue(){var e=this.buffer[this.pos++];if(e===me||e===pe)return this.deserializeRefs[this._rV()];if(e===U)return this.deserializeStrings[this._rV()];if(e===Y)return this.deserializeBuffers[this._rV()];var t,i=240&e;if(0==i)return 0===e?null:1===e?void 0:3===e;if(16==i)return this._rNum(e);if(32==i)return this._rBigInt(e);if(48==i)return this._rStr(e);if(64==i||80==i||128==i){let t;return t=64==i?[]:128==i?new(e===Z?Map:Set):{},this._pushRef(t),this._rFill(t,e,i),t}if(96==i)return t=this._rTypedArr(e),this._pushRef(t),t;if(112==i)return t=this._rArrayBuf(e),this._pushBuf(t),t;if(144==i)return e===ie?new Date(NaN):(t=this.view.getFloat64(this.pos,!0),this.pos+=8,new Date(t));if(160==i)return this._rError(e);if(176==i)return new RegExp(this.readValue(),this.readValue());if(192==i)return this._rV(),this._rV(),{_type:"Binary"};if(224==i)return this._rSpecial(e);if(240==i)return this.options.allowFunction?function(){throw new Error("Function not serialized")}:void 0;throw new Error("Unknown type: 0x"+e.toString(16))}_rV(){let e=this.pos,t=this.buffer[e++];if(!(128&t))return this.pos=e,t;let i=127&t,s=7;for(;t=this.buffer[e++],i|=(127&t)<<s,s+=7,128&t;);return this.pos=e,i>>>0}_rFill(e,t,i){if(64===i){if(t!==B)if(t===V){var s=this._rV();for(let t=0;t<s;t++)e[t]=this.readValue()}else if(t===F){e.length=this._rV();var r=this._rV();for(let t=0;t<r;t++)e[this._rV()]=this.readValue()}else{var a=this._rPacked(t);for(let t=0;t<a.length;t++)e.push(a[t])}}else if(80===i)this.fillObject(e,t);else if(128===i){var n=this._rV();if(t===Z)for(let t=0;t<n;t++)e.set(this.readValue(),this.readValue());else for(let t=0;t<n;t++)e.add(this.readValue())}}fillObject(e,t){t!==$&&(t===q||t===j?this._fillLiteralObj(e):t===H?this._fillDescriptorObj(e):t===G?this._fillMethodObj(e):t===R&&this._fillConstructorObj(e))}_fillLiteralObj(e){var t=this._rV();for(let i=0;i<t;i++)e[this.readValue()]=this.readValue()}_fillDescriptorObj(e){var t=this._rV();for(let a=0;a<t;a++){var i=this.readValue(),s=this.buffer[this.pos++],r={enumerable:!!(1&s),writable:!!(2&s),configurable:!!(4&s)};8&s||16&s?(8&s&&(r.get=this.readValue()),16&s&&(r.set=this.readValue())):r.value=this.readValue(),Object.defineProperty(e,i,r)}}_fillMethodObj(e){var t=this._rV();for(let r=0;r<t;r++){var i=this.readValue();if(this.buffer[this.pos++])if(this.options.allowFunction&&this.options.serializeFunctions){var s=this.readValue();this.readValue();try{e[i]=new Function("return "+s)()}catch(t){e[i]=void 0}}else this.options.serializeFunctions?(this.readValue(),this.readValue(),e[i]=void 0):(this.pos++,e[i]=this.options.allowFunction?function(){throw new Error("Not serialized")}:void 0);else e[i]=this.readValue()}}_fillConstructorObj(e){var t=this.readValue(),i=this._rV();for(let t=0;t<i;t++)e[this.readValue()]=this.readValue();e[Ve]=t}_rNum(e){let t,i=this.pos;switch(e){case d:return t=this.buffer[i]<<24>>24,this.pos=i+1,t;case _:return t=this.view.getInt16(i,!0),this.pos=i+2,t;case u:return t=this.view.getInt32(i,!0),this.pos=i+4,t;case f:return t=this.view.getUint32(i,!0),this.pos=i+4,t;case m:return t=this.view.getFloat32(i,!0),this.pos=i+4,t;case p:return t=this.view.getFloat64(i,!0),this.pos=i+8,t;case y:return NaN;case w:return 1/0;case g:return-1/0;case b:return-0;case v:return t=this._rV(),this.buffer[this.pos++]?-t:t}}_rBigInt(e){if(e===S||e===A){let e=this.view.getBigInt64(this.pos,!0);return this.pos+=8,e}e=e===I;var t=this._rV();let i="";for(let e=t-1;0<=e;e--)i+=this.buffer[this.pos+e].toString(16).padStart(2,"0");this.pos+=t;let s=BigInt("0x"+(i||"0"));return e?-s:s}_rStr(e){if(e===z)return"";var t=this.buffer;let i,r;return i=e===k||e===D||e===M||e===E?this.buffer[this.pos++]:this._rV(),r=(e=e===k||e===D||e===C)&&i<128?s[i](t,this.pos):this.dec.decode(t.subarray(this.pos,this.pos+i)),this.pos+=i,3<r.length&&this._pushStr(r),r}_rPacked(e){var t=this._rV(),i=new Array(t);let s=this.pos;switch(e){case L:for(let e=0;e<t;e++)i[e]=this.buffer[s++]<<24>>24;break;case P:for(let e=0;e<t;e++)i[e]=this.view.getInt16(s,!0),s+=2;break;case O:for(let e=0;e<t;e++)i[e]=this.view.getInt32(s,!0),s+=4;break;case K:for(let e=0;e<t;e++)i[e]=this.view.getFloat32(s,!0),s+=4;break;case N:for(let e=0;e<t;e++)i[e]=this.view.getFloat64(s,!0),s+=8}return this.pos=s,i}_rTypedArr(e){if(this.buffer[this.pos++]){let t=this._rV(),i=this._rV(),s=this._rV();return new Ae[e](this.deserializeBuffers[t],i,s)}this._rV();let t=this._rV(),i=Se[e]||1;if(e===W||e===X){var s=[];for(let e=0;e<t;e++)s.push(this.view.getBigInt64(this.pos,!0)),this.pos+=8;return new Ae[e](s)}var r=t*i,a=new ArrayBuffer(r);return new Uint8Array(a).set(this.buffer.subarray(this.pos,this.pos+r)),this.pos+=r,this._pushBuf(a),new Ae[e](a,0,t)}_rArrayBuf(e){var t=this._rV(),i=this.buffer.buffer.slice(this.buffer.byteOffset+this.pos,this.buffer.byteOffset+this.pos+t);return this.pos+=t,i}_rError(e){var t=this.readValue(),i=this.readValue();let s;if(e===ce){var r=this._rV(),a=[];for(let e=0;e<r;e++)a.push(this.readValue());s=new AggregateError(a,t)}else s=new(Te[e]||Error)(t);return i&&(s.stack=i),s}_rSpecial(e){if(e===ye)return Symbol(this.readValue());if(e===be)return Symbol();if(e===we)return Symbol.for(this.readValue());if(e===ge)return o.get(this.readValue())||Symbol();throw new Error("Unknown special type: 0x"+e.toString(16))}}(e),this._base64=new Le.a}get performanceMonitor(){return this._performanceMonitor}get serializer(){return this._serializer}get base64(){return this._base64}async getDatabase(e,t={}){var i;return this._databases.has(e)||(await(i=new wt(e,this._performanceMonitor,this._serializer,this._base64)).init(t),this._databases.set(e,i)),this._databases.get(e)}async getSecureDatabase(e,t,i=null,s={}){return this.getDatabase(e,{pin:t,salt:i,encryptionConfig:s})}async dropDatabase(e){var t;this._databases.has(e)&&(await(t=this._databases.get(e)).clearAll(),t.destroy(),this._databases.delete(e)),["metadata","settings","version","encryption","idb_version","idb_stores","consolidated"].forEach(t=>{localStorage.removeItem(`lacertadb_${e}_`+t)}),new Oe(e,this._serializer,this._base64).clear();var i=[];for(let t=0;t<localStorage.length;t++){var s=localStorage.key(t);s&&s.startsWith(`lacertadb_${e}_`)&&i.push(s)}i.forEach(e=>localStorage.removeItem(e)),await new Promise(t=>{var i=indexedDB.deleteDatabase("lacertadb_"+e);i.onsuccess=t,i.onerror=t,i.onblocked=t})}listDatabases(){var e=new Set;for(let i=0;i<localStorage.length;i++){var t=localStorage.key(i);t&&t.startsWith("lacertadb_")&&(t=t.match(/^lacertadb_([^_]+)_(metadata|settings|version|encryption|quickstore)$/))&&e.add(t[1])}return[...e]}async createBackup(e=null){var t,i={version:"0.12.0",timestamp:Date.now(),databases:{}};for(t of this.listDatabases()){var s=await(await this.getDatabase(t)).export("json");s=this._base64.decode(s);i.databases[t]=this._serializer.deserialize(s)}var r=this._serializer.serialize(i);return e?(e=await(new Xe).encrypt(r,e),this._base64.encode(e)):this._base64.encode(r)}async restoreBackup(e,t=null){let i;try{var s,r=this._base64.decode(e);i=t?(s=await(new Xe).decrypt(r,t),this._serializer.deserialize(s)):this._serializer.deserialize(r)}catch(e){throw new $e("Failed to parse backup data","BACKUP_PARSE_FAILED",e)}var a,n,o={databases:0,collections:0,documents:0};for([a,n]of Object.entries(i.databases)){var h=await this.getDatabase(a),l=this._base64.encode(this._serializer.serialize(n));h=await h.import(l);o.databases++,o.collections+=h.collections,o.documents+=h.documents}return o}close(){for(var e of this._databases.values())e._db&&(e._db.close(),e._db=null)}destroy(){for(var e of this._databases.values())e.destroy();this._databases.clear()}}},function(e,t,i){i.r(t),t=i(1),"undefined"!=typeof window?window.LACERTA=t:self.LACERTA=t}]);
9
+ "undefined"==typeof window||window.requestIdleCallback||(window.requestIdleCallback=function(e){return setTimeout(e,0)},window.cancelIdleCallback=clearTimeout);let Pe={compression:!1,preservePropertyDescriptors:!1,deduplication:!1,simdOptimization:!0,detectCircular:!1,shareArrayBuffers:!1,allowFunction:!1,serializeFunctions:!1,memoryPoolSize:262144};class Oe{constructor(e,t,i,s=null){this._dbName=e,this._serializer=t,this._base64=i,this._idb=s,this._metaKey="quickstore_"+e,this._docs=new Map,this._hydrated=!1,this._dirtyDocs=new Set,this._dirtyIndex=!1,this._saveTimer=null}destroy(){this._saveTimer&&("undefined"!=typeof window&&window.cancelIdleCallback?window.cancelIdleCallback(this._saveTimer):clearTimeout(this._saveTimer),this._saveTimer=null)}async hydrateFromIDB(){if(!this._hydrated){if(this._idb&&this._idb.objectStoreNames.contains("__meta"))try{var e=await gt._readMeta(this._idb,this._metaKey);if(e&&e.docs){var t=this._base64.decode(e.docs),i=this._serializer.deserialize(t);if(Array.isArray(i))for(var[s,r]of i)this._docs.set(s,r)}}catch(e){console.warn("QuickStore IDB hydration failed, trying localStorage fallback.",e),this._hydrateFromLocalStorage()}else this._hydrateFromLocalStorage();this._hydrated=!0}}_hydrateFromLocalStorage(){var e=`lacertadb_${this._dbName}_quickstore_`,t=e+"index",i=localStorage.getItem(t);if(i)try{var s,r,a,n=this._base64.decode(i);for(s of this._serializer.deserialize(n)){var o=e+"data_"+s,h=localStorage.getItem(o);if(h)try{var l=this._base64.decode(h);this._docs.set(s,this._serializer.deserialize(l))}catch(e){}}for(r of(this._dirtyIndex=!0,this._docs.keys()))this._dirtyDocs.add(r);for(a of(this._persistDirty(),localStorage.removeItem(t),this._docs.keys()))localStorage.removeItem(e+"data_"+a)}catch(e){console.warn("QuickStore localStorage hydration failed.",e)}}_ensureHydrated(){this._hydrated||(this._hydrated=!0)}_scheduleSave(){var e;this._saveTimer||(e=()=>{this._saveTimer=null,this._persistDirty()},"undefined"!=typeof window&&window.requestIdleCallback?this._saveTimer=window.requestIdleCallback(e):this._saveTimer=setTimeout(e,200))}_persistDirty(){if((0!==this._dirtyDocs.size||this._dirtyIndex)&&(this._dirtyDocs.clear(),this._dirtyIndex=!1,this._idb)&&this._idb.objectStoreNames.contains("__meta"))try{var e=Array.from(this._docs.entries()),t=this._serializer.serialize(e),i=this._base64.encode(t);gt._writeMeta(this._idb,this._metaKey,{docs:i}).catch(e=>{console.error("QuickStore IDB save failed:",e)})}catch(e){console.error("QuickStore serialization failed:",e)}}add(e,t){this._ensureHydrated();var i=!this._docs.has(e);return this._docs.set(e,t),this._dirtyDocs.add(e),i&&(this._dirtyIndex=!0),this._scheduleSave(),!0}get(e){return this._ensureHydrated(),void 0!==(e=this._docs.get(e))?e:null}update(e,t){return this.add(e,t)}delete(e){this._ensureHydrated(),this._docs.has(e)&&(this._docs.delete(e),this._dirtyDocs.add(e),this._dirtyIndex=!0,this._scheduleSave())}getAll(){this._ensureHydrated();var e,t,i=[];for([e,t]of this._docs)i.push({_id:e,...t});return i}query(e={}){return 0===Object.keys(e).length?this.getAll():this.getAll().filter(t=>ft.evaluate(t,e))}clear(){this._ensureHydrated(),this._docs.clear(),this._dirtyDocs.clear(),this._dirtyIndex=!1,this._saveTimer&&("undefined"!=typeof window&&window.cancelIdleCallback?window.cancelIdleCallback(this._saveTimer):clearTimeout(this._saveTimer),this._saveTimer=null),this._idb&&this._idb.objectStoreNames.contains("__meta")&&gt._writeMeta(this._idb,this._metaKey,{docs:null}).catch(()=>{});var e=`lacertadb_${this._dbName}_quickstore_index`;try{localStorage.removeItem(e)}catch(e){}}get size(){return this._ensureHydrated(),this._docs.size}}class Ne{constructor(){this._connections=new Map,this._refCounts=new Map}async getConnection(e,t=1,i){let s=e+"_v"+t;var r;return this._connections.has(s)?(this._refCounts.set(s,(this._refCounts.get(s)||0)+1),this._connections.get(s)):((r=await new Promise((s,r)=>{let a=indexedDB.open(e,t);a.onerror=()=>r(new $e("Failed to open database","DATABASE_OPEN_FAILED",a.error)),a.onsuccess=()=>s(a.result),a.onupgradeneeded=e=>{i&&i(e.target.result,e.oldVersion,e.newVersion)}})).onclose=()=>{this._connections.delete(s),this._refCounts.delete(s)},this._connections.set(s,r),this._refCounts.set(s,1),r)}releaseConnection(e,t=1){var i;e=e+"_v"+t;(t=this._refCounts.get(e)||0)<=1?(i=this._connections.get(e))&&(i.close(),this._connections.delete(e),this._refCounts.delete(e)):this._refCounts.set(e,t-1)}closeAll(){for(var e of this._connections.values())e.close();this._connections.clear(),this._refCounts.clear()}}new Ne;class Ke{constructor(){this._queue=[],this._headIndex=0,this._locked=!1}acquire(){return new Promise(e=>{this._queue.push(e),this._dispatch()})}release(){this._locked=!1,this._dispatch()}async runExclusive(e){var t=await this.acquire();try{return await e()}finally{t()}}_dispatch(){this._locked||this._headIndex>=this._queue.length||(this._locked=!0,(0,this._queue[this._headIndex++])(()=>this.release()),1e3<this._headIndex&&this._headIndex>this._queue.length>>>1&&(this._queue=this._queue.slice(this._headIndex),this._headIndex=0))}}class $e extends Error{constructor(e,t,i){super(e),this.name="LacertaDBError",this.code=t,this.originalError=i||null,this._ts=Date.now()}get timestamp(){return new Date(this._ts).toISOString()}}class je{constructor(e=100,t=null){this._maxSize=e,this._ttl=t,this._cache=new Map}get(e){var t=this._cache.get(e);return t?this._ttl&&Date.now()-t.ts>this._ttl?(this._cache.delete(e),null):(this._cache.delete(e),this._cache.set(e,t),t.value):null}set(e,t){this._cache.has(e)?this._cache.delete(e):this._cache.size>=this._maxSize&&this._cache.delete(this._cache.keys().next().value),this._cache.set(e,{value:t,ts:Date.now()})}delete(e){return this._cache.delete(e)}clear(){this._cache.clear()}has(e){var t=this._cache.get(e);return!(!t||this._ttl&&Date.now()-t.ts>this._ttl&&(this._cache.delete(e),1))}get size(){return this._cache.size}}class Re{constructor(e=100,t=null){this._maxSize=e,this._ttl=t,this._cache=new Map,this._frequencies=new Map,this._timestamps=new Map,this._buckets=new Map,this._minFreq=0}get(e){if(!this._cache.has(e))return null;if(this._ttl){var t=this._timestamps.get(e);if(Date.now()-t>this._ttl)return this.delete(e),null}var i=(t=this._frequencies.get(e)||1)+1,s=(this._frequencies.set(e,i),this._buckets.get(t));return s&&(s.delete(e),0===s.size)&&(this._buckets.delete(t),this._minFreq===t)&&(this._minFreq=i),this._buckets.has(i)||this._buckets.set(i,new Set),this._buckets.get(i).add(e),this._cache.get(e)}set(e,t){var i;this._maxSize<=0||(this._cache.has(e)?(this._cache.set(e,t),this.get(e)):(this._cache.size>=this._maxSize&&(i=this._buckets.get(this._minFreq))&&0<i.size&&(i=i.values().next().value,this.delete(i)),this._cache.set(e,t),this._frequencies.set(e,1),this._timestamps.set(e,Date.now()),this._buckets.has(1)||this._buckets.set(1,new Set),this._buckets.get(1).add(e),this._minFreq=1))}delete(e){var t,i;return!!this._cache.has(e)&&(t=this._frequencies.get(e)||1,(i=this._buckets.get(t))&&(i.delete(e),0===i.size)&&this._buckets.delete(t),this._frequencies.delete(e),this._timestamps.delete(e),this._cache.delete(e))}clear(){this._cache.clear(),this._frequencies.clear(),this._timestamps.clear(),this._buckets.clear(),this._minFreq=0}has(e){return null!==this.get(e)}get size(){return this._cache.size}}class qe{constructor(e=6e4){this._ttl=e,this._cache=new Map,this._sweepTimer=null,this._scheduleSweep()}get(e){var t=this._cache.get(e);return t?Date.now()-t.ts>this._ttl?(this._cache.delete(e),null):t.value:null}set(e,t){this._cache.set(e,{value:t,ts:Date.now()})}delete(e){return this._cache.delete(e)}clear(){this._cache.clear()}has(e){return null!==this.get(e)}get size(){return this._cache.size}_scheduleSweep(){if("undefined"!=typeof globalThis){let e=t=>{if(0!==this._cache.size){var i=Date.now(),s=this._cache.entries();let e=s.next();for(;!e.done&&0<t.timeRemaining();){var[r,a]=e.value;i-a.ts>this._ttl&&this._cache.delete(r),e=s.next()}}this._sweepTimer=requestIdleCallback(e,{timeout:this._ttl})};this._sweepTimer=requestIdleCallback(e,{timeout:this._ttl})}}destroy(){this._sweepTimer&&(("undefined"!=typeof cancelIdleCallback?cancelIdleCallback:clearTimeout)(this._sweepTimer),this._sweepTimer=null),this._cache.clear()}}class He{constructor(e={}){this._config=e,this._cache=this._createCache()}get cache(){return this._cache||(this._cache=this._createCache()),this._cache}_createCache(){var e=this._config.type||"lru",t=this._config.maxSize||100,i=this._config.ttl;return"none"===e||!1===this._config.enabled?null:"ttl"===e?new qe(i):new("lfu"===e?Re:je)(t,i)}get(e){return this.cache?this.cache.get(e):null}set(e,t){this.cache&&this.cache.set(e,t)}delete(e){this.cache&&this.cache.delete(e)}clear(){this.cache&&this.cache.clear()}updateStrategy(e){this._config={...this._config,...e},this._cache=null}destroy(){this._cache&&this._cache.destroy?this._cache.destroy():this._cache&&this._cache.clear&&this._cache.clear(),this._cache=null}}class Ge{async compress(e){if(!(e instanceof Uint8Array))throw new TypeError("Input must be Uint8Array");try{var t=new Response(e).body.pipeThrough(new CompressionStream("deflate")),i=await new Response(t).arrayBuffer(),s=new Uint8Array(i.byteLength+1);return s[0]=1,s.set(new Uint8Array(i),1),s}catch(i){return(t=new Uint8Array(e.byteLength+1))[0]=0,t.set(e,1),t}}async decompress(e){if(!(e instanceof Uint8Array))throw new TypeError("Input must be Uint8Array");if(0===e.length)return e;var t=e[0],i=e.slice(1);if(0===t)return i;if(1!==t)return e;try{var s=new Response(i).body.pipeThrough(new DecompressionStream("deflate")),r=await new Response(s).arrayBuffer();return new Uint8Array(r)}catch(t){return console.error("Decompression failed",t),e}}compressSync(e){var t;if(e instanceof Uint8Array)return(t=new Uint8Array(e.byteLength+1))[0]=0,t.set(e,1),t;throw new TypeError("Input must be Uint8Array")}decompressSync(e){if(!(e instanceof Uint8Array))throw new TypeError("Input must be Uint8Array");if(0===e.length)return e;var t=e[0];if(1===t)throw new $e("Cannot synchronously decompress deflate data. Use async unpack() instead.","SYNC_DECOMPRESS_NOT_SUPPORTED");return 0===t?e.slice(1):e}}let We=new Ge;class Xe{async encrypt(e,t){var i=new TextEncoder,s=crypto.getRandomValues(new Uint8Array(16)),r=crypto.getRandomValues(new Uint8Array(12));i=i.encode(t),t=await crypto.subtle.importKey("raw",i,"PBKDF2",!1,["deriveBits","deriveKey"]),i=await crypto.subtle.deriveKey({name:"PBKDF2",salt:s,iterations:6e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"]),t=await crypto.subtle.encrypt({name:"AES-GCM",iv:r},i,e);return(i=new Uint8Array(s.length+r.length+t.byteLength)).set(s,0),i.set(r,s.length),i.set(new Uint8Array(t),s.length+r.length),i}async decrypt(e,t){var i=new TextEncoder,s=e.slice(0,16),r=e.slice(16,28);e=e.slice(28),i=i.encode(t),t=await crypto.subtle.importKey("raw",i,"PBKDF2",!1,["deriveBits","deriveKey"]),i=await crypto.subtle.deriveKey({name:"PBKDF2",salt:s,iterations:6e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"]),s=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},i,e);return new Uint8Array(s)}}class Qe{constructor(e={},t,i){this._iterations=e.iterations||6e5,this._hashAlgorithm=e.hashAlgorithm||"SHA-256",this._keyLength=e.keyLength||256,this._saltLength=e.saltLength||32,this._initialized=!1,this._serializer=t,this._base64=i,this._masterKey=null,this._hmacKey=null,this._salt=null,this._wrappedKeyBlob=null}get initialized(){return this._initialized}async initialize(e,t=null){if(this._initialized)throw new Error("Database encryption already initialized");if(e=(new TextEncoder).encode(e),t){this._salt=this._base64.decode(t.salt);var i=await this._deriveKEK(e,this._salt),s=(t=this._base64.decode(t.wrappedKey)).slice(0,12);t=t.slice(12);try{var r=await crypto.subtle.decrypt({name:"AES-GCM",iv:s},i,t);await this._importMasterKeys(r)}catch(e){throw new Error("Invalid PIN or corrupted key data")}}else this._salt=crypto.getRandomValues(new Uint8Array(this._saltLength)),s=await this._deriveKEK(e,this._salt),i=crypto.getRandomValues(new Uint8Array(64)),await this._importMasterKeys(i.buffer),t=crypto.getRandomValues(new Uint8Array(12)),r=await crypto.subtle.encrypt({name:"AES-GCM",iv:t},s,i),(e=new Uint8Array(12+r.byteLength)).set(t,0),e.set(new Uint8Array(r),12),this._wrappedKeyBlob=this._base64.encode(e);return this._initialized=!0,this.exportMetadata()}async _deriveKEK(e,t){return e=await crypto.subtle.importKey("raw",e,"PBKDF2",!1,["deriveBits","deriveKey"]),crypto.subtle.deriveKey({name:"PBKDF2",salt:t,iterations:this._iterations,hash:this._hashAlgorithm},e,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}async _importMasterKeys(e){var t=(e=new Uint8Array(e)).slice(0,32);e=e.slice(32,64);this._masterKey=await crypto.subtle.importKey("raw",t,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),this._hmacKey=await crypto.subtle.importKey("raw",e,{name:"HMAC",hash:"SHA-256"},!0,["sign","verify"])}async _exportMasterKeys(){var e=await crypto.subtle.exportKey("raw",this._masterKey),t=await crypto.subtle.exportKey("raw",this._hmacKey),i=new Uint8Array(64);return i.set(new Uint8Array(e),0),i.set(new Uint8Array(t),32),i}async changePin(e,t){if(!this._initialized)throw new Error("Database encryption not initialized");e=await this._deriveKEK((new TextEncoder).encode(e),this._salt);var i=(s=this._base64.decode(this._wrappedKeyBlob)).slice(0,12),s=s.slice(12);try{await crypto.subtle.decrypt({name:"AES-GCM",iv:i},e,s)}catch(e){throw new Error("Invalid old PIN")}return i=crypto.getRandomValues(new Uint8Array(this._saltLength)),e=await this._deriveKEK((new TextEncoder).encode(t),i),s=await this._exportMasterKeys(),t=crypto.getRandomValues(new Uint8Array(12)),e=await crypto.subtle.encrypt({name:"AES-GCM",iv:t},e,s),(s=new Uint8Array(12+e.byteLength)).set(t,0),s.set(new Uint8Array(e),12),this._salt=i,this._wrappedKeyBlob=this._base64.encode(s),this.exportMetadata()}async encrypt(e){if(!this._initialized)throw new Error("Database encryption not initialized");let t;t="string"==typeof e?(new TextEncoder).encode(e):e instanceof Uint8Array?e:this._serializer.serialize(e);e=crypto.getRandomValues(new Uint8Array(12));var i=await crypto.subtle.encrypt({name:"AES-GCM",iv:e},this._masterKey,t),s=((s=new Uint8Array(e.length+i.byteLength)).set(e,0),s.set(new Uint8Array(i),e.length),await crypto.subtle.sign("HMAC",this._hmacKey,s)),r=new Uint8Array(e.length+i.byteLength+32);return r.set(e,0),r.set(new Uint8Array(i),e.length),r.set(new Uint8Array(s),e.length+i.byteLength),r}async decrypt(e){if(!this._initialized)throw new Error("Database encryption not initialized");if(!(e instanceof Uint8Array))throw new TypeError("Encrypted data must be Uint8Array");var t=e.slice(0,12),i=e.slice(-32),s=(e=e.slice(12,-32),new Uint8Array(t.length+e.length));if(i=(s.set(t,0),s.set(e,t.length),await crypto.subtle.verify("HMAC",this._hmacKey,i,s)))return s=await crypto.subtle.decrypt({name:"AES-GCM",iv:t},this._masterKey,e),new Uint8Array(s);throw new Error("HMAC verification failed - data may be tampered")}async encryptPrivateKey(e,t=""){if(!this._initialized)throw new Error("Database encryption not initialized");t=(s=new TextEncoder).encode(t);let i;i="string"==typeof e?s.encode(e):e instanceof Uint8Array?e:this._serializer.serialize(e);var s=crypto.getRandomValues(new Uint8Array(12)),r=(e=await crypto.subtle.encrypt({name:"AES-GCM",iv:s,additionalData:t,tagLength:128},this._masterKey,i),new Uint32Array([t.length])),a=new Uint8Array(16+t.length+e.byteLength);return a.set(s,0),a.set(new Uint8Array(r.buffer),12),a.set(t,16),a.set(new Uint8Array(e),16+t.length),this._base64.encode(a)}async decryptPrivateKey(e,t=""){if(!this._initialized)throw new Error("Database encryption not initialized");var i=(e=this._base64.decode(e)).slice(0,12),s=e.slice(12,16),r=(s=new Uint32Array(s.buffer)[0],e.slice(16,16+s));e=e.slice(16+s),s=(new TextEncoder).encode(t);if(this._arrayEquals(r,s))return t=await crypto.subtle.decrypt({name:"AES-GCM",iv:i,additionalData:r,tagLength:128},this._masterKey,e),(new TextDecoder).decode(t);throw new Error("Additional authentication data mismatch")}static generateSecurePIN(e=6){for(var t=[],i=new Uint8Array(1);t.length<e;)crypto.getRandomValues(i),i[0]<250&&t.push((i[0]%10).toString());return t.join("")}destroy(){this._masterKey=null,this._hmacKey=null,this._initialized=!1}_arrayEquals(e,t){if(e.length!==t.length)return!1;let i=0;for(let s=0;s<e.length;s++)i|=e[s]^t[s];return 0===i}exportMetadata(){return{salt:this._base64.encode(this._salt),wrappedKey:this._wrappedKeyBlob,iterations:this._iterations,algorithm:"AES-GCM-256",kdf:"PBKDF2",hashAlgorithm:this._hashAlgorithm,keyLength:this._keyLength,saltLength:this._saltLength}}importMetadata(e){}}class Ye{constructor(e,t=4){this.boundary=e,this.capacity=t,this.points=[],this.divided=!1}insert(e){return!!this._contains(this.boundary,e)&&(this.points.length<this.capacity?(this.points.push(e),!0):(this.divided||this._subdivide(),this.northeast.insert(e)||this.northwest.insert(e)||this.southeast.insert(e)||this.southwest.insert(e)))}query(e,t=[]){if(this._intersects(this.boundary,e)){for(var i of this.points)this._contains(e,i)&&t.push(i);this.divided&&(this.northwest.query(e,t),this.northeast.query(e,t),this.southwest.query(e,t),this.southeast.query(e,t))}return t}remove(e){this.points=this.points.filter(t=>t.data!==e),this.divided&&(this.northwest.remove(e),this.northeast.remove(e),this.southwest.remove(e),this.southeast.remove(e))}removeAt(e,t,i){if(!this._contains(this.boundary,{x:e,y:t}))return!1;for(let e=0;e<this.points.length;e++)if(this.points[e].data===i)return this.points.splice(e,1),!0;return!!this.divided&&(this.northeast.removeAt(e,t,i)||this.northwest.removeAt(e,t,i)||this.southeast.removeAt(e,t,i)||this.southwest.removeAt(e,t,i))}_subdivide(){var{x:e,y:t,w:i,h:s}=this.boundary,i=i/2,s=s/2;this.northeast=new Ye({x:e+i,y:t-s,w:i,h:s},this.capacity),this.northwest=new Ye({x:e-i,y:t-s,w:i,h:s},this.capacity),this.southeast=new Ye({x:e+i,y:t+s,w:i,h:s},this.capacity),this.southwest=new Ye({x:e-i,y:t+s,w:i,h:s},this.capacity),this.divided=!0}_contains(e,t){return t.x>=e.x-e.w&&t.x<=e.x+e.w&&t.y>=e.y-e.h&&t.y<=e.y+e.h}_intersects(e,t){return!(t.x-t.w>e.x+e.w||t.x+t.w<e.x-e.w||t.y-t.h>e.y+e.h||t.y+t.h<e.y-e.h)}}function Je(e,t){var i,s;return e===t?0:(i=typeof e)==(s=typeof t)?"number"==i?e<t?-1:1:"string"==i?e<t?-1:t<e?1:0:(e=String(e))<(t=String(t))?-1:t<e?1:0:i<s?-1:1}class Ze{constructor(e,t){this.keys=new Array(2*e-1),this.values=new Array(2*e-1),this.children=new Array(2*e),this.n=0,this.leaf=t,this.order=e}search(e){let t=0;for(;t<this.n&&0<Je(e,this.keys[t]);)t++;return t<this.n&&0===Je(e,this.keys[t])?this.values[t]:!this.leaf&&this.children[t]?this.children[t].search(e):null}rangeSearch(e,t,i,s=!1,r=!1){let a=0;if(null!==e)for(;a<this.n&&Je(this.keys[a],e)<0;)a++;for(;a<this.n;a++){if(null!==t){var n=Je(this.keys[a],t);if(r?0<=n:0<n)return void(!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,s,r))}!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,s,r);n=null===e?1:Je(this.keys[a],e);var o=null===t?-1:Je(this.keys[a],t);(null===e||(s?0<n:0<=n))&&(null===t||(r?o<0:o<=0))&&this.values[a]&&this.values[a].forEach(e=>i.push(e))}!this.leaf&&this.children[a]&&this.children[a].rangeSearch(e,t,i,s,r)}insertNonFull(e,t){let i=this.n-1;if(this.leaf){for(;0<=i&&0<Je(this.keys[i],e);)this.keys[i+1]=this.keys[i],this.values[i+1]=this.values[i],i--;0<=i&&0===Je(this.keys[i],e)?(this.values[i]||(this.values[i]=new Set),this.values[i].add(t)):(this.keys[i+1]=e,this.values[i+1]=new Set([t]),this.n++)}else{for(;0<=i&&0<Je(this.keys[i],e);)i--;if(0<=i&&0===Je(this.keys[i],e))this.values[i]||(this.values[i]=new Set),this.values[i].add(t);else{if(i++,this.children[i]&&this.children[i].n===2*this.order-1){this.splitChild(i,this.children[i]);var s=Je(this.keys[i],e);if(0===s)return this.values[i]||(this.values[i]=new Set),void this.values[i].add(t);s<0&&i++}this.children[i]&&this.children[i].insertNonFull(e,t)}}}splitChild(e,t){var i=new Ze(this.order,t.leaf);i.n=this.order-1;for(let e=0;e<this.order-1;e++)i.keys[e]=t.keys[e+this.order],i.values[e]=t.values[e+this.order];if(!t.leaf)for(let e=0;e<this.order;e++)i.children[e]=t.children[e+this.order];var s=t.keys[this.order-1],r=t.values[this.order-1];t.n=this.order-1;for(let e=this.order-1;e<2*this.order-1;e++)t.keys[e]=void 0,t.values[e]=void 0;if(!t.leaf)for(let e=this.order;e<2*this.order;e++)t.children[e]=void 0;for(let t=this.n;t>=e+1;t--)this.children[t+1]=this.children[t];this.children[e+1]=i;for(let t=this.n-1;t>=e;t--)this.keys[t+1]=this.keys[t],this.values[t+1]=this.values[t];this.keys[e]=s,this.values[e]=r,this.n++}_getPredecessor(e){let t=this.children[e];for(;!t.leaf;)t=t.children[t.n];return{key:t.keys[t.n-1],value:t.values[t.n-1]}}_getSuccessor(e){let t=this.children[e+1];for(;!t.leaf;)t=t.children[0];return{key:t.keys[0],value:t.values[0]}}_merge(e){var t=this.children[e],i=this.children[e+1],s=this.order;t.keys[s-1]=this.keys[e],t.values[s-1]=this.values[e];for(let e=0;e<i.n;e++)t.keys[s+e]=i.keys[e],t.values[s+e]=i.values[e];if(!t.leaf)for(let e=0;e<=i.n;e++)t.children[s+e]=i.children[e];t.n+=i.n+1;for(let t=e;t<this.n-1;t++)this.keys[t]=this.keys[t+1],this.values[t]=this.values[t+1];for(let t=e+1;t<this.n;t++)this.children[t]=this.children[t+1];this.keys[this.n-1]=void 0,this.values[this.n-1]=void 0,this.children[this.n]=void 0,this.n--}_borrowFromPrev(e){var t=this.children[e],i=this.children[e-1];for(let e=t.n-1;0<=e;e--)t.keys[e+1]=t.keys[e],t.values[e+1]=t.values[e];if(!t.leaf)for(let e=t.n;0<=e;e--)t.children[e+1]=t.children[e];t.keys[0]=this.keys[e-1],t.values[0]=this.values[e-1],t.leaf||(t.children[0]=i.children[i.n],i.children[i.n]=void 0),this.keys[e-1]=i.keys[i.n-1],this.values[e-1]=i.values[i.n-1],i.keys[i.n-1]=void 0,i.values[i.n-1]=void 0,t.n++,i.n--}_borrowFromNext(e){var t=this.children[e],i=this.children[e+1];t.keys[t.n]=this.keys[e],t.values[t.n]=this.values[e],t.leaf||(t.children[t.n+1]=i.children[0]),this.keys[e]=i.keys[0],this.values[e]=i.values[0];for(let e=0;e<i.n-1;e++)i.keys[e]=i.keys[e+1],i.values[e]=i.values[e+1];if(!i.leaf){for(let e=0;e<i.n;e++)i.children[e]=i.children[e+1];i.children[i.n]=void 0}i.keys[i.n-1]=void 0,i.values[i.n-1]=void 0,t.n++,i.n--}_fill(e){var t=this.order;0<e&&this.children[e-1]&&this.children[e-1].n>=t?this._borrowFromPrev(e):e<this.n&&this.children[e+1]&&this.children[e+1].n>=t?this._borrowFromNext(e):e<this.n?this._merge(e):this._merge(e-1)}_removeFromLeaf(e){for(let t=e;t<this.n-1;t++)this.keys[t]=this.keys[t+1],this.values[t]=this.values[t+1];this.keys[this.n-1]=void 0,this.values[this.n-1]=void 0,this.n--}_removeFromInternal(e){var t,i=this.order,s=this.keys[e];this.children[e]&&this.children[e].n>=i?(t=this._getPredecessor(e),this.keys[e]=t.key,this.values[e]=t.value,this.children[e]._remove(t.key,null,!0)):this.children[e+1]&&this.children[e+1].n>=i?(t=this._getSuccessor(e),this.keys[e]=t.key,this.values[e]=t.value,this.children[e+1]._remove(t.key,null,!0)):(this._merge(e),this.children[e]._remove(s,null,!0))}_remove(e,t,i){let s=0;for(;s<this.n&&0<Je(e,this.keys[s]);)s++;var r;if(s<this.n&&0===Je(e,this.keys[s])){let e=i;return!e&&this.values[s]&&(this.values[s].delete(t),e=0===this.values[s].size),!!e&&(this.leaf?this._removeFromLeaf(s):this._removeFromInternal(s),!0)}return!this.leaf&&(r=s===this.n,this.children[s]&&this.children[s].n<this.order&&this._fill(s),r&&s>this.n?!!this.children[s-1]&&this.children[s-1]._remove(e,t,i):!!this.children[s]&&this.children[s]._remove(e,t,i))}remove(e,t){return this._remove(e,t,!1)}removeKey(e){return this._remove(e,null,!0)}verify(){var e,t=[];for(let e=0;e<this.n;e++)null==this.keys[e]&&t.push(`Invalid key (${this.keys[e]}) at index `+e);for(let e=1;e<this.n;e++)Je(this.keys[e],this.keys[e-1])<=0&&t.push("Key order violation at index "+e);if(!this.leaf)for(let i=0;i<=this.n;i++)this.children[i]&&(e=this.children[i].verify(),t.push(...e));return t}}class et{constructor(e=4){this._root=null,this._order=e,this._size=0}insert(e,t){if(!(null==e||"number"==typeof e&&isNaN(e))){if(this._root){var i=this._root.search(e);if(i&&i.has(t))return}if(this._root)if(this._root.n===2*this._order-1){(i=new Ze(this._order,!1)).children[0]=this._root,i.splitChild(0,this._root);let r=0;var s=Je(i.keys[0],e);0===s?(i.values[0]||(i.values[0]=new Set),i.values[0].add(t)):(s<0&&r++,i.children[r].insertNonFull(e,t)),this._root=i}else this._root.insertNonFull(e,t);else this._root=new Ze(this._order,!0),this._root.keys[0]=e,this._root.values[0]=new Set([t]),this._root.n=1;this._size++}}find(e){return this._root&&(e=this._root.search(e))?Array.from(e):[]}contains(e){return!!this._root&&null!==this._root.search(e)}range(e,t,i=!1,s=!1){return this._root?(this._root.rangeSearch(e,t,e=[],i,s),e):[]}rangeFrom(e,t=!1){return this._root?(this._root.rangeSearch(e,null,e=[],t,!1),e):[]}rangeTo(e,t=!1){return this._root?(this._root.rangeSearch(null,e,e=[],!1,t),e):[]}remove(e,t){var i;this._root&&(i=this._root.search(e))&&i.has(t)&&(this._root.remove(e,t),0===this._root.n&&!this._root.leaf&&this._root.children[0]&&(this._root=this._root.children[0]),this._size--)}verify(){var e;return this._root?(0<(e=this._root.verify()).length&&console.warn("BTree index issues detected (rebuild required):",e),{healthy:0===e.length,issues:e,requiresRebuild:0<e.length}):{healthy:!0,issues:[]}}clear(){this._root=null,this._size=0}get size(){return this._size}toSortedEntries(){var e;return this._root?(this._collectInOrder(this._root,e=[]),e):[]}_collectInOrder(e,t){for(let i=0;i<e.n;i++)!e.leaf&&e.children[i]&&this._collectInOrder(e.children[i],t),e.values[i]&&0<e.values[i].size&&t.push([e.keys[i],Array.from(e.values[i])]);!e.leaf&&e.children[e.n]&&this._collectInOrder(e.children[e.n],t)}static fromSortedEntries(e,t=4){var i=new et(t);if(0!==e.length){var s=2*t-1;let u=0;for(let t=0;t<e.length;t++)null!=e[t][0]&&(u+=e[t][1].length);var r=[];for(let t=0;t<e.length;t++)null!=e[t][0]&&r.push(e[t]);if(0!==r.length){var a=[];let e=0;for(;e<r.length;){var n=new Ze(t,!0),o=r.length-e;let i;i=o<=s?o:o<s+t?Math.ceil(o/2):s;for(let t=0;t<i;t++){var[h,l]=r[e++];n.keys[t]=h,n.values[t]=new Set(l),n.n++}a.push(n)}let f=a;for(;1<f.length;){var c=[];let e=0;for(;e<f.length;){var d=new Ze(t,!1);for(d.children[0]=f[e++];d.n<s&&e<f.length;){var _=f[e];d.keys[d.n]=_.keys[0],d.values[d.n]=_.values[0];for(let e=0;e<_.n-1;e++)_.keys[e]=_.keys[e+1],_.values[e]=_.values[e+1];if(!_.leaf){for(let e=0;e<_.n;e++)_.children[e]=_.children[e+1];_.children[_.n]=void 0}_.keys[_.n-1]=void 0,_.values[_.n-1]=void 0,_.n--,d.children[d.n+1]=_,d.n++,e++}c.push(d)}f=c}i._root=f[0],i._size=u}}return i}}class tt{constructor(){this._invertedIndex=new Map,this._docTokens=new Map,this._segmenter="undefined"!=typeof Intl&&Intl.Segmenter?new Intl.Segmenter(void 0,{granularity:"word"}):null}addDocument(e,t){if("string"==typeof e){var i;e=this._tokenize(e);for(i of(this._docTokens.set(t,new Set(e)),e))this._invertedIndex.has(i)||this._invertedIndex.set(i,new Set),this._invertedIndex.get(i).add(t)}}removeDocument(e){var t=this._docTokens.get(e);if(t){for(var i of t){var s=this._invertedIndex.get(i);s&&(s.delete(e),0===s.size)&&this._invertedIndex.delete(i)}this._docTokens.delete(e)}}updateDocument(e,t){this.removeDocument(e),this.addDocument(t,e)}search(e){var t;if(0===(e=this._tokenize(e)).length)return[];let i=null;for(t of e){var s=this._invertedIndex.get(t);if(!s||0===s.size)return[];if(null===i)i=new Set(s);else{if(i.size<=s.size){var r,a=new Set;for(r of i)s.has(r)&&a.add(r);i=a}else{var n,o=new Set;for(n of s)i.has(n)&&o.add(n);i=o}if(0===i.size)return[]}}return i?Array.from(i):[]}_tokenize(e){if(this._segmenter){var t,i=[];for(t of this._segmenter.segment(e.toLowerCase()))t.isWordLike&&i.push(t.segment);return i.filter(e=>1<e.length)}return e.toLowerCase().replace(/[^\w\s]/g," ").split(/\s+/).filter(e=>1<e.length)}get size(){return this._docTokens.size}toSerializable(){var e,t,i=[];for([e,t]of this._invertedIndex)i.push([e,Array.from(t)]);return{invertedIndex:i}}static fromSerialized(e){var t=new tt;if(e&&Array.isArray(e.invertedIndex))for(var[i,s]of e.invertedIndex){var r,a=new Set(s);for(r of(t._invertedIndex.set(i,a),s))t._docTokens.has(r)||t._docTokens.set(r,new Set),t._docTokens.get(r).add(i)}return t}verify(){var e,t,i=[];for([e,t]of this._invertedIndex)for(var s of t)this._docTokens.has(s)||i.push(`Token '${e}' references unknown docId '${s}'`);return{healthy:0===i.length,issues:i,requiresRebuild:0<i.length}}}class it{constructor(){this._tree=new Ye({x:0,y:0,w:180,h:90}),this._size=0,this._pointLookup=new Map}addPoint(e,t){e&&"number"==typeof e.lat&&"number"==typeof e.lng&&(this._tree.insert({x:e.lng,y:e.lat,data:t}),this._pointLookup.set(t,{x:e.lng,y:e.lat}),this._size++)}removePoint(e){var t=this._pointLookup.get(e);t?(this._tree.removeAt(t.x,t.y,e),this._pointLookup.delete(e)):this._tree.remove(e),0<this._size&&this._size--}updatePoint(e,t){this.removePoint(e),this.addPoint(t,e)}findNear(e,t){var i,s=t/111,r={x:e.lng,y:e.lat,w:s,h:s},a=[],n=s*s;for(i of this._tree.query(r)){var o=i.x-e.lng,h=i.y-e.lat;n<o*o+h*h||(o=this._haversine(e,{lat:i.y,lng:i.x}))<=t&&a.push({docId:i.data,distance:o})}return a.sort((e,t)=>e.distance-t.distance).map(e=>e.docId)}findWithin(e){var t=(e.maxLng-e.minLng)/2,i=(e.maxLat-e.minLat)/2;return this._tree.query({x:e.minLng+t,y:e.minLat+i,w:t,h:i}).map(e=>e.data)}_haversine(e,t){var i=this._toRad(t.lat-e.lat),s=this._toRad(t.lng-e.lng);i=Math.sin(i/2)*Math.sin(i/2)+Math.cos(this._toRad(e.lat))*Math.cos(this._toRad(t.lat))*Math.sin(s/2)*Math.sin(s/2);return 2*Math.atan2(Math.sqrt(i),Math.sqrt(1-i))*6371}_toRad(e){return e*(Math.PI/180)}get size(){return this._size}toSerializable(){var e=[],t=(this._collectAllPoints(this._tree,e),new Float64Array(2*e.length)),i=new Array(e.length);for(let s=0;s<e.length;s++)t[2*s]=e[s].x,t[2*s+1]=e[s].y,i[s]=e[s].data;return{coords:t,docIds:i}}_collectAllPoints(e,t){for(var i of e.points)t.push(i);e.divided&&(this._collectAllPoints(e.northeast,t),this._collectAllPoints(e.northwest,t),this._collectAllPoints(e.southeast,t),this._collectAllPoints(e.southwest,t))}static fromSerialized(e){var t=new it;if(e&&e.coords&&e.docIds){var{coords:i,docIds:s}=e;for(let e=0;e<s.length;e++)t.addPoint({lng:i[2*e],lat:i[2*e+1]},s[e])}return t}verify(){var e=[],t=(this._collectAllPoints(this._tree,e),[]);return e.length!==this._size&&t.push(`Size mismatch: _size=${this._size}, actual=`+e.length),{healthy:0===t.length,issues:t,requiresRebuild:0<t.length}}}class st{constructor(){this._map=new Map}insert(e,t){let i=this._map.get(e);i||(i=new Set,this._map.set(e,i)),i.add(t)}find(e){return(e=this._map.get(e))?Array.from(e):[]}remove(e,t){var i=this._map.get(e);i&&(i.delete(t),0===i.size)&&this._map.delete(e)}has(e){return this._map.has(e)}clear(){this._map.clear()}get size(){let e=0;for(var t of this._map.values())e+=t.size;return e}toSerializable(){var e,t,i=[];for([e,t]of this._map)i.push([e,Array.from(t)]);return i}static fromSerialized(e){var t=new st;if(Array.isArray(e))for(var[i,s]of e)t._map.set(i,new Set(s));return t}verify(){var e,t,i=[];for([e,t]of this._map)t instanceof Set||i.push(`Value '${e}' has non-Set bucket`);return{healthy:0===i.length,issues:i,requiresRebuild:0<i.length}}}class rt{constructor(e){this._collection=e,this._serializer=e.database._serializer,this._base64=e.database._base64,this._indexes=new Map,this._indexData=new Map,this._indexQueue=[],this._processing=!1,this._dirtyIndexes=new Set,this._persistTimer=null,this._persistDelay=2e3}get indexes(){return this._indexes}static get IDX_PREFIX(){return"__lacerta_idx_"}async createIndex(e,t={}){var i=t.name||e;if(this._indexes.has(i))throw new Error(`Index '${i}' already exists`);return e={fieldPath:e,unique:t.unique||!1,sparse:t.sparse||!1,type:t.type||"btree",hashed:t.hashed||!1,collation:t.collation||null,createdAt:Date.now()},this._indexes.set(i,e),await this.rebuildIndex(i),this._saveIndexMetadata(),i}async rebuildIndex(e){var t=this._indexes.get(e);if(!t)throw new Error(`Index '${e}' not found`);var i=this._createIndexStructure(t.type);this._indexData.set(e,i);let s=null;for(;;){var r,a,n=await this._collection._indexedDB.getBatch(this._collection._db,this._collection._storeName,s,200);if(0===n.length)break;for(r of n)if("string"==typeof r._id&&r._id.startsWith(rt.IDX_PREFIX))s=r._id;else{s=r._id;let e=r;r.packedData&&(await(a=new ct(r,{compressed:r._compressed,encrypted:r._encrypted},this._serializer)).unpack(this._collection.database.encryption),e=a.objectOutput());let n=this._getFieldValue(e,t.fieldPath);t.sparse&&null==n||t.unique&&i.has&&i.has(n)||(t.hashed&&"btree"===t.type&&(n=await this._hashVal(n)),this._addToIndex(i,n,e._id,t.type))}}await this._persistIndex(e)}async _restoreIndex(e){var t=this._indexes.get(e);if(!t)return!1;try{var i=""+rt.IDX_PREFIX+e,s=await this._collection._indexedDB.get(this._collection._db,this._collection._storeName,i);if(!s)return!1;if(s._type&&s._type!==t.type)return console.warn(`[IndexManager] Type mismatch for '${e}': stored=${s._type}, expected=`+t.type),!1;let r=null;switch(t.type){case"btree":if(s._entries&&Array.isArray(s._entries)){if((r=et.fromSortedEntries(s._entries,4)).verify().healthy)break;console.warn(`[IndexManager] Persisted btree '${e}' is corrupt, will rebuild`)}return!1;case"text":if(s._data&&s._data.invertedIndex){if((r=tt.fromSerialized(s._data)).verify().healthy)break;console.warn(`[IndexManager] Persisted text index '${e}' is corrupt, will rebuild`)}return!1;case"geo":if(s._data&&s._data.coords&&s._data.docIds){if((r=it.fromSerialized(s._data)).verify().healthy)break;console.warn(`[IndexManager] Persisted geo index '${e}' is corrupt, will rebuild`)}return!1;case"hash":if(s._entries&&Array.isArray(s._entries)){if((r=st.fromSerialized(s._entries)).verify().healthy)break;console.warn(`[IndexManager] Persisted hash index '${e}' is corrupt, will rebuild`)}return!1;default:return!1}return this._indexData.set(e,r),!0}catch(e){return!1}}async _persistIndex(e){var t=this._indexData.get(e),i=this._indexes.get(e);if(t&&i)try{var s={_id:""+rt.IDX_PREFIX+e,_type:i.type,_persisted_at:Date.now(),_size:t.size||0};switch(i.type){case"btree":if(!(t instanceof et))return;s._entries=t.toSortedEntries();break;case"text":if(!(t instanceof tt))return;s._data=t.toSerializable();break;case"geo":if(!(t instanceof it))return;s._data=t.toSerializable();break;case"hash":if(!(t instanceof st))return;s._entries=t.toSerializable();break;default:return}await this._collection._indexedDB.put(this._collection._db,this._collection._storeName,s)}catch(t){console.warn(`[IndexManager] Failed to persist index '${e}':`,t.message)}}_schedulePersist(e){this._dirtyIndexes.add(e),this._persistTimer||(this._persistTimer=setTimeout(async()=>{this._persistTimer=null;var e,t=Array.from(this._dirtyIndexes);for(e of(this._dirtyIndexes.clear(),t))await this._persistIndex(e)},this._persistDelay))}async flushPersistence(){this._persistTimer&&(clearTimeout(this._persistTimer),this._persistTimer=null);var e,t=Array.from(this._dirtyIndexes);for(e of(this._dirtyIndexes.clear(),t))await this._persistIndex(e)}_createIndexStructure(e){switch(e){case"btree":return new et;case"hash":return new st;case"text":return new tt;case"geo":return new it;default:return new st}}_addToIndex(e,t,i,s){switch(s){case"btree":case"hash":e.insert(t,i);break;case"text":e.addDocument(t,i);break;case"geo":e.addPoint(t,i)}}async _hashVal(e){return e=(new TextEncoder).encode(String(e)),e=await crypto.subtle.digest("SHA-256",e),this._base64.encode(new Uint8Array(e))}async updateIndexForDocument(e,t,i){for(var[s,r]of this._indexes){var a=this._indexData.get(s);if(a){let n=t?this._getFieldValue(t,r.fieldPath):void 0,o=i?this._getFieldValue(i,r.fieldPath):void 0;if(r.hashed&&(n=n&&await this._hashVal(n),o=o&&await this._hashVal(o)),n!==o){switch(r.type){case"btree":case"hash":void 0!==n&&a.remove(n,e),void 0!==o&&a.insert(o,e);break;case"text":(n||o)&&a.updateDocument(e,o||"");break;case"geo":n&&a.removePoint(e),o&&a.addPoint(o,e)}this._schedulePersist(s)}}}}async query(e,t){var i=this._indexes.get(e),s=this._indexData.get(e);if(i&&s)return i.hashed&&"object"!=typeof t&&(t=await this._hashVal(t)),this._queryIndex(s,t,i.type);throw new Error(`Index '${e}' not found`)}_queryIndex(e,t,i){switch(i){case"btree":return this._queryBTree(e,t);case"hash":return this._queryHash(e,t);case"text":return this._queryText(e,t);case"geo":return this._queryGeo(e,t);default:return[]}}_queryBTree(e,t){if("object"!=typeof t||null===t)return e.find(t);let i=new Set;void 0!==t.$eq&&e.find(t.$eq).forEach(e=>i.add(e));var s,r=void 0!==t.$gte,a=void 0!==t.$gt,n=void 0!==t.$lte,o=void 0!==t.$lt;return(r||a||n||o)&&(s=r?t.$gte:a?t.$gt:null,t=n?t.$lte:o?t.$lt:null,e.range(s,t,!r&&a,!n&&o).forEach(e=>i.add(e))),Array.from(i)}_queryHash(e,t){if(void 0!==t.$eq)return e.find(t.$eq);if(void 0===t.$in)return[];var i,s=new Set;for(i of t.$in){var r=e.find(i);for(let e=0;e<r.length;e++)s.add(r[e])}return Array.from(s)}_queryText(e,t){return t.$search?e.search(t.$search):[]}_queryGeo(e,t){return t.$near?e.findNear(t.$near.coordinates,t.$near.maxDistance||1e3):t.$within?e.findWithin(t.$within):[]}dropIndex(e){this._indexes.delete(e),this._indexData.delete(e),this._dirtyIndexes.delete(e),this._saveIndexMetadata(),e=""+rt.IDX_PREFIX+e,this._collection._indexedDB.delete(this._collection._db,this._collection._storeName,e).catch(()=>{})}_getFieldValue(e,t){return ft.getFieldValue(e,t)}async _saveIndexMetadata(){var e=`idxmeta_${this._collection.database.name}_`+this._collection.name,t={indexes:Array.from(this._indexes.entries()).map(([e,t])=>({name:e,...t}))},i=(t=this._serializer.serialize(t),t=this._base64.encode(t),this._collection._db);i&&i.objectStoreNames.contains("__meta")?gt._writeMeta(i,e,{data:t}).catch(e=>{console.warn("IndexManager metadata IDB save failed:",e)}):(i=`lacertadb_${this._collection.database.name}_${this._collection.name}_indexes`,localStorage.setItem(i,t))}async loadIndexMetadata(){var e=`idxmeta_${this._collection.database.name}_`+this._collection.name;let t=null;var i=this._collection._db;if(i&&i.objectStoreNames.contains("__meta"))try{var s=await gt._readMeta(i,e);s&&s.data&&(t=s.data)}catch(e){}if(!t&&(i=`lacertadb_${this._collection.database.name}_${this._collection.name}_indexes`,e=localStorage.getItem(i))&&(t=e,localStorage.removeItem(i)),t)try{var r=this._base64.decode(t),a=this._serializer.deserialize(r);if(a&&Array.isArray(a.indexes)){for(var n of a.indexes){let{name:e,...t}=n;this._indexes.set(e,t)}var o,h,l=[];for([o,h]of this._indexes)await this._restoreIndex(o)||l.push(o);if(0<l.length)for(var c of l)await this.rebuildIndex(c)}}catch(e){console.error("Failed to load index metadata:",e)}}getIndexStats(){var e,t,i={};for([e,t]of this._indexes){var s=this._indexData.get(e);i[e]={...t,size:s&&(s.size||s.length)||0,memoryUsage:this._estimateMemoryUsage(s)}}return i}_estimateMemoryUsage(e){if(!e)return 0;if(e instanceof et)return 120*e.size;if(e instanceof tt){let s=0;for(var[t,i]of e._invertedIndex)s+=2*t.length+64*i.size;return s}return e instanceof it?80*e.size:e instanceof st?100*e.size:0}async verifyIndexes(){var e,t,i={};for([e,t]of this._indexes){var s=this._indexData.get(e);s?s.verify?((s=s.verify()).requiresRebuild&&(await this.rebuildIndex(e),s.rebuilt=!0),i[e]=s):i[e]={status:"ok"}:(i[e]={status:"missing",rebuilt:!0},await this.rebuildIndex(e))}return i}destroy(){for(var[e,t]of(this._persistTimer&&(clearTimeout(this._persistTimer),this._persistTimer=null),this._indexData))t&&t.clear&&t.clear();this._indexData.clear(),this._indexes.clear(),this._dirtyIndexes.clear(),this._indexQueue=[],this._processing=!1}}class at{async saveAttachments(e,t,i,s){try{var r,a,n=[],o=await(await(await(await navigator.storage.getDirectory()).getDirectoryHandle(e,{create:!0})).getDirectoryHandle(t,{create:!0})).getDirectoryHandle(i,{create:!0});for([r,a]of s.entries()){var h=r+"_"+(a.name||"file"),l=await(await o.getFileHandle(h,{create:!0})).createWritable();let s;if(a.data instanceof Uint8Array)s=a.data;else if(a.data instanceof ArrayBuffer)s=new Uint8Array(a.data);else{if(!(a.data instanceof Blob))throw new TypeError("Unsupported attachment data type");s=new Uint8Array(await a.data.arrayBuffer())}var c=new Blob([s],{type:a.type||"application/octet-stream"}),d=(await l.write(c),await l.close(),`/${e}/${t}/${i}/`+h);n.push({path:d,name:a.name,type:a.type,size:s.byteLength,originalName:a.originalName||a.name})}return n}catch(s){throw new $e("Failed to save attachments","ATTACHMENT_SAVE_FAILED",s)}}async getAttachments(e){var t,i=[],s=await navigator.storage.getDirectory();for(t of e)try{var r=t.path.split("/").filter(e=>e);let e=s;for(let t=0;t<r.length-1;t++)e=await e.getDirectoryHandle(r[t]);var a=await(await(await e.getFileHandle(r[r.length-1])).getFile()).arrayBuffer();i.push({name:t.originalName||t.name,type:t.type,data:new Uint8Array(a),size:t.size})}catch(e){console.error("Failed to get attachment: "+t.path,e)}return i}async deleteAttachments(e,t,i){try{await(await(await(await navigator.storage.getDirectory()).getDirectoryHandle(e)).getDirectoryHandle(t)).removeEntry(i,{recursive:!0})}catch(e){"NotFoundError"!==e.name&&console.error(`Failed to delete attachments for ${i}:`,e)}}static async prepareAttachment(e,t){let i;if(e instanceof File||e instanceof Blob){var s=await e.arrayBuffer();i=new Uint8Array(s)}else if(e instanceof ArrayBuffer)i=new Uint8Array(e);else{if(!(e instanceof Uint8Array))throw new TypeError("Unsupported file type for attachment");i=e}return{name:t||e.name||"unnamed",type:e.type||"application/octet-stream",data:i,originalName:e.name||t}}}class nt{constructor(){this._mutex=new Ke}async performTransaction(e,t,i,s,r=3){return"readonly"===i?this._runTx(e,t,i,s,r):this._mutex.runExclusive(()=>this._runTx(e,t,i,s,r))}async _runTx(e,t,i,s,r){let a;for(let n=0;n<r;n++)try{return await new Promise((r,a)=>{let n,o=e.transaction(t,i);o.oncomplete=()=>r(n),o.onerror=()=>a(o.error),o.onabort=()=>a(new Error("Transaction aborted"));try{var h=s(o);h instanceof Promise?h.then(e=>{n=e}).catch(a):n=h}catch(r){a(r)}})}catch(e){a=e,n<r-1&&await new Promise(e=>setTimeout(e,2**n*100))}throw new $e("Transaction failed after retries","TRANSACTION_FAILED",a)}_promisifyRequest(e){return new Promise((t,i)=>{let s=e();s.onsuccess=()=>t(s.result),s.onerror=()=>i(s.error),s.onabort=()=>i(new DOMException("Request aborted","AbortError"))})}async getBatch(e,t,i,s){return this.performTransaction(e,[t],"readonly",e=>{let r,a=e.objectStore(t);return null!=i&&(r=IDBKeyRange.lowerBound(i,!0)),this._promisifyRequest(()=>a.getAll(r,s))})}add(e,t,i,s){return this.performTransaction(e,[t],"readwrite",e=>{let r=e.objectStore(t);return this._promisifyRequest(()=>void 0!==s?r.add(i,s):r.add(i))})}put(e,t,i,s){return this.performTransaction(e,[t],"readwrite",e=>{let r=e.objectStore(t);return this._promisifyRequest(()=>void 0!==s?r.put(i,s):r.put(i))})}get(e,t,i){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).get(i)))}getAll(e,t,i,s){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).getAll(i,s)))}delete(e,t,i){return this.performTransaction(e,[t],"readwrite",e=>this._promisifyRequest(()=>e.objectStore(t).delete(i)))}clear(e,t){return this.performTransaction(e,[t],"readwrite",e=>this._promisifyRequest(()=>e.objectStore(t).clear()))}count(e,t,i){return this.performTransaction(e,[t],"readonly",e=>this._promisifyRequest(()=>e.objectStore(t).count(i)))}async batchOperation(e,t,i="documents"){return new Promise((s,r)=>{let a=new Array(t.length),n=e.transaction([i],"readwrite");var o=n.objectStore(i);n.oncomplete=()=>s(a),n.onerror=()=>{for(let t=0;t<a.length;t++){var e;a[t]||(a[t]={success:!1,error:(null==(e=n.error)?void 0:e.message)||"Transaction failed"})}r(new $e("Batch transaction failed","TRANSACTION_FAILED",n.error))},n.onabort=()=>{for(let e=0;e<a.length;e++)a[e]||(a[e]={success:!1,error:"Transaction aborted"});r(new $e("Batch transaction aborted","TRANSACTION_ABORTED"))};for(let e=0;e<t.length;e++){var h=t[e];let i;try{switch(h.type){case"add":i=o.add(h.data);break;case"put":i=o.put(h.data);break;case"delete":i=o.delete(h.key);break;default:a[e]={success:!1,error:"Unknown operation type: "+h.type};continue}let t=e;i.onsuccess=()=>{a[t]={success:!0,result:i.result}},i.onerror=e=>{var s;a[t]={success:!1,error:(null==(s=i.error)?void 0:s.message)||"Request failed"},e.preventDefault(),e.stopPropagation()}}catch(s){a[e]={success:!1,error:s.message}}}})}}let ot="0123456789ABCDEFGHJKMNPQRSTVWXYZ",ht=0,lt=new Uint8Array(10);class ct{constructor(e={},t={},i){this._id=e._id||this._generateId(),this._created=e._created||Date.now(),this._modified=e._modified||Date.now(),this._permanent=e._permanent||t.permanent||!1,this._encrypted=!1,this._compressed=e._compressed||t.compressed||!1,this._attachments=e._attachments||[],this._data=null,this._packedData=e.packedData||null,this._compression=We,this._serializer=i,e.data&&(this.data=e.data)}get data(){return this._data||{}}set data(e){this._data=e}_generateId(){{let s="",r=t=Date.now();for(let e=9;0<=e;e--)s=ot[31&r]+s,r=Math.floor(r/32);if(t===ht){let t=1;for(let i=9;0<=i&&t;i--){var e=lt[i]+t;lt[i]=255&e,t=e>>>8}}else crypto.getRandomValues(lt),ht=t;var t="",i=lt;return s+(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t=(t+=ot[(248&i[0])>>>3])+ot[(7&i[0])<<2|(192&i[1])>>>6])+ot[(62&i[1])>>>1])+ot[(1&i[1])<<4|(240&i[2])>>>4])+ot[(15&i[2])<<1|(128&i[3])>>>7])+ot[(124&i[3])>>>2])+ot[(3&i[3])<<3|(224&i[4])>>>5])+ot[31&i[4]])+ot[(248&i[5])>>>3])+ot[(7&i[5])<<2|(192&i[6])>>>6])+ot[(62&i[6])>>>1])+ot[(1&i[6])<<4|(240&i[7])>>>4])+ot[(15&i[7])<<1|(128&i[8])>>>7])+ot[(124&i[8])>>>2])+ot[(3&i[8])<<3|(224&i[9])>>>5])+ot[31&i[9]])}}async pack(e=null){try{let t=this._serializer.serialize(this.data);return this._compressed&&(t=await this._compression.compress(t)),e&&(t=await e.encrypt(t),this._encrypted=!0),this._packedData=t}catch(e){throw new $e("Failed to pack document","PACK_FAILED",e)}}async unpack(e=null){try{let t=this._packedData;if(this._encrypted&&e&&(t=await e.decrypt(t)),!(t=this._compressed?await this._compression.decompress(t):t)||0===t.length)throw new Error("Empty unpacked data");if(this.data=this._serializer.deserialize(t),"object"!=typeof this.data||null===this.data)throw new Error("Invalid deserialized data");return this.data}catch(e){return console.error("Document unpack failed:",e),this.data={},this.data}}packSync(){let e=this._serializer.serialize(this.data);return this._compressed&&(e=this._compression.compressSync(e)),this._packedData=e}unpackSync(){if(this._encrypted)throw new $e("Synchronous decryption not supported","SYNC_DECRYPT_NOT_SUPPORTED");let e=this._packedData;return this._compressed&&(e=this._compression.decompressSync(e)),this.data=this._serializer.deserialize(e),this.data}objectOutput(e=!1){var t={_id:this._id,_created:this._created,_modified:this._modified,_permanent:this._permanent,...this.data};return e&&0<this._attachments.length&&(t._attachments=this._attachments),t}databaseOutput(){return{_id:this._id,_created:this._created,_modified:this._modified,_permanent:this._permanent,_encrypted:this._encrypted,_compressed:this._compressed,_attachments:this._attachments,packedData:this._packedData}}}class dt{constructor(e,t={},i,s,r,a=null){if(this.name=e,this._serializer=i,this._base64=s,this._dbName=r,this._idb=a,this._metaKey=r?`collmeta_${r}_`+e:null,this.sizeKB=t.sizeKB||0,this.length=t.length||0,this.createdAt=t.createdAt||Date.now(),this.modifiedAt=t.modifiedAt||Date.now(),this._docMeta=new Map,t._docMeta)for(var[n,o]of t._docMeta)this._docMeta.set(n,o);else if(t._docSizes){i=new Map(t._docSizes);var h,l,c=new Map(t._docModified||[]),d=new Map(t._docPermanent||[]),_=new Map(t._docAttachments||[]);for([h,l]of i)this._docMeta.set(h,{size:l,modified:c.get(h)||Date.now(),permanent:d.get(h)||!1,attachments:_.get(h)||0})}this._dirty=!1,this._saveTimer=null}setIDB(e){this._idb=e}addDocument(e,t,i=!1,s=0){this._docMeta.set(e,{size:t,modified:Date.now(),permanent:i,attachments:s}),this.sizeKB+=t,this.length++,this.modifiedAt=Date.now(),this._scheduleSave()}updateDocument(e,t,i=!1,s=0){var r=(r=this._docMeta.get(e))?r.size:0;this.sizeKB=this.sizeKB-r+t,this._docMeta.set(e,{size:t,modified:Date.now(),permanent:i,attachments:s}),this.modifiedAt=Date.now(),this._scheduleSave()}removeDocument(e){var t=(t=this._docMeta.get(e))?t.size:0;this.sizeKB-=t,this.length--,this._docMeta.delete(e),this.modifiedAt=Date.now(),this._scheduleSave()}getOldestNonPermanentDocuments(e){var t,i,s=[];for([t,i]of this._docMeta)i.permanent||s.push({id:t,modified:i.modified});return s.sort((e,t)=>e.modified-t.modified),s.slice(0,e).map(e=>e.id)}getDocumentSize(e){return(e=this._docMeta.get(e))?e.size:0}isDocumentPermanent(e){return!!(e=this._docMeta.get(e))&&e.permanent}hasDocument(e){return this._docMeta.has(e)}getAggregateSnapshot(){return{sizeKB:this.sizeKB,length:this.length,createdAt:this.createdAt,modifiedAt:this.modifiedAt}}_scheduleSave(){var e;this._dirty=!0,this._saveTimer||(e=()=>{this._saveTimer=null,this._dirty&&this._persistToStorage()},"undefined"!=typeof window&&window.requestIdleCallback?this._saveTimer=window.requestIdleCallback(e):this._saveTimer=setTimeout(e,300))}_flushSync(){this._dirty&&this._persistToStorage()}_persistToStorage(){if(this._metaKey&&this._serializer&&this._base64){var e={sizeKB:this.sizeKB,length:this.length,createdAt:this.createdAt,modifiedAt:this.modifiedAt,_docMeta:Array.from(this._docMeta.entries())};try{var t,i=this._serializer.serialize(e),s=this._base64.encode(i);this._idb&&this._idb.objectStoreNames.contains("__meta")?gt._writeMeta(this._idb,this._metaKey,{data:s}).catch(e=>{console.warn("CollectionMetadata IDB save failed:",e)}):(t=`lacertadb_${this._dbName}_${this.name}_collmeta`,localStorage.setItem(t,s)),this._dirty=!1}catch(e){if("QuotaExceededError"===e.name){console.warn("CollectionMetadata: quota exceeded, saving aggregates only");try{var r={sizeKB:this.sizeKB,length:this.length,createdAt:this.createdAt,modifiedAt:this.modifiedAt},a=this._serializer.serialize(r),n=this._base64.encode(a);this._idb&&this._idb.objectStoreNames.contains("__meta")&&gt._writeMeta(this._idb,this._metaKey,{data:n}).catch(()=>{}),this._dirty=!1}catch(e){console.error("CollectionMetadata: fallback save also failed:",e)}}else console.error("CollectionMetadata save failed:",e)}}}static async loadAsync(e,t,i,s,r){var a=`collmeta_${e}_`+t;if(r&&r.objectStoreNames.contains("__meta"))try{var n,o,h=await gt._readMeta(r,a);if(h&&h.data)return n=s.decode(h.data),o=i.deserialize(n),new dt(t,o,i,s,e,r)}catch(e){console.warn("CollectionMetadata IDB load failed, trying localStorage:",e)}if(a=`lacertadb_${e}_${t}_collmeta`,h=localStorage.getItem(a))try{var l=s.decode(h),c=i.deserialize(l),d=new dt(t,c,i,s,e,r);return d._dirty=!0,d._persistToStorage(),localStorage.removeItem(a),d}catch(e){console.warn("CollectionMetadata localStorage corrupted, resetting:",e)}return new dt(t,{},i,s,e,r)}static load(e,t,i,s){var r=localStorage.getItem(`lacertadb_${e}_${t}_collmeta`);if(r)try{var a=s.decode(r),n=i.deserialize(a);return new dt(t,n,i,s,e)}catch(e){console.warn("CollectionMetadata corrupted, resetting:",e)}return new dt(t,{},i,s,e)}destroy(){this._flushSync(),this._saveTimer&&("undefined"!=typeof window&&window.cancelIdleCallback?window.cancelIdleCallback(this._saveTimer):clearTimeout(this._saveTimer),this._saveTimer=null)}clear(){this.sizeKB=0,this.length=0,this.modifiedAt=Date.now(),this._docMeta.clear(),this._dirty=!0,this._flushSync()}}class _t{constructor(e,t={},i,s,r=null){this.name=e,this._serializer=i,this._base64=s,this._idb=r,this._metaKey="dbmeta_"+e,this.collections=(t=t&&"object"==typeof t?t:{}).collections||{},this.totalSizeKB=t.totalSizeKB||0,this.totalLength=t.totalLength||0,this.modifiedAt=t.modifiedAt||Date.now(),this._dirty=!1,this._saveTimer=null}setIDB(e){this._idb=e}static async loadAsync(e,t,i,s){var r="dbmeta_"+e;if(s&&s.objectStoreNames.contains("__meta"))try{var a=await gt._readMeta(s,r);if(a&&a.data){var n=i.decode(a.data),o=t.deserialize(n);if(o&&"object"==typeof o)return new _t(e,o,t,i,s)}}catch(e){console.warn("DatabaseMetadata IDB load failed, trying localStorage:",e)}if(r=`lacertadb_${e}_metadata`,a=localStorage.getItem(r))try{var h,l=i.decode(a),c=t.deserialize(l);if(c&&"object"==typeof c)return(h=new _t(e,c,t,i,s))._dirty=!0,h._persistToStorage(),localStorage.removeItem(r),h}catch(e){console.error("Failed to load metadata from localStorage:",e)}return new _t(e,{},t,i,s)}static load(e,t,i){var s=localStorage.getItem(`lacertadb_${e}_metadata`);if(s)try{var r=i.decode(s),a=t.deserialize(r);if(a&&"object"==typeof a)return new _t(e,a,t,i)}catch(e){console.error("Failed to load metadata:",e)}return new _t(e,{},t,i)}setCollection(e){this.collections[e.name]=e.getAggregateSnapshot(),this._recalculate(),this._scheduleSave()}removeCollection(e){delete this.collections[e],this._recalculate(),this._scheduleSave()}_recalculate(){for(var e in this.totalSizeKB=0,this.totalLength=0,this.collections)e=this.collections[e],this.totalSizeKB+=e.sizeKB,this.totalLength+=e.length;this.modifiedAt=Date.now()}_scheduleSave(){var e;this._dirty=!0,this._saveTimer||(e=()=>{this._saveTimer=null,this._dirty&&this._persistToStorage()},"undefined"!=typeof window&&window.requestIdleCallback?this._saveTimer=window.requestIdleCallback(e):this._saveTimer=setTimeout(e,300))}_flushSync(){this._dirty&&this._persistToStorage()}_persistToStorage(){try{var e,t={collections:this.collections,totalSizeKB:this.totalSizeKB,totalLength:this.totalLength,modifiedAt:this.modifiedAt},i=this._serializer.serialize(t),s=this._base64.encode(i);this._idb&&this._idb.objectStoreNames.contains("__meta")?gt._writeMeta(this._idb,this._metaKey,{data:s}).catch(e=>{console.warn("DatabaseMetadata IDB save failed:",e)}):(e=`lacertadb_${this.name}_metadata`,localStorage.setItem(e,s)),this._dirty=!1}catch(e){"QuotaExceededError"===e.name?(console.error("CRITICAL: Metadata save failed — quota exceeded for db:",this.name),"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("lacertadb:quotaexceeded",{detail:{db:this.name}}))):console.error("Failed to save metadata:",e)}}save(){this._dirty=!0,this._flushSync()}destroy(){this._flushSync(),this._saveTimer&&("undefined"!=typeof window&&window.cancelIdleCallback?window.cancelIdleCallback(this._saveTimer):clearTimeout(this._saveTimer),this._saveTimer=null)}}class ut{constructor(e,t={},i,s,r=null){this.dbName=e,this._serializer=i,this._base64=s,this._idb=r,this._metaKey="settings_"+e,this.sizeLimitKB=null!=t.sizeLimitKB?t.sizeLimitKB:1/0,i=this.sizeLimitKB===1/0?1/0:.8*this.sizeLimitKB,this.bufferLimitKB=null!=t.bufferLimitKB?t.bufferLimitKB:i,this.freeSpaceEvery=this.sizeLimitKB===1/0?0:t.freeSpaceEvery||1e4}setIDB(e){this._idb=e}static async loadAsync(e,t,i,s){var r="settings_"+e;if(s&&s.objectStoreNames.contains("__meta"))try{var a,n,o=await gt._readMeta(s,r);if(o&&o.data)return a=i.decode(o.data),n=t.deserialize(a),new ut(e,n,t,i,s)}catch(e){console.warn("Settings IDB load failed, trying localStorage:",e)}if(r=`lacertadb_${e}_settings`,o=localStorage.getItem(r))try{var h=i.decode(o),l=t.deserialize(h),c=new ut(e,l,t,i,s);return c.save(),localStorage.removeItem(r),c}catch(e){console.error("Failed to load settings from localStorage:",e)}return new ut(e,{},t,i,s)}static load(e,t,i){var s=localStorage.getItem(`lacertadb_${e}_settings`);if(s)try{var r=i.decode(s),a=t.deserialize(r);return new ut(e,a,t,i)}catch(e){console.error("Failed to load settings:",e)}return new ut(e,{},t,i)}save(){try{var e,t={sizeLimitKB:this.sizeLimitKB,bufferLimitKB:this.bufferLimitKB,freeSpaceEvery:this.freeSpaceEvery},i=this._serializer.serialize(t),s=this._base64.encode(i);this._idb&&this._idb.objectStoreNames.contains("__meta")?gt._writeMeta(this._idb,this._metaKey,{data:s}).catch(e=>{console.warn("Settings IDB save failed:",e)}):(e=`lacertadb_${this.dbName}_settings`,localStorage.setItem(e,s))}catch(e){"QuotaExceededError"===e.name?(console.error("CRITICAL: Settings save failed — quota exceeded"),"undefined"!=typeof window&&window.dispatchEvent(new CustomEvent("lacertadb:quotaexceeded",{detail:{source:"settings",db:this.dbName}}))):console.error("Settings save failed:",e)}}updateSettings(e){Object.assign(this,e),void 0!==e.sizeLimitKB&&void 0===e.bufferLimitKB&&(this.bufferLimitKB=this.sizeLimitKB===1/0?1/0:.8*this.sizeLimitKB),this.sizeLimitKB===1/0&&(this.freeSpaceEvery=0),this.save()}}let ft=new class{constructor(){this._pathCache=new Map,this._setCache=new WeakMap,this.operators={$eq:(e,t)=>e===t,$ne:(e,t)=>e!==t,$gt:(e,t)=>t<e,$gte:(e,t)=>t<=e,$lt:(e,t)=>e<t,$lte:(e,t)=>e<=t,$in:(e,t)=>{if(!Array.isArray(t))return!1;let i=this._setCache.get(t);return i||(i=new Set(t),this._setCache.set(t,i)),i.has(e)},$nin:(e,t)=>{if(!Array.isArray(t))return!1;let i=this._setCache.get(t);return i||(i=new Set(t),this._setCache.set(t,i)),!i.has(e)},$and:(e,t)=>t.every(t=>this.evaluate(e,t)),$or:(e,t)=>t.some(t=>this.evaluate(e,t)),$not:(e,t)=>!this.evaluate(e,t),$nor:(e,t)=>!t.some(t=>this.evaluate(e,t)),$exists:(e,t)=>void 0!==e===t,$type:(e,t)=>typeof e===t,$all:(e,t)=>{if(!Array.isArray(e))return!1;let i=this._setCache.get(e);return i||(i=new Set(e),this._setCache.set(e,i)),t.every(e=>i.has(e))},$elemMatch:(e,t)=>Array.isArray(e)&&e.some(e=>this.evaluate({value:e},{value:t})),$size:(e,t)=>Array.isArray(e)&&e.length===t,$regex:(e,t)=>{if("string"!=typeof e)return!1;try{return new RegExp(t).test(e)}catch{return!1}},$text:(e,t)=>"string"==typeof e&&e.toLowerCase().includes(t.toLowerCase())}}evaluate(e,t){for(var i in t){var s=t[i];if(i.startsWith("$")){var r=this.operators[i];if(!r||!r(e,s))return!1}else{var a=this.getFieldValue(e,i);if("object"!=typeof s||null===s||Array.isArray(s)){if(a!==s)return!1}else for(var n in s)if(n.startsWith("$")){var o=this.operators[n];if(!o||!o(a,s[n]))return!1}}}return!0}_getParsedPath(e){let t=this._pathCache.get(e);if(void 0===t&&(t=-1===e.indexOf(".")?null:e.split("."),this._pathCache.set(e,t),2e3<this._pathCache.size)){var i=this._pathCache.keys();for(let e=0;e<500;e++)this._pathCache.delete(i.next().value)}return t}getFieldValue(e,t){var i=this._getParsedPath(t);if(null===i)return null==e?void 0:e[t];let s=e;for(let e=0;e<i.length;e++){if(null==s)return;s=s[i[e]]}return s}};let pt=new class{constructor(){this.stages={$match:(e,t)=>e.filter(e=>ft.evaluate(e,t)),$project:(e,t)=>e.map(e=>{var i,s={};for(i in t){var r=t[i];1===r||!0===r?s[i]=ft.getFieldValue(e,i):"string"==typeof r&&r.startsWith("$")&&(s[i]=ft.getFieldValue(e,r.substring(1)))}if(Object.values(t).some(e=>0===e||!1===e)){var a=Object.keys(t).filter(e=>0===t[e]||!1===t[e]);let i={...e};return a.forEach(e=>delete i[e]),i}return s}),$sort:(e,t)=>[...e].sort((e,i)=>{for(var s in t){var r=t[s],a=ft.getFieldValue(e,s);if(a<(s=ft.getFieldValue(i,s)))return-r;if(s<a)return r}return 0}),$limit:(e,t)=>e.slice(0,t),$skip:(e,t)=>e.slice(t),$group:(e,t)=>{var i,s=new Map,r=t._id;let a=e=>{var t;return null==e?"\0null":"string"==(t=typeof e)?""+e:"number"==t||"boolean"==t?""+e:Array.isArray(e)?"["+e.join(",")+"]":"{"+Object.keys(e).sort().map(t=>t+":"+a(e[t])).join(",")+"}"},n=(e,t)=>{if("string"==typeof t&&t.startsWith("$"))return ft.getFieldValue(e,t.substring(1));if(null===t||"object"!=typeof t||Array.isArray(t))return t;var i,s={};for(i in t)s[i]=n(e,t[i]);return s};for(i of e){let e;e="string"==typeof r?r.startsWith("$")?ft.getFieldValue(i,r.substring(1)):r:null!==r&&"object"==typeof r?a(n(i,r)):r,s.has(e)||s.set(e,{_id:e,docs:[]}),s.get(e).docs.push(i)}var o,h=[];for(o of s.values()){var l,c={_id:o._id};for(l in t)if("_id"!==l){var d=t[l],_=Object.keys(d)[0];let e=d[_].toString().replace("$","");switch(_){case"$sum":c[l]=o.docs.reduce((t,i)=>t+(ft.getFieldValue(i,e)||0),0);break;case"$avg":var u=o.docs.reduce((t,i)=>t+(ft.getFieldValue(i,e)||0),0);c[l]=u/o.docs.length;break;case"$count":c[l]=o.docs.length;break;case"$max":c[l]=o.docs.reduce((t,i)=>void 0!==(i=ft.getFieldValue(i,e))&&(void 0===t||t<i)?i:t,void 0);break;case"$min":c[l]=o.docs.reduce((t,i)=>void 0!==(i=ft.getFieldValue(i,e))&&(void 0===t||i<t)?i:t,void 0)}}h.push(c)}return h},$lookup:async(e,t,i)=>{var s,r,a,n,o=new Set;for(s of e){var h=ft.getFieldValue(s,t.localField);null!=h&&o.add(h)}let l=await i.getCollection(t.from),c=new Map;if(0<o.size){let e=!1;for([r,a]of l._indexManager.indexes)if(a.fieldPath===t.foreignField){var d,_,u=await l._indexManager.query(r,{$in:Array.from(o)});for(d of await Promise.all(u.map(e=>l.get(e).catch(()=>null))))d&&(_=ft.getFieldValue(d,t.foreignField),c.has(_)||c.set(_,[]),c.get(_).push(d));e=!0;break}if(!e)for(n of await l.query({[t.foreignField]:{$in:Array.from(o)}})){var f=ft.getFieldValue(n,t.foreignField);c.has(f)||c.set(f,[]),c.get(f).push(n)}}return e.map(e=>{var i=ft.getFieldValue(e,t.localField);return{...e,[t.as]:c.get(i)||[]}})}}}async execute(e,t,i){let s=e;for(var r of t){var a=Object.keys(r)[0],n=(r=r[a],this.stages[a]);if(!n)throw new Error("Unknown aggregation stage: "+a);s="$lookup"===a?await n(s,r,i):n(s,r)}return s}};class mt{constructor(e){this.database=e,this.migrations=[],this.currentVersion=this._loadVersion()}_loadVersion(){return localStorage.getItem(`lacertadb_${this.database.name}_version`)||"1.0.0"}_saveVersion(e){localStorage.setItem(`lacertadb_${this.database.name}_version`,e),this.currentVersion=e}addMigration(e){this.migrations.push(e)}_compareVersions(e,t){var i=e.split(".").map(Number),s=t.split(".").map(Number),r=Math.max(i.length,s.length);for(let e=0;e<r;e++){var a=i[e]||0,n=s[e]||0;if(n<a)return 1;if(a<n)return-1}return 0}async runMigrations(e){var t;for(t of this.migrations.filter(t=>0<this._compareVersions(t.version,this.currentVersion)&&this._compareVersions(t.version,e)<=0).sort((e,t)=>this._compareVersions(e.version,t.version)))await this._applyMigration(t,"up"),this._saveVersion(t.version)}async rollback(e){var t;for(t of this.migrations.filter(t=>t.down&&0<this._compareVersions(t.version,e)&&this._compareVersions(t.version,this.currentVersion)<=0).sort((e,t)=>this._compareVersions(t.version,e.version)))await this._applyMigration(t,"down");this._saveVersion(e)}async _applyMigration(e,t){var i;for(i of(console.log(`${"up"===t?"Running":"Rolling back"} migration: ${e.name} (v${e.version})`),await this.database.listCollections())){var s,r=await this.database.getCollection(i),a=[];for(s of await r.getAll()){var n=await e[t](s);n&&a.push({id:s._id,data:n})}0<a.length&&await r.batchUpdate(a)}}}class yt{constructor(){this._ops=new Array(100),this._opsIdx=0,this._opsLen=0,this._lats=new Float64Array(100),this._latsIdx=0,this._latsLen=0,this._mem=new Array(60),this._memIdx=0,this._memLen=0,this._cacheHits=0,this._cacheMisses=0,this._monitoring=!1,this._monitoringInterval=null}startMonitoring(){this._monitoring||(this._monitoring=!0,this._monitoringInterval=setInterval(()=>this._collectMetrics(),1e3))}stopMonitoring(){this._monitoring&&(this._monitoring=!1,clearInterval(this._monitoringInterval),this._monitoringInterval=null)}recordOperation(e,t){this._monitoring&&(this._ops[this._opsIdx]={type:e,duration:t,timestamp:Date.now()},this._opsIdx=(this._opsIdx+1)%100,this._opsLen<100&&this._opsLen++,this._lats[this._latsIdx]=t,this._latsIdx=(this._latsIdx+1)%100,this._latsLen<100)&&this._latsLen++}recordCacheHit(){this._cacheHits++}recordCacheMiss(){this._cacheMisses++}_collectMetrics(){performance&&performance.memory&&(this._mem[this._memIdx]={used:performance.memory.usedJSHeapSize,total:performance.memory.totalJSHeapSize,limit:performance.memory.jsHeapSizeLimit,timestamp:Date.now()},this._memIdx=(this._memIdx+1)%60,this._memLen<60)&&this._memLen++}_iterRing(e,t,i){var s=[];for(let a=0;a<i;a++){var r=(t-1-a+e.length)%e.length;void 0!==e[r]&&s.push(e[r])}return s}getStats(){let e=Date.now();var t=this._iterRing(this._ops,this._opsIdx,this._opsLen).filter(t=>e-t.timestamp<1e3).length;let i=0;for(let e=0;e<this._latsLen;e++)i+=this._lats[e];var s=0<this._latsLen?i/this._latsLen:0,r=0<(r=this._cacheHits+this._cacheMisses)?this._cacheHits/r*100:0,a=(a=0<(a=this._iterRing(this._mem,this._memIdx,this._memLen)).length?a[0]:null)?a.used/1048576:0;return{opsPerSec:t,avgLatency:s.toFixed(2),cacheHitRate:r.toFixed(1),memoryUsageMB:a.toFixed(2)}}getOptimizationTips(){var e,t=[],i=this.getStats();return 100<i.avgLatency&&t.push("High average latency detected. Consider enabling compression and indexing frequently queried fields."),i.cacheHitRate<50&&20<this._cacheHits+this._cacheMisses&&t.push("Low cache hit rate. Consider increasing cache size or optimizing query patterns."),10<this._memLen&&(e=(i=this._iterRing(this._mem,this._memIdx,Math.min(this._memLen,10)))[i.length-1],i=i[0],e)&&i&&10485760<i.used-e.used&&t.push("Memory usage is increasing rapidly. Check for memory leaks or consider batch processing."),0<t.length?t:["Performance is optimal. No issues detected."]}}class wt{constructor(e,t){this.name=e,this.database=t,this._serializer=t._serializer,this._base64=t._base64,this._storeName=e,this._metadata=null,this._settings=t.settings,this._indexedDB=new nt,this._opfs=new at,this._cleanupInterval=null,this._events=new Map,this._indexManager=new rt(this),this._cacheStrategy=new He({type:"lru",maxSize:100,ttl:6e4,enabled:!0}),this._docCache=new je(200),this._cacheGeneration=0,this._pendingIndexes=[],this._performanceMonitor=t.performanceMonitor,this._initialized=!1}get _db(){return this.database._db}get settings(){return this._settings}get metadata(){return this._metadata}get initialized(){return this._initialized}async init(){if(!this._initialized){if(await this.database._ensureStore(this._storeName),this._metadata=await dt.loadAsync(this.database.name,this.name,this._serializer,this._base64,this._db),await this._indexManager.loadIndexMetadata(),0<this._pendingIndexes.length){for(var{fieldPath:e,options:t}of this._pendingIndexes)this._indexManager.indexes.has(t.name||e)||await this._indexManager.createIndex(e,t).catch(()=>{});this._pendingIndexes=[]}0<this._settings.freeSpaceEvery&&this._settings.sizeLimitKB!==1/0&&(this._cleanupInterval=setInterval(()=>this._freeSpace(),this._settings.freeSpaceEvery)),this._initialized=!0}return this}async createIndex(e,t={}){return this._initialized?this._indexManager.createIndex(e,t):(this._pendingIndexes.push({fieldPath:e,options:t}),t.name||e)}async dropIndex(e){return this._indexManager.dropIndex(e)}async getIndexes(){return this._indexManager.getIndexStats()}async verifyIndexes(){return this._indexManager.verifyIndexes()}configureCacheStrategy(e){this._cacheStrategy.updateStrategy(e)}async add(e,t={}){if(this._initialized||await this.init(),t.encrypted&&!this.database.isEncrypted)throw new $e("Document-level encryption requires database-level encryption. Use getSecureDatabase() to create an encrypted database.","ENCRYPTION_NOT_INITIALIZED");await this._trigger("beforeAdd",e);e=new ct({data:e,_id:t.id},{compressed:t.compressed||!1,permanent:t.permanent||!1},this._serializer),(t=t.attachments)&&0<t.length&&(t=await Promise.all(t.map(e=>e instanceof File||e instanceof Blob?at.prepareAttachment(e,e.name):Promise.resolve(e))),e._attachments=await this._opfs.saveAttachments(this.database.name,this.name,e._id,t)),await e.pack(this.database.encryption),t=e.databaseOutput();var i=(await this._indexedDB.add(this._db,this._storeName,t),e.objectOutput());await this._indexManager.updateIndexForDocument(e._id,null,i),t=t.packedData.byteLength/1024;return this._metadata.addDocument(e._id,t,e._permanent,e._attachments.length),this.database.metadata.setCollection(this._metadata),await this._checkSpaceLimit(),await this._trigger("afterAdd",e),this._cacheGeneration++,this._docCache.set(e._id,i),e._id}async get(e,t={}){var i,s;if((this._initialized||await this.init(),!t.includeAttachments)&&(s=this._docCache.get(e)))return s;if(s=await this._indexedDB.get(this._db,this._storeName,e))return i=new ct(s,{encrypted:s._encrypted,compressed:s._compressed},this._serializer),s.packedData&&await i.unpack(this.database.encryption),t.includeAttachments&&0<i._attachments.length&&(i.data._attachments=await this._opfs.getAttachments(i._attachments)),await this._trigger("afterGet",i),s=i.objectOutput(t.includeAttachments),t.includeAttachments||this._docCache.set(e,s),s;throw new $e(`Document with id '${e}' not found.`,"DOCUMENT_NOT_FOUND")}async getAll(e={}){return this._initialized||await this.init(),e=(await this._indexedDB.getAll(this._db,this._storeName,void 0,e.limit)).filter(e=>!("string"==typeof e._id&&e._id.startsWith(rt.IDX_PREFIX))),Promise.all(e.map(async e=>{try{var t=new ct(e,{encrypted:e._encrypted,compressed:e._compressed},this._serializer);return e.packedData&&await t.unpack(this.database.encryption),t.objectOutput()}catch(t){return console.error(`Failed to unpack document ${e._id}:`,t),null}})).then(e=>e.filter(Boolean))}async update(e,t,i={}){this._initialized||await this.init(),await this._trigger("beforeUpdate",{docId:e,updates:t});var s,r,a=await this._indexedDB.get(this._db,this._storeName,e);if(a)return r=new ct(a,{},this._serializer),a.packedData&&await r.unpack(this.database.encryption),s=r.objectOutput(),r={...r.data,...t},(t=new ct({_id:e,_created:a._created,data:r},{compressed:void 0!==i.compressed?i.compressed:a._compressed,permanent:void 0!==i.permanent?i.permanent:a._permanent},this._serializer))._modified=Date.now(),(r=i.attachments)&&0<r.length?(await this._opfs.deleteAttachments(this.database.name,this.name,e),i=await Promise.all(r.map(e=>e instanceof File||e instanceof Blob?at.prepareAttachment(e,e.name):Promise.resolve(e))),t._attachments=await this._opfs.saveAttachments(this.database.name,this.name,t._id,i)):t._attachments=a._attachments,await t.pack(this.database.encryption),r=t.databaseOutput(),await this._indexedDB.put(this._db,this._storeName,r),i=t.objectOutput(),await this._indexManager.updateIndexForDocument(t._id,s,i),a=r.packedData.byteLength/1024,this._metadata.updateDocument(t._id,a,t._permanent,t._attachments.length),this.database.metadata.setCollection(this._metadata),await this._trigger("afterUpdate",t),this._cacheGeneration++,this._docCache.set(t._id,i),t._id;throw new $e(`Document with id '${e}' not found for update.`,"DOCUMENT_NOT_FOUND")}async upsert(e,t,i={}){return this._initialized||await this.init(),await this._indexedDB.get(this._db,this._storeName,e)?this.update(e,t,i):this.add(t,{...i,id:e})}async delete(e,t={}){this._initialized||await this.init(),await this._trigger("beforeDelete",e);var i=await this._indexedDB.get(this._db,this._storeName,e);if(!i)throw new $e("Document not found for deletion","DOCUMENT_NOT_FOUND");if(i._permanent&&!t.force)throw new $e("Cannot delete a permanent document. Use options.force = true to force deletion.","PERMANENT_DOCUMENT_PROTECTION");i._permanent&&t.force&&console.warn("Force deleting permanent document: "+e),t=new ct(i,{encrypted:i._encrypted,compressed:i._compressed},this._serializer),i.packedData&&await t.unpack(this.database.encryption),t=t.objectOutput(),await this._indexManager.updateIndexForDocument(e,t,null),await this._indexedDB.delete(this._db,this._storeName,e),(t=i._attachments)&&0<t.length&&await this._opfs.deleteAttachments(this.database.name,this.name,e),this._metadata.removeDocument(e),this.database.metadata.setCollection(this._metadata),await this._trigger("afterDelete",e),this._cacheGeneration++,this._docCache.delete(e)}async query(e={},t={}){this._initialized||await this.init();var i,s,r,a=performance.now(),n=function(e,t){e=JSON.stringify({f:e,o:t},(e,t)=>{if(!t||"object"!=typeof t||Array.isArray(t))return t;var i,s={};for(i of Object.keys(t).sort())s[i]=t[i];return s});{var[i,t=0]=[e];let n=0|t;var s=(t=i.length)>>>2;for(let e=0;e<s;e++){var r=e<<2;r=65535&i.charCodeAt(r)|(65535&i.charCodeAt(1+r))<<8|(65535&i.charCodeAt(2+r))<<16|(65535&i.charCodeAt(3+r))<<24,r=Math.imul(r,3432918353);n=(n^=r=Math.imul(r<<15|r>>>17,461845907))<<13|n>>>19,n=Math.imul(n,5)+3864292196|0}let o=0;var a=s<<2;switch(3&t){case 3:o^=(65535&i.charCodeAt(2+a))<<16;case 2:o^=(65535&i.charCodeAt(1+a))<<8;case 1:o^=65535&i.charCodeAt(a),o=(o=Math.imul(o,3432918353))<<15|o>>>17,o=Math.imul(o,461845907),n^=o}return n=(n^=t)^n>>>16,n=Math.imul(n,2246822507),n^=n>>>13,n=Math.imul(n,3266489909),(n^=n>>>16)>>>0}}(e,t)^2654435761*this._cacheGeneration;if(u=this._cacheStrategy.get(n))return this._performanceMonitor&&this._performanceMonitor.recordCacheHit(),u;this._performanceMonitor&&this._performanceMonitor.recordCacheMiss();let o,h=!1,l=null,c=1/0;for([i,s]of this._indexManager.indexes){var d,_=e[s.fieldPath];void 0!==_&&(d=(d=this._indexManager._indexData.get(i))?d.size||0:1/0)<c&&(c=d,l={indexName:i,fieldValue:_})}if(l){var u=await this._indexManager.query(l.indexName,l.fieldValue);o=(o=await Promise.all(u.map(e=>this.get(e).catch(()=>null)))).filter(Boolean);let t={};var f,p=this._indexManager.indexes.get(l.indexName).fieldPath;for(f in e)f!==p&&(t[f]=e[f]);0<Object.keys(t).length&&(o=o.filter(e=>ft.evaluate(e,t))),h=!0}return h||(u=0<Object.keys(e).length,r=!t.sort&&u?(t.skip||0)+(t.limit||1/0):1/0,o=await this._scanWithFilter(u?e:null,r)),t.sort&&(o=pt.stages.$sort(o,t.sort)),t.skip&&(o=pt.stages.$skip(o,t.skip)),t.limit&&(o=pt.stages.$limit(o,t.limit)),t.projection&&(o=pt.stages.$project(o,t.projection)),this._performanceMonitor&&this._performanceMonitor.recordOperation(h?"indexed-query":"full-scan-query",performance.now()-a),this._cacheStrategy.set(n,o),o}async _scanWithFilter(e,t){var i=[];let s=null;for(;;){var r,a=await this._indexedDB.getBatch(this._db,this._storeName,s,200);if(0===a.length)break;for(r of a)if(s=r._id,"string"!=typeof r._id||!r._id.startsWith(rt.IDX_PREFIX))try{var n=new ct(r,{encrypted:r._encrypted,compressed:r._compressed},this._serializer),o=(r.packedData&&await n.unpack(this.database.encryption),n.objectOutput());if((!e||ft.evaluate(o,e))&&(i.push(o),this._docCache.set(r._id,o),t<=i.length))return i}catch(e){console.error(`Failed to unpack document ${r._id}:`,e)}if(a.length<200)break}return i}async aggregate(e){this._initialized||await this.init();var t=performance.now();let i,s=e;return 0<e.length&&e[0].$match?(i=await this.query(e[0].$match),s=e.slice(1)):i=await this.getAll(),e=await pt.execute(i,s,this.database),this._performanceMonitor&&this._performanceMonitor.recordOperation("aggregate",performance.now()-t),e}async batchAdd(e,t={}){this._initialized||await this.init();var i=performance.now(),s=[];let r=[];var a,n=!this.database.encryption&&!t.compressed;for(a of e){var o=new ct({data:a},{compressed:t.compressed||!1,permanent:t.permanent||!1},this._serializer);n?o.packSync():await o.pack(this.database.encryption),s.push({type:"add",data:o.databaseOutput()}),r.push(o)}var h,l,c,d=await this._indexedDB.batchOperation(this._db,s,this._storeName);for(let e=0;e<r.length;e++)d[e].success&&(l=(h=r[e]).objectOutput(),await this._indexManager.updateIndexForDocument(h._id,null,l),c=h._packedData.byteLength/1024,this._metadata.addDocument(h._id,c,h._permanent,0),this._docCache.set(h._id,l));return this.database.metadata.setCollection(this._metadata),this._performanceMonitor&&this._performanceMonitor.recordOperation("batchAdd",performance.now()-i),d.map((e,t)=>({...e,id:r[t]._id}))}async batchUpdate(e,t={}){this._initialized||await this.init();var i=performance.now(),s=[],r=[];let a=[];var n,o=[],h=!this.database.encryption&&!t.compressed;let l=new Map;if(e.length<=20){var c=e.map(e=>this._indexedDB.get(this._db,this._storeName,e.id).then(t=>t&&l.set(e.id,t)).catch(()=>{}));await Promise.all(c)}else{var d,_=new Set(e.map(e=>e.id));for(d of await this._indexedDB.getAll(this._db,this._storeName))d._id&&_.has(d._id)&&l.set(d._id,d)}for(n of e){var u,f=l.get(n.id);f?(u=new ct(f,{},this._serializer),f.packedData&&await u.unpack(this.database.encryption),r.push(u.objectOutput()),u={...u.data,...n.data},(u=new ct({_id:n.id,_created:f._created,data:u},{compressed:void 0!==t.compressed?t.compressed:f._compressed,permanent:void 0!==t.permanent?t.permanent:f._permanent},this._serializer))._modified=Date.now(),u._attachments=f._attachments,h?u.packSync():await u.pack(this.database.encryption),a.push(u),s.push({type:"put",data:u.databaseOutput()})):o.push({success:!1,id:n.id,error:"Document not found"})}if(0===s.length)return o;var p,m,y,w=await this._indexedDB.batchOperation(this._db,s,this._storeName);for(let e=0;e<a.length;e++)w[e].success&&(m=(p=a[e]).objectOutput(),await this._indexManager.updateIndexForDocument(p._id,r[e],m),y=p._packedData.byteLength/1024,this._metadata.updateDocument(p._id,y,p._permanent,p._attachments.length),this._docCache.set(p._id,m));return this.database.metadata.setCollection(this._metadata),this._cacheGeneration++,this._performanceMonitor&&this._performanceMonitor.recordOperation("batchUpdate",performance.now()-i),[...w.map((e,t)=>({...e,id:a[t]._id})),...o]}async batchDelete(e){this._initialized||await this.init();var t=performance.now(),i=(e=e.map(e=>"string"==typeof e?{id:e,options:{}}:{id:e.id,options:e.options||{}}),[]);let s=[];var r,a,n=[];let o=new Map;if(e.length<=20){var h=e.map(({id:e})=>this._indexedDB.get(this._db,this._storeName,e).then(t=>t&&o.set(e,t)).catch(()=>{}));await Promise.all(h)}else{var l,c=new Set(e.map(({id:e})=>e));for(l of await this._indexedDB.getAll(this._db,this._storeName))l._id&&c.has(l._id)&&o.set(l._id,l)}for({id:r,options:a}of e){var d,_=o.get(r);_?_._permanent&&!a.force?n.push({success:!1,id:r,error:"Cannot delete permanent document without force flag"}):(d=new ct(_,{encrypted:_._encrypted,compressed:_._compressed},this._serializer),_.packedData&&await d.unpack(this.database.encryption),d=d.objectOutput(),s.push({id:r,fullDoc:d,stored:_}),i.push({type:"delete",key:r})):n.push({success:!1,id:r,error:"Document not found"})}if(0===i.length)return n;var u,f,p,m=await this._indexedDB.batchOperation(this._db,i,this._storeName);for(let e=0;e<s.length;e++)m[e].success&&(({id:u,fullDoc:f,stored:p}=s[e]),await this._indexManager.updateIndexForDocument(u,f,null),p._attachments&&0<p._attachments.length&&await this._opfs.deleteAttachments(this.database.name,this.name,u),this._metadata.removeDocument(u),this._docCache.delete(u));return this.database.metadata.setCollection(this._metadata),this._cacheGeneration++,this._performanceMonitor&&this._performanceMonitor.recordOperation("batchDelete",performance.now()-t),[...m.map((e,t)=>({...e,id:s[t].id})),...n]}async _checkSpaceLimit(){this._settings.sizeLimitKB!==1/0&&this._metadata.sizeKB>this._settings.bufferLimitKB&&await this._freeSpace()}async _freeSpace(){for(var e=.8*this._settings.bufferLimitKB;this._metadata.sizeKB>e;){var t=this._metadata.getOldestNonPermanentDocuments(10);if(0===t.length)break;await this.batchDelete(t)}}on(e,t){this._events.has(e)||this._events.set(e,[]),this._events.get(e).push(t)}off(e,t){var i;this._events.has(e)&&(i=this._events.get(e).filter(e=>e!==t),this._events.set(e,i))}async _trigger(e,t){if((e=this._events.get(e))&&0!==e.length)for(var i of e)await i(t)}clearCache(){this._cacheStrategy.clear(),this._docCache.clear()}async clear(e={}){if(this._initialized||await this.init(),e.force)for(var t of(await this._indexedDB.clear(this._db,this._storeName),this._metadata&&this._metadata.destroy(),this._metadata=new dt(this.name,{},this._serializer,this._base64,this.database.name,this._db),this._metadata._flushSync(),this.database.metadata.setCollection(this._metadata),this._cacheStrategy.clear(),this._docCache.clear(),this._indexManager.indexes.keys()))await this._indexManager.rebuildIndex(t);else e=(await this.getAll()).filter(e=>!e._permanent),await this.batchDelete(e.map(e=>e._id));this._cleanupInterval&&(clearInterval(this._cleanupInterval),this._cleanupInterval=null,0<this._settings.freeSpaceEvery)&&this._settings.sizeLimitKB!==1/0&&(this._cleanupInterval=setInterval(()=>this._freeSpace(),this._settings.freeSpaceEvery))}destroy(){this._metadata&&this._metadata.destroy(),this._indexManager&&(this._indexManager.flushPersistence().catch(()=>{}),this._indexManager.destroy()),this._cleanupInterval&&(clearInterval(this._cleanupInterval),this._cleanupInterval=null),this._cacheStrategy&&this._cacheStrategy.destroy(),this._docCache&&this._docCache.clear(),this._db=null,this._events.clear()}}class gt{constructor(e,t,i,s){this.name=e,this._collections=new Map,this._metadata=null,this._settings=null,this._quickStore=null,this._performanceMonitor=t,this._serializer=i,this._base64=s,this._db=null,this._idbVersion=0,this._knownStores=new Set,this._ensureStorePromise=null,this._idbVersionKey=`lacertadb_${e}_idb_version`,this._idbStoresKey=`lacertadb_${e}_idb_stores`,this._encryption=null}get collections(){return this._collections}get metadata(){return this._metadata}get settings(){return this._settings}get quickStore(){return this._quickStore}get performanceMonitor(){return this._performanceMonitor}get encryption(){return this._encryption}get isEncrypted(){return!!this._encryption}async _getConnection(){if(!this._db){try{this._idbVersion=parseInt(localStorage.getItem(this._idbVersionKey),10)||1;var e,t,i=localStorage.getItem(this._idbStoresKey);i&&(e=this._base64.decode(i),t=this._serializer.deserialize(e),this._knownStores=new Set(t))}catch(e){this._idbVersion=1}this._db=await this._openIDB(this._idbVersion)}return this._db}async _openIDB(e){let t=this._knownStores;return new Promise((i,s)=>{let r=indexedDB.open("lacertadb_"+this.name,e);r.onerror=()=>s(new $e("Failed to open database","DATABASE_OPEN_FAILED",r.error)),r.onsuccess=()=>i(r.result),r.onupgradeneeded=e=>{var i,s=e.target.result;for(i of(s.objectStoreNames.contains("__meta")||s.createObjectStore("__meta",{keyPath:"_id"}),t))s.objectStoreNames.contains(i)||s.createObjectStore(i,{keyPath:"_id"}).createIndex("modified","_modified",{unique:!1})}})}async _ensureStore(e){if(this._db&&this._db.objectStoreNames.contains(e))this._knownStores.add(e);else if(this._knownStores.add(e),!(this._ensureStorePromise&&(await this._ensureStorePromise,this._db)&&this._db.objectStoreNames.contains(e))){var t,i=[];for(t of this._knownStores)this._db&&this._db.objectStoreNames.contains(t)||i.push(t);if(0!==i.length){this._ensureStorePromise=(async()=>{this._idbVersion++,localStorage.setItem(this._idbVersionKey,String(this._idbVersion));var e=this._serializer.serialize(Array.from(this._knownStores));e=this._base64.encode(e);localStorage.setItem(this._idbStoresKey,e),this._db&&(this._db.close(),this._db=null),this._db=await this._openIDB(this._idbVersion)})();try{await this._ensureStorePromise}finally{this._ensureStorePromise=null}}}}async init(e={}){return await this._getConnection(),this._db.objectStoreNames.contains("__meta")||await this._ensureStore("__meta"),this._metadata=await _t.loadAsync(this.name,this._serializer,this._base64,this._db),this._settings=await ut.loadAsync(this.name,this._serializer,this._base64,this._db),this._quickStore=new Oe(this.name,this._serializer,this._base64,this._db),await this._quickStore.hydrateFromIDB(),await this._migrateOldDatabases(),e.pin&&await this._initializeEncryption(e.pin,e.salt,e.encryptionConfig),this}static async _readMeta(e,t){return e&&e.objectStoreNames.contains("__meta")?new Promise(i=>{try{let s=e.transaction("__meta","readonly").objectStore("__meta").get(t);s.onsuccess=()=>i(s.result||null),s.onerror=()=>i(null)}catch(e){i(null)}}):null}static async _writeMeta(e,t,i){if(e&&e.objectStoreNames.contains("__meta"))return new Promise(s=>{try{var r=e.transaction("__meta","readwrite"),a=r.objectStore("__meta"),n={_id:t,...i},o=a.put(n);o.onsuccess=()=>s(),o.onerror=()=>s(),r.oncomplete=()=>s()}catch(r){s()}})}async _initializeEncryption(e,t=0,i={}){var s=`lacertadb_${this.name}_encryption`;let r=null;var a=((a=localStorage.getItem(s))&&(a=this._base64.decode(a),r=this._serializer.deserialize(a)),this._encryption=new Qe(i,this._serializer,this._base64),await this._encryption.initialize(e,r));r||(i=this._serializer.serialize(a),e=this._base64.encode(i),localStorage.setItem(s,e))}async changePin(e,t){if(this._encryption)return e=await this._encryption.changePin(e,t),t=`lacertadb_${this.name}_encryption`,e=this._serializer.serialize(e),e=this._base64.encode(e),localStorage.setItem(t,e),!0;throw new Error("Database is not encrypted")}async storePrivateKey(e,t,i=""){if(!this._encryption)throw new Error("Database must be encrypted to store private keys");t=await this._encryption.encryptPrivateKey(t,i);let s=await this.getCollection("__private_keys__").catch(()=>null);return await(s=s||await this.createCollection("__private_keys__")).add({name:e,key:t,createdAt:Date.now()},{id:e,permanent:!0}),!0}async getPrivateKey(e,t=""){if(!this._encryption)throw new Error("Database must be encrypted to retrieve private keys");var i=await(await this.getCollection("__private_keys__")).get(e);if(i)return this._encryption.decryptPrivateKey(i.key,t);throw new Error(`Private key '${e}' not found`)}async createCollection(e,t){if(this._collections.has(e))throw new $e(`Collection '${e}' already exists.`,"COLLECTION_EXISTS");await this._ensureStore(e);var i=new wt(e,this);return this._collections.set(e,i),this._metadata.collections[e]||this._metadata.setCollection(new dt(e,{},this._serializer,this._base64,this.name,this._db)),i}async getCollection(e){var t;if(this._collections.has(e))return(t=this._collections.get(e)).initialized||await t.init(),t;if(this._metadata.collections[e])return await this._ensureStore(e),t=new wt(e,this),this._collections.set(e,t),await t.init(),t;throw new $e(`Collection '${e}' not found.`,"COLLECTION_NOT_FOUND")}ensureCollection(e){if(this._collections.has(e))return this._collections.get(e);if(!this._knownStores.has(e)){this._knownStores.add(e);try{var t=this._serializer.serialize(Array.from(this._knownStores)),i=this._base64.encode(t);localStorage.setItem(this._idbStoresKey,i)}catch(e){}}return t=new wt(e,this),this._collections.set(e,t),this._metadata.collections[e]||this._metadata.setCollection(new dt(e,{},this._serializer,this._base64,this.name,this._db)),t}async dropCollection(e){var t;if(this._collections.has(e)&&((t=this._collections.get(e)).initialized&&(await t.clear({force:!0}),t.destroy()),this._collections.delete(e)),this._metadata.removeCollection(e),localStorage.removeItem(`lacertadb_${this.name}_${e}_collmeta`),localStorage.removeItem(`lacertadb_${this.name}_${e}_indexes`),this._db&&this._knownStores.has(e))try{await(new nt).clear(this._db,e)}catch(e){}let i=this.name+"_"+e;try{await new Promise((e,t)=>{var s=indexedDB.deleteDatabase(i);s.onsuccess=e,s.onerror=e,s.onblocked=e})}catch(e){}}async _migrateOldDatabases(){var e=`lacertadb_${this.name}_consolidated`;if(!localStorage.getItem(e)){var t=Object.keys(this._metadata.collections||{});if(0!==t.length){let r=0;for(let a of t){let t=this.name+"_"+a;try{let e=await new Promise((e,i)=>{let s=indexedDB.open(t,1);s.onerror=()=>e(null),s.onsuccess=()=>e(s.result),s.onupgradeneeded=t=>{0===t.oldVersion&&(t.target.transaction.abort(),e(null))}});if(e)if(e.objectStoreNames.contains("documents")){var i=await new Promise((t,i)=>{let s=e.transaction("documents","readonly").objectStore("documents").getAll();s.onsuccess=()=>t(s.result||[]),s.onerror=()=>t([])});if(e.close(),0!==i.length){await this._ensureStore(a);var s=new nt;let e=i.map(e=>({type:"put",data:e}));await s.performTransaction(this._db,[a],"readwrite",t=>{let i=t.objectStore(a);return t=e.map(e=>new Promise((t,s)=>{var r=i.put(e.data);r.onsuccess=()=>t(),r.onerror=()=>t()})),Promise.all(t)}),await new Promise(e=>{var i=indexedDB.deleteDatabase(t);i.onsuccess=e,i.onerror=e,i.onblocked=e}),r++}}else e.close();else indexedDB.deleteDatabase(t)}catch(e){console.warn(`[LacertaDB] Migration of '${a}' failed:`,e.message)}}0<r&&console.log(`[LacertaDB] Migrated ${r} collections to consolidated database`)}localStorage.setItem(e,"1")}}listCollections(){return Object.keys(this._metadata.collections)}getStats(){return{name:this.name,totalSizeKB:this._metadata.totalSizeKB,totalDocuments:this._metadata.totalLength,collections:Object.entries(this._metadata.collections).map(([e,t])=>({name:e,sizeKB:t.sizeKB,documents:t.length,createdAt:new Date(t.createdAt).toISOString(),modifiedAt:new Date(t.modifiedAt).toISOString()}))}}updateSettings(e){this._settings.updateSettings(e)}async export(e="json",t=null){var i,s,r,a={version:"0.12.0",database:this.name,timestamp:Date.now(),collections:{}};for(i of this.listCollections()){var n=await this.getCollection(i);a.collections[i]=await n.getAll()}if("json"===e)return r=this._serializer.serialize(a),this._base64.encode(r);if("encrypted"===e&&t)return r=new Xe,s=this._serializer.serialize(a),r=await r.encrypt(s,t),this._base64.encode(r);throw new $e("Unsupported export format: "+e,"INVALID_FORMAT")}async import(e,t="json",i=null){let s;try{var r,a=this._base64.decode(e);s="encrypted"===t&&i?(r=await(new Xe).decrypt(a,i),this._serializer.deserialize(r)):this._serializer.deserialize(a)}catch(e){throw new $e("Failed to parse import data","IMPORT_PARSE_FAILED",e)}for(var n in s.collections){var o=s.collections[n];let t;try{t=await this.createCollection(n)}catch(e){if("COLLECTION_EXISTS"!==e.code)throw e;t=await this.getCollection(n)}await t.batchAdd(o)}return e=Object.values(s.collections).reduce((e,t)=>e+t.length,0),{collections:Object.keys(s.collections).length,documents:e}}async clearAll(){await Promise.all([...this._collections.keys()].map(e=>this.dropCollection(e))),this._collections.clear(),this._metadata&&this._metadata.destroy(),this._metadata=new _t(this.name,{},this._serializer,this._base64,this._db),this._metadata.save(),this._quickStore.clear()}async destroy(){for(var e of this._collections.values())e.initialized&&(await e.clear({force:!0}),e.destroy());this._collections.clear(),this._db&&(this._db.close(),this._db=null),this._quickStore&&this._quickStore.destroy(),this._metadata&&this._metadata.destroy(),this._encryption&&this._encryption.destroy(),this._metadata=null,this._settings=null,this._quickStore=null,this._performanceMonitor=null}}class vt{constructor(e={}){this._databases=new Map,this._performanceMonitor=new yt,e={...Pe,...e.turboSerial||{}},this._serializer=new class{constructor(e={}){this.options={compression:e.compression||!1,deduplication:!1!==e.deduplication,shareArrayBuffers:!1!==e.shareArrayBuffers,simdOptimization:!1!==e.simdOptimization,detectCircular:!1!==e.detectCircular,allowFunction:e.allowFunction||!1,serializeFunctions:e.serializeFunctions||!1,preservePropertyDescriptors:!1!==e.preservePropertyDescriptors,sortKeys:e.sortKeys||!1,memoryPoolSize:e.memoryPoolSize||65536,...e},this.options.allowFunction||(this.options.serializeFunctions=!1),e=Math.max(this.options.memoryPoolSize,65536),this.buf=new Uint8Array(e),this.dv=new DataView(this.buf.buffer),this.f64=new Float64Array(this.buf.buffer),this.f32=new Float32Array(this.buf.buffer),this.i32=new Int32Array(this.buf.buffer),this.i16=new Int16Array(this.buf.buffer),this.pos=0,this.enc=new TextEncoder,this.dec=new TextDecoder,this.refs=new Map,this.ancestors=new WeakSet,this.strings=new Map,this.buffers=new Map,this.deserializeRefs=null,this.deserializeStrings=null,this.deserializeBuffers=null,this.buffer=null,this.view=null}_grow(e){var t=this.pos+e;if(!(t<=this.buf.length)){let i=this.buf.length;for(;i<t;)i<<=1;(e=new Uint8Array(i)).set(this.buf.subarray(0,this.pos)),this.buf=e,this.dv=new DataView(e.buffer),this.f64=new Float64Array(e.buffer),this.f32=new Float32Array(e.buffer),this.i32=new Int32Array(e.buffer),this.i16=new Int16Array(e.buffer)}}serialize(e){return this.resetState(),this._grow(17),this.dv.setUint32(0,Ve,!0),this.buf[4]=7,this.pos=17,this.writeValue(e),this.dv.setUint32(5,this.refs.size,!0),this.dv.setUint32(9,this.strings.size,!0),this.dv.setUint32(13,this.buffers.size,!0),this.buf.slice(0,this.pos)}deserialize(e){if(this.buffer=e.constructor===Uint8Array?e:new Uint8Array(e),this.view=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength),this.pos=0,this.view.getUint32(0,!0)!==Ve)throw new Error("Invalid TurboSerial data");if(7===(e=this.buffer[4])){var t=this.view.getUint32(5,!0),i=this.view.getUint32(9,!0),s=this.view.getUint32(13,!0);this.deserializeRefs=new Array(t),this.deserializeStrings=new Array(i),this.deserializeBuffers=new Array(s),this._drIdx=0,this._dsIdx=0,this._dbIdx=0,this.pos=17}else{if(6!==e)throw new Error("Unsupported version: "+e);this.deserializeRefs=[],this.deserializeStrings=[],this.deserializeBuffers=[],this._drIdx=-1,this.pos=5}return this.readValue()}resetState(){this.pos=0,this.refs.clear(),this.ancestors=new WeakSet,this.strings.clear(),this.buffers.clear()}resetMemory(e={}){return e=e.shrink?Math.max(this.options.memoryPoolSize||65536,256):this.buf.length,this.buf=new Uint8Array(e),this.dv=new DataView(this.buf.buffer),this.f64=new Float64Array(this.buf.buffer),this.f32=new Float32Array(this.buf.buffer),this.i32=new Int32Array(this.buf.buffer),this.i16=new Int16Array(this.buf.buffer),this.pos=0,this.refs.clear(),this.ancestors=new WeakSet,this.strings.clear(),this.buffers.clear(),this.deserializeRefs&&(this.deserializeRefs.length=0,this.deserializeRefs=null),this.deserializeStrings&&(this.deserializeStrings.length=0,this.deserializeStrings=null),this.deserializeBuffers&&(this.deserializeBuffers.length=0,this.deserializeBuffers=null),this}_wV(e){var t=this.buf;let i=this.pos;if((e>>>=0)<128)t[i]=e,this.pos=i+1;else if(e<16384)t[i]=127&e|128,t[i+1]=e>>>7,this.pos=i+2;else{for(;128<=e;)t[i++]=127&e|128,e>>>=7;t[i++]=e,this.pos=i}}writeValue(e){if(null===e)this._grow(1),this.buf[this.pos++]=0;else if(void 0===e)this._grow(1),this.buf[this.pos++]=1;else{var t=typeof e;if("boolean"==t)this._grow(1),this.buf[this.pos++]=e?3:2;else if("number"==t)this._wNum(e);else if("string"==t)this._wStrDedup(e);else if("bigint"==t)this._wBigInt(e);else if("symbol"==t)this._grow(2),void 0!==(i=Symbol.keyFor(e))?(this.buf[this.pos++]=we,this.writeValue(i)):n.has(e)?(this.buf[this.pos++]=ge,this.writeValue(n.get(e))):void 0===e.description?this.buf[this.pos++]=ve:(this.buf[this.pos++]=ye,this.writeValue(e.description));else if("function"==t)this._grow(1),this.buf[this.pos++]=this.options.allowFunction?be:c;else{var i=this.refs.get(e);if(void 0!==i)this._grow(6),this.options.detectCircular&&this.ancestors.has(e)?this.buf[this.pos++]=me:this.buf[this.pos++]=pe,this._wV(i);else{if((this.options.deduplication||this.options.detectCircular)&&this.refs.set(e,this.refs.size),this.options.shareArrayBuffers&&e.constructor===ArrayBuffer){if(void 0!==(t=this.buffers.get(e)))return this._grow(6),this.buf[this.pos++]=Y,void this._wV(t);this.buffers.set(e,this.buffers.size)}this.options.detectCircular&&this.ancestors.add(e),this._wObj(e),this.options.detectCircular&&this.ancestors.delete(e)}}}}_wStrDedup(e){if(this.options.deduplication&&3<e.length){var t=this.strings.get(e);if(void 0!==t)return this._grow(6),this.buf[this.pos++]=B,void this._wV(t);this.strings.set(e,this.strings.size)}this._wStr(e)}_wNum(e){this._grow(10);var t,i=this.pos;e!=e?(this.buf[i]=y,this.pos=i+1):e===1/0?(this.buf[i]=w,this.pos=i+1):e===-1/0?(this.buf[i]=g,this.pos=i+1):0===e&&1/e<0?(this.buf[i]=v,this.pos=i+1):e===(t=0|e)?-128<=t&&t<=127?(this.buf[i]=d,this.buf[i+1]=255&t,this.pos=i+2):-32768<=t&&t<=32767?(this.buf[i]=_,this.dv.setInt16(i+1,t,!0),this.pos=i+3):(this.buf[i]=u,this.dv.setInt32(i+1,t,!0),this.pos=i+5):e===(t=e>>>0)?(this.buf[i]=f,this.dv.setUint32(i+1,t,!0),this.pos=i+5):(a[0]=e,a[0]===e?(this.buf[i]=p,this.dv.setFloat32(i+1,e,!0),this.pos=i+5):(this.buf[i]=m,this.dv.setFloat64(i+1,e,!0),this.pos=i+9))}_wBigInt(e){this._grow(10);var t=e<0n,i=t?-e:e;if(i<=0x7fffffffffffffffn)this.buf[this.pos++]=t?x:S,this.dv.setBigInt64(this.pos,e,!0),this.pos+=8;else{this.buf[this.pos++]=t?I:A;let e=i,s=0,r=i;for(;0n<r;)s++,r>>=8n;this._grow(s+5),this._wV(s);for(let t=0;t<s;t++)this.buf[this.pos++]=Number(0xffn&e),e>>=8n}}_wStr(e){var t=e.length;if(0===t)this._grow(1),this.buf[this.pos++]=z;else if(t<128){let s=1;for(let i=0;i<t;i++)if(127<e.charCodeAt(i)){s=0;break}if(s){this._grow(t+2);var i=this.pos;this.buf[i++]=t<16?k:D,this.buf[i++]=t;for(let s=0;s<t;s++)this.buf[i+s]=e.charCodeAt(s);return void(this.pos=i+t)}let r=3*t,a=(this._grow(7+r),this.pos+2),n=this.enc.encodeInto(e,this.buf.subarray(a,a+r)).written,o=this.pos;this.buf[o++]=n<16?M:n<256?E:T,n<256?(this.buf[o++]=n,this.pos=a+n):(this.pos=o,this._wV(n),o=this.pos,this.buf.copyWithin(o,a,a+n),this.pos=o+n)}else{let i=3*t;this._grow(i+7);let s=this.pos+6,r=this.enc.encodeInto(e,this.buf.subarray(s,s+i)).written,a=this.pos;r===t?(this.buf[a++]=t<256?D:C,t<256?this.buf[a++]=t:(this.pos=a,this._wV(t),a=this.pos)):(this.buf[a++]=r<256?E:T,r<256?this.buf[a++]=r:(this.pos=a,this._wV(r),a=this.pos)),a!==s&&this.buf.copyWithin(a,s,s+r),this.pos=a+r}}_wObj(e){if(Array.isArray(e))this._wArr(e);else{var t=e.constructor;if(void 0!==(t=ke.get(t))){if(t===te)return this._grow(9),void((a=e.getTime())!=a?this.buf[this.pos++]=ie:(this.buf[this.pos++]=te,this.dv.setFloat64(this.pos,a,!0),this.pos+=8));if(t===_e)return this._grow(1),this.buf[this.pos++]=_e,this.writeValue(e.source),void this.writeValue(e.flags);if(t===Z){for(var[i,s]of(this._grow(6),this.buf[this.pos++]=Z,this._wV(e.size),e))this.writeValue(i),this.writeValue(s);return}if(t===ee){for(var r of(this._grow(6),this.buf[this.pos++]=ee,this._wV(e.size),e))this.writeValue(r);return}if(t===Q||t===J)return this._grow(6),this.buf[this.pos++]=t,a=new Uint8Array(e),this._wV(a.length),this._grow(a.length),this.buf.set(a,this.pos),void(this.pos+=a.length);if(96==(240&t))return void this._wTypedArr(e,t)}if(e.constructor===Error||e.constructor&&Be.has(e.constructor.name)){this._grow(2);var a=Be.get(e.constructor.name)||de;if(this.buf[this.pos++]=a,this.writeValue(e.message||""),this.writeValue(e.stack||""),a===ce&&e.errors)for(var n of(this._wV(e.errors.length),e.errors))this.writeValue(n)}else"undefined"==typeof Blob||e.constructor!==Blob&&e.constructor!==("undefined"!=typeof File?File:null)?this._wPlainObj(e):(this._grow(12),this.buf[this.pos++]="undefined"!=typeof File&&e.constructor===File?fe:ue,this._wV(0),this._wV(0))}}_wArr(e){var t=e.length;if(0===t)this._grow(1),this.buf[this.pos++]=V;else if(Object.keys(e).length!==t){this._grow(12),this.buf[this.pos++]=L,this._wV(t);var i,s=[];for(let i=0;i<t;i++)i in e&&s.push(i);for(i of(this._wV(s.length),s))this._wV(i),this.writeValue(e[i])}else if(!(this.options.simdOptimization&&8<=t&&"number"==typeof e[0]&&this._wPackedArr(e,t))){this._grow(6),this.buf[this.pos++]=U,this._wV(t);for(let i=0;i<t;i++)this.writeValue(e[i])}}_wPackedArr(e,t){let i,s=1,r=e[0],n=e[0],o=1;for(let i=0;i<t;i++){var h=e[i];if("number"!=typeof h)return!1;h!==(0|h)&&(s=0),h<r&&(r=h),h>n&&(n=h),o&&(a[0]=h,a[0]!==h)&&(o=0)}i=s?(l=Math.max(Math.abs(r),Math.abs(n)))<=127?F:l<=32767?P:O:o?N:K;var l=Se[i]||1;this._grow(6+t*l),this.buf[this.pos++]=i,this._wV(t);let c=this.pos;switch(i){case F:for(let i=0;i<t;i++)this.buf[c++]=255&e[i];break;case P:for(let i=0;i<t;i++)this.dv.setInt16(c,e[i],!0),c+=2;break;case O:for(let i=0;i<t;i++)this.dv.setInt32(c,e[i],!0),c+=4;break;case N:for(let i=0;i<t;i++)this.dv.setFloat32(c,e[i],!0),c+=4;break;case K:for(let i=0;i<t;i++)this.dv.setFloat64(c,e[i],!0),c+=8}return this.pos=c,!0}_wTypedArr(e,t){this._grow(12),this.buf[this.pos++]=t;var i=e.buffer;if(this.options.shareArrayBuffers){var s=this.buffers.get(i);if(void 0!==s)return this.buf[this.pos++]=1,this._wV(s),this._wV(e.byteOffset),void this._wV(e.length);this.buffers.set(i,this.buffers.size)}if(this.buf[this.pos++]=0,this._wV(e.byteOffset),this._wV(e.length),s=Se[t]||1,t===W||t===X){this._grow(8*e.length);for(let t=0;t<e.length;t++)this.dv.setBigInt64(this.pos,e[t],!0),this.pos+=8}else t=e.length*s,this._grow(t),s=new Uint8Array(i,e.byteOffset,t),this.buf.set(s,this.pos),this.pos+=t}_wPlainObj(e){var t=Object.getPrototypeOf(e),i=(t=e.constructor===Object||t===Object.prototype||null===t,Object.keys(e));if(0===i.length&&t)this._grow(1),this.buf[this.pos++]=$;else if(t){if(this.options.preservePropertyDescriptors){var s;t=[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)];let i=!1;for(s of t){var r=Object.getOwnPropertyDescriptor(e,s);if(r.get||r.set||!r.enumerable||!r.writable||!r.configurable){i=!0;break}}if(i)return void this._wDescriptorObj(e,t)}let n=!1;if(this.options.allowFunction)for(let t=0;t<i.length;t++)if("function"==typeof e[i[t]]){n=!0;break}if(n)this._wMethodObj(e,i);else{this._grow(6),this.buf[this.pos++]=R,this.options.sortKeys&&i.sort();let t=i.length;if(!this.options.serializeFunctions)for(let s=t=0;s<i.length;s++)"function"!=typeof e[i[s]]&&t++;this._wV(t);for(let t=0;t<i.length;t++){var a=e[i[t]];!this.options.serializeFunctions&&"function"==typeof a||(this.writeValue(i[t]),this.writeValue(a))}}}else this._wConstructorObj(e,i)}_wDescriptorObj(e,t){this._grow(6),this.buf[this.pos++]=H;var i;t=t.filter(t=>{try{var i=Object.getOwnPropertyDescriptor(e,t);return i&&(this.options.serializeFunctions||!i.get&&!i.set&&"function"!=typeof i.value)}catch(t){return!1}});for(i of(this._wV(t.length),t)){this.writeValue(i);var s=Object.getOwnPropertyDescriptor(e,i);let t=0;s.enumerable&&(t|=1),s.writable&&(t|=2),s.configurable&&(t|=4),s.get&&(t|=8),s.set&&(t|=16),this._grow(1),this.buf[this.pos++]=t,s.get||s.set?(s.get&&this.writeValue(s.get),s.set&&this.writeValue(s.set)):this.writeValue(s.value)}}_wMethodObj(e,t){this._grow(6),this.buf[this.pos++]=G;var i,s,r,a,n=[];for(i of t)try{var o=e[i];n.push([i,o,"function"==typeof o])}catch(e){}for([s,r,a]of(this._wV(n.length),n))this.writeValue(s),this._grow(1),this.buf[this.pos++]=a?1:0,a&&this.options.serializeFunctions?(this.writeValue(r.toString()),this.writeValue(r.name||"")):a?(this._grow(1),this.buf[this.pos++]=be):this.writeValue(r)}_wConstructorObj(e,t){this._grow(6),this.buf[this.pos++]=q,this.writeValue((null==(s=e.constructor)?void 0:s.name)||"");var i,s=this.options.serializeFunctions?t:t.filter(t=>{try{return"function"!=typeof e[t]}catch(t){return!1}});for(i of(this._wV(s.length),s))this.writeValue(i),this.writeValue(e[i])}_pushRef(e){0<=this._drIdx?this.deserializeRefs[this._drIdx++]=e:this.deserializeRefs.push(e)}_pushStr(e){0<=this._dsIdx?this.deserializeStrings[this._dsIdx++]=e:this.deserializeStrings.push(e)}_pushBuf(e){0<=this._dbIdx?this.deserializeBuffers[this._dbIdx++]=e:this.deserializeBuffers.push(e)}readValue(){var e=this.buffer[this.pos++];if(e===pe||e===me)return this.deserializeRefs[this._rV()];if(e===B)return this.deserializeStrings[this._rV()];if(e===Y)return this.deserializeBuffers[this._rV()];var t,i=240&e;if(0==i)return 0===e?null:1===e?void 0:3===e;if(16==i)return this._rNum(e);if(32==i)return this._rBigInt(e);if(48==i)return this._rStr(e);if(64==i||80==i||128==i){let t;return t=64==i?[]:128==i?new(e===Z?Map:Set):{},this._pushRef(t),this._rFill(t,e,i),t}if(96==i)return t=this._rTypedArr(e),this._pushRef(t),t;if(112==i)return t=this._rArrayBuf(e),this._pushBuf(t),t;if(144==i)return e===ie?new Date(NaN):(t=this.view.getFloat64(this.pos,!0),this.pos+=8,new Date(t));if(160==i)return this._rError(e);if(176==i)return new RegExp(this.readValue(),this.readValue());if(192==i)return this._rV(),this._rV(),{_type:"Binary"};if(224==i)return this._rSpecial(e);if(240==i)return this.options.allowFunction?function(){throw new Error("Function not serialized")}:void 0;throw new Error("Unknown type: 0x"+e.toString(16))}_rV(){let e=this.pos,t=this.buffer[e++];if(!(128&t))return this.pos=e,t;let i=127&t,s=7;for(;t=this.buffer[e++],i|=(127&t)<<s,s+=7,128&t;);return this.pos=e,i>>>0}_rFill(e,t,i){if(64===i){if(t!==V)if(t===U){var s=this._rV();for(let t=0;t<s;t++)e[t]=this.readValue()}else if(t===L){e.length=this._rV();var r=this._rV();for(let t=0;t<r;t++)e[this._rV()]=this.readValue()}else{var a=this._rPacked(t);for(let t=0;t<a.length;t++)e.push(a[t])}}else if(80===i)this.fillObject(e,t);else if(128===i){var n=this._rV();if(t===Z)for(let t=0;t<n;t++)e.set(this.readValue(),this.readValue());else for(let t=0;t<n;t++)e.add(this.readValue())}}fillObject(e,t){t!==$&&(t===R||t===j?this._fillLiteralObj(e):t===H?this._fillDescriptorObj(e):t===G?this._fillMethodObj(e):t===q&&this._fillConstructorObj(e))}_fillLiteralObj(e){var t=this._rV();for(let i=0;i<t;i++)e[this.readValue()]=this.readValue()}_fillDescriptorObj(e){var t=this._rV();for(let a=0;a<t;a++){var i=this.readValue(),s=this.buffer[this.pos++],r={enumerable:!!(1&s),writable:!!(2&s),configurable:!!(4&s)};8&s||16&s?(8&s&&(r.get=this.readValue()),16&s&&(r.set=this.readValue())):r.value=this.readValue(),Object.defineProperty(e,i,r)}}_fillMethodObj(e){var t=this._rV();for(let r=0;r<t;r++){var i=this.readValue();if(this.buffer[this.pos++])if(this.options.allowFunction&&this.options.serializeFunctions){var s=this.readValue();this.readValue();try{e[i]=new Function("return "+s)()}catch(t){e[i]=void 0}}else this.options.serializeFunctions?(this.readValue(),this.readValue(),e[i]=void 0):(this.pos++,e[i]=this.options.allowFunction?function(){throw new Error("Not serialized")}:void 0);else e[i]=this.readValue()}}_fillConstructorObj(e){var t=this.readValue(),i=this._rV();for(let t=0;t<i;t++)e[this.readValue()]=this.readValue();e[Ue]=t}_rNum(e){let t,i=this.pos;switch(e){case d:return t=this.buffer[i]<<24>>24,this.pos=i+1,t;case _:return t=this.view.getInt16(i,!0),this.pos=i+2,t;case u:return t=this.view.getInt32(i,!0),this.pos=i+4,t;case f:return t=this.view.getUint32(i,!0),this.pos=i+4,t;case p:return t=this.view.getFloat32(i,!0),this.pos=i+4,t;case m:return t=this.view.getFloat64(i,!0),this.pos=i+8,t;case y:return NaN;case w:return 1/0;case g:return-1/0;case v:return-0;case b:return t=this._rV(),this.buffer[this.pos++]?-t:t}}_rBigInt(e){if(e===S||e===x){let e=this.view.getBigInt64(this.pos,!0);return this.pos+=8,e}e=e===I;var t=this._rV();let i="";for(let e=t-1;0<=e;e--)i+=this.buffer[this.pos+e].toString(16).padStart(2,"0");this.pos+=t;let s=BigInt("0x"+(i||"0"));return e?-s:s}_rStr(e){if(e===z)return"";var t=this.buffer;let i,r;return i=e===k||e===D||e===M||e===E?this.buffer[this.pos++]:this._rV(),r=(e=e===k||e===D||e===C)&&i<128?s[i](t,this.pos):this.dec.decode(t.subarray(this.pos,this.pos+i)),this.pos+=i,3<r.length&&this._pushStr(r),r}_rPacked(e){var t=this._rV(),i=new Array(t);let s=this.pos;switch(e){case F:for(let e=0;e<t;e++)i[e]=this.buffer[s++]<<24>>24;break;case P:for(let e=0;e<t;e++)i[e]=this.view.getInt16(s,!0),s+=2;break;case O:for(let e=0;e<t;e++)i[e]=this.view.getInt32(s,!0),s+=4;break;case N:for(let e=0;e<t;e++)i[e]=this.view.getFloat32(s,!0),s+=4;break;case K:for(let e=0;e<t;e++)i[e]=this.view.getFloat64(s,!0),s+=8}return this.pos=s,i}_rTypedArr(e){if(this.buffer[this.pos++]){let t=this._rV(),i=this._rV(),s=this._rV();return new xe[e](this.deserializeBuffers[t],i,s)}this._rV();let t=this._rV(),i=Se[e]||1;if(e===W||e===X){var s=[];for(let e=0;e<t;e++)s.push(this.view.getBigInt64(this.pos,!0)),this.pos+=8;return new xe[e](s)}var r=t*i,a=new ArrayBuffer(r);return new Uint8Array(a).set(this.buffer.subarray(this.pos,this.pos+r)),this.pos+=r,this._pushBuf(a),new xe[e](a,0,t)}_rArrayBuf(e){var t=this._rV(),i=this.buffer.buffer.slice(this.buffer.byteOffset+this.pos,this.buffer.byteOffset+this.pos+t);return this.pos+=t,i}_rError(e){var t=this.readValue(),i=this.readValue();let s;if(e===ce){var r=this._rV(),a=[];for(let e=0;e<r;e++)a.push(this.readValue());s=new AggregateError(a,t)}else s=new(Te[e]||Error)(t);return i&&(s.stack=i),s}_rSpecial(e){if(e===ye)return Symbol(this.readValue());if(e===ve)return Symbol();if(e===we)return Symbol.for(this.readValue());if(e===ge)return o.get(this.readValue())||Symbol();throw new Error("Unknown special type: 0x"+e.toString(16))}}(e),this._base64=new Fe.a}get performanceMonitor(){return this._performanceMonitor}get serializer(){return this._serializer}get base64(){return this._base64}async getDatabase(e,t={}){var i;return this._databases.has(e)||(await(i=new gt(e,this._performanceMonitor,this._serializer,this._base64)).init(t),this._databases.set(e,i)),this._databases.get(e)}async getSecureDatabase(e,t,i=null,s={}){return this.getDatabase(e,{pin:t,salt:i,encryptionConfig:s})}async dropDatabase(e){var t;this._databases.has(e)&&(await(t=this._databases.get(e)).clearAll(),t.destroy(),this._databases.delete(e)),["metadata","settings","version","encryption","idb_version","idb_stores","consolidated"].forEach(t=>{localStorage.removeItem(`lacertadb_${e}_`+t)}),new Oe(e,this._serializer,this._base64).clear();var i=[];for(let t=0;t<localStorage.length;t++){var s=localStorage.key(t);s&&s.startsWith(`lacertadb_${e}_`)&&i.push(s)}i.forEach(e=>localStorage.removeItem(e)),await new Promise(t=>{var i=indexedDB.deleteDatabase("lacertadb_"+e);i.onsuccess=t,i.onerror=t,i.onblocked=t})}listDatabases(){var e=new Set;for(let i=0;i<localStorage.length;i++){var t=localStorage.key(i);t&&t.startsWith("lacertadb_")&&(t=t.match(/^lacertadb_([^_]+)_(metadata|settings|version|encryption|quickstore)$/))&&e.add(t[1])}return[...e]}async createBackup(e=null){var t,i={version:"0.12.0",timestamp:Date.now(),databases:{}};for(t of this.listDatabases()){var s=await(await this.getDatabase(t)).export("json");s=this._base64.decode(s);i.databases[t]=this._serializer.deserialize(s)}var r=this._serializer.serialize(i);return e?(e=await(new Xe).encrypt(r,e),this._base64.encode(e)):this._base64.encode(r)}async restoreBackup(e,t=null){let i;try{var s,r=this._base64.decode(e);i=t?(s=await(new Xe).decrypt(r,t),this._serializer.deserialize(s)):this._serializer.deserialize(r)}catch(e){throw new $e("Failed to parse backup data","BACKUP_PARSE_FAILED",e)}var a,n,o={databases:0,collections:0,documents:0};for([a,n]of Object.entries(i.databases)){var h=await this.getDatabase(a),l=this._base64.encode(this._serializer.serialize(n));h=await h.import(l);o.databases++,o.collections+=h.collections,o.documents+=h.documents}return o}close(){for(var e of this._databases.values())e._db&&(e._db.close(),e._db=null)}destroy(){for(var e of this._databases.values())e.destroy();this._databases.clear()}}},function(e,t,i){i.r(t),t=i(1),"undefined"!=typeof window?window.LACERTA=t:self.LACERTA=t}]);