@verdant-web/store 2.7.1 → 2.7.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.
- package/dist/bundle/index.js +7 -7
- package/dist/bundle/index.js.map +3 -3
- package/dist/cjs/metadata/BaselinesStore.js +34 -14
- package/dist/cjs/metadata/BaselinesStore.js.map +1 -1
- package/dist/esm/metadata/BaselinesStore.js +35 -15
- package/dist/esm/metadata/BaselinesStore.js.map +1 -1
- package/dist/tsconfig-cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/metadata/BaselinesStore.ts +33 -14
package/dist/bundle/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../node_modules/.pnpm/cuid@2.1.8/node_modules/cuid/lib/pad.js", "../../../../node_modules/.pnpm/cuid@2.1.8/node_modules/cuid/lib/fingerprint.browser.js", "../../../../node_modules/.pnpm/cuid@2.1.8/node_modules/cuid/lib/getRandomValue.browser.js", "../../../../node_modules/.pnpm/cuid@2.1.8/node_modules/cuid/index.js", "../../../../node_modules/.pnpm/object-hash@3.0.0/node_modules/object-hash/dist/object_hash.js", "../../src/index.ts", "../../../common/src/timestamp.ts", "../../../common/src/files.ts", "../../../../node_modules/.pnpm/uuid@8.3.2/node_modules/uuid/dist/esm-browser/rng.js", "../../../../node_modules/.pnpm/uuid@8.3.2/node_modules/uuid/dist/esm-browser/regex.js", "../../../../node_modules/.pnpm/uuid@8.3.2/node_modules/uuid/dist/esm-browser/validate.js", "../../../../node_modules/.pnpm/uuid@8.3.2/node_modules/uuid/dist/esm-browser/stringify.js", "../../../../node_modules/.pnpm/uuid@8.3.2/node_modules/uuid/dist/esm-browser/v4.js", "../../../common/src/refs.ts", "../../../common/src/utils.ts", "../../../common/src/oids.ts", "../../../common/src/operation.ts", "../../../common/src/schema/fields.ts", "../../../common/src/schema/indexFilters.ts", "../../../common/src/schema/index.ts", "../../../common/src/indexes.ts", "../../../common/src/migration.ts", "../../../common/src/patch.ts", "../../../common/src/EventSubscriber.ts", "../../../common/src/undo.ts", "../../../common/src/batching.ts", "../../src/idb.ts", "../../src/IDBService.ts", "../../src/metadata/AckInfoStore.ts", "../../src/metadata/BaselinesStore.ts", "../../src/metadata/LocalReplicaStore.ts", "../../src/metadata/MessageCreator.ts", "../../src/metadata/OperationsStore.ts", "../../src/metadata/SchemaStore.ts", "../../src/metadata/Metadata.ts", "../../src/metadata/openMetadataDatabase.ts", "../../src/queries/ranges.ts", "../../src/queries/dbQueries.ts", "../../src/migration/db.ts", "../../src/migration/errors.ts", "../../src/migration/paths.ts", "../../src/migration/openDatabase.ts", "../../src/UndoHistory.ts", "../../src/DocumentManager.ts", "../../src/files/EntityFile.ts", "../../src/files/utils.ts", "../../src/files/FileStorage.ts", "../../src/files/FileManager.ts", "../../src/entities/Entity.ts", "../../src/utils/Resolvable.ts", "../../src/entities/DocumentFamiliyCache.ts", "../../src/entities/EntityStore.ts", "../../src/sync/PresenceManager.ts", "../../src/sync/FileSync.ts", "../../src/sync/Heartbeat.ts", "../../src/sync/PushPullSync.ts", "../../../../node_modules/.pnpm/jwt-decode@3.1.2/node_modules/jwt-decode/lib/atob.js", "../../../../node_modules/.pnpm/jwt-decode@3.1.2/node_modules/jwt-decode/lib/base64_url_decode.js", "../../../../node_modules/.pnpm/jwt-decode@3.1.2/node_modules/jwt-decode/lib/index.js", "../../src/sync/ServerSyncEndpointProvider.ts", "../../src/BackoffScheduler.ts", "../../src/sync/WebSocketSync.ts", "../../src/sync/Sync.ts", "../../src/utils/Disposable.ts", "../../src/queries/utils.ts", "../../src/queries/BaseQuery.ts", "../../src/queries/GetQuery.ts", "../../src/queries/FindOneQuery.ts", "../../src/queries/FindPageQuery.ts", "../../src/queries/FindInfiniteQuery.ts", "../../src/queries/FindAllQuery.ts", "../../src/queries/CollectionQueries.ts", "../../src/queries/QueryCache.ts", "../../src/client/Client.ts", "../../src/FakeWeakRef.ts", "../../src/client/ClientDescriptor.ts", "../../src/vanilla.ts"],
|
|
4
|
-
"sourcesContent": ["module.exports = function pad (num, size) {\n var s = '000000000' + num;\n return s.substr(s.length - size);\n};\n", "var pad = require('./pad.js');\n\nvar env = typeof window === 'object' ? window : self;\nvar globalCount = Object.keys(env).length;\nvar mimeTypesLength = navigator.mimeTypes ? navigator.mimeTypes.length : 0;\nvar clientId = pad((mimeTypesLength +\n navigator.userAgent.length).toString(36) +\n globalCount.toString(36), 4);\n\nmodule.exports = function fingerprint () {\n return clientId;\n};\n", "\nvar getRandomValue;\n\nvar crypto = typeof window !== 'undefined' &&\n (window.crypto || window.msCrypto) ||\n typeof self !== 'undefined' &&\n self.crypto;\n\nif (crypto) {\n var lim = Math.pow(2, 32) - 1;\n getRandomValue = function () {\n return Math.abs(crypto.getRandomValues(new Uint32Array(1))[0] / lim);\n };\n} else {\n getRandomValue = Math.random;\n}\n\nmodule.exports = getRandomValue;\n", "/**\n * cuid.js\n * Collision-resistant UID generator for browsers and node.\n * Sequential for fast db lookups and recency sorting.\n * Safe for element IDs and server-side lookups.\n *\n * Extracted from CLCTR\n *\n * Copyright (c) Eric Elliott 2012\n * MIT License\n */\n\nvar fingerprint = require('./lib/fingerprint.js');\nvar pad = require('./lib/pad.js');\nvar getRandomValue = require('./lib/getRandomValue.js');\n\nvar c = 0,\n blockSize = 4,\n base = 36,\n discreteValues = Math.pow(base, blockSize);\n\nfunction randomBlock () {\n return pad((getRandomValue() *\n discreteValues << 0)\n .toString(base), blockSize);\n}\n\nfunction safeCounter () {\n c = c < discreteValues ? c : 0;\n c++; // this is not subliminal\n return c - 1;\n}\n\nfunction cuid () {\n // Starting with a lowercase letter makes\n // it HTML element ID friendly.\n var letter = 'c', // hard-coded allows for sequential access\n\n // timestamp\n // warning: this exposes the exact date and time\n // that the uid was created.\n timestamp = (new Date().getTime()).toString(base),\n\n // Prevent same-machine collisions.\n counter = pad(safeCounter().toString(base), blockSize),\n\n // A few chars to generate distinct ids for different\n // clients (so different computers are far less\n // likely to generate the same id)\n print = fingerprint(),\n\n // Grab some more chars from Math.random()\n random = randomBlock() + randomBlock();\n\n return letter + timestamp + counter + print + random;\n}\n\ncuid.slug = function slug () {\n var date = new Date().getTime().toString(36),\n counter = safeCounter().toString(36).slice(-4),\n print = fingerprint().slice(0, 1) +\n fingerprint().slice(-1),\n random = randomBlock().slice(-2);\n\n return date.slice(-2) +\n counter + print + random;\n};\n\ncuid.isCuid = function isCuid (stringToCheck) {\n if (typeof stringToCheck !== 'string') return false;\n if (stringToCheck.startsWith('c')) return true;\n return false;\n};\n\ncuid.isSlug = function isSlug (stringToCheck) {\n if (typeof stringToCheck !== 'string') return false;\n var stringLength = stringToCheck.length;\n if (stringLength >= 7 && stringLength <= 10) return true;\n return false;\n};\n\ncuid.fingerprint = fingerprint;\n\nmodule.exports = cuid;\n", "!function(e){var t;\"object\"==typeof exports?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(\"undefined\"!=typeof window?t=window:\"undefined\"!=typeof global?t=global:\"undefined\"!=typeof self&&(t=self),t.objectHash=e())}(function(){return function r(o,i,u){function s(n,e){if(!i[n]){if(!o[n]){var t=\"function\"==typeof require&&require;if(!e&&t)return t(n,!0);if(a)return a(n,!0);throw new Error(\"Cannot find module '\"+n+\"'\")}e=i[n]={exports:{}};o[n][0].call(e.exports,function(e){var t=o[n][1][e];return s(t||e)},e,e.exports,r,o,i,u)}return i[n].exports}for(var a=\"function\"==typeof require&&require,e=0;e<u.length;e++)s(u[e]);return s}({1:[function(w,b,m){!function(e,n,s,c,d,h,p,g,y){\"use strict\";var r=w(\"crypto\");function t(e,t){t=u(e,t);var n;return void 0===(n=\"passthrough\"!==t.algorithm?r.createHash(t.algorithm):new l).write&&(n.write=n.update,n.end=n.update),f(t,n).dispatch(e),n.update||n.end(\"\"),n.digest?n.digest(\"buffer\"===t.encoding?void 0:t.encoding):(e=n.read(),\"buffer\"!==t.encoding?e.toString(t.encoding):e)}(m=b.exports=t).sha1=function(e){return t(e)},m.keys=function(e){return t(e,{excludeValues:!0,algorithm:\"sha1\",encoding:\"hex\"})},m.MD5=function(e){return t(e,{algorithm:\"md5\",encoding:\"hex\"})},m.keysMD5=function(e){return t(e,{algorithm:\"md5\",encoding:\"hex\",excludeValues:!0})};var o=r.getHashes?r.getHashes().slice():[\"sha1\",\"md5\"],i=(o.push(\"passthrough\"),[\"buffer\",\"hex\",\"binary\",\"base64\"]);function u(e,t){var n={};if(n.algorithm=(t=t||{}).algorithm||\"sha1\",n.encoding=t.encoding||\"hex\",n.excludeValues=!!t.excludeValues,n.algorithm=n.algorithm.toLowerCase(),n.encoding=n.encoding.toLowerCase(),n.ignoreUnknown=!0===t.ignoreUnknown,n.respectType=!1!==t.respectType,n.respectFunctionNames=!1!==t.respectFunctionNames,n.respectFunctionProperties=!1!==t.respectFunctionProperties,n.unorderedArrays=!0===t.unorderedArrays,n.unorderedSets=!1!==t.unorderedSets,n.unorderedObjects=!1!==t.unorderedObjects,n.replacer=t.replacer||void 0,n.excludeKeys=t.excludeKeys||void 0,void 0===e)throw new Error(\"Object argument required.\");for(var r=0;r<o.length;++r)o[r].toLowerCase()===n.algorithm.toLowerCase()&&(n.algorithm=o[r]);if(-1===o.indexOf(n.algorithm))throw new Error('Algorithm \"'+n.algorithm+'\" not supported. supported values: '+o.join(\", \"));if(-1===i.indexOf(n.encoding)&&\"passthrough\"!==n.algorithm)throw new Error('Encoding \"'+n.encoding+'\" not supported. supported values: '+i.join(\", \"));return n}function a(e){if(\"function\"==typeof e)return null!=/^function\\s+\\w*\\s*\\(\\s*\\)\\s*{\\s+\\[native code\\]\\s+}$/i.exec(Function.prototype.toString.call(e))}function f(o,t,i){i=i||[];function u(e){return t.update?t.update(e,\"utf8\"):t.write(e,\"utf8\")}return{dispatch:function(e){return this[\"_\"+(null===(e=o.replacer?o.replacer(e):e)?\"null\":typeof e)](e)},_object:function(t){var n,e=Object.prototype.toString.call(t),r=/\\[object (.*)\\]/i.exec(e);r=(r=r?r[1]:\"unknown:[\"+e+\"]\").toLowerCase();if(0<=(e=i.indexOf(t)))return this.dispatch(\"[CIRCULAR:\"+e+\"]\");if(i.push(t),void 0!==s&&s.isBuffer&&s.isBuffer(t))return u(\"buffer:\"),u(t);if(\"object\"===r||\"function\"===r||\"asyncfunction\"===r)return e=Object.keys(t),o.unorderedObjects&&(e=e.sort()),!1===o.respectType||a(t)||e.splice(0,0,\"prototype\",\"__proto__\",\"constructor\"),o.excludeKeys&&(e=e.filter(function(e){return!o.excludeKeys(e)})),u(\"object:\"+e.length+\":\"),n=this,e.forEach(function(e){n.dispatch(e),u(\":\"),o.excludeValues||n.dispatch(t[e]),u(\",\")});if(!this[\"_\"+r]){if(o.ignoreUnknown)return u(\"[\"+r+\"]\");throw new Error('Unknown object type \"'+r+'\"')}this[\"_\"+r](t)},_array:function(e,t){t=void 0!==t?t:!1!==o.unorderedArrays;var n=this;if(u(\"array:\"+e.length+\":\"),!t||e.length<=1)return e.forEach(function(e){return n.dispatch(e)});var r=[],t=e.map(function(e){var t=new l,n=i.slice();return f(o,t,n).dispatch(e),r=r.concat(n.slice(i.length)),t.read().toString()});return i=i.concat(r),t.sort(),this._array(t,!1)},_date:function(e){return u(\"date:\"+e.toJSON())},_symbol:function(e){return u(\"symbol:\"+e.toString())},_error:function(e){return u(\"error:\"+e.toString())},_boolean:function(e){return u(\"bool:\"+e.toString())},_string:function(e){u(\"string:\"+e.length+\":\"),u(e.toString())},_function:function(e){u(\"fn:\"),a(e)?this.dispatch(\"[native]\"):this.dispatch(e.toString()),!1!==o.respectFunctionNames&&this.dispatch(\"function-name:\"+String(e.name)),o.respectFunctionProperties&&this._object(e)},_number:function(e){return u(\"number:\"+e.toString())},_xml:function(e){return u(\"xml:\"+e.toString())},_null:function(){return u(\"Null\")},_undefined:function(){return u(\"Undefined\")},_regexp:function(e){return u(\"regex:\"+e.toString())},_uint8array:function(e){return u(\"uint8array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint8clampedarray:function(e){return u(\"uint8clampedarray:\"),this.dispatch(Array.prototype.slice.call(e))},_int8array:function(e){return u(\"int8array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint16array:function(e){return u(\"uint16array:\"),this.dispatch(Array.prototype.slice.call(e))},_int16array:function(e){return u(\"int16array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint32array:function(e){return u(\"uint32array:\"),this.dispatch(Array.prototype.slice.call(e))},_int32array:function(e){return u(\"int32array:\"),this.dispatch(Array.prototype.slice.call(e))},_float32array:function(e){return u(\"float32array:\"),this.dispatch(Array.prototype.slice.call(e))},_float64array:function(e){return u(\"float64array:\"),this.dispatch(Array.prototype.slice.call(e))},_arraybuffer:function(e){return u(\"arraybuffer:\"),this.dispatch(new Uint8Array(e))},_url:function(e){return u(\"url:\"+e.toString())},_map:function(e){u(\"map:\");e=Array.from(e);return this._array(e,!1!==o.unorderedSets)},_set:function(e){u(\"set:\");e=Array.from(e);return this._array(e,!1!==o.unorderedSets)},_file:function(e){return u(\"file:\"),this.dispatch([e.name,e.size,e.type,e.lastModfied])},_blob:function(){if(o.ignoreUnknown)return u(\"[blob]\");throw Error('Hashing Blob objects is currently not supported\\n(see https://github.com/puleos/object-hash/issues/26)\\nUse \"options.replacer\" or \"options.ignoreUnknown\"\\n')},_domwindow:function(){return u(\"domwindow\")},_bigint:function(e){return u(\"bigint:\"+e.toString())},_process:function(){return u(\"process\")},_timer:function(){return u(\"timer\")},_pipe:function(){return u(\"pipe\")},_tcp:function(){return u(\"tcp\")},_udp:function(){return u(\"udp\")},_tty:function(){return u(\"tty\")},_statwatcher:function(){return u(\"statwatcher\")},_securecontext:function(){return u(\"securecontext\")},_connection:function(){return u(\"connection\")},_zlib:function(){return u(\"zlib\")},_context:function(){return u(\"context\")},_nodescript:function(){return u(\"nodescript\")},_httpparser:function(){return u(\"httpparser\")},_dataview:function(){return u(\"dataview\")},_signal:function(){return u(\"signal\")},_fsevent:function(){return u(\"fsevent\")},_tlswrap:function(){return u(\"tlswrap\")}}}function l(){return{buf:\"\",write:function(e){this.buf+=e},end:function(e){this.buf+=e},read:function(){return this.buf}}}m.writeToStream=function(e,t,n){return void 0===n&&(n=t,t={}),f(t=u(e,t),n).dispatch(e)}}.call(this,w(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},w(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/fake_9a5aa49d.js\",\"/\")},{buffer:3,crypto:5,lYpoI2:11}],2:[function(e,t,f){!function(e,t,n,r,o,i,u,s,a){!function(e){\"use strict\";var a=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,t=\"+\".charCodeAt(0),n=\"/\".charCodeAt(0),r=\"0\".charCodeAt(0),o=\"a\".charCodeAt(0),i=\"A\".charCodeAt(0),u=\"-\".charCodeAt(0),s=\"_\".charCodeAt(0);function f(e){e=e.charCodeAt(0);return e===t||e===u?62:e===n||e===s?63:e<r?-1:e<r+10?e-r+26+26:e<i+26?e-i:e<o+26?e-o+26:void 0}e.toByteArray=function(e){var t,n;if(0<e.length%4)throw new Error(\"Invalid string. Length must be a multiple of 4\");var r=e.length,r=\"=\"===e.charAt(r-2)?2:\"=\"===e.charAt(r-1)?1:0,o=new a(3*e.length/4-r),i=0<r?e.length-4:e.length,u=0;function s(e){o[u++]=e}for(t=0;t<i;t+=4,0)s((16711680&(n=f(e.charAt(t))<<18|f(e.charAt(t+1))<<12|f(e.charAt(t+2))<<6|f(e.charAt(t+3))))>>16),s((65280&n)>>8),s(255&n);return 2==r?s(255&(n=f(e.charAt(t))<<2|f(e.charAt(t+1))>>4)):1==r&&(s((n=f(e.charAt(t))<<10|f(e.charAt(t+1))<<4|f(e.charAt(t+2))>>2)>>8&255),s(255&n)),o},e.fromByteArray=function(e){var t,n,r,o,i=e.length%3,u=\"\";function s(e){return\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(e)}for(t=0,r=e.length-i;t<r;t+=3)n=(e[t]<<16)+(e[t+1]<<8)+e[t+2],u+=s((o=n)>>18&63)+s(o>>12&63)+s(o>>6&63)+s(63&o);switch(i){case 1:u=(u+=s((n=e[e.length-1])>>2))+s(n<<4&63)+\"==\";break;case 2:u=(u=(u+=s((n=(e[e.length-2]<<8)+e[e.length-1])>>10))+s(n>>4&63))+s(n<<2&63)+\"=\"}return u}}(void 0===f?this.base64js={}:f)}.call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/base64-js/lib/b64.js\",\"/node_modules/gulp-browserify/node_modules/base64-js/lib\")},{buffer:3,lYpoI2:11}],3:[function(O,e,H){!function(e,n,f,r,h,p,g,y,w){var a=O(\"base64-js\"),i=O(\"ieee754\");function f(e,t,n){if(!(this instanceof f))return new f(e,t,n);var r,o,i,u,s=typeof e;if(\"base64\"===t&&\"string\"==s)for(e=(u=e).trim?u.trim():u.replace(/^\\s+|\\s+$/g,\"\");e.length%4!=0;)e+=\"=\";if(\"number\"==s)r=j(e);else if(\"string\"==s)r=f.byteLength(e,t);else{if(\"object\"!=s)throw new Error(\"First argument needs to be a number, array or string.\");r=j(e.length)}if(f._useTypedArrays?o=f._augment(new Uint8Array(r)):((o=this).length=r,o._isBuffer=!0),f._useTypedArrays&&\"number\"==typeof e.byteLength)o._set(e);else if(C(u=e)||f.isBuffer(u)||u&&\"object\"==typeof u&&\"number\"==typeof u.length)for(i=0;i<r;i++)f.isBuffer(e)?o[i]=e.readUInt8(i):o[i]=e[i];else if(\"string\"==s)o.write(e,0,t);else if(\"number\"==s&&!f._useTypedArrays&&!n)for(i=0;i<r;i++)o[i]=0;return o}function b(e,t,n,r){return f._charsWritten=c(function(e){for(var t=[],n=0;n<e.length;n++)t.push(255&e.charCodeAt(n));return t}(t),e,n,r)}function m(e,t,n,r){return f._charsWritten=c(function(e){for(var t,n,r=[],o=0;o<e.length;o++)n=e.charCodeAt(o),t=n>>8,n=n%256,r.push(n),r.push(t);return r}(t),e,n,r)}function v(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var o=t;o<n;o++)r+=String.fromCharCode(e[o]);return r}function o(e,t,n,r){r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(null!=t,\"missing offset\"),d(t+1<e.length,\"Trying to read beyond buffer length\"));var o,r=e.length;if(!(r<=t))return n?(o=e[t],t+1<r&&(o|=e[t+1]<<8)):(o=e[t]<<8,t+1<r&&(o|=e[t+1])),o}function u(e,t,n,r){r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(null!=t,\"missing offset\"),d(t+3<e.length,\"Trying to read beyond buffer length\"));var o,r=e.length;if(!(r<=t))return n?(t+2<r&&(o=e[t+2]<<16),t+1<r&&(o|=e[t+1]<<8),o|=e[t],t+3<r&&(o+=e[t+3]<<24>>>0)):(t+1<r&&(o=e[t+1]<<16),t+2<r&&(o|=e[t+2]<<8),t+3<r&&(o|=e[t+3]),o+=e[t]<<24>>>0),o}function _(e,t,n,r){if(r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(null!=t,\"missing offset\"),d(t+1<e.length,\"Trying to read beyond buffer length\")),!(e.length<=t))return r=o(e,t,n,!0),32768&r?-1*(65535-r+1):r}function E(e,t,n,r){if(r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(null!=t,\"missing offset\"),d(t+3<e.length,\"Trying to read beyond buffer length\")),!(e.length<=t))return r=u(e,t,n,!0),2147483648&r?-1*(4294967295-r+1):r}function I(e,t,n,r){return r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(t+3<e.length,\"Trying to read beyond buffer length\")),i.read(e,t,n,23,4)}function A(e,t,n,r){return r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(t+7<e.length,\"Trying to read beyond buffer length\")),i.read(e,t,n,52,8)}function s(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+1<e.length,\"trying to write beyond buffer length\"),Y(t,65535));o=e.length;if(!(o<=n))for(var i=0,u=Math.min(o-n,2);i<u;i++)e[n+i]=(t&255<<8*(r?i:1-i))>>>8*(r?i:1-i)}function l(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+3<e.length,\"trying to write beyond buffer length\"),Y(t,4294967295));o=e.length;if(!(o<=n))for(var i=0,u=Math.min(o-n,4);i<u;i++)e[n+i]=t>>>8*(r?i:3-i)&255}function B(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+1<e.length,\"Trying to write beyond buffer length\"),F(t,32767,-32768)),e.length<=n||s(e,0<=t?t:65535+t+1,n,r,o)}function L(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+3<e.length,\"Trying to write beyond buffer length\"),F(t,2147483647,-2147483648)),e.length<=n||l(e,0<=t?t:4294967295+t+1,n,r,o)}function U(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+3<e.length,\"Trying to write beyond buffer length\"),D(t,34028234663852886e22,-34028234663852886e22)),e.length<=n||i.write(e,t,n,r,23,4)}function x(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+7<e.length,\"Trying to write beyond buffer length\"),D(t,17976931348623157e292,-17976931348623157e292)),e.length<=n||i.write(e,t,n,r,52,8)}H.Buffer=f,H.SlowBuffer=f,H.INSPECT_MAX_BYTES=50,f.poolSize=8192,f._useTypedArrays=function(){try{var e=new ArrayBuffer(0),t=new Uint8Array(e);return t.foo=function(){return 42},42===t.foo()&&\"function\"==typeof t.subarray}catch(e){return!1}}(),f.isEncoding=function(e){switch(String(e).toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"raw\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return!0;default:return!1}},f.isBuffer=function(e){return!(null==e||!e._isBuffer)},f.byteLength=function(e,t){var n;switch(e+=\"\",t||\"utf8\"){case\"hex\":n=e.length/2;break;case\"utf8\":case\"utf-8\":n=T(e).length;break;case\"ascii\":case\"binary\":case\"raw\":n=e.length;break;case\"base64\":n=M(e).length;break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":n=2*e.length;break;default:throw new Error(\"Unknown encoding\")}return n},f.concat=function(e,t){if(d(C(e),\"Usage: Buffer.concat(list, [totalLength])\\nlist should be an Array.\"),0===e.length)return new f(0);if(1===e.length)return e[0];if(\"number\"!=typeof t)for(o=t=0;o<e.length;o++)t+=e[o].length;for(var n=new f(t),r=0,o=0;o<e.length;o++){var i=e[o];i.copy(n,r),r+=i.length}return n},f.prototype.write=function(e,t,n,r){isFinite(t)?isFinite(n)||(r=n,n=void 0):(a=r,r=t,t=n,n=a),t=Number(t)||0;var o,i,u,s,a=this.length-t;switch((!n||a<(n=Number(n)))&&(n=a),r=String(r||\"utf8\").toLowerCase()){case\"hex\":o=function(e,t,n,r){n=Number(n)||0;var o=e.length-n;(!r||o<(r=Number(r)))&&(r=o),d((o=t.length)%2==0,\"Invalid hex string\"),o/2<r&&(r=o/2);for(var i=0;i<r;i++){var u=parseInt(t.substr(2*i,2),16);d(!isNaN(u),\"Invalid hex string\"),e[n+i]=u}return f._charsWritten=2*i,i}(this,e,t,n);break;case\"utf8\":case\"utf-8\":i=this,u=t,s=n,o=f._charsWritten=c(T(e),i,u,s);break;case\"ascii\":case\"binary\":o=b(this,e,t,n);break;case\"base64\":i=this,u=t,s=n,o=f._charsWritten=c(M(e),i,u,s);break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":o=m(this,e,t,n);break;default:throw new Error(\"Unknown encoding\")}return o},f.prototype.toString=function(e,t,n){var r,o,i,u,s=this;if(e=String(e||\"utf8\").toLowerCase(),t=Number(t)||0,(n=void 0!==n?Number(n):s.length)===t)return\"\";switch(e){case\"hex\":r=function(e,t,n){var r=e.length;(!t||t<0)&&(t=0);(!n||n<0||r<n)&&(n=r);for(var o=\"\",i=t;i<n;i++)o+=k(e[i]);return o}(s,t,n);break;case\"utf8\":case\"utf-8\":r=function(e,t,n){var r=\"\",o=\"\";n=Math.min(e.length,n);for(var i=t;i<n;i++)e[i]<=127?(r+=N(o)+String.fromCharCode(e[i]),o=\"\"):o+=\"%\"+e[i].toString(16);return r+N(o)}(s,t,n);break;case\"ascii\":case\"binary\":r=v(s,t,n);break;case\"base64\":o=s,u=n,r=0===(i=t)&&u===o.length?a.fromByteArray(o):a.fromByteArray(o.slice(i,u));break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":r=function(e,t,n){for(var r=e.slice(t,n),o=\"\",i=0;i<r.length;i+=2)o+=String.fromCharCode(r[i]+256*r[i+1]);return o}(s,t,n);break;default:throw new Error(\"Unknown encoding\")}return r},f.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}},f.prototype.copy=function(e,t,n,r){if(t=t||0,(r=r||0===r?r:this.length)!==(n=n||0)&&0!==e.length&&0!==this.length){d(n<=r,\"sourceEnd < sourceStart\"),d(0<=t&&t<e.length,\"targetStart out of bounds\"),d(0<=n&&n<this.length,\"sourceStart out of bounds\"),d(0<=r&&r<=this.length,\"sourceEnd out of bounds\"),r>this.length&&(r=this.length);var o=(r=e.length-t<r-n?e.length-t+n:r)-n;if(o<100||!f._useTypedArrays)for(var i=0;i<o;i++)e[i+t]=this[i+n];else e._set(this.subarray(n,n+o),t)}},f.prototype.slice=function(e,t){var n=this.length;if(e=S(e,n,0),t=S(t,n,n),f._useTypedArrays)return f._augment(this.subarray(e,t));for(var r=t-e,o=new f(r,void 0,!0),i=0;i<r;i++)o[i]=this[i+e];return o},f.prototype.get=function(e){return console.log(\".get() is deprecated. Access using array indexes instead.\"),this.readUInt8(e)},f.prototype.set=function(e,t){return console.log(\".set() is deprecated. Access using array indexes instead.\"),this.writeUInt8(e,t)},f.prototype.readUInt8=function(e,t){if(t||(d(null!=e,\"missing offset\"),d(e<this.length,\"Trying to read beyond buffer length\")),!(e>=this.length))return this[e]},f.prototype.readUInt16LE=function(e,t){return o(this,e,!0,t)},f.prototype.readUInt16BE=function(e,t){return o(this,e,!1,t)},f.prototype.readUInt32LE=function(e,t){return u(this,e,!0,t)},f.prototype.readUInt32BE=function(e,t){return u(this,e,!1,t)},f.prototype.readInt8=function(e,t){if(t||(d(null!=e,\"missing offset\"),d(e<this.length,\"Trying to read beyond buffer length\")),!(e>=this.length))return 128&this[e]?-1*(255-this[e]+1):this[e]},f.prototype.readInt16LE=function(e,t){return _(this,e,!0,t)},f.prototype.readInt16BE=function(e,t){return _(this,e,!1,t)},f.prototype.readInt32LE=function(e,t){return E(this,e,!0,t)},f.prototype.readInt32BE=function(e,t){return E(this,e,!1,t)},f.prototype.readFloatLE=function(e,t){return I(this,e,!0,t)},f.prototype.readFloatBE=function(e,t){return I(this,e,!1,t)},f.prototype.readDoubleLE=function(e,t){return A(this,e,!0,t)},f.prototype.readDoubleBE=function(e,t){return A(this,e,!1,t)},f.prototype.writeUInt8=function(e,t,n){n||(d(null!=e,\"missing value\"),d(null!=t,\"missing offset\"),d(t<this.length,\"trying to write beyond buffer length\"),Y(e,255)),t>=this.length||(this[t]=e)},f.prototype.writeUInt16LE=function(e,t,n){s(this,e,t,!0,n)},f.prototype.writeUInt16BE=function(e,t,n){s(this,e,t,!1,n)},f.prototype.writeUInt32LE=function(e,t,n){l(this,e,t,!0,n)},f.prototype.writeUInt32BE=function(e,t,n){l(this,e,t,!1,n)},f.prototype.writeInt8=function(e,t,n){n||(d(null!=e,\"missing value\"),d(null!=t,\"missing offset\"),d(t<this.length,\"Trying to write beyond buffer length\"),F(e,127,-128)),t>=this.length||(0<=e?this.writeUInt8(e,t,n):this.writeUInt8(255+e+1,t,n))},f.prototype.writeInt16LE=function(e,t,n){B(this,e,t,!0,n)},f.prototype.writeInt16BE=function(e,t,n){B(this,e,t,!1,n)},f.prototype.writeInt32LE=function(e,t,n){L(this,e,t,!0,n)},f.prototype.writeInt32BE=function(e,t,n){L(this,e,t,!1,n)},f.prototype.writeFloatLE=function(e,t,n){U(this,e,t,!0,n)},f.prototype.writeFloatBE=function(e,t,n){U(this,e,t,!1,n)},f.prototype.writeDoubleLE=function(e,t,n){x(this,e,t,!0,n)},f.prototype.writeDoubleBE=function(e,t,n){x(this,e,t,!1,n)},f.prototype.fill=function(e,t,n){if(t=t||0,n=n||this.length,d(\"number\"==typeof(e=\"string\"==typeof(e=e||0)?e.charCodeAt(0):e)&&!isNaN(e),\"value is not a number\"),d(t<=n,\"end < start\"),n!==t&&0!==this.length){d(0<=t&&t<this.length,\"start out of bounds\"),d(0<=n&&n<=this.length,\"end out of bounds\");for(var r=t;r<n;r++)this[r]=e}},f.prototype.inspect=function(){for(var e=[],t=this.length,n=0;n<t;n++)if(e[n]=k(this[n]),n===H.INSPECT_MAX_BYTES){e[n+1]=\"...\";break}return\"<Buffer \"+e.join(\" \")+\">\"},f.prototype.toArrayBuffer=function(){if(\"undefined\"==typeof Uint8Array)throw new Error(\"Buffer.toArrayBuffer not supported in this browser\");if(f._useTypedArrays)return new f(this).buffer;for(var e=new Uint8Array(this.length),t=0,n=e.length;t<n;t+=1)e[t]=this[t];return e.buffer};var t=f.prototype;function S(e,t,n){return\"number\"!=typeof e?n:t<=(e=~~e)?t:0<=e||0<=(e+=t)?e:0}function j(e){return(e=~~Math.ceil(+e))<0?0:e}function C(e){return(Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)})(e)}function k(e){return e<16?\"0\"+e.toString(16):e.toString(16)}function T(e){for(var t=[],n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<=127)t.push(e.charCodeAt(n));else for(var o=n,i=(55296<=r&&r<=57343&&n++,encodeURIComponent(e.slice(o,n+1)).substr(1).split(\"%\")),u=0;u<i.length;u++)t.push(parseInt(i[u],16))}return t}function M(e){return a.toByteArray(e)}function c(e,t,n,r){for(var o=0;o<r&&!(o+n>=t.length||o>=e.length);o++)t[o+n]=e[o];return o}function N(e){try{return decodeURIComponent(e)}catch(e){return String.fromCharCode(65533)}}function Y(e,t){d(\"number\"==typeof e,\"cannot write a non-number as a number\"),d(0<=e,\"specified a negative value for writing an unsigned value\"),d(e<=t,\"value is larger than maximum value for type\"),d(Math.floor(e)===e,\"value has a fractional component\")}function F(e,t,n){d(\"number\"==typeof e,\"cannot write a non-number as a number\"),d(e<=t,\"value larger than maximum allowed value\"),d(n<=e,\"value smaller than minimum allowed value\"),d(Math.floor(e)===e,\"value has a fractional component\")}function D(e,t,n){d(\"number\"==typeof e,\"cannot write a non-number as a number\"),d(e<=t,\"value larger than maximum allowed value\"),d(n<=e,\"value smaller than minimum allowed value\")}function d(e,t){if(!e)throw new Error(t||\"Failed assertion\")}f._augment=function(e){return e._isBuffer=!0,e._get=e.get,e._set=e.set,e.get=t.get,e.set=t.set,e.write=t.write,e.toString=t.toString,e.toLocaleString=t.toString,e.toJSON=t.toJSON,e.copy=t.copy,e.slice=t.slice,e.readUInt8=t.readUInt8,e.readUInt16LE=t.readUInt16LE,e.readUInt16BE=t.readUInt16BE,e.readUInt32LE=t.readUInt32LE,e.readUInt32BE=t.readUInt32BE,e.readInt8=t.readInt8,e.readInt16LE=t.readInt16LE,e.readInt16BE=t.readInt16BE,e.readInt32LE=t.readInt32LE,e.readInt32BE=t.readInt32BE,e.readFloatLE=t.readFloatLE,e.readFloatBE=t.readFloatBE,e.readDoubleLE=t.readDoubleLE,e.readDoubleBE=t.readDoubleBE,e.writeUInt8=t.writeUInt8,e.writeUInt16LE=t.writeUInt16LE,e.writeUInt16BE=t.writeUInt16BE,e.writeUInt32LE=t.writeUInt32LE,e.writeUInt32BE=t.writeUInt32BE,e.writeInt8=t.writeInt8,e.writeInt16LE=t.writeInt16LE,e.writeInt16BE=t.writeInt16BE,e.writeInt32LE=t.writeInt32LE,e.writeInt32BE=t.writeInt32BE,e.writeFloatLE=t.writeFloatLE,e.writeFloatBE=t.writeFloatBE,e.writeDoubleLE=t.writeDoubleLE,e.writeDoubleBE=t.writeDoubleBE,e.fill=t.fill,e.inspect=t.inspect,e.toArrayBuffer=t.toArrayBuffer,e}}.call(this,O(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},O(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/buffer/index.js\",\"/node_modules/gulp-browserify/node_modules/buffer\")},{\"base64-js\":2,buffer:3,ieee754:10,lYpoI2:11}],4:[function(c,d,e){!function(e,t,a,n,r,o,i,u,s){var a=c(\"buffer\").Buffer,f=4,l=new a(f);l.fill(0);d.exports={hash:function(e,t,n,r){for(var o=t(function(e,t){e.length%f!=0&&(n=e.length+(f-e.length%f),e=a.concat([e,l],n));for(var n,r=[],o=t?e.readInt32BE:e.readInt32LE,i=0;i<e.length;i+=f)r.push(o.call(e,i));return r}(e=a.isBuffer(e)?e:new a(e),r),8*e.length),t=r,i=new a(n),u=t?i.writeInt32BE:i.writeInt32LE,s=0;s<o.length;s++)u.call(i,o[s],4*s,!0);return i}}}.call(this,c(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},c(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/helpers.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{buffer:3,lYpoI2:11}],5:[function(v,e,_){!function(l,c,u,d,h,p,g,y,w){var u=v(\"buffer\").Buffer,e=v(\"./sha\"),t=v(\"./sha256\"),n=v(\"./rng\"),b={sha1:e,sha256:t,md5:v(\"./md5\")},s=64,a=new u(s);function r(e,n){var r=b[e=e||\"sha1\"],o=[];return r||i(\"algorithm:\",e,\"is not yet supported\"),{update:function(e){return u.isBuffer(e)||(e=new u(e)),o.push(e),e.length,this},digest:function(e){var t=u.concat(o),t=n?function(e,t,n){u.isBuffer(t)||(t=new u(t)),u.isBuffer(n)||(n=new u(n)),t.length>s?t=e(t):t.length<s&&(t=u.concat([t,a],s));for(var r=new u(s),o=new u(s),i=0;i<s;i++)r[i]=54^t[i],o[i]=92^t[i];return n=e(u.concat([r,n])),e(u.concat([o,n]))}(r,n,t):r(t);return o=null,e?t.toString(e):t}}}function i(){var e=[].slice.call(arguments).join(\" \");throw new Error([e,\"we accept pull requests\",\"http://github.com/dominictarr/crypto-browserify\"].join(\"\\n\"))}a.fill(0),_.createHash=function(e){return r(e)},_.createHmac=r,_.randomBytes=function(e,t){if(!t||!t.call)return new u(n(e));try{t.call(this,void 0,new u(n(e)))}catch(e){t(e)}};var o,f=[\"createCredentials\",\"createCipher\",\"createCipheriv\",\"createDecipher\",\"createDecipheriv\",\"createSign\",\"createVerify\",\"createDiffieHellman\",\"pbkdf2\"],m=function(e){_[e]=function(){i(\"sorry,\",e,\"is not implemented yet\")}};for(o in f)m(f[o],o)}.call(this,v(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},v(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/index.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./md5\":6,\"./rng\":7,\"./sha\":8,\"./sha256\":9,buffer:3,lYpoI2:11}],6:[function(w,b,e){!function(e,r,o,i,u,a,f,l,y){var t=w(\"./helpers\");function n(e,t){e[t>>5]|=128<<t%32,e[14+(t+64>>>9<<4)]=t;for(var n=1732584193,r=-271733879,o=-1732584194,i=271733878,u=0;u<e.length;u+=16){var s=n,a=r,f=o,l=i,n=c(n,r,o,i,e[u+0],7,-680876936),i=c(i,n,r,o,e[u+1],12,-389564586),o=c(o,i,n,r,e[u+2],17,606105819),r=c(r,o,i,n,e[u+3],22,-1044525330);n=c(n,r,o,i,e[u+4],7,-176418897),i=c(i,n,r,o,e[u+5],12,1200080426),o=c(o,i,n,r,e[u+6],17,-1473231341),r=c(r,o,i,n,e[u+7],22,-45705983),n=c(n,r,o,i,e[u+8],7,1770035416),i=c(i,n,r,o,e[u+9],12,-1958414417),o=c(o,i,n,r,e[u+10],17,-42063),r=c(r,o,i,n,e[u+11],22,-1990404162),n=c(n,r,o,i,e[u+12],7,1804603682),i=c(i,n,r,o,e[u+13],12,-40341101),o=c(o,i,n,r,e[u+14],17,-1502002290),n=d(n,r=c(r,o,i,n,e[u+15],22,1236535329),o,i,e[u+1],5,-165796510),i=d(i,n,r,o,e[u+6],9,-1069501632),o=d(o,i,n,r,e[u+11],14,643717713),r=d(r,o,i,n,e[u+0],20,-373897302),n=d(n,r,o,i,e[u+5],5,-701558691),i=d(i,n,r,o,e[u+10],9,38016083),o=d(o,i,n,r,e[u+15],14,-660478335),r=d(r,o,i,n,e[u+4],20,-405537848),n=d(n,r,o,i,e[u+9],5,568446438),i=d(i,n,r,o,e[u+14],9,-1019803690),o=d(o,i,n,r,e[u+3],14,-187363961),r=d(r,o,i,n,e[u+8],20,1163531501),n=d(n,r,o,i,e[u+13],5,-1444681467),i=d(i,n,r,o,e[u+2],9,-51403784),o=d(o,i,n,r,e[u+7],14,1735328473),n=h(n,r=d(r,o,i,n,e[u+12],20,-1926607734),o,i,e[u+5],4,-378558),i=h(i,n,r,o,e[u+8],11,-2022574463),o=h(o,i,n,r,e[u+11],16,1839030562),r=h(r,o,i,n,e[u+14],23,-35309556),n=h(n,r,o,i,e[u+1],4,-1530992060),i=h(i,n,r,o,e[u+4],11,1272893353),o=h(o,i,n,r,e[u+7],16,-155497632),r=h(r,o,i,n,e[u+10],23,-1094730640),n=h(n,r,o,i,e[u+13],4,681279174),i=h(i,n,r,o,e[u+0],11,-358537222),o=h(o,i,n,r,e[u+3],16,-722521979),r=h(r,o,i,n,e[u+6],23,76029189),n=h(n,r,o,i,e[u+9],4,-640364487),i=h(i,n,r,o,e[u+12],11,-421815835),o=h(o,i,n,r,e[u+15],16,530742520),n=p(n,r=h(r,o,i,n,e[u+2],23,-995338651),o,i,e[u+0],6,-198630844),i=p(i,n,r,o,e[u+7],10,1126891415),o=p(o,i,n,r,e[u+14],15,-1416354905),r=p(r,o,i,n,e[u+5],21,-57434055),n=p(n,r,o,i,e[u+12],6,1700485571),i=p(i,n,r,o,e[u+3],10,-1894986606),o=p(o,i,n,r,e[u+10],15,-1051523),r=p(r,o,i,n,e[u+1],21,-2054922799),n=p(n,r,o,i,e[u+8],6,1873313359),i=p(i,n,r,o,e[u+15],10,-30611744),o=p(o,i,n,r,e[u+6],15,-1560198380),r=p(r,o,i,n,e[u+13],21,1309151649),n=p(n,r,o,i,e[u+4],6,-145523070),i=p(i,n,r,o,e[u+11],10,-1120210379),o=p(o,i,n,r,e[u+2],15,718787259),r=p(r,o,i,n,e[u+9],21,-343485551),n=g(n,s),r=g(r,a),o=g(o,f),i=g(i,l)}return Array(n,r,o,i)}function s(e,t,n,r,o,i){return g((t=g(g(t,e),g(r,i)))<<o|t>>>32-o,n)}function c(e,t,n,r,o,i,u){return s(t&n|~t&r,e,t,o,i,u)}function d(e,t,n,r,o,i,u){return s(t&r|n&~r,e,t,o,i,u)}function h(e,t,n,r,o,i,u){return s(t^n^r,e,t,o,i,u)}function p(e,t,n,r,o,i,u){return s(n^(t|~r),e,t,o,i,u)}function g(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}b.exports=function(e){return t.hash(e,n,16)}}.call(this,w(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},w(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/md5.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:11}],7:[function(e,l,t){!function(e,t,n,r,o,i,u,s,f){var a;l.exports=a||function(e){for(var t,n=new Array(e),r=0;r<e;r++)0==(3&r)&&(t=4294967296*Math.random()),n[r]=t>>>((3&r)<<3)&255;return n}}.call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/rng.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{buffer:3,lYpoI2:11}],8:[function(c,d,e){!function(e,t,n,r,o,s,a,f,l){var i=c(\"./helpers\");function u(l,c){l[c>>5]|=128<<24-c%32,l[15+(c+64>>9<<4)]=c;for(var e,t,n,r=Array(80),o=1732584193,i=-271733879,u=-1732584194,s=271733878,d=-1009589776,h=0;h<l.length;h+=16){for(var p=o,g=i,y=u,w=s,b=d,a=0;a<80;a++){r[a]=a<16?l[h+a]:v(r[a-3]^r[a-8]^r[a-14]^r[a-16],1);var f=m(m(v(o,5),(f=i,t=u,n=s,(e=a)<20?f&t|~f&n:!(e<40)&&e<60?f&t|f&n|t&n:f^t^n)),m(m(d,r[a]),(e=a)<20?1518500249:e<40?1859775393:e<60?-1894007588:-899497514)),d=s,s=u,u=v(i,30),i=o,o=f}o=m(o,p),i=m(i,g),u=m(u,y),s=m(s,w),d=m(d,b)}return Array(o,i,u,s,d)}function m(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function v(e,t){return e<<t|e>>>32-t}d.exports=function(e){return i.hash(e,u,20,!0)}}.call(this,c(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},c(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:11}],9:[function(c,d,e){!function(e,t,n,r,u,s,a,f,l){function b(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function o(e,l){var c,d=new Array(1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298),t=new Array(1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225),n=new Array(64);e[l>>5]|=128<<24-l%32,e[15+(l+64>>9<<4)]=l;for(var r,o,h=0;h<e.length;h+=16){for(var i=t[0],u=t[1],s=t[2],p=t[3],a=t[4],g=t[5],y=t[6],w=t[7],f=0;f<64;f++)n[f]=f<16?e[f+h]:b(b(b((o=n[f-2],m(o,17)^m(o,19)^v(o,10)),n[f-7]),(o=n[f-15],m(o,7)^m(o,18)^v(o,3))),n[f-16]),c=b(b(b(b(w,m(o=a,6)^m(o,11)^m(o,25)),a&g^~a&y),d[f]),n[f]),r=b(m(r=i,2)^m(r,13)^m(r,22),i&u^i&s^u&s),w=y,y=g,g=a,a=b(p,c),p=s,s=u,u=i,i=b(c,r);t[0]=b(i,t[0]),t[1]=b(u,t[1]),t[2]=b(s,t[2]),t[3]=b(p,t[3]),t[4]=b(a,t[4]),t[5]=b(g,t[5]),t[6]=b(y,t[6]),t[7]=b(w,t[7])}return t}var i=c(\"./helpers\"),m=function(e,t){return e>>>t|e<<32-t},v=function(e,t){return e>>>t};d.exports=function(e){return i.hash(e,o,32,!0)}}.call(this,c(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},c(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha256.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:11}],10:[function(e,t,f){!function(e,t,n,r,o,i,u,s,a){f.read=function(e,t,n,r,o){var i,u,l=8*o-r-1,c=(1<<l)-1,d=c>>1,s=-7,a=n?o-1:0,f=n?-1:1,o=e[t+a];for(a+=f,i=o&(1<<-s)-1,o>>=-s,s+=l;0<s;i=256*i+e[t+a],a+=f,s-=8);for(u=i&(1<<-s)-1,i>>=-s,s+=r;0<s;u=256*u+e[t+a],a+=f,s-=8);if(0===i)i=1-d;else{if(i===c)return u?NaN:1/0*(o?-1:1);u+=Math.pow(2,r),i-=d}return(o?-1:1)*u*Math.pow(2,i-r)},f.write=function(e,t,l,n,r,c){var o,i,u=8*c-r-1,s=(1<<u)-1,a=s>>1,d=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,f=n?0:c-1,h=n?1:-1,c=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(i=isNaN(t)?1:0,o=s):(o=Math.floor(Math.log(t)/Math.LN2),t*(n=Math.pow(2,-o))<1&&(o--,n*=2),2<=(t+=1<=o+a?d/n:d*Math.pow(2,1-a))*n&&(o++,n/=2),s<=o+a?(i=0,o=s):1<=o+a?(i=(t*n-1)*Math.pow(2,r),o+=a):(i=t*Math.pow(2,a-1)*Math.pow(2,r),o=0));8<=r;e[l+f]=255&i,f+=h,i/=256,r-=8);for(o=o<<r|i,u+=r;0<u;e[l+f]=255&o,f+=h,o/=256,u-=8);e[l+f-h]|=128*c}}.call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/ieee754/index.js\",\"/node_modules/gulp-browserify/node_modules/ieee754\")},{buffer:3,lYpoI2:11}],11:[function(e,h,t){!function(e,t,n,r,o,f,l,c,d){var i,u,s;function a(){}(e=h.exports={}).nextTick=(u=\"undefined\"!=typeof window&&window.setImmediate,s=\"undefined\"!=typeof window&&window.postMessage&&window.addEventListener,u?function(e){return window.setImmediate(e)}:s?(i=[],window.addEventListener(\"message\",function(e){var t=e.source;t!==window&&null!==t||\"process-tick\"!==e.data||(e.stopPropagation(),0<i.length&&i.shift()())},!0),function(e){i.push(e),window.postMessage(\"process-tick\",\"*\")}):function(e){setTimeout(e,0)}),e.title=\"browser\",e.browser=!0,e.env={},e.argv=[],e.on=a,e.addListener=a,e.once=a,e.off=a,e.removeListener=a,e.removeAllListeners=a,e.emit=a,e.binding=function(e){throw new Error(\"process.binding is not supported\")},e.cwd=function(){return\"/\"},e.chdir=function(e){throw new Error(\"process.chdir is not supported\")}}.call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/process/browser.js\",\"/node_modules/gulp-browserify/node_modules/process\")},{buffer:3,lYpoI2:11}]},{},[1])(1)});", "import {\n\tClientDescriptor,\n\tClientDescriptorOptions,\n} from './client/ClientDescriptor.js';\nimport { Client } from './client/Client.js';\nexport type { ClientWithCollections } from './client/Client.js';\nexport { ClientDescriptor };\nexport { Client };\n// backward compat\nexport { ClientDescriptor as StorageDescriptor };\nexport { Client as Storage };\nexport type { ClientDescriptorOptions };\nexport type { ClientDescriptorOptions as StorageInitOptions };\nexport { Entity } from './entities/Entity.js';\nexport type {\n\tObjectEntity,\n\tListEntity,\n\tEntityShape,\n\tAccessibleEntityProperty,\n\tAnyEntity,\n\tEntityDestructured,\n} from './entities/Entity.js';\nexport { ServerSync } from './sync/Sync.js';\nexport type { SyncTransportMode } from './sync/Sync.js';\nexport { EntityFile } from './files/EntityFile.js';\nexport {\n\tcollection,\n\tschema,\n\tcreateDefaultMigration,\n\tmigrate,\n\tcreateMigration,\n} from '@verdant-web/common';\nexport type {\n\tStorageDocument,\n\tStorageSchema,\n\tStorageCollectionSchema,\n\tMigration,\n} from '@verdant-web/common';\nexport type { UserInfo } from '@verdant-web/common';\nexport type { Query } from './queries/types.js';\nexport type { QueryStatus } from './queries/BaseQuery.js';\nexport type { CollectionQueries } from './queries/CollectionQueries.js';\nexport { MigrationPathError } from './migration/errors.js';\n", "import cuid from 'cuid';\nimport { v4 } from 'uuid';\n\nexport interface TimestampProvider {\n\tnow(version: number): string;\n\tupdate(remoteTimestamp: string): void;\n\tzero(version: number): string;\n\tgetWallClockTime(timestamp: string): number;\n}\n\nconst VERSION_BLOCK_LENGTH = 4;\nconst ENCODING_NUMBER_RADIX = 36;\n\nexport function encodeVersion(version: number | string): string {\n\treturn version\n\t\t.toString(ENCODING_NUMBER_RADIX)\n\t\t.padStart(VERSION_BLOCK_LENGTH, '0');\n}\n\nexport function OLD_encodeVersion(version: number | string): string {\n\treturn version.toString().padStart(6, '0');\n}\n\nexport class NaiveTimestampProvider implements TimestampProvider {\n\tcounter = 0;\n\tnow = (version: number | string) => {\n\t\treturn (\n\t\t\tencodeVersion(version) + Date.now().toString() + '-' + this.counter++\n\t\t);\n\t};\n\tupdate = () => {\n\t\tthis.counter = 0;\n\t};\n\tzero = (version: number | string) => {\n\t\treturn encodeVersion(version) + '0' + '-' + this.counter++;\n\t};\n\tgetWallClockTime = (timestamp: string) => {\n\t\treturn parseInt(timestamp.slice(VERSION_BLOCK_LENGTH).split('-')[0], 10);\n\t};\n}\n\nexport class HybridLogicalClockTimestampProvider implements TimestampProvider {\n\tprivate latest: HLCTimestamp = {\n\t\ttime: Date.now(),\n\t\tcounter: 0,\n\t\tnode: generateNodeId(),\n\t};\n\tprivate zeroCounter = 0;\n\n\tnow = (version: string | number) => {\n\t\tthis.latest = getHlcNow(this.latest);\n\t\treturn this.get(version, this.latest);\n\t};\n\t/**\n\t * @deprecated - use now() instead and update to latest format\n\t */\n\tOLD_now = (version: string | number) => {\n\t\tthis.latest = getHlcNow(this.latest);\n\t\treturn OLD_encodeVersion(version) + OLD_serializeHlcTimestamp(this.latest);\n\t};\n\t/** Get the current timer state. Does not increment counter. */\n\ttimerState = () => {\n\t\treturn this.latest;\n\t};\n\tupdate = (remoteTimestamp: string) => {\n\t\t// strip version from remote timestamp\n\t\tconst hlcString = remoteTimestamp.slice(VERSION_BLOCK_LENGTH);\n\t\tthis.latest = updateFromRemote(\n\t\t\tthis.latest,\n\t\t\tdeserializeHlcTimestamp(hlcString),\n\t\t);\n\t};\n\tget = (version: string | number, raw: HLCTimestamp) => {\n\t\treturn encodeVersion(version) + serializeHlcTimestamp(raw);\n\t};\n\tzero = (version: string | number) => {\n\t\treturn (\n\t\t\tencodeVersion(version) +\n\t\t\tserializeHlcTimestamp({\n\t\t\t\ttime: 0,\n\t\t\t\t// to keep zero timestamps unique, we use a counter here as well\n\t\t\t\tcounter: this.zeroCounter++,\n\t\t\t\tnode: this.latest.node,\n\t\t\t})\n\t\t);\n\t};\n\tgetWallClockTime = (timestamp: string): number => {\n\t\treturn deserializeHlcTimestamp(timestamp.slice(VERSION_BLOCK_LENGTH)).time;\n\t};\n}\n\nclass ClockDriftError extends Error {\n\ttype: string;\n\tconstructor(...args: any[]) {\n\t\tsuper();\n\t\tthis.type = 'ClockDriftError';\n\t\tthis.message = ['maximum clock drift exceeded'].concat(args).join(' ');\n\t}\n}\n\nclass OverflowError extends Error {\n\ttype: string;\n\tconstructor() {\n\t\tsuper();\n\t\tthis.type = 'OverflowError';\n\t\tthis.message = 'timestamp counter overflow';\n\t}\n}\n\ninterface HLCTimestamp {\n\ttime: number;\n\tcounter: number;\n\tnode: string;\n}\n\nconst COUNTER_BLOCK_LENGTH = 4;\nconst NODE_BLOCK_LENGTH = 7;\nconst MAX_CLOCK_DRIFT = 60 * 1000;\n// 9 base36 characters should last until the year 5000\n// when encoding a unix MS timestamp\nconst TIME_BLOCK_LENGTH = 9;\n\nfunction generateNodeId() {\n\treturn cuid\n\t\t.slug()\n\t\t.padStart(NODE_BLOCK_LENGTH, '0')\n\t\t.slice(0, NODE_BLOCK_LENGTH);\n}\n\nexport function serializeHlcTimestamp(ts: HLCTimestamp): string {\n\t// string representation of the time\n\tconst dateString = new Date(ts.time)\n\t\t.getTime()\n\t\t.toString(ENCODING_NUMBER_RADIX)\n\t\t.padStart(TIME_BLOCK_LENGTH, '0');\n\t// counter, 336, padded to 4 characters\n\tconst counter = ts.counter\n\t\t.toString(ENCODING_NUMBER_RADIX)\n\t\t.padStart(COUNTER_BLOCK_LENGTH, '0');\n\t// node id padded to 16 characters\n\tconst node = ts.node.padStart(NODE_BLOCK_LENGTH, '0');\n\treturn `${dateString}${counter}${node}`;\n}\n\nfunction getHlcNow(prev: HLCTimestamp): HLCTimestamp {\n\tconst wallTime = Date.now();\n\n\t// pick prev's time if it's later than our local device\n\tconst newWallTime = Math.max(prev.time, wallTime);\n\t// reset counter if wall time changed\n\tconst newCounter = prev.time === newWallTime ? prev.counter + 1 : 0;\n\n\t// check for drift\n\tif (newWallTime - wallTime > MAX_CLOCK_DRIFT) {\n\t\tthrow new ClockDriftError(newWallTime, wallTime, MAX_CLOCK_DRIFT);\n\t}\n\t// check for counter overflow (max is 4 bytes)\n\tif (newCounter > 65535) {\n\t\tthrow new OverflowError();\n\t}\n\n\treturn {\n\t\ttime: newWallTime,\n\t\tcounter: newCounter,\n\t\tnode: prev.node,\n\t};\n}\n\nfunction updateFromRemote(\n\tlocal: HLCTimestamp,\n\tremote: HLCTimestamp,\n): HLCTimestamp {\n\tconst wallTime = Date.now();\n\t// pick remote's time if it's later than our local device\n\tconst newTime = Math.max(wallTime, Math.max(local.time, remote.time));\n\n\tconst maxCounter = Math.max(local.counter, remote.counter);\n\tlet newCounter;\n\t// if all clocks are the same, increment the counter\n\tif (local.time === newTime && remote.time === newTime) {\n\t\tnewCounter = maxCounter + 1;\n\t}\n\t// if local time is the same as new time, increment our local counter\n\telse if (local.time === newTime) {\n\t\tnewCounter = local.counter + 1;\n\t}\n\t// if remote time is the same as new time, increment remote counter\n\telse if (remote.time === newTime) {\n\t\tnewCounter = remote.counter + 1;\n\t}\n\t// otherwise, reset the counter\n\telse {\n\t\tnewCounter = 0;\n\t}\n\n\t// check for drift\n\tif (newTime - wallTime > MAX_CLOCK_DRIFT) {\n\t\tthrow new ClockDriftError(newTime, wallTime, MAX_CLOCK_DRIFT);\n\t}\n\tif (newCounter > 65535) {\n\t\tthrow new OverflowError();\n\t}\n\n\treturn {\n\t\ttime: newTime,\n\t\tcounter: newCounter,\n\t\tnode: local.node,\n\t};\n}\n\nexport function deserializeHlcTimestamp(clock: string): HLCTimestamp {\n\tconst dateString = clock.slice(0, TIME_BLOCK_LENGTH);\n\tconst counter = clock.slice(\n\t\tTIME_BLOCK_LENGTH,\n\t\tTIME_BLOCK_LENGTH + COUNTER_BLOCK_LENGTH,\n\t);\n\tconst node = clock.slice(TIME_BLOCK_LENGTH + COUNTER_BLOCK_LENGTH);\n\tconst time = parseInt(dateString, ENCODING_NUMBER_RADIX);\n\tconst counterNum = parseInt(counter, ENCODING_NUMBER_RADIX);\n\n\tif (isNaN(time) || isNaN(counterNum)) {\n\t\tthrow new Error('invalid clock format');\n\t}\n\n\treturn {\n\t\ttime,\n\t\tcounter: counterNum,\n\t\tnode,\n\t};\n}\n\nfunction removeLeadingZeroes(str: string): string {\n\treturn str.replace(/^0+/, '');\n}\n\n/**\n * Below, converters for old-style timestamps are defined.\n * These are for migrating older clients to the new format.\n */\n\n/**\n * Converts a timestamp from the old format to the new format.\n */\nexport function convertOldHlcTimestamp(ts: string): string {\n\tconst versionBlock = ts.slice(0, 6);\n\t// no jokes please\n\tconst clockBlock = ts.slice(6);\n\tconst deserialized = OLD_deserializeHlcTimestamp(clockBlock);\n\n\t// version was base 10 and now is base 36\n\tconst versionNumber = parseInt(versionBlock, 10);\n\tconst encodedVersion = encodeVersion(versionNumber);\n\treturn encodedVersion + serializeHlcTimestamp(deserialized);\n}\n\nexport function OLD_serializeHlcTimestamp(ts: HLCTimestamp): string {\n\t// ISO string representation of the time\n\tconst dateString = new Date(ts.time).toISOString();\n\t// counter, base16, padded to 4 characters\n\tconst counter = ts.counter.toString(16).toUpperCase().padStart(4, '0');\n\t// node id padded to 16 characters\n\tconst node = ts.node.padStart(16, '0');\n\treturn `${dateString}-${counter}-${node}`;\n}\n\nexport function OLD_deserializeHlcTimestamp(clock: string): HLCTimestamp {\n\t// ISO string representation of the time\n\tconst dateString = clock.slice(0, 24);\n\tconst counter = clock.slice(25, 25 + 4);\n\tconst node = clock.slice(25 + 4 + 1);\n\n\tconst time = new Date(dateString).getTime();\n\tconst counterNum = parseInt(counter, 16);\n\n\tif (isNaN(time) || isNaN(counterNum)) {\n\t\tthrow new Error('invalid clock format');\n\t}\n\n\treturn {\n\t\ttime,\n\t\tcounter: counterNum,\n\t\tnode: node.slice(node.length - 7),\n\t};\n}\n\nexport function getTimestampSchemaVersion(timestamp: string): number {\n\treturn parseInt(timestamp.slice(0, VERSION_BLOCK_LENGTH), 36);\n}\n\nexport function compareTimestampSchemaVersions(a: string, b: string) {\n\treturn getTimestampSchemaVersion(a) - getTimestampSchemaVersion(b);\n}\n", "export type FileRef = {\n\t'@@type': 'file';\n\tid: string;\n};\n\nexport function isFileRef(value: any): value is FileRef {\n\treturn value && value['@@type'] === 'file';\n}\nexport function createFileRef(id: string): FileRef {\n\treturn {\n\t\t'@@type': 'file',\n\t\tid,\n\t};\n}\n\nexport type FileData = {\n\tid: string;\n\t/**\n\t * For locally created files, this starts false, until it's uploaded\n\t * Remote files this is always true\n\t */\n\tremote: boolean;\n\tname: string;\n\ttype: string;\n\tfile?: Blob;\n\turl?: string;\n};\n\nexport function getAllFileFields(snapshot: any): [string, FileRef][] {\n\treturn Object.entries(snapshot).filter((entry) => isFileRef(entry[1])) as [\n\t\tstring,\n\t\tFileRef,\n\t][];\n}\n", "// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}", "export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;", "import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;", "import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;", "import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;", "import { FileRef, isFileRef } from './files.js';\nimport { isObjectRef, ObjectRef } from './operation.js';\n\nexport function isRef(obj: any) {\n\treturn isObjectRef(obj) || isFileRef(obj);\n}\n\nexport function compareRefs(a: any, b: any) {\n\tif (a === b) return true;\n\tif (!isRef(a) || !isRef(b)) return false;\n\tif (a['@@type'] !== b['@@type']) return false;\n\tif (a.id !== b.id) return false;\n\treturn true;\n}\n\nexport type Ref = ObjectRef | FileRef;\n", "import { v4 } from 'uuid';\nimport { assignOid, maybeGetOid } from './oids.js';\nimport hash from 'object-hash';\n\nexport function take<T extends object, Keys extends keyof T>(\n\tobj: T,\n\tkeys: Keys[],\n): Pick<T, Keys> {\n\tconst result: any = {};\n\tfor (const key of keys) {\n\t\tresult[key] = obj[key];\n\t}\n\treturn result;\n}\n\nexport function omit<T extends object, Keys extends keyof T>(\n\tobj: T,\n\tkeys: Keys[],\n): Omit<T, Keys> {\n\tconst result: any = {};\n\tfor (const key of Object.keys(obj)) {\n\t\tif (!keys.includes(key as Keys)) {\n\t\t\tresult[key] = (obj as any)[key];\n\t\t}\n\t}\n\treturn result;\n}\n\nexport function getSortedIndex<T>(\n\tarray: T[],\n\tinsert: T,\n\tcompare: (a: T, b: T) => number,\n) {\n\tlet low = 0;\n\tlet high = array.length;\n\twhile (low < high) {\n\t\tconst mid = (low + high) >>> 1;\n\t\tconst cmp = compare(array[mid], insert);\n\t\tif (cmp < 0) {\n\t\t\tlow = mid + 1;\n\t\t} else {\n\t\t\thigh = mid;\n\t\t}\n\t}\n\treturn low;\n}\n\nfunction orderedReplacer(_: any, v: any) {\n\tif (typeof v !== 'object' || v === null || Array.isArray(v)) {\n\t\treturn v;\n\t}\n\treturn Object.fromEntries(\n\t\tObject.entries(v).sort(([ka], [kb]) => (ka < kb ? -1 : ka > kb ? 1 : 0)),\n\t);\n}\n/**\n * Consistently stringifies an object regardless\n * of key insertion order\n */\nexport function stableStringify(obj: any) {\n\treturn JSON.stringify(obj, orderedReplacer);\n}\n\n/**\n * A version of structured cloning which preserves object identity\n * references in the system.\n */\nexport function cloneDeep<T>(obj: T, copyOids = true): T {\n\tif (isObject(obj) || Array.isArray(obj)) {\n\t\tconst oid = maybeGetOid(obj);\n\t\tlet clone: any;\n\t\tif (Array.isArray(obj)) {\n\t\t\tclone = obj.map((v) => cloneDeep(v, copyOids)) as T;\n\t\t} else {\n\t\t\tclone = {};\n\t\t\tfor (const [key, value] of Object.entries(obj as any)) {\n\t\t\t\tclone[key] = cloneDeep(value, copyOids);\n\t\t\t}\n\t\t}\n\t\tif (copyOids && oid) {\n\t\t\tassignOid(clone, oid);\n\t\t}\n\t\treturn clone;\n\t}\n\treturn obj;\n}\n\n// TODO: better hash\nexport function hashObject(obj: any) {\n\t// hash the object into a unique string\n\treturn hash(obj);\n}\n\nexport function isObject(obj: any) {\n\treturn obj && typeof obj === 'object';\n}\n\nexport function roughSizeOfObject(object: any) {\n\tvar objectList = [];\n\tvar stack = [object];\n\tvar bytes = 0;\n\n\twhile (stack.length) {\n\t\tvar value = stack.pop();\n\n\t\tif (typeof value === 'boolean') {\n\t\t\tbytes += 4;\n\t\t} else if (typeof value === 'string') {\n\t\t\tbytes += value.length * 2;\n\t\t} else if (typeof value === 'number') {\n\t\t\tbytes += 8;\n\t\t} else if (typeof value === 'object' && objectList.indexOf(value) === -1) {\n\t\t\tobjectList.push(value);\n\n\t\t\tfor (var i in value) {\n\t\t\t\tstack.push(value[i]);\n\t\t\t}\n\t\t}\n\t}\n\treturn bytes;\n}\n\nexport function assert(\n\tcondition: any,\n\tmessage: string = 'assertion failed',\n): asserts condition {\n\tif (!condition) {\n\t\tthrow new Error(message);\n\t}\n}\n\nexport function generateId(length = 16) {\n\treturn v4().replace('-', '').slice(0, length);\n}\n\nexport function findLastIndex<T>(array: T[], predicate: (item: T) => boolean) {\n\tfor (let i = array.length - 1; i >= 0; i--) {\n\t\tif (predicate(array[i])) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n}\n\nexport function debounce<T extends (...args: any[]) => any>(\n\tfn: T,\n\twait: number,\n): T {\n\tlet timeout: any;\n\treturn function (this: any, ...args: any[]) {\n\t\tconst context = this;\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(() => fn.apply(context, args), wait);\n\t} as any;\n}\n", "import { v4 } from 'uuid';\nimport { isFileRef } from './files.js';\nimport { isObjectRef, ObjectRef } from './operation.js';\nimport { isRef } from './refs.js';\nimport { isObject, assert } from './utils.js';\n\n/**\n * OIDs\n *\n * OIDs are used to identify objects in the document. They also encode\n * information about the object useful to identifying an object found\n * on its own and associating it back to its parent.\n *\n * An OID is structured as such:\n * <collection>/<root id>[/<key paths>]:<random>\n *\n * OIDs have a few characteristics:\n * - They include the collection name of the parent document\n * - They include the primary key of the parent document\n * - They include the key path of the object within the document\n * - They include a random sequence to identify different objects which\n * exist at the same key path\n *\n * Collection name and document key are used to link any isolated\n * object back to its parent document.\n *\n * The key path is used for authorization - to associate the object\n * (or an operation related to it by OID) with the field it inhabits\n * to utilize authorization rules from that field in the schema.\n *\n * The random sequence allows the application to encode different\n * identities for objects at the same position in a document for\n * conflict resolution purposes\n */\n\nexport type ObjectIdentifier = string;\n\nexport const LEGACY_OID_KEY = '__@@oid_do_not_use';\nexport const OID_KEY = '@@id';\n\nconst COLLECTION_SEPARATOR = '/';\nconst RANDOM_SEPARATOR = ':';\n\n/**\n * This is the global, in-memory storage for all OIDs. It is used to\n * associate JS objects with OIDs without modifying the objects themselves.\n */\nconst oidMap = new WeakMap<any, ObjectIdentifier>();\n\nexport function getOid(obj: any) {\n\tconst oid = maybeGetOid(obj);\n\tassert(\n\t\t!!oid,\n\t\t`Object ${JSON.stringify(obj)} does not have an OID assigned to it`,\n\t);\n\treturn oid;\n}\n\nexport function maybeGetOid(obj: any): ObjectIdentifier | undefined {\n\tif (!isObject(obj)) {\n\t\treturn undefined;\n\t}\n\treturn oidMap.get(obj) ?? obj[OID_KEY] ?? obj[LEGACY_OID_KEY];\n}\n\nexport function assignOid(obj: any, oid: ObjectIdentifier) {\n\tassert(\n\t\tisObject(obj),\n\t\t`Only objects can be assigned OIDs, received ${JSON.stringify(obj)}`,\n\t);\n\tif (hasOid(obj)) {\n\t\tremoveOid(obj);\n\t}\n\toidMap.set(obj, oid);\n\treturn obj;\n}\n\nexport function hasOid(obj: any) {\n\treturn !!maybeGetOid(obj);\n}\n\nexport function removeOid(obj: any) {\n\toidMap.delete(obj);\n\treturn obj;\n}\n\nexport function isOidKey(key: string) {\n\treturn key === OID_KEY || key === LEGACY_OID_KEY;\n}\n\n/**\n * For sub-objects, assign a random sub-OID if no OID\n * is already assigned.\n */\nexport function ensureOid(\n\tobj: any,\n\trootOid: ObjectIdentifier,\n\tcreateSubId?: () => string,\n) {\n\tif (!hasOid(obj)) {\n\t\tconst oid = createSubOid(rootOid, createSubId);\n\t\tassignOid(obj, oid);\n\t\treturn oid;\n\t} else {\n\t\treturn getOid(obj);\n\t}\n}\n\nexport function ensureCompatibleOid(\n\tobj: any,\n\trootOid: ObjectIdentifier,\n\tcreateSubId?: () => string,\n) {\n\tif (!hasOid(obj)) {\n\t\tconst oid = createSubOid(rootOid, createSubId);\n\t\tassignOid(obj, oid);\n\t\treturn oid;\n\t} else {\n\t\tconst existingOid = getOid(obj);\n\t\tif (!areOidsRelated(existingOid, rootOid)) {\n\t\t\tconst oid = createSubOid(rootOid, createSubId);\n\t\t\tassignOid(obj, oid);\n\t\t\treturn oid;\n\t\t} else {\n\t\t\treturn getOid(obj);\n\t\t}\n\t}\n}\n\nconst SANTIIZE_PLACEHOLDERS = {\n\t'.': '˙',\n\t'/': '&slash;',\n\t':': ':',\n};\nfunction sanitizeFragment(id: string) {\n\t// replaces separator characters with placeholders\n\treturn id\n\t\t.replace(/[/]/g, SANTIIZE_PLACEHOLDERS['/'])\n\t\t.replace(/[:]/g, SANTIIZE_PLACEHOLDERS[':'])\n\t\t.replace(/[.]/g, SANTIIZE_PLACEHOLDERS['.']);\n}\nfunction unsanitizeFragment(id: string) {\n\t// replaces placeholders with separator characters\n\treturn id\n\t\t.replace(/&slash;/g, '/')\n\t\t.replace(/:/g, ':')\n\t\t.replace(/˙/g, '.');\n}\n\nexport function createOid(\n\tcollection: string,\n\tdocumentId: string,\n\tsubId?: string,\n) {\n\tlet oid =\n\t\tsanitizeFragment(collection) +\n\t\tCOLLECTION_SEPARATOR +\n\t\tsanitizeFragment(documentId);\n\tif (subId) {\n\t\toid += RANDOM_SEPARATOR + subId;\n\t}\n\treturn oid;\n}\n\nexport function createSubOid(\n\troot: ObjectIdentifier,\n\tcreateSubId: () => string = createOidSubId,\n) {\n\tconst { collection, id } = decomposeOid(root);\n\treturn createOid(collection, id, createSubId());\n}\n\nexport function decomposeOid(oid: ObjectIdentifier): {\n\tcollection: string;\n\tid: string;\n\tsubId?: string;\n} {\n\tconst [core, random] = oid.split(RANDOM_SEPARATOR);\n\tconst [collection, idOrLegacyPathId] = core.split('/');\n\tlet id;\n\tif (idOrLegacyPathId.includes('.')) {\n\t\tid = idOrLegacyPathId.slice(0, idOrLegacyPathId.indexOf('.'));\n\t} else {\n\t\tid = idOrLegacyPathId;\n\t}\n\treturn {\n\t\tcollection: unsanitizeFragment(collection),\n\t\tid: unsanitizeFragment(id),\n\t\tsubId: random,\n\t};\n}\n\nexport function assertAllLevelsHaveOids(obj: any, root?: any) {\n\tassert(\n\t\tgetOid(obj),\n\t\t`Object ${JSON.stringify(obj)} must have an oid (child of ${JSON.stringify(\n\t\t\troot,\n\t\t)})`,\n\t);\n\tif (Array.isArray(obj)) {\n\t\tfor (const item of obj) {\n\t\t\tassertAllLevelsHaveOids(item, root || obj);\n\t\t}\n\t} else if (isObject(obj)) {\n\t\tfor (const key of Object.keys(obj)) {\n\t\t\tassertAllLevelsHaveOids(obj[key], root || obj);\n\t\t}\n\t}\n}\n\nexport function assignOidsToAllSubObjects(\n\tobj: any,\n\tcreateSubId?: () => string,\n) {\n\tconst rootOid = getOid(obj);\n\tif (Array.isArray(obj)) {\n\t\tlet item;\n\t\tfor (let i = 0; i < obj.length; i++) {\n\t\t\titem = obj[i];\n\t\t\tif (isObject(item) && !isRef(item)) {\n\t\t\t\tensureCompatibleOid(item, rootOid, createSubId);\n\t\t\t\tassignOidsToAllSubObjects(item, createSubId);\n\t\t\t}\n\t\t}\n\t} else if (isObject(obj) && !isRef(obj)) {\n\t\tfor (const key of Object.keys(obj)) {\n\t\t\tif (isObject(obj[key]) && !isRef(obj[key])) {\n\t\t\t\tensureCompatibleOid(obj[key], rootOid, createSubId);\n\t\t\t\tassignOidsToAllSubObjects(obj[key], createSubId);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function assignOidProperty(obj: any, oid: ObjectIdentifier) {\n\tassert(\n\t\tisObject(obj),\n\t\t`Only objects can be assigned OIDs, received ${JSON.stringify(obj)}`,\n\t);\n\tobj[OID_KEY] = oid;\n\treturn obj;\n}\n\nexport function maybeGetOidProperty(obj: any) {\n\tif (!isObject(obj)) {\n\t\treturn undefined;\n\t}\n\treturn obj[OID_KEY] || obj[LEGACY_OID_KEY];\n}\n\nfunction removeOidProperty(obj: any) {\n\tif (!isObject(obj)) {\n\t\treturn obj;\n\t}\n\tdelete obj[LEGACY_OID_KEY];\n\tdelete obj[OID_KEY];\n\treturn obj;\n}\n\nfunction transferOidFromSystemToProperty(obj: any) {\n\tconst oid = maybeGetOid(obj);\n\tif (oid) {\n\t\tassignOidProperty(obj, oid);\n\t}\n}\n\n/**\n * Assigns a special property to all objects in the given object\n * which have an OID\n */\nexport function assignOidPropertiesToAllSubObjects(obj: any) {\n\ttransferOidFromSystemToProperty(obj);\n\n\tif (Array.isArray(obj)) {\n\t\tfor (let i = 0; i < obj.length; i++) {\n\t\t\tassignOidPropertiesToAllSubObjects(obj[i]);\n\t\t}\n\t} else if (isObject(obj)) {\n\t\tfor (const key of Object.keys(obj)) {\n\t\t\tassignOidPropertiesToAllSubObjects(obj[key]);\n\t\t}\n\t}\n}\n\nfunction copyOidFromPropertyToSystem(obj: any) {\n\tconst oid = maybeGetOidProperty(obj);\n\tif (oid) {\n\t\tassignOid(obj, oid);\n\t}\n}\n\n/**\n *\n * Removes the special property from all objects in the given object\n * which have an OID, transferring the OID from the property to the OID\n * system in-memory.\n */\nexport function removeOidPropertiesFromAllSubObjects(obj: any) {\n\tcopyOidFromPropertyToSystem(obj);\n\tremoveOidProperty(obj);\n\n\tif (Array.isArray(obj)) {\n\t\tfor (let i = 0; i < obj.length; i++) {\n\t\t\tremoveOidPropertiesFromAllSubObjects(obj[i]);\n\t\t}\n\t} else if (isObject(obj)) {\n\t\tfor (const key of Object.keys(obj)) {\n\t\t\tremoveOidPropertiesFromAllSubObjects(obj[key]);\n\t\t}\n\t}\n}\n\nexport function removeOidsFromAllSubObjects(obj: any) {\n\tremoveOid(obj);\n\n\tif (Array.isArray(obj)) {\n\t\tfor (let i = 0; i < obj.length; i++) {\n\t\t\tremoveOidsFromAllSubObjects(obj[i]);\n\t\t}\n\t} else if (isObject(obj)) {\n\t\tfor (const key of Object.keys(obj)) {\n\t\t\tremoveOidsFromAllSubObjects(obj[key]);\n\t\t}\n\t}\n}\n\nexport function createOidSubId() {\n\treturn v4().slice(0, 8);\n}\n\nexport function createRef(oid: ObjectIdentifier): ObjectRef {\n\treturn {\n\t\t'@@type': 'ref',\n\t\tid: oid,\n\t};\n}\n\nexport function normalize(\n\tobj: any,\n\trefs: Map<ObjectIdentifier, any> = new Map(),\n): Map<ObjectIdentifier, any> {\n\tif (Array.isArray(obj)) {\n\t\tconst oid = getOid(obj);\n\t\tconst copy = assignOid([], oid);\n\t\tfor (let i = 0; i < obj.length; i++) {\n\t\t\tconst value = obj[i];\n\t\t\tif (isObject(value)) {\n\t\t\t\tif (isObjectRef(value)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'An attempt was made to normalize an already normalized object! This is an error in verdant itself.',\n\t\t\t\t\t);\n\t\t\t\t} else if (isFileRef(value)) {\n\t\t\t\t\tcopy[i] = value;\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\tconst itemOid = getOid(value);\n\t\t\t\t\tcopy[i] = createRef(itemOid);\n\t\t\t\t\tnormalize(value, refs);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcopy[i] = value;\n\t\t\t}\n\t\t}\n\t\trefs.set(oid, copy);\n\t} else if (isObject(obj) && !isRef(obj)) {\n\t\tconst oid = getOid(obj);\n\t\tconst copy = assignOid({} as Record<string, any>, oid);\n\t\tfor (const key of Object.keys(obj)) {\n\t\t\tconst value = obj[key];\n\t\t\tif (isObject(value)) {\n\t\t\t\tif (isObjectRef(value)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'An attempt was made to normalize an already normalized object! This is an error in verdant itself.',\n\t\t\t\t\t);\n\t\t\t\t} else if (isFileRef(value)) {\n\t\t\t\t\t// stop here\n\t\t\t\t\tcopy[key] = value;\n\t\t\t\t} else {\n\t\t\t\t\tconst itemOid = getOid(value);\n\t\t\t\t\tcopy[key] = createRef(itemOid);\n\t\t\t\t\tnormalize(value, refs);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcopy[key] = value;\n\t\t\t}\n\t\t}\n\t\trefs.set(oid, copy);\n\t} else if (isRef(obj)) {\n\t}\n\treturn refs;\n}\n\n/**\n * Only normalizes direct children. The created map\n * of objects will still have nested objects.\n */\nexport function normalizeFirstLevel(obj: any) {\n\tconst refs = new Map<ObjectIdentifier, any>();\n\tconst oidKeyPairs = new Map<ObjectIdentifier, string | number>();\n\tif (Array.isArray(obj)) {\n\t\tconst oid = getOid(obj);\n\t\tconst copy = assignOid([], oid);\n\t\tfor (let i = 0; i < obj.length; i++) {\n\t\t\tconst value = obj[i];\n\t\t\tif (isObject(value)) {\n\t\t\t\tconst itemOid = getOid(value);\n\t\t\t\tcopy[i] = createRef(itemOid);\n\t\t\t\trefs.set(itemOid, value);\n\t\t\t\toidKeyPairs.set(itemOid, i);\n\t\t\t} else {\n\t\t\t\tcopy[i] = value;\n\t\t\t}\n\t\t}\n\t\trefs.set(oid, copy);\n\t} else if (isObject(obj)) {\n\t\tconst oid = getOid(obj);\n\t\tconst copy = assignOid({} as Record<string, any>, oid);\n\t\tfor (const key of Object.keys(obj)) {\n\t\t\tconst value = obj[key];\n\t\t\tif (isObject(value)) {\n\t\t\t\tconst itemOid = getOid(value);\n\t\t\t\tcopy[key] = createRef(itemOid);\n\t\t\t\trefs.set(itemOid, value);\n\t\t\t\toidKeyPairs.set(itemOid, key);\n\t\t\t} else {\n\t\t\t\tcopy[key] = value;\n\t\t\t}\n\t\t}\n\t\trefs.set(oid, copy);\n\t}\n\treturn { refs, oidKeyPairs };\n}\n\nexport function getOidRoot(oid: ObjectIdentifier) {\n\treturn oid.split('.')[0].split(RANDOM_SEPARATOR)[0];\n}\n\n/**\n * Returns an inclusive range of OIDs that represent\n * all of an OID's possible sub-objects.\n */\nexport function getOidSubIdRange(oid: ObjectIdentifier, legacyDot: boolean) {\n\tconst root = getOidRoot(oid);\n\tconst lastSubId = createSubOid(root, () => '\\uffff');\n\tif (legacyDot) {\n\t\treturn [`${root}.`, lastSubId];\n\t}\n\treturn [`${root}${RANDOM_SEPARATOR}`, lastSubId];\n}\n\nexport function getRoots(oids: ObjectIdentifier[]) {\n\tconst set = new Set<ObjectIdentifier>();\n\tfor (const oid of oids) {\n\t\tset.add(getOidRoot(oid));\n\t}\n\treturn Array.from(set);\n}\n\nexport function areOidsRelated(oidA: ObjectIdentifier, oidB: ObjectIdentifier) {\n\treturn getOidRoot(oidA) === getOidRoot(oidB);\n}\n\n/**\n * Recursively rewrites any OIDs in an object which are 'foreign' -\n * i.e. relate to some other object/entity - to be local to the\n * current object. This is deterministic, so it can be done\n * on multiple clients independently with predictable results.\n */\nexport function fixForeignOids(obj: any) {\n\tconst oid = maybeGetOid(obj);\n\tif (!oid) return;\n\n\tif (Array.isArray(obj)) {\n\t\tfor (let i = 0; i < obj.length; i++) {\n\t\t\tmigrateForeignOid(oid, obj[i]);\n\t\t\tfixForeignOids(obj[i]);\n\t\t}\n\t} else if (isObject(obj)) {\n\t\tfor (const key of Object.keys(obj)) {\n\t\t\tmigrateForeignOid(oid, obj[key]);\n\t\t\tfixForeignOids(obj[key]);\n\t\t}\n\t}\n}\n\nfunction migrateForeignOid(parentOid: ObjectIdentifier, child: any) {\n\tconst childOid = maybeGetOid(child);\n\tif (childOid && !areOidsRelated(parentOid, childOid)) {\n\t\tconst { subId, id } = decomposeOid(childOid);\n\t\t// reuse existing subId. if child is a foreign root, use its id as subId\n\t\tassignOid(\n\t\t\tchild,\n\t\t\tcreateSubOid(parentOid, () => subId || id),\n\t\t);\n\t}\n}\n\nexport function isLegacyDotOid(oid: ObjectIdentifier) {\n\tconst partBeforeRandomSep = oid.split(RANDOM_SEPARATOR)[0];\n\treturn partBeforeRandomSep.includes('.');\n}\n", "import { DocumentBaseline } from './baseline.js';\nimport { FileRef, isFileRef } from './files.js';\nimport {\n\tareOidsRelated,\n\tassignOid,\n\tassignOidsToAllSubObjects,\n\tcreateRef,\n\tcreateSubOid,\n\tensureOid,\n\tgetOid,\n\tgetOidRoot,\n\tisOidKey,\n\tmaybeGetOid,\n\tnormalize,\n\tObjectIdentifier,\n\tremoveOid,\n} from './oids.js';\nimport { compareRefs, isRef } from './refs.js';\nimport { assert, cloneDeep, findLastIndex, isObject } from './utils.js';\n\n// export type ObjectIdentifier<\n// \tCollectionName extends string = string,\n// \tDocumentId extends string = string,\n// \tDocumentOid extends string = string,\n// > =\n// \t| `${CollectionName}/${DocumentId}:${DocumentOid}`\n// \t| `${CollectionName}/${DocumentId}:${DocumentOid}#${string}`;\n\nexport type ObjectRef = {\n\t'@@type': 'ref';\n\tid: ObjectIdentifier;\n};\n\nexport function isObjectRef(obj: any): obj is ObjectRef {\n\treturn obj && typeof obj === 'object' && obj['@@type'] === 'ref';\n}\n\nexport type Normalized<T> = {\n\t[key in keyof T]: T[key] extends Object ? ObjectRef : T[key];\n};\n\n// patches v2\n\nexport type PropertyName = string | number;\n/**\n * List patches can target a particular child list or\n * nested lists. The first path item is the property path\n * of the first child list, any subsequent values are nested\n * list indices.\n */\nexport type PropertyValue =\n\t| string\n\t| number\n\t| boolean\n\t| null\n\t| undefined\n\t| ObjectRef;\n\n// all patches refer to a specific sub-object.\ninterface BaseOperationPatch {}\n\nexport interface OperationPatchInitialize extends BaseOperationPatch {\n\top: 'initialize';\n\tvalue: any;\n}\nexport interface OperationPatchSet extends BaseOperationPatch {\n\top: 'set';\n\tname: PropertyName;\n\tvalue: PropertyValue;\n}\nexport interface OperationPatchRemove extends BaseOperationPatch {\n\top: 'remove';\n\tname: PropertyName;\n}\nexport interface OperationPatchListPush extends BaseOperationPatch {\n\top: 'list-push';\n\tvalue: PropertyValue;\n}\nexport interface OperationPatchListInsert extends BaseOperationPatch {\n\top: 'list-insert';\n\tindex: number;\n\tvalue?: PropertyValue;\n\tvalues?: PropertyValue[];\n}\nexport interface OperationPatchListDelete extends BaseOperationPatch {\n\top: 'list-delete';\n\tindex: number;\n\tcount: number;\n}\n/**\n * Optimal for lists of object references. Moves\n * the selected item to the target index even if it\n * is not at the original index anymore.\n */\nexport interface OperationPatchListMoveByRef extends BaseOperationPatch {\n\top: 'list-move-by-ref';\n\tvalue: ObjectRef;\n\tindex: number;\n}\n/**\n * Suitable for any list move, whether object lists\n * or primitive lists.\n */\nexport interface OperationPatchListMoveByIndex extends BaseOperationPatch {\n\top: 'list-move-by-index';\n\tfrom: number;\n\tto: number;\n}\n/**\n * Removes all instances of the value from\n * the list. Good for set behavior or removing\n * a specific item even if it changes index\n * from conflicts.\n */\nexport interface OperationPatchListRemove extends BaseOperationPatch {\n\top: 'list-remove';\n\tvalue: PropertyValue;\n\tonly?: 'first' | 'last';\n}\n\nexport interface OperationPatchListAdd extends BaseOperationPatch {\n\top: 'list-add';\n\tvalue: PropertyValue;\n}\n\nexport interface OperationPatchDelete extends BaseOperationPatch {\n\top: 'delete';\n}\n\nexport type OperationPatch =\n\t| OperationPatchInitialize\n\t| OperationPatchSet\n\t| OperationPatchRemove\n\t| OperationPatchListPush\n\t| OperationPatchListInsert\n\t| OperationPatchListDelete\n\t| OperationPatchListMoveByRef\n\t| OperationPatchListMoveByIndex\n\t| OperationPatchListRemove\n\t| OperationPatchDelete\n\t| OperationPatchListAdd;\n\nexport type Operation = {\n\toid: ObjectIdentifier;\n\ttimestamp: string;\n\tdata: OperationPatch;\n};\n\nfunction isDiffableObject(val: any) {\n\treturn isObject(val) && !isRef(val);\n}\n\nfunction compareNonDiffable(a: any, b: any) {\n\tif (a === b) return true;\n\tif (isRef(a) && isRef(b)) return compareRefs(a, b);\n\treturn false;\n}\n\nexport function diffToPatches<T extends { [key: string]: any } | any[]>(\n\tfrom: T,\n\tto: T,\n\tgetNow: () => string,\n\tcreateSubId?: () => string,\n\tpatches: Operation[] = [],\n\toptions: {\n\t\t/**\n\t\t * If an object is merged with another and the new one does not\n\t\t * have an OID assigned, assume it is the same identity as previous\n\t\t */\n\t\tmergeUnknownObjects?: boolean;\n\t\t/**\n\t\t * If an incoming value is not assigned on the new object, use the previous value.\n\t\t * If false, undefined properties will erase the previous value.\n\t\t */\n\t\tdefaultUndefined?: boolean;\n\t} = {},\n): Operation[] {\n\tconst oid = getOid(from);\n\n\tfunction diffItems(key: string | number, value: any, oldValue: any) {\n\t\tif (!isDiffableObject(value)) {\n\t\t\t// for primitive fields, we can use plain sets and\n\t\t\t// do not need to recurse, of course\n\t\t\tif (!compareNonDiffable(value, oldValue)) {\n\t\t\t\tpatches.push({\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'set',\n\t\t\t\t\t\tname: key,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tconst oldValueOid = maybeGetOid(oldValue);\n\t\t\tlet valueOid = maybeGetOid(value);\n\t\t\t// the user supplied an object which was already assigned an OID,\n\t\t\t// but that OID is from a separate entity: this object must\n\t\t\t// be cloned to a new identity.\n\t\t\tif (valueOid && !areOidsRelated(oid, valueOid)) {\n\t\t\t\tvalue = cloneDeep(value, false);\n\t\t\t\tvalueOid = createSubOid(oid, createSubId);\n\t\t\t\tassignOid(value, valueOid);\n\t\t\t} else if (!options.mergeUnknownObjects) {\n\t\t\t\tvalueOid = ensureOid(value, oid, createSubId);\n\t\t\t} else {\n\t\t\t\t// if merge unknown objects is requested, we copy the previous value's oid\n\t\t\t\t// to any mirrored new value if it doesn't have one assigned already.\n\t\t\t\tif (!valueOid && oldValueOid) {\n\t\t\t\t\tassignOid(value, oldValueOid);\n\t\t\t\t\tvalueOid = oldValueOid;\n\t\t\t\t} else {\n\t\t\t\t\tvalueOid = ensureOid(value, oid, createSubId);\n\t\t\t\t}\n\t\t\t}\n\t\t\tassert(\n\t\t\t\t!!valueOid,\n\t\t\t\t'Error: no value OID was resolved during diff. This is a bug in Verdant.',\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tareOidsRelated(oid, valueOid),\n\t\t\t\t`Error: value OID ${valueOid} is not related to parent OID ${oid}. This is a bug in Verdant.`,\n\t\t\t);\n\n\t\t\tif (oldValue === undefined || valueOid !== oldValueOid) {\n\t\t\t\t// first case: previous value exists but the OIDs are different,\n\t\t\t\t// meaning the object identity has changed\n\t\t\t\t// we add the whole new object and also update the reference on this\n\t\t\t\t// key of the parent to point to the new object\n\t\t\t\tinitialToPatches(value, valueOid, getNow, createSubId, patches);\n\t\t\t\tpatches.push({\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'set',\n\t\t\t\t\t\tname: key,\n\t\t\t\t\t\tvalue: createRef(valueOid),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\t// if there was an old value, we need to delete it altogether.\n\t\t\t\tif (oldValueOid !== undefined) {\n\t\t\t\t\tpatches.push({\n\t\t\t\t\t\toid: oldValueOid,\n\t\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\top: 'delete',\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// third case: OIDs are the same, meaning the identity is the same,\n\t\t\t\t// and we must diff the objects\n\t\t\t\tdiffToPatches(oldValue, value, getNow, createSubId, patches, options);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (Array.isArray(from) && Array.isArray(to)) {\n\t\t// diffing is more naive than native array operations.\n\t\t// we can only look at each element and decide if it should\n\t\t// be replaced or removed - no moves or pushes, etc.\n\t\tfor (let i = 0; i < to.length; i++) {\n\t\t\tconst value = to[i];\n\t\t\tconst oldValue = from[i];\n\t\t\tdiffItems(i, value, oldValue);\n\t\t}\n\t\t// remove any remaining items at the end of the array\n\t\tconst deletedItemsAtEnd = from.length - to.length;\n\t\tif (deletedItemsAtEnd > 0) {\n\t\t\t// if sub-items were objects, we need to delete them all\n\t\t\tfor (let i = to.length; i < from.length; i++) {\n\t\t\t\tconst value = from[i];\n\t\t\t\tconst valueOid = maybeGetOid(value);\n\t\t\t\tif (valueOid) {\n\t\t\t\t\tpatches.push({\n\t\t\t\t\t\toid: valueOid,\n\t\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\top: 'delete',\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// push the list-delete for the deleted items\n\t\t\tpatches.push({\n\t\t\t\toid,\n\t\t\t\ttimestamp: getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'list-delete',\n\t\t\t\t\tindex: to.length,\n\t\t\t\t\tcount: deletedItemsAtEnd,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t} else if (Array.isArray(from) || Array.isArray(to)) {\n\t\tthrow new Error('Cannot diff an array with an object');\n\t} else if (isDiffableObject(from) && isDiffableObject(to)) {\n\t\tconst oldKeys = new Set(Object.keys(from));\n\t\tfor (const [key, value] of Object.entries(to)) {\n\t\t\tif (value === undefined && options.defaultUndefined) continue;\n\n\t\t\toldKeys.delete(key);\n\n\t\t\tif (isOidKey(key)) continue;\n\n\t\t\tconst oldValue = from[key];\n\n\t\t\tdiffItems(key, value, oldValue);\n\t\t}\n\n\t\t// this set now only contains keys which were not in the new object\n\t\tif (!options.defaultUndefined) {\n\t\t\tfor (const key of oldKeys) {\n\t\t\t\tif (isOidKey(key)) continue;\n\t\t\t\t// push the delete for the property\n\t\t\t\tpatches.push({\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'remove',\n\t\t\t\t\t\tname: key,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\treturn patches;\n}\n\nexport function shallowDiffToPatches(\n\tfrom: any,\n\tto: any,\n\tgetNow: () => string,\n\tpatches: Operation[] = [],\n) {\n\tconst oid = getOid(from);\n\n\tfunction diffItems(key: string | number, value: any, oldValue: any) {\n\t\tif (!isDiffableObject(value)) {\n\t\t\t// for primitive fields, we can use plain sets and\n\t\t\t// do not need to recurse, of course\n\t\t\tif (!compareNonDiffable(value, oldValue)) {\n\t\t\t\tpatches.push({\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'set',\n\t\t\t\t\t\tname: key,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t'Shallow diff was given a nested object. This is an error in verdant!',\n\t\t\t);\n\t\t}\n\t}\n\n\tif (Array.isArray(from) && Array.isArray(to)) {\n\t\t// diffing is more naive than native array operations.\n\t\t// we can only look at each element and decide if it should\n\t\t// be replaced or removed - no moves or pushes, etc.\n\t\tfor (let i = 0; i < to.length; i++) {\n\t\t\tconst value = to[i];\n\t\t\tconst oldValue = from[i];\n\t\t\tdiffItems(i, value, oldValue);\n\t\t}\n\t\t// remove any remaining items at the end of the array\n\t\tconst deletedItemsAtEnd = from.length - to.length;\n\t\tif (deletedItemsAtEnd > 0) {\n\t\t\t// push the list-delete for the deleted items\n\t\t\tpatches.push({\n\t\t\t\toid,\n\t\t\t\ttimestamp: getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'list-delete',\n\t\t\t\t\tindex: to.length,\n\t\t\t\t\tcount: deletedItemsAtEnd,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t} else if (Array.isArray(from) || Array.isArray(to)) {\n\t\tthrow new Error('Cannot diff an array with an object');\n\t} else if (isDiffableObject(from) && isDiffableObject(to)) {\n\t\tconst oldKeys = new Set(Object.keys(from));\n\t\tfor (const [key, value] of Object.entries(to)) {\n\t\t\toldKeys.delete(key);\n\n\t\t\tif (isOidKey(key)) continue;\n\n\t\t\tconst oldValue = from[key];\n\n\t\t\tdiffItems(key, value, oldValue);\n\t\t}\n\n\t\t// this set now only contains keys which were not in the new object\n\t\tfor (const key of oldKeys) {\n\t\t\tif (isOidKey(key)) continue;\n\t\t\t// push the delete for the property\n\t\t\tpatches.push({\n\t\t\t\toid,\n\t\t\t\ttimestamp: getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'remove',\n\t\t\t\t\tname: key,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\treturn patches;\n}\n\n/**\n * Takes a basic object and constructs a patch list to create it and\n * all of its nested objects.\n */\nexport function initialToPatches(\n\tinitial: any,\n\trootOid: ObjectIdentifier,\n\tgetNow: () => string,\n\tcreateSubId?: () => string,\n\tpatches: Operation[] = [],\n) {\n\tassignOid(initial, rootOid);\n\tassignOidsToAllSubObjects(initial, createSubId);\n\tconst normalized = normalize(initial);\n\tfor (const key of normalized.keys()) {\n\t\tconst value = normalized.get(key);\n\t\tpatches.push({\n\t\t\toid: key,\n\t\t\ttimestamp: getNow(),\n\t\t\tdata: {\n\t\t\t\top: 'initialize',\n\t\t\t\tvalue: removeOid(value),\n\t\t\t},\n\t\t});\n\t}\n\treturn patches;\n}\n\nexport function shallowInitialToPatches(\n\tinitial: any,\n\trootOid: ObjectIdentifier,\n\tgetNow: () => string,\n\tpatches: Operation[] = [],\n) {\n\tpatches.push({\n\t\toid: rootOid,\n\t\ttimestamp: getNow(),\n\t\tdata: {\n\t\t\top: 'initialize',\n\t\t\tvalue: initial,\n\t\t},\n\t});\n\treturn patches;\n}\n\nexport function groupPatchesByIdentifier(patches: Operation[]) {\n\tconst grouped: Record<ObjectIdentifier, Operation[]> = {};\n\tfor (const patch of patches) {\n\t\tif (patch.oid in grouped) {\n\t\t\tgrouped[patch.oid].push(patch);\n\t\t} else {\n\t\t\tgrouped[patch.oid] = [patch];\n\t\t}\n\t}\n\treturn grouped;\n}\n\nexport function groupPatchesByRootOid(patches: Operation[]) {\n\tconst grouped: Record<ObjectIdentifier, Operation[]> = {};\n\tfor (const patch of patches) {\n\t\tconst root = getOidRoot(patch.oid);\n\t\tif (root in grouped) {\n\t\t\tgrouped[root].push(patch);\n\t\t} else {\n\t\t\tgrouped[root] = [patch];\n\t\t}\n\t}\n\treturn grouped;\n}\n\nexport function groupBaselinesByRootOid(baselines: DocumentBaseline[]) {\n\tconst grouped: Record<ObjectIdentifier, DocumentBaseline[]> = {};\n\tfor (const patch of baselines) {\n\t\tconst root = getOidRoot(patch.oid);\n\t\tif (root in grouped) {\n\t\t\tgrouped[root].push(patch);\n\t\t} else {\n\t\t\tgrouped[root] = [patch];\n\t\t}\n\t}\n\treturn grouped;\n}\n\nexport type NormalizedObject =\n\t| {\n\t\t\t[key: PropertyName]: PropertyValue;\n\t }\n\t| Array<PropertyValue>;\n\nfunction listCheck(obj: any): obj is Array<unknown> {\n\tif (!Array.isArray(obj)) {\n\t\tconsole.error(\n\t\t\t`Cannot apply list patch; expected array, received ${JSON.stringify(\n\t\t\t\tobj,\n\t\t\t)}. This suggests your data is changing from a list to an object over time. (OID: ${maybeGetOid(\n\t\t\t\tobj,\n\t\t\t)})`,\n\t\t);\n\t\treturn false;\n\t} else {\n\t\treturn true;\n\t}\n}\n\n/**\n * The incoming object should already be normalized!\n * This function will mutate the base object.\n */\nexport function applyPatch<T extends NormalizedObject>(\n\tbase: T | undefined,\n\tpatch: OperationPatch,\n\t/**\n\t * Optionally supply a list to which any refs which\n\t * are removed during the patch will be appended.\n\t */\n\tdeletedRefs?: (FileRef | ObjectRef)[],\n): T | undefined {\n\t// deleted objects are represented by undefined\n\t// and remain deleted unless re-initialized\n\tif ((base === undefined || base === null) && patch.op !== 'initialize') {\n\t\treturn base;\n\t}\n\t// ditch typing internally.\n\tconst baseAsAny = base as any;\n\tlet index;\n\tlet spliceResult: any[];\n\n\t// a helper, pass it a value which is about\n\t// to be removed and it will append it to the list\n\t// if it was a ref\n\tfunction checkRef(field: any) {\n\t\t// don't bother if not supplied\n\t\tif (!deletedRefs) return;\n\t\tif (isRef(field)) {\n\t\t\tdeletedRefs.push(field);\n\t\t}\n\t}\n\n\tswitch (patch.op) {\n\t\tcase 'set':\n\t\t\tcheckRef(baseAsAny[patch.name]);\n\t\t\tbaseAsAny[patch.name] = patch.value;\n\t\t\tbreak;\n\t\tcase 'remove':\n\t\t\tcheckRef(baseAsAny[patch.name]);\n\t\t\tdelete baseAsAny[patch.name];\n\t\t\tbreak;\n\t\tcase 'list-push':\n\t\t\tif (listCheck(base)) {\n\t\t\t\tbase.push(patch.value);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'list-delete':\n\t\t\tif (listCheck(base)) {\n\t\t\t\tcheckRef(base[patch.index]);\n\t\t\t\tbase.splice(patch.index, patch.count);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'list-move-by-index':\n\t\t\tif (listCheck(base)) {\n\t\t\t\tspliceResult = base.splice(patch.from, 1);\n\t\t\t\tbase.splice(patch.to, 0, spliceResult[0]);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'list-remove':\n\t\t\tif (listCheck(base)) {\n\t\t\t\tdo {\n\t\t\t\t\tconst valueToRemove = patch.value;\n\t\t\t\t\tif (patch.only === 'last') {\n\t\t\t\t\t\tif (isObjectRef(valueToRemove)) {\n\t\t\t\t\t\t\tindex = findLastIndex(\n\t\t\t\t\t\t\t\tbase,\n\t\t\t\t\t\t\t\t(item: any) => item.id === valueToRemove.id,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tindex = base.lastIndexOf(valueToRemove);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (isObjectRef(valueToRemove)) {\n\t\t\t\t\t\t\tindex = base.findIndex(\n\t\t\t\t\t\t\t\t(item: any) => item.id === valueToRemove.id,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tindex = base.indexOf(valueToRemove);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\tcheckRef(base[index]);\n\t\t\t\t\t\tbase.splice(index, 1);\n\t\t\t\t\t}\n\t\t\t\t} while (!patch.only && index !== -1);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'list-add':\n\t\t\tif (listCheck(base)) {\n\t\t\t\tconst alreadyHas = base.some((item: any) => {\n\t\t\t\t\tif (isObjectRef(item) && isObjectRef(patch.value)) {\n\t\t\t\t\t\treturn item.id === patch.value.id;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn item === patch.value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (!alreadyHas) {\n\t\t\t\t\tbase.push(patch.value);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'list-move-by-ref':\n\t\t\tif (listCheck(base)) {\n\t\t\t\tindex = base.indexOf(patch.value);\n\t\t\t\tspliceResult = base.splice(index, 1);\n\t\t\t\tbase.splice(patch.index, 0, spliceResult[0]);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'list-insert':\n\t\t\tif (listCheck(base)) {\n\t\t\t\tif (!patch.value && !patch.values) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Cannot apply list insert patch; expected value or values, received ${JSON.stringify(\n\t\t\t\t\t\t\tpatch,\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (patch.value) {\n\t\t\t\t\tbase.splice(patch.index, 0, patch.value);\n\t\t\t\t} else {\n\t\t\t\t\tbase.splice(patch.index, 0, ...patch.values!);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'delete':\n\t\t\t// collect all refs that are deleted\n\t\t\tif (Array.isArray(base)) {\n\t\t\t\tbase.forEach(checkRef);\n\t\t\t} else if (isObject(base)) {\n\t\t\t\tObject.values(base || {}).forEach(checkRef);\n\t\t\t}\n\t\t\treturn undefined;\n\t\tcase 'initialize':\n\t\t\treturn cloneDeep(patch.value);\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported patch operation: ${(patch as any).op}`);\n\t}\n\treturn base;\n}\n\nexport function applyOperations<T extends NormalizedObject>(\n\tbase: T | undefined,\n\toperations: Operation[],\n\tdeletedRefs?: (ObjectRef | FileRef)[],\n): T | undefined {\n\tlet cur = base as T | undefined;\n\tfor (const op of operations) {\n\t\tcur = applyPatch(cur, op.data, deletedRefs);\n\t}\n\treturn cur;\n}\n\n/**\n * Mutates the original object in place. Returns all referenced\n * objects oids.\n */\nexport function substituteRefsWithObjects(\n\tbase: any,\n\trefs: Map<ObjectIdentifier, any>,\n\tused: ObjectIdentifier[] = [],\n): ObjectIdentifier[] {\n\tif (Array.isArray(base)) {\n\t\tfor (let i = 0; i < base.length; i++) {\n\t\t\tconst item = base[i];\n\t\t\tbase[i] = dereference(item, refs, used);\n\t\t\tif (isObject(base[i])) {\n\t\t\t\tsubstituteRefsWithObjects(base[i], refs, used);\n\t\t\t}\n\t\t}\n\t} else if (isFileRef(base)) {\n\t\t// don't do anything with file refs\n\t} else if (isObject(base)) {\n\t\t// not sure where to put this assertion but it's important to make\n\t\t// sure all nested objects include an OID\n\t\tassert(\n\t\t\tmaybeGetOid(base),\n\t\t\t`Object ${JSON.stringify(base)} must have an oid`,\n\t\t);\n\t\tfor (const key of Object.keys(base)) {\n\t\t\tbase[key] = dereference(base[key], refs, used);\n\n\t\t\t// now that objects are in place, recursively substitute\n\t\t\tif (isObject(base[key])) {\n\t\t\t\tsubstituteRefsWithObjects(base[key], refs, used);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn used;\n}\n\nfunction dereference(\n\tinput: any,\n\trefs: Map<ObjectIdentifier, any>,\n\tused: ObjectIdentifier[],\n): any {\n\tif (isObjectRef(input)) {\n\t\tused.push(input.id);\n\t\tconst resolved = refs.get(input.id);\n\t\tassert(!!resolved, `No value was found in object map for ${input.id}`);\n\t\treturn assignOid(resolved, input.id);\n\t} else {\n\t\treturn input;\n\t}\n}\n\nexport function substituteFirstLevelObjectsWithRefs<\n\tBase extends { [key: string]: any } | any[],\n>(\n\tbase: Base,\n\trefObjects: Map<ObjectIdentifier, any> = new Map(),\n): Map<ObjectIdentifier, any> {\n\tif (Array.isArray(base)) {\n\t\tfor (let i = 0; i < base.length; i++) {\n\t\t\tconst item = base[i];\n\t\t\tif (isObject(item)) {\n\t\t\t\tconst oid = getOid(item);\n\t\t\t\tbase[i] = {\n\t\t\t\t\t'@@type': 'ref',\n\t\t\t\t\tid: oid,\n\t\t\t\t};\n\t\t\t\trefObjects.set(oid, item);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor (const [key, value] of Object.entries(base)) {\n\t\t\tif (isObject(value)) {\n\t\t\t\tbase[key] = {\n\t\t\t\t\t'@@type': 'ref',\n\t\t\t\t\tid: getOid(value),\n\t\t\t\t};\n\n\t\t\t\trefObjects.set(getOid(value), value);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn refObjects;\n}\n", "import { LEGACY_OID_KEY, OID_KEY } from '../oids.js';\nimport { isObject } from '../utils.js';\nimport type { StorageFieldSchema, StorageCollectionSchema } from './types.js';\n\nexport function isNullable(field: StorageFieldSchema) {\n\tif (field.type === 'any') return true;\n\tif (field.type === 'map') return false;\n\treturn field.nullable;\n}\n\nexport function hasDefault(field: StorageFieldSchema | undefined) {\n\tif (!field) return false;\n\tif (field.type === 'map') return true;\n\tif (field.type === 'array') return true;\n\tif (field.type === 'file') return false;\n\tif (field.type === 'object') return true;\n\treturn field.default !== undefined;\n}\n\nexport function isIndexed(field: StorageFieldSchema) {\n\tif (field.type === 'map') return false;\n\tif (field.type === 'object') return false;\n\tif (field.type === 'array') return false;\n\tif (field.type === 'file') return false;\n\tif (field.type === 'any') return false;\n\treturn field.indexed;\n}\n\nexport function addFieldDefaults(\n\tcollection: StorageCollectionSchema,\n\tvalue: any,\n) {\n\tfor (const [key, field] of Object.entries(collection.fields)) {\n\t\tconst defaultValue = getFieldDefault(field);\n\t\tif (\n\t\t\t(defaultValue !== undefined && value[key] === undefined) ||\n\t\t\t// covers the case where a previously nullable field\n\t\t\t// now has a default during a new migration\n\t\t\t(!isNullable(field) && value[key] === null)\n\t\t) {\n\t\t\tvalue[key] = defaultValue;\n\t\t}\n\t\tif (value[key]) {\n\t\t\ttraverseCollectionFieldsAndApplyDefaults(value[key], field);\n\t\t}\n\t}\n\treturn value;\n}\n\nexport function traverseCollectionFieldsAndApplyDefaults(\n\tvalue: any,\n\tfield: StorageFieldSchema,\n) {\n\tif (value === undefined || value === null) return value;\n\tif (field.type === 'object') {\n\t\tfor (const [key, subField] of Object.entries(field.properties)) {\n\t\t\tif (value[key] === undefined) {\n\t\t\t\tconst defaultValue = getFieldDefault(subField);\n\t\t\t\tif (defaultValue !== undefined) {\n\t\t\t\t\tvalue[key] = defaultValue;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttraverseCollectionFieldsAndApplyDefaults(value[key], subField);\n\t\t}\n\t} else if (field.type === 'array') {\n\t\tfor (const item of value) {\n\t\t\ttraverseCollectionFieldsAndApplyDefaults(item, field.items);\n\t\t}\n\t} else if (field.type === 'map') {\n\t\tfor (const [key, item] of Object.entries(value)) {\n\t\t\t// santiy check to weed out any id field\n\t\t\tif (key === OID_KEY || key === LEGACY_OID_KEY) continue;\n\t\t\ttraverseCollectionFieldsAndApplyDefaults(item, field.values);\n\t\t}\n\t}\n}\n\nexport function getFieldDefault(field: StorageFieldSchema) {\n\tif (\n\t\tfield.type === 'string' ||\n\t\tfield.type === 'number' ||\n\t\tfield.type === 'boolean' ||\n\t\tfield.type === 'any'\n\t) {\n\t\tif (field.default && typeof field.default === 'function') {\n\t\t\treturn field.default();\n\t\t} else if (field.default !== undefined) {\n\t\t\t// TODO: structuredClone?\n\t\t\treturn JSON.parse(JSON.stringify(field.default));\n\t\t}\n\t}\n\tif (field.type === 'array') {\n\t\treturn [];\n\t}\n\tif (field.type === 'map') {\n\t\treturn {};\n\t}\n\tif (field.type !== 'any' && field.nullable) {\n\t\treturn null;\n\t}\n\treturn undefined;\n}\n\nexport function removeExtraProperties(\n\tcollection: StorageCollectionSchema,\n\tvalue: any,\n) {\n\tfor (const [key, fieldValue] of Object.entries(value)) {\n\t\t// MUST NOT DELETE THESE!\n\t\tif (key === OID_KEY || key === LEGACY_OID_KEY) continue;\n\n\t\tif (!collection.fields[key]) {\n\t\t\tdelete value[key];\n\t\t} else {\n\t\t\ttraverseCollectionFieldsAndRemoveExtraProperties(\n\t\t\t\tfieldValue,\n\t\t\t\tcollection.fields[key],\n\t\t\t);\n\t\t}\n\t}\n\treturn value;\n}\n\nexport function traverseCollectionFieldsAndRemoveExtraProperties(\n\tvalue: any,\n\tfield: StorageFieldSchema,\n) {\n\tif (isObject(value) && field.type === 'object') {\n\t\tfor (const [key, fieldValue] of Object.entries(value)) {\n\t\t\tif (!field.properties[key]) {\n\t\t\t\tdelete value[key];\n\t\t\t} else {\n\t\t\t\ttraverseCollectionFieldsAndRemoveExtraProperties(\n\t\t\t\t\tfieldValue,\n\t\t\t\t\tfield.properties[key],\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else if (Array.isArray(value) && field.type === 'array') {\n\t\tfor (const item of value) {\n\t\t\ttraverseCollectionFieldsAndRemoveExtraProperties(item, field.items);\n\t\t}\n\t}\n}\n", "import {\n\tCollectionCompoundIndexFilter,\n\tCollectionFilter,\n\tMatchCollectionIndexFilter,\n\tRangeCollectionIndexFilter,\n\tSortIndexFilter,\n\tStartsWithIndexFilter,\n} from './types.js';\n\nexport function isMatchIndexFilter(\n\tfilter: CollectionFilter,\n): filter is MatchCollectionIndexFilter {\n\treturn (filter as any).equals !== undefined;\n}\n\nexport function isRangeIndexFilter(\n\tfilter: CollectionFilter,\n): filter is RangeCollectionIndexFilter {\n\treturn (\n\t\t(filter as any).gte !== undefined ||\n\t\t(filter as any).lte !== undefined ||\n\t\t(filter as any).gt !== undefined ||\n\t\t(filter as any).lt !== undefined\n\t);\n}\n\nexport function isCompoundIndexFilter(\n\tfilter: CollectionFilter,\n): filter is CollectionCompoundIndexFilter {\n\treturn !!(filter as any).match;\n}\n\nexport function isStartsWithIndexFilter(\n\tfilter: CollectionFilter,\n): filter is StartsWithIndexFilter {\n\treturn (filter as any).startsWith !== undefined;\n}\n\nexport function isSortIndexFilter(\n\tfilter: CollectionFilter,\n): filter is SortIndexFilter {\n\treturn (\n\t\t!isRangeIndexFilter(filter) &&\n\t\t!isMatchIndexFilter(filter) &&\n\t\t!isCompoundIndexFilter(filter) &&\n\t\t!isStartsWithIndexFilter(filter) &&\n\t\t(filter as any).order\n\t);\n}\n", "import { isIndexed } from './fields.js';\nimport {\n\tCollectionCompoundIndices,\n\tStorageCollectionSchema,\n\tStorageDirectSyntheticSchema,\n\tStorageFieldsSchema,\n\tStorageSchema,\n\tStorageSyntheticIndexSchema,\n\tStorageSyntheticIndices,\n} from './types.js';\n\nexport function collection<\n\tFields extends StorageFieldsSchema,\n\tSynthetics extends StorageSyntheticIndices<Fields>,\n\tCompounds extends CollectionCompoundIndices<Fields, Synthetics>,\n>({\n\tsynthetics,\n\tindexes,\n\t...input\n}: StorageCollectionSchema<\n\tFields,\n\tSynthetics,\n\tCompounds\n>): StorageCollectionSchema<Fields, Synthetics, Compounds> {\n\t// back compat - copy synthetics in with indexes\n\tconst finalIndexes = { ...synthetics, ...indexes };\n\t// add all indexed fields into the synthetic indices (back compat)\n\tfor (const [key, field] of Object.entries(input.fields)) {\n\t\tif (isIndexed(field)) {\n\t\t\tfinalIndexes[key] = {\n\t\t\t\tfield: key,\n\t\t\t} as StorageDirectSyntheticSchema<Fields>;\n\t\t}\n\t}\n\treturn {\n\t\t...input,\n\t\tindexes: finalIndexes as Synthetics,\n\t};\n}\n\nexport function schema<\n\t// Fields extends StorageFieldsSchema,\n\t// Indexes extends StorageSyntheticIndices<Fields>,\n\t// Compounds extends CollectionCompoundIndices<Fields, Indexes>,\n\tSchema extends StorageSchema<{\n\t\t[key: string]: StorageCollectionSchema<any, any, any>;\n\t}>,\n>(input: Schema): StorageSchema {\n\treturn input;\n}\n\nexport * from './types.js';\n\nexport * from './indexFilters.js';\nexport * from './fields.js';\n", "import {\n\tStorageCollectionSchema,\n\tStorageSyntheticIndexSchema,\n\tCollectionCompoundIndex,\n\tisIndexed,\n\tStorageDirectSyntheticSchema,\n} from './index.js';\n\n// unlikely to be used unicode character\nexport const COMPOUND_INDEX_SEPARATOR = '\\uFFFFFE';\n// 1 lower than separator\nexport const COMPOUND_INDEX_LOWER_BOUND_SEPARATOR = '\\u0000';\n// 1 higher than separator\nexport const COMPOUND_INDEX_UPPER_BOUND_SEPARATOR = '\\uFFFFFF';\n\ntype IndexableFieldValue = string | number | boolean | any[];\nexport type CompoundIndexValue = string | string[];\n\nexport function createCompoundIndexValue(\n\t...fields: IndexableFieldValue[]\n): CompoundIndexValue {\n\tconst value = expandArrayIndex(fields);\n\tif (value.length === 1) {\n\t\treturn value[0];\n\t}\n\treturn value;\n}\n\nexport function createUpperBoundIndexValue(\n\t...fields: IndexableFieldValue[]\n): string {\n\treturn (\n\t\tfields.join(COMPOUND_INDEX_SEPARATOR) +\n\t\t`${COMPOUND_INDEX_UPPER_BOUND_SEPARATOR}`\n\t);\n}\n\nexport function createLowerBoundIndexValue(\n\t...fields: IndexableFieldValue[]\n): string {\n\treturn (\n\t\tfields.join(COMPOUND_INDEX_SEPARATOR) +\n\t\t`${COMPOUND_INDEX_SEPARATOR}${COMPOUND_INDEX_LOWER_BOUND_SEPARATOR}`\n\t);\n}\n\n/**\n * Whenever an array value is included in a compound index, we have to expand\n * the value to include all permutations of values in the array.\n * For example if we had an index id + tags on a document\n *\n * {\n * id: '1',\n * tags: ['a', 'b']\n * }\n *\n * we want to create an index:\n *\n * id_tags: ['1#a', '1#b']\n *\n * If multiple arrays are indexed we have to exponentially expand...\n *\n * id_tags_tags2: ['1#a#a', '1#a#b', '1#b#a', '1#b#b']\n *\n * To generalize this we construct a 2-level array of strings.\n * Iterating over indexed values, we expand each item into N items if\n * the current value is an array.\n *\n * Then we combine all nested arrays into compound index values.\n * This will produce an array of 1 element if none of the indexed values\n * were arrays. The caller should unwrap that.\n *\n * This function also deduplicates values.\n */\nfunction expandArrayIndex(fields: IndexableFieldValue[]): string[] {\n\tlet value: string[][] = [[]];\n\tfor (const field of fields) {\n\t\tif (Array.isArray(field)) {\n\t\t\tconst newValue: string[][] = [];\n\t\t\tfor (const previousValue of value) {\n\t\t\t\tfor (const fieldValue of field) {\n\t\t\t\t\tnewValue.push(previousValue.concat(fieldValue));\n\t\t\t\t}\n\t\t\t}\n\t\t\tvalue = newValue;\n\t\t} else {\n\t\t\tfor (const item of value) {\n\t\t\t\titem.push(`${field}`);\n\t\t\t}\n\t\t}\n\t}\n\treturn Array.from(\n\t\tnew Set(\n\t\t\tvalue.map((item) => {\n\t\t\t\treturn item.join(COMPOUND_INDEX_SEPARATOR);\n\t\t\t}),\n\t\t),\n\t);\n}\n\nexport function isDirectSynthetic(\n\tindex: any,\n): index is StorageDirectSyntheticSchema<any> {\n\treturn !!index.field;\n}\n\nexport function computeSynthetics(schema: StorageCollectionSchema, obj: any) {\n\tconst result: Record<string, any> = {};\n\tfor (const [name, property] of Object.entries(schema.indexes || {})) {\n\t\tconst index = property as StorageSyntheticIndexSchema<any>;\n\t\tif (isDirectSynthetic(index)) {\n\t\t\tresult[name] = sanitizeIndexValue(obj[index.field]);\n\t\t} else {\n\t\t\tresult[name] = sanitizeIndexValue(index.compute(obj));\n\t\t}\n\t}\n\treturn result;\n}\n\nexport function computeCompoundIndices(\n\tschema: StorageCollectionSchema<any, any, any>,\n\tdoc: any,\n): any {\n\treturn Object.entries(schema.compounds || {}).reduce<\n\t\tRecord<string, CompoundIndexValue>\n\t>(\n\t\t(acc, [indexKey, index]) => {\n\t\t\tacc[indexKey] = createCompoundIndexValue(\n\t\t\t\t...(index as CollectionCompoundIndex<any, any>).of.map(\n\t\t\t\t\t(key) => doc[key] as string | number,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<string, CompoundIndexValue>,\n\t);\n}\n\nfunction computeIndexedFields(schema: StorageCollectionSchema, doc: any) {\n\treturn Object.entries(schema.fields).reduce<Record<string, any>>(\n\t\t(acc, [key, field]) => {\n\t\t\tif (isIndexed(field)) {\n\t\t\t\tacc[key] = sanitizeIndexValue(doc[key]);\n\t\t\t}\n\t\t\treturn acc;\n\t\t},\n\t\t{},\n\t);\n}\n\nexport function getIndexValues(\n\tschema: StorageCollectionSchema<any, any, any>,\n\tdoc: any,\n) {\n\treturn {\n\t\t[schema.primaryKey]: doc[schema.primaryKey],\n\t\t...computeIndexedFields(schema, doc),\n\t\t...computeSynthetics(schema, doc),\n\t\t...computeCompoundIndices(schema, doc),\n\t\t'@@@snapshot': doc,\n\t};\n}\n\nexport function assignIndexValues(\n\tschema: StorageCollectionSchema<any, any, any>,\n\tdoc: any,\n) {\n\tObject.assign(doc, computeSynthetics(schema, doc));\n\tObject.assign(doc, computeCompoundIndices(schema, doc));\n\treturn doc;\n}\n\nexport const NULL_INDEX_VALUE = 'null';\n\nexport function sanitizeIndexValue(\n\tvalue: unknown,\n): string | number | (string | number)[] {\n\tif (value === null) {\n\t\treturn NULL_INDEX_VALUE;\n\t}\n\tif (typeof value === 'string' || typeof value === 'number') {\n\t\treturn value;\n\t}\n\tif (typeof value === 'boolean' || value === null) {\n\t\treturn `${value}`;\n\t}\n\tif (value === undefined) {\n\t\t// this shouldn't happen ,but for resiliency...\n\t\treturn 'undefined';\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn value.map(sanitizeIndexValue) as any;\n\t}\n\tthrow new Error(`Unsupported index value: ${value}`);\n}\n", "import {\n\tstableStringify,\n\tStorageCollectionSchema,\n\tStorageSchema,\n\taddFieldDefaults,\n\tStorageDocument,\n\tCollectionFilter,\n\tStorageDocumentInit,\n\tremoveExtraProperties,\n\tassert,\n\thasOid,\n\tassignOid,\n\tgetOid,\n\thasDefault,\n} from './index.js';\n\n/**@deprecated */\nexport interface DroppedCollectionMigrationStrategy<\n\tOld extends StorageCollectionSchema<any, any, any>,\n> {\n\t(old: Old): void | Promise<void>;\n}\n/**@deprecated */\nexport interface PreservedCollectionMigrationStrategy<\n\tOld extends StorageCollectionSchema<any, any, any>,\n\tNew extends StorageCollectionSchema<any, any, any>,\n> {\n\t(\n\t\told: StorageDocument<Old>,\n\t): StorageDocument<New> | Promise<StorageDocument<New>>;\n}\n/** @deprecated */\ntype MigrationStrategy<\n\tOld extends StorageCollectionSchema<any, any, any>,\n\tNew extends StorageCollectionSchema<any, any, any>,\n> =\n\t| DroppedCollectionMigrationStrategy<Old>\n\t| PreservedCollectionMigrationStrategy<Old, New>;\n/** @deprecated */\nexport type MigrationsKeyedOnCollection<\n\tOld extends StorageSchema<any>,\n\tNew extends StorageSchema<any>,\n> =\n\t| PreservedCollectionMigrations<Old, New>\n\t| DroppedCollectionMigrations<Old, New>;\n\n/**@deprecated */\ntype NotInSchema<\n\tName extends string | number | symbol,\n\tSchema extends StorageSchema<any>,\n> = Name extends keyof Schema['collections'] ? never : Name;\n/** @deprecated */\ntype InSchema<\n\tName extends string | number | symbol,\n\tSchema extends StorageSchema<any>,\n> = Name extends keyof Schema['collections'] ? Name : never;\n/** @deprecated */\ntype DroppedCollections<\n\tOld extends StorageSchema<any>,\n\tNew extends StorageSchema<any>,\n> = {\n\t[Key in keyof Old['collections'] as NotInSchema<\n\t\tKey,\n\t\tNew\n\t>]: StorageCollectionSchema<any, any, any>;\n};\n/** @deprecated */\ntype PreservedCollections<\n\tOld extends StorageSchema<any>,\n\tNew extends StorageSchema<any>,\n> = {\n\t[Key in keyof Old['collections'] as InSchema<\n\t\tKey,\n\t\tNew\n\t>]: StorageCollectionSchema<any, any, any>;\n};\n/** @deprecated */\ntype DroppedCollectionMigrations<\n\tOld extends StorageSchema<any>,\n\tNew extends StorageSchema<any>,\n> = {\n\t[Key in keyof DroppedCollections<\n\t\tOld,\n\t\tNew\n\t>]: DroppedCollectionMigrationStrategy<Old['collections'][Key]>;\n};\n/** @deprecated */\ntype PreservedCollectionMigrations<\n\tOld extends StorageSchema<any>,\n\tNew extends StorageSchema<any>,\n> = {\n\t[Key in keyof PreservedCollections<\n\t\tOld,\n\t\tNew\n\t>]: PreservedCollectionMigrationStrategy<\n\t\tOld['collections'][Key],\n\t\tNew['collections'][Key]\n\t>;\n};\n\n/** @deprecated */\ntype StrategyFor<\n\tKey extends string,\n\tOld extends StorageSchema<any>,\n\tNew extends StorageSchema<any>,\n> = Key extends keyof New['collections']\n\t? PreservedCollectionMigrationStrategy<\n\t\t\tOld['collections'][Key],\n\t\t\tNew['collections'][Key]\n\t >\n\t: DroppedCollectionMigrationStrategy<Old['collections'][Key]>;\n\n/** @deprecated */\ntype DeprecatedMigrationRunner<\n\tOld extends StorageSchema<any>,\n\tNew extends StorageSchema<any>,\n> = <Collection extends Extract<keyof Old['collections'], string>>(\n\tcollection: Collection,\n\tstrategy: StrategyFor<Collection, Old, New>,\n) => Promise<void>;\n\n/** @deprecated */\ntype DeprecatedMigrationQueryMaker<\n\tCollection extends StorageCollectionSchema<any, any, any>,\n> = {\n\tget(primaryKey: string): Promise<StorageDocument<Collection> | undefined>;\n\tfindOne(\n\t\tquery: CollectionFilter,\n\t): Promise<StorageDocument<Collection> | undefined>;\n\tfindAll(query?: CollectionFilter): Promise<StorageDocument<Collection>[]>;\n};\n\n/** @deprecated */\ntype DeprecatedMigrationQueries<Old extends StorageSchema<any>> = {\n\t[Key in keyof Old['collections']]: DeprecatedMigrationQueryMaker<\n\t\tOld['collections'][Key]\n\t>;\n};\n\n/** @deprecated */\ntype DeprecatedMigrationMutations<New extends StorageSchema> = {\n\t[Key in keyof New['collections']]: {\n\t\tput(\n\t\t\tdocument: StorageDocumentInit<New['collections'][Key]>,\n\t\t): Promise<StorageDocument<New['collections'][Key]>>;\n\t\tdelete(primaryKey: string): Promise<void>;\n\t};\n};\n/** @deprecated */\nexport interface DeprecatedMigrationTools<\n\tOld extends StorageSchema<any>,\n\tNew extends StorageSchema<any>,\n> {\n\tmigrate: DeprecatedMigrationRunner<Old, New>;\n\tidentity: <T>(val: T) => T;\n\t/**\n\t * @deprecated - default field values are automatically\n\t * applied during migration, you don't need to use this.\n\t * Please remove it from your migrations - even old ones\n\t * (old migrations can be updated!)\n\t */\n\twithDefaults: (collectionName: string, value: any) => any;\n\tqueries: DeprecatedMigrationQueries<Old>;\n\tmutations: DeprecatedMigrationMutations<New>;\n\tinfo: {\n\t\tchangedCollections: keyof Old['collections'][];\n\t\taddedCollections: keyof New['collections'][];\n\t\tremovedCollections: keyof Old['collections'][];\n\t};\n}\n\nexport interface MigrationEngine {\n\tmigrate: (collection: string, strategy: (val: any) => any) => Promise<void>;\n\tqueries: MigrationQueries<any>;\n\tmutations: MigrationMutations<any>;\n\t/** OIDs of any new documents created during the migration */\n\tnewOids: string[];\n\t/** Promises that should be resolved before completing the migration */\n\tawaitables: Promise<any>[];\n\tlog: (...messages: any[]) => void;\n}\n/** @deprecated */\ntype DeprecatedMigrationProcedure<\n\tOld extends StorageSchema,\n\tNew extends StorageSchema,\n> = (tools: DeprecatedMigrationTools<Old, New>) => Promise<void>;\n\ntype EmptySchema = {\n\tversion: 0;\n\tcollections: {};\n};\nconst emptySchema: EmptySchema = {\n\tversion: 0,\n\tcollections: {},\n};\n\n/** @deprecated - use createMigration */\nexport function migrate<Schema extends StorageSchema>(\n\tschema: Schema,\n\tprocedure: DeprecatedMigrationProcedure<EmptySchema, Schema>,\n): Migration<EmptySchema, Schema>;\n/** @deprecated = use createMigration */\nexport function migrate<Old extends StorageSchema, New extends StorageSchema>(\n\toldSchema: Old,\n\tnewSchema: New,\n\tprocedure: DeprecatedMigrationProcedure<Old, New>,\n): Migration<Old, New>;\nexport function migrate(\n\toldSchemaOrNewSchema: any,\n\tnewSchemaOrProcedure: any,\n\tprocedureIfTwoSchemas?: any,\n) {\n\tconst isProcedureSecondArgument = typeof newSchemaOrProcedure === 'function';\n\tconst oldSchema = isProcedureSecondArgument\n\t\t? emptySchema\n\t\t: oldSchemaOrNewSchema;\n\tconst newSchema = isProcedureSecondArgument\n\t\t? oldSchemaOrNewSchema\n\t\t: newSchemaOrProcedure;\n\tconst procedure = isProcedureSecondArgument\n\t\t? newSchemaOrProcedure\n\t\t: procedureIfTwoSchemas;\n\t// diff to determine changed collections\n\tconst changedCollections: string[] = Object.keys(\n\t\tnewSchema.collections,\n\t).filter(\n\t\t(key) =>\n\t\t\toldSchema.collections[key] &&\n\t\t\tstableStringify(oldSchema.collections[key]) !==\n\t\t\t\tstableStringify(newSchema.collections[key]),\n\t);\n\tconst removedCollections: string[] = Object.keys(\n\t\toldSchema.collections,\n\t).filter((key) => !newSchema.collections[key]);\n\tconst addedCollections = Object.keys(newSchema.collections).filter(\n\t\t(key) => !oldSchema.collections[key],\n\t);\n\t// collections which added one or more field defaults\n\tconst autoMigratedCollections = new Set<string>();\n\tfor (const collection of changedCollections) {\n\t\tconst oldFields = oldSchema.collections[collection].fields;\n\t\tconst newFields = newSchema.collections[collection].fields;\n\t\t// a new default was added - we can auto-migrate it\n\t\tif (\n\t\t\tObject.keys(newFields).some(\n\t\t\t\t(key) => !oldFields[key]?.default && newFields[key]?.default,\n\t\t\t)\n\t\t) {\n\t\t\tautoMigratedCollections.add(collection);\n\t\t}\n\t\t// a field was removed - we can auto-migrate it\n\t\tif (Object.keys(oldFields).some((key) => !newFields[key])) {\n\t\t\tautoMigratedCollections.add(collection);\n\t\t}\n\t}\n\n\tconst addedIndexes: Record<string, MigrationIndexDescription[]> = {};\n\tconst removedIndexes: Record<string, MigrationIndexDescription[]> = {};\n\tfor (const changed of [...changedCollections, ...addedCollections]) {\n\t\tconst oldIndexes = getIndexes(oldSchema.collections[changed]);\n\t\tconst newIndexes = getIndexes(newSchema.collections[changed]);\n\t\tconst added = newIndexes.filter(\n\t\t\t(index) => !oldIndexes.find((i) => i.name === index.name),\n\t\t);\n\t\tconst removed = oldIndexes.filter(\n\t\t\t(index) => !newIndexes.find((i) => i.name === index.name),\n\t\t);\n\t\tif (added.length > 0) {\n\t\t\taddedIndexes[changed] = added;\n\t\t\t// FIXME: don't o(n^2) this\n\t\t\tif (changedCollections.includes(changed)) {\n\t\t\t\tautoMigratedCollections.add(changed);\n\t\t\t}\n\t\t}\n\t\tif (removed.length > 0) {\n\t\t\tremovedIndexes[changed] = removed;\n\t\t\t// FIXME: don't o(n^2) this\n\t\t\tif (changedCollections.includes(changed)) {\n\t\t\t\tautoMigratedCollections.add(changed);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst withDefaults = (collectionName: string, val: any) => {\n\t\treturn addFieldDefaults(newSchema.collections[collectionName], val);\n\t};\n\tconst autoMigration = (collectionName: string) => (val: any) => {\n\t\tconst collection = newSchema.collections[collectionName];\n\t\treturn addFieldDefaults(collection, removeExtraProperties(collection, val));\n\t};\n\n\treturn {\n\t\tversion: newSchema.version,\n\t\tmigrate: async (engine: MigrationEngine) => {\n\t\t\tconst migratedCollections: string[] = [];\n\t\t\tawait procedure({\n\t\t\t\tmigrate: async (collection: any, strategy: any) => {\n\t\t\t\t\tconst auto = autoMigration(collection);\n\t\t\t\t\tconst wrapped = async (val: any) => {\n\t\t\t\t\t\tconst baseValue = await strategy(val);\n\t\t\t\t\t\t// assign OID from original value in case user's strategy\n\t\t\t\t\t\t// involves cloning\n\t\t\t\t\t\tassignOid(baseValue, getOid(val));\n\t\t\t\t\t\tconst result = auto(baseValue);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t};\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tawait engine.migrate(collection, wrapped);\n\t\t\t\t\tmigratedCollections.push(collection);\n\t\t\t\t\t// since the user migrated this one and we wrap their\n\t\t\t\t\t// strategy with auto-migration, we can remove it from\n\t\t\t\t\t// the auto-migration list\n\t\t\t\t\tautoMigratedCollections.delete(collection);\n\t\t\t\t},\n\t\t\t\tidentity: (val: any) => val,\n\t\t\t\twithDefaults,\n\t\t\t\tinfo: {\n\t\t\t\t\tchangedCollections,\n\t\t\t\t\taddedCollections,\n\t\t\t\t\tremovedCollections,\n\t\t\t\t},\n\t\t\t\tqueries: engine.queries,\n\t\t\t\tmutations: engine.mutations,\n\t\t\t});\n\n\t\t\t// mandatory migration of fields which had defaults added or\n\t\t\t// fields removed but weren't migrated by the user\n\n\t\t\tif (newSchema.version > 1) {\n\t\t\t\tengine.log(\n\t\t\t\t\t'debug',\n\t\t\t\t\t'auto-migrating collections with new defaults',\n\t\t\t\t\tautoMigratedCollections,\n\t\t\t\t);\n\t\t\t\tfor (const name of autoMigratedCollections) {\n\t\t\t\t\tawait engine.migrate(name, autoMigration(name));\n\t\t\t\t\tmigratedCollections.push(name);\n\t\t\t\t}\n\n\t\t\t\tconst unmigrated = changedCollections.filter(\n\t\t\t\t\t(collection) => !migratedCollections.includes(collection),\n\t\t\t\t);\n\t\t\t\tif (unmigrated.length > 0) {\n\t\t\t\t\t// TODO: does this deserve a full-on error?\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`Unmigrated changed collections from version ${oldSchema.version} to version ${newSchema.version}:`,\n\t\t\t\t\t\tunmigrated,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tremovedCollections,\n\t\taddedIndexes,\n\t\tremovedIndexes,\n\t\tallCollections: Object.keys(newSchema.collections),\n\t\tchangedCollections,\n\t\taddedCollections,\n\t\toldCollections: Object.keys(oldSchema.collections),\n\t\toldSchema,\n\t\tnewSchema,\n\t};\n}\n\nexport interface MigrationIndexDescription {\n\tname: string;\n\tmultiEntry: boolean;\n\tsynthetic: boolean;\n\tcompound: boolean;\n}\n\nexport interface Migration<\n\tOld extends StorageSchema = any,\n\tNew extends StorageSchema = any,\n> {\n\tversion: number;\n\toldSchema: Old;\n\tnewSchema: New;\n\tmigrate: (engine: MigrationEngine) => Promise<void>;\n\t/** Collections which are added in the new schema and not present in the old */\n\taddedCollections: string[];\n\t/** Collections which were removed from the old schema */\n\tremovedCollections: string[];\n\t/** All collections which exist after the migration has completed - i.e. the ones in the new schema */\n\tallCollections: string[];\n\t/** Only the collections which were in the old schema */\n\toldCollections: string[];\n\t/** Collections whose fields or indexes changed between schemas */\n\tchangedCollections: string[];\n\t// new indexes mapped by collection name\n\taddedIndexes: Record<string, MigrationIndexDescription[]>;\n\t// removed indexes mapped by collection name\n\tremovedIndexes: Record<string, MigrationIndexDescription[]>;\n}\n\nexport function migrationRange(from: number, to: number) {\n\treturn [...Array(to - from).keys()].map((i) => 1 + i + from);\n}\n\nfunction getIndexes<Coll extends StorageCollectionSchema<any, any, any>>(\n\tcollection: Coll | undefined,\n): MigrationIndexDescription[] {\n\tif (!collection) return [];\n\n\treturn [\n\t\t...Object.keys(collection.indexes || {}).map((key) => ({\n\t\t\tname: key,\n\t\t\tmultiEntry: ['array', 'string[]', 'number[]', 'boolean[]'].includes(\n\t\t\t\tcollection.indexes[key].type,\n\t\t\t),\n\t\t\tsynthetic: true,\n\t\t\tcompound: false,\n\t\t})),\n\t\t...Object.keys(collection.compounds || {}).map((key) => ({\n\t\t\tname: key,\n\t\t\tmultiEntry: collection.compounds[key].of.some(\n\t\t\t\t(fieldName: string) =>\n\t\t\t\t\t(collection.fields[fieldName] || collection.indexes[fieldName])\n\t\t\t\t\t\t.type === 'array',\n\t\t\t),\n\t\t\tsynthetic: false,\n\t\t\tcompound: true,\n\t\t})),\n\t];\n}\n\n/** @deprecated - use createMigration with no procedure function */\nexport function createDefaultMigration(\n\tschema: StorageSchema,\n): Migration<{ version: 0; collections: {} }>;\n/** @deprecated - use createMigration with no procedure function */\nexport function createDefaultMigration<Old extends StorageSchema>(\n\toldSchema: Old,\n\tnewSchema: StorageSchema,\n): Migration<Old>;\nexport function createDefaultMigration(\n\tschema: StorageSchema,\n\tnewSchema?: StorageSchema<any>,\n) {\n\tlet oldSchema = newSchema\n\t\t? schema\n\t\t: {\n\t\t\t\tversion: 0,\n\t\t\t\tcollections: {},\n\t\t };\n\treturn migrate(oldSchema, newSchema || schema, async ({ migrate, info }) => {\n\t\tif ((newSchema || schema).version === 1) return;\n\n\t\tfor (const collection of info.changedCollections as any) {\n\t\t\t// @ts-ignore indefinite type resolution\n\t\t\tawait migrate(collection, (old) => old);\n\t\t}\n\t});\n}\n\n/** New, simpler type-safety migration tools */\ntype DocumentShape<Init = any, Snapshot = any> = {\n\tinit: Init;\n\tsnapshot: Snapshot;\n};\ntype SchemaDocuments = Record<string, DocumentShape>;\ntype CollectionProcedure<OldSnapshot, NewInit> = {\n\t(old: OldSnapshot): NewInit | Promise<NewInit>;\n};\ntype MigrationQueries<Old extends SchemaDocuments> = {\n\t[Key in keyof Old]: {\n\t\tget(primaryKey: string): Promise<Old[Key]['snapshot'] | undefined>;\n\t\tfindOne(query: CollectionFilter): Promise<Old[Key]['snapshot'] | undefined>;\n\t\tfindAll(query?: CollectionFilter): Promise<Old[Key]['snapshot'][]>;\n\t};\n};\ntype MigrationMutations<New extends SchemaDocuments> = {\n\t[Key in keyof New]: {\n\t\tput(document: New[Key]['init']): Promise<New[Key]['snapshot']>;\n\t\tdelete(primaryKey: string): Promise<void>;\n\t};\n};\ntype MigrationTools<\n\tOld extends SchemaDocuments,\n\tNew extends SchemaDocuments,\n> = {\n\t/**\n\t * Process a change in a collection's documents by taking in each existing\n\t * document and returning its new shape. This is typed so you can be\n\t * confident the proper transformations are made.\n\t */\n\tmigrate: <Collection extends keyof Old & keyof New>(\n\t\tcollection: Collection,\n\t\tstrategy: CollectionProcedure<\n\t\t\tOld[Collection]['snapshot'],\n\t\t\tNew[Collection]['init']\n\t\t>,\n\t) => Promise<void>;\n\tmutations: MigrationMutations<New>;\n\tqueries: MigrationQueries<Old>;\n\tinfo: {\n\t\tchangedCollections: (keyof Old & keyof New)[];\n\t\taddedCollections: (keyof New)[];\n\t\tremovedCollections: (keyof Old)[];\n\t};\n};\ntype MigrationProcedure<\n\tOld extends SchemaDocuments,\n\tNew extends SchemaDocuments,\n> = {\n\t(tools: MigrationTools<Old, New>): Promise<void>;\n};\ntype InitialMigrationTools<New extends SchemaDocuments> = {\n\tmutations: MigrationMutations<New>;\n};\ntype InitialMigrationProcedure<New extends SchemaDocuments> = {\n\t(tools: InitialMigrationTools<New>): Promise<void>;\n};\n\nexport function createMigration<New extends SchemaDocuments>(\n\tnewSchema: StorageSchema,\n\tprocedure?: InitialMigrationProcedure<New>,\n): any;\nexport function createMigration<\n\tOld extends SchemaDocuments,\n\tNew extends SchemaDocuments,\n>(\n\toldSchema: StorageSchema,\n\tnewSchema: StorageSchema,\n\tprocedure?: MigrationProcedure<Old, New>,\n): any;\nexport function createMigration(\n\tmaybeOldSchema: StorageSchema,\n\tmaybeNewSchemaOrProcedure?:\n\t\t| StorageSchema\n\t\t| InitialMigrationProcedure<SchemaDocuments>,\n\tmaybeProcedure?: MigrationProcedure<SchemaDocuments, SchemaDocuments>,\n): any {\n\tconst isProcedureSecondArgument =\n\t\ttypeof maybeNewSchemaOrProcedure === 'function' ||\n\t\tmaybeNewSchemaOrProcedure === undefined;\n\tconst oldSchema = isProcedureSecondArgument ? emptySchema : maybeOldSchema;\n\tconst newSchema = isProcedureSecondArgument\n\t\t? maybeOldSchema\n\t\t: maybeNewSchemaOrProcedure;\n\tconst procedure = isProcedureSecondArgument\n\t\t? maybeNewSchemaOrProcedure\n\t\t: maybeProcedure;\n\tassert(oldSchema, 'Invalid arguments to createMigration');\n\tassert(newSchema, 'Invalid arguments to createMigration');\n\tconst {\n\t\tchangedCollections,\n\t\taddedCollections,\n\t\tremovedCollections,\n\t\taddedIndexes,\n\t\tremovedIndexes,\n\t\tautoMigratedCollections,\n\t\tautoMigration,\n\t} = getMigrationInfo(oldSchema, newSchema);\n\n\treturn {\n\t\tversion: newSchema.version,\n\t\tmigrate: async (engine: MigrationEngine) => {\n\t\t\tconst migratedCollections: string[] = [];\n\t\t\tconst migrate = async (collection: any, strategy: any) => {\n\t\t\t\tconst auto = autoMigration(collection);\n\t\t\t\tconst wrapped = async (val: any) => {\n\t\t\t\t\tconst baseValue = await strategy(val);\n\t\t\t\t\t// assign OID from original value in case user's strategy\n\t\t\t\t\t// involves cloning\n\t\t\t\t\tassignOid(baseValue, getOid(val));\n\t\t\t\t\tconst result = auto(baseValue);\n\t\t\t\t\treturn result;\n\t\t\t\t};\n\t\t\t\t// @ts-ignore\n\t\t\t\tawait engine.migrate(collection, wrapped);\n\t\t\t\tmigratedCollections.push(collection);\n\t\t\t\t// since the user migrated this one and we wrap their\n\t\t\t\t// strategy with auto-migration, we can remove it from\n\t\t\t\t// the auto-migration list\n\t\t\t\tautoMigratedCollections.delete(collection);\n\t\t\t};\n\t\t\tawait procedure?.({\n\t\t\t\tmigrate,\n\t\t\t\tinfo: {\n\t\t\t\t\tchangedCollections,\n\t\t\t\t\taddedCollections,\n\t\t\t\t\tremovedCollections,\n\t\t\t\t},\n\t\t\t\tqueries: engine.queries,\n\t\t\t\tmutations: engine.mutations,\n\t\t\t});\n\n\t\t\t// mandatory migration of fields which had defaults added or\n\t\t\t// fields removed but weren't migrated by the user\n\n\t\t\tif (newSchema.version > 1) {\n\t\t\t\tengine.log(\n\t\t\t\t\t'debug',\n\t\t\t\t\t'auto-migrating collections with new defaults',\n\t\t\t\t\tautoMigratedCollections,\n\t\t\t\t);\n\t\t\t\tfor (const name of autoMigratedCollections) {\n\t\t\t\t\tawait engine.migrate(name, autoMigration(name));\n\t\t\t\t\tmigratedCollections.push(name);\n\t\t\t\t}\n\n\t\t\t\tconst unmigrated = changedCollections.filter(\n\t\t\t\t\t(collection) => !migratedCollections.includes(collection),\n\t\t\t\t);\n\t\t\t\tif (unmigrated.length > 0) {\n\t\t\t\t\t// TODO: does this deserve a full-on error?\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`Unmigrated changed collections from version ${oldSchema.version} to version ${newSchema.version}:`,\n\t\t\t\t\t\tunmigrated,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tremovedCollections,\n\t\taddedIndexes,\n\t\tremovedIndexes,\n\t\tallCollections: Object.keys(newSchema.collections),\n\t\tchangedCollections,\n\t\taddedCollections,\n\t\toldCollections: Object.keys(oldSchema.collections),\n\t\toldSchema,\n\t\tnewSchema,\n\t};\n}\n\n// common tools\nfunction getMigrationInfo(oldSchema: StorageSchema, newSchema: StorageSchema) {\n\tconst changedCollections: string[] = Object.keys(\n\t\tnewSchema.collections,\n\t).filter(\n\t\t(key) =>\n\t\t\toldSchema.collections[key] &&\n\t\t\tstableStringify(oldSchema.collections[key]) !==\n\t\t\t\tstableStringify(newSchema.collections[key]),\n\t);\n\tconst removedCollections: string[] = Object.keys(\n\t\toldSchema.collections,\n\t).filter((key) => !newSchema.collections[key]);\n\tconst addedCollections = Object.keys(newSchema.collections).filter(\n\t\t(key) => !oldSchema.collections[key],\n\t);\n\t// collections which added one or more field defaults\n\tconst autoMigratedCollections = new Set<string>();\n\tfor (const collection of changedCollections) {\n\t\tconst oldFields = oldSchema.collections[collection].fields;\n\t\tconst newFields = newSchema.collections[collection].fields;\n\t\t// a new default was added - we can auto-migrate it\n\t\tif (\n\t\t\tObject.keys(newFields).some(\n\t\t\t\t(key) => !hasDefault(oldFields[key]) && hasDefault(newFields[key]),\n\t\t\t)\n\t\t) {\n\t\t\tautoMigratedCollections.add(collection);\n\t\t}\n\t\t// a field was removed - we can auto-migrate it\n\t\tif (Object.keys(oldFields).some((key) => !newFields[key])) {\n\t\t\tautoMigratedCollections.add(collection);\n\t\t}\n\t}\n\n\tconst addedIndexes: Record<string, MigrationIndexDescription[]> = {};\n\tconst removedIndexes: Record<string, MigrationIndexDescription[]> = {};\n\tfor (const changed of [...changedCollections, ...addedCollections]) {\n\t\tconst oldIndexes = getIndexes(oldSchema.collections[changed]);\n\t\tconst newIndexes = getIndexes(newSchema.collections[changed]);\n\t\tconst added = newIndexes.filter(\n\t\t\t(index) => !oldIndexes.find((i) => i.name === index.name),\n\t\t);\n\t\tconst removed = oldIndexes.filter(\n\t\t\t(index) => !newIndexes.find((i) => i.name === index.name),\n\t\t);\n\t\tif (added.length > 0) {\n\t\t\taddedIndexes[changed] = added;\n\t\t\t// FIXME: don't o(n^2) this\n\t\t\tif (changedCollections.includes(changed)) {\n\t\t\t\tautoMigratedCollections.add(changed);\n\t\t\t}\n\t\t}\n\t\tif (removed.length > 0) {\n\t\t\tremovedIndexes[changed] = removed;\n\t\t\t// FIXME: don't o(n^2) this\n\t\t\tif (changedCollections.includes(changed)) {\n\t\t\t\tautoMigratedCollections.add(changed);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst withDefaults = (collectionName: string, val: any) => {\n\t\treturn addFieldDefaults(newSchema.collections[collectionName], val);\n\t};\n\tconst autoMigration = (collectionName: string) => (val: any) => {\n\t\tconst collection = newSchema.collections[collectionName];\n\t\treturn addFieldDefaults(collection, removeExtraProperties(collection, val));\n\t};\n\n\treturn {\n\t\tchangedCollections,\n\t\taddedCollections,\n\t\tremovedCollections,\n\t\taddedIndexes,\n\t\tremovedIndexes,\n\t\tautoMigratedCollections,\n\t\twithDefaults,\n\t\tautoMigration,\n\t};\n}\n", "/**\n * High-level patch creation for use with complex nested objects.\n */\n\nimport { createRef, createSubOid, ObjectIdentifier } from './oids.js';\nimport {\n\tdiffToPatches,\n\tinitialToPatches,\n\tObjectRef,\n\tOperation,\n\tPropertyName,\n} from './operation.js';\nimport { isRef } from './refs.js';\nimport { isObject } from './utils.js';\n\nexport class PatchCreator {\n\tconstructor(\n\t\tprivate getNow: () => string,\n\t\tprivate createSubId?: () => string,\n\t) {}\n\n\tcreateDiff = (\n\t\tfrom: any,\n\t\tto: any,\n\t\toptions: { mergeUnknownObjects?: boolean; defaultUndefined?: boolean } = {},\n\t) => {\n\t\treturn diffToPatches(from, to, this.getNow, this.createSubId, [], options);\n\t};\n\n\tcreateInitialize = (obj: any, oid: ObjectIdentifier) => {\n\t\treturn initialToPatches(obj, oid, this.getNow, this.createSubId);\n\t};\n\n\tcreateSet = (\n\t\toid: ObjectIdentifier,\n\t\tkey: PropertyName,\n\t\tvalue: any,\n\t): Operation[] => {\n\t\t// incoming value must be normalized. if it's not a primitive, it and all sub-objects\n\t\t// must be created\n\t\tif (!isObject(value) || isRef(value)) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'set',\n\t\t\t\t\t\tname: key,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\t} else {\n\t\t\tconst itemOid = createSubOid(oid, this.createSubId);\n\t\t\treturn [\n\t\t\t\t// since we're setting a complex nested object, we can initialize it wholesale.\n\t\t\t\t// no diffing to do.\n\t\t\t\t...initialToPatches(value, itemOid, this.getNow),\n\t\t\t\t// then set the reference to the object\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'set',\n\t\t\t\t\t\tvalue: createRef(itemOid),\n\t\t\t\t\t\tname: key,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t};\n\n\tcreateRemove = (oid: ObjectIdentifier, key: PropertyName): Operation[] => {\n\t\treturn [\n\t\t\t{\n\t\t\t\toid,\n\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'remove',\n\t\t\t\t\tname: key,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t};\n\n\tcreateListPush = (oid: ObjectIdentifier, value: any): Operation[] => {\n\t\tif (!isObject(value)) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-push',\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\t} else {\n\t\t\tconst itemOid = createSubOid(oid, this.createSubId);\n\t\t\treturn [\n\t\t\t\t...initialToPatches(value, itemOid, this.getNow),\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-push',\n\t\t\t\t\t\tvalue: createRef(itemOid),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t};\n\n\tcreateListAdd = (oid: ObjectIdentifier, value: any): Operation[] => {\n\t\tif (isObject(value)) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-add',\n\t\t\t\t\t\tvalue: createRef(value),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\t} else {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-add',\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t};\n\n\tcreateListInsert = (\n\t\toid: ObjectIdentifier,\n\t\tindex: number,\n\t\tvalue: any,\n\t): Operation[] => {\n\t\tif (!isObject(value)) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-insert',\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tindex,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\t} else {\n\t\t\tconst itemOid = createSubOid(oid, this.createSubId);\n\t\t\treturn [\n\t\t\t\t...initialToPatches(value, itemOid, this.getNow),\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-insert',\n\t\t\t\t\t\tvalue: createRef(itemOid),\n\t\t\t\t\t\tindex,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t};\n\n\tcreateListRemove = (\n\t\toid: ObjectIdentifier,\n\t\tvalue: any,\n\t\tonly?: 'first' | 'last',\n\t): Operation[] => {\n\t\treturn [\n\t\t\t{\n\t\t\t\toid,\n\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'list-remove',\n\t\t\t\t\tvalue,\n\t\t\t\t\tonly,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t};\n\n\tcreateListDelete = (\n\t\toid: ObjectIdentifier,\n\t\tindex: number,\n\t\tcount: number = 1,\n\t): Operation[] => {\n\t\treturn [\n\t\t\t{\n\t\t\t\toid,\n\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'list-delete',\n\t\t\t\t\tindex,\n\t\t\t\t\tcount,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t};\n\n\tcreateListMoveByRef = (\n\t\toid: ObjectIdentifier,\n\t\tvalue: ObjectRef,\n\t\tindex: number,\n\t): Operation[] => {\n\t\treturn [\n\t\t\t{\n\t\t\t\toid,\n\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'list-move-by-ref',\n\t\t\t\t\tvalue,\n\t\t\t\t\tindex,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t};\n\n\tcreateListMoveByIndex = (\n\t\toid: ObjectIdentifier,\n\t\tfromIndex: number,\n\t\ttoIndex: number,\n\t): Operation[] => {\n\t\treturn [\n\t\t\t{\n\t\t\t\toid,\n\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'list-move-by-index',\n\t\t\t\t\tfrom: fromIndex,\n\t\t\t\t\tto: toIndex,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t};\n\n\tcreateDelete = (oid: ObjectIdentifier): Operation[] => {\n\t\treturn [\n\t\t\t{\n\t\t\t\toid,\n\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'delete',\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t};\n\n\tcreateDeleteAll = (oids: ObjectIdentifier[]): Operation[] => {\n\t\treturn oids.map((oid) => ({\n\t\t\toid,\n\t\t\ttimestamp: this.getNow(),\n\t\t\tdata: {\n\t\t\t\top: 'delete',\n\t\t\t},\n\t\t}));\n\t};\n}\n", "import { generateId } from './utils.js';\n\nexport class EventSubscriber<\n\tEvents extends { [key: string]: (...args: any[]) => void },\n> {\n\tprotected subscribers: Record<\n\t\tstring,\n\t\tRecord<string, (...args: any[]) => void>\n\t> = {} as any;\n\tprotected counts: Record<string, number> = {} as any;\n\tprivate _disabled = false;\n\n\tconstructor(private _onAllUnsubscribed?: (event: keyof Events) => void) {}\n\n\tget disabled() {\n\t\treturn this._disabled;\n\t}\n\n\tsubscriberCount = (event: Extract<keyof Events, string>) => {\n\t\treturn this.counts[event] ?? 0;\n\t};\n\n\ttotalSubscriberCount = () => {\n\t\treturn Object.values(this.counts).reduce((acc, count) => acc + count, 0);\n\t};\n\n\tsubscribe = <K extends Extract<keyof Events, string>>(\n\t\tevent: K,\n\t\tcallback: Events[K],\n\t) => {\n\t\tconst key = generateId();\n\t\tlet subscribers = this.subscribers[event];\n\t\tif (!subscribers) {\n\t\t\tsubscribers = this.subscribers[event] = {};\n\t\t}\n\t\tsubscribers[key] = callback;\n\t\tthis.counts[event] = (this.counts[event] || 0) + 1;\n\t\treturn () => {\n\t\t\t// already removed\n\t\t\tif (!this.subscribers[event]) return;\n\n\t\t\tdelete this.subscribers[event][key];\n\t\t\tthis.counts[event]--;\n\t\t\tif (this.counts[event] === 0) {\n\t\t\t\tdelete this.subscribers[event];\n\t\t\t\tdelete this.counts[event];\n\t\t\t\tif (this._onAllUnsubscribed) {\n\t\t\t\t\tthis._onAllUnsubscribed(event);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t};\n\n\temit = <K extends Extract<keyof Events, string>>(\n\t\tevent: K,\n\t\t...args: Parameters<Events[K]>\n\t) => {\n\t\tif (this._disabled) return;\n\t\tif (this.subscribers[event]) {\n\t\t\tObject.values(this.subscribers[event]).forEach((c) => c(...args));\n\t\t}\n\t};\n\n\tdispose = () => {\n\t\tconst events = Object.keys(this.subscribers);\n\t\tthis.subscribers = {} as any;\n\t\tthis.counts = {} as any;\n\t\tevents.forEach((event) => {\n\t\t\tif (this._onAllUnsubscribed) {\n\t\t\t\tthis._onAllUnsubscribed(event);\n\t\t\t}\n\t\t});\n\t};\n\n\tdisable = () => {\n\t\tthis._disabled = true;\n\t};\n}\n\nexport type EventsOf<T extends EventSubscriber<any>> =\n\tT extends EventSubscriber<infer E> ? keyof E : never;\n", "import { ObjectIdentifier } from './oids.js';\nimport { applyPatch, Operation } from './operation.js';\nimport { cloneDeep } from './utils.js';\n\nexport function getUndoOperations(\n\toid: ObjectIdentifier,\n\tinitial: any,\n\toperations: Operation[],\n\tgetNow: () => string,\n): Operation[] {\n\tif (initial === undefined) {\n\t\t// if the initial state is nothing, then the undo is to delete everything.\n\t\t// there's nothing else to worry about!\n\t\treturn [\n\t\t\t{\n\t\t\t\toid,\n\t\t\t\ttimestamp: getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'delete',\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t}\n\t// otherwise, traverse the operations one by one,\n\t// applying them, and using the prior state to determine\n\t// what the undo operation is.\n\tlet state = cloneDeep(initial);\n\tconst undoOperations: Operation[] = [];\n\tfor (const operation of operations) {\n\t\tconst undo = getUndoOperation(oid, state, operation, getNow);\n\t\tundoOperations.unshift(...undo);\n\t\tapplyPatch(state, operation.data);\n\t}\n\treturn undoOperations;\n}\n\nfunction getUndoOperation(\n\toid: ObjectIdentifier,\n\tinitial: any,\n\toperation: Operation,\n\tgetNow: () => string,\n): Operation[] {\n\tconst data = operation.data;\n\tswitch (data.op) {\n\t\tcase 'set':\n\t\tcase 'remove':\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'set',\n\t\t\t\t\t\tname: data.name,\n\t\t\t\t\t\tvalue: initial[data.name],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tcase 'list-insert':\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-delete',\n\t\t\t\t\t\tindex: data.index,\n\t\t\t\t\t\tcount: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tcase 'list-delete':\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-insert',\n\t\t\t\t\t\tindex: data.index,\n\t\t\t\t\t\tvalues: initial.slice(data.index, data.count),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tcase 'list-move-by-ref':\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-move-by-ref',\n\t\t\t\t\t\tvalue: data.value,\n\t\t\t\t\t\tindex: initial.indexOf(data.value),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tcase 'list-move-by-index':\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-move-by-index',\n\t\t\t\t\t\tfrom: data.to,\n\t\t\t\t\t\tto: data.from,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tcase 'delete':\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'initialize',\n\t\t\t\t\t\tvalue: initial,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tcase 'list-push':\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-remove',\n\t\t\t\t\t\tvalue: data.value,\n\t\t\t\t\t\t// best heuristic here - remove the last instance of the item.\n\t\t\t\t\t\tonly: 'last',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tcase 'list-remove':\n\t\t\tif (data.only === 'last') {\n\t\t\t\tconst index = initial.lastIndexOf(data.value);\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\toid,\n\t\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\top: 'list-insert',\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tvalues: [data.value],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t} else if (data.only === 'first') {\n\t\t\t\tconst index = initial.indexOf(data.value);\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\toid,\n\t\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\top: 'list-insert',\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tvalues: [data.value],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t} else {\n\t\t\t\t// find all instances of value and restore them at their\n\t\t\t\t// original index\n\t\t\t\tconst indexesOfValue = [];\n\t\t\t\tlet index = initial.indexOf(data.value);\n\t\t\t\twhile (index !== -1) {\n\t\t\t\t\tindexesOfValue.push(index);\n\t\t\t\t\tindex = initial.indexOf(data.value, index + 1);\n\t\t\t\t}\n\t\t\t\treturn indexesOfValue.map((index) => ({\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-insert',\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\tvalue: data.value,\n\t\t\t\t\t},\n\t\t\t\t}));\n\t\t\t}\n\t\tcase 'list-add':\n\t\t\t// this one is kind of ambiguous. in theory the set may have\n\t\t\t// already included the value and so no change happened. but\n\t\t\t// basically we infer the intent is to remove what was meant\n\t\t\t// to be added by this change.\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-remove',\n\t\t\t\t\t\tvalue: data.value,\n\t\t\t\t\t\tonly: 'last',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tcase 'initialize':\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'delete',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tdefault:\n\t\t\tthrow new Error(`Cannot undo operation type: ${(data as any).op}`);\n\t}\n}\n", "export class Batcher<T, UserData = any> {\n\tprivate batches: Map<string, Batch<T, UserData>> = new Map();\n\n\tconstructor(\n\t\tprivate flusher: (items: T[], batchKey: string, userData: UserData) => any,\n\t) {}\n\n\tadd({\n\t\tkey,\n\t\tuserData,\n\t\titems,\n\t\tmax,\n\t\ttimeout,\n\t}: {\n\t\tkey: string;\n\t\tuserData?: UserData;\n\t\titems: T[];\n\t\tmax?: number | null;\n\t\ttimeout?: number | null;\n\t}) {\n\t\tlet batch = this.batches.get(key);\n\t\tif (!batch) {\n\t\t\tbatch = new Batch({\n\t\t\t\tmax: max || null,\n\t\t\t\tstartedAt: Date.now(),\n\t\t\t\tuserData,\n\t\t\t\ttimeout: timeout || null,\n\t\t\t\tflusher: this.flusher,\n\t\t\t\tkey,\n\t\t\t});\n\t\t\tthis.batches.set(key, batch);\n\t\t}\n\t\tbatch.update({\n\t\t\titems,\n\t\t\tmax,\n\t\t\ttimeout,\n\t\t\tuserData,\n\t\t});\n\n\t\treturn batch;\n\t}\n\n\tflush = (key: string) => {\n\t\tconst batch = this.batches.get(key);\n\t\tif (!batch) return;\n\n\t\treturn batch.flush();\n\t};\n\n\tdiscard = (key: string) => {\n\t\tconst batch = this.batches.get(key);\n\t\tif (!batch) return;\n\n\t\tbatch.discard();\n\t\tthis.batches.delete(key);\n\t};\n\n\tflushAll = () => {\n\t\treturn [...this.batches.values()].map((batch) => batch.flush());\n\t};\n}\n\nexport class Batch<T, UserData = any> {\n\titems: Array<T> = [];\n\tmax: number | null;\n\tstartedAt: number;\n\ttimeout: number | null;\n\tflushTimeout?: NodeJS.Timeout;\n\tuserData?: any;\n\tflusher: (items: T[], batchKey: string, userData: UserData) => any;\n\tkey: string;\n\n\tconstructor({\n\t\tmax,\n\t\tstartedAt,\n\t\ttimeout,\n\t\tuserData,\n\t\tflusher,\n\t\tkey,\n\t}: {\n\t\tkey: string;\n\t\tmax: number | null;\n\t\tstartedAt: number;\n\t\ttimeout: number | null;\n\t\tuserData?: UserData;\n\t\tflusher: (items: T[], batchKey: string, userData: UserData) => any;\n\t}) {\n\t\tthis.max = max;\n\t\tthis.startedAt = startedAt;\n\t\tthis.timeout = timeout;\n\t\tthis.userData = userData;\n\t\tthis.flusher = flusher;\n\t\tthis.key = key;\n\t}\n\n\tupdate = ({\n\t\titems,\n\t\tmax,\n\t\ttimeout,\n\t\tuserData,\n\t}: {\n\t\titems: Array<T>;\n\t\tmax?: number | null;\n\t\ttimeout?: number | null;\n\t\tuserData?: UserData;\n\t}) => {\n\t\tthis.items.push(...items);\n\t\tif (max !== undefined) this.max = max;\n\t\tif (timeout !== undefined) this.timeout = timeout;\n\t\tif (userData) this.userData = userData;\n\n\t\t// if the batch has items and a timeout but has not\n\t\t// scheduled yet, schedule it\n\t\tconst needsSchedule =\n\t\t\tthis.items.length !== 0 && this.timeout !== null && !this.flushTimeout;\n\n\t\t// if the batch has already reached its max, skip scheduling\n\t\t// and flush immediately\n\t\tif (this.max !== null && this.items.length >= this.max) {\n\t\t\tthis.flush();\n\t\t} else if (needsSchedule && this.timeout !== null) {\n\t\t\tthis.flushTimeout = setTimeout(this.flush, this.timeout);\n\t\t}\n\t};\n\n\tflush = () => {\n\t\tthis.flushTimeout && clearTimeout(this.flushTimeout);\n\t\tthis.flushTimeout = undefined;\n\t\tconst items = this.items;\n\t\tthis.items = [];\n\t\treturn this.flusher(items, this.key, this.userData);\n\t};\n\n\tdiscard = () => {\n\t\tthis.flushTimeout && clearTimeout(this.flushTimeout);\n\t\tthis.flushTimeout = undefined;\n\t\tthis.items = [];\n\t};\n}\n", "import { roughSizeOfObject } from '@verdant-web/common';\n\nexport function storeRequestPromise<T>(request: IDBRequest<T>) {\n\treturn new Promise<T>((resolve, reject) => {\n\t\trequest.onsuccess = () => {\n\t\t\tresolve(request.result);\n\t\t};\n\t\trequest.onerror = () => {\n\t\t\treject(request.error);\n\t\t};\n\t});\n}\n\nexport function cursorIterator<T>(\n\trequest: IDBRequest<IDBCursorWithValue | null>,\n\tcallback: (value: T | null) => boolean,\n) {\n\treturn new Promise<void>((resolve, reject) => {\n\t\trequest.onsuccess = () => {\n\t\t\tconst cursor = request.result;\n\t\t\tif (cursor) {\n\t\t\t\tif (callback(cursor.value)) {\n\t\t\t\t\tcursor.continue();\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresolve();\n\t\t\t}\n\t\t};\n\t\trequest.onerror = () => {\n\t\t\treject(request.error);\n\t\t};\n\t});\n}\n\nexport function getSizeOfObjectStore(\n\tdatabase: IDBDatabase,\n\tstoreName: string,\n): Promise<{ count: number; size: number }> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst tx = database.transaction([storeName], 'readonly');\n\t\tconst store = tx.objectStore(storeName);\n\t\tconst cursorReq = store.openCursor();\n\t\tlet count = 0;\n\t\tlet size = 0;\n\t\tcursorReq.onsuccess = function (e) {\n\t\t\tconst cursor = cursorReq.result;\n\t\t\tif (cursor) {\n\t\t\t\tcount++;\n\t\t\t\tsize = size + roughSizeOfObject(cursor.value);\n\t\t\t\tcursor.continue();\n\t\t\t}\n\t\t};\n\t\tcursorReq.onerror = function (e) {\n\t\t\treject(e);\n\t\t};\n\t\ttx.oncomplete = function (e) {\n\t\t\tresolve({\n\t\t\t\tcount: count,\n\t\t\t\tsize: size,\n\t\t\t});\n\t\t};\n\t\ttx.onabort = function (e) {\n\t\t\treject(e);\n\t\t};\n\t\ttx.onerror = function (e) {\n\t\t\treject(e);\n\t\t};\n\t});\n}\n\nexport function getAllFromObjectStores(db: IDBDatabase, stores: string[]) {\n\tconst transaction = db.transaction(stores, 'readonly');\n\tconst promises = stores.map((store) => {\n\t\tconst objectStore = transaction.objectStore(store);\n\t\treturn storeRequestPromise(objectStore.getAll());\n\t});\n\treturn Promise.all(promises);\n}\n\nexport async function closeDatabase(db: IDBDatabase) {\n\tdb.close();\n\t// wait for microtask queue to clear\n\tawait new Promise<void>((resolve, reject) => {\n\t\tresolve();\n\t});\n}\n\nexport async function deleteAllDatabases(\n\tnamespace: string,\n\tindexedDB: IDBFactory = window.indexedDB,\n) {\n\tconst req1 = indexedDB.deleteDatabase([namespace, 'meta'].join('_'));\n\tconst req2 = indexedDB.deleteDatabase([namespace, 'collections'].join('_'));\n\tawait Promise.all([\n\t\tnew Promise((resolve, reject) => {\n\t\t\treq1.onsuccess = resolve;\n\t\t\treq1.onerror = reject;\n\t\t}),\n\t\tnew Promise((resolve, reject) => {\n\t\t\treq2.onsuccess = resolve;\n\t\t\treq2.onerror = reject;\n\t\t}),\n\t]);\n\twindow.location.reload();\n}\n\nexport function deleteDatabase(name: string, indexedDB = window.indexedDB) {\n\treturn storeRequestPromise(indexedDB.deleteDatabase(name));\n}\n\nexport async function getAllDatabaseNamesAndVersions(\n\tindexedDB: IDBFactory = window.indexedDB,\n) {\n\treturn indexedDB.databases();\n}\n", "import { storeRequestPromise } from './idb.js';\n\nexport class IDBService {\n\tconstructor(protected readonly db: IDBDatabase) {}\n\n\tcreateTransaction = (\n\t\tstoreNames: string[],\n\t\tmode: 'readonly' | 'readwrite',\n\t) => {\n\t\treturn this.db.transaction(storeNames, mode);\n\t};\n\n\trun = async <T>(\n\t\tstoreName: string,\n\t\tgetRequest: (store: IDBObjectStore) => IDBRequest<T>,\n\t\tmode: 'readonly' | 'readwrite' = 'readonly',\n\t\ttransaction?: IDBTransaction,\n\t): Promise<T> => {\n\t\tconst tx = transaction || this.db.transaction(storeName, mode);\n\t\tconst store = tx.objectStore(storeName);\n\t\tconst request = getRequest(store);\n\t\treturn storeRequestPromise<T>(request);\n\t};\n\n\trunAll = async <T>(\n\t\tstoreName: string,\n\t\tgetRequests: (store: IDBObjectStore) => IDBRequest<T>[],\n\t\tmode: 'readonly' | 'readwrite' = 'readonly',\n\t\ttransaction?: IDBTransaction,\n\t): Promise<T[]> => {\n\t\tconst tx = transaction || this.db.transaction(storeName, mode);\n\t\tconst store = tx.objectStore(storeName);\n\t\tconst requests = getRequests(store);\n\t\treturn Promise.all(requests.map(storeRequestPromise));\n\t};\n\n\titerate = async <T>(\n\t\tstoreName: string,\n\t\tgetRequest: (store: IDBObjectStore) => IDBRequest | IDBRequest[],\n\t\titerator: (value: T, store: IDBObjectStore) => void,\n\t\tmode: 'readonly' | 'readwrite' = 'readonly',\n\t\ttransaction?: IDBTransaction,\n\t): Promise<void> => {\n\t\tconst tx = transaction || this.db.transaction(storeName, mode);\n\t\tconst store = tx.objectStore(storeName);\n\t\tconst request = getRequest(store);\n\t\tif (Array.isArray(request)) {\n\t\t\treturn Promise.all(\n\t\t\t\trequest.map((req) => {\n\t\t\t\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\t\t\t\treq.onsuccess = () => {\n\t\t\t\t\t\t\tconst cursor = req.result;\n\t\t\t\t\t\t\tif (cursor) {\n\t\t\t\t\t\t\t\titerator(cursor.value, store);\n\t\t\t\t\t\t\t\tcursor.continue();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t\treq.onerror = reject;\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t).then(() => undefined);\n\t\t}\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\trequest.onsuccess = () => {\n\t\t\t\tconst cursor = request.result;\n\t\t\t\tif (cursor) {\n\t\t\t\t\titerator(cursor.value, store);\n\t\t\t\t\tcursor.continue();\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t};\n\t\t\trequest.onerror = reject;\n\t\t});\n\t};\n\n\tclear = (storeName: string) => {\n\t\treturn this.run(storeName, (store) => store.clear(), 'readwrite');\n\t};\n}\n", "import { IDBService } from '../IDBService.js';\n\ntype AckInfo = {\n\ttype: 'ack';\n\t// null means no operations are acknowledged\n\t// by every peer yet.\n\tglobalAckTimestamp: string | null;\n};\n\nexport class AckInfoStore extends IDBService {\n\tgetAckInfo = async (): Promise<AckInfo> => {\n\t\tconst result = await this.run<AckInfo>('info', (store) => store.get('ack'));\n\t\tif (result) {\n\t\t\treturn result;\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tglobalAckTimestamp: null,\n\t\t\t\ttype: 'ack',\n\t\t\t};\n\t\t}\n\t};\n\n\tsetGlobalAck = async (ack: string) => {\n\t\tawait this.run(\n\t\t\t'info',\n\t\t\t(store) => store.put({ type: 'ack', globalAckTimestamp: ack }),\n\t\t\t'readwrite',\n\t\t);\n\t};\n}\n", "import {\n\tDocumentBaseline,\n\tgetOidSubIdRange,\n\tgetOidRoot,\n\tObjectIdentifier,\n\tisLegacyDotOid,\n} from '@verdant-web/common';\nimport { IDBService } from '../IDBService.js';\n\nexport class BaselinesStore extends IDBService {\n\tconstructor(db: IDBDatabase) {\n\t\tsuper(db);\n\t}\n\n\tgetAllForDocument = async (\n\t\toid: ObjectIdentifier,\n\t\t{\n\t\t\tmode = 'readonly',\n\t\t\ttransaction,\n\t\t}: { mode?: 'readwrite' | 'readonly'; transaction?: IDBTransaction } = {},\n\t) => {\n\t\tconst baselines: DocumentBaseline[] = [];\n\t\tawait this.iterateOverAllForDocument(\n\t\t\toid,\n\t\t\t(baseline) => {\n\t\t\t\tbaselines.push(baseline);\n\t\t\t},\n\t\t\t{ mode, transaction },\n\t\t);\n\t\treturn baselines;\n\t};\n\titerateOverAllForDocument = async (\n\t\toid: ObjectIdentifier,\n\t\titerator: (baseline: DocumentBaseline, store: IDBObjectStore) => void,\n\t\t{\n\t\t\tmode = 'readonly',\n\t\t\ttransaction,\n\t\t}: { mode?: 'readwrite' | 'readonly'; transaction?: IDBTransaction } = {},\n\t) => {\n\t\treturn this.iterate(\n\t\t\t'baselines',\n\t\t\t(store) => {\n\t\t\t\tconst root = getOidRoot(oid);\n\t\t\t\t// FIXME: get rid of legacy dot OIDs...\n\t\t\t\tconst isDot = isLegacyDotOid(oid);\n\t\t\t\tconst [start, end] = getOidSubIdRange(oid, isDot);\n\t\t\t\treturn [\n\t\t\t\t\t// first the root itself\n\t\t\t\t\tstore.openCursor(IDBKeyRange.only(root)),\n\t\t\t\t\t// then the range of its possible subdocuments\n\t\t\t\t\tstore.openCursor(IDBKeyRange.bound(start, end, false, false)),\n\t\t\t\t];\n\t\t\t},\n\t\t\titerator,\n\t\t\tmode,\n\t\t\ttransaction,\n\t\t);\n\t};\n\n\tgetAllForMultipleDocuments = async (\n\t\tdocOids: string[],\n\t\t{ mode = 'readonly' }: { mode?: 'readwrite' | 'readonly' } = {},\n\t) => {\n\t\tconst result = await this.runAll<DocumentBaseline[]>(\n\t\t\t'baselines',\n\t\t\t(store) => {\n\t\t\t\treturn docOids.flatMap((oid) => {\n\t\t\t\t\tconst root = getOidRoot(oid);\n\t\t\t\t\t// FIXME: get rid of legacy dot OIDs...\n\t\t\t\t\tconst isDot = isLegacyDotOid(oid);\n\t\t\t\t\tconst [start, end] = getOidSubIdRange(oid, isDot);\n\t\t\t\t\treturn [\n\t\t\t\t\t\tstore.get(root),\n\t\t\t\t\t\tstore.getAll(IDBKeyRange.bound(start, end, false, false)),\n\t\t\t\t\t];\n\t\t\t\t});\n\t\t\t},\n\t\t\tmode,\n\t\t);\n\t\treturn result.flat();\n\t};\n\n\tgetAllSince = async (\n\t\ttimestamp: string | null,\n\t\t{ mode = 'readonly' }: { mode?: 'readwrite' | 'readonly' } = {},\n\t) => {\n\t\treturn this.run<DocumentBaseline[]>(\n\t\t\t'baselines',\n\t\t\t(store) => {\n\t\t\t\tconst range = timestamp\n\t\t\t\t\t? IDBKeyRange.lowerBound(timestamp, true)\n\t\t\t\t\t: undefined;\n\t\t\t\tconst index = store.index('timestamp');\n\t\t\t\treturn index.getAll(range);\n\t\t\t},\n\t\t\tmode,\n\t\t);\n\t};\n\n\tget = async (\n\t\toid: ObjectIdentifier,\n\t\t{\n\t\t\ttransaction,\n\t\t\tmode = 'readonly',\n\t\t}: { transaction?: IDBTransaction; mode?: 'readwrite' | 'readonly' } = {},\n\t) => {\n\t\treturn this.run<DocumentBaseline>(\n\t\t\t'baselines',\n\t\t\t(store) => store.get(oid),\n\t\t\tmode,\n\t\t\ttransaction,\n\t\t);\n\t};\n\n\tset = async <T>(\n\t\tbaseline: DocumentBaseline<T>,\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t) => {\n\t\tawait this.run(\n\t\t\t'baselines',\n\t\t\t(store) => store.put(baseline),\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t};\n\n\tsetAll = async <T>(\n\t\tbaselines: DocumentBaseline<T>[],\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t) => {\n\t\tawait this.runAll(\n\t\t\t'baselines',\n\t\t\t(store) => {\n\t\t\t\treturn baselines.map((baseline) => store.put(baseline));\n\t\t\t},\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t};\n\n\treset = () => {\n\t\treturn this.clear('baselines');\n\t};\n\n\tdelete = async (\n\t\toid: ObjectIdentifier,\n\t\t{ transaction }: { transaction?: IDBTransaction },\n\t) => {\n\t\tawait this.run(\n\t\t\t'baselines',\n\t\t\t(store) => store.delete(oid),\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t};\n}\n", "import cuid from 'cuid';\nimport { IDBService } from '../IDBService.js';\n\nexport type LocalReplicaInfo = {\n\ttype: 'localReplicaInfo';\n\tid: string;\n\tackedLogicalTime: string | null;\n\tlastSyncedLogicalTime: string | null;\n};\n\nexport class LocalReplicaStore extends IDBService {\n\tprivate cached: LocalReplicaInfo | undefined;\n\n\tget = async ({ transaction }: { transaction?: IDBTransaction } = {}) => {\n\t\tif (this.cached) {\n\t\t\treturn this.cached;\n\t\t}\n\n\t\tconst lookup = await this.run<LocalReplicaInfo>(\n\t\t\t'info',\n\t\t\t(store) => store.get('localReplicaInfo'),\n\t\t\tundefined,\n\t\t\ttransaction,\n\t\t);\n\n\t\tif (!lookup) {\n\t\t\t// create our own replica info now\n\t\t\tconst replicaId = cuid();\n\t\t\tconst replicaInfo: LocalReplicaInfo = {\n\t\t\t\ttype: 'localReplicaInfo',\n\t\t\t\tid: replicaId,\n\t\t\t\tackedLogicalTime: null,\n\t\t\t\tlastSyncedLogicalTime: null,\n\t\t\t};\n\t\t\tawait this.run('info', (store) => store.put(replicaInfo), 'readwrite');\n\t\t\tthis.cached = replicaInfo;\n\t\t\treturn replicaInfo;\n\t\t}\n\n\t\tthis.cached = lookup;\n\t\treturn lookup;\n\t};\n\n\tupdate = async (\n\t\tdata: Partial<LocalReplicaInfo>,\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t) => {\n\t\tconst localReplicaInfo = await this.get({ transaction });\n\t\tObject.assign(localReplicaInfo, data);\n\t\tawait this.run('info', (store) => store.put(localReplicaInfo), 'readwrite');\n\t\tthis.cached = localReplicaInfo;\n\t};\n\n\treset = async () => {\n\t\tconst localInfo = await this.get();\n\t\tlocalInfo.ackedLogicalTime = null;\n\t\tlocalInfo.lastSyncedLogicalTime = null;\n\t\tawait this.run('info', (store) => store.put(localInfo), 'readwrite');\n\t};\n}\n", "import {\n\tAckMessage,\n\tDocumentBaseline,\n\tgetOidRoot,\n\tHeartbeatMessage,\n\tObjectIdentifier,\n\tOperation,\n\tOperationMessage,\n\tPresenceUpdateMessage,\n\tSyncAckMessage,\n\tSyncMessage,\n} from '@verdant-web/common';\n\nimport { Metadata } from './Metadata.js';\n\nexport class MessageCreator {\n\tconstructor(private meta: Metadata) {}\n\n\tcreateOperation = async (\n\t\tinit: Pick<OperationMessage, 'operations'> & {\n\t\t\ttimestamp?: string;\n\t\t},\n\t): Promise<OperationMessage> => {\n\t\tconst localInfo = await this.meta.localReplica.get();\n\t\treturn {\n\t\t\ttype: 'op',\n\t\t\ttimestamp: this.meta.now,\n\t\t\treplicaId: localInfo.id,\n\t\t\toperations: init.operations.map((op) => ({\n\t\t\t\tdata: op.data,\n\t\t\t\toid: op.oid,\n\t\t\t\ttimestamp: op.timestamp,\n\t\t\t})),\n\t\t};\n\t};\n\n\tcreateMigrationOperation = async ({\n\t\ttargetVersion,\n\t\t...init\n\t}: Pick<OperationMessage, 'operations'> & {\n\t\ttargetVersion: number;\n\t}): Promise<OperationMessage> => {\n\t\tconst localInfo = await this.meta.localReplica.get();\n\t\treturn {\n\t\t\ttype: 'op',\n\t\t\toperations: init.operations.map((op) => ({\n\t\t\t\t...op,\n\t\t\t\ttimestamp: this.meta.time.zero(targetVersion),\n\t\t\t})),\n\t\t\ttimestamp: this.meta.time.zero(targetVersion),\n\t\t\treplicaId: localInfo.id,\n\t\t};\n\t};\n\n\t/**\n\t * @param since - override local understanding of last sync time\n\t */\n\tcreateSyncStep1 = async (since?: string | null): Promise<SyncMessage> => {\n\t\tconst localReplicaInfo = await this.meta.localReplica.get();\n\n\t\tconst provideChangesSince =\n\t\t\tsince === null ? null : localReplicaInfo.lastSyncedLogicalTime;\n\n\t\t// collect all of our operations that are newer than the server's last operation\n\t\t// if server replica isn't stored, we're syncing for the first time.\n\t\tconst operations: Operation[] = [];\n\t\tconst affectedDocs = new Set<ObjectIdentifier>();\n\n\t\t// FIXME: this branch gives bad vibes. should we always\n\t\t// send all operations from other replicas too? is there\n\t\t// ever a case where we have a \"since\" timestamp and there\n\t\t// are foreign ops that match it?\n\t\tif (provideChangesSince) {\n\t\t\tawait this.meta.operations.iterateOverAllLocalOperations(\n\t\t\t\t(patch) => {\n\t\t\t\t\toperations.push({\n\t\t\t\t\t\tdata: patch.data,\n\t\t\t\t\t\toid: patch.oid,\n\t\t\t\t\t\ttimestamp: patch.timestamp,\n\t\t\t\t\t});\n\t\t\t\t\taffectedDocs.add(getOidRoot(patch.oid));\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tafter: provideChangesSince,\n\t\t\t\t\t// block on writes to prevent race conditions\n\t\t\t\t\tmode: 'readwrite',\n\t\t\t\t},\n\t\t\t);\n\t\t} else {\n\t\t\t// if providing the whole history, don't limit to only local\n\t\t\t// operations\n\t\t\tawait this.meta.operations.iterateOverAllOperations(\n\t\t\t\t(patch) => {\n\t\t\t\t\toperations.push({\n\t\t\t\t\t\tdata: patch.data,\n\t\t\t\t\t\toid: patch.oid,\n\t\t\t\t\t\ttimestamp: patch.timestamp,\n\t\t\t\t\t});\n\t\t\t\t\taffectedDocs.add(getOidRoot(patch.oid));\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmode: 'readwrite',\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\t// we only need to send baselines if we've never synced before\n\t\tlet baselines: DocumentBaseline[] = [];\n\t\tif (!provideChangesSince) {\n\t\t\tbaselines = await this.meta.baselines.getAllSince('');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: 'sync',\n\t\t\tschemaVersion: this.meta.schema.currentVersion,\n\t\t\ttimestamp: this.meta.now,\n\t\t\treplicaId: localReplicaInfo.id,\n\t\t\tresyncAll: !localReplicaInfo.lastSyncedLogicalTime,\n\t\t\toperations,\n\t\t\tbaselines,\n\t\t\tsince: provideChangesSince,\n\t\t};\n\t};\n\n\tcreatePresenceUpdate = async (\n\t\tpresence: any,\n\t): Promise<PresenceUpdateMessage> => {\n\t\tconst localReplicaInfo = await this.meta.localReplica.get();\n\t\treturn {\n\t\t\ttype: 'presence-update',\n\t\t\tpresence,\n\t\t\treplicaId: localReplicaInfo.id,\n\t\t};\n\t};\n\n\tcreateHeartbeat = async (): Promise<HeartbeatMessage> => {\n\t\tconst localReplicaInfo = await this.meta.localReplica.get();\n\t\treturn {\n\t\t\ttype: 'heartbeat',\n\t\t\ttimestamp: this.meta.now,\n\t\t\treplicaId: localReplicaInfo.id,\n\t\t};\n\t};\n\n\tcreateAck = async (nonce: string): Promise<AckMessage> => {\n\t\tconst localReplicaInfo = await this.meta.localReplica.get();\n\t\treturn {\n\t\t\ttype: 'ack',\n\t\t\ttimestamp: this.meta.now,\n\t\t\treplicaId: localReplicaInfo.id,\n\t\t\tnonce,\n\t\t};\n\t};\n}\n", "import {\n\tcreateCompoundIndexValue,\n\tcreateLowerBoundIndexValue,\n\tcreateUpperBoundIndexValue,\n\tgetOidRoot,\n\tObjectIdentifier,\n\tOperation,\n\tassert,\n} from '@verdant-web/common';\nimport { IDBService } from '../IDBService.js';\n\nexport type ClientOperation = Operation & {\n\tisLocal: boolean;\n};\n\nexport type StoredClientOperation = ClientOperation & {\n\toid_timestamp: string;\n\tl_t: string;\n\td_t: string;\n};\n\nexport class OperationsStore extends IDBService {\n\t/**\n\t * Iterates over every patch for the root and every sub-object\n\t * of a given document. Optionally limit by timestamp.\n\t */\n\titerateOverAllOperationsForDocument = async (\n\t\toid: ObjectIdentifier,\n\t\titerator: (patch: StoredClientOperation, store: IDBObjectStore) => void,\n\t\t{\n\t\t\tto,\n\t\t\tfrom,\n\t\t\tafter,\n\t\t\tmode = 'readonly',\n\t\t\ttransaction: providedTx,\n\t\t}: {\n\t\t\tto?: string;\n\t\t\tfrom?: string;\n\t\t\tafter?: string;\n\t\t\tmode?: 'readwrite' | 'readonly';\n\t\t\ttransaction?: IDBTransaction;\n\t\t} = {},\n\t): Promise<void> => {\n\t\tconst transaction = providedTx || this.db.transaction('operations', mode);\n\t\tconst store = transaction.objectStore('operations');\n\t\tconst index = store.index('d_t');\n\n\t\tconst startTimestamp = from || after;\n\t\tconst start = startTimestamp\n\t\t\t? createCompoundIndexValue(oid, startTimestamp)\n\t\t\t: createLowerBoundIndexValue(oid);\n\t\tconst end = to\n\t\t\t? createCompoundIndexValue(oid, to)\n\t\t\t: createUpperBoundIndexValue(oid);\n\n\t\tconst range = IDBKeyRange.bound(start, end, !!after, false);\n\n\t\tconst request = index.openCursor(range, 'next');\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tlet previousTimestamp: string | undefined;\n\t\t\trequest.onsuccess = (event) => {\n\t\t\t\tconst cursor = request.result;\n\t\t\t\tif (cursor) {\n\t\t\t\t\tconst value = cursor.value as StoredClientOperation;\n\t\t\t\t\tassert(value.oid.startsWith(oid));\n\t\t\t\t\tassert(\n\t\t\t\t\t\tpreviousTimestamp === undefined ||\n\t\t\t\t\t\t\tpreviousTimestamp <= value.timestamp,\n\t\t\t\t\t\t`expected ${previousTimestamp} <= ${value.timestamp}`,\n\t\t\t\t\t);\n\n\t\t\t\t\titerator(value, store);\n\t\t\t\t\tpreviousTimestamp = value.timestamp;\n\t\t\t\t\tcursor.continue();\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t};\n\t\t\trequest.onerror = (event) => {\n\t\t\t\treject(event);\n\t\t\t};\n\t\t});\n\t};\n\n\titerateOverAllOperationsForEntity = async (\n\t\toid: ObjectIdentifier,\n\t\titerator: (patch: StoredClientOperation, store: IDBObjectStore) => void,\n\t\t{\n\t\t\tafter,\n\t\t\tto,\n\t\t\tmode,\n\t\t\ttransaction: providedTx,\n\t\t}: {\n\t\t\tafter?: string;\n\t\t\tto?: string;\n\t\t\tmode?: 'readwrite' | 'readonly';\n\t\t\ttransaction?: IDBTransaction;\n\t\t},\n\t): Promise<void> => {\n\t\tconst transaction = providedTx || this.db.transaction('operations', mode);\n\t\tconst store = transaction.objectStore('operations');\n\n\t\tconst start = after\n\t\t\t? createCompoundIndexValue(oid, after)\n\t\t\t: createLowerBoundIndexValue(oid);\n\t\tconst end = to\n\t\t\t? createCompoundIndexValue(oid, to)\n\t\t\t: createUpperBoundIndexValue(oid);\n\n\t\tconst range = IDBKeyRange.bound(start, end, !!after, false);\n\n\t\tconst request = store.openCursor(range, 'next');\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tlet previousTimestamp: string | undefined;\n\t\t\trequest.onsuccess = (event) => {\n\t\t\t\tconst cursor = request.result;\n\t\t\t\tif (cursor) {\n\t\t\t\t\tconst value = cursor.value as StoredClientOperation;\n\t\t\t\t\tassert(value.oid.startsWith(oid));\n\t\t\t\t\tassert(\n\t\t\t\t\t\tpreviousTimestamp === undefined ||\n\t\t\t\t\t\t\tpreviousTimestamp <= value.timestamp,\n\t\t\t\t\t\t`expected ${previousTimestamp} <= ${value.timestamp}`,\n\t\t\t\t\t);\n\n\t\t\t\t\titerator(value, store);\n\t\t\t\t\tpreviousTimestamp = value.timestamp;\n\t\t\t\t\tcursor.continue();\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t};\n\t\t\trequest.onerror = (event) => {\n\t\t\t\treject(event);\n\t\t\t};\n\t\t});\n\t};\n\n\titerateOverAllLocalOperations = async (\n\t\titerator: (patch: ClientOperation, store: IDBObjectStore) => void,\n\t\t{\n\t\t\tbefore,\n\t\t\tafter,\n\t\t\tmode = 'readonly',\n\t\t\ttransaction: providedTx,\n\t\t}: {\n\t\t\tbefore?: string | null;\n\t\t\tafter?: string | null;\n\t\t\tmode?: 'readwrite' | 'readonly';\n\t\t\ttransaction?: IDBTransaction;\n\t\t},\n\t): Promise<void> => {\n\t\tconst transaction = providedTx || this.db.transaction('operations', mode);\n\t\tconst store = transaction.objectStore('operations');\n\t\tconst index = store.index('l_t');\n\n\t\tconst start = after\n\t\t\t? createCompoundIndexValue(true, after)\n\t\t\t: createLowerBoundIndexValue(true);\n\t\tconst end = before\n\t\t\t? createCompoundIndexValue(true, before)\n\t\t\t: createUpperBoundIndexValue(true);\n\n\t\tconst range = IDBKeyRange.bound(start, end, !!after, true);\n\n\t\tconst request = index.openCursor(range, 'next');\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tlet previousTimestamp: string | undefined;\n\t\t\trequest.onsuccess = (event) => {\n\t\t\t\tconst cursor = request.result;\n\t\t\t\tif (cursor) {\n\t\t\t\t\tconst value = cursor.value as StoredClientOperation;\n\t\t\t\t\tassert(\n\t\t\t\t\t\tpreviousTimestamp === undefined ||\n\t\t\t\t\t\t\tpreviousTimestamp <= value.timestamp,\n\t\t\t\t\t\t`expected ${previousTimestamp} <= ${value.timestamp}`,\n\t\t\t\t\t);\n\n\t\t\t\t\titerator(value, store);\n\t\t\t\t\tpreviousTimestamp = value.timestamp;\n\t\t\t\t\tcursor.continue();\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t};\n\t\t\trequest.onerror = (event) => {\n\t\t\t\treject(event);\n\t\t\t};\n\t\t});\n\t};\n\n\titerateOverAllOperations = async (\n\t\titerator: (patch: ClientOperation, store: IDBObjectStore) => void,\n\t\t{\n\t\t\tbefore,\n\t\t\ttransaction,\n\t\t\tmode,\n\t\t\tfrom,\n\t\t}: {\n\t\t\t/** Ending timestamp, exclusive */\n\t\t\tbefore?: string | null;\n\t\t\t/** Starting timestamp, inclusive */\n\t\t\tfrom?: string | null;\n\t\t\ttransaction?: IDBTransaction;\n\t\t\tmode?: 'readwrite' | 'readonly';\n\t\t},\n\t): Promise<void> => {\n\t\tawait this.iterate(\n\t\t\t'operations',\n\t\t\t(store) => {\n\t\t\t\tconst start = from ? createLowerBoundIndexValue(from) : undefined;\n\t\t\t\tconst end = before ? createUpperBoundIndexValue(before) : undefined;\n\n\t\t\t\tconst range =\n\t\t\t\t\tstart && end\n\t\t\t\t\t\t? IDBKeyRange.bound(start, end, false, true)\n\t\t\t\t\t\t: start\n\t\t\t\t\t\t? IDBKeyRange.lowerBound(start, false)\n\t\t\t\t\t\t: end\n\t\t\t\t\t\t? IDBKeyRange.upperBound(end, true)\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst index = store.index('timestamp');\n\t\t\t\treturn index.openCursor(range, 'next');\n\t\t\t},\n\t\t\titerator,\n\t\t\tmode,\n\t\t\ttransaction,\n\t\t);\n\t};\n\n\t/**\n\t * Adds a set of patches to the database.\n\t * @returns a list of affected root document OIDs.\n\t */\n\taddOperations = async (\n\t\tpatches: ClientOperation[],\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t): Promise<ObjectIdentifier[]> => {\n\t\treturn this.insert(patches.map(this.addCompoundIndexes), { transaction });\n\t};\n\n\tprivate addCompoundIndexes = (\n\t\tpatch: ClientOperation,\n\t): StoredClientOperation => {\n\t\treturn {\n\t\t\t...patch,\n\t\t\toid_timestamp: createCompoundIndexValue(\n\t\t\t\tpatch.oid,\n\t\t\t\tpatch.timestamp,\n\t\t\t) as string,\n\t\t\tl_t: createCompoundIndexValue(patch.isLocal, patch.timestamp) as string,\n\t\t\td_t: createCompoundIndexValue(\n\t\t\t\tgetOidRoot(patch.oid),\n\t\t\t\tpatch.timestamp,\n\t\t\t) as string,\n\t\t};\n\t};\n\n\tprivate insert = async (\n\t\toperations: StoredClientOperation[],\n\t\t{ transaction }: { transaction?: IDBTransaction },\n\t): Promise<ObjectIdentifier[]> => {\n\t\tconst affected = new Set<ObjectIdentifier>();\n\t\tawait this.runAll(\n\t\t\t'operations',\n\t\t\t(store) =>\n\t\t\t\toperations.map((op) => {\n\t\t\t\t\taffected.add(getOidRoot(op.oid));\n\t\t\t\t\treturn store.put(op);\n\t\t\t\t}),\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t\treturn Array.from(affected);\n\t};\n\n\treset = () => {\n\t\treturn this.clear('operations');\n\t};\n}\n", "import { StorageSchema } from '@verdant-web/common';\nimport { storeRequestPromise } from '../idb.js';\n\ntype StoredSchema = {\n\ttype: 'schema';\n\tschema: string;\n};\n\nexport class SchemaStore {\n\tprivate cached: StorageSchema<any> | null = null;\n\n\tconstructor(\n\t\tprivate readonly db: IDBDatabase,\n\t\tpublic readonly currentVersion: number,\n\t) {}\n\n\tget = async (): Promise<StorageSchema<any> | null> => {\n\t\tif (this.cached) {\n\t\t\treturn this.cached;\n\t\t}\n\n\t\tconst db = this.db;\n\t\tconst transaction = db.transaction('info', 'readonly');\n\t\tconst store = transaction.objectStore('info');\n\t\tconst request = store.get('schema');\n\t\tconst value = (await storeRequestPromise(request)) as\n\t\t\t| StoredSchema\n\t\t\t| undefined;\n\t\tif (!value) {\n\t\t\treturn null;\n\t\t}\n\t\tthis.cached = JSON.parse(value.schema);\n\t\treturn this.cached;\n\t};\n\n\tset = async (schema: StorageSchema<any>): Promise<void> => {\n\t\tconst db = this.db;\n\t\tconst transaction = db.transaction('info', 'readwrite');\n\t\tconst store = transaction.objectStore('info');\n\t\tconst request = store.put({\n\t\t\ttype: 'schema',\n\t\t\tschema: JSON.stringify(schema),\n\t\t} as StoredSchema);\n\t\tthis.cached = schema;\n\t\tawait storeRequestPromise(request);\n\t};\n}\n", "import {\n\tapplyPatch,\n\tassert,\n\tassignOid,\n\tClientMessage,\n\tDocumentBaseline,\n\tEventSubscriber,\n\tFileRef,\n\tisFileRef,\n\tgetOidRoot,\n\tHybridLogicalClockTimestampProvider,\n\tObjectIdentifier,\n\tOperation,\n\tPatchCreator,\n\tRef,\n\tStorageSchema,\n\tsubstituteRefsWithObjects,\n} from '@verdant-web/common';\nimport { AckInfoStore } from './AckInfoStore.js';\nimport { BaselinesStore } from './BaselinesStore.js';\nimport {\n\tgetAllFromObjectStores,\n\tgetSizeOfObjectStore,\n\tstoreRequestPromise,\n} from '../idb.js';\nimport { LocalReplicaInfo, LocalReplicaStore } from './LocalReplicaStore.js';\nimport { MessageCreator } from './MessageCreator.js';\nimport { ClientOperation, OperationsStore } from './OperationsStore.js';\nimport { SchemaStore } from './SchemaStore.js';\nimport { Context } from '../context.js';\n\nexport interface ExportData {\n\toperations: Operation[];\n\tbaselines: DocumentBaseline[];\n\tlocalReplica: LocalReplicaInfo;\n\tschema: StorageSchema;\n}\n\nexport class Metadata extends EventSubscriber<{\n\tmessage: (message: ClientMessage) => void;\n\trebase: (baselines: DocumentBaseline[]) => void;\n\tfilesDeleted: (files: FileRef[]) => void;\n}> {\n\treadonly operations;\n\treadonly baselines;\n\treadonly localReplica;\n\treadonly ackInfo;\n\treadonly messageCreator;\n\treadonly patchCreator;\n\treadonly schema;\n\treadonly time = new HybridLogicalClockTimestampProvider();\n\n\tprivate readonly disableRebasing: boolean = false;\n\t/**\n\t * indicates the client is shutting down and we should stop\n\t * accessing the database.\n\t */\n\tprivate _closing = false;\n\n\tprivate context: Omit<Context, 'documentDb'>;\n\n\tconstructor({\n\t\tdisableRebasing,\n\t\tcontext,\n\t}: {\n\t\tdisableRebasing?: boolean;\n\t\tcontext: Omit<Context, 'documentDb'>;\n\t}) {\n\t\tsuper();\n\t\tthis.context = context;\n\t\tthis.schema = new SchemaStore(context.metaDb, context.schema.version);\n\t\tthis.operations = new OperationsStore(this.db);\n\t\tthis.baselines = new BaselinesStore(this.db);\n\t\tthis.localReplica = new LocalReplicaStore(this.db);\n\t\tthis.ackInfo = new AckInfoStore(this.db);\n\t\tthis.messageCreator = new MessageCreator(this);\n\t\tthis.patchCreator = new PatchCreator(() => this.now);\n\t\tif (disableRebasing) this.disableRebasing = disableRebasing;\n\t}\n\n\tprivate get db() {\n\t\treturn this.context.metaDb;\n\t}\n\n\tprivate get log() {\n\t\treturn this.context.log;\n\t}\n\n\tsetContext = (context: Context) => {\n\t\tthis.context = context;\n\t};\n\n\tget now() {\n\t\treturn this.time.now(this.schema.currentVersion);\n\t}\n\n\tclose = () => {\n\t\tthis._closing = true;\n\t};\n\n\t/**\n\t * Methods for accessing data\n\t */\n\n\tcreateTransaction = (stores: ('operations' | 'baselines')[]) => {\n\t\treturn this.db.transaction(stores, 'readwrite');\n\t};\n\n\t/**\n\t * Gets the OID and every sub-object OID for a given document.\n\t * Includes any sub-objects that are not referenced by the root object\n\t * but still happen to be in storage.\n\t */\n\tgetAllDocumentRelatedOids = async (oid: ObjectIdentifier) => {\n\t\tconst oids = new Set<ObjectIdentifier>();\n\t\tconst documentOid = getOidRoot(oid);\n\t\tassert(documentOid === oid, 'Must be root document OID');\n\t\toids.add(documentOid);\n\t\t// readwrite mode to block on other write transactions\n\t\tconst transaction = this.db.transaction(\n\t\t\t['baselines', 'operations'],\n\t\t\t'readwrite',\n\t\t);\n\t\tawait Promise.all([\n\t\t\tthis.baselines.iterateOverAllForDocument(\n\t\t\t\tdocumentOid,\n\t\t\t\t(baseline) => {\n\t\t\t\t\toids.add(baseline.oid);\n\t\t\t\t},\n\t\t\t\t{ transaction },\n\t\t\t),\n\t\t\tthis.operations.iterateOverAllOperationsForDocument(\n\t\t\t\tdocumentOid,\n\t\t\t\t(patch) => {\n\t\t\t\t\toids.add(patch.oid);\n\t\t\t\t},\n\t\t\t\t{ transaction },\n\t\t\t),\n\t\t]);\n\n\t\treturn Array.from(oids);\n\t};\n\n\tgetDocumentSnapshot = async (\n\t\toid: ObjectIdentifier,\n\t\toptions: { to?: string } = {},\n\t) => {\n\t\tconst documentOid = getOidRoot(oid);\n\t\tassert(documentOid === oid, 'Must be root document OID');\n\t\tconst transaction = this.db.transaction(\n\t\t\t['baselines', 'operations'],\n\t\t\t'readwrite',\n\t\t);\n\t\tconst baselines = await this.baselines.getAllForDocument(documentOid, {\n\t\t\ttransaction,\n\t\t});\n\t\tconst objectMap = new Map<ObjectIdentifier, any>();\n\t\tfor (const baseline of baselines) {\n\t\t\tif (baseline.snapshot) {\n\t\t\t\tassignOid(baseline.snapshot, baseline.oid);\n\t\t\t}\n\t\t\tobjectMap.set(baseline.oid, baseline.snapshot);\n\t\t}\n\t\tawait this.operations.iterateOverAllOperationsForDocument(\n\t\t\tdocumentOid,\n\t\t\t(op) => {\n\t\t\t\tconst obj = objectMap.get(op.oid) || undefined;\n\t\t\t\tconst newObj = applyPatch(obj, op.data);\n\t\t\t\tif (newObj) {\n\t\t\t\t\tassignOid(newObj, op.oid);\n\t\t\t\t}\n\t\t\t\tobjectMap.set(op.oid, newObj);\n\t\t\t},\n\t\t\t{\n\t\t\t\ttransaction,\n\t\t\t\t// only apply operations up to the current time\n\t\t\t\tto: options.to || this.now,\n\t\t\t},\n\t\t);\n\t\tconst root = objectMap.get(documentOid);\n\t\tif (root) {\n\t\t\tsubstituteRefsWithObjects(root, objectMap);\n\t\t}\n\t\treturn root;\n\t};\n\n\t/**\n\t * Methods for writing data\n\t */\n\n\t/**\n\t * Acks that we have seen a timestamp to the server\n\t * and stores it as our local ackedLogicalTime if it's\n\t * greater than our current ackedLogicalTime.\n\t */\n\tack = async (timestamp: string) => {\n\t\tconst localReplicaInfo = await this.localReplica.get();\n\t\t// can't ack timestamps from the future.\n\t\tif (timestamp > this.now) return;\n\n\t\tthis.emit('message', {\n\t\t\ttype: 'ack',\n\t\t\treplicaId: localReplicaInfo.id,\n\t\t\ttimestamp,\n\t\t});\n\t\tif (\n\t\t\t!this._closing &&\n\t\t\t(!localReplicaInfo.ackedLogicalTime ||\n\t\t\t\ttimestamp > localReplicaInfo.ackedLogicalTime)\n\t\t) {\n\t\t\tthis.localReplica.update({ ackedLogicalTime: timestamp });\n\t\t}\n\t};\n\n\t/**\n\t * Applies a patch to the document and stores it in the database.\n\t * @returns the oldest local history timestamp\n\t */\n\tinsertLocalOperation = async (operations: Operation[]) => {\n\t\tif (operations.length === 0) return;\n\t\t// await this.rebaseLock;\n\t\tthis.log(`Inserting ${operations.length} local operations`);\n\n\t\t// add local flag, in place.\n\t\tfor (const operation of operations) {\n\t\t\t(operation as ClientOperation).isLocal = true;\n\t\t}\n\t\tawait this.operations.addOperations(operations as ClientOperation[]);\n\n\t\tconst message = await this.messageCreator.createOperation({ operations });\n\t\tthis.emit('message', message);\n\n\t\t// we can now enqueue and check for rebase opportunities\n\t\tthis.tryAutonomousRebase();\n\t};\n\n\t/**\n\t * Inserts remote operations. This does not affect local history.\n\t * @returns a list of affected document OIDs\n\t */\n\tinsertRemoteOperations = async (operations: Operation[]) => {\n\t\tif (operations.length === 0) return [];\n\t\t// await this.rebaseLock;\n\t\tthis.log(`Inserting ${operations.length} remote operations`);\n\n\t\tconst affectedDocumentOids = await this.operations.addOperations(\n\t\t\toperations.map((patch) => ({\n\t\t\t\t...patch,\n\t\t\t\tisLocal: false,\n\t\t\t})),\n\t\t);\n\n\t\tthis.ack(operations[operations.length - 1].timestamp);\n\n\t\treturn affectedDocumentOids;\n\t};\n\n\tinsertRemoteBaselines = async (baselines: DocumentBaseline[]) => {\n\t\tif (baselines.length === 0) return [];\n\t\tthis.log(`Inserting ${baselines.length} remote baselines`);\n\n\t\tawait this.baselines.setAll(baselines);\n\n\t\t// this.ack(baselines[baselines.length - 1].timestamp);\n\n\t\tconst affectedOidSet = new Set<ObjectIdentifier>();\n\t\tbaselines.forEach((baseline) => {\n\t\t\taffectedOidSet.add(getOidRoot(baseline.oid));\n\t\t});\n\n\t\treturn Array.from(affectedOidSet);\n\t};\n\n\tupdateLastSynced = async (timestamp: string) => {\n\t\tif (this._closing) return;\n\n\t\treturn this.localReplica.update({\n\t\t\tlastSyncedLogicalTime: timestamp,\n\t\t});\n\t};\n\n\tlastSyncedTimestamp = async () => {\n\t\tconst localReplicaInfo = await this.localReplica.get();\n\t\treturn localReplicaInfo.lastSyncedLogicalTime;\n\t};\n\n\tprivate tryAutonomousRebase = async () => {\n\t\tif (this.disableRebasing) return;\n\n\t\tconst localReplicaInfo = await this.localReplica.get();\n\t\tif (localReplicaInfo.lastSyncedLogicalTime) return; // cannot autonomously rebase if we've synced\n\t\t// but if we have never synced... we can rebase everything!\n\t\tawait this.runRebase(this.now);\n\t};\n\n\t/**\n\t * Attempt to autonomously rebase local documents without server intervention.\n\t * This can currently only happen for a client who has never synced before.\n\t * The goal is to allow local-only clients to compress their history to exactly\n\t * their undo stack.\n\t */\n\tprivate runRebase = async (globalAckTimestamp: string) => {\n\t\tif (this._closing) return;\n\n\t\t// find all operations before the global ack\n\t\tlet lastTimestamp;\n\t\tconst toRebase = new Set<ObjectIdentifier>();\n\t\tconst transaction = this.db.transaction(\n\t\t\t['baselines', 'operations'],\n\t\t\t'readwrite',\n\t\t);\n\t\tlet operationCount = 0;\n\t\tawait this.operations.iterateOverAllOperations(\n\t\t\t(patch) => {\n\t\t\t\ttoRebase.add(patch.oid);\n\t\t\t\tlastTimestamp = patch.timestamp;\n\t\t\t\toperationCount++;\n\t\t\t},\n\t\t\t{\n\t\t\t\tbefore: globalAckTimestamp,\n\t\t\t\ttransaction,\n\t\t\t},\n\t\t);\n\n\t\tif (!toRebase.size) {\n\t\t\tthis.log('Cannot rebase, no operations prior to', globalAckTimestamp);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._closing) {\n\t\t\treturn;\n\t\t}\n\n\t\t// rebase each affected document\n\t\tlet newBaselines = [];\n\t\tfor (const oid of toRebase) {\n\t\t\tnewBaselines.push(\n\t\t\t\tawait this.rebase(\n\t\t\t\t\toid,\n\t\t\t\t\tlastTimestamp || globalAckTimestamp,\n\t\t\t\t\ttransaction,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tthis.emit('rebase', newBaselines);\n\t};\n\n\trebase = async (\n\t\toid: ObjectIdentifier,\n\t\tupTo: string,\n\t\tprovidedTx?: IDBTransaction,\n\t) => {\n\t\t// including replica Id for testing I guess\n\t\tconst replicaId = (await this.localReplica.get()).id;\n\n\t\tthis.log('[', replicaId, ']', 'Rebasing', oid, 'up to', upTo);\n\t\tconst transaction =\n\t\t\tprovidedTx ||\n\t\t\tthis.db.transaction(['operations', 'baselines'], 'readwrite');\n\t\tconst baseline = await this.baselines.get(oid, { transaction });\n\t\tlet current: any = baseline?.snapshot || undefined;\n\t\tlet operationsApplied = 0;\n\t\tconst deletedRefs: Ref[] = [];\n\t\tawait this.operations.iterateOverAllOperationsForEntity(\n\t\t\toid,\n\t\t\t(patch, store) => {\n\t\t\t\t// FIXME: this seems like the wrong place to do this\n\t\t\t\t// but it's here as a safety measure...\n\t\t\t\tif (!baseline || patch.timestamp > baseline.timestamp) {\n\t\t\t\t\tcurrent = applyPatch(current, patch.data, deletedRefs);\n\t\t\t\t}\n\t\t\t\t// delete all prior operations to the baseline\n\t\t\t\toperationsApplied++;\n\t\t\t\tstore.delete(patch.oid_timestamp);\n\t\t\t},\n\t\t\t{\n\t\t\t\tto: upTo,\n\t\t\t\ttransaction,\n\t\t\t},\n\t\t);\n\t\tif (current) {\n\t\t\tassignOid(current, oid);\n\t\t}\n\t\tconst newBaseline = {\n\t\t\toid,\n\t\t\tsnapshot: current,\n\t\t\ttimestamp: upTo,\n\t\t};\n\t\tif (newBaseline.snapshot) {\n\t\t\tawait this.baselines.set(newBaseline, { transaction });\n\t\t} else {\n\t\t\tawait this.baselines.delete(oid, { transaction });\n\t\t}\n\n\t\tthis.log(\n\t\t\t'successfully rebased',\n\t\t\toid,\n\t\t\t'up to',\n\t\t\tupTo,\n\t\t\t':',\n\t\t\tcurrent,\n\t\t\t'and deleted',\n\t\t\toperationsApplied,\n\t\t\t'operations',\n\t\t);\n\n\t\t// cleanup deleted refs\n\t\tif (deletedRefs.length) {\n\t\t\tconst fileRefs = deletedRefs.filter(isFileRef);\n\t\t\tif (fileRefs.length) {\n\t\t\t\tthis.emit('filesDeleted', fileRefs);\n\t\t\t}\n\t\t}\n\n\t\treturn newBaseline;\n\t};\n\n\treset = async () => {\n\t\tawait this.operations.reset();\n\t\tawait this.baselines.reset();\n\t\tawait this.localReplica.reset();\n\t};\n\n\tupdateSchema = async (schema: StorageSchema, overrideConflict?: number) => {\n\t\tconst storedSchema = await this.schema.get();\n\t\tif (storedSchema) {\n\t\t\t// version changes will be handled by migration routines in\n\t\t\t// the actual idb database loading code (see: initializeDatabases)\n\n\t\t\t// but this check determines if the schema has been changed without\n\t\t\t// a version change. if so, it will error.\n\t\t\tif (\n\t\t\t\toverrideConflict === storedSchema.version &&\n\t\t\t\tstoredSchema.version === schema.version &&\n\t\t\t\tJSON.stringify(storedSchema) !== JSON.stringify(schema)\n\t\t\t) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Schema mismatch for version ${schema.version}\n\t\t\t\t\t${JSON.stringify(storedSchema)}\n\t\t\t\t\t${JSON.stringify(schema)}`,\n\t\t\t\t);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Schema has changed without a version change! Any changes to your schema must be accompanied by a change in schema version and a migration routine.',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tawait this.schema.set(schema);\n\t};\n\n\tsetGlobalAck = async (timestamp: string) => {\n\t\tif (this._closing) return;\n\t\tawait this.ackInfo.setGlobalAck(timestamp);\n\t\tif (!this.disableRebasing) {\n\t\t\tawait this.runRebase(timestamp);\n\t\t}\n\t};\n\n\texport = async (): Promise<ExportData> => {\n\t\tconst db = this.db;\n\t\tconst [baselines, operations] = await getAllFromObjectStores(db, [\n\t\t\t'baselines',\n\t\t\t'operations',\n\t\t]);\n\t\tconst localReplica = await this.localReplica.get();\n\t\tconst schema = await this.schema.get();\n\t\tif (!schema) {\n\t\t\tthrow new Error('Cannot export Client data before initializing');\n\t\t}\n\t\treturn {\n\t\t\toperations,\n\t\t\tbaselines,\n\t\t\tlocalReplica,\n\t\t\tschema,\n\t\t};\n\t};\n\n\t/**\n\t * Resets local metadata and clears operation/baseline stores.\n\t * DOES NOT add operations/baselines - this should be done\n\t * through the normal higher level systems.\n\t */\n\tresetFrom = async (data: ExportData) => {\n\t\tconst db = this.db;\n\t\tconst transaction = db.transaction(\n\t\t\t['baselines', 'operations', 'info'],\n\t\t\t'readwrite',\n\t\t);\n\t\tawait storeRequestPromise(transaction.objectStore('baselines').clear());\n\t\tawait storeRequestPromise(transaction.objectStore('operations').clear());\n\t\tawait storeRequestPromise(transaction.objectStore('info').clear());\n\t\tawait this.localReplica.update(\n\t\t\t{\n\t\t\t\tackedLogicalTime: data.localReplica.ackedLogicalTime,\n\t\t\t\tlastSyncedLogicalTime: data.localReplica.lastSyncedLogicalTime,\n\t\t\t},\n\t\t\t{ transaction },\n\t\t);\n\t};\n\n\tstats = async () => {\n\t\tconst db = this.db;\n\t\tconst operationsSize = await getSizeOfObjectStore(db, 'operations');\n\t\tconst baselinesSize = await getSizeOfObjectStore(db, 'baselines');\n\n\t\treturn {\n\t\t\toperationsSize,\n\t\t\tbaselinesSize,\n\t\t};\n\t};\n}\n", "import { closeDatabase, storeRequestPromise } from '../idb.js';\n\nconst migrations = [version1, version2, version3, version4];\n\nexport function openMetadataDatabase({\n\tindexedDB = window.indexedDB,\n\tnamespace,\n\tlog,\n}: {\n\tindexedDB?: IDBFactory;\n\tnamespace: string;\n\tlog?: (...args: any[]) => void;\n}): Promise<{ wasInitialized: boolean; db: IDBDatabase }> {\n\treturn new Promise<{ wasInitialized: boolean; db: IDBDatabase }>(\n\t\t(resolve, reject) => {\n\t\t\tconst request = indexedDB.open(`${namespace}_meta`, 4);\n\t\t\tlet wasInitialized = false;\n\t\t\trequest.onupgradeneeded = async (event) => {\n\t\t\t\tconst db = request.result;\n\t\t\t\tconst tx = request.transaction!;\n\n\t\t\t\tconst toRun = migrations.slice(event.oldVersion);\n\t\t\t\tfor (const migration of toRun) {\n\t\t\t\t\tawait migration(db, tx);\n\t\t\t\t}\n\n\t\t\t\tif (!event.oldVersion) {\n\t\t\t\t\twasInitialized = true;\n\t\t\t\t}\n\t\t\t};\n\t\t\trequest.onerror = () => {\n\t\t\t\tconsole.error('Error opening database', request.error);\n\t\t\t\treject(request.error);\n\t\t\t};\n\t\t\trequest.onsuccess = () => {\n\t\t\t\tresolve({ db: request.result, wasInitialized });\n\t\t\t};\n\t\t},\n\t);\n}\n\nexport async function openWIPMetadataDatabase({\n\twipNamespace,\n\tnamespace,\n\tindexedDB,\n\tlog,\n}: {\n\tindexedDB?: IDBFactory;\n\tnamespace: string;\n\twipNamespace: string;\n\tlog?: (...args: any[]) => void;\n}): Promise<{ wasInitialized: boolean; db: IDBDatabase }> {\n\tconst result = await openMetadataDatabase({\n\t\tnamespace: wipNamespace,\n\t\tindexedDB,\n\t\tlog,\n\t});\n\n\t// this WIP database was already set up.\n\tif (!result.wasInitialized) {\n\t\treturn result;\n\t}\n\n\tlog?.('debug', 'Beginning copy of production metadata database to WIP');\n\t// copy all data from production metadata database\n\tconst { db: prodDb } = await openMetadataDatabase({\n\t\tnamespace,\n\t\tindexedDB,\n\t\tlog,\n\t});\n\n\tconst tx = prodDb.transaction(\n\t\t['baselines', 'operations', 'info'],\n\t\t'readonly',\n\t);\n\tconst [baselines, operations, info] = await Promise.all([\n\t\tstoreRequestPromise(tx.objectStore('baselines').getAll()),\n\t\tstoreRequestPromise(tx.objectStore('operations').getAll()),\n\t\tstoreRequestPromise(tx.objectStore('info').getAll()),\n\t]);\n\n\tconst wipTx = result.db.transaction(\n\t\t['baselines', 'operations', 'info'],\n\t\t'readwrite',\n\t);\n\tconst wipBaselines = wipTx.objectStore('baselines');\n\tconst wipOperations = wipTx.objectStore('operations');\n\tconst wipInfo = wipTx.objectStore('info');\n\n\tfor (const baseline of baselines) {\n\t\twipBaselines.put(baseline);\n\t}\n\tfor (const operation of operations) {\n\t\twipOperations.put(operation);\n\t}\n\tfor (const infoItem of info) {\n\t\twipInfo.put(infoItem);\n\t}\n\n\tawait new Promise<void>((resolve, reject) => {\n\t\twipTx.oncomplete = () => {\n\t\t\tresolve();\n\t\t};\n\t\twipTx.onerror = (event) => {\n\t\t\treject(event);\n\t\t};\n\t\twipTx.onabort = (event) => {\n\t\t\treject(event);\n\t\t};\n\t});\n\n\tawait closeDatabase(prodDb);\n\n\tlog?.(\n\t\t'debug',\n\t\t'Finished copy of production metadata database to WIP. Copied:',\n\t\tbaselines.length,\n\t\t'baselines,',\n\t\toperations.length,\n\t\t'operations',\n\t);\n\n\treturn result;\n}\n\nasync function version1(db: IDBDatabase, tx: IDBTransaction) {\n\tconst baselinesStore = db.createObjectStore('baselines', {\n\t\tkeyPath: 'oid',\n\t});\n\tconst operationsStore = db.createObjectStore('operations', {\n\t\tkeyPath: 'oid_timestamp',\n\t});\n\tconst infoStore = db.createObjectStore('info', { keyPath: 'type' });\n\tbaselinesStore.createIndex('timestamp', 'timestamp');\n\toperationsStore.createIndex('isLocal_timestamp', 'isLocal_timestamp');\n\toperationsStore.createIndex('documentOid_timestamp', 'documentOid_timestamp');\n}\n\n/**\n * 1 -> 2 changes:\n *\n * Consolidate compound index names:\n *\n * Operations:\n * - isLocal_timestamp -> l_t\n * - documentOid_timestamp -> d_t\n */\nasync function version2(db: IDBDatabase, tx: IDBTransaction) {\n\tconst operations = tx.objectStore('operations');\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst cursorReq = operations.openCursor();\n\t\tcursorReq.onsuccess = () => {\n\t\t\t// rename the consolidated fields\n\t\t\tconst cursor = cursorReq.result;\n\t\t\tif (cursor) {\n\t\t\t\tconst { isLocal_timestamp, documentOid_timestamp, ...value } =\n\t\t\t\t\tcursor.value;\n\t\t\t\tcursor.update({\n\t\t\t\t\t...value,\n\t\t\t\t\tl_t: isLocal_timestamp,\n\t\t\t\t\td_t: documentOid_timestamp,\n\t\t\t\t});\n\t\t\t\tcursor.continue();\n\t\t\t} else {\n\t\t\t\tresolve();\n\t\t\t}\n\t\t};\n\t\tcursorReq.onerror = (event) => {\n\t\t\treject(cursorReq.error);\n\t\t};\n\t});\n\t// remove the old indexes\n\toperations.deleteIndex('isLocal_timestamp');\n\toperations.deleteIndex('documentOid_timestamp');\n\t// create the new indexes\n\toperations.createIndex('l_t', 'l_t', { unique: false });\n\toperations.createIndex('o_t', 'o_t', { unique: false });\n\toperations.createIndex('d_t', 'd_t', { unique: false });\n}\n\n/**\n * 2 -> 3 changes:\n *\n * Add timestamp index to operations\n */\nasync function version3(db: IDBDatabase, tx: IDBTransaction) {\n\tconst operations = tx.objectStore('operations');\n\toperations.createIndex('timestamp', 'timestamp');\n}\n\nasync function version4(db: IDBDatabase, tx: IDBTransaction) {\n\tconst files = db.createObjectStore('files', {\n\t\tkeyPath: 'id',\n\t});\n\tfiles.createIndex('remote', 'remote');\n\tfiles.createIndex('deletedAt', 'deletedAt');\n}\n", "import {\n\tassert,\n\tCollectionCompoundIndexFilter,\n\tCollectionFilter,\n\tcreateCompoundIndexValue,\n\tcreateLowerBoundIndexValue,\n\tcreateUpperBoundIndexValue,\n\tisMatchIndexFilter,\n\tisRangeIndexFilter,\n\tisSortIndexFilter,\n\tisStartsWithIndexFilter,\n\tMatchCollectionIndexFilter,\n\tRangeCollectionIndexFilter,\n\tsanitizeIndexValue,\n\tSortIndexFilter,\n\tStartsWithIndexFilter,\n\tStorageSchema,\n} from '@verdant-web/common';\n\nconst matchIndexToIdbKeyRange = (filter: MatchCollectionIndexFilter) => {\n\treturn IDBKeyRange.only(sanitizeIndexValue(filter.equals));\n};\n\nconst sortIndexToIdbKeyRange = (filter: SortIndexFilter) => {\n\treturn undefined;\n};\n\nconst rangeIndexToIdbKeyRange = (filter: RangeCollectionIndexFilter) => {\n\tconst lower = filter.gte || filter.gt;\n\tconst upper = filter.lte || filter.lt;\n\tif (lower === upper) {\n\t\treturn IDBKeyRange.only(sanitizeIndexValue(lower));\n\t}\n\tif (!lower) {\n\t\treturn IDBKeyRange.upperBound(sanitizeIndexValue(upper), !!filter.lt);\n\t} else if (!upper) {\n\t\treturn IDBKeyRange.lowerBound(sanitizeIndexValue(lower), !!filter.gt);\n\t} else {\n\t\treturn IDBKeyRange.bound(\n\t\t\tsanitizeIndexValue(lower),\n\t\t\tsanitizeIndexValue(upper),\n\t\t\t!!filter.gt,\n\t\t\t!!filter.lt,\n\t\t);\n\t}\n};\n\nconst compoundIndexToIdbKeyRange = (\n\t// FIXME:\n\tschema: any,\n\tcollection: string,\n\tfilter: CollectionCompoundIndexFilter,\n) => {\n\t// validate the usage of the compound index:\n\t// - all match fields must be contiguous at the start of the compound order\n\tconst indexDefinition =\n\t\tschema.collections[collection].compounds[filter.where];\n\tassert(\n\t\tindexDefinition,\n\t\t`Index ${filter.where} does not exist on collection ${collection}`,\n\t);\n\tconst matchedKeys = Object.keys(filter.match).sort(\n\t\t(a, b) => indexDefinition.of.indexOf(a) - indexDefinition.of.indexOf(b),\n\t);\n\tfor (const key of matchedKeys) {\n\t\tif (indexDefinition.of.indexOf(key) !== matchedKeys.indexOf(key)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Compound index ${filter.where} does not have ${key} at the start of its order`,\n\t\t\t);\n\t\t}\n\t}\n\n\tconst matchedValues = matchedKeys.map(\n\t\t(key) => filter.match[key as keyof typeof filter.match] as string | number,\n\t);\n\n\t// special case: all match fields are specified - we don't need a range\n\t// query, just a single key query\n\tif (matchedKeys.length === indexDefinition.of.length) {\n\t\treturn IDBKeyRange.only(createCompoundIndexValue(...matchedValues));\n\t}\n\n\t// create our bounds for the matched values\n\tconst lower = createLowerBoundIndexValue(...matchedValues);\n\tconst upper = createUpperBoundIndexValue(...matchedValues);\n\treturn IDBKeyRange.bound(lower, upper);\n};\n\nfunction startsWithIndexToIdbKeyRange(filter: StartsWithIndexFilter) {\n\tconst lower = filter.startsWith;\n\tconst upper = filter.startsWith + '\\uffff';\n\treturn IDBKeyRange.bound(lower, upper);\n}\n\nexport function getRange(\n\tschema: StorageSchema,\n\tcollection: string,\n\tindex?: CollectionFilter,\n) {\n\tif (!index) return undefined;\n\tif (isRangeIndexFilter(index)) return rangeIndexToIdbKeyRange(index);\n\tif (isMatchIndexFilter(index)) return matchIndexToIdbKeyRange(index);\n\tif (isSortIndexFilter(index)) return sortIndexToIdbKeyRange(index);\n\tif (isStartsWithIndexFilter(index))\n\t\treturn startsWithIndexToIdbKeyRange(index);\n\treturn compoundIndexToIdbKeyRange(schema, collection, index);\n}\n", "import { CollectionFilter, createOid } from '@verdant-web/common';\nimport { Context } from '../context.js';\nimport { getRange } from './ranges.js';\n\nfunction getStore(db: IDBDatabase, collection: string, write?: boolean) {\n\treturn db\n\t\t.transaction(collection, write ? 'readwrite' : 'readonly')\n\t\t.objectStore(collection);\n}\n\nexport async function findOneOid({\n\tcollection,\n\tindex,\n\tcontext,\n}: {\n\tcollection: string;\n\tindex?: CollectionFilter;\n\tcontext: Context;\n}) {\n\tconst store = getStore(context.documentDb, collection);\n\tconst source = index ? store.index(index.where) : store;\n\tconst range = getRange(context.schema, collection, index);\n\tconst direction = index?.order === 'desc' ? 'prev' : 'next';\n\tconst request = source.openCursor(range, direction);\n\tconst result = await new Promise<string | null>((resolve, reject) => {\n\t\trequest.onsuccess = () => {\n\t\t\tconst cursor = request.result;\n\t\t\tif (cursor) {\n\t\t\t\tresolve(createOid(collection, cursor.primaryKey.toString()));\n\t\t\t} else {\n\t\t\t\tresolve(null);\n\t\t\t}\n\t\t};\n\t\trequest.onerror = () => {\n\t\t\tif (request.error?.name === 'InvalidStateError') {\n\t\t\t\tcontext.log(\n\t\t\t\t\t'error',\n\t\t\t\t\t`findOne query failed with InvalidStateError`,\n\t\t\t\t\trequest.error,\n\t\t\t\t);\n\t\t\t\tresolve(null);\n\t\t\t} else {\n\t\t\t\treject(request.error);\n\t\t\t}\n\t\t};\n\t});\n\treturn result;\n}\n\nexport async function findAllOids({\n\tcollection,\n\tindex,\n\tcontext,\n}: {\n\tcollection: string;\n\tindex?: CollectionFilter;\n\tcontext: Context;\n}) {\n\tconst store = getStore(context.documentDb, collection);\n\tconst source = index ? store.index(index.where) : store;\n\tconst range = getRange(context.schema, collection, index);\n\tconst direction = index?.order === 'desc' ? 'prev' : 'next';\n\tconst request = source.openCursor(range, direction);\n\tconst result = await new Promise<string[]>((resolve, reject) => {\n\t\tconst results = new Set<string>();\n\t\trequest.onsuccess = () => {\n\t\t\tconst cursor = request.result;\n\t\t\tif (cursor) {\n\t\t\t\tresults.add(createOid(collection, cursor.primaryKey.toString()));\n\t\t\t\tcursor.continue();\n\t\t\t} else {\n\t\t\t\tresolve(Array.from(results));\n\t\t\t}\n\t\t};\n\t\trequest.onerror = () => {\n\t\t\tif (request.error?.name === 'InvalidStateError') {\n\t\t\t\tcontext.log(\n\t\t\t\t\t'error',\n\t\t\t\t\t`findAll query failed with InvalidStateError`,\n\t\t\t\t\trequest.error,\n\t\t\t\t);\n\t\t\t\tresolve([]);\n\t\t\t} else {\n\t\t\t\treject(request.error);\n\t\t\t}\n\t\t};\n\t});\n\treturn result;\n}\n\nexport async function findPageOfOids({\n\tcollection,\n\tindex,\n\tcontext,\n\tlimit,\n\toffset,\n}: {\n\tcollection: string;\n\tindex?: CollectionFilter;\n\tcontext: Context;\n\tlimit?: number;\n\toffset?: number;\n}) {\n\tconst store = getStore(context.documentDb, collection);\n\tconst source = index ? store.index(index.where) : store;\n\tconst range = getRange(context.schema, collection, index);\n\tconst direction = index?.order === 'desc' ? 'prev' : 'next';\n\tconst request = source.openCursor(range, direction);\n\tlet hasDoneOffset = !offset;\n\tlet hasNextPage = false;\n\tlet visited = 0;\n\tconst result = await new Promise<string[]>((resolve, reject) => {\n\t\tconst results = new Set<string>();\n\t\trequest.onsuccess = () => {\n\t\t\tvisited++;\n\t\t\tconst cursor = request.result;\n\t\t\tif (cursor) {\n\t\t\t\tif (offset && !hasDoneOffset) {\n\t\t\t\t\tcursor.advance(offset);\n\t\t\t\t\thasDoneOffset = true;\n\t\t\t\t} else {\n\t\t\t\t\tif (limit && results.size < limit) {\n\t\t\t\t\t\tresults.add(createOid(collection, cursor.primaryKey.toString()));\n\t\t\t\t\t}\n\t\t\t\t\tif (limit && visited > limit) {\n\t\t\t\t\t\thasNextPage = true;\n\t\t\t\t\t\tresolve(Array.from(results));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcursor.continue();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresolve(Array.from(results));\n\t\t\t}\n\t\t};\n\t\trequest.onerror = () => {\n\t\t\tif (request.error?.name === 'InvalidStateError') {\n\t\t\t\tcontext.log(\n\t\t\t\t\t'error',\n\t\t\t\t\t`find query failed with InvalidStateError`,\n\t\t\t\t\trequest.error,\n\t\t\t\t);\n\t\t\t\tresolve([]);\n\t\t\t} else {\n\t\t\t\treject(request.error);\n\t\t\t}\n\t\t};\n\t});\n\n\treturn {\n\t\tresult: result as string[],\n\t\thasNextPage,\n\t};\n}\n", "export async function getDatabaseVersion(\n\tindexedDB: IDBFactory,\n\tnamespace: string,\n\tversion: number,\n\tlog?: (...args: any[]) => void,\n): Promise<number> {\n\tfunction openAndGetVersion(\n\t\tresolve: (res: [number, IDBDatabase]) => void,\n\t\treject: (err: Error) => void,\n\t) {\n\t\tlet currentVersion: number;\n\t\tlet database: IDBDatabase;\n\t\tconst request = indexedDB.open(\n\t\t\t[namespace, 'collections'].join('_'),\n\t\t\tversion,\n\t\t);\n\t\trequest.onupgradeneeded = async (event) => {\n\t\t\tcurrentVersion = event.oldVersion;\n\t\t\tconst transaction = request.transaction!;\n\t\t\tdatabase = request.result;\n\t\t\ttransaction.abort();\n\t\t};\n\t\trequest.onsuccess = (event) => {\n\t\t\tresolve([request.result.version, request.result]);\n\t\t};\n\t\trequest.onblocked = (event) => {\n\t\t\t// retry if blocked\n\t\t\tlog?.('Database blocked, waiting...');\n\t\t\t// setTimeout(() => {\n\t\t\t// \topenAndGetVersion(resolve, reject);\n\t\t\t// }, 200);\n\t\t};\n\t\trequest.onerror = (event) => {\n\t\t\t// FIXME: this fails if the code is older than the local database\n\t\t\tresolve([currentVersion!, database!]);\n\t\t};\n\t}\n\tconst [currentVersion, db] = await new Promise<[number, IDBDatabase]>(\n\t\topenAndGetVersion,\n\t);\n\tawait closeDatabase(db);\n\treturn currentVersion;\n}\n\nexport async function closeDatabase(db: IDBDatabase) {\n\tdb.close();\n\t// FIXME: this isn't right!!!!\n\tawait new Promise<void>((resolve) => resolve());\n}\n\n/**\n * Upgrades the database to the given version, using the given upgrader function.\n */\nexport async function upgradeDatabase(\n\tindexedDb: IDBFactory,\n\tnamespace: string,\n\tversion: number,\n\tupgrader: (\n\t\ttransaction: IDBTransaction,\n\t\tdb: IDBDatabase,\n\t\tevent: IDBVersionChangeEvent,\n\t) => void,\n\tlog?: (...args: any[]) => void,\n): Promise<void> {\n\tfunction openAndUpgrade(resolve: () => void, reject: (err: Error) => void) {\n\t\tconst request = indexedDb.open(\n\t\t\t[namespace, 'collections'].join('_'),\n\t\t\tversion,\n\t\t);\n\t\tlet wasUpgraded = false;\n\t\trequest.onupgradeneeded = (event) => {\n\t\t\tconst transaction = request.transaction!;\n\t\t\tupgrader(transaction, request.result, event);\n\t\t\twasUpgraded = true;\n\t\t};\n\t\trequest.onsuccess = (event) => {\n\t\t\trequest.result.close();\n\t\t\tif (wasUpgraded) {\n\t\t\t\tresolve();\n\t\t\t} else {\n\t\t\t\treject(\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t'Database was not upgraded when a version change was expected',\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\t\trequest.onerror = (event) => {\n\t\t\treject(request.error || new Error('Unknown error'));\n\t\t};\n\t\trequest.onblocked = (event) => {\n\t\t\tlog?.('Database upgrade blocked, waiting...');\n\t\t\t// setTimeout(() => {\n\t\t\t// \topenAndUpgrade(resolve, reject);\n\t\t\t// }, 200);\n\t\t};\n\t}\n\treturn new Promise(openAndUpgrade);\n}\n\nexport async function acquireLock(\n\tnamespace: string,\n\tprocedure: () => Promise<void>,\n) {\n\tif (typeof navigator !== 'undefined' && navigator.locks) {\n\t\tawait navigator.locks.request(`verdant_migration_${namespace}`, procedure);\n\t} else {\n\t\t// TODO: is there a fallback?\n\t\tawait procedure();\n\t}\n}\n\nexport async function openDatabase(\n\tindexedDb: IDBFactory,\n\tnamespace: string,\n\tversion: number,\n\tlog?: (...args: any[]) => void,\n): Promise<IDBDatabase> {\n\tlog?.('debug', 'Opening database', namespace, 'at version', version);\n\tconst db = await new Promise<IDBDatabase>((resolve, reject) => {\n\t\tconst request = indexedDb.open(\n\t\t\t[namespace, 'collections'].join('_'),\n\t\t\tversion,\n\t\t);\n\t\trequest.onupgradeneeded = async (event) => {\n\t\t\tconst transaction = request.transaction!;\n\t\t\ttransaction.abort();\n\n\t\t\tlog?.(\n\t\t\t\t'error',\n\t\t\t\t'Database upgrade needed, but not expected',\n\t\t\t\t'Expected',\n\t\t\t\tversion,\n\t\t\t\t'Got',\n\t\t\t\trequest.result.version,\n\t\t\t);\n\t\t\treject(\n\t\t\t\trequest.error ||\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t`Migration error: database version changed unexpectedly when reading current data. Expected ${version}, got ${request.result.version}`,\n\t\t\t\t\t),\n\t\t\t);\n\t\t};\n\t\trequest.onsuccess = (event) => {\n\t\t\tresolve(request.result);\n\t\t};\n\t\trequest.onblocked = (event) => {\n\t\t\treject(new Error('Migration error: database blocked'));\n\t\t};\n\t\trequest.onerror = (event) => {\n\t\t\treject(new Error('Migration error: database error'));\n\t\t};\n\t});\n\n\tdb.addEventListener('versionchange', (event) => {\n\t\tdb.close();\n\t});\n\n\treturn db;\n}\n", "export class MigrationPathError extends Error {\n\treadonly name = 'MigrationPathError';\n\n\tconstructor(public readonly message: string) {\n\t\tsuper(message);\n\t}\n}\n", "import { Migration } from '@verdant-web/common';\nimport { MigrationPathError } from './errors.js';\n\nexport function getMigrationPath({\n\tcurrentVersion,\n\ttargetVersion,\n\tmigrations,\n}: {\n\tcurrentVersion: number;\n\ttargetVersion: number;\n\tmigrations: Migration[];\n}) {\n\tconst path = getNextPathStep({\n\t\tcurrentVersion,\n\t\ttargetVersion,\n\t\tmigrations,\n\t});\n\tif (!path) {\n\t\tthrow new MigrationPathError(\n\t\t\t`No migration path found from ${currentVersion} to ${targetVersion}! This is a bug. If you're seeing this, contact the developer and provide them with the full contents of this message.`,\n\t\t);\n\t}\n\treturn path;\n}\n\nfunction getNextPathStep({\n\tcurrentVersion,\n\ttargetVersion,\n\tmigrations,\n}: {\n\tcurrentVersion: number;\n\ttargetVersion: number;\n\tmigrations: Migration[];\n}): Migration[] | null {\n\tif (currentVersion === targetVersion) {\n\t\treturn [];\n\t}\n\n\tconst fromHere = migrations\n\t\t.filter((m) => m.oldSchema.version === currentVersion)\n\t\t.sort((a, b) => b.newSchema.version - a.newSchema.version);\n\n\t// keep trying next steps, starting from the largest step,\n\t// until we find one that leads to the target version down the line\n\twhile (fromHere.length > 0) {\n\t\tconst next = fromHere.shift()!;\n\t\t// this one goes too far (probably never relevant, but still)\n\t\tif (next.newSchema.version > targetVersion) {\n\t\t\treturn null;\n\t\t}\n\t\t// exact match - we're done, return the path\n\t\tif (next.newSchema.version === targetVersion) {\n\t\t\treturn [next];\n\t\t}\n\t\t// look ahead a down the line. do we reach the target? if so,\n\t\t// we choose this path.\n\t\tconst nextPath = getNextPathStep({\n\t\t\tcurrentVersion: next.newSchema.version,\n\t\t\ttargetVersion,\n\t\t\tmigrations,\n\t\t});\n\t\tif (nextPath) {\n\t\t\treturn [next, ...nextPath];\n\t\t}\n\n\t\t// otherwise, try the next one with a smaller increment\n\t}\n\n\t// no paths from here match at all! if another layer is calling this one,\n\t// it will fallback to its next longest step. otherwise there may\n\t// be no paths at all...\n\treturn null;\n}\n", "import {\n\tCollectionFilter,\n\tMigration,\n\tMigrationEngine,\n\tObjectIdentifier,\n\tStorageSchema,\n\taddFieldDefaults,\n\tassert,\n\tassignIndexValues,\n\tassignOidPropertiesToAllSubObjects,\n\tassignOidsToAllSubObjects,\n\tcloneDeep,\n\tcreateOid,\n\tdecomposeOid,\n\tdiffToPatches,\n\tgetIndexValues,\n\tgetOidRoot,\n\thasOid,\n\tinitialToPatches,\n\tremoveOidPropertiesFromAllSubObjects,\n} from '@verdant-web/common';\nimport { Context } from '../context.js';\nimport { storeRequestPromise } from '../idb.js';\nimport { Metadata } from '../metadata/Metadata.js';\nimport { ClientOperation } from '../metadata/OperationsStore.js';\nimport { findAllOids, findOneOid } from '../queries/dbQueries.js';\nimport {\n\tacquireLock,\n\tcloseDatabase,\n\tgetDatabaseVersion,\n\topenDatabase,\n\tupgradeDatabase,\n} from './db.js';\nimport { getMigrationPath } from './paths.js';\n\nconst globalIDB =\n\ttypeof window !== 'undefined' ? window.indexedDB : (undefined as any);\n\ntype OpenDocumentDbContext = Omit<Context, 'documentDb'>;\n\nexport async function openDocumentDatabase({\n\tversion,\n\tindexedDB = globalIDB,\n\tmigrations,\n\tmeta,\n\tcontext,\n}: {\n\tversion: number;\n\tmigrations: Migration<any>[];\n\tindexedDB?: IDBFactory;\n\tmeta: Metadata;\n\tcontext: OpenDocumentDbContext;\n}) {\n\tif (context.schema.wip) {\n\t\tthrow new Error('Cannot open a production client with a WIP schema!');\n\t}\n\n\tconst currentVersion = await getDatabaseVersion(\n\t\tindexedDB,\n\t\tcontext.namespace,\n\t\tversion,\n\t\tcontext.log,\n\t);\n\n\tcontext.log(\n\t\t'debug',\n\t\t'Current database version:',\n\t\tcurrentVersion,\n\t\t'target version:',\n\t\tversion,\n\t);\n\n\tconst toRun = getMigrationPath({\n\t\tcurrentVersion,\n\t\ttargetVersion: version,\n\t\tmigrations,\n\t});\n\n\tif (toRun.length > 0) {\n\t\tcontext.log(\n\t\t\t'debug',\n\t\t\t'Migrations to run:',\n\t\t\ttoRun.map((m) => m.version),\n\t\t);\n\t\tawait runMigrations({ context, toRun, meta, indexedDB });\n\t}\n\treturn openDatabase(indexedDB, context.namespace, version, context.log);\n}\n\nexport async function openWIPDocumentDatabase({\n\tversion,\n\tindexedDB = globalIDB,\n\tmigrations,\n\tmeta,\n\tcontext,\n\twipNamespace,\n}: {\n\tversion: number;\n\tmigrations: Migration<any>[];\n\tindexedDB?: IDBFactory;\n\tmeta: Metadata;\n\tcontext: OpenDocumentDbContext;\n\twipNamespace: string;\n}) {\n\tcontext.log('debug', 'Opening WIP database', wipNamespace);\n\tconst currentWIPVersion = await getDatabaseVersion(\n\t\tindexedDB,\n\t\twipNamespace,\n\t\tversion,\n\t\tcontext.log,\n\t);\n\n\tif (currentWIPVersion === version) {\n\t\tcontext.log('info', `WIP schema is up-to-date; not refreshing database`);\n\t} else {\n\t\tcontext.log('info', `WIP schema is out-of-date; refreshing database`);\n\n\t\t// first we need to copy the data from the production database to the WIP database\n\t\t// at the current (non-wip) version.\n\n\t\tconst initialToRun = getMigrationPath({\n\t\t\tcurrentVersion: currentWIPVersion,\n\t\t\ttargetVersion: version - 1,\n\t\t\tmigrations,\n\t\t});\n\n\t\tif (initialToRun.length > 0) {\n\t\t\tawait runMigrations({\n\t\t\t\tcontext,\n\t\t\t\ttoRun: initialToRun,\n\t\t\t\tmeta,\n\t\t\t\tindexedDB,\n\t\t\t\tnamespace: wipNamespace,\n\t\t\t});\n\n\t\t\t// now, we copy the data from the main database.\n\t\t\tconst mainDatabase = await openDatabase(\n\t\t\t\tindexedDB,\n\t\t\t\tcontext.namespace,\n\t\t\t\tversion - 1,\n\t\t\t\tcontext.log,\n\t\t\t);\n\n\t\t\tconst wipDatabase = await openDatabase(\n\t\t\t\tindexedDB,\n\t\t\t\twipNamespace,\n\t\t\t\tversion - 1,\n\t\t\t\tcontext.log,\n\t\t\t);\n\n\t\t\t// DOMStringList... doesn't have iterable... why\n\t\t\tconst mainDatabaseStoreNames = new Array<string>();\n\t\t\tfor (let i = 0; i < mainDatabase.objectStoreNames.length; i++) {\n\t\t\t\tmainDatabaseStoreNames.push(mainDatabase.objectStoreNames[i]);\n\t\t\t}\n\n\t\t\tconst copyFromTransaction = mainDatabase.transaction(\n\t\t\t\tmainDatabaseStoreNames,\n\t\t\t\t'readonly',\n\t\t\t);\n\t\t\tconst copyFromStores = mainDatabaseStoreNames.map((name) =>\n\t\t\t\tcopyFromTransaction.objectStore(name),\n\t\t\t);\n\t\t\tconst allObjects = await Promise.all(\n\t\t\t\tcopyFromStores.map((store) => storeRequestPromise(store.getAll())),\n\t\t\t);\n\n\t\t\tconst copyToTransaction = wipDatabase.transaction(\n\t\t\t\tmainDatabaseStoreNames,\n\t\t\t\t'readwrite',\n\t\t\t);\n\t\t\tconst copyToStores = mainDatabaseStoreNames.map((name) =>\n\t\t\t\tcopyToTransaction.objectStore(name),\n\t\t\t);\n\n\t\t\tfor (let i = 0; i < copyToStores.length; i++) {\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tallObjects[i].map((obj) => {\n\t\t\t\t\t\treturn storeRequestPromise(copyToStores[i].put(obj));\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst toRun = getMigrationPath({\n\t\t\tcurrentVersion: version - 1,\n\t\t\ttargetVersion: version,\n\t\t\tmigrations,\n\t\t});\n\n\t\tif (toRun.length > 0) {\n\t\t\tawait runMigrations({\n\t\t\t\tcontext,\n\t\t\t\ttoRun,\n\t\t\t\tmeta,\n\t\t\t\tindexedDB,\n\t\t\t\tnamespace: wipNamespace,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn openDatabase(indexedDB, wipNamespace, version, context.log);\n}\n\nasync function runMigrations({\n\tcontext,\n\ttoRun,\n\tmeta,\n\tindexedDB = globalIDB,\n\tnamespace = context.namespace,\n}: {\n\tcontext: OpenDocumentDbContext;\n\ttoRun: Migration<any>[];\n\tmeta: Metadata;\n\tindexedDB?: IDBFactory;\n\tnamespace?: string;\n}) {\n\tawait acquireLock(namespace, async () => {\n\t\t// now the fun part\n\t\tfor (const migration of toRun) {\n\t\t\t// special case: if this is the version 1 migration, we have no pre-existing database\n\t\t\t// to use for the migration.\n\t\t\tlet engine: MigrationEngine;\n\t\t\t// migrations from 0 (i.e. initial migrations) don't attempt to open an existing db\n\t\t\tif (migration.oldSchema.version === 0) {\n\t\t\t\tengine = getInitialMigrationEngine({\n\t\t\t\t\tmeta,\n\t\t\t\t\tmigration,\n\t\t\t\t\tcontext,\n\t\t\t\t});\n\t\t\t\tawait migration.migrate(engine);\n\t\t\t} else {\n\t\t\t\t// open the database with the current (old) version for this migration. this should\n\t\t\t\t// align with the database's current version.\n\t\t\t\tconst originalDatabase = await openDatabase(\n\t\t\t\t\tindexedDB,\n\t\t\t\t\tnamespace,\n\t\t\t\t\tmigration.oldSchema.version,\n\t\t\t\t\tcontext.log,\n\t\t\t\t);\n\n\t\t\t\t// this will only write to our metadata store via operations!\n\t\t\t\tengine = getMigrationEngine({\n\t\t\t\t\tmeta,\n\t\t\t\t\tmigration,\n\t\t\t\t\tcontext: {\n\t\t\t\t\t\t...context,\n\t\t\t\t\t\tdocumentDb: originalDatabase,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\ttry {\n\t\t\t\t\tawait migration.migrate(engine);\n\t\t\t\t\t// wait on any out-of-band async operations to complete\n\t\t\t\t\tawait Promise.all(engine.awaitables);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tcontext.log(\n\t\t\t\t\t\t'critical',\n\t\t\t\t\t\t`Migration failed (${migration.oldSchema.version} -> ${migration.newSchema.version})`,\n\t\t\t\t\t\terr,\n\t\t\t\t\t);\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\n\t\t\t\t// now we have to open the database again with the next version and\n\t\t\t\t// make the appropriate schema changes during the upgrade.\n\t\t\t\tawait closeDatabase(originalDatabase);\n\t\t\t}\n\n\t\t\tcontext.log(\n\t\t\t\t'debug',\n\t\t\t\t'Upgrading database',\n\t\t\t\tnamespace,\n\t\t\t\t'to version',\n\t\t\t\tmigration.newSchema.version,\n\t\t\t);\n\t\t\tawait upgradeDatabase(\n\t\t\t\tindexedDB,\n\t\t\t\tnamespace,\n\t\t\t\tmigration.newSchema.version,\n\t\t\t\t(transaction, db) => {\n\t\t\t\t\tfor (const newCollection of migration.addedCollections) {\n\t\t\t\t\t\tdb.createObjectStore(newCollection, {\n\t\t\t\t\t\t\tkeyPath:\n\t\t\t\t\t\t\t\tmigration.newSchema.collections[newCollection].primaryKey,\n\t\t\t\t\t\t\tautoIncrement: false,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const collection of migration.allCollections) {\n\t\t\t\t\t\tconst store = transaction.objectStore(collection);\n\t\t\t\t\t\t// apply new indexes\n\t\t\t\t\t\tfor (const newIndex of migration.addedIndexes[collection] || []) {\n\t\t\t\t\t\t\tstore.createIndex(newIndex.name, newIndex.name, {\n\t\t\t\t\t\t\t\tmultiEntry: newIndex.multiEntry,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// remove old indexes\n\t\t\t\t\t\tfor (const oldIndex of migration.removedIndexes[collection] || []) {\n\t\t\t\t\t\t\tstore.deleteIndex(oldIndex.name);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (const removedCollection of migration.removedCollections) {\n\t\t\t\t\t\t// !! can't delete the store, because old operations that relate to\n\t\t\t\t\t\t// this store may still exist in history. instead, we can clear it out\n\t\t\t\t\t\t// and leave it in place\n\t\t\t\t\t\ttransaction.objectStore(removedCollection).clear();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcontext.log,\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * In cases where operations from the future have been\n\t\t\t * received by this client, we may have created entire\n\t\t\t * documents in metadata which were not written to storage\n\t\t\t * because all of their operations were in the future (\n\t\t\t * i.e. in the next version). We have to find those documents\n\t\t\t * and also write their snapshots to storage, because they\n\t\t\t * won't be present in storage already to 'refresh,' so\n\t\t\t * if we don't analyze metadata for 'future' operations like\n\t\t\t * this, we won't know they exist.\n\t\t\t *\n\t\t\t * This led to behavior where the metadata would be properly\n\t\t\t * synced, but after upgrading the app and migrating, items\n\t\t\t * would be missing from findAll and findOne queries.\n\t\t\t */\n\t\t\tconst docsWithUnappliedMigrations = await getDocsWithUnappliedMigrations({\n\t\t\t\tmeta,\n\t\t\t\tcurrentVersion: migration.oldSchema.version,\n\t\t\t\tnewVersion: migration.newSchema.version,\n\t\t\t});\n\n\t\t\t// once the schema is ready, we can write back the migrated documents\n\t\t\tconst upgradedDatabase = await openDatabase(\n\t\t\t\tindexedDB,\n\t\t\t\tnamespace,\n\t\t\t\tmigration.newSchema.version,\n\t\t\t\tcontext.log,\n\t\t\t);\n\t\t\tfor (const collection of migration.allCollections) {\n\t\t\t\t// first step is to read in all the keys we need to rewrite\n\t\t\t\tconst documentReadTransaction = upgradedDatabase.transaction(\n\t\t\t\t\tcollection,\n\t\t\t\t\t'readwrite',\n\t\t\t\t);\n\t\t\t\tconst readStore = documentReadTransaction.objectStore(collection);\n\t\t\t\tconst keys = await getAllKeys(readStore);\n\t\t\t\t// map the keys to OIDs\n\t\t\t\tconst oids = keys.map((key) => createOid(collection, `${key}`));\n\t\t\t\toids.push(\n\t\t\t\t\t...engine.newOids.filter((oid) => {\n\t\t\t\t\t\treturn decomposeOid(oid).collection === collection;\n\t\t\t\t\t}),\n\t\t\t\t\t...docsWithUnappliedMigrations.filter((oid) => {\n\t\t\t\t\t\treturn decomposeOid(oid).collection === collection;\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst snapshots = await Promise.all(\n\t\t\t\t\toids.map(async (oid) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst snap = await meta.getDocumentSnapshot(oid);\n\t\t\t\t\t\t\treturn [oid, snap];\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t// this seems to happen with baselines/ops which are not fully\n\t\t\t\t\t\t\t// cleaned up after deletion?\n\t\t\t\t\t\t\tcontext.log(\n\t\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\t\t'Could not regenerate snapshot during migration for oid',\n\t\t\t\t\t\t\t\toid,\n\t\t\t\t\t\t\t\t'this document will not be preserved',\n\t\t\t\t\t\t\t\te,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst views = snapshots\n\t\t\t\t\t.filter((s): s is [string, any] => !!s)\n\t\t\t\t\t.map(([oid, snapshot]) => {\n\t\t\t\t\t\tif (!snapshot) return [oid, undefined];\n\t\t\t\t\t\tconst view = getIndexValues(\n\t\t\t\t\t\t\tmigration.newSchema.collections[collection],\n\t\t\t\t\t\t\tsnapshot,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn [oid, view];\n\t\t\t\t\t});\n\n\t\t\t\t// now we can write the documents back\n\t\t\t\tconst documentWriteTransaction = upgradedDatabase.transaction(\n\t\t\t\t\tcollection,\n\t\t\t\t\t'readwrite',\n\t\t\t\t);\n\t\t\t\tconst writeStore = documentWriteTransaction.objectStore(collection);\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tviews.map(([oid, view]) => {\n\t\t\t\t\t\tif (view) {\n\t\t\t\t\t\t\treturn putView(writeStore, view).catch((err) => {\n\t\t\t\t\t\t\t\tview;\n\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst { id } = decomposeOid(oid);\n\t\t\t\t\t\t\treturn deleteView(writeStore, id);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait closeDatabase(upgradedDatabase);\n\n\t\t\tcontext.log('debug', `Migration of ${namespace} complete.`);\n\t\t\tcontext.log(`\n\t\t\t\t\u2B06\uFE0F v${migration.newSchema.version} Migration complete. Here's the rundown:\n\t\t\t\t\t- Added collections: ${migration.addedCollections.join(', ')}\n\t\t\t\t\t- Removed collections: ${migration.removedCollections.join(', ')}\n\t\t\t\t\t- Changed collections: ${migration.changedCollections.join(', ')}\n\t\t\t\t\t- New indexes: ${Object.keys(migration.addedIndexes)\n\t\t\t\t\t\t.map((col) =>\n\t\t\t\t\t\t\tmigration.addedIndexes[col].map((i) => `${col}.${i.name}`),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.flatMap((i) => i)\n\t\t\t\t\t\t.join(', ')}\n\t\t\t\t\t- Removed indexes: ${Object.keys(migration.removedIndexes)\n\t\t\t\t\t\t.map((col) =>\n\t\t\t\t\t\t\tmigration.removedIndexes[col].map((i) => `${col}.${i.name}`),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.flatMap((i) => i)\n\t\t\t\t\t\t.join(', ')}\n\t\t\t`);\n\t\t}\n\t});\n}\n\nfunction getMigrationMutations({\n\tmigration,\n\tmeta,\n\tgetMigrationNow,\n\tnewOids,\n}: {\n\tmigration: Migration<any>;\n\tnewOids: string[];\n\tgetMigrationNow: () => string;\n\tmeta: Metadata;\n}) {\n\treturn migration.allCollections.reduce((acc, collectionName) => {\n\t\tacc[collectionName] = {\n\t\t\tput: async (doc: any) => {\n\t\t\t\t// add defaults\n\t\t\t\taddFieldDefaults(migration.newSchema.collections[collectionName], doc);\n\t\t\t\tconst primaryKey =\n\t\t\t\t\tdoc[migration.newSchema.collections[collectionName].primaryKey];\n\t\t\t\tconst oid = createOid(collectionName, primaryKey);\n\t\t\t\tnewOids.push(oid);\n\t\t\t\tawait meta.insertLocalOperation(\n\t\t\t\t\tinitialToPatches(doc, oid, getMigrationNow),\n\t\t\t\t);\n\t\t\t\treturn doc;\n\t\t\t},\n\t\t\tdelete: (id: string) => {\n\t\t\t\tconst oid = createOid(collectionName, id);\n\t\t\t\treturn meta.insertLocalOperation([\n\t\t\t\t\t{\n\t\t\t\t\t\toid,\n\t\t\t\t\t\ttimestamp: getMigrationNow(),\n\t\t\t\t\t\tdata: { op: 'delete' },\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t},\n\t\t};\n\t\treturn acc;\n\t}, {} as any);\n}\n\nfunction getMigrationQueries({\n\tmigration,\n\tcontext,\n\tmeta,\n}: {\n\tmigration: Migration<any>;\n\tcontext: Context;\n\tmeta: Metadata;\n}) {\n\treturn migration.oldCollections.reduce((acc, collectionName) => {\n\t\tacc[collectionName] = {\n\t\t\tget: async (id: string) => {\n\t\t\t\tconst oid = createOid(collectionName, id);\n\t\t\t\tconst doc = await meta.getDocumentSnapshot(oid, {\n\t\t\t\t\t// only get the snapshot up to the previous version (newer operations may have synced)\n\t\t\t\t\tto: meta.time.now(migration.oldSchema.version),\n\t\t\t\t});\n\t\t\t\treturn doc;\n\t\t\t},\n\t\t\tfindOne: async (filter: CollectionFilter) => {\n\t\t\t\tconst oid = await findOneOid({\n\t\t\t\t\tcollection: collectionName,\n\t\t\t\t\tindex: filter,\n\t\t\t\t\tcontext,\n\t\t\t\t});\n\t\t\t\tif (!oid) return null;\n\t\t\t\tconst doc = await meta.getDocumentSnapshot(oid, {\n\t\t\t\t\t// only get the snapshot up to the previous version (newer operations may have synced)\n\t\t\t\t\tto: meta.time.now(migration.oldSchema.version),\n\t\t\t\t});\n\t\t\t\treturn doc;\n\t\t\t},\n\t\t\tfindAll: async (filter: CollectionFilter) => {\n\t\t\t\tconst oids = await findAllOids({\n\t\t\t\t\tcollection: collectionName,\n\t\t\t\t\tindex: filter,\n\t\t\t\t\tcontext,\n\t\t\t\t});\n\t\t\t\tconst docs = await Promise.all(\n\t\t\t\t\toids.map((oid) =>\n\t\t\t\t\t\tmeta.getDocumentSnapshot(oid, {\n\t\t\t\t\t\t\t// only get the snapshot up to the previous version (newer operations may have synced)\n\t\t\t\t\t\t\tto: meta.time.now(migration.oldSchema.version),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\treturn docs;\n\t\t\t},\n\t\t};\n\t\treturn acc;\n\t}, {} as any);\n}\n\nfunction getMigrationEngine({\n\tmeta,\n\tmigration,\n\tcontext,\n}: {\n\tlog?: (...args: any[]) => void;\n\tmigration: Migration;\n\tmeta: Metadata;\n\tcontext: Context;\n}): MigrationEngine {\n\tfunction getMigrationNow() {\n\t\treturn meta.time.zero(migration.version);\n\t}\n\n\tconst newOids = new Array<ObjectIdentifier>();\n\n\tconst queries = getMigrationQueries({\n\t\tmigration,\n\t\tcontext,\n\t\tmeta,\n\t});\n\tconst mutations = getMigrationMutations({\n\t\tmigration,\n\t\tgetMigrationNow,\n\t\tnewOids,\n\t\tmeta,\n\t});\n\tconst awaitables = new Array<Promise<any>>();\n\tconst engine: MigrationEngine = {\n\t\tlog: context.log,\n\t\tnewOids,\n\t\tmigrate: async (collection, strategy) => {\n\t\t\tconst docs = await queries[collection].findAll();\n\n\t\t\tawait Promise.all(\n\t\t\t\tdocs.filter(Boolean).map(async (doc: any) => {\n\t\t\t\t\tassert(\n\t\t\t\t\t\thasOid(doc),\n\t\t\t\t\t\t`Document is missing an OID: ${JSON.stringify(doc)}`,\n\t\t\t\t\t);\n\t\t\t\t\tconst original = cloneDeep(doc);\n\t\t\t\t\t// @ts-ignore - excessive type resolution\n\t\t\t\t\tconst newValue = await strategy(doc);\n\t\t\t\t\tif (newValue) {\n\t\t\t\t\t\t// the migration has altered the shape of our document. we need\n\t\t\t\t\t\t// to create the operation from the diff and write it to meta as\n\t\t\t\t\t\t// a migration patch\n\t\t\t\t\t\tremoveOidPropertiesFromAllSubObjects(original);\n\t\t\t\t\t\tremoveOidPropertiesFromAllSubObjects(newValue);\n\t\t\t\t\t\tassignOidsToAllSubObjects(newValue);\n\t\t\t\t\t\tconst patches = diffToPatches(\n\t\t\t\t\t\t\toriginal,\n\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\tgetMigrationNow,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t[],\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tmergeUnknownObjects: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (patches.length > 0) {\n\t\t\t\t\t\t\tawait meta.insertLocalOperation(patches);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tqueries,\n\t\tmutations,\n\t\tawaitables,\n\t};\n\treturn engine;\n}\n\nfunction getInitialMigrationEngine({\n\tmeta,\n\tmigration,\n\tcontext,\n}: {\n\tcontext: OpenDocumentDbContext;\n\tmigration: Migration;\n\tmeta: Metadata;\n}): MigrationEngine {\n\tfunction getMigrationNow() {\n\t\treturn meta.time.zero(migration.version);\n\t}\n\n\tconst newOids = new Array<ObjectIdentifier>();\n\n\tconst queries = new Proxy({} as any, {\n\t\tget() {\n\t\t\tthrow new Error(\n\t\t\t\t'Queries are not available in initial migrations; there is no database yet!',\n\t\t\t);\n\t\t},\n\t}) as any;\n\n\tconst mutations = getMigrationMutations({\n\t\tmigration,\n\t\tgetMigrationNow,\n\t\tnewOids,\n\t\tmeta,\n\t});\n\tconst engine: MigrationEngine = {\n\t\tlog: context.log,\n\t\tnewOids,\n\t\tmigrate: () => {\n\t\t\tthrow new Error(\n\t\t\t\t'Calling migrate() in initial migrations is not supported! Use initial migrations to seed initial data using mutations.',\n\t\t\t);\n\t\t},\n\t\tqueries,\n\t\tmutations,\n\t\tawaitables: [],\n\t};\n\treturn engine;\n}\n\nasync function getAllKeys(store: IDBObjectStore) {\n\treturn new Promise<IDBValidKey[]>((resolve, reject) => {\n\t\tconst request = store.getAllKeys();\n\t\trequest.onsuccess = (event) => {\n\t\t\tresolve(request.result);\n\t\t};\n\t\trequest.onerror = (event) => {\n\t\t\treject(request.error);\n\t\t};\n\t});\n}\n\nasync function deleteView(store: IDBObjectStore, id: string) {\n\tconst request = store.delete(id);\n\treturn new Promise<void>((resolve, reject) => {\n\t\trequest.onsuccess = (event) => {\n\t\t\tresolve();\n\t\t};\n\t\trequest.onerror = (event) => {\n\t\t\treject(request.error);\n\t\t};\n\t});\n}\n\nasync function putView(store: IDBObjectStore, view: any) {\n\tconst request = store.put(view);\n\treturn new Promise<void>((resolve, reject) => {\n\t\trequest.onsuccess = (event) => {\n\t\t\tresolve();\n\t\t};\n\t\trequest.onerror = (event) => {\n\t\t\treject(request.error);\n\t\t};\n\t});\n}\n\n/**\n * Gets a list of root OIDs for all documents which had operations stored already\n * that were not applied to their queryable snapshots because they were in the\n * future. These documents need to be refreshed in storage.\n */\nasync function getDocsWithUnappliedMigrations({\n\tmeta,\n\tcurrentVersion,\n\tnewVersion: _,\n}: {\n\tcurrentVersion: number;\n\tnewVersion: number;\n\tmeta: Metadata;\n}) {\n\t// scan for all operations in metadata after the current version.\n\t// this could be more efficient if also filtering below or equal newVersion but\n\t// that seems so unlikely in practice...\n\tconst unappliedOperations: ClientOperation[] = [];\n\tawait meta.operations.iterateOverAllOperations(\n\t\t(op) => unappliedOperations.push(op),\n\t\t{\n\t\t\tfrom: meta.time.zero(currentVersion + 1),\n\t\t},\n\t);\n\treturn Array.from(\n\t\tnew Set(unappliedOperations.map((op) => getOidRoot(op.oid))),\n\t);\n}\n", "import { EventSubscriber } from '@verdant-web/common';\n\ntype Undoable = () => Undoable | Promise<Undoable>;\n\nexport class UndoHistory extends EventSubscriber<{ change: () => void }> {\n\tprivate _undoable: Undoable[] = [];\n\tprivate _undone: Undoable[] = [];\n\n\tget canUndo() {\n\t\treturn this._undoable.length > 0;\n\t}\n\tget canRedo() {\n\t\treturn this._undone.length > 0;\n\t}\n\n\tundo = async () => {\n\t\tconst next = this._undoable.pop();\n\t\tif (next) {\n\t\t\tthis._undone.push(await next());\n\t\t\tthis.emit('change');\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\tredo = async () => {\n\t\tconst next = this._undone.pop();\n\t\tif (next) {\n\t\t\tthis._undoable.push(await next());\n\t\t\tthis.emit('change');\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\taddUndo = (undoPoint: Undoable) => {\n\t\tthis._undoable.push(undoPoint);\n\t\tthis._undone = [];\n\t\tthis.emit('change');\n\t};\n\n\taddRedo = (redoPoint: Undoable) => {\n\t\tthis._undone.push(redoPoint);\n\t\tthis.emit('change');\n\t};\n\n\tclear = () => {\n\t\tthis._undoable = [];\n\t\tthis._undone = [];\n\t\tthis.emit('change');\n\t};\n}\n", "import {\n\taddFieldDefaults,\n\tassert,\n\tcreateOid,\n\tSchemaCollection,\n\tStorageCollectionSchema,\n\tStorageDocument,\n\tStorageSchema,\n} from '@verdant-web/common';\nimport { EntityStore } from './entities/EntityStore.js';\nimport { Metadata } from './metadata/Metadata.js';\n\n/**\n * Exposes functionality for creating documents,\n * the only mutation which is available as an entry\n * point in the storage system.\n */\nexport class DocumentManager<Schema extends StorageSchema<any>> {\n\tconstructor(\n\t\tprivate meta: Metadata,\n\t\tprivate schema: Schema,\n\t\tprivate entities: EntityStore,\n\t) {}\n\n\tprivate getOid = (collection: string, init: any) => {\n\t\tconst primaryKeyName = this.schema.collections[collection]\n\t\t\t.primaryKey as Exclude<\n\t\t\tkeyof StorageDocument<SchemaCollection<Schema, any>>,\n\t\t\tsymbol\n\t\t>;\n\t\tconst primaryKey = init[primaryKeyName];\n\t\tassert(\n\t\t\tprimaryKey,\n\t\t\t`Document must have a primary key: ${primaryKeyName.toString()} (got: ${JSON.stringify(\n\t\t\t\tinit,\n\t\t\t)})`,\n\t\t);\n\t\treturn createOid(collection, primaryKey);\n\t};\n\n\tprivate addDefaults = (collectionName: string, init: any) => {\n\t\tconst collection = this.schema.collections[\n\t\t\tcollectionName\n\t\t] as StorageCollectionSchema;\n\t\treturn addFieldDefaults(collection, init);\n\t};\n\n\tcreate = async (\n\t\tcollection: string,\n\t\tinit: any,\n\t\toptions: { undoable?: boolean } = {},\n\t) => {\n\t\tconst defaulted = this.addDefaults(collection, init);\n\t\tconst oid = this.getOid(collection, defaulted);\n\t\t// documents are always objects at the root\n\t\treturn this.entities.create(defaulted, oid, options) as any;\n\t};\n\n\tdelete = async (\n\t\tcollection: string,\n\t\tprimaryKey: string,\n\t\toptions: { undoable?: boolean } = {},\n\t) => {\n\t\tconst oid = createOid(collection, primaryKey);\n\t\treturn this.entities.delete(oid, options);\n\t};\n\n\tdeleteAll = async (\n\t\tids: [string, string][],\n\t\toptions: { undoable?: boolean } = {},\n\t) => {\n\t\treturn this.entities.deleteAll(\n\t\t\tids.map(([collection, primaryKey]) => createOid(collection, primaryKey)),\n\t\t\toptions,\n\t\t);\n\t};\n\n\tdeleteAllFromCollection = async (\n\t\tcollection: string,\n\t\tids: string[],\n\t\toptions: { undoable?: boolean } = {},\n\t) => {\n\t\treturn this.entities.deleteAll(\n\t\t\tids.map((primaryKey) => createOid(collection, primaryKey)),\n\t\t\toptions,\n\t\t);\n\t};\n}\n", "import { EventSubscriber, FileData } from '@verdant-web/common';\n\nexport type EntityFileEvents = {\n\tchange: () => void;\n};\n\nexport const UPDATE = Symbol('entity-file-update');\nexport const MARK_FAILED = Symbol('entity-file-mark-failed');\n\n/**\n * Provides a consistent interface for files used in an app via\n * Entity access.\n */\nexport class EntityFile extends EventSubscriber<EntityFileEvents> {\n\t// cached object URL for a local blob file, if applicable\n\tprivate _objectUrl: string | null = null;\n\tprivate _fileData: FileData | null = null;\n\tprivate _loading = true;\n\tprivate _failed = false;\n\tprivate _disposed = false;\n\tprivate _downloadRemote = false;\n\n\tconstructor(\n\t\tpublic readonly id: string,\n\t\t{\n\t\t\tdownloadRemote = false,\n\t\t}: {\n\t\t\tdownloadRemote?: boolean;\n\t\t} = {},\n\t) {\n\t\tsuper();\n\t\tthis._downloadRemote = downloadRemote;\n\t}\n\n\tget downloadRemote() {\n\t\treturn this._downloadRemote;\n\t}\n\n\t[UPDATE] = (fileData: FileData) => {\n\t\tthis._loading = false;\n\t\tthis._failed = false;\n\t\tthis._disposed = false;\n\t\tthis._fileData = fileData;\n\t\tif (fileData.file) {\n\t\t\tif (this._objectUrl) {\n\t\t\t\tURL.revokeObjectURL(this._objectUrl);\n\t\t\t}\n\t\t\tthis._objectUrl = URL.createObjectURL(fileData.file);\n\t\t}\n\t\tthis.emit('change');\n\t};\n\n\t[MARK_FAILED] = () => {\n\t\tthis._failed = true;\n\t\tthis._loading = false;\n\t\tthis.emit('change');\n\t};\n\n\tget url(): string | null {\n\t\tif (this.loading) return null;\n\t\tif (this._objectUrl) return this._objectUrl;\n\t\treturn this._fileData?.url ?? null;\n\t}\n\n\tget name(): string | null {\n\t\treturn this._fileData?.name ?? null;\n\t}\n\n\tget type(): string | null {\n\t\treturn this._fileData?.type ?? null;\n\t}\n\n\tget loading() {\n\t\treturn this._loading;\n\t}\n\n\tget failed() {\n\t\treturn this._failed;\n\t}\n\n\tdispose = () => {\n\t\tif (this._objectUrl) {\n\t\t\tURL.revokeObjectURL(this._objectUrl);\n\t\t}\n\t\tthis._disposed = true;\n\t};\n}\n", "import { createFileRef, FileData } from '@verdant-web/common';\nimport cuid from 'cuid';\n\nexport function createFileData(file: File): FileData {\n\treturn {\n\t\tid: cuid(),\n\t\tfile: file,\n\t\turl: undefined,\n\t\tremote: false,\n\t\tname: file.name,\n\t\ttype: file.type,\n\t};\n}\n\n/**\n * Replaces File values with refs and returns the normalized value.\n * The list of files passed to the second argument will be populated with the files found in the value.\n */\nexport function processValueFiles(\n\tvalue: any,\n\tonFileIdentified: (fileData: FileData) => void,\n): any {\n\tif (typeof window !== 'undefined' && value instanceof File) {\n\t\tconst data = createFileData(value);\n\t\tonFileIdentified(data);\n\t\treturn createFileRef(data.id);\n\t}\n\n\tif (Array.isArray(value)) {\n\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\tvalue[i] = processValueFiles(value[i], onFileIdentified);\n\t\t}\n\t\treturn value;\n\t}\n\n\tif (typeof value === 'object') {\n\t\tfor (const key in value) {\n\t\t\tvalue[key] = processValueFiles(value[key], onFileIdentified);\n\t\t}\n\t\treturn value;\n\t}\n\n\treturn value;\n}\n\nexport function fileToArrayBuffer(file: File | Blob) {\n\treturn new Promise<ArrayBuffer>((resolve, reject) => {\n\t\tconst reader = new FileReader();\n\t\treader.onload = () => {\n\t\t\tresolve(reader.result as ArrayBuffer);\n\t\t};\n\t\treader.onerror = reject;\n\t\treader.readAsArrayBuffer(file);\n\t});\n}\n", "import { FileData } from '@verdant-web/common';\nimport { IDBService } from '../IDBService.js';\nimport { fileToArrayBuffer } from './utils.js';\n\n/**\n * When stored in IDB, replace the file blob with an array buffer\n * since it's more compatible, and replace remote boolean with\n * a string since IDB doesn't support boolean indexes.\n */\ninterface StoredFileData extends Omit<FileData, 'remote' | 'file'> {\n\tremote: 'true' | 'false';\n\tbuffer?: ArrayBuffer;\n\tdeletedAt: number | null;\n}\n\nexport interface ReturnedFileData extends FileData {\n\tdeletedAt: number | null;\n}\n\nexport class FileStorage extends IDBService {\n\taddFile = async (\n\t\tfile: FileData,\n\t\t{\n\t\t\ttransaction,\n\t\t\tdownloadRemote = false,\n\t\t}: { transaction?: IDBTransaction; downloadRemote?: boolean } = {},\n\t) => {\n\t\tlet buffer = file.file ? await fileToArrayBuffer(file.file) : undefined;\n\t\tif (!buffer && downloadRemote && file.url) {\n\t\t\ttry {\n\t\t\t\tbuffer = await fetch(file.url, {\n\t\t\t\t\tmethod: 'GET',\n\t\t\t\t\tcredentials: 'include',\n\t\t\t\t}).then((r) => r.arrayBuffer());\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Failed to download file to cache it locally. The file will still be available using its URL. Check the file server's CORS configuration.\",\n\t\t\t\t\terr,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn this.run(\n\t\t\t'files',\n\t\t\t(store) => {\n\t\t\t\treturn store.put({\n\t\t\t\t\tid: file.id,\n\t\t\t\t\t// IDB doesn't support boolean indexes\n\t\t\t\t\tremote: file.remote ? 'true' : 'false',\n\t\t\t\t\tdeletedAt: null,\n\t\t\t\t\tname: file.name,\n\t\t\t\t\ttype: file.type,\n\t\t\t\t\turl: file.url,\n\t\t\t\t\tbuffer,\n\t\t\t\t} as StoredFileData);\n\t\t\t},\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t};\n\n\tprivate hydrateFileData = (raw: StoredFileData): ReturnedFileData => {\n\t\t(raw as any).remote = raw.remote === 'true';\n\t\tconst buffer = raw.buffer;\n\t\tdelete raw.buffer;\n\t\t(raw as unknown as FileData).file = buffer\n\t\t\t? arrayBufferToBlob(buffer, raw.type)\n\t\t\t: undefined;\n\t\treturn raw as unknown as ReturnedFileData;\n\t};\n\n\tmarkUploaded = async (\n\t\tid: string,\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t) => {\n\t\tconst current = await this.getFileRaw(id, { transaction });\n\n\t\tif (!current) {\n\t\t\tthrow new Error('File is not in local database');\n\t\t}\n\n\t\treturn this.run(\n\t\t\t'files',\n\t\t\t(store) => {\n\t\t\t\treturn store.put({\n\t\t\t\t\t...current,\n\t\t\t\t\tremote: 'true',\n\t\t\t\t} as StoredFileData);\n\t\t\t},\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t};\n\n\tprivate getFileRaw = async (\n\t\tid: string,\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t): Promise<StoredFileData | undefined> => {\n\t\tconst raw = await this.run<StoredFileData>(\n\t\t\t'files',\n\t\t\t(store) => {\n\t\t\t\treturn store.get(id);\n\t\t\t},\n\t\t\t'readonly',\n\t\t\ttransaction,\n\t\t);\n\t\tif (!raw) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn raw;\n\t};\n\n\tgetFile = async (\n\t\tid: string,\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t): Promise<ReturnedFileData | undefined> => {\n\t\tconst raw = await this.getFileRaw(id, { transaction });\n\t\tif (!raw) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn this.hydrateFileData(raw);\n\t};\n\n\tdeleteFile(\n\t\tid: string,\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t) {\n\t\treturn this.run<undefined>(\n\t\t\t'files',\n\t\t\t(store) => {\n\t\t\t\treturn store.delete(id);\n\t\t\t},\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t}\n\n\tmarkPendingDelete = async (\n\t\tid: string,\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t) => {\n\t\tconst current = await this.getFileRaw(id, { transaction });\n\n\t\tif (!current) {\n\t\t\tthrow new Error('File is not in local database');\n\t\t}\n\n\t\treturn this.run(\n\t\t\t'files',\n\t\t\t(store) => {\n\t\t\t\treturn store.put({\n\t\t\t\t\t...current,\n\t\t\t\t\tdeletedAt: Date.now(),\n\t\t\t\t} as StoredFileData);\n\t\t\t},\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t};\n\n\tlistUnsynced = async () => {\n\t\tconst raw = await this.run<StoredFileData[]>(\n\t\t\t'files',\n\t\t\t(store) => {\n\t\t\t\treturn store.index('remote').getAll('false');\n\t\t\t},\n\t\t\t'readonly',\n\t\t);\n\t\treturn raw.map(this.hydrateFileData);\n\t};\n\n\titerateOverPendingDelete = (\n\t\titerator: (file: ReturnedFileData, store: IDBObjectStore) => void,\n\t\ttransaction?: IDBTransaction,\n\t) => {\n\t\treturn this.iterate<StoredFileData>(\n\t\t\t'files',\n\t\t\t(store) => {\n\t\t\t\treturn store\n\t\t\t\t\t.index('deletedAt')\n\t\t\t\t\t.openCursor(IDBKeyRange.lowerBound(0, true));\n\t\t\t},\n\t\t\t(value, store) => {\n\t\t\t\titerator(this.hydrateFileData(value), store);\n\t\t\t},\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t};\n}\n\nexport function arrayBufferToBlob(buffer: ArrayBuffer, type: string) {\n\treturn new Blob([buffer], { type });\n}\n", "import { FileData, FileRef } from '@verdant-web/common';\nimport { Context } from '../context.js';\nimport { Metadata } from '../metadata/Metadata.js';\nimport { Sync } from '../sync/Sync.js';\nimport { EntityFile, MARK_FAILED, UPDATE } from './EntityFile.js';\nimport { FileStorage, ReturnedFileData } from './FileStorage.js';\n\n/**\n * Default: if file was deleted > 3 days ago\n */\nfunction defaultCanCleanup(fileData: ReturnedFileData) {\n\treturn (\n\t\tfileData.deletedAt !== null &&\n\t\tfileData.deletedAt < Date.now() - 1000 * 60 * 24 * 3\n\t);\n}\n\nexport interface FileManagerConfig {\n\t/**\n\t * Override the heuristic for deciding when a deleted file can be cleaned up.\n\t * By default this waits 3 days since deletion, then deletes the file data.\n\t * If the file has been synchronized to a server, it could still be restored\n\t * if the server has not yet deleted it.\n\t */\n\tcanCleanupDeletedFile?: (file: ReturnedFileData) => boolean;\n}\n\nexport class FileManager {\n\tprivate storage;\n\tprivate sync;\n\tprivate context;\n\n\tprivate files = new Map<string, EntityFile>();\n\tprivate config: Required<FileManagerConfig>;\n\tprivate meta: Metadata;\n\n\tconstructor({\n\t\tdb,\n\t\tsync,\n\t\tcontext,\n\t\tmeta,\n\t\tconfig = {},\n\t}: {\n\t\tdb: IDBDatabase;\n\t\tsync: Sync;\n\t\tcontext: Context;\n\t\tconfig?: FileManagerConfig;\n\t\tmeta: Metadata;\n\t}) {\n\t\tthis.storage = new FileStorage(db);\n\t\tthis.sync = sync;\n\t\tthis.context = context;\n\t\tthis.meta = meta;\n\t\tthis.config = {\n\t\t\tcanCleanupDeletedFile: defaultCanCleanup,\n\t\t\t...config,\n\t\t};\n\n\t\tthis.sync.subscribe('onlineChange', this.onOnlineChange);\n\t\tthis.meta.subscribe('filesDeleted', this.handleFileRefsDeleted);\n\t\t// check on startup to see if files can be cleaned up\n\t\tthis.tryCleanupDeletedFiles();\n\t}\n\n\tadd = async (fileInput: Omit<FileData, 'remote'>) => {\n\t\tconst file = fileInput as unknown as FileData;\n\t\tfile.remote = false;\n\t\t// immediately cache the file\n\t\tif (!this.files.has(file.id)) {\n\t\t\tconst entityFile = new EntityFile(file.id);\n\t\t\tentityFile[UPDATE](file);\n\t\t\tthis.files.set(file.id, entityFile);\n\t\t} else {\n\t\t\tthis.files.get(file.id);\n\t\t}\n\t\t// write to local storage and send to sync immediately\n\t\tawait this.storage.addFile(file);\n\t\t// send to sync\n\t\tif (file.file) {\n\t\t\tconst result = await this.sync.uploadFile(file);\n\t\t\tif (result.success) {\n\t\t\t\tawait this.storage.markUploaded(file.id);\n\t\t\t} else {\n\t\t\t\tthis.context.log('error', 'Failed to upload file');\n\t\t\t}\n\t\t}\n\t};\n\n\tprivate uploadFile = async (file: FileData, retries = 0) => {\n\t\tconst result = await this.sync.uploadFile(file);\n\t\tif (result.success) {\n\t\t\tawait this.storage.markUploaded(file.id);\n\t\t} else {\n\t\t\tif (result.retry && retries < 5) {\n\t\t\t\tthis.context.log('error', 'Error uploading file, retrying...');\n\t\t\t\t// schedule a retry\n\t\t\t\tsetTimeout(this.uploadFile, 1000, file, retries + 1);\n\t\t\t} else {\n\t\t\t\tthis.context.log(\n\t\t\t\t\t'error',\n\t\t\t\t\t'Failed to upload file. Not retrying until next sync.',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Immediately returns an EntityFile to use, then either loads\n\t * the file from cache, local database, or the server.\n\t */\n\tget = (id: string) => {\n\t\tif (this.files.has(id)) {\n\t\t\treturn this.files.get(id)!;\n\t\t}\n\t\tconst file = new EntityFile(id);\n\t\tthis.files.set(id, file);\n\t\tthis.load(file);\n\t\treturn file;\n\t};\n\n\tprivate load = async (file: EntityFile, retries = 0) => {\n\t\tif (retries > 5) {\n\t\t\tfile[MARK_FAILED]();\n\t\t\treturn;\n\t\t}\n\n\t\tconst fileData = await this.storage.getFile(file.id);\n\t\tif (fileData) {\n\t\t\tfile[UPDATE](fileData);\n\t\t} else {\n\t\t\t// maybe we don't have it yet, it might be on the server still.\n\t\t\ttry {\n\t\t\t\tconst result = await this.sync.getFile(file.id);\n\t\t\t\tif (result.success) {\n\t\t\t\t\tfile[UPDATE](result.data);\n\t\t\t\t\tawait this.storage.addFile(result.data, {\n\t\t\t\t\t\tdownloadRemote: file.downloadRemote,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tfile[MARK_FAILED]();\n\t\t\t\t\tif (result.retry) {\n\t\t\t\t\t\t// schedule a retry\n\t\t\t\t\t\tsetTimeout(this.load, 1000, file, retries + 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tthis.context.log('error', 'Failed to load file', err);\n\t\t\t\tfile[MARK_FAILED]();\n\t\t\t\t// schedule a retry\n\t\t\t\tsetTimeout(this.load, 1000, file, retries + 1);\n\t\t\t}\n\t\t}\n\t};\n\n\tlistUnsynced = async () => {\n\t\treturn this.storage.listUnsynced();\n\t};\n\n\tprivate onOnlineChange = async (online: boolean) => {\n\t\t// if online, try to upload any unsynced files\n\t\tif (online) {\n\t\t\tconst unsynced = await this.listUnsynced();\n\t\t\tawait Promise.all(unsynced.map(this.uploadFile));\n\t\t}\n\t};\n\n\tprivate tryCleanupDeletedFiles = async () => {\n\t\tlet count = 0;\n\t\tlet skipCount = 0;\n\t\tawait this.storage.iterateOverPendingDelete((fileData, store) => {\n\t\t\tif (this.config.canCleanupDeletedFile(fileData)) {\n\t\t\t\tcount++;\n\t\t\t\tstore.delete(fileData.id);\n\t\t\t} else {\n\t\t\t\tskipCount++;\n\t\t\t}\n\t\t});\n\n\t\tthis.context.log(\n\t\t\t'info',\n\t\t\t`Cleaned up ${count} files, skipped ${skipCount} files`,\n\t\t);\n\t};\n\n\tprivate handleFileRefsDeleted = async (fileRefs: FileRef[]) => {\n\t\tconst tx = this.storage.createTransaction(['files'], 'readwrite');\n\t\tawait Promise.all(\n\t\t\tfileRefs.map(async (fileRef) => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.storage.markPendingDelete(fileRef.id, { transaction: tx });\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthis.context.log('error', 'Failed to mark file for deletion', err);\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t\tthis.context.log(\n\t\t\t'info',\n\t\t\t`Marked ${fileRefs.length} files as pending delete`,\n\t\t);\n\t};\n}\n", "import {\n\tassert,\n\tassignOid,\n\tcloneDeep,\n\tcreateRef,\n\tdecomposeOid,\n\tEventSubscriber,\n\tFileData,\n\tFileRef,\n\tisFileRef,\n\tisObjectRef,\n\tmaybeGetOid,\n\tObjectIdentifier,\n\tOperation,\n\tPatchCreator,\n\tStorageFieldSchema,\n\tStorageFieldsSchema,\n\tTimestampProvider,\n\ttraverseCollectionFieldsAndApplyDefaults,\n} from '@verdant-web/common';\nimport { EntityFile } from '../files/EntityFile.js';\nimport { processValueFiles } from '../files/utils.js';\n\nexport const ADD_OPERATIONS = '@@addOperations';\nexport const DELETE = '@@delete';\nexport const REBASE = '@@rebase';\nconst REFRESH = '@@refresh';\nexport const DEEP_CHANGE = '@@deepChange';\n\nexport interface CacheTools {\n\tcomputeView(oid: ObjectIdentifier): {\n\t\tview: any;\n\t\tdeleted: boolean;\n\t\tlastTimestamp: number | null;\n\t};\n\tgetEntity(\n\t\toid: ObjectIdentifier,\n\t\tschema: StorageFieldSchema,\n\t\tparent?: Entity,\n\t): Entity;\n\thasOid(oid: ObjectIdentifier): boolean;\n\tweakRef<T extends object>(value: T): WeakRef<T>;\n}\n\nexport interface StoreTools {\n\taddLocalOperations(operations: Operation[]): void;\n\tpatchCreator: PatchCreator;\n\taddFile: (file: FileData) => void;\n\tgetFile: (id: string) => EntityFile;\n\ttime: TimestampProvider;\n\tnow: string;\n}\n\nexport type AccessibleEntityProperty<T> = T extends Array<any>\n\t? number\n\t: T extends object\n\t? keyof T\n\t: never;\n\ntype DataFromInit<Init> = Init extends { [key: string]: any }\n\t? {\n\t\t\t[Key in keyof Init]: Init[Key];\n\t }\n\t: Init extends Array<any>\n\t? Init\n\t: any;\n\nexport type EntityShape<E extends Entity<any, any>> = E extends Entity<\n\tinfer Value,\n\tany\n>\n\t? Value\n\t: never;\n\n// reduces keys of an object to only ones with an optional\n// value\ntype DeletableKeys<T> = keyof {\n\t[Key in keyof T as IfNullableThen<T[Key], Key>]: Key;\n};\ntype IfNullableThen<T, Out> = undefined extends T\n\t? Out\n\t: null extends T\n\t? Out\n\t: never;\n\nexport function refreshEntity(\n\tentity: Entity<any, any>,\n\tinfo: EntityChangeInfo,\n) {\n\treturn entity[REFRESH](info);\n}\n\nexport interface EntityChangeInfo {\n\tisLocal?: boolean;\n}\n\ntype EntityEvents = {\n\tchange: (info: EntityChangeInfo) => void;\n\tchangeDeep: (target: Entity<any, any>, info: EntityChangeInfo) => void;\n\tdelete: (info: EntityChangeInfo) => void;\n\trestore: (info: EntityChangeInfo) => void;\n};\n\ntype BaseEntityValue = { [Key: string]: any } | any[];\n\nexport class Entity<\n\t\tInit = any,\n\t\tKeyValue extends BaseEntityValue = any,\n\t\tSnapshot extends any = DataFromInit<Init>,\n\t>\n\timplements\n\t\tObjectEntity<Init, KeyValue, Snapshot>,\n\t\tListEntity<Init, KeyValue, Snapshot>\n{\n\t// if current is null, the entity was deleted.\n\tprotected _current: any | null = null;\n\n\treadonly oid: ObjectIdentifier;\n\treadonly collection: string;\n\tprotected readonly store: StoreTools;\n\tprotected readonly fieldSchema;\n\tprotected readonly cache: CacheTools;\n\tprotected _deleted = false;\n\tprotected parent: WeakRef<Entity<any, any>> | undefined;\n\tprotected readonly readonlyKeys: (keyof Init)[];\n\n\tprivate cachedSnapshot: any = null;\n\tprivate cachedDestructure: KeyValue | null = null;\n\tprivate cachedDeepUpdatedAt: number | null = null;\n\n\tprivate _updatedAt: number | null = null;\n\n\tprotected events;\n\n\tprotected hasSubscribersToDeepChanges() {\n\t\treturn this.events.subscriberCount('changeDeep') > 0;\n\t}\n\n\tget hasSubscribers() {\n\t\tif (this.events.totalSubscriberCount() > 0) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// even if nobody subscribes directly to this entity, if a parent\n\t\t// has a deep subscription that counts.\n\t\tlet parent = this.parent?.deref();\n\t\twhile (parent) {\n\t\t\tif (parent.hasSubscribersToDeepChanges()) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tparent = parent.parent?.deref();\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tget deleted() {\n\t\treturn this._deleted;\n\t}\n\n\tprotected get value() {\n\t\treturn this._current;\n\t}\n\n\tget isList() {\n\t\treturn Array.isArray(this._current) as any;\n\t}\n\n\tget updatedAt() {\n\t\treturn this._updatedAt;\n\t}\n\n\tget deepUpdatedAt() {\n\t\tif (this.cachedDeepUpdatedAt) return this.cachedDeepUpdatedAt;\n\t\t// iterate over all children and take the latest timestamp\n\t\tlet latest: number | null = this._updatedAt;\n\t\tif (this.isList) {\n\t\t\tthis.forEach((child) => {\n\t\t\t\tif ((child as any) instanceof Entity) {\n\t\t\t\t\tconst childTimestamp = child.deepUpdatedAt;\n\t\t\t\t\tif (childTimestamp && (!latest || childTimestamp > latest)) {\n\t\t\t\t\t\tlatest = childTimestamp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tthis.values().forEach((child) => {\n\t\t\t\tif ((child as any) instanceof Entity) {\n\t\t\t\t\tconst childTimestamp = child.deepUpdatedAt;\n\t\t\t\t\tif (childTimestamp && (!latest || childTimestamp > latest)) {\n\t\t\t\t\t\tlatest = childTimestamp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tthis.cachedDeepUpdatedAt = latest;\n\t\treturn latest;\n\t}\n\n\tget uid() {\n\t\treturn this.oid;\n\t}\n\n\tconstructor({\n\t\toid,\n\t\tstore,\n\t\tfieldSchema,\n\t\tcache,\n\t\tparent,\n\t\tonAllUnsubscribed,\n\t\treadonlyKeys = [],\n\t}: {\n\t\toid: ObjectIdentifier;\n\t\tstore: StoreTools;\n\t\tfieldSchema: StorageFieldSchema | StorageFieldsSchema;\n\t\tcache: CacheTools;\n\t\tparent?: Entity<any, any>;\n\t\tonAllUnsubscribed?: () => void;\n\t\treadonlyKeys?: (keyof Init)[];\n\t}) {\n\t\tthis.oid = oid;\n\t\tconst { collection } = decomposeOid(oid);\n\t\tthis.collection = collection;\n\t\tthis.store = store;\n\t\tthis.fieldSchema = fieldSchema;\n\t\tthis.readonlyKeys = readonlyKeys;\n\t\tthis.cache = cache;\n\t\tthis.parent = parent && this.cache.weakRef(parent);\n\t\tconst { view, deleted, lastTimestamp } = this.cache.computeView(oid);\n\t\tthis._current = view;\n\t\tthis._deleted = deleted;\n\t\tthis._updatedAt = lastTimestamp ? lastTimestamp : null;\n\t\tthis.cachedDeepUpdatedAt = null;\n\t\tthis.events = new EventSubscriber<EntityEvents>(() => {\n\t\t\tif (!this.hasSubscribers) {\n\t\t\t\tonAllUnsubscribed?.();\n\t\t\t}\n\t\t});\n\n\t\tif (this.oid.includes('.') && !this.parent) {\n\t\t\tthrow new Error('Parent must be provided for sub entities');\n\t\t}\n\t\tassert(!!fieldSchema, 'Field schema must be provided');\n\t}\n\n\tprivate [REFRESH] = (info: EntityChangeInfo) => {\n\t\tconst { view, deleted, lastTimestamp } = this.cache.computeView(this.oid);\n\t\tthis._current = view;\n\t\tconst restored = this._deleted && !deleted;\n\t\tthis._deleted = deleted;\n\t\tthis.cachedDestructure = null;\n\t\tthis._updatedAt = lastTimestamp ? lastTimestamp : null;\n\t\tthis.cachedDeepUpdatedAt = null;\n\n\t\tif (this._deleted) {\n\t\t\tthis.events.emit('delete', info);\n\t\t} else {\n\t\t\tthis.events.emit('change', info);\n\t\t\tthis[DEEP_CHANGE](this as unknown as Entity<any, any>, info);\n\t\t}\n\t\tif (restored) {\n\t\t\tthis.cachedSnapshot = null;\n\t\t\tthis.events.emit('restore', info);\n\t\t}\n\t};\n\n\tprivate [DEEP_CHANGE] = (\n\t\tsource: Entity<any, any>,\n\t\tinfo: EntityChangeInfo,\n\t) => {\n\t\tthis.cachedSnapshot = null;\n\t\tthis.cachedDeepUpdatedAt = null;\n\t\tthis.events.emit('changeDeep', source, info);\n\t\tconst parent = this.parent?.deref();\n\t\tif (parent) {\n\t\t\tparent[DEEP_CHANGE](source, info);\n\t\t}\n\t};\n\n\tprotected getChildFieldSchema = (key: any) => {\n\t\tif (this.fieldSchema.type === 'object') {\n\t\t\treturn this.fieldSchema.properties[key];\n\t\t} else if (this.fieldSchema.type === 'array') {\n\t\t\treturn this.fieldSchema.items;\n\t\t} else if (this.fieldSchema.type === 'map') {\n\t\t\treturn this.fieldSchema.values;\n\t\t} else if (this.fieldSchema.type === 'any') {\n\t\t\treturn this.fieldSchema;\n\t\t}\n\t\tthrow new Error('Invalid field schema');\n\t};\n\n\tdispose = () => {\n\t\tthis.events.dispose();\n\t};\n\n\tsubscribe = <EventName extends keyof EntityEvents>(\n\t\tevent: EventName,\n\t\tcallback: EntityEvents[EventName],\n\t) => {\n\t\tconst unsubscribe = this.events.subscribe(event, callback);\n\n\t\treturn unsubscribe;\n\t};\n\n\tprotected addPatches = (patches: Operation[]) => {\n\t\tthis.store.addLocalOperations(patches);\n\t};\n\n\tprotected cloneCurrent = () => {\n\t\tif (this._current === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn cloneDeep(this._current);\n\t};\n\n\tprotected getSubObject = (\n\t\toid: ObjectIdentifier,\n\t\tkey: any,\n\t): Entity<any, any> => {\n\t\tconst fieldSchema = this.getChildFieldSchema(key);\n\t\t// this is a failure case, but trying to be graceful about it...\n\t\t// @ts-ignore\n\t\t// if (!fieldSchema) return null;\n\t\treturn this.cache.getEntity(oid, fieldSchema, this);\n\t};\n\n\tprotected wrapValue = <Key extends keyof KeyValue>(\n\t\tvalue: any,\n\t\tkey: Key,\n\t): KeyValue[Key] => {\n\t\tif (isObjectRef(value)) {\n\t\t\tconst oid = value.id;\n\t\t\tconst subObject = this.getSubObject(oid, key);\n\t\t\tif (subObject) {\n\t\t\t\treturn subObject as any;\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`CACHE MISS: Subobject ${oid} does not exist on ${this.oid}`,\n\t\t\t);\n\t\t} else if (isFileRef(value)) {\n\t\t\tconst file = this.store.getFile(value.id);\n\t\t\tif (file) {\n\t\t\t\tfile.subscribe('change', () => {\n\t\t\t\t\tthis[DEEP_CHANGE](this, {\n\t\t\t\t\t\tisLocal: false,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn file as any;\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t};\n\n\tprotected processInputValue = (value: any, key: any) => {\n\t\t// disassociate incoming OIDs on values and generally break object\n\t\t// references. cloning doesn't work on files so those are\n\t\t// filtered out.\n\t\t// The goal here is to be safe about a bunch of cases that could\n\t\t// result in corrupt data, like...\n\t\t// ent1.set('objField', ent2.get('objField'))\n\t\t// or\n\t\t// var shared = { foo: 'bar' };\n\t\t// ent1.set('objField', shared);\n\t\t// ent2.set('objField', shared);\n\t\t// ... each of these would result in the same object being\n\t\t// referenced in multiple entities, which could mean introduction\n\t\t// of foreign OIDs, or one object being assigned different OIDs\n\t\t// with unexpected results.\n\t\tif (!(value instanceof File)) {\n\t\t\tvalue = cloneDeep(value, false);\n\t\t}\n\t\tconst fieldSchema = this.getChildFieldSchema(key);\n\t\tif (fieldSchema) {\n\t\t\ttraverseCollectionFieldsAndApplyDefaults(value, fieldSchema);\n\t\t}\n\t\treturn processValueFiles(value, this.store.addFile);\n\t};\n\n\tget = <Key extends keyof KeyValue>(key: Key): KeyValue[Key] => {\n\t\tif (this.value === undefined || this.value === null) {\n\t\t\tthrow new Error('Cannot access deleted entity');\n\t\t}\n\n\t\tconst value = this.value[key];\n\t\treturn this.wrapValue(value, key);\n\t};\n\n\tgetAll = (): KeyValue => {\n\t\tif (this.value === undefined || this.value === null) {\n\t\t\tthrow new Error('Cannot access deleted entity');\n\t\t}\n\n\t\tif (this.cachedDestructure) return this.cachedDestructure;\n\n\t\tlet result: any;\n\t\tif (Array.isArray(this.value)) {\n\t\t\tresult = this.value.map((value, index) =>\n\t\t\t\tthis.wrapValue(value, index as any),\n\t\t\t) as any;\n\t\t} else {\n\t\t\tresult = {} as any;\n\t\t\tfor (const key in this.value) {\n\t\t\t\tresult[key as any] = this.get(key as any);\n\t\t\t}\n\t\t}\n\t\tthis.cachedDestructure = result;\n\t\treturn result;\n\t};\n\n\tprivate getFileSnapshot(item: FileRef) {\n\t\tconst file = this.store.getFile(item.id);\n\t\tif (file.url) {\n\t\t\treturn { id: item.id, url: file.url };\n\t\t} else if (file.loading || file.failed) {\n\t\t\treturn { id: item.id, url: undefined };\n\t\t} else {\n\t\t\treturn { id: item.id, url: null };\n\t\t}\n\t}\n\n\t/**\n\t * Returns a copy of the entity and all sub-objects as\n\t * a plain object or array.\n\t */\n\tgetSnapshot = (): any => {\n\t\tif (!this.value) {\n\t\t\treturn null;\n\t\t}\n\t\tif (this.deleted) {\n\t\t\treturn null;\n\t\t}\n\t\tif (this.cachedSnapshot) {\n\t\t\treturn this.cachedSnapshot;\n\t\t}\n\t\tlet snapshot;\n\t\tif (Array.isArray(this.value)) {\n\t\t\tsnapshot = this.value.map((item, idx) => {\n\t\t\t\tif (isObjectRef(item)) {\n\t\t\t\t\treturn this.getSubObject(item.id, idx)?.getSnapshot();\n\t\t\t\t} else if (isFileRef(item)) {\n\t\t\t\t\treturn this.getFileSnapshot(item);\n\t\t\t\t}\n\t\t\t\treturn item;\n\t\t\t}) as Snapshot;\n\t\t} else {\n\t\t\tsnapshot = { ...this.value };\n\t\t\tfor (const [key, value] of Object.entries(snapshot)) {\n\t\t\t\tif (isObjectRef(value)) {\n\t\t\t\t\tsnapshot[key] = this.getSubObject(value.id, key)?.getSnapshot();\n\t\t\t\t} else if (isFileRef(value)) {\n\t\t\t\t\tsnapshot[key] = this.getFileSnapshot(value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tassignOid(snapshot, this.oid);\n\t\tthis.cachedSnapshot = snapshot;\n\t\treturn snapshot;\n\t};\n\n\t/**\n\t * Object methods\n\t */\n\tkeys = () => {\n\t\treturn Object.keys(this.value || {});\n\t};\n\tentries = () => {\n\t\treturn Object.entries(this.getAll());\n\t};\n\tvalues = () => {\n\t\treturn Object.values(this.getAll());\n\t};\n\tset = <Key extends keyof Init>(key: Key, value: Init[Key]) => {\n\t\tif (this.readonlyKeys.includes(key)) {\n\t\t\tthrow new Error(`Cannot set readonly key ${key.toString()}`);\n\t\t}\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createSet(\n\t\t\t\tthis.oid,\n\t\t\t\tkey as string | number,\n\t\t\t\tthis.processInputValue(value, key),\n\t\t\t),\n\t\t);\n\t};\n\tdelete = (key: any) => {\n\t\tif (Array.isArray(this.value)) {\n\t\t\tthis.addPatches(\n\t\t\t\tthis.store.patchCreator.createListDelete(this.oid, key as number, 1),\n\t\t\t);\n\t\t} else {\n\t\t\t// the key must be deletable - i.e. optional in the schema\n\t\t\tconst deleteMode = this.getDeleteMode(key);\n\t\t\tif (!deleteMode) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot delete key ${key} - the property is not marked as optional in the schema`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (deleteMode === 'delete') {\n\t\t\t\tthis.addPatches(this.store.patchCreator.createRemove(this.oid, key));\n\t\t\t} else {\n\t\t\t\tthis.addPatches(this.store.patchCreator.createSet(this.oid, key, null));\n\t\t\t}\n\t\t}\n\t};\n\tprivate getDeleteMode = (key: any) => {\n\t\tif (this.readonlyKeys.includes(key)) {\n\t\t\treturn false;\n\t\t}\n\t\t// 'any' is always deletable, and map values can be removed completely\n\t\tif (this.fieldSchema.type === 'any' || this.fieldSchema.type === 'map') {\n\t\t\treturn 'delete';\n\t\t}\n\n\t\tif (this.fieldSchema.type === 'object') {\n\t\t\tconst property = this.fieldSchema.properties[key];\n\t\t\tif (!property) {\n\t\t\t\t// huh, trying to delete a field that isn't specified\n\t\t\t\t// in the schema. we should use 'delete' mode.\n\t\t\t\treturn 'delete';\n\t\t\t}\n\t\t\tif (property.type === 'any') return 'delete';\n\t\t\t// map can't be nullable\n\t\t\t// TODO: should it be?\n\t\t\tif (property.type === 'map') return false;\n\t\t\t// nullable properties can only be set null\n\t\t\tif (property.nullable) return 'null';\n\t\t}\n\t\t// no other parent objects support deleting\n\t\treturn false;\n\t};\n\t/** @deprecated - renamed to delete */\n\tremove = this.delete.bind(this);\n\n\tupdate = (\n\t\tvalue: Partial<Snapshot>,\n\t\t{\n\t\t\treplaceSubObjects = false,\n\t\t\tmerge = true,\n\t\t}: { replaceSubObjects?: boolean; merge?: boolean } = {\n\t\t\t/**\n\t\t\t * If true, merged sub-objects will be replaced entirely if there's\n\t\t\t * ambiguity about their identity.\n\t\t\t */\n\t\t\treplaceSubObjects: false,\n\t\t\t/**\n\t\t\t * If false, omitted keys will erase their respective fields.\n\t\t\t */\n\t\t\tmerge: true,\n\t\t},\n\t) => {\n\t\tif (\n\t\t\t!merge &&\n\t\t\tthis.fieldSchema.type !== 'any' &&\n\t\t\tthis.fieldSchema.type !== 'map'\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t'Cannot use .update without merge if the field has a strict schema type. merge: false is only available on \"any\" or \"map\" types.',\n\t\t\t);\n\t\t}\n\t\tfor (const [key, field] of Object.entries(value)) {\n\t\t\tif (this.readonlyKeys.includes(key as any)) {\n\t\t\t\tthrow new Error(`Cannot set readonly key ${key.toString()}`);\n\t\t\t}\n\t\t\tconst fieldSchema = this.getChildFieldSchema(key);\n\t\t\tif (fieldSchema) {\n\t\t\t\ttraverseCollectionFieldsAndApplyDefaults(field, fieldSchema);\n\t\t\t}\n\t\t}\n\t\tconst withoutFiles = processValueFiles(value, this.store.addFile);\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createDiff(\n\t\t\t\tthis.getSnapshot(),\n\t\t\t\tassignOid(withoutFiles, this.oid),\n\t\t\t\t{\n\t\t\t\t\tmergeUnknownObjects: !replaceSubObjects,\n\t\t\t\t\tdefaultUndefined: merge,\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\t};\n\n\t/**\n\t * List methods\n\t */\n\n\t/**\n\t * Returns the referent value of an item in the list, used for\n\t * operations which act on items. if the item is an object,\n\t * it will attempt to create an OID reference to it. If it\n\t * is a primitive, it will return the primitive.\n\t */\n\tprivate getItemRefValue = (item: ListItemValue<KeyValue>) => {\n\t\tif (typeof item === 'object') {\n\t\t\tconst itemOid = maybeGetOid(item);\n\t\t\tif (!itemOid || !this.cache.hasOid(itemOid)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot move object ${JSON.stringify(\n\t\t\t\t\t\titem,\n\t\t\t\t\t)} which does not exist in this list`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn itemOid;\n\t\t} else {\n\t\t\treturn item;\n\t\t}\n\t};\n\n\tget length() {\n\t\treturn this.value.length;\n\t}\n\n\tpush = (value: ListItemInit<Init>) => {\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createListPush(\n\t\t\t\tthis.oid,\n\t\t\t\tthis.processInputValue(value, this.value.length),\n\t\t\t),\n\t\t);\n\t};\n\tinsert = (index: number, value: ListItemInit<Init>) => {\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createListInsert(\n\t\t\t\tthis.oid,\n\t\t\t\tindex,\n\t\t\t\tthis.processInputValue(value, index),\n\t\t\t),\n\t\t);\n\t};\n\tmove = (from: number, to: number) => {\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createListMoveByIndex(this.oid, from, to),\n\t\t);\n\t};\n\tmoveItem = (item: ListItemValue<KeyValue>, to: number) => {\n\t\tconst itemRef = this.getItemRefValue(item);\n\t\tif (isObjectRef(itemRef)) {\n\t\t\tthis.addPatches(\n\t\t\t\tthis.store.patchCreator.createListMoveByRef(this.oid, itemRef, to),\n\t\t\t);\n\t\t} else {\n\t\t\tconst index = this.value.indexOf(itemRef);\n\t\t\tthis.addPatches(\n\t\t\t\tthis.store.patchCreator.createListMoveByIndex(this.oid, index, to),\n\t\t\t);\n\t\t}\n\t};\n\tremoveAll = (item: ListItemValue<KeyValue>) => {\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createListRemove(\n\t\t\t\tthis.oid,\n\t\t\t\tthis.getItemRefValue(item),\n\t\t\t),\n\t\t);\n\t};\n\tremoveFirst = (item: ListItemValue<KeyValue>) => {\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createListRemove(\n\t\t\t\tthis.oid,\n\t\t\t\tthis.getItemRefValue(item),\n\t\t\t\t'first',\n\t\t\t),\n\t\t);\n\t};\n\tremoveLast = (item: ListItemValue<KeyValue>) => {\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createListRemove(\n\t\t\t\tthis.oid,\n\t\t\t\tthis.getItemRefValue(item),\n\t\t\t\t'last',\n\t\t\t),\n\t\t);\n\t};\n\tadd = (item: ListItemValue<KeyValue>) => {\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createListAdd(\n\t\t\t\tthis.oid,\n\t\t\t\tthis.processInputValue(item, this.value.length),\n\t\t\t),\n\t\t);\n\t};\n\thas = (item: ListItemValue<KeyValue>) => {\n\t\tif (typeof item === 'object') {\n\t\t\treturn this.value.some((val: unknown) => {\n\t\t\t\tif (isObjectRef(val)) return val.id === maybeGetOid(item);\n\t\t\t\t// Sets of files don't work right now, there's no way to compare them\n\t\t\t\t// effectively.\n\t\t\t\tif (isFileRef(val)) return false;\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\t\treturn this.value.includes(item);\n\t};\n\n\t// list implements an iterator which maps items to wrapped\n\t// versions\n\t[Symbol.iterator]() {\n\t\tlet index = 0;\n\t\treturn {\n\t\t\tnext: () => {\n\t\t\t\tif (index < this.value.length) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalue: this.get(index++) as ListItemValue<KeyValue>,\n\t\t\t\t\t\tdone: false,\n\t\t\t\t\t} as const;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tvalue: undefined,\n\t\t\t\t\tdone: true,\n\t\t\t\t} as const;\n\t\t\t},\n\t\t};\n\t}\n\n\t// additional access methods\n\n\tprivate getAsWrapped = (): ListItemValue<KeyValue>[] => {\n\t\tif (!this.isList) throw new Error('Cannot map items of a non-list');\n\t\treturn this.value.map(this.wrapValue);\n\t};\n\n\tmap = <U>(callback: (value: ListItemValue<KeyValue>, index: number) => U) => {\n\t\treturn this.getAsWrapped().map(callback);\n\t};\n\n\tfilter = (\n\t\tcallback: (value: ListItemValue<KeyValue>, index: number) => boolean,\n\t) => {\n\t\treturn this.getAsWrapped().filter((val, index) => {\n\t\t\treturn callback(val, index);\n\t\t});\n\t};\n\n\tforEach = (\n\t\tcallback: (value: ListItemValue<KeyValue>, index: number) => void,\n\t) => {\n\t\tthis.getAsWrapped().forEach(callback);\n\t};\n\n\tsome = (predicate: (value: ListItemValue<KeyValue>) => boolean) => {\n\t\treturn this.getAsWrapped().some(predicate);\n\t};\n\n\tevery = (predicate: (value: ListItemValue<KeyValue>) => boolean) => {\n\t\treturn this.getAsWrapped().every(predicate);\n\t};\n\n\tfind = (predicate: (value: ListItemValue<KeyValue>) => boolean) => {\n\t\treturn this.getAsWrapped().find(predicate);\n\t};\n\n\tincludes = (item: ListItemValue<KeyValue>) => {\n\t\treturn this.has(item);\n\t};\n}\n\nexport interface BaseEntity<\n\tInit,\n\tValue extends BaseEntityValue,\n\tSnapshot = DataFromInit<Init>,\n> {\n\tdispose: () => void;\n\tsubscribe<EventName extends keyof EntityEvents>(\n\t\tevent: EventName,\n\t\tcallback: EntityEvents[EventName],\n\t): () => void;\n\tget<Key extends keyof Value>(key: Key): Value[Key];\n\tgetAll(): Value;\n\tgetSnapshot(): Snapshot;\n\treadonly deleted: boolean;\n\treadonly hasSubscribers: boolean;\n}\n\nexport interface ObjectEntity<\n\tInit,\n\tValue extends BaseEntityValue,\n\tSnapshot = DataFromInit<Init>,\n> extends BaseEntity<Init, Value, Snapshot> {\n\tkeys(): string[];\n\tentries(): [string, Exclude<Value[keyof Value], undefined>][];\n\tvalues(): Exclude<Value[keyof Value], undefined>[];\n\tset<Key extends keyof Init>(key: Key, value: Init[Key]): void;\n\tdelete(key: DeletableKeys<Value>): void;\n\tupdate(\n\t\tvalue: Partial<Snapshot>,\n\t\toptions?: { replaceSubObjects?: boolean; merge?: boolean },\n\t): void;\n\treadonly isList: false;\n}\n\nexport interface ListEntity<\n\tInit,\n\tValue extends BaseEntityValue,\n\tSnapshot = DataFromInit<Init>,\n> extends Iterable<ListItemValue<Value>>,\n\t\tBaseEntity<Init, Value, Snapshot> {\n\treadonly isList: true;\n\treadonly length: number;\n\tpush(value: ListItemInit<Init>): void;\n\tinsert(index: number, value: ListItemInit<Init>): void;\n\tmove(from: number, to: number): void;\n\tmoveItem(item: ListItemValue<Value>, to: number): void;\n\t/**\n\t * A Set operation which adds a value if an equivalent value is not already present.\n\t * Object values are never the same.\n\t */\n\tadd(value: ListItemValue<Value>): void;\n\tremoveAll(item: ListItemValue<Value>): void;\n\tremoveFirst(item: ListItemValue<Value>): void;\n\tremoveLast(item: ListItemValue<Value>): void;\n\tmap<U>(callback: (value: ListItemValue<Value>, index: number) => U): U[];\n\tfilter(\n\t\tcallback: (value: ListItemValue<Value>, index: number) => boolean,\n\t): ListItemValue<Value>[];\n\tdelete(index: number): void;\n\thas(value: ListItemValue<Value>): boolean;\n\tforEach(callback: (value: ListItemValue<Value>, index: number) => void): void;\n\tsome(predicate: (value: ListItemValue<Value>) => boolean): boolean;\n\tevery(predicate: (value: ListItemValue<Value>) => boolean): boolean;\n\tfind(\n\t\tpredicate: (value: ListItemValue<Value>) => boolean,\n\t): ListItemValue<Value> | undefined;\n\tincludes(value: ListItemValue<Value>): boolean;\n}\n\nexport type AnyEntity<\n\tInit,\n\tKeyValue extends BaseEntityValue,\n\tSnapshot extends any,\n> =\n\t| ListEntity<Init, KeyValue, Snapshot>\n\t| ObjectEntity<Init, KeyValue, Snapshot>;\n\ntype ListItemValue<KeyValue> = KeyValue extends Array<infer T> ? T : never;\ntype ListItemInit<Init> = Init extends Array<infer T> ? T : never;\n\nexport type EntityDestructured<T extends AnyEntity<any, any, any> | null> =\n\t| (T extends ListEntity<any, infer KeyValue, any>\n\t\t\t? KeyValue\n\t\t\t: T extends ObjectEntity<any, infer KeyValue, any>\n\t\t\t? KeyValue\n\t\t\t: never)\n\t| (T extends null ? null : never);\n", "export class Resolvable<T> {\n\treadonly promise: Promise<T>;\n\tprivate _resolve: (value: T) => void;\n\tprivate _reject: (reason?: any) => void;\n\n\tconstructor() {\n\t\tlet resolve: (value: T) => void;\n\t\tlet reject: (reason?: any) => void;\n\t\tthis.promise = new Promise((res, rej) => {\n\t\t\tresolve = res;\n\t\t\treject = rej;\n\t\t});\n\t\tthis._resolve = resolve!;\n\t\tthis._reject = reject!;\n\t}\n\n\tresolve(value: T) {\n\t\tthis._resolve(value);\n\t}\n\n\treject(reason?: any) {\n\t\tthis._reject(reason);\n\t}\n}\n", "import {\n\tapplyPatch,\n\tassignOid,\n\tcloneDeep,\n\tcompareTimestampSchemaVersions,\n\tDocumentBaseline,\n\tEventSubscriber,\n\tObjectIdentifier,\n\tOperation,\n\tStorageFieldSchema,\n} from '@verdant-web/common';\nimport { Entity, refreshEntity, StoreTools } from './Entity.js';\nimport type { EntityStore } from './EntityStore.js';\nimport { Context } from '../context.js';\nimport { TaggedOperation } from '../types.js';\nimport { Resolvable } from '../utils/Resolvable.js';\n\n/**\n * Local operations: operations on this client that haven't\n * yet been synced and are only applied in-memory. These are\n * always applied after all other operations, they are conceptually\n * 'in the future' as they are not yet synced or stored.\n *\n * Confirmed operations: operations that have been synced and\n * stored in the database.\n *\n * Unconfirmed operations: operations received from sync which\n * have not been stored yet and are only in memory. These exist\n * because new incoming operations are synchronously applied to\n * cached entities while storage goes on async.\n */\nexport class DocumentFamilyCache extends EventSubscriber<\n\tRecord<`change:${string}`, () => void> & {\n\t\t'change:*': (oid: ObjectIdentifier) => void;\n\t}\n> {\n\treadonly oid: ObjectIdentifier;\n\tprivate operationsMap: Map<ObjectIdentifier, TaggedOperation[]>;\n\tprivate localOperationsMap: Map<ObjectIdentifier, Operation[]>;\n\tprivate baselinesMap: Map<ObjectIdentifier, DocumentBaseline>;\n\n\tprivate entities: Map<ObjectIdentifier, WeakRef<Entity>> = new Map();\n\n\tprivate context;\n\tprivate storeTools: StoreTools;\n\n\tprivate _initialized = new Resolvable<boolean>();\n\tget initializedPromise() {\n\t\treturn this._initialized.promise;\n\t}\n\tsetInitialized = () => {\n\t\tthis._initialized.resolve(true);\n\t};\n\n\tconstructor({\n\t\toid,\n\t\tstore,\n\t\tcontext,\n\t}: {\n\t\toid: ObjectIdentifier;\n\t\tstore: EntityStore;\n\t\tcontext: Context;\n\t}) {\n\t\tsuper();\n\t\tthis.oid = oid;\n\t\tthis.operationsMap = new Map();\n\t\tthis.localOperationsMap = new Map();\n\t\tthis.baselinesMap = new Map();\n\t\tthis.storeTools = {\n\t\t\taddLocalOperations: store.addLocalOperations,\n\t\t\tpatchCreator: store.meta.patchCreator,\n\t\t\taddFile: store.files.add,\n\t\t\tgetFile: store.files.get,\n\t\t\ttime: store.meta.time,\n\t\t\tnow: store.meta.now,\n\t\t};\n\t\tthis.context = context;\n\t}\n\n\tget weakRef() {\n\t\treturn this.context.weakRef;\n\t}\n\n\tinsertLocalOperations = (operations: Operation[]) => {\n\t\tconst oidSet = new Set<ObjectIdentifier>();\n\t\tfor (const operation of operations) {\n\t\t\tconst { oid } = operation;\n\t\t\toidSet.add(oid);\n\t\t\tconst existingOperations = this.localOperationsMap.get(oid) || [];\n\t\t\texistingOperations.push(operation);\n\t\t\tthis.localOperationsMap.set(oid, existingOperations);\n\t\t}\n\t\tfor (const oid of oidSet) {\n\t\t\tconst entityRef = this.entities.get(oid);\n\t\t\tconst entity = entityRef?.deref();\n\t\t\tif (entity) {\n\t\t\t\trefreshEntity(entity, { isLocal: true });\n\t\t\t\tthis.emit(`change:${oid}`);\n\t\t\t\tthis.emit('change:*', oid);\n\t\t\t}\n\t\t}\n\t};\n\n\tinsertOperations = (\n\t\toperations: TaggedOperation[],\n\t\tinfo: {\n\t\t\tisLocal: boolean;\n\t\t\taffectedOids?: Set<ObjectIdentifier>;\n\t\t},\n\t) => {\n\t\tfor (const operation of operations) {\n\t\t\tconst { oid } = operation;\n\t\t\tinfo.affectedOids?.add(oid);\n\t\t\tconst existingOperations = this.operationsMap.get(oid) || [];\n\t\t\t// insert in order of timestamp\n\t\t\tconst index = existingOperations.findIndex(\n\t\t\t\t(op) => op.timestamp >= operation.timestamp,\n\t\t\t);\n\t\t\t// ensure the operation doesn't already exist in this position\n\t\t\tif (index !== -1) {\n\t\t\t\tif (existingOperations[index].timestamp === operation.timestamp) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\texistingOperations.splice(index, 0, operation);\n\t\t\t} else {\n\t\t\t\texistingOperations.push(operation);\n\t\t\t}\n\t\t\tthis.operationsMap.set(oid, existingOperations);\n\n\t\t\t// FIXME: seems inefficient\n\t\t\tconst unconfirmedOperations = this.localOperationsMap.get(oid);\n\t\t\tif (unconfirmedOperations) {\n\t\t\t\tthis.localOperationsMap.set(\n\t\t\t\t\toid,\n\t\t\t\t\tunconfirmedOperations.filter(\n\t\t\t\t\t\t(op) => op.timestamp !== operation.timestamp,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Insert new baselines for objects in this family.\n\t * Automatically drops operations before the new baseline.\n\t */\n\tinsertBaselines = (\n\t\tbaselines: DocumentBaseline[],\n\t\t{\n\t\t\taffectedOids,\n\t\t}: { isLocal: boolean; affectedOids?: Set<ObjectIdentifier> },\n\t) => {\n\t\tfor (const baseline of baselines) {\n\t\t\tconst { oid } = baseline;\n\t\t\t// opt out if our baseline is newer.\n\t\t\tconst existing = this.baselinesMap.get(oid);\n\t\t\tif (existing?.timestamp && existing.timestamp >= baseline.timestamp) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\taffectedOids?.add(oid);\n\t\t\tthis.baselinesMap.set(oid, baseline);\n\t\t\t// drop operations before the baseline\n\t\t\tconst ops = this.operationsMap.get(oid) || [];\n\t\t\twhile (ops[0]?.timestamp < baseline.timestamp) {\n\t\t\t\tops.shift();\n\t\t\t}\n\t\t}\n\t};\n\n\taddData = ({\n\t\toperations,\n\t\tbaselines,\n\t\treset,\n\t\tisLocal,\n\t}: {\n\t\toperations: TaggedOperation[];\n\t\tbaselines: DocumentBaseline[];\n\t\treset?: boolean;\n\t\tisLocal?: boolean;\n\t}) => {\n\t\tif (reset) {\n\t\t\tthis.operationsMap.clear();\n\t\t\tthis.baselinesMap.clear();\n\t\t}\n\t\tconst info = {\n\t\t\tisLocal: isLocal || false,\n\t\t\taffectedOids: new Set<ObjectIdentifier>(),\n\t\t};\n\t\tthis.insertBaselines(baselines, info);\n\t\t// for reset scenario, don't immediately update entities;\n\t\t// we will update all of them in one go.\n\t\tthis.insertOperations(operations, info);\n\t\tif (reset) {\n\t\t\tfor (const entityRef of this.entities.values()) {\n\t\t\t\tconst entity = entityRef.deref();\n\t\t\t\tif (entity) {\n\t\t\t\t\trefreshEntity(entity, info);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const oid of info.affectedOids) {\n\t\t\t\tconst entityRef = this.entities.get(oid);\n\t\t\t\tconst entity = entityRef?.deref();\n\t\t\t\tif (entity) {\n\t\t\t\t\trefreshEntity(entity, info);\n\t\t\t\t\tthis.emit(`change:${oid}`);\n\t\t\t\t\tthis.emit('change:*', oid);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tprivate applyOperations = (\n\t\tview: any,\n\t\tdeleted: boolean,\n\t\toperations: Operation[],\n\t\tafter?: string,\n\t): {\n\t\tview: any;\n\t\tdeleted: boolean;\n\t\tempty: boolean;\n\t} => {\n\t\tlet futureSeen: string | undefined = undefined;\n\t\tconst now = this.storeTools.now;\n\t\tfor (const operation of operations) {\n\t\t\tif (after && operation.timestamp <= after) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (compareTimestampSchemaVersions(operation.timestamp, now) > 0) {\n\t\t\t\t// we don't apply patches from future versions\n\t\t\t\tfutureSeen = operation.timestamp;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (operation.data.op === 'delete') {\n\t\t\t\tdeleted = true;\n\t\t\t} else {\n\t\t\t\tview = applyPatch(view, operation.data);\n\t\t\t\tif (operation.data.op === 'initialize') {\n\t\t\t\t\tdeleted = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (futureSeen) {\n\t\t\tthis.context.globalEvents.emit('futureSeen', futureSeen);\n\t\t}\n\t\treturn { view, deleted, empty: !view && !operations.length };\n\t};\n\n\tcomputeView = (oid: ObjectIdentifier) => {\n\t\tif (\n\t\t\tthis.baselinesMap.size === 0 &&\n\t\t\tthis.operationsMap.size === 0 &&\n\t\t\tthis.localOperationsMap.size === 0\n\t\t) {\n\t\t\tthis.context.log('debug', `Entity ${oid} accessed with no data at all`);\n\t\t\treturn { view: null, deleted: true, lastTimestamp: null };\n\t\t}\n\t\tconst confirmed = this.computeConfirmedView(oid);\n\t\tconst unconfirmedOperations = this.localOperationsMap.get(oid) || [];\n\t\tif (confirmed.empty && !unconfirmedOperations.length) {\n\t\t\tthis.context.log(\n\t\t\t\t'debug',\n\t\t\t\t`Entity ${oid} accessed with no local data at all`,\n\t\t\t);\n\t\t\treturn { view: null, deleted: true, lastTimestamp: null };\n\t\t}\n\t\tlet { view, deleted } = this.applyOperations(\n\t\t\tconfirmed.view,\n\t\t\tconfirmed.deleted,\n\t\t\tunconfirmedOperations,\n\t\t);\n\t\tif (view) {\n\t\t\tassignOid(view, oid);\n\t\t}\n\t\treturn { view, deleted, lastTimestamp: this.getLastTimestamp(oid) };\n\t};\n\n\tcomputeConfirmedView = (\n\t\toid: ObjectIdentifier,\n\t): {\n\t\tview: any;\n\t\tdeleted: boolean;\n\t\tempty: boolean;\n\t} => {\n\t\tconst baseline = this.baselinesMap.get(oid);\n\t\tconst operations = this.operationsMap.get(oid) || [];\n\t\tconst snapshot = cloneDeep(baseline?.snapshot || undefined);\n\t\tconst result = this.applyOperations(\n\t\t\tsnapshot,\n\t\t\t!snapshot,\n\t\t\toperations,\n\t\t\tbaseline?.timestamp,\n\t\t);\n\t\tif (result.view) {\n\t\t\tassignOid(result.view, oid);\n\t\t}\n\t\tif (result.empty) {\n\t\t\tthis.context.log(\n\t\t\t\t'debug',\n\t\t\t\t`Entity ${oid} accessed with no confirmed data`,\n\t\t\t);\n\t\t}\n\t\treturn result;\n\t};\n\n\tgetLastTimestamp = (oid: ObjectIdentifier) => {\n\t\tlet operations = this.localOperationsMap.get(oid);\n\t\tif (!operations?.length) {\n\t\t\toperations = this.operationsMap.get(oid) || [];\n\t\t}\n\t\tlet logicalTimestamp: string | null = null;\n\t\tif (operations.length) {\n\t\t\tlogicalTimestamp = operations[operations.length - 1]?.timestamp;\n\t\t} else {\n\t\t\tlogicalTimestamp = this.baselinesMap.get(oid)?.timestamp ?? null;\n\t\t}\n\t\tif (!logicalTimestamp) return null;\n\t\treturn this.storeTools.time.getWallClockTime(logicalTimestamp);\n\t};\n\n\tgetEntity = (\n\t\toid: ObjectIdentifier,\n\t\tschema: StorageFieldSchema,\n\t\tparent?: Entity,\n\t\treadonlyKeys?: string[],\n\t): Entity => {\n\t\tlet entityRef = this.entities.get(oid);\n\t\tlet entity = entityRef?.deref();\n\t\tif (!entity) {\n\t\t\tentity = new Entity({\n\t\t\t\toid,\n\t\t\t\tcache: this,\n\t\t\t\tfieldSchema: schema,\n\t\t\t\tstore: this.storeTools,\n\t\t\t\tparent,\n\t\t\t\treadonlyKeys,\n\t\t\t});\n\n\t\t\t// immediately add to cache and queue a removal if nobody subscribed\n\t\t\tthis.entities.set(oid, this.context.weakRef(entity));\n\t\t}\n\n\t\treturn entity as any;\n\t};\n\n\thasOid = (oid: ObjectIdentifier) => {\n\t\treturn this.operationsMap.has(oid) || this.baselinesMap.has(oid);\n\t};\n\n\tdispose = () => {\n\t\tthis.entities.forEach((entity) => entity.deref()?.dispose());\n\t\tthis.entities.clear();\n\t};\n\n\treset = ({\n\t\toperations,\n\t\tbaselines,\n\t\tdropExistingUnconfirmed: dropUnconfirmed = false,\n\t\tunconfirmedOperations,\n\t\tdropAll,\n\t}: {\n\t\toperations: TaggedOperation[];\n\t\tunconfirmedOperations?: Operation[];\n\t\tbaselines: DocumentBaseline[];\n\t\t/**\n\t\t * Whether to drop operations which are only in-memory. Unconfirmed operations\n\t\t * will not be restored from storage until they are persisted, so it's not advisable\n\t\t * to use this unless the intention is to completely clear the entities.\n\t\t */\n\t\tdropExistingUnconfirmed?: boolean;\n\t\t/**\n\t\t * Drop unconfirmed and confirmed data before resetting to incoming data.\n\t\t * This is dangerous due to race conditions. Only use when a full reset is\n\t\t * required.\n\t\t */\n\t\tdropAll?: boolean;\n\t}) => {\n\t\tthis.context.log(\n\t\t\t'debug',\n\t\t\t`Resetting cache for ${this.oid} with ${operations.length} ops and ${baselines.length} baselines, dropUnconfirmed=${dropUnconfirmed}`,\n\t\t);\n\t\tconst info = { isLocal: false, affectedOids: new Set<ObjectIdentifier>() };\n\n\t\t// NOTE: not clearing these maps... there are even more\n\t\t// race conditions where we begin opening a cache, queue up a\n\t\t// reset, then receive incoming operations before the reset\n\t\t// actually hits this function, so those incoming ops are\n\t\t// dropped.\n\t\t// FIXME: include this in a future refactor of this\n\t\t// whole system.\n\n\t\tif (dropAll) this.baselinesMap.clear();\n\t\tthis.insertBaselines(baselines, info);\n\n\t\tif (dropAll) this.operationsMap.clear();\n\t\tthis.insertOperations(operations, info);\n\n\t\tif (unconfirmedOperations || dropUnconfirmed) {\n\t\t\tthis.localOperationsMap.clear();\n\t\t\tif (unconfirmedOperations) {\n\t\t\t\tthis.insertLocalOperations(unconfirmedOperations);\n\t\t\t}\n\t\t}\n\n\t\tfor (const oid of this.entities.keys()) {\n\t\t\tconst entityRef = this.entities.get(oid);\n\t\t\tconst entity = entityRef?.deref();\n\t\t\tif (entity) {\n\t\t\t\trefreshEntity(entity, info);\n\t\t\t\tthis.emit(`change:${oid}`);\n\t\t\t\tthis.emit('change:*', oid);\n\t\t\t}\n\t\t}\n\t};\n}\n", "import {\n\tassert,\n\tassignIndexValues,\n\tassignOid,\n\tassignOidPropertiesToAllSubObjects,\n\tBatcher,\n\tcloneDeep,\n\tdecomposeOid,\n\tDocumentBaseline,\n\tEventSubscriber,\n\tgenerateId,\n\tgetIndexValues,\n\tgetOidRoot,\n\tgetUndoOperations,\n\tgroupBaselinesByRootOid,\n\tgroupPatchesByIdentifier,\n\tgroupPatchesByRootOid,\n\tObjectIdentifier,\n\tOperation,\n\tremoveOidsFromAllSubObjects,\n\tStorageCollectionSchema,\n\tStorageObjectFieldSchema,\n} from '@verdant-web/common';\nimport { Context } from '../context.js';\nimport { FileManager } from '../files/FileManager.js';\nimport { processValueFiles } from '../files/utils.js';\nimport { storeRequestPromise } from '../idb.js';\nimport { Metadata } from '../metadata/Metadata.js';\nimport { DocumentFamilyCache } from './DocumentFamiliyCache.js';\nimport { TaggedOperation } from '../types.js';\n\nconst DEFAULT_BATCH_KEY = '@@default';\n\nexport interface OperationBatch {\n\trun: (fn: () => void) => this;\n\tflush: () => Promise<void>;\n\tdiscard: () => void;\n}\n\nexport class EntityStore {\n\tprivate documentFamilyCaches = new Map<string, DocumentFamilyCache>();\n\n\tpublic meta;\n\tprivate operationBatcher;\n\tpublic files;\n\n\tprivate context: Context;\n\n\tprivate unsubscribes: (() => void)[] = [];\n\n\tprivate _disposed = false;\n\n\tprivate get log() {\n\t\treturn this.context.log;\n\t}\n\tprivate get db() {\n\t\treturn this.context.documentDb;\n\t}\n\tprivate get undoHistory() {\n\t\treturn this.context.undoHistory;\n\t}\n\tprivate get schema() {\n\t\treturn this.context.schema;\n\t}\n\n\tprivate currentBatchKey = DEFAULT_BATCH_KEY;\n\tprivate defaultBatchTimeout: number;\n\n\tconstructor({\n\t\tcontext,\n\t\tmeta,\n\t\tbatchTimeout = 200,\n\t\tfiles,\n\t}: {\n\t\tcontext: Context;\n\t\tmeta: Metadata;\n\t\tfiles: FileManager;\n\t\tbatchTimeout?: number;\n\t}) {\n\t\tthis.context = context;\n\n\t\tthis.defaultBatchTimeout = batchTimeout;\n\t\tthis.meta = meta;\n\t\tthis.files = files;\n\t\tthis.operationBatcher = new Batcher<Operation, { undoable?: boolean }>(\n\t\t\tthis.flushOperations,\n\t\t);\n\t\t// initialize default batch\n\t\tthis.operationBatcher.add({\n\t\t\tkey: DEFAULT_BATCH_KEY,\n\t\t\titems: [],\n\t\t\tmax: 100,\n\t\t\ttimeout: batchTimeout,\n\t\t\tuserData: { undoable: true },\n\t\t});\n\t\tthis.unsubscribes.push(this.meta.subscribe('rebase', this.handleRebase));\n\t}\n\n\tsetContext = (context: Context) => {\n\t\tthis.context = context;\n\t};\n\n\tprivate getDocumentSchema = (\n\t\toid: ObjectIdentifier,\n\t): { schema: StorageObjectFieldSchema | null; readonlyKeys: string[] } => {\n\t\tconst { collection } = decomposeOid(oid);\n\t\tif (!this.schema.collections[collection]) {\n\t\t\tthis.log('warn', `Missing schema for collection: ${collection}`);\n\t\t\treturn { schema: null, readonlyKeys: [] };\n\t\t}\n\t\tconst schema = this.schema.collections[collection];\n\t\treturn {\n\t\t\treadonlyKeys: [schema.primaryKey],\n\t\t\tschema: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: schema.fields as any,\n\t\t\t} as const,\n\t\t};\n\t};\n\n\tprivate refreshFamilyCache = async (\n\t\tfamilyCache: DocumentFamilyCache,\n\t\tdropUnconfirmed = false,\n\t\tdropAll = false,\n\t) => {\n\t\t// avoid writing to disposed db\n\t\tif (this._disposed) {\n\t\t\tthis.context.log(\n\t\t\t\t'debug',\n\t\t\t\t`EntityStore is disposed, not refreshing ${familyCache.oid} cache`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// metadata must be loaded from database to initialize family cache\n\t\tconst transaction = this.meta.createTransaction([\n\t\t\t'baselines',\n\t\t\t'operations',\n\t\t]);\n\n\t\tconst baselines: DocumentBaseline[] = [];\n\t\tconst operations: TaggedOperation[] = [];\n\n\t\tawait Promise.all([\n\t\t\tthis.meta.baselines.iterateOverAllForDocument(\n\t\t\t\tfamilyCache.oid,\n\t\t\t\t(baseline) => {\n\t\t\t\t\tbaselines.push(baseline);\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttransaction,\n\t\t\t\t\tmode: 'readwrite',\n\t\t\t\t},\n\t\t\t),\n\t\t\tthis.meta.operations.iterateOverAllOperationsForDocument(\n\t\t\t\tfamilyCache.oid,\n\t\t\t\t(op) => {\n\t\t\t\t\t(op as TaggedOperation).confirmed = true;\n\t\t\t\t\toperations.push(op as TaggedOperation);\n\t\t\t\t},\n\t\t\t\t{ transaction, mode: 'readwrite' },\n\t\t\t),\n\t\t]);\n\t\tfamilyCache.reset({\n\t\t\toperations,\n\t\t\tbaselines,\n\t\t\tdropExistingUnconfirmed: dropUnconfirmed,\n\t\t\tdropAll,\n\t\t});\n\t};\n\n\tprivate openFamilyCache = async (oid: ObjectIdentifier) => {\n\t\tconst documentOid = getOidRoot(oid);\n\t\tlet familyCache = this.documentFamilyCaches.get(documentOid);\n\t\tif (!familyCache) {\n\t\t\tthis.context.log('debug', 'opening family cache for', documentOid);\n\t\t\t// metadata must be loaded from database to initialize family cache\n\t\t\tfamilyCache = new DocumentFamilyCache({\n\t\t\t\toid: documentOid,\n\t\t\t\tstore: this,\n\t\t\t\tcontext: this.context,\n\t\t\t});\n\n\t\t\t// PROBLEM: because the next line is async, it yields to\n\t\t\t// queued promises which may need data from this cache,\n\t\t\t// but the cache is empty. But if we move the set to\n\t\t\t// after the async, we can clobber an existing cache\n\t\t\t// with race conditions...\n\t\t\t// So as an attempt to fix that, I've added a promise\n\t\t\t// on DocumentFamilyCache which I manually resolve\n\t\t\t// with setInitialized, then await initializedPromise\n\t\t\t// further down even if there was a cache hit.\n\t\t\t// Surely there is a better pattern for this.\n\t\t\t// FIXME:\n\t\t\tthis.documentFamilyCaches.set(documentOid, familyCache);\n\t\t\tawait this.refreshFamilyCache(familyCache);\n\t\t\tfamilyCache.setInitialized();\n\n\t\t\t// this.unsubscribes.push(\n\t\t\t// \tfamilyCache.subscribe('change:*', this.onEntityChange),\n\t\t\t// );\n\n\t\t\t// TODO: cleanup cache when all documents are disposed\n\t\t}\n\t\tawait familyCache.initializedPromise;\n\n\t\treturn familyCache;\n\t};\n\n\tprivate onEntityChange = async (oid: ObjectIdentifier) => {\n\t\t// queueMicrotask(() => this.writeDocumentToStorage(oid));\n\t};\n\n\tprivate writeDocumentToStorage = async (oid: ObjectIdentifier) => {\n\t\tif (this._disposed) {\n\t\t\tthis.log('warn', 'EntityStore is disposed, not writing to storage');\n\t\t\treturn;\n\t\t}\n\t\tconst rootOid = getOidRoot(oid);\n\t\tconst { id, collection } = decomposeOid(rootOid);\n\t\tconst entity = await this.get(rootOid);\n\n\t\tif (this._disposed) {\n\t\t\tthis.log('warn', 'EntityStore is disposed, not writing to storage');\n\t\t\treturn;\n\t\t}\n\n\t\tconst snapshot = entity?.getSnapshot();\n\t\tif (snapshot) {\n\t\t\tconst stored = getIndexValues(\n\t\t\t\tthis.schema.collections[collection],\n\t\t\t\tsnapshot,\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tconst tx = this.db.transaction(collection, 'readwrite');\n\t\t\t\tconst store = tx.objectStore(collection);\n\t\t\t\tawait storeRequestPromise(store.put(stored));\n\t\t\t\tthis.log('info', '\uD83D\uDCDD', 'wrote', collection, id, 'to storage', stored);\n\t\t\t} catch (err) {\n\t\t\t\t// if the document can't be written, something's very wrong :(\n\t\t\t\t// log the error and move on...\n\t\t\t\tthis.log(\n\t\t\t\t\t\"\u26A0\uFE0F CRITICAL: possibly corrupt data couldn't be written to queryable storage. This is probably a bug in verdant! Please report at https://github.com/a-type/verdant/issues\",\n\t\t\t\t\t'\\n',\n\t\t\t\t\t'Invalid data:',\n\t\t\t\t\tJSON.stringify(stored),\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tconst tx = this.db.transaction(collection, 'readwrite');\n\t\t\tconst store = tx.objectStore(collection);\n\t\t\tawait storeRequestPromise(store.delete(id));\n\t\t\tthis.log('info', '\u274C', 'deleted', collection, id, 'from storage');\n\t\t}\n\t};\n\n\tget = async (oid: ObjectIdentifier) => {\n\t\tconst familyCache = await this.openFamilyCache(oid);\n\t\tconst { schema, readonlyKeys } = this.getDocumentSchema(oid);\n\t\tif (!schema) {\n\t\t\treturn null;\n\t\t}\n\t\treturn familyCache.getEntity(oid, schema, undefined, readonlyKeys);\n\t};\n\n\t/**\n\t * Advanced usage!\n\t * Immediately returns an entity if it exists in the memory cache. An\n\t * entity would be cached if it has been retrieved by a live query.\n\t */\n\tgetCached = (oid: ObjectIdentifier) => {\n\t\tconst cache = this.documentFamilyCaches.get(oid);\n\t\tif (cache) {\n\t\t\tconst { schema, readonlyKeys } = this.getDocumentSchema(oid);\n\t\t\tif (!schema) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn cache.getEntity(oid, schema, undefined, readonlyKeys);\n\t\t}\n\t\treturn null;\n\t};\n\n\t/**\n\t * Creates a new document and returns an Entity for it. The created\n\t * document is submitted to storage and sync.\n\t */\n\tcreate = async (\n\t\tinitial: any,\n\t\toid: ObjectIdentifier,\n\t\toptions: { undoable?: boolean },\n\t) => {\n\t\t// remove all OID associations from initial data\n\t\tremoveOidsFromAllSubObjects(initial);\n\t\t// first grab any file and replace them with refs\n\t\tconst processed = processValueFiles(initial, this.files.add);\n\n\t\tassignOid(processed, oid);\n\t\tconst operations = this.meta.patchCreator.createInitialize(processed, oid);\n\t\tconst familyCache = await this.openFamilyCache(oid);\n\t\tfamilyCache.insertLocalOperations(operations);\n\t\t// don't enqueue these, submit as distinct operation.\n\t\t// we do this so it can be immediately queryable from storage...\n\t\t// only holding it in memory would introduce lag before it shows up\n\t\t// in other queries.\n\t\tawait this.submitOperations(operations, options);\n\t\tconst { schema, readonlyKeys } = this.getDocumentSchema(oid);\n\t\tif (!schema) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot create a document in the ${\n\t\t\t\t\tdecomposeOid(oid).collection\n\t\t\t\t} collection; it is not defined in the current schema version.`,\n\t\t\t);\n\t\t}\n\t\treturn familyCache.getEntity(oid, schema, undefined, readonlyKeys);\n\t};\n\n\tprivate addOperationsToOpenCaches = async (\n\t\toperations: Operation[],\n\t\tinfo: { isLocal: boolean; confirmed?: boolean },\n\t) => {\n\t\tconst operationsByOid = groupPatchesByRootOid(operations);\n\t\tconst oids = Object.keys(operationsByOid);\n\t\toids.forEach((oid) => {\n\t\t\tconst familyCache = this.documentFamilyCaches.get(oid);\n\t\t\tif (familyCache) {\n\t\t\t\tthis.log(\n\t\t\t\t\t'adding',\n\t\t\t\t\tinfo.confirmed ? 'confirmed' : 'unconfirmed',\n\t\t\t\t\t'operations to cache',\n\t\t\t\t\toid,\n\t\t\t\t\toperationsByOid[oid].length,\n\t\t\t\t);\n\t\t\t\tif (info.isLocal) {\n\t\t\t\t\tfamilyCache.insertLocalOperations(operationsByOid[oid]);\n\t\t\t\t} else {\n\t\t\t\t\tfamilyCache.insertOperations(operationsByOid[oid], info);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\tprivate addBaselinesToOpenCaches = async (\n\t\tbaselines: DocumentBaseline[],\n\t\tinfo: { isLocal: boolean },\n\t) => {\n\t\tconst baselinesByOid = groupBaselinesByRootOid(baselines);\n\t\tconst oids = Object.keys(baselinesByOid);\n\t\toids.forEach((oid) => {\n\t\t\tconst cache = this.documentFamilyCaches.get(oid);\n\t\t\tif (cache) {\n\t\t\t\tthis.log(\n\t\t\t\t\t'adding',\n\t\t\t\t\t'baselines to cache',\n\t\t\t\t\toid,\n\t\t\t\t\tbaselinesByOid[oid].length,\n\t\t\t\t);\n\t\t\t\tcache.insertBaselines(baselinesByOid[oid], info);\n\t\t\t}\n\t\t});\n\t};\n\n\tprivate addDataToOpenCaches = ({\n\t\tbaselines,\n\t\toperations,\n\t\treset,\n\t\tisLocal,\n\t}: {\n\t\tbaselines: DocumentBaseline[];\n\t\toperations: TaggedOperation[];\n\t\treset?: boolean;\n\t\tisLocal?: boolean;\n\t}) => {\n\t\tconst baselinesByDocumentOid = groupBaselinesByRootOid(baselines);\n\t\tconst operationsByDocumentOid = groupPatchesByRootOid(operations);\n\t\tconst allDocumentOids = Array.from(\n\t\t\tnew Set(\n\t\t\t\tObject.keys(baselinesByDocumentOid).concat(\n\t\t\t\t\tObject.keys(operationsByDocumentOid),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\t\tfor (const oid of allDocumentOids) {\n\t\t\tconst familyCache = this.documentFamilyCaches.get(oid);\n\t\t\tif (familyCache) {\n\t\t\t\tfamilyCache.addData({\n\t\t\t\t\toperations: operationsByDocumentOid[oid] || [],\n\t\t\t\t\tbaselines: baselinesByDocumentOid[oid] || [],\n\t\t\t\t\treset,\n\t\t\t\t\tisLocal,\n\t\t\t\t});\n\t\t\t\tthis.log(\n\t\t\t\t\t'debug',\n\t\t\t\t\t'Added data to cache for',\n\t\t\t\t\toid,\n\t\t\t\t\toperationsByDocumentOid[oid]?.length ?? 0,\n\t\t\t\t\t'operations',\n\t\t\t\t\tbaselinesByDocumentOid[oid]?.length ?? 0,\n\t\t\t\t\t'baselines',\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.log(\n\t\t\t\t\t'debug',\n\t\t\t\t\t'Could not add data to cache for',\n\t\t\t\t\toid,\n\t\t\t\t\t'because it is not open',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn allDocumentOids;\n\t};\n\n\taddData = async ({\n\t\toperations,\n\t\tbaselines,\n\t\treset,\n\t}: {\n\t\toperations: Operation[];\n\t\tbaselines: DocumentBaseline[];\n\t\treset?: boolean;\n\t}) => {\n\t\tif (this._disposed) {\n\t\t\tthis.log('warn', 'EntityStore is disposed, not adding data');\n\t\t\treturn;\n\t\t}\n\t\t// convert operations to tagged operations with confirmed = false\n\t\t// while we process and store them. this is in-place so as to\n\t\t// not allocate a bunch of objects...\n\t\tconst taggedOperations = operations as TaggedOperation[];\n\t\tfor (const op of taggedOperations) {\n\t\t\top.confirmed = false;\n\t\t}\n\n\t\tlet allDocumentOids: string[] = [];\n\t\t// in a reset scenario, it only makes things confusing if we\n\t\t// optimistically apply incoming operations, since the local\n\t\t// history is out of sync\n\t\tif (reset) {\n\t\t\tthis.log(\n\t\t\t\t'Resetting local store to replicate remote synced data',\n\t\t\t\tbaselines.length,\n\t\t\t\t'baselines, and',\n\t\t\t\toperations.length,\n\t\t\t\t'operations',\n\t\t\t);\n\t\t\tawait this.meta.reset();\n\t\t\tawait this.resetStoredDocuments();\n\t\t\tallDocumentOids = Array.from(\n\t\t\t\tnew Set(\n\t\t\t\t\tbaselines\n\t\t\t\t\t\t.map((b) => getOidRoot(b.oid))\n\t\t\t\t\t\t.concat(operations.map((o) => getOidRoot(o.oid))),\n\t\t\t\t),\n\t\t\t);\n\t\t} else {\n\t\t\t// first, synchronously add data to any open caches for immediate change propagation\n\t\t\tallDocumentOids = this.addDataToOpenCaches({\n\t\t\t\toperations: taggedOperations,\n\t\t\t\tbaselines,\n\t\t\t\treset,\n\t\t\t});\n\t\t}\n\n\t\t// then, asynchronously add data to storage\n\t\tawait this.meta.insertRemoteBaselines(baselines);\n\t\tawait this.meta.insertRemoteOperations(operations);\n\n\t\tif (reset) {\n\t\t\tawait this.refreshAllCaches(true, true);\n\t\t}\n\n\t\t// recompute all affected documents for querying\n\t\tfor (const oid of allDocumentOids) {\n\t\t\tawait this.writeDocumentToStorage(oid);\n\t\t}\n\n\t\t// notify active queries\n\t\tconst affectedCollections = Array.from(\n\t\t\tnew Set<string>(\n\t\t\t\tallDocumentOids.map((oid) => decomposeOid(oid).collection),\n\t\t\t),\n\t\t);\n\t\tthis.context.log('changes to collections', affectedCollections);\n\t\tthis.context.entityEvents.emit('collectionsChanged', affectedCollections);\n\t};\n\n\taddLocalOperations = async (operations: Operation[]) => {\n\t\tthis.log('Adding local operations', operations.length);\n\t\tthis.addOperationsToOpenCaches(operations, {\n\t\t\tisLocal: true,\n\t\t\tconfirmed: false,\n\t\t});\n\t\tthis.operationBatcher.add({\n\t\t\tkey: this.currentBatchKey,\n\t\t\titems: operations,\n\t\t});\n\t};\n\n\tbatch = ({\n\t\tundoable = true,\n\t\tbatchName = generateId(),\n\t\tmax = null,\n\t\ttimeout = this.defaultBatchTimeout,\n\t}: {\n\t\tundoable?: boolean;\n\t\tbatchName?: string;\n\t\tmax?: number | null;\n\t\ttimeout?: number | null;\n\t} = {}): OperationBatch => {\n\t\tconst internalBatch = this.operationBatcher.add({\n\t\t\tkey: batchName,\n\t\t\tmax,\n\t\t\ttimeout,\n\t\t\titems: [],\n\t\t\tuserData: { undoable },\n\t\t});\n\t\tconst externalApi: OperationBatch = {\n\t\t\trun: (fn: () => void) => {\n\t\t\t\t// while the provided function runs, operations are forwarded\n\t\t\t\t// to the new batch instead of default. this relies on the function\n\t\t\t\t// being synchronous.\n\t\t\t\tthis.currentBatchKey = batchName;\n\t\t\t\tfn();\n\t\t\t\tthis.currentBatchKey = DEFAULT_BATCH_KEY;\n\t\t\t\treturn externalApi;\n\t\t\t},\n\t\t\tflush: async () => {\n\t\t\t\t// before running a batch, the default operations must be flushed\n\t\t\t\t// this better preserves undo history behavior...\n\t\t\t\t// if we left the default batch open while flushing a named batch,\n\t\t\t\t// then the default batch would be flushed after the named batch,\n\t\t\t\t// and the default batch could contain operations both prior and\n\t\t\t\t// after the named batch. this would result in a confusing undo\n\t\t\t\t// history where the first undo might reverse changes before and\n\t\t\t\t// after a set of other changes.\n\t\t\t\tawait this.operationBatcher.flush(DEFAULT_BATCH_KEY);\n\t\t\t\treturn internalBatch.flush();\n\t\t\t},\n\t\t\tdiscard: () => {\n\t\t\t\tthis.operationBatcher.discard(batchName);\n\t\t\t},\n\t\t};\n\t\treturn externalApi;\n\t};\n\n\t/**\n\t * @deprecated use `batch` instead\n\t */\n\tflushPatches = async () => {\n\t\tawait this.operationBatcher.flush(this.currentBatchKey);\n\t};\n\n\tflushAllBatches = async () => {\n\t\tawait Promise.all(this.operationBatcher.flushAll());\n\t};\n\n\tprivate flushOperations = async (\n\t\toperations: Operation[],\n\t\tbatchKey: string,\n\t\tmeta: { undoable?: boolean },\n\t) => {\n\t\tif (!operations.length) return;\n\n\t\tthis.log('Flushing operations', operations.length, 'to storage / sync');\n\t\t// rewrite timestamps of all operations to now - this preserves\n\t\t// the linear history of operations which are sent to the server.\n\t\t// even if multiple batches are spun up in parallel and flushed\n\t\t// after delay, the final operations in each one should reflect\n\t\t// when the batch flushed, not when the changes were made.\n\t\t// This also corresponds to user-observed behavior, since unconfirmed\n\t\t// operations are applied universally after confirmed operations locally,\n\t\t// so even operations which were made before a remote operation but\n\t\t// have not been confirmed yet will appear to come after the remote one\n\t\t// despite the provisional timestamp being earlier (see DocumentFamilyCache#computeView)\n\t\tfor (const op of operations) {\n\t\t\top.timestamp = this.meta.now;\n\t\t}\n\t\tawait this.submitOperations(operations, meta);\n\t};\n\n\tprivate submitOperations = async (\n\t\toperations: Operation[],\n\t\t{ undoable = true }: { undoable?: boolean } = {},\n\t) => {\n\t\tif (undoable) {\n\t\t\t// FIXME: this is too slow and needs to be optimized.\n\t\t\tthis.undoHistory.addUndo(await this.createUndo(operations));\n\t\t}\n\t\tawait this.meta.insertLocalOperation(operations);\n\n\t\t// confirm the operations\n\t\tthis.addDataToOpenCaches({ operations, baselines: [] });\n\n\t\t// recompute all affected documents for querying\n\t\tconst allDocumentOids = Array.from(\n\t\t\tnew Set(operations.map((op) => getOidRoot(op.oid))),\n\t\t);\n\t\tfor (const oid of allDocumentOids) {\n\t\t\tawait this.writeDocumentToStorage(oid);\n\t\t}\n\n\t\t// TODO: find a more efficient and straightforward way to update affected\n\t\t// queries. Move to Metadata?\n\t\tconst affectedCollections = new Set(\n\t\t\toperations.map(({ oid }) => decomposeOid(oid).collection),\n\t\t);\n\t\tthis.context.log('changes to collections', affectedCollections);\n\t\tthis.context.entityEvents.emit(\n\t\t\t'collectionsChanged',\n\t\t\tArray.from(affectedCollections),\n\t\t);\n\t};\n\n\tprivate getInverseOperations = async (ops: Operation[]) => {\n\t\tconst grouped = groupPatchesByIdentifier(ops);\n\t\tconst inverseOps: Operation[] = [];\n\t\tconst getNow = () => this.meta.now;\n\t\tfor (const [oid, patches] of Object.entries(grouped)) {\n\t\t\tconst familyCache = await this.openFamilyCache(oid);\n\t\t\tlet { view, deleted } = familyCache.computeConfirmedView(oid);\n\t\t\tconst inverse = getUndoOperations(oid, view, patches, getNow);\n\t\t\tinverseOps.unshift(...inverse);\n\t\t}\n\t\treturn inverseOps;\n\t};\n\n\tprivate createUndo = async (ops: Operation[]) => {\n\t\tconst inverseOps = await this.getInverseOperations(ops);\n\t\treturn async () => {\n\t\t\tconst redo = await this.createUndo(inverseOps);\n\t\t\tawait this.submitOperations(\n\t\t\t\tinverseOps.map((op) => {\n\t\t\t\t\top.timestamp = this.meta.now;\n\t\t\t\t\treturn op;\n\t\t\t\t}),\n\t\t\t\t// undos should not generate their own undo operations\n\t\t\t\t// since they already calculate redo as the inverse.\n\t\t\t\t{ undoable: false },\n\t\t\t);\n\t\t\treturn redo;\n\t\t};\n\t};\n\n\tdelete = async (oid: ObjectIdentifier, options?: { undoable?: boolean }) => {\n\t\tassert(\n\t\t\toid === getOidRoot(oid),\n\t\t\t'Only root documents may be deleted via client methods',\n\t\t);\n\t\t// we need to get all sub-object oids to delete alongside the root\n\t\tconst allOids = await this.meta.getAllDocumentRelatedOids(oid);\n\t\tconst patches = this.meta.patchCreator.createDeleteAll(allOids);\n\t\t// don't enqueue these, submit as distinct operation\n\t\tawait this.submitOperations(patches, options);\n\t};\n\n\tdeleteAll = async (\n\t\toids: ObjectIdentifier[],\n\t\toptions?: { undoable?: boolean },\n\t) => {\n\t\tconst allOids = await Promise.all(\n\t\t\toids.map((oid) => this.meta.getAllDocumentRelatedOids(oid)),\n\t\t);\n\t\tconst patches = this.meta.patchCreator.createDeleteAll(allOids.flat());\n\t\t// don't enqueue these, submit as distinct operation\n\t\tawait this.submitOperations(patches, options);\n\t};\n\n\treset = async () => {\n\t\tthis.context.log('warn', 'Resetting local database');\n\t\tawait this.resetStoredDocuments();\n\t\tawait this.refreshAllCaches(true);\n\t\t// this.context.entityEvents.emit(\n\t\t// \t'collectionsChanged',\n\t\t// \tObject.keys(this.schema.collections),\n\t\t// );\n\t};\n\n\tdestroy = async () => {\n\t\tthis._disposed = true;\n\t\tfor (const unsubscribe of this.unsubscribes) {\n\t\t\tunsubscribe();\n\t\t}\n\t\tfor (const cache of this.documentFamilyCaches.values()) {\n\t\t\tcache.dispose();\n\t\t}\n\t\tthis.documentFamilyCaches.clear();\n\t\tawait this.flushAllBatches();\n\t};\n\n\tprivate handleRebase = (baselines: DocumentBaseline[]) => {\n\t\tthis.log('debug', 'Reacting to rebases', baselines.length);\n\t\t// update any open caches with new baseline. this will automatically\n\t\t// drop operations before the baseline.\n\t\tthis.addBaselinesToOpenCaches(baselines, { isLocal: true });\n\t};\n\n\tprivate resetStoredDocuments = async () => {\n\t\tconst tx = this.db.transaction(\n\t\t\tObject.keys(this.schema.collections),\n\t\t\t'readwrite',\n\t\t);\n\t\tfor (const collection of Object.keys(this.schema.collections)) {\n\t\t\tconst store = tx.objectStore(collection);\n\t\t\tawait storeRequestPromise(store.clear());\n\t\t}\n\t};\n\n\tprivate refreshAllCaches = async (\n\t\tdropUnconfirmed = false,\n\t\tdropAll = false,\n\t) => {\n\t\tfor (const [_, cache] of this.documentFamilyCaches) {\n\t\t\tawait this.refreshFamilyCache(cache, dropUnconfirmed, dropAll);\n\t\t}\n\t};\n}\n", "import {\n\tServerMessage,\n\tEventSubscriber,\n\tBatcher,\n\tBatch,\n} from '@verdant-web/common';\nimport type { UserInfo } from '../index.js';\nimport { LocalReplicaInfo } from '../metadata/LocalReplicaStore.js';\n\nexport const HANDLE_MESSAGE = Symbol('handleMessage');\n\nexport class PresenceManager<\n\tProfile = any,\n\tPresence = any,\n> extends EventSubscriber<{\n\tpeerChanged: (userId: string, presence: UserInfo<Profile, Presence>) => void;\n\tselfChanged: (presence: UserInfo<Profile, Presence>) => void;\n\tpeersChanged: (peers: Record<string, any>) => void;\n\tpeerLeft: (userId: string, lastPresence: UserInfo<Profile, Presence>) => void;\n\tupdate: (presence: Partial<Presence>) => void;\n}> {\n\tprivate _peers = {} as Record<string, UserInfo<Profile, Presence>>;\n\tprivate _self = { profile: {} } as UserInfo<Profile, Presence>;\n\t// keep track of own replica IDs - applications may care if we're \"alone\" but with multiple devices.\n\tprivate _selfReplicaIds = new Set<string>();\n\tprivate _peerIds = new Array<string>();\n\tprivate _updateBatcher;\n\tprivate _updateBatch: Batch<Partial<Presence>>;\n\n\tget self() {\n\t\treturn this._self;\n\t}\n\n\tget peers() {\n\t\treturn this._peers;\n\t}\n\n\tget peerIds() {\n\t\treturn this._peerIds;\n\t}\n\n\tget everyone() {\n\t\tconst everyone = { ...this._peers };\n\t\teveryone[this.self.id] = this.self;\n\t\treturn everyone;\n\t}\n\n\tget selfReplicaIds() {\n\t\treturn this._selfReplicaIds;\n\t}\n\n\tconstructor({\n\t\tinitialPresence,\n\t\tupdateBatchTimeout = 200,\n\t\tdefaultProfile,\n\t}: {\n\t\tinitialPresence: Presence;\n\t\tdefaultProfile: Profile;\n\t\tupdateBatchTimeout?: number;\n\t}) {\n\t\tsuper();\n\t\tthis.self.presence = initialPresence;\n\t\tthis.self.profile = defaultProfile;\n\n\t\tthis._updateBatcher = new Batcher(this.flushPresenceUpdates);\n\t\tthis._updateBatch = this._updateBatcher.add({\n\t\t\tmax: 25,\n\t\t\ttimeout: updateBatchTimeout,\n\t\t\titems: [],\n\t\t\tkey: 'default',\n\t\t});\n\t}\n\n\t/**\n\t * Decides if an update is for the local user or not. Even if it's a different replica\n\t * than the local one.\n\t *\n\t * If the replicaId matches, we use that first - we may not know the local replica's User ID yet,\n\t * e.g. on the first presence update.\n\t *\n\t * Otherwise, match the user ID to our local copy.\n\t */\n\tprivate isSelf = (\n\t\tlocalReplicaInfo: LocalReplicaInfo,\n\t\tuserInfo: UserInfo<Profile, Presence>,\n\t) => {\n\t\treturn (\n\t\t\tlocalReplicaInfo.id === userInfo.replicaId ||\n\t\t\tthis._selfReplicaIds.has(userInfo.replicaId) ||\n\t\t\tthis._self.id === userInfo.id\n\t\t);\n\t};\n\n\t[HANDLE_MESSAGE] = async (\n\t\tlocalReplicaInfo: LocalReplicaInfo,\n\t\tmessage: ServerMessage,\n\t) => {\n\t\tlet peersChanged = false;\n\t\tconst peerIdsSet = new Set<string>(this.peerIds);\n\n\t\tif (message.type === 'presence-changed') {\n\t\t\tif (this.isSelf(localReplicaInfo, message.userInfo)) {\n\t\t\t\tthis._self = message.userInfo;\n\t\t\t\tthis._selfReplicaIds.add(message.userInfo.replicaId);\n\t\t\t\tthis.emit('selfChanged', message.userInfo);\n\t\t\t} else {\n\t\t\t\tpeerIdsSet.add(message.userInfo.id);\n\t\t\t\tthis._peers[message.userInfo.id] = message.userInfo;\n\t\t\t\tpeersChanged = true;\n\t\t\t\tthis.emit('peerChanged', message.userInfo.id, message.userInfo);\n\t\t\t}\n\t\t} else if (message.type === 'sync-resp') {\n\t\t\t// reset to provided presence data, which includes all peers.\n\t\t\tthis._peers = {};\n\t\t\tpeerIdsSet.clear();\n\n\t\t\tfor (const [id, userInfo] of Object.entries(message.peerPresence)) {\n\t\t\t\tif (this.isSelf(localReplicaInfo, userInfo)) {\n\t\t\t\t\tthis._self = userInfo;\n\t\t\t\t\tthis._selfReplicaIds.add(userInfo.replicaId);\n\t\t\t\t\tthis.emit('selfChanged', userInfo);\n\t\t\t\t} else {\n\t\t\t\t\tpeersChanged = true;\n\t\t\t\t\tpeerIdsSet.add(id);\n\t\t\t\t\tthis._peers[id] = userInfo;\n\t\t\t\t\tthis.emit('peerChanged', id, userInfo);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (message.type === 'presence-offline') {\n\t\t\tpeerIdsSet.delete(message.userId);\n\t\t\tthis._selfReplicaIds.delete(message.replicaId);\n\t\t\tconst lastPresence = this._peers[message.userId];\n\t\t\tdelete this._peers[message.userId];\n\t\t\tpeersChanged = true;\n\t\t\tthis.emit('peerLeft', message.userId, lastPresence);\n\t\t}\n\t\tif (peersChanged) {\n\t\t\tthis._peerIds = Array.from(peerIdsSet);\n\t\t\tthis.emit('peersChanged', this._peers);\n\t\t}\n\t};\n\n\tupdate = async (presence: Partial<Presence>) => {\n\t\tthis._updateBatch.update({\n\t\t\titems: [presence],\n\t\t});\n\t\t// proactively update the local presence\n\t\tthis.self.presence = { ...this.self.presence, ...presence };\n\t\tthis.emit('selfChanged', this.self);\n\t};\n\n\tflushPresenceUpdates = (presenceUpdates: Partial<Presence>[]) => {\n\t\tconst presence = presenceUpdates.reduce((acc, update) => {\n\t\t\treturn { ...acc, ...update };\n\t\t}, this.self.presence);\n\t\tthis.emit('update', presence);\n\t};\n}\n", "import { FileData } from '@verdant-web/common';\nimport { ServerSyncEndpointProvider } from './ServerSyncEndpointProvider.js';\n\nexport interface FileUploadResult {\n\tsuccess: boolean;\n\tretry: boolean;\n}\n\nexport type FilePullResult =\n\t| {\n\t\t\tsuccess: true;\n\t\t\tdata: FileData;\n\t }\n\t| {\n\t\t\tsuccess: false;\n\t\t\tretry: boolean;\n\t };\n\nexport class FileSync {\n\tprivate endpointProvider: ServerSyncEndpointProvider;\n\tprivate log: (...args: any[]) => any;\n\n\tconstructor({\n\t\tendpointProvider,\n\t\tlog,\n\t}: {\n\t\tendpointProvider: ServerSyncEndpointProvider;\n\t\tlog: (...args: any[]) => any;\n\t}) {\n\t\tthis.endpointProvider = endpointProvider;\n\t\tthis.log = log;\n\t}\n\n\tuploadFile = async (data: FileData): Promise<FileUploadResult> => {\n\t\tconst file = data.file;\n\n\t\tif (!file) {\n\t\t\tthrow new Error('Cannot upload a non-local file');\n\t\t}\n\n\t\t// multipart upload\n\t\tconst { files: fileEndpoint, token } =\n\t\t\tawait this.endpointProvider.getEndpoints();\n\n\t\tconst formData = new window.FormData();\n\t\tformData.append('file', file);\n\n\t\ttry {\n\t\t\tconst response = await fetch(fileEndpoint + `/${data.id}`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: formData,\n\t\t\t\tcredentials: 'include',\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Bearer ${token}`,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (response.ok) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tretry: false,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tthis.log(\n\t\t\t\t\t'error',\n\t\t\t\t\t'File upload failed',\n\t\t\t\t\tresponse.status,\n\t\t\t\t\tawait response.text(),\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tretry: response.status >= 500,\n\t\t\t\t};\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.log('error', 'File upload failed', e);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tretry: true,\n\t\t\t};\n\t\t}\n\t};\n\n\tgetFile = async (id: string): Promise<FilePullResult> => {\n\t\tconst { files: fileEndpoint, token } =\n\t\t\tawait this.endpointProvider.getEndpoints();\n\n\t\ttry {\n\t\t\tconst response = await fetch(fileEndpoint + `/${id}`, {\n\t\t\t\tmethod: 'GET',\n\t\t\t\tcredentials: 'include',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${token}`,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (response.ok) {\n\t\t\t\tconst data = await response.json();\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tdata,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tthis.log(\n\t\t\t\t\t'error',\n\t\t\t\t\t'File information fetch failed',\n\t\t\t\t\tresponse.status,\n\t\t\t\t\tawait response.text(),\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tretry: response.status >= 500 || response.status === 404,\n\t\t\t\t};\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.log('error', 'File information fetch failed', e);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tretry: true,\n\t\t\t};\n\t\t}\n\t};\n}\n", "import { EventSubscriber } from '@verdant-web/common';\n\nexport class Heartbeat extends EventSubscriber<{\n\tmissed: () => void;\n\tbeat: () => void;\n}> {\n\tprivate _interval: number;\n\tprivate deadlineLength: number;\n\tprivate nextBeat: NodeJS.Timeout | null = null;\n\tprivate deadline: NodeJS.Timeout | null = null;\n\n\tget interval() {\n\t\treturn this._interval;\n\t}\n\n\tconstructor({\n\t\tinterval = 15 * 1000,\n\t\tdeadlineLength = 3 * 1000,\n\t\trestartOnTabFocus = true,\n\t}: {\n\t\tinterval?: number;\n\t\tdeadlineLength?: number;\n\t\trestartOnTabFocus?: boolean;\n\t} = {}) {\n\t\tsuper();\n\t\tthis._interval = interval;\n\t\tthis.deadlineLength = deadlineLength;\n\t\tif (typeof window !== 'undefined' && restartOnTabFocus) {\n\t\t\twindow.addEventListener('pageshow', () => this.start(true));\n\t\t}\n\t}\n\n\tkeepAlive = () => {\n\t\tif (this.deadline) {\n\t\t\tclearTimeout(this.deadline);\n\t\t\tthis.deadline = null;\n\t\t\tthis.start();\n\t\t}\n\t};\n\n\tstart = (immediate = false) => {\n\t\tthis.stop();\n\t\tif (immediate) {\n\t\t\tthis.beat();\n\t\t} else {\n\t\t\tthis.nextBeat = setTimeout(this.beat, this._interval);\n\t\t}\n\t};\n\n\tstop = () => {\n\t\tif (this.nextBeat) {\n\t\t\tclearTimeout(this.nextBeat);\n\t\t}\n\t\tif (this.deadline) {\n\t\t\tclearTimeout(this.deadline);\n\t\t}\n\t};\n\n\tprivate beat = async () => {\n\t\tthis.emit('beat');\n\t\tthis.deadline = setTimeout(this.onDeadline, this.deadlineLength);\n\t};\n\n\tprivate onDeadline = () => {\n\t\tthis.deadline = null;\n\t\tthis.emit('missed');\n\t};\n\n\t/**\n\t * Only takes affect after the next beat\n\t */\n\tsetInterval = (interval: number) => {\n\t\tthis._interval = interval;\n\t};\n}\n", "import {\n\tClientMessage,\n\tEventSubscriber,\n\tServerMessage,\n} from '@verdant-web/common';\nimport { Metadata } from '../metadata/Metadata.js';\nimport { PresenceManager } from './PresenceManager.js';\nimport { Heartbeat } from './Heartbeat.js';\nimport { ServerSyncEndpointProvider } from './ServerSyncEndpointProvider.js';\nimport { SyncTransport, SyncTransportEvents } from './Sync.js';\n\nexport class PushPullSync\n\textends EventSubscriber<SyncTransportEvents>\n\timplements SyncTransport\n{\n\treadonly meta: Metadata;\n\treadonly presence: PresenceManager;\n\tprivate endpointProvider;\n\tprivate heartbeat;\n\n\treadonly mode = 'pull';\n\tprivate log;\n\n\tprivate _isConnected = false;\n\tprivate _status: 'active' | 'paused' = 'paused';\n\tprivate _hasSynced = false;\n\n\tconstructor({\n\t\tendpointProvider,\n\t\tmeta,\n\t\tpresence,\n\t\tinterval = 15 * 1000,\n\t\tlog = () => {},\n\t}: {\n\t\tendpointProvider: ServerSyncEndpointProvider;\n\t\tmeta: Metadata;\n\t\tpresence: PresenceManager;\n\t\tinterval?: number;\n\t\tlog?: (...args: any[]) => any;\n\t}) {\n\t\tsuper();\n\t\tthis.log = log;\n\t\tthis.meta = meta;\n\t\tthis.presence = presence;\n\t\tthis.endpointProvider = endpointProvider;\n\n\t\tthis.heartbeat = new Heartbeat({\n\t\t\tinterval,\n\t\t});\n\t\tthis.heartbeat.subscribe('beat', this.onHeartbeat);\n\t\tthis.heartbeat.subscribe('missed', this.onHeartbeatMissed);\n\t}\n\n\tsetInterval = (interval: number) => {\n\t\tthis.heartbeat.setInterval(interval);\n\t};\n\n\tget interval() {\n\t\treturn this.heartbeat.interval;\n\t}\n\n\tprivate sendRequest = async (messages: ClientMessage[]) => {\n\t\tthis.log('Sending sync request', messages);\n\t\ttry {\n\t\t\tconst { http: host, token } = await this.endpointProvider.getEndpoints();\n\t\t\tconst response = await fetch(host, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${token}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tmessages,\n\t\t\t\t}),\n\t\t\t\tcredentials: 'include',\n\t\t\t});\n\t\t\tif (response.ok) {\n\t\t\t\tthis.heartbeat.keepAlive();\n\t\t\t\tconst json = (await response.json()) as {\n\t\t\t\t\tmessages: ServerMessage[];\n\t\t\t\t};\n\t\t\t\tfor (const message of json.messages) {\n\t\t\t\t\tthis.handleServerMessage(message);\n\t\t\t\t}\n\t\t\t\tif (!this._isConnected) {\n\t\t\t\t\tthis._isConnected = true;\n\t\t\t\t\tthis.emit('onlineChange', true);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.log('Sync request failed', response.status, await response.text());\n\n\t\t\t\tif (this._isConnected) {\n\t\t\t\t\tthis._isConnected = false;\n\t\t\t\t\tthis.emit('onlineChange', false);\n\t\t\t\t}\n\n\t\t\t\t// only keep trying if the error was not 4xx\n\t\t\t\tif (response.status >= 500) {\n\t\t\t\t\tthis.heartbeat.keepAlive();\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (this._isConnected) {\n\t\t\t\tthis._isConnected = false;\n\t\t\t\tthis.emit('onlineChange', false);\n\t\t\t}\n\t\t\tthis.log(error);\n\n\t\t\tthis.heartbeat.keepAlive();\n\t\t}\n\t};\n\n\tprivate handleServerMessage = async (message: ServerMessage) => {\n\t\tif (message.type === 'sync-resp') {\n\t\t\tif (message.ackThisNonce) {\n\t\t\t\t// we need to ack the nonce to confirm that we received the sync-resp\n\t\t\t\tthis.log('Sending sync ack', message.ackThisNonce);\n\t\t\t\tthis.sendRequest([\n\t\t\t\t\tawait this.meta.messageCreator.createAck(message.ackThisNonce),\n\t\t\t\t]);\n\t\t\t}\n\t\t\t// but we can go ahead and preemptively allow ops to be sent\n\t\t\tthis._hasSynced = true;\n\t\t}\n\t\tthis.emit('message', message);\n\t};\n\n\tsend = (message: ClientMessage) => {\n\t\t// only certain messages are sent for pull-based sync.\n\t\tswitch (message.type) {\n\t\t\tcase 'presence-update':\n\t\t\tcase 'sync':\n\t\t\tcase 'heartbeat':\n\t\t\t\treturn this.sendRequest([message]);\n\t\t\tcase 'op':\n\t\t\t\tif (this._hasSynced) {\n\t\t\t\t\treturn this.sendRequest([message]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tstart(): void {\n\t\tif (this.status === 'active') {\n\t\t\treturn;\n\t\t}\n\t\tthis.heartbeat.start(true);\n\t\tthis._status = 'active';\n\t}\n\tstop(): void {\n\t\tthis.heartbeat.stop();\n\t\tthis._status = 'paused';\n\t}\n\n\tdispose = () => {};\n\treconnect(): void {\n\t\tthis.heartbeat.start(true);\n\t}\n\n\t// on a heartbeat, do a sync\n\tprivate onHeartbeat = async () => {\n\t\t// for HTTP sync we send presence first, so that the sync-resp message\n\t\t// will include the client's own presence info and fill in missing profile\n\t\t// data on the first request. otherwise it would have to wait for the second.\n\t\tthis.sendRequest([\n\t\t\tawait this.meta.messageCreator.createPresenceUpdate(\n\t\t\t\tthis.presence.self.presence,\n\t\t\t),\n\t\t\tawait this.meta.messageCreator.createSyncStep1(),\n\t\t]);\n\t};\n\n\t// if the server fails to respond in a certain amount of time, we assume\n\t// the connection is lost and go offline.\n\tprivate onHeartbeatMissed = async () => {\n\t\tthis.emit('onlineChange', false);\n\t\tthis.log('Missed heartbeat');\n\t\tthis._isConnected = false;\n\t};\n\n\tget isConnected(): boolean {\n\t\treturn this._isConnected;\n\t}\n\tget status() {\n\t\treturn this._status;\n\t}\n}\n", "/**\n * The code was extracted from:\n * https://github.com/davidchambers/Base64.js\n */\n\nvar chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\nfunction InvalidCharacterError(message) {\n this.message = message;\n}\n\nInvalidCharacterError.prototype = new Error();\nInvalidCharacterError.prototype.name = \"InvalidCharacterError\";\n\nfunction polyfill(input) {\n var str = String(input).replace(/=+$/, \"\");\n if (str.length % 4 == 1) {\n throw new InvalidCharacterError(\n \"'atob' failed: The string to be decoded is not correctly encoded.\"\n );\n }\n for (\n // initialize result and counters\n var bc = 0, bs, buffer, idx = 0, output = \"\";\n // get next character\n (buffer = str.charAt(idx++));\n // character found in table? initialize bit storage and add its ascii value;\n ~buffer &&\n ((bs = bc % 4 ? bs * 64 + buffer : buffer),\n // and if not first of each 4 characters,\n // convert the first 8 bits to one ascii character\n bc++ % 4) ?\n (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6)))) :\n 0\n ) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer);\n }\n return output;\n}\n\nexport default (typeof window !== \"undefined\" &&\n window.atob &&\n window.atob.bind(window)) ||\npolyfill;", "import atob from \"./atob\";\n\nfunction b64DecodeUnicode(str) {\n return decodeURIComponent(\n atob(str).replace(/(.)/g, function(m, p) {\n var code = p.charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n })\n );\n}\n\nexport default function(str) {\n var output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n throw \"Illegal base64url string!\";\n }\n\n try {\n return b64DecodeUnicode(output);\n } catch (err) {\n return atob(output);\n }\n}", "\"use strict\";\n\nimport base64_url_decode from \"./base64_url_decode\";\n\nexport function InvalidTokenError(message) {\n this.message = message;\n}\n\nInvalidTokenError.prototype = new Error();\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\n\nexport default function(token, options) {\n if (typeof token !== \"string\") {\n throw new InvalidTokenError(\"Invalid token specified\");\n }\n\n options = options || {};\n var pos = options.header === true ? 0 : 1;\n try {\n return JSON.parse(base64_url_decode(token.split(\".\")[pos]));\n } catch (e) {\n throw new InvalidTokenError(\"Invalid token specified: \" + e.message);\n }\n}", "import { assert, ReplicaType } from '@verdant-web/common';\nimport { default as jwtDecode } from 'jwt-decode';\n\nexport interface ServerSyncEndpointProviderConfig {\n\t/**\n\t * The location of the endpoint used to retrieve an\n\t * authorization token for the client.\n\t */\n\tauthEndpoint?: string;\n\t/**\n\t * A custom fetch function to retrieve authorization\n\t * data.\n\t */\n\tfetchAuth?: () => Promise<{\n\t\taccessToken: string;\n\t}>;\n}\n\nexport class ServerSyncEndpointProvider {\n\tprivate cached = null as {\n\t\thttp: string;\n\t\twebsocket: string;\n\t\tfiles: string;\n\t\ttoken: string;\n\t} | null;\n\ttype: ReplicaType = ReplicaType.Realtime;\n\n\tconstructor(private config: ServerSyncEndpointProviderConfig) {\n\t\tif (!config.authEndpoint && !config.fetchAuth) {\n\t\t\tthrow new Error(\n\t\t\t\t'Either authEndpoint or fetchAuth must be provided to ServerSyncEndpointProvider',\n\t\t\t);\n\t\t}\n\t}\n\n\tgetEndpoints = async () => {\n\t\tif (this.cached) {\n\t\t\treturn this.cached;\n\t\t}\n\n\t\tlet result: { accessToken: string };\n\t\tif (this.config.fetchAuth) {\n\t\t\tresult = await this.config.fetchAuth();\n\t\t} else {\n\t\t\tresult = await fetch(this.config.authEndpoint!, {\n\t\t\t\tcredentials: 'include',\n\t\t\t}).then((res) => {\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Auth endpoint returned non-200 response: ${res.status}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\treturn res.json();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tassert(result.accessToken, 'No access token provided from auth endpoint');\n\t\tconst decoded = (jwtDecode as any)(result.accessToken);\n\t\tassert(decoded.url, 'No sync endpoint provided from auth endpoint');\n\t\tassert(\n\t\t\tdecoded.type !== undefined,\n\t\t\t'No replica type provided from auth endpoint',\n\t\t);\n\t\tthis.type = parseInt(decoded.type + '');\n\t\tconst url = new URL(decoded.url);\n\t\turl.protocol = url.protocol.replace('ws', 'http');\n\t\tconst httpEndpoint = url.toString();\n\t\turl.protocol = url.protocol.replace('http', 'ws');\n\t\tconst websocketEndpoint = url.toString();\n\t\tlet fileEndpoint: string = decoded.file;\n\t\tif (!fileEndpoint) {\n\t\t\t// default to http endpoint + '/files';\n\t\t\tconst fileUrl = new URL(httpEndpoint);\n\t\t\tfileUrl.pathname = fileUrl.pathname + '/files';\n\t\t\tfileEndpoint = fileUrl.toString();\n\t\t}\n\t\tthis.cached = {\n\t\t\thttp: httpEndpoint,\n\t\t\twebsocket: websocketEndpoint,\n\t\t\tfiles: fileEndpoint,\n\t\t\ttoken: result.accessToken,\n\t\t};\n\t\treturn this.cached;\n\t};\n}\n", "import { EventSubscriber } from '@verdant-web/common';\n\nexport class BackoffScheduler extends EventSubscriber<{\n\ttrigger: () => void;\n}> {\n\tprivate readonly backoff: Backoff;\n\tprivate timer: NodeJS.Timeout | null = null;\n\tprivate isScheduled = false;\n\n\tconstructor(backoff: Backoff) {\n\t\tsuper();\n\t\tthis.backoff = backoff;\n\t}\n\n\tnext = () => {\n\t\tif (!this.isScheduled) {\n\t\t\tthis.isScheduled = true;\n\t\t\tthis.timer = setTimeout(() => {\n\t\t\t\tthis.emit('trigger');\n\t\t\t\tthis.isScheduled = false;\n\t\t\t\tthis.backoff.next();\n\t\t\t}, this.backoff.current);\n\t\t}\n\t};\n\n\treset = () => {\n\t\tthis.backoff.reset();\n\t\tif (this.timer) {\n\t\t\tclearTimeout(this.timer);\n\t\t\tthis.timer = null;\n\t\t}\n\t};\n}\n\nexport class Backoff {\n\tcurrent = 0;\n\tprivate readonly max: number;\n\tprivate readonly factor: number;\n\n\tconstructor(max: number, factor: number) {\n\t\tthis.max = max;\n\t\tthis.factor = factor;\n\t}\n\n\tnext = () => {\n\t\tthis.current = Math.min(this.max, this.current * this.factor);\n\t};\n\n\treset = () => {\n\t\tthis.current = 0;\n\t};\n}\n", "import {\n\tClientMessage,\n\tEventSubscriber,\n\tServerMessage,\n} from '@verdant-web/common';\nimport { Backoff, BackoffScheduler } from '../BackoffScheduler.js';\nimport { Metadata } from '../metadata/Metadata.js';\nimport { Heartbeat } from './Heartbeat.js';\nimport { PresenceManager } from './PresenceManager.js';\nimport { ServerSyncEndpointProvider } from './ServerSyncEndpointProvider.js';\nimport { SyncTransport, SyncTransportEvents } from './Sync.js';\n\nexport class WebSocketSync\n\textends EventSubscriber<SyncTransportEvents>\n\timplements SyncTransport\n{\n\tprivate meta: Metadata;\n\treadonly presence: PresenceManager;\n\tprivate socket: WebSocket | null = null;\n\t// messages awaiting websocket connection to send\n\tprivate connectQueue: ClientMessage[] = [];\n\t// messages awaiting sync response to send\n\tprivate syncQueue: ClientMessage[] = [];\n\tprivate endpointProvider;\n\tprivate _status: 'active' | 'paused' = 'paused';\n\tprivate synced = false;\n\tprivate hasStartedSync = false;\n\n\treadonly mode = 'realtime';\n\tprivate log = (...args: any[]) => {};\n\n\tprivate heartbeat = new Heartbeat();\n\n\tprivate reconnectScheduler = new BackoffScheduler(\n\t\tnew Backoff(60 * 1000, 1.5),\n\t);\n\n\tconstructor({\n\t\tendpointProvider,\n\t\tmeta,\n\t\tpresence,\n\t\tlog,\n\t}: {\n\t\tendpointProvider: ServerSyncEndpointProvider;\n\t\tmeta: Metadata;\n\t\tpresence: PresenceManager;\n\t\tlog?: (...args: any[]) => any;\n\t}) {\n\t\tsuper();\n\t\tthis.log = log || this.log;\n\t\tthis.endpointProvider = endpointProvider;\n\t\tthis.meta = meta;\n\t\tthis.presence = presence;\n\n\t\tthis.reconnectScheduler.subscribe('trigger', this.initializeSocket);\n\t\tthis.heartbeat.subscribe('beat', this.sendHeartbeat);\n\t}\n\n\tprivate onOpen = () => {\n\t\tif (!this.socket) {\n\t\t\tthrow new Error('Invalid sync state: online but socket is null');\n\t\t}\n\t\tthis.synced = false;\n\t\tif (this.connectQueue.length) {\n\t\t\tfor (const msg of this.connectQueue) {\n\t\t\t\tthis.log('Sending queued message', JSON.stringify(msg, null, 2));\n\t\t\t\tthis.socket.send(JSON.stringify(msg));\n\t\t\t}\n\t\t\tthis.connectQueue = [];\n\t\t}\n\t\tthis.log('Sync connected');\n\t\tthis.onOnlineChange(true);\n\t\tthis.reconnectScheduler.reset();\n\t};\n\n\tprivate onOnlineChange = async (online: boolean) => {\n\t\tthis.log('Socket online change', online);\n\t\tif (!online) {\n\t\t\tthis.hasStartedSync = false;\n\t\t\tthis.synced = false;\n\t\t\tthis.heartbeat.stop();\n\t\t} else {\n\t\t\tthis.log('Starting sync');\n\t\t\tthis.hasStartedSync = true;\n\t\t\tthis.synced = false;\n\t\t\tthis.send(\n\t\t\t\tawait this.meta.messageCreator.createPresenceUpdate(\n\t\t\t\t\tthis.presence.self.presence,\n\t\t\t\t),\n\t\t\t);\n\t\t\tthis.send(await this.meta.messageCreator.createSyncStep1());\n\t\t\tthis.heartbeat.start();\n\t\t}\n\t\tthis.emit('onlineChange', online);\n\t};\n\n\tprivate onMessage = async (event: MessageEvent) => {\n\t\tconst message = JSON.parse(event.data) as ServerMessage;\n\t\tswitch (message.type) {\n\t\t\tcase 'sync-resp':\n\t\t\t\tif (message.ackThisNonce) {\n\t\t\t\t\t// we need to send the ack to confirm we got the response\n\t\t\t\t\tthis.send(\n\t\t\t\t\t\tawait this.meta.messageCreator.createAck(message.ackThisNonce),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.hasStartedSync = true;\n\t\t\t\tthis.synced = true;\n\t\t\t\tif (this.syncQueue.length) {\n\t\t\t\t\tfor (const msg of this.syncQueue) {\n\t\t\t\t\t\tthis.send(msg);\n\t\t\t\t\t}\n\t\t\t\t\tthis.syncQueue = [];\n\t\t\t\t}\n\t\t\tcase 'need-since':\n\t\t\tcase 'presence-changed':\n\t\t\tcase 'presence-offline':\n\t\t\t\tthis.emit('message', message);\n\t\t\t\tbreak;\n\t\t\tcase 'op-re':\n\t\t\t\tif (!this.hasStartedSync) {\n\t\t\t\t\tthis.log(\n\t\t\t\t\t\t`Skipping op-re message because sync hasn't started yet`,\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tthis.emit('message', message);\n\t\t\t\tbreak;\n\t\t\tcase 'heartbeat-response':\n\t\t\t\tthis.heartbeat.keepAlive();\n\t\t\t\tthis.emit('message', message);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif (this.synced) {\n\t\t\t\t\tthis.emit('message', message);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tprivate onError = (event: Event) => {\n\t\tthis.log(event);\n\t\tthis.reconnectScheduler.next();\n\n\t\tthis.log(`Attempting reconnect to websocket sync`);\n\t};\n\n\tprivate onClose = (event: CloseEvent) => {\n\t\tthis.log('Sync disconnected');\n\t\tthis.onOnlineChange(false);\n\t\tthis.onError(event);\n\t};\n\n\tprivate initializeSocket = async () => {\n\t\tconst endpoint = await this.endpointProvider.getEndpoints();\n\t\t// abusing protocols to pass the auth token\n\t\tthis.socket = new WebSocket(endpoint.websocket, ['Bearer', endpoint.token]);\n\t\tthis.socket.addEventListener('message', this.onMessage);\n\t\tthis.socket.addEventListener('open', this.onOpen);\n\t\tthis.socket.addEventListener('error', this.onError);\n\t\tthis.socket.addEventListener('close', this.onClose);\n\t\treturn this.socket;\n\t};\n\n\tprivate sendHeartbeat = async () => {\n\t\tthis.send(await this.meta.messageCreator.createHeartbeat());\n\t};\n\n\treconnect = () => {\n\t\tthis.stop();\n\t\tthis.start();\n\t};\n\n\tprivate canSkipSyncWait = (message: ClientMessage) => {\n\t\treturn (\n\t\t\tmessage.type === 'sync' ||\n\t\t\tmessage.type === 'presence-update' ||\n\t\t\tmessage.type === 'sync-ack' ||\n\t\t\tmessage.type === 'heartbeat'\n\t\t);\n\t};\n\n\tsend = (message: ClientMessage) => {\n\t\tif (this.status !== 'active') return;\n\n\t\t// wait until a sync has started before doing anything other than sync.\n\t\t// new \"op\" messages can arrive before sync has started, so we need to wait\n\t\tif (!this.hasStartedSync && !this.canSkipSyncWait(message)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.canSkipSyncWait(message)) {\n\t\t\tif (this.socket?.readyState === WebSocket.OPEN) {\n\t\t\t\tthis.log('Sending message', JSON.stringify(message, null, 2));\n\t\t\t\tthis.socket!.send(JSON.stringify(message));\n\t\t\t} else {\n\t\t\t\tthis.log(\n\t\t\t\t\t'Enqueueing message until socket is open',\n\t\t\t\t\tJSON.stringify(message, null, 2),\n\t\t\t\t);\n\t\t\t\tthis.connectQueue.push(message);\n\t\t\t}\n\t\t} else if (this.synced) {\n\t\t\tif (this.socket?.readyState === WebSocket.OPEN) {\n\t\t\t\tthis.log('Sending message', JSON.stringify(message, null, 2));\n\t\t\t\tthis.socket.send(JSON.stringify(message));\n\t\t\t}\n\t\t} else if (this.hasStartedSync) {\n\t\t\tthis.log(\n\t\t\t\t'Enqueueing message until synced',\n\t\t\t\tJSON.stringify(message, null, 2),\n\t\t\t);\n\t\t\tthis.syncQueue.push(message);\n\t\t}\n\t};\n\n\tdispose = () => {\n\t\tthis.socket?.removeEventListener('message', this.onMessage);\n\t\tthis.socket?.removeEventListener('close', this.onClose);\n\t\tthis.socket?.close();\n\t};\n\n\tstart = () => {\n\t\tif (this.socket) {\n\t\t\treturn;\n\t\t}\n\t\tthis.initializeSocket();\n\t\tthis._status = 'active';\n\t};\n\n\tstop = () => {\n\t\tthis.dispose();\n\t\tthis.socket = null;\n\t\tthis._status = 'paused';\n\t};\n\n\tget isConnected() {\n\t\treturn this.socket?.readyState === WebSocket.OPEN;\n\t}\n\n\tget status() {\n\t\treturn this._status;\n\t}\n}\n", "import {\n\tClientMessage,\n\tDocumentBaseline,\n\tEventSubscriber,\n\tFileData,\n\tOperation,\n\tReplicaType,\n\tServerMessage,\n} from '@verdant-web/common';\nimport { Metadata } from '../metadata/Metadata.js';\nimport { HANDLE_MESSAGE, PresenceManager } from './PresenceManager.js';\nimport { FilePullResult, FileSync, FileUploadResult } from './FileSync.js';\nimport { PushPullSync } from './PushPullSync.js';\nimport {\n\tServerSyncEndpointProvider,\n\tServerSyncEndpointProviderConfig,\n} from './ServerSyncEndpointProvider.js';\nimport { WebSocketSync } from './WebSocketSync.js';\n\ntype SyncEvents = {\n\tonlineChange: (isOnline: boolean) => void;\n};\n\nexport type SyncTransportEvents = SyncEvents & {\n\tmessage: (message: ServerMessage) => void;\n};\n\nexport interface SyncTransport {\n\tsubscribe(\n\t\tevent: 'onlineChange',\n\t\thandler: (online: boolean) => void,\n\t): () => void;\n\n\treadonly presence: PresenceManager;\n\n\treadonly mode: SyncTransportMode;\n\n\tsend(message: ClientMessage): void;\n\n\tstart(): void;\n\tstop(): void;\n\n\tdispose(): void;\n\n\treconnect(): void;\n\n\treadonly isConnected: boolean;\n\treadonly status: 'active' | 'paused';\n}\n\nexport interface Sync<Presence = any, Profile = any> extends SyncTransport {\n\tsetMode(mode: SyncTransportMode): void;\n\tsetPullInterval(interval: number): void;\n\treadonly pullInterval: number;\n\tuploadFile(data: FileData): Promise<FileUploadResult>;\n\tgetFile(fileId: string): Promise<FilePullResult>;\n\treadonly presence: PresenceManager<Profile, Presence>;\n}\n\nexport class NoSync<Presence = any, Profile = any>\n\textends EventSubscriber<SyncEvents>\n\timplements Sync<Presence, Profile>\n{\n\treadonly mode = 'pull';\n\n\tpublic send(): void {}\n\n\tpublic start(): void {}\n\n\tpublic stop(): void {}\n\n\tpublic dispose = () => {};\n\n\tpublic reconnect(): void {}\n\n\tpublic setMode(): void {}\n\tpublic setPullInterval(): void {}\n\n\tpublic readonly isConnected = false;\n\tpublic readonly status = 'paused';\n\tpublic readonly pullInterval = 0;\n\n\tpublic readonly presence = new PresenceManager<Profile, Presence>({\n\t\tinitialPresence: {} as any,\n\t\tdefaultProfile: {} as any,\n\t});\n\n\tuploadFile = async () => {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tretry: false,\n\t\t};\n\t};\n\n\tgetFile = async (): Promise<FilePullResult> => {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tretry: false,\n\t\t};\n\t};\n}\n\nexport type SyncTransportMode = 'realtime' | 'pull';\n\nexport interface ServerSyncOptions<Profile = any, Presence = any>\n\textends ServerSyncEndpointProviderConfig {\n\t/**\n\t * When a client first connects, it will use this presence value.\n\t */\n\tinitialPresence: Presence;\n\t/**\n\t * Before connecting to the server, the local client will have\n\t * this value for their profile data. You can either cache and store\n\t * profile data from a previous connection or provide defaults like\n\t * empty strings.\n\t */\n\tdefaultProfile: Profile;\n\n\t/**\n\t * Provide `false` to disable transport selection. Transport selection\n\t * automatically switches between HTTP and WebSocket based sync depending\n\t * on the number of peers connected. If a user is alone, they will use\n\t * HTTP push/pull to sync changes. If another user joins, both users will\n\t * be upgraded to websockets.\n\t *\n\t * Provide `peers-only` to only automatically use websockets if other\n\t * users connect, but not if another device for the current user connects.\n\t * By default, automatic transport selection will upgrade to websockets if\n\t * another device from the current user connects, but if realtime sync is\n\t * not necessary for such cases, you can save bandwidth by disabling this.\n\t *\n\t * Turning off this feature allows you more control over the transport\n\t * which can be useful for low-power devices or to save server traffic.\n\t * To modify transport modes manually, utilize `client.sync.setMode`.\n\t * The built-in behavior is essentially switching modes based on\n\t * the number of peers detected by client.sync.presence.\n\t */\n\tautomaticTransportSelection?: boolean | 'peers-only';\n\tinitialTransport?: SyncTransportMode;\n\tautoStart?: boolean;\n\t/**\n\t * Optionally specify an interval, in milliseconds, to poll the server\n\t * when in pull mode.\n\t */\n\tpullInterval?: number;\n\t/**\n\t * Presence updates are batched to reduce number of requests / messages\n\t * sent to the server. You can specify the batching time slice, in milliseconds,\n\t */\n\tpresenceUpdateBatchTimeout?: number;\n\t/**\n\t * Experimental: sync messages over a broadcast channel between tabs.\n\t * Fixes tabs not reactively updating to changes when other tabs are open,\n\t * but is not yet thoroughly vetted.\n\t */\n\tuseBroadcastChannel?: boolean;\n}\n\nexport class ServerSync<Presence = any, Profile = any>\n\textends EventSubscriber<\n\t\tSyncEvents & { syncingChange: (syncing: boolean) => void }\n\t>\n\timplements Sync<Presence, Profile>\n{\n\tprivate webSocketSync: WebSocketSync;\n\tprivate pushPullSync: PushPullSync;\n\tprivate fileSync: FileSync;\n\tprivate activeSync: SyncTransport;\n\tprivate endpointProvider;\n\tprivate onData: (data: {\n\t\toperations: Operation[];\n\t\tbaselines: DocumentBaseline[];\n\t\treset?: boolean;\n\t}) => Promise<void>;\n\tprivate broadcastChannel: BroadcastChannel | null = null;\n\tprivate _activelySyncing = false;\n\n\tprivate meta: Metadata;\n\n\treadonly presence: PresenceManager<Profile, Presence>;\n\n\tprivate log;\n\n\tconstructor(\n\t\t{\n\t\t\tauthEndpoint,\n\t\t\tfetchAuth,\n\t\t\tinitialPresence,\n\t\t\tautomaticTransportSelection = true,\n\t\t\tautoStart,\n\t\t\tinitialTransport,\n\t\t\tpullInterval,\n\t\t\tpresenceUpdateBatchTimeout,\n\t\t\tdefaultProfile,\n\t\t\tuseBroadcastChannel,\n\t\t}: ServerSyncOptions<Profile, Presence>,\n\t\t{\n\t\t\tmeta,\n\t\t\tlog,\n\t\t\tonData,\n\t\t}: {\n\t\t\tmeta: Metadata;\n\t\t\tlog?: (...args: any[]) => void;\n\t\t\tonData: (data: {\n\t\t\t\toperations: Operation[];\n\t\t\t\tbaselines: DocumentBaseline[];\n\t\t\t\treset?: boolean;\n\t\t\t}) => Promise<void>;\n\t\t},\n\t) {\n\t\tsuper();\n\t\tthis.meta = meta;\n\t\tthis.onData = onData;\n\t\tthis.log = log || (() => {});\n\t\tthis.presence = new PresenceManager({\n\t\t\tinitialPresence,\n\t\t\tdefaultProfile,\n\t\t\tupdateBatchTimeout: presenceUpdateBatchTimeout,\n\t\t});\n\t\tthis.endpointProvider = new ServerSyncEndpointProvider({\n\t\t\tauthEndpoint,\n\t\t\tfetchAuth,\n\t\t});\n\n\t\tthis.webSocketSync = new WebSocketSync({\n\t\t\tendpointProvider: this.endpointProvider,\n\t\t\tmeta,\n\t\t\tpresence: this.presence,\n\t\t\tlog: this.log,\n\t\t});\n\t\tthis.pushPullSync = new PushPullSync({\n\t\t\tendpointProvider: this.endpointProvider,\n\t\t\tmeta,\n\t\t\tpresence: this.presence,\n\t\t\tlog: this.log,\n\t\t\tinterval: pullInterval,\n\t\t});\n\t\tthis.fileSync = new FileSync({\n\t\t\tendpointProvider: this.endpointProvider,\n\t\t\tlog: this.log,\n\t\t});\n\t\tif (useBroadcastChannel && 'BroadcastChannel' in window) {\n\t\t\tthis.broadcastChannel = new BroadcastChannel('verdant');\n\t\t\tthis.broadcastChannel.addEventListener(\n\t\t\t\t'message',\n\t\t\t\tthis.handleBroadcastChannelMessage,\n\t\t\t);\n\t\t}\n\t\tif (initialTransport === 'realtime') {\n\t\t\tthis.activeSync = this.webSocketSync;\n\t\t} else {\n\t\t\tthis.activeSync = this.pushPullSync;\n\t\t}\n\n\t\tthis.presence.subscribe('update', this.handlePresenceUpdate);\n\n\t\tthis.meta.subscribe('message', this.send);\n\n\t\tthis.webSocketSync.subscribe('message', this.handleMessage);\n\t\tthis.webSocketSync.subscribe('onlineChange', this.handleOnlineChange);\n\n\t\tthis.pushPullSync.subscribe('message', this.handleMessage);\n\t\tthis.pushPullSync.subscribe('onlineChange', this.handleOnlineChange);\n\n\t\tif (automaticTransportSelection && this.canDoRealtime) {\n\t\t\t// automatically shift between transport modes depending\n\t\t\t// on whether any peers are present\n\t\t\tconst decideIfUpgrade = () => {\n\t\t\t\tif (switchoverTimeout) {\n\t\t\t\t\tclearTimeout(switchoverTimeout);\n\t\t\t\t}\n\t\t\t\tconst hasPeers = Object.keys(this.presence.peers).length > 0;\n\t\t\t\tconst shouldUpgrade =\n\t\t\t\t\thasPeers ||\n\t\t\t\t\t(automaticTransportSelection !== 'peers-only' &&\n\t\t\t\t\t\tthis.presence.selfReplicaIds.size > 1);\n\t\t\t\tif (shouldUpgrade && this.mode === 'pull') {\n\t\t\t\t\tthis.setMode('realtime');\n\t\t\t\t} else if (!shouldUpgrade && this.mode === 'realtime') {\n\t\t\t\t\t// wait 1 second then switch to pull mode if still empty\n\t\t\t\t\tswitchoverTimeout = setTimeout(() => {\n\t\t\t\t\t\tif (Object.keys(this.presence.peers).length === 0) {\n\t\t\t\t\t\t\tthis.setMode('pull');\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 1000);\n\t\t\t\t}\n\t\t\t};\n\t\t\tlet switchoverTimeout: NodeJS.Timer;\n\t\t\tthis.presence.subscribe('peersChanged', decideIfUpgrade);\n\t\t\tif (automaticTransportSelection !== 'peers-only') {\n\t\t\t\tthis.presence.subscribe('selfChanged', decideIfUpgrade);\n\t\t\t}\n\t\t}\n\n\t\tif (autoStart) {\n\t\t\tthis.start();\n\t\t}\n\t}\n\n\tget canDoRealtime() {\n\t\treturn (\n\t\t\tthis.endpointProvider.type === ReplicaType.Realtime ||\n\t\t\tthis.endpointProvider.type === ReplicaType.PassiveRealtime ||\n\t\t\tthis.endpointProvider.type === ReplicaType.ReadOnlyRealtime\n\t\t);\n\t}\n\n\tget syncing() {\n\t\treturn this._activelySyncing;\n\t}\n\n\tprivate handleBroadcastChannelMessage = (event: MessageEvent) => {\n\t\tif (event.data.type === 'sync') {\n\t\t\tthis.handleMessage(event.data.message);\n\t\t}\n\t};\n\n\tprivate handleMessage = async (message: ServerMessage) => {\n\t\t// TODO: move this into metadata\n\t\tif (message.type === 'op-re' || message.type === 'sync-resp') {\n\t\t\tfor (const op of message.operations) {\n\t\t\t\tthis.meta.time.update(op.timestamp);\n\t\t\t}\n\t\t}\n\n\t\tthis.log('sync message', JSON.stringify(message, null, 2));\n\t\tswitch (message.type) {\n\t\t\tcase 'op-re':\n\t\t\t\tawait this.onData({\n\t\t\t\t\toperations: message.operations,\n\t\t\t\t\tbaselines: message.baselines,\n\t\t\t\t});\n\t\t\t\tif (message.globalAckTimestamp) {\n\t\t\t\t\tawait this.meta.setGlobalAck(message.globalAckTimestamp);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'global-ack':\n\t\t\t\tawait this.meta.setGlobalAck(message.timestamp);\n\t\t\t\tbreak;\n\t\t\tcase 'sync-resp':\n\t\t\t\tthis._activelySyncing = true;\n\t\t\t\tthis.emit('syncingChange', true);\n\t\t\t\tawait this.onData({\n\t\t\t\t\toperations: message.operations,\n\t\t\t\t\tbaselines: message.baselines,\n\t\t\t\t\treset: message.overwriteLocalData,\n\t\t\t\t});\n\n\t\t\t\tif (message.globalAckTimestamp) {\n\t\t\t\t\tawait this.meta.setGlobalAck(message.globalAckTimestamp);\n\t\t\t\t}\n\n\t\t\t\tawait this.meta.updateLastSynced(message.ackedTimestamp);\n\t\t\t\tthis._activelySyncing = false;\n\t\t\t\tthis.emit('syncingChange', false);\n\t\t\t\tbreak;\n\t\t\tcase 'need-since':\n\t\t\t\tthis.activeSync.send(\n\t\t\t\t\tawait this.meta.messageCreator.createSyncStep1(message.since),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase 'server-ack':\n\t\t\t\tawait this.meta.updateLastSynced(message.timestamp);\n\t\t}\n\n\t\tthis.broadcastChannel?.postMessage({\n\t\t\ttype: 'sync',\n\t\t\tmessage,\n\t\t});\n\n\t\t// update presence if necessary\n\t\tthis.presence[HANDLE_MESSAGE](await this.meta.localReplica.get(), message);\n\t};\n\tprivate handleOnlineChange = (online: boolean) => {\n\t\tthis.emit('onlineChange', online);\n\t};\n\tprivate handlePresenceUpdate = async (presence: any) => {\n\t\tthis.send(await this.meta.messageCreator.createPresenceUpdate(presence));\n\t};\n\n\tsetMode = (transport: SyncTransportMode) => {\n\t\tif (transport === 'realtime' && !this.canDoRealtime) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot switch to realtime mode, because the current auth token does not allow it`,\n\t\t\t);\n\t\t}\n\n\t\tlet newSync: SyncTransport;\n\t\tif (transport === 'realtime') {\n\t\t\tnewSync = this.webSocketSync;\n\t\t} else {\n\t\t\tnewSync = this.pushPullSync;\n\t\t}\n\n\t\tif (newSync === this.activeSync) return;\n\t\tthis.log('switching to', transport, 'mode');\n\n\t\t// transfer state to new sync\n\t\tif (this.activeSync.status === 'active') {\n\t\t\tnewSync.start();\n\t\t}\n\t\tthis.activeSync.stop();\n\t\tthis.activeSync = newSync;\n\t};\n\n\tsetPullInterval = (interval: number) => {\n\t\tthis.pushPullSync.setInterval(interval);\n\t};\n\n\tget pullInterval() {\n\t\treturn this.pushPullSync.interval;\n\t}\n\n\tsend = (message: ClientMessage) => {\n\t\tif (this.activeSync.status === 'active') {\n\t\t\treturn this.activeSync.send(message);\n\t\t}\n\t};\n\n\tuploadFile = async (info: FileData) => {\n\t\tif (this.activeSync.status === 'active') {\n\t\t\treturn this.fileSync.uploadFile(info);\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tretry: false,\n\t\t\t};\n\t\t}\n\t};\n\n\tgetFile = async (id: string) => {\n\t\t// TODO: should this error? or just try anyway?\n\t\tif (this.activeSync.status === 'active') {\n\t\t\treturn this.fileSync.getFile(id);\n\t\t} else {\n\t\t\tthrow new Error('Offline, cannot retrieve remote file details');\n\t\t}\n\t};\n\n\tpublic start = () => {\n\t\treturn this.activeSync.start();\n\t};\n\n\tpublic stop = () => {\n\t\treturn this.activeSync.stop();\n\t};\n\n\tpublic dispose = () => {\n\t\tthis.webSocketSync.dispose();\n\t\tthis.pushPullSync.dispose();\n\t};\n\n\tpublic reconnect = () => {\n\t\treturn this.activeSync.reconnect();\n\t};\n\n\tpublic get isConnected(): boolean {\n\t\treturn this.activeSync.isConnected;\n\t}\n\n\tpublic get status() {\n\t\treturn this.activeSync.status;\n\t}\n\n\tpublic get mode() {\n\t\treturn this.activeSync.mode;\n\t}\n}\n", "export class Disposable {\n\tprivate _disposes: (() => void)[] = [];\n\tprotected disposed = false;\n\n\tdispose = () => {\n\t\tthis.disposed = true;\n\t\tthis._disposes.forEach((dispose) => dispose());\n\t\tthis._disposes = [];\n\t};\n\n\tprotected addDispose = (dispose: () => void) => {\n\t\tthis._disposes.push(dispose);\n\t};\n}\n", "import { CollectionIndexFilter, hashObject } from '@verdant-web/common';\nimport { Entity } from '../entities/Entity.js';\n\nfunction existsFilter<T>(x: T | null): x is T {\n\treturn x !== null;\n}\n\nexport function filterResultSet(results: any): any {\n\tif (Array.isArray(results)) {\n\t\treturn results.map(filterResultSet).filter(existsFilter);\n\t} else if (results instanceof Entity) {\n\t\treturn results.deleted ? null : results;\n\t} else {\n\t\treturn results;\n\t}\n}\n\nexport function areIndexesEqual(\n\ta?: CollectionIndexFilter,\n\tb?: CollectionIndexFilter,\n) {\n\treturn (!a && !b) || (a && b && hashObject(a) === hashObject(b));\n}\n", "import { EventSubscriber } from '@verdant-web/common';\nimport { Context } from '../context.js';\nimport { Entity } from '../entities/Entity.js';\nimport { Disposable } from '../utils/Disposable.js';\nimport { filterResultSet } from './utils.js';\n\nexport type BaseQueryEvents = {\n\tchange: (value: any) => void;\n\tstatusChange: (status: QueryStatus) => void;\n};\n\nexport type BaseQueryOptions<T> = {\n\tcontext: Context;\n\tinitial: T;\n\tcollection: string;\n\tkey: string;\n\tshouldUpdate?: (updatedCollections: string[]) => boolean;\n};\n\nexport type QueryStatus = 'initial' | 'initializing' | 'revalidating' | 'ready';\n\nexport const ON_ALL_UNSUBSCRIBED = Symbol('ON_ALL_UNSUBSCRIBED');\nexport const UPDATE = Symbol('UPDATE');\n\n// export interface BaseQuery<T> {\n// \tsubscribe(event: 'change', callback: (value: T) => void): () => void;\n// \tsubscribe(event: 'statusChange', callback: (status: QueryStatus) => void): () => void;\n// \tsubscribe(callback: (value: T) => void): () => void;\n// }\n\nexport abstract class BaseQuery<T> extends Disposable {\n\tprivate _rawValue;\n\tprivate _value;\n\n\tprivate _events;\n\tprivate _internalUnsubscribes: (() => void)[] = [];\n\tprivate _allUnsubscribedHandler?: (query: BaseQuery<T>) => void;\n\tprivate _status: QueryStatus = 'initial';\n\tprivate _executionPromise: Promise<T> | null = null;\n\n\tprotected context;\n\n\treadonly collection;\n\treadonly key;\n\n\tconstructor({\n\t\tinitial,\n\t\tcontext,\n\t\tcollection,\n\t\tkey,\n\t\tshouldUpdate,\n\t}: BaseQueryOptions<T>) {\n\t\tsuper();\n\t\tthis._rawValue = initial;\n\t\tthis._value = initial;\n\t\tthis._events = new EventSubscriber<BaseQueryEvents>(\n\t\t\t(event: keyof BaseQueryEvents) => {\n\t\t\t\tif (event === 'change') this._allUnsubscribedHandler?.(this);\n\t\t\t},\n\t\t);\n\t\tthis.context = context;\n\t\tthis.key = key;\n\t\tthis.collection = collection;\n\t\tconst shouldUpdateFn =\n\t\t\tshouldUpdate ||\n\t\t\t((collections: string[]) => collections.includes(collection));\n\t\tthis.addDispose(\n\t\t\tthis.context.entityEvents.subscribe(\n\t\t\t\t'collectionsChanged',\n\t\t\t\t(collections) => {\n\t\t\t\t\tif (shouldUpdateFn(collections)) {\n\t\t\t\t\t\tthis.context.log('info', 'Updating query', this.key);\n\t\t\t\t\t\tthis.execute();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\t}\n\n\tget current() {\n\t\treturn this._value;\n\t}\n\n\tget resolved() {\n\t\tif (this.status === 'ready') return Promise.resolve(this._value);\n\t\treturn this._executionPromise ?? this.execute();\n\t}\n\n\tget subscribed() {\n\t\treturn this._events.totalSubscriberCount() > 0;\n\t}\n\n\tget status() {\n\t\treturn this._status;\n\t}\n\n\t/**\n\t * Subscribe to changes in the query value.\n\t *\n\t * @deprecated use the two parameter form instead\n\t */\n\tsubscribe(callback: (value: T) => void): () => void;\n\t/**\n\t * Subscribe to changes in the query value.\n\t */\n\tsubscribe(event: 'change', callback: (value: T) => void): () => void;\n\t/**\n\t * Subscribe to changes in the query state.\n\t */\n\tsubscribe(\n\t\tevent: 'statusChange',\n\t\tcallback: (status: QueryStatus) => void,\n\t): () => void;\n\tsubscribe(eventOrCallback: any, callback?: any) {\n\t\t// change subscription has special behavior...\n\t\tif (callback === undefined && typeof eventOrCallback === 'function') {\n\t\t\t// accessing for side effects... eh\n\t\t\tthis.resolved;\n\t\t\treturn this._events.subscribe('change', eventOrCallback);\n\t\t} else if (eventOrCallback === 'change' && callback !== undefined) {\n\t\t\t// accessing for side effects... eh\n\t\t\tthis.resolved;\n\t\t\treturn this._events.subscribe('change', callback);\n\t\t} else if (\n\t\t\teventOrCallback === 'statusChange' &&\n\t\t\ttypeof callback === 'function'\n\t\t) {\n\t\t\treturn this._events.subscribe(eventOrCallback, callback);\n\t\t} else {\n\t\t\tthrow new Error('Invalid invocation of Query.subscribe');\n\t\t}\n\t}\n\n\tprotected setValue = (value: T) => {\n\t\tthis._rawValue = value;\n\t\tthis.subscribeToDeleteAndRestore(this._rawValue);\n\t\tthis._value = filterResultSet(value);\n\t\tthis._status = 'ready';\n\t\tthis._events.emit('change', this._value);\n\t};\n\n\t// re-applies filtering if results have changed\n\tprotected refreshValue = () => {\n\t\tthis.setValue(this._rawValue);\n\t};\n\n\tprivate subscribeToDeleteAndRestore = (value: T) => {\n\t\twhile (this._internalUnsubscribes.length) {\n\t\t\tthis._internalUnsubscribes.pop()?.();\n\t\t}\n\n\t\tif (Array.isArray(value)) {\n\t\t\tvalue.forEach((entity: any) => {\n\t\t\t\tif (entity instanceof Entity) {\n\t\t\t\t\tthis._internalUnsubscribes.push(\n\t\t\t\t\t\tentity.subscribe('delete', this.refreshValue),\n\t\t\t\t\t);\n\t\t\t\t\tthis._internalUnsubscribes.push(\n\t\t\t\t\t\tentity.subscribe('restore', this.refreshValue),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (value instanceof Entity) {\n\t\t\tthis._internalUnsubscribes.push(\n\t\t\t\tvalue.subscribe('delete', this.refreshValue),\n\t\t\t);\n\t\t\tthis._internalUnsubscribes.push(\n\t\t\t\tvalue.subscribe('restore', () => {\n\t\t\t\t\tthis.refreshValue();\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t};\n\n\texecute = () => {\n\t\tthis.context.log('debug', 'Executing query', this.key);\n\n\t\tif (this._status === 'initial') {\n\t\t\tthis._status = 'initializing';\n\t\t} else if (this._status === 'ready') {\n\t\t\tthis._status = 'revalidating';\n\t\t}\n\t\t// no status change needed if already in a 'running' status.\n\n\t\tthis._executionPromise = this.run()\n\t\t\t.then(() => this._value)\n\t\t\t.catch((err) => {\n\t\t\t\tif (err instanceof Error) {\n\t\t\t\t\tif (\n\t\t\t\t\t\terr.name === 'InvalidStateError' ||\n\t\t\t\t\t\terr.name === 'InvalidAccessError'\n\t\t\t\t\t) {\n\t\t\t\t\t\t// possibly accessing db while it's closed. not much we can do.\n\t\t\t\t\t\treturn this._value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthrow err;\n\t\t\t});\n\t\treturn this._executionPromise;\n\t};\n\tprotected abstract run(): Promise<void>;\n\n\t[ON_ALL_UNSUBSCRIBED] = (handler: (query: BaseQuery<T>) => void) => {\n\t\tthis._allUnsubscribedHandler = handler;\n\t};\n}\n", "import { createOid } from '@verdant-web/common';\nimport { BaseQuery, BaseQueryOptions } from './BaseQuery.js';\n\nexport class GetQuery<T> extends BaseQuery<T | null> {\n\tprivate hydrate;\n\tprivate oid;\n\n\tconstructor({\n\t\tid,\n\t\thydrate,\n\t\t...rest\n\t}: {\n\t\tid: string;\n\t\thydrate: (oid: string) => Promise<T>;\n\t} & Omit<BaseQueryOptions<T | null>, 'initial'>) {\n\t\tsuper({\n\t\t\tinitial: null,\n\t\t\t...rest,\n\t\t});\n\t\tthis.oid = createOid(rest.collection, id);\n\t\tthis.hydrate = hydrate;\n\t}\n\n\tprotected run = async () => {\n\t\tconst value = await this.hydrate(this.oid);\n\t\tthis.setValue(value);\n\t};\n}\n", "import { CollectionFilter } from '@verdant-web/common';\nimport { BaseQuery, BaseQueryOptions, UPDATE } from './BaseQuery.js';\nimport { findOneOid } from './dbQueries.js';\nimport { areIndexesEqual } from './utils.js';\n\nexport class FindOneQuery<T> extends BaseQuery<T | null> {\n\tprivate index;\n\tprivate hydrate;\n\n\tconstructor({\n\t\tindex,\n\t\thydrate,\n\t\t...rest\n\t}: {\n\t\tindex?: CollectionFilter;\n\t\thydrate: (oid: string) => Promise<T>;\n\t} & Omit<BaseQueryOptions<T | null>, 'initial'>) {\n\t\tsuper({\n\t\t\tinitial: null,\n\t\t\t...rest,\n\t\t});\n\t\tthis.index = index;\n\t\tthis.hydrate = hydrate;\n\t}\n\n\tprotected run = async () => {\n\t\tconst oid = await findOneOid({\n\t\t\tcollection: this.collection,\n\t\t\tindex: this.index,\n\t\t\tcontext: this.context,\n\t\t});\n\t\tthis.setValue(oid ? await this.hydrate(oid) : null);\n\t};\n\n\t[UPDATE] = (index: CollectionFilter | undefined) => {\n\t\tif (areIndexesEqual(this.index, index)) return;\n\t\tthis.index = index;\n\t\tthis.execute();\n\t};\n}\n", "import { CollectionFilter } from '@verdant-web/common';\nimport { BaseQuery, BaseQueryOptions, UPDATE } from './BaseQuery.js';\nimport { findPageOfOids } from './dbQueries.js';\nimport { areIndexesEqual } from './utils.js';\n\nexport class FindPageQuery<T> extends BaseQuery<T[]> {\n\tprivate index;\n\tprivate hydrate;\n\tprivate _pageSize: number;\n\tprivate _page: number;\n\tprivate _hasNextPage: boolean = false;\n\n\tget pageSize() {\n\t\treturn this._pageSize;\n\t}\n\n\tget page() {\n\t\treturn this._page;\n\t}\n\n\tget hasNextPage() {\n\t\treturn this._hasNextPage;\n\t}\n\n\tget hasPreviousPage() {\n\t\treturn this._page > 0;\n\t}\n\n\tconstructor({\n\t\tindex,\n\t\thydrate,\n\t\tpageSize,\n\t\tpage,\n\t\t...rest\n\t}: {\n\t\tindex?: CollectionFilter;\n\t\thydrate: (oid: string) => Promise<T>;\n\t\tpageSize: number;\n\t\tpage: number;\n\t} & Omit<BaseQueryOptions<T[]>, 'initial'>) {\n\t\tsuper({\n\t\t\tinitial: [],\n\t\t\t...rest,\n\t\t});\n\t\tthis.index = index;\n\t\tthis.hydrate = hydrate;\n\t\tthis._pageSize = pageSize;\n\t\tthis._page = page;\n\t}\n\n\tprotected run = async () => {\n\t\tconst { result, hasNextPage } = await findPageOfOids({\n\t\t\tcollection: this.collection,\n\t\t\tindex: this.index,\n\t\t\tcontext: this.context,\n\t\t\tlimit: this._pageSize,\n\t\t\toffset: this._page * this._pageSize,\n\t\t});\n\t\tthis._hasNextPage = hasNextPage;\n\t\tthis.setValue(await Promise.all(result.map(this.hydrate)));\n\t};\n\n\tnextPage = async () => {\n\t\tif (!this.hasNextPage) return;\n\n\t\tthis._page++;\n\t\tawait this.run();\n\t};\n\n\tpreviousPage = async () => {\n\t\tif (this._page === 0) return;\n\n\t\tthis._page--;\n\t\tawait this.run();\n\t};\n\n\tsetPage = async (page: number) => {\n\t\tthis._page = page;\n\t\tawait this.run();\n\t};\n\n\t[UPDATE] = (index: CollectionFilter | undefined) => {\n\t\tif (areIndexesEqual(this.index, index)) return;\n\t\tthis.index = index;\n\t\tthis.execute();\n\t};\n}\n", "import { CollectionFilter } from '@verdant-web/common';\nimport { BaseQuery, BaseQueryOptions, UPDATE } from './BaseQuery.js';\nimport { findPageOfOids } from './dbQueries.js';\nimport { areIndexesEqual } from './utils.js';\n\nexport class FindInfiniteQuery<T> extends BaseQuery<T[]> {\n\tprivate index;\n\tprivate hydrate;\n\tprivate _upToPage = 1;\n\tprivate _pageSize: number;\n\tprivate _hasNextPage: boolean = false;\n\n\tget pageSize() {\n\t\treturn this._pageSize;\n\t}\n\n\tget hasMore() {\n\t\treturn this._hasNextPage;\n\t}\n\n\tconstructor({\n\t\thydrate,\n\t\tpageSize,\n\t\tindex,\n\t\t...rest\n\t}: {\n\t\thydrate: (oid: string) => Promise<T>;\n\t\tpageSize: number;\n\t\tindex?: CollectionFilter;\n\t} & Omit<BaseQueryOptions<T[]>, 'initial'>) {\n\t\tsuper({\n\t\t\tinitial: [],\n\t\t\t...rest,\n\t\t});\n\t\tthis.index = index;\n\t\tthis.hydrate = hydrate;\n\t\tthis._pageSize = pageSize;\n\t}\n\n\tprotected run = async () => {\n\t\tconst { result, hasNextPage } = await findPageOfOids({\n\t\t\tcollection: this.collection,\n\t\t\tcontext: this.context,\n\t\t\tlimit: this._pageSize * this._upToPage,\n\t\t\toffset: 0,\n\t\t\tindex: this.index,\n\t\t});\n\t\tthis._hasNextPage = hasNextPage;\n\t\tthis.setValue(await Promise.all(result.map(this.hydrate)));\n\t};\n\n\tpublic loadMore = async () => {\n\t\tconst { result, hasNextPage } = await findPageOfOids({\n\t\t\tcollection: this.collection,\n\t\t\tcontext: this.context,\n\t\t\tlimit: this._pageSize,\n\t\t\toffset: this._pageSize * this._upToPage,\n\t\t\tindex: this.index,\n\t\t});\n\t\tthis._hasNextPage = hasNextPage;\n\t\tthis._upToPage++;\n\t\tthis.setValue([\n\t\t\t...this.current,\n\t\t\t...(await Promise.all(result.map(this.hydrate))),\n\t\t]);\n\t};\n\n\t[UPDATE] = (index: CollectionFilter | undefined) => {\n\t\tif (areIndexesEqual(this.index, index)) return;\n\t\tthis.index = index;\n\t\tthis.execute();\n\t};\n}\n", "import { CollectionFilter } from '@verdant-web/common';\nimport { BaseQuery, BaseQueryOptions, UPDATE } from './BaseQuery.js';\nimport { findAllOids } from './dbQueries.js';\nimport { areIndexesEqual } from './utils.js';\n\nexport class FindAllQuery<T> extends BaseQuery<T[]> {\n\tprivate index;\n\tprivate hydrate;\n\n\tconstructor({\n\t\tindex,\n\t\thydrate,\n\t\t...rest\n\t}: {\n\t\tindex?: CollectionFilter;\n\t\thydrate: (oid: string) => Promise<T>;\n\t} & Omit<BaseQueryOptions<T[]>, 'initial'>) {\n\t\tsuper({\n\t\t\tinitial: [],\n\t\t\t...rest,\n\t\t});\n\t\tthis.index = index;\n\t\tthis.hydrate = hydrate;\n\t}\n\n\tprotected run = async () => {\n\t\tconst oids = await findAllOids({\n\t\t\tcollection: this.collection,\n\t\t\tindex: this.index,\n\t\t\tcontext: this.context,\n\t\t});\n\t\tthis.setValue(await Promise.all(oids.map(this.hydrate)));\n\t};\n\n\t[UPDATE] = (index: CollectionFilter | undefined) => {\n\t\tif (areIndexesEqual(this.index, index)) return;\n\t\tthis.index = index;\n\t\tthis.execute();\n\t};\n}\n", "import { CollectionFilter, hashObject } from '@verdant-web/common';\nimport { Context } from '../context.js';\nimport { EntityStore } from '../entities/EntityStore.js';\nimport { GetQuery } from './GetQuery.js';\nimport { QueryCache } from './QueryCache.js';\nimport { FindOneQuery } from './FindOneQuery.js';\nimport { FindPageQuery } from './FindPageQuery.js';\nimport { FindInfiniteQuery } from './FindInfiniteQuery.js';\nimport { FindAllQuery } from './FindAllQuery.js';\nimport { DocumentManager } from '../DocumentManager.js';\nimport { ObjectEntity } from '../index.js';\nimport { UPDATE } from './BaseQuery.js';\n\nexport class CollectionQueries<\n\tT extends ObjectEntity<any, any>,\n\tInit,\n\tFilter extends CollectionFilter,\n> {\n\tprivate cache;\n\tprivate collection;\n\tprivate hydrate: (oid: string) => Promise<T>;\n\tprivate context;\n\tprivate documentManager;\n\n\tput: (init: Init, options?: { undoable?: boolean }) => Promise<T>;\n\tdelete: (id: string, options?: { undoable?: boolean }) => Promise<void>;\n\tdeleteAll: (ids: string[], options?: { undoable?: boolean }) => Promise<void>;\n\n\tconstructor({\n\t\tcollection,\n\t\tcache,\n\t\tentities,\n\t\tcontext,\n\t\tdocumentManager,\n\t}: {\n\t\tcollection: string;\n\t\tcache: QueryCache;\n\t\tentities: EntityStore;\n\t\tcontext: Context;\n\t\tdocumentManager: DocumentManager<any>;\n\t}) {\n\t\tthis.cache = cache;\n\t\tthis.collection = collection;\n\t\tthis.hydrate = entities.get as any;\n\t\tthis.context = context;\n\t\tthis.documentManager = documentManager;\n\n\t\tthis.put = this.documentManager.create.bind(\n\t\t\tthis.documentManager,\n\t\t\tthis.collection,\n\t\t);\n\t\tthis.delete = this.documentManager.delete.bind(\n\t\t\tthis.documentManager,\n\t\t\tthis.collection,\n\t\t);\n\t\tthis.deleteAll = this.documentManager.deleteAllFromCollection.bind(\n\t\t\tthis.documentManager,\n\t\t\tthis.collection,\n\t\t);\n\t}\n\n\tprivate serializeIndex = (index?: CollectionFilter) => {\n\t\tif (!index) return '';\n\t\treturn hashObject(index);\n\t};\n\n\tget = (id: string) => {\n\t\tconst key = `get:${this.collection}:${id}`;\n\t\treturn this.cache.getOrSet(\n\t\t\tkey,\n\t\t\t() =>\n\t\t\t\tnew GetQuery<T>({\n\t\t\t\t\tid,\n\t\t\t\t\tcollection: this.collection,\n\t\t\t\t\thydrate: this.hydrate,\n\t\t\t\t\tcontext: this.context,\n\t\t\t\t\tkey,\n\t\t\t\t}),\n\t\t);\n\t};\n\n\tfindOne = ({\n\t\tindex,\n\t\tkey: providedKey,\n\t}: { index?: Filter; key?: string } = {}) => {\n\t\tconst key =\n\t\t\tprovidedKey || `findOne:${this.collection}:${this.serializeIndex(index)}`;\n\t\treturn this.cache.getOrSet(\n\t\t\tkey,\n\t\t\t() =>\n\t\t\t\tnew FindOneQuery<T>({\n\t\t\t\t\tindex,\n\t\t\t\t\tcollection: this.collection,\n\t\t\t\t\thydrate: this.hydrate,\n\t\t\t\t\tcontext: this.context,\n\t\t\t\t\tkey,\n\t\t\t\t}),\n\t\t\t(existing) => {\n\t\t\t\texisting[UPDATE](index);\n\t\t\t},\n\t\t);\n\t};\n\n\tfindAll = ({\n\t\tindex,\n\t\tkey: providedKey,\n\t}: { index?: Filter; key?: string } = {}) => {\n\t\tconst key =\n\t\t\tprovidedKey || `findAll:${this.collection}:${this.serializeIndex(index)}`;\n\t\treturn this.cache.getOrSet(\n\t\t\tkey,\n\t\t\t() =>\n\t\t\t\tnew FindAllQuery<T>({\n\t\t\t\t\tindex,\n\t\t\t\t\tcollection: this.collection,\n\t\t\t\t\thydrate: this.hydrate,\n\t\t\t\t\tcontext: this.context,\n\t\t\t\t\tkey,\n\t\t\t\t}),\n\t\t\t(existing) => {\n\t\t\t\texisting[UPDATE](index);\n\t\t\t},\n\t\t);\n\t};\n\n\tfindPage = ({\n\t\tindex,\n\t\tpageSize,\n\t\tpage,\n\t\tkey: providedKey,\n\t}: {\n\t\tindex?: Filter;\n\t\tpageSize: number;\n\t\tpage: number;\n\t\tkey?: string;\n\t}) => {\n\t\tconst key =\n\t\t\tprovidedKey ||\n\t\t\t`findPage:${this.collection}:${this.serializeIndex(index)}:${pageSize}`;\n\t\treturn this.cache.getOrSet(\n\t\t\tkey,\n\t\t\t() =>\n\t\t\t\tnew FindPageQuery<T>({\n\t\t\t\t\tindex,\n\t\t\t\t\tcollection: this.collection,\n\t\t\t\t\thydrate: this.hydrate,\n\t\t\t\t\tcontext: this.context,\n\t\t\t\t\tkey,\n\t\t\t\t\tpageSize,\n\t\t\t\t\tpage,\n\t\t\t\t}),\n\t\t\t(existing) => {\n\t\t\t\texisting[UPDATE](index);\n\t\t\t},\n\t\t);\n\t};\n\n\tfindAllInfinite = ({\n\t\tindex,\n\t\tpageSize,\n\t\tkey: providedKey,\n\t}: {\n\t\tindex?: Filter;\n\t\tpageSize: number;\n\t\tkey?: string;\n\t}) => {\n\t\tconst key =\n\t\t\tprovidedKey ||\n\t\t\t`findAllInfinite:${this.collection}:${this.serializeIndex(\n\t\t\t\tindex,\n\t\t\t)}:${pageSize}`;\n\t\treturn this.cache.getOrSet(\n\t\t\tkey,\n\t\t\t() =>\n\t\t\t\tnew FindInfiniteQuery<T>({\n\t\t\t\t\tindex,\n\t\t\t\t\tcollection: this.collection,\n\t\t\t\t\thydrate: this.hydrate,\n\t\t\t\t\tcontext: this.context,\n\t\t\t\t\tkey,\n\t\t\t\t\tpageSize,\n\t\t\t\t}),\n\t\t\t(existing) => {\n\t\t\t\texisting[UPDATE](index);\n\t\t\t},\n\t\t);\n\t};\n}\n", "import { Context } from '../context.js';\nimport { Disposable } from '../utils/Disposable.js';\nimport { BaseQuery, ON_ALL_UNSUBSCRIBED } from './BaseQuery.js';\n\nexport class QueryCache extends Disposable {\n\tprivate _cache: Map<string, BaseQuery<any>> = new Map();\n\tprivate _evictionTime;\n\tprivate context;\n\n\tconstructor({\n\t\tevictionTime = 5 * 1000,\n\t\tcontext,\n\t}: {\n\t\tevictionTime?: number;\n\t\tcontext: Context;\n\t}) {\n\t\tsuper();\n\n\t\tthis._evictionTime = evictionTime;\n\t\tthis.context = context;\n\t}\n\n\tget<T extends BaseQuery<any>>(key: string): T | null {\n\t\treturn (this._cache.get(key) as T) || null;\n\t}\n\n\tset<V extends BaseQuery<any>>(value: V) {\n\t\tthis._cache.set(value.key, value);\n\t\tvalue[ON_ALL_UNSUBSCRIBED](this.onQueryUnsubscribed);\n\t\treturn value;\n\t}\n\n\tgetOrSet<V extends BaseQuery<any>>(\n\t\tkey: string,\n\t\tcreate: () => V,\n\t\tupdate?: (query: V) => void,\n\t) {\n\t\tconst existing = this.get<V>(key);\n\t\tif (existing) {\n\t\t\tupdate?.(existing);\n\t\t\treturn existing;\n\t\t}\n\t\treturn this.set(create());\n\t}\n\n\tprivate onQueryUnsubscribed = (query: BaseQuery<any>) => {\n\t\tsetTimeout(() => {\n\t\t\tif (query.subscribed) return;\n\t\t\t// double check before evicting... possible the cache\n\t\t\t// got a different version of this query.\n\t\t\tif (this._cache.get(query.key) === query) {\n\t\t\t\tthis._cache.delete(query.key);\n\t\t\t}\n\t\t}, this._evictionTime);\n\t};\n}\n", "import {\n\tassert,\n\tdebounce,\n\tDocumentBaseline,\n\tEventSubscriber,\n\tMigration,\n\tOperation,\n\tSchemaCollection,\n} from '@verdant-web/common';\nimport { Context } from '../context.js';\nimport { DocumentManager } from '../DocumentManager.js';\nimport { FileManager, FileManagerConfig } from '../files/FileManager.js';\nimport {\n\tcloseDatabase,\n\tdeleteAllDatabases,\n\tgetSizeOfObjectStore,\n} from '../idb.js';\nimport { ExportData, Metadata } from '../metadata/Metadata.js';\nimport { openDocumentDatabase } from '../migration/openDatabase.js';\nimport { EntityStore } from '../entities/EntityStore.js';\nimport { NoSync, ServerSync, ServerSyncOptions, Sync } from '../sync/Sync.js';\nimport { CollectionQueries } from '../queries/CollectionQueries.js';\nimport { QueryCache } from '../queries/QueryCache.js';\n\ninterface ClientConfig<Presence = any> {\n\tsyncConfig?: ServerSyncOptions<Presence>;\n\tmigrations: Migration[];\n\tfiles?: FileManagerConfig;\n}\n\n// not actually used below, but helpful for internal code which\n// might rely on this stuff...\nexport type ClientWithCollections = Client & {\n\t[key: string]: CollectionQueries<any, any, any>;\n};\n\nexport class Client<Presence = any, Profile = any> extends EventSubscriber<{\n\t/**\n\t * Called when a change from a future version of the application has\n\t * been witnessed. These changes are not applied but it indicates\n\t * the app has been updated and a peer is using a newer version.\n\t * You should listen to this event and prompt the user to reload\n\t * their client, or reload it for them.\n\t *\n\t * This event may be called multiple times.\n\t */\n\tfutureSeen: () => void;\n}> {\n\treadonly meta: Metadata;\n\tprivate _entities: EntityStore;\n\tprivate _queryCache: QueryCache;\n\tprivate _documentManager: DocumentManager<any>;\n\tprivate _fileManager: FileManager;\n\n\treadonly collectionNames: string[];\n\n\tprivate _sync!: Sync<Presence, Profile>;\n\n\tget sync() {\n\t\treturn this._sync;\n\t}\n\n\tget entities() {\n\t\treturn this._entities;\n\t}\n\n\tget documentManager() {\n\t\treturn this._documentManager;\n\t}\n\n\tconstructor(\n\t\tprivate config: ClientConfig,\n\t\tprivate context: Context,\n\t\tcomponents: { meta: Metadata },\n\t) {\n\t\tsuper();\n\t\tthis.meta = components.meta;\n\t\tthis.collectionNames = Object.keys(context.schema.collections);\n\t\tthis._sync =\n\t\t\tthis.config.syncConfig && !context.schema.wip\n\t\t\t\t? new ServerSync<Presence, Profile>(this.config.syncConfig, {\n\t\t\t\t\t\tmeta: this.meta,\n\t\t\t\t\t\tonData: this.addData,\n\t\t\t\t\t\tlog: this.context.log,\n\t\t\t\t })\n\t\t\t\t: new NoSync<Presence, Profile>();\n\t\tif (context.schema.wip && this.config.syncConfig) {\n\t\t\tcontext.log(\n\t\t\t\t'warn',\n\t\t\t\t'\u26A0\uFE0F\u26A0\uFE0F Sync is disabled for WIP schemas. Commit your schema changes to start syncing again. \u26A0\uFE0F\u26A0\uFE0F',\n\t\t\t);\n\t\t}\n\n\t\tthis._fileManager = new FileManager({\n\t\t\tdb: this.metaDb,\n\t\t\tsync: this.sync,\n\t\t\tcontext: this.context,\n\t\t\tconfig: this.config.files,\n\t\t\tmeta: this.meta,\n\t\t});\n\t\tthis._entities = new EntityStore({\n\t\t\tcontext: this.context,\n\t\t\tmeta: this.meta,\n\t\t\tfiles: this._fileManager,\n\t\t});\n\t\tthis._queryCache = new QueryCache({\n\t\t\tcontext,\n\t\t});\n\t\tthis._documentManager = new DocumentManager(\n\t\t\tthis.meta,\n\t\t\tthis.schema,\n\t\t\tthis._entities,\n\t\t);\n\n\t\tconst notifyFutureSeen = debounce(() => {\n\t\t\tthis.emit('futureSeen');\n\t\t}, 300);\n\t\tthis.context.globalEvents.subscribe('futureSeen', notifyFutureSeen);\n\n\t\tthis.documentDb.addEventListener('versionchange', () => {\n\t\t\tthis.context.log?.(\n\t\t\t\t`Another tab has requested a version change for ${this.namespace}`,\n\t\t\t);\n\t\t\tthis.documentDb.close();\n\t\t\tif (typeof window !== 'undefined') {\n\t\t\t\twindow.location.reload();\n\t\t\t}\n\t\t});\n\n\t\tthis.metaDb.addEventListener('versionchange', () => {\n\t\t\tthis.context.log?.(\n\t\t\t\t`Another tab has requested a version change for ${this.namespace}`,\n\t\t\t);\n\t\t\tthis.metaDb.close();\n\t\t\tif (typeof window !== 'undefined') {\n\t\t\t\twindow.location.reload();\n\t\t\t}\n\t\t});\n\n\t\t// self-assign collection shortcuts. these are not typed\n\t\t// here but are typed in the generated code...\n\t\tfor (const [name, _collection] of Object.entries(\n\t\t\tcontext.schema.collections,\n\t\t)) {\n\t\t\tconst collectionName = name;\n\t\t\t(this as any)[collectionName] = new CollectionQueries({\n\t\t\t\tcollection: collectionName,\n\t\t\t\tcache: this._queryCache,\n\t\t\t\tcontext: this.context,\n\t\t\t\tentities: this.entities,\n\t\t\t\tdocumentManager: this.documentManager,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate addData = (data: {\n\t\toperations: Operation[];\n\t\tbaselines: DocumentBaseline[];\n\t\treset?: boolean;\n\t}) => {\n\t\treturn this._entities.addData(data);\n\t};\n\n\tget documentDb() {\n\t\treturn this.context.documentDb;\n\t}\n\n\tget metaDb() {\n\t\treturn this.context.metaDb;\n\t}\n\n\tget schema() {\n\t\treturn this.context.schema;\n\t}\n\n\tget namespace() {\n\t\treturn this.context.namespace;\n\t}\n\n\tget undoHistory() {\n\t\treturn this.context.undoHistory;\n\t}\n\n\t/**\n\t * @deprecated - use client.sync.presence instead\n\t */\n\tget presence() {\n\t\treturn this.sync.presence;\n\t}\n\n\t/**\n\t * Batch multiple operations together to be executed in a single transaction.\n\t * The changes made will not be included in the same undo history step as\n\t * any other changes made outside of the batch. You can also disable undo\n\t * for your batch to omit changes from undo history.\n\t *\n\t * Provide a batch name to apply multiple changes to the same batch\n\t * across different invocations. Batches will automatically flush after\n\t * a short delay or if they reach a maximum size.\n\t */\n\tget batch() {\n\t\treturn this.entities.batch;\n\t}\n\n\tstats = async () => {\n\t\tconst collectionNames = Object.keys(this.schema.collections);\n\t\tlet collections = {} as Record<string, { count: number; size: number }>;\n\t\tfor (const collectionName of collectionNames) {\n\t\t\tcollections[collectionName] = await getSizeOfObjectStore(\n\t\t\t\tthis.documentDb,\n\t\t\t\tcollectionName,\n\t\t\t);\n\t\t}\n\t\tconst meta = await this.meta.stats();\n\t\tconst storage =\n\t\t\ttypeof navigator !== 'undefined' &&\n\t\t\ttypeof navigator.storage !== 'undefined' &&\n\t\t\t'estimate' in navigator.storage\n\t\t\t\t? await navigator.storage.estimate()\n\t\t\t\t: undefined;\n\n\t\t// determine data:metadata ratio for total size of all collections vs metadata\n\t\tconst totalCollectionsSize = Object.values(collections).reduce(\n\t\t\t(acc, { size }) => acc + size,\n\t\t\t0,\n\t\t);\n\t\tconst totalMetaSize = meta.baselinesSize.size + meta.operationsSize.size;\n\t\tconst metaToDataRatio = totalMetaSize / totalCollectionsSize;\n\n\t\treturn {\n\t\t\tcollections,\n\t\t\tmeta,\n\t\t\tstorage,\n\t\t\ttotalMetaSize,\n\t\t\ttotalCollectionsSize,\n\t\t\tmetaToDataRatio,\n\t\t\tquotaUsage:\n\t\t\t\tstorage?.usage && storage?.quota\n\t\t\t\t\t? storage.usage / storage.quota\n\t\t\t\t\t: undefined,\n\t\t};\n\t};\n\n\tclose = async () => {\n\t\tthis.sync.stop();\n\t\tthis.sync.dispose();\n\t\t// this step does have the potential to flush\n\t\t// changes to storage, so don't close metadata db yet\n\t\tawait this._entities.destroy();\n\n\t\tthis.meta.close();\n\n\t\t// the idea here is to flush the microtask queue -\n\t\t// we may have queued tasks related to queries that\n\t\t// we want to settle before closing the databases\n\t\t// to avoid invalid state errors\n\t\tawait new Promise<void>(async (resolve) => {\n\t\t\tawait closeDatabase(this.documentDb);\n\t\t\tawait closeDatabase(this.metaDb);\n\t\t\tresolve();\n\t\t});\n\n\t\tthis.context.log?.('Client closed');\n\t};\n\n\t__dangerous__resetLocal = async () => {\n\t\tthis.sync.stop();\n\t\tawait deleteAllDatabases(this.namespace, indexedDB);\n\t};\n\n\texport = async () => {\n\t\tconst metaExport = await this.meta.export();\n\t\treturn Buffer.from(JSON.stringify(metaExport));\n\t};\n\n\timport = async (buffer: Buffer) => {\n\t\tthis.context.log('Importing data...');\n\t\t// close the document DB\n\t\tawait closeDatabase(this.context.documentDb);\n\n\t\tconst metaExport = JSON.parse(buffer.toString()) as ExportData;\n\t\tawait this.meta.resetFrom(metaExport);\n\t\t// now reset the document DB to the specified version\n\t\t// and run migrations to get it to the latest version\n\t\tconst version = metaExport.schema.version;\n\t\tconst deleteReq = indexedDB.deleteDatabase(\n\t\t\t[this.namespace, 'collections'].join('_'),\n\t\t);\n\t\tawait new Promise((resolve, reject) => {\n\t\t\tdeleteReq.onsuccess = resolve;\n\t\t\tdeleteReq.onerror = reject;\n\t\t});\n\t\t// reset our context to the imported schema for now\n\t\tconst currentSchema = this.context.schema;\n\t\tthis.context.schema = metaExport.schema;\n\t\t// now open the document DB empty at the specified version\n\t\t// and initialize it from the meta DB\n\t\tthis.context.documentDb = await openDocumentDatabase({\n\t\t\tmeta: this.meta,\n\t\t\tmigrations: this.config.migrations,\n\t\t\tcontext: this.context,\n\t\t\tversion,\n\t\t});\n\t\t// re-initialize data\n\t\tthis.context.log('Re-initializing data from imported data...');\n\t\tawait this._entities.addData({\n\t\t\toperations: metaExport.operations,\n\t\t\tbaselines: metaExport.baselines,\n\t\t\treset: true,\n\t\t});\n\t\t// close the database and reopen to latest version, applying\n\t\t// migrations\n\t\tawait closeDatabase(this.context.documentDb);\n\t\tthis.context.log('Migrating up to latest schema...');\n\t\t// put the schema back\n\t\tthis.context.schema = currentSchema;\n\t\tthis.context.documentDb = await openDocumentDatabase({\n\t\t\tmeta: this.meta,\n\t\t\tmigrations: this.config.migrations,\n\t\t\tcontext: this.context,\n\t\t\tversion: currentSchema.version,\n\t\t});\n\t};\n}\n", "/**\n * This exists since I'm a little anxious about using WeakRef in production\n * and want to be able to roll it back quickly to debug issues. Basically by adding\n * import { WeakRef } from 'FakeWeakRef' to the top of the file, we can switch back\n * to using a simple object reference.\n */\n\nexport class FakeWeakRef<T extends symbol | object> {\n\tconstructor(value: T) {\n\t\tthis.value = value;\n\t}\n\n\tvalue: T;\n\n\tderef(): T | undefined {\n\t\treturn this.value;\n\t}\n}\n", "import {\n\tEventSubscriber,\n\tMigration,\n\tStorageSchema,\n\thashObject,\n} from '@verdant-web/common';\nimport { Context } from '../context.js';\nimport { FileManagerConfig } from '../files/FileManager.js';\nimport { Metadata } from '../metadata/Metadata.js';\nimport {\n\topenMetadataDatabase,\n\topenWIPMetadataDatabase,\n} from '../metadata/openMetadataDatabase.js';\nimport {\n\topenDocumentDatabase,\n\topenWIPDocumentDatabase,\n} from '../migration/openDatabase.js';\nimport { ServerSyncOptions } from '../sync/Sync.js';\nimport { UndoHistory } from '../UndoHistory.js';\nimport { Client } from './Client.js';\nimport {\n\tdeleteAllDatabases,\n\tdeleteDatabase,\n\tgetAllDatabaseNamesAndVersions,\n} from '../idb.js';\nimport { FakeWeakRef } from '../FakeWeakRef.js';\n\nexport interface ClientDescriptorOptions<Presence = any, Profile = any> {\n\t/** The schema used to create this client */\n\tschema: StorageSchema<any>;\n\t/** Migrations, in order, to upgrade to each successive version of the schema */\n\tmigrations: Migration<any>[];\n\t/** Provide a sync config to turn on synchronization with a server */\n\tsync?: ServerSyncOptions<Profile, Presence>;\n\t/** Optionally override the IndexedDB implementation */\n\tindexedDb?: IDBFactory;\n\t/**\n\t * Namespaces are used to separate data from different clients in IndexedDB.\n\t */\n\tnamespace: string;\n\t/**\n\t * Provide your own UndoHistory to have a unified undo system across multiple\n\t * clients if you so desire.\n\t */\n\tundoHistory?: UndoHistory;\n\t/**\n\t * Provide a log function to log internal debug messages\n\t */\n\tlog?: (...args: any[]) => void;\n\tdisableRebasing?: boolean;\n\t/**\n\t * Provide a specific schema number to override the schema version\n\t * in the database. This is useful for testing migrations or recovering\n\t * from a mistakenly deployed incorrect schema. A specific version is required\n\t * so that you don't leave this on accidentally for all new schemas.\n\t */\n\toverrideSchemaConflict?: number;\n\t/**\n\t * Configuration for file management\n\t */\n\tfiles?: FileManagerConfig;\n\t/**\n\t * Enables experimental WeakRef usage to cull documents\n\t * from cache that aren't being used. This is a performance\n\t * optimization which has been tested under all Verdant's test\n\t * suites but I still want to keep testing it in the real world\n\t * before turning it on.\n\t */\n\tEXPERIMENTAL_weakRefs?: boolean;\n}\n\n/**\n * Since storage initialization is async, this class wraps the core\n * Storage creation promise and exposes some metadata which can\n * be useful immediately.\n */\nexport class ClientDescriptor<\n\tPresence = any,\n\tProfile = any,\n\tClientImpl extends Client = Client,\n> {\n\tprivate readonly _readyPromise: Promise<ClientImpl>;\n\t// assertions because these are defined by plucking them from\n\t// Promise initializer\n\tprivate resolveReady!: (storage: ClientImpl) => void;\n\tprivate rejectReady!: (err: Error) => void;\n\tprivate _resolvedValue: ClientImpl | undefined;\n\tprivate _initializing = false;\n\tprivate _namespace: string;\n\n\tget namespace() {\n\t\treturn this._namespace;\n\t}\n\n\tconstructor(\n\t\tprivate readonly init: ClientDescriptorOptions<Presence, Profile>,\n\t) {\n\t\tthis._readyPromise = new Promise((resolve, reject) => {\n\t\t\tthis.resolveReady = resolve;\n\t\t\tthis.rejectReady = reject;\n\t\t});\n\t\tthis._namespace = init.namespace;\n\t}\n\n\tprivate initialize = async (init: ClientDescriptorOptions) => {\n\t\t// if server-side and no alternative IndexedDB implementation was provided,\n\t\t// we can't initialize the storage\n\t\tif (typeof window === 'undefined' && !init.indexedDb) {\n\t\t\tthrow new Error(\n\t\t\t\t'A verdant client was initialized in an environment without IndexedDB. If you are using verdant in a server-rendered framework, you must enforce that all clients are initialized on the client-side, or you must provide some mock interface of IDBFactory to the ClientDescriptor options.',\n\t\t\t);\n\t\t}\n\n\t\tif (this._initializing || this._resolvedValue) {\n\t\t\treturn this._readyPromise;\n\t\t}\n\t\tthis._initializing = true;\n\t\ttry {\n\t\t\tlet storage: ClientImpl;\n\t\t\tif (init.schema.wip) {\n\t\t\t\tstorage = await this.initializeWIPDatabases(init);\n\t\t\t} else {\n\t\t\t\tstorage = await this.initializeDatabases(init);\n\t\t\t\tthis.cleanupWIPDatabases(init);\n\t\t\t}\n\n\t\t\tthis.resolveReady(storage);\n\t\t\tthis._resolvedValue = storage;\n\t\t\treturn storage;\n\t\t} catch (err) {\n\t\t\tthis.rejectReady(err as Error);\n\t\t\tthrow err;\n\t\t} finally {\n\t\t\tthis._initializing = false;\n\t\t}\n\t};\n\n\tprivate initializeDatabases = async (init: ClientDescriptorOptions) => {\n\t\tconst { db: metaDb } = await openMetadataDatabase({\n\t\t\tindexedDB: init.indexedDb,\n\t\t\tlog: init.log,\n\t\t\tnamespace: init.namespace,\n\t\t});\n\n\t\tconst context: Omit<Context, 'documentDb'> = {\n\t\t\tnamespace: this._namespace,\n\t\t\tmetaDb,\n\t\t\tschema: init.schema,\n\t\t\tlog: init.log || (() => {}),\n\t\t\tundoHistory: init.undoHistory || new UndoHistory(),\n\t\t\tentityEvents: new EventSubscriber(),\n\t\t\tglobalEvents: new EventSubscriber(),\n\t\t\tweakRef: (value) => {\n\t\t\t\tif (init.EXPERIMENTAL_weakRefs) {\n\t\t\t\t\treturn new WeakRef(value);\n\t\t\t\t} else {\n\t\t\t\t\treturn new FakeWeakRef(value) as unknown as WeakRef<typeof value>;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t\tconst meta = new Metadata({\n\t\t\tcontext,\n\t\t\tdisableRebasing: init.disableRebasing,\n\t\t});\n\n\t\t// verify schema integrity\n\t\tawait meta.updateSchema(init.schema, init.overrideSchemaConflict);\n\n\t\tconst documentDb = await openDocumentDatabase({\n\t\t\tcontext,\n\t\t\tversion: init.schema.version,\n\t\t\tmeta,\n\t\t\tmigrations: init.migrations,\n\t\t\tindexedDB: init.indexedDb,\n\t\t});\n\n\t\tconst fullContext: Context = Object.assign(context, { documentDb });\n\n\t\tconst storage = new Client(\n\t\t\t{\n\t\t\t\tsyncConfig: init.sync,\n\t\t\t\tmigrations: init.migrations,\n\t\t\t\tfiles: init.files,\n\t\t\t},\n\t\t\tfullContext,\n\t\t\t{\n\t\t\t\tmeta,\n\t\t\t},\n\t\t) as ClientImpl;\n\n\t\treturn storage;\n\t};\n\n\tprivate initializeWIPDatabases = async (init: ClientDescriptorOptions) => {\n\t\tconst schemaHash = hashObject(init.schema);\n\t\tconsole.info(`WIP schema in use. Opening database with hash ${schemaHash}`);\n\n\t\tconst wipNamespace = `@@wip_${init.namespace}_${schemaHash}`;\n\t\tconst { db: metaDb } = await openWIPMetadataDatabase({\n\t\t\tindexedDB: init.indexedDb,\n\t\t\tlog: init.log,\n\t\t\tnamespace: init.namespace,\n\t\t\twipNamespace: wipNamespace,\n\t\t});\n\n\t\tconst context: Omit<Context, 'documentDb'> = {\n\t\t\tnamespace: this._namespace,\n\t\t\tmetaDb,\n\t\t\tschema: init.schema,\n\t\t\tlog: init.log || (() => {}),\n\t\t\tundoHistory: init.undoHistory || new UndoHistory(),\n\t\t\tentityEvents: new EventSubscriber(),\n\t\t\tglobalEvents: new EventSubscriber(),\n\t\t\tweakRef: (value) => {\n\t\t\t\tif (init.EXPERIMENTAL_weakRefs) {\n\t\t\t\t\treturn new WeakRef(value);\n\t\t\t\t} else {\n\t\t\t\t\treturn new FakeWeakRef(value) as unknown as WeakRef<typeof value>;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t\tconst meta = new Metadata({\n\t\t\tcontext,\n\t\t\tdisableRebasing: init.disableRebasing,\n\t\t});\n\n\t\t// verify schema integrity\n\t\tawait meta.updateSchema(init.schema, init.overrideSchemaConflict);\n\n\t\tconst documentDb = await openWIPDocumentDatabase({\n\t\t\tcontext,\n\t\t\tversion: init.schema.version,\n\t\t\tmeta,\n\t\t\tmigrations: init.migrations,\n\t\t\tindexedDB: init.indexedDb,\n\t\t\twipNamespace,\n\t\t});\n\n\t\tconst fullContext: Context = Object.assign(context, { documentDb });\n\n\t\tconst storage = new Client(\n\t\t\t{\n\t\t\t\tsyncConfig: init.sync,\n\t\t\t\tmigrations: init.migrations,\n\t\t\t\tfiles: init.files,\n\t\t\t},\n\t\t\tfullContext,\n\t\t\t{\n\t\t\t\tmeta,\n\t\t\t},\n\t\t) as ClientImpl;\n\n\t\treturn storage;\n\t};\n\n\tprivate cleanupWIPDatabases = async (init: ClientDescriptorOptions) => {\n\t\tconst databaseInfo = await getAllDatabaseNamesAndVersions(init.indexedDb);\n\t\tconst wipDatabases = databaseInfo\n\t\t\t.filter((db) => db.name?.startsWith('@@wip_'))\n\t\t\t.map((db) => db.name!);\n\t\t// don't clear a current WIP database.\n\t\tconst wipDatabasesToDelete = wipDatabases.filter(\n\t\t\t(db) =>\n\t\t\t\t!db.startsWith(`@@wip_${init.namespace}_${hashObject(init.schema)}`),\n\t\t);\n\t\tfor (const db of wipDatabasesToDelete) {\n\t\t\tawait deleteDatabase(db, init.indexedDb);\n\t\t}\n\t};\n\n\tget current() {\n\t\t// exposing an immediate value if already resolved lets us\n\t\t// skip the promise microtask when accessing this externally if\n\t\t// the initialization has been completed.\n\t\treturn this._resolvedValue;\n\t}\n\n\tget readyPromise() {\n\t\treturn this._readyPromise;\n\t}\n\n\tget schema() {\n\t\treturn this.init.schema;\n\t}\n\n\topen = () => this.initialize(this.init);\n\n\tclose = async () => {\n\t\tif (this._resolvedValue) {\n\t\t\tthis._resolvedValue.close();\n\t\t}\n\t\tif (this._initializing) {\n\t\t\t(await this._readyPromise).close();\n\t\t}\n\t};\n\n\t__dangerous__resetLocal = async () => {\n\t\tawait deleteAllDatabases(this.namespace);\n\t};\n}\n", "import * as everything from './index.js';\n\n(window as any).Verdant = everything;\n"],
|
|
5
|
-
"mappings": "+lBAAA,IAAAA,GAAAC,GAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAO,QAAU,SAAcC,EAAKC,EAAM,CACxC,IAAIC,EAAI,YAAcF,EACtB,OAAOE,EAAE,OAAOA,EAAE,OAASD,CAAI,CACjC,ICHA,IAAAE,GAAAC,GAAA,CAAAC,GAAAC,KAAA,KAAIC,GAAM,KAENC,GAAM,OAAO,QAAW,SAAW,OAAS,KAC5CC,GAAc,OAAO,KAAKD,EAAG,EAAE,OAC/BE,GAAkB,UAAU,UAAY,UAAU,UAAU,OAAS,EACrEC,GAAWJ,IAAKG,GAClB,UAAU,UAAU,QAAQ,SAAS,EAAE,EACvCD,GAAY,SAAS,EAAE,EAAG,CAAC,EAE7BH,GAAO,QAAU,UAAwB,CACvC,OAAOK,EACT,ICXA,IAAAC,GAAAC,GAAA,CAAAC,GAAAC,KAAA,CACA,IAAIC,GAEAC,GAAS,OAAO,OAAW,MAC5B,OAAO,QAAU,OAAO,WACzB,OAAO,KAAS,KAChB,KAAK,OAEHA,IACIC,GAAM,KAAK,IAAI,EAAG,EAAE,EAAI,EAC5BF,GAAiB,UAAY,CACzB,OAAO,KAAK,IAAIC,GAAO,gBAAgB,IAAI,YAAY,CAAC,CAAC,EAAE,CAAC,EAAIC,EAAG,CACvE,GAEAF,GAAiB,KAAK,OALlB,IAAAE,GAQRH,GAAO,QAAUC,KCjBjB,IAAAG,GAAAC,GAAA,CAAAC,GAAAC,KAAA,CAYA,IAAIC,GAAc,KACdC,GAAM,KACNC,GAAiB,KAEjBC,GAAI,EACNC,GAAY,EACZC,GAAO,GACPC,GAAiB,KAAK,IAAID,GAAMD,EAAS,EAE3C,SAASG,IAAe,CACtB,OAAON,IAAKC,GAAe,EACzBI,IAAkB,GACjB,SAASD,EAAI,EAAGD,EAAS,CAC9B,CAEA,SAASI,IAAe,CACtB,OAAAL,GAAIA,GAAIG,GAAiBH,GAAI,EAC7BA,KACOA,GAAI,CACb,CAEA,SAASM,IAAQ,CAGf,IAAIC,EAAS,IAKXC,EAAa,IAAI,KAAK,EAAE,QAAQ,EAAG,SAASN,EAAI,EAGhDO,EAAUX,GAAIO,GAAY,EAAE,SAASH,EAAI,EAAGD,EAAS,EAKrDS,EAAQb,GAAY,EAGpBc,EAASP,GAAY,EAAIA,GAAY,EAEvC,OAAOG,EAASC,EAAYC,EAAUC,EAAQC,CAChD,CAEAL,GAAK,KAAO,UAAiB,CAC3B,IAAIM,EAAO,IAAI,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EACzCH,EAAUJ,GAAY,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,EAC7CK,EAAQb,GAAY,EAAE,MAAM,EAAG,CAAC,EAC9BA,GAAY,EAAE,MAAM,EAAE,EACxBc,EAASP,GAAY,EAAE,MAAM,EAAE,EAEjC,OAAOQ,EAAK,MAAM,EAAE,EAClBH,EAAUC,EAAQC,CACtB,EAEAL,GAAK,OAAS,SAAiBO,EAAe,CAC5C,OAAI,OAAOA,GAAkB,SAAiB,GAC1C,EAAAA,EAAc,WAAW,GAAG,CAElC,EAEAP,GAAK,OAAS,SAAiBO,EAAe,CAC5C,GAAI,OAAOA,GAAkB,SAAU,MAAO,GAC9C,IAAIC,EAAeD,EAAc,OACjC,OAAIC,GAAgB,GAAKA,GAAgB,EAE3C,EAEAR,GAAK,YAAcT,GAEnBD,GAAO,QAAUU,KCnFjB,IAAAS,GAAAC,GAAA,CAAAC,GAAAC,KAAA,EAAC,SAASC,EAAE,CAAC,IAAI,EAAY,OAAOF,IAAjB,SAAyBC,GAAO,QAAQC,EAAE,EAAc,OAAO,QAAnB,YAA2B,OAAO,IAAI,OAAOA,CAAC,GAAgB,OAAO,OAApB,IAA2B,EAAE,OAAoB,OAAO,OAApB,IAA2B,EAAE,OAAoB,OAAO,KAApB,MAA2B,EAAE,MAAM,EAAE,WAAWA,EAAE,EAAE,GAAE,UAAU,CAAC,OAAO,SAASC,EAAEC,EAAEC,EAAEC,EAAE,CAAC,SAASC,EAAEC,EAAEN,EAAE,CAAC,GAAG,CAACG,EAAEG,CAAC,EAAE,CAAC,GAAG,CAACJ,EAAEI,CAAC,EAAE,CAAC,IAAIC,EAAc,OAAO,SAAnB,YAA4B,QAAQ,GAAG,CAACP,GAAGO,EAAE,OAAOA,EAAED,EAAE,EAAE,EAAE,GAAGE,EAAE,OAAOA,EAAEF,EAAE,EAAE,EAAE,MAAM,IAAI,MAAM,uBAAuBA,EAAE,GAAG,CAAC,CAACN,EAAEG,EAAEG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAEJ,EAAEI,CAAC,EAAE,CAAC,EAAE,KAAKN,EAAE,QAAQ,SAASA,EAAE,CAAC,IAAIO,EAAEL,EAAEI,CAAC,EAAE,CAAC,EAAEN,CAAC,EAAE,OAAOK,EAAEE,GAAGP,CAAC,CAAC,EAAEA,EAAEA,EAAE,QAAQC,EAAEC,EAAEC,EAAEC,CAAC,CAAC,CAAC,OAAOD,EAAEG,CAAC,EAAE,OAAO,CAAC,QAAQE,EAAc,OAAO,SAAnB,YAA4B,QAAQR,EAAE,EAAEA,EAAEI,EAAE,OAAOJ,IAAIK,EAAED,EAAEJ,CAAC,CAAC,EAAE,OAAOK,CAAC,EAAE,CAAC,EAAE,CAAC,SAASI,EAAEC,EAAEC,EAAE,EAAE,SAASX,EAAEM,EAAE,EAAEM,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,EAAE,CAAC,aAAa,IAAIhB,EAAEQ,EAAE,QAAQ,EAAE,SAASF,EAAEP,EAAEO,EAAE,CAACA,EAAEH,EAAEJ,EAAEO,CAAC,EAAE,IAAID,EAAE,OAAiBA,EAAkBC,EAAE,YAAlB,cAA4BN,EAAE,WAAWM,EAAE,SAAS,EAAE,IAAIW,GAAG,QAAzE,SAAiFZ,EAAE,MAAMA,EAAE,OAAOA,EAAE,IAAIA,EAAE,QAAQa,EAAEZ,EAAED,CAAC,EAAE,SAASN,CAAC,EAAEM,EAAE,QAAQA,EAAE,IAAI,EAAE,EAAEA,EAAE,OAAOA,EAAE,OAAkBC,EAAE,WAAb,SAAsB,OAAOA,EAAE,QAAQ,GAAGP,EAAEM,EAAE,KAAK,EAAaC,EAAE,WAAb,SAAsBP,EAAE,SAASO,EAAE,QAAQ,EAAEP,EAAE,EAAEW,EAAED,EAAE,QAAQH,GAAG,KAAK,SAASP,EAAE,CAAC,OAAOO,EAAEP,CAAC,CAAC,EAAEW,EAAE,KAAK,SAASX,EAAE,CAAC,OAAOO,EAAEP,EAAE,CAAC,cAAc,GAAG,UAAU,OAAO,SAAS,KAAK,CAAC,CAAC,EAAEW,EAAE,IAAI,SAASX,EAAE,CAAC,OAAOO,EAAEP,EAAE,CAAC,UAAU,MAAM,SAAS,KAAK,CAAC,CAAC,EAAEW,EAAE,QAAQ,SAASX,EAAE,CAAC,OAAOO,EAAEP,EAAE,CAAC,UAAU,MAAM,SAAS,MAAM,cAAc,EAAE,CAAC,CAAC,EAAE,IAAIE,EAAED,EAAE,UAAUA,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,OAAO,KAAK,EAAEE,GAAGD,EAAE,KAAK,aAAa,EAAE,CAAC,SAAS,MAAM,SAAS,QAAQ,GAAG,SAASE,EAAEJ,EAAEO,EAAE,CAAC,IAAID,EAAE,CAAC,EAAE,GAAGA,EAAE,WAAWC,EAAEA,GAAG,CAAC,GAAG,WAAW,OAAOD,EAAE,SAASC,EAAE,UAAU,MAAMD,EAAE,cAAc,CAAC,CAACC,EAAE,cAAcD,EAAE,UAAUA,EAAE,UAAU,YAAY,EAAEA,EAAE,SAASA,EAAE,SAAS,YAAY,EAAEA,EAAE,cAAmBC,EAAE,gBAAP,GAAqBD,EAAE,YAAiBC,EAAE,cAAP,GAAmBD,EAAE,qBAA0BC,EAAE,uBAAP,GAA4BD,EAAE,0BAA+BC,EAAE,4BAAP,GAAiCD,EAAE,gBAAqBC,EAAE,kBAAP,GAAuBD,EAAE,cAAmBC,EAAE,gBAAP,GAAqBD,EAAE,iBAAsBC,EAAE,mBAAP,GAAwBD,EAAE,SAASC,EAAE,UAAU,OAAOD,EAAE,YAAYC,EAAE,aAAa,OAAgBP,IAAT,OAAW,MAAM,IAAI,MAAM,2BAA2B,EAAE,QAAQC,EAAE,EAAEA,EAAEC,EAAE,OAAO,EAAED,EAAEC,EAAED,CAAC,EAAE,YAAY,IAAIK,EAAE,UAAU,YAAY,IAAIA,EAAE,UAAUJ,EAAED,CAAC,GAAG,GAAQC,EAAE,QAAQI,EAAE,SAAS,IAA1B,GAA4B,MAAM,IAAI,MAAM,cAAcA,EAAE,UAAU,uCAAuCJ,EAAE,KAAK,IAAI,CAAC,EAAE,GAAQC,EAAE,QAAQG,EAAE,QAAQ,IAAzB,IAA4CA,EAAE,YAAlB,cAA4B,MAAM,IAAI,MAAM,aAAaA,EAAE,SAAS,uCAAuCH,EAAE,KAAK,IAAI,CAAC,EAAE,OAAOG,CAAC,CAAC,SAASE,EAAER,EAAE,CAAC,GAAe,OAAOA,GAAnB,WAAqB,MAAa,wDAAwD,KAAK,SAAS,UAAU,SAAS,KAAKA,CAAC,CAAC,GAAtG,IAAuG,CAAC,SAASmB,EAAEjB,EAAEK,EAAEJ,EAAE,CAACA,EAAEA,GAAG,CAAC,EAAE,SAASC,EAAEJ,EAAE,CAAC,OAAOO,EAAE,OAAOA,EAAE,OAAOP,EAAE,MAAM,EAAEO,EAAE,MAAMP,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,SAAS,SAASA,EAAE,CAAC,OAAO,KAAK,MAAaA,EAAEE,EAAE,SAASA,EAAE,SAASF,CAAC,EAAEA,KAAnC,KAAsC,OAAO,OAAOA,EAAE,EAAEA,CAAC,CAAC,EAAE,QAAQ,SAASO,EAAE,CAAC,IAAID,EAAEN,EAAE,OAAO,UAAU,SAAS,KAAKO,CAAC,EAAEN,EAAE,mBAAmB,KAAKD,CAAC,EAA+C,GAA7CC,GAAGA,EAAEA,EAAEA,EAAE,CAAC,EAAE,YAAYD,EAAE,KAAK,YAAY,EAAK,IAAIA,EAAEG,EAAE,QAAQI,CAAC,GAAG,OAAO,KAAK,SAAS,aAAaP,EAAE,GAAG,EAAE,GAAGG,EAAE,KAAKI,CAAC,EAAW,IAAT,QAAY,EAAE,UAAU,EAAE,SAASA,CAAC,EAAE,OAAOH,EAAE,SAAS,EAAEA,EAAEG,CAAC,EAAE,GAAcN,IAAX,UAA2BA,IAAb,YAAkCA,IAAlB,gBAAoB,OAAOD,EAAE,OAAO,KAAKO,CAAC,EAAEL,EAAE,mBAAmBF,EAAEA,EAAE,KAAK,GAAQE,EAAE,cAAP,IAAoBM,EAAED,CAAC,GAAGP,EAAE,OAAO,EAAE,EAAE,YAAY,YAAY,aAAa,EAAEE,EAAE,cAAcF,EAAEA,EAAE,OAAO,SAASA,EAAE,CAAC,MAAM,CAACE,EAAE,YAAYF,CAAC,CAAC,CAAC,GAAGI,EAAE,UAAUJ,EAAE,OAAO,GAAG,EAAEM,EAAE,KAAKN,EAAE,QAAQ,SAASA,EAAE,CAACM,EAAE,SAASN,CAAC,EAAEI,EAAE,GAAG,EAAEF,EAAE,eAAeI,EAAE,SAASC,EAAEP,CAAC,CAAC,EAAEI,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,IAAIH,CAAC,EAAE,CAAC,GAAGC,EAAE,cAAc,OAAOE,EAAE,IAAIH,EAAE,GAAG,EAAE,MAAM,IAAI,MAAM,wBAAwBA,EAAE,GAAG,CAAC,CAAC,KAAK,IAAIA,CAAC,EAAEM,CAAC,CAAC,EAAE,OAAO,SAASP,EAAEO,EAAE,CAACA,EAAWA,IAAT,OAAWA,EAAOL,EAAE,kBAAP,GAAuB,IAAII,EAAE,KAAK,GAAGF,EAAE,SAASJ,EAAE,OAAO,GAAG,EAAE,CAACO,GAAGP,EAAE,QAAQ,EAAE,OAAOA,EAAE,QAAQ,SAASA,EAAE,CAAC,OAAOM,EAAE,SAASN,CAAC,CAAC,CAAC,EAAE,IAAIC,EAAE,CAAC,EAAEM,EAAEP,EAAE,IAAI,SAASA,EAAE,CAAC,IAAIO,EAAE,IAAIW,EAAEZ,EAAEH,EAAE,MAAM,EAAE,OAAOgB,EAAEjB,EAAEK,EAAED,CAAC,EAAE,SAASN,CAAC,EAAEC,EAAEA,EAAE,OAAOK,EAAE,MAAMH,EAAE,MAAM,CAAC,EAAEI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,OAAOJ,EAAEA,EAAE,OAAOF,CAAC,EAAEM,EAAE,KAAK,EAAE,KAAK,OAAOA,EAAE,EAAE,CAAC,EAAE,MAAM,SAASP,EAAE,CAAC,OAAOI,EAAE,QAAQJ,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,SAASA,EAAE,CAAC,OAAOI,EAAE,UAAUJ,EAAE,SAAS,CAAC,CAAC,EAAE,OAAO,SAASA,EAAE,CAAC,OAAOI,EAAE,SAASJ,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,SAASA,EAAE,CAAC,OAAOI,EAAE,QAAQJ,EAAE,SAAS,CAAC,CAAC,EAAE,QAAQ,SAASA,EAAE,CAACI,EAAE,UAAUJ,EAAE,OAAO,GAAG,EAAEI,EAAEJ,EAAE,SAAS,CAAC,CAAC,EAAE,UAAU,SAASA,EAAE,CAACI,EAAE,KAAK,EAAEI,EAAER,CAAC,EAAE,KAAK,SAAS,UAAU,EAAE,KAAK,SAASA,EAAE,SAAS,CAAC,EAAOE,EAAE,uBAAP,IAA6B,KAAK,SAAS,iBAAiB,OAAOF,EAAE,IAAI,CAAC,EAAEE,EAAE,2BAA2B,KAAK,QAAQF,CAAC,CAAC,EAAE,QAAQ,SAASA,EAAE,CAAC,OAAOI,EAAE,UAAUJ,EAAE,SAAS,CAAC,CAAC,EAAE,KAAK,SAASA,EAAE,CAAC,OAAOI,EAAE,OAAOJ,EAAE,SAAS,CAAC,CAAC,EAAE,MAAM,UAAU,CAAC,OAAOI,EAAE,MAAM,CAAC,EAAE,WAAW,UAAU,CAAC,OAAOA,EAAE,WAAW,CAAC,EAAE,QAAQ,SAASJ,EAAE,CAAC,OAAOI,EAAE,SAASJ,EAAE,SAAS,CAAC,CAAC,EAAE,YAAY,SAASA,EAAE,CAAC,OAAOI,EAAE,aAAa,EAAE,KAAK,SAAS,MAAM,UAAU,MAAM,KAAKJ,CAAC,CAAC,CAAC,EAAE,mBAAmB,SAASA,EAAE,CAAC,OAAOI,EAAE,oBAAoB,EAAE,KAAK,SAAS,MAAM,UAAU,MAAM,KAAKJ,CAAC,CAAC,CAAC,EAAE,WAAW,SAASA,EAAE,CAAC,OAAOI,EAAE,YAAY,EAAE,KAAK,SAAS,MAAM,UAAU,MAAM,KAAKJ,CAAC,CAAC,CAAC,EAAE,aAAa,SAASA,EAAE,CAAC,OAAOI,EAAE,cAAc,EAAE,KAAK,SAAS,MAAM,UAAU,MAAM,KAAKJ,CAAC,CAAC,CAAC,EAAE,YAAY,SAASA,EAAE,CAAC,OAAOI,EAAE,aAAa,EAAE,KAAK,SAAS,MAAM,UAAU,MAAM,KAAKJ,CAAC,CAAC,CAAC,EAAE,aAAa,SAASA,EAAE,CAAC,OAAOI,EAAE,cAAc,EAAE,KAAK,SAAS,MAAM,UAAU,MAAM,KAAKJ,CAAC,CAAC,CAAC,EAAE,YAAY,SAASA,EAAE,CAAC,OAAOI,EAAE,aAAa,EAAE,KAAK,SAAS,MAAM,UAAU,MAAM,KAAKJ,CAAC,CAAC,CAAC,EAAE,cAAc,SAASA,EAAE,CAAC,OAAOI,EAAE,eAAe,EAAE,KAAK,SAAS,MAAM,UAAU,MAAM,KAAKJ,CAAC,CAAC,CAAC,EAAE,cAAc,SAASA,EAAE,CAAC,OAAOI,EAAE,eAAe,EAAE,KAAK,SAAS,MAAM,UAAU,MAAM,KAAKJ,CAAC,CAAC,CAAC,EAAE,aAAa,SAASA,EAAE,CAAC,OAAOI,EAAE,cAAc,EAAE,KAAK,SAAS,IAAI,WAAWJ,CAAC,CAAC,CAAC,EAAE,KAAK,SAASA,EAAE,CAAC,OAAOI,EAAE,OAAOJ,EAAE,SAAS,CAAC,CAAC,EAAE,KAAK,SAASA,EAAE,CAAC,OAAAI,EAAE,MAAM,EAAEJ,EAAE,MAAM,KAAKA,CAAC,EAAS,KAAK,OAAOA,EAAOE,EAAE,gBAAP,EAAoB,CAAC,EAAE,KAAK,SAASF,EAAE,CAAC,OAAAI,EAAE,MAAM,EAAEJ,EAAE,MAAM,KAAKA,CAAC,EAAS,KAAK,OAAOA,EAAOE,EAAE,gBAAP,EAAoB,CAAC,EAAE,MAAM,SAASF,EAAE,CAAC,OAAOI,EAAE,OAAO,EAAE,KAAK,SAAS,CAACJ,EAAE,KAAKA,EAAE,KAAKA,EAAE,KAAKA,EAAE,WAAW,CAAC,CAAC,EAAE,MAAM,UAAU,CAAC,GAAGE,EAAE,cAAc,OAAOE,EAAE,QAAQ,EAAE,MAAM,MAAM;AAAA;AAAA;AAAA,CAA6J,CAAC,EAAE,WAAW,UAAU,CAAC,OAAOA,EAAE,WAAW,CAAC,EAAE,QAAQ,SAASJ,EAAE,CAAC,OAAOI,EAAE,UAAUJ,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,UAAU,CAAC,OAAOI,EAAE,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,OAAOA,EAAE,OAAO,CAAC,EAAE,MAAM,UAAU,CAAC,OAAOA,EAAE,MAAM,CAAC,EAAE,KAAK,UAAU,CAAC,OAAOA,EAAE,KAAK,CAAC,EAAE,KAAK,UAAU,CAAC,OAAOA,EAAE,KAAK,CAAC,EAAE,KAAK,UAAU,CAAC,OAAOA,EAAE,KAAK,CAAC,EAAE,aAAa,UAAU,CAAC,OAAOA,EAAE,aAAa,CAAC,EAAE,eAAe,UAAU,CAAC,OAAOA,EAAE,eAAe,CAAC,EAAE,YAAY,UAAU,CAAC,OAAOA,EAAE,YAAY,CAAC,EAAE,MAAM,UAAU,CAAC,OAAOA,EAAE,MAAM,CAAC,EAAE,SAAS,UAAU,CAAC,OAAOA,EAAE,SAAS,CAAC,EAAE,YAAY,UAAU,CAAC,OAAOA,EAAE,YAAY,CAAC,EAAE,YAAY,UAAU,CAAC,OAAOA,EAAE,YAAY,CAAC,EAAE,UAAU,UAAU,CAAC,OAAOA,EAAE,UAAU,CAAC,EAAE,QAAQ,UAAU,CAAC,OAAOA,EAAE,QAAQ,CAAC,EAAE,SAAS,UAAU,CAAC,OAAOA,EAAE,SAAS,CAAC,EAAE,SAAS,UAAU,CAAC,OAAOA,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAASc,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,SAASlB,EAAE,CAAC,KAAK,KAAKA,CAAC,EAAE,IAAI,SAASA,EAAE,CAAC,KAAK,KAAKA,CAAC,EAAE,KAAK,UAAU,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC,CAACW,EAAE,cAAc,SAASX,EAAEO,EAAED,EAAE,CAAC,OAAgBA,IAAT,SAAaA,EAAEC,EAAEA,EAAE,CAAC,GAAGY,EAAEZ,EAAEH,EAAEJ,EAAEO,CAAC,EAAED,CAAC,EAAE,SAASN,CAAC,CAAC,CAAC,GAAE,KAAK,KAAKS,EAAE,QAAQ,EAAe,OAAO,KAApB,IAAyB,KAAkB,OAAO,OAApB,IAA2B,OAAO,CAAC,EAAEA,EAAE,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,oBAAoB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,SAAST,EAAE,EAAEmB,EAAE,EAAE,SAASnB,EAAEO,EAAED,EAAEL,EAAEC,EAAEC,EAAEC,EAAEC,EAAEG,EAAE,EAAE,SAASR,EAAE,CAAC,aAAa,IAAIQ,EAAe,OAAO,WAApB,IAA+B,WAAW,MAAMD,EAAE,IAAI,WAAW,CAAC,EAAED,EAAE,IAAI,WAAW,CAAC,EAAEL,EAAE,IAAI,WAAW,CAAC,EAAEC,EAAE,IAAI,WAAW,CAAC,EAAEC,EAAE,IAAI,WAAW,CAAC,EAAEC,EAAE,IAAI,WAAW,CAAC,EAAEC,EAAE,IAAI,WAAW,CAAC,EAAE,SAASc,EAAEnB,EAAE,CAAC,OAAAA,EAAEA,EAAE,WAAW,CAAC,EAASA,IAAIO,GAAGP,IAAII,EAAE,GAAGJ,IAAIM,GAAGN,IAAIK,EAAE,GAAGL,EAAEC,EAAE,GAAGD,EAAEC,EAAE,GAAGD,EAAEC,EAAE,GAAG,GAAGD,EAAEG,EAAE,GAAGH,EAAEG,EAAEH,EAAEE,EAAE,GAAGF,EAAEE,EAAE,GAAG,MAAM,CAACF,EAAE,YAAY,SAASA,EAAE,CAAC,IAAIO,EAAED,EAAE,GAAG,EAAEN,EAAE,OAAO,EAAE,MAAM,IAAI,MAAM,gDAAgD,EAAE,IAAIC,EAAED,EAAE,OAAOC,EAAQD,EAAE,OAAOC,EAAE,CAAC,IAAlB,IAAoB,EAAQD,EAAE,OAAOC,EAAE,CAAC,IAAlB,IAAoB,EAAE,EAAEC,EAAE,IAAIM,EAAE,EAAER,EAAE,OAAO,EAAEC,CAAC,EAAEE,EAAE,EAAEF,EAAED,EAAE,OAAO,EAAEA,EAAE,OAAOI,EAAE,EAAE,SAASC,EAAEL,EAAE,CAACE,EAAEE,GAAG,EAAEJ,CAAC,CAAC,IAAIO,EAAE,EAAEA,EAAEJ,EAAEI,GAAG,EAAE,EAAEF,GAAG,UAAUC,EAAEa,EAAEnB,EAAE,OAAOO,CAAC,CAAC,GAAG,GAAGY,EAAEnB,EAAE,OAAOO,EAAE,CAAC,CAAC,GAAG,GAAGY,EAAEnB,EAAE,OAAOO,EAAE,CAAC,CAAC,GAAG,EAAEY,EAAEnB,EAAE,OAAOO,EAAE,CAAC,CAAC,KAAK,EAAE,EAAEF,GAAG,MAAMC,IAAI,CAAC,EAAED,EAAE,IAAIC,CAAC,EAAE,OAAUL,GAAH,EAAKI,EAAE,KAAKC,EAAEa,EAAEnB,EAAE,OAAOO,CAAC,CAAC,GAAG,EAAEY,EAAEnB,EAAE,OAAOO,EAAE,CAAC,CAAC,GAAG,EAAE,EAAKN,GAAH,IAAOI,GAAGC,EAAEa,EAAEnB,EAAE,OAAOO,CAAC,CAAC,GAAG,GAAGY,EAAEnB,EAAE,OAAOO,EAAE,CAAC,CAAC,GAAG,EAAEY,EAAEnB,EAAE,OAAOO,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAEF,EAAE,IAAIC,CAAC,GAAGJ,CAAC,EAAEF,EAAE,cAAc,SAASA,EAAE,CAAC,IAAIO,EAAED,EAAEL,EAAEC,EAAEC,EAAEH,EAAE,OAAO,EAAEI,EAAE,GAAG,SAASC,EAAEL,EAAE,CAAC,MAAM,mEAAmE,OAAOA,CAAC,CAAC,CAAC,IAAIO,EAAE,EAAEN,EAAED,EAAE,OAAOG,EAAEI,EAAEN,EAAEM,GAAG,EAAED,GAAGN,EAAEO,CAAC,GAAG,KAAKP,EAAEO,EAAE,CAAC,GAAG,GAAGP,EAAEO,EAAE,CAAC,EAAEH,GAAGC,GAAGH,EAAEI,IAAI,GAAG,EAAE,EAAED,EAAEH,GAAG,GAAG,EAAE,EAAEG,EAAEH,GAAG,EAAE,EAAE,EAAEG,EAAE,GAAGH,CAAC,EAAE,OAAOC,EAAE,CAAC,IAAK,GAAEC,GAAGA,GAAGC,GAAGC,EAAEN,EAAEA,EAAE,OAAO,CAAC,IAAI,CAAC,GAAGK,EAAEC,GAAG,EAAE,EAAE,EAAE,KAAK,MAAM,IAAK,GAAEF,GAAGA,GAAGA,GAAGC,GAAGC,GAAGN,EAAEA,EAAE,OAAO,CAAC,GAAG,GAAGA,EAAEA,EAAE,OAAO,CAAC,IAAI,EAAE,GAAGK,EAAEC,GAAG,EAAE,EAAE,GAAGD,EAAEC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,OAAOF,CAAC,CAAC,GAAWe,IAAT,OAAW,KAAK,SAAS,CAAC,EAAEA,CAAC,CAAC,GAAE,KAAK,KAAKnB,EAAE,QAAQ,EAAe,OAAO,KAApB,IAAyB,KAAkB,OAAO,OAApB,IAA2B,OAAO,CAAC,EAAEA,EAAE,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,kEAAkE,0DAA0D,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,SAASoB,EAAEpB,EAAEqB,EAAE,EAAE,SAASrB,EAAEM,EAAEa,EAAElB,EAAEa,EAAEC,EAAEC,EAAEC,EAAER,EAAE,CAAC,IAAID,EAAEY,EAAE,WAAW,EAAEjB,EAAEiB,EAAE,SAAS,EAAE,SAASD,EAAEnB,EAAEO,EAAED,EAAE,CAAC,GAAG,EAAE,gBAAgBa,GAAG,OAAO,IAAIA,EAAEnB,EAAEO,EAAED,CAAC,EAAE,IAAIL,EAAEC,EAAEC,EAAEC,EAAEC,EAAE,OAAOL,EAAE,GAAcO,IAAX,UAAwBF,GAAV,SAAY,IAAIL,GAAGI,EAAEJ,GAAG,KAAKI,EAAE,KAAK,EAAEA,EAAE,QAAQ,aAAa,EAAE,EAAEJ,EAAE,OAAO,GAAG,GAAGA,GAAG,IAAI,GAAaK,GAAV,SAAYJ,EAAEqB,GAAEtB,CAAC,UAAoBK,GAAV,SAAYJ,EAAEkB,EAAE,WAAWnB,EAAEO,CAAC,MAAM,CAAC,GAAaF,GAAV,SAAY,MAAM,IAAI,MAAM,uDAAuD,EAAEJ,EAAEqB,GAAEtB,EAAE,MAAM,CAAC,CAAC,GAAGmB,EAAE,gBAAgBjB,EAAEiB,EAAE,SAAS,IAAI,WAAWlB,CAAC,CAAC,IAAIC,EAAE,MAAM,OAAOD,EAAEC,EAAE,UAAU,IAAIiB,EAAE,iBAA2B,OAAOnB,EAAE,YAAnB,SAA8BE,EAAE,KAAKF,CAAC,UAAUuB,EAAEnB,EAAEJ,CAAC,GAAGmB,EAAE,SAASf,CAAC,GAAGA,GAAa,OAAOA,GAAjB,UAA8B,OAAOA,EAAE,QAAnB,SAA0B,IAAID,EAAE,EAAEA,EAAEF,EAAEE,IAAIgB,EAAE,SAASnB,CAAC,EAAEE,EAAEC,CAAC,EAAEH,EAAE,UAAUG,CAAC,EAAED,EAAEC,CAAC,EAAEH,EAAEG,CAAC,UAAoBE,GAAV,SAAYH,EAAE,MAAMF,EAAE,EAAEO,CAAC,UAAoBF,GAAV,UAAa,CAACc,EAAE,iBAAiB,CAACb,EAAE,IAAIH,EAAE,EAAEA,EAAEF,EAAEE,IAAID,EAAEC,CAAC,EAAE,EAAE,OAAOD,CAAC,CAAC,SAASQ,EAAEV,EAAEO,EAAED,EAAEL,EAAE,CAAC,OAAOkB,EAAE,cAAcP,GAAE,SAASZ,EAAE,CAAC,QAAQO,EAAE,CAAC,EAAED,EAAE,EAAEA,EAAEN,EAAE,OAAOM,IAAIC,EAAE,KAAK,IAAIP,EAAE,WAAWM,CAAC,CAAC,EAAE,OAAOC,CAAC,EAAEA,CAAC,EAAEP,EAAEM,EAAEL,CAAC,CAAC,CAAC,SAASU,EAAEX,EAAEO,EAAED,EAAEL,EAAE,CAAC,OAAOkB,EAAE,cAAcP,GAAE,SAASZ,EAAE,CAAC,QAAQO,EAAED,EAAEL,EAAE,CAAC,EAAEC,EAAE,EAAEA,EAAEF,EAAE,OAAOE,IAAII,EAAEN,EAAE,WAAWE,CAAC,EAAEK,EAAED,GAAG,EAAEA,EAAEA,EAAE,IAAIL,EAAE,KAAKK,CAAC,EAAEL,EAAE,KAAKM,CAAC,EAAE,OAAON,CAAC,EAAEM,CAAC,EAAEP,EAAEM,EAAEL,CAAC,CAAC,CAAC,SAASuB,EAAExB,EAAEO,EAAED,EAAE,CAAC,IAAIL,EAAE,GAAGK,EAAE,KAAK,IAAIN,EAAE,OAAOM,CAAC,EAAE,QAAQJ,EAAEK,EAAEL,EAAEI,EAAEJ,IAAID,GAAG,OAAO,aAAaD,EAAEE,CAAC,CAAC,EAAE,OAAOD,CAAC,CAAC,SAASC,EAAEF,EAAEO,EAAED,EAAEL,EAAE,CAACA,IAAIY,EAAa,OAAOP,GAAlB,UAAoB,2BAA2B,EAAEO,EAAQN,GAAN,KAAQ,gBAAgB,EAAEM,EAAEN,EAAE,EAAEP,EAAE,OAAO,qCAAqC,GAAG,IAAIE,EAAED,EAAED,EAAE,OAAO,GAAG,EAAEC,GAAGM,GAAG,OAAOD,GAAGJ,EAAEF,EAAEO,CAAC,EAAEA,EAAE,EAAEN,IAAIC,GAAGF,EAAEO,EAAE,CAAC,GAAG,KAAKL,EAAEF,EAAEO,CAAC,GAAG,EAAEA,EAAE,EAAEN,IAAIC,GAAGF,EAAEO,EAAE,CAAC,IAAIL,CAAC,CAAC,SAASE,EAAEJ,EAAEO,EAAED,EAAEL,EAAE,CAACA,IAAIY,EAAa,OAAOP,GAAlB,UAAoB,2BAA2B,EAAEO,EAAQN,GAAN,KAAQ,gBAAgB,EAAEM,EAAEN,EAAE,EAAEP,EAAE,OAAO,qCAAqC,GAAG,IAAIE,EAAED,EAAED,EAAE,OAAO,GAAG,EAAEC,GAAGM,GAAG,OAAOD,GAAGC,EAAE,EAAEN,IAAIC,EAAEF,EAAEO,EAAE,CAAC,GAAG,IAAIA,EAAE,EAAEN,IAAIC,GAAGF,EAAEO,EAAE,CAAC,GAAG,GAAGL,GAAGF,EAAEO,CAAC,EAAEA,EAAE,EAAEN,IAAIC,GAAGF,EAAEO,EAAE,CAAC,GAAG,KAAK,KAAKA,EAAE,EAAEN,IAAIC,EAAEF,EAAEO,EAAE,CAAC,GAAG,IAAIA,EAAE,EAAEN,IAAIC,GAAGF,EAAEO,EAAE,CAAC,GAAG,GAAGA,EAAE,EAAEN,IAAIC,GAAGF,EAAEO,EAAE,CAAC,GAAGL,GAAGF,EAAEO,CAAC,GAAG,KAAK,GAAGL,CAAC,CAAC,SAASuB,EAAEzB,EAAEO,EAAED,EAAEL,EAAE,CAAC,GAAGA,IAAIY,EAAa,OAAOP,GAAlB,UAAoB,2BAA2B,EAAEO,EAAQN,GAAN,KAAQ,gBAAgB,EAAEM,EAAEN,EAAE,EAAEP,EAAE,OAAO,qCAAqC,GAAG,EAAEA,EAAE,QAAQO,GAAG,OAAON,EAAEC,EAAEF,EAAEO,EAAED,EAAE,EAAE,EAAE,MAAML,EAAE,IAAI,MAAMA,EAAE,GAAGA,CAAC,CAAC,SAASyB,EAAE1B,EAAEO,EAAED,EAAEL,EAAE,CAAC,GAAGA,IAAIY,EAAa,OAAOP,GAAlB,UAAoB,2BAA2B,EAAEO,EAAQN,GAAN,KAAQ,gBAAgB,EAAEM,EAAEN,EAAE,EAAEP,EAAE,OAAO,qCAAqC,GAAG,EAAEA,EAAE,QAAQO,GAAG,OAAON,EAAEG,EAAEJ,EAAEO,EAAED,EAAE,EAAE,EAAE,WAAWL,EAAE,IAAI,WAAWA,EAAE,GAAGA,CAAC,CAAC,SAAS0B,EAAE3B,EAAEO,EAAED,EAAEL,EAAE,CAAC,OAAOA,IAAIY,EAAa,OAAOP,GAAlB,UAAoB,2BAA2B,EAAEO,EAAEN,EAAE,EAAEP,EAAE,OAAO,qCAAqC,GAAGG,EAAE,KAAKH,EAAEO,EAAED,EAAE,GAAG,CAAC,CAAC,CAAC,SAASsB,EAAE5B,EAAEO,EAAED,EAAEL,EAAE,CAAC,OAAOA,IAAIY,EAAa,OAAOP,GAAlB,UAAoB,2BAA2B,EAAEO,EAAEN,EAAE,EAAEP,EAAE,OAAO,qCAAqC,GAAGG,EAAE,KAAKH,EAAEO,EAAED,EAAE,GAAG,CAAC,CAAC,CAAC,SAASD,EAAEL,EAAEO,EAAED,EAAEL,EAAEC,EAAE,CAA6L,GAA5LA,IAAIW,EAAQN,GAAN,KAAQ,eAAe,EAAEM,EAAa,OAAOZ,GAAlB,UAAoB,2BAA2B,EAAEY,EAAQP,GAAN,KAAQ,gBAAgB,EAAEO,EAAEP,EAAE,EAAEN,EAAE,OAAO,sCAAsC,EAAE6B,GAAEtB,EAAE,KAAK,GAAGL,EAAEF,EAAE,OAAU,EAAEE,GAAGI,GAAG,QAAQH,EAAE,EAAEC,EAAE,KAAK,IAAIF,EAAEI,EAAE,CAAC,EAAEH,EAAEC,EAAED,IAAIH,EAAEM,EAAEH,CAAC,GAAGI,EAAE,KAAK,GAAGN,EAAEE,EAAE,EAAEA,MAAM,GAAGF,EAAEE,EAAE,EAAEA,EAAE,CAAC,SAASe,EAAElB,EAAEO,EAAED,EAAEL,EAAEC,EAAE,CAAkM,GAAjMA,IAAIW,EAAQN,GAAN,KAAQ,eAAe,EAAEM,EAAa,OAAOZ,GAAlB,UAAoB,2BAA2B,EAAEY,EAAQP,GAAN,KAAQ,gBAAgB,EAAEO,EAAEP,EAAE,EAAEN,EAAE,OAAO,sCAAsC,EAAE6B,GAAEtB,EAAE,UAAU,GAAGL,EAAEF,EAAE,OAAU,EAAEE,GAAGI,GAAG,QAAQH,EAAE,EAAEC,EAAE,KAAK,IAAIF,EAAEI,EAAE,CAAC,EAAEH,EAAEC,EAAED,IAAIH,EAAEM,EAAEH,CAAC,EAAEI,IAAI,GAAGN,EAAEE,EAAE,EAAEA,GAAG,GAAG,CAAC,SAAS2B,EAAE9B,EAAEO,EAAED,EAAEL,EAAEC,EAAE,CAACA,IAAIW,EAAQN,GAAN,KAAQ,eAAe,EAAEM,EAAa,OAAOZ,GAAlB,UAAoB,2BAA2B,EAAEY,EAAQP,GAAN,KAAQ,gBAAgB,EAAEO,EAAEP,EAAE,EAAEN,EAAE,OAAO,sCAAsC,EAAE+B,GAAExB,EAAE,MAAM,MAAM,GAAGP,EAAE,QAAQM,GAAGD,EAAEL,EAAE,GAAGO,EAAEA,EAAE,MAAMA,EAAE,EAAED,EAAEL,EAAEC,CAAC,CAAC,CAAC,SAAS8B,EAAEhC,EAAEO,EAAED,EAAEL,EAAEC,EAAE,CAACA,IAAIW,EAAQN,GAAN,KAAQ,eAAe,EAAEM,EAAa,OAAOZ,GAAlB,UAAoB,2BAA2B,EAAEY,EAAQP,GAAN,KAAQ,gBAAgB,EAAEO,EAAEP,EAAE,EAAEN,EAAE,OAAO,sCAAsC,EAAE+B,GAAExB,EAAE,WAAW,WAAW,GAAGP,EAAE,QAAQM,GAAGY,EAAElB,EAAE,GAAGO,EAAEA,EAAE,WAAWA,EAAE,EAAED,EAAEL,EAAEC,CAAC,CAAC,CAAC,SAAS+B,EAAEjC,EAAEO,EAAED,EAAEL,EAAEC,EAAE,CAACA,IAAIW,EAAQN,GAAN,KAAQ,eAAe,EAAEM,EAAa,OAAOZ,GAAlB,UAAoB,2BAA2B,EAAEY,EAAQP,GAAN,KAAQ,gBAAgB,EAAEO,EAAEP,EAAE,EAAEN,EAAE,OAAO,sCAAsC,EAAEkC,GAAE3B,EAAE,qBAAqB,qBAAqB,GAAGP,EAAE,QAAQM,GAAGH,EAAE,MAAMH,EAAEO,EAAED,EAAEL,EAAE,GAAG,CAAC,CAAC,CAAC,SAASkC,EAAEnC,EAAEO,EAAED,EAAEL,EAAEC,EAAE,CAACA,IAAIW,EAAQN,GAAN,KAAQ,eAAe,EAAEM,EAAa,OAAOZ,GAAlB,UAAoB,2BAA2B,EAAEY,EAAQP,GAAN,KAAQ,gBAAgB,EAAEO,EAAEP,EAAE,EAAEN,EAAE,OAAO,sCAAsC,EAAEkC,GAAE3B,EAAE,sBAAsB,sBAAsB,GAAGP,EAAE,QAAQM,GAAGH,EAAE,MAAMH,EAAEO,EAAED,EAAEL,EAAE,GAAG,CAAC,CAAC,CAACoB,EAAE,OAAOF,EAAEE,EAAE,WAAWF,EAAEE,EAAE,kBAAkB,GAAGF,EAAE,SAAS,KAAKA,EAAE,gBAAgB,UAAU,CAAC,GAAG,CAAC,IAAInB,EAAE,IAAI,YAAY,CAAC,EAAEO,EAAE,IAAI,WAAWP,CAAC,EAAE,OAAOO,EAAE,IAAI,UAAU,CAAC,MAAO,GAAE,EAAOA,EAAE,IAAI,IAAX,IAA0B,OAAOA,EAAE,UAArB,UAA6B,MAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAEY,EAAE,WAAW,SAASnB,EAAE,CAAC,OAAO,OAAOA,CAAC,EAAE,YAAY,EAAE,CAAC,IAAI,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI,QAAQ,IAAI,SAAS,IAAI,SAAS,IAAI,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI,UAAU,IAAI,WAAW,MAAM,GAAG,QAAQ,MAAM,EAAE,CAAC,EAAEmB,EAAE,SAAS,SAASnB,EAAE,CAAC,MAAM,EAAQA,GAAN,MAAS,CAACA,EAAE,UAAU,EAAEmB,EAAE,WAAW,SAASnB,EAAEO,EAAE,CAAC,IAAID,EAAE,OAAON,GAAG,GAAGO,GAAG,OAAO,CAAC,IAAI,MAAMD,EAAEN,EAAE,OAAO,EAAE,MAAM,IAAI,OAAO,IAAI,QAAQM,EAAE8B,GAAEpC,CAAC,EAAE,OAAO,MAAM,IAAI,QAAQ,IAAI,SAAS,IAAI,MAAMM,EAAEN,EAAE,OAAO,MAAM,IAAI,SAASM,EAAE+B,GAAErC,CAAC,EAAE,OAAO,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI,UAAU,IAAI,WAAWM,EAAE,EAAEN,EAAE,OAAO,MAAM,QAAQ,MAAM,IAAI,MAAM,kBAAkB,CAAC,CAAC,OAAOM,CAAC,EAAEa,EAAE,OAAO,SAASnB,EAAEO,EAAE,CAAC,GAAGM,EAAEU,EAAEvB,CAAC,EAAE;AAAA,yBAAqE,EAAMA,EAAE,SAAN,EAAa,OAAO,IAAImB,EAAE,CAAC,EAAE,GAAOnB,EAAE,SAAN,EAAa,OAAOA,EAAE,CAAC,EAAE,GAAa,OAAOO,GAAjB,SAAmB,IAAIL,EAAEK,EAAE,EAAEL,EAAEF,EAAE,OAAOE,IAAIK,GAAGP,EAAEE,CAAC,EAAE,OAAO,QAAQI,EAAE,IAAIa,EAAEZ,CAAC,EAAEN,EAAE,EAAEC,EAAE,EAAEA,EAAEF,EAAE,OAAOE,IAAI,CAAC,IAAIC,EAAEH,EAAEE,CAAC,EAAEC,EAAE,KAAKG,EAAEL,CAAC,EAAEA,GAAGE,EAAE,MAAM,CAAC,OAAOG,CAAC,EAAEa,EAAE,UAAU,MAAM,SAASnB,EAAEO,EAAED,EAAEL,EAAE,CAAC,SAASM,CAAC,EAAE,SAASD,CAAC,IAAIL,EAAEK,EAAEA,EAAE,SAASE,EAAEP,EAAEA,EAAEM,EAAEA,EAAED,EAAEA,EAAEE,GAAGD,EAAE,OAAOA,CAAC,GAAG,EAAE,IAAIL,EAAEC,EAAEC,EAAEC,EAAEG,EAAE,KAAK,OAAOD,EAAE,QAAQ,CAACD,GAAGE,GAAGF,EAAE,OAAOA,CAAC,MAAMA,EAAEE,GAAGP,EAAE,OAAOA,GAAG,MAAM,EAAE,YAAY,EAAE,CAAC,IAAI,MAAMC,EAAE,SAASF,GAAEO,GAAED,GAAEL,EAAE,CAACK,GAAE,OAAOA,EAAC,GAAG,EAAE,IAAIJ,EAAEF,GAAE,OAAOM,IAAG,CAACL,GAAGC,GAAGD,EAAE,OAAOA,CAAC,MAAMA,EAAEC,GAAGW,GAAGX,EAAEK,GAAE,QAAQ,GAAG,EAAE,oBAAoB,EAAEL,EAAE,EAAED,IAAIA,EAAEC,EAAE,GAAG,QAAQC,GAAE,EAAEA,GAAEF,EAAEE,KAAI,CAAC,IAAIC,GAAE,SAASG,GAAE,OAAO,EAAEJ,GAAE,CAAC,EAAE,EAAE,EAAEU,EAAE,CAAC,MAAMT,EAAC,EAAE,oBAAoB,EAAEJ,GAAEM,GAAEH,EAAC,EAAEC,EAAC,CAAC,OAAOe,EAAE,cAAc,EAAEhB,GAAEA,EAAC,EAAE,KAAKH,EAAEO,EAAED,CAAC,EAAE,MAAM,IAAI,OAAO,IAAI,QAAQH,EAAE,KAAKC,EAAEG,EAAEF,EAAEC,EAAEJ,EAAEiB,EAAE,cAAcP,GAAEwB,GAAEpC,CAAC,EAAEG,EAAEC,EAAEC,CAAC,EAAE,MAAM,IAAI,QAAQ,IAAI,SAASH,EAAEQ,EAAE,KAAKV,EAAEO,EAAED,CAAC,EAAE,MAAM,IAAI,SAASH,EAAE,KAAKC,EAAEG,EAAEF,EAAEC,EAAEJ,EAAEiB,EAAE,cAAcP,GAAEyB,GAAErC,CAAC,EAAEG,EAAEC,EAAEC,CAAC,EAAE,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI,UAAU,IAAI,WAAWH,EAAES,EAAE,KAAKX,EAAEO,EAAED,CAAC,EAAE,MAAM,QAAQ,MAAM,IAAI,MAAM,kBAAkB,CAAC,CAAC,OAAOJ,CAAC,EAAEiB,EAAE,UAAU,SAAS,SAASnB,EAAEO,EAAED,EAAE,CAAC,IAAIL,EAAEC,EAAEC,EAAEC,EAAEC,EAAE,KAAK,GAAGL,EAAE,OAAOA,GAAG,MAAM,EAAE,YAAY,EAAEO,EAAE,OAAOA,CAAC,GAAG,GAAGD,EAAWA,IAAT,OAAW,OAAOA,CAAC,EAAED,EAAE,UAAUE,EAAE,MAAM,GAAG,OAAOP,EAAE,CAAC,IAAI,MAAMC,EAAE,SAASD,EAAEO,GAAED,GAAE,CAAC,IAAIL,GAAED,EAAE,QAAQ,CAACO,IAAGA,GAAE,KAAKA,GAAE,IAAI,CAACD,IAAGA,GAAE,GAAGL,GAAEK,MAAKA,GAAEL,IAAG,QAAQC,EAAE,GAAGC,EAAEI,GAAEJ,EAAEG,GAAEH,IAAID,GAAGoC,EAAEtC,EAAEG,CAAC,CAAC,EAAE,OAAOD,CAAC,EAAEG,EAAEE,EAAED,CAAC,EAAE,MAAM,IAAI,OAAO,IAAI,QAAQL,EAAE,SAASD,EAAEO,GAAED,GAAE,CAAC,IAAIL,GAAE,GAAGC,EAAE,GAAGI,GAAE,KAAK,IAAIN,EAAE,OAAOM,EAAC,EAAE,QAAQH,EAAEI,GAAEJ,EAAEG,GAAEH,IAAIH,EAAEG,CAAC,GAAG,KAAKF,IAAGsC,GAAErC,CAAC,EAAE,OAAO,aAAaF,EAAEG,CAAC,CAAC,EAAED,EAAE,IAAIA,GAAG,IAAIF,EAAEG,CAAC,EAAE,SAAS,EAAE,EAAE,OAAOF,GAAEsC,GAAErC,CAAC,CAAC,EAAEG,EAAEE,EAAED,CAAC,EAAE,MAAM,IAAI,QAAQ,IAAI,SAASL,EAAEuB,EAAEnB,EAAEE,EAAED,CAAC,EAAE,MAAM,IAAI,SAASJ,EAAEG,EAAED,EAAEE,EAAEL,GAAOE,EAAEI,KAAP,GAAWH,IAAIF,EAAE,OAAOM,EAAE,cAAcN,CAAC,EAAEM,EAAE,cAAcN,EAAE,MAAMC,EAAEC,CAAC,CAAC,EAAE,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI,UAAU,IAAI,WAAWH,EAAE,SAASD,EAAEO,GAAED,GAAE,CAAC,QAAQL,GAAED,EAAE,MAAMO,GAAED,EAAC,EAAEJ,EAAE,GAAGC,EAAE,EAAEA,EAAEF,GAAE,OAAOE,GAAG,EAAED,GAAG,OAAO,aAAaD,GAAEE,CAAC,EAAE,IAAIF,GAAEE,EAAE,CAAC,CAAC,EAAE,OAAOD,CAAC,EAAEG,EAAEE,EAAED,CAAC,EAAE,MAAM,QAAQ,MAAM,IAAI,MAAM,kBAAkB,CAAC,CAAC,OAAOL,CAAC,EAAEkB,EAAE,UAAU,OAAO,UAAU,CAAC,MAAM,CAAC,KAAK,SAAS,KAAK,MAAM,UAAU,MAAM,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC,CAAC,EAAEA,EAAE,UAAU,KAAK,SAASnB,EAAEO,EAAED,EAAEL,EAAE,CAAC,GAAGM,EAAEA,GAAG,GAAGN,EAAEA,GAAOA,IAAJ,EAAMA,EAAE,KAAK,WAAWK,EAAEA,GAAG,IAAQN,EAAE,SAAN,GAAkB,KAAK,SAAT,EAAgB,CAACa,EAAEP,GAAGL,EAAE,yBAAyB,EAAEY,EAAE,GAAGN,GAAGA,EAAEP,EAAE,OAAO,2BAA2B,EAAEa,EAAE,GAAGP,GAAGA,EAAE,KAAK,OAAO,2BAA2B,EAAEO,EAAE,GAAGZ,GAAGA,GAAG,KAAK,OAAO,yBAAyB,EAAEA,EAAE,KAAK,SAASA,EAAE,KAAK,QAAQ,IAAIC,GAAGD,EAAED,EAAE,OAAOO,EAAEN,EAAEK,EAAEN,EAAE,OAAOO,EAAED,EAAEL,GAAGK,EAAE,GAAGJ,EAAE,KAAK,CAACiB,EAAE,gBAAgB,QAAQhB,EAAE,EAAEA,EAAED,EAAEC,IAAIH,EAAEG,EAAEI,CAAC,EAAE,KAAKJ,EAAEG,CAAC,OAAON,EAAE,KAAK,KAAK,SAASM,EAAEA,EAAEJ,CAAC,EAAEK,CAAC,CAAC,CAAC,EAAEY,EAAE,UAAU,MAAM,SAASnB,EAAEO,EAAE,CAAC,IAAID,EAAE,KAAK,OAAO,GAAGN,EAAEwC,EAAExC,EAAEM,EAAE,CAAC,EAAEC,EAAEiC,EAAEjC,EAAED,EAAEA,CAAC,EAAEa,EAAE,gBAAgB,OAAOA,EAAE,SAAS,KAAK,SAASnB,EAAEO,CAAC,CAAC,EAAE,QAAQN,EAAEM,EAAEP,EAAEE,EAAE,IAAIiB,EAAElB,EAAE,OAAO,EAAE,EAAEE,EAAE,EAAEA,EAAEF,EAAEE,IAAID,EAAEC,CAAC,EAAE,KAAKA,EAAEH,CAAC,EAAE,OAAOE,CAAC,EAAEiB,EAAE,UAAU,IAAI,SAASnB,EAAE,CAAC,OAAO,QAAQ,IAAI,2DAA2D,EAAE,KAAK,UAAUA,CAAC,CAAC,EAAEmB,EAAE,UAAU,IAAI,SAASnB,EAAEO,EAAE,CAAC,OAAO,QAAQ,IAAI,2DAA2D,EAAE,KAAK,WAAWP,EAAEO,CAAC,CAAC,EAAEY,EAAE,UAAU,UAAU,SAASnB,EAAEO,EAAE,CAAC,GAAGA,IAAIM,EAAQb,GAAN,KAAQ,gBAAgB,EAAEa,EAAEb,EAAE,KAAK,OAAO,qCAAqC,GAAG,EAAEA,GAAG,KAAK,QAAQ,OAAO,KAAKA,CAAC,CAAC,EAAEmB,EAAE,UAAU,aAAa,SAASnB,EAAEO,EAAE,CAAC,OAAOL,EAAE,KAAKF,EAAE,GAAGO,CAAC,CAAC,EAAEY,EAAE,UAAU,aAAa,SAASnB,EAAEO,EAAE,CAAC,OAAOL,EAAE,KAAKF,EAAE,GAAGO,CAAC,CAAC,EAAEY,EAAE,UAAU,aAAa,SAASnB,EAAEO,EAAE,CAAC,OAAOH,EAAE,KAAKJ,EAAE,GAAGO,CAAC,CAAC,EAAEY,EAAE,UAAU,aAAa,SAASnB,EAAEO,EAAE,CAAC,OAAOH,EAAE,KAAKJ,EAAE,GAAGO,CAAC,CAAC,EAAEY,EAAE,UAAU,SAAS,SAASnB,EAAEO,EAAE,CAAC,GAAGA,IAAIM,EAAQb,GAAN,KAAQ,gBAAgB,EAAEa,EAAEb,EAAE,KAAK,OAAO,qCAAqC,GAAG,EAAEA,GAAG,KAAK,QAAQ,MAAO,KAAI,KAAKA,CAAC,EAAE,IAAI,IAAI,KAAKA,CAAC,EAAE,GAAG,KAAKA,CAAC,CAAC,EAAEmB,EAAE,UAAU,YAAY,SAASnB,EAAEO,EAAE,CAAC,OAAOkB,EAAE,KAAKzB,EAAE,GAAGO,CAAC,CAAC,EAAEY,EAAE,UAAU,YAAY,SAASnB,EAAEO,EAAE,CAAC,OAAOkB,EAAE,KAAKzB,EAAE,GAAGO,CAAC,CAAC,EAAEY,EAAE,UAAU,YAAY,SAASnB,EAAEO,EAAE,CAAC,OAAOmB,EAAE,KAAK1B,EAAE,GAAGO,CAAC,CAAC,EAAEY,EAAE,UAAU,YAAY,SAASnB,EAAEO,EAAE,CAAC,OAAOmB,EAAE,KAAK1B,EAAE,GAAGO,CAAC,CAAC,EAAEY,EAAE,UAAU,YAAY,SAASnB,EAAEO,EAAE,CAAC,OAAOoB,EAAE,KAAK3B,EAAE,GAAGO,CAAC,CAAC,EAAEY,EAAE,UAAU,YAAY,SAASnB,EAAEO,EAAE,CAAC,OAAOoB,EAAE,KAAK3B,EAAE,GAAGO,CAAC,CAAC,EAAEY,EAAE,UAAU,aAAa,SAASnB,EAAEO,EAAE,CAAC,OAAOqB,EAAE,KAAK5B,EAAE,GAAGO,CAAC,CAAC,EAAEY,EAAE,UAAU,aAAa,SAASnB,EAAEO,EAAE,CAAC,OAAOqB,EAAE,KAAK5B,EAAE,GAAGO,CAAC,CAAC,EAAEY,EAAE,UAAU,WAAW,SAASnB,EAAEO,EAAED,EAAE,CAACA,IAAIO,EAAQb,GAAN,KAAQ,eAAe,EAAEa,EAAQN,GAAN,KAAQ,gBAAgB,EAAEM,EAAEN,EAAE,KAAK,OAAO,sCAAsC,EAAEsB,GAAE7B,EAAE,GAAG,GAAGO,GAAG,KAAK,SAAS,KAAKA,CAAC,EAAEP,EAAE,EAAEmB,EAAE,UAAU,cAAc,SAASnB,EAAEO,EAAED,EAAE,CAACD,EAAE,KAAKL,EAAEO,EAAE,GAAGD,CAAC,CAAC,EAAEa,EAAE,UAAU,cAAc,SAASnB,EAAEO,EAAED,EAAE,CAACD,EAAE,KAAKL,EAAEO,EAAE,GAAGD,CAAC,CAAC,EAAEa,EAAE,UAAU,cAAc,SAASnB,EAAEO,EAAED,EAAE,CAACY,EAAE,KAAKlB,EAAEO,EAAE,GAAGD,CAAC,CAAC,EAAEa,EAAE,UAAU,cAAc,SAASnB,EAAEO,EAAED,EAAE,CAACY,EAAE,KAAKlB,EAAEO,EAAE,GAAGD,CAAC,CAAC,EAAEa,EAAE,UAAU,UAAU,SAASnB,EAAEO,EAAED,EAAE,CAACA,IAAIO,EAAQb,GAAN,KAAQ,eAAe,EAAEa,EAAQN,GAAN,KAAQ,gBAAgB,EAAEM,EAAEN,EAAE,KAAK,OAAO,sCAAsC,EAAEwB,GAAE/B,EAAE,IAAI,IAAI,GAAGO,GAAG,KAAK,SAAS,GAAGP,EAAE,KAAK,WAAWA,EAAEO,EAAED,CAAC,EAAE,KAAK,WAAW,IAAIN,EAAE,EAAEO,EAAED,CAAC,EAAE,EAAEa,EAAE,UAAU,aAAa,SAASnB,EAAEO,EAAED,EAAE,CAACwB,EAAE,KAAK9B,EAAEO,EAAE,GAAGD,CAAC,CAAC,EAAEa,EAAE,UAAU,aAAa,SAASnB,EAAEO,EAAED,EAAE,CAACwB,EAAE,KAAK9B,EAAEO,EAAE,GAAGD,CAAC,CAAC,EAAEa,EAAE,UAAU,aAAa,SAASnB,EAAEO,EAAED,EAAE,CAAC0B,EAAE,KAAKhC,EAAEO,EAAE,GAAGD,CAAC,CAAC,EAAEa,EAAE,UAAU,aAAa,SAASnB,EAAEO,EAAED,EAAE,CAAC0B,EAAE,KAAKhC,EAAEO,EAAE,GAAGD,CAAC,CAAC,EAAEa,EAAE,UAAU,aAAa,SAASnB,EAAEO,EAAED,EAAE,CAAC2B,EAAE,KAAKjC,EAAEO,EAAE,GAAGD,CAAC,CAAC,EAAEa,EAAE,UAAU,aAAa,SAASnB,EAAEO,EAAED,EAAE,CAAC2B,EAAE,KAAKjC,EAAEO,EAAE,GAAGD,CAAC,CAAC,EAAEa,EAAE,UAAU,cAAc,SAASnB,EAAEO,EAAED,EAAE,CAAC6B,EAAE,KAAKnC,EAAEO,EAAE,GAAGD,CAAC,CAAC,EAAEa,EAAE,UAAU,cAAc,SAASnB,EAAEO,EAAED,EAAE,CAAC6B,EAAE,KAAKnC,EAAEO,EAAE,GAAGD,CAAC,CAAC,EAAEa,EAAE,UAAU,KAAK,SAASnB,EAAEO,EAAED,EAAE,CAAC,GAAGC,EAAEA,GAAG,EAAED,EAAEA,GAAG,KAAK,OAAOO,EAAY,OAAOb,EAAY,OAAOA,EAAEA,GAAG,IAAtB,SAAyBA,EAAE,WAAW,CAAC,EAAEA,IAA5D,UAAgE,CAAC,MAAMA,CAAC,EAAE,uBAAuB,EAAEa,EAAEN,GAAGD,EAAE,aAAa,EAAEA,IAAIC,GAAO,KAAK,SAAT,EAAgB,CAACM,EAAE,GAAGN,GAAGA,EAAE,KAAK,OAAO,qBAAqB,EAAEM,EAAE,GAAGP,GAAGA,GAAG,KAAK,OAAO,mBAAmB,EAAE,QAAQL,EAAEM,EAAEN,EAAEK,EAAEL,IAAI,KAAKA,CAAC,EAAED,CAAC,CAAC,EAAEmB,EAAE,UAAU,QAAQ,UAAU,CAAC,QAAQnB,EAAE,CAAC,EAAEO,EAAE,KAAK,OAAOD,EAAE,EAAEA,EAAEC,EAAED,IAAI,GAAGN,EAAEM,CAAC,EAAEgC,EAAE,KAAKhC,CAAC,CAAC,EAAEA,IAAIe,EAAE,kBAAkB,CAACrB,EAAEM,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,WAAWN,EAAE,KAAK,GAAG,EAAE,GAAG,EAAEmB,EAAE,UAAU,cAAc,UAAU,CAAC,GAAgB,OAAO,WAApB,IAA+B,MAAM,IAAI,MAAM,oDAAoD,EAAE,GAAGA,EAAE,gBAAgB,OAAO,IAAIA,EAAE,IAAI,EAAE,OAAO,QAAQnB,EAAE,IAAI,WAAW,KAAK,MAAM,EAAEO,EAAE,EAAED,EAAEN,EAAE,OAAOO,EAAED,EAAEC,GAAG,EAAEP,EAAEO,CAAC,EAAE,KAAKA,CAAC,EAAE,OAAOP,EAAE,MAAM,EAAE,IAAIO,EAAEY,EAAE,UAAU,SAASqB,EAAExC,EAAEO,EAAED,EAAE,CAAC,OAAgB,OAAON,GAAjB,SAAmBM,EAAEC,IAAIP,EAAE,CAAC,CAACA,GAAGO,EAAE,GAAGP,GAAG,IAAIA,GAAGO,GAAGP,EAAE,CAAC,CAAC,SAASsB,GAAEtB,EAAE,CAAC,OAAOA,EAAE,CAAC,CAAC,KAAK,KAAK,CAACA,CAAC,GAAG,EAAE,EAAEA,CAAC,CAAC,SAASuB,EAAEvB,EAAE,CAAC,OAAO,MAAM,SAAS,SAASA,EAAE,CAAC,OAAyB,OAAO,UAAU,SAAS,KAAKA,CAAC,IAAnD,gBAAoD,GAAGA,CAAC,CAAC,CAAC,SAASsC,EAAEtC,EAAE,CAAC,OAAOA,EAAE,GAAG,IAAIA,EAAE,SAAS,EAAE,EAAEA,EAAE,SAAS,EAAE,CAAC,CAAC,SAASoC,GAAEpC,EAAE,CAAC,QAAQO,EAAE,CAAC,EAAED,EAAE,EAAEA,EAAEN,EAAE,OAAOM,IAAI,CAAC,IAAIL,EAAED,EAAE,WAAWM,CAAC,EAAE,GAAGL,GAAG,IAAIM,EAAE,KAAKP,EAAE,WAAWM,CAAC,CAAC,MAAO,SAAQJ,EAAEI,EAAEH,GAAG,OAAOF,GAAGA,GAAG,OAAOK,IAAI,mBAAmBN,EAAE,MAAME,EAAEI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,GAAGF,EAAE,EAAEA,EAAED,EAAE,OAAOC,IAAIG,EAAE,KAAK,SAASJ,EAAEC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAOG,CAAC,CAAC,SAAS8B,GAAErC,EAAE,CAAC,OAAOQ,EAAE,YAAYR,CAAC,CAAC,CAAC,SAASY,GAAEZ,EAAEO,EAAED,EAAEL,EAAE,CAAC,QAAQC,EAAE,EAAEA,EAAED,GAAG,EAAEC,EAAEI,GAAGC,EAAE,QAAQL,GAAGF,EAAE,QAAQE,IAAIK,EAAEL,EAAEI,CAAC,EAAEN,EAAEE,CAAC,EAAE,OAAOA,CAAC,CAAC,SAASqC,GAAEvC,EAAE,CAAC,GAAG,CAAC,OAAO,mBAAmBA,CAAC,CAAC,MAAS,CAAC,OAAO,OAAO,aAAa,KAAK,CAAC,CAAC,CAAC,SAAS6B,GAAE7B,EAAEO,EAAE,CAACM,EAAY,OAAOb,GAAjB,SAAmB,uCAAuC,EAAEa,EAAE,GAAGb,EAAE,0DAA0D,EAAEa,EAAEb,GAAGO,EAAE,6CAA6C,EAAEM,EAAE,KAAK,MAAMb,CAAC,IAAIA,EAAE,kCAAkC,CAAC,CAAC,SAAS+B,GAAE/B,EAAEO,EAAED,EAAE,CAACO,EAAY,OAAOb,GAAjB,SAAmB,uCAAuC,EAAEa,EAAEb,GAAGO,EAAE,yCAAyC,EAAEM,EAAEP,GAAGN,EAAE,0CAA0C,EAAEa,EAAE,KAAK,MAAMb,CAAC,IAAIA,EAAE,kCAAkC,CAAC,CAAC,SAASkC,GAAElC,EAAEO,EAAED,EAAE,CAACO,EAAY,OAAOb,GAAjB,SAAmB,uCAAuC,EAAEa,EAAEb,GAAGO,EAAE,yCAAyC,EAAEM,EAAEP,GAAGN,EAAE,0CAA0C,CAAC,CAAC,SAASa,EAAEb,EAAEO,EAAE,CAAC,GAAG,CAACP,EAAE,MAAM,IAAI,MAAMO,GAAG,kBAAkB,CAAC,CAACY,EAAE,SAAS,SAASnB,EAAE,CAAC,OAAOA,EAAE,UAAU,GAAGA,EAAE,KAAKA,EAAE,IAAIA,EAAE,KAAKA,EAAE,IAAIA,EAAE,IAAIO,EAAE,IAAIP,EAAE,IAAIO,EAAE,IAAIP,EAAE,MAAMO,EAAE,MAAMP,EAAE,SAASO,EAAE,SAASP,EAAE,eAAeO,EAAE,SAASP,EAAE,OAAOO,EAAE,OAAOP,EAAE,KAAKO,EAAE,KAAKP,EAAE,MAAMO,EAAE,MAAMP,EAAE,UAAUO,EAAE,UAAUP,EAAE,aAAaO,EAAE,aAAaP,EAAE,aAAaO,EAAE,aAAaP,EAAE,aAAaO,EAAE,aAAaP,EAAE,aAAaO,EAAE,aAAaP,EAAE,SAASO,EAAE,SAASP,EAAE,YAAYO,EAAE,YAAYP,EAAE,YAAYO,EAAE,YAAYP,EAAE,YAAYO,EAAE,YAAYP,EAAE,YAAYO,EAAE,YAAYP,EAAE,YAAYO,EAAE,YAAYP,EAAE,YAAYO,EAAE,YAAYP,EAAE,aAAaO,EAAE,aAAaP,EAAE,aAAaO,EAAE,aAAaP,EAAE,WAAWO,EAAE,WAAWP,EAAE,cAAcO,EAAE,cAAcP,EAAE,cAAcO,EAAE,cAAcP,EAAE,cAAcO,EAAE,cAAcP,EAAE,cAAcO,EAAE,cAAcP,EAAE,UAAUO,EAAE,UAAUP,EAAE,aAAaO,EAAE,aAAaP,EAAE,aAAaO,EAAE,aAAaP,EAAE,aAAaO,EAAE,aAAaP,EAAE,aAAaO,EAAE,aAAaP,EAAE,aAAaO,EAAE,aAAaP,EAAE,aAAaO,EAAE,aAAaP,EAAE,cAAcO,EAAE,cAAcP,EAAE,cAAcO,EAAE,cAAcP,EAAE,KAAKO,EAAE,KAAKP,EAAE,QAAQO,EAAE,QAAQP,EAAE,cAAcO,EAAE,cAAcP,CAAC,CAAC,GAAE,KAAK,KAAKoB,EAAE,QAAQ,EAAe,OAAO,KAApB,IAAyB,KAAkB,OAAO,OAApB,IAA2B,OAAO,CAAC,EAAEA,EAAE,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,6DAA6D,mDAAmD,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,SAASR,EAAEC,EAAE,EAAE,EAAE,SAASb,EAAEO,EAAEC,EAAEF,EAAEL,EAAEC,EAAEC,EAAEC,EAAEC,EAAE,CAAC,IAAIG,EAAEI,EAAE,QAAQ,EAAE,OAAOO,EAAE,EAAED,EAAE,IAAIV,EAAEW,CAAC,EAAED,EAAE,KAAK,CAAC,EAAEL,EAAE,QAAQ,CAAC,KAAK,SAASb,EAAEO,EAAED,EAAEL,EAAE,CAAC,QAAQC,EAAEK,EAAE,SAASP,EAAEO,EAAE,CAACP,EAAE,OAAOmB,GAAG,IAAIb,EAAEN,EAAE,QAAQmB,EAAEnB,EAAE,OAAOmB,GAAGnB,EAAEQ,EAAE,OAAO,CAACR,EAAEkB,CAAC,EAAEZ,CAAC,GAAG,QAAQA,EAAEL,EAAE,CAAC,EAAEC,EAAEK,EAAEP,EAAE,YAAYA,EAAE,YAAYG,EAAE,EAAEA,EAAEH,EAAE,OAAOG,GAAGgB,EAAElB,EAAE,KAAKC,EAAE,KAAKF,EAAEG,CAAC,CAAC,EAAE,OAAOF,CAAC,EAAED,EAAEQ,EAAE,SAASR,CAAC,EAAEA,EAAE,IAAIQ,EAAER,CAAC,EAAEC,CAAC,EAAE,EAAED,EAAE,MAAM,EAAEO,EAAEN,EAAEE,EAAE,IAAIK,EAAEF,CAAC,EAAEF,EAAEG,EAAEJ,EAAE,aAAaA,EAAE,aAAaE,EAAE,EAAEA,EAAEH,EAAE,OAAOG,IAAID,EAAE,KAAKD,EAAED,EAAEG,CAAC,EAAE,EAAEA,EAAE,EAAE,EAAE,OAAOF,CAAC,CAAC,CAAC,GAAE,KAAK,KAAKS,EAAE,QAAQ,EAAe,OAAO,KAApB,IAAyB,KAAkB,OAAO,OAApB,IAA2B,OAAO,CAAC,EAAEA,EAAE,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,0EAA0E,8DAA8D,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,SAASY,EAAExB,EAAEyB,EAAE,EAAE,SAASP,EAAEN,EAAER,EAAES,EAAEC,EAAEC,EAAEC,EAAEC,EAAER,EAAE,CAAC,IAAIL,EAAEoB,EAAE,QAAQ,EAAE,OAAOxB,EAAEwB,EAAE,OAAO,EAAEjB,EAAEiB,EAAE,UAAU,EAAElB,EAAEkB,EAAE,OAAO,EAAEd,EAAE,CAAC,KAAKV,EAAE,OAAOO,EAAE,IAAIiB,EAAE,OAAO,CAAC,EAAEnB,EAAE,GAAGG,EAAE,IAAIJ,EAAEC,CAAC,EAAE,SAASJ,EAAED,EAAEM,EAAE,CAAC,IAAIL,EAAES,EAAEV,EAAEA,GAAG,MAAM,EAAEE,EAAE,CAAC,EAAE,OAAOD,GAAGE,EAAE,aAAaH,EAAE,sBAAsB,EAAE,CAAC,OAAO,SAASA,EAAE,CAAC,OAAOI,EAAE,SAASJ,CAAC,IAAIA,EAAE,IAAII,EAAEJ,CAAC,GAAGE,EAAE,KAAKF,CAAC,EAAEA,EAAE,OAAO,IAAI,EAAE,OAAO,SAASA,EAAE,CAAC,IAAIO,EAAEH,EAAE,OAAOF,CAAC,EAAEK,EAAED,EAAE,SAASN,EAAEO,EAAED,GAAE,CAACF,EAAE,SAASG,CAAC,IAAIA,EAAE,IAAIH,EAAEG,CAAC,GAAGH,EAAE,SAASE,EAAC,IAAIA,GAAE,IAAIF,EAAEE,EAAC,GAAGC,EAAE,OAAOF,EAAEE,EAAEP,EAAEO,CAAC,EAAEA,EAAE,OAAOF,IAAIE,EAAEH,EAAE,OAAO,CAACG,EAAEC,CAAC,EAAEH,CAAC,GAAG,QAAQJ,EAAE,IAAIG,EAAEC,CAAC,EAAEH,EAAE,IAAIE,EAAEC,CAAC,EAAEF,GAAE,EAAEA,GAAEE,EAAEF,KAAIF,EAAEE,EAAC,EAAE,GAAGI,EAAEJ,EAAC,EAAED,EAAEC,EAAC,EAAE,GAAGI,EAAEJ,EAAC,EAAE,OAAOG,GAAEN,EAAEI,EAAE,OAAO,CAACH,EAAEK,EAAC,CAAC,CAAC,EAAEN,EAAEI,EAAE,OAAO,CAACF,EAAEI,EAAC,CAAC,CAAC,CAAC,EAAEL,EAAEK,EAAEC,CAAC,EAAEN,EAAEM,CAAC,EAAE,OAAOL,EAAE,KAAKF,EAAEO,EAAE,SAASP,CAAC,EAAEO,CAAC,CAAC,CAAC,CAAC,SAASJ,GAAG,CAAC,IAAIH,EAAE,CAAC,EAAE,MAAM,KAAK,SAAS,EAAE,KAAK,GAAG,EAAE,MAAM,IAAI,MAAM,CAACA,EAAE,0BAA0B,iDAAiD,EAAE,KAAK;AAAA,CAAI,CAAC,CAAC,CAACQ,EAAE,KAAK,CAAC,EAAEiB,EAAE,WAAW,SAASzB,EAAE,CAAC,OAAOC,EAAED,CAAC,CAAC,EAAEyB,EAAE,WAAWxB,EAAEwB,EAAE,YAAY,SAASzB,EAAEO,EAAE,CAAC,GAAG,CAACA,GAAG,CAACA,EAAE,KAAK,OAAO,IAAIH,EAAEE,EAAEN,CAAC,CAAC,EAAE,GAAG,CAACO,EAAE,KAAK,KAAK,OAAO,IAAIH,EAAEE,EAAEN,CAAC,CAAC,CAAC,CAAC,OAAOA,EAAE,CAACO,EAAEP,CAAC,CAAC,CAAC,EAAE,IAAIE,EAAEiB,EAAE,CAAC,oBAAoB,eAAe,iBAAiB,iBAAiB,mBAAmB,aAAa,eAAe,sBAAsB,QAAQ,EAAER,EAAE,SAASX,EAAE,CAACyB,EAAEzB,CAAC,EAAE,UAAU,CAACG,EAAE,SAASH,EAAE,wBAAwB,CAAC,CAAC,EAAE,IAAIE,KAAKiB,EAAER,EAAEQ,EAAEjB,CAAC,EAAEA,CAAC,CAAC,GAAE,KAAK,KAAKsB,EAAE,QAAQ,EAAe,OAAO,KAApB,IAAyB,KAAkB,OAAO,OAApB,IAA2B,OAAO,CAAC,EAAEA,EAAE,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,wEAAwE,8DAA8D,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,SAASf,EAAEC,EAAE,EAAE,EAAE,SAASV,EAAE,EAAEE,EAAEC,EAAEC,EAAEI,EAAEW,EAAED,EAAED,EAAE,CAAC,IAAIV,EAAEE,EAAE,WAAW,EAAE,SAASH,EAAEN,EAAEO,EAAE,CAACP,EAAEO,GAAG,CAAC,GAAG,KAAKA,EAAE,GAAGP,EAAE,IAAIO,EAAE,KAAK,GAAG,EAAE,EAAEA,EAAE,QAAQD,EAAE,WAAWL,EAAE,WAAWC,EAAE,YAAYC,EAAE,UAAUC,EAAE,EAAEA,EAAEJ,EAAE,OAAOI,GAAG,GAAG,CAAC,IAAIC,EAAEC,EAAEE,EAAEP,EAAEkB,EAAEjB,EAAEgB,EAAEf,EAAEG,EAAEM,EAAEN,EAAEL,EAAEC,EAAEC,EAAEH,EAAEI,EAAE,CAAC,EAAE,EAAE,UAAU,EAAED,EAAES,EAAET,EAAEG,EAAEL,EAAEC,EAAEF,EAAEI,EAAE,CAAC,EAAE,GAAG,UAAU,EAAEF,EAAEU,EAAEV,EAAEC,EAAEG,EAAEL,EAAED,EAAEI,EAAE,CAAC,EAAE,GAAG,SAAS,EAAEH,EAAEW,EAAEX,EAAEC,EAAEC,EAAEG,EAAEN,EAAEI,EAAE,CAAC,EAAE,GAAG,WAAW,EAAEE,EAAEM,EAAEN,EAAEL,EAAEC,EAAEC,EAAEH,EAAEI,EAAE,CAAC,EAAE,EAAE,UAAU,EAAED,EAAES,EAAET,EAAEG,EAAEL,EAAEC,EAAEF,EAAEI,EAAE,CAAC,EAAE,GAAG,UAAU,EAAEF,EAAEU,EAAEV,EAAEC,EAAEG,EAAEL,EAAED,EAAEI,EAAE,CAAC,EAAE,GAAG,WAAW,EAAEH,EAAEW,EAAEX,EAAEC,EAAEC,EAAEG,EAAEN,EAAEI,EAAE,CAAC,EAAE,GAAG,SAAS,EAAEE,EAAEM,EAAEN,EAAEL,EAAEC,EAAEC,EAAEH,EAAEI,EAAE,CAAC,EAAE,EAAE,UAAU,EAAED,EAAES,EAAET,EAAEG,EAAEL,EAAEC,EAAEF,EAAEI,EAAE,CAAC,EAAE,GAAG,WAAW,EAAEF,EAAEU,EAAEV,EAAEC,EAAEG,EAAEL,EAAED,EAAEI,EAAE,EAAE,EAAE,GAAG,MAAM,EAAEH,EAAEW,EAAEX,EAAEC,EAAEC,EAAEG,EAAEN,EAAEI,EAAE,EAAE,EAAE,GAAG,WAAW,EAAEE,EAAEM,EAAEN,EAAEL,EAAEC,EAAEC,EAAEH,EAAEI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAED,EAAES,EAAET,EAAEG,EAAEL,EAAEC,EAAEF,EAAEI,EAAE,EAAE,EAAE,GAAG,SAAS,EAAEF,EAAEU,EAAEV,EAAEC,EAAEG,EAAEL,EAAED,EAAEI,EAAE,EAAE,EAAE,GAAG,WAAW,EAAEE,EAAEO,EAAEP,EAAEL,EAAEW,EAAEX,EAAEC,EAAEC,EAAEG,EAAEN,EAAEI,EAAE,EAAE,EAAE,GAAG,UAAU,EAAEF,EAAEC,EAAEH,EAAEI,EAAE,CAAC,EAAE,EAAE,UAAU,EAAED,EAAEU,EAAEV,EAAEG,EAAEL,EAAEC,EAAEF,EAAEI,EAAE,CAAC,EAAE,EAAE,WAAW,EAAEF,EAAEW,EAAEX,EAAEC,EAAEG,EAAEL,EAAED,EAAEI,EAAE,EAAE,EAAE,GAAG,SAAS,EAAEH,EAAEY,EAAEZ,EAAEC,EAAEC,EAAEG,EAAEN,EAAEI,EAAE,CAAC,EAAE,GAAG,UAAU,EAAEE,EAAEO,EAAEP,EAAEL,EAAEC,EAAEC,EAAEH,EAAEI,EAAE,CAAC,EAAE,EAAE,UAAU,EAAED,EAAEU,EAAEV,EAAEG,EAAEL,EAAEC,EAAEF,EAAEI,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAEF,EAAEW,EAAEX,EAAEC,EAAEG,EAAEL,EAAED,EAAEI,EAAE,EAAE,EAAE,GAAG,UAAU,EAAEH,EAAEY,EAAEZ,EAAEC,EAAEC,EAAEG,EAAEN,EAAEI,EAAE,CAAC,EAAE,GAAG,UAAU,EAAEE,EAAEO,EAAEP,EAAEL,EAAEC,EAAEC,EAAEH,EAAEI,EAAE,CAAC,EAAE,EAAE,SAAS,EAAED,EAAEU,EAAEV,EAAEG,EAAEL,EAAEC,EAAEF,EAAEI,EAAE,EAAE,EAAE,EAAE,WAAW,EAAEF,EAAEW,EAAEX,EAAEC,EAAEG,EAAEL,EAAED,EAAEI,EAAE,CAAC,EAAE,GAAG,UAAU,EAAEH,EAAEY,EAAEZ,EAAEC,EAAEC,EAAEG,EAAEN,EAAEI,EAAE,CAAC,EAAE,GAAG,UAAU,EAAEE,EAAEO,EAAEP,EAAEL,EAAEC,EAAEC,EAAEH,EAAEI,EAAE,EAAE,EAAE,EAAE,WAAW,EAAED,EAAEU,EAAEV,EAAEG,EAAEL,EAAEC,EAAEF,EAAEI,EAAE,CAAC,EAAE,EAAE,SAAS,EAAEF,EAAEW,EAAEX,EAAEC,EAAEG,EAAEL,EAAED,EAAEI,EAAE,CAAC,EAAE,GAAG,UAAU,EAAEE,EAAEQ,EAAER,EAAEL,EAAEY,EAAEZ,EAAEC,EAAEC,EAAEG,EAAEN,EAAEI,EAAE,EAAE,EAAE,GAAG,WAAW,EAAEF,EAAEC,EAAEH,EAAEI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAED,EAAEW,EAAEX,EAAEG,EAAEL,EAAEC,EAAEF,EAAEI,EAAE,CAAC,EAAE,GAAG,WAAW,EAAEF,EAAEY,EAAEZ,EAAEC,EAAEG,EAAEL,EAAED,EAAEI,EAAE,EAAE,EAAE,GAAG,UAAU,EAAEH,EAAEa,EAAEb,EAAEC,EAAEC,EAAEG,EAAEN,EAAEI,EAAE,EAAE,EAAE,GAAG,SAAS,EAAEE,EAAEQ,EAAER,EAAEL,EAAEC,EAAEC,EAAEH,EAAEI,EAAE,CAAC,EAAE,EAAE,WAAW,EAAED,EAAEW,EAAEX,EAAEG,EAAEL,EAAEC,EAAEF,EAAEI,EAAE,CAAC,EAAE,GAAG,UAAU,EAAEF,EAAEY,EAAEZ,EAAEC,EAAEG,EAAEL,EAAED,EAAEI,EAAE,CAAC,EAAE,GAAG,UAAU,EAAEH,EAAEa,EAAEb,EAAEC,EAAEC,EAAEG,EAAEN,EAAEI,EAAE,EAAE,EAAE,GAAG,WAAW,EAAEE,EAAEQ,EAAER,EAAEL,EAAEC,EAAEC,EAAEH,EAAEI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAED,EAAEW,EAAEX,EAAEG,EAAEL,EAAEC,EAAEF,EAAEI,EAAE,CAAC,EAAE,GAAG,UAAU,EAAEF,EAAEY,EAAEZ,EAAEC,EAAEG,EAAEL,EAAED,EAAEI,EAAE,CAAC,EAAE,GAAG,UAAU,EAAEH,EAAEa,EAAEb,EAAEC,EAAEC,EAAEG,EAAEN,EAAEI,EAAE,CAAC,EAAE,GAAG,QAAQ,EAAEE,EAAEQ,EAAER,EAAEL,EAAEC,EAAEC,EAAEH,EAAEI,EAAE,CAAC,EAAE,EAAE,UAAU,EAAED,EAAEW,EAAEX,EAAEG,EAAEL,EAAEC,EAAEF,EAAEI,EAAE,EAAE,EAAE,GAAG,UAAU,EAAEF,EAAEY,EAAEZ,EAAEC,EAAEG,EAAEL,EAAED,EAAEI,EAAE,EAAE,EAAE,GAAG,SAAS,EAAEE,EAAES,EAAET,EAAEL,EAAEa,EAAEb,EAAEC,EAAEC,EAAEG,EAAEN,EAAEI,EAAE,CAAC,EAAE,GAAG,UAAU,EAAEF,EAAEC,EAAEH,EAAEI,EAAE,CAAC,EAAE,EAAE,UAAU,EAAED,EAAEY,EAAEZ,EAAEG,EAAEL,EAAEC,EAAEF,EAAEI,EAAE,CAAC,EAAE,GAAG,UAAU,EAAEF,EAAEa,EAAEb,EAAEC,EAAEG,EAAEL,EAAED,EAAEI,EAAE,EAAE,EAAE,GAAG,WAAW,EAAEH,EAAEc,EAAEd,EAAEC,EAAEC,EAAEG,EAAEN,EAAEI,EAAE,CAAC,EAAE,GAAG,SAAS,EAAEE,EAAES,EAAET,EAAEL,EAAEC,EAAEC,EAAEH,EAAEI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAED,EAAEY,EAAEZ,EAAEG,EAAEL,EAAEC,EAAEF,EAAEI,EAAE,CAAC,EAAE,GAAG,WAAW,EAAEF,EAAEa,EAAEb,EAAEC,EAAEG,EAAEL,EAAED,EAAEI,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAEH,EAAEc,EAAEd,EAAEC,EAAEC,EAAEG,EAAEN,EAAEI,EAAE,CAAC,EAAE,GAAG,WAAW,EAAEE,EAAES,EAAET,EAAEL,EAAEC,EAAEC,EAAEH,EAAEI,EAAE,CAAC,EAAE,EAAE,UAAU,EAAED,EAAEY,EAAEZ,EAAEG,EAAEL,EAAEC,EAAEF,EAAEI,EAAE,EAAE,EAAE,GAAG,SAAS,EAAEF,EAAEa,EAAEb,EAAEC,EAAEG,EAAEL,EAAED,EAAEI,EAAE,CAAC,EAAE,GAAG,WAAW,EAAEH,EAAEc,EAAEd,EAAEC,EAAEC,EAAEG,EAAEN,EAAEI,EAAE,EAAE,EAAE,GAAG,UAAU,EAAEE,EAAES,EAAET,EAAEL,EAAEC,EAAEC,EAAEH,EAAEI,EAAE,CAAC,EAAE,EAAE,UAAU,EAAED,EAAEY,EAAEZ,EAAEG,EAAEL,EAAEC,EAAEF,EAAEI,EAAE,EAAE,EAAE,GAAG,WAAW,EAAEF,EAAEa,EAAEb,EAAEC,EAAEG,EAAEL,EAAED,EAAEI,EAAE,CAAC,EAAE,GAAG,SAAS,EAAEH,EAAEc,EAAEd,EAAEC,EAAEC,EAAEG,EAAEN,EAAEI,EAAE,CAAC,EAAE,GAAG,UAAU,EAAEE,EAAEU,EAAEV,EAAED,CAAC,EAAEJ,EAAEe,EAAEf,EAAEO,CAAC,EAAEN,EAAEc,EAAEd,EAAEiB,CAAC,EAAEhB,EAAEa,EAAEb,EAAEe,CAAC,CAAC,CAAC,OAAO,MAAMZ,EAAEL,EAAEC,EAAEC,CAAC,CAAC,CAAC,SAASE,EAAEL,EAAEO,EAAED,EAAEL,EAAEC,EAAEC,EAAE,CAAC,OAAOa,GAAGT,EAAES,EAAEA,EAAET,EAAEP,CAAC,EAAEgB,EAAEf,EAAEE,CAAC,CAAC,IAAID,EAAEK,IAAI,GAAGL,EAAEI,CAAC,CAAC,CAAC,SAASM,EAAEZ,EAAEO,EAAED,EAAEL,EAAEC,EAAEC,EAAEC,EAAE,CAAC,OAAOC,EAAEE,EAAED,EAAE,CAACC,EAAEN,EAAED,EAAEO,EAAEL,EAAEC,EAAEC,CAAC,CAAC,CAAC,SAASS,EAAEb,EAAEO,EAAED,EAAEL,EAAEC,EAAEC,EAAEC,EAAE,CAAC,OAAOC,EAAEE,EAAEN,EAAEK,EAAE,CAACL,EAAED,EAAEO,EAAEL,EAAEC,EAAEC,CAAC,CAAC,CAAC,SAASU,EAAEd,EAAEO,EAAED,EAAEL,EAAEC,EAAEC,EAAEC,EAAE,CAAC,OAAOC,EAAEE,EAAED,EAAEL,EAAED,EAAEO,EAAEL,EAAEC,EAAEC,CAAC,CAAC,CAAC,SAASW,EAAEf,EAAEO,EAAED,EAAEL,EAAEC,EAAEC,EAAEC,EAAE,CAAC,OAAOC,EAAEC,GAAGC,EAAE,CAACN,GAAGD,EAAEO,EAAEL,EAAEC,EAAEC,CAAC,CAAC,CAAC,SAASY,EAAEhB,EAAEO,EAAE,CAAC,IAAID,GAAG,MAAMN,IAAI,MAAMO,GAAG,OAAOP,GAAG,KAAKO,GAAG,KAAKD,GAAG,KAAK,GAAG,MAAMA,CAAC,CAACI,EAAE,QAAQ,SAASV,EAAE,CAAC,OAAOO,EAAE,KAAKP,EAAEM,EAAE,EAAE,CAAC,CAAC,GAAE,KAAK,KAAKG,EAAE,QAAQ,EAAe,OAAO,KAApB,IAAyB,KAAkB,OAAO,OAApB,IAA2B,OAAO,CAAC,EAAEA,EAAE,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,sEAAsE,8DAA8D,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,SAAST,EAAEkB,EAAEX,EAAE,EAAE,SAASP,EAAEO,EAAED,EAAEL,EAAEC,EAAEC,EAAEC,EAAEC,EAAEc,EAAE,CAAC,IAAIX,EAAEU,EAAE,QAAQV,GAAG,SAASR,EAAE,CAAC,QAAQO,EAAED,EAAE,IAAI,MAAMN,CAAC,EAAEC,EAAE,EAAEA,EAAED,EAAEC,IAAQ,IAAEA,KAAKM,EAAE,WAAW,KAAK,OAAO,GAAGD,EAAEL,CAAC,EAAEM,MAAM,EAAEN,IAAI,GAAG,IAAI,OAAOK,CAAC,CAAC,GAAE,KAAK,KAAKN,EAAE,QAAQ,EAAe,OAAO,KAApB,IAAyB,KAAkB,OAAO,OAApB,IAA2B,OAAO,CAAC,EAAEA,EAAE,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,sEAAsE,8DAA8D,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,SAASY,EAAEC,EAAE,EAAE,EAAE,SAASb,EAAEO,EAAED,EAAEL,EAAEC,EAAEG,EAAEG,EAAEW,EAAED,EAAE,CAAC,IAAIf,EAAES,EAAE,WAAW,EAAE,SAASR,EAAEc,EAAEN,EAAE,CAACM,EAAEN,GAAG,CAAC,GAAG,KAAK,GAAGA,EAAE,GAAGM,EAAE,IAAIN,EAAE,IAAI,GAAG,EAAE,EAAEA,EAAE,QAAQZ,EAAEO,EAAED,EAAEL,EAAE,MAAM,EAAE,EAAEC,EAAE,WAAWC,EAAE,WAAWC,EAAE,YAAYC,EAAE,UAAUQ,EAAE,YAAYC,EAAE,EAAEA,EAAEI,EAAE,OAAOJ,GAAG,GAAG,CAAC,QAAQC,EAAEb,EAAEc,EAAEb,EAAEc,EAAEb,EAAEK,EAAEJ,EAAEK,GAAEG,EAAEL,EAAE,EAAEA,EAAE,GAAGA,IAAI,CAACP,EAAEO,CAAC,EAAEA,EAAE,GAAGU,EAAEJ,EAAEN,CAAC,EAAEgB,EAAEvB,EAAEO,EAAE,CAAC,EAAEP,EAAEO,EAAE,CAAC,EAAEP,EAAEO,EAAE,EAAE,EAAEP,EAAEO,EAAE,EAAE,EAAE,CAAC,EAAE,IAAIW,EAAER,EAAEA,EAAEa,EAAEtB,EAAE,CAAC,GAAGiB,EAAEhB,EAAEI,EAAEH,EAAEE,EAAED,GAAGL,EAAEQ,GAAG,GAAGW,EAAEZ,EAAE,CAACY,EAAEb,EAAE,EAAEN,EAAE,KAAKA,EAAE,GAAGmB,EAAEZ,EAAEY,EAAEb,EAAEC,EAAED,EAAEa,EAAEZ,EAAED,EAAE,EAAEK,EAAEA,EAAEE,EAAEZ,EAAEO,CAAC,CAAC,GAAGR,EAAEQ,GAAG,GAAG,WAAWR,EAAE,GAAG,WAAWA,EAAE,GAAG,YAAY,UAAU,CAAC,EAAEa,EAAER,EAAEA,EAAED,EAAEA,EAAEoB,EAAErB,EAAE,EAAE,EAAEA,EAAED,EAAEA,EAAEiB,CAAC,CAACjB,EAAES,EAAET,EAAEa,CAAC,EAAEZ,EAAEQ,EAAER,EAAEa,CAAC,EAAEZ,EAAEO,EAAEP,EAAEa,CAAC,EAAEZ,EAAEM,EAAEN,EAAEI,CAAC,EAAEI,EAAEF,EAAEE,EAAEH,EAAC,CAAC,CAAC,OAAO,MAAMR,EAAEC,EAAEC,EAAEC,EAAEQ,CAAC,CAAC,CAAC,SAASF,EAAEX,EAAEO,EAAE,CAAC,IAAID,GAAG,MAAMN,IAAI,MAAMO,GAAG,OAAOP,GAAG,KAAKO,GAAG,KAAKD,GAAG,KAAK,GAAG,MAAMA,CAAC,CAAC,SAASkB,EAAExB,EAAEO,EAAE,CAAC,OAAOP,GAAGO,EAAEP,IAAI,GAAGO,CAAC,CAACM,EAAE,QAAQ,SAASb,EAAE,CAAC,OAAOG,EAAE,KAAKH,EAAEI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAE,KAAK,KAAKQ,EAAE,QAAQ,EAAe,OAAO,KAApB,IAAyB,KAAkB,OAAO,OAApB,IAA2B,OAAO,CAAC,EAAEA,EAAE,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,sEAAsE,8DAA8D,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,SAASA,EAAEC,EAAE,EAAE,EAAE,SAASb,EAAEO,EAAED,EAAEL,EAAEG,EAAEC,EAAEG,EAAEW,EAAED,EAAE,CAAC,SAAS,EAAElB,EAAEO,EAAE,CAAC,IAAID,GAAG,MAAMN,IAAI,MAAMO,GAAG,OAAOP,GAAG,KAAKO,GAAG,KAAKD,GAAG,KAAK,GAAG,MAAMA,CAAC,CAAC,SAASJ,EAAEF,EAAEkB,EAAE,CAAC,IAAIN,EAAEC,EAAE,IAAI,MAAM,WAAW,WAAW,WAAW,WAAW,UAAU,WAAW,WAAW,WAAW,WAAW,UAAU,UAAU,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,UAAU,UAAU,UAAU,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,UAAU,UAAU,UAAU,UAAU,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,UAAU,EAAEN,EAAE,IAAI,MAAM,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,UAAU,UAAU,EAAED,EAAE,IAAI,MAAM,EAAE,EAAEN,EAAEkB,GAAG,CAAC,GAAG,KAAK,GAAGA,EAAE,GAAGlB,EAAE,IAAIkB,EAAE,IAAI,GAAG,EAAE,EAAEA,EAAE,QAAQjB,EAAEC,EAAEY,EAAE,EAAEA,EAAEd,EAAE,OAAOc,GAAG,GAAG,CAAC,QAAQX,EAAEI,EAAE,CAAC,EAAEH,EAAEG,EAAE,CAAC,EAAEF,EAAEE,EAAE,CAAC,EAAEQ,EAAER,EAAE,CAAC,EAAEC,EAAED,EAAE,CAAC,EAAES,EAAET,EAAE,CAAC,EAAEU,GAAEV,EAAE,CAAC,EAAEE,EAAEF,EAAE,CAAC,EAAEY,EAAE,EAAEA,EAAE,GAAGA,IAAIb,EAAEa,CAAC,EAAEA,EAAE,GAAGnB,EAAEmB,EAAEL,CAAC,EAAE,EAAE,EAAE,GAAGZ,EAAEI,EAAEa,EAAE,CAAC,EAAER,EAAET,EAAE,EAAE,EAAES,EAAET,EAAE,EAAE,EAAEsB,EAAEtB,EAAE,EAAE,GAAGI,EAAEa,EAAE,CAAC,CAAC,GAAGjB,EAAEI,EAAEa,EAAE,EAAE,EAAER,EAAET,EAAE,CAAC,EAAES,EAAET,EAAE,EAAE,EAAEsB,EAAEtB,EAAE,CAAC,EAAE,EAAEI,EAAEa,EAAE,EAAE,CAAC,EAAEP,EAAE,EAAE,EAAE,EAAE,EAAEH,EAAEE,EAAET,EAAEM,EAAE,CAAC,EAAEG,EAAET,EAAE,EAAE,EAAES,EAAET,EAAE,EAAE,CAAC,EAAEM,EAAEQ,EAAE,CAACR,EAAES,EAAC,EAAEJ,EAAEM,CAAC,CAAC,EAAEb,EAAEa,CAAC,CAAC,EAAElB,EAAE,EAAEU,EAAEV,EAAEE,EAAE,CAAC,EAAEQ,EAAEV,EAAE,EAAE,EAAEU,EAAEV,EAAE,EAAE,EAAEE,EAAEC,EAAED,EAAEE,EAAED,EAAEC,CAAC,EAAEI,EAAEQ,GAAEA,GAAED,EAAEA,EAAER,EAAEA,EAAE,EAAEO,EAAEH,CAAC,EAAEG,EAAEV,EAAEA,EAAED,EAAEA,EAAED,EAAEA,EAAE,EAAES,EAAEX,CAAC,EAAEM,EAAE,CAAC,EAAE,EAAEJ,EAAEI,EAAE,CAAC,CAAC,EAAEA,EAAE,CAAC,EAAE,EAAEH,EAAEG,EAAE,CAAC,CAAC,EAAEA,EAAE,CAAC,EAAE,EAAEF,EAAEE,EAAE,CAAC,CAAC,EAAEA,EAAE,CAAC,EAAE,EAAEQ,EAAER,EAAE,CAAC,CAAC,EAAEA,EAAE,CAAC,EAAE,EAAEC,EAAED,EAAE,CAAC,CAAC,EAAEA,EAAE,CAAC,EAAE,EAAES,EAAET,EAAE,CAAC,CAAC,EAAEA,EAAE,CAAC,EAAE,EAAEU,GAAEV,EAAE,CAAC,CAAC,EAAEA,EAAE,CAAC,EAAE,EAAEE,EAAEF,EAAE,CAAC,CAAC,CAAC,CAAC,OAAOA,CAAC,CAAC,IAAIJ,EAAES,EAAE,WAAW,EAAED,EAAE,SAASX,EAAEO,EAAE,CAAC,OAAOP,IAAIO,EAAEP,GAAG,GAAGO,CAAC,EAAEiB,EAAE,SAASxB,EAAEO,EAAE,CAAC,OAAOP,IAAIO,CAAC,EAAEM,EAAE,QAAQ,SAASb,EAAE,CAAC,OAAOG,EAAE,KAAKH,EAAEE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAE,KAAK,KAAKU,EAAE,QAAQ,EAAe,OAAO,KAApB,IAAyB,KAAkB,OAAO,OAApB,IAA2B,OAAO,CAAC,EAAEA,EAAE,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,yEAAyE,8DAA8D,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,SAASZ,EAAE,EAAEmB,EAAE,EAAE,SAASnB,EAAEO,EAAED,EAAEL,EAAEC,EAAEC,EAAEC,EAAEC,EAAEG,EAAE,CAACW,EAAE,KAAK,SAASnB,EAAEO,EAAED,EAAEL,EAAEC,EAAE,CAAC,IAAIC,EAAEC,EAAEc,EAAE,EAAEhB,EAAED,EAAE,EAAEW,GAAG,GAAGM,GAAG,EAAEL,EAAED,GAAG,EAAEP,EAAE,GAAGG,EAAEF,EAAEJ,EAAE,EAAE,EAAEiB,EAAEb,EAAE,GAAG,EAAEJ,EAAEF,EAAEO,EAAEC,CAAC,EAAE,IAAIA,GAAGW,EAAEhB,EAAED,GAAG,GAAG,CAACG,GAAG,EAAEH,IAAI,CAACG,EAAEA,GAAGa,EAAE,EAAEb,EAAEF,EAAE,IAAIA,EAAEH,EAAEO,EAAEC,CAAC,EAAEA,GAAGW,EAAEd,GAAG,EAAE,CAAC,IAAID,EAAED,GAAG,GAAG,CAACE,GAAG,EAAEF,IAAI,CAACE,EAAEA,GAAGJ,EAAE,EAAEI,EAAED,EAAE,IAAIA,EAAEJ,EAAEO,EAAEC,CAAC,EAAEA,GAAGW,EAAEd,GAAG,EAAE,CAAC,GAAOF,IAAJ,EAAMA,EAAE,EAAEU,MAAM,CAAC,GAAGV,IAAIS,EAAE,OAAOR,EAAE,IAAI,EAAE,GAAGF,EAAE,GAAG,GAAGE,GAAG,KAAK,IAAI,EAAEH,CAAC,EAAEE,GAAGU,CAAC,CAAC,OAAOX,EAAE,GAAG,GAAGE,EAAE,KAAK,IAAI,EAAED,EAAEF,CAAC,CAAC,EAAEkB,EAAE,MAAM,SAASnB,EAAEO,EAAEW,EAAEZ,EAAEL,EAAEW,EAAE,CAAC,IAAIV,EAAEC,EAAEC,EAAE,EAAEQ,EAAEX,EAAE,EAAEI,GAAG,GAAGD,GAAG,EAAEI,EAAEH,GAAG,EAAEQ,EAAOZ,IAAL,GAAO,KAAK,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE,GAAG,EAAE,EAAEkB,EAAEb,EAAE,EAAEM,EAAE,EAAEE,EAAER,EAAE,EAAE,GAAGM,EAAEL,EAAE,GAAOA,IAAJ,GAAO,EAAEA,EAAE,EAAE,EAAE,EAAE,IAAIA,EAAE,KAAK,IAAIA,CAAC,EAAE,MAAMA,CAAC,GAAGA,IAAI,EAAE,GAAGJ,EAAE,MAAMI,CAAC,EAAE,EAAE,EAAEL,EAAEG,IAAIH,EAAE,KAAK,MAAM,KAAK,IAAIK,CAAC,EAAE,KAAK,GAAG,EAAEA,GAAGD,EAAE,KAAK,IAAI,EAAE,CAACJ,CAAC,GAAG,IAAIA,IAAII,GAAG,GAAG,IAAIC,GAAG,GAAGL,EAAEM,EAAEK,EAAEP,EAAEO,EAAE,KAAK,IAAI,EAAE,EAAEL,CAAC,GAAGF,IAAIJ,IAAII,GAAG,GAAGD,GAAGH,EAAEM,GAAGL,EAAE,EAAED,EAAEG,GAAG,GAAGH,EAAEM,GAAGL,GAAGI,EAAED,EAAE,GAAG,KAAK,IAAI,EAAEL,CAAC,EAAEC,GAAGM,IAAIL,EAAEI,EAAE,KAAK,IAAI,EAAEC,EAAE,CAAC,EAAE,KAAK,IAAI,EAAEP,CAAC,EAAEC,EAAE,IAAI,GAAGD,EAAED,EAAEkB,EAAEC,CAAC,EAAE,IAAIhB,EAAEgB,GAAGL,EAAEX,GAAG,IAAIF,GAAG,EAAE,CAAC,IAAIC,EAAEA,GAAGD,EAAEE,EAAEC,GAAGH,EAAE,EAAEG,EAAEJ,EAAEkB,EAAEC,CAAC,EAAE,IAAIjB,EAAEiB,GAAGL,EAAEZ,GAAG,IAAIE,GAAG,EAAE,CAACJ,EAAEkB,EAAEC,EAAEL,CAAC,GAAG,IAAIF,CAAC,CAAC,GAAE,KAAK,KAAKZ,EAAE,QAAQ,EAAe,OAAO,KAApB,IAAyB,KAAkB,OAAO,OAApB,IAA2B,OAAO,CAAC,EAAEA,EAAE,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,8DAA8D,oDAAoD,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,SAASA,EAAEc,EAAEP,EAAE,EAAE,SAASP,EAAEO,EAAED,EAAEL,EAAEC,EAAE,EAAEgB,EAAEN,EAAEC,EAAE,CAAC,IAAIV,EAAEC,EAAEC,EAAE,SAASG,GAAG,CAAC,EAAER,EAAEc,EAAE,QAAQ,CAAC,GAAG,UAAUV,EAAe,OAAO,OAApB,KAA4B,OAAO,aAAaC,EAAe,OAAO,OAApB,KAA4B,OAAO,aAAa,OAAO,iBAAiBD,EAAE,SAASJ,EAAE,CAAC,OAAO,OAAO,aAAaA,CAAC,CAAC,EAAEK,GAAGF,EAAE,CAAC,EAAE,OAAO,iBAAiB,UAAU,SAASH,EAAE,CAAC,IAAIO,EAAEP,EAAE,OAAOO,IAAI,QAAeA,IAAP,MAA2BP,EAAE,OAAnB,iBAA0BA,EAAE,gBAAgB,EAAE,EAAEG,EAAE,QAAQA,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,SAASH,EAAE,CAACG,EAAE,KAAKH,CAAC,EAAE,OAAO,YAAY,eAAe,GAAG,CAAC,GAAG,SAASA,EAAE,CAAC,WAAWA,EAAE,CAAC,CAAC,GAAGA,EAAE,MAAM,UAAUA,EAAE,QAAQ,GAAGA,EAAE,IAAI,CAAC,EAAEA,EAAE,KAAK,CAAC,EAAEA,EAAE,GAAGQ,EAAER,EAAE,YAAYQ,EAAER,EAAE,KAAKQ,EAAER,EAAE,IAAIQ,EAAER,EAAE,eAAeQ,EAAER,EAAE,mBAAmBQ,EAAER,EAAE,KAAKQ,EAAER,EAAE,QAAQ,SAASA,EAAE,CAAC,MAAM,IAAI,MAAM,kCAAkC,CAAC,EAAEA,EAAE,IAAI,UAAU,CAAC,MAAM,GAAG,EAAEA,EAAE,MAAM,SAASA,EAAE,CAAC,MAAM,IAAI,MAAM,gCAAgC,CAAC,CAAC,GAAE,KAAK,KAAKA,EAAE,QAAQ,EAAe,OAAO,KAApB,IAAyB,KAAkB,OAAO,OAApB,IAA2B,OAAO,CAAC,EAAEA,EAAE,QAAQ,EAAE,OAAO,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,gEAAgE,oDAAoD,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,ICAt9jC,IAAAyC,GAAA,GAAAC,GAAAD,GAAA,YAAAE,GAAA,qBAAAC,GAAA,WAAAC,GAAA,eAAAC,GAAA,uBAAAC,GAAA,eAAAC,GAAA,YAAAL,GAAA,sBAAAC,GAAA,eAAAK,GAAA,2BAAAC,GAAA,oBAAAC,GAAA,YAAAC,GAAA,WAAAC,KCAA,IAAAC,GAAiB,WAUXC,GAAuB,EACvBC,GAAwB,GAEvB,SAASC,GAAcC,EAAkC,CAC/D,OAAOA,EACL,SAASF,EAAqB,EAC9B,SAASD,GAAsB,GAAG,CACrC,CAEO,SAASI,GAAkBD,EAAkC,CACnE,OAAOA,EAAQ,SAAS,EAAE,SAAS,EAAG,GAAG,CAC1C,CAoBO,IAAME,GAAN,KAAuE,CAAvE,cACN,KAAQ,OAAuB,CAC9B,KAAM,KAAK,IAAI,EACf,QAAS,EACT,KAAMC,GAAe,CACtB,EACA,KAAQ,YAAc,EAEtB,SAAOC,IACN,KAAK,OAASC,GAAU,KAAK,MAAM,EAC5B,KAAK,IAAID,EAAS,KAAK,MAAM,GAKrC,aAAWA,IACV,KAAK,OAASC,GAAU,KAAK,MAAM,EAC5BC,GAAkBF,CAAO,EAAIG,GAA0B,KAAK,MAAM,GAG1E,gBAAa,IACL,KAAK,OAEb,YAAUC,GAA4B,CAErC,IAAMC,EAAYD,EAAgB,MAAME,EAAoB,EAC5D,KAAK,OAASC,GACb,KAAK,OACLC,GAAwBH,CAAS,CAClC,CACD,EACA,SAAM,CAACL,EAA0BS,IACzBC,GAAcV,CAAO,EAAIW,GAAsBF,CAAG,EAE1D,UAAQT,GAENU,GAAcV,CAAO,EACrBW,GAAsB,CACrB,KAAM,EAEN,QAAS,KAAK,cACd,KAAM,KAAK,OAAO,IACnB,CAAC,EAGH,sBAAoBC,GACZJ,GAAwBI,EAAU,MAAMN,EAAoB,CAAC,EAAE,KAExE,EAEMO,GAAN,cAA8B,KAAM,CAEnC,eAAeC,EAAa,CAC3B,MAAM,EACN,KAAK,KAAO,kBACZ,KAAK,QAAU,CAAC,8BAA8B,EAAE,OAAOA,CAAI,EAAE,KAAK,GAAG,CACtE,CACD,EAEMC,GAAN,cAA4B,KAAM,CAEjC,aAAc,CACb,MAAM,EACN,KAAK,KAAO,gBACZ,KAAK,QAAU,4BAChB,CACD,EAQMC,GAAuB,EACvBC,GAAoB,EACpBC,GAAkB,GAAK,IAGvBC,GAAoB,EAE1B,SAASpB,IAAiB,CACzB,OAAO,GAAAqB,QACL,KAAK,EACL,SAASH,GAAmB,GAAG,EAC/B,MAAM,EAAGA,EAAiB,CAC7B,CAEO,SAASN,GAAsBU,EAA0B,CAE/D,IAAMC,EAAa,IAAI,KAAKD,EAAG,IAAI,EACjC,QAAQ,EACR,SAASE,EAAqB,EAC9B,SAASJ,GAAmB,GAAG,EAE3BK,EAAUH,EAAG,QACjB,SAASE,EAAqB,EAC9B,SAASP,GAAsB,GAAG,EAE9BS,EAAOJ,EAAG,KAAK,SAASJ,GAAmB,GAAG,EACpD,MAAO,GAAGK,CAAU,GAAGE,CAAO,GAAGC,CAAI,EACtC,CAEA,SAASxB,GAAUyB,EAAkC,CACpD,IAAMC,EAAW,KAAK,IAAI,EAGpBC,EAAc,KAAK,IAAIF,EAAK,KAAMC,CAAQ,EAE1CE,EAAaH,EAAK,OAASE,EAAcF,EAAK,QAAU,EAAI,EAGlE,GAAIE,EAAcD,EAAWT,GAC5B,MAAM,IAAIL,GAAgBe,EAAaD,EAAUT,EAAe,EAGjE,GAAIW,EAAa,MAChB,MAAM,IAAId,GAGX,MAAO,CACN,KAAMa,EACN,QAASC,EACT,KAAMH,EAAK,IACZ,CACD,CAEA,SAASnB,GACRuB,EACAC,EACe,CACf,IAAMJ,EAAW,KAAK,IAAI,EAEpBK,EAAU,KAAK,IAAIL,EAAU,KAAK,IAAIG,EAAM,KAAMC,EAAO,IAAI,CAAC,EAE9DE,EAAa,KAAK,IAAIH,EAAM,QAASC,EAAO,OAAO,EACrDF,EAmBJ,GAjBIC,EAAM,OAASE,GAAWD,EAAO,OAASC,EAC7CH,EAAaI,EAAa,EAGlBH,EAAM,OAASE,EACvBH,EAAaC,EAAM,QAAU,EAGrBC,EAAO,OAASC,EACxBH,EAAaE,EAAO,QAAU,EAI9BF,EAAa,EAIVG,EAAUL,EAAWT,GACxB,MAAM,IAAIL,GAAgBmB,EAASL,EAAUT,EAAe,EAE7D,GAAIW,EAAa,MAChB,MAAM,IAAId,GAGX,MAAO,CACN,KAAMiB,EACN,QAASH,EACT,KAAMC,EAAM,IACb,CACD,CAEO,SAAStB,GAAwB0B,EAA6B,CACpE,IAAMZ,EAAaY,EAAM,MAAM,EAAGf,EAAiB,EAC7CK,EAAUU,EAAM,MACrBf,GACAA,GAAoBH,EACrB,EACMS,EAAOS,EAAM,MAAMf,GAAoBH,EAAoB,EAC3DmB,EAAO,SAASb,EAAYC,EAAqB,EACjDa,EAAa,SAASZ,EAASD,EAAqB,EAE1D,GAAI,MAAMY,CAAI,GAAK,MAAMC,CAAU,EAClC,MAAM,IAAI,MAAM,sBAAsB,EAGvC,MAAO,CACN,KAAAD,EACA,QAASC,EACT,KAAAX,CACD,CACD,CA0BO,SAASY,GAA0BC,EAA0B,CAEnE,IAAMC,EAAa,IAAI,KAAKD,EAAG,IAAI,EAAE,YAAY,EAE3CE,EAAUF,EAAG,QAAQ,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,EAAG,GAAG,EAE/DG,EAAOH,EAAG,KAAK,SAAS,GAAI,GAAG,EACrC,MAAO,GAAGC,CAAU,IAAIC,CAAO,IAAIC,CAAI,EACxC,CAsBO,SAASC,GAA0BC,EAA2B,CACpE,OAAO,SAASA,EAAU,MAAM,EAAGC,EAAoB,EAAG,EAAE,CAC7D,CAEO,SAASC,GAA+BC,EAAWC,EAAW,CACpE,OAAOL,GAA0BI,CAAC,EAAIJ,GAA0BK,CAAC,CAClE,CC9RO,SAASC,GAAUC,EAA8B,CACvD,OAAOA,GAASA,EAAM,QAAQ,IAAM,MACrC,CACO,SAASC,GAAcC,EAAqB,CAClD,MAAO,CACN,SAAU,OACV,GAAAA,CACD,CACD,CCVA,IAAIC,GACAC,GAAQ,IAAI,WAAW,EAAE,EACd,SAARC,IAAuB,CAE5B,GAAI,CAACF,KAGHA,GAAkB,OAAO,OAAW,KAAe,OAAO,iBAAmB,OAAO,gBAAgB,KAAK,MAAM,GAAK,OAAO,SAAa,KAAe,OAAO,SAAS,iBAAoB,YAAc,SAAS,gBAAgB,KAAK,QAAQ,EAE3O,CAACA,IACH,MAAM,IAAI,MAAM,0GAA0G,EAI9H,OAAOA,GAAgBC,EAAK,CAC9B,CClBA,IAAOE,GAAQ,sHCEf,SAASC,GAASC,EAAM,CACtB,OAAO,OAAOA,GAAS,UAAYC,GAAM,KAAKD,CAAI,CACpD,CAEA,IAAOE,GAAQH,GCAf,IAAII,EAAY,CAAC,EAEjB,IAASC,GAAI,EAAGA,GAAI,IAAK,EAAEA,GACzBD,EAAU,MAAMC,GAAI,KAAO,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC,EAD1C,IAAAA,GAIT,SAASC,GAAUC,EAAK,CACtB,IAAIC,EAAS,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,EAG7EC,GAAQL,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAI,IAAMJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAI,IAAMJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAI,IAAMJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAI,IAAMJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,GAAG,YAAY,EAMrgB,GAAI,CAACE,GAASD,CAAI,EAChB,MAAM,UAAU,6BAA6B,EAG/C,OAAOA,CACT,CAEA,IAAOE,GAAQL,GC1Bf,SAASM,GAAGC,EAASC,EAAKC,EAAQ,CAChCF,EAAUA,GAAW,CAAC,EACtB,IAAIG,EAAOH,EAAQ,SAAWA,EAAQ,KAAOI,IAAK,EAKlD,GAHAD,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAI,GAAO,GAC3BA,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAI,GAAO,IAEvBF,EAAK,CACPC,EAASA,GAAU,EAEnB,QAASG,EAAI,EAAGA,EAAI,GAAI,EAAEA,EACxBJ,EAAIC,EAASG,CAAC,EAAIF,EAAKE,CAAC,EAG1B,OAAOJ,CACT,CAEA,OAAOK,GAAUH,CAAI,CACvB,CAEA,IAAOI,GAAQR,GCpBR,SAASS,GAAMC,EAAU,CAC/B,OAAOC,GAAYD,CAAG,GAAKE,GAAUF,CAAG,CACzC,CAEO,SAASG,GAAYC,EAAQC,EAAQ,CAC3C,OAAID,IAAMC,EAAU,GAChB,GAACN,GAAMK,CAAC,GAAK,CAACL,GAAMM,CAAC,GACrBD,EAAE,QAAQ,IAAMC,EAAE,QAAQ,GAC1BD,EAAE,KAAOC,EAAE,GAEhB,CCXA,IAAAC,GAAiB,WA6CjB,SAASC,GAAgBC,EAAQC,EAAQ,CACxC,OAAI,OAAOA,GAAM,UAAYA,IAAM,MAAQ,MAAM,QAAQA,CAAC,EAClDA,EAED,OAAO,YACb,OAAO,QAAQA,CAAC,EAAE,KAAK,CAAC,CAACC,CAAE,EAAG,CAACC,CAAE,IAAOD,EAAKC,EAAK,GAAKD,EAAKC,EAAK,EAAI,CAAE,CACxE,CACD,CAKO,SAASC,GAAgBC,EAAU,CACzC,OAAO,KAAK,UAAUA,EAAKN,EAAe,CAC3C,CAMO,SAASO,GAAaD,EAAQE,EAAW,GAAS,CACxD,GAAIC,EAASH,CAAG,GAAK,MAAM,QAAQA,CAAG,EAAG,CACxC,IAAMI,EAAMC,GAAYL,CAAG,EACvBM,EACJ,GAAI,MAAM,QAAQN,CAAG,EACpBM,EAAQN,EAAI,IAAKJ,GAAMK,GAAUL,EAAGM,CAAQ,CAAC,MACvC,CACNI,EAAQ,CAAC,EACT,OAAW,CAACC,EAAKC,CAAK,IAAK,OAAO,QAAQR,CAAU,EACnDM,EAAMC,CAAG,EAAIN,GAAUO,EAAON,CAAQ,CAExC,CACA,OAAIA,GAAYE,GACfK,EAAUH,EAAOF,CAAG,EAEdE,CACR,CACA,OAAON,CACR,CAGO,SAASU,GAAWV,EAAU,CAEpC,SAAO,GAAAW,SAAKX,CAAG,CAChB,CAEO,SAASG,EAASH,EAAU,CAClC,OAAOA,GAAO,OAAOA,GAAQ,QAC9B,CAEO,SAASY,GAAkBC,EAAa,CAK9C,QAJIC,EAAa,CAAC,EACdC,EAAQ,CAACF,CAAM,EACfG,EAAQ,EAELD,EAAM,QAAQ,CACpB,IAAIP,EAAQO,EAAM,IAAI,EAEtB,GAAI,OAAOP,GAAU,UACpBQ,GAAS,UACC,OAAOR,GAAU,SAC3BQ,GAASR,EAAM,OAAS,UACd,OAAOA,GAAU,SAC3BQ,GAAS,UACC,OAAOR,GAAU,UAAYM,EAAW,QAAQN,CAAK,IAAM,GAAI,CACzEM,EAAW,KAAKN,CAAK,EAErB,QAASS,KAAKT,EACbO,EAAM,KAAKP,EAAMS,CAAC,CAAC,CAErB,CACD,CACA,OAAOD,CACR,CAEO,SAASE,EACfC,EACAC,EAAkB,mBACE,CACpB,GAAI,CAACD,EACJ,MAAM,IAAI,MAAMC,CAAO,CAEzB,CAEO,SAASC,GAAWC,EAAS,GAAI,CACvC,OAAOC,GAAG,EAAE,QAAQ,IAAK,EAAE,EAAE,MAAM,EAAGD,CAAM,CAC7C,CAEO,SAASE,GAAiBC,EAAYC,EAAiC,CAC7E,QAAST,EAAIQ,EAAM,OAAS,EAAGR,GAAK,EAAGA,IACtC,GAAIS,EAAUD,EAAMR,CAAC,CAAC,EACrB,OAAOA,EAGT,MAAO,EACR,CAEO,SAASU,GACfC,EACAC,EACI,CACJ,IAAIC,EACJ,OAAO,YAAwBC,EAAa,CAC3C,IAAMC,EAAU,KAChB,aAAaF,CAAO,EACpBA,EAAU,WAAW,IAAMF,EAAG,MAAMI,EAASD,CAAI,EAAGF,CAAI,CACzD,CACD,CCrHO,IAAMI,GAAiB,qBACjBC,GAAU,OAEjBC,GAAuB,IACvBC,GAAmB,IAMnBC,GAAS,IAAI,QAEZ,SAASC,GAAOC,EAAU,CAChC,IAAMC,EAAMC,GAAYF,CAAG,EAC3B,OAAAG,EACC,CAAC,CAACF,EACF,UAAU,KAAK,UAAUD,CAAG,CAAC,sCAC9B,EACOC,CACR,CAEO,SAASC,GAAYF,EAAwC,CACnE,GAAKI,EAASJ,CAAG,EAGjB,OAAOF,GAAO,IAAIE,CAAG,GAAKA,EAAIL,EAAO,GAAKK,EAAIN,EAAc,CAC7D,CAEO,SAASW,EAAUL,EAAUC,EAAuB,CAC1D,OAAAE,EACCC,EAASJ,CAAG,EACZ,+CAA+C,KAAK,UAAUA,CAAG,CAAC,EACnE,EACIM,GAAON,CAAG,GACbO,GAAUP,CAAG,EAEdF,GAAO,IAAIE,EAAKC,CAAG,EACZD,CACR,CAEO,SAASM,GAAON,EAAU,CAChC,MAAO,CAAC,CAACE,GAAYF,CAAG,CACzB,CAEO,SAASO,GAAUP,EAAU,CACnC,OAAAF,GAAO,OAAOE,CAAG,EACVA,CACR,CAEO,SAASQ,GAASC,EAAa,CACrC,OAAOA,IAAQd,IAAWc,IAAQf,EACnC,CAMO,SAASgB,GACfV,EACAW,EACAC,EACC,CACD,GAAKN,GAAON,CAAG,EAKd,OAAOD,GAAOC,CAAG,EALA,CACjB,IAAMC,EAAMY,GAAaF,EAASC,CAAW,EAC7C,OAAAP,EAAUL,EAAKC,CAAG,EACXA,CACR,CAGD,CAEO,SAASa,GACfd,EACAW,EACAC,EACC,CACD,GAAKN,GAAON,CAAG,EAIR,CACN,IAAMe,EAAchB,GAAOC,CAAG,EAC9B,GAAKgB,GAAeD,EAAaJ,CAAO,EAKvC,OAAOZ,GAAOC,CAAG,EALyB,CAC1C,IAAMC,EAAMY,GAAaF,EAASC,CAAW,EAC7C,OAAAP,EAAUL,EAAKC,CAAG,EACXA,CACR,CAGD,KAbkB,CACjB,IAAMA,EAAMY,GAAaF,EAASC,CAAW,EAC7C,OAAAP,EAAUL,EAAKC,CAAG,EACXA,CACR,CAUD,CAEA,IAAMgB,GAAwB,CAC7B,IAAK,QACL,IAAK,UACL,IAAK,SACN,EACA,SAASC,GAAiBC,EAAY,CAErC,OAAOA,EACL,QAAQ,OAAQF,GAAsB,GAAG,CAAC,EAC1C,QAAQ,OAAQA,GAAsB,GAAG,CAAC,EAC1C,QAAQ,OAAQA,GAAsB,GAAG,CAAC,CAC7C,CACA,SAASG,GAAmBD,EAAY,CAEvC,OAAOA,EACL,QAAQ,WAAY,GAAG,EACvB,QAAQ,WAAY,GAAG,EACvB,QAAQ,SAAU,GAAG,CACxB,CAEO,SAASE,EACfC,EACAC,EACAC,EACC,CACD,IAAIvB,EACHiB,GAAiBI,CAAU,EAC3B1B,GACAsB,GAAiBK,CAAU,EAC5B,OAAIC,IACHvB,GAAOJ,GAAmB2B,GAEpBvB,CACR,CAEO,SAASY,GACfY,EACAb,EAA4Bc,GAC3B,CACD,GAAM,CAAE,WAAAJ,EAAY,GAAAH,CAAG,EAAIQ,GAAaF,CAAI,EAC5C,OAAOJ,EAAUC,EAAYH,EAAIP,EAAY,CAAC,CAC/C,CAEO,SAASe,GAAa1B,EAI3B,CACD,GAAM,CAAC2B,EAAMC,CAAM,EAAI5B,EAAI,MAAMJ,EAAgB,EAC3C,CAACyB,EAAYQ,CAAgB,EAAIF,EAAK,MAAM,GAAG,EACjDT,EACJ,OAAIW,EAAiB,SAAS,GAAG,EAChCX,EAAKW,EAAiB,MAAM,EAAGA,EAAiB,QAAQ,GAAG,CAAC,EAE5DX,EAAKW,EAEC,CACN,WAAYV,GAAmBE,CAAU,EACzC,GAAIF,GAAmBD,CAAE,EACzB,MAAOU,CACR,CACD,CAoBO,SAASE,GACfC,EACAC,EACC,CACD,IAAMC,EAAUC,GAAOH,CAAG,EAC1B,GAAI,MAAM,QAAQA,CAAG,EAAG,CACvB,IAAII,EACJ,QAASC,EAAI,EAAGA,EAAIL,EAAI,OAAQK,IAC/BD,EAAOJ,EAAIK,CAAC,EACRC,EAASF,CAAI,GAAK,CAACG,GAAMH,CAAI,IAChCI,GAAoBJ,EAAMF,EAASD,CAAW,EAC9CF,GAA0BK,EAAMH,CAAW,EAG9C,SAAWK,EAASN,CAAG,GAAK,CAACO,GAAMP,CAAG,EACrC,QAAWS,KAAO,OAAO,KAAKT,CAAG,EAC5BM,EAASN,EAAIS,CAAG,CAAC,GAAK,CAACF,GAAMP,EAAIS,CAAG,CAAC,IACxCD,GAAoBR,EAAIS,CAAG,EAAGP,EAASD,CAAW,EAClDF,GAA0BC,EAAIS,CAAG,EAAGR,CAAW,EAInD,CAWO,SAASS,GAAoBC,EAAU,CAC7C,GAAKC,EAASD,CAAG,EAGjB,OAAOA,EAAIE,EAAO,GAAKF,EAAIG,EAAc,CAC1C,CAEA,SAASC,GAAkBJ,EAAU,CACpC,OAAKC,EAASD,CAAG,IAGjB,OAAOA,EAAIG,EAAc,EACzB,OAAOH,EAAIE,EAAO,GACXF,CACR,CA2BA,SAASK,GAA4BC,EAAU,CAC9C,IAAMC,EAAMC,GAAoBF,CAAG,EAC/BC,GACHE,EAAUH,EAAKC,CAAG,CAEpB,CAQO,SAASG,GAAqCJ,EAAU,CAI9D,GAHAD,GAA4BC,CAAG,EAC/BK,GAAkBL,CAAG,EAEjB,MAAM,QAAQA,CAAG,EACpB,QAASM,EAAI,EAAGA,EAAIN,EAAI,OAAQM,IAC/BF,GAAqCJ,EAAIM,CAAC,CAAC,UAElCC,EAASP,CAAG,EACtB,QAAWQ,KAAO,OAAO,KAAKR,CAAG,EAChCI,GAAqCJ,EAAIQ,CAAG,CAAC,CAGhD,CAEO,SAASC,GAA4BT,EAAU,CAGrD,GAFAU,GAAUV,CAAG,EAET,MAAM,QAAQA,CAAG,EACpB,QAASM,EAAI,EAAGA,EAAIN,EAAI,OAAQM,IAC/BG,GAA4BT,EAAIM,CAAC,CAAC,UAEzBC,EAASP,CAAG,EACtB,QAAWQ,KAAO,OAAO,KAAKR,CAAG,EAChCS,GAA4BT,EAAIQ,CAAG,CAAC,CAGvC,CAEO,SAASG,IAAiB,CAChC,OAAOC,GAAG,EAAE,MAAM,EAAG,CAAC,CACvB,CAEO,SAASC,GAAUZ,EAAkC,CAC3D,MAAO,CACN,SAAU,MACV,GAAIA,CACL,CACD,CAEO,SAASa,GACfd,EACAe,EAAmC,IAAI,IACV,CAC7B,GAAI,MAAM,QAAQf,CAAG,EAAG,CACvB,IAAMC,EAAMe,GAAOhB,CAAG,EAChBiB,EAAOd,EAAU,CAAC,EAAGF,CAAG,EAC9B,QAASK,EAAI,EAAGA,EAAIN,EAAI,OAAQM,IAAK,CACpC,IAAMY,EAAQlB,EAAIM,CAAC,EACnB,GAAIC,EAASW,CAAK,EAAG,CACpB,GAAIC,GAAYD,CAAK,EACpB,MAAM,IAAI,MACT,oGACD,EACM,GAAIE,GAAUF,CAAK,EAAG,CAC5BD,EAAKX,CAAC,EAAIY,EACV,QACD,KAAO,CACN,IAAMG,EAAUL,GAAOE,CAAK,EAC5BD,EAAKX,CAAC,EAAIO,GAAUQ,CAAO,EAC3BP,GAAUI,EAAOH,CAAI,CACtB,CACD,MACCE,EAAKX,CAAC,EAAIY,CAEZ,CACAH,EAAK,IAAId,EAAKgB,CAAI,CACnB,SAAWV,EAASP,CAAG,GAAK,CAACsB,GAAMtB,CAAG,EAAG,CACxC,IAAMC,EAAMe,GAAOhB,CAAG,EAChBiB,EAAOd,EAAU,CAAC,EAA0BF,CAAG,EACrD,QAAWO,KAAO,OAAO,KAAKR,CAAG,EAAG,CACnC,IAAMkB,EAAQlB,EAAIQ,CAAG,EACrB,GAAID,EAASW,CAAK,EAAG,CACpB,GAAIC,GAAYD,CAAK,EACpB,MAAM,IAAI,MACT,oGACD,EACM,GAAIE,GAAUF,CAAK,EAEzBD,EAAKT,CAAG,EAAIU,MACN,CACN,IAAMG,EAAUL,GAAOE,CAAK,EAC5BD,EAAKT,CAAG,EAAIK,GAAUQ,CAAO,EAC7BP,GAAUI,EAAOH,CAAI,CACtB,CACD,MACCE,EAAKT,CAAG,EAAIU,CAEd,CACAH,EAAK,IAAId,EAAKgB,CAAI,CACnB,MAAWK,GAAMtB,CAAG,EAEpB,OAAOe,CACR,CA2CO,SAASQ,EAAWC,EAAuB,CACjD,OAAOA,EAAI,MAAM,GAAG,EAAE,CAAC,EAAE,MAAMC,EAAgB,EAAE,CAAC,CACnD,CAMO,SAASC,GAAiBF,EAAuBG,EAAoB,CAC3E,IAAMC,EAAOL,EAAWC,CAAG,EACrBK,EAAYC,GAAaF,EAAM,IAAM,QAAQ,EACnD,OAAID,EACI,CAAC,GAAGC,CAAI,IAAKC,CAAS,EAEvB,CAAC,GAAGD,CAAI,GAAGH,EAAgB,GAAII,CAAS,CAChD,CAUO,SAASE,GAAeC,EAAwBC,EAAwB,CAC9E,OAAOC,EAAWF,CAAI,IAAME,EAAWD,CAAI,CAC5C,CAqCO,SAASE,GAAeC,EAAuB,CAErD,OAD4BA,EAAI,MAAMC,EAAgB,EAAE,CAAC,EAC9B,SAAS,GAAG,CACxC,CCndO,SAASC,GAAYC,EAA4B,CACvD,OAAOA,GAAO,OAAOA,GAAQ,UAAYA,EAAI,QAAQ,IAAM,KAC5D,CAiHA,SAASC,GAAiBC,EAAU,CACnC,OAAOC,EAASD,CAAG,GAAK,CAACE,GAAMF,CAAG,CACnC,CAEA,SAASG,GAAmBC,EAAQC,EAAQ,CAC3C,OAAID,IAAMC,EAAU,GAChBH,GAAME,CAAC,GAAKF,GAAMG,CAAC,EAAUC,GAAYF,EAAGC,CAAC,EAC1C,EACR,CAEO,SAASE,GACfC,EACAC,EACAC,EACAC,EACAC,EAAuB,CAAC,EACxBC,EAWI,CAAC,EACS,CACd,IAAMC,EAAMC,GAAOP,CAAI,EAEvB,SAASQ,EAAUC,EAAsBC,EAAYC,EAAe,CACnE,GAAI,CAACpB,GAAiBmB,CAAK,EAGrBf,GAAmBe,EAAOC,CAAQ,GACtCP,EAAQ,KAAK,CACZ,IAAAE,EACA,UAAWJ,EAAO,EAClB,KAAM,CACL,GAAI,MACJ,KAAMO,EACN,MAAAC,CACD,CACD,CAAC,MAEI,CACN,IAAME,EAAcC,GAAYF,CAAQ,EACpCG,EAAWD,GAAYH,CAAK,EAI5BI,GAAY,CAACC,GAAeT,EAAKQ,CAAQ,GAC5CJ,EAAQM,GAAUN,EAAO,EAAK,EAC9BI,EAAWG,GAAaX,EAAKH,CAAW,EACxCe,EAAUR,EAAOI,CAAQ,GACdT,EAAQ,oBAKf,CAACS,GAAYF,GAChBM,EAAUR,EAAOE,CAAW,EAC5BE,EAAWF,GAEXE,EAAWK,GAAUT,EAAOJ,EAAKH,CAAW,EAR7CW,EAAWK,GAAUT,EAAOJ,EAAKH,CAAW,EAW7CiB,EACC,CAAC,CAACN,EACF,yEACD,EACAM,EACCL,GAAeT,EAAKQ,CAAQ,EAC5B,oBAAoBA,CAAQ,iCAAiCR,CAAG,6BACjE,EAEIK,IAAa,QAAaG,IAAaF,GAK1CS,GAAiBX,EAAOI,EAAUZ,EAAQC,EAAaC,CAAO,EAC9DA,EAAQ,KAAK,CACZ,IAAAE,EACA,UAAWJ,EAAO,EAClB,KAAM,CACL,GAAI,MACJ,KAAMO,EACN,MAAOa,GAAUR,CAAQ,CAC1B,CACD,CAAC,EAEGF,IAAgB,QACnBR,EAAQ,KAAK,CACZ,IAAKQ,EACL,UAAWV,EAAO,EAClB,KAAM,CACL,GAAI,QACL,CACD,CAAC,GAKFH,GAAcY,EAAUD,EAAOR,EAAQC,EAAaC,EAASC,CAAO,CAEtE,CACD,CAEA,GAAI,MAAM,QAAQL,CAAI,GAAK,MAAM,QAAQC,CAAE,EAAG,CAI7C,QAASsB,EAAI,EAAGA,EAAItB,EAAG,OAAQsB,IAAK,CACnC,IAAMb,EAAQT,EAAGsB,CAAC,EACZZ,EAAWX,EAAKuB,CAAC,EACvBf,EAAUe,EAAGb,EAAOC,CAAQ,CAC7B,CAEA,IAAMa,EAAoBxB,EAAK,OAASC,EAAG,OAC3C,GAAIuB,EAAoB,EAAG,CAE1B,QAASD,EAAItB,EAAG,OAAQsB,EAAIvB,EAAK,OAAQuB,IAAK,CAC7C,IAAMb,EAAQV,EAAKuB,CAAC,EACdT,EAAWD,GAAYH,CAAK,EAC9BI,GACHV,EAAQ,KAAK,CACZ,IAAKU,EACL,UAAWZ,EAAO,EAClB,KAAM,CACL,GAAI,QACL,CACD,CAAC,CAEH,CAEAE,EAAQ,KAAK,CACZ,IAAAE,EACA,UAAWJ,EAAO,EAClB,KAAM,CACL,GAAI,cACJ,MAAOD,EAAG,OACV,MAAOuB,CACR,CACD,CAAC,CACF,CACD,KAAO,IAAI,MAAM,QAAQxB,CAAI,GAAK,MAAM,QAAQC,CAAE,EACjD,MAAM,IAAI,MAAM,qCAAqC,EAC/C,GAAIV,GAAiBS,CAAI,GAAKT,GAAiBU,CAAE,EAAG,CAC1D,IAAMwB,EAAU,IAAI,IAAI,OAAO,KAAKzB,CAAI,CAAC,EACzC,OAAW,CAACS,EAAKC,CAAK,IAAK,OAAO,QAAQT,CAAE,EAAG,CAK9C,GAJIS,IAAU,QAAaL,EAAQ,mBAEnCoB,EAAQ,OAAOhB,CAAG,EAEdiB,GAASjB,CAAG,GAAG,SAEnB,IAAME,EAAWX,EAAKS,CAAG,EAEzBD,EAAUC,EAAKC,EAAOC,CAAQ,CAC/B,CAGA,GAAI,CAACN,EAAQ,iBACZ,QAAWI,KAAOgB,EACbC,GAASjB,CAAG,GAEhBL,EAAQ,KAAK,CACZ,IAAAE,EACA,UAAWJ,EAAO,EAClB,KAAM,CACL,GAAI,SACJ,KAAMO,CACP,CACD,CAAC,CAGJ,EAEA,OAAOL,CACR,CA2FO,SAASuB,GACfC,EACAC,EACAC,EACAC,EACAC,EAAuB,CAAC,EACvB,CACDC,EAAUL,EAASC,CAAO,EAC1BK,GAA0BN,EAASG,CAAW,EAC9C,IAAMI,EAAaC,GAAUR,CAAO,EACpC,QAAWS,KAAOF,EAAW,KAAK,EAAG,CACpC,IAAMG,EAAQH,EAAW,IAAIE,CAAG,EAChCL,EAAQ,KAAK,CACZ,IAAKK,EACL,UAAWP,EAAO,EAClB,KAAM,CACL,GAAI,aACJ,MAAOS,GAAUD,CAAK,CACvB,CACD,CAAC,CACF,CACA,OAAON,CACR,CAmBO,SAASQ,GAAyBC,EAAsB,CAC9D,IAAMC,EAAiD,CAAC,EACxD,QAAWC,KAASF,EACfE,EAAM,OAAOD,EAChBA,EAAQC,EAAM,GAAG,EAAE,KAAKA,CAAK,EAE7BD,EAAQC,EAAM,GAAG,EAAI,CAACA,CAAK,EAG7B,OAAOD,CACR,CAEO,SAASE,GAAsBH,EAAsB,CAC3D,IAAMC,EAAiD,CAAC,EACxD,QAAWC,KAASF,EAAS,CAC5B,IAAMI,EAAOC,EAAWH,EAAM,GAAG,EAC7BE,KAAQH,EACXA,EAAQG,CAAI,EAAE,KAAKF,CAAK,EAExBD,EAAQG,CAAI,EAAI,CAACF,CAAK,CAExB,CACA,OAAOD,CACR,CAEO,SAASK,GAAwBC,EAA+B,CACtE,IAAMN,EAAwD,CAAC,EAC/D,QAAWC,KAASK,EAAW,CAC9B,IAAMH,EAAOC,EAAWH,EAAM,GAAG,EAC7BE,KAAQH,EACXA,EAAQG,CAAI,EAAE,KAAKF,CAAK,EAExBD,EAAQG,CAAI,EAAI,CAACF,CAAK,CAExB,CACA,OAAOD,CACR,CAQA,SAASO,GAAUC,EAAiC,CACnD,OAAK,MAAM,QAAQA,CAAG,EAUd,IATP,QAAQ,MACP,qDAAqD,KAAK,UACzDA,CACD,CAAC,mFAAmFC,GACnFD,CACD,CAAC,GACF,EACO,GAIT,CAMO,SAASE,GACfC,EACAV,EAKAW,EACgB,CAGhB,GAA2BD,GAAS,MAASV,EAAM,KAAO,aACzD,OAAOU,EAGR,IAAME,EAAYF,EACdG,EACAC,EAKJ,SAASC,EAASC,EAAY,CAExBL,GACDM,GAAMD,CAAK,GACdL,EAAY,KAAKK,CAAK,CAExB,CAEA,OAAQhB,EAAM,GAAI,CACjB,IAAK,MACJe,EAASH,EAAUZ,EAAM,IAAI,CAAC,EAC9BY,EAAUZ,EAAM,IAAI,EAAIA,EAAM,MAC9B,MACD,IAAK,SACJe,EAASH,EAAUZ,EAAM,IAAI,CAAC,EAC9B,OAAOY,EAAUZ,EAAM,IAAI,EAC3B,MACD,IAAK,YACAM,GAAUI,CAAI,GACjBA,EAAK,KAAKV,EAAM,KAAK,EAEtB,MACD,IAAK,cACAM,GAAUI,CAAI,IACjBK,EAASL,EAAKV,EAAM,KAAK,CAAC,EAC1BU,EAAK,OAAOV,EAAM,MAAOA,EAAM,KAAK,GAErC,MACD,IAAK,qBACAM,GAAUI,CAAI,IACjBI,EAAeJ,EAAK,OAAOV,EAAM,KAAM,CAAC,EACxCU,EAAK,OAAOV,EAAM,GAAI,EAAGc,EAAa,CAAC,CAAC,GAEzC,MACD,IAAK,cACJ,GAAIR,GAAUI,CAAI,EACjB,EAAG,CACF,IAAMQ,EAAgBlB,EAAM,MACxBA,EAAM,OAAS,OACdmB,GAAYD,CAAa,EAC5BL,EAAQO,GACPV,EACCW,GAAcA,EAAK,KAAOH,EAAc,EAC1C,EAEAL,EAAQH,EAAK,YAAYQ,CAAa,EAGnCC,GAAYD,CAAa,EAC5BL,EAAQH,EAAK,UACXW,GAAcA,EAAK,KAAOH,EAAc,EAC1C,EAEAL,EAAQH,EAAK,QAAQQ,CAAa,EAGhCL,IAAU,KACbE,EAASL,EAAKG,CAAK,CAAC,EACpBH,EAAK,OAAOG,EAAO,CAAC,EAEtB,OAAS,CAACb,EAAM,MAAQa,IAAU,IAEnC,MACD,IAAK,WACAP,GAAUI,CAAI,IACEA,EAAK,KAAMW,GACzBF,GAAYE,CAAI,GAAKF,GAAYnB,EAAM,KAAK,EACxCqB,EAAK,KAAOrB,EAAM,MAAM,GAExBqB,IAASrB,EAAM,KAEvB,GAEAU,EAAK,KAAKV,EAAM,KAAK,GAGvB,MACD,IAAK,mBACAM,GAAUI,CAAI,IACjBG,EAAQH,EAAK,QAAQV,EAAM,KAAK,EAChCc,EAAeJ,EAAK,OAAOG,EAAO,CAAC,EACnCH,EAAK,OAAOV,EAAM,MAAO,EAAGc,EAAa,CAAC,CAAC,GAE5C,MACD,IAAK,cACJ,GAAIR,GAAUI,CAAI,EAAG,CACpB,GAAI,CAACV,EAAM,OAAS,CAACA,EAAM,OAC1B,MAAM,IAAI,MACT,sEAAsE,KAAK,UAC1EA,CACD,CAAC,EACF,EAEGA,EAAM,MACTU,EAAK,OAAOV,EAAM,MAAO,EAAGA,EAAM,KAAK,EAEvCU,EAAK,OAAOV,EAAM,MAAO,EAAG,GAAGA,EAAM,MAAO,CAE9C,CACA,MACD,IAAK,SAEA,MAAM,QAAQU,CAAI,EACrBA,EAAK,QAAQK,CAAQ,EACXO,EAASZ,CAAI,GACvB,OAAO,OAAOA,GAAQ,CAAC,CAAC,EAAE,QAAQK,CAAQ,EAE3C,OACD,IAAK,aACJ,OAAOQ,GAAUvB,EAAM,KAAK,EAC7B,QACC,MAAM,IAAI,MAAM,gCAAiCA,EAAc,EAAE,EAAE,CACrE,CACA,OAAOU,CACR,CAkBO,SAASc,GACfC,EACAC,EACAC,EAA2B,CAAC,EACP,CACrB,GAAI,MAAM,QAAQF,CAAI,EACrB,QAASG,EAAI,EAAGA,EAAIH,EAAK,OAAQG,IAAK,CACrC,IAAMC,EAAOJ,EAAKG,CAAC,EACnBH,EAAKG,CAAC,EAAIE,GAAYD,EAAMH,EAAMC,CAAI,EAClCI,EAASN,EAAKG,CAAC,CAAC,GACnBJ,GAA0BC,EAAKG,CAAC,EAAGF,EAAMC,CAAI,CAE/C,SACU,CAAAK,GAAUP,CAAI,GAElB,GAAIM,EAASN,CAAI,EAAG,CAG1BQ,EACCC,GAAYT,CAAI,EAChB,UAAU,KAAK,UAAUA,CAAI,CAAC,mBAC/B,EACA,QAAWU,KAAO,OAAO,KAAKV,CAAI,EACjCA,EAAKU,CAAG,EAAIL,GAAYL,EAAKU,CAAG,EAAGT,EAAMC,CAAI,EAGzCI,EAASN,EAAKU,CAAG,CAAC,GACrBX,GAA0BC,EAAKU,CAAG,EAAGT,EAAMC,CAAI,CAGlD,EAEA,OAAOA,CACR,CAEA,SAASG,GACRM,EACAV,EACAC,EACM,CACN,GAAIU,GAAYD,CAAK,EAAG,CACvBT,EAAK,KAAKS,EAAM,EAAE,EAClB,IAAME,EAAWZ,EAAK,IAAIU,EAAM,EAAE,EAClC,OAAAH,EAAO,CAAC,CAACK,EAAU,wCAAwCF,EAAM,EAAE,EAAE,EAC9DG,EAAUD,EAAUF,EAAM,EAAE,CACpC,KACC,QAAOA,CAET,CCltBO,SAASI,GAAWC,EAA2B,CACrD,OAAIA,EAAM,OAAS,MAAc,GAC7BA,EAAM,OAAS,MAAc,GAC1BA,EAAM,QACd,CAEO,SAASC,GAAWD,EAAuC,CACjE,OAAKA,EACDA,EAAM,OAAS,OACfA,EAAM,OAAS,QAAgB,GAC/BA,EAAM,OAAS,OAAe,GAC9BA,EAAM,OAAS,SAAiB,GAC7BA,EAAM,UAAY,OALN,EAMpB,CAEO,SAASE,GAAUF,EAA2B,CAKpD,OAJIA,EAAM,OAAS,OACfA,EAAM,OAAS,UACfA,EAAM,OAAS,SACfA,EAAM,OAAS,QACfA,EAAM,OAAS,MAAc,GAC1BA,EAAM,OACd,CAEO,SAASG,GACfC,EACAC,EACC,CACD,OAAW,CAACC,EAAKN,CAAK,IAAK,OAAO,QAAQI,EAAW,MAAM,EAAG,CAC7D,IAAMG,EAAeC,GAAgBR,CAAK,GAExCO,IAAiB,QAAaF,EAAMC,CAAG,IAAM,QAG7C,CAACP,GAAWC,CAAK,GAAKK,EAAMC,CAAG,IAAM,QAEtCD,EAAMC,CAAG,EAAIC,GAEVF,EAAMC,CAAG,GACZG,GAAyCJ,EAAMC,CAAG,EAAGN,CAAK,CAE5D,CACA,OAAOK,CACR,CAEO,SAASI,GACfJ,EACAL,EACC,CACD,GAA2BK,GAAU,KAAM,OAAOA,EAClD,GAAIL,EAAM,OAAS,SAClB,OAAW,CAACM,EAAKI,CAAQ,IAAK,OAAO,QAAQV,EAAM,UAAU,EAAG,CAC/D,GAAIK,EAAMC,CAAG,IAAM,OAAW,CAC7B,IAAMC,EAAeC,GAAgBE,CAAQ,EACzCH,IAAiB,SACpBF,EAAMC,CAAG,EAAIC,EAEf,CACAE,GAAyCJ,EAAMC,CAAG,EAAGI,CAAQ,CAC9D,SACUV,EAAM,OAAS,QACzB,QAAWW,KAAQN,EAClBI,GAAyCE,EAAMX,EAAM,KAAK,UAEjDA,EAAM,OAAS,MACzB,OAAW,CAACM,EAAKK,CAAI,IAAK,OAAO,QAAQN,CAAK,EAEzCC,IAAQM,IAAWN,IAAQO,IAC/BJ,GAAyCE,EAAMX,EAAM,MAAM,CAG9D,CAEO,SAASQ,GAAgBR,EAA2B,CAC1D,GACCA,EAAM,OAAS,UACfA,EAAM,OAAS,UACfA,EAAM,OAAS,WACfA,EAAM,OAAS,MACd,CACD,GAAIA,EAAM,SAAW,OAAOA,EAAM,SAAY,WAC7C,OAAOA,EAAM,QAAQ,EACf,GAAIA,EAAM,UAAY,OAE5B,OAAO,KAAK,MAAM,KAAK,UAAUA,EAAM,OAAO,CAAC,CAEjD,CACA,GAAIA,EAAM,OAAS,QAClB,MAAO,CAAC,EAET,GAAIA,EAAM,OAAS,MAClB,MAAO,CAAC,EAET,GAAIA,EAAM,OAAS,OAASA,EAAM,SACjC,OAAO,IAGT,CAEO,SAASc,GACfV,EACAC,EACC,CACD,OAAW,CAACC,EAAKS,CAAU,IAAK,OAAO,QAAQV,CAAK,EAE/CC,IAAQM,IAAWN,IAAQO,KAE1BT,EAAW,OAAOE,CAAG,EAGzBU,GACCD,EACAX,EAAW,OAAOE,CAAG,CACtB,EALA,OAAOD,EAAMC,CAAG,GAQlB,OAAOD,CACR,CAEO,SAASW,GACfX,EACAL,EACC,CACD,GAAIiB,EAASZ,CAAK,GAAKL,EAAM,OAAS,SACrC,OAAW,CAACM,EAAKS,CAAU,IAAK,OAAO,QAAQV,CAAK,EAC9CL,EAAM,WAAWM,CAAG,EAGxBU,GACCD,EACAf,EAAM,WAAWM,CAAG,CACrB,EALA,OAAOD,EAAMC,CAAG,UAQR,MAAM,QAAQD,CAAK,GAAKL,EAAM,OAAS,QACjD,QAAWW,KAAQN,EAClBW,GAAiDL,EAAMX,EAAM,KAAK,CAGrE,CCtIO,SAASkB,GACfC,EACuC,CACvC,OAAQA,EAAe,SAAW,MACnC,CAEO,SAASC,GACfD,EACuC,CACvC,OACEA,EAAe,MAAQ,QACvBA,EAAe,MAAQ,QACvBA,EAAe,KAAO,QACtBA,EAAe,KAAO,MAEzB,CAEO,SAASE,GACfF,EAC0C,CAC1C,MAAO,CAAC,CAAEA,EAAe,KAC1B,CAEO,SAASG,GACfH,EACkC,CAClC,OAAQA,EAAe,aAAe,MACvC,CAEO,SAASI,GACfJ,EAC4B,CAC5B,MACC,CAACC,GAAmBD,CAAM,GAC1B,CAACD,GAAmBC,CAAM,GAC1B,CAACE,GAAsBF,CAAM,GAC7B,CAACG,GAAwBH,CAAM,GAC9BA,EAAe,KAElB,CCrCO,SAASK,GAId,CACD,WAAAC,EACA,QAAAC,EACA,GAAGC,CACJ,EAI2D,CAE1D,IAAMC,EAAe,CAAE,GAAGH,EAAY,GAAGC,CAAQ,EAEjD,OAAW,CAACG,EAAKC,CAAK,IAAK,OAAO,QAAQH,EAAM,MAAM,EACjDI,GAAUD,CAAK,IAClBF,EAAaC,CAAG,EAAI,CACnB,MAAOA,CACR,GAGF,MAAO,CACN,GAAGF,EACH,QAASC,CACV,CACD,CAEO,SAASI,GAOdL,EAA8B,CAC/B,OAAOA,CACR,CCxCO,IAAMM,GAA2B,WAE3BC,GAAuC,KAEvCC,GAAuC,WAK7C,SAASC,MACZC,EACkB,CACrB,IAAMC,EAAQC,GAAiBF,CAAM,EACrC,OAAIC,EAAM,SAAW,EACbA,EAAM,CAAC,EAERA,CACR,CAEO,SAASE,MACZH,EACM,CACT,OACCA,EAAO,KAAKJ,EAAwB,EACpC,GAAGE,EAAoC,EAEzC,CAEO,SAASM,MACZJ,EACM,CACT,OACCA,EAAO,KAAKJ,EAAwB,EACpC,GAAGA,EAAwB,GAAGC,EAAoC,EAEpE,CA8BA,SAASK,GAAiBF,EAAyC,CAClE,IAAIC,EAAoB,CAAC,CAAC,CAAC,EAC3B,QAAWI,KAASL,EACnB,GAAI,MAAM,QAAQK,CAAK,EAAG,CACzB,IAAMC,EAAuB,CAAC,EAC9B,QAAWC,KAAiBN,EAC3B,QAAWO,KAAcH,EACxBC,EAAS,KAAKC,EAAc,OAAOC,CAAU,CAAC,EAGhDP,EAAQK,CACT,KACC,SAAWG,KAAQR,EAClBQ,EAAK,KAAK,GAAGJ,CAAK,EAAE,EAIvB,OAAO,MAAM,KACZ,IAAI,IACHJ,EAAM,IAAKQ,GACHA,EAAK,KAAKb,EAAwB,CACzC,CACF,CACD,CACD,CAEO,SAASc,GACfC,EAC6C,CAC7C,MAAO,CAAC,CAACA,EAAM,KAChB,CAEO,SAASC,GAAkBC,EAAiCC,EAAU,CAC5E,IAAMC,EAA8B,CAAC,EACrC,OAAW,CAACC,EAAMC,CAAQ,IAAK,OAAO,QAAQJ,EAAO,SAAW,CAAC,CAAC,EAAG,CACpE,IAAMF,EAAQM,EACVP,GAAkBC,CAAK,EAC1BI,EAAOC,CAAI,EAAIE,GAAmBJ,EAAIH,EAAM,KAAK,CAAC,EAElDI,EAAOC,CAAI,EAAIE,GAAmBP,EAAM,QAAQG,CAAG,CAAC,CAEtD,CACA,OAAOC,CACR,CAEO,SAASI,GACfN,EACAO,EACM,CACN,OAAO,OAAO,QAAQP,EAAO,WAAa,CAAC,CAAC,EAAE,OAG7C,CAACQ,EAAK,CAACC,EAAUX,CAAK,KACrBU,EAAIC,CAAQ,EAAIvB,GACf,GAAIY,EAA4C,GAAG,IACjDY,GAAQH,EAAIG,CAAG,CACjB,CACD,EACOF,GAER,CAAC,CACF,CACD,CAEA,SAASG,GAAqBX,EAAiCO,EAAU,CACxE,OAAO,OAAO,QAAQP,EAAO,MAAM,EAAE,OACpC,CAACQ,EAAK,CAACE,EAAKlB,CAAK,KACZoB,GAAUpB,CAAK,IAClBgB,EAAIE,CAAG,EAAIL,GAAmBE,EAAIG,CAAG,CAAC,GAEhCF,GAER,CAAC,CACF,CACD,CAEO,SAASK,GACfb,EACAO,EACC,CACD,MAAO,CACN,CAACP,EAAO,UAAU,EAAGO,EAAIP,EAAO,UAAU,EAC1C,GAAGW,GAAqBX,EAAQO,CAAG,EACnC,GAAGR,GAAkBC,EAAQO,CAAG,EAChC,GAAGD,GAAuBN,EAAQO,CAAG,EACrC,cAAeA,CAChB,CACD,CAWO,IAAMO,GAAmB,OAEzB,SAASC,GACfC,EACwC,CACxC,GAAIA,IAAU,KACb,OAAOF,GAER,GAAI,OAAOE,GAAU,UAAY,OAAOA,GAAU,SACjD,OAAOA,EAER,GAAI,OAAOA,GAAU,WAAaA,IAAU,KAC3C,MAAO,GAAGA,CAAK,GAEhB,GAAIA,IAAU,OAEb,MAAO,YAER,GAAI,MAAM,QAAQA,CAAK,EACtB,OAAOA,EAAM,IAAID,EAAkB,EAEpC,MAAM,IAAI,MAAM,4BAA4BC,CAAK,EAAE,CACpD,CCHA,IAAMC,GAA2B,CAChC,QAAS,EACT,YAAa,CAAC,CACf,EAaO,SAASC,GACfC,EACAC,EACAC,EACC,CACD,IAAMC,EAA4B,OAAOF,GAAyB,WAC5DG,EAAYD,EACfL,GACAE,EACGK,EAAYF,EACfH,EACAC,EACGK,EAAYH,EACfF,EACAC,EAEGK,EAA+B,OAAO,KAC3CF,EAAU,WACX,EAAE,OACAG,GACAJ,EAAU,YAAYI,CAAG,GACzBC,GAAgBL,EAAU,YAAYI,CAAG,CAAC,IACzCC,GAAgBJ,EAAU,YAAYG,CAAG,CAAC,CAC7C,EACME,EAA+B,OAAO,KAC3CN,EAAU,WACX,EAAE,OAAQI,GAAQ,CAACH,EAAU,YAAYG,CAAG,CAAC,EACvCG,EAAmB,OAAO,KAAKN,EAAU,WAAW,EAAE,OAC1DG,GAAQ,CAACJ,EAAU,YAAYI,CAAG,CACpC,EAEMI,EAA0B,IAAI,IACpC,QAAWC,KAAcN,EAAoB,CAC5C,IAAMO,EAAYV,EAAU,YAAYS,CAAU,EAAE,OAC9CE,EAAYV,EAAU,YAAYQ,CAAU,EAAE,OAGnD,OAAO,KAAKE,CAAS,EAAE,KACrBP,GAAQ,CAACM,EAAUN,CAAG,GAAG,SAAWO,EAAUP,CAAG,GAAG,OACtD,GAEAI,EAAwB,IAAIC,CAAU,EAGnC,OAAO,KAAKC,CAAS,EAAE,KAAMN,GAAQ,CAACO,EAAUP,CAAG,CAAC,GACvDI,EAAwB,IAAIC,CAAU,CAExC,CAEA,IAAMG,EAA4D,CAAC,EAC7DC,EAA8D,CAAC,EACrE,QAAWC,IAAW,CAAC,GAAGX,EAAoB,GAAGI,CAAgB,EAAG,CACnE,IAAMQ,EAAaC,GAAWhB,EAAU,YAAYc,CAAO,CAAC,EACtDG,EAAaD,GAAWf,EAAU,YAAYa,CAAO,CAAC,EACtDI,EAAQD,EAAW,OACvBE,GAAU,CAACJ,EAAW,KAAMK,GAAMA,EAAE,OAASD,EAAM,IAAI,CACzD,EACME,EAAUN,EAAW,OACzBI,GAAU,CAACF,EAAW,KAAMG,GAAMA,EAAE,OAASD,EAAM,IAAI,CACzD,EACID,EAAM,OAAS,IAClBN,EAAaE,CAAO,EAAII,EAEpBf,EAAmB,SAASW,CAAO,GACtCN,EAAwB,IAAIM,CAAO,GAGjCO,EAAQ,OAAS,IACpBR,EAAeC,CAAO,EAAIO,EAEtBlB,EAAmB,SAASW,CAAO,GACtCN,EAAwB,IAAIM,CAAO,EAGtC,CAEA,IAAMQ,EAAe,CAACC,EAAwBC,IACtCC,GAAiBxB,EAAU,YAAYsB,CAAc,EAAGC,CAAG,EAE7DE,EAAiBH,GAA4BC,GAAa,CAC/D,IAAMf,EAAaR,EAAU,YAAYsB,CAAc,EACvD,OAAOE,GAAiBhB,EAAYkB,GAAsBlB,EAAYe,CAAG,CAAC,CAC3E,EAEA,MAAO,CACN,QAASvB,EAAU,QACnB,QAAS,MAAO2B,GAA4B,CAC3C,IAAMC,EAAgC,CAAC,EAkCvC,GAjCA,MAAM3B,EAAU,CACf,QAAS,MAAOO,EAAiBqB,IAAkB,CAClD,IAAMC,EAAOL,EAAcjB,CAAU,EAC/BuB,EAAU,MAAOR,GAAa,CACnC,IAAMS,EAAY,MAAMH,EAASN,CAAG,EAGpC,OAAAU,EAAUD,EAAWE,GAAOX,CAAG,CAAC,EACjBO,EAAKE,CAAS,CAE9B,EAEA,MAAML,EAAO,QAAQnB,EAAYuB,CAAO,EACxCH,EAAoB,KAAKpB,CAAU,EAInCD,EAAwB,OAAOC,CAAU,CAC1C,EACA,SAAWe,GAAaA,EACxB,aAAAF,EACA,KAAM,CACL,mBAAAnB,EACA,iBAAAI,EACA,mBAAAD,CACD,EACA,QAASsB,EAAO,QAChB,UAAWA,EAAO,SACnB,CAAC,EAKG3B,EAAU,QAAU,EAAG,CAC1B2B,EAAO,IACN,QACA,+CACApB,CACD,EACA,QAAW4B,KAAQ5B,EAClB,MAAMoB,EAAO,QAAQQ,EAAMV,EAAcU,CAAI,CAAC,EAC9CP,EAAoB,KAAKO,CAAI,EAG9B,IAAMC,EAAalC,EAAmB,OACpCM,GAAe,CAACoB,EAAoB,SAASpB,CAAU,CACzD,EACI4B,EAAW,OAAS,GAEvB,QAAQ,MACP,+CAA+CrC,EAAU,OAAO,eAAeC,EAAU,OAAO,IAChGoC,CACD,CAEF,CACD,EACA,mBAAA/B,EACA,aAAAM,EACA,eAAAC,EACA,eAAgB,OAAO,KAAKZ,EAAU,WAAW,EACjD,mBAAAE,EACA,iBAAAI,EACA,eAAgB,OAAO,KAAKP,EAAU,WAAW,EACjD,UAAAA,EACA,UAAAC,CACD,CACD,CAqCA,SAASqC,GACRC,EAC8B,CAC9B,OAAKA,EAEE,CACN,GAAG,OAAO,KAAKA,EAAW,SAAW,CAAC,CAAC,EAAE,IAAKC,IAAS,CACtD,KAAMA,EACN,WAAY,CAAC,QAAS,WAAY,WAAY,WAAW,EAAE,SAC1DD,EAAW,QAAQC,CAAG,EAAE,IACzB,EACA,UAAW,GACX,SAAU,EACX,EAAE,EACF,GAAG,OAAO,KAAKD,EAAW,WAAa,CAAC,CAAC,EAAE,IAAKC,IAAS,CACxD,KAAMA,EACN,WAAYD,EAAW,UAAUC,CAAG,EAAE,GAAG,KACvCC,IACCF,EAAW,OAAOE,CAAS,GAAKF,EAAW,QAAQE,CAAS,GAC3D,OAAS,OACb,EACA,UAAW,GACX,SAAU,EACX,EAAE,CACH,EArBwB,CAAC,CAsB1B,CAWO,SAASC,GACfC,EACAC,EACC,CAOD,OAAOC,GANSD,EACbD,EACA,CACA,QAAS,EACT,YAAa,CAAC,CACd,EACuBC,GAAaD,EAAQ,MAAO,CAAE,QAAAE,EAAS,KAAAC,CAAK,IAAM,CAC3E,IAAKF,GAAaD,GAAQ,UAAY,EAEtC,QAAWJ,KAAcO,EAAK,mBAE7B,MAAMD,EAAQN,EAAaQ,GAAQA,CAAG,CAExC,CAAC,CACF,CAyEO,SAASC,GACfC,EACAC,EAGAC,EACM,CACN,IAAMC,EACL,OAAOF,GAA8B,YACrCA,IAA8B,OACzBG,EAAYD,EAA4BE,GAAcL,EACtDL,EAAYQ,EACfH,EACAC,EACGK,EAAYH,EACfF,EACAC,EACHK,EAAOH,EAAW,sCAAsC,EACxDG,EAAOZ,EAAW,sCAAsC,EACxD,GAAM,CACL,mBAAAa,EACA,iBAAAC,EACA,mBAAAC,EACA,aAAAC,EACA,eAAAC,EACA,wBAAAC,EACA,cAAAC,CACD,EAAIC,GAAiBX,EAAWT,CAAS,EAEzC,MAAO,CACN,QAASA,EAAU,QACnB,QAAS,MAAOqB,GAA4B,CAC3C,IAAMC,EAAgC,CAAC,EAiCvC,GAdA,MAAMX,IAAY,CACjB,QAnBe,MAAOhB,EAAiB4B,IAAkB,CACzD,IAAMC,EAAOL,EAAcxB,CAAU,EAC/B8B,EAAU,MAAOC,GAAa,CACnC,IAAMC,EAAY,MAAMJ,EAASG,CAAG,EAGpC,OAAAE,EAAUD,EAAWE,GAAOH,CAAG,CAAC,EACjBF,EAAKG,CAAS,CAE9B,EAEA,MAAMN,EAAO,QAAQ1B,EAAY8B,CAAO,EACxCH,EAAoB,KAAK3B,CAAU,EAInCuB,EAAwB,OAAOvB,CAAU,CAC1C,EAGC,KAAM,CACL,mBAAAkB,EACA,iBAAAC,EACA,mBAAAC,CACD,EACA,QAASM,EAAO,QAChB,UAAWA,EAAO,SACnB,CAAC,EAKGrB,EAAU,QAAU,EAAG,CAC1BqB,EAAO,IACN,QACA,+CACAH,CACD,EACA,QAAWY,KAAQZ,EAClB,MAAMG,EAAO,QAAQS,EAAMX,EAAcW,CAAI,CAAC,EAC9CR,EAAoB,KAAKQ,CAAI,EAG9B,IAAMC,EAAalB,EAAmB,OACpClB,GAAe,CAAC2B,EAAoB,SAAS3B,CAAU,CACzD,EACIoC,EAAW,OAAS,GAEvB,QAAQ,MACP,+CAA+CtB,EAAU,OAAO,eAAeT,EAAU,OAAO,IAChG+B,CACD,CAEF,CACD,EACA,mBAAAhB,EACA,aAAAC,EACA,eAAAC,EACA,eAAgB,OAAO,KAAKjB,EAAU,WAAW,EACjD,mBAAAa,EACA,iBAAAC,EACA,eAAgB,OAAO,KAAKL,EAAU,WAAW,EACjD,UAAAA,EACA,UAAAT,CACD,CACD,CAGA,SAASoB,GAAiBX,EAA0BT,EAA0B,CAC7E,IAAMa,EAA+B,OAAO,KAC3Cb,EAAU,WACX,EAAE,OACAJ,GACAa,EAAU,YAAYb,CAAG,GACzBoC,GAAgBvB,EAAU,YAAYb,CAAG,CAAC,IACzCoC,GAAgBhC,EAAU,YAAYJ,CAAG,CAAC,CAC7C,EACMmB,EAA+B,OAAO,KAC3CN,EAAU,WACX,EAAE,OAAQb,GAAQ,CAACI,EAAU,YAAYJ,CAAG,CAAC,EACvCkB,EAAmB,OAAO,KAAKd,EAAU,WAAW,EAAE,OAC1DJ,GAAQ,CAACa,EAAU,YAAYb,CAAG,CACpC,EAEMsB,EAA0B,IAAI,IACpC,QAAWvB,KAAckB,EAAoB,CAC5C,IAAMoB,EAAYxB,EAAU,YAAYd,CAAU,EAAE,OAC9CuC,EAAYlC,EAAU,YAAYL,CAAU,EAAE,OAGnD,OAAO,KAAKuC,CAAS,EAAE,KACrBtC,GAAQ,CAACuC,GAAWF,EAAUrC,CAAG,CAAC,GAAKuC,GAAWD,EAAUtC,CAAG,CAAC,CAClE,GAEAsB,EAAwB,IAAIvB,CAAU,EAGnC,OAAO,KAAKsC,CAAS,EAAE,KAAMrC,GAAQ,CAACsC,EAAUtC,CAAG,CAAC,GACvDsB,EAAwB,IAAIvB,CAAU,CAExC,CAEA,IAAMqB,EAA4D,CAAC,EAC7DC,EAA8D,CAAC,EACrE,QAAWmB,IAAW,CAAC,GAAGvB,EAAoB,GAAGC,CAAgB,EAAG,CACnE,IAAMuB,EAAa3C,GAAWe,EAAU,YAAY2B,CAAO,CAAC,EACtDE,EAAa5C,GAAWM,EAAU,YAAYoC,CAAO,CAAC,EACtDG,EAAQD,EAAW,OACvBE,GAAU,CAACH,EAAW,KAAMI,GAAMA,EAAE,OAASD,EAAM,IAAI,CACzD,EACME,EAAUL,EAAW,OACzBG,GAAU,CAACF,EAAW,KAAMG,GAAMA,EAAE,OAASD,EAAM,IAAI,CACzD,EACID,EAAM,OAAS,IAClBvB,EAAaoB,CAAO,EAAIG,EAEpB1B,EAAmB,SAASuB,CAAO,GACtClB,EAAwB,IAAIkB,CAAO,GAGjCM,EAAQ,OAAS,IACpBzB,EAAemB,CAAO,EAAIM,EAEtB7B,EAAmB,SAASuB,CAAO,GACtClB,EAAwB,IAAIkB,CAAO,EAGtC,CAUA,MAAO,CACN,mBAAAvB,EACA,iBAAAC,EACA,mBAAAC,EACA,aAAAC,EACA,eAAAC,EACA,wBAAAC,EACA,aAfoB,CAACyB,EAAwBjB,IACtCkB,GAAiB5C,EAAU,YAAY2C,CAAc,EAAGjB,CAAG,EAelE,cAbsBiB,GAA4BjB,GAAa,CAC/D,IAAM/B,EAAaK,EAAU,YAAY2C,CAAc,EACvD,OAAOC,GAAiBjD,EAAYkD,GAAsBlD,EAAY+B,CAAG,CAAC,CAC3E,CAWA,CACD,CClrBO,IAAMoB,GAAN,KAAmB,CACzB,YACSC,EACAC,EACP,CAFO,YAAAD,EACA,iBAAAC,EAGT,gBAAa,CACZC,EACAC,EACAC,EAAyE,CAAC,IAEnEC,GAAcH,EAAMC,EAAI,KAAK,OAAQ,KAAK,YAAa,CAAC,EAAGC,CAAO,EAG1E,sBAAmB,CAACE,EAAUC,IACtBC,GAAiBF,EAAKC,EAAK,KAAK,OAAQ,KAAK,WAAW,EAGhE,eAAY,CACXA,EACAE,EACAC,IACiB,CAGjB,GAAI,CAACC,EAASD,CAAK,GAAKE,GAAMF,CAAK,EAClC,MAAO,CACN,CACC,IAAAH,EACA,UAAW,KAAK,OAAO,EACvB,KAAM,CACL,GAAI,MACJ,KAAME,EACN,MAAAC,CACD,CACD,CACD,EACM,CACN,IAAMG,EAAUC,GAAaP,EAAK,KAAK,WAAW,EAClD,MAAO,CAGN,GAAGC,GAAiBE,EAAOG,EAAS,KAAK,MAAM,EAE/C,CACC,IAAAN,EACA,UAAW,KAAK,OAAO,EACvB,KAAM,CACL,GAAI,MACJ,MAAOQ,GAAUF,CAAO,EACxB,KAAMJ,CACP,CACD,CACD,CACD,CACD,EAEA,kBAAe,CAACF,EAAuBE,IAC/B,CACN,CACC,IAAAF,EACA,UAAW,KAAK,OAAO,EACvB,KAAM,CACL,GAAI,SACJ,KAAME,CACP,CACD,CACD,EAGD,oBAAiB,CAACF,EAAuBG,IAA4B,CACpE,GAAKC,EAASD,CAAK,EAWZ,CACN,IAAMG,EAAUC,GAAaP,EAAK,KAAK,WAAW,EAClD,MAAO,CACN,GAAGC,GAAiBE,EAAOG,EAAS,KAAK,MAAM,EAC/C,CACC,IAAAN,EACA,UAAW,KAAK,OAAO,EACvB,KAAM,CACL,GAAI,YACJ,MAAOQ,GAAUF,CAAO,CACzB,CACD,CACD,CACD,KAvBC,OAAO,CACN,CACC,IAAAN,EACA,UAAW,KAAK,OAAO,EACvB,KAAM,CACL,GAAI,YACJ,MAAAG,CACD,CACD,CACD,CAeF,EAEA,mBAAgB,CAACH,EAAuBG,IACnCC,EAASD,CAAK,EACV,CACN,CACC,IAAAH,EACA,UAAW,KAAK,OAAO,EACvB,KAAM,CACL,GAAI,WACJ,MAAOQ,GAAUL,CAAK,CACvB,CACD,CACD,EAEO,CACN,CACC,IAAAH,EACA,UAAW,KAAK,OAAO,EACvB,KAAM,CACL,GAAI,WACJ,MAAAG,CACD,CACD,CACD,EAIF,sBAAmB,CAClBH,EACAS,EACAN,IACiB,CACjB,GAAKC,EAASD,CAAK,EAYZ,CACN,IAAMG,EAAUC,GAAaP,EAAK,KAAK,WAAW,EAClD,MAAO,CACN,GAAGC,GAAiBE,EAAOG,EAAS,KAAK,MAAM,EAC/C,CACC,IAAAN,EACA,UAAW,KAAK,OAAO,EACvB,KAAM,CACL,GAAI,cACJ,MAAOQ,GAAUF,CAAO,EACxB,MAAAG,CACD,CACD,CACD,CACD,KAzBC,OAAO,CACN,CACC,IAAAT,EACA,UAAW,KAAK,OAAO,EACvB,KAAM,CACL,GAAI,cACJ,MAAAG,EACA,MAAAM,CACD,CACD,CACD,CAgBF,EAEA,sBAAmB,CAClBT,EACAG,EACAO,IAEO,CACN,CACC,IAAAV,EACA,UAAW,KAAK,OAAO,EACvB,KAAM,CACL,GAAI,cACJ,MAAAG,EACA,KAAAO,CACD,CACD,CACD,EAGD,sBAAmB,CAClBV,EACAS,EACAE,EAAgB,IAET,CACN,CACC,IAAAX,EACA,UAAW,KAAK,OAAO,EACvB,KAAM,CACL,GAAI,cACJ,MAAAS,EACA,MAAAE,CACD,CACD,CACD,EAGD,yBAAsB,CACrBX,EACAG,EACAM,IAEO,CACN,CACC,IAAAT,EACA,UAAW,KAAK,OAAO,EACvB,KAAM,CACL,GAAI,mBACJ,MAAAG,EACA,MAAAM,CACD,CACD,CACD,EAGD,2BAAwB,CACvBT,EACAY,EACAC,IAEO,CACN,CACC,IAAAb,EACA,UAAW,KAAK,OAAO,EACvB,KAAM,CACL,GAAI,qBACJ,KAAMY,EACN,GAAIC,CACL,CACD,CACD,EAGD,kBAAgBb,GACR,CACN,CACC,IAAAA,EACA,UAAW,KAAK,OAAO,EACvB,KAAM,CACL,GAAI,QACL,CACD,CACD,EAGD,qBAAmBc,GACXA,EAAK,IAAKd,IAAS,CACzB,IAAAA,EACA,UAAW,KAAK,OAAO,EACvB,KAAM,CACL,GAAI,QACL,CACD,EAAE,CArPA,CAuPJ,ECxQO,IAAMe,EAAN,KAEL,CAQD,YAAoBC,EAAoD,CAApD,wBAAAA,EAPpB,KAAU,YAGN,CAAC,EACL,KAAU,OAAiC,CAAC,EAC5C,KAAQ,UAAY,GAQpB,qBAAmBC,GACX,KAAK,OAAOA,CAAK,GAAK,EAG9B,0BAAuB,IACf,OAAO,OAAO,KAAK,MAAM,EAAE,OAAO,CAACC,EAAKC,IAAUD,EAAMC,EAAO,CAAC,EAGxE,eAAY,CACXF,EACAG,IACI,CACJ,IAAMC,EAAMC,GAAW,EACnBC,EAAc,KAAK,YAAYN,CAAK,EACxC,OAAKM,IACJA,EAAc,KAAK,YAAYN,CAAK,EAAI,CAAC,GAE1CM,EAAYF,CAAG,EAAID,EACnB,KAAK,OAAOH,CAAK,GAAK,KAAK,OAAOA,CAAK,GAAK,GAAK,EAC1C,IAAM,CAEP,KAAK,YAAYA,CAAK,IAE3B,OAAO,KAAK,YAAYA,CAAK,EAAEI,CAAG,EAClC,KAAK,OAAOJ,CAAK,IACb,KAAK,OAAOA,CAAK,IAAM,IAC1B,OAAO,KAAK,YAAYA,CAAK,EAC7B,OAAO,KAAK,OAAOA,CAAK,EACpB,KAAK,oBACR,KAAK,mBAAmBA,CAAK,GAGhC,CACD,EAEA,UAAO,CACNA,KACGO,IACC,CACA,KAAK,WACL,KAAK,YAAYP,CAAK,GACzB,OAAO,OAAO,KAAK,YAAYA,CAAK,CAAC,EAAE,QAASQ,GAAMA,EAAE,GAAGD,CAAI,CAAC,CAElE,EAEA,aAAU,IAAM,CACf,IAAME,EAAS,OAAO,KAAK,KAAK,WAAW,EAC3C,KAAK,YAAc,CAAC,EACpB,KAAK,OAAS,CAAC,EACfA,EAAO,QAAST,GAAU,CACrB,KAAK,oBACR,KAAK,mBAAmBA,CAAK,CAE/B,CAAC,CACF,EAEA,aAAU,IAAM,CACf,KAAK,UAAY,EAClB,CAhEyE,CAEzE,IAAI,UAAW,CACd,OAAO,KAAK,SACb,CA6DD,ECzEO,SAASU,GACfC,EACAC,EACAC,EACAC,EACc,CACd,GAAIF,IAAY,OAGf,MAAO,CACN,CACC,IAAAD,EACA,UAAWG,EAAO,EAClB,KAAM,CACL,GAAI,QACL,CACD,CACD,EAKD,IAAIC,EAAQC,GAAUJ,CAAO,EACvBK,EAA8B,CAAC,EACrC,QAAWC,KAAaL,EAAY,CACnC,IAAMM,EAAOC,GAAiBT,EAAKI,EAAOG,EAAWJ,CAAM,EAC3DG,EAAe,QAAQ,GAAGE,CAAI,EAC9BE,GAAWN,EAAOG,EAAU,IAAI,CACjC,CACA,OAAOD,CACR,CAEA,SAASG,GACRT,EACAC,EACAM,EACAJ,EACc,CACd,IAAMQ,EAAOJ,EAAU,KACvB,OAAQI,EAAK,GAAI,CAChB,IAAK,MACL,IAAK,SACJ,MAAO,CACN,CACC,IAAAX,EACA,UAAWG,EAAO,EAClB,KAAM,CACL,GAAI,MACJ,KAAMQ,EAAK,KACX,MAAOV,EAAQU,EAAK,IAAI,CACzB,CACD,CACD,EACD,IAAK,cACJ,MAAO,CACN,CACC,IAAAX,EACA,UAAWG,EAAO,EAClB,KAAM,CACL,GAAI,cACJ,MAAOQ,EAAK,MACZ,MAAO,CACR,CACD,CACD,EACD,IAAK,cACJ,MAAO,CACN,CACC,IAAAX,EACA,UAAWG,EAAO,EAClB,KAAM,CACL,GAAI,cACJ,MAAOQ,EAAK,MACZ,OAAQV,EAAQ,MAAMU,EAAK,MAAOA,EAAK,KAAK,CAC7C,CACD,CACD,EACD,IAAK,mBACJ,MAAO,CACN,CACC,IAAAX,EACA,UAAWG,EAAO,EAClB,KAAM,CACL,GAAI,mBACJ,MAAOQ,EAAK,MACZ,MAAOV,EAAQ,QAAQU,EAAK,KAAK,CAClC,CACD,CACD,EACD,IAAK,qBACJ,MAAO,CACN,CACC,IAAAX,EACA,UAAWG,EAAO,EAClB,KAAM,CACL,GAAI,qBACJ,KAAMQ,EAAK,GACX,GAAIA,EAAK,IACV,CACD,CACD,EACD,IAAK,SACJ,MAAO,CACN,CACC,IAAAX,EACA,UAAWG,EAAO,EAClB,KAAM,CACL,GAAI,aACJ,MAAOF,CACR,CACD,CACD,EACD,IAAK,YACJ,MAAO,CACN,CACC,IAAAD,EACA,UAAWG,EAAO,EAClB,KAAM,CACL,GAAI,cACJ,MAAOQ,EAAK,MAEZ,KAAM,MACP,CACD,CACD,EACD,IAAK,cACJ,GAAIA,EAAK,OAAS,OAAQ,CACzB,IAAMC,EAAQX,EAAQ,YAAYU,EAAK,KAAK,EAC5C,MAAO,CACN,CACC,IAAAX,EACA,UAAWG,EAAO,EAClB,KAAM,CACL,GAAI,cACJ,MAAAS,EACA,OAAQ,CAACD,EAAK,KAAK,CACpB,CACD,CACD,CACD,SAAWA,EAAK,OAAS,QAAS,CACjC,IAAMC,EAAQX,EAAQ,QAAQU,EAAK,KAAK,EACxC,MAAO,CACN,CACC,IAAAX,EACA,UAAWG,EAAO,EAClB,KAAM,CACL,GAAI,cACJ,MAAAS,EACA,OAAQ,CAACD,EAAK,KAAK,CACpB,CACD,CACD,CACD,KAAO,CAGN,IAAME,EAAiB,CAAC,EACpBD,EAAQX,EAAQ,QAAQU,EAAK,KAAK,EACtC,KAAOC,IAAU,IAChBC,EAAe,KAAKD,CAAK,EACzBA,EAAQX,EAAQ,QAAQU,EAAK,MAAOC,EAAQ,CAAC,EAE9C,OAAOC,EAAe,IAAKD,IAAW,CACrC,IAAAZ,EACA,UAAWG,EAAO,EAClB,KAAM,CACL,GAAI,cACJ,MAAAS,EACA,MAAOD,EAAK,KACb,CACD,EAAE,CACH,CACD,IAAK,WAKJ,MAAO,CACN,CACC,IAAAX,EACA,UAAWG,EAAO,EAClB,KAAM,CACL,GAAI,cACJ,MAAOQ,EAAK,MACZ,KAAM,MACP,CACD,CACD,EACD,IAAK,aACJ,MAAO,CACN,CACC,IAAAX,EACA,UAAWG,EAAO,EAClB,KAAM,CACL,GAAI,QACL,CACD,CACD,EACD,QACC,MAAM,IAAI,MAAM,+BAAgCQ,EAAa,EAAE,EAAE,CACnE,CACD,CC5MO,IAAMG,GAAN,KAAiC,CAGvC,YACSC,EACP,CADO,aAAAA,EAHT,KAAQ,QAA2C,IAAI,IAyCvD,WAASC,GAAgB,CACxB,IAAMC,EAAQ,KAAK,QAAQ,IAAID,CAAG,EAClC,GAAKC,EAEL,OAAOA,EAAM,MAAM,CACpB,EAEA,aAAWD,GAAgB,CAC1B,IAAMC,EAAQ,KAAK,QAAQ,IAAID,CAAG,EAC7BC,IAELA,EAAM,QAAQ,EACd,KAAK,QAAQ,OAAOD,CAAG,EACxB,EAEA,cAAW,IACH,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,EAAE,IAAKC,GAAUA,EAAM,MAAM,CAAC,CArD5D,CAEH,IAAI,CACH,IAAAD,EACA,SAAAE,EACA,MAAAC,EACA,IAAAC,EACA,QAAAC,CACD,EAMG,CACF,IAAIJ,EAAQ,KAAK,QAAQ,IAAID,CAAG,EAChC,OAAKC,IACJA,EAAQ,IAAIK,GAAM,CACjB,IAAKF,GAAO,KACZ,UAAW,KAAK,IAAI,EACpB,SAAAF,EACA,QAASG,GAAW,KACpB,QAAS,KAAK,QACd,IAAAL,CACD,CAAC,EACD,KAAK,QAAQ,IAAIA,EAAKC,CAAK,GAE5BA,EAAM,OAAO,CACZ,MAAAE,EACA,IAAAC,EACA,QAAAC,EACA,SAAAH,CACD,CAAC,EAEMD,CACR,CAoBD,EAEaK,GAAN,KAA+B,CAUrC,YAAY,CACX,IAAAF,EACA,UAAAG,EACA,QAAAF,EACA,SAAAH,EACA,QAAAH,EACA,IAAAC,CACD,EAOG,CAvBH,WAAkB,CAAC,EAgCnB,YAAS,CAAC,CACT,MAAAG,EACA,IAAAC,EACA,QAAAC,EACA,SAAAH,CACD,IAKM,CACL,KAAK,MAAM,KAAK,GAAGC,CAAK,EACpBC,IAAQ,SAAW,KAAK,IAAMA,GAC9BC,IAAY,SAAW,KAAK,QAAUA,GACtCH,IAAU,KAAK,SAAWA,GAI9B,IAAMM,EACL,KAAK,MAAM,SAAW,GAAK,KAAK,UAAY,MAAQ,CAAC,KAAK,aAIvD,KAAK,MAAQ,MAAQ,KAAK,MAAM,QAAU,KAAK,IAClD,KAAK,MAAM,EACDA,GAAiB,KAAK,UAAY,OAC5C,KAAK,aAAe,WAAW,KAAK,MAAO,KAAK,OAAO,EAEzD,EAEA,WAAQ,IAAM,CACb,KAAK,cAAgB,aAAa,KAAK,YAAY,EACnD,KAAK,aAAe,OACpB,IAAML,EAAQ,KAAK,MACnB,YAAK,MAAQ,CAAC,EACP,KAAK,QAAQA,EAAO,KAAK,IAAK,KAAK,QAAQ,CACnD,EAEA,aAAU,IAAM,CACf,KAAK,cAAgB,aAAa,KAAK,YAAY,EACnD,KAAK,aAAe,OACpB,KAAK,MAAQ,CAAC,CACf,EAlDC,KAAK,IAAMC,EACX,KAAK,UAAYG,EACjB,KAAK,QAAUF,EACf,KAAK,SAAWH,EAChB,KAAK,QAAUH,EACf,KAAK,IAAMC,CACZ,CA6CD,ECxIO,SAASS,EAAuBC,EAAwB,CAC9D,OAAO,IAAI,QAAW,CAACC,EAASC,IAAW,CAC1CF,EAAQ,UAAY,IAAM,CACzBC,EAAQD,EAAQ,MAAM,CACvB,EACAA,EAAQ,QAAU,IAAM,CACvBE,EAAOF,EAAQ,KAAK,CACrB,CACD,CAAC,CACF,CAyBO,SAASG,GACfC,EACAC,EAC2C,CAC3C,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CACvC,IAAMC,EAAKJ,EAAS,YAAY,CAACC,CAAS,EAAG,UAAU,EAEjDI,EADQD,EAAG,YAAYH,CAAS,EACd,WAAW,EAC/BK,EAAQ,EACRC,EAAO,EACXF,EAAU,UAAY,SAAUG,EAAG,CAClC,IAAMC,EAASJ,EAAU,OACrBI,IACHH,IACAC,EAAOA,EAAOG,GAAkBD,EAAO,KAAK,EAC5CA,EAAO,SAAS,EAElB,EACAJ,EAAU,QAAU,SAAUG,EAAG,CAChCL,EAAOK,CAAC,CACT,EACAJ,EAAG,WAAa,SAAUI,EAAG,CAC5BN,EAAQ,CACP,MAAOI,EACP,KAAMC,CACP,CAAC,CACF,EACAH,EAAG,QAAU,SAAUI,EAAG,CACzBL,EAAOK,CAAC,CACT,EACAJ,EAAG,QAAU,SAAUI,EAAG,CACzBL,EAAOK,CAAC,CACT,CACD,CAAC,CACF,CAEO,SAASG,GAAuBC,EAAiBC,EAAkB,CACzE,IAAMC,EAAcF,EAAG,YAAYC,EAAQ,UAAU,EAC/CE,EAAWF,EAAO,IAAKG,GAAU,CACtC,IAAMC,EAAcH,EAAY,YAAYE,CAAK,EACjD,OAAOE,EAAoBD,EAAY,OAAO,CAAC,CAChD,CAAC,EACD,OAAO,QAAQ,IAAIF,CAAQ,CAC5B,CAEA,eAAsBI,GAAcP,EAAiB,CACpDA,EAAG,MAAM,EAET,MAAM,IAAI,QAAc,CAACV,EAASC,IAAW,CAC5CD,EAAQ,CACT,CAAC,CACF,CAEA,eAAsBkB,GACrBC,EACAC,EAAwB,OAAO,UAC9B,CACD,IAAMC,EAAOD,EAAU,eAAe,CAACD,EAAW,MAAM,EAAE,KAAK,GAAG,CAAC,EAC7DG,EAAOF,EAAU,eAAe,CAACD,EAAW,aAAa,EAAE,KAAK,GAAG,CAAC,EAC1E,MAAM,QAAQ,IAAI,CACjB,IAAI,QAAQ,CAACnB,EAASC,IAAW,CAChCoB,EAAK,UAAYrB,EACjBqB,EAAK,QAAUpB,CAChB,CAAC,EACD,IAAI,QAAQ,CAACD,EAASC,IAAW,CAChCqB,EAAK,UAAYtB,EACjBsB,EAAK,QAAUrB,CAChB,CAAC,CACF,CAAC,EACD,OAAO,SAAS,OAAO,CACxB,CAEO,SAASsB,GAAeC,EAAcJ,EAAY,OAAO,UAAW,CAC1E,OAAOJ,EAAoBI,EAAU,eAAeI,CAAI,CAAC,CAC1D,CAEA,eAAsBC,GACrBL,EAAwB,OAAO,UAC9B,CACD,OAAOA,EAAU,UAAU,CAC5B,CClHO,IAAMM,GAAN,KAAiB,CACvB,YAA+BC,EAAiB,CAAjB,QAAAA,EAE/B,uBAAoB,CACnBC,EACAC,IAEO,KAAK,GAAG,YAAYD,EAAYC,CAAI,EAG5C,SAAM,MACLC,EACAC,EACAF,EAAiC,WACjCG,IACgB,CAEhB,IAAMC,GADKD,GAAe,KAAK,GAAG,YAAYF,EAAWD,CAAI,GAC5C,YAAYC,CAAS,EAChCI,EAAUH,EAAWE,CAAK,EAChC,OAAOE,EAAuBD,CAAO,CACtC,EAEA,YAAS,MACRJ,EACAM,EACAP,EAAiC,WACjCG,IACkB,CAElB,IAAMC,GADKD,GAAe,KAAK,GAAG,YAAYF,EAAWD,CAAI,GAC5C,YAAYC,CAAS,EAChCO,EAAWD,EAAYH,CAAK,EAClC,OAAO,QAAQ,IAAII,EAAS,IAAIF,CAAmB,CAAC,CACrD,EAEA,aAAU,MACTL,EACAC,EACAO,EACAT,EAAiC,WACjCG,IACmB,CAEnB,IAAMC,GADKD,GAAe,KAAK,GAAG,YAAYF,EAAWD,CAAI,GAC5C,YAAYC,CAAS,EAChCI,EAAUH,EAAWE,CAAK,EAChC,OAAI,MAAM,QAAQC,CAAO,EACjB,QAAQ,IACdA,EAAQ,IAAKK,GACL,IAAI,QAAc,CAACC,EAASC,IAAW,CAC7CF,EAAI,UAAY,IAAM,CACrB,IAAMG,EAASH,EAAI,OACfG,GACHJ,EAASI,EAAO,MAAOT,CAAK,EAC5BS,EAAO,SAAS,GAEhBF,EAAQ,CAEV,EACAD,EAAI,QAAUE,CACf,CAAC,CACD,CACF,EAAE,KAAK,IAAG,EAAY,EAEhB,IAAI,QAAc,CAACD,EAASC,IAAW,CAC7CP,EAAQ,UAAY,IAAM,CACzB,IAAMQ,EAASR,EAAQ,OACnBQ,GACHJ,EAASI,EAAO,MAAOT,CAAK,EAC5BS,EAAO,SAAS,GAEhBF,EAAQ,CAEV,EACAN,EAAQ,QAAUO,CACnB,CAAC,CACF,EAEA,WAASX,GACD,KAAK,IAAIA,EAAYG,GAAUA,EAAM,MAAM,EAAG,WAAW,CA5EhB,CA8ElD,ECxEO,IAAMU,GAAN,cAA2BC,EAAW,CAAtC,kCACN,gBAAa,SAA8B,CAC1C,IAAMC,EAAS,MAAM,KAAK,IAAa,OAASC,GAAUA,EAAM,IAAI,KAAK,CAAC,EAC1E,OAAID,GAGI,CACN,mBAAoB,KACpB,KAAM,KACP,CAEF,EAEA,kBAAe,MAAOE,GAAgB,CACrC,MAAM,KAAK,IACV,OACCD,GAAUA,EAAM,IAAI,CAAE,KAAM,MAAO,mBAAoBC,CAAI,CAAC,EAC7D,WACD,CACD,EACD,ECpBO,IAAMC,GAAN,cAA6BC,EAAW,CAC9C,YAAYC,EAAiB,CAC5B,MAAMA,CAAE,EAGT,uBAAoB,MACnBC,EACA,CACC,KAAAC,EAAO,WACP,YAAAC,CACD,EAAuE,CAAC,IACpE,CACJ,IAAMC,EAAgC,CAAC,EACvC,aAAM,KAAK,0BACVH,EACCI,GAAa,CACbD,EAAU,KAAKC,CAAQ,CACxB,EACA,CAAE,KAAAH,EAAM,YAAAC,CAAY,CACrB,EACOC,CACR,EACA,+BAA4B,MAC3BH,EACAK,EACA,CACC,KAAAJ,EAAO,WACP,YAAAC,CACD,EAAuE,CAAC,IAEjE,KAAK,QACX,YACCI,GAAU,CACV,IAAMC,EAAOC,EAAWR,CAAG,EAErBS,EAAQC,GAAeV,CAAG,EAC1B,CAACW,EAAOC,CAAG,EAAIC,GAAiBb,EAAKS,CAAK,EAChD,MAAO,CAENH,EAAM,WAAW,YAAY,KAAKC,CAAI,CAAC,EAEvCD,EAAM,WAAW,YAAY,MAAMK,EAAOC,EAAK,GAAO,EAAK,CAAC,CAC7D,CACD,EACAP,EACAJ,EACAC,CACD,EAGD,gCAA6B,MAC5BY,EACA,CAAE,KAAAb,EAAO,UAAW,EAAyC,CAAC,KAE/C,MAAM,KAAK,OACzB,YACCK,GACOQ,EAAQ,QAASd,GAAQ,CAC/B,IAAMO,EAAOC,EAAWR,CAAG,EAErBS,EAAQC,GAAeV,CAAG,EAC1B,CAACW,EAAOC,CAAG,EAAIC,GAAiBb,EAAKS,CAAK,EAChD,MAAO,CACNH,EAAM,IAAIC,CAAI,EACdD,EAAM,OAAO,YAAY,MAAMK,EAAOC,EAAK,GAAO,EAAK,CAAC,CACzD,CACD,CAAC,EAEFX,CACD,GACc,KAAK,EAGpB,iBAAc,MACbc,EACA,CAAE,KAAAd,EAAO,UAAW,EAAyC,CAAC,IAEvD,KAAK,IACX,YACCK,GAAU,CACV,IAAMU,EAAQD,EACX,YAAY,WAAWA,EAAW,EAAI,EACtC,OAEH,OADcT,EAAM,MAAM,WAAW,EACxB,OAAOU,CAAK,CAC1B,EACAf,CACD,EAGD,SAAM,MACLD,EACA,CACC,YAAAE,EACA,KAAAD,EAAO,UACR,EAAuE,CAAC,IAEjE,KAAK,IACX,YACCK,GAAUA,EAAM,IAAIN,CAAG,EACxBC,EACAC,CACD,EAGD,SAAM,MACLE,EACA,CAAE,YAAAF,CAAY,EAAsC,CAAC,IACjD,CACJ,MAAM,KAAK,IACV,YACCI,GAAUA,EAAM,IAAIF,CAAQ,EAC7B,YACAF,CACD,CACD,EAEA,YAAS,MACRC,EACA,CAAE,YAAAD,CAAY,EAAsC,CAAC,IACjD,CACJ,MAAM,KAAK,OACV,YACCI,GACOH,EAAU,IAAKC,GAAaE,EAAM,IAAIF,CAAQ,CAAC,EAEvD,YACAF,CACD,CACD,EAEA,WAAQ,IACA,KAAK,MAAM,WAAW,EAG9B,YAAS,MACRF,EACA,CAAE,YAAAE,CAAY,IACV,CACJ,MAAM,KAAK,IACV,YACCI,GAAUA,EAAM,OAAON,CAAG,EAC3B,YACAE,CACD,CACD,CA9IA,CA+ID,EC3JA,IAAAe,GAAiB,WAUV,IAAMC,GAAN,cAAgCC,EAAW,CAA3C,kCAGN,SAAM,MAAO,CAAE,YAAAC,CAAY,EAAsC,CAAC,IAAM,CACvE,GAAI,KAAK,OACR,OAAO,KAAK,OAGb,IAAMC,EAAS,MAAM,KAAK,IACzB,OACCC,GAAUA,EAAM,IAAI,kBAAkB,EACvC,OACAF,CACD,EAEA,GAAI,CAACC,EAAQ,CAGZ,IAAME,EAAgC,CACrC,KAAM,mBACN,MAHiB,GAAAC,SAAK,EAItB,iBAAkB,KAClB,sBAAuB,IACxB,EACA,aAAM,KAAK,IAAI,OAASF,GAAUA,EAAM,IAAIC,CAAW,EAAG,WAAW,EACrE,KAAK,OAASA,EACPA,CACR,CAEA,YAAK,OAASF,EACPA,CACR,EAEA,YAAS,MACRI,EACA,CAAE,YAAAL,CAAY,EAAsC,CAAC,IACjD,CACJ,IAAMM,EAAmB,MAAM,KAAK,IAAI,CAAE,YAAAN,CAAY,CAAC,EACvD,OAAO,OAAOM,EAAkBD,CAAI,EACpC,MAAM,KAAK,IAAI,OAASH,GAAUA,EAAM,IAAII,CAAgB,EAAG,WAAW,EAC1E,KAAK,OAASA,CACf,EAEA,WAAQ,SAAY,CACnB,IAAMC,EAAY,MAAM,KAAK,IAAI,EACjCA,EAAU,iBAAmB,KAC7BA,EAAU,sBAAwB,KAClC,MAAM,KAAK,IAAI,OAASL,GAAUA,EAAM,IAAIK,CAAS,EAAG,WAAW,CACpE,EACD,EC5CO,IAAMC,GAAN,KAAqB,CAC3B,YAAoBC,EAAgB,CAAhB,UAAAA,EAEpB,qBAAkB,MACjBC,GAG+B,CAC/B,IAAMC,EAAY,MAAM,KAAK,KAAK,aAAa,IAAI,EACnD,MAAO,CACN,KAAM,KACN,UAAW,KAAK,KAAK,IACrB,UAAWA,EAAU,GACrB,WAAYD,EAAK,WAAW,IAAKE,IAAQ,CACxC,KAAMA,EAAG,KACT,IAAKA,EAAG,IACR,UAAWA,EAAG,SACf,EAAE,CACH,CACD,EAEA,8BAA2B,MAAO,CACjC,cAAAC,EACA,GAAGH,CACJ,IAEiC,CAChC,IAAMC,EAAY,MAAM,KAAK,KAAK,aAAa,IAAI,EACnD,MAAO,CACN,KAAM,KACN,WAAYD,EAAK,WAAW,IAAKE,IAAQ,CACxC,GAAGA,EACH,UAAW,KAAK,KAAK,KAAK,KAAKC,CAAa,CAC7C,EAAE,EACF,UAAW,KAAK,KAAK,KAAK,KAAKA,CAAa,EAC5C,UAAWF,EAAU,EACtB,CACD,EAKA,qBAAkB,MAAOG,GAAgD,CACxE,IAAMC,EAAmB,MAAM,KAAK,KAAK,aAAa,IAAI,EAEpDC,EACLF,IAAU,KAAO,KAAOC,EAAiB,sBAIpCE,EAA0B,CAAC,EAC3BC,EAAe,IAAI,IAMrBF,EACH,MAAM,KAAK,KAAK,WAAW,8BACzBG,GAAU,CACVF,EAAW,KAAK,CACf,KAAME,EAAM,KACZ,IAAKA,EAAM,IACX,UAAWA,EAAM,SAClB,CAAC,EACDD,EAAa,IAAIE,EAAWD,EAAM,GAAG,CAAC,CACvC,EACA,CACC,MAAOH,EAEP,KAAM,WACP,CACD,EAIA,MAAM,KAAK,KAAK,WAAW,yBACzBG,GAAU,CACVF,EAAW,KAAK,CACf,KAAME,EAAM,KACZ,IAAKA,EAAM,IACX,UAAWA,EAAM,SAClB,CAAC,EACDD,EAAa,IAAIE,EAAWD,EAAM,GAAG,CAAC,CACvC,EACA,CACC,KAAM,WACP,CACD,EAGD,IAAIE,EAAgC,CAAC,EACrC,OAAKL,IACJK,EAAY,MAAM,KAAK,KAAK,UAAU,YAAY,EAAE,GAG9C,CACN,KAAM,OACN,cAAe,KAAK,KAAK,OAAO,eAChC,UAAW,KAAK,KAAK,IACrB,UAAWN,EAAiB,GAC5B,UAAW,CAACA,EAAiB,sBAC7B,WAAAE,EACA,UAAAI,EACA,MAAOL,CACR,CACD,EAEA,0BAAuB,MACtBM,GACoC,CACpC,IAAMP,EAAmB,MAAM,KAAK,KAAK,aAAa,IAAI,EAC1D,MAAO,CACN,KAAM,kBACN,SAAAO,EACA,UAAWP,EAAiB,EAC7B,CACD,EAEA,qBAAkB,SAAuC,CACxD,IAAMA,EAAmB,MAAM,KAAK,KAAK,aAAa,IAAI,EAC1D,MAAO,CACN,KAAM,YACN,UAAW,KAAK,KAAK,IACrB,UAAWA,EAAiB,EAC7B,CACD,EAEA,eAAY,MAAOQ,GAAuC,CACzD,IAAMR,EAAmB,MAAM,KAAK,KAAK,aAAa,IAAI,EAC1D,MAAO,CACN,KAAM,MACN,UAAW,KAAK,KAAK,IACrB,UAAWA,EAAiB,GAC5B,MAAAQ,CACD,CACD,CAvIqC,CAwItC,ECnIO,IAAMC,GAAN,cAA8BC,EAAW,CAAzC,kCAKN,yCAAsC,MACrCC,EACAC,EACA,CACC,GAAAC,EACA,KAAAC,EACA,MAAAC,EACA,KAAAC,EAAO,WACP,YAAaC,CACd,EAMI,CAAC,IACc,CAEnB,IAAMC,GADcD,GAAc,KAAK,GAAG,YAAY,aAAcD,CAAI,GAC9C,YAAY,YAAY,EAC5CG,EAAQD,EAAM,MAAM,KAAK,EAEzBE,EAAiBN,GAAQC,EACzBM,EAAQD,EACXE,GAAyBX,EAAKS,CAAc,EAC5CG,GAA2BZ,CAAG,EAC3Ba,EAAMX,EACTS,GAAyBX,EAAKE,CAAE,EAChCY,GAA2Bd,CAAG,EAE3Be,EAAQ,YAAY,MAAML,EAAOG,EAAK,CAAC,CAACT,EAAO,EAAK,EAEpDY,EAAUR,EAAM,WAAWO,EAAO,MAAM,EAC9C,OAAO,IAAI,QAAc,CAACE,EAASC,IAAW,CAC7C,IAAIC,EACJH,EAAQ,UAAaI,GAAU,CAC9B,IAAMC,EAASL,EAAQ,OACvB,GAAIK,EAAQ,CACX,IAAMC,EAAQD,EAAO,MACrBE,EAAOD,EAAM,IAAI,WAAWtB,CAAG,CAAC,EAChCuB,EACCJ,IAAsB,QACrBA,GAAqBG,EAAM,UAC5B,YAAYH,CAAiB,OAAOG,EAAM,SAAS,EACpD,EAEArB,EAASqB,EAAOf,CAAK,EACrBY,EAAoBG,EAAM,UAC1BD,EAAO,SAAS,CACjB,MACCJ,EAAQ,CAEV,EACAD,EAAQ,QAAWI,GAAU,CAC5BF,EAAOE,CAAK,CACb,CACD,CAAC,CACF,EAEA,uCAAoC,MACnCpB,EACAC,EACA,CACC,MAAAG,EACA,GAAAF,EACA,KAAAG,EACA,YAAaC,CACd,IAMmB,CAEnB,IAAMC,GADcD,GAAc,KAAK,GAAG,YAAY,aAAcD,CAAI,GAC9C,YAAY,YAAY,EAE5CK,EAAQN,EACXO,GAAyBX,EAAKI,CAAK,EACnCQ,GAA2BZ,CAAG,EAC3Ba,EAAMX,EACTS,GAAyBX,EAAKE,CAAE,EAChCY,GAA2Bd,CAAG,EAE3Be,EAAQ,YAAY,MAAML,EAAOG,EAAK,CAAC,CAACT,EAAO,EAAK,EAEpDY,EAAUT,EAAM,WAAWQ,EAAO,MAAM,EAC9C,OAAO,IAAI,QAAc,CAACE,EAASC,IAAW,CAC7C,IAAIC,EACJH,EAAQ,UAAaI,GAAU,CAC9B,IAAMC,EAASL,EAAQ,OACvB,GAAIK,EAAQ,CACX,IAAMC,EAAQD,EAAO,MACrBE,EAAOD,EAAM,IAAI,WAAWtB,CAAG,CAAC,EAChCuB,EACCJ,IAAsB,QACrBA,GAAqBG,EAAM,UAC5B,YAAYH,CAAiB,OAAOG,EAAM,SAAS,EACpD,EAEArB,EAASqB,EAAOf,CAAK,EACrBY,EAAoBG,EAAM,UAC1BD,EAAO,SAAS,CACjB,MACCJ,EAAQ,CAEV,EACAD,EAAQ,QAAWI,GAAU,CAC5BF,EAAOE,CAAK,CACb,CACD,CAAC,CACF,EAEA,mCAAgC,MAC/BnB,EACA,CACC,OAAAuB,EACA,MAAApB,EACA,KAAAC,EAAO,WACP,YAAaC,CACd,IAMmB,CAEnB,IAAMC,GADcD,GAAc,KAAK,GAAG,YAAY,aAAcD,CAAI,GAC9C,YAAY,YAAY,EAC5CG,EAAQD,EAAM,MAAM,KAAK,EAEzBG,EAAQN,EACXO,GAAyB,GAAMP,CAAK,EACpCQ,GAA2B,EAAI,EAC5BC,EAAMW,EACTb,GAAyB,GAAMa,CAAM,EACrCV,GAA2B,EAAI,EAE5BC,EAAQ,YAAY,MAAML,EAAOG,EAAK,CAAC,CAACT,EAAO,EAAI,EAEnDY,EAAUR,EAAM,WAAWO,EAAO,MAAM,EAC9C,OAAO,IAAI,QAAc,CAACE,EAASC,IAAW,CAC7C,IAAIC,EACJH,EAAQ,UAAaI,GAAU,CAC9B,IAAMC,EAASL,EAAQ,OACvB,GAAIK,EAAQ,CACX,IAAMC,EAAQD,EAAO,MACrBE,EACCJ,IAAsB,QACrBA,GAAqBG,EAAM,UAC5B,YAAYH,CAAiB,OAAOG,EAAM,SAAS,EACpD,EAEArB,EAASqB,EAAOf,CAAK,EACrBY,EAAoBG,EAAM,UAC1BD,EAAO,SAAS,CACjB,MACCJ,EAAQ,CAEV,EACAD,EAAQ,QAAWI,GAAU,CAC5BF,EAAOE,CAAK,CACb,CACD,CAAC,CACF,EAEA,8BAA2B,MAC1BnB,EACA,CACC,OAAAuB,EACA,YAAAC,EACA,KAAApB,EACA,KAAAF,CACD,IAQmB,CACnB,MAAM,KAAK,QACV,aACCI,GAAU,CACV,IAAMG,EAAQP,EAAOS,GAA2BT,CAAI,EAAI,OAClDU,EAAMW,EAASV,GAA2BU,CAAM,EAAI,OAEpDT,EACLL,GAASG,EACN,YAAY,MAAMH,EAAOG,EAAK,GAAO,EAAI,EACzCH,EACA,YAAY,WAAWA,EAAO,EAAK,EACnCG,EACA,YAAY,WAAWA,EAAK,EAAI,EAChC,OAEJ,OADcN,EAAM,MAAM,WAAW,EACxB,WAAWQ,EAAO,MAAM,CACtC,EACAd,EACAI,EACAoB,CACD,CACD,EAMA,mBAAgB,MACfC,EACA,CAAE,YAAAD,CAAY,EAAsC,CAAC,IAE9C,KAAK,OAAOC,EAAQ,IAAI,KAAK,kBAAkB,EAAG,CAAE,YAAAD,CAAY,CAAC,EAGzE,KAAQ,mBACPE,IAEO,CACN,GAAGA,EACH,cAAehB,GACdgB,EAAM,IACNA,EAAM,SACP,EACA,IAAKhB,GAAyBgB,EAAM,QAASA,EAAM,SAAS,EAC5D,IAAKhB,GACJiB,EAAWD,EAAM,GAAG,EACpBA,EAAM,SACP,CACD,GAGD,KAAQ,OAAS,MAChBE,EACA,CAAE,YAAAJ,CAAY,IACmB,CACjC,IAAMK,EAAW,IAAI,IACrB,aAAM,KAAK,OACV,aACCvB,GACAsB,EAAW,IAAKE,IACfD,EAAS,IAAIF,EAAWG,EAAG,GAAG,CAAC,EACxBxB,EAAM,IAAIwB,CAAE,EACnB,EACF,YACAN,CACD,EACO,MAAM,KAAKK,CAAQ,CAC3B,EAEA,WAAQ,IACA,KAAK,MAAM,YAAY,EAEhC,EC/QO,IAAME,GAAN,KAAkB,CAGxB,YACkBC,EACDC,EACf,CAFgB,QAAAD,EACD,oBAAAC,EAJjB,KAAQ,OAAoC,KAO5C,SAAM,SAAgD,CACrD,GAAI,KAAK,OACR,OAAO,KAAK,OAMb,IAAMC,EAHK,KAAK,GACO,YAAY,OAAQ,UAAU,EAC3B,YAAY,MAAM,EACtB,IAAI,QAAQ,EAC5BC,EAAS,MAAMC,EAAoBF,CAAO,EAGhD,OAAKC,GAGL,KAAK,OAAS,KAAK,MAAMA,EAAM,MAAM,EAC9B,KAAK,QAHJ,IAIT,EAEA,SAAM,MAAOE,GAA8C,CAI1D,IAAMH,EAHK,KAAK,GACO,YAAY,OAAQ,WAAW,EAC5B,YAAY,MAAM,EACtB,IAAI,CACzB,KAAM,SACN,OAAQ,KAAK,UAAUG,CAAM,CAC9B,CAAiB,EACjB,KAAK,OAASA,EACd,MAAMD,EAAoBF,CAAO,CAClC,CA/BG,CAgCJ,ECRO,IAAMI,GAAN,cAAuBC,CAI3B,CAmBF,YAAY,CACX,gBAAAC,EACA,QAAAC,CACD,EAGG,CACF,MAAM,EAlBP,KAAS,KAAO,IAAIC,GAEpB,KAAiB,gBAA2B,GAK5C,KAAQ,SAAW,GA+BnB,gBAAcD,GAAqB,CAClC,KAAK,QAAUA,CAChB,EAMA,WAAQ,IAAM,CACb,KAAK,SAAW,EACjB,EAMA,uBAAqBE,GACb,KAAK,GAAG,YAAYA,EAAQ,WAAW,EAQ/C,+BAA4B,MAAOC,GAA0B,CAC5D,IAAMC,EAAO,IAAI,IACXC,EAAcC,EAAWH,CAAG,EAClCI,EAAOF,IAAgBF,EAAK,2BAA2B,EACvDC,EAAK,IAAIC,CAAW,EAEpB,IAAMG,EAAc,KAAK,GAAG,YAC3B,CAAC,YAAa,YAAY,EAC1B,WACD,EACA,aAAM,QAAQ,IAAI,CACjB,KAAK,UAAU,0BACdH,EACCI,GAAa,CACbL,EAAK,IAAIK,EAAS,GAAG,CACtB,EACA,CAAE,YAAAD,CAAY,CACf,EACA,KAAK,WAAW,oCACfH,EACCK,GAAU,CACVN,EAAK,IAAIM,EAAM,GAAG,CACnB,EACA,CAAE,YAAAF,CAAY,CACf,CACD,CAAC,EAEM,MAAM,KAAKJ,CAAI,CACvB,EAEA,yBAAsB,MACrBD,EACAQ,EAA2B,CAAC,IACxB,CACJ,IAAMN,EAAcC,EAAWH,CAAG,EAClCI,EAAOF,IAAgBF,EAAK,2BAA2B,EACvD,IAAMK,EAAc,KAAK,GAAG,YAC3B,CAAC,YAAa,YAAY,EAC1B,WACD,EACMI,EAAY,MAAM,KAAK,UAAU,kBAAkBP,EAAa,CACrE,YAAAG,CACD,CAAC,EACKK,EAAY,IAAI,IACtB,QAAWJ,KAAYG,EAClBH,EAAS,UACZK,EAAUL,EAAS,SAAUA,EAAS,GAAG,EAE1CI,EAAU,IAAIJ,EAAS,IAAKA,EAAS,QAAQ,EAE9C,MAAM,KAAK,WAAW,oCACrBJ,EACCU,GAAO,CACP,IAAMC,EAAMH,EAAU,IAAIE,EAAG,GAAG,GAAK,OAC/BE,EAASC,GAAWF,EAAKD,EAAG,IAAI,EAClCE,GACHH,EAAUG,EAAQF,EAAG,GAAG,EAEzBF,EAAU,IAAIE,EAAG,IAAKE,CAAM,CAC7B,EACA,CACC,YAAAT,EAEA,GAAIG,EAAQ,IAAM,KAAK,GACxB,CACD,EACA,IAAMQ,EAAON,EAAU,IAAIR,CAAW,EACtC,OAAIc,GACHC,GAA0BD,EAAMN,CAAS,EAEnCM,CACR,EAWA,SAAM,MAAOE,GAAsB,CAClC,IAAMC,EAAmB,MAAM,KAAK,aAAa,IAAI,EAEjDD,EAAY,KAAK,MAErB,KAAK,KAAK,UAAW,CACpB,KAAM,MACN,UAAWC,EAAiB,GAC5B,UAAAD,CACD,CAAC,EAEA,CAAC,KAAK,WACL,CAACC,EAAiB,kBAClBD,EAAYC,EAAiB,mBAE9B,KAAK,aAAa,OAAO,CAAE,iBAAkBD,CAAU,CAAC,EAE1D,EAMA,0BAAuB,MAAOE,GAA4B,CACzD,GAAIA,EAAW,SAAW,EAAG,OAE7B,KAAK,IAAI,aAAaA,EAAW,MAAM,mBAAmB,EAG1D,QAAWC,KAAaD,EACtBC,EAA8B,QAAU,GAE1C,MAAM,KAAK,WAAW,cAAcD,CAA+B,EAEnE,IAAME,EAAU,MAAM,KAAK,eAAe,gBAAgB,CAAE,WAAAF,CAAW,CAAC,EACxE,KAAK,KAAK,UAAWE,CAAO,EAG5B,KAAK,oBAAoB,CAC1B,EAMA,4BAAyB,MAAOF,GAA4B,CAC3D,GAAIA,EAAW,SAAW,EAAG,MAAO,CAAC,EAErC,KAAK,IAAI,aAAaA,EAAW,MAAM,oBAAoB,EAE3D,IAAMG,EAAuB,MAAM,KAAK,WAAW,cAClDH,EAAW,IAAKb,IAAW,CAC1B,GAAGA,EACH,QAAS,EACV,EAAE,CACH,EAEA,YAAK,IAAIa,EAAWA,EAAW,OAAS,CAAC,EAAE,SAAS,EAE7CG,CACR,EAEA,2BAAwB,MAAOd,GAAkC,CAChE,GAAIA,EAAU,SAAW,EAAG,MAAO,CAAC,EACpC,KAAK,IAAI,aAAaA,EAAU,MAAM,mBAAmB,EAEzD,MAAM,KAAK,UAAU,OAAOA,CAAS,EAIrC,IAAMe,EAAiB,IAAI,IAC3B,OAAAf,EAAU,QAASH,GAAa,CAC/BkB,EAAe,IAAIrB,EAAWG,EAAS,GAAG,CAAC,CAC5C,CAAC,EAEM,MAAM,KAAKkB,CAAc,CACjC,EAEA,sBAAmB,MAAON,GAAsB,CAC/C,GAAI,MAAK,SAET,OAAO,KAAK,aAAa,OAAO,CAC/B,sBAAuBA,CACxB,CAAC,CACF,EAEA,yBAAsB,UACI,MAAM,KAAK,aAAa,IAAI,GAC7B,sBAGzB,KAAQ,oBAAsB,SAAY,CACrC,KAAK,kBAEgB,MAAM,KAAK,aAAa,IAAI,GAChC,uBAErB,MAAM,KAAK,UAAU,KAAK,GAAG,CAC9B,EAQA,KAAQ,UAAY,MAAOO,GAA+B,CACzD,GAAI,KAAK,SAAU,OAGnB,IAAIC,EACEC,EAAW,IAAI,IACftB,EAAc,KAAK,GAAG,YAC3B,CAAC,YAAa,YAAY,EAC1B,WACD,EACIuB,EAAiB,EAarB,GAZA,MAAM,KAAK,WAAW,yBACpBrB,GAAU,CACVoB,EAAS,IAAIpB,EAAM,GAAG,EACtBmB,EAAgBnB,EAAM,UACtBqB,GACD,EACA,CACC,OAAQH,EACR,YAAApB,CACD,CACD,EAEI,CAACsB,EAAS,KAAM,CACnB,KAAK,IAAI,wCAAyCF,CAAkB,EACpE,MACD,CAEA,GAAI,KAAK,SACR,OAID,IAAII,EAAe,CAAC,EACpB,QAAW7B,KAAO2B,EACjBE,EAAa,KACZ,MAAM,KAAK,OACV7B,EACA0B,GAAiBD,EACjBpB,CACD,CACD,EAED,KAAK,KAAK,SAAUwB,CAAY,CACjC,EAEA,YAAS,MACR7B,EACA8B,EACAC,IACI,CAEJ,IAAMC,GAAa,MAAM,KAAK,aAAa,IAAI,GAAG,GAElD,KAAK,IAAI,IAAKA,EAAW,IAAK,WAAYhC,EAAK,QAAS8B,CAAI,EAC5D,IAAMzB,EACL0B,GACA,KAAK,GAAG,YAAY,CAAC,aAAc,WAAW,EAAG,WAAW,EACvDzB,EAAW,MAAM,KAAK,UAAU,IAAIN,EAAK,CAAE,YAAAK,CAAY,CAAC,EAC1D4B,EAAe3B,GAAU,UAAY,OACrC4B,EAAoB,EAClBC,EAAqB,CAAC,EAC5B,MAAM,KAAK,WAAW,kCACrBnC,EACA,CAACO,EAAO6B,IAAU,EAGb,CAAC9B,GAAYC,EAAM,UAAYD,EAAS,aAC3C2B,EAAUlB,GAAWkB,EAAS1B,EAAM,KAAM4B,CAAW,GAGtDD,IACAE,EAAM,OAAO7B,EAAM,aAAa,CACjC,EACA,CACC,GAAIuB,EACJ,YAAAzB,CACD,CACD,EACI4B,GACHtB,EAAUsB,EAASjC,CAAG,EAEvB,IAAMqC,EAAc,CACnB,IAAArC,EACA,SAAUiC,EACV,UAAWH,CACZ,EAoBA,GAnBIO,EAAY,SACf,MAAM,KAAK,UAAU,IAAIA,EAAa,CAAE,YAAAhC,CAAY,CAAC,EAErD,MAAM,KAAK,UAAU,OAAOL,EAAK,CAAE,YAAAK,CAAY,CAAC,EAGjD,KAAK,IACJ,uBACAL,EACA,QACA8B,EACA,IACAG,EACA,cACAC,EACA,YACD,EAGIC,EAAY,OAAQ,CACvB,IAAMG,EAAWH,EAAY,OAAOI,EAAS,EACzCD,EAAS,QACZ,KAAK,KAAK,eAAgBA,CAAQ,CAEpC,CAEA,OAAOD,CACR,EAEA,WAAQ,SAAY,CACnB,MAAM,KAAK,WAAW,MAAM,EAC5B,MAAM,KAAK,UAAU,MAAM,EAC3B,MAAM,KAAK,aAAa,MAAM,CAC/B,EAEA,kBAAe,MAAOG,EAAuBC,IAA8B,CAC1E,IAAMC,EAAe,MAAM,KAAK,OAAO,IAAI,EAC3C,GAAIA,GAOFD,IAAqBC,EAAa,SAClCA,EAAa,UAAYF,EAAO,SAChC,KAAK,UAAUE,CAAY,IAAM,KAAK,UAAUF,CAAM,EAEtD,cAAQ,MACP,+BAA+BA,EAAO,OAAO;AAAA,OAC3C,KAAK,UAAUE,CAAY,CAAC;AAAA,OAC5B,KAAK,UAAUF,CAAM,CAAC,EACzB,EACM,IAAI,MACT,oJACD,EAGF,MAAM,KAAK,OAAO,IAAIA,CAAM,CAC7B,EAEA,kBAAe,MAAOtB,GAAsB,CACvC,KAAK,WACT,MAAM,KAAK,QAAQ,aAAaA,CAAS,EACpC,KAAK,iBACT,MAAM,KAAK,UAAUA,CAAS,EAEhC,EAEA,YAAS,SAAiC,CACzC,IAAMyB,EAAK,KAAK,GACV,CAAClC,EAAWW,CAAU,EAAI,MAAMwB,GAAuBD,EAAI,CAChE,YACA,YACD,CAAC,EACKE,EAAe,MAAM,KAAK,aAAa,IAAI,EAC3CL,EAAS,MAAM,KAAK,OAAO,IAAI,EACrC,GAAI,CAACA,EACJ,MAAM,IAAI,MAAM,+CAA+C,EAEhE,MAAO,CACN,WAAApB,EACA,UAAAX,EACA,aAAAoC,EACA,OAAAL,CACD,CACD,EAOA,eAAY,MAAOM,GAAqB,CAEvC,IAAMzC,EADK,KAAK,GACO,YACtB,CAAC,YAAa,aAAc,MAAM,EAClC,WACD,EACA,MAAM0C,EAAoB1C,EAAY,YAAY,WAAW,EAAE,MAAM,CAAC,EACtE,MAAM0C,EAAoB1C,EAAY,YAAY,YAAY,EAAE,MAAM,CAAC,EACvE,MAAM0C,EAAoB1C,EAAY,YAAY,MAAM,EAAE,MAAM,CAAC,EACjE,MAAM,KAAK,aAAa,OACvB,CACC,iBAAkByC,EAAK,aAAa,iBACpC,sBAAuBA,EAAK,aAAa,qBAC1C,EACA,CAAE,YAAAzC,CAAY,CACf,CACD,EAEA,WAAQ,SAAY,CACnB,IAAMsC,EAAK,KAAK,GACVK,EAAiB,MAAMC,GAAqBN,EAAI,YAAY,EAC5DO,EAAgB,MAAMD,GAAqBN,EAAI,WAAW,EAEhE,MAAO,CACN,eAAAK,EACA,cAAAE,CACD,CACD,EAvbC,KAAK,QAAUrD,EACf,KAAK,OAAS,IAAIsD,GAAYtD,EAAQ,OAAQA,EAAQ,OAAO,OAAO,EACpE,KAAK,WAAa,IAAIuD,GAAgB,KAAK,EAAE,EAC7C,KAAK,UAAY,IAAIC,GAAe,KAAK,EAAE,EAC3C,KAAK,aAAe,IAAIC,GAAkB,KAAK,EAAE,EACjD,KAAK,QAAU,IAAIC,GAAa,KAAK,EAAE,EACvC,KAAK,eAAiB,IAAIC,GAAe,IAAI,EAC7C,KAAK,aAAe,IAAIC,GAAa,IAAM,KAAK,GAAG,EAC/C7D,IAAiB,KAAK,gBAAkBA,EAC7C,CAEA,IAAY,IAAK,CAChB,OAAO,KAAK,QAAQ,MACrB,CAEA,IAAY,KAAM,CACjB,OAAO,KAAK,QAAQ,GACrB,CAMA,IAAI,KAAM,CACT,OAAO,KAAK,KAAK,IAAI,KAAK,OAAO,cAAc,CAChD,CA+ZD,EC3fA,IAAM8D,GAAa,CAACC,GAAUC,GAAUC,GAAUC,EAAQ,EAEnD,SAASC,GAAqB,CACpC,UAAAC,EAAY,OAAO,UACnB,UAAAC,EACA,IAAAC,CACD,EAI0D,CACzD,OAAO,IAAI,QACV,CAACC,EAASC,IAAW,CACpB,IAAMC,EAAUL,EAAU,KAAK,GAAGC,CAAS,QAAS,CAAC,EACjDK,EAAiB,GACrBD,EAAQ,gBAAkB,MAAOE,GAAU,CAC1C,IAAMC,EAAKH,EAAQ,OACbI,EAAKJ,EAAQ,YAEbK,EAAQhB,GAAW,MAAMa,EAAM,UAAU,EAC/C,QAAWI,KAAaD,EACvB,MAAMC,EAAUH,EAAIC,CAAE,EAGlBF,EAAM,aACVD,EAAiB,GAEnB,EACAD,EAAQ,QAAU,IAAM,CACvB,QAAQ,MAAM,yBAA0BA,EAAQ,KAAK,EACrDD,EAAOC,EAAQ,KAAK,CACrB,EACAA,EAAQ,UAAY,IAAM,CACzBF,EAAQ,CAAE,GAAIE,EAAQ,OAAQ,eAAAC,CAAe,CAAC,CAC/C,CACD,CACD,CACD,CAEA,eAAsBM,GAAwB,CAC7C,aAAAC,EACA,UAAAZ,EACA,UAAAD,EACA,IAAAE,CACD,EAK0D,CACzD,IAAMY,EAAS,MAAMf,GAAqB,CACzC,UAAWc,EACX,UAAAb,EACA,IAAAE,CACD,CAAC,EAGD,GAAI,CAACY,EAAO,eACX,OAAOA,EAGRZ,IAAM,QAAS,uDAAuD,EAEtE,GAAM,CAAE,GAAIa,CAAO,EAAI,MAAMhB,GAAqB,CACjD,UAAAE,EACA,UAAAD,EACA,IAAAE,CACD,CAAC,EAEKO,EAAKM,EAAO,YACjB,CAAC,YAAa,aAAc,MAAM,EAClC,UACD,EACM,CAACC,EAAWC,EAAYC,CAAI,EAAI,MAAM,QAAQ,IAAI,CACvDC,EAAoBV,EAAG,YAAY,WAAW,EAAE,OAAO,CAAC,EACxDU,EAAoBV,EAAG,YAAY,YAAY,EAAE,OAAO,CAAC,EACzDU,EAAoBV,EAAG,YAAY,MAAM,EAAE,OAAO,CAAC,CACpD,CAAC,EAEKW,EAAQN,EAAO,GAAG,YACvB,CAAC,YAAa,aAAc,MAAM,EAClC,WACD,EACMO,EAAeD,EAAM,YAAY,WAAW,EAC5CE,EAAgBF,EAAM,YAAY,YAAY,EAC9CG,EAAUH,EAAM,YAAY,MAAM,EAExC,QAAWI,KAAYR,EACtBK,EAAa,IAAIG,CAAQ,EAE1B,QAAWC,KAAaR,EACvBK,EAAc,IAAIG,CAAS,EAE5B,QAAWC,KAAYR,EACtBK,EAAQ,IAAIG,CAAQ,EAGrB,aAAM,IAAI,QAAc,CAACvB,EAASC,IAAW,CAC5CgB,EAAM,WAAa,IAAM,CACxBjB,EAAQ,CACT,EACAiB,EAAM,QAAWb,GAAU,CAC1BH,EAAOG,CAAK,CACb,EACAa,EAAM,QAAWb,GAAU,CAC1BH,EAAOG,CAAK,CACb,CACD,CAAC,EAED,MAAMoB,GAAcZ,CAAM,EAE1Bb,IACC,QACA,gEACAc,EAAU,OACV,aACAC,EAAW,OACX,YACD,EAEOH,CACR,CAEA,eAAenB,GAASa,EAAiBC,EAAoB,CAC5D,IAAMmB,EAAiBpB,EAAG,kBAAkB,YAAa,CACxD,QAAS,KACV,CAAC,EACKqB,EAAkBrB,EAAG,kBAAkB,aAAc,CAC1D,QAAS,eACV,CAAC,EACKsB,EAAYtB,EAAG,kBAAkB,OAAQ,CAAE,QAAS,MAAO,CAAC,EAClEoB,EAAe,YAAY,YAAa,WAAW,EACnDC,EAAgB,YAAY,oBAAqB,mBAAmB,EACpEA,EAAgB,YAAY,wBAAyB,uBAAuB,CAC7E,CAWA,eAAejC,GAASY,EAAiBC,EAAoB,CAC5D,IAAMQ,EAAaR,EAAG,YAAY,YAAY,EAC9C,MAAM,IAAI,QAAc,CAACN,EAASC,IAAW,CAC5C,IAAM2B,EAAYd,EAAW,WAAW,EACxCc,EAAU,UAAY,IAAM,CAE3B,IAAMC,EAASD,EAAU,OACzB,GAAIC,EAAQ,CACX,GAAM,CAAE,kBAAAC,EAAmB,sBAAAC,EAAuB,GAAGC,CAAM,EAC1DH,EAAO,MACRA,EAAO,OAAO,CACb,GAAGG,EACH,IAAKF,EACL,IAAKC,CACN,CAAC,EACDF,EAAO,SAAS,CACjB,MACC7B,EAAQ,CAEV,EACA4B,EAAU,QAAWxB,GAAU,CAC9BH,EAAO2B,EAAU,KAAK,CACvB,CACD,CAAC,EAEDd,EAAW,YAAY,mBAAmB,EAC1CA,EAAW,YAAY,uBAAuB,EAE9CA,EAAW,YAAY,MAAO,MAAO,CAAE,OAAQ,EAAM,CAAC,EACtDA,EAAW,YAAY,MAAO,MAAO,CAAE,OAAQ,EAAM,CAAC,EACtDA,EAAW,YAAY,MAAO,MAAO,CAAE,OAAQ,EAAM,CAAC,CACvD,CAOA,eAAepB,GAASW,EAAiBC,EAAoB,CACzCA,EAAG,YAAY,YAAY,EACnC,YAAY,YAAa,WAAW,CAChD,CAEA,eAAeX,GAASU,EAAiBC,EAAoB,CAC5D,IAAM2B,EAAQ5B,EAAG,kBAAkB,QAAS,CAC3C,QAAS,IACV,CAAC,EACD4B,EAAM,YAAY,SAAU,QAAQ,EACpCA,EAAM,YAAY,YAAa,WAAW,CAC3C,CCjLA,IAAMC,GAA2BC,GACzB,YAAY,KAAKC,GAAmBD,EAAO,MAAM,CAAC,EAGpDE,GAA0BF,GAA4B,CAE5D,EAEMG,GAA2BH,GAAuC,CACvE,IAAMI,EAAQJ,EAAO,KAAOA,EAAO,GAC7BK,EAAQL,EAAO,KAAOA,EAAO,GACnC,OAAII,IAAUC,EACN,YAAY,KAAKJ,GAAmBG,CAAK,CAAC,EAE7CA,EAEOC,EAGJ,YAAY,MAClBJ,GAAmBG,CAAK,EACxBH,GAAmBI,CAAK,EACxB,CAAC,CAACL,EAAO,GACT,CAAC,CAACA,EAAO,EACV,EAPO,YAAY,WAAWC,GAAmBG,CAAK,EAAG,CAAC,CAACJ,EAAO,EAAE,EAF7D,YAAY,WAAWC,GAAmBI,CAAK,EAAG,CAAC,CAACL,EAAO,EAAE,CAWtE,EAEMM,GAA6B,CAElCC,EACAC,EACAR,IACI,CAGJ,IAAMS,EACLF,EAAO,YAAYC,CAAU,EAAE,UAAUR,EAAO,KAAK,EACtDU,EACCD,EACA,SAAST,EAAO,KAAK,iCAAiCQ,CAAU,EACjE,EACA,IAAMG,EAAc,OAAO,KAAKX,EAAO,KAAK,EAAE,KAC7C,CAACY,EAAGC,IAAMJ,EAAgB,GAAG,QAAQG,CAAC,EAAIH,EAAgB,GAAG,QAAQI,CAAC,CACvE,EACA,QAAWC,KAAOH,EACjB,GAAIF,EAAgB,GAAG,QAAQK,CAAG,IAAMH,EAAY,QAAQG,CAAG,EAC9D,MAAM,IAAI,MACT,kBAAkBd,EAAO,KAAK,kBAAkBc,CAAG,4BACpD,EAIF,IAAMC,EAAgBJ,EAAY,IAChCG,GAAQd,EAAO,MAAMc,CAAgC,CACvD,EAIA,GAAIH,EAAY,SAAWF,EAAgB,GAAG,OAC7C,OAAO,YAAY,KAAKO,GAAyB,GAAGD,CAAa,CAAC,EAInE,IAAMX,EAAQa,GAA2B,GAAGF,CAAa,EACnDV,EAAQa,GAA2B,GAAGH,CAAa,EACzD,OAAO,YAAY,MAAMX,EAAOC,CAAK,CACtC,EAEA,SAASc,GAA6BnB,EAA+B,CACpE,IAAMI,EAAQJ,EAAO,WACfK,EAAQL,EAAO,WAAa,SAClC,OAAO,YAAY,MAAMI,EAAOC,CAAK,CACtC,CAEO,SAASe,GACfb,EACAC,EACAa,EACC,CACD,GAAKA,EACL,OAAIC,GAAmBD,CAAK,EAAUlB,GAAwBkB,CAAK,EAC/DE,GAAmBF,CAAK,EAAUtB,GAAwBsB,CAAK,EAC/DG,GAAkBH,CAAK,EAAUnB,GAAuBmB,CAAK,EAC7DI,GAAwBJ,CAAK,EACzBF,GAA6BE,CAAK,EACnCf,GAA2BC,EAAQC,EAAYa,CAAK,CAC5D,CCtGA,SAASK,GAASC,EAAiBC,EAAoBC,EAAiB,CACvE,OAAOF,EACL,YAAYC,EAAYC,EAAQ,YAAc,UAAU,EACxD,YAAYD,CAAU,CACzB,CAEA,eAAsBE,GAAW,CAChC,WAAAF,EACA,MAAAG,EACA,QAAAC,CACD,EAIG,CACF,IAAMC,EAAQP,GAASM,EAAQ,WAAYJ,CAAU,EAC/CM,EAASH,EAAQE,EAAM,MAAMF,EAAM,KAAK,EAAIE,EAC5CE,EAAQC,GAASJ,EAAQ,OAAQJ,EAAYG,CAAK,EAClDM,EAAYN,GAAO,QAAU,OAAS,OAAS,OAC/CO,EAAUJ,EAAO,WAAWC,EAAOE,CAAS,EAuBlD,OAtBe,MAAM,IAAI,QAAuB,CAACE,EAASC,IAAW,CACpEF,EAAQ,UAAY,IAAM,CACzB,IAAMG,EAASH,EAAQ,OAEtBC,EADGE,EACKC,EAAUd,EAAYa,EAAO,WAAW,SAAS,CAAC,EAElD,IAFmD,CAI7D,EACAH,EAAQ,QAAU,IAAM,CACnBA,EAAQ,OAAO,OAAS,qBAC3BN,EAAQ,IACP,QACA,8CACAM,EAAQ,KACT,EACAC,EAAQ,IAAI,GAEZC,EAAOF,EAAQ,KAAK,CAEtB,CACD,CAAC,CAEF,CAEA,eAAsBK,GAAY,CACjC,WAAAf,EACA,MAAAG,EACA,QAAAC,CACD,EAIG,CACF,IAAMC,EAAQP,GAASM,EAAQ,WAAYJ,CAAU,EAC/CM,EAASH,EAAQE,EAAM,MAAMF,EAAM,KAAK,EAAIE,EAC5CE,EAAQC,GAASJ,EAAQ,OAAQJ,EAAYG,CAAK,EAClDM,EAAYN,GAAO,QAAU,OAAS,OAAS,OAC/CO,EAAUJ,EAAO,WAAWC,EAAOE,CAAS,EAyBlD,OAxBe,MAAM,IAAI,QAAkB,CAACE,EAASC,IAAW,CAC/D,IAAMI,EAAU,IAAI,IACpBN,EAAQ,UAAY,IAAM,CACzB,IAAMG,EAASH,EAAQ,OACnBG,GACHG,EAAQ,IAAIF,EAAUd,EAAYa,EAAO,WAAW,SAAS,CAAC,CAAC,EAC/DA,EAAO,SAAS,GAEhBF,EAAQ,MAAM,KAAKK,CAAO,CAAC,CAE7B,EACAN,EAAQ,QAAU,IAAM,CACnBA,EAAQ,OAAO,OAAS,qBAC3BN,EAAQ,IACP,QACA,8CACAM,EAAQ,KACT,EACAC,EAAQ,CAAC,CAAC,GAEVC,EAAOF,EAAQ,KAAK,CAEtB,CACD,CAAC,CAEF,CAEA,eAAsBO,GAAe,CACpC,WAAAjB,EACA,MAAAG,EACA,QAAAC,EACA,MAAAc,EACA,OAAAC,CACD,EAMG,CACF,IAAMd,EAAQP,GAASM,EAAQ,WAAYJ,CAAU,EAC/CM,EAASH,EAAQE,EAAM,MAAMF,EAAM,KAAK,EAAIE,EAC5CE,EAAQC,GAASJ,EAAQ,OAAQJ,EAAYG,CAAK,EAClDM,EAAYN,GAAO,QAAU,OAAS,OAAS,OAC/CO,EAAUJ,EAAO,WAAWC,EAAOE,CAAS,EAC9CW,EAAgB,CAACD,EACjBE,EAAc,GACdC,EAAU,EAuCd,MAAO,CACN,OAvCc,MAAM,IAAI,QAAkB,CAACX,EAASC,IAAW,CAC/D,IAAMI,EAAU,IAAI,IACpBN,EAAQ,UAAY,IAAM,CACzBY,IACA,IAAMT,EAASH,EAAQ,OACnBG,EACCM,GAAU,CAACC,GACdP,EAAO,QAAQM,CAAM,EACrBC,EAAgB,KAEZF,GAASF,EAAQ,KAAOE,GAC3BF,EAAQ,IAAIF,EAAUd,EAAYa,EAAO,WAAW,SAAS,CAAC,CAAC,EAE5DK,GAASI,EAAUJ,GACtBG,EAAc,GACdV,EAAQ,MAAM,KAAKK,CAAO,CAAC,GAE3BH,EAAO,SAAS,GAIlBF,EAAQ,MAAM,KAAKK,CAAO,CAAC,CAE7B,EACAN,EAAQ,QAAU,IAAM,CACnBA,EAAQ,OAAO,OAAS,qBAC3BN,EAAQ,IACP,QACA,2CACAM,EAAQ,KACT,EACAC,EAAQ,CAAC,CAAC,GAEVC,EAAOF,EAAQ,KAAK,CAEtB,CACD,CAAC,EAIA,YAAAW,CACD,CACD,CCzJA,eAAsBE,GACrBC,EACAC,EACAC,EACAC,EACkB,CAClB,SAASC,EACRC,EACAC,EACC,CACD,IAAIC,EACAC,EACEC,EAAUT,EAAU,KACzB,CAACC,EAAW,aAAa,EAAE,KAAK,GAAG,EACnCC,CACD,EACAO,EAAQ,gBAAkB,MAAOC,GAAU,CAC1CH,EAAiBG,EAAM,WACvB,IAAMC,EAAcF,EAAQ,YAC5BD,EAAWC,EAAQ,OACnBE,EAAY,MAAM,CACnB,EACAF,EAAQ,UAAaC,GAAU,CAC9BL,EAAQ,CAACI,EAAQ,OAAO,QAASA,EAAQ,MAAM,CAAC,CACjD,EACAA,EAAQ,UAAaC,GAAU,CAE9BP,IAAM,8BAA8B,CAIrC,EACAM,EAAQ,QAAWC,GAAU,CAE5BL,EAAQ,CAACE,EAAiBC,CAAS,CAAC,CACrC,CACD,CACA,GAAM,CAACD,EAAgBK,CAAE,EAAI,MAAM,IAAI,QACtCR,CACD,EACA,aAAMS,GAAcD,CAAE,EACfL,CACR,CAEA,eAAsBM,GAAcD,EAAiB,CACpDA,EAAG,MAAM,EAET,MAAM,IAAI,QAAeP,GAAYA,EAAQ,CAAC,CAC/C,CAKA,eAAsBS,GACrBC,EACAd,EACAC,EACAc,EAKAb,EACgB,CAChB,SAASc,EAAeZ,EAAqBC,EAA8B,CAC1E,IAAMG,EAAUM,EAAU,KACzB,CAACd,EAAW,aAAa,EAAE,KAAK,GAAG,EACnCC,CACD,EACIgB,EAAc,GAClBT,EAAQ,gBAAmBC,GAAU,CACpC,IAAMC,EAAcF,EAAQ,YAC5BO,EAASL,EAAaF,EAAQ,OAAQC,CAAK,EAC3CQ,EAAc,EACf,EACAT,EAAQ,UAAaC,GAAU,CAC9BD,EAAQ,OAAO,MAAM,EACjBS,EACHb,EAAQ,EAERC,EACC,IAAI,MACH,8DACD,CACD,CAEF,EACAG,EAAQ,QAAWC,GAAU,CAC5BJ,EAAOG,EAAQ,OAAS,IAAI,MAAM,eAAe,CAAC,CACnD,EACAA,EAAQ,UAAaC,GAAU,CAC9BP,IAAM,sCAAsC,CAI7C,CACD,CACA,OAAO,IAAI,QAAQc,CAAc,CAClC,CAEA,eAAsBE,GACrBlB,EACAmB,EACC,CACG,OAAO,UAAc,KAAe,UAAU,MACjD,MAAM,UAAU,MAAM,QAAQ,qBAAqBnB,CAAS,GAAImB,CAAS,EAGzE,MAAMA,EAAU,CAElB,CAEA,eAAsBC,GACrBN,EACAd,EACAC,EACAC,EACuB,CACvBA,IAAM,QAAS,mBAAoBF,EAAW,aAAcC,CAAO,EACnE,IAAMU,EAAK,MAAM,IAAI,QAAqB,CAACP,EAASC,IAAW,CAC9D,IAAMG,EAAUM,EAAU,KACzB,CAACd,EAAW,aAAa,EAAE,KAAK,GAAG,EACnCC,CACD,EACAO,EAAQ,gBAAkB,MAAOC,GAAU,CACtBD,EAAQ,YAChB,MAAM,EAElBN,IACC,QACA,4CACA,WACAD,EACA,MACAO,EAAQ,OAAO,OAChB,EACAH,EACCG,EAAQ,OACP,IAAI,MACH,8FAA8FP,CAAO,SAASO,EAAQ,OAAO,OAAO,EACrI,CACF,CACD,EACAA,EAAQ,UAAaC,GAAU,CAC9BL,EAAQI,EAAQ,MAAM,CACvB,EACAA,EAAQ,UAAaC,GAAU,CAC9BJ,EAAO,IAAI,MAAM,mCAAmC,CAAC,CACtD,EACAG,EAAQ,QAAWC,GAAU,CAC5BJ,EAAO,IAAI,MAAM,iCAAiC,CAAC,CACpD,CACD,CAAC,EAED,OAAAM,EAAG,iBAAiB,gBAAkBF,GAAU,CAC/CE,EAAG,MAAM,CACV,CAAC,EAEMA,CACR,CC/JO,IAAMU,GAAN,cAAiC,KAAM,CAG7C,YAA4BC,EAAiB,CAC5C,MAAMA,CAAO,EADc,aAAAA,EAF5B,KAAS,KAAO,oBAIhB,CACD,ECHO,SAASC,GAAiB,CAChC,eAAAC,EACA,cAAAC,EACA,WAAAC,CACD,EAIG,CACF,IAAMC,EAAOC,GAAgB,CAC5B,eAAAJ,EACA,cAAAC,EACA,WAAAC,CACD,CAAC,EACD,GAAI,CAACC,EACJ,MAAM,IAAIE,GACT,gCAAgCL,CAAc,OAAOC,CAAa,wHACnE,EAED,OAAOE,CACR,CAEA,SAASC,GAAgB,CACxB,eAAAJ,EACA,cAAAC,EACA,WAAAC,CACD,EAIuB,CACtB,GAAIF,IAAmBC,EACtB,MAAO,CAAC,EAGT,IAAMK,EAAWJ,EACf,OAAQK,GAAMA,EAAE,UAAU,UAAYP,CAAc,EACpD,KAAK,CAACQ,EAAGC,IAAMA,EAAE,UAAU,QAAUD,EAAE,UAAU,OAAO,EAI1D,KAAOF,EAAS,OAAS,GAAG,CAC3B,IAAMI,EAAOJ,EAAS,MAAM,EAE5B,GAAII,EAAK,UAAU,QAAUT,EAC5B,OAAO,KAGR,GAAIS,EAAK,UAAU,UAAYT,EAC9B,MAAO,CAACS,CAAI,EAIb,IAAMC,EAAWP,GAAgB,CAChC,eAAgBM,EAAK,UAAU,QAC/B,cAAAT,EACA,WAAAC,CACD,CAAC,EACD,GAAIS,EACH,MAAO,CAACD,EAAM,GAAGC,CAAQ,CAI3B,CAKA,OAAO,IACR,CCrCA,IAAMC,GACL,OAAO,OAAW,IAAc,OAAO,UAAa,OAIrD,eAAsBC,GAAqB,CAC1C,QAAAC,EACA,UAAAC,EAAYH,GACZ,WAAAI,EACA,KAAAC,EACA,QAAAC,CACD,EAMG,CACF,GAAIA,EAAQ,OAAO,IAClB,MAAM,IAAI,MAAM,oDAAoD,EAGrE,IAAMC,EAAiB,MAAMC,GAC5BL,EACAG,EAAQ,UACRJ,EACAI,EAAQ,GACT,EAEAA,EAAQ,IACP,QACA,4BACAC,EACA,kBACAL,CACD,EAEA,IAAMO,EAAQC,GAAiB,CAC9B,eAAAH,EACA,cAAeL,EACf,WAAAE,CACD,CAAC,EAED,OAAIK,EAAM,OAAS,IAClBH,EAAQ,IACP,QACA,qBACAG,EAAM,IAAKE,GAAMA,EAAE,OAAO,CAC3B,EACA,MAAMC,GAAc,CAAE,QAAAN,EAAS,MAAAG,EAAO,KAAAJ,EAAM,UAAAF,CAAU,CAAC,GAEjDU,GAAaV,EAAWG,EAAQ,UAAWJ,EAASI,EAAQ,GAAG,CACvE,CAEA,eAAsBQ,GAAwB,CAC7C,QAAAZ,EACA,UAAAC,EAAYH,GACZ,WAAAI,EACA,KAAAC,EACA,QAAAC,EACA,aAAAS,CACD,EAOG,CACFT,EAAQ,IAAI,QAAS,uBAAwBS,CAAY,EACzD,IAAMC,EAAoB,MAAMR,GAC/BL,EACAY,EACAb,EACAI,EAAQ,GACT,EAEA,GAAIU,IAAsBd,EACzBI,EAAQ,IAAI,OAAQ,mDAAmD,MACjE,CACNA,EAAQ,IAAI,OAAQ,gDAAgD,EAKpE,IAAMW,EAAeP,GAAiB,CACrC,eAAgBM,EAChB,cAAed,EAAU,EACzB,WAAAE,CACD,CAAC,EAED,GAAIa,EAAa,OAAS,EAAG,CAC5B,MAAML,GAAc,CACnB,QAAAN,EACA,MAAOW,EACP,KAAAZ,EACA,UAAAF,EACA,UAAWY,CACZ,CAAC,EAGD,IAAMG,EAAe,MAAML,GAC1BV,EACAG,EAAQ,UACRJ,EAAU,EACVI,EAAQ,GACT,EAEMa,EAAc,MAAMN,GACzBV,EACAY,EACAb,EAAU,EACVI,EAAQ,GACT,EAGMc,EAAyB,IAAI,MACnC,QAASC,EAAI,EAAGA,EAAIH,EAAa,iBAAiB,OAAQG,IACzDD,EAAuB,KAAKF,EAAa,iBAAiBG,CAAC,CAAC,EAG7D,IAAMC,EAAsBJ,EAAa,YACxCE,EACA,UACD,EACMG,EAAiBH,EAAuB,IAAKI,GAClDF,EAAoB,YAAYE,CAAI,CACrC,EACMC,EAAa,MAAM,QAAQ,IAChCF,EAAe,IAAKG,GAAUC,EAAoBD,EAAM,OAAO,CAAC,CAAC,CAClE,EAEME,EAAoBT,EAAY,YACrCC,EACA,WACD,EACMS,EAAeT,EAAuB,IAAKI,GAChDI,EAAkB,YAAYJ,CAAI,CACnC,EAEA,QAASH,EAAI,EAAGA,EAAIQ,EAAa,OAAQR,IACxC,MAAM,QAAQ,IACbI,EAAWJ,CAAC,EAAE,IAAKS,GACXH,EAAoBE,EAAaR,CAAC,EAAE,IAAIS,CAAG,CAAC,CACnD,CACF,CAEF,CAEA,IAAMrB,EAAQC,GAAiB,CAC9B,eAAgBR,EAAU,EAC1B,cAAeA,EACf,WAAAE,CACD,CAAC,EAEGK,EAAM,OAAS,GAClB,MAAMG,GAAc,CACnB,QAAAN,EACA,MAAAG,EACA,KAAAJ,EACA,UAAAF,EACA,UAAWY,CACZ,CAAC,CAEH,CAEA,OAAOF,GAAaV,EAAWY,EAAcb,EAASI,EAAQ,GAAG,CAClE,CAEA,eAAeM,GAAc,CAC5B,QAAAN,EACA,MAAAG,EACA,KAAAJ,EACA,UAAAF,EAAYH,GACZ,UAAA+B,EAAYzB,EAAQ,SACrB,EAMG,CACF,MAAM0B,GAAYD,EAAW,SAAY,CAExC,QAAWE,KAAaxB,EAAO,CAG9B,IAAIyB,EAEJ,GAAID,EAAU,UAAU,UAAY,EACnCC,EAASC,GAA0B,CAClC,KAAA9B,EACA,UAAA4B,EACA,QAAA3B,CACD,CAAC,EACD,MAAM2B,EAAU,QAAQC,CAAM,MACxB,CAGN,IAAME,EAAmB,MAAMvB,GAC9BV,EACA4B,EACAE,EAAU,UAAU,QACpB3B,EAAQ,GACT,EAGA4B,EAASG,GAAmB,CAC3B,KAAAhC,EACA,UAAA4B,EACA,QAAS,CACR,GAAG3B,EACH,WAAY8B,CACb,CACD,CAAC,EACD,GAAI,CACH,MAAMH,EAAU,QAAQC,CAAM,EAE9B,MAAM,QAAQ,IAAIA,EAAO,UAAU,CACpC,OAASI,EAAK,CACb,MAAAhC,EAAQ,IACP,WACA,qBAAqB2B,EAAU,UAAU,OAAO,OAAOA,EAAU,UAAU,OAAO,IAClFK,CACD,EACMA,CACP,CAIA,MAAMC,GAAcH,CAAgB,CACrC,CAEA9B,EAAQ,IACP,QACA,qBACAyB,EACA,aACAE,EAAU,UAAU,OACrB,EACA,MAAMO,GACLrC,EACA4B,EACAE,EAAU,UAAU,QACpB,CAACQ,EAAaC,IAAO,CACpB,QAAWC,KAAiBV,EAAU,iBACrCS,EAAG,kBAAkBC,EAAe,CACnC,QACCV,EAAU,UAAU,YAAYU,CAAa,EAAE,WAChD,cAAe,EAChB,CAAC,EAGF,QAAWC,KAAcX,EAAU,eAAgB,CAClD,IAAMP,EAAQe,EAAY,YAAYG,CAAU,EAEhD,QAAWC,KAAYZ,EAAU,aAAaW,CAAU,GAAK,CAAC,EAC7DlB,EAAM,YAAYmB,EAAS,KAAMA,EAAS,KAAM,CAC/C,WAAYA,EAAS,UACtB,CAAC,EAGF,QAAWC,KAAYb,EAAU,eAAeW,CAAU,GAAK,CAAC,EAC/DlB,EAAM,YAAYoB,EAAS,IAAI,CAEjC,CACA,QAAWC,KAAqBd,EAAU,mBAIzCQ,EAAY,YAAYM,CAAiB,EAAE,MAAM,CAEnD,EACAzC,EAAQ,GACT,EAiBA,IAAM0C,EAA8B,MAAMC,GAA+B,CACxE,KAAA5C,EACA,eAAgB4B,EAAU,UAAU,QACpC,WAAYA,EAAU,UAAU,OACjC,CAAC,EAGKiB,EAAmB,MAAMrC,GAC9BV,EACA4B,EACAE,EAAU,UAAU,QACpB3B,EAAQ,GACT,EACA,QAAWsC,KAAcX,EAAU,eAAgB,CAMlD,IAAMkB,EAJ0BD,EAAiB,YAChDN,EACA,WACD,EAC0C,YAAYA,CAAU,EAG1DQ,GAFO,MAAMC,GAAWF,CAAS,GAErB,IAAKG,GAAQC,EAAUX,EAAY,GAAGU,CAAG,EAAE,CAAC,EAC9DF,EAAK,KACJ,GAAGlB,EAAO,QAAQ,OAAQsB,GAClBC,GAAaD,CAAG,EAAE,aAAeZ,CACxC,EACD,GAAGI,EAA4B,OAAQQ,GAC/BC,GAAaD,CAAG,EAAE,aAAeZ,CACxC,CACF,EAsBA,IAAMc,GApBY,MAAM,QAAQ,IAC/BN,EAAK,IAAI,MAAOI,GAAQ,CACvB,GAAI,CACH,IAAMG,EAAO,MAAMtD,EAAK,oBAAoBmD,CAAG,EAC/C,MAAO,CAACA,EAAKG,CAAI,CAClB,OAASC,EAAG,CAGX,OAAAtD,EAAQ,IACP,QACA,yDACAkD,EACA,sCACAI,CACD,EACO,IACR,CACD,CAAC,CACF,GAGE,OAAQC,GAA0B,CAAC,CAACA,CAAC,EACrC,IAAI,CAAC,CAACL,EAAKM,CAAQ,IAAM,CACzB,GAAI,CAACA,EAAU,MAAO,CAACN,EAAK,MAAS,EACrC,IAAMO,EAAOC,GACZ/B,EAAU,UAAU,YAAYW,CAAU,EAC1CkB,CACD,EACA,MAAO,CAACN,EAAKO,CAAI,CAClB,CAAC,EAOIE,EAJ2Bf,EAAiB,YACjDN,EACA,WACD,EAC4C,YAAYA,CAAU,EAClE,MAAM,QAAQ,IACbc,EAAM,IAAI,CAAC,CAACF,EAAKO,CAAI,IAAM,CAC1B,GAAIA,EACH,OAAOG,GAAQD,EAAYF,CAAI,EAAE,MAAOzB,GAAQ,CAE/C,MAAMA,CACP,CAAC,EACK,CACN,GAAM,CAAE,GAAA6B,CAAG,EAAIV,GAAaD,CAAG,EAC/B,OAAOY,GAAWH,EAAYE,CAAE,CACjC,CACD,CAAC,CACF,CACD,CAEA,MAAM5B,GAAcW,CAAgB,EAEpC5C,EAAQ,IAAI,QAAS,gBAAgByB,CAAS,YAAY,EAC1DzB,EAAQ,IAAI;AAAA,oBACL2B,EAAU,UAAU,OAAO;AAAA,4BACTA,EAAU,iBAAiB,KAAK,IAAI,CAAC;AAAA,8BACnCA,EAAU,mBAAmB,KAAK,IAAI,CAAC;AAAA,8BACvCA,EAAU,mBAAmB,KAAK,IAAI,CAAC;AAAA,sBAC/C,OAAO,KAAKA,EAAU,YAAY,EACjD,IAAKoC,GACLpC,EAAU,aAAaoC,CAAG,EAAE,IAAKhD,GAAM,GAAGgD,CAAG,IAAIhD,EAAE,IAAI,EAAE,CAC1D,EACC,QAASA,GAAMA,CAAC,EAChB,KAAK,IAAI,CAAC;AAAA,0BACS,OAAO,KAAKY,EAAU,cAAc,EACvD,IAAKoC,GACLpC,EAAU,eAAeoC,CAAG,EAAE,IAAKhD,GAAM,GAAGgD,CAAG,IAAIhD,EAAE,IAAI,EAAE,CAC5D,EACC,QAASA,GAAMA,CAAC,EAChB,KAAK,IAAI,CAAC;AAAA,IACb,CACF,CACD,CAAC,CACF,CAEA,SAASiD,GAAsB,CAC9B,UAAArC,EACA,KAAA5B,EACA,gBAAAkE,EACA,QAAAC,CACD,EAKG,CACF,OAAOvC,EAAU,eAAe,OAAO,CAACwC,EAAKC,KAC5CD,EAAIC,CAAc,EAAI,CACrB,IAAK,MAAOC,GAAa,CAExBC,GAAiB3C,EAAU,UAAU,YAAYyC,CAAc,EAAGC,CAAG,EACrE,IAAME,EACLF,EAAI1C,EAAU,UAAU,YAAYyC,CAAc,EAAE,UAAU,EACzDlB,EAAMD,EAAUmB,EAAgBG,CAAU,EAChD,OAAAL,EAAQ,KAAKhB,CAAG,EAChB,MAAMnD,EAAK,qBACVyE,GAAiBH,EAAKnB,EAAKe,CAAe,CAC3C,EACOI,CACR,EACA,OAASR,GAAe,CACvB,IAAMX,EAAMD,EAAUmB,EAAgBP,CAAE,EACxC,OAAO9D,EAAK,qBAAqB,CAChC,CACC,IAAAmD,EACA,UAAWe,EAAgB,EAC3B,KAAM,CAAE,GAAI,QAAS,CACtB,CACD,CAAC,CACF,CACD,EACOE,GACL,CAAC,CAAQ,CACb,CAEA,SAASM,GAAoB,CAC5B,UAAA9C,EACA,QAAA3B,EACA,KAAAD,CACD,EAIG,CACF,OAAO4B,EAAU,eAAe,OAAO,CAACwC,EAAKC,KAC5CD,EAAIC,CAAc,EAAI,CACrB,IAAK,MAAOP,GAAe,CAC1B,IAAMX,EAAMD,EAAUmB,EAAgBP,CAAE,EAKxC,OAJY,MAAM9D,EAAK,oBAAoBmD,EAAK,CAE/C,GAAInD,EAAK,KAAK,IAAI4B,EAAU,UAAU,OAAO,CAC9C,CAAC,CAEF,EACA,QAAS,MAAO+C,GAA6B,CAC5C,IAAMxB,EAAM,MAAMyB,GAAW,CAC5B,WAAYP,EACZ,MAAOM,EACP,QAAA1E,CACD,CAAC,EACD,OAAKkD,EACO,MAAMnD,EAAK,oBAAoBmD,EAAK,CAE/C,GAAInD,EAAK,KAAK,IAAI4B,EAAU,UAAU,OAAO,CAC9C,CAAC,EAJgB,IAMlB,EACA,QAAS,MAAO+C,GAA6B,CAC5C,IAAM5B,EAAO,MAAM8B,GAAY,CAC9B,WAAYR,EACZ,MAAOM,EACP,QAAA1E,CACD,CAAC,EASD,OARa,MAAM,QAAQ,IAC1B8C,EAAK,IAAKI,GACTnD,EAAK,oBAAoBmD,EAAK,CAE7B,GAAInD,EAAK,KAAK,IAAI4B,EAAU,UAAU,OAAO,CAC9C,CAAC,CACF,CACD,CAED,CACD,EACOwC,GACL,CAAC,CAAQ,CACb,CAEA,SAASpC,GAAmB,CAC3B,KAAAhC,EACA,UAAA4B,EACA,QAAA3B,CACD,EAKoB,CACnB,SAASiE,GAAkB,CAC1B,OAAOlE,EAAK,KAAK,KAAK4B,EAAU,OAAO,CACxC,CAEA,IAAMuC,EAAU,IAAI,MAEdW,EAAUJ,GAAoB,CACnC,UAAA9C,EACA,QAAA3B,EACA,KAAAD,CACD,CAAC,EACK+E,EAAYd,GAAsB,CACvC,UAAArC,EACA,gBAAAsC,EACA,QAAAC,EACA,KAAAnE,CACD,CAAC,EACKgF,EAAa,IAAI,MA4CvB,MA3CgC,CAC/B,IAAK/E,EAAQ,IACb,QAAAkE,EACA,QAAS,MAAO5B,EAAY0C,IAAa,CACxC,IAAMC,EAAO,MAAMJ,EAAQvC,CAAU,EAAE,QAAQ,EAE/C,MAAM,QAAQ,IACb2C,EAAK,OAAO,OAAO,EAAE,IAAI,MAAOZ,GAAa,CAC5Ca,EACCC,GAAOd,CAAG,EACV,+BAA+B,KAAK,UAAUA,CAAG,CAAC,EACnD,EACA,IAAMe,EAAWC,GAAUhB,CAAG,EAExBiB,EAAW,MAAMN,EAASX,CAAG,EACnC,GAAIiB,EAAU,CAIbC,GAAqCH,CAAQ,EAC7CG,GAAqCD,CAAQ,EAC7CE,GAA0BF,CAAQ,EAClC,IAAMG,EAAUC,GACfN,EACAE,EACArB,EACA,OACA,CAAC,EACD,CACC,oBAAqB,EACtB,CACD,EACIwB,EAAQ,OAAS,GACpB,MAAM1F,EAAK,qBAAqB0F,CAAO,CAEzC,CACD,CAAC,CACF,CACD,EACA,QAAAZ,EACA,UAAAC,EACA,WAAAC,CACD,CAED,CAEA,SAASlD,GAA0B,CAClC,KAAA9B,EACA,UAAA4B,EACA,QAAA3B,CACD,EAIoB,CACnB,SAASiE,GAAkB,CAC1B,OAAOlE,EAAK,KAAK,KAAK4B,EAAU,OAAO,CACxC,CAEA,IAAMuC,EAAU,IAAI,MAEdW,EAAU,IAAI,MAAM,CAAC,EAAU,CACpC,KAAM,CACL,MAAM,IAAI,MACT,4EACD,CACD,CACD,CAAC,EAEKC,EAAYd,GAAsB,CACvC,UAAArC,EACA,gBAAAsC,EACA,QAAAC,EACA,KAAAnE,CACD,CAAC,EAaD,MAZgC,CAC/B,IAAKC,EAAQ,IACb,QAAAkE,EACA,QAAS,IAAM,CACd,MAAM,IAAI,MACT,wHACD,CACD,EACA,QAAAW,EACA,UAAAC,EACA,WAAY,CAAC,CACd,CAED,CAEA,eAAe/B,GAAW3B,EAAuB,CAChD,OAAO,IAAI,QAAuB,CAACuE,EAASC,IAAW,CACtD,IAAMC,EAAUzE,EAAM,WAAW,EACjCyE,EAAQ,UAAaC,GAAU,CAC9BH,EAAQE,EAAQ,MAAM,CACvB,EACAA,EAAQ,QAAWC,GAAU,CAC5BF,EAAOC,EAAQ,KAAK,CACrB,CACD,CAAC,CACF,CAEA,eAAe/B,GAAW1C,EAAuByC,EAAY,CAC5D,IAAMgC,EAAUzE,EAAM,OAAOyC,CAAE,EAC/B,OAAO,IAAI,QAAc,CAAC8B,EAASC,IAAW,CAC7CC,EAAQ,UAAaC,GAAU,CAC9BH,EAAQ,CACT,EACAE,EAAQ,QAAWC,GAAU,CAC5BF,EAAOC,EAAQ,KAAK,CACrB,CACD,CAAC,CACF,CAEA,eAAejC,GAAQxC,EAAuBqC,EAAW,CACxD,IAAMoC,EAAUzE,EAAM,IAAIqC,CAAI,EAC9B,OAAO,IAAI,QAAc,CAACkC,EAASC,IAAW,CAC7CC,EAAQ,UAAaC,GAAU,CAC9BH,EAAQ,CACT,EACAE,EAAQ,QAAWC,GAAU,CAC5BF,EAAOC,EAAQ,KAAK,CACrB,CACD,CAAC,CACF,CAOA,eAAelD,GAA+B,CAC7C,KAAA5C,EACA,eAAAE,EACA,WAAY8F,CACb,EAIG,CAIF,IAAMC,EAAyC,CAAC,EAChD,aAAMjG,EAAK,WAAW,yBACpBkG,GAAOD,EAAoB,KAAKC,CAAE,EACnC,CACC,KAAMlG,EAAK,KAAK,KAAKE,EAAiB,CAAC,CACxC,CACD,EACO,MAAM,KACZ,IAAI,IAAI+F,EAAoB,IAAKC,GAAOC,EAAWD,EAAG,GAAG,CAAC,CAAC,CAC5D,CACD,CCjsBO,IAAME,GAAN,cAA0BC,CAAwC,CAAlE,kCACN,KAAQ,UAAwB,CAAC,EACjC,KAAQ,QAAsB,CAAC,EAS/B,UAAO,SAAY,CAClB,IAAMC,EAAO,KAAK,UAAU,IAAI,EAChC,OAAIA,GACH,KAAK,QAAQ,KAAK,MAAMA,EAAK,CAAC,EAC9B,KAAK,KAAK,QAAQ,EACX,IAED,EACR,EAEA,UAAO,SAAY,CAClB,IAAMA,EAAO,KAAK,QAAQ,IAAI,EAC9B,OAAIA,GACH,KAAK,UAAU,KAAK,MAAMA,EAAK,CAAC,EAChC,KAAK,KAAK,QAAQ,EACX,IAED,EACR,EAEA,aAAWC,GAAwB,CAClC,KAAK,UAAU,KAAKA,CAAS,EAC7B,KAAK,QAAU,CAAC,EAChB,KAAK,KAAK,QAAQ,CACnB,EAEA,aAAWC,GAAwB,CAClC,KAAK,QAAQ,KAAKA,CAAS,EAC3B,KAAK,KAAK,QAAQ,CACnB,EAEA,WAAQ,IAAM,CACb,KAAK,UAAY,CAAC,EAClB,KAAK,QAAU,CAAC,EAChB,KAAK,KAAK,QAAQ,CACnB,EA1CA,IAAI,SAAU,CACb,OAAO,KAAK,UAAU,OAAS,CAChC,CACA,IAAI,SAAU,CACb,OAAO,KAAK,QAAQ,OAAS,CAC9B,CAsCD,EClCO,IAAMC,GAAN,KAAyD,CAC/D,YACSC,EACAC,EACAC,EACP,CAHO,UAAAF,EACA,YAAAC,EACA,cAAAC,EAGT,KAAQ,OAAS,CAACC,EAAoBC,IAAc,CACnD,IAAMC,EAAiB,KAAK,OAAO,YAAYF,CAAU,EACvD,WAIIG,EAAaF,EAAKC,CAAc,EACtC,OAAAE,EACCD,EACA,qCAAqCD,EAAe,SAAS,CAAC,UAAU,KAAK,UAC5ED,CACD,CAAC,GACF,EACOI,EAAUL,EAAYG,CAAU,CACxC,EAEA,KAAQ,YAAc,CAACG,EAAwBL,IAAc,CAC5D,IAAMD,EAAa,KAAK,OAAO,YAC9BM,CACD,EACA,OAAOC,GAAiBP,EAAYC,CAAI,CACzC,EAEA,YAAS,MACRD,EACAC,EACAO,EAAkC,CAAC,IAC/B,CACJ,IAAMC,EAAY,KAAK,YAAYT,EAAYC,CAAI,EAC7CS,EAAM,KAAK,OAAOV,EAAYS,CAAS,EAE7C,OAAO,KAAK,SAAS,OAAOA,EAAWC,EAAKF,CAAO,CACpD,EAEA,YAAS,MACRR,EACAG,EACAK,EAAkC,CAAC,IAC/B,CACJ,IAAME,EAAML,EAAUL,EAAYG,CAAU,EAC5C,OAAO,KAAK,SAAS,OAAOO,EAAKF,CAAO,CACzC,EAEA,eAAY,MACXG,EACAH,EAAkC,CAAC,IAE5B,KAAK,SAAS,UACpBG,EAAI,IAAI,CAAC,CAACX,EAAYG,CAAU,IAAME,EAAUL,EAAYG,CAAU,CAAC,EACvEK,CACD,EAGD,6BAA0B,MACzBR,EACAW,EACAH,EAAkC,CAAC,IAE5B,KAAK,SAAS,UACpBG,EAAI,IAAKR,GAAeE,EAAUL,EAAYG,CAAU,CAAC,EACzDK,CACD,CA/DE,CAiEJ,ECjFO,IAAMI,GAAS,OAAO,oBAAoB,EACpCC,GAAc,OAAO,yBAAyB,EAP3DC,GAAAC,GAaaC,GAAN,cAAyBC,CAAkC,CASjE,YACiBC,EAChB,CACC,eAAAC,EAAiB,EAClB,EAEI,CAAC,EACJ,CACD,MAAM,EAPU,QAAAD,EARjB,KAAQ,WAA4B,KACpC,KAAQ,UAA6B,KACrC,KAAQ,SAAW,GACnB,KAAQ,QAAU,GAClB,KAAQ,UAAY,GACpB,KAAQ,gBAAkB,GAkB1B,KAACJ,IAAWM,GAAuB,CAClC,KAAK,SAAW,GAChB,KAAK,QAAU,GACf,KAAK,UAAY,GACjB,KAAK,UAAYA,EACbA,EAAS,OACR,KAAK,YACR,IAAI,gBAAgB,KAAK,UAAU,EAEpC,KAAK,WAAa,IAAI,gBAAgBA,EAAS,IAAI,GAEpD,KAAK,KAAK,QAAQ,CACnB,EAEA,KAACL,IAAe,IAAM,CACrB,KAAK,QAAU,GACf,KAAK,SAAW,GAChB,KAAK,KAAK,QAAQ,CACnB,EAwBA,aAAU,IAAM,CACX,KAAK,YACR,IAAI,gBAAgB,KAAK,UAAU,EAEpC,KAAK,UAAY,EAClB,EAtDC,KAAK,gBAAkBI,CACxB,CAMC,OAAAL,GAAAF,GAcAG,GAAAF,GAlBD,IAAI,gBAAiB,CACpB,OAAO,KAAK,eACb,CAsBA,IAAI,KAAqB,CACxB,OAAI,KAAK,QAAgB,KACrB,KAAK,WAAmB,KAAK,WAC1B,KAAK,WAAW,KAAO,IAC/B,CAEA,IAAI,MAAsB,CACzB,OAAO,KAAK,WAAW,MAAQ,IAChC,CAEA,IAAI,MAAsB,CACzB,OAAO,KAAK,WAAW,MAAQ,IAChC,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,QACb,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,OACb,CAQD,ECrFA,IAAAQ,GAAiB,WAEV,SAASC,GAAeC,EAAsB,CACpD,MAAO,CACN,MAAI,GAAAC,SAAK,EACT,KAAMD,EACN,IAAK,OACL,OAAQ,GACR,KAAMA,EAAK,KACX,KAAMA,EAAK,IACZ,CACD,CAMO,SAASE,GACfC,EACAC,EACM,CACN,GAAI,OAAO,OAAW,KAAeD,aAAiB,KAAM,CAC3D,IAAME,EAAON,GAAeI,CAAK,EACjC,OAAAC,EAAiBC,CAAI,EACdC,GAAcD,EAAK,EAAE,CAC7B,CAEA,GAAI,MAAM,QAAQF,CAAK,EAAG,CACzB,QAASI,EAAI,EAAGA,EAAIJ,EAAM,OAAQI,IACjCJ,EAAMI,CAAC,EAAIL,GAAkBC,EAAMI,CAAC,EAAGH,CAAgB,EAExD,OAAOD,CACR,CAEA,GAAI,OAAOA,GAAU,SAAU,CAC9B,QAAWK,KAAOL,EACjBA,EAAMK,CAAG,EAAIN,GAAkBC,EAAMK,CAAG,EAAGJ,CAAgB,EAE5D,OAAOD,CACR,CAEA,OAAOA,CACR,CAEO,SAASM,GAAkBT,EAAmB,CACpD,OAAO,IAAI,QAAqB,CAACU,EAASC,IAAW,CACpD,IAAMC,EAAS,IAAI,WACnBA,EAAO,OAAS,IAAM,CACrBF,EAAQE,EAAO,MAAqB,CACrC,EACAA,EAAO,QAAUD,EACjBC,EAAO,kBAAkBZ,CAAI,CAC9B,CAAC,CACF,CCnCO,IAAMa,GAAN,cAA0BC,EAAW,CAArC,kCACN,aAAU,MACTC,EACA,CACC,YAAAC,EACA,eAAAC,EAAiB,EAClB,EAAgE,CAAC,IAC7D,CACJ,IAAIC,EAASH,EAAK,KAAO,MAAMI,GAAkBJ,EAAK,IAAI,EAAI,OAC9D,GAAI,CAACG,GAAUD,GAAkBF,EAAK,IACrC,GAAI,CACHG,EAAS,MAAM,MAAMH,EAAK,IAAK,CAC9B,OAAQ,MACR,YAAa,SACd,CAAC,EAAE,KAAMK,GAAMA,EAAE,YAAY,CAAC,CAC/B,OAASC,EAAK,CACb,QAAQ,MACP,2IACAA,CACD,CACD,CAED,OAAO,KAAK,IACX,QACCC,GACOA,EAAM,IAAI,CAChB,GAAIP,EAAK,GAET,OAAQA,EAAK,OAAS,OAAS,QAC/B,UAAW,KACX,KAAMA,EAAK,KACX,KAAMA,EAAK,KACX,IAAKA,EAAK,IACV,OAAAG,CACD,CAAmB,EAEpB,YACAF,CACD,CACD,EAEA,KAAQ,gBAAmBO,GAA0C,CACnEA,EAAY,OAASA,EAAI,SAAW,OACrC,IAAML,EAASK,EAAI,OACnB,cAAOA,EAAI,OACVA,EAA4B,KAAOL,EACjCM,GAAkBN,EAAQK,EAAI,IAAI,EAClC,OACIA,CACR,EAEA,kBAAe,MACdE,EACA,CAAE,YAAAT,CAAY,EAAsC,CAAC,IACjD,CACJ,IAAMU,EAAU,MAAM,KAAK,WAAWD,EAAI,CAAE,YAAAT,CAAY,CAAC,EAEzD,GAAI,CAACU,EACJ,MAAM,IAAI,MAAM,+BAA+B,EAGhD,OAAO,KAAK,IACX,QACCJ,GACOA,EAAM,IAAI,CAChB,GAAGI,EACH,OAAQ,MACT,CAAmB,EAEpB,YACAV,CACD,CACD,EAEA,KAAQ,WAAa,MACpBS,EACA,CAAE,YAAAT,CAAY,EAAsC,CAAC,IACZ,CACzC,IAAMO,EAAM,MAAM,KAAK,IACtB,QACCD,GACOA,EAAM,IAAIG,CAAE,EAEpB,WACAT,CACD,EACA,GAAKO,EAGL,OAAOA,CACR,EAEA,aAAU,MACTE,EACA,CAAE,YAAAT,CAAY,EAAsC,CAAC,IACV,CAC3C,IAAMO,EAAM,MAAM,KAAK,WAAWE,EAAI,CAAE,YAAAT,CAAY,CAAC,EACrD,GAAKO,EAGL,OAAO,KAAK,gBAAgBA,CAAG,CAChC,EAgBA,uBAAoB,MACnBE,EACA,CAAE,YAAAT,CAAY,EAAsC,CAAC,IACjD,CACJ,IAAMU,EAAU,MAAM,KAAK,WAAWD,EAAI,CAAE,YAAAT,CAAY,CAAC,EAEzD,GAAI,CAACU,EACJ,MAAM,IAAI,MAAM,+BAA+B,EAGhD,OAAO,KAAK,IACX,QACCJ,GACOA,EAAM,IAAI,CAChB,GAAGI,EACH,UAAW,KAAK,IAAI,CACrB,CAAmB,EAEpB,YACAV,CACD,CACD,EAEA,kBAAe,UACF,MAAM,KAAK,IACtB,QACCM,GACOA,EAAM,MAAM,QAAQ,EAAE,OAAO,OAAO,EAE5C,UACD,GACW,IAAI,KAAK,eAAe,EAGpC,8BAA2B,CAC1BK,EACAX,IAEO,KAAK,QACX,QACCM,GACOA,EACL,MAAM,WAAW,EACjB,WAAW,YAAY,WAAW,EAAG,EAAI,CAAC,EAE7C,CAACM,EAAON,IAAU,CACjBK,EAAS,KAAK,gBAAgBC,CAAK,EAAGN,CAAK,CAC5C,EACA,YACAN,CACD,EAhED,WACCS,EACA,CAAE,YAAAT,CAAY,EAAsC,CAAC,EACpD,CACD,OAAO,KAAK,IACX,QACCM,GACOA,EAAM,OAAOG,CAAE,EAEvB,YACAT,CACD,CACD,CAsDD,EAEO,SAASQ,GAAkBN,EAAqBW,EAAc,CACpE,OAAO,IAAI,KAAK,CAACX,CAAM,EAAG,CAAE,KAAAW,CAAK,CAAC,CACnC,CCtLA,SAASC,GAAkBC,EAA4B,CACtD,OACCA,EAAS,YAAc,MACvBA,EAAS,UAAY,KAAK,IAAI,EAAI,IAAO,GAAK,GAAK,CAErD,CAYO,IAAMC,GAAN,KAAkB,CASxB,YAAY,CACX,GAAAC,EACA,KAAAC,EACA,QAAAC,EACA,KAAAC,EACA,OAAAC,EAAS,CAAC,CACX,EAMG,CAhBH,KAAQ,MAAQ,IAAI,IAgCpB,SAAM,MAAOC,GAAwC,CACpD,IAAMC,EAAOD,EAGb,GAFAC,EAAK,OAAS,GAET,KAAK,MAAM,IAAIA,EAAK,EAAE,EAK1B,KAAK,MAAM,IAAIA,EAAK,EAAE,EAAGC,EAAM,EAAED,CAAI,MALR,CAC7B,IAAME,EAAa,IAAIC,GAAWH,EAAK,EAAE,EACzCE,EAAWD,EAAM,EAAED,CAAI,EACvB,KAAK,MAAM,IAAIA,EAAK,GAAIE,CAAU,CACnC,CAIA,MAAM,KAAK,QAAQ,QAAQF,CAAI,EAE3BA,EAAK,QACO,MAAM,KAAK,KAAK,WAAWA,CAAI,GACnC,QACV,MAAM,KAAK,QAAQ,aAAaA,EAAK,EAAE,EAEvC,KAAK,QAAQ,IAAI,QAAS,uBAAuB,EAGpD,EAEA,KAAQ,WAAa,MAAOA,EAAgBI,EAAU,IAAM,CAC3D,IAAMC,EAAS,MAAM,KAAK,KAAK,WAAWL,CAAI,EAC1CK,EAAO,QACV,MAAM,KAAK,QAAQ,aAAaL,EAAK,EAAE,EAEnCK,EAAO,OAASD,EAAU,GAC7B,KAAK,QAAQ,IAAI,QAAS,mCAAmC,EAE7D,WAAW,KAAK,WAAY,IAAMJ,EAAMI,EAAU,CAAC,GAEnD,KAAK,QAAQ,IACZ,QACA,sDACD,CAGH,EAMA,SAAOE,GAAe,CACrB,GAAI,KAAK,MAAM,IAAIA,CAAE,EACpB,OAAO,KAAK,MAAM,IAAIA,CAAE,EAEzB,IAAMN,EAAO,IAAIG,GAAWG,CAAE,EAC9B,YAAK,MAAM,IAAIA,EAAIN,CAAI,EACvB,KAAK,KAAKA,CAAI,EACPA,CACR,EAEA,KAAQ,KAAO,MAAOA,EAAkBI,EAAU,IAAM,CACvD,GAAIA,EAAU,EAAG,CAChBJ,EAAKO,EAAW,EAAE,EAClB,MACD,CAEA,IAAMf,EAAW,MAAM,KAAK,QAAQ,QAAQQ,EAAK,EAAE,EACnD,GAAIR,EACHQ,EAAKC,EAAM,EAAET,CAAQ,MAGrB,IAAI,CACH,IAAMa,EAAS,MAAM,KAAK,KAAK,QAAQL,EAAK,EAAE,EAC1CK,EAAO,SACVL,EAAKC,EAAM,EAAEI,EAAO,IAAI,EACxB,MAAM,KAAK,QAAQ,QAAQA,EAAO,KAAM,CACvC,eAAgBL,EAAK,cACtB,CAAC,IAEDA,EAAKO,EAAW,EAAE,EACdF,EAAO,OAEV,WAAW,KAAK,KAAM,IAAML,EAAMI,EAAU,CAAC,EAGhD,OAASI,EAAK,CACb,KAAK,QAAQ,IAAI,QAAS,sBAAuBA,CAAG,EACpDR,EAAKO,EAAW,EAAE,EAElB,WAAW,KAAK,KAAM,IAAMP,EAAMI,EAAU,CAAC,CAC9C,CAEF,EAEA,kBAAe,SACP,KAAK,QAAQ,aAAa,EAGlC,KAAQ,eAAiB,MAAOK,GAAoB,CAEnD,GAAIA,EAAQ,CACX,IAAMC,EAAW,MAAM,KAAK,aAAa,EACzC,MAAM,QAAQ,IAAIA,EAAS,IAAI,KAAK,UAAU,CAAC,CAChD,CACD,EAEA,KAAQ,uBAAyB,SAAY,CAC5C,IAAIC,EAAQ,EACRC,EAAY,EAChB,MAAM,KAAK,QAAQ,yBAAyB,CAACpB,EAAUqB,IAAU,CAC5D,KAAK,OAAO,sBAAsBrB,CAAQ,GAC7CmB,IACAE,EAAM,OAAOrB,EAAS,EAAE,GAExBoB,GAEF,CAAC,EAED,KAAK,QAAQ,IACZ,OACA,cAAcD,CAAK,mBAAmBC,CAAS,QAChD,CACD,EAEA,KAAQ,sBAAwB,MAAOE,GAAwB,CAC9D,IAAMC,EAAK,KAAK,QAAQ,kBAAkB,CAAC,OAAO,EAAG,WAAW,EAChE,MAAM,QAAQ,IACbD,EAAS,IAAI,MAAOE,GAAY,CAC/B,GAAI,CACH,MAAM,KAAK,QAAQ,kBAAkBA,EAAQ,GAAI,CAAE,YAAaD,CAAG,CAAC,CACrE,OAASP,EAAK,CACb,KAAK,QAAQ,IAAI,QAAS,mCAAoCA,CAAG,CAClE,CACD,CAAC,CACF,EACA,KAAK,QAAQ,IACZ,OACA,UAAUM,EAAS,MAAM,0BAC1B,CACD,EAtJC,KAAK,QAAU,IAAIG,GAAYvB,CAAE,EACjC,KAAK,KAAOC,EACZ,KAAK,QAAUC,EACf,KAAK,KAAOC,EACZ,KAAK,OAAS,CACb,sBAAuBN,GACvB,GAAGO,CACJ,EAEA,KAAK,KAAK,UAAU,eAAgB,KAAK,cAAc,EACvD,KAAK,KAAK,UAAU,eAAgB,KAAK,qBAAqB,EAE9D,KAAK,uBAAuB,CAC7B,CA0ID,EC9KA,IAAMoB,GAAU,YACHC,GAAc,eA0DpB,SAASC,GACfC,EACAC,EACC,CACD,OAAOD,EAAOH,EAAO,EAAEI,CAAI,CAC5B,CA1FA,IAAAC,GAAAC,GAyGaC,GAAN,MAAMC,CAQb,CA0FC,YAAY,CACX,IAAAC,EACA,MAAAC,EACA,YAAAC,EACA,MAAAC,EACA,OAAAC,EACA,kBAAAC,EACA,aAAAC,EAAe,CAAC,CACjB,EAQG,CAxGH,KAAU,SAAuB,KAOjC,KAAU,SAAW,GAIrB,KAAQ,eAAsB,KAC9B,KAAQ,kBAAqC,KAC7C,KAAQ,oBAAqC,KAE7C,KAAQ,WAA4B,KAmHpC,KAASV,IAAYD,GAA2B,CAC/C,GAAM,CAAE,KAAAY,EAAM,QAAAC,EAAS,cAAAC,CAAc,EAAI,KAAK,MAAM,YAAY,KAAK,GAAG,EACxE,KAAK,SAAWF,EAChB,IAAMG,EAAW,KAAK,UAAY,CAACF,EACnC,KAAK,SAAWA,EAChB,KAAK,kBAAoB,KACzB,KAAK,WAAaC,GAAgC,KAClD,KAAK,oBAAsB,KAEvB,KAAK,SACR,KAAK,OAAO,KAAK,SAAUd,CAAI,GAE/B,KAAK,OAAO,KAAK,SAAUA,CAAI,EAC/B,KAAKH,EAAW,EAAE,KAAqCG,CAAI,GAExDe,IACH,KAAK,eAAiB,KACtB,KAAK,OAAO,KAAK,UAAWf,CAAI,EAElC,EAEA,KAASE,IAAe,CACvBc,EACAhB,IACI,CACJ,KAAK,eAAiB,KACtB,KAAK,oBAAsB,KAC3B,KAAK,OAAO,KAAK,aAAcgB,EAAQhB,CAAI,EAC3C,IAAMS,EAAS,KAAK,QAAQ,MAAM,EAC9BA,GACHA,EAAOZ,EAAW,EAAEmB,EAAQhB,CAAI,CAElC,EAEA,KAAU,oBAAuBiB,GAAa,CAC7C,GAAI,KAAK,YAAY,OAAS,SAC7B,OAAO,KAAK,YAAY,WAAWA,CAAG,EAChC,GAAI,KAAK,YAAY,OAAS,QACpC,OAAO,KAAK,YAAY,MAClB,GAAI,KAAK,YAAY,OAAS,MACpC,OAAO,KAAK,YAAY,OAClB,GAAI,KAAK,YAAY,OAAS,MACpC,OAAO,KAAK,YAEb,MAAM,IAAI,MAAM,sBAAsB,CACvC,EAEA,aAAU,IAAM,CACf,KAAK,OAAO,QAAQ,CACrB,EAEA,eAAY,CACXC,EACAC,IAEoB,KAAK,OAAO,UAAUD,EAAOC,CAAQ,EAK1D,KAAU,WAAcC,GAAyB,CAChD,KAAK,MAAM,mBAAmBA,CAAO,CACtC,EAEA,KAAU,aAAe,IAAM,CAC9B,GAAI,KAAK,WAAa,OAGtB,OAAOC,GAAU,KAAK,QAAQ,CAC/B,EAEA,KAAU,aAAe,CACxBhB,EACAY,IACsB,CACtB,IAAMV,EAAc,KAAK,oBAAoBU,CAAG,EAIhD,OAAO,KAAK,MAAM,UAAUZ,EAAKE,EAAa,IAAI,CACnD,EAEA,KAAU,UAAY,CACrBe,EACAL,IACmB,CACnB,GAAIM,GAAYD,CAAK,EAAG,CACvB,IAAMjB,EAAMiB,EAAM,GACZE,EAAY,KAAK,aAAanB,EAAKY,CAAG,EAC5C,GAAIO,EACH,OAAOA,EAER,MAAM,IAAI,MACT,yBAAyBnB,CAAG,sBAAsB,KAAK,GAAG,EAC3D,CACD,SAAWoB,GAAUH,CAAK,EAAG,CAC5B,IAAMI,EAAO,KAAK,MAAM,QAAQJ,EAAM,EAAE,EACxC,GAAII,EACH,OAAAA,EAAK,UAAU,SAAU,IAAM,CAC9B,KAAK7B,EAAW,EAAE,KAAM,CACvB,QAAS,EACV,CAAC,CACF,CAAC,EACM6B,CAET,CACA,OAAOJ,CACR,EAEA,KAAU,kBAAoB,CAACA,EAAYL,IAAa,CAejDK,aAAiB,OACtBA,EAAQD,GAAUC,EAAO,EAAK,GAE/B,IAAMf,EAAc,KAAK,oBAAoBU,CAAG,EAChD,OAAIV,GACHoB,GAAyCL,EAAOf,CAAW,EAErDqB,GAAkBN,EAAO,KAAK,MAAM,OAAO,CACnD,EAEA,SAAmCL,GAA4B,CAC9D,GAAI,KAAK,QAAU,QAAa,KAAK,QAAU,KAC9C,MAAM,IAAI,MAAM,8BAA8B,EAG/C,IAAMK,EAAQ,KAAK,MAAML,CAAG,EAC5B,OAAO,KAAK,UAAUK,EAAOL,CAAG,CACjC,EAEA,YAAS,IAAgB,CACxB,GAAI,KAAK,QAAU,QAAa,KAAK,QAAU,KAC9C,MAAM,IAAI,MAAM,8BAA8B,EAG/C,GAAI,KAAK,kBAAmB,OAAO,KAAK,kBAExC,IAAIY,EACJ,GAAI,MAAM,QAAQ,KAAK,KAAK,EAC3BA,EAAS,KAAK,MAAM,IAAI,CAACP,EAAOQ,IAC/B,KAAK,UAAUR,EAAOQ,CAAY,CACnC,MACM,CACND,EAAS,CAAC,EACV,QAAWZ,KAAO,KAAK,MACtBY,EAAOZ,CAAU,EAAI,KAAK,IAAIA,CAAU,CAE1C,CACA,YAAK,kBAAoBY,EAClBA,CACR,EAiBA,iBAAc,IAAW,CAIxB,GAHI,CAAC,KAAK,OAGN,KAAK,QACR,OAAO,KAER,GAAI,KAAK,eACR,OAAO,KAAK,eAEb,IAAIE,EACJ,GAAI,MAAM,QAAQ,KAAK,KAAK,EAC3BA,EAAW,KAAK,MAAM,IAAI,CAACC,EAAMC,IAC5BV,GAAYS,CAAI,EACZ,KAAK,aAAaA,EAAK,GAAIC,CAAG,GAAG,YAAY,EAC1CR,GAAUO,CAAI,EACjB,KAAK,gBAAgBA,CAAI,EAE1BA,CACP,MACK,CACND,EAAW,CAAE,GAAG,KAAK,KAAM,EAC3B,OAAW,CAACd,EAAKK,CAAK,IAAK,OAAO,QAAQS,CAAQ,EAC7CR,GAAYD,CAAK,EACpBS,EAASd,CAAG,EAAI,KAAK,aAAaK,EAAM,GAAIL,CAAG,GAAG,YAAY,EACpDQ,GAAUH,CAAK,IACzBS,EAASd,CAAG,EAAI,KAAK,gBAAgBK,CAAK,EAG7C,CAEA,OAAAY,EAAUH,EAAU,KAAK,GAAG,EAC5B,KAAK,eAAiBA,EACfA,CACR,EAKA,UAAO,IACC,OAAO,KAAK,KAAK,OAAS,CAAC,CAAC,EAEpC,aAAU,IACF,OAAO,QAAQ,KAAK,OAAO,CAAC,EAEpC,YAAS,IACD,OAAO,OAAO,KAAK,OAAO,CAAC,EAEnC,SAAM,CAAyBd,EAAUK,IAAqB,CAC7D,GAAI,KAAK,aAAa,SAASL,CAAG,EACjC,MAAM,IAAI,MAAM,2BAA2BA,EAAI,SAAS,CAAC,EAAE,EAE5D,KAAK,WACJ,KAAK,MAAM,aAAa,UACvB,KAAK,IACLA,EACA,KAAK,kBAAkBK,EAAOL,CAAG,CAClC,CACD,CACD,EACA,YAAUA,GAAa,CACtB,GAAI,MAAM,QAAQ,KAAK,KAAK,EAC3B,KAAK,WACJ,KAAK,MAAM,aAAa,iBAAiB,KAAK,IAAKA,EAAe,CAAC,CACpE,MACM,CAEN,IAAMkB,EAAa,KAAK,cAAclB,CAAG,EACzC,GAAI,CAACkB,EACJ,MAAM,IAAI,MACT,qBAAqBlB,CAAG,yDACzB,EAEGkB,IAAe,SAClB,KAAK,WAAW,KAAK,MAAM,aAAa,aAAa,KAAK,IAAKlB,CAAG,CAAC,EAEnE,KAAK,WAAW,KAAK,MAAM,aAAa,UAAU,KAAK,IAAKA,EAAK,IAAI,CAAC,CAExE,CACD,EACA,KAAQ,cAAiBA,GAAa,CACrC,GAAI,KAAK,aAAa,SAASA,CAAG,EACjC,MAAO,GAGR,GAAI,KAAK,YAAY,OAAS,OAAS,KAAK,YAAY,OAAS,MAChE,MAAO,SAGR,GAAI,KAAK,YAAY,OAAS,SAAU,CACvC,IAAMmB,EAAW,KAAK,YAAY,WAAWnB,CAAG,EAMhD,GALI,CAACmB,GAKDA,EAAS,OAAS,MAAO,MAAO,SAGpC,GAAIA,EAAS,OAAS,MAAO,MAAO,GAEpC,GAAIA,EAAS,SAAU,MAAO,MAC/B,CAEA,MAAO,EACR,EAEA,YAAS,KAAK,OAAO,KAAK,IAAI,EAE9B,YAAS,CACRd,EACA,CACC,kBAAAe,EAAoB,GACpB,MAAAC,EAAQ,EACT,EAAsD,CAKrD,kBAAmB,GAInB,MAAO,EACR,IACI,CACJ,GACC,CAACA,GACD,KAAK,YAAY,OAAS,OAC1B,KAAK,YAAY,OAAS,MAE1B,MAAM,IAAI,MACT,iIACD,EAED,OAAW,CAACrB,EAAKsB,CAAK,IAAK,OAAO,QAAQjB,CAAK,EAAG,CACjD,GAAI,KAAK,aAAa,SAASL,CAAU,EACxC,MAAM,IAAI,MAAM,2BAA2BA,EAAI,SAAS,CAAC,EAAE,EAE5D,IAAMV,EAAc,KAAK,oBAAoBU,CAAG,EAC5CV,GACHoB,GAAyCY,EAAOhC,CAAW,CAE7D,CACA,IAAMiC,EAAeZ,GAAkBN,EAAO,KAAK,MAAM,OAAO,EAChE,KAAK,WACJ,KAAK,MAAM,aAAa,WACvB,KAAK,YAAY,EACjBY,EAAUM,EAAc,KAAK,GAAG,EAChC,CACC,oBAAqB,CAACH,EACtB,iBAAkBC,CACnB,CACD,CACD,CACD,EAYA,KAAQ,gBAAmBN,GAAkC,CAC5D,GAAI,OAAOA,GAAS,SAAU,CAC7B,IAAMS,EAAUC,GAAYV,CAAI,EAChC,GAAI,CAACS,GAAW,CAAC,KAAK,MAAM,OAAOA,CAAO,EACzC,MAAM,IAAI,MACT,sBAAsB,KAAK,UAC1BT,CACD,CAAC,oCACF,EAED,OAAOS,CACR,KACC,QAAOT,CAET,EAMA,UAAQV,GAA8B,CACrC,KAAK,WACJ,KAAK,MAAM,aAAa,eACvB,KAAK,IACL,KAAK,kBAAkBA,EAAO,KAAK,MAAM,MAAM,CAChD,CACD,CACD,EACA,YAAS,CAACQ,EAAeR,IAA8B,CACtD,KAAK,WACJ,KAAK,MAAM,aAAa,iBACvB,KAAK,IACLQ,EACA,KAAK,kBAAkBR,EAAOQ,CAAK,CACpC,CACD,CACD,EACA,UAAO,CAACa,EAAcC,IAAe,CACpC,KAAK,WACJ,KAAK,MAAM,aAAa,sBAAsB,KAAK,IAAKD,EAAMC,CAAE,CACjE,CACD,EACA,cAAW,CAACZ,EAA+BY,IAAe,CACzD,IAAMC,EAAU,KAAK,gBAAgBb,CAAI,EACzC,GAAIT,GAAYsB,CAAO,EACtB,KAAK,WACJ,KAAK,MAAM,aAAa,oBAAoB,KAAK,IAAKA,EAASD,CAAE,CAClE,MACM,CACN,IAAMd,EAAQ,KAAK,MAAM,QAAQe,CAAO,EACxC,KAAK,WACJ,KAAK,MAAM,aAAa,sBAAsB,KAAK,IAAKf,EAAOc,CAAE,CAClE,CACD,CACD,EACA,eAAaZ,GAAkC,CAC9C,KAAK,WACJ,KAAK,MAAM,aAAa,iBACvB,KAAK,IACL,KAAK,gBAAgBA,CAAI,CAC1B,CACD,CACD,EACA,iBAAeA,GAAkC,CAChD,KAAK,WACJ,KAAK,MAAM,aAAa,iBACvB,KAAK,IACL,KAAK,gBAAgBA,CAAI,EACzB,OACD,CACD,CACD,EACA,gBAAcA,GAAkC,CAC/C,KAAK,WACJ,KAAK,MAAM,aAAa,iBACvB,KAAK,IACL,KAAK,gBAAgBA,CAAI,EACzB,MACD,CACD,CACD,EACA,SAAOA,GAAkC,CACxC,KAAK,WACJ,KAAK,MAAM,aAAa,cACvB,KAAK,IACL,KAAK,kBAAkBA,EAAM,KAAK,MAAM,MAAM,CAC/C,CACD,CACD,EACA,SAAOA,GACF,OAAOA,GAAS,SACZ,KAAK,MAAM,KAAMc,GACnBvB,GAAYuB,CAAG,EAAUA,EAAI,KAAOJ,GAAYV,CAAI,GAGpDP,GAAUqB,CAAG,EAAU,GAE3B,EAEK,KAAK,MAAM,SAASd,CAAI,EAyBhC,KAAQ,aAAe,IAAiC,CACvD,GAAI,CAAC,KAAK,OAAQ,MAAM,IAAI,MAAM,gCAAgC,EAClE,OAAO,KAAK,MAAM,IAAI,KAAK,SAAS,CACrC,EAEA,SAAUb,GACF,KAAK,aAAa,EAAE,IAAIA,CAAQ,EAGxC,YACCA,GAEO,KAAK,aAAa,EAAE,OAAO,CAAC2B,EAAKhB,IAChCX,EAAS2B,EAAKhB,CAAK,CAC1B,EAGF,aACCX,GACI,CACJ,KAAK,aAAa,EAAE,QAAQA,CAAQ,CACrC,EAEA,UAAQ4B,GACA,KAAK,aAAa,EAAE,KAAKA,CAAS,EAG1C,WAASA,GACD,KAAK,aAAa,EAAE,MAAMA,CAAS,EAG3C,UAAQA,GACA,KAAK,aAAa,EAAE,KAAKA,CAAS,EAG1C,cAAYf,GACJ,KAAK,IAAIA,CAAI,EAphBpB,KAAK,IAAM3B,EACX,GAAM,CAAE,WAAA2C,CAAW,EAAIC,GAAa5C,CAAG,EACvC,KAAK,WAAa2C,EAClB,KAAK,MAAQ1C,EACb,KAAK,YAAcC,EACnB,KAAK,aAAeI,EACpB,KAAK,MAAQH,EACb,KAAK,OAASC,GAAU,KAAK,MAAM,QAAQA,CAAM,EACjD,GAAM,CAAE,KAAAG,EAAM,QAAAC,EAAS,cAAAC,CAAc,EAAI,KAAK,MAAM,YAAYT,CAAG,EAWnE,GAVA,KAAK,SAAWO,EAChB,KAAK,SAAWC,EAChB,KAAK,WAAaC,GAAgC,KAClD,KAAK,oBAAsB,KAC3B,KAAK,OAAS,IAAIoC,EAA8B,IAAM,CAChD,KAAK,gBACTxC,IAAoB,CAEtB,CAAC,EAEG,KAAK,IAAI,SAAS,GAAG,GAAK,CAAC,KAAK,OACnC,MAAM,IAAI,MAAM,0CAA0C,EAE3DyC,EAAO,CAAC,CAAC5C,EAAa,+BAA+B,CACtD,CA7GU,6BAA8B,CACvC,OAAO,KAAK,OAAO,gBAAgB,YAAY,EAAI,CACpD,CAEA,IAAI,gBAAiB,CACpB,GAAI,KAAK,OAAO,qBAAqB,EAAI,EACxC,MAAO,GAKR,IAAIE,EAAS,KAAK,QAAQ,MAAM,EAChC,KAAOA,GAAQ,CACd,GAAIA,EAAO,4BAA4B,EACtC,MAAO,GAERA,EAASA,EAAO,QAAQ,MAAM,CAC/B,CAEA,MAAO,EACR,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,QACb,CAEA,IAAc,OAAQ,CACrB,OAAO,KAAK,QACb,CAEA,IAAI,QAAS,CACZ,OAAO,MAAM,QAAQ,KAAK,QAAQ,CACnC,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,UACb,CAEA,IAAI,eAAgB,CACnB,GAAI,KAAK,oBAAqB,OAAO,KAAK,oBAE1C,IAAI2C,EAAwB,KAAK,WACjC,OAAI,KAAK,OACR,KAAK,QAASC,GAAU,CACvB,GAAKA,aAAyBjD,EAAQ,CACrC,IAAMkD,EAAiBD,EAAM,cACzBC,IAAmB,CAACF,GAAUE,EAAiBF,KAClDA,EAASE,EAEX,CACD,CAAC,EAED,KAAK,OAAO,EAAE,QAASD,GAAU,CAChC,GAAKA,aAAyBjD,EAAQ,CACrC,IAAMkD,EAAiBD,EAAM,cACzBC,IAAmB,CAACF,GAAUE,EAAiBF,KAClDA,EAASE,EAEX,CACD,CAAC,EAEF,KAAK,oBAAsBF,EACpBA,CACR,CAEA,IAAI,KAAM,CACT,OAAO,KAAK,GACb,CAiNQ,gBAAgBpB,EAAe,CACtC,IAAMN,EAAO,KAAK,MAAM,QAAQM,EAAK,EAAE,EACvC,OAAIN,EAAK,IACD,CAAE,GAAIM,EAAK,GAAI,IAAKN,EAAK,GAAI,EAC1BA,EAAK,SAAWA,EAAK,OACxB,CAAE,GAAIM,EAAK,GAAI,IAAK,MAAU,EAE9B,CAAE,GAAIA,EAAK,GAAI,IAAK,IAAK,CAElC,CA6LA,IAAI,QAAS,CACZ,OAAO,KAAK,MAAM,MACnB,CAsFA,EAncS/B,GAAAL,GAqBAM,GAAAL,GA8aR,OAAO,SAAQ,GAAI,CACnB,IAAIiC,EAAQ,EACZ,MAAO,CACN,KAAM,IACDA,EAAQ,KAAK,MAAM,OACf,CACN,MAAO,KAAK,IAAIA,GAAO,EACvB,KAAM,EACP,EAEM,CACN,MAAO,OACP,KAAM,EACP,CAEF,CACD,CA0CD,EClvBO,IAAMyB,GAAN,KAAoB,CAK1B,aAAc,CACb,IAAIC,EACAC,EACJ,KAAK,QAAU,IAAI,QAAQ,CAACC,EAAKC,IAAQ,CACxCH,EAAUE,EACVD,EAASE,CACV,CAAC,EACD,KAAK,SAAWH,EAChB,KAAK,QAAUC,CAChB,CAEA,QAAQG,EAAU,CACjB,KAAK,SAASA,CAAK,CACpB,CAEA,OAAOC,EAAc,CACpB,KAAK,QAAQA,CAAM,CACpB,CACD,ECQO,IAAMC,GAAN,cAAkCC,CAIvC,CAmBD,YAAY,CACX,IAAAC,EACA,MAAAC,EACA,QAAAC,CACD,EAIG,CACF,MAAM,EAtBP,KAAQ,SAAmD,IAAI,IAK/D,KAAQ,aAAe,IAAIC,GAI3B,oBAAiB,IAAM,CACtB,KAAK,aAAa,QAAQ,EAAI,CAC/B,EA+BA,2BAAyBC,GAA4B,CACpD,IAAMC,EAAS,IAAI,IACnB,QAAWC,KAAaF,EAAY,CACnC,GAAM,CAAE,IAAAJ,CAAI,EAAIM,EAChBD,EAAO,IAAIL,CAAG,EACd,IAAMO,EAAqB,KAAK,mBAAmB,IAAIP,CAAG,GAAK,CAAC,EAChEO,EAAmB,KAAKD,CAAS,EACjC,KAAK,mBAAmB,IAAIN,EAAKO,CAAkB,CACpD,CACA,QAAWP,KAAOK,EAAQ,CAEzB,IAAMG,EADY,KAAK,SAAS,IAAIR,CAAG,GACb,MAAM,EAC5BQ,IACHC,GAAcD,EAAQ,CAAE,QAAS,EAAK,CAAC,EACvC,KAAK,KAAK,UAAUR,CAAG,EAAE,EACzB,KAAK,KAAK,WAAYA,CAAG,EAE3B,CACD,EAEA,sBAAmB,CAClBI,EACAM,IAII,CACJ,QAAWJ,KAAaF,EAAY,CACnC,GAAM,CAAE,IAAAJ,CAAI,EAAIM,EAChBI,EAAK,cAAc,IAAIV,CAAG,EAC1B,IAAMO,EAAqB,KAAK,cAAc,IAAIP,CAAG,GAAK,CAAC,EAErDW,EAAQJ,EAAmB,UAC/BK,GAAOA,EAAG,WAAaN,EAAU,SACnC,EAEA,GAAIK,IAAU,GAAI,CACjB,GAAIJ,EAAmBI,CAAK,EAAE,YAAcL,EAAU,UACrD,SAEDC,EAAmB,OAAOI,EAAO,EAAGL,CAAS,CAC9C,MACCC,EAAmB,KAAKD,CAAS,EAElC,KAAK,cAAc,IAAIN,EAAKO,CAAkB,EAG9C,IAAMM,EAAwB,KAAK,mBAAmB,IAAIb,CAAG,EACzDa,GACH,KAAK,mBAAmB,IACvBb,EACAa,EAAsB,OACpBD,GAAOA,EAAG,YAAcN,EAAU,SACpC,CACD,CAEF,CACD,EAMA,qBAAkB,CACjBQ,EACA,CACC,aAAAC,CACD,IACI,CACJ,QAAWC,KAAYF,EAAW,CACjC,GAAM,CAAE,IAAAd,CAAI,EAAIgB,EAEVC,EAAW,KAAK,aAAa,IAAIjB,CAAG,EAC1C,GAAIiB,GAAU,WAAaA,EAAS,WAAaD,EAAS,UACzD,SAGDD,GAAc,IAAIf,CAAG,EACrB,KAAK,aAAa,IAAIA,EAAKgB,CAAQ,EAEnC,IAAME,EAAM,KAAK,cAAc,IAAIlB,CAAG,GAAK,CAAC,EAC5C,KAAOkB,EAAI,CAAC,GAAG,UAAYF,EAAS,WACnCE,EAAI,MAAM,CAEZ,CACD,EAEA,aAAU,CAAC,CACV,WAAAd,EACA,UAAAU,EACA,MAAAK,EACA,QAAAC,CACD,IAKM,CACDD,IACH,KAAK,cAAc,MAAM,EACzB,KAAK,aAAa,MAAM,GAEzB,IAAMT,EAAO,CACZ,QAASU,GAAW,GACpB,aAAc,IAAI,GACnB,EAKA,GAJA,KAAK,gBAAgBN,EAAWJ,CAAI,EAGpC,KAAK,iBAAiBN,EAAYM,CAAI,EAClCS,EACH,QAAWE,KAAa,KAAK,SAAS,OAAO,EAAG,CAC/C,IAAMb,EAASa,EAAU,MAAM,EAC3Bb,GACHC,GAAcD,EAAQE,CAAI,CAE5B,KAEA,SAAWV,KAAOU,EAAK,aAAc,CAEpC,IAAMF,EADY,KAAK,SAAS,IAAIR,CAAG,GACb,MAAM,EAC5BQ,IACHC,GAAcD,EAAQE,CAAI,EAC1B,KAAK,KAAK,UAAUV,CAAG,EAAE,EACzB,KAAK,KAAK,WAAYA,CAAG,EAE3B,CAEF,EAEA,KAAQ,gBAAkB,CACzBsB,EACAC,EACAnB,EACAoB,IAKI,CACJ,IAAIC,EACEC,EAAM,KAAK,WAAW,IAC5B,QAAWpB,KAAaF,EACvB,GAAI,EAAAoB,GAASlB,EAAU,WAAakB,GAGpC,IAAIG,GAA+BrB,EAAU,UAAWoB,CAAG,EAAI,EAAG,CAEjED,EAAanB,EAAU,UACvB,QACD,CACIA,EAAU,KAAK,KAAO,SACzBiB,EAAU,IAEVD,EAAOM,GAAWN,EAAMhB,EAAU,IAAI,EAClCA,EAAU,KAAK,KAAO,eACzBiB,EAAU,KAIb,OAAIE,GACH,KAAK,QAAQ,aAAa,KAAK,aAAcA,CAAU,EAEjD,CAAE,KAAAH,EAAM,QAAAC,EAAS,MAAO,CAACD,GAAQ,CAAClB,EAAW,MAAO,CAC5D,EAEA,iBAAeJ,GAA0B,CACxC,GACC,KAAK,aAAa,OAAS,GAC3B,KAAK,cAAc,OAAS,GAC5B,KAAK,mBAAmB,OAAS,EAEjC,YAAK,QAAQ,IAAI,QAAS,UAAUA,CAAG,+BAA+B,EAC/D,CAAE,KAAM,KAAM,QAAS,GAAM,cAAe,IAAK,EAEzD,IAAM6B,EAAY,KAAK,qBAAqB7B,CAAG,EACzCa,EAAwB,KAAK,mBAAmB,IAAIb,CAAG,GAAK,CAAC,EACnE,GAAI6B,EAAU,OAAS,CAAChB,EAAsB,OAC7C,YAAK,QAAQ,IACZ,QACA,UAAUb,CAAG,qCACd,EACO,CAAE,KAAM,KAAM,QAAS,GAAM,cAAe,IAAK,EAEzD,GAAI,CAAE,KAAAsB,EAAM,QAAAC,CAAQ,EAAI,KAAK,gBAC5BM,EAAU,KACVA,EAAU,QACVhB,CACD,EACA,OAAIS,GACHQ,EAAUR,EAAMtB,CAAG,EAEb,CAAE,KAAAsB,EAAM,QAAAC,EAAS,cAAe,KAAK,iBAAiBvB,CAAG,CAAE,CACnE,EAEA,0BACCA,GAKI,CACJ,IAAMgB,EAAW,KAAK,aAAa,IAAIhB,CAAG,EACpCI,EAAa,KAAK,cAAc,IAAIJ,CAAG,GAAK,CAAC,EAC7C+B,EAAWC,GAAUhB,GAAU,UAAY,MAAS,EACpDiB,EAAS,KAAK,gBACnBF,EACA,CAACA,EACD3B,EACAY,GAAU,SACX,EACA,OAAIiB,EAAO,MACVH,EAAUG,EAAO,KAAMjC,CAAG,EAEvBiC,EAAO,OACV,KAAK,QAAQ,IACZ,QACA,UAAUjC,CAAG,kCACd,EAEMiC,CACR,EAEA,sBAAoBjC,GAA0B,CAC7C,IAAII,EAAa,KAAK,mBAAmB,IAAIJ,CAAG,EAC3CI,GAAY,SAChBA,EAAa,KAAK,cAAc,IAAIJ,CAAG,GAAK,CAAC,GAE9C,IAAIkC,EAAkC,KAMtC,OALI9B,EAAW,OACd8B,EAAmB9B,EAAWA,EAAW,OAAS,CAAC,GAAG,UAEtD8B,EAAmB,KAAK,aAAa,IAAIlC,CAAG,GAAG,WAAa,KAExDkC,EACE,KAAK,WAAW,KAAK,iBAAiBA,CAAgB,EAD/B,IAE/B,EAEA,eAAY,CACXlC,EACAmC,EACAC,EACAC,IACY,CAEZ,IAAI7B,EADY,KAAK,SAAS,IAAIR,CAAG,GACb,MAAM,EAC9B,OAAKQ,IACJA,EAAS,IAAI8B,GAAO,CACnB,IAAAtC,EACA,MAAO,KACP,YAAamC,EACb,MAAO,KAAK,WACZ,OAAAC,EACA,aAAAC,CACD,CAAC,EAGD,KAAK,SAAS,IAAIrC,EAAK,KAAK,QAAQ,QAAQQ,CAAM,CAAC,GAG7CA,CACR,EAEA,YAAUR,GACF,KAAK,cAAc,IAAIA,CAAG,GAAK,KAAK,aAAa,IAAIA,CAAG,EAGhE,aAAU,IAAM,CACf,KAAK,SAAS,QAASQ,GAAWA,EAAO,MAAM,GAAG,QAAQ,CAAC,EAC3D,KAAK,SAAS,MAAM,CACrB,EAEA,WAAQ,CAAC,CACR,WAAAJ,EACA,UAAAU,EACA,wBAAyByB,EAAkB,GAC3C,sBAAA1B,EACA,QAAA2B,CACD,IAgBM,CACL,KAAK,QAAQ,IACZ,QACA,uBAAuB,KAAK,GAAG,SAASpC,EAAW,MAAM,YAAYU,EAAU,MAAM,+BAA+ByB,CAAe,EACpI,EACA,IAAM7B,EAAO,CAAE,QAAS,GAAO,aAAc,IAAI,GAAwB,EAUrE8B,GAAS,KAAK,aAAa,MAAM,EACrC,KAAK,gBAAgB1B,EAAWJ,CAAI,EAEhC8B,GAAS,KAAK,cAAc,MAAM,EACtC,KAAK,iBAAiBpC,EAAYM,CAAI,GAElCG,GAAyB0B,KAC5B,KAAK,mBAAmB,MAAM,EAC1B1B,GACH,KAAK,sBAAsBA,CAAqB,GAIlD,QAAWb,KAAO,KAAK,SAAS,KAAK,EAAG,CAEvC,IAAMQ,EADY,KAAK,SAAS,IAAIR,CAAG,GACb,MAAM,EAC5BQ,IACHC,GAAcD,EAAQE,CAAI,EAC1B,KAAK,KAAK,UAAUV,CAAG,EAAE,EACzB,KAAK,KAAK,WAAYA,CAAG,EAE3B,CACD,EA9VC,KAAK,IAAMA,EACX,KAAK,cAAgB,IAAI,IACzB,KAAK,mBAAqB,IAAI,IAC9B,KAAK,aAAe,IAAI,IACxB,KAAK,WAAa,CACjB,mBAAoBC,EAAM,mBAC1B,aAAcA,EAAM,KAAK,aACzB,QAASA,EAAM,MAAM,IACrB,QAASA,EAAM,MAAM,IACrB,KAAMA,EAAM,KAAK,KACjB,IAAKA,EAAM,KAAK,GACjB,EACA,KAAK,QAAUC,CAChB,CA9BA,IAAI,oBAAqB,CACxB,OAAO,KAAK,aAAa,OAC1B,CA8BA,IAAI,SAAU,CACb,OAAO,KAAK,QAAQ,OACrB,CA8UD,EChYA,IAAMuC,GAAoB,YAQbC,GAAN,KAAkB,CA6BxB,YAAY,CACX,QAAAC,EACA,KAAAC,EACA,aAAAC,EAAe,IACf,MAAAC,CACD,EAKG,CAtCH,KAAQ,qBAAuB,IAAI,IAQnC,KAAQ,aAA+B,CAAC,EAExC,KAAQ,UAAY,GAepB,KAAQ,gBAAkBL,GAiC1B,gBAAcE,GAAqB,CAClC,KAAK,QAAUA,CAChB,EAEA,KAAQ,kBACPI,GACyE,CACzE,GAAM,CAAE,WAAAC,CAAW,EAAIC,GAAaF,CAAG,EACvC,GAAI,CAAC,KAAK,OAAO,YAAYC,CAAU,EACtC,YAAK,IAAI,OAAQ,kCAAkCA,CAAU,EAAE,EACxD,CAAE,OAAQ,KAAM,aAAc,CAAC,CAAE,EAEzC,IAAME,EAAS,KAAK,OAAO,YAAYF,CAAU,EACjD,MAAO,CACN,aAAc,CAACE,EAAO,UAAU,EAChC,OAAQ,CACP,KAAM,SACN,WAAYA,EAAO,MACpB,CACD,CACD,EAEA,KAAQ,mBAAqB,MAC5BC,EACAC,EAAkB,GAClBC,EAAU,KACN,CAEJ,GAAI,KAAK,UAAW,CACnB,KAAK,QAAQ,IACZ,QACA,2CAA2CF,EAAY,GAAG,QAC3D,EACA,MACD,CAGA,IAAMG,EAAc,KAAK,KAAK,kBAAkB,CAC/C,YACA,YACD,CAAC,EAEKC,EAAgC,CAAC,EACjCC,EAAgC,CAAC,EAEvC,MAAM,QAAQ,IAAI,CACjB,KAAK,KAAK,UAAU,0BACnBL,EAAY,IACXM,GAAa,CACbF,EAAU,KAAKE,CAAQ,CACxB,EACA,CACC,YAAAH,EACA,KAAM,WACP,CACD,EACA,KAAK,KAAK,WAAW,oCACpBH,EAAY,IACXO,GAAO,CACNA,EAAuB,UAAY,GACpCF,EAAW,KAAKE,CAAqB,CACtC,EACA,CAAE,YAAAJ,EAAa,KAAM,WAAY,CAClC,CACD,CAAC,EACDH,EAAY,MAAM,CACjB,WAAAK,EACA,UAAAD,EACA,wBAAyBH,EACzB,QAAAC,CACD,CAAC,CACF,EAEA,KAAQ,gBAAkB,MAAON,GAA0B,CAC1D,IAAMY,EAAcC,EAAWb,CAAG,EAC9BI,EAAc,KAAK,qBAAqB,IAAIQ,CAAW,EAC3D,OAAKR,IACJ,KAAK,QAAQ,IAAI,QAAS,2BAA4BQ,CAAW,EAEjER,EAAc,IAAIU,GAAoB,CACrC,IAAKF,EACL,MAAO,KACP,QAAS,KAAK,OACf,CAAC,EAaD,KAAK,qBAAqB,IAAIA,EAAaR,CAAW,EACtD,MAAM,KAAK,mBAAmBA,CAAW,EACzCA,EAAY,eAAe,GAQ5B,MAAMA,EAAY,mBAEXA,CACR,EAEA,KAAQ,eAAiB,MAAOJ,GAA0B,CAE1D,EAEA,KAAQ,uBAAyB,MAAOA,GAA0B,CACjE,GAAI,KAAK,UAAW,CACnB,KAAK,IAAI,OAAQ,iDAAiD,EAClE,MACD,CACA,IAAMe,EAAUF,EAAWb,CAAG,EACxB,CAAE,GAAAgB,EAAI,WAAAf,CAAW,EAAIC,GAAaa,CAAO,EACzCE,EAAS,MAAM,KAAK,IAAIF,CAAO,EAErC,GAAI,KAAK,UAAW,CACnB,KAAK,IAAI,OAAQ,iDAAiD,EAClE,MACD,CAEA,IAAMG,EAAWD,GAAQ,YAAY,EACrC,GAAIC,EAAU,CACb,IAAMC,EAASC,GACd,KAAK,OAAO,YAAYnB,CAAU,EAClCiB,CACD,EACA,GAAI,CAEH,IAAMG,EADK,KAAK,GAAG,YAAYpB,EAAY,WAAW,EACrC,YAAYA,CAAU,EACvC,MAAMqB,EAAoBD,EAAM,IAAIF,CAAM,CAAC,EAC3C,KAAK,IAAI,OAAQ,YAAM,QAASlB,EAAYe,EAAI,aAAcG,CAAM,CACrE,MAAc,CAGb,KAAK,IACJ,sLACA;AAAA,EACA,gBACA,KAAK,UAAUA,CAAM,CACtB,CACD,CACD,KAAO,CAEN,IAAME,EADK,KAAK,GAAG,YAAYpB,EAAY,WAAW,EACrC,YAAYA,CAAU,EACvC,MAAMqB,EAAoBD,EAAM,OAAOL,CAAE,CAAC,EAC1C,KAAK,IAAI,OAAQ,SAAK,UAAWf,EAAYe,EAAI,cAAc,CAChE,CACD,EAEA,SAAM,MAAOhB,GAA0B,CACtC,IAAMI,EAAc,MAAM,KAAK,gBAAgBJ,CAAG,EAC5C,CAAE,OAAAG,EAAQ,aAAAoB,CAAa,EAAI,KAAK,kBAAkBvB,CAAG,EAC3D,OAAKG,EAGEC,EAAY,UAAUJ,EAAKG,EAAQ,OAAWoB,CAAY,EAFzD,IAGT,EAOA,eAAavB,GAA0B,CACtC,IAAMwB,EAAQ,KAAK,qBAAqB,IAAIxB,CAAG,EAC/C,GAAIwB,EAAO,CACV,GAAM,CAAE,OAAArB,EAAQ,aAAAoB,CAAa,EAAI,KAAK,kBAAkBvB,CAAG,EAC3D,OAAKG,EAGEqB,EAAM,UAAUxB,EAAKG,EAAQ,OAAWoB,CAAY,EAFnD,IAGT,CACA,OAAO,IACR,EAMA,YAAS,MACRE,EACAzB,EACA0B,IACI,CAEJC,GAA4BF,CAAO,EAEnC,IAAMG,EAAYC,GAAkBJ,EAAS,KAAK,MAAM,GAAG,EAE3DK,EAAUF,EAAW5B,CAAG,EACxB,IAAMS,EAAa,KAAK,KAAK,aAAa,iBAAiBmB,EAAW5B,CAAG,EACnEI,EAAc,MAAM,KAAK,gBAAgBJ,CAAG,EAClDI,EAAY,sBAAsBK,CAAU,EAK5C,MAAM,KAAK,iBAAiBA,EAAYiB,CAAO,EAC/C,GAAM,CAAE,OAAAvB,EAAQ,aAAAoB,CAAa,EAAI,KAAK,kBAAkBvB,CAAG,EAC3D,GAAI,CAACG,EACJ,MAAM,IAAI,MACT,mCACCD,GAAaF,CAAG,EAAE,UACnB,+DACD,EAED,OAAOI,EAAY,UAAUJ,EAAKG,EAAQ,OAAWoB,CAAY,CAClE,EAEA,KAAQ,0BAA4B,MACnCd,EACAsB,IACI,CACJ,IAAMC,EAAkBC,GAAsBxB,CAAU,EAC3C,OAAO,KAAKuB,CAAe,EACnC,QAAShC,GAAQ,CACrB,IAAMI,EAAc,KAAK,qBAAqB,IAAIJ,CAAG,EACjDI,IACH,KAAK,IACJ,SACA2B,EAAK,UAAY,YAAc,cAC/B,sBACA/B,EACAgC,EAAgBhC,CAAG,EAAE,MACtB,EACI+B,EAAK,QACR3B,EAAY,sBAAsB4B,EAAgBhC,CAAG,CAAC,EAEtDI,EAAY,iBAAiB4B,EAAgBhC,CAAG,EAAG+B,CAAI,EAG1D,CAAC,CACF,EAEA,KAAQ,yBAA2B,MAClCvB,EACAuB,IACI,CACJ,IAAMG,EAAiBC,GAAwB3B,CAAS,EAC3C,OAAO,KAAK0B,CAAc,EAClC,QAASlC,GAAQ,CACrB,IAAMwB,EAAQ,KAAK,qBAAqB,IAAIxB,CAAG,EAC3CwB,IACH,KAAK,IACJ,SACA,qBACAxB,EACAkC,EAAelC,CAAG,EAAE,MACrB,EACAwB,EAAM,gBAAgBU,EAAelC,CAAG,EAAG+B,CAAI,EAEjD,CAAC,CACF,EAEA,KAAQ,oBAAsB,CAAC,CAC9B,UAAAvB,EACA,WAAAC,EACA,MAAA2B,EACA,QAAAC,CACD,IAKM,CACL,IAAMC,EAAyBH,GAAwB3B,CAAS,EAC1D+B,EAA0BN,GAAsBxB,CAAU,EAC1D+B,EAAkB,MAAM,KAC7B,IAAI,IACH,OAAO,KAAKF,CAAsB,EAAE,OACnC,OAAO,KAAKC,CAAuB,CACpC,CACD,CACD,EACA,QAAWvC,KAAOwC,EAAiB,CAClC,IAAMpC,EAAc,KAAK,qBAAqB,IAAIJ,CAAG,EACjDI,GACHA,EAAY,QAAQ,CACnB,WAAYmC,EAAwBvC,CAAG,GAAK,CAAC,EAC7C,UAAWsC,EAAuBtC,CAAG,GAAK,CAAC,EAC3C,MAAAoC,EACA,QAAAC,CACD,CAAC,EACD,KAAK,IACJ,QACA,0BACArC,EACAuC,EAAwBvC,CAAG,GAAG,QAAU,EACxC,aACAsC,EAAuBtC,CAAG,GAAG,QAAU,EACvC,WACD,GAEA,KAAK,IACJ,QACA,kCACAA,EACA,wBACD,CAEF,CAEA,OAAOwC,CACR,EAEA,aAAU,MAAO,CAChB,WAAA/B,EACA,UAAAD,EACA,MAAA4B,CACD,IAIM,CACL,GAAI,KAAK,UAAW,CACnB,KAAK,IAAI,OAAQ,0CAA0C,EAC3D,MACD,CAIA,IAAMK,EAAmBhC,EACzB,QAAWE,KAAM8B,EAChB9B,EAAG,UAAY,GAGhB,IAAI6B,EAA4B,CAAC,EAI7BJ,GACH,KAAK,IACJ,wDACA5B,EAAU,OACV,iBACAC,EAAW,OACX,YACD,EACA,MAAM,KAAK,KAAK,MAAM,EACtB,MAAM,KAAK,qBAAqB,EAChC+B,EAAkB,MAAM,KACvB,IAAI,IACHhC,EACE,IAAKkC,GAAM7B,EAAW6B,EAAE,GAAG,CAAC,EAC5B,OAAOjC,EAAW,IAAKkC,GAAM9B,EAAW8B,EAAE,GAAG,CAAC,CAAC,CAClD,CACD,GAGAH,EAAkB,KAAK,oBAAoB,CAC1C,WAAYC,EACZ,UAAAjC,EACA,MAAA4B,CACD,CAAC,EAIF,MAAM,KAAK,KAAK,sBAAsB5B,CAAS,EAC/C,MAAM,KAAK,KAAK,uBAAuBC,CAAU,EAE7C2B,GACH,MAAM,KAAK,iBAAiB,GAAM,EAAI,EAIvC,QAAWpC,KAAOwC,EACjB,MAAM,KAAK,uBAAuBxC,CAAG,EAItC,IAAM4C,EAAsB,MAAM,KACjC,IAAI,IACHJ,EAAgB,IAAKxC,GAAQE,GAAaF,CAAG,EAAE,UAAU,CAC1D,CACD,EACA,KAAK,QAAQ,IAAI,yBAA0B4C,CAAmB,EAC9D,KAAK,QAAQ,aAAa,KAAK,qBAAsBA,CAAmB,CACzE,EAEA,wBAAqB,MAAOnC,GAA4B,CACvD,KAAK,IAAI,0BAA2BA,EAAW,MAAM,EACrD,KAAK,0BAA0BA,EAAY,CAC1C,QAAS,GACT,UAAW,EACZ,CAAC,EACD,KAAK,iBAAiB,IAAI,CACzB,IAAK,KAAK,gBACV,MAAOA,CACR,CAAC,CACF,EAEA,WAAQ,CAAC,CACR,SAAAoC,EAAW,GACX,UAAAC,EAAYC,GAAW,EACvB,IAAAC,EAAM,KACN,QAAAC,EAAU,KAAK,mBAChB,EAKI,CAAC,IAAsB,CAC1B,IAAMC,EAAgB,KAAK,iBAAiB,IAAI,CAC/C,IAAKJ,EACL,IAAAE,EACA,QAAAC,EACA,MAAO,CAAC,EACR,SAAU,CAAE,SAAAJ,CAAS,CACtB,CAAC,EACKM,EAA8B,CACnC,IAAMC,IAIL,KAAK,gBAAkBN,EACvBM,EAAG,EACH,KAAK,gBAAkB1D,GAChByD,GAER,MAAO,UASN,MAAM,KAAK,iBAAiB,MAAMzD,EAAiB,EAC5CwD,EAAc,MAAM,GAE5B,QAAS,IAAM,CACd,KAAK,iBAAiB,QAAQJ,CAAS,CACxC,CACD,EACA,OAAOK,CACR,EAKA,kBAAe,SAAY,CAC1B,MAAM,KAAK,iBAAiB,MAAM,KAAK,eAAe,CACvD,EAEA,qBAAkB,SAAY,CAC7B,MAAM,QAAQ,IAAI,KAAK,iBAAiB,SAAS,CAAC,CACnD,EAEA,KAAQ,gBAAkB,MACzB1C,EACA4C,EACAxD,IACI,CACJ,GAAKY,EAAW,OAEhB,MAAK,IAAI,sBAAuBA,EAAW,OAAQ,mBAAmB,EAWtE,QAAWE,KAAMF,EAChBE,EAAG,UAAY,KAAK,KAAK,IAE1B,MAAM,KAAK,iBAAiBF,EAAYZ,CAAI,EAC7C,EAEA,KAAQ,iBAAmB,MAC1BY,EACA,CAAE,SAAAoC,EAAW,EAAK,EAA4B,CAAC,IAC3C,CACAA,GAEH,KAAK,YAAY,QAAQ,MAAM,KAAK,WAAWpC,CAAU,CAAC,EAE3D,MAAM,KAAK,KAAK,qBAAqBA,CAAU,EAG/C,KAAK,oBAAoB,CAAE,WAAAA,EAAY,UAAW,CAAC,CAAE,CAAC,EAGtD,IAAM+B,EAAkB,MAAM,KAC7B,IAAI,IAAI/B,EAAW,IAAKE,GAAOE,EAAWF,EAAG,GAAG,CAAC,CAAC,CACnD,EACA,QAAWX,KAAOwC,EACjB,MAAM,KAAK,uBAAuBxC,CAAG,EAKtC,IAAM4C,EAAsB,IAAI,IAC/BnC,EAAW,IAAI,CAAC,CAAE,IAAAT,CAAI,IAAME,GAAaF,CAAG,EAAE,UAAU,CACzD,EACA,KAAK,QAAQ,IAAI,yBAA0B4C,CAAmB,EAC9D,KAAK,QAAQ,aAAa,KACzB,qBACA,MAAM,KAAKA,CAAmB,CAC/B,CACD,EAEA,KAAQ,qBAAuB,MAAOU,GAAqB,CAC1D,IAAMC,EAAUC,GAAyBF,CAAG,EACtCG,EAA0B,CAAC,EAC3BC,EAAS,IAAM,KAAK,KAAK,IAC/B,OAAW,CAAC1D,EAAK2D,CAAO,IAAK,OAAO,QAAQJ,CAAO,EAAG,CACrD,IAAMnD,EAAc,MAAM,KAAK,gBAAgBJ,CAAG,EAC9C,CAAE,KAAA4D,EAAM,QAAAC,CAAQ,EAAIzD,EAAY,qBAAqBJ,CAAG,EACtD8D,EAAUC,GAAkB/D,EAAK4D,EAAMD,EAASD,CAAM,EAC5DD,EAAW,QAAQ,GAAGK,CAAO,CAC9B,CACA,OAAOL,CACR,EAEA,KAAQ,WAAa,MAAOH,GAAqB,CAChD,IAAMG,EAAa,MAAM,KAAK,qBAAqBH,CAAG,EACtD,MAAO,UAAY,CAClB,IAAMU,EAAO,MAAM,KAAK,WAAWP,CAAU,EAC7C,aAAM,KAAK,iBACVA,EAAW,IAAK9C,IACfA,EAAG,UAAY,KAAK,KAAK,IAClBA,EACP,EAGD,CAAE,SAAU,EAAM,CACnB,EACOqD,CACR,CACD,EAEA,YAAS,MAAOhE,EAAuB0B,IAAqC,CAC3EuC,EACCjE,IAAQa,EAAWb,CAAG,EACtB,uDACD,EAEA,IAAMkE,EAAU,MAAM,KAAK,KAAK,0BAA0BlE,CAAG,EACvD2D,EAAU,KAAK,KAAK,aAAa,gBAAgBO,CAAO,EAE9D,MAAM,KAAK,iBAAiBP,EAASjC,CAAO,CAC7C,EAEA,eAAY,MACXyC,EACAzC,IACI,CACJ,IAAMwC,EAAU,MAAM,QAAQ,IAC7BC,EAAK,IAAKnE,GAAQ,KAAK,KAAK,0BAA0BA,CAAG,CAAC,CAC3D,EACM2D,EAAU,KAAK,KAAK,aAAa,gBAAgBO,EAAQ,KAAK,CAAC,EAErE,MAAM,KAAK,iBAAiBP,EAASjC,CAAO,CAC7C,EAEA,WAAQ,SAAY,CACnB,KAAK,QAAQ,IAAI,OAAQ,0BAA0B,EACnD,MAAM,KAAK,qBAAqB,EAChC,MAAM,KAAK,iBAAiB,EAAI,CAKjC,EAEA,aAAU,SAAY,CACrB,KAAK,UAAY,GACjB,QAAW0C,KAAe,KAAK,aAC9BA,EAAY,EAEb,QAAW5C,KAAS,KAAK,qBAAqB,OAAO,EACpDA,EAAM,QAAQ,EAEf,KAAK,qBAAqB,MAAM,EAChC,MAAM,KAAK,gBAAgB,CAC5B,EAEA,KAAQ,aAAgBhB,GAAkC,CACzD,KAAK,IAAI,QAAS,sBAAuBA,EAAU,MAAM,EAGzD,KAAK,yBAAyBA,EAAW,CAAE,QAAS,EAAK,CAAC,CAC3D,EAEA,KAAQ,qBAAuB,SAAY,CAC1C,IAAM6D,EAAK,KAAK,GAAG,YAClB,OAAO,KAAK,KAAK,OAAO,WAAW,EACnC,WACD,EACA,QAAWpE,KAAc,OAAO,KAAK,KAAK,OAAO,WAAW,EAAG,CAC9D,IAAMoB,EAAQgD,EAAG,YAAYpE,CAAU,EACvC,MAAMqB,EAAoBD,EAAM,MAAM,CAAC,CACxC,CACD,EAEA,KAAQ,iBAAmB,MAC1BhB,EAAkB,GAClBC,EAAU,KACN,CACJ,OAAW,CAACgE,EAAG9C,CAAK,IAAK,KAAK,qBAC7B,MAAM,KAAK,mBAAmBA,EAAOnB,EAAiBC,CAAO,CAE/D,EA3nBC,KAAK,QAAUV,EAEf,KAAK,oBAAsBE,EAC3B,KAAK,KAAOD,EACZ,KAAK,MAAQE,EACb,KAAK,iBAAmB,IAAIwE,GAC3B,KAAK,eACN,EAEA,KAAK,iBAAiB,IAAI,CACzB,IAAK7E,GACL,MAAO,CAAC,EACR,IAAK,IACL,QAASI,EACT,SAAU,CAAE,SAAU,EAAK,CAC5B,CAAC,EACD,KAAK,aAAa,KAAK,KAAK,KAAK,UAAU,SAAU,KAAK,YAAY,CAAC,CACxE,CA5CA,IAAY,KAAM,CACjB,OAAO,KAAK,QAAQ,GACrB,CACA,IAAY,IAAK,CAChB,OAAO,KAAK,QAAQ,UACrB,CACA,IAAY,aAAc,CACzB,OAAO,KAAK,QAAQ,WACrB,CACA,IAAY,QAAS,CACpB,OAAO,KAAK,QAAQ,MACrB,CA4oBD,EClsBO,IAAM0E,GAAiB,OAAO,eAAe,EATpDC,GAWaC,GAAN,cAGGC,CAMP,CA+BF,YAAY,CACX,gBAAAC,EACA,mBAAAC,EAAqB,IACrB,eAAAC,CACD,EAIG,CACF,MAAM,EAvCP,KAAQ,OAAS,CAAC,EAClB,KAAQ,MAAQ,CAAE,QAAS,CAAC,CAAE,EAE9B,KAAQ,gBAAkB,IAAI,IAC9B,KAAQ,SAAW,IAAI,MAyDvB,KAAQ,OAAS,CAChBC,EACAC,IAGCD,EAAiB,KAAOC,EAAS,WACjC,KAAK,gBAAgB,IAAIA,EAAS,SAAS,GAC3C,KAAK,MAAM,KAAOA,EAAS,GAI7B,KAACP,IAAkB,MAClBM,EACAE,IACI,CACJ,IAAIC,EAAe,GACbC,EAAa,IAAI,IAAY,KAAK,OAAO,EAE/C,GAAIF,EAAQ,OAAS,mBAChB,KAAK,OAAOF,EAAkBE,EAAQ,QAAQ,GACjD,KAAK,MAAQA,EAAQ,SACrB,KAAK,gBAAgB,IAAIA,EAAQ,SAAS,SAAS,EACnD,KAAK,KAAK,cAAeA,EAAQ,QAAQ,IAEzCE,EAAW,IAAIF,EAAQ,SAAS,EAAE,EAClC,KAAK,OAAOA,EAAQ,SAAS,EAAE,EAAIA,EAAQ,SAC3CC,EAAe,GACf,KAAK,KAAK,cAAeD,EAAQ,SAAS,GAAIA,EAAQ,QAAQ,WAErDA,EAAQ,OAAS,YAAa,CAExC,KAAK,OAAS,CAAC,EACfE,EAAW,MAAM,EAEjB,OAAW,CAACC,EAAIJ,CAAQ,IAAK,OAAO,QAAQC,EAAQ,YAAY,EAC3D,KAAK,OAAOF,EAAkBC,CAAQ,GACzC,KAAK,MAAQA,EACb,KAAK,gBAAgB,IAAIA,EAAS,SAAS,EAC3C,KAAK,KAAK,cAAeA,CAAQ,IAEjCE,EAAe,GACfC,EAAW,IAAIC,CAAE,EACjB,KAAK,OAAOA,CAAE,EAAIJ,EAClB,KAAK,KAAK,cAAeI,EAAIJ,CAAQ,EAGxC,SAAWC,EAAQ,OAAS,mBAAoB,CAC/CE,EAAW,OAAOF,EAAQ,MAAM,EAChC,KAAK,gBAAgB,OAAOA,EAAQ,SAAS,EAC7C,IAAMI,EAAe,KAAK,OAAOJ,EAAQ,MAAM,EAC/C,OAAO,KAAK,OAAOA,EAAQ,MAAM,EACjCC,EAAe,GACf,KAAK,KAAK,WAAYD,EAAQ,OAAQI,CAAY,CACnD,CACIH,IACH,KAAK,SAAW,MAAM,KAAKC,CAAU,EACrC,KAAK,KAAK,eAAgB,KAAK,MAAM,EAEvC,EAEA,YAAS,MAAOG,GAAgC,CAC/C,KAAK,aAAa,OAAO,CACxB,MAAO,CAACA,CAAQ,CACjB,CAAC,EAED,KAAK,KAAK,SAAW,CAAE,GAAG,KAAK,KAAK,SAAU,GAAGA,CAAS,EAC1D,KAAK,KAAK,cAAe,KAAK,IAAI,CACnC,EAEA,0BAAwBC,GAAyC,CAChE,IAAMD,EAAWC,EAAgB,OAAO,CAACC,EAAKC,KACtC,CAAE,GAAGD,EAAK,GAAGC,CAAO,GACzB,KAAK,KAAK,QAAQ,EACrB,KAAK,KAAK,SAAUH,CAAQ,CAC7B,EA/FC,KAAK,KAAK,SAAWV,EACrB,KAAK,KAAK,QAAUE,EAEpB,KAAK,eAAiB,IAAIY,GAAQ,KAAK,oBAAoB,EAC3D,KAAK,aAAe,KAAK,eAAe,IAAI,CAC3C,IAAK,GACL,QAASb,EACT,MAAO,CAAC,EACR,IAAK,SACN,CAAC,CACF,CAsBC,OAAAJ,GAAAD,GAhED,IAAI,MAAO,CACV,OAAO,KAAK,KACb,CAEA,IAAI,OAAQ,CACX,OAAO,KAAK,MACb,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,QACb,CAEA,IAAI,UAAW,CACd,IAAMmB,EAAW,CAAE,GAAG,KAAK,MAAO,EAClC,OAAAA,EAAS,KAAK,KAAK,EAAE,EAAI,KAAK,KACvBA,CACR,CAEA,IAAI,gBAAiB,CACpB,OAAO,KAAK,eACb,CA4GD,EC3IO,IAAMC,GAAN,KAAe,CAIrB,YAAY,CACX,iBAAAC,EACA,IAAAC,CACD,EAGG,CAKH,gBAAa,MAAOC,GAA8C,CACjE,IAAMC,EAAOD,EAAK,KAElB,GAAI,CAACC,EACJ,MAAM,IAAI,MAAM,gCAAgC,EAIjD,GAAM,CAAE,MAAOC,EAAc,MAAAC,CAAM,EAClC,MAAM,KAAK,iBAAiB,aAAa,EAEpCC,EAAW,IAAI,OAAO,SAC5BA,EAAS,OAAO,OAAQH,CAAI,EAE5B,GAAI,CACH,IAAMI,EAAW,MAAM,MAAMH,EAAe,IAAIF,EAAK,EAAE,GAAI,CAC1D,OAAQ,OACR,KAAMI,EACN,YAAa,UACb,QAAS,CACR,cAAe,UAAUD,CAAK,EAC/B,CACD,CAAC,EAED,OAAIE,EAAS,GACL,CACN,QAAS,GACT,MAAO,EACR,GAEA,KAAK,IACJ,QACA,qBACAA,EAAS,OACT,MAAMA,EAAS,KAAK,CACrB,EACO,CACN,QAAS,GACT,MAAOA,EAAS,QAAU,GAC3B,EAEF,OAASC,EAAG,CACX,YAAK,IAAI,QAAS,qBAAsBA,CAAC,EAClC,CACN,QAAS,GACT,MAAO,EACR,CACD,CACD,EAEA,aAAU,MAAOC,GAAwC,CACxD,GAAM,CAAE,MAAOL,EAAc,MAAAC,CAAM,EAClC,MAAM,KAAK,iBAAiB,aAAa,EAE1C,GAAI,CACH,IAAME,EAAW,MAAM,MAAMH,EAAe,IAAIK,CAAE,GAAI,CACrD,OAAQ,MACR,YAAa,UACb,QAAS,CACR,eAAgB,mBAChB,cAAe,UAAUJ,CAAK,EAC/B,CACD,CAAC,EAED,OAAIE,EAAS,GAEL,CACN,QAAS,GACT,KAHY,MAAMA,EAAS,KAAK,CAIjC,GAEA,KAAK,IACJ,QACA,gCACAA,EAAS,OACT,MAAMA,EAAS,KAAK,CACrB,EACO,CACN,QAAS,GACT,MAAOA,EAAS,QAAU,KAAOA,EAAS,SAAW,GACtD,EAEF,OAASC,EAAG,CACX,YAAK,IAAI,QAAS,gCAAiCA,CAAC,EAC7C,CACN,QAAS,GACT,MAAO,EACR,CACD,CACD,EA7FC,KAAK,iBAAmBR,EACxB,KAAK,IAAMC,CACZ,CA4FD,ECzHO,IAAMS,GAAN,cAAwBC,CAG5B,CAUF,YAAY,CACX,SAAAC,EAAW,GAAK,IAChB,eAAAC,EAAiB,EAAI,IACrB,kBAAAC,EAAoB,EACrB,EAII,CAAC,EAAG,CACP,MAAM,EAhBP,KAAQ,SAAkC,KAC1C,KAAQ,SAAkC,KAuB1C,eAAY,IAAM,CACb,KAAK,WACR,aAAa,KAAK,QAAQ,EAC1B,KAAK,SAAW,KAChB,KAAK,MAAM,EAEb,EAEA,WAAQ,CAACC,EAAY,KAAU,CAC9B,KAAK,KAAK,EACNA,EACH,KAAK,KAAK,EAEV,KAAK,SAAW,WAAW,KAAK,KAAM,KAAK,SAAS,CAEtD,EAEA,UAAO,IAAM,CACR,KAAK,UACR,aAAa,KAAK,QAAQ,EAEvB,KAAK,UACR,aAAa,KAAK,QAAQ,CAE5B,EAEA,KAAQ,KAAO,SAAY,CAC1B,KAAK,KAAK,MAAM,EAChB,KAAK,SAAW,WAAW,KAAK,WAAY,KAAK,cAAc,CAChE,EAEA,KAAQ,WAAa,IAAM,CAC1B,KAAK,SAAW,KAChB,KAAK,KAAK,QAAQ,CACnB,EAKA,iBAAeH,GAAqB,CACnC,KAAK,UAAYA,CAClB,EAhDC,KAAK,UAAYA,EACjB,KAAK,eAAiBC,EAClB,OAAO,OAAW,KAAeC,GACpC,OAAO,iBAAiB,WAAY,IAAM,KAAK,MAAM,EAAI,CAAC,CAE5D,CAnBA,IAAI,UAAW,CACd,OAAO,KAAK,SACb,CA6DD,EC/DO,IAAME,GAAN,cACEC,CAET,CAaC,YAAY,CACX,iBAAAC,EACA,KAAAC,EACA,SAAAC,EACA,SAAAC,EAAW,GAAK,IAChB,IAAAC,EAAM,IAAM,CAAC,CACd,EAMG,CACF,MAAM,EApBP,KAAS,KAAO,OAGhB,KAAQ,aAAe,GACvB,KAAQ,QAA+B,SACvC,KAAQ,WAAa,GA4BrB,iBAAeD,GAAqB,CACnC,KAAK,UAAU,YAAYA,CAAQ,CACpC,EAMA,KAAQ,YAAc,MAAOE,GAA8B,CAC1D,KAAK,IAAI,uBAAwBA,CAAQ,EACzC,GAAI,CACH,GAAM,CAAE,KAAMC,EAAM,MAAAC,CAAM,EAAI,MAAM,KAAK,iBAAiB,aAAa,EACjEC,EAAW,MAAM,MAAMF,EAAM,CAClC,OAAQ,OACR,QAAS,CACR,eAAgB,mBAChB,cAAe,UAAUC,CAAK,EAC/B,EACA,KAAM,KAAK,UAAU,CACpB,SAAAF,CACD,CAAC,EACD,YAAa,SACd,CAAC,EACD,GAAIG,EAAS,GAAI,CAChB,KAAK,UAAU,UAAU,EACzB,IAAMC,EAAQ,MAAMD,EAAS,KAAK,EAGlC,QAAWE,KAAWD,EAAK,SAC1B,KAAK,oBAAoBC,CAAO,EAE5B,KAAK,eACT,KAAK,aAAe,GACpB,KAAK,KAAK,eAAgB,EAAI,EAEhC,MACC,KAAK,IAAI,sBAAuBF,EAAS,OAAQ,MAAMA,EAAS,KAAK,CAAC,EAElE,KAAK,eACR,KAAK,aAAe,GACpB,KAAK,KAAK,eAAgB,EAAK,GAI5BA,EAAS,QAAU,KACtB,KAAK,UAAU,UAAU,CAG5B,OAASG,EAAO,CACX,KAAK,eACR,KAAK,aAAe,GACpB,KAAK,KAAK,eAAgB,EAAK,GAEhC,KAAK,IAAIA,CAAK,EAEd,KAAK,UAAU,UAAU,CAC1B,CACD,EAEA,KAAQ,oBAAsB,MAAOD,GAA2B,CAC3DA,EAAQ,OAAS,cAChBA,EAAQ,eAEX,KAAK,IAAI,mBAAoBA,EAAQ,YAAY,EACjD,KAAK,YAAY,CAChB,MAAM,KAAK,KAAK,eAAe,UAAUA,EAAQ,YAAY,CAC9D,CAAC,GAGF,KAAK,WAAa,IAEnB,KAAK,KAAK,UAAWA,CAAO,CAC7B,EAEA,UAAQA,GAA2B,CAElC,OAAQA,EAAQ,KAAM,CACrB,IAAK,kBACL,IAAK,OACL,IAAK,YACJ,OAAO,KAAK,YAAY,CAACA,CAAO,CAAC,EAClC,IAAK,KACJ,GAAI,KAAK,WACR,OAAO,KAAK,YAAY,CAACA,CAAO,CAAC,EAElC,KACF,CACD,EAcA,aAAU,IAAM,CAAC,EAMjB,KAAQ,YAAc,SAAY,CAIjC,KAAK,YAAY,CAChB,MAAM,KAAK,KAAK,eAAe,qBAC9B,KAAK,SAAS,KAAK,QACpB,EACA,MAAM,KAAK,KAAK,eAAe,gBAAgB,CAChD,CAAC,CACF,EAIA,KAAQ,kBAAoB,SAAY,CACvC,KAAK,KAAK,eAAgB,EAAK,EAC/B,KAAK,IAAI,kBAAkB,EAC3B,KAAK,aAAe,EACrB,EAzIC,KAAK,IAAMN,EACX,KAAK,KAAOH,EACZ,KAAK,SAAWC,EAChB,KAAK,iBAAmBF,EAExB,KAAK,UAAY,IAAIY,GAAU,CAC9B,SAAAT,CACD,CAAC,EACD,KAAK,UAAU,UAAU,OAAQ,KAAK,WAAW,EACjD,KAAK,UAAU,UAAU,SAAU,KAAK,iBAAiB,CAC1D,CAMA,IAAI,UAAW,CACd,OAAO,KAAK,UAAU,QACvB,CAmFA,OAAc,CACT,KAAK,SAAW,WAGpB,KAAK,UAAU,MAAM,EAAI,EACzB,KAAK,QAAU,SAChB,CACA,MAAa,CACZ,KAAK,UAAU,KAAK,EACpB,KAAK,QAAU,QAChB,CAGA,WAAkB,CACjB,KAAK,UAAU,MAAM,EAAI,CAC1B,CAuBA,IAAI,aAAuB,CAC1B,OAAO,KAAK,YACb,CACA,IAAI,QAAS,CACZ,OAAO,KAAK,OACb,CACD,ECnLA,SAASU,GAAsBC,EAAAA,CAC3BC,KAAKD,QAAUA,CAAAA,CAGnBD,GAAsBG,UAAY,IAAIC,MACtCJ,GAAsBG,UAAUE,KAAO,wBA6BvC,IAAAC,GAAkC,OAAXC,OAAW,KAC9BA,OAAOC,MACPD,OAAOC,KAAKC,KAAKF,MAAAA,GA7BrB,SAAkBG,EAAAA,CACd,IAAIC,EAAMC,OAAOF,CAAAA,EAAOG,QAAQ,MAAO,EAAA,EACvC,GAAIF,EAAIG,OAAS,GAAK,EAClB,MAAM,IAAId,GACN,mEAAA,EAGR,QAEgBe,EAAIC,EAAZC,EAAK,EAAeC,EAAM,EAAGC,EAAS,GAEzCH,EAASL,EAAIS,OAAOF,GAAAA,EAAAA,CAEpBF,IACCD,EAAKE,EAAK,EAAS,GAALF,EAAUC,EAASA,EAG/BC,IAAO,GACVE,GAAUP,OAAOS,aAAa,IAAON,IAAAA,GAAaE,EAAM,EAAA,EACzD,EAGAD,EA/BI,oEA+BWM,QAAQN,CAAAA,EAE3B,OAAOG,CAAAA,ECxBI,SAAAI,GAASZ,EAAAA,CACpB,IAAIQ,EAASR,EAAIE,QAAQ,KAAM,GAAA,EAAKA,QAAQ,KAAM,GAAA,EAClD,OAAQM,EAAOL,OAAS,EAAA,CACpB,IAAK,GACD,MACJ,IAAK,GACDK,GAAU,KACV,MACJ,IAAK,GACDA,GAAU,IACV,MACJ,QACI,KAAM,2BAAA,CAGd,GAAA,CACI,OA5BR,SAA0BR,EAAAA,CACtB,OAAOa,mBACHhB,GAAKG,CAAAA,EAAKE,QAAQ,OAAQ,SAASY,EAAGC,EAAAA,CAClC,IAAIC,EAAOD,EAAEE,WAAW,CAAA,EAAGC,SAAS,EAAA,EAAIC,YAAAA,EAIxC,OAHIH,EAAKb,OAAS,IACda,EAAO,IAAMA,GAEV,IAAMA,CAAAA,CAAAA,CAAAA,CAAAA,EAqBOR,CAAAA,CAAAA,MACnBY,CACL,OAAOvB,GAAKW,CAAAA,CAAAA,CAAAA,CC5Bb,SAASa,GAAkB/B,EAAAA,CAC9BC,KAAKD,QAAUA,CAAAA,CAMJ,SAAAgC,GAASC,EAAOC,EAAAA,CAC3B,GAAqB,OAAVD,GAAU,SACjB,MAAM,IAAIF,GAAkB,yBAAA,EAIhC,IAAII,GADJD,EAAUA,GAAW,CAAA,GACHE,SAAdD,GAAgC,EAAI,EACxC,GAAA,CACI,OAAOE,KAAKC,MAAMC,GAAkBN,EAAMO,MAAM,GAAA,EAAKL,CAAAA,CAAAA,CAAAA,CAAAA,OAChDM,EAAAA,CACL,MAAM,IAAIV,GAAkB,4BAA8BU,EAAEzC,OAAAA,CAAAA,CAAAA,CAbpE+B,GAAkB7B,UAAY,IAAIC,MAClC4B,GAAkB7B,UAAUE,KAAO,oBAAA,IAAAsC,GAAAV,GCS5B,IAAMW,GAAN,KAAiC,CASvC,YAAoBC,EAA0C,CAA1C,YAAAA,EARpB,KAAQ,OAAS,KAMjB,UAAoB,EAUpB,kBAAe,SAAY,CAC1B,GAAI,KAAK,OACR,OAAO,KAAK,OAGb,IAAIC,EACA,KAAK,OAAO,UACfA,EAAS,MAAM,KAAK,OAAO,UAAU,EAErCA,EAAS,MAAM,MAAM,KAAK,OAAO,aAAe,CAC/C,YAAa,SACd,CAAC,EAAE,KAAMC,GAAQ,CAChB,GAAKA,EAAI,GAKR,OAAOA,EAAI,KAAK,EAJhB,MAAM,IAAI,MACT,4CAA4CA,EAAI,MAAM,EACvD,CAIF,CAAC,EAEFC,EAAOF,EAAO,YAAa,6CAA6C,EACxE,IAAMG,EAAWC,GAAkBJ,EAAO,WAAW,EACrDE,EAAOC,EAAQ,IAAK,8CAA8C,EAClED,EACCC,EAAQ,OAAS,OACjB,6CACD,EACA,KAAK,KAAO,SAASA,EAAQ,KAAO,EAAE,EACtC,IAAME,EAAM,IAAI,IAAIF,EAAQ,GAAG,EAC/BE,EAAI,SAAWA,EAAI,SAAS,QAAQ,KAAM,MAAM,EAChD,IAAMC,EAAeD,EAAI,SAAS,EAClCA,EAAI,SAAWA,EAAI,SAAS,QAAQ,OAAQ,IAAI,EAChD,IAAME,EAAoBF,EAAI,SAAS,EACnCG,EAAuBL,EAAQ,KACnC,GAAI,CAACK,EAAc,CAElB,IAAMC,EAAU,IAAI,IAAIH,CAAY,EACpCG,EAAQ,SAAWA,EAAQ,SAAW,SACtCD,EAAeC,EAAQ,SAAS,CACjC,CACA,YAAK,OAAS,CACb,KAAMH,EACN,UAAWC,EACX,MAAOC,EACP,MAAOR,EAAO,WACf,EACO,KAAK,MACb,EAvDC,GAAI,CAACD,EAAO,cAAgB,CAACA,EAAO,UACnC,MAAM,IAAI,MACT,iFACD,CAEF,CAmDD,EClFO,IAAMW,GAAN,cAA+BC,CAEnC,CAKF,YAAYC,EAAkB,CAC7B,MAAM,EAJP,KAAQ,MAA+B,KACvC,KAAQ,YAAc,GAOtB,UAAO,IAAM,CACP,KAAK,cACT,KAAK,YAAc,GACnB,KAAK,MAAQ,WAAW,IAAM,CAC7B,KAAK,KAAK,SAAS,EACnB,KAAK,YAAc,GACnB,KAAK,QAAQ,KAAK,CACnB,EAAG,KAAK,QAAQ,OAAO,EAEzB,EAEA,WAAQ,IAAM,CACb,KAAK,QAAQ,MAAM,EACf,KAAK,QACR,aAAa,KAAK,KAAK,EACvB,KAAK,MAAQ,KAEf,EApBC,KAAK,QAAUA,CAChB,CAoBD,EAEaC,GAAN,KAAc,CAKpB,YAAYC,EAAaC,EAAgB,CAJzC,aAAU,EASV,UAAO,IAAM,CACZ,KAAK,QAAU,KAAK,IAAI,KAAK,IAAK,KAAK,QAAU,KAAK,MAAM,CAC7D,EAEA,WAAQ,IAAM,CACb,KAAK,QAAU,CAChB,EAVC,KAAK,IAAMD,EACX,KAAK,OAASC,CACf,CASD,ECvCO,IAAMC,GAAN,cACEC,CAET,CAsBC,YAAY,CACX,iBAAAC,EACA,KAAAC,EACA,SAAAC,EACA,IAAAC,CACD,EAKG,CACF,MAAM,EA9BP,KAAQ,OAA2B,KAEnC,KAAQ,aAAgC,CAAC,EAEzC,KAAQ,UAA6B,CAAC,EAEtC,KAAQ,QAA+B,SACvC,KAAQ,OAAS,GACjB,KAAQ,eAAiB,GAEzB,KAAS,KAAO,WAChB,KAAQ,IAAM,IAAIC,IAAgB,CAAC,EAEnC,KAAQ,UAAY,IAAIC,GAExB,KAAQ,mBAAqB,IAAIC,GAChC,IAAIC,GAAQ,GAAK,IAAM,GAAG,CAC3B,EAuBA,KAAQ,OAAS,IAAM,CACtB,GAAI,CAAC,KAAK,OACT,MAAM,IAAI,MAAM,+CAA+C,EAGhE,GADA,KAAK,OAAS,GACV,KAAK,aAAa,OAAQ,CAC7B,QAAWC,KAAO,KAAK,aACtB,KAAK,IAAI,yBAA0B,KAAK,UAAUA,EAAK,KAAM,CAAC,CAAC,EAC/D,KAAK,OAAO,KAAK,KAAK,UAAUA,CAAG,CAAC,EAErC,KAAK,aAAe,CAAC,CACtB,CACA,KAAK,IAAI,gBAAgB,EACzB,KAAK,eAAe,EAAI,EACxB,KAAK,mBAAmB,MAAM,CAC/B,EAEA,KAAQ,eAAiB,MAAOC,GAAoB,CACnD,KAAK,IAAI,uBAAwBA,CAAM,EAClCA,GAKJ,KAAK,IAAI,eAAe,EACxB,KAAK,eAAiB,GACtB,KAAK,OAAS,GACd,KAAK,KACJ,MAAM,KAAK,KAAK,eAAe,qBAC9B,KAAK,SAAS,KAAK,QACpB,CACD,EACA,KAAK,KAAK,MAAM,KAAK,KAAK,eAAe,gBAAgB,CAAC,EAC1D,KAAK,UAAU,MAAM,IAbrB,KAAK,eAAiB,GACtB,KAAK,OAAS,GACd,KAAK,UAAU,KAAK,GAarB,KAAK,KAAK,eAAgBA,CAAM,CACjC,EAEA,KAAQ,UAAY,MAAOC,GAAwB,CAClD,IAAMC,EAAU,KAAK,MAAMD,EAAM,IAAI,EACrC,OAAQC,EAAQ,KAAM,CACrB,IAAK,YASJ,GARIA,EAAQ,cAEX,KAAK,KACJ,MAAM,KAAK,KAAK,eAAe,UAAUA,EAAQ,YAAY,CAC9D,EAED,KAAK,eAAiB,GACtB,KAAK,OAAS,GACV,KAAK,UAAU,OAAQ,CAC1B,QAAWH,KAAO,KAAK,UACtB,KAAK,KAAKA,CAAG,EAEd,KAAK,UAAY,CAAC,CACnB,CACD,IAAK,aACL,IAAK,mBACL,IAAK,mBACJ,KAAK,KAAK,UAAWG,CAAO,EAC5B,MACD,IAAK,QACJ,GAAI,CAAC,KAAK,eAAgB,CACzB,KAAK,IACJ,yDACAA,CACD,EACA,KACD,CACA,KAAK,KAAK,UAAWA,CAAO,EAC5B,MACD,IAAK,qBACJ,KAAK,UAAU,UAAU,EACzB,KAAK,KAAK,UAAWA,CAAO,EAC5B,MACD,QACK,KAAK,QACR,KAAK,KAAK,UAAWA,CAAO,EAE7B,KACF,CACD,EAEA,KAAQ,QAAWD,GAAiB,CACnC,KAAK,IAAIA,CAAK,EACd,KAAK,mBAAmB,KAAK,EAE7B,KAAK,IAAI,wCAAwC,CAClD,EAEA,KAAQ,QAAWA,GAAsB,CACxC,KAAK,IAAI,mBAAmB,EAC5B,KAAK,eAAe,EAAK,EACzB,KAAK,QAAQA,CAAK,CACnB,EAEA,KAAQ,iBAAmB,SAAY,CACtC,IAAME,EAAW,MAAM,KAAK,iBAAiB,aAAa,EAE1D,YAAK,OAAS,IAAI,UAAUA,EAAS,UAAW,CAAC,SAAUA,EAAS,KAAK,CAAC,EAC1E,KAAK,OAAO,iBAAiB,UAAW,KAAK,SAAS,EACtD,KAAK,OAAO,iBAAiB,OAAQ,KAAK,MAAM,EAChD,KAAK,OAAO,iBAAiB,QAAS,KAAK,OAAO,EAClD,KAAK,OAAO,iBAAiB,QAAS,KAAK,OAAO,EAC3C,KAAK,MACb,EAEA,KAAQ,cAAgB,SAAY,CACnC,KAAK,KAAK,MAAM,KAAK,KAAK,eAAe,gBAAgB,CAAC,CAC3D,EAEA,eAAY,IAAM,CACjB,KAAK,KAAK,EACV,KAAK,MAAM,CACZ,EAEA,KAAQ,gBAAmBD,GAEzBA,EAAQ,OAAS,QACjBA,EAAQ,OAAS,mBACjBA,EAAQ,OAAS,YACjBA,EAAQ,OAAS,YAInB,UAAQA,GAA2B,CAC9B,KAAK,SAAW,WAIhB,CAAC,KAAK,gBAAkB,CAAC,KAAK,gBAAgBA,CAAO,IAIrD,KAAK,gBAAgBA,CAAO,EAC3B,KAAK,QAAQ,aAAe,UAAU,MACzC,KAAK,IAAI,kBAAmB,KAAK,UAAUA,EAAS,KAAM,CAAC,CAAC,EAC5D,KAAK,OAAQ,KAAK,KAAK,UAAUA,CAAO,CAAC,IAEzC,KAAK,IACJ,0CACA,KAAK,UAAUA,EAAS,KAAM,CAAC,CAChC,EACA,KAAK,aAAa,KAAKA,CAAO,GAErB,KAAK,OACX,KAAK,QAAQ,aAAe,UAAU,OACzC,KAAK,IAAI,kBAAmB,KAAK,UAAUA,EAAS,KAAM,CAAC,CAAC,EAC5D,KAAK,OAAO,KAAK,KAAK,UAAUA,CAAO,CAAC,GAE/B,KAAK,iBACf,KAAK,IACJ,kCACA,KAAK,UAAUA,EAAS,KAAM,CAAC,CAChC,EACA,KAAK,UAAU,KAAKA,CAAO,IAE7B,EAEA,aAAU,IAAM,CACf,KAAK,QAAQ,oBAAoB,UAAW,KAAK,SAAS,EAC1D,KAAK,QAAQ,oBAAoB,QAAS,KAAK,OAAO,EACtD,KAAK,QAAQ,MAAM,CACpB,EAEA,WAAQ,IAAM,CACT,KAAK,SAGT,KAAK,iBAAiB,EACtB,KAAK,QAAU,SAChB,EAEA,UAAO,IAAM,CACZ,KAAK,QAAQ,EACb,KAAK,OAAS,KACd,KAAK,QAAU,QAChB,EA1LC,KAAK,IAAMR,GAAO,KAAK,IACvB,KAAK,iBAAmBH,EACxB,KAAK,KAAOC,EACZ,KAAK,SAAWC,EAEhB,KAAK,mBAAmB,UAAU,UAAW,KAAK,gBAAgB,EAClE,KAAK,UAAU,UAAU,OAAQ,KAAK,aAAa,CACpD,CAqLA,IAAI,aAAc,CACjB,OAAO,KAAK,QAAQ,aAAe,UAAU,IAC9C,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,OACb,CACD,ECzLO,IAAMW,GAAN,cACEC,CAET,CAHO,kCAIN,KAAS,KAAO,OAQhB,KAAO,QAAU,IAAM,CAAC,EAOxB,KAAgB,YAAc,GAC9B,KAAgB,OAAS,SACzB,KAAgB,aAAe,EAE/B,KAAgB,SAAW,IAAIC,GAAmC,CACjE,gBAAiB,CAAC,EAClB,eAAgB,CAAC,CAClB,CAAC,EAED,gBAAa,UACL,CACN,QAAS,GACT,MAAO,EACR,GAGD,aAAU,UACF,CACN,QAAS,GACT,MAAO,EACR,GAjCM,MAAa,CAAC,CAEd,OAAc,CAAC,CAEf,MAAa,CAAC,CAId,WAAkB,CAAC,CAEnB,SAAgB,CAAC,CACjB,iBAAwB,CAAC,CAwBjC,EA0DaC,GAAN,cACEF,CAIT,CAoBC,YACC,CACC,aAAAG,EACA,UAAAC,EACA,gBAAAC,EACA,4BAAAC,EAA8B,GAC9B,UAAAC,EACA,iBAAAC,EACA,aAAAC,EACA,2BAAAC,EACA,eAAAC,EACA,oBAAAC,CACD,EACA,CACC,KAAAC,EACA,IAAAC,EACA,OAAAC,CACD,EASC,CACD,MAAM,EApCP,KAAQ,iBAA4C,KACpD,KAAQ,iBAAmB,GAwI3B,KAAQ,8BAAiCC,GAAwB,CAC5DA,EAAM,KAAK,OAAS,QACvB,KAAK,cAAcA,EAAM,KAAK,OAAO,CAEvC,EAEA,KAAQ,cAAgB,MAAOC,GAA2B,CAEzD,GAAIA,EAAQ,OAAS,SAAWA,EAAQ,OAAS,YAChD,QAAWC,KAAMD,EAAQ,WACxB,KAAK,KAAK,KAAK,OAAOC,EAAG,SAAS,EAKpC,OADA,KAAK,IAAI,eAAgB,KAAK,UAAUD,EAAS,KAAM,CAAC,CAAC,EACjDA,EAAQ,KAAM,CACrB,IAAK,QACJ,MAAM,KAAK,OAAO,CACjB,WAAYA,EAAQ,WACpB,UAAWA,EAAQ,SACpB,CAAC,EACGA,EAAQ,oBACX,MAAM,KAAK,KAAK,aAAaA,EAAQ,kBAAkB,EAExD,MACD,IAAK,aACJ,MAAM,KAAK,KAAK,aAAaA,EAAQ,SAAS,EAC9C,MACD,IAAK,YACJ,KAAK,iBAAmB,GACxB,KAAK,KAAK,gBAAiB,EAAI,EAC/B,MAAM,KAAK,OAAO,CACjB,WAAYA,EAAQ,WACpB,UAAWA,EAAQ,UACnB,MAAOA,EAAQ,kBAChB,CAAC,EAEGA,EAAQ,oBACX,MAAM,KAAK,KAAK,aAAaA,EAAQ,kBAAkB,EAGxD,MAAM,KAAK,KAAK,iBAAiBA,EAAQ,cAAc,EACvD,KAAK,iBAAmB,GACxB,KAAK,KAAK,gBAAiB,EAAK,EAChC,MACD,IAAK,aACJ,KAAK,WAAW,KACf,MAAM,KAAK,KAAK,eAAe,gBAAgBA,EAAQ,KAAK,CAC7D,EACA,MACD,IAAK,aACJ,MAAM,KAAK,KAAK,iBAAiBA,EAAQ,SAAS,CACpD,CAEA,KAAK,kBAAkB,YAAY,CAClC,KAAM,OACN,QAAAA,CACD,CAAC,EAGD,KAAK,SAASE,EAAc,EAAE,MAAM,KAAK,KAAK,aAAa,IAAI,EAAGF,CAAO,CAC1E,EACA,KAAQ,mBAAsBG,GAAoB,CACjD,KAAK,KAAK,eAAgBA,CAAM,CACjC,EACA,KAAQ,qBAAuB,MAAOC,GAAkB,CACvD,KAAK,KAAK,MAAM,KAAK,KAAK,eAAe,qBAAqBA,CAAQ,CAAC,CACxE,EAEA,aAAWC,GAAiC,CAC3C,GAAIA,IAAc,YAAc,CAAC,KAAK,cACrC,MAAM,IAAI,MACT,kFACD,EAGD,IAAIC,EACAD,IAAc,WACjBC,EAAU,KAAK,cAEfA,EAAU,KAAK,aAGZA,IAAY,KAAK,aACrB,KAAK,IAAI,eAAgBD,EAAW,MAAM,EAGtC,KAAK,WAAW,SAAW,UAC9BC,EAAQ,MAAM,EAEf,KAAK,WAAW,KAAK,EACrB,KAAK,WAAaA,EACnB,EAEA,qBAAmBC,GAAqB,CACvC,KAAK,aAAa,YAAYA,CAAQ,CACvC,EAMA,UAAQP,GAA2B,CAClC,GAAI,KAAK,WAAW,SAAW,SAC9B,OAAO,KAAK,WAAW,KAAKA,CAAO,CAErC,EAEA,gBAAa,MAAOQ,GACf,KAAK,WAAW,SAAW,SACvB,KAAK,SAAS,WAAWA,CAAI,EAE7B,CACN,QAAS,GACT,MAAO,EACR,EAIF,aAAU,MAAOC,GAAe,CAE/B,GAAI,KAAK,WAAW,SAAW,SAC9B,OAAO,KAAK,SAAS,QAAQA,CAAE,EAE/B,MAAM,IAAI,MAAM,8CAA8C,CAEhE,EAEA,KAAO,MAAQ,IACP,KAAK,WAAW,MAAM,EAG9B,KAAO,KAAO,IACN,KAAK,WAAW,KAAK,EAG7B,KAAO,QAAU,IAAM,CACtB,KAAK,cAAc,QAAQ,EAC3B,KAAK,aAAa,QAAQ,CAC3B,EAEA,KAAO,UAAY,IACX,KAAK,WAAW,UAAU,EAlPjC,QAAK,KAAOb,EACZ,KAAK,OAASE,EACd,KAAK,IAAMD,IAAQ,IAAM,CAAC,GAC1B,KAAK,SAAW,IAAIb,GAAgB,CACnC,gBAAAI,EACA,eAAAM,EACA,mBAAoBD,CACrB,CAAC,EACD,KAAK,iBAAmB,IAAIiB,GAA2B,CACtD,aAAAxB,EACA,UAAAC,CACD,CAAC,EAED,KAAK,cAAgB,IAAIwB,GAAc,CACtC,iBAAkB,KAAK,iBACvB,KAAAf,EACA,SAAU,KAAK,SACf,IAAK,KAAK,GACX,CAAC,EACD,KAAK,aAAe,IAAIgB,GAAa,CACpC,iBAAkB,KAAK,iBACvB,KAAAhB,EACA,SAAU,KAAK,SACf,IAAK,KAAK,IACV,SAAUJ,CACX,CAAC,EACD,KAAK,SAAW,IAAIqB,GAAS,CAC5B,iBAAkB,KAAK,iBACvB,IAAK,KAAK,GACX,CAAC,EACGlB,GAAuB,qBAAsB,SAChD,KAAK,iBAAmB,IAAI,iBAAiB,SAAS,EACtD,KAAK,iBAAiB,iBACrB,UACA,KAAK,6BACN,GAEGJ,IAAqB,WACxB,KAAK,WAAa,KAAK,cAEvB,KAAK,WAAa,KAAK,aAGxB,KAAK,SAAS,UAAU,SAAU,KAAK,oBAAoB,EAE3D,KAAK,KAAK,UAAU,UAAW,KAAK,IAAI,EAExC,KAAK,cAAc,UAAU,UAAW,KAAK,aAAa,EAC1D,KAAK,cAAc,UAAU,eAAgB,KAAK,kBAAkB,EAEpE,KAAK,aAAa,UAAU,UAAW,KAAK,aAAa,EACzD,KAAK,aAAa,UAAU,eAAgB,KAAK,kBAAkB,EAE/DF,GAA+B,KAAK,cAAe,CAGtD,IAAMyB,EAAkB,IAAM,CACzBC,GACH,aAAaA,CAAiB,EAG/B,IAAMC,EADW,OAAO,KAAK,KAAK,SAAS,KAAK,EAAE,OAAS,GAGzD3B,IAAgC,cAChC,KAAK,SAAS,eAAe,KAAO,EAClC2B,GAAiB,KAAK,OAAS,OAClC,KAAK,QAAQ,UAAU,EACb,CAACA,GAAiB,KAAK,OAAS,aAE1CD,EAAoB,WAAW,IAAM,CAChC,OAAO,KAAK,KAAK,SAAS,KAAK,EAAE,SAAW,GAC/C,KAAK,QAAQ,MAAM,CAErB,EAAG,GAAI,EAET,EACIA,EACJ,KAAK,SAAS,UAAU,eAAgBD,CAAe,EACnDzB,IAAgC,cACnC,KAAK,SAAS,UAAU,cAAeyB,CAAe,CAExD,CAEIxB,GACH,KAAK,MAAM,CAEb,CAEA,IAAI,eAAgB,CACnB,OACC,KAAK,iBAAiB,OAAS,GAC/B,KAAK,iBAAiB,OAAS,GAC/B,KAAK,iBAAiB,OAAS,CAEjC,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,gBACb,CAoGA,IAAI,cAAe,CAClB,OAAO,KAAK,aAAa,QAC1B,CA6CA,IAAW,aAAuB,CACjC,OAAO,KAAK,WAAW,WACxB,CAEA,IAAW,QAAS,CACnB,OAAO,KAAK,WAAW,MACxB,CAEA,IAAW,MAAO,CACjB,OAAO,KAAK,WAAW,IACxB,CACD,ECndO,IAAM2B,GAAN,KAAiB,CAAjB,cACN,KAAQ,UAA4B,CAAC,EACrC,KAAU,SAAW,GAErB,aAAU,IAAM,CACf,KAAK,SAAW,GAChB,KAAK,UAAU,QAASC,GAAYA,EAAQ,CAAC,EAC7C,KAAK,UAAY,CAAC,CACnB,EAEA,KAAU,WAAcA,GAAwB,CAC/C,KAAK,UAAU,KAAKA,CAAO,CAC5B,EACD,ECVA,SAASC,GAAgBC,EAAqB,CAC7C,OAAOA,IAAM,IACd,CAEO,SAASC,GAAgBC,EAAmB,CAClD,OAAI,MAAM,QAAQA,CAAO,EACjBA,EAAQ,IAAID,EAAe,EAAE,OAAOF,EAAY,EAC7CG,aAAmBC,IACtBD,EAAQ,QAAU,KAElBA,CAET,CAEO,SAASE,GACfC,EACAC,EACC,CACD,MAAQ,CAACD,GAAK,CAACC,GAAOD,GAAKC,GAAKC,GAAWF,CAAC,IAAME,GAAWD,CAAC,CAC/D,CCDO,IAAME,GAAsB,OAAO,qBAAqB,EAClDC,GAAS,OAAO,QAAQ,EAtBrCC,GA8BsBC,GAAf,cAAoCC,EAAW,CAerD,YAAY,CACX,QAAAC,EACA,QAAAC,EACA,WAAAC,EACA,IAAAC,EACA,aAAAC,CACD,EAAwB,CACvB,MAAM,EAjBP,KAAQ,sBAAwC,CAAC,EAEjD,KAAQ,QAAuB,UAC/B,KAAQ,kBAAuC,KA+F/C,KAAU,SAAYC,GAAa,CAClC,KAAK,UAAYA,EACjB,KAAK,4BAA4B,KAAK,SAAS,EAC/C,KAAK,OAASC,GAAgBD,CAAK,EACnC,KAAK,QAAU,QACf,KAAK,QAAQ,KAAK,SAAU,KAAK,MAAM,CACxC,EAGA,KAAU,aAAe,IAAM,CAC9B,KAAK,SAAS,KAAK,SAAS,CAC7B,EAEA,KAAQ,4BAA+BA,GAAa,CACnD,KAAO,KAAK,sBAAsB,QACjC,KAAK,sBAAsB,IAAI,IAAI,EAGhC,MAAM,QAAQA,CAAK,EACtBA,EAAM,QAASE,GAAgB,CAC1BA,aAAkBC,KACrB,KAAK,sBAAsB,KAC1BD,EAAO,UAAU,SAAU,KAAK,YAAY,CAC7C,EACA,KAAK,sBAAsB,KAC1BA,EAAO,UAAU,UAAW,KAAK,YAAY,CAC9C,EAEF,CAAC,EACSF,aAAiBG,KAC3B,KAAK,sBAAsB,KAC1BH,EAAM,UAAU,SAAU,KAAK,YAAY,CAC5C,EACA,KAAK,sBAAsB,KAC1BA,EAAM,UAAU,UAAW,IAAM,CAChC,KAAK,aAAa,CACnB,CAAC,CACF,EAEF,EAEA,aAAU,KACT,KAAK,QAAQ,IAAI,QAAS,kBAAmB,KAAK,GAAG,EAEjD,KAAK,UAAY,UACpB,KAAK,QAAU,eACL,KAAK,UAAY,UAC3B,KAAK,QAAU,gBAIhB,KAAK,kBAAoB,KAAK,IAAI,EAChC,KAAK,IAAM,KAAK,MAAM,EACtB,MAAOI,GAAQ,CACf,GAAIA,aAAe,QAEjBA,EAAI,OAAS,qBACbA,EAAI,OAAS,sBAGb,OAAO,KAAK,OAGd,MAAMA,CACP,CAAC,EACK,KAAK,mBAIb,KAACZ,IAAwBa,GAA2C,CACnE,KAAK,wBAA0BA,CAChC,EAvJC,KAAK,UAAYV,EACjB,KAAK,OAASA,EACd,KAAK,QAAU,IAAIW,EACjBC,GAAiC,CAC7BA,IAAU,UAAU,KAAK,0BAA0B,IAAI,CAC5D,CACD,EACA,KAAK,QAAUX,EACf,KAAK,IAAME,EACX,KAAK,WAAaD,EAClB,IAAMW,EACLT,IACEU,GAA0BA,EAAY,SAASZ,CAAU,GAC5D,KAAK,WACJ,KAAK,QAAQ,aAAa,UACzB,qBACCY,GAAgB,CACZD,EAAeC,CAAW,IAC7B,KAAK,QAAQ,IAAI,OAAQ,iBAAkB,KAAK,GAAG,EACnD,KAAK,QAAQ,EAEf,CACD,CACD,CACD,CA6HC,OAAAjB,GAAAF,GA3HD,IAAI,SAAU,CACb,OAAO,KAAK,MACb,CAEA,IAAI,UAAW,CACd,OAAI,KAAK,SAAW,QAAgB,QAAQ,QAAQ,KAAK,MAAM,EACxD,KAAK,mBAAqB,KAAK,QAAQ,CAC/C,CAEA,IAAI,YAAa,CAChB,OAAO,KAAK,QAAQ,qBAAqB,EAAI,CAC9C,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,OACb,CAmBA,UAAUoB,EAAsBC,EAAgB,CAE/C,GAAIA,IAAa,QAAa,OAAOD,GAAoB,WAExD,YAAK,SACE,KAAK,QAAQ,UAAU,SAAUA,CAAe,EACjD,GAAIA,IAAoB,UAAYC,IAAa,OAEvD,YAAK,SACE,KAAK,QAAQ,UAAU,SAAUA,CAAQ,EAC1C,GACND,IAAoB,gBACpB,OAAOC,GAAa,WAEpB,OAAO,KAAK,QAAQ,UAAUD,EAAiBC,CAAQ,EAEvD,MAAM,IAAI,MAAM,uCAAuC,CAEzD,CA0ED,EC1MO,IAAMC,GAAN,cAA0BC,EAAoB,CAIpD,YAAY,CACX,GAAAC,EACA,QAAAC,EACA,GAAGC,CACJ,EAGiD,CAChD,MAAM,CACL,QAAS,KACT,GAAGA,CACJ,CAAC,EAKF,KAAU,IAAM,SAAY,CAC3B,IAAMC,EAAQ,MAAM,KAAK,QAAQ,KAAK,GAAG,EACzC,KAAK,SAASA,CAAK,CACpB,EAPC,KAAK,IAAMC,EAAUF,EAAK,WAAYF,CAAE,EACxC,KAAK,QAAUC,CAChB,CAMD,EC3BA,IAAAI,GAKaC,GAAN,cAA8BC,EAAoB,CAIxD,YAAY,CACX,MAAAC,EACA,QAAAC,EACA,GAAGC,CACJ,EAGiD,CAChD,MAAM,CACL,QAAS,KACT,GAAGA,CACJ,CAAC,EAKF,KAAU,IAAM,SAAY,CAC3B,IAAMC,EAAM,MAAMC,GAAW,CAC5B,WAAY,KAAK,WACjB,MAAO,KAAK,MACZ,QAAS,KAAK,OACf,CAAC,EACD,KAAK,SAASD,EAAM,MAAM,KAAK,QAAQA,CAAG,EAAI,IAAI,CACnD,EAEA,KAACN,IAAWG,GAAwC,CAC/CK,GAAgB,KAAK,MAAOL,CAAK,IACrC,KAAK,MAAQA,EACb,KAAK,QAAQ,EACd,EAjBC,KAAK,MAAQA,EACb,KAAK,QAAUC,CAChB,CAWC,OAAAJ,GAAAS,GAKF,ECvCA,IAAAC,GAKaC,GAAN,cAA+BC,EAAe,CAuBpD,YAAY,CACX,MAAAC,EACA,QAAAC,EACA,SAAAC,EACA,KAAAC,EACA,GAAGC,CACJ,EAK4C,CAC3C,MAAM,CACL,QAAS,CAAC,EACV,GAAGA,CACJ,CAAC,EAjCF,KAAQ,aAAwB,GAwChC,KAAU,IAAM,SAAY,CAC3B,GAAM,CAAE,OAAAC,EAAQ,YAAAC,CAAY,EAAI,MAAMC,GAAe,CACpD,WAAY,KAAK,WACjB,MAAO,KAAK,MACZ,QAAS,KAAK,QACd,MAAO,KAAK,UACZ,OAAQ,KAAK,MAAQ,KAAK,SAC3B,CAAC,EACD,KAAK,aAAeD,EACpB,KAAK,SAAS,MAAM,QAAQ,IAAID,EAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAC1D,EAEA,cAAW,SAAY,CACjB,KAAK,cAEV,KAAK,QACL,MAAM,KAAK,IAAI,EAChB,EAEA,kBAAe,SAAY,CACtB,KAAK,QAAU,IAEnB,KAAK,QACL,MAAM,KAAK,IAAI,EAChB,EAEA,aAAU,MAAOF,GAAiB,CACjC,KAAK,MAAQA,EACb,MAAM,KAAK,IAAI,CAChB,EAEA,KAACN,IAAWG,GAAwC,CAC/CQ,GAAgB,KAAK,MAAOR,CAAK,IACrC,KAAK,MAAQA,EACb,KAAK,QAAQ,EACd,EAzCC,KAAK,MAAQA,EACb,KAAK,QAAUC,EACf,KAAK,UAAYC,EACjB,KAAK,MAAQC,CACd,CAiCC,OAAAN,GAAAY,GArED,IAAI,UAAW,CACd,OAAO,KAAK,SACb,CAEA,IAAI,MAAO,CACV,OAAO,KAAK,KACb,CAEA,IAAI,aAAc,CACjB,OAAO,KAAK,YACb,CAEA,IAAI,iBAAkB,CACrB,OAAO,KAAK,MAAQ,CACrB,CA4DD,ECtFA,IAAAC,GAKaC,GAAN,cAAmCC,EAAe,CAexD,YAAY,CACX,QAAAC,EACA,SAAAC,EACA,MAAAC,EACA,GAAGC,CACJ,EAI4C,CAC3C,MAAM,CACL,QAAS,CAAC,EACV,GAAGA,CACJ,CAAC,EAzBF,KAAQ,UAAY,EAEpB,KAAQ,aAAwB,GA6BhC,KAAU,IAAM,SAAY,CAC3B,GAAM,CAAE,OAAAC,EAAQ,YAAAC,CAAY,EAAI,MAAMC,GAAe,CACpD,WAAY,KAAK,WACjB,QAAS,KAAK,QACd,MAAO,KAAK,UAAY,KAAK,UAC7B,OAAQ,EACR,MAAO,KAAK,KACb,CAAC,EACD,KAAK,aAAeD,EACpB,KAAK,SAAS,MAAM,QAAQ,IAAID,EAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAC1D,EAEA,KAAO,SAAW,SAAY,CAC7B,GAAM,CAAE,OAAAA,EAAQ,YAAAC,CAAY,EAAI,MAAMC,GAAe,CACpD,WAAY,KAAK,WACjB,QAAS,KAAK,QACd,MAAO,KAAK,UACZ,OAAQ,KAAK,UAAY,KAAK,UAC9B,MAAO,KAAK,KACb,CAAC,EACD,KAAK,aAAeD,EACpB,KAAK,YACL,KAAK,SAAS,CACb,GAAG,KAAK,QACR,GAAI,MAAM,QAAQ,IAAID,EAAO,IAAI,KAAK,OAAO,CAAC,CAC/C,CAAC,CACF,EAEA,KAACP,IAAWK,GAAwC,CAC/CK,GAAgB,KAAK,MAAOL,CAAK,IACrC,KAAK,MAAQA,EACb,KAAK,QAAQ,EACd,EArCC,KAAK,MAAQA,EACb,KAAK,QAAUF,EACf,KAAK,UAAYC,CAClB,CA8BC,OAAAJ,GAAAW,GAvDD,IAAI,UAAW,CACd,OAAO,KAAK,SACb,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,YACb,CAsDD,ECxEA,IAAAC,GAKaC,GAAN,cAA8BC,EAAe,CAInD,YAAY,CACX,MAAAC,EACA,QAAAC,EACA,GAAGC,CACJ,EAG4C,CAC3C,MAAM,CACL,QAAS,CAAC,EACV,GAAGA,CACJ,CAAC,EAKF,KAAU,IAAM,SAAY,CAC3B,IAAMC,EAAO,MAAMC,GAAY,CAC9B,WAAY,KAAK,WACjB,MAAO,KAAK,MACZ,QAAS,KAAK,OACf,CAAC,EACD,KAAK,SAAS,MAAM,QAAQ,IAAID,EAAK,IAAI,KAAK,OAAO,CAAC,CAAC,CACxD,EAEA,KAACN,IAAWG,GAAwC,CAC/CK,GAAgB,KAAK,MAAOL,CAAK,IACrC,KAAK,MAAQA,EACb,KAAK,QAAQ,EACd,EAjBC,KAAK,MAAQA,EACb,KAAK,QAAUC,CAChB,CAWC,OAAAJ,GAAAS,GAKF,EC1BO,IAAMC,GAAN,KAIL,CAWD,YAAY,CACX,WAAAC,EACA,MAAAC,EACA,SAAAC,EACA,QAAAC,EACA,gBAAAC,CACD,EAMG,CAqBH,KAAQ,eAAkBC,GACpBA,EACEC,GAAWD,CAAK,EADJ,GAIpB,SAAOE,GAAe,CACrB,IAAMC,EAAM,OAAO,KAAK,UAAU,IAAID,CAAE,GACxC,OAAO,KAAK,MAAM,SACjBC,EACA,IACC,IAAIC,GAAY,CACf,GAAAF,EACA,WAAY,KAAK,WACjB,QAAS,KAAK,QACd,QAAS,KAAK,QACd,IAAAC,CACD,CAAC,CACH,CACD,EAEA,aAAU,CAAC,CACV,MAAAH,EACA,IAAKK,CACN,EAAsC,CAAC,IAAM,CAC5C,IAAMF,EACLE,GAAe,WAAW,KAAK,UAAU,IAAI,KAAK,eAAeL,CAAK,CAAC,GACxE,OAAO,KAAK,MAAM,SACjBG,EACA,IACC,IAAIG,GAAgB,CACnB,MAAAN,EACA,WAAY,KAAK,WACjB,QAAS,KAAK,QACd,QAAS,KAAK,QACd,IAAAG,CACD,CAAC,EACDI,GAAa,CACbA,EAASC,EAAM,EAAER,CAAK,CACvB,CACD,CACD,EAEA,aAAU,CAAC,CACV,MAAAA,EACA,IAAKK,CACN,EAAsC,CAAC,IAAM,CAC5C,IAAMF,EACLE,GAAe,WAAW,KAAK,UAAU,IAAI,KAAK,eAAeL,CAAK,CAAC,GACxE,OAAO,KAAK,MAAM,SACjBG,EACA,IACC,IAAIM,GAAgB,CACnB,MAAAT,EACA,WAAY,KAAK,WACjB,QAAS,KAAK,QACd,QAAS,KAAK,QACd,IAAAG,CACD,CAAC,EACDI,GAAa,CACbA,EAASC,EAAM,EAAER,CAAK,CACvB,CACD,CACD,EAEA,cAAW,CAAC,CACX,MAAAA,EACA,SAAAU,EACA,KAAAC,EACA,IAAKN,CACN,IAKM,CACL,IAAMF,EACLE,GACA,YAAY,KAAK,UAAU,IAAI,KAAK,eAAeL,CAAK,CAAC,IAAIU,CAAQ,GACtE,OAAO,KAAK,MAAM,SACjBP,EACA,IACC,IAAIS,GAAiB,CACpB,MAAAZ,EACA,WAAY,KAAK,WACjB,QAAS,KAAK,QACd,QAAS,KAAK,QACd,IAAAG,EACA,SAAAO,EACA,KAAAC,CACD,CAAC,EACDJ,GAAa,CACbA,EAASC,EAAM,EAAER,CAAK,CACvB,CACD,CACD,EAEA,qBAAkB,CAAC,CAClB,MAAAA,EACA,SAAAU,EACA,IAAKL,CACN,IAIM,CACL,IAAMF,EACLE,GACA,mBAAmB,KAAK,UAAU,IAAI,KAAK,eAC1CL,CACD,CAAC,IAAIU,CAAQ,GACd,OAAO,KAAK,MAAM,SACjBP,EACA,IACC,IAAIU,GAAqB,CACxB,MAAAb,EACA,WAAY,KAAK,WACjB,QAAS,KAAK,QACd,QAAS,KAAK,QACd,IAAAG,EACA,SAAAO,CACD,CAAC,EACDH,GAAa,CACbA,EAASC,EAAM,EAAER,CAAK,CACvB,CACD,CACD,EAjJC,KAAK,MAAQJ,EACb,KAAK,WAAaD,EAClB,KAAK,QAAUE,EAAS,IACxB,KAAK,QAAUC,EACf,KAAK,gBAAkBC,EAEvB,KAAK,IAAM,KAAK,gBAAgB,OAAO,KACtC,KAAK,gBACL,KAAK,UACN,EACA,KAAK,OAAS,KAAK,gBAAgB,OAAO,KACzC,KAAK,gBACL,KAAK,UACN,EACA,KAAK,UAAY,KAAK,gBAAgB,wBAAwB,KAC7D,KAAK,gBACL,KAAK,UACN,CACD,CAgID,ECvLO,IAAMe,GAAN,cAAyBC,EAAW,CAK1C,YAAY,CACX,aAAAC,EAAe,EAAI,IACnB,QAAAC,CACD,EAGG,CACF,MAAM,EAXP,KAAQ,OAAsC,IAAI,IAwClD,KAAQ,oBAAuBC,GAA0B,CACxD,WAAW,IAAM,CACZA,EAAM,YAGN,KAAK,OAAO,IAAIA,EAAM,GAAG,IAAMA,GAClC,KAAK,OAAO,OAAOA,EAAM,GAAG,CAE9B,EAAG,KAAK,aAAa,CACtB,EApCC,KAAK,cAAgBF,EACrB,KAAK,QAAUC,CAChB,CAEA,IAA8BE,EAAuB,CACpD,OAAQ,KAAK,OAAO,IAAIA,CAAG,GAAW,IACvC,CAEA,IAA8BC,EAAU,CACvC,YAAK,OAAO,IAAIA,EAAM,IAAKA,CAAK,EAChCA,EAAMC,EAAmB,EAAE,KAAK,mBAAmB,EAC5CD,CACR,CAEA,SACCD,EACAG,EACAC,EACC,CACD,IAAMC,EAAW,KAAK,IAAOL,CAAG,EAChC,OAAIK,GACHD,IAASC,CAAQ,EACVA,GAED,KAAK,IAAIF,EAAO,CAAC,CACzB,CAYD,ECnBO,IAAMG,GAAN,cAAoDC,CAWxD,CAuBF,YACSC,EACAC,EACRC,EACC,CACD,MAAM,EAJE,YAAAF,EACA,aAAAC,EAmFT,KAAQ,QAAWE,GAKX,KAAK,UAAU,QAAQA,CAAI,EA4CnC,WAAQ,SAAY,CACnB,IAAMC,EAAkB,OAAO,KAAK,KAAK,OAAO,WAAW,EACvDC,EAAc,CAAC,EACnB,QAAWC,KAAkBF,EAC5BC,EAAYC,CAAc,EAAI,MAAMC,GACnC,KAAK,WACLD,CACD,EAED,IAAME,EAAO,MAAM,KAAK,KAAK,MAAM,EAC7BC,EACL,OAAO,UAAc,KACrB,OAAO,UAAU,QAAY,KAC7B,aAAc,UAAU,QACrB,MAAM,UAAU,QAAQ,SAAS,EACjC,OAGEC,EAAuB,OAAO,OAAOL,CAAW,EAAE,OACvD,CAACM,EAAK,CAAE,KAAAC,CAAK,IAAMD,EAAMC,EACzB,CACD,EACMC,EAAgBL,EAAK,cAAc,KAAOA,EAAK,eAAe,KAC9DM,EAAkBD,EAAgBH,EAExC,MAAO,CACN,YAAAL,EACA,KAAAG,EACA,QAAAC,EACA,cAAAI,EACA,qBAAAH,EACA,gBAAAI,EACA,WACCL,GAAS,OAASA,GAAS,MACxBA,EAAQ,MAAQA,EAAQ,MACxB,MACL,CACD,EAEA,WAAQ,SAAY,CACnB,KAAK,KAAK,KAAK,EACf,KAAK,KAAK,QAAQ,EAGlB,MAAM,KAAK,UAAU,QAAQ,EAE7B,KAAK,KAAK,MAAM,EAMhB,MAAM,IAAI,QAAc,MAAOM,GAAY,CAC1C,MAAMC,GAAc,KAAK,UAAU,EACnC,MAAMA,GAAc,KAAK,MAAM,EAC/BD,EAAQ,CACT,CAAC,EAED,KAAK,QAAQ,MAAM,eAAe,CACnC,EAEA,6BAA0B,SAAY,CACrC,KAAK,KAAK,KAAK,EACf,MAAME,GAAmB,KAAK,UAAW,SAAS,CACnD,EAEA,YAAS,SAAY,CACpB,IAAMC,EAAa,MAAM,KAAK,KAAK,OAAO,EAC1C,OAAO,OAAO,KAAK,KAAK,UAAUA,CAAU,CAAC,CAC9C,EAEA,YAAS,MAAOC,GAAmB,CAClC,KAAK,QAAQ,IAAI,mBAAmB,EAEpC,MAAMH,GAAc,KAAK,QAAQ,UAAU,EAE3C,IAAME,EAAa,KAAK,MAAMC,EAAO,SAAS,CAAC,EAC/C,MAAM,KAAK,KAAK,UAAUD,CAAU,EAGpC,IAAME,EAAUF,EAAW,OAAO,QAC5BG,EAAY,UAAU,eAC3B,CAAC,KAAK,UAAW,aAAa,EAAE,KAAK,GAAG,CACzC,EACA,MAAM,IAAI,QAAQ,CAACN,EAASO,IAAW,CACtCD,EAAU,UAAYN,EACtBM,EAAU,QAAUC,CACrB,CAAC,EAED,IAAMC,EAAgB,KAAK,QAAQ,OACnC,KAAK,QAAQ,OAASL,EAAW,OAGjC,KAAK,QAAQ,WAAa,MAAMM,GAAqB,CACpD,KAAM,KAAK,KACX,WAAY,KAAK,OAAO,WACxB,QAAS,KAAK,QACd,QAAAJ,CACD,CAAC,EAED,KAAK,QAAQ,IAAI,4CAA4C,EAC7D,MAAM,KAAK,UAAU,QAAQ,CAC5B,WAAYF,EAAW,WACvB,UAAWA,EAAW,UACtB,MAAO,EACR,CAAC,EAGD,MAAMF,GAAc,KAAK,QAAQ,UAAU,EAC3C,KAAK,QAAQ,IAAI,kCAAkC,EAEnD,KAAK,QAAQ,OAASO,EACtB,KAAK,QAAQ,WAAa,MAAMC,GAAqB,CACpD,KAAM,KAAK,KACX,WAAY,KAAK,OAAO,WACxB,QAAS,KAAK,QACd,QAASD,EAAc,OACxB,CAAC,CACF,EAtPC,KAAK,KAAOrB,EAAW,KACvB,KAAK,gBAAkB,OAAO,KAAKD,EAAQ,OAAO,WAAW,EAC7D,KAAK,MACJ,KAAK,OAAO,YAAc,CAACA,EAAQ,OAAO,IACvC,IAAIwB,GAA8B,KAAK,OAAO,WAAY,CAC1D,KAAM,KAAK,KACX,OAAQ,KAAK,QACb,IAAK,KAAK,QAAQ,GAClB,CAAC,EACD,IAAIC,GACJzB,EAAQ,OAAO,KAAO,KAAK,OAAO,YACrCA,EAAQ,IACP,OACA,wIACD,EAGD,KAAK,aAAe,IAAI0B,GAAY,CACnC,GAAI,KAAK,OACT,KAAM,KAAK,KACX,QAAS,KAAK,QACd,OAAQ,KAAK,OAAO,MACpB,KAAM,KAAK,IACZ,CAAC,EACD,KAAK,UAAY,IAAIC,GAAY,CAChC,QAAS,KAAK,QACd,KAAM,KAAK,KACX,MAAO,KAAK,YACb,CAAC,EACD,KAAK,YAAc,IAAIC,GAAW,CACjC,QAAA5B,CACD,CAAC,EACD,KAAK,iBAAmB,IAAI6B,GAC3B,KAAK,KACL,KAAK,OACL,KAAK,SACN,EAEA,IAAMC,EAAmBC,GAAS,IAAM,CACvC,KAAK,KAAK,YAAY,CACvB,EAAG,GAAG,EACN,KAAK,QAAQ,aAAa,UAAU,aAAcD,CAAgB,EAElE,KAAK,WAAW,iBAAiB,gBAAiB,IAAM,CACvD,KAAK,QAAQ,MACZ,kDAAkD,KAAK,SAAS,EACjE,EACA,KAAK,WAAW,MAAM,EAClB,OAAO,OAAW,KACrB,OAAO,SAAS,OAAO,CAEzB,CAAC,EAED,KAAK,OAAO,iBAAiB,gBAAiB,IAAM,CACnD,KAAK,QAAQ,MACZ,kDAAkD,KAAK,SAAS,EACjE,EACA,KAAK,OAAO,MAAM,EACd,OAAO,OAAW,KACrB,OAAO,SAAS,OAAO,CAEzB,CAAC,EAID,OAAW,CAACE,EAAMC,CAAW,IAAK,OAAO,QACxCjC,EAAQ,OAAO,WAChB,EAAG,CACF,IAAMK,EAAiB2B,EACtB,KAAa3B,CAAc,EAAI,IAAI6B,GAAkB,CACrD,WAAY7B,EACZ,MAAO,KAAK,YACZ,QAAS,KAAK,QACd,SAAU,KAAK,SACf,gBAAiB,KAAK,eACvB,CAAC,CACF,CACD,CA/FA,IAAI,MAAO,CACV,OAAO,KAAK,KACb,CAEA,IAAI,UAAW,CACd,OAAO,KAAK,SACb,CAEA,IAAI,iBAAkB,CACrB,OAAO,KAAK,gBACb,CA+FA,IAAI,YAAa,CAChB,OAAO,KAAK,QAAQ,UACrB,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,QAAQ,MACrB,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,QAAQ,MACrB,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,QAAQ,SACrB,CAEA,IAAI,aAAc,CACjB,OAAO,KAAK,QAAQ,WACrB,CAKA,IAAI,UAAW,CACd,OAAO,KAAK,KAAK,QAClB,CAYA,IAAI,OAAQ,CACX,OAAO,KAAK,SAAS,KACtB,CAyHD,EC5TO,IAAM8B,GAAN,KAA6C,CACnD,YAAYC,EAAU,CACrB,KAAK,MAAQA,CACd,CAIA,OAAuB,CACtB,OAAO,KAAK,KACb,CACD,EC2DO,IAAMC,GAAN,KAIL,CAcD,YACkBC,EAChB,CADgB,UAAAA,EARlB,KAAQ,cAAgB,GAiBxB,KAAQ,WAAa,MAAOA,GAAkC,CAG7D,GAAI,OAAO,OAAW,KAAe,CAACA,EAAK,UAC1C,MAAM,IAAI,MACT,6RACD,EAGD,GAAI,KAAK,eAAiB,KAAK,eAC9B,OAAO,KAAK,cAEb,KAAK,cAAgB,GACrB,GAAI,CACH,IAAIC,EACJ,OAAID,EAAK,OAAO,IACfC,EAAU,MAAM,KAAK,uBAAuBD,CAAI,GAEhDC,EAAU,MAAM,KAAK,oBAAoBD,CAAI,EAC7C,KAAK,oBAAoBA,CAAI,GAG9B,KAAK,aAAaC,CAAO,EACzB,KAAK,eAAiBA,EACfA,CACR,OAASC,EAAK,CACb,WAAK,YAAYA,CAAY,EACvBA,CACP,QAAE,CACD,KAAK,cAAgB,EACtB,CACD,EAEA,KAAQ,oBAAsB,MAAOF,GAAkC,CACtE,GAAM,CAAE,GAAIG,CAAO,EAAI,MAAMC,GAAqB,CACjD,UAAWJ,EAAK,UAChB,IAAKA,EAAK,IACV,UAAWA,EAAK,SACjB,CAAC,EAEKK,EAAuC,CAC5C,UAAW,KAAK,WAChB,OAAAF,EACA,OAAQH,EAAK,OACb,IAAKA,EAAK,MAAQ,IAAM,CAAC,GACzB,YAAaA,EAAK,aAAe,IAAIM,GACrC,aAAc,IAAIC,EAClB,aAAc,IAAIA,EAClB,QAAUC,GACLR,EAAK,sBACD,IAAI,QAAQQ,CAAK,EAEjB,IAAIC,GAAYD,CAAK,CAG/B,EACME,EAAO,IAAIC,GAAS,CACzB,QAAAN,EACA,gBAAiBL,EAAK,eACvB,CAAC,EAGD,MAAMU,EAAK,aAAaV,EAAK,OAAQA,EAAK,sBAAsB,EAEhE,IAAMY,EAAa,MAAMC,GAAqB,CAC7C,QAAAR,EACA,QAASL,EAAK,OAAO,QACrB,KAAAU,EACA,WAAYV,EAAK,WACjB,UAAWA,EAAK,SACjB,CAAC,EAEKc,EAAuB,OAAO,OAAOT,EAAS,CAAE,WAAAO,CAAW,CAAC,EAclE,OAZgB,IAAIG,GACnB,CACC,WAAYf,EAAK,KACjB,WAAYA,EAAK,WACjB,MAAOA,EAAK,KACb,EACAc,EACA,CACC,KAAAJ,CACD,CACD,CAGD,EAEA,KAAQ,uBAAyB,MAAOV,GAAkC,CACzE,IAAMgB,EAAaC,GAAWjB,EAAK,MAAM,EACzC,QAAQ,KAAK,iDAAiDgB,CAAU,EAAE,EAE1E,IAAME,EAAe,SAASlB,EAAK,SAAS,IAAIgB,CAAU,GACpD,CAAE,GAAIb,CAAO,EAAI,MAAMgB,GAAwB,CACpD,UAAWnB,EAAK,UAChB,IAAKA,EAAK,IACV,UAAWA,EAAK,UAChB,aAAckB,CACf,CAAC,EAEKb,EAAuC,CAC5C,UAAW,KAAK,WAChB,OAAAF,EACA,OAAQH,EAAK,OACb,IAAKA,EAAK,MAAQ,IAAM,CAAC,GACzB,YAAaA,EAAK,aAAe,IAAIM,GACrC,aAAc,IAAIC,EAClB,aAAc,IAAIA,EAClB,QAAUC,GACLR,EAAK,sBACD,IAAI,QAAQQ,CAAK,EAEjB,IAAIC,GAAYD,CAAK,CAG/B,EACME,EAAO,IAAIC,GAAS,CACzB,QAAAN,EACA,gBAAiBL,EAAK,eACvB,CAAC,EAGD,MAAMU,EAAK,aAAaV,EAAK,OAAQA,EAAK,sBAAsB,EAEhE,IAAMY,EAAa,MAAMQ,GAAwB,CAChD,QAAAf,EACA,QAASL,EAAK,OAAO,QACrB,KAAAU,EACA,WAAYV,EAAK,WACjB,UAAWA,EAAK,UAChB,aAAAkB,CACD,CAAC,EAEKJ,EAAuB,OAAO,OAAOT,EAAS,CAAE,WAAAO,CAAW,CAAC,EAclE,OAZgB,IAAIG,GACnB,CACC,WAAYf,EAAK,KACjB,WAAYA,EAAK,WACjB,MAAOA,EAAK,KACb,EACAc,EACA,CACC,KAAAJ,CACD,CACD,CAGD,EAEA,KAAQ,oBAAsB,MAAOV,GAAkC,CAMtE,IAAMqB,GALe,MAAMC,GAA+BtB,EAAK,SAAS,GAEtE,OAAQuB,GAAOA,EAAG,MAAM,WAAW,QAAQ,CAAC,EAC5C,IAAKA,GAAOA,EAAG,IAAK,EAEoB,OACxCA,GACA,CAACA,EAAG,WAAW,SAASvB,EAAK,SAAS,IAAIiB,GAAWjB,EAAK,MAAM,CAAC,EAAE,CACrE,EACA,QAAWuB,KAAMF,EAChB,MAAMG,GAAeD,EAAIvB,EAAK,SAAS,CAEzC,EAiBA,UAAO,IAAM,KAAK,WAAW,KAAK,IAAI,EAEtC,WAAQ,SAAY,CACf,KAAK,gBACR,KAAK,eAAe,MAAM,EAEvB,KAAK,gBACP,MAAM,KAAK,eAAe,MAAM,CAEnC,EAEA,6BAA0B,SAAY,CACrC,MAAMyB,GAAmB,KAAK,SAAS,CACxC,EAzMC,KAAK,cAAgB,IAAI,QAAQ,CAACC,EAASC,IAAW,CACrD,KAAK,aAAeD,EACpB,KAAK,YAAcC,CACpB,CAAC,EACD,KAAK,WAAa3B,EAAK,SACxB,CAZA,IAAI,WAAY,CACf,OAAO,KAAK,UACb,CAkLA,IAAI,SAAU,CAIb,OAAO,KAAK,cACb,CAEA,IAAI,cAAe,CAClB,OAAO,KAAK,aACb,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,KAAK,MAClB,CAgBD,ECzSC,OAAe,QAAU4B",
|
|
6
|
-
"names": ["require_pad", "__commonJSMin", "exports", "module", "num", "size", "s", "require_fingerprint_browser", "__commonJSMin", "exports", "module", "pad", "env", "globalCount", "mimeTypesLength", "clientId", "require_getRandomValue_browser", "__commonJSMin", "exports", "module", "getRandomValue", "crypto", "lim", "require_cuid", "__commonJSMin", "exports", "module", "fingerprint", "pad", "getRandomValue", "c", "blockSize", "base", "discreteValues", "randomBlock", "safeCounter", "cuid", "letter", "timestamp", "counter", "print", "random", "date", "stringToCheck", "stringLength", "require_object_hash", "__commonJSMin", "exports", "module", "e", "r", "o", "i", "u", "s", "n", "t", "a", "w", "b", "m", "c", "d", "h", "p", "g", "y", "l", "f", "O", "H", "j", "C", "v", "_", "E", "I", "A", "Y", "B", "F", "L", "U", "D", "x", "T", "M", "k", "N", "S", "src_exports", "__export", "Client", "ClientDescriptor", "Entity", "EntityFile", "MigrationPathError", "ServerSync", "collection", "createDefaultMigration", "createMigration", "migrate", "schema", "import_cuid", "VERSION_BLOCK_LENGTH", "ENCODING_NUMBER_RADIX", "encodeVersion", "version", "OLD_encodeVersion", "HybridLogicalClockTimestampProvider", "generateNodeId", "version", "getHlcNow", "OLD_encodeVersion", "OLD_serializeHlcTimestamp", "remoteTimestamp", "hlcString", "VERSION_BLOCK_LENGTH", "updateFromRemote", "deserializeHlcTimestamp", "raw", "encodeVersion", "serializeHlcTimestamp", "timestamp", "ClockDriftError", "args", "OverflowError", "COUNTER_BLOCK_LENGTH", "NODE_BLOCK_LENGTH", "MAX_CLOCK_DRIFT", "TIME_BLOCK_LENGTH", "cuid", "ts", "dateString", "ENCODING_NUMBER_RADIX", "counter", "node", "prev", "wallTime", "newWallTime", "newCounter", "local", "remote", "newTime", "maxCounter", "clock", "time", "counterNum", "OLD_serializeHlcTimestamp", "ts", "dateString", "counter", "node", "getTimestampSchemaVersion", "timestamp", "VERSION_BLOCK_LENGTH", "compareTimestampSchemaVersions", "a", "b", "isFileRef", "value", "createFileRef", "id", "getRandomValues", "rnds8", "rng", "regex_default", "validate", "uuid", "regex_default", "validate_default", "byteToHex", "i", "stringify", "arr", "offset", "uuid", "validate_default", "stringify_default", "v4", "options", "buf", "offset", "rnds", "rng", "i", "stringify_default", "v4_default", "isRef", "obj", "isObjectRef", "isFileRef", "compareRefs", "a", "b", "import_object_hash", "orderedReplacer", "_", "v", "ka", "kb", "stableStringify", "obj", "cloneDeep", "copyOids", "isObject", "oid", "maybeGetOid", "clone", "key", "value", "assignOid", "hashObject", "hash", "roughSizeOfObject", "object", "objectList", "stack", "bytes", "i", "assert", "condition", "message", "generateId", "length", "v4_default", "findLastIndex", "array", "predicate", "debounce", "fn", "wait", "timeout", "args", "context", "LEGACY_OID_KEY", "OID_KEY", "COLLECTION_SEPARATOR", "RANDOM_SEPARATOR", "oidMap", "getOid", "obj", "oid", "maybeGetOid", "assert", "isObject", "assignOid", "hasOid", "removeOid", "isOidKey", "key", "ensureOid", "rootOid", "createSubId", "createSubOid", "ensureCompatibleOid", "existingOid", "areOidsRelated", "SANTIIZE_PLACEHOLDERS", "sanitizeFragment", "id", "unsanitizeFragment", "createOid", "collection", "documentId", "subId", "root", "createOidSubId", "decomposeOid", "core", "random", "idOrLegacyPathId", "assignOidsToAllSubObjects", "obj", "createSubId", "rootOid", "getOid", "item", "i", "isObject", "isRef", "ensureCompatibleOid", "key", "maybeGetOidProperty", "obj", "isObject", "OID_KEY", "LEGACY_OID_KEY", "removeOidProperty", "copyOidFromPropertyToSystem", "obj", "oid", "maybeGetOidProperty", "assignOid", "removeOidPropertiesFromAllSubObjects", "removeOidProperty", "i", "isObject", "key", "removeOidsFromAllSubObjects", "removeOid", "createOidSubId", "v4_default", "createRef", "normalize", "refs", "getOid", "copy", "value", "isObjectRef", "isFileRef", "itemOid", "isRef", "getOidRoot", "oid", "RANDOM_SEPARATOR", "getOidSubIdRange", "legacyDot", "root", "lastSubId", "createSubOid", "areOidsRelated", "oidA", "oidB", "getOidRoot", "isLegacyDotOid", "oid", "RANDOM_SEPARATOR", "isObjectRef", "obj", "isDiffableObject", "val", "isObject", "isRef", "compareNonDiffable", "a", "b", "compareRefs", "diffToPatches", "from", "to", "getNow", "createSubId", "patches", "options", "oid", "getOid", "diffItems", "key", "value", "oldValue", "oldValueOid", "maybeGetOid", "valueOid", "areOidsRelated", "cloneDeep", "createSubOid", "assignOid", "ensureOid", "assert", "initialToPatches", "createRef", "i", "deletedItemsAtEnd", "oldKeys", "isOidKey", "initialToPatches", "initial", "rootOid", "getNow", "createSubId", "patches", "assignOid", "assignOidsToAllSubObjects", "normalized", "normalize", "key", "value", "removeOid", "groupPatchesByIdentifier", "patches", "grouped", "patch", "groupPatchesByRootOid", "root", "getOidRoot", "groupBaselinesByRootOid", "baselines", "listCheck", "obj", "maybeGetOid", "applyPatch", "base", "deletedRefs", "baseAsAny", "index", "spliceResult", "checkRef", "field", "isRef", "valueToRemove", "isObjectRef", "findLastIndex", "item", "isObject", "cloneDeep", "substituteRefsWithObjects", "base", "refs", "used", "i", "item", "dereference", "isObject", "isFileRef", "assert", "maybeGetOid", "key", "input", "isObjectRef", "resolved", "assignOid", "isNullable", "field", "hasDefault", "isIndexed", "addFieldDefaults", "collection", "value", "key", "defaultValue", "getFieldDefault", "traverseCollectionFieldsAndApplyDefaults", "subField", "item", "OID_KEY", "LEGACY_OID_KEY", "removeExtraProperties", "fieldValue", "traverseCollectionFieldsAndRemoveExtraProperties", "isObject", "isMatchIndexFilter", "filter", "isRangeIndexFilter", "isCompoundIndexFilter", "isStartsWithIndexFilter", "isSortIndexFilter", "collection", "synthetics", "indexes", "input", "finalIndexes", "key", "field", "isIndexed", "schema", "COMPOUND_INDEX_SEPARATOR", "COMPOUND_INDEX_LOWER_BOUND_SEPARATOR", "COMPOUND_INDEX_UPPER_BOUND_SEPARATOR", "createCompoundIndexValue", "fields", "value", "expandArrayIndex", "createUpperBoundIndexValue", "createLowerBoundIndexValue", "field", "newValue", "previousValue", "fieldValue", "item", "isDirectSynthetic", "index", "computeSynthetics", "schema", "obj", "result", "name", "property", "sanitizeIndexValue", "computeCompoundIndices", "doc", "acc", "indexKey", "key", "computeIndexedFields", "isIndexed", "getIndexValues", "NULL_INDEX_VALUE", "sanitizeIndexValue", "value", "emptySchema", "migrate", "oldSchemaOrNewSchema", "newSchemaOrProcedure", "procedureIfTwoSchemas", "isProcedureSecondArgument", "oldSchema", "newSchema", "procedure", "changedCollections", "key", "stableStringify", "removedCollections", "addedCollections", "autoMigratedCollections", "collection", "oldFields", "newFields", "addedIndexes", "removedIndexes", "changed", "oldIndexes", "getIndexes", "newIndexes", "added", "index", "i", "removed", "withDefaults", "collectionName", "val", "addFieldDefaults", "autoMigration", "removeExtraProperties", "engine", "migratedCollections", "strategy", "auto", "wrapped", "baseValue", "assignOid", "getOid", "name", "unmigrated", "getIndexes", "collection", "key", "fieldName", "createDefaultMigration", "schema", "newSchema", "migrate", "info", "old", "createMigration", "maybeOldSchema", "maybeNewSchemaOrProcedure", "maybeProcedure", "isProcedureSecondArgument", "oldSchema", "emptySchema", "procedure", "assert", "changedCollections", "addedCollections", "removedCollections", "addedIndexes", "removedIndexes", "autoMigratedCollections", "autoMigration", "getMigrationInfo", "engine", "migratedCollections", "strategy", "auto", "wrapped", "val", "baseValue", "assignOid", "getOid", "name", "unmigrated", "stableStringify", "oldFields", "newFields", "hasDefault", "changed", "oldIndexes", "newIndexes", "added", "index", "i", "removed", "collectionName", "addFieldDefaults", "removeExtraProperties", "PatchCreator", "getNow", "createSubId", "from", "to", "options", "diffToPatches", "obj", "oid", "initialToPatches", "key", "value", "isObject", "isRef", "itemOid", "createSubOid", "createRef", "index", "only", "count", "fromIndex", "toIndex", "oids", "EventSubscriber", "_onAllUnsubscribed", "event", "acc", "count", "callback", "key", "generateId", "subscribers", "args", "c", "events", "getUndoOperations", "oid", "initial", "operations", "getNow", "state", "cloneDeep", "undoOperations", "operation", "undo", "getUndoOperation", "applyPatch", "data", "index", "indexesOfValue", "Batcher", "flusher", "key", "batch", "userData", "items", "max", "timeout", "Batch", "startedAt", "needsSchedule", "storeRequestPromise", "request", "resolve", "reject", "getSizeOfObjectStore", "database", "storeName", "resolve", "reject", "tx", "cursorReq", "count", "size", "e", "cursor", "roughSizeOfObject", "getAllFromObjectStores", "db", "stores", "transaction", "promises", "store", "objectStore", "storeRequestPromise", "closeDatabase", "deleteAllDatabases", "namespace", "indexedDB", "req1", "req2", "deleteDatabase", "name", "getAllDatabaseNamesAndVersions", "IDBService", "db", "storeNames", "mode", "storeName", "getRequest", "transaction", "store", "request", "storeRequestPromise", "getRequests", "requests", "iterator", "req", "resolve", "reject", "cursor", "AckInfoStore", "IDBService", "result", "store", "ack", "BaselinesStore", "IDBService", "db", "oid", "mode", "transaction", "baselines", "baseline", "iterator", "store", "root", "getOidRoot", "isDot", "isLegacyDotOid", "start", "end", "getOidSubIdRange", "docOids", "timestamp", "range", "import_cuid", "LocalReplicaStore", "IDBService", "transaction", "lookup", "store", "replicaInfo", "cuid", "data", "localReplicaInfo", "localInfo", "MessageCreator", "meta", "init", "localInfo", "op", "targetVersion", "since", "localReplicaInfo", "provideChangesSince", "operations", "affectedDocs", "patch", "getOidRoot", "baselines", "presence", "nonce", "OperationsStore", "IDBService", "oid", "iterator", "to", "from", "after", "mode", "providedTx", "store", "index", "startTimestamp", "start", "createCompoundIndexValue", "createLowerBoundIndexValue", "end", "createUpperBoundIndexValue", "range", "request", "resolve", "reject", "previousTimestamp", "event", "cursor", "value", "assert", "before", "transaction", "patches", "patch", "getOidRoot", "operations", "affected", "op", "SchemaStore", "db", "currentVersion", "request", "value", "storeRequestPromise", "schema", "Metadata", "EventSubscriber", "disableRebasing", "context", "HybridLogicalClockTimestampProvider", "stores", "oid", "oids", "documentOid", "getOidRoot", "assert", "transaction", "baseline", "patch", "options", "baselines", "objectMap", "assignOid", "op", "obj", "newObj", "applyPatch", "root", "substituteRefsWithObjects", "timestamp", "localReplicaInfo", "operations", "operation", "message", "affectedDocumentOids", "affectedOidSet", "globalAckTimestamp", "lastTimestamp", "toRebase", "operationCount", "newBaselines", "upTo", "providedTx", "replicaId", "current", "operationsApplied", "deletedRefs", "store", "newBaseline", "fileRefs", "isFileRef", "schema", "overrideConflict", "storedSchema", "db", "getAllFromObjectStores", "localReplica", "data", "storeRequestPromise", "operationsSize", "getSizeOfObjectStore", "baselinesSize", "SchemaStore", "OperationsStore", "BaselinesStore", "LocalReplicaStore", "AckInfoStore", "MessageCreator", "PatchCreator", "migrations", "version1", "version2", "version3", "version4", "openMetadataDatabase", "indexedDB", "namespace", "log", "resolve", "reject", "request", "wasInitialized", "event", "db", "tx", "toRun", "migration", "openWIPMetadataDatabase", "wipNamespace", "result", "prodDb", "baselines", "operations", "info", "storeRequestPromise", "wipTx", "wipBaselines", "wipOperations", "wipInfo", "baseline", "operation", "infoItem", "closeDatabase", "baselinesStore", "operationsStore", "infoStore", "cursorReq", "cursor", "isLocal_timestamp", "documentOid_timestamp", "value", "files", "matchIndexToIdbKeyRange", "filter", "sanitizeIndexValue", "sortIndexToIdbKeyRange", "rangeIndexToIdbKeyRange", "lower", "upper", "compoundIndexToIdbKeyRange", "schema", "collection", "indexDefinition", "assert", "matchedKeys", "a", "b", "key", "matchedValues", "createCompoundIndexValue", "createLowerBoundIndexValue", "createUpperBoundIndexValue", "startsWithIndexToIdbKeyRange", "getRange", "index", "isRangeIndexFilter", "isMatchIndexFilter", "isSortIndexFilter", "isStartsWithIndexFilter", "getStore", "db", "collection", "write", "findOneOid", "index", "context", "store", "source", "range", "getRange", "direction", "request", "resolve", "reject", "cursor", "createOid", "findAllOids", "results", "findPageOfOids", "limit", "offset", "hasDoneOffset", "hasNextPage", "visited", "getDatabaseVersion", "indexedDB", "namespace", "version", "log", "openAndGetVersion", "resolve", "reject", "currentVersion", "database", "request", "event", "transaction", "db", "closeDatabase", "upgradeDatabase", "indexedDb", "upgrader", "openAndUpgrade", "wasUpgraded", "acquireLock", "procedure", "openDatabase", "MigrationPathError", "message", "getMigrationPath", "currentVersion", "targetVersion", "migrations", "path", "getNextPathStep", "MigrationPathError", "fromHere", "m", "a", "b", "next", "nextPath", "globalIDB", "openDocumentDatabase", "version", "indexedDB", "migrations", "meta", "context", "currentVersion", "getDatabaseVersion", "toRun", "getMigrationPath", "m", "runMigrations", "openDatabase", "openWIPDocumentDatabase", "wipNamespace", "currentWIPVersion", "initialToRun", "mainDatabase", "wipDatabase", "mainDatabaseStoreNames", "i", "copyFromTransaction", "copyFromStores", "name", "allObjects", "store", "storeRequestPromise", "copyToTransaction", "copyToStores", "obj", "namespace", "acquireLock", "migration", "engine", "getInitialMigrationEngine", "originalDatabase", "getMigrationEngine", "err", "closeDatabase", "upgradeDatabase", "transaction", "db", "newCollection", "collection", "newIndex", "oldIndex", "removedCollection", "docsWithUnappliedMigrations", "getDocsWithUnappliedMigrations", "upgradedDatabase", "readStore", "oids", "getAllKeys", "key", "createOid", "oid", "decomposeOid", "views", "snap", "e", "s", "snapshot", "view", "getIndexValues", "writeStore", "putView", "id", "deleteView", "col", "getMigrationMutations", "getMigrationNow", "newOids", "acc", "collectionName", "doc", "addFieldDefaults", "primaryKey", "initialToPatches", "getMigrationQueries", "filter", "findOneOid", "findAllOids", "queries", "mutations", "awaitables", "strategy", "docs", "assert", "hasOid", "original", "cloneDeep", "newValue", "removeOidPropertiesFromAllSubObjects", "assignOidsToAllSubObjects", "patches", "diffToPatches", "resolve", "reject", "request", "event", "_", "unappliedOperations", "op", "getOidRoot", "UndoHistory", "EventSubscriber", "next", "undoPoint", "redoPoint", "DocumentManager", "meta", "schema", "entities", "collection", "init", "primaryKeyName", "primaryKey", "assert", "createOid", "collectionName", "addFieldDefaults", "options", "defaulted", "oid", "ids", "UPDATE", "MARK_FAILED", "_a", "_b", "EntityFile", "EventSubscriber", "id", "downloadRemote", "fileData", "import_cuid", "createFileData", "file", "cuid", "processValueFiles", "value", "onFileIdentified", "data", "createFileRef", "i", "key", "fileToArrayBuffer", "resolve", "reject", "reader", "FileStorage", "IDBService", "file", "transaction", "downloadRemote", "buffer", "fileToArrayBuffer", "r", "err", "store", "raw", "arrayBufferToBlob", "id", "current", "iterator", "value", "type", "defaultCanCleanup", "fileData", "FileManager", "db", "sync", "context", "meta", "config", "fileInput", "file", "UPDATE", "entityFile", "EntityFile", "retries", "result", "id", "MARK_FAILED", "err", "online", "unsynced", "count", "skipCount", "store", "fileRefs", "tx", "fileRef", "FileStorage", "REFRESH", "DEEP_CHANGE", "refreshEntity", "entity", "info", "_a", "_b", "Entity", "_Entity", "oid", "store", "fieldSchema", "cache", "parent", "onAllUnsubscribed", "readonlyKeys", "view", "deleted", "lastTimestamp", "restored", "source", "key", "event", "callback", "patches", "cloneDeep", "value", "isObjectRef", "subObject", "isFileRef", "file", "traverseCollectionFieldsAndApplyDefaults", "processValueFiles", "result", "index", "snapshot", "item", "idx", "assignOid", "deleteMode", "property", "replaceSubObjects", "merge", "field", "withoutFiles", "itemOid", "maybeGetOid", "from", "to", "itemRef", "val", "predicate", "collection", "decomposeOid", "EventSubscriber", "assert", "latest", "child", "childTimestamp", "Resolvable", "resolve", "reject", "res", "rej", "value", "reason", "DocumentFamilyCache", "EventSubscriber", "oid", "store", "context", "Resolvable", "operations", "oidSet", "operation", "existingOperations", "entity", "refreshEntity", "info", "index", "op", "unconfirmedOperations", "baselines", "affectedOids", "baseline", "existing", "ops", "reset", "isLocal", "entityRef", "view", "deleted", "after", "futureSeen", "now", "compareTimestampSchemaVersions", "applyPatch", "confirmed", "assignOid", "snapshot", "cloneDeep", "result", "logicalTimestamp", "schema", "parent", "readonlyKeys", "Entity", "dropUnconfirmed", "dropAll", "DEFAULT_BATCH_KEY", "EntityStore", "context", "meta", "batchTimeout", "files", "oid", "collection", "decomposeOid", "schema", "familyCache", "dropUnconfirmed", "dropAll", "transaction", "baselines", "operations", "baseline", "op", "documentOid", "getOidRoot", "DocumentFamilyCache", "rootOid", "id", "entity", "snapshot", "stored", "getIndexValues", "store", "storeRequestPromise", "readonlyKeys", "cache", "initial", "options", "removeOidsFromAllSubObjects", "processed", "processValueFiles", "assignOid", "info", "operationsByOid", "groupPatchesByRootOid", "baselinesByOid", "groupBaselinesByRootOid", "reset", "isLocal", "baselinesByDocumentOid", "operationsByDocumentOid", "allDocumentOids", "taggedOperations", "b", "o", "affectedCollections", "undoable", "batchName", "generateId", "max", "timeout", "internalBatch", "externalApi", "fn", "batchKey", "ops", "grouped", "groupPatchesByIdentifier", "inverseOps", "getNow", "patches", "view", "deleted", "inverse", "getUndoOperations", "redo", "assert", "allOids", "oids", "unsubscribe", "tx", "_", "Batcher", "HANDLE_MESSAGE", "_a", "PresenceManager", "EventSubscriber", "initialPresence", "updateBatchTimeout", "defaultProfile", "localReplicaInfo", "userInfo", "message", "peersChanged", "peerIdsSet", "id", "lastPresence", "presence", "presenceUpdates", "acc", "update", "Batcher", "everyone", "FileSync", "endpointProvider", "log", "data", "file", "fileEndpoint", "token", "formData", "response", "e", "id", "Heartbeat", "EventSubscriber", "interval", "deadlineLength", "restartOnTabFocus", "immediate", "PushPullSync", "EventSubscriber", "endpointProvider", "meta", "presence", "interval", "log", "messages", "host", "token", "response", "json", "message", "error", "Heartbeat", "InvalidCharacterError", "message", "this", "prototype", "Error", "name", "r", "window", "atob", "bind", "input", "str", "String", "replace", "length", "bs", "buffer", "bc", "idx", "output", "charAt", "fromCharCode", "indexOf", "t", "decodeURIComponent", "m", "p", "code", "charCodeAt", "toString", "toUpperCase", "err", "InvalidTokenError", "o", "token", "options", "pos", "header", "JSON", "parse", "base64_url_decode", "split", "e", "jwt_decode_esm_default", "ServerSyncEndpointProvider", "config", "result", "res", "assert", "decoded", "jwt_decode_esm_default", "url", "httpEndpoint", "websocketEndpoint", "fileEndpoint", "fileUrl", "BackoffScheduler", "EventSubscriber", "backoff", "Backoff", "max", "factor", "WebSocketSync", "EventSubscriber", "endpointProvider", "meta", "presence", "log", "args", "Heartbeat", "BackoffScheduler", "Backoff", "msg", "online", "event", "message", "endpoint", "NoSync", "EventSubscriber", "PresenceManager", "ServerSync", "authEndpoint", "fetchAuth", "initialPresence", "automaticTransportSelection", "autoStart", "initialTransport", "pullInterval", "presenceUpdateBatchTimeout", "defaultProfile", "useBroadcastChannel", "meta", "log", "onData", "event", "message", "op", "HANDLE_MESSAGE", "online", "presence", "transport", "newSync", "interval", "info", "id", "ServerSyncEndpointProvider", "WebSocketSync", "PushPullSync", "FileSync", "decideIfUpgrade", "switchoverTimeout", "shouldUpgrade", "Disposable", "dispose", "existsFilter", "x", "filterResultSet", "results", "Entity", "areIndexesEqual", "a", "b", "hashObject", "ON_ALL_UNSUBSCRIBED", "UPDATE", "_a", "BaseQuery", "Disposable", "initial", "context", "collection", "key", "shouldUpdate", "value", "filterResultSet", "entity", "Entity", "err", "handler", "EventSubscriber", "event", "shouldUpdateFn", "collections", "eventOrCallback", "callback", "GetQuery", "BaseQuery", "id", "hydrate", "rest", "value", "createOid", "_a", "FindOneQuery", "BaseQuery", "index", "hydrate", "rest", "oid", "findOneOid", "areIndexesEqual", "UPDATE", "_a", "FindPageQuery", "BaseQuery", "index", "hydrate", "pageSize", "page", "rest", "result", "hasNextPage", "findPageOfOids", "areIndexesEqual", "UPDATE", "_a", "FindInfiniteQuery", "BaseQuery", "hydrate", "pageSize", "index", "rest", "result", "hasNextPage", "findPageOfOids", "areIndexesEqual", "UPDATE", "_a", "FindAllQuery", "BaseQuery", "index", "hydrate", "rest", "oids", "findAllOids", "areIndexesEqual", "UPDATE", "CollectionQueries", "collection", "cache", "entities", "context", "documentManager", "index", "hashObject", "id", "key", "GetQuery", "providedKey", "FindOneQuery", "existing", "UPDATE", "FindAllQuery", "pageSize", "page", "FindPageQuery", "FindInfiniteQuery", "QueryCache", "Disposable", "evictionTime", "context", "query", "key", "value", "ON_ALL_UNSUBSCRIBED", "create", "update", "existing", "Client", "EventSubscriber", "config", "context", "components", "data", "collectionNames", "collections", "collectionName", "getSizeOfObjectStore", "meta", "storage", "totalCollectionsSize", "acc", "size", "totalMetaSize", "metaToDataRatio", "resolve", "closeDatabase", "deleteAllDatabases", "metaExport", "buffer", "version", "deleteReq", "reject", "currentSchema", "openDocumentDatabase", "ServerSync", "NoSync", "FileManager", "EntityStore", "QueryCache", "DocumentManager", "notifyFutureSeen", "debounce", "name", "_collection", "CollectionQueries", "FakeWeakRef", "value", "ClientDescriptor", "init", "storage", "err", "metaDb", "openMetadataDatabase", "context", "UndoHistory", "EventSubscriber", "value", "FakeWeakRef", "meta", "Metadata", "documentDb", "openDocumentDatabase", "fullContext", "Client", "schemaHash", "hashObject", "wipNamespace", "openWIPMetadataDatabase", "openWIPDocumentDatabase", "wipDatabasesToDelete", "getAllDatabaseNamesAndVersions", "db", "deleteDatabase", "deleteAllDatabases", "resolve", "reject", "src_exports"]
|
|
4
|
+
"sourcesContent": ["module.exports = function pad (num, size) {\n var s = '000000000' + num;\n return s.substr(s.length - size);\n};\n", "var pad = require('./pad.js');\n\nvar env = typeof window === 'object' ? window : self;\nvar globalCount = Object.keys(env).length;\nvar mimeTypesLength = navigator.mimeTypes ? navigator.mimeTypes.length : 0;\nvar clientId = pad((mimeTypesLength +\n navigator.userAgent.length).toString(36) +\n globalCount.toString(36), 4);\n\nmodule.exports = function fingerprint () {\n return clientId;\n};\n", "\nvar getRandomValue;\n\nvar crypto = typeof window !== 'undefined' &&\n (window.crypto || window.msCrypto) ||\n typeof self !== 'undefined' &&\n self.crypto;\n\nif (crypto) {\n var lim = Math.pow(2, 32) - 1;\n getRandomValue = function () {\n return Math.abs(crypto.getRandomValues(new Uint32Array(1))[0] / lim);\n };\n} else {\n getRandomValue = Math.random;\n}\n\nmodule.exports = getRandomValue;\n", "/**\n * cuid.js\n * Collision-resistant UID generator for browsers and node.\n * Sequential for fast db lookups and recency sorting.\n * Safe for element IDs and server-side lookups.\n *\n * Extracted from CLCTR\n *\n * Copyright (c) Eric Elliott 2012\n * MIT License\n */\n\nvar fingerprint = require('./lib/fingerprint.js');\nvar pad = require('./lib/pad.js');\nvar getRandomValue = require('./lib/getRandomValue.js');\n\nvar c = 0,\n blockSize = 4,\n base = 36,\n discreteValues = Math.pow(base, blockSize);\n\nfunction randomBlock () {\n return pad((getRandomValue() *\n discreteValues << 0)\n .toString(base), blockSize);\n}\n\nfunction safeCounter () {\n c = c < discreteValues ? c : 0;\n c++; // this is not subliminal\n return c - 1;\n}\n\nfunction cuid () {\n // Starting with a lowercase letter makes\n // it HTML element ID friendly.\n var letter = 'c', // hard-coded allows for sequential access\n\n // timestamp\n // warning: this exposes the exact date and time\n // that the uid was created.\n timestamp = (new Date().getTime()).toString(base),\n\n // Prevent same-machine collisions.\n counter = pad(safeCounter().toString(base), blockSize),\n\n // A few chars to generate distinct ids for different\n // clients (so different computers are far less\n // likely to generate the same id)\n print = fingerprint(),\n\n // Grab some more chars from Math.random()\n random = randomBlock() + randomBlock();\n\n return letter + timestamp + counter + print + random;\n}\n\ncuid.slug = function slug () {\n var date = new Date().getTime().toString(36),\n counter = safeCounter().toString(36).slice(-4),\n print = fingerprint().slice(0, 1) +\n fingerprint().slice(-1),\n random = randomBlock().slice(-2);\n\n return date.slice(-2) +\n counter + print + random;\n};\n\ncuid.isCuid = function isCuid (stringToCheck) {\n if (typeof stringToCheck !== 'string') return false;\n if (stringToCheck.startsWith('c')) return true;\n return false;\n};\n\ncuid.isSlug = function isSlug (stringToCheck) {\n if (typeof stringToCheck !== 'string') return false;\n var stringLength = stringToCheck.length;\n if (stringLength >= 7 && stringLength <= 10) return true;\n return false;\n};\n\ncuid.fingerprint = fingerprint;\n\nmodule.exports = cuid;\n", "!function(e){var t;\"object\"==typeof exports?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(\"undefined\"!=typeof window?t=window:\"undefined\"!=typeof global?t=global:\"undefined\"!=typeof self&&(t=self),t.objectHash=e())}(function(){return function r(o,i,u){function s(n,e){if(!i[n]){if(!o[n]){var t=\"function\"==typeof require&&require;if(!e&&t)return t(n,!0);if(a)return a(n,!0);throw new Error(\"Cannot find module '\"+n+\"'\")}e=i[n]={exports:{}};o[n][0].call(e.exports,function(e){var t=o[n][1][e];return s(t||e)},e,e.exports,r,o,i,u)}return i[n].exports}for(var a=\"function\"==typeof require&&require,e=0;e<u.length;e++)s(u[e]);return s}({1:[function(w,b,m){!function(e,n,s,c,d,h,p,g,y){\"use strict\";var r=w(\"crypto\");function t(e,t){t=u(e,t);var n;return void 0===(n=\"passthrough\"!==t.algorithm?r.createHash(t.algorithm):new l).write&&(n.write=n.update,n.end=n.update),f(t,n).dispatch(e),n.update||n.end(\"\"),n.digest?n.digest(\"buffer\"===t.encoding?void 0:t.encoding):(e=n.read(),\"buffer\"!==t.encoding?e.toString(t.encoding):e)}(m=b.exports=t).sha1=function(e){return t(e)},m.keys=function(e){return t(e,{excludeValues:!0,algorithm:\"sha1\",encoding:\"hex\"})},m.MD5=function(e){return t(e,{algorithm:\"md5\",encoding:\"hex\"})},m.keysMD5=function(e){return t(e,{algorithm:\"md5\",encoding:\"hex\",excludeValues:!0})};var o=r.getHashes?r.getHashes().slice():[\"sha1\",\"md5\"],i=(o.push(\"passthrough\"),[\"buffer\",\"hex\",\"binary\",\"base64\"]);function u(e,t){var n={};if(n.algorithm=(t=t||{}).algorithm||\"sha1\",n.encoding=t.encoding||\"hex\",n.excludeValues=!!t.excludeValues,n.algorithm=n.algorithm.toLowerCase(),n.encoding=n.encoding.toLowerCase(),n.ignoreUnknown=!0===t.ignoreUnknown,n.respectType=!1!==t.respectType,n.respectFunctionNames=!1!==t.respectFunctionNames,n.respectFunctionProperties=!1!==t.respectFunctionProperties,n.unorderedArrays=!0===t.unorderedArrays,n.unorderedSets=!1!==t.unorderedSets,n.unorderedObjects=!1!==t.unorderedObjects,n.replacer=t.replacer||void 0,n.excludeKeys=t.excludeKeys||void 0,void 0===e)throw new Error(\"Object argument required.\");for(var r=0;r<o.length;++r)o[r].toLowerCase()===n.algorithm.toLowerCase()&&(n.algorithm=o[r]);if(-1===o.indexOf(n.algorithm))throw new Error('Algorithm \"'+n.algorithm+'\" not supported. supported values: '+o.join(\", \"));if(-1===i.indexOf(n.encoding)&&\"passthrough\"!==n.algorithm)throw new Error('Encoding \"'+n.encoding+'\" not supported. supported values: '+i.join(\", \"));return n}function a(e){if(\"function\"==typeof e)return null!=/^function\\s+\\w*\\s*\\(\\s*\\)\\s*{\\s+\\[native code\\]\\s+}$/i.exec(Function.prototype.toString.call(e))}function f(o,t,i){i=i||[];function u(e){return t.update?t.update(e,\"utf8\"):t.write(e,\"utf8\")}return{dispatch:function(e){return this[\"_\"+(null===(e=o.replacer?o.replacer(e):e)?\"null\":typeof e)](e)},_object:function(t){var n,e=Object.prototype.toString.call(t),r=/\\[object (.*)\\]/i.exec(e);r=(r=r?r[1]:\"unknown:[\"+e+\"]\").toLowerCase();if(0<=(e=i.indexOf(t)))return this.dispatch(\"[CIRCULAR:\"+e+\"]\");if(i.push(t),void 0!==s&&s.isBuffer&&s.isBuffer(t))return u(\"buffer:\"),u(t);if(\"object\"===r||\"function\"===r||\"asyncfunction\"===r)return e=Object.keys(t),o.unorderedObjects&&(e=e.sort()),!1===o.respectType||a(t)||e.splice(0,0,\"prototype\",\"__proto__\",\"constructor\"),o.excludeKeys&&(e=e.filter(function(e){return!o.excludeKeys(e)})),u(\"object:\"+e.length+\":\"),n=this,e.forEach(function(e){n.dispatch(e),u(\":\"),o.excludeValues||n.dispatch(t[e]),u(\",\")});if(!this[\"_\"+r]){if(o.ignoreUnknown)return u(\"[\"+r+\"]\");throw new Error('Unknown object type \"'+r+'\"')}this[\"_\"+r](t)},_array:function(e,t){t=void 0!==t?t:!1!==o.unorderedArrays;var n=this;if(u(\"array:\"+e.length+\":\"),!t||e.length<=1)return e.forEach(function(e){return n.dispatch(e)});var r=[],t=e.map(function(e){var t=new l,n=i.slice();return f(o,t,n).dispatch(e),r=r.concat(n.slice(i.length)),t.read().toString()});return i=i.concat(r),t.sort(),this._array(t,!1)},_date:function(e){return u(\"date:\"+e.toJSON())},_symbol:function(e){return u(\"symbol:\"+e.toString())},_error:function(e){return u(\"error:\"+e.toString())},_boolean:function(e){return u(\"bool:\"+e.toString())},_string:function(e){u(\"string:\"+e.length+\":\"),u(e.toString())},_function:function(e){u(\"fn:\"),a(e)?this.dispatch(\"[native]\"):this.dispatch(e.toString()),!1!==o.respectFunctionNames&&this.dispatch(\"function-name:\"+String(e.name)),o.respectFunctionProperties&&this._object(e)},_number:function(e){return u(\"number:\"+e.toString())},_xml:function(e){return u(\"xml:\"+e.toString())},_null:function(){return u(\"Null\")},_undefined:function(){return u(\"Undefined\")},_regexp:function(e){return u(\"regex:\"+e.toString())},_uint8array:function(e){return u(\"uint8array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint8clampedarray:function(e){return u(\"uint8clampedarray:\"),this.dispatch(Array.prototype.slice.call(e))},_int8array:function(e){return u(\"int8array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint16array:function(e){return u(\"uint16array:\"),this.dispatch(Array.prototype.slice.call(e))},_int16array:function(e){return u(\"int16array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint32array:function(e){return u(\"uint32array:\"),this.dispatch(Array.prototype.slice.call(e))},_int32array:function(e){return u(\"int32array:\"),this.dispatch(Array.prototype.slice.call(e))},_float32array:function(e){return u(\"float32array:\"),this.dispatch(Array.prototype.slice.call(e))},_float64array:function(e){return u(\"float64array:\"),this.dispatch(Array.prototype.slice.call(e))},_arraybuffer:function(e){return u(\"arraybuffer:\"),this.dispatch(new Uint8Array(e))},_url:function(e){return u(\"url:\"+e.toString())},_map:function(e){u(\"map:\");e=Array.from(e);return this._array(e,!1!==o.unorderedSets)},_set:function(e){u(\"set:\");e=Array.from(e);return this._array(e,!1!==o.unorderedSets)},_file:function(e){return u(\"file:\"),this.dispatch([e.name,e.size,e.type,e.lastModfied])},_blob:function(){if(o.ignoreUnknown)return u(\"[blob]\");throw Error('Hashing Blob objects is currently not supported\\n(see https://github.com/puleos/object-hash/issues/26)\\nUse \"options.replacer\" or \"options.ignoreUnknown\"\\n')},_domwindow:function(){return u(\"domwindow\")},_bigint:function(e){return u(\"bigint:\"+e.toString())},_process:function(){return u(\"process\")},_timer:function(){return u(\"timer\")},_pipe:function(){return u(\"pipe\")},_tcp:function(){return u(\"tcp\")},_udp:function(){return u(\"udp\")},_tty:function(){return u(\"tty\")},_statwatcher:function(){return u(\"statwatcher\")},_securecontext:function(){return u(\"securecontext\")},_connection:function(){return u(\"connection\")},_zlib:function(){return u(\"zlib\")},_context:function(){return u(\"context\")},_nodescript:function(){return u(\"nodescript\")},_httpparser:function(){return u(\"httpparser\")},_dataview:function(){return u(\"dataview\")},_signal:function(){return u(\"signal\")},_fsevent:function(){return u(\"fsevent\")},_tlswrap:function(){return u(\"tlswrap\")}}}function l(){return{buf:\"\",write:function(e){this.buf+=e},end:function(e){this.buf+=e},read:function(){return this.buf}}}m.writeToStream=function(e,t,n){return void 0===n&&(n=t,t={}),f(t=u(e,t),n).dispatch(e)}}.call(this,w(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},w(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/fake_9a5aa49d.js\",\"/\")},{buffer:3,crypto:5,lYpoI2:11}],2:[function(e,t,f){!function(e,t,n,r,o,i,u,s,a){!function(e){\"use strict\";var a=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,t=\"+\".charCodeAt(0),n=\"/\".charCodeAt(0),r=\"0\".charCodeAt(0),o=\"a\".charCodeAt(0),i=\"A\".charCodeAt(0),u=\"-\".charCodeAt(0),s=\"_\".charCodeAt(0);function f(e){e=e.charCodeAt(0);return e===t||e===u?62:e===n||e===s?63:e<r?-1:e<r+10?e-r+26+26:e<i+26?e-i:e<o+26?e-o+26:void 0}e.toByteArray=function(e){var t,n;if(0<e.length%4)throw new Error(\"Invalid string. Length must be a multiple of 4\");var r=e.length,r=\"=\"===e.charAt(r-2)?2:\"=\"===e.charAt(r-1)?1:0,o=new a(3*e.length/4-r),i=0<r?e.length-4:e.length,u=0;function s(e){o[u++]=e}for(t=0;t<i;t+=4,0)s((16711680&(n=f(e.charAt(t))<<18|f(e.charAt(t+1))<<12|f(e.charAt(t+2))<<6|f(e.charAt(t+3))))>>16),s((65280&n)>>8),s(255&n);return 2==r?s(255&(n=f(e.charAt(t))<<2|f(e.charAt(t+1))>>4)):1==r&&(s((n=f(e.charAt(t))<<10|f(e.charAt(t+1))<<4|f(e.charAt(t+2))>>2)>>8&255),s(255&n)),o},e.fromByteArray=function(e){var t,n,r,o,i=e.length%3,u=\"\";function s(e){return\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(e)}for(t=0,r=e.length-i;t<r;t+=3)n=(e[t]<<16)+(e[t+1]<<8)+e[t+2],u+=s((o=n)>>18&63)+s(o>>12&63)+s(o>>6&63)+s(63&o);switch(i){case 1:u=(u+=s((n=e[e.length-1])>>2))+s(n<<4&63)+\"==\";break;case 2:u=(u=(u+=s((n=(e[e.length-2]<<8)+e[e.length-1])>>10))+s(n>>4&63))+s(n<<2&63)+\"=\"}return u}}(void 0===f?this.base64js={}:f)}.call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/base64-js/lib/b64.js\",\"/node_modules/gulp-browserify/node_modules/base64-js/lib\")},{buffer:3,lYpoI2:11}],3:[function(O,e,H){!function(e,n,f,r,h,p,g,y,w){var a=O(\"base64-js\"),i=O(\"ieee754\");function f(e,t,n){if(!(this instanceof f))return new f(e,t,n);var r,o,i,u,s=typeof e;if(\"base64\"===t&&\"string\"==s)for(e=(u=e).trim?u.trim():u.replace(/^\\s+|\\s+$/g,\"\");e.length%4!=0;)e+=\"=\";if(\"number\"==s)r=j(e);else if(\"string\"==s)r=f.byteLength(e,t);else{if(\"object\"!=s)throw new Error(\"First argument needs to be a number, array or string.\");r=j(e.length)}if(f._useTypedArrays?o=f._augment(new Uint8Array(r)):((o=this).length=r,o._isBuffer=!0),f._useTypedArrays&&\"number\"==typeof e.byteLength)o._set(e);else if(C(u=e)||f.isBuffer(u)||u&&\"object\"==typeof u&&\"number\"==typeof u.length)for(i=0;i<r;i++)f.isBuffer(e)?o[i]=e.readUInt8(i):o[i]=e[i];else if(\"string\"==s)o.write(e,0,t);else if(\"number\"==s&&!f._useTypedArrays&&!n)for(i=0;i<r;i++)o[i]=0;return o}function b(e,t,n,r){return f._charsWritten=c(function(e){for(var t=[],n=0;n<e.length;n++)t.push(255&e.charCodeAt(n));return t}(t),e,n,r)}function m(e,t,n,r){return f._charsWritten=c(function(e){for(var t,n,r=[],o=0;o<e.length;o++)n=e.charCodeAt(o),t=n>>8,n=n%256,r.push(n),r.push(t);return r}(t),e,n,r)}function v(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var o=t;o<n;o++)r+=String.fromCharCode(e[o]);return r}function o(e,t,n,r){r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(null!=t,\"missing offset\"),d(t+1<e.length,\"Trying to read beyond buffer length\"));var o,r=e.length;if(!(r<=t))return n?(o=e[t],t+1<r&&(o|=e[t+1]<<8)):(o=e[t]<<8,t+1<r&&(o|=e[t+1])),o}function u(e,t,n,r){r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(null!=t,\"missing offset\"),d(t+3<e.length,\"Trying to read beyond buffer length\"));var o,r=e.length;if(!(r<=t))return n?(t+2<r&&(o=e[t+2]<<16),t+1<r&&(o|=e[t+1]<<8),o|=e[t],t+3<r&&(o+=e[t+3]<<24>>>0)):(t+1<r&&(o=e[t+1]<<16),t+2<r&&(o|=e[t+2]<<8),t+3<r&&(o|=e[t+3]),o+=e[t]<<24>>>0),o}function _(e,t,n,r){if(r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(null!=t,\"missing offset\"),d(t+1<e.length,\"Trying to read beyond buffer length\")),!(e.length<=t))return r=o(e,t,n,!0),32768&r?-1*(65535-r+1):r}function E(e,t,n,r){if(r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(null!=t,\"missing offset\"),d(t+3<e.length,\"Trying to read beyond buffer length\")),!(e.length<=t))return r=u(e,t,n,!0),2147483648&r?-1*(4294967295-r+1):r}function I(e,t,n,r){return r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(t+3<e.length,\"Trying to read beyond buffer length\")),i.read(e,t,n,23,4)}function A(e,t,n,r){return r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(t+7<e.length,\"Trying to read beyond buffer length\")),i.read(e,t,n,52,8)}function s(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+1<e.length,\"trying to write beyond buffer length\"),Y(t,65535));o=e.length;if(!(o<=n))for(var i=0,u=Math.min(o-n,2);i<u;i++)e[n+i]=(t&255<<8*(r?i:1-i))>>>8*(r?i:1-i)}function l(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+3<e.length,\"trying to write beyond buffer length\"),Y(t,4294967295));o=e.length;if(!(o<=n))for(var i=0,u=Math.min(o-n,4);i<u;i++)e[n+i]=t>>>8*(r?i:3-i)&255}function B(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+1<e.length,\"Trying to write beyond buffer length\"),F(t,32767,-32768)),e.length<=n||s(e,0<=t?t:65535+t+1,n,r,o)}function L(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+3<e.length,\"Trying to write beyond buffer length\"),F(t,2147483647,-2147483648)),e.length<=n||l(e,0<=t?t:4294967295+t+1,n,r,o)}function U(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+3<e.length,\"Trying to write beyond buffer length\"),D(t,34028234663852886e22,-34028234663852886e22)),e.length<=n||i.write(e,t,n,r,23,4)}function x(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+7<e.length,\"Trying to write beyond buffer length\"),D(t,17976931348623157e292,-17976931348623157e292)),e.length<=n||i.write(e,t,n,r,52,8)}H.Buffer=f,H.SlowBuffer=f,H.INSPECT_MAX_BYTES=50,f.poolSize=8192,f._useTypedArrays=function(){try{var e=new ArrayBuffer(0),t=new Uint8Array(e);return t.foo=function(){return 42},42===t.foo()&&\"function\"==typeof t.subarray}catch(e){return!1}}(),f.isEncoding=function(e){switch(String(e).toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"raw\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return!0;default:return!1}},f.isBuffer=function(e){return!(null==e||!e._isBuffer)},f.byteLength=function(e,t){var n;switch(e+=\"\",t||\"utf8\"){case\"hex\":n=e.length/2;break;case\"utf8\":case\"utf-8\":n=T(e).length;break;case\"ascii\":case\"binary\":case\"raw\":n=e.length;break;case\"base64\":n=M(e).length;break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":n=2*e.length;break;default:throw new Error(\"Unknown encoding\")}return n},f.concat=function(e,t){if(d(C(e),\"Usage: Buffer.concat(list, [totalLength])\\nlist should be an Array.\"),0===e.length)return new f(0);if(1===e.length)return e[0];if(\"number\"!=typeof t)for(o=t=0;o<e.length;o++)t+=e[o].length;for(var n=new f(t),r=0,o=0;o<e.length;o++){var i=e[o];i.copy(n,r),r+=i.length}return n},f.prototype.write=function(e,t,n,r){isFinite(t)?isFinite(n)||(r=n,n=void 0):(a=r,r=t,t=n,n=a),t=Number(t)||0;var o,i,u,s,a=this.length-t;switch((!n||a<(n=Number(n)))&&(n=a),r=String(r||\"utf8\").toLowerCase()){case\"hex\":o=function(e,t,n,r){n=Number(n)||0;var o=e.length-n;(!r||o<(r=Number(r)))&&(r=o),d((o=t.length)%2==0,\"Invalid hex string\"),o/2<r&&(r=o/2);for(var i=0;i<r;i++){var u=parseInt(t.substr(2*i,2),16);d(!isNaN(u),\"Invalid hex string\"),e[n+i]=u}return f._charsWritten=2*i,i}(this,e,t,n);break;case\"utf8\":case\"utf-8\":i=this,u=t,s=n,o=f._charsWritten=c(T(e),i,u,s);break;case\"ascii\":case\"binary\":o=b(this,e,t,n);break;case\"base64\":i=this,u=t,s=n,o=f._charsWritten=c(M(e),i,u,s);break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":o=m(this,e,t,n);break;default:throw new Error(\"Unknown encoding\")}return o},f.prototype.toString=function(e,t,n){var r,o,i,u,s=this;if(e=String(e||\"utf8\").toLowerCase(),t=Number(t)||0,(n=void 0!==n?Number(n):s.length)===t)return\"\";switch(e){case\"hex\":r=function(e,t,n){var r=e.length;(!t||t<0)&&(t=0);(!n||n<0||r<n)&&(n=r);for(var o=\"\",i=t;i<n;i++)o+=k(e[i]);return o}(s,t,n);break;case\"utf8\":case\"utf-8\":r=function(e,t,n){var r=\"\",o=\"\";n=Math.min(e.length,n);for(var i=t;i<n;i++)e[i]<=127?(r+=N(o)+String.fromCharCode(e[i]),o=\"\"):o+=\"%\"+e[i].toString(16);return r+N(o)}(s,t,n);break;case\"ascii\":case\"binary\":r=v(s,t,n);break;case\"base64\":o=s,u=n,r=0===(i=t)&&u===o.length?a.fromByteArray(o):a.fromByteArray(o.slice(i,u));break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":r=function(e,t,n){for(var r=e.slice(t,n),o=\"\",i=0;i<r.length;i+=2)o+=String.fromCharCode(r[i]+256*r[i+1]);return o}(s,t,n);break;default:throw new Error(\"Unknown encoding\")}return r},f.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}},f.prototype.copy=function(e,t,n,r){if(t=t||0,(r=r||0===r?r:this.length)!==(n=n||0)&&0!==e.length&&0!==this.length){d(n<=r,\"sourceEnd < sourceStart\"),d(0<=t&&t<e.length,\"targetStart out of bounds\"),d(0<=n&&n<this.length,\"sourceStart out of bounds\"),d(0<=r&&r<=this.length,\"sourceEnd out of bounds\"),r>this.length&&(r=this.length);var o=(r=e.length-t<r-n?e.length-t+n:r)-n;if(o<100||!f._useTypedArrays)for(var i=0;i<o;i++)e[i+t]=this[i+n];else e._set(this.subarray(n,n+o),t)}},f.prototype.slice=function(e,t){var n=this.length;if(e=S(e,n,0),t=S(t,n,n),f._useTypedArrays)return f._augment(this.subarray(e,t));for(var r=t-e,o=new f(r,void 0,!0),i=0;i<r;i++)o[i]=this[i+e];return o},f.prototype.get=function(e){return console.log(\".get() is deprecated. Access using array indexes instead.\"),this.readUInt8(e)},f.prototype.set=function(e,t){return console.log(\".set() is deprecated. Access using array indexes instead.\"),this.writeUInt8(e,t)},f.prototype.readUInt8=function(e,t){if(t||(d(null!=e,\"missing offset\"),d(e<this.length,\"Trying to read beyond buffer length\")),!(e>=this.length))return this[e]},f.prototype.readUInt16LE=function(e,t){return o(this,e,!0,t)},f.prototype.readUInt16BE=function(e,t){return o(this,e,!1,t)},f.prototype.readUInt32LE=function(e,t){return u(this,e,!0,t)},f.prototype.readUInt32BE=function(e,t){return u(this,e,!1,t)},f.prototype.readInt8=function(e,t){if(t||(d(null!=e,\"missing offset\"),d(e<this.length,\"Trying to read beyond buffer length\")),!(e>=this.length))return 128&this[e]?-1*(255-this[e]+1):this[e]},f.prototype.readInt16LE=function(e,t){return _(this,e,!0,t)},f.prototype.readInt16BE=function(e,t){return _(this,e,!1,t)},f.prototype.readInt32LE=function(e,t){return E(this,e,!0,t)},f.prototype.readInt32BE=function(e,t){return E(this,e,!1,t)},f.prototype.readFloatLE=function(e,t){return I(this,e,!0,t)},f.prototype.readFloatBE=function(e,t){return I(this,e,!1,t)},f.prototype.readDoubleLE=function(e,t){return A(this,e,!0,t)},f.prototype.readDoubleBE=function(e,t){return A(this,e,!1,t)},f.prototype.writeUInt8=function(e,t,n){n||(d(null!=e,\"missing value\"),d(null!=t,\"missing offset\"),d(t<this.length,\"trying to write beyond buffer length\"),Y(e,255)),t>=this.length||(this[t]=e)},f.prototype.writeUInt16LE=function(e,t,n){s(this,e,t,!0,n)},f.prototype.writeUInt16BE=function(e,t,n){s(this,e,t,!1,n)},f.prototype.writeUInt32LE=function(e,t,n){l(this,e,t,!0,n)},f.prototype.writeUInt32BE=function(e,t,n){l(this,e,t,!1,n)},f.prototype.writeInt8=function(e,t,n){n||(d(null!=e,\"missing value\"),d(null!=t,\"missing offset\"),d(t<this.length,\"Trying to write beyond buffer length\"),F(e,127,-128)),t>=this.length||(0<=e?this.writeUInt8(e,t,n):this.writeUInt8(255+e+1,t,n))},f.prototype.writeInt16LE=function(e,t,n){B(this,e,t,!0,n)},f.prototype.writeInt16BE=function(e,t,n){B(this,e,t,!1,n)},f.prototype.writeInt32LE=function(e,t,n){L(this,e,t,!0,n)},f.prototype.writeInt32BE=function(e,t,n){L(this,e,t,!1,n)},f.prototype.writeFloatLE=function(e,t,n){U(this,e,t,!0,n)},f.prototype.writeFloatBE=function(e,t,n){U(this,e,t,!1,n)},f.prototype.writeDoubleLE=function(e,t,n){x(this,e,t,!0,n)},f.prototype.writeDoubleBE=function(e,t,n){x(this,e,t,!1,n)},f.prototype.fill=function(e,t,n){if(t=t||0,n=n||this.length,d(\"number\"==typeof(e=\"string\"==typeof(e=e||0)?e.charCodeAt(0):e)&&!isNaN(e),\"value is not a number\"),d(t<=n,\"end < start\"),n!==t&&0!==this.length){d(0<=t&&t<this.length,\"start out of bounds\"),d(0<=n&&n<=this.length,\"end out of bounds\");for(var r=t;r<n;r++)this[r]=e}},f.prototype.inspect=function(){for(var e=[],t=this.length,n=0;n<t;n++)if(e[n]=k(this[n]),n===H.INSPECT_MAX_BYTES){e[n+1]=\"...\";break}return\"<Buffer \"+e.join(\" \")+\">\"},f.prototype.toArrayBuffer=function(){if(\"undefined\"==typeof Uint8Array)throw new Error(\"Buffer.toArrayBuffer not supported in this browser\");if(f._useTypedArrays)return new f(this).buffer;for(var e=new Uint8Array(this.length),t=0,n=e.length;t<n;t+=1)e[t]=this[t];return e.buffer};var t=f.prototype;function S(e,t,n){return\"number\"!=typeof e?n:t<=(e=~~e)?t:0<=e||0<=(e+=t)?e:0}function j(e){return(e=~~Math.ceil(+e))<0?0:e}function C(e){return(Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)})(e)}function k(e){return e<16?\"0\"+e.toString(16):e.toString(16)}function T(e){for(var t=[],n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<=127)t.push(e.charCodeAt(n));else for(var o=n,i=(55296<=r&&r<=57343&&n++,encodeURIComponent(e.slice(o,n+1)).substr(1).split(\"%\")),u=0;u<i.length;u++)t.push(parseInt(i[u],16))}return t}function M(e){return a.toByteArray(e)}function c(e,t,n,r){for(var o=0;o<r&&!(o+n>=t.length||o>=e.length);o++)t[o+n]=e[o];return o}function N(e){try{return decodeURIComponent(e)}catch(e){return String.fromCharCode(65533)}}function Y(e,t){d(\"number\"==typeof e,\"cannot write a non-number as a number\"),d(0<=e,\"specified a negative value for writing an unsigned value\"),d(e<=t,\"value is larger than maximum value for type\"),d(Math.floor(e)===e,\"value has a fractional component\")}function F(e,t,n){d(\"number\"==typeof e,\"cannot write a non-number as a number\"),d(e<=t,\"value larger than maximum allowed value\"),d(n<=e,\"value smaller than minimum allowed value\"),d(Math.floor(e)===e,\"value has a fractional component\")}function D(e,t,n){d(\"number\"==typeof e,\"cannot write a non-number as a number\"),d(e<=t,\"value larger than maximum allowed value\"),d(n<=e,\"value smaller than minimum allowed value\")}function d(e,t){if(!e)throw new Error(t||\"Failed assertion\")}f._augment=function(e){return e._isBuffer=!0,e._get=e.get,e._set=e.set,e.get=t.get,e.set=t.set,e.write=t.write,e.toString=t.toString,e.toLocaleString=t.toString,e.toJSON=t.toJSON,e.copy=t.copy,e.slice=t.slice,e.readUInt8=t.readUInt8,e.readUInt16LE=t.readUInt16LE,e.readUInt16BE=t.readUInt16BE,e.readUInt32LE=t.readUInt32LE,e.readUInt32BE=t.readUInt32BE,e.readInt8=t.readInt8,e.readInt16LE=t.readInt16LE,e.readInt16BE=t.readInt16BE,e.readInt32LE=t.readInt32LE,e.readInt32BE=t.readInt32BE,e.readFloatLE=t.readFloatLE,e.readFloatBE=t.readFloatBE,e.readDoubleLE=t.readDoubleLE,e.readDoubleBE=t.readDoubleBE,e.writeUInt8=t.writeUInt8,e.writeUInt16LE=t.writeUInt16LE,e.writeUInt16BE=t.writeUInt16BE,e.writeUInt32LE=t.writeUInt32LE,e.writeUInt32BE=t.writeUInt32BE,e.writeInt8=t.writeInt8,e.writeInt16LE=t.writeInt16LE,e.writeInt16BE=t.writeInt16BE,e.writeInt32LE=t.writeInt32LE,e.writeInt32BE=t.writeInt32BE,e.writeFloatLE=t.writeFloatLE,e.writeFloatBE=t.writeFloatBE,e.writeDoubleLE=t.writeDoubleLE,e.writeDoubleBE=t.writeDoubleBE,e.fill=t.fill,e.inspect=t.inspect,e.toArrayBuffer=t.toArrayBuffer,e}}.call(this,O(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},O(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/buffer/index.js\",\"/node_modules/gulp-browserify/node_modules/buffer\")},{\"base64-js\":2,buffer:3,ieee754:10,lYpoI2:11}],4:[function(c,d,e){!function(e,t,a,n,r,o,i,u,s){var a=c(\"buffer\").Buffer,f=4,l=new a(f);l.fill(0);d.exports={hash:function(e,t,n,r){for(var o=t(function(e,t){e.length%f!=0&&(n=e.length+(f-e.length%f),e=a.concat([e,l],n));for(var n,r=[],o=t?e.readInt32BE:e.readInt32LE,i=0;i<e.length;i+=f)r.push(o.call(e,i));return r}(e=a.isBuffer(e)?e:new a(e),r),8*e.length),t=r,i=new a(n),u=t?i.writeInt32BE:i.writeInt32LE,s=0;s<o.length;s++)u.call(i,o[s],4*s,!0);return i}}}.call(this,c(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},c(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/helpers.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{buffer:3,lYpoI2:11}],5:[function(v,e,_){!function(l,c,u,d,h,p,g,y,w){var u=v(\"buffer\").Buffer,e=v(\"./sha\"),t=v(\"./sha256\"),n=v(\"./rng\"),b={sha1:e,sha256:t,md5:v(\"./md5\")},s=64,a=new u(s);function r(e,n){var r=b[e=e||\"sha1\"],o=[];return r||i(\"algorithm:\",e,\"is not yet supported\"),{update:function(e){return u.isBuffer(e)||(e=new u(e)),o.push(e),e.length,this},digest:function(e){var t=u.concat(o),t=n?function(e,t,n){u.isBuffer(t)||(t=new u(t)),u.isBuffer(n)||(n=new u(n)),t.length>s?t=e(t):t.length<s&&(t=u.concat([t,a],s));for(var r=new u(s),o=new u(s),i=0;i<s;i++)r[i]=54^t[i],o[i]=92^t[i];return n=e(u.concat([r,n])),e(u.concat([o,n]))}(r,n,t):r(t);return o=null,e?t.toString(e):t}}}function i(){var e=[].slice.call(arguments).join(\" \");throw new Error([e,\"we accept pull requests\",\"http://github.com/dominictarr/crypto-browserify\"].join(\"\\n\"))}a.fill(0),_.createHash=function(e){return r(e)},_.createHmac=r,_.randomBytes=function(e,t){if(!t||!t.call)return new u(n(e));try{t.call(this,void 0,new u(n(e)))}catch(e){t(e)}};var o,f=[\"createCredentials\",\"createCipher\",\"createCipheriv\",\"createDecipher\",\"createDecipheriv\",\"createSign\",\"createVerify\",\"createDiffieHellman\",\"pbkdf2\"],m=function(e){_[e]=function(){i(\"sorry,\",e,\"is not implemented yet\")}};for(o in f)m(f[o],o)}.call(this,v(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},v(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/index.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./md5\":6,\"./rng\":7,\"./sha\":8,\"./sha256\":9,buffer:3,lYpoI2:11}],6:[function(w,b,e){!function(e,r,o,i,u,a,f,l,y){var t=w(\"./helpers\");function n(e,t){e[t>>5]|=128<<t%32,e[14+(t+64>>>9<<4)]=t;for(var n=1732584193,r=-271733879,o=-1732584194,i=271733878,u=0;u<e.length;u+=16){var s=n,a=r,f=o,l=i,n=c(n,r,o,i,e[u+0],7,-680876936),i=c(i,n,r,o,e[u+1],12,-389564586),o=c(o,i,n,r,e[u+2],17,606105819),r=c(r,o,i,n,e[u+3],22,-1044525330);n=c(n,r,o,i,e[u+4],7,-176418897),i=c(i,n,r,o,e[u+5],12,1200080426),o=c(o,i,n,r,e[u+6],17,-1473231341),r=c(r,o,i,n,e[u+7],22,-45705983),n=c(n,r,o,i,e[u+8],7,1770035416),i=c(i,n,r,o,e[u+9],12,-1958414417),o=c(o,i,n,r,e[u+10],17,-42063),r=c(r,o,i,n,e[u+11],22,-1990404162),n=c(n,r,o,i,e[u+12],7,1804603682),i=c(i,n,r,o,e[u+13],12,-40341101),o=c(o,i,n,r,e[u+14],17,-1502002290),n=d(n,r=c(r,o,i,n,e[u+15],22,1236535329),o,i,e[u+1],5,-165796510),i=d(i,n,r,o,e[u+6],9,-1069501632),o=d(o,i,n,r,e[u+11],14,643717713),r=d(r,o,i,n,e[u+0],20,-373897302),n=d(n,r,o,i,e[u+5],5,-701558691),i=d(i,n,r,o,e[u+10],9,38016083),o=d(o,i,n,r,e[u+15],14,-660478335),r=d(r,o,i,n,e[u+4],20,-405537848),n=d(n,r,o,i,e[u+9],5,568446438),i=d(i,n,r,o,e[u+14],9,-1019803690),o=d(o,i,n,r,e[u+3],14,-187363961),r=d(r,o,i,n,e[u+8],20,1163531501),n=d(n,r,o,i,e[u+13],5,-1444681467),i=d(i,n,r,o,e[u+2],9,-51403784),o=d(o,i,n,r,e[u+7],14,1735328473),n=h(n,r=d(r,o,i,n,e[u+12],20,-1926607734),o,i,e[u+5],4,-378558),i=h(i,n,r,o,e[u+8],11,-2022574463),o=h(o,i,n,r,e[u+11],16,1839030562),r=h(r,o,i,n,e[u+14],23,-35309556),n=h(n,r,o,i,e[u+1],4,-1530992060),i=h(i,n,r,o,e[u+4],11,1272893353),o=h(o,i,n,r,e[u+7],16,-155497632),r=h(r,o,i,n,e[u+10],23,-1094730640),n=h(n,r,o,i,e[u+13],4,681279174),i=h(i,n,r,o,e[u+0],11,-358537222),o=h(o,i,n,r,e[u+3],16,-722521979),r=h(r,o,i,n,e[u+6],23,76029189),n=h(n,r,o,i,e[u+9],4,-640364487),i=h(i,n,r,o,e[u+12],11,-421815835),o=h(o,i,n,r,e[u+15],16,530742520),n=p(n,r=h(r,o,i,n,e[u+2],23,-995338651),o,i,e[u+0],6,-198630844),i=p(i,n,r,o,e[u+7],10,1126891415),o=p(o,i,n,r,e[u+14],15,-1416354905),r=p(r,o,i,n,e[u+5],21,-57434055),n=p(n,r,o,i,e[u+12],6,1700485571),i=p(i,n,r,o,e[u+3],10,-1894986606),o=p(o,i,n,r,e[u+10],15,-1051523),r=p(r,o,i,n,e[u+1],21,-2054922799),n=p(n,r,o,i,e[u+8],6,1873313359),i=p(i,n,r,o,e[u+15],10,-30611744),o=p(o,i,n,r,e[u+6],15,-1560198380),r=p(r,o,i,n,e[u+13],21,1309151649),n=p(n,r,o,i,e[u+4],6,-145523070),i=p(i,n,r,o,e[u+11],10,-1120210379),o=p(o,i,n,r,e[u+2],15,718787259),r=p(r,o,i,n,e[u+9],21,-343485551),n=g(n,s),r=g(r,a),o=g(o,f),i=g(i,l)}return Array(n,r,o,i)}function s(e,t,n,r,o,i){return g((t=g(g(t,e),g(r,i)))<<o|t>>>32-o,n)}function c(e,t,n,r,o,i,u){return s(t&n|~t&r,e,t,o,i,u)}function d(e,t,n,r,o,i,u){return s(t&r|n&~r,e,t,o,i,u)}function h(e,t,n,r,o,i,u){return s(t^n^r,e,t,o,i,u)}function p(e,t,n,r,o,i,u){return s(n^(t|~r),e,t,o,i,u)}function g(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}b.exports=function(e){return t.hash(e,n,16)}}.call(this,w(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},w(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/md5.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:11}],7:[function(e,l,t){!function(e,t,n,r,o,i,u,s,f){var a;l.exports=a||function(e){for(var t,n=new Array(e),r=0;r<e;r++)0==(3&r)&&(t=4294967296*Math.random()),n[r]=t>>>((3&r)<<3)&255;return n}}.call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/rng.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{buffer:3,lYpoI2:11}],8:[function(c,d,e){!function(e,t,n,r,o,s,a,f,l){var i=c(\"./helpers\");function u(l,c){l[c>>5]|=128<<24-c%32,l[15+(c+64>>9<<4)]=c;for(var e,t,n,r=Array(80),o=1732584193,i=-271733879,u=-1732584194,s=271733878,d=-1009589776,h=0;h<l.length;h+=16){for(var p=o,g=i,y=u,w=s,b=d,a=0;a<80;a++){r[a]=a<16?l[h+a]:v(r[a-3]^r[a-8]^r[a-14]^r[a-16],1);var f=m(m(v(o,5),(f=i,t=u,n=s,(e=a)<20?f&t|~f&n:!(e<40)&&e<60?f&t|f&n|t&n:f^t^n)),m(m(d,r[a]),(e=a)<20?1518500249:e<40?1859775393:e<60?-1894007588:-899497514)),d=s,s=u,u=v(i,30),i=o,o=f}o=m(o,p),i=m(i,g),u=m(u,y),s=m(s,w),d=m(d,b)}return Array(o,i,u,s,d)}function m(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function v(e,t){return e<<t|e>>>32-t}d.exports=function(e){return i.hash(e,u,20,!0)}}.call(this,c(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},c(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:11}],9:[function(c,d,e){!function(e,t,n,r,u,s,a,f,l){function b(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function o(e,l){var c,d=new Array(1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298),t=new Array(1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225),n=new Array(64);e[l>>5]|=128<<24-l%32,e[15+(l+64>>9<<4)]=l;for(var r,o,h=0;h<e.length;h+=16){for(var i=t[0],u=t[1],s=t[2],p=t[3],a=t[4],g=t[5],y=t[6],w=t[7],f=0;f<64;f++)n[f]=f<16?e[f+h]:b(b(b((o=n[f-2],m(o,17)^m(o,19)^v(o,10)),n[f-7]),(o=n[f-15],m(o,7)^m(o,18)^v(o,3))),n[f-16]),c=b(b(b(b(w,m(o=a,6)^m(o,11)^m(o,25)),a&g^~a&y),d[f]),n[f]),r=b(m(r=i,2)^m(r,13)^m(r,22),i&u^i&s^u&s),w=y,y=g,g=a,a=b(p,c),p=s,s=u,u=i,i=b(c,r);t[0]=b(i,t[0]),t[1]=b(u,t[1]),t[2]=b(s,t[2]),t[3]=b(p,t[3]),t[4]=b(a,t[4]),t[5]=b(g,t[5]),t[6]=b(y,t[6]),t[7]=b(w,t[7])}return t}var i=c(\"./helpers\"),m=function(e,t){return e>>>t|e<<32-t},v=function(e,t){return e>>>t};d.exports=function(e){return i.hash(e,o,32,!0)}}.call(this,c(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},c(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha256.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:11}],10:[function(e,t,f){!function(e,t,n,r,o,i,u,s,a){f.read=function(e,t,n,r,o){var i,u,l=8*o-r-1,c=(1<<l)-1,d=c>>1,s=-7,a=n?o-1:0,f=n?-1:1,o=e[t+a];for(a+=f,i=o&(1<<-s)-1,o>>=-s,s+=l;0<s;i=256*i+e[t+a],a+=f,s-=8);for(u=i&(1<<-s)-1,i>>=-s,s+=r;0<s;u=256*u+e[t+a],a+=f,s-=8);if(0===i)i=1-d;else{if(i===c)return u?NaN:1/0*(o?-1:1);u+=Math.pow(2,r),i-=d}return(o?-1:1)*u*Math.pow(2,i-r)},f.write=function(e,t,l,n,r,c){var o,i,u=8*c-r-1,s=(1<<u)-1,a=s>>1,d=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,f=n?0:c-1,h=n?1:-1,c=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(i=isNaN(t)?1:0,o=s):(o=Math.floor(Math.log(t)/Math.LN2),t*(n=Math.pow(2,-o))<1&&(o--,n*=2),2<=(t+=1<=o+a?d/n:d*Math.pow(2,1-a))*n&&(o++,n/=2),s<=o+a?(i=0,o=s):1<=o+a?(i=(t*n-1)*Math.pow(2,r),o+=a):(i=t*Math.pow(2,a-1)*Math.pow(2,r),o=0));8<=r;e[l+f]=255&i,f+=h,i/=256,r-=8);for(o=o<<r|i,u+=r;0<u;e[l+f]=255&o,f+=h,o/=256,u-=8);e[l+f-h]|=128*c}}.call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/ieee754/index.js\",\"/node_modules/gulp-browserify/node_modules/ieee754\")},{buffer:3,lYpoI2:11}],11:[function(e,h,t){!function(e,t,n,r,o,f,l,c,d){var i,u,s;function a(){}(e=h.exports={}).nextTick=(u=\"undefined\"!=typeof window&&window.setImmediate,s=\"undefined\"!=typeof window&&window.postMessage&&window.addEventListener,u?function(e){return window.setImmediate(e)}:s?(i=[],window.addEventListener(\"message\",function(e){var t=e.source;t!==window&&null!==t||\"process-tick\"!==e.data||(e.stopPropagation(),0<i.length&&i.shift()())},!0),function(e){i.push(e),window.postMessage(\"process-tick\",\"*\")}):function(e){setTimeout(e,0)}),e.title=\"browser\",e.browser=!0,e.env={},e.argv=[],e.on=a,e.addListener=a,e.once=a,e.off=a,e.removeListener=a,e.removeAllListeners=a,e.emit=a,e.binding=function(e){throw new Error(\"process.binding is not supported\")},e.cwd=function(){return\"/\"},e.chdir=function(e){throw new Error(\"process.chdir is not supported\")}}.call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/process/browser.js\",\"/node_modules/gulp-browserify/node_modules/process\")},{buffer:3,lYpoI2:11}]},{},[1])(1)});", "import {\n\tClientDescriptor,\n\tClientDescriptorOptions,\n} from './client/ClientDescriptor.js';\nimport { Client } from './client/Client.js';\nexport type { ClientWithCollections } from './client/Client.js';\nexport { ClientDescriptor };\nexport { Client };\n// backward compat\nexport { ClientDescriptor as StorageDescriptor };\nexport { Client as Storage };\nexport type { ClientDescriptorOptions };\nexport type { ClientDescriptorOptions as StorageInitOptions };\nexport { Entity } from './entities/Entity.js';\nexport type {\n\tObjectEntity,\n\tListEntity,\n\tEntityShape,\n\tAccessibleEntityProperty,\n\tAnyEntity,\n\tEntityDestructured,\n} from './entities/Entity.js';\nexport { ServerSync } from './sync/Sync.js';\nexport type { SyncTransportMode } from './sync/Sync.js';\nexport { EntityFile } from './files/EntityFile.js';\nexport {\n\tcollection,\n\tschema,\n\tcreateDefaultMigration,\n\tmigrate,\n\tcreateMigration,\n} from '@verdant-web/common';\nexport type {\n\tStorageDocument,\n\tStorageSchema,\n\tStorageCollectionSchema,\n\tMigration,\n} from '@verdant-web/common';\nexport type { UserInfo } from '@verdant-web/common';\nexport type { Query } from './queries/types.js';\nexport type { QueryStatus } from './queries/BaseQuery.js';\nexport type { CollectionQueries } from './queries/CollectionQueries.js';\nexport { MigrationPathError } from './migration/errors.js';\n", "import cuid from 'cuid';\nimport { v4 } from 'uuid';\n\nexport interface TimestampProvider {\n\tnow(version: number): string;\n\tupdate(remoteTimestamp: string): void;\n\tzero(version: number): string;\n\tgetWallClockTime(timestamp: string): number;\n}\n\nconst VERSION_BLOCK_LENGTH = 4;\nconst ENCODING_NUMBER_RADIX = 36;\n\nexport function encodeVersion(version: number | string): string {\n\treturn version\n\t\t.toString(ENCODING_NUMBER_RADIX)\n\t\t.padStart(VERSION_BLOCK_LENGTH, '0');\n}\n\nexport function OLD_encodeVersion(version: number | string): string {\n\treturn version.toString().padStart(6, '0');\n}\n\nexport class NaiveTimestampProvider implements TimestampProvider {\n\tcounter = 0;\n\tnow = (version: number | string) => {\n\t\treturn (\n\t\t\tencodeVersion(version) + Date.now().toString() + '-' + this.counter++\n\t\t);\n\t};\n\tupdate = () => {\n\t\tthis.counter = 0;\n\t};\n\tzero = (version: number | string) => {\n\t\treturn encodeVersion(version) + '0' + '-' + this.counter++;\n\t};\n\tgetWallClockTime = (timestamp: string) => {\n\t\treturn parseInt(timestamp.slice(VERSION_BLOCK_LENGTH).split('-')[0], 10);\n\t};\n}\n\nexport class HybridLogicalClockTimestampProvider implements TimestampProvider {\n\tprivate latest: HLCTimestamp = {\n\t\ttime: Date.now(),\n\t\tcounter: 0,\n\t\tnode: generateNodeId(),\n\t};\n\tprivate zeroCounter = 0;\n\n\tnow = (version: string | number) => {\n\t\tthis.latest = getHlcNow(this.latest);\n\t\treturn this.get(version, this.latest);\n\t};\n\t/**\n\t * @deprecated - use now() instead and update to latest format\n\t */\n\tOLD_now = (version: string | number) => {\n\t\tthis.latest = getHlcNow(this.latest);\n\t\treturn OLD_encodeVersion(version) + OLD_serializeHlcTimestamp(this.latest);\n\t};\n\t/** Get the current timer state. Does not increment counter. */\n\ttimerState = () => {\n\t\treturn this.latest;\n\t};\n\tupdate = (remoteTimestamp: string) => {\n\t\t// strip version from remote timestamp\n\t\tconst hlcString = remoteTimestamp.slice(VERSION_BLOCK_LENGTH);\n\t\tthis.latest = updateFromRemote(\n\t\t\tthis.latest,\n\t\t\tdeserializeHlcTimestamp(hlcString),\n\t\t);\n\t};\n\tget = (version: string | number, raw: HLCTimestamp) => {\n\t\treturn encodeVersion(version) + serializeHlcTimestamp(raw);\n\t};\n\tzero = (version: string | number) => {\n\t\treturn (\n\t\t\tencodeVersion(version) +\n\t\t\tserializeHlcTimestamp({\n\t\t\t\ttime: 0,\n\t\t\t\t// to keep zero timestamps unique, we use a counter here as well\n\t\t\t\tcounter: this.zeroCounter++,\n\t\t\t\tnode: this.latest.node,\n\t\t\t})\n\t\t);\n\t};\n\tgetWallClockTime = (timestamp: string): number => {\n\t\treturn deserializeHlcTimestamp(timestamp.slice(VERSION_BLOCK_LENGTH)).time;\n\t};\n}\n\nclass ClockDriftError extends Error {\n\ttype: string;\n\tconstructor(...args: any[]) {\n\t\tsuper();\n\t\tthis.type = 'ClockDriftError';\n\t\tthis.message = ['maximum clock drift exceeded'].concat(args).join(' ');\n\t}\n}\n\nclass OverflowError extends Error {\n\ttype: string;\n\tconstructor() {\n\t\tsuper();\n\t\tthis.type = 'OverflowError';\n\t\tthis.message = 'timestamp counter overflow';\n\t}\n}\n\ninterface HLCTimestamp {\n\ttime: number;\n\tcounter: number;\n\tnode: string;\n}\n\nconst COUNTER_BLOCK_LENGTH = 4;\nconst NODE_BLOCK_LENGTH = 7;\nconst MAX_CLOCK_DRIFT = 60 * 1000;\n// 9 base36 characters should last until the year 5000\n// when encoding a unix MS timestamp\nconst TIME_BLOCK_LENGTH = 9;\n\nfunction generateNodeId() {\n\treturn cuid\n\t\t.slug()\n\t\t.padStart(NODE_BLOCK_LENGTH, '0')\n\t\t.slice(0, NODE_BLOCK_LENGTH);\n}\n\nexport function serializeHlcTimestamp(ts: HLCTimestamp): string {\n\t// string representation of the time\n\tconst dateString = new Date(ts.time)\n\t\t.getTime()\n\t\t.toString(ENCODING_NUMBER_RADIX)\n\t\t.padStart(TIME_BLOCK_LENGTH, '0');\n\t// counter, 336, padded to 4 characters\n\tconst counter = ts.counter\n\t\t.toString(ENCODING_NUMBER_RADIX)\n\t\t.padStart(COUNTER_BLOCK_LENGTH, '0');\n\t// node id padded to 16 characters\n\tconst node = ts.node.padStart(NODE_BLOCK_LENGTH, '0');\n\treturn `${dateString}${counter}${node}`;\n}\n\nfunction getHlcNow(prev: HLCTimestamp): HLCTimestamp {\n\tconst wallTime = Date.now();\n\n\t// pick prev's time if it's later than our local device\n\tconst newWallTime = Math.max(prev.time, wallTime);\n\t// reset counter if wall time changed\n\tconst newCounter = prev.time === newWallTime ? prev.counter + 1 : 0;\n\n\t// check for drift\n\tif (newWallTime - wallTime > MAX_CLOCK_DRIFT) {\n\t\tthrow new ClockDriftError(newWallTime, wallTime, MAX_CLOCK_DRIFT);\n\t}\n\t// check for counter overflow (max is 4 bytes)\n\tif (newCounter > 65535) {\n\t\tthrow new OverflowError();\n\t}\n\n\treturn {\n\t\ttime: newWallTime,\n\t\tcounter: newCounter,\n\t\tnode: prev.node,\n\t};\n}\n\nfunction updateFromRemote(\n\tlocal: HLCTimestamp,\n\tremote: HLCTimestamp,\n): HLCTimestamp {\n\tconst wallTime = Date.now();\n\t// pick remote's time if it's later than our local device\n\tconst newTime = Math.max(wallTime, Math.max(local.time, remote.time));\n\n\tconst maxCounter = Math.max(local.counter, remote.counter);\n\tlet newCounter;\n\t// if all clocks are the same, increment the counter\n\tif (local.time === newTime && remote.time === newTime) {\n\t\tnewCounter = maxCounter + 1;\n\t}\n\t// if local time is the same as new time, increment our local counter\n\telse if (local.time === newTime) {\n\t\tnewCounter = local.counter + 1;\n\t}\n\t// if remote time is the same as new time, increment remote counter\n\telse if (remote.time === newTime) {\n\t\tnewCounter = remote.counter + 1;\n\t}\n\t// otherwise, reset the counter\n\telse {\n\t\tnewCounter = 0;\n\t}\n\n\t// check for drift\n\tif (newTime - wallTime > MAX_CLOCK_DRIFT) {\n\t\tthrow new ClockDriftError(newTime, wallTime, MAX_CLOCK_DRIFT);\n\t}\n\tif (newCounter > 65535) {\n\t\tthrow new OverflowError();\n\t}\n\n\treturn {\n\t\ttime: newTime,\n\t\tcounter: newCounter,\n\t\tnode: local.node,\n\t};\n}\n\nexport function deserializeHlcTimestamp(clock: string): HLCTimestamp {\n\tconst dateString = clock.slice(0, TIME_BLOCK_LENGTH);\n\tconst counter = clock.slice(\n\t\tTIME_BLOCK_LENGTH,\n\t\tTIME_BLOCK_LENGTH + COUNTER_BLOCK_LENGTH,\n\t);\n\tconst node = clock.slice(TIME_BLOCK_LENGTH + COUNTER_BLOCK_LENGTH);\n\tconst time = parseInt(dateString, ENCODING_NUMBER_RADIX);\n\tconst counterNum = parseInt(counter, ENCODING_NUMBER_RADIX);\n\n\tif (isNaN(time) || isNaN(counterNum)) {\n\t\tthrow new Error('invalid clock format');\n\t}\n\n\treturn {\n\t\ttime,\n\t\tcounter: counterNum,\n\t\tnode,\n\t};\n}\n\nfunction removeLeadingZeroes(str: string): string {\n\treturn str.replace(/^0+/, '');\n}\n\n/**\n * Below, converters for old-style timestamps are defined.\n * These are for migrating older clients to the new format.\n */\n\n/**\n * Converts a timestamp from the old format to the new format.\n */\nexport function convertOldHlcTimestamp(ts: string): string {\n\tconst versionBlock = ts.slice(0, 6);\n\t// no jokes please\n\tconst clockBlock = ts.slice(6);\n\tconst deserialized = OLD_deserializeHlcTimestamp(clockBlock);\n\n\t// version was base 10 and now is base 36\n\tconst versionNumber = parseInt(versionBlock, 10);\n\tconst encodedVersion = encodeVersion(versionNumber);\n\treturn encodedVersion + serializeHlcTimestamp(deserialized);\n}\n\nexport function OLD_serializeHlcTimestamp(ts: HLCTimestamp): string {\n\t// ISO string representation of the time\n\tconst dateString = new Date(ts.time).toISOString();\n\t// counter, base16, padded to 4 characters\n\tconst counter = ts.counter.toString(16).toUpperCase().padStart(4, '0');\n\t// node id padded to 16 characters\n\tconst node = ts.node.padStart(16, '0');\n\treturn `${dateString}-${counter}-${node}`;\n}\n\nexport function OLD_deserializeHlcTimestamp(clock: string): HLCTimestamp {\n\t// ISO string representation of the time\n\tconst dateString = clock.slice(0, 24);\n\tconst counter = clock.slice(25, 25 + 4);\n\tconst node = clock.slice(25 + 4 + 1);\n\n\tconst time = new Date(dateString).getTime();\n\tconst counterNum = parseInt(counter, 16);\n\n\tif (isNaN(time) || isNaN(counterNum)) {\n\t\tthrow new Error('invalid clock format');\n\t}\n\n\treturn {\n\t\ttime,\n\t\tcounter: counterNum,\n\t\tnode: node.slice(node.length - 7),\n\t};\n}\n\nexport function getTimestampSchemaVersion(timestamp: string): number {\n\treturn parseInt(timestamp.slice(0, VERSION_BLOCK_LENGTH), 36);\n}\n\nexport function compareTimestampSchemaVersions(a: string, b: string) {\n\treturn getTimestampSchemaVersion(a) - getTimestampSchemaVersion(b);\n}\n", "export type FileRef = {\n\t'@@type': 'file';\n\tid: string;\n};\n\nexport function isFileRef(value: any): value is FileRef {\n\treturn value && value['@@type'] === 'file';\n}\nexport function createFileRef(id: string): FileRef {\n\treturn {\n\t\t'@@type': 'file',\n\t\tid,\n\t};\n}\n\nexport type FileData = {\n\tid: string;\n\t/**\n\t * For locally created files, this starts false, until it's uploaded\n\t * Remote files this is always true\n\t */\n\tremote: boolean;\n\tname: string;\n\ttype: string;\n\tfile?: Blob;\n\turl?: string;\n};\n\nexport function getAllFileFields(snapshot: any): [string, FileRef][] {\n\treturn Object.entries(snapshot).filter((entry) => isFileRef(entry[1])) as [\n\t\tstring,\n\t\tFileRef,\n\t][];\n}\n", "// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}", "export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;", "import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;", "import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;", "import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;", "import { FileRef, isFileRef } from './files.js';\nimport { isObjectRef, ObjectRef } from './operation.js';\n\nexport function isRef(obj: any) {\n\treturn isObjectRef(obj) || isFileRef(obj);\n}\n\nexport function compareRefs(a: any, b: any) {\n\tif (a === b) return true;\n\tif (!isRef(a) || !isRef(b)) return false;\n\tif (a['@@type'] !== b['@@type']) return false;\n\tif (a.id !== b.id) return false;\n\treturn true;\n}\n\nexport type Ref = ObjectRef | FileRef;\n", "import { v4 } from 'uuid';\nimport { assignOid, maybeGetOid } from './oids.js';\nimport hash from 'object-hash';\n\nexport function take<T extends object, Keys extends keyof T>(\n\tobj: T,\n\tkeys: Keys[],\n): Pick<T, Keys> {\n\tconst result: any = {};\n\tfor (const key of keys) {\n\t\tresult[key] = obj[key];\n\t}\n\treturn result;\n}\n\nexport function omit<T extends object, Keys extends keyof T>(\n\tobj: T,\n\tkeys: Keys[],\n): Omit<T, Keys> {\n\tconst result: any = {};\n\tfor (const key of Object.keys(obj)) {\n\t\tif (!keys.includes(key as Keys)) {\n\t\t\tresult[key] = (obj as any)[key];\n\t\t}\n\t}\n\treturn result;\n}\n\nexport function getSortedIndex<T>(\n\tarray: T[],\n\tinsert: T,\n\tcompare: (a: T, b: T) => number,\n) {\n\tlet low = 0;\n\tlet high = array.length;\n\twhile (low < high) {\n\t\tconst mid = (low + high) >>> 1;\n\t\tconst cmp = compare(array[mid], insert);\n\t\tif (cmp < 0) {\n\t\t\tlow = mid + 1;\n\t\t} else {\n\t\t\thigh = mid;\n\t\t}\n\t}\n\treturn low;\n}\n\nfunction orderedReplacer(_: any, v: any) {\n\tif (typeof v !== 'object' || v === null || Array.isArray(v)) {\n\t\treturn v;\n\t}\n\treturn Object.fromEntries(\n\t\tObject.entries(v).sort(([ka], [kb]) => (ka < kb ? -1 : ka > kb ? 1 : 0)),\n\t);\n}\n/**\n * Consistently stringifies an object regardless\n * of key insertion order\n */\nexport function stableStringify(obj: any) {\n\treturn JSON.stringify(obj, orderedReplacer);\n}\n\n/**\n * A version of structured cloning which preserves object identity\n * references in the system.\n */\nexport function cloneDeep<T>(obj: T, copyOids = true): T {\n\tif (isObject(obj) || Array.isArray(obj)) {\n\t\tconst oid = maybeGetOid(obj);\n\t\tlet clone: any;\n\t\tif (Array.isArray(obj)) {\n\t\t\tclone = obj.map((v) => cloneDeep(v, copyOids)) as T;\n\t\t} else {\n\t\t\tclone = {};\n\t\t\tfor (const [key, value] of Object.entries(obj as any)) {\n\t\t\t\tclone[key] = cloneDeep(value, copyOids);\n\t\t\t}\n\t\t}\n\t\tif (copyOids && oid) {\n\t\t\tassignOid(clone, oid);\n\t\t}\n\t\treturn clone;\n\t}\n\treturn obj;\n}\n\n// TODO: better hash\nexport function hashObject(obj: any) {\n\t// hash the object into a unique string\n\treturn hash(obj);\n}\n\nexport function isObject(obj: any) {\n\treturn obj && typeof obj === 'object';\n}\n\nexport function roughSizeOfObject(object: any) {\n\tvar objectList = [];\n\tvar stack = [object];\n\tvar bytes = 0;\n\n\twhile (stack.length) {\n\t\tvar value = stack.pop();\n\n\t\tif (typeof value === 'boolean') {\n\t\t\tbytes += 4;\n\t\t} else if (typeof value === 'string') {\n\t\t\tbytes += value.length * 2;\n\t\t} else if (typeof value === 'number') {\n\t\t\tbytes += 8;\n\t\t} else if (typeof value === 'object' && objectList.indexOf(value) === -1) {\n\t\t\tobjectList.push(value);\n\n\t\t\tfor (var i in value) {\n\t\t\t\tstack.push(value[i]);\n\t\t\t}\n\t\t}\n\t}\n\treturn bytes;\n}\n\nexport function assert(\n\tcondition: any,\n\tmessage: string = 'assertion failed',\n): asserts condition {\n\tif (!condition) {\n\t\tthrow new Error(message);\n\t}\n}\n\nexport function generateId(length = 16) {\n\treturn v4().replace('-', '').slice(0, length);\n}\n\nexport function findLastIndex<T>(array: T[], predicate: (item: T) => boolean) {\n\tfor (let i = array.length - 1; i >= 0; i--) {\n\t\tif (predicate(array[i])) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n}\n\nexport function debounce<T extends (...args: any[]) => any>(\n\tfn: T,\n\twait: number,\n): T {\n\tlet timeout: any;\n\treturn function (this: any, ...args: any[]) {\n\t\tconst context = this;\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(() => fn.apply(context, args), wait);\n\t} as any;\n}\n", "import { v4 } from 'uuid';\nimport { isFileRef } from './files.js';\nimport { isObjectRef, ObjectRef } from './operation.js';\nimport { isRef } from './refs.js';\nimport { isObject, assert } from './utils.js';\n\n/**\n * OIDs\n *\n * OIDs are used to identify objects in the document. They also encode\n * information about the object useful to identifying an object found\n * on its own and associating it back to its parent.\n *\n * An OID is structured as such:\n * <collection>/<root id>[/<key paths>]:<random>\n *\n * OIDs have a few characteristics:\n * - They include the collection name of the parent document\n * - They include the primary key of the parent document\n * - They include the key path of the object within the document\n * - They include a random sequence to identify different objects which\n * exist at the same key path\n *\n * Collection name and document key are used to link any isolated\n * object back to its parent document.\n *\n * The key path is used for authorization - to associate the object\n * (or an operation related to it by OID) with the field it inhabits\n * to utilize authorization rules from that field in the schema.\n *\n * The random sequence allows the application to encode different\n * identities for objects at the same position in a document for\n * conflict resolution purposes\n */\n\nexport type ObjectIdentifier = string;\n\nexport const LEGACY_OID_KEY = '__@@oid_do_not_use';\nexport const OID_KEY = '@@id';\n\nconst COLLECTION_SEPARATOR = '/';\nconst RANDOM_SEPARATOR = ':';\n\n/**\n * This is the global, in-memory storage for all OIDs. It is used to\n * associate JS objects with OIDs without modifying the objects themselves.\n */\nconst oidMap = new WeakMap<any, ObjectIdentifier>();\n\nexport function getOid(obj: any) {\n\tconst oid = maybeGetOid(obj);\n\tassert(\n\t\t!!oid,\n\t\t`Object ${JSON.stringify(obj)} does not have an OID assigned to it`,\n\t);\n\treturn oid;\n}\n\nexport function maybeGetOid(obj: any): ObjectIdentifier | undefined {\n\tif (!isObject(obj)) {\n\t\treturn undefined;\n\t}\n\treturn oidMap.get(obj) ?? obj[OID_KEY] ?? obj[LEGACY_OID_KEY];\n}\n\nexport function assignOid(obj: any, oid: ObjectIdentifier) {\n\tassert(\n\t\tisObject(obj),\n\t\t`Only objects can be assigned OIDs, received ${JSON.stringify(obj)}`,\n\t);\n\tif (hasOid(obj)) {\n\t\tremoveOid(obj);\n\t}\n\toidMap.set(obj, oid);\n\treturn obj;\n}\n\nexport function hasOid(obj: any) {\n\treturn !!maybeGetOid(obj);\n}\n\nexport function removeOid(obj: any) {\n\toidMap.delete(obj);\n\treturn obj;\n}\n\nexport function isOidKey(key: string) {\n\treturn key === OID_KEY || key === LEGACY_OID_KEY;\n}\n\n/**\n * For sub-objects, assign a random sub-OID if no OID\n * is already assigned.\n */\nexport function ensureOid(\n\tobj: any,\n\trootOid: ObjectIdentifier,\n\tcreateSubId?: () => string,\n) {\n\tif (!hasOid(obj)) {\n\t\tconst oid = createSubOid(rootOid, createSubId);\n\t\tassignOid(obj, oid);\n\t\treturn oid;\n\t} else {\n\t\treturn getOid(obj);\n\t}\n}\n\nexport function ensureCompatibleOid(\n\tobj: any,\n\trootOid: ObjectIdentifier,\n\tcreateSubId?: () => string,\n) {\n\tif (!hasOid(obj)) {\n\t\tconst oid = createSubOid(rootOid, createSubId);\n\t\tassignOid(obj, oid);\n\t\treturn oid;\n\t} else {\n\t\tconst existingOid = getOid(obj);\n\t\tif (!areOidsRelated(existingOid, rootOid)) {\n\t\t\tconst oid = createSubOid(rootOid, createSubId);\n\t\t\tassignOid(obj, oid);\n\t\t\treturn oid;\n\t\t} else {\n\t\t\treturn getOid(obj);\n\t\t}\n\t}\n}\n\nconst SANTIIZE_PLACEHOLDERS = {\n\t'.': '˙',\n\t'/': '&slash;',\n\t':': ':',\n};\nfunction sanitizeFragment(id: string) {\n\t// replaces separator characters with placeholders\n\treturn id\n\t\t.replace(/[/]/g, SANTIIZE_PLACEHOLDERS['/'])\n\t\t.replace(/[:]/g, SANTIIZE_PLACEHOLDERS[':'])\n\t\t.replace(/[.]/g, SANTIIZE_PLACEHOLDERS['.']);\n}\nfunction unsanitizeFragment(id: string) {\n\t// replaces placeholders with separator characters\n\treturn id\n\t\t.replace(/&slash;/g, '/')\n\t\t.replace(/:/g, ':')\n\t\t.replace(/˙/g, '.');\n}\n\nexport function createOid(\n\tcollection: string,\n\tdocumentId: string,\n\tsubId?: string,\n) {\n\tlet oid =\n\t\tsanitizeFragment(collection) +\n\t\tCOLLECTION_SEPARATOR +\n\t\tsanitizeFragment(documentId);\n\tif (subId) {\n\t\toid += RANDOM_SEPARATOR + subId;\n\t}\n\treturn oid;\n}\n\nexport function createSubOid(\n\troot: ObjectIdentifier,\n\tcreateSubId: () => string = createOidSubId,\n) {\n\tconst { collection, id } = decomposeOid(root);\n\treturn createOid(collection, id, createSubId());\n}\n\nexport function decomposeOid(oid: ObjectIdentifier): {\n\tcollection: string;\n\tid: string;\n\tsubId?: string;\n} {\n\tconst [core, random] = oid.split(RANDOM_SEPARATOR);\n\tconst [collection, idOrLegacyPathId] = core.split('/');\n\tlet id;\n\tif (idOrLegacyPathId.includes('.')) {\n\t\tid = idOrLegacyPathId.slice(0, idOrLegacyPathId.indexOf('.'));\n\t} else {\n\t\tid = idOrLegacyPathId;\n\t}\n\treturn {\n\t\tcollection: unsanitizeFragment(collection),\n\t\tid: unsanitizeFragment(id),\n\t\tsubId: random,\n\t};\n}\n\nexport function assertAllLevelsHaveOids(obj: any, root?: any) {\n\tassert(\n\t\tgetOid(obj),\n\t\t`Object ${JSON.stringify(obj)} must have an oid (child of ${JSON.stringify(\n\t\t\troot,\n\t\t)})`,\n\t);\n\tif (Array.isArray(obj)) {\n\t\tfor (const item of obj) {\n\t\t\tassertAllLevelsHaveOids(item, root || obj);\n\t\t}\n\t} else if (isObject(obj)) {\n\t\tfor (const key of Object.keys(obj)) {\n\t\t\tassertAllLevelsHaveOids(obj[key], root || obj);\n\t\t}\n\t}\n}\n\nexport function assignOidsToAllSubObjects(\n\tobj: any,\n\tcreateSubId?: () => string,\n) {\n\tconst rootOid = getOid(obj);\n\tif (Array.isArray(obj)) {\n\t\tlet item;\n\t\tfor (let i = 0; i < obj.length; i++) {\n\t\t\titem = obj[i];\n\t\t\tif (isObject(item) && !isRef(item)) {\n\t\t\t\tensureCompatibleOid(item, rootOid, createSubId);\n\t\t\t\tassignOidsToAllSubObjects(item, createSubId);\n\t\t\t}\n\t\t}\n\t} else if (isObject(obj) && !isRef(obj)) {\n\t\tfor (const key of Object.keys(obj)) {\n\t\t\tif (isObject(obj[key]) && !isRef(obj[key])) {\n\t\t\t\tensureCompatibleOid(obj[key], rootOid, createSubId);\n\t\t\t\tassignOidsToAllSubObjects(obj[key], createSubId);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function assignOidProperty(obj: any, oid: ObjectIdentifier) {\n\tassert(\n\t\tisObject(obj),\n\t\t`Only objects can be assigned OIDs, received ${JSON.stringify(obj)}`,\n\t);\n\tobj[OID_KEY] = oid;\n\treturn obj;\n}\n\nexport function maybeGetOidProperty(obj: any) {\n\tif (!isObject(obj)) {\n\t\treturn undefined;\n\t}\n\treturn obj[OID_KEY] || obj[LEGACY_OID_KEY];\n}\n\nfunction removeOidProperty(obj: any) {\n\tif (!isObject(obj)) {\n\t\treturn obj;\n\t}\n\tdelete obj[LEGACY_OID_KEY];\n\tdelete obj[OID_KEY];\n\treturn obj;\n}\n\nfunction transferOidFromSystemToProperty(obj: any) {\n\tconst oid = maybeGetOid(obj);\n\tif (oid) {\n\t\tassignOidProperty(obj, oid);\n\t}\n}\n\n/**\n * Assigns a special property to all objects in the given object\n * which have an OID\n */\nexport function assignOidPropertiesToAllSubObjects(obj: any) {\n\ttransferOidFromSystemToProperty(obj);\n\n\tif (Array.isArray(obj)) {\n\t\tfor (let i = 0; i < obj.length; i++) {\n\t\t\tassignOidPropertiesToAllSubObjects(obj[i]);\n\t\t}\n\t} else if (isObject(obj)) {\n\t\tfor (const key of Object.keys(obj)) {\n\t\t\tassignOidPropertiesToAllSubObjects(obj[key]);\n\t\t}\n\t}\n}\n\nfunction copyOidFromPropertyToSystem(obj: any) {\n\tconst oid = maybeGetOidProperty(obj);\n\tif (oid) {\n\t\tassignOid(obj, oid);\n\t}\n}\n\n/**\n *\n * Removes the special property from all objects in the given object\n * which have an OID, transferring the OID from the property to the OID\n * system in-memory.\n */\nexport function removeOidPropertiesFromAllSubObjects(obj: any) {\n\tcopyOidFromPropertyToSystem(obj);\n\tremoveOidProperty(obj);\n\n\tif (Array.isArray(obj)) {\n\t\tfor (let i = 0; i < obj.length; i++) {\n\t\t\tremoveOidPropertiesFromAllSubObjects(obj[i]);\n\t\t}\n\t} else if (isObject(obj)) {\n\t\tfor (const key of Object.keys(obj)) {\n\t\t\tremoveOidPropertiesFromAllSubObjects(obj[key]);\n\t\t}\n\t}\n}\n\nexport function removeOidsFromAllSubObjects(obj: any) {\n\tremoveOid(obj);\n\n\tif (Array.isArray(obj)) {\n\t\tfor (let i = 0; i < obj.length; i++) {\n\t\t\tremoveOidsFromAllSubObjects(obj[i]);\n\t\t}\n\t} else if (isObject(obj)) {\n\t\tfor (const key of Object.keys(obj)) {\n\t\t\tremoveOidsFromAllSubObjects(obj[key]);\n\t\t}\n\t}\n}\n\nexport function createOidSubId() {\n\treturn v4().slice(0, 8);\n}\n\nexport function createRef(oid: ObjectIdentifier): ObjectRef {\n\treturn {\n\t\t'@@type': 'ref',\n\t\tid: oid,\n\t};\n}\n\nexport function normalize(\n\tobj: any,\n\trefs: Map<ObjectIdentifier, any> = new Map(),\n): Map<ObjectIdentifier, any> {\n\tif (Array.isArray(obj)) {\n\t\tconst oid = getOid(obj);\n\t\tconst copy = assignOid([], oid);\n\t\tfor (let i = 0; i < obj.length; i++) {\n\t\t\tconst value = obj[i];\n\t\t\tif (isObject(value)) {\n\t\t\t\tif (isObjectRef(value)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'An attempt was made to normalize an already normalized object! This is an error in verdant itself.',\n\t\t\t\t\t);\n\t\t\t\t} else if (isFileRef(value)) {\n\t\t\t\t\tcopy[i] = value;\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\tconst itemOid = getOid(value);\n\t\t\t\t\tcopy[i] = createRef(itemOid);\n\t\t\t\t\tnormalize(value, refs);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcopy[i] = value;\n\t\t\t}\n\t\t}\n\t\trefs.set(oid, copy);\n\t} else if (isObject(obj) && !isRef(obj)) {\n\t\tconst oid = getOid(obj);\n\t\tconst copy = assignOid({} as Record<string, any>, oid);\n\t\tfor (const key of Object.keys(obj)) {\n\t\t\tconst value = obj[key];\n\t\t\tif (isObject(value)) {\n\t\t\t\tif (isObjectRef(value)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'An attempt was made to normalize an already normalized object! This is an error in verdant itself.',\n\t\t\t\t\t);\n\t\t\t\t} else if (isFileRef(value)) {\n\t\t\t\t\t// stop here\n\t\t\t\t\tcopy[key] = value;\n\t\t\t\t} else {\n\t\t\t\t\tconst itemOid = getOid(value);\n\t\t\t\t\tcopy[key] = createRef(itemOid);\n\t\t\t\t\tnormalize(value, refs);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcopy[key] = value;\n\t\t\t}\n\t\t}\n\t\trefs.set(oid, copy);\n\t} else if (isRef(obj)) {\n\t}\n\treturn refs;\n}\n\n/**\n * Only normalizes direct children. The created map\n * of objects will still have nested objects.\n */\nexport function normalizeFirstLevel(obj: any) {\n\tconst refs = new Map<ObjectIdentifier, any>();\n\tconst oidKeyPairs = new Map<ObjectIdentifier, string | number>();\n\tif (Array.isArray(obj)) {\n\t\tconst oid = getOid(obj);\n\t\tconst copy = assignOid([], oid);\n\t\tfor (let i = 0; i < obj.length; i++) {\n\t\t\tconst value = obj[i];\n\t\t\tif (isObject(value)) {\n\t\t\t\tconst itemOid = getOid(value);\n\t\t\t\tcopy[i] = createRef(itemOid);\n\t\t\t\trefs.set(itemOid, value);\n\t\t\t\toidKeyPairs.set(itemOid, i);\n\t\t\t} else {\n\t\t\t\tcopy[i] = value;\n\t\t\t}\n\t\t}\n\t\trefs.set(oid, copy);\n\t} else if (isObject(obj)) {\n\t\tconst oid = getOid(obj);\n\t\tconst copy = assignOid({} as Record<string, any>, oid);\n\t\tfor (const key of Object.keys(obj)) {\n\t\t\tconst value = obj[key];\n\t\t\tif (isObject(value)) {\n\t\t\t\tconst itemOid = getOid(value);\n\t\t\t\tcopy[key] = createRef(itemOid);\n\t\t\t\trefs.set(itemOid, value);\n\t\t\t\toidKeyPairs.set(itemOid, key);\n\t\t\t} else {\n\t\t\t\tcopy[key] = value;\n\t\t\t}\n\t\t}\n\t\trefs.set(oid, copy);\n\t}\n\treturn { refs, oidKeyPairs };\n}\n\nexport function getOidRoot(oid: ObjectIdentifier) {\n\treturn oid.split('.')[0].split(RANDOM_SEPARATOR)[0];\n}\n\n/**\n * Returns an inclusive range of OIDs that represent\n * all of an OID's possible sub-objects.\n */\nexport function getOidSubIdRange(oid: ObjectIdentifier) {\n\tconst root = getOidRoot(oid);\n\tconst lastSubId = createSubOid(root, () => '\\uffff');\n\treturn [`${root}${RANDOM_SEPARATOR}`, lastSubId];\n}\nexport function getLegacyDotOidSubIdRange(oid: ObjectIdentifier) {\n\tconst root = getOidRoot(oid);\n\treturn [`${root}.`, `${root}.\\uffff`];\n}\n\nexport function getRoots(oids: ObjectIdentifier[]) {\n\tconst set = new Set<ObjectIdentifier>();\n\tfor (const oid of oids) {\n\t\tset.add(getOidRoot(oid));\n\t}\n\treturn Array.from(set);\n}\n\nexport function areOidsRelated(oidA: ObjectIdentifier, oidB: ObjectIdentifier) {\n\treturn getOidRoot(oidA) === getOidRoot(oidB);\n}\n\n/**\n * Recursively rewrites any OIDs in an object which are 'foreign' -\n * i.e. relate to some other object/entity - to be local to the\n * current object. This is deterministic, so it can be done\n * on multiple clients independently with predictable results.\n */\nexport function fixForeignOids(obj: any) {\n\tconst oid = maybeGetOid(obj);\n\tif (!oid) return;\n\n\tif (Array.isArray(obj)) {\n\t\tfor (let i = 0; i < obj.length; i++) {\n\t\t\tmigrateForeignOid(oid, obj[i]);\n\t\t\tfixForeignOids(obj[i]);\n\t\t}\n\t} else if (isObject(obj)) {\n\t\tfor (const key of Object.keys(obj)) {\n\t\t\tmigrateForeignOid(oid, obj[key]);\n\t\t\tfixForeignOids(obj[key]);\n\t\t}\n\t}\n}\n\nfunction migrateForeignOid(parentOid: ObjectIdentifier, child: any) {\n\tconst childOid = maybeGetOid(child);\n\tif (childOid && !areOidsRelated(parentOid, childOid)) {\n\t\tconst { subId, id } = decomposeOid(childOid);\n\t\t// reuse existing subId. if child is a foreign root, use its id as subId\n\t\tassignOid(\n\t\t\tchild,\n\t\t\tcreateSubOid(parentOid, () => subId || id),\n\t\t);\n\t}\n}\n\nexport function isLegacyDotOid(oid: ObjectIdentifier) {\n\tconst partBeforeRandomSep = oid.split(RANDOM_SEPARATOR)[0];\n\treturn partBeforeRandomSep.includes('.');\n}\n", "import { DocumentBaseline } from './baseline.js';\nimport { FileRef, isFileRef } from './files.js';\nimport {\n\tareOidsRelated,\n\tassignOid,\n\tassignOidsToAllSubObjects,\n\tcreateRef,\n\tcreateSubOid,\n\tensureOid,\n\tgetOid,\n\tgetOidRoot,\n\tisOidKey,\n\tmaybeGetOid,\n\tnormalize,\n\tObjectIdentifier,\n\tremoveOid,\n} from './oids.js';\nimport { compareRefs, isRef } from './refs.js';\nimport { assert, cloneDeep, findLastIndex, isObject } from './utils.js';\n\n// export type ObjectIdentifier<\n// \tCollectionName extends string = string,\n// \tDocumentId extends string = string,\n// \tDocumentOid extends string = string,\n// > =\n// \t| `${CollectionName}/${DocumentId}:${DocumentOid}`\n// \t| `${CollectionName}/${DocumentId}:${DocumentOid}#${string}`;\n\nexport type ObjectRef = {\n\t'@@type': 'ref';\n\tid: ObjectIdentifier;\n};\n\nexport function isObjectRef(obj: any): obj is ObjectRef {\n\treturn obj && typeof obj === 'object' && obj['@@type'] === 'ref';\n}\n\nexport type Normalized<T> = {\n\t[key in keyof T]: T[key] extends Object ? ObjectRef : T[key];\n};\n\n// patches v2\n\nexport type PropertyName = string | number;\n/**\n * List patches can target a particular child list or\n * nested lists. The first path item is the property path\n * of the first child list, any subsequent values are nested\n * list indices.\n */\nexport type PropertyValue =\n\t| string\n\t| number\n\t| boolean\n\t| null\n\t| undefined\n\t| ObjectRef;\n\n// all patches refer to a specific sub-object.\ninterface BaseOperationPatch {}\n\nexport interface OperationPatchInitialize extends BaseOperationPatch {\n\top: 'initialize';\n\tvalue: any;\n}\nexport interface OperationPatchSet extends BaseOperationPatch {\n\top: 'set';\n\tname: PropertyName;\n\tvalue: PropertyValue;\n}\nexport interface OperationPatchRemove extends BaseOperationPatch {\n\top: 'remove';\n\tname: PropertyName;\n}\nexport interface OperationPatchListPush extends BaseOperationPatch {\n\top: 'list-push';\n\tvalue: PropertyValue;\n}\nexport interface OperationPatchListInsert extends BaseOperationPatch {\n\top: 'list-insert';\n\tindex: number;\n\tvalue?: PropertyValue;\n\tvalues?: PropertyValue[];\n}\nexport interface OperationPatchListDelete extends BaseOperationPatch {\n\top: 'list-delete';\n\tindex: number;\n\tcount: number;\n}\n/**\n * Optimal for lists of object references. Moves\n * the selected item to the target index even if it\n * is not at the original index anymore.\n */\nexport interface OperationPatchListMoveByRef extends BaseOperationPatch {\n\top: 'list-move-by-ref';\n\tvalue: ObjectRef;\n\tindex: number;\n}\n/**\n * Suitable for any list move, whether object lists\n * or primitive lists.\n */\nexport interface OperationPatchListMoveByIndex extends BaseOperationPatch {\n\top: 'list-move-by-index';\n\tfrom: number;\n\tto: number;\n}\n/**\n * Removes all instances of the value from\n * the list. Good for set behavior or removing\n * a specific item even if it changes index\n * from conflicts.\n */\nexport interface OperationPatchListRemove extends BaseOperationPatch {\n\top: 'list-remove';\n\tvalue: PropertyValue;\n\tonly?: 'first' | 'last';\n}\n\nexport interface OperationPatchListAdd extends BaseOperationPatch {\n\top: 'list-add';\n\tvalue: PropertyValue;\n}\n\nexport interface OperationPatchDelete extends BaseOperationPatch {\n\top: 'delete';\n}\n\nexport type OperationPatch =\n\t| OperationPatchInitialize\n\t| OperationPatchSet\n\t| OperationPatchRemove\n\t| OperationPatchListPush\n\t| OperationPatchListInsert\n\t| OperationPatchListDelete\n\t| OperationPatchListMoveByRef\n\t| OperationPatchListMoveByIndex\n\t| OperationPatchListRemove\n\t| OperationPatchDelete\n\t| OperationPatchListAdd;\n\nexport type Operation = {\n\toid: ObjectIdentifier;\n\ttimestamp: string;\n\tdata: OperationPatch;\n};\n\nfunction isDiffableObject(val: any) {\n\treturn isObject(val) && !isRef(val);\n}\n\nfunction compareNonDiffable(a: any, b: any) {\n\tif (a === b) return true;\n\tif (isRef(a) && isRef(b)) return compareRefs(a, b);\n\treturn false;\n}\n\nexport function diffToPatches<T extends { [key: string]: any } | any[]>(\n\tfrom: T,\n\tto: T,\n\tgetNow: () => string,\n\tcreateSubId?: () => string,\n\tpatches: Operation[] = [],\n\toptions: {\n\t\t/**\n\t\t * If an object is merged with another and the new one does not\n\t\t * have an OID assigned, assume it is the same identity as previous\n\t\t */\n\t\tmergeUnknownObjects?: boolean;\n\t\t/**\n\t\t * If an incoming value is not assigned on the new object, use the previous value.\n\t\t * If false, undefined properties will erase the previous value.\n\t\t */\n\t\tdefaultUndefined?: boolean;\n\t} = {},\n): Operation[] {\n\tconst oid = getOid(from);\n\n\tfunction diffItems(key: string | number, value: any, oldValue: any) {\n\t\tif (!isDiffableObject(value)) {\n\t\t\t// for primitive fields, we can use plain sets and\n\t\t\t// do not need to recurse, of course\n\t\t\tif (!compareNonDiffable(value, oldValue)) {\n\t\t\t\tpatches.push({\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'set',\n\t\t\t\t\t\tname: key,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tconst oldValueOid = maybeGetOid(oldValue);\n\t\t\tlet valueOid = maybeGetOid(value);\n\t\t\t// the user supplied an object which was already assigned an OID,\n\t\t\t// but that OID is from a separate entity: this object must\n\t\t\t// be cloned to a new identity.\n\t\t\tif (valueOid && !areOidsRelated(oid, valueOid)) {\n\t\t\t\tvalue = cloneDeep(value, false);\n\t\t\t\tvalueOid = createSubOid(oid, createSubId);\n\t\t\t\tassignOid(value, valueOid);\n\t\t\t} else if (!options.mergeUnknownObjects) {\n\t\t\t\tvalueOid = ensureOid(value, oid, createSubId);\n\t\t\t} else {\n\t\t\t\t// if merge unknown objects is requested, we copy the previous value's oid\n\t\t\t\t// to any mirrored new value if it doesn't have one assigned already.\n\t\t\t\tif (!valueOid && oldValueOid) {\n\t\t\t\t\tassignOid(value, oldValueOid);\n\t\t\t\t\tvalueOid = oldValueOid;\n\t\t\t\t} else {\n\t\t\t\t\tvalueOid = ensureOid(value, oid, createSubId);\n\t\t\t\t}\n\t\t\t}\n\t\t\tassert(\n\t\t\t\t!!valueOid,\n\t\t\t\t'Error: no value OID was resolved during diff. This is a bug in Verdant.',\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tareOidsRelated(oid, valueOid),\n\t\t\t\t`Error: value OID ${valueOid} is not related to parent OID ${oid}. This is a bug in Verdant.`,\n\t\t\t);\n\n\t\t\tif (oldValue === undefined || valueOid !== oldValueOid) {\n\t\t\t\t// first case: previous value exists but the OIDs are different,\n\t\t\t\t// meaning the object identity has changed\n\t\t\t\t// we add the whole new object and also update the reference on this\n\t\t\t\t// key of the parent to point to the new object\n\t\t\t\tinitialToPatches(value, valueOid, getNow, createSubId, patches);\n\t\t\t\tpatches.push({\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'set',\n\t\t\t\t\t\tname: key,\n\t\t\t\t\t\tvalue: createRef(valueOid),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\t// if there was an old value, we need to delete it altogether.\n\t\t\t\tif (oldValueOid !== undefined) {\n\t\t\t\t\tpatches.push({\n\t\t\t\t\t\toid: oldValueOid,\n\t\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\top: 'delete',\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// third case: OIDs are the same, meaning the identity is the same,\n\t\t\t\t// and we must diff the objects\n\t\t\t\tdiffToPatches(oldValue, value, getNow, createSubId, patches, options);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (Array.isArray(from) && Array.isArray(to)) {\n\t\t// diffing is more naive than native array operations.\n\t\t// we can only look at each element and decide if it should\n\t\t// be replaced or removed - no moves or pushes, etc.\n\t\tfor (let i = 0; i < to.length; i++) {\n\t\t\tconst value = to[i];\n\t\t\tconst oldValue = from[i];\n\t\t\tdiffItems(i, value, oldValue);\n\t\t}\n\t\t// remove any remaining items at the end of the array\n\t\tconst deletedItemsAtEnd = from.length - to.length;\n\t\tif (deletedItemsAtEnd > 0) {\n\t\t\t// if sub-items were objects, we need to delete them all\n\t\t\tfor (let i = to.length; i < from.length; i++) {\n\t\t\t\tconst value = from[i];\n\t\t\t\tconst valueOid = maybeGetOid(value);\n\t\t\t\tif (valueOid) {\n\t\t\t\t\tpatches.push({\n\t\t\t\t\t\toid: valueOid,\n\t\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\top: 'delete',\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// push the list-delete for the deleted items\n\t\t\tpatches.push({\n\t\t\t\toid,\n\t\t\t\ttimestamp: getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'list-delete',\n\t\t\t\t\tindex: to.length,\n\t\t\t\t\tcount: deletedItemsAtEnd,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t} else if (Array.isArray(from) || Array.isArray(to)) {\n\t\tthrow new Error('Cannot diff an array with an object');\n\t} else if (isDiffableObject(from) && isDiffableObject(to)) {\n\t\tconst oldKeys = new Set(Object.keys(from));\n\t\tfor (const [key, value] of Object.entries(to)) {\n\t\t\tif (value === undefined && options.defaultUndefined) continue;\n\n\t\t\toldKeys.delete(key);\n\n\t\t\tif (isOidKey(key)) continue;\n\n\t\t\tconst oldValue = from[key];\n\n\t\t\tdiffItems(key, value, oldValue);\n\t\t}\n\n\t\t// this set now only contains keys which were not in the new object\n\t\tif (!options.defaultUndefined) {\n\t\t\tfor (const key of oldKeys) {\n\t\t\t\tif (isOidKey(key)) continue;\n\t\t\t\t// push the delete for the property\n\t\t\t\tpatches.push({\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'remove',\n\t\t\t\t\t\tname: key,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\treturn patches;\n}\n\nexport function shallowDiffToPatches(\n\tfrom: any,\n\tto: any,\n\tgetNow: () => string,\n\tpatches: Operation[] = [],\n) {\n\tconst oid = getOid(from);\n\n\tfunction diffItems(key: string | number, value: any, oldValue: any) {\n\t\tif (!isDiffableObject(value)) {\n\t\t\t// for primitive fields, we can use plain sets and\n\t\t\t// do not need to recurse, of course\n\t\t\tif (!compareNonDiffable(value, oldValue)) {\n\t\t\t\tpatches.push({\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'set',\n\t\t\t\t\t\tname: key,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t'Shallow diff was given a nested object. This is an error in verdant!',\n\t\t\t);\n\t\t}\n\t}\n\n\tif (Array.isArray(from) && Array.isArray(to)) {\n\t\t// diffing is more naive than native array operations.\n\t\t// we can only look at each element and decide if it should\n\t\t// be replaced or removed - no moves or pushes, etc.\n\t\tfor (let i = 0; i < to.length; i++) {\n\t\t\tconst value = to[i];\n\t\t\tconst oldValue = from[i];\n\t\t\tdiffItems(i, value, oldValue);\n\t\t}\n\t\t// remove any remaining items at the end of the array\n\t\tconst deletedItemsAtEnd = from.length - to.length;\n\t\tif (deletedItemsAtEnd > 0) {\n\t\t\t// push the list-delete for the deleted items\n\t\t\tpatches.push({\n\t\t\t\toid,\n\t\t\t\ttimestamp: getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'list-delete',\n\t\t\t\t\tindex: to.length,\n\t\t\t\t\tcount: deletedItemsAtEnd,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t} else if (Array.isArray(from) || Array.isArray(to)) {\n\t\tthrow new Error('Cannot diff an array with an object');\n\t} else if (isDiffableObject(from) && isDiffableObject(to)) {\n\t\tconst oldKeys = new Set(Object.keys(from));\n\t\tfor (const [key, value] of Object.entries(to)) {\n\t\t\toldKeys.delete(key);\n\n\t\t\tif (isOidKey(key)) continue;\n\n\t\t\tconst oldValue = from[key];\n\n\t\t\tdiffItems(key, value, oldValue);\n\t\t}\n\n\t\t// this set now only contains keys which were not in the new object\n\t\tfor (const key of oldKeys) {\n\t\t\tif (isOidKey(key)) continue;\n\t\t\t// push the delete for the property\n\t\t\tpatches.push({\n\t\t\t\toid,\n\t\t\t\ttimestamp: getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'remove',\n\t\t\t\t\tname: key,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\treturn patches;\n}\n\n/**\n * Takes a basic object and constructs a patch list to create it and\n * all of its nested objects.\n */\nexport function initialToPatches(\n\tinitial: any,\n\trootOid: ObjectIdentifier,\n\tgetNow: () => string,\n\tcreateSubId?: () => string,\n\tpatches: Operation[] = [],\n) {\n\tassignOid(initial, rootOid);\n\tassignOidsToAllSubObjects(initial, createSubId);\n\tconst normalized = normalize(initial);\n\tfor (const key of normalized.keys()) {\n\t\tconst value = normalized.get(key);\n\t\tpatches.push({\n\t\t\toid: key,\n\t\t\ttimestamp: getNow(),\n\t\t\tdata: {\n\t\t\t\top: 'initialize',\n\t\t\t\tvalue: removeOid(value),\n\t\t\t},\n\t\t});\n\t}\n\treturn patches;\n}\n\nexport function shallowInitialToPatches(\n\tinitial: any,\n\trootOid: ObjectIdentifier,\n\tgetNow: () => string,\n\tpatches: Operation[] = [],\n) {\n\tpatches.push({\n\t\toid: rootOid,\n\t\ttimestamp: getNow(),\n\t\tdata: {\n\t\t\top: 'initialize',\n\t\t\tvalue: initial,\n\t\t},\n\t});\n\treturn patches;\n}\n\nexport function groupPatchesByIdentifier(patches: Operation[]) {\n\tconst grouped: Record<ObjectIdentifier, Operation[]> = {};\n\tfor (const patch of patches) {\n\t\tif (patch.oid in grouped) {\n\t\t\tgrouped[patch.oid].push(patch);\n\t\t} else {\n\t\t\tgrouped[patch.oid] = [patch];\n\t\t}\n\t}\n\treturn grouped;\n}\n\nexport function groupPatchesByRootOid(patches: Operation[]) {\n\tconst grouped: Record<ObjectIdentifier, Operation[]> = {};\n\tfor (const patch of patches) {\n\t\tconst root = getOidRoot(patch.oid);\n\t\tif (root in grouped) {\n\t\t\tgrouped[root].push(patch);\n\t\t} else {\n\t\t\tgrouped[root] = [patch];\n\t\t}\n\t}\n\treturn grouped;\n}\n\nexport function groupBaselinesByRootOid(baselines: DocumentBaseline[]) {\n\tconst grouped: Record<ObjectIdentifier, DocumentBaseline[]> = {};\n\tfor (const patch of baselines) {\n\t\tconst root = getOidRoot(patch.oid);\n\t\tif (root in grouped) {\n\t\t\tgrouped[root].push(patch);\n\t\t} else {\n\t\t\tgrouped[root] = [patch];\n\t\t}\n\t}\n\treturn grouped;\n}\n\nexport type NormalizedObject =\n\t| {\n\t\t\t[key: PropertyName]: PropertyValue;\n\t }\n\t| Array<PropertyValue>;\n\nfunction listCheck(obj: any): obj is Array<unknown> {\n\tif (!Array.isArray(obj)) {\n\t\tconsole.error(\n\t\t\t`Cannot apply list patch; expected array, received ${JSON.stringify(\n\t\t\t\tobj,\n\t\t\t)}. This suggests your data is changing from a list to an object over time. (OID: ${maybeGetOid(\n\t\t\t\tobj,\n\t\t\t)})`,\n\t\t);\n\t\treturn false;\n\t} else {\n\t\treturn true;\n\t}\n}\n\n/**\n * The incoming object should already be normalized!\n * This function will mutate the base object.\n */\nexport function applyPatch<T extends NormalizedObject>(\n\tbase: T | undefined,\n\tpatch: OperationPatch,\n\t/**\n\t * Optionally supply a list to which any refs which\n\t * are removed during the patch will be appended.\n\t */\n\tdeletedRefs?: (FileRef | ObjectRef)[],\n): T | undefined {\n\t// deleted objects are represented by undefined\n\t// and remain deleted unless re-initialized\n\tif ((base === undefined || base === null) && patch.op !== 'initialize') {\n\t\treturn base;\n\t}\n\t// ditch typing internally.\n\tconst baseAsAny = base as any;\n\tlet index;\n\tlet spliceResult: any[];\n\n\t// a helper, pass it a value which is about\n\t// to be removed and it will append it to the list\n\t// if it was a ref\n\tfunction checkRef(field: any) {\n\t\t// don't bother if not supplied\n\t\tif (!deletedRefs) return;\n\t\tif (isRef(field)) {\n\t\t\tdeletedRefs.push(field);\n\t\t}\n\t}\n\n\tswitch (patch.op) {\n\t\tcase 'set':\n\t\t\tcheckRef(baseAsAny[patch.name]);\n\t\t\tbaseAsAny[patch.name] = patch.value;\n\t\t\tbreak;\n\t\tcase 'remove':\n\t\t\tcheckRef(baseAsAny[patch.name]);\n\t\t\tdelete baseAsAny[patch.name];\n\t\t\tbreak;\n\t\tcase 'list-push':\n\t\t\tif (listCheck(base)) {\n\t\t\t\tbase.push(patch.value);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'list-delete':\n\t\t\tif (listCheck(base)) {\n\t\t\t\tcheckRef(base[patch.index]);\n\t\t\t\tbase.splice(patch.index, patch.count);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'list-move-by-index':\n\t\t\tif (listCheck(base)) {\n\t\t\t\tspliceResult = base.splice(patch.from, 1);\n\t\t\t\tbase.splice(patch.to, 0, spliceResult[0]);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'list-remove':\n\t\t\tif (listCheck(base)) {\n\t\t\t\tdo {\n\t\t\t\t\tconst valueToRemove = patch.value;\n\t\t\t\t\tif (patch.only === 'last') {\n\t\t\t\t\t\tif (isObjectRef(valueToRemove)) {\n\t\t\t\t\t\t\tindex = findLastIndex(\n\t\t\t\t\t\t\t\tbase,\n\t\t\t\t\t\t\t\t(item: any) => item.id === valueToRemove.id,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tindex = base.lastIndexOf(valueToRemove);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (isObjectRef(valueToRemove)) {\n\t\t\t\t\t\t\tindex = base.findIndex(\n\t\t\t\t\t\t\t\t(item: any) => item.id === valueToRemove.id,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tindex = base.indexOf(valueToRemove);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\tcheckRef(base[index]);\n\t\t\t\t\t\tbase.splice(index, 1);\n\t\t\t\t\t}\n\t\t\t\t} while (!patch.only && index !== -1);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'list-add':\n\t\t\tif (listCheck(base)) {\n\t\t\t\tconst alreadyHas = base.some((item: any) => {\n\t\t\t\t\tif (isObjectRef(item) && isObjectRef(patch.value)) {\n\t\t\t\t\t\treturn item.id === patch.value.id;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn item === patch.value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (!alreadyHas) {\n\t\t\t\t\tbase.push(patch.value);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'list-move-by-ref':\n\t\t\tif (listCheck(base)) {\n\t\t\t\tindex = base.indexOf(patch.value);\n\t\t\t\tspliceResult = base.splice(index, 1);\n\t\t\t\tbase.splice(patch.index, 0, spliceResult[0]);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'list-insert':\n\t\t\tif (listCheck(base)) {\n\t\t\t\tif (!patch.value && !patch.values) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Cannot apply list insert patch; expected value or values, received ${JSON.stringify(\n\t\t\t\t\t\t\tpatch,\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (patch.value) {\n\t\t\t\t\tbase.splice(patch.index, 0, patch.value);\n\t\t\t\t} else {\n\t\t\t\t\tbase.splice(patch.index, 0, ...patch.values!);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'delete':\n\t\t\t// collect all refs that are deleted\n\t\t\tif (Array.isArray(base)) {\n\t\t\t\tbase.forEach(checkRef);\n\t\t\t} else if (isObject(base)) {\n\t\t\t\tObject.values(base || {}).forEach(checkRef);\n\t\t\t}\n\t\t\treturn undefined;\n\t\tcase 'initialize':\n\t\t\treturn cloneDeep(patch.value);\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported patch operation: ${(patch as any).op}`);\n\t}\n\treturn base;\n}\n\nexport function applyOperations<T extends NormalizedObject>(\n\tbase: T | undefined,\n\toperations: Operation[],\n\tdeletedRefs?: (ObjectRef | FileRef)[],\n): T | undefined {\n\tlet cur = base as T | undefined;\n\tfor (const op of operations) {\n\t\tcur = applyPatch(cur, op.data, deletedRefs);\n\t}\n\treturn cur;\n}\n\n/**\n * Mutates the original object in place. Returns all referenced\n * objects oids.\n */\nexport function substituteRefsWithObjects(\n\tbase: any,\n\trefs: Map<ObjectIdentifier, any>,\n\tused: ObjectIdentifier[] = [],\n): ObjectIdentifier[] {\n\tif (Array.isArray(base)) {\n\t\tfor (let i = 0; i < base.length; i++) {\n\t\t\tconst item = base[i];\n\t\t\tbase[i] = dereference(item, refs, used);\n\t\t\tif (isObject(base[i])) {\n\t\t\t\tsubstituteRefsWithObjects(base[i], refs, used);\n\t\t\t}\n\t\t}\n\t} else if (isFileRef(base)) {\n\t\t// don't do anything with file refs\n\t} else if (isObject(base)) {\n\t\t// not sure where to put this assertion but it's important to make\n\t\t// sure all nested objects include an OID\n\t\tassert(\n\t\t\tmaybeGetOid(base),\n\t\t\t`Object ${JSON.stringify(base)} must have an oid`,\n\t\t);\n\t\tfor (const key of Object.keys(base)) {\n\t\t\tbase[key] = dereference(base[key], refs, used);\n\n\t\t\t// now that objects are in place, recursively substitute\n\t\t\tif (isObject(base[key])) {\n\t\t\t\tsubstituteRefsWithObjects(base[key], refs, used);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn used;\n}\n\nfunction dereference(\n\tinput: any,\n\trefs: Map<ObjectIdentifier, any>,\n\tused: ObjectIdentifier[],\n): any {\n\tif (isObjectRef(input)) {\n\t\tused.push(input.id);\n\t\tconst resolved = refs.get(input.id);\n\t\tassert(!!resolved, `No value was found in object map for ${input.id}`);\n\t\treturn assignOid(resolved, input.id);\n\t} else {\n\t\treturn input;\n\t}\n}\n\nexport function substituteFirstLevelObjectsWithRefs<\n\tBase extends { [key: string]: any } | any[],\n>(\n\tbase: Base,\n\trefObjects: Map<ObjectIdentifier, any> = new Map(),\n): Map<ObjectIdentifier, any> {\n\tif (Array.isArray(base)) {\n\t\tfor (let i = 0; i < base.length; i++) {\n\t\t\tconst item = base[i];\n\t\t\tif (isObject(item)) {\n\t\t\t\tconst oid = getOid(item);\n\t\t\t\tbase[i] = {\n\t\t\t\t\t'@@type': 'ref',\n\t\t\t\t\tid: oid,\n\t\t\t\t};\n\t\t\t\trefObjects.set(oid, item);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor (const [key, value] of Object.entries(base)) {\n\t\t\tif (isObject(value)) {\n\t\t\t\tbase[key] = {\n\t\t\t\t\t'@@type': 'ref',\n\t\t\t\t\tid: getOid(value),\n\t\t\t\t};\n\n\t\t\t\trefObjects.set(getOid(value), value);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn refObjects;\n}\n", "import { LEGACY_OID_KEY, OID_KEY } from '../oids.js';\nimport { isObject } from '../utils.js';\nimport type { StorageFieldSchema, StorageCollectionSchema } from './types.js';\n\nexport function isNullable(field: StorageFieldSchema) {\n\tif (field.type === 'any') return true;\n\tif (field.type === 'map') return false;\n\treturn field.nullable;\n}\n\nexport function hasDefault(field: StorageFieldSchema | undefined) {\n\tif (!field) return false;\n\tif (field.type === 'map') return true;\n\tif (field.type === 'array') return true;\n\tif (field.type === 'file') return false;\n\tif (field.type === 'object') return true;\n\treturn field.default !== undefined;\n}\n\nexport function isIndexed(field: StorageFieldSchema) {\n\tif (field.type === 'map') return false;\n\tif (field.type === 'object') return false;\n\tif (field.type === 'array') return false;\n\tif (field.type === 'file') return false;\n\tif (field.type === 'any') return false;\n\treturn field.indexed;\n}\n\nexport function addFieldDefaults(\n\tcollection: StorageCollectionSchema,\n\tvalue: any,\n) {\n\tfor (const [key, field] of Object.entries(collection.fields)) {\n\t\tconst defaultValue = getFieldDefault(field);\n\t\tif (\n\t\t\t(defaultValue !== undefined && value[key] === undefined) ||\n\t\t\t// covers the case where a previously nullable field\n\t\t\t// now has a default during a new migration\n\t\t\t(!isNullable(field) && value[key] === null)\n\t\t) {\n\t\t\tvalue[key] = defaultValue;\n\t\t}\n\t\tif (value[key]) {\n\t\t\ttraverseCollectionFieldsAndApplyDefaults(value[key], field);\n\t\t}\n\t}\n\treturn value;\n}\n\nexport function traverseCollectionFieldsAndApplyDefaults(\n\tvalue: any,\n\tfield: StorageFieldSchema,\n) {\n\tif (value === undefined || value === null) return value;\n\tif (field.type === 'object') {\n\t\tfor (const [key, subField] of Object.entries(field.properties)) {\n\t\t\tif (value[key] === undefined) {\n\t\t\t\tconst defaultValue = getFieldDefault(subField);\n\t\t\t\tif (defaultValue !== undefined) {\n\t\t\t\t\tvalue[key] = defaultValue;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttraverseCollectionFieldsAndApplyDefaults(value[key], subField);\n\t\t}\n\t} else if (field.type === 'array') {\n\t\tfor (const item of value) {\n\t\t\ttraverseCollectionFieldsAndApplyDefaults(item, field.items);\n\t\t}\n\t} else if (field.type === 'map') {\n\t\tfor (const [key, item] of Object.entries(value)) {\n\t\t\t// santiy check to weed out any id field\n\t\t\tif (key === OID_KEY || key === LEGACY_OID_KEY) continue;\n\t\t\ttraverseCollectionFieldsAndApplyDefaults(item, field.values);\n\t\t}\n\t}\n}\n\nexport function getFieldDefault(field: StorageFieldSchema) {\n\tif (\n\t\tfield.type === 'string' ||\n\t\tfield.type === 'number' ||\n\t\tfield.type === 'boolean' ||\n\t\tfield.type === 'any'\n\t) {\n\t\tif (field.default && typeof field.default === 'function') {\n\t\t\treturn field.default();\n\t\t} else if (field.default !== undefined) {\n\t\t\t// TODO: structuredClone?\n\t\t\treturn JSON.parse(JSON.stringify(field.default));\n\t\t}\n\t}\n\tif (field.type === 'array') {\n\t\treturn [];\n\t}\n\tif (field.type === 'map') {\n\t\treturn {};\n\t}\n\tif (field.type !== 'any' && field.nullable) {\n\t\treturn null;\n\t}\n\treturn undefined;\n}\n\nexport function removeExtraProperties(\n\tcollection: StorageCollectionSchema,\n\tvalue: any,\n) {\n\tfor (const [key, fieldValue] of Object.entries(value)) {\n\t\t// MUST NOT DELETE THESE!\n\t\tif (key === OID_KEY || key === LEGACY_OID_KEY) continue;\n\n\t\tif (!collection.fields[key]) {\n\t\t\tdelete value[key];\n\t\t} else {\n\t\t\ttraverseCollectionFieldsAndRemoveExtraProperties(\n\t\t\t\tfieldValue,\n\t\t\t\tcollection.fields[key],\n\t\t\t);\n\t\t}\n\t}\n\treturn value;\n}\n\nexport function traverseCollectionFieldsAndRemoveExtraProperties(\n\tvalue: any,\n\tfield: StorageFieldSchema,\n) {\n\tif (isObject(value) && field.type === 'object') {\n\t\tfor (const [key, fieldValue] of Object.entries(value)) {\n\t\t\tif (!field.properties[key]) {\n\t\t\t\tdelete value[key];\n\t\t\t} else {\n\t\t\t\ttraverseCollectionFieldsAndRemoveExtraProperties(\n\t\t\t\t\tfieldValue,\n\t\t\t\t\tfield.properties[key],\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else if (Array.isArray(value) && field.type === 'array') {\n\t\tfor (const item of value) {\n\t\t\ttraverseCollectionFieldsAndRemoveExtraProperties(item, field.items);\n\t\t}\n\t}\n}\n", "import {\n\tCollectionCompoundIndexFilter,\n\tCollectionFilter,\n\tMatchCollectionIndexFilter,\n\tRangeCollectionIndexFilter,\n\tSortIndexFilter,\n\tStartsWithIndexFilter,\n} from './types.js';\n\nexport function isMatchIndexFilter(\n\tfilter: CollectionFilter,\n): filter is MatchCollectionIndexFilter {\n\treturn (filter as any).equals !== undefined;\n}\n\nexport function isRangeIndexFilter(\n\tfilter: CollectionFilter,\n): filter is RangeCollectionIndexFilter {\n\treturn (\n\t\t(filter as any).gte !== undefined ||\n\t\t(filter as any).lte !== undefined ||\n\t\t(filter as any).gt !== undefined ||\n\t\t(filter as any).lt !== undefined\n\t);\n}\n\nexport function isCompoundIndexFilter(\n\tfilter: CollectionFilter,\n): filter is CollectionCompoundIndexFilter {\n\treturn !!(filter as any).match;\n}\n\nexport function isStartsWithIndexFilter(\n\tfilter: CollectionFilter,\n): filter is StartsWithIndexFilter {\n\treturn (filter as any).startsWith !== undefined;\n}\n\nexport function isSortIndexFilter(\n\tfilter: CollectionFilter,\n): filter is SortIndexFilter {\n\treturn (\n\t\t!isRangeIndexFilter(filter) &&\n\t\t!isMatchIndexFilter(filter) &&\n\t\t!isCompoundIndexFilter(filter) &&\n\t\t!isStartsWithIndexFilter(filter) &&\n\t\t(filter as any).order\n\t);\n}\n", "import { isIndexed } from './fields.js';\nimport {\n\tCollectionCompoundIndices,\n\tStorageCollectionSchema,\n\tStorageDirectSyntheticSchema,\n\tStorageFieldsSchema,\n\tStorageSchema,\n\tStorageSyntheticIndexSchema,\n\tStorageSyntheticIndices,\n} from './types.js';\n\nexport function collection<\n\tFields extends StorageFieldsSchema,\n\tSynthetics extends StorageSyntheticIndices<Fields>,\n\tCompounds extends CollectionCompoundIndices<Fields, Synthetics>,\n>({\n\tsynthetics,\n\tindexes,\n\t...input\n}: StorageCollectionSchema<\n\tFields,\n\tSynthetics,\n\tCompounds\n>): StorageCollectionSchema<Fields, Synthetics, Compounds> {\n\t// back compat - copy synthetics in with indexes\n\tconst finalIndexes = { ...synthetics, ...indexes };\n\t// add all indexed fields into the synthetic indices (back compat)\n\tfor (const [key, field] of Object.entries(input.fields)) {\n\t\tif (isIndexed(field)) {\n\t\t\tfinalIndexes[key] = {\n\t\t\t\tfield: key,\n\t\t\t} as StorageDirectSyntheticSchema<Fields>;\n\t\t}\n\t}\n\treturn {\n\t\t...input,\n\t\tindexes: finalIndexes as Synthetics,\n\t};\n}\n\nexport function schema<\n\t// Fields extends StorageFieldsSchema,\n\t// Indexes extends StorageSyntheticIndices<Fields>,\n\t// Compounds extends CollectionCompoundIndices<Fields, Indexes>,\n\tSchema extends StorageSchema<{\n\t\t[key: string]: StorageCollectionSchema<any, any, any>;\n\t}>,\n>(input: Schema): StorageSchema {\n\treturn input;\n}\n\nexport * from './types.js';\n\nexport * from './indexFilters.js';\nexport * from './fields.js';\n", "import {\n\tStorageCollectionSchema,\n\tStorageSyntheticIndexSchema,\n\tCollectionCompoundIndex,\n\tisIndexed,\n\tStorageDirectSyntheticSchema,\n} from './index.js';\n\n// unlikely to be used unicode character\nexport const COMPOUND_INDEX_SEPARATOR = '\\uFFFFFE';\n// 1 lower than separator\nexport const COMPOUND_INDEX_LOWER_BOUND_SEPARATOR = '\\u0000';\n// 1 higher than separator\nexport const COMPOUND_INDEX_UPPER_BOUND_SEPARATOR = '\\uFFFFFF';\n\ntype IndexableFieldValue = string | number | boolean | any[];\nexport type CompoundIndexValue = string | string[];\n\nexport function createCompoundIndexValue(\n\t...fields: IndexableFieldValue[]\n): CompoundIndexValue {\n\tconst value = expandArrayIndex(fields);\n\tif (value.length === 1) {\n\t\treturn value[0];\n\t}\n\treturn value;\n}\n\nexport function createUpperBoundIndexValue(\n\t...fields: IndexableFieldValue[]\n): string {\n\treturn (\n\t\tfields.join(COMPOUND_INDEX_SEPARATOR) +\n\t\t`${COMPOUND_INDEX_UPPER_BOUND_SEPARATOR}`\n\t);\n}\n\nexport function createLowerBoundIndexValue(\n\t...fields: IndexableFieldValue[]\n): string {\n\treturn (\n\t\tfields.join(COMPOUND_INDEX_SEPARATOR) +\n\t\t`${COMPOUND_INDEX_SEPARATOR}${COMPOUND_INDEX_LOWER_BOUND_SEPARATOR}`\n\t);\n}\n\n/**\n * Whenever an array value is included in a compound index, we have to expand\n * the value to include all permutations of values in the array.\n * For example if we had an index id + tags on a document\n *\n * {\n * id: '1',\n * tags: ['a', 'b']\n * }\n *\n * we want to create an index:\n *\n * id_tags: ['1#a', '1#b']\n *\n * If multiple arrays are indexed we have to exponentially expand...\n *\n * id_tags_tags2: ['1#a#a', '1#a#b', '1#b#a', '1#b#b']\n *\n * To generalize this we construct a 2-level array of strings.\n * Iterating over indexed values, we expand each item into N items if\n * the current value is an array.\n *\n * Then we combine all nested arrays into compound index values.\n * This will produce an array of 1 element if none of the indexed values\n * were arrays. The caller should unwrap that.\n *\n * This function also deduplicates values.\n */\nfunction expandArrayIndex(fields: IndexableFieldValue[]): string[] {\n\tlet value: string[][] = [[]];\n\tfor (const field of fields) {\n\t\tif (Array.isArray(field)) {\n\t\t\tconst newValue: string[][] = [];\n\t\t\tfor (const previousValue of value) {\n\t\t\t\tfor (const fieldValue of field) {\n\t\t\t\t\tnewValue.push(previousValue.concat(fieldValue));\n\t\t\t\t}\n\t\t\t}\n\t\t\tvalue = newValue;\n\t\t} else {\n\t\t\tfor (const item of value) {\n\t\t\t\titem.push(`${field}`);\n\t\t\t}\n\t\t}\n\t}\n\treturn Array.from(\n\t\tnew Set(\n\t\t\tvalue.map((item) => {\n\t\t\t\treturn item.join(COMPOUND_INDEX_SEPARATOR);\n\t\t\t}),\n\t\t),\n\t);\n}\n\nexport function isDirectSynthetic(\n\tindex: any,\n): index is StorageDirectSyntheticSchema<any> {\n\treturn !!index.field;\n}\n\nexport function computeSynthetics(schema: StorageCollectionSchema, obj: any) {\n\tconst result: Record<string, any> = {};\n\tfor (const [name, property] of Object.entries(schema.indexes || {})) {\n\t\tconst index = property as StorageSyntheticIndexSchema<any>;\n\t\tif (isDirectSynthetic(index)) {\n\t\t\tresult[name] = sanitizeIndexValue(obj[index.field]);\n\t\t} else {\n\t\t\tresult[name] = sanitizeIndexValue(index.compute(obj));\n\t\t}\n\t}\n\treturn result;\n}\n\nexport function computeCompoundIndices(\n\tschema: StorageCollectionSchema<any, any, any>,\n\tdoc: any,\n): any {\n\treturn Object.entries(schema.compounds || {}).reduce<\n\t\tRecord<string, CompoundIndexValue>\n\t>(\n\t\t(acc, [indexKey, index]) => {\n\t\t\tacc[indexKey] = createCompoundIndexValue(\n\t\t\t\t...(index as CollectionCompoundIndex<any, any>).of.map(\n\t\t\t\t\t(key) => doc[key] as string | number,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<string, CompoundIndexValue>,\n\t);\n}\n\nfunction computeIndexedFields(schema: StorageCollectionSchema, doc: any) {\n\treturn Object.entries(schema.fields).reduce<Record<string, any>>(\n\t\t(acc, [key, field]) => {\n\t\t\tif (isIndexed(field)) {\n\t\t\t\tacc[key] = sanitizeIndexValue(doc[key]);\n\t\t\t}\n\t\t\treturn acc;\n\t\t},\n\t\t{},\n\t);\n}\n\nexport function getIndexValues(\n\tschema: StorageCollectionSchema<any, any, any>,\n\tdoc: any,\n) {\n\treturn {\n\t\t[schema.primaryKey]: doc[schema.primaryKey],\n\t\t...computeIndexedFields(schema, doc),\n\t\t...computeSynthetics(schema, doc),\n\t\t...computeCompoundIndices(schema, doc),\n\t\t'@@@snapshot': doc,\n\t};\n}\n\nexport function assignIndexValues(\n\tschema: StorageCollectionSchema<any, any, any>,\n\tdoc: any,\n) {\n\tObject.assign(doc, computeSynthetics(schema, doc));\n\tObject.assign(doc, computeCompoundIndices(schema, doc));\n\treturn doc;\n}\n\nexport const NULL_INDEX_VALUE = 'null';\n\nexport function sanitizeIndexValue(\n\tvalue: unknown,\n): string | number | (string | number)[] {\n\tif (value === null) {\n\t\treturn NULL_INDEX_VALUE;\n\t}\n\tif (typeof value === 'string' || typeof value === 'number') {\n\t\treturn value;\n\t}\n\tif (typeof value === 'boolean' || value === null) {\n\t\treturn `${value}`;\n\t}\n\tif (value === undefined) {\n\t\t// this shouldn't happen ,but for resiliency...\n\t\treturn 'undefined';\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn value.map(sanitizeIndexValue) as any;\n\t}\n\tthrow new Error(`Unsupported index value: ${value}`);\n}\n", "import {\n\tstableStringify,\n\tStorageCollectionSchema,\n\tStorageSchema,\n\taddFieldDefaults,\n\tStorageDocument,\n\tCollectionFilter,\n\tStorageDocumentInit,\n\tremoveExtraProperties,\n\tassert,\n\thasOid,\n\tassignOid,\n\tgetOid,\n\thasDefault,\n} from './index.js';\n\n/**@deprecated */\nexport interface DroppedCollectionMigrationStrategy<\n\tOld extends StorageCollectionSchema<any, any, any>,\n> {\n\t(old: Old): void | Promise<void>;\n}\n/**@deprecated */\nexport interface PreservedCollectionMigrationStrategy<\n\tOld extends StorageCollectionSchema<any, any, any>,\n\tNew extends StorageCollectionSchema<any, any, any>,\n> {\n\t(\n\t\told: StorageDocument<Old>,\n\t): StorageDocument<New> | Promise<StorageDocument<New>>;\n}\n/** @deprecated */\ntype MigrationStrategy<\n\tOld extends StorageCollectionSchema<any, any, any>,\n\tNew extends StorageCollectionSchema<any, any, any>,\n> =\n\t| DroppedCollectionMigrationStrategy<Old>\n\t| PreservedCollectionMigrationStrategy<Old, New>;\n/** @deprecated */\nexport type MigrationsKeyedOnCollection<\n\tOld extends StorageSchema<any>,\n\tNew extends StorageSchema<any>,\n> =\n\t| PreservedCollectionMigrations<Old, New>\n\t| DroppedCollectionMigrations<Old, New>;\n\n/**@deprecated */\ntype NotInSchema<\n\tName extends string | number | symbol,\n\tSchema extends StorageSchema<any>,\n> = Name extends keyof Schema['collections'] ? never : Name;\n/** @deprecated */\ntype InSchema<\n\tName extends string | number | symbol,\n\tSchema extends StorageSchema<any>,\n> = Name extends keyof Schema['collections'] ? Name : never;\n/** @deprecated */\ntype DroppedCollections<\n\tOld extends StorageSchema<any>,\n\tNew extends StorageSchema<any>,\n> = {\n\t[Key in keyof Old['collections'] as NotInSchema<\n\t\tKey,\n\t\tNew\n\t>]: StorageCollectionSchema<any, any, any>;\n};\n/** @deprecated */\ntype PreservedCollections<\n\tOld extends StorageSchema<any>,\n\tNew extends StorageSchema<any>,\n> = {\n\t[Key in keyof Old['collections'] as InSchema<\n\t\tKey,\n\t\tNew\n\t>]: StorageCollectionSchema<any, any, any>;\n};\n/** @deprecated */\ntype DroppedCollectionMigrations<\n\tOld extends StorageSchema<any>,\n\tNew extends StorageSchema<any>,\n> = {\n\t[Key in keyof DroppedCollections<\n\t\tOld,\n\t\tNew\n\t>]: DroppedCollectionMigrationStrategy<Old['collections'][Key]>;\n};\n/** @deprecated */\ntype PreservedCollectionMigrations<\n\tOld extends StorageSchema<any>,\n\tNew extends StorageSchema<any>,\n> = {\n\t[Key in keyof PreservedCollections<\n\t\tOld,\n\t\tNew\n\t>]: PreservedCollectionMigrationStrategy<\n\t\tOld['collections'][Key],\n\t\tNew['collections'][Key]\n\t>;\n};\n\n/** @deprecated */\ntype StrategyFor<\n\tKey extends string,\n\tOld extends StorageSchema<any>,\n\tNew extends StorageSchema<any>,\n> = Key extends keyof New['collections']\n\t? PreservedCollectionMigrationStrategy<\n\t\t\tOld['collections'][Key],\n\t\t\tNew['collections'][Key]\n\t >\n\t: DroppedCollectionMigrationStrategy<Old['collections'][Key]>;\n\n/** @deprecated */\ntype DeprecatedMigrationRunner<\n\tOld extends StorageSchema<any>,\n\tNew extends StorageSchema<any>,\n> = <Collection extends Extract<keyof Old['collections'], string>>(\n\tcollection: Collection,\n\tstrategy: StrategyFor<Collection, Old, New>,\n) => Promise<void>;\n\n/** @deprecated */\ntype DeprecatedMigrationQueryMaker<\n\tCollection extends StorageCollectionSchema<any, any, any>,\n> = {\n\tget(primaryKey: string): Promise<StorageDocument<Collection> | undefined>;\n\tfindOne(\n\t\tquery: CollectionFilter,\n\t): Promise<StorageDocument<Collection> | undefined>;\n\tfindAll(query?: CollectionFilter): Promise<StorageDocument<Collection>[]>;\n};\n\n/** @deprecated */\ntype DeprecatedMigrationQueries<Old extends StorageSchema<any>> = {\n\t[Key in keyof Old['collections']]: DeprecatedMigrationQueryMaker<\n\t\tOld['collections'][Key]\n\t>;\n};\n\n/** @deprecated */\ntype DeprecatedMigrationMutations<New extends StorageSchema> = {\n\t[Key in keyof New['collections']]: {\n\t\tput(\n\t\t\tdocument: StorageDocumentInit<New['collections'][Key]>,\n\t\t): Promise<StorageDocument<New['collections'][Key]>>;\n\t\tdelete(primaryKey: string): Promise<void>;\n\t};\n};\n/** @deprecated */\nexport interface DeprecatedMigrationTools<\n\tOld extends StorageSchema<any>,\n\tNew extends StorageSchema<any>,\n> {\n\tmigrate: DeprecatedMigrationRunner<Old, New>;\n\tidentity: <T>(val: T) => T;\n\t/**\n\t * @deprecated - default field values are automatically\n\t * applied during migration, you don't need to use this.\n\t * Please remove it from your migrations - even old ones\n\t * (old migrations can be updated!)\n\t */\n\twithDefaults: (collectionName: string, value: any) => any;\n\tqueries: DeprecatedMigrationQueries<Old>;\n\tmutations: DeprecatedMigrationMutations<New>;\n\tinfo: {\n\t\tchangedCollections: keyof Old['collections'][];\n\t\taddedCollections: keyof New['collections'][];\n\t\tremovedCollections: keyof Old['collections'][];\n\t};\n}\n\nexport interface MigrationEngine {\n\tmigrate: (collection: string, strategy: (val: any) => any) => Promise<void>;\n\tqueries: MigrationQueries<any>;\n\tmutations: MigrationMutations<any>;\n\t/** OIDs of any new documents created during the migration */\n\tnewOids: string[];\n\t/** Promises that should be resolved before completing the migration */\n\tawaitables: Promise<any>[];\n\tlog: (...messages: any[]) => void;\n}\n/** @deprecated */\ntype DeprecatedMigrationProcedure<\n\tOld extends StorageSchema,\n\tNew extends StorageSchema,\n> = (tools: DeprecatedMigrationTools<Old, New>) => Promise<void>;\n\ntype EmptySchema = {\n\tversion: 0;\n\tcollections: {};\n};\nconst emptySchema: EmptySchema = {\n\tversion: 0,\n\tcollections: {},\n};\n\n/** @deprecated - use createMigration */\nexport function migrate<Schema extends StorageSchema>(\n\tschema: Schema,\n\tprocedure: DeprecatedMigrationProcedure<EmptySchema, Schema>,\n): Migration<EmptySchema, Schema>;\n/** @deprecated = use createMigration */\nexport function migrate<Old extends StorageSchema, New extends StorageSchema>(\n\toldSchema: Old,\n\tnewSchema: New,\n\tprocedure: DeprecatedMigrationProcedure<Old, New>,\n): Migration<Old, New>;\nexport function migrate(\n\toldSchemaOrNewSchema: any,\n\tnewSchemaOrProcedure: any,\n\tprocedureIfTwoSchemas?: any,\n) {\n\tconst isProcedureSecondArgument = typeof newSchemaOrProcedure === 'function';\n\tconst oldSchema = isProcedureSecondArgument\n\t\t? emptySchema\n\t\t: oldSchemaOrNewSchema;\n\tconst newSchema = isProcedureSecondArgument\n\t\t? oldSchemaOrNewSchema\n\t\t: newSchemaOrProcedure;\n\tconst procedure = isProcedureSecondArgument\n\t\t? newSchemaOrProcedure\n\t\t: procedureIfTwoSchemas;\n\t// diff to determine changed collections\n\tconst changedCollections: string[] = Object.keys(\n\t\tnewSchema.collections,\n\t).filter(\n\t\t(key) =>\n\t\t\toldSchema.collections[key] &&\n\t\t\tstableStringify(oldSchema.collections[key]) !==\n\t\t\t\tstableStringify(newSchema.collections[key]),\n\t);\n\tconst removedCollections: string[] = Object.keys(\n\t\toldSchema.collections,\n\t).filter((key) => !newSchema.collections[key]);\n\tconst addedCollections = Object.keys(newSchema.collections).filter(\n\t\t(key) => !oldSchema.collections[key],\n\t);\n\t// collections which added one or more field defaults\n\tconst autoMigratedCollections = new Set<string>();\n\tfor (const collection of changedCollections) {\n\t\tconst oldFields = oldSchema.collections[collection].fields;\n\t\tconst newFields = newSchema.collections[collection].fields;\n\t\t// a new default was added - we can auto-migrate it\n\t\tif (\n\t\t\tObject.keys(newFields).some(\n\t\t\t\t(key) => !oldFields[key]?.default && newFields[key]?.default,\n\t\t\t)\n\t\t) {\n\t\t\tautoMigratedCollections.add(collection);\n\t\t}\n\t\t// a field was removed - we can auto-migrate it\n\t\tif (Object.keys(oldFields).some((key) => !newFields[key])) {\n\t\t\tautoMigratedCollections.add(collection);\n\t\t}\n\t}\n\n\tconst addedIndexes: Record<string, MigrationIndexDescription[]> = {};\n\tconst removedIndexes: Record<string, MigrationIndexDescription[]> = {};\n\tfor (const changed of [...changedCollections, ...addedCollections]) {\n\t\tconst oldIndexes = getIndexes(oldSchema.collections[changed]);\n\t\tconst newIndexes = getIndexes(newSchema.collections[changed]);\n\t\tconst added = newIndexes.filter(\n\t\t\t(index) => !oldIndexes.find((i) => i.name === index.name),\n\t\t);\n\t\tconst removed = oldIndexes.filter(\n\t\t\t(index) => !newIndexes.find((i) => i.name === index.name),\n\t\t);\n\t\tif (added.length > 0) {\n\t\t\taddedIndexes[changed] = added;\n\t\t\t// FIXME: don't o(n^2) this\n\t\t\tif (changedCollections.includes(changed)) {\n\t\t\t\tautoMigratedCollections.add(changed);\n\t\t\t}\n\t\t}\n\t\tif (removed.length > 0) {\n\t\t\tremovedIndexes[changed] = removed;\n\t\t\t// FIXME: don't o(n^2) this\n\t\t\tif (changedCollections.includes(changed)) {\n\t\t\t\tautoMigratedCollections.add(changed);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst withDefaults = (collectionName: string, val: any) => {\n\t\treturn addFieldDefaults(newSchema.collections[collectionName], val);\n\t};\n\tconst autoMigration = (collectionName: string) => (val: any) => {\n\t\tconst collection = newSchema.collections[collectionName];\n\t\treturn addFieldDefaults(collection, removeExtraProperties(collection, val));\n\t};\n\n\treturn {\n\t\tversion: newSchema.version,\n\t\tmigrate: async (engine: MigrationEngine) => {\n\t\t\tconst migratedCollections: string[] = [];\n\t\t\tawait procedure({\n\t\t\t\tmigrate: async (collection: any, strategy: any) => {\n\t\t\t\t\tconst auto = autoMigration(collection);\n\t\t\t\t\tconst wrapped = async (val: any) => {\n\t\t\t\t\t\tconst baseValue = await strategy(val);\n\t\t\t\t\t\t// assign OID from original value in case user's strategy\n\t\t\t\t\t\t// involves cloning\n\t\t\t\t\t\tassignOid(baseValue, getOid(val));\n\t\t\t\t\t\tconst result = auto(baseValue);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t};\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tawait engine.migrate(collection, wrapped);\n\t\t\t\t\tmigratedCollections.push(collection);\n\t\t\t\t\t// since the user migrated this one and we wrap their\n\t\t\t\t\t// strategy with auto-migration, we can remove it from\n\t\t\t\t\t// the auto-migration list\n\t\t\t\t\tautoMigratedCollections.delete(collection);\n\t\t\t\t},\n\t\t\t\tidentity: (val: any) => val,\n\t\t\t\twithDefaults,\n\t\t\t\tinfo: {\n\t\t\t\t\tchangedCollections,\n\t\t\t\t\taddedCollections,\n\t\t\t\t\tremovedCollections,\n\t\t\t\t},\n\t\t\t\tqueries: engine.queries,\n\t\t\t\tmutations: engine.mutations,\n\t\t\t});\n\n\t\t\t// mandatory migration of fields which had defaults added or\n\t\t\t// fields removed but weren't migrated by the user\n\n\t\t\tif (newSchema.version > 1) {\n\t\t\t\tengine.log(\n\t\t\t\t\t'debug',\n\t\t\t\t\t'auto-migrating collections with new defaults',\n\t\t\t\t\tautoMigratedCollections,\n\t\t\t\t);\n\t\t\t\tfor (const name of autoMigratedCollections) {\n\t\t\t\t\tawait engine.migrate(name, autoMigration(name));\n\t\t\t\t\tmigratedCollections.push(name);\n\t\t\t\t}\n\n\t\t\t\tconst unmigrated = changedCollections.filter(\n\t\t\t\t\t(collection) => !migratedCollections.includes(collection),\n\t\t\t\t);\n\t\t\t\tif (unmigrated.length > 0) {\n\t\t\t\t\t// TODO: does this deserve a full-on error?\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`Unmigrated changed collections from version ${oldSchema.version} to version ${newSchema.version}:`,\n\t\t\t\t\t\tunmigrated,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tremovedCollections,\n\t\taddedIndexes,\n\t\tremovedIndexes,\n\t\tallCollections: Object.keys(newSchema.collections),\n\t\tchangedCollections,\n\t\taddedCollections,\n\t\toldCollections: Object.keys(oldSchema.collections),\n\t\toldSchema,\n\t\tnewSchema,\n\t};\n}\n\nexport interface MigrationIndexDescription {\n\tname: string;\n\tmultiEntry: boolean;\n\tsynthetic: boolean;\n\tcompound: boolean;\n}\n\nexport interface Migration<\n\tOld extends StorageSchema = any,\n\tNew extends StorageSchema = any,\n> {\n\tversion: number;\n\toldSchema: Old;\n\tnewSchema: New;\n\tmigrate: (engine: MigrationEngine) => Promise<void>;\n\t/** Collections which are added in the new schema and not present in the old */\n\taddedCollections: string[];\n\t/** Collections which were removed from the old schema */\n\tremovedCollections: string[];\n\t/** All collections which exist after the migration has completed - i.e. the ones in the new schema */\n\tallCollections: string[];\n\t/** Only the collections which were in the old schema */\n\toldCollections: string[];\n\t/** Collections whose fields or indexes changed between schemas */\n\tchangedCollections: string[];\n\t// new indexes mapped by collection name\n\taddedIndexes: Record<string, MigrationIndexDescription[]>;\n\t// removed indexes mapped by collection name\n\tremovedIndexes: Record<string, MigrationIndexDescription[]>;\n}\n\nexport function migrationRange(from: number, to: number) {\n\treturn [...Array(to - from).keys()].map((i) => 1 + i + from);\n}\n\nfunction getIndexes<Coll extends StorageCollectionSchema<any, any, any>>(\n\tcollection: Coll | undefined,\n): MigrationIndexDescription[] {\n\tif (!collection) return [];\n\n\treturn [\n\t\t...Object.keys(collection.indexes || {}).map((key) => ({\n\t\t\tname: key,\n\t\t\tmultiEntry: ['array', 'string[]', 'number[]', 'boolean[]'].includes(\n\t\t\t\tcollection.indexes[key].type,\n\t\t\t),\n\t\t\tsynthetic: true,\n\t\t\tcompound: false,\n\t\t})),\n\t\t...Object.keys(collection.compounds || {}).map((key) => ({\n\t\t\tname: key,\n\t\t\tmultiEntry: collection.compounds[key].of.some(\n\t\t\t\t(fieldName: string) =>\n\t\t\t\t\t(collection.fields[fieldName] || collection.indexes[fieldName])\n\t\t\t\t\t\t.type === 'array',\n\t\t\t),\n\t\t\tsynthetic: false,\n\t\t\tcompound: true,\n\t\t})),\n\t];\n}\n\n/** @deprecated - use createMigration with no procedure function */\nexport function createDefaultMigration(\n\tschema: StorageSchema,\n): Migration<{ version: 0; collections: {} }>;\n/** @deprecated - use createMigration with no procedure function */\nexport function createDefaultMigration<Old extends StorageSchema>(\n\toldSchema: Old,\n\tnewSchema: StorageSchema,\n): Migration<Old>;\nexport function createDefaultMigration(\n\tschema: StorageSchema,\n\tnewSchema?: StorageSchema<any>,\n) {\n\tlet oldSchema = newSchema\n\t\t? schema\n\t\t: {\n\t\t\t\tversion: 0,\n\t\t\t\tcollections: {},\n\t\t };\n\treturn migrate(oldSchema, newSchema || schema, async ({ migrate, info }) => {\n\t\tif ((newSchema || schema).version === 1) return;\n\n\t\tfor (const collection of info.changedCollections as any) {\n\t\t\t// @ts-ignore indefinite type resolution\n\t\t\tawait migrate(collection, (old) => old);\n\t\t}\n\t});\n}\n\n/** New, simpler type-safety migration tools */\ntype DocumentShape<Init = any, Snapshot = any> = {\n\tinit: Init;\n\tsnapshot: Snapshot;\n};\ntype SchemaDocuments = Record<string, DocumentShape>;\ntype CollectionProcedure<OldSnapshot, NewInit> = {\n\t(old: OldSnapshot): NewInit | Promise<NewInit>;\n};\ntype MigrationQueries<Old extends SchemaDocuments> = {\n\t[Key in keyof Old]: {\n\t\tget(primaryKey: string): Promise<Old[Key]['snapshot'] | undefined>;\n\t\tfindOne(query: CollectionFilter): Promise<Old[Key]['snapshot'] | undefined>;\n\t\tfindAll(query?: CollectionFilter): Promise<Old[Key]['snapshot'][]>;\n\t};\n};\ntype MigrationMutations<New extends SchemaDocuments> = {\n\t[Key in keyof New]: {\n\t\tput(document: New[Key]['init']): Promise<New[Key]['snapshot']>;\n\t\tdelete(primaryKey: string): Promise<void>;\n\t};\n};\ntype MigrationTools<\n\tOld extends SchemaDocuments,\n\tNew extends SchemaDocuments,\n> = {\n\t/**\n\t * Process a change in a collection's documents by taking in each existing\n\t * document and returning its new shape. This is typed so you can be\n\t * confident the proper transformations are made.\n\t */\n\tmigrate: <Collection extends keyof Old & keyof New>(\n\t\tcollection: Collection,\n\t\tstrategy: CollectionProcedure<\n\t\t\tOld[Collection]['snapshot'],\n\t\t\tNew[Collection]['init']\n\t\t>,\n\t) => Promise<void>;\n\tmutations: MigrationMutations<New>;\n\tqueries: MigrationQueries<Old>;\n\tinfo: {\n\t\tchangedCollections: (keyof Old & keyof New)[];\n\t\taddedCollections: (keyof New)[];\n\t\tremovedCollections: (keyof Old)[];\n\t};\n};\ntype MigrationProcedure<\n\tOld extends SchemaDocuments,\n\tNew extends SchemaDocuments,\n> = {\n\t(tools: MigrationTools<Old, New>): Promise<void>;\n};\ntype InitialMigrationTools<New extends SchemaDocuments> = {\n\tmutations: MigrationMutations<New>;\n};\ntype InitialMigrationProcedure<New extends SchemaDocuments> = {\n\t(tools: InitialMigrationTools<New>): Promise<void>;\n};\n\nexport function createMigration<New extends SchemaDocuments>(\n\tnewSchema: StorageSchema,\n\tprocedure?: InitialMigrationProcedure<New>,\n): any;\nexport function createMigration<\n\tOld extends SchemaDocuments,\n\tNew extends SchemaDocuments,\n>(\n\toldSchema: StorageSchema,\n\tnewSchema: StorageSchema,\n\tprocedure?: MigrationProcedure<Old, New>,\n): any;\nexport function createMigration(\n\tmaybeOldSchema: StorageSchema,\n\tmaybeNewSchemaOrProcedure?:\n\t\t| StorageSchema\n\t\t| InitialMigrationProcedure<SchemaDocuments>,\n\tmaybeProcedure?: MigrationProcedure<SchemaDocuments, SchemaDocuments>,\n): any {\n\tconst isProcedureSecondArgument =\n\t\ttypeof maybeNewSchemaOrProcedure === 'function' ||\n\t\tmaybeNewSchemaOrProcedure === undefined;\n\tconst oldSchema = isProcedureSecondArgument ? emptySchema : maybeOldSchema;\n\tconst newSchema = isProcedureSecondArgument\n\t\t? maybeOldSchema\n\t\t: maybeNewSchemaOrProcedure;\n\tconst procedure = isProcedureSecondArgument\n\t\t? maybeNewSchemaOrProcedure\n\t\t: maybeProcedure;\n\tassert(oldSchema, 'Invalid arguments to createMigration');\n\tassert(newSchema, 'Invalid arguments to createMigration');\n\tconst {\n\t\tchangedCollections,\n\t\taddedCollections,\n\t\tremovedCollections,\n\t\taddedIndexes,\n\t\tremovedIndexes,\n\t\tautoMigratedCollections,\n\t\tautoMigration,\n\t} = getMigrationInfo(oldSchema, newSchema);\n\n\treturn {\n\t\tversion: newSchema.version,\n\t\tmigrate: async (engine: MigrationEngine) => {\n\t\t\tconst migratedCollections: string[] = [];\n\t\t\tconst migrate = async (collection: any, strategy: any) => {\n\t\t\t\tconst auto = autoMigration(collection);\n\t\t\t\tconst wrapped = async (val: any) => {\n\t\t\t\t\tconst baseValue = await strategy(val);\n\t\t\t\t\t// assign OID from original value in case user's strategy\n\t\t\t\t\t// involves cloning\n\t\t\t\t\tassignOid(baseValue, getOid(val));\n\t\t\t\t\tconst result = auto(baseValue);\n\t\t\t\t\treturn result;\n\t\t\t\t};\n\t\t\t\t// @ts-ignore\n\t\t\t\tawait engine.migrate(collection, wrapped);\n\t\t\t\tmigratedCollections.push(collection);\n\t\t\t\t// since the user migrated this one and we wrap their\n\t\t\t\t// strategy with auto-migration, we can remove it from\n\t\t\t\t// the auto-migration list\n\t\t\t\tautoMigratedCollections.delete(collection);\n\t\t\t};\n\t\t\tawait procedure?.({\n\t\t\t\tmigrate,\n\t\t\t\tinfo: {\n\t\t\t\t\tchangedCollections,\n\t\t\t\t\taddedCollections,\n\t\t\t\t\tremovedCollections,\n\t\t\t\t},\n\t\t\t\tqueries: engine.queries,\n\t\t\t\tmutations: engine.mutations,\n\t\t\t});\n\n\t\t\t// mandatory migration of fields which had defaults added or\n\t\t\t// fields removed but weren't migrated by the user\n\n\t\t\tif (newSchema.version > 1) {\n\t\t\t\tengine.log(\n\t\t\t\t\t'debug',\n\t\t\t\t\t'auto-migrating collections with new defaults',\n\t\t\t\t\tautoMigratedCollections,\n\t\t\t\t);\n\t\t\t\tfor (const name of autoMigratedCollections) {\n\t\t\t\t\tawait engine.migrate(name, autoMigration(name));\n\t\t\t\t\tmigratedCollections.push(name);\n\t\t\t\t}\n\n\t\t\t\tconst unmigrated = changedCollections.filter(\n\t\t\t\t\t(collection) => !migratedCollections.includes(collection),\n\t\t\t\t);\n\t\t\t\tif (unmigrated.length > 0) {\n\t\t\t\t\t// TODO: does this deserve a full-on error?\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`Unmigrated changed collections from version ${oldSchema.version} to version ${newSchema.version}:`,\n\t\t\t\t\t\tunmigrated,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tremovedCollections,\n\t\taddedIndexes,\n\t\tremovedIndexes,\n\t\tallCollections: Object.keys(newSchema.collections),\n\t\tchangedCollections,\n\t\taddedCollections,\n\t\toldCollections: Object.keys(oldSchema.collections),\n\t\toldSchema,\n\t\tnewSchema,\n\t};\n}\n\n// common tools\nfunction getMigrationInfo(oldSchema: StorageSchema, newSchema: StorageSchema) {\n\tconst changedCollections: string[] = Object.keys(\n\t\tnewSchema.collections,\n\t).filter(\n\t\t(key) =>\n\t\t\toldSchema.collections[key] &&\n\t\t\tstableStringify(oldSchema.collections[key]) !==\n\t\t\t\tstableStringify(newSchema.collections[key]),\n\t);\n\tconst removedCollections: string[] = Object.keys(\n\t\toldSchema.collections,\n\t).filter((key) => !newSchema.collections[key]);\n\tconst addedCollections = Object.keys(newSchema.collections).filter(\n\t\t(key) => !oldSchema.collections[key],\n\t);\n\t// collections which added one or more field defaults\n\tconst autoMigratedCollections = new Set<string>();\n\tfor (const collection of changedCollections) {\n\t\tconst oldFields = oldSchema.collections[collection].fields;\n\t\tconst newFields = newSchema.collections[collection].fields;\n\t\t// a new default was added - we can auto-migrate it\n\t\tif (\n\t\t\tObject.keys(newFields).some(\n\t\t\t\t(key) => !hasDefault(oldFields[key]) && hasDefault(newFields[key]),\n\t\t\t)\n\t\t) {\n\t\t\tautoMigratedCollections.add(collection);\n\t\t}\n\t\t// a field was removed - we can auto-migrate it\n\t\tif (Object.keys(oldFields).some((key) => !newFields[key])) {\n\t\t\tautoMigratedCollections.add(collection);\n\t\t}\n\t}\n\n\tconst addedIndexes: Record<string, MigrationIndexDescription[]> = {};\n\tconst removedIndexes: Record<string, MigrationIndexDescription[]> = {};\n\tfor (const changed of [...changedCollections, ...addedCollections]) {\n\t\tconst oldIndexes = getIndexes(oldSchema.collections[changed]);\n\t\tconst newIndexes = getIndexes(newSchema.collections[changed]);\n\t\tconst added = newIndexes.filter(\n\t\t\t(index) => !oldIndexes.find((i) => i.name === index.name),\n\t\t);\n\t\tconst removed = oldIndexes.filter(\n\t\t\t(index) => !newIndexes.find((i) => i.name === index.name),\n\t\t);\n\t\tif (added.length > 0) {\n\t\t\taddedIndexes[changed] = added;\n\t\t\t// FIXME: don't o(n^2) this\n\t\t\tif (changedCollections.includes(changed)) {\n\t\t\t\tautoMigratedCollections.add(changed);\n\t\t\t}\n\t\t}\n\t\tif (removed.length > 0) {\n\t\t\tremovedIndexes[changed] = removed;\n\t\t\t// FIXME: don't o(n^2) this\n\t\t\tif (changedCollections.includes(changed)) {\n\t\t\t\tautoMigratedCollections.add(changed);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst withDefaults = (collectionName: string, val: any) => {\n\t\treturn addFieldDefaults(newSchema.collections[collectionName], val);\n\t};\n\tconst autoMigration = (collectionName: string) => (val: any) => {\n\t\tconst collection = newSchema.collections[collectionName];\n\t\treturn addFieldDefaults(collection, removeExtraProperties(collection, val));\n\t};\n\n\treturn {\n\t\tchangedCollections,\n\t\taddedCollections,\n\t\tremovedCollections,\n\t\taddedIndexes,\n\t\tremovedIndexes,\n\t\tautoMigratedCollections,\n\t\twithDefaults,\n\t\tautoMigration,\n\t};\n}\n", "/**\n * High-level patch creation for use with complex nested objects.\n */\n\nimport { createRef, createSubOid, ObjectIdentifier } from './oids.js';\nimport {\n\tdiffToPatches,\n\tinitialToPatches,\n\tObjectRef,\n\tOperation,\n\tPropertyName,\n} from './operation.js';\nimport { isRef } from './refs.js';\nimport { isObject } from './utils.js';\n\nexport class PatchCreator {\n\tconstructor(\n\t\tprivate getNow: () => string,\n\t\tprivate createSubId?: () => string,\n\t) {}\n\n\tcreateDiff = (\n\t\tfrom: any,\n\t\tto: any,\n\t\toptions: { mergeUnknownObjects?: boolean; defaultUndefined?: boolean } = {},\n\t) => {\n\t\treturn diffToPatches(from, to, this.getNow, this.createSubId, [], options);\n\t};\n\n\tcreateInitialize = (obj: any, oid: ObjectIdentifier) => {\n\t\treturn initialToPatches(obj, oid, this.getNow, this.createSubId);\n\t};\n\n\tcreateSet = (\n\t\toid: ObjectIdentifier,\n\t\tkey: PropertyName,\n\t\tvalue: any,\n\t): Operation[] => {\n\t\t// incoming value must be normalized. if it's not a primitive, it and all sub-objects\n\t\t// must be created\n\t\tif (!isObject(value) || isRef(value)) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'set',\n\t\t\t\t\t\tname: key,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\t} else {\n\t\t\tconst itemOid = createSubOid(oid, this.createSubId);\n\t\t\treturn [\n\t\t\t\t// since we're setting a complex nested object, we can initialize it wholesale.\n\t\t\t\t// no diffing to do.\n\t\t\t\t...initialToPatches(value, itemOid, this.getNow),\n\t\t\t\t// then set the reference to the object\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'set',\n\t\t\t\t\t\tvalue: createRef(itemOid),\n\t\t\t\t\t\tname: key,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t};\n\n\tcreateRemove = (oid: ObjectIdentifier, key: PropertyName): Operation[] => {\n\t\treturn [\n\t\t\t{\n\t\t\t\toid,\n\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'remove',\n\t\t\t\t\tname: key,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t};\n\n\tcreateListPush = (oid: ObjectIdentifier, value: any): Operation[] => {\n\t\tif (!isObject(value)) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-push',\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\t} else {\n\t\t\tconst itemOid = createSubOid(oid, this.createSubId);\n\t\t\treturn [\n\t\t\t\t...initialToPatches(value, itemOid, this.getNow),\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-push',\n\t\t\t\t\t\tvalue: createRef(itemOid),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t};\n\n\tcreateListAdd = (oid: ObjectIdentifier, value: any): Operation[] => {\n\t\tif (isObject(value)) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-add',\n\t\t\t\t\t\tvalue: createRef(value),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\t} else {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-add',\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t};\n\n\tcreateListInsert = (\n\t\toid: ObjectIdentifier,\n\t\tindex: number,\n\t\tvalue: any,\n\t): Operation[] => {\n\t\tif (!isObject(value)) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-insert',\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tindex,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\t} else {\n\t\t\tconst itemOid = createSubOid(oid, this.createSubId);\n\t\t\treturn [\n\t\t\t\t...initialToPatches(value, itemOid, this.getNow),\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-insert',\n\t\t\t\t\t\tvalue: createRef(itemOid),\n\t\t\t\t\t\tindex,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t};\n\n\tcreateListRemove = (\n\t\toid: ObjectIdentifier,\n\t\tvalue: any,\n\t\tonly?: 'first' | 'last',\n\t): Operation[] => {\n\t\treturn [\n\t\t\t{\n\t\t\t\toid,\n\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'list-remove',\n\t\t\t\t\tvalue,\n\t\t\t\t\tonly,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t};\n\n\tcreateListDelete = (\n\t\toid: ObjectIdentifier,\n\t\tindex: number,\n\t\tcount: number = 1,\n\t): Operation[] => {\n\t\treturn [\n\t\t\t{\n\t\t\t\toid,\n\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'list-delete',\n\t\t\t\t\tindex,\n\t\t\t\t\tcount,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t};\n\n\tcreateListMoveByRef = (\n\t\toid: ObjectIdentifier,\n\t\tvalue: ObjectRef,\n\t\tindex: number,\n\t): Operation[] => {\n\t\treturn [\n\t\t\t{\n\t\t\t\toid,\n\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'list-move-by-ref',\n\t\t\t\t\tvalue,\n\t\t\t\t\tindex,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t};\n\n\tcreateListMoveByIndex = (\n\t\toid: ObjectIdentifier,\n\t\tfromIndex: number,\n\t\ttoIndex: number,\n\t): Operation[] => {\n\t\treturn [\n\t\t\t{\n\t\t\t\toid,\n\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'list-move-by-index',\n\t\t\t\t\tfrom: fromIndex,\n\t\t\t\t\tto: toIndex,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t};\n\n\tcreateDelete = (oid: ObjectIdentifier): Operation[] => {\n\t\treturn [\n\t\t\t{\n\t\t\t\toid,\n\t\t\t\ttimestamp: this.getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'delete',\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t};\n\n\tcreateDeleteAll = (oids: ObjectIdentifier[]): Operation[] => {\n\t\treturn oids.map((oid) => ({\n\t\t\toid,\n\t\t\ttimestamp: this.getNow(),\n\t\t\tdata: {\n\t\t\t\top: 'delete',\n\t\t\t},\n\t\t}));\n\t};\n}\n", "import { generateId } from './utils.js';\n\nexport class EventSubscriber<\n\tEvents extends { [key: string]: (...args: any[]) => void },\n> {\n\tprotected subscribers: Record<\n\t\tstring,\n\t\tRecord<string, (...args: any[]) => void>\n\t> = {} as any;\n\tprotected counts: Record<string, number> = {} as any;\n\tprivate _disabled = false;\n\n\tconstructor(private _onAllUnsubscribed?: (event: keyof Events) => void) {}\n\n\tget disabled() {\n\t\treturn this._disabled;\n\t}\n\n\tsubscriberCount = (event: Extract<keyof Events, string>) => {\n\t\treturn this.counts[event] ?? 0;\n\t};\n\n\ttotalSubscriberCount = () => {\n\t\treturn Object.values(this.counts).reduce((acc, count) => acc + count, 0);\n\t};\n\n\tsubscribe = <K extends Extract<keyof Events, string>>(\n\t\tevent: K,\n\t\tcallback: Events[K],\n\t) => {\n\t\tconst key = generateId();\n\t\tlet subscribers = this.subscribers[event];\n\t\tif (!subscribers) {\n\t\t\tsubscribers = this.subscribers[event] = {};\n\t\t}\n\t\tsubscribers[key] = callback;\n\t\tthis.counts[event] = (this.counts[event] || 0) + 1;\n\t\treturn () => {\n\t\t\t// already removed\n\t\t\tif (!this.subscribers[event]) return;\n\n\t\t\tdelete this.subscribers[event][key];\n\t\t\tthis.counts[event]--;\n\t\t\tif (this.counts[event] === 0) {\n\t\t\t\tdelete this.subscribers[event];\n\t\t\t\tdelete this.counts[event];\n\t\t\t\tif (this._onAllUnsubscribed) {\n\t\t\t\t\tthis._onAllUnsubscribed(event);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t};\n\n\temit = <K extends Extract<keyof Events, string>>(\n\t\tevent: K,\n\t\t...args: Parameters<Events[K]>\n\t) => {\n\t\tif (this._disabled) return;\n\t\tif (this.subscribers[event]) {\n\t\t\tObject.values(this.subscribers[event]).forEach((c) => c(...args));\n\t\t}\n\t};\n\n\tdispose = () => {\n\t\tconst events = Object.keys(this.subscribers);\n\t\tthis.subscribers = {} as any;\n\t\tthis.counts = {} as any;\n\t\tevents.forEach((event) => {\n\t\t\tif (this._onAllUnsubscribed) {\n\t\t\t\tthis._onAllUnsubscribed(event);\n\t\t\t}\n\t\t});\n\t};\n\n\tdisable = () => {\n\t\tthis._disabled = true;\n\t};\n}\n\nexport type EventsOf<T extends EventSubscriber<any>> =\n\tT extends EventSubscriber<infer E> ? keyof E : never;\n", "import { ObjectIdentifier } from './oids.js';\nimport { applyPatch, Operation } from './operation.js';\nimport { cloneDeep } from './utils.js';\n\nexport function getUndoOperations(\n\toid: ObjectIdentifier,\n\tinitial: any,\n\toperations: Operation[],\n\tgetNow: () => string,\n): Operation[] {\n\tif (initial === undefined) {\n\t\t// if the initial state is nothing, then the undo is to delete everything.\n\t\t// there's nothing else to worry about!\n\t\treturn [\n\t\t\t{\n\t\t\t\toid,\n\t\t\t\ttimestamp: getNow(),\n\t\t\t\tdata: {\n\t\t\t\t\top: 'delete',\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t}\n\t// otherwise, traverse the operations one by one,\n\t// applying them, and using the prior state to determine\n\t// what the undo operation is.\n\tlet state = cloneDeep(initial);\n\tconst undoOperations: Operation[] = [];\n\tfor (const operation of operations) {\n\t\tconst undo = getUndoOperation(oid, state, operation, getNow);\n\t\tundoOperations.unshift(...undo);\n\t\tapplyPatch(state, operation.data);\n\t}\n\treturn undoOperations;\n}\n\nfunction getUndoOperation(\n\toid: ObjectIdentifier,\n\tinitial: any,\n\toperation: Operation,\n\tgetNow: () => string,\n): Operation[] {\n\tconst data = operation.data;\n\tswitch (data.op) {\n\t\tcase 'set':\n\t\tcase 'remove':\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'set',\n\t\t\t\t\t\tname: data.name,\n\t\t\t\t\t\tvalue: initial[data.name],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tcase 'list-insert':\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-delete',\n\t\t\t\t\t\tindex: data.index,\n\t\t\t\t\t\tcount: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tcase 'list-delete':\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-insert',\n\t\t\t\t\t\tindex: data.index,\n\t\t\t\t\t\tvalues: initial.slice(data.index, data.count),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tcase 'list-move-by-ref':\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-move-by-ref',\n\t\t\t\t\t\tvalue: data.value,\n\t\t\t\t\t\tindex: initial.indexOf(data.value),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tcase 'list-move-by-index':\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-move-by-index',\n\t\t\t\t\t\tfrom: data.to,\n\t\t\t\t\t\tto: data.from,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tcase 'delete':\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'initialize',\n\t\t\t\t\t\tvalue: initial,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tcase 'list-push':\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-remove',\n\t\t\t\t\t\tvalue: data.value,\n\t\t\t\t\t\t// best heuristic here - remove the last instance of the item.\n\t\t\t\t\t\tonly: 'last',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tcase 'list-remove':\n\t\t\tif (data.only === 'last') {\n\t\t\t\tconst index = initial.lastIndexOf(data.value);\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\toid,\n\t\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\top: 'list-insert',\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tvalues: [data.value],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t} else if (data.only === 'first') {\n\t\t\t\tconst index = initial.indexOf(data.value);\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\toid,\n\t\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\top: 'list-insert',\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tvalues: [data.value],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t} else {\n\t\t\t\t// find all instances of value and restore them at their\n\t\t\t\t// original index\n\t\t\t\tconst indexesOfValue = [];\n\t\t\t\tlet index = initial.indexOf(data.value);\n\t\t\t\twhile (index !== -1) {\n\t\t\t\t\tindexesOfValue.push(index);\n\t\t\t\t\tindex = initial.indexOf(data.value, index + 1);\n\t\t\t\t}\n\t\t\t\treturn indexesOfValue.map((index) => ({\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-insert',\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\tvalue: data.value,\n\t\t\t\t\t},\n\t\t\t\t}));\n\t\t\t}\n\t\tcase 'list-add':\n\t\t\t// this one is kind of ambiguous. in theory the set may have\n\t\t\t// already included the value and so no change happened. but\n\t\t\t// basically we infer the intent is to remove what was meant\n\t\t\t// to be added by this change.\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'list-remove',\n\t\t\t\t\t\tvalue: data.value,\n\t\t\t\t\t\tonly: 'last',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tcase 'initialize':\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\toid,\n\t\t\t\t\ttimestamp: getNow(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\top: 'delete',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\tdefault:\n\t\t\tthrow new Error(`Cannot undo operation type: ${(data as any).op}`);\n\t}\n}\n", "export class Batcher<T, UserData = any> {\n\tprivate batches: Map<string, Batch<T, UserData>> = new Map();\n\n\tconstructor(\n\t\tprivate flusher: (items: T[], batchKey: string, userData: UserData) => any,\n\t) {}\n\n\tadd({\n\t\tkey,\n\t\tuserData,\n\t\titems,\n\t\tmax,\n\t\ttimeout,\n\t}: {\n\t\tkey: string;\n\t\tuserData?: UserData;\n\t\titems: T[];\n\t\tmax?: number | null;\n\t\ttimeout?: number | null;\n\t}) {\n\t\tlet batch = this.batches.get(key);\n\t\tif (!batch) {\n\t\t\tbatch = new Batch({\n\t\t\t\tmax: max || null,\n\t\t\t\tstartedAt: Date.now(),\n\t\t\t\tuserData,\n\t\t\t\ttimeout: timeout || null,\n\t\t\t\tflusher: this.flusher,\n\t\t\t\tkey,\n\t\t\t});\n\t\t\tthis.batches.set(key, batch);\n\t\t}\n\t\tbatch.update({\n\t\t\titems,\n\t\t\tmax,\n\t\t\ttimeout,\n\t\t\tuserData,\n\t\t});\n\n\t\treturn batch;\n\t}\n\n\tflush = (key: string) => {\n\t\tconst batch = this.batches.get(key);\n\t\tif (!batch) return;\n\n\t\treturn batch.flush();\n\t};\n\n\tdiscard = (key: string) => {\n\t\tconst batch = this.batches.get(key);\n\t\tif (!batch) return;\n\n\t\tbatch.discard();\n\t\tthis.batches.delete(key);\n\t};\n\n\tflushAll = () => {\n\t\treturn [...this.batches.values()].map((batch) => batch.flush());\n\t};\n}\n\nexport class Batch<T, UserData = any> {\n\titems: Array<T> = [];\n\tmax: number | null;\n\tstartedAt: number;\n\ttimeout: number | null;\n\tflushTimeout?: NodeJS.Timeout;\n\tuserData?: any;\n\tflusher: (items: T[], batchKey: string, userData: UserData) => any;\n\tkey: string;\n\n\tconstructor({\n\t\tmax,\n\t\tstartedAt,\n\t\ttimeout,\n\t\tuserData,\n\t\tflusher,\n\t\tkey,\n\t}: {\n\t\tkey: string;\n\t\tmax: number | null;\n\t\tstartedAt: number;\n\t\ttimeout: number | null;\n\t\tuserData?: UserData;\n\t\tflusher: (items: T[], batchKey: string, userData: UserData) => any;\n\t}) {\n\t\tthis.max = max;\n\t\tthis.startedAt = startedAt;\n\t\tthis.timeout = timeout;\n\t\tthis.userData = userData;\n\t\tthis.flusher = flusher;\n\t\tthis.key = key;\n\t}\n\n\tupdate = ({\n\t\titems,\n\t\tmax,\n\t\ttimeout,\n\t\tuserData,\n\t}: {\n\t\titems: Array<T>;\n\t\tmax?: number | null;\n\t\ttimeout?: number | null;\n\t\tuserData?: UserData;\n\t}) => {\n\t\tthis.items.push(...items);\n\t\tif (max !== undefined) this.max = max;\n\t\tif (timeout !== undefined) this.timeout = timeout;\n\t\tif (userData) this.userData = userData;\n\n\t\t// if the batch has items and a timeout but has not\n\t\t// scheduled yet, schedule it\n\t\tconst needsSchedule =\n\t\t\tthis.items.length !== 0 && this.timeout !== null && !this.flushTimeout;\n\n\t\t// if the batch has already reached its max, skip scheduling\n\t\t// and flush immediately\n\t\tif (this.max !== null && this.items.length >= this.max) {\n\t\t\tthis.flush();\n\t\t} else if (needsSchedule && this.timeout !== null) {\n\t\t\tthis.flushTimeout = setTimeout(this.flush, this.timeout);\n\t\t}\n\t};\n\n\tflush = () => {\n\t\tthis.flushTimeout && clearTimeout(this.flushTimeout);\n\t\tthis.flushTimeout = undefined;\n\t\tconst items = this.items;\n\t\tthis.items = [];\n\t\treturn this.flusher(items, this.key, this.userData);\n\t};\n\n\tdiscard = () => {\n\t\tthis.flushTimeout && clearTimeout(this.flushTimeout);\n\t\tthis.flushTimeout = undefined;\n\t\tthis.items = [];\n\t};\n}\n", "import { roughSizeOfObject } from '@verdant-web/common';\n\nexport function storeRequestPromise<T>(request: IDBRequest<T>) {\n\treturn new Promise<T>((resolve, reject) => {\n\t\trequest.onsuccess = () => {\n\t\t\tresolve(request.result);\n\t\t};\n\t\trequest.onerror = () => {\n\t\t\treject(request.error);\n\t\t};\n\t});\n}\n\nexport function cursorIterator<T>(\n\trequest: IDBRequest<IDBCursorWithValue | null>,\n\tcallback: (value: T | null) => boolean,\n) {\n\treturn new Promise<void>((resolve, reject) => {\n\t\trequest.onsuccess = () => {\n\t\t\tconst cursor = request.result;\n\t\t\tif (cursor) {\n\t\t\t\tif (callback(cursor.value)) {\n\t\t\t\t\tcursor.continue();\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresolve();\n\t\t\t}\n\t\t};\n\t\trequest.onerror = () => {\n\t\t\treject(request.error);\n\t\t};\n\t});\n}\n\nexport function getSizeOfObjectStore(\n\tdatabase: IDBDatabase,\n\tstoreName: string,\n): Promise<{ count: number; size: number }> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst tx = database.transaction([storeName], 'readonly');\n\t\tconst store = tx.objectStore(storeName);\n\t\tconst cursorReq = store.openCursor();\n\t\tlet count = 0;\n\t\tlet size = 0;\n\t\tcursorReq.onsuccess = function (e) {\n\t\t\tconst cursor = cursorReq.result;\n\t\t\tif (cursor) {\n\t\t\t\tcount++;\n\t\t\t\tsize = size + roughSizeOfObject(cursor.value);\n\t\t\t\tcursor.continue();\n\t\t\t}\n\t\t};\n\t\tcursorReq.onerror = function (e) {\n\t\t\treject(e);\n\t\t};\n\t\ttx.oncomplete = function (e) {\n\t\t\tresolve({\n\t\t\t\tcount: count,\n\t\t\t\tsize: size,\n\t\t\t});\n\t\t};\n\t\ttx.onabort = function (e) {\n\t\t\treject(e);\n\t\t};\n\t\ttx.onerror = function (e) {\n\t\t\treject(e);\n\t\t};\n\t});\n}\n\nexport function getAllFromObjectStores(db: IDBDatabase, stores: string[]) {\n\tconst transaction = db.transaction(stores, 'readonly');\n\tconst promises = stores.map((store) => {\n\t\tconst objectStore = transaction.objectStore(store);\n\t\treturn storeRequestPromise(objectStore.getAll());\n\t});\n\treturn Promise.all(promises);\n}\n\nexport async function closeDatabase(db: IDBDatabase) {\n\tdb.close();\n\t// wait for microtask queue to clear\n\tawait new Promise<void>((resolve, reject) => {\n\t\tresolve();\n\t});\n}\n\nexport async function deleteAllDatabases(\n\tnamespace: string,\n\tindexedDB: IDBFactory = window.indexedDB,\n) {\n\tconst req1 = indexedDB.deleteDatabase([namespace, 'meta'].join('_'));\n\tconst req2 = indexedDB.deleteDatabase([namespace, 'collections'].join('_'));\n\tawait Promise.all([\n\t\tnew Promise((resolve, reject) => {\n\t\t\treq1.onsuccess = resolve;\n\t\t\treq1.onerror = reject;\n\t\t}),\n\t\tnew Promise((resolve, reject) => {\n\t\t\treq2.onsuccess = resolve;\n\t\t\treq2.onerror = reject;\n\t\t}),\n\t]);\n\twindow.location.reload();\n}\n\nexport function deleteDatabase(name: string, indexedDB = window.indexedDB) {\n\treturn storeRequestPromise(indexedDB.deleteDatabase(name));\n}\n\nexport async function getAllDatabaseNamesAndVersions(\n\tindexedDB: IDBFactory = window.indexedDB,\n) {\n\treturn indexedDB.databases();\n}\n", "import { storeRequestPromise } from './idb.js';\n\nexport class IDBService {\n\tconstructor(protected readonly db: IDBDatabase) {}\n\n\tcreateTransaction = (\n\t\tstoreNames: string[],\n\t\tmode: 'readonly' | 'readwrite',\n\t) => {\n\t\treturn this.db.transaction(storeNames, mode);\n\t};\n\n\trun = async <T>(\n\t\tstoreName: string,\n\t\tgetRequest: (store: IDBObjectStore) => IDBRequest<T>,\n\t\tmode: 'readonly' | 'readwrite' = 'readonly',\n\t\ttransaction?: IDBTransaction,\n\t): Promise<T> => {\n\t\tconst tx = transaction || this.db.transaction(storeName, mode);\n\t\tconst store = tx.objectStore(storeName);\n\t\tconst request = getRequest(store);\n\t\treturn storeRequestPromise<T>(request);\n\t};\n\n\trunAll = async <T>(\n\t\tstoreName: string,\n\t\tgetRequests: (store: IDBObjectStore) => IDBRequest<T>[],\n\t\tmode: 'readonly' | 'readwrite' = 'readonly',\n\t\ttransaction?: IDBTransaction,\n\t): Promise<T[]> => {\n\t\tconst tx = transaction || this.db.transaction(storeName, mode);\n\t\tconst store = tx.objectStore(storeName);\n\t\tconst requests = getRequests(store);\n\t\treturn Promise.all(requests.map(storeRequestPromise));\n\t};\n\n\titerate = async <T>(\n\t\tstoreName: string,\n\t\tgetRequest: (store: IDBObjectStore) => IDBRequest | IDBRequest[],\n\t\titerator: (value: T, store: IDBObjectStore) => void,\n\t\tmode: 'readonly' | 'readwrite' = 'readonly',\n\t\ttransaction?: IDBTransaction,\n\t): Promise<void> => {\n\t\tconst tx = transaction || this.db.transaction(storeName, mode);\n\t\tconst store = tx.objectStore(storeName);\n\t\tconst request = getRequest(store);\n\t\tif (Array.isArray(request)) {\n\t\t\treturn Promise.all(\n\t\t\t\trequest.map((req) => {\n\t\t\t\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\t\t\t\treq.onsuccess = () => {\n\t\t\t\t\t\t\tconst cursor = req.result;\n\t\t\t\t\t\t\tif (cursor) {\n\t\t\t\t\t\t\t\titerator(cursor.value, store);\n\t\t\t\t\t\t\t\tcursor.continue();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t\treq.onerror = reject;\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t).then(() => undefined);\n\t\t}\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\trequest.onsuccess = () => {\n\t\t\t\tconst cursor = request.result;\n\t\t\t\tif (cursor) {\n\t\t\t\t\titerator(cursor.value, store);\n\t\t\t\t\tcursor.continue();\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t};\n\t\t\trequest.onerror = reject;\n\t\t});\n\t};\n\n\tclear = (storeName: string) => {\n\t\treturn this.run(storeName, (store) => store.clear(), 'readwrite');\n\t};\n}\n", "import { IDBService } from '../IDBService.js';\n\ntype AckInfo = {\n\ttype: 'ack';\n\t// null means no operations are acknowledged\n\t// by every peer yet.\n\tglobalAckTimestamp: string | null;\n};\n\nexport class AckInfoStore extends IDBService {\n\tgetAckInfo = async (): Promise<AckInfo> => {\n\t\tconst result = await this.run<AckInfo>('info', (store) => store.get('ack'));\n\t\tif (result) {\n\t\t\treturn result;\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tglobalAckTimestamp: null,\n\t\t\t\ttype: 'ack',\n\t\t\t};\n\t\t}\n\t};\n\n\tsetGlobalAck = async (ack: string) => {\n\t\tawait this.run(\n\t\t\t'info',\n\t\t\t(store) => store.put({ type: 'ack', globalAckTimestamp: ack }),\n\t\t\t'readwrite',\n\t\t);\n\t};\n}\n", "import {\n\tDocumentBaseline,\n\tgetOidSubIdRange,\n\tgetOidRoot,\n\tObjectIdentifier,\n\tisLegacyDotOid,\n\tgetLegacyDotOidSubIdRange,\n} from '@verdant-web/common';\nimport { IDBService } from '../IDBService.js';\n\nexport class BaselinesStore extends IDBService {\n\tconstructor(db: IDBDatabase) {\n\t\tsuper(db);\n\t}\n\n\tgetAllForDocument = async (\n\t\toid: ObjectIdentifier,\n\t\t{\n\t\t\tmode = 'readonly',\n\t\t\ttransaction,\n\t\t}: { mode?: 'readwrite' | 'readonly'; transaction?: IDBTransaction } = {},\n\t) => {\n\t\tconst baselines: DocumentBaseline[] = [];\n\t\tawait this.iterateOverAllForDocument(\n\t\t\toid,\n\t\t\t(baseline) => {\n\t\t\t\tbaselines.push(baseline);\n\t\t\t},\n\t\t\t{ mode, transaction },\n\t\t);\n\t\treturn baselines;\n\t};\n\titerateOverAllForDocument = async (\n\t\toid: ObjectIdentifier,\n\t\titerator: (baseline: DocumentBaseline, store: IDBObjectStore) => void,\n\t\t{\n\t\t\tmode = 'readonly',\n\t\t\ttransaction,\n\t\t}: { mode?: 'readwrite' | 'readonly'; transaction?: IDBTransaction } = {},\n\t) => {\n\t\treturn this.iterate(\n\t\t\t'baselines',\n\t\t\t(store) => {\n\t\t\t\tconst root = getOidRoot(oid);\n\t\t\t\tconst [start, end] = getOidSubIdRange(oid);\n\t\t\t\t// FIXME: get rid of legacy dot OIDs...\n\t\t\t\tif (isLegacyDotOid(oid)) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\t// first the root itself\n\t\t\t\t\t\tstore.openCursor(IDBKeyRange.only(root)),\n\t\t\t\t\t\t// then the range of its possible subdocuments\n\t\t\t\t\t\tstore.openCursor(IDBKeyRange.bound(start, end, false, false)),\n\t\t\t\t\t\t// then the range of its possible subdocuments\n\t\t\t\t\t\tstore.openCursor(IDBKeyRange.bound(start, end, false, false)),\n\t\t\t\t\t];\n\t\t\t\t} else {\n\t\t\t\t\treturn [\n\t\t\t\t\t\t// first the root itself\n\t\t\t\t\t\tstore.openCursor(IDBKeyRange.only(root)),\n\t\t\t\t\t\t// then the range of its possible subdocuments\n\t\t\t\t\t\tstore.openCursor(IDBKeyRange.bound(start, end, false, false)),\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t},\n\t\t\titerator,\n\t\t\tmode,\n\t\t\ttransaction,\n\t\t);\n\t};\n\n\tgetAllForMultipleDocuments = async (\n\t\tdocOids: string[],\n\t\t{ mode = 'readonly' }: { mode?: 'readwrite' | 'readonly' } = {},\n\t) => {\n\t\tconst result = await this.runAll<DocumentBaseline[]>(\n\t\t\t'baselines',\n\t\t\t(store) => {\n\t\t\t\treturn docOids.flatMap((oid) => {\n\t\t\t\t\tconst root = getOidRoot(oid);\n\t\t\t\t\tconst [start, end] = getOidSubIdRange(oid);\n\t\t\t\t\t// FIXME: get rid of legacy dot OIDs...\n\t\t\t\t\tif (isLegacyDotOid(oid)) {\n\t\t\t\t\t\tconst [dotStart, dotEnd] = getLegacyDotOidSubIdRange(oid);\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tstore.get(root),\n\t\t\t\t\t\t\tstore.getAll(IDBKeyRange.bound(start, end, false, false)),\n\t\t\t\t\t\t\tstore.getAll(IDBKeyRange.bound(dotStart, dotEnd, false, false)),\n\t\t\t\t\t\t]\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tstore.get(root),\n\t\t\t\t\t\t\tstore.getAll(IDBKeyRange.bound(start, end, false, false)),\n\t\t\t\t\t\t];\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t\tmode,\n\t\t);\n\t\treturn result.flat();\n\t};\n\n\tgetAllSince = async (\n\t\ttimestamp: string | null,\n\t\t{ mode = 'readonly' }: { mode?: 'readwrite' | 'readonly' } = {},\n\t) => {\n\t\treturn this.run<DocumentBaseline[]>(\n\t\t\t'baselines',\n\t\t\t(store) => {\n\t\t\t\tconst range = timestamp\n\t\t\t\t\t? IDBKeyRange.lowerBound(timestamp, true)\n\t\t\t\t\t: undefined;\n\t\t\t\tconst index = store.index('timestamp');\n\t\t\t\treturn index.getAll(range);\n\t\t\t},\n\t\t\tmode,\n\t\t);\n\t};\n\n\tget = async (\n\t\toid: ObjectIdentifier,\n\t\t{\n\t\t\ttransaction,\n\t\t\tmode = 'readonly',\n\t\t}: { transaction?: IDBTransaction; mode?: 'readwrite' | 'readonly' } = {},\n\t) => {\n\t\treturn this.run<DocumentBaseline>(\n\t\t\t'baselines',\n\t\t\t(store) => store.get(oid),\n\t\t\tmode,\n\t\t\ttransaction,\n\t\t);\n\t};\n\n\tset = async <T>(\n\t\tbaseline: DocumentBaseline<T>,\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t) => {\n\t\tawait this.run(\n\t\t\t'baselines',\n\t\t\t(store) => store.put(baseline),\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t};\n\n\tsetAll = async <T>(\n\t\tbaselines: DocumentBaseline<T>[],\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t) => {\n\t\tawait this.runAll(\n\t\t\t'baselines',\n\t\t\t(store) => {\n\t\t\t\treturn baselines.map((baseline) => store.put(baseline));\n\t\t\t},\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t};\n\n\treset = () => {\n\t\treturn this.clear('baselines');\n\t};\n\n\tdelete = async (\n\t\toid: ObjectIdentifier,\n\t\t{ transaction }: { transaction?: IDBTransaction },\n\t) => {\n\t\tawait this.run(\n\t\t\t'baselines',\n\t\t\t(store) => store.delete(oid),\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t};\n}\n", "import cuid from 'cuid';\nimport { IDBService } from '../IDBService.js';\n\nexport type LocalReplicaInfo = {\n\ttype: 'localReplicaInfo';\n\tid: string;\n\tackedLogicalTime: string | null;\n\tlastSyncedLogicalTime: string | null;\n};\n\nexport class LocalReplicaStore extends IDBService {\n\tprivate cached: LocalReplicaInfo | undefined;\n\n\tget = async ({ transaction }: { transaction?: IDBTransaction } = {}) => {\n\t\tif (this.cached) {\n\t\t\treturn this.cached;\n\t\t}\n\n\t\tconst lookup = await this.run<LocalReplicaInfo>(\n\t\t\t'info',\n\t\t\t(store) => store.get('localReplicaInfo'),\n\t\t\tundefined,\n\t\t\ttransaction,\n\t\t);\n\n\t\tif (!lookup) {\n\t\t\t// create our own replica info now\n\t\t\tconst replicaId = cuid();\n\t\t\tconst replicaInfo: LocalReplicaInfo = {\n\t\t\t\ttype: 'localReplicaInfo',\n\t\t\t\tid: replicaId,\n\t\t\t\tackedLogicalTime: null,\n\t\t\t\tlastSyncedLogicalTime: null,\n\t\t\t};\n\t\t\tawait this.run('info', (store) => store.put(replicaInfo), 'readwrite');\n\t\t\tthis.cached = replicaInfo;\n\t\t\treturn replicaInfo;\n\t\t}\n\n\t\tthis.cached = lookup;\n\t\treturn lookup;\n\t};\n\n\tupdate = async (\n\t\tdata: Partial<LocalReplicaInfo>,\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t) => {\n\t\tconst localReplicaInfo = await this.get({ transaction });\n\t\tObject.assign(localReplicaInfo, data);\n\t\tawait this.run('info', (store) => store.put(localReplicaInfo), 'readwrite');\n\t\tthis.cached = localReplicaInfo;\n\t};\n\n\treset = async () => {\n\t\tconst localInfo = await this.get();\n\t\tlocalInfo.ackedLogicalTime = null;\n\t\tlocalInfo.lastSyncedLogicalTime = null;\n\t\tawait this.run('info', (store) => store.put(localInfo), 'readwrite');\n\t};\n}\n", "import {\n\tAckMessage,\n\tDocumentBaseline,\n\tgetOidRoot,\n\tHeartbeatMessage,\n\tObjectIdentifier,\n\tOperation,\n\tOperationMessage,\n\tPresenceUpdateMessage,\n\tSyncAckMessage,\n\tSyncMessage,\n} from '@verdant-web/common';\n\nimport { Metadata } from './Metadata.js';\n\nexport class MessageCreator {\n\tconstructor(private meta: Metadata) {}\n\n\tcreateOperation = async (\n\t\tinit: Pick<OperationMessage, 'operations'> & {\n\t\t\ttimestamp?: string;\n\t\t},\n\t): Promise<OperationMessage> => {\n\t\tconst localInfo = await this.meta.localReplica.get();\n\t\treturn {\n\t\t\ttype: 'op',\n\t\t\ttimestamp: this.meta.now,\n\t\t\treplicaId: localInfo.id,\n\t\t\toperations: init.operations.map((op) => ({\n\t\t\t\tdata: op.data,\n\t\t\t\toid: op.oid,\n\t\t\t\ttimestamp: op.timestamp,\n\t\t\t})),\n\t\t};\n\t};\n\n\tcreateMigrationOperation = async ({\n\t\ttargetVersion,\n\t\t...init\n\t}: Pick<OperationMessage, 'operations'> & {\n\t\ttargetVersion: number;\n\t}): Promise<OperationMessage> => {\n\t\tconst localInfo = await this.meta.localReplica.get();\n\t\treturn {\n\t\t\ttype: 'op',\n\t\t\toperations: init.operations.map((op) => ({\n\t\t\t\t...op,\n\t\t\t\ttimestamp: this.meta.time.zero(targetVersion),\n\t\t\t})),\n\t\t\ttimestamp: this.meta.time.zero(targetVersion),\n\t\t\treplicaId: localInfo.id,\n\t\t};\n\t};\n\n\t/**\n\t * @param since - override local understanding of last sync time\n\t */\n\tcreateSyncStep1 = async (since?: string | null): Promise<SyncMessage> => {\n\t\tconst localReplicaInfo = await this.meta.localReplica.get();\n\n\t\tconst provideChangesSince =\n\t\t\tsince === null ? null : localReplicaInfo.lastSyncedLogicalTime;\n\n\t\t// collect all of our operations that are newer than the server's last operation\n\t\t// if server replica isn't stored, we're syncing for the first time.\n\t\tconst operations: Operation[] = [];\n\t\tconst affectedDocs = new Set<ObjectIdentifier>();\n\n\t\t// FIXME: this branch gives bad vibes. should we always\n\t\t// send all operations from other replicas too? is there\n\t\t// ever a case where we have a \"since\" timestamp and there\n\t\t// are foreign ops that match it?\n\t\tif (provideChangesSince) {\n\t\t\tawait this.meta.operations.iterateOverAllLocalOperations(\n\t\t\t\t(patch) => {\n\t\t\t\t\toperations.push({\n\t\t\t\t\t\tdata: patch.data,\n\t\t\t\t\t\toid: patch.oid,\n\t\t\t\t\t\ttimestamp: patch.timestamp,\n\t\t\t\t\t});\n\t\t\t\t\taffectedDocs.add(getOidRoot(patch.oid));\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tafter: provideChangesSince,\n\t\t\t\t\t// block on writes to prevent race conditions\n\t\t\t\t\tmode: 'readwrite',\n\t\t\t\t},\n\t\t\t);\n\t\t} else {\n\t\t\t// if providing the whole history, don't limit to only local\n\t\t\t// operations\n\t\t\tawait this.meta.operations.iterateOverAllOperations(\n\t\t\t\t(patch) => {\n\t\t\t\t\toperations.push({\n\t\t\t\t\t\tdata: patch.data,\n\t\t\t\t\t\toid: patch.oid,\n\t\t\t\t\t\ttimestamp: patch.timestamp,\n\t\t\t\t\t});\n\t\t\t\t\taffectedDocs.add(getOidRoot(patch.oid));\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmode: 'readwrite',\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\t// we only need to send baselines if we've never synced before\n\t\tlet baselines: DocumentBaseline[] = [];\n\t\tif (!provideChangesSince) {\n\t\t\tbaselines = await this.meta.baselines.getAllSince('');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: 'sync',\n\t\t\tschemaVersion: this.meta.schema.currentVersion,\n\t\t\ttimestamp: this.meta.now,\n\t\t\treplicaId: localReplicaInfo.id,\n\t\t\tresyncAll: !localReplicaInfo.lastSyncedLogicalTime,\n\t\t\toperations,\n\t\t\tbaselines,\n\t\t\tsince: provideChangesSince,\n\t\t};\n\t};\n\n\tcreatePresenceUpdate = async (\n\t\tpresence: any,\n\t): Promise<PresenceUpdateMessage> => {\n\t\tconst localReplicaInfo = await this.meta.localReplica.get();\n\t\treturn {\n\t\t\ttype: 'presence-update',\n\t\t\tpresence,\n\t\t\treplicaId: localReplicaInfo.id,\n\t\t};\n\t};\n\n\tcreateHeartbeat = async (): Promise<HeartbeatMessage> => {\n\t\tconst localReplicaInfo = await this.meta.localReplica.get();\n\t\treturn {\n\t\t\ttype: 'heartbeat',\n\t\t\ttimestamp: this.meta.now,\n\t\t\treplicaId: localReplicaInfo.id,\n\t\t};\n\t};\n\n\tcreateAck = async (nonce: string): Promise<AckMessage> => {\n\t\tconst localReplicaInfo = await this.meta.localReplica.get();\n\t\treturn {\n\t\t\ttype: 'ack',\n\t\t\ttimestamp: this.meta.now,\n\t\t\treplicaId: localReplicaInfo.id,\n\t\t\tnonce,\n\t\t};\n\t};\n}\n", "import {\n\tcreateCompoundIndexValue,\n\tcreateLowerBoundIndexValue,\n\tcreateUpperBoundIndexValue,\n\tgetOidRoot,\n\tObjectIdentifier,\n\tOperation,\n\tassert,\n} from '@verdant-web/common';\nimport { IDBService } from '../IDBService.js';\n\nexport type ClientOperation = Operation & {\n\tisLocal: boolean;\n};\n\nexport type StoredClientOperation = ClientOperation & {\n\toid_timestamp: string;\n\tl_t: string;\n\td_t: string;\n};\n\nexport class OperationsStore extends IDBService {\n\t/**\n\t * Iterates over every patch for the root and every sub-object\n\t * of a given document. Optionally limit by timestamp.\n\t */\n\titerateOverAllOperationsForDocument = async (\n\t\toid: ObjectIdentifier,\n\t\titerator: (patch: StoredClientOperation, store: IDBObjectStore) => void,\n\t\t{\n\t\t\tto,\n\t\t\tfrom,\n\t\t\tafter,\n\t\t\tmode = 'readonly',\n\t\t\ttransaction: providedTx,\n\t\t}: {\n\t\t\tto?: string;\n\t\t\tfrom?: string;\n\t\t\tafter?: string;\n\t\t\tmode?: 'readwrite' | 'readonly';\n\t\t\ttransaction?: IDBTransaction;\n\t\t} = {},\n\t): Promise<void> => {\n\t\tconst transaction = providedTx || this.db.transaction('operations', mode);\n\t\tconst store = transaction.objectStore('operations');\n\t\tconst index = store.index('d_t');\n\n\t\tconst startTimestamp = from || after;\n\t\tconst start = startTimestamp\n\t\t\t? createCompoundIndexValue(oid, startTimestamp)\n\t\t\t: createLowerBoundIndexValue(oid);\n\t\tconst end = to\n\t\t\t? createCompoundIndexValue(oid, to)\n\t\t\t: createUpperBoundIndexValue(oid);\n\n\t\tconst range = IDBKeyRange.bound(start, end, !!after, false);\n\n\t\tconst request = index.openCursor(range, 'next');\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tlet previousTimestamp: string | undefined;\n\t\t\trequest.onsuccess = (event) => {\n\t\t\t\tconst cursor = request.result;\n\t\t\t\tif (cursor) {\n\t\t\t\t\tconst value = cursor.value as StoredClientOperation;\n\t\t\t\t\tassert(value.oid.startsWith(oid));\n\t\t\t\t\tassert(\n\t\t\t\t\t\tpreviousTimestamp === undefined ||\n\t\t\t\t\t\t\tpreviousTimestamp <= value.timestamp,\n\t\t\t\t\t\t`expected ${previousTimestamp} <= ${value.timestamp}`,\n\t\t\t\t\t);\n\n\t\t\t\t\titerator(value, store);\n\t\t\t\t\tpreviousTimestamp = value.timestamp;\n\t\t\t\t\tcursor.continue();\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t};\n\t\t\trequest.onerror = (event) => {\n\t\t\t\treject(event);\n\t\t\t};\n\t\t});\n\t};\n\n\titerateOverAllOperationsForEntity = async (\n\t\toid: ObjectIdentifier,\n\t\titerator: (patch: StoredClientOperation, store: IDBObjectStore) => void,\n\t\t{\n\t\t\tafter,\n\t\t\tto,\n\t\t\tmode,\n\t\t\ttransaction: providedTx,\n\t\t}: {\n\t\t\tafter?: string;\n\t\t\tto?: string;\n\t\t\tmode?: 'readwrite' | 'readonly';\n\t\t\ttransaction?: IDBTransaction;\n\t\t},\n\t): Promise<void> => {\n\t\tconst transaction = providedTx || this.db.transaction('operations', mode);\n\t\tconst store = transaction.objectStore('operations');\n\n\t\tconst start = after\n\t\t\t? createCompoundIndexValue(oid, after)\n\t\t\t: createLowerBoundIndexValue(oid);\n\t\tconst end = to\n\t\t\t? createCompoundIndexValue(oid, to)\n\t\t\t: createUpperBoundIndexValue(oid);\n\n\t\tconst range = IDBKeyRange.bound(start, end, !!after, false);\n\n\t\tconst request = store.openCursor(range, 'next');\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tlet previousTimestamp: string | undefined;\n\t\t\trequest.onsuccess = (event) => {\n\t\t\t\tconst cursor = request.result;\n\t\t\t\tif (cursor) {\n\t\t\t\t\tconst value = cursor.value as StoredClientOperation;\n\t\t\t\t\tassert(value.oid.startsWith(oid));\n\t\t\t\t\tassert(\n\t\t\t\t\t\tpreviousTimestamp === undefined ||\n\t\t\t\t\t\t\tpreviousTimestamp <= value.timestamp,\n\t\t\t\t\t\t`expected ${previousTimestamp} <= ${value.timestamp}`,\n\t\t\t\t\t);\n\n\t\t\t\t\titerator(value, store);\n\t\t\t\t\tpreviousTimestamp = value.timestamp;\n\t\t\t\t\tcursor.continue();\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t};\n\t\t\trequest.onerror = (event) => {\n\t\t\t\treject(event);\n\t\t\t};\n\t\t});\n\t};\n\n\titerateOverAllLocalOperations = async (\n\t\titerator: (patch: ClientOperation, store: IDBObjectStore) => void,\n\t\t{\n\t\t\tbefore,\n\t\t\tafter,\n\t\t\tmode = 'readonly',\n\t\t\ttransaction: providedTx,\n\t\t}: {\n\t\t\tbefore?: string | null;\n\t\t\tafter?: string | null;\n\t\t\tmode?: 'readwrite' | 'readonly';\n\t\t\ttransaction?: IDBTransaction;\n\t\t},\n\t): Promise<void> => {\n\t\tconst transaction = providedTx || this.db.transaction('operations', mode);\n\t\tconst store = transaction.objectStore('operations');\n\t\tconst index = store.index('l_t');\n\n\t\tconst start = after\n\t\t\t? createCompoundIndexValue(true, after)\n\t\t\t: createLowerBoundIndexValue(true);\n\t\tconst end = before\n\t\t\t? createCompoundIndexValue(true, before)\n\t\t\t: createUpperBoundIndexValue(true);\n\n\t\tconst range = IDBKeyRange.bound(start, end, !!after, true);\n\n\t\tconst request = index.openCursor(range, 'next');\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tlet previousTimestamp: string | undefined;\n\t\t\trequest.onsuccess = (event) => {\n\t\t\t\tconst cursor = request.result;\n\t\t\t\tif (cursor) {\n\t\t\t\t\tconst value = cursor.value as StoredClientOperation;\n\t\t\t\t\tassert(\n\t\t\t\t\t\tpreviousTimestamp === undefined ||\n\t\t\t\t\t\t\tpreviousTimestamp <= value.timestamp,\n\t\t\t\t\t\t`expected ${previousTimestamp} <= ${value.timestamp}`,\n\t\t\t\t\t);\n\n\t\t\t\t\titerator(value, store);\n\t\t\t\t\tpreviousTimestamp = value.timestamp;\n\t\t\t\t\tcursor.continue();\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t};\n\t\t\trequest.onerror = (event) => {\n\t\t\t\treject(event);\n\t\t\t};\n\t\t});\n\t};\n\n\titerateOverAllOperations = async (\n\t\titerator: (patch: ClientOperation, store: IDBObjectStore) => void,\n\t\t{\n\t\t\tbefore,\n\t\t\ttransaction,\n\t\t\tmode,\n\t\t\tfrom,\n\t\t}: {\n\t\t\t/** Ending timestamp, exclusive */\n\t\t\tbefore?: string | null;\n\t\t\t/** Starting timestamp, inclusive */\n\t\t\tfrom?: string | null;\n\t\t\ttransaction?: IDBTransaction;\n\t\t\tmode?: 'readwrite' | 'readonly';\n\t\t},\n\t): Promise<void> => {\n\t\tawait this.iterate(\n\t\t\t'operations',\n\t\t\t(store) => {\n\t\t\t\tconst start = from ? createLowerBoundIndexValue(from) : undefined;\n\t\t\t\tconst end = before ? createUpperBoundIndexValue(before) : undefined;\n\n\t\t\t\tconst range =\n\t\t\t\t\tstart && end\n\t\t\t\t\t\t? IDBKeyRange.bound(start, end, false, true)\n\t\t\t\t\t\t: start\n\t\t\t\t\t\t? IDBKeyRange.lowerBound(start, false)\n\t\t\t\t\t\t: end\n\t\t\t\t\t\t? IDBKeyRange.upperBound(end, true)\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst index = store.index('timestamp');\n\t\t\t\treturn index.openCursor(range, 'next');\n\t\t\t},\n\t\t\titerator,\n\t\t\tmode,\n\t\t\ttransaction,\n\t\t);\n\t};\n\n\t/**\n\t * Adds a set of patches to the database.\n\t * @returns a list of affected root document OIDs.\n\t */\n\taddOperations = async (\n\t\tpatches: ClientOperation[],\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t): Promise<ObjectIdentifier[]> => {\n\t\treturn this.insert(patches.map(this.addCompoundIndexes), { transaction });\n\t};\n\n\tprivate addCompoundIndexes = (\n\t\tpatch: ClientOperation,\n\t): StoredClientOperation => {\n\t\treturn {\n\t\t\t...patch,\n\t\t\toid_timestamp: createCompoundIndexValue(\n\t\t\t\tpatch.oid,\n\t\t\t\tpatch.timestamp,\n\t\t\t) as string,\n\t\t\tl_t: createCompoundIndexValue(patch.isLocal, patch.timestamp) as string,\n\t\t\td_t: createCompoundIndexValue(\n\t\t\t\tgetOidRoot(patch.oid),\n\t\t\t\tpatch.timestamp,\n\t\t\t) as string,\n\t\t};\n\t};\n\n\tprivate insert = async (\n\t\toperations: StoredClientOperation[],\n\t\t{ transaction }: { transaction?: IDBTransaction },\n\t): Promise<ObjectIdentifier[]> => {\n\t\tconst affected = new Set<ObjectIdentifier>();\n\t\tawait this.runAll(\n\t\t\t'operations',\n\t\t\t(store) =>\n\t\t\t\toperations.map((op) => {\n\t\t\t\t\taffected.add(getOidRoot(op.oid));\n\t\t\t\t\treturn store.put(op);\n\t\t\t\t}),\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t\treturn Array.from(affected);\n\t};\n\n\treset = () => {\n\t\treturn this.clear('operations');\n\t};\n}\n", "import { StorageSchema } from '@verdant-web/common';\nimport { storeRequestPromise } from '../idb.js';\n\ntype StoredSchema = {\n\ttype: 'schema';\n\tschema: string;\n};\n\nexport class SchemaStore {\n\tprivate cached: StorageSchema<any> | null = null;\n\n\tconstructor(\n\t\tprivate readonly db: IDBDatabase,\n\t\tpublic readonly currentVersion: number,\n\t) {}\n\n\tget = async (): Promise<StorageSchema<any> | null> => {\n\t\tif (this.cached) {\n\t\t\treturn this.cached;\n\t\t}\n\n\t\tconst db = this.db;\n\t\tconst transaction = db.transaction('info', 'readonly');\n\t\tconst store = transaction.objectStore('info');\n\t\tconst request = store.get('schema');\n\t\tconst value = (await storeRequestPromise(request)) as\n\t\t\t| StoredSchema\n\t\t\t| undefined;\n\t\tif (!value) {\n\t\t\treturn null;\n\t\t}\n\t\tthis.cached = JSON.parse(value.schema);\n\t\treturn this.cached;\n\t};\n\n\tset = async (schema: StorageSchema<any>): Promise<void> => {\n\t\tconst db = this.db;\n\t\tconst transaction = db.transaction('info', 'readwrite');\n\t\tconst store = transaction.objectStore('info');\n\t\tconst request = store.put({\n\t\t\ttype: 'schema',\n\t\t\tschema: JSON.stringify(schema),\n\t\t} as StoredSchema);\n\t\tthis.cached = schema;\n\t\tawait storeRequestPromise(request);\n\t};\n}\n", "import {\n\tapplyPatch,\n\tassert,\n\tassignOid,\n\tClientMessage,\n\tDocumentBaseline,\n\tEventSubscriber,\n\tFileRef,\n\tisFileRef,\n\tgetOidRoot,\n\tHybridLogicalClockTimestampProvider,\n\tObjectIdentifier,\n\tOperation,\n\tPatchCreator,\n\tRef,\n\tStorageSchema,\n\tsubstituteRefsWithObjects,\n} from '@verdant-web/common';\nimport { AckInfoStore } from './AckInfoStore.js';\nimport { BaselinesStore } from './BaselinesStore.js';\nimport {\n\tgetAllFromObjectStores,\n\tgetSizeOfObjectStore,\n\tstoreRequestPromise,\n} from '../idb.js';\nimport { LocalReplicaInfo, LocalReplicaStore } from './LocalReplicaStore.js';\nimport { MessageCreator } from './MessageCreator.js';\nimport { ClientOperation, OperationsStore } from './OperationsStore.js';\nimport { SchemaStore } from './SchemaStore.js';\nimport { Context } from '../context.js';\n\nexport interface ExportData {\n\toperations: Operation[];\n\tbaselines: DocumentBaseline[];\n\tlocalReplica: LocalReplicaInfo;\n\tschema: StorageSchema;\n}\n\nexport class Metadata extends EventSubscriber<{\n\tmessage: (message: ClientMessage) => void;\n\trebase: (baselines: DocumentBaseline[]) => void;\n\tfilesDeleted: (files: FileRef[]) => void;\n}> {\n\treadonly operations;\n\treadonly baselines;\n\treadonly localReplica;\n\treadonly ackInfo;\n\treadonly messageCreator;\n\treadonly patchCreator;\n\treadonly schema;\n\treadonly time = new HybridLogicalClockTimestampProvider();\n\n\tprivate readonly disableRebasing: boolean = false;\n\t/**\n\t * indicates the client is shutting down and we should stop\n\t * accessing the database.\n\t */\n\tprivate _closing = false;\n\n\tprivate context: Omit<Context, 'documentDb'>;\n\n\tconstructor({\n\t\tdisableRebasing,\n\t\tcontext,\n\t}: {\n\t\tdisableRebasing?: boolean;\n\t\tcontext: Omit<Context, 'documentDb'>;\n\t}) {\n\t\tsuper();\n\t\tthis.context = context;\n\t\tthis.schema = new SchemaStore(context.metaDb, context.schema.version);\n\t\tthis.operations = new OperationsStore(this.db);\n\t\tthis.baselines = new BaselinesStore(this.db);\n\t\tthis.localReplica = new LocalReplicaStore(this.db);\n\t\tthis.ackInfo = new AckInfoStore(this.db);\n\t\tthis.messageCreator = new MessageCreator(this);\n\t\tthis.patchCreator = new PatchCreator(() => this.now);\n\t\tif (disableRebasing) this.disableRebasing = disableRebasing;\n\t}\n\n\tprivate get db() {\n\t\treturn this.context.metaDb;\n\t}\n\n\tprivate get log() {\n\t\treturn this.context.log;\n\t}\n\n\tsetContext = (context: Context) => {\n\t\tthis.context = context;\n\t};\n\n\tget now() {\n\t\treturn this.time.now(this.schema.currentVersion);\n\t}\n\n\tclose = () => {\n\t\tthis._closing = true;\n\t};\n\n\t/**\n\t * Methods for accessing data\n\t */\n\n\tcreateTransaction = (stores: ('operations' | 'baselines')[]) => {\n\t\treturn this.db.transaction(stores, 'readwrite');\n\t};\n\n\t/**\n\t * Gets the OID and every sub-object OID for a given document.\n\t * Includes any sub-objects that are not referenced by the root object\n\t * but still happen to be in storage.\n\t */\n\tgetAllDocumentRelatedOids = async (oid: ObjectIdentifier) => {\n\t\tconst oids = new Set<ObjectIdentifier>();\n\t\tconst documentOid = getOidRoot(oid);\n\t\tassert(documentOid === oid, 'Must be root document OID');\n\t\toids.add(documentOid);\n\t\t// readwrite mode to block on other write transactions\n\t\tconst transaction = this.db.transaction(\n\t\t\t['baselines', 'operations'],\n\t\t\t'readwrite',\n\t\t);\n\t\tawait Promise.all([\n\t\t\tthis.baselines.iterateOverAllForDocument(\n\t\t\t\tdocumentOid,\n\t\t\t\t(baseline) => {\n\t\t\t\t\toids.add(baseline.oid);\n\t\t\t\t},\n\t\t\t\t{ transaction },\n\t\t\t),\n\t\t\tthis.operations.iterateOverAllOperationsForDocument(\n\t\t\t\tdocumentOid,\n\t\t\t\t(patch) => {\n\t\t\t\t\toids.add(patch.oid);\n\t\t\t\t},\n\t\t\t\t{ transaction },\n\t\t\t),\n\t\t]);\n\n\t\treturn Array.from(oids);\n\t};\n\n\tgetDocumentSnapshot = async (\n\t\toid: ObjectIdentifier,\n\t\toptions: { to?: string } = {},\n\t) => {\n\t\tconst documentOid = getOidRoot(oid);\n\t\tassert(documentOid === oid, 'Must be root document OID');\n\t\tconst transaction = this.db.transaction(\n\t\t\t['baselines', 'operations'],\n\t\t\t'readwrite',\n\t\t);\n\t\tconst baselines = await this.baselines.getAllForDocument(documentOid, {\n\t\t\ttransaction,\n\t\t});\n\t\tconst objectMap = new Map<ObjectIdentifier, any>();\n\t\tfor (const baseline of baselines) {\n\t\t\tif (baseline.snapshot) {\n\t\t\t\tassignOid(baseline.snapshot, baseline.oid);\n\t\t\t}\n\t\t\tobjectMap.set(baseline.oid, baseline.snapshot);\n\t\t}\n\t\tawait this.operations.iterateOverAllOperationsForDocument(\n\t\t\tdocumentOid,\n\t\t\t(op) => {\n\t\t\t\tconst obj = objectMap.get(op.oid) || undefined;\n\t\t\t\tconst newObj = applyPatch(obj, op.data);\n\t\t\t\tif (newObj) {\n\t\t\t\t\tassignOid(newObj, op.oid);\n\t\t\t\t}\n\t\t\t\tobjectMap.set(op.oid, newObj);\n\t\t\t},\n\t\t\t{\n\t\t\t\ttransaction,\n\t\t\t\t// only apply operations up to the current time\n\t\t\t\tto: options.to || this.now,\n\t\t\t},\n\t\t);\n\t\tconst root = objectMap.get(documentOid);\n\t\tif (root) {\n\t\t\tsubstituteRefsWithObjects(root, objectMap);\n\t\t}\n\t\treturn root;\n\t};\n\n\t/**\n\t * Methods for writing data\n\t */\n\n\t/**\n\t * Acks that we have seen a timestamp to the server\n\t * and stores it as our local ackedLogicalTime if it's\n\t * greater than our current ackedLogicalTime.\n\t */\n\tack = async (timestamp: string) => {\n\t\tconst localReplicaInfo = await this.localReplica.get();\n\t\t// can't ack timestamps from the future.\n\t\tif (timestamp > this.now) return;\n\n\t\tthis.emit('message', {\n\t\t\ttype: 'ack',\n\t\t\treplicaId: localReplicaInfo.id,\n\t\t\ttimestamp,\n\t\t});\n\t\tif (\n\t\t\t!this._closing &&\n\t\t\t(!localReplicaInfo.ackedLogicalTime ||\n\t\t\t\ttimestamp > localReplicaInfo.ackedLogicalTime)\n\t\t) {\n\t\t\tthis.localReplica.update({ ackedLogicalTime: timestamp });\n\t\t}\n\t};\n\n\t/**\n\t * Applies a patch to the document and stores it in the database.\n\t * @returns the oldest local history timestamp\n\t */\n\tinsertLocalOperation = async (operations: Operation[]) => {\n\t\tif (operations.length === 0) return;\n\t\t// await this.rebaseLock;\n\t\tthis.log(`Inserting ${operations.length} local operations`);\n\n\t\t// add local flag, in place.\n\t\tfor (const operation of operations) {\n\t\t\t(operation as ClientOperation).isLocal = true;\n\t\t}\n\t\tawait this.operations.addOperations(operations as ClientOperation[]);\n\n\t\tconst message = await this.messageCreator.createOperation({ operations });\n\t\tthis.emit('message', message);\n\n\t\t// we can now enqueue and check for rebase opportunities\n\t\tthis.tryAutonomousRebase();\n\t};\n\n\t/**\n\t * Inserts remote operations. This does not affect local history.\n\t * @returns a list of affected document OIDs\n\t */\n\tinsertRemoteOperations = async (operations: Operation[]) => {\n\t\tif (operations.length === 0) return [];\n\t\t// await this.rebaseLock;\n\t\tthis.log(`Inserting ${operations.length} remote operations`);\n\n\t\tconst affectedDocumentOids = await this.operations.addOperations(\n\t\t\toperations.map((patch) => ({\n\t\t\t\t...patch,\n\t\t\t\tisLocal: false,\n\t\t\t})),\n\t\t);\n\n\t\tthis.ack(operations[operations.length - 1].timestamp);\n\n\t\treturn affectedDocumentOids;\n\t};\n\n\tinsertRemoteBaselines = async (baselines: DocumentBaseline[]) => {\n\t\tif (baselines.length === 0) return [];\n\t\tthis.log(`Inserting ${baselines.length} remote baselines`);\n\n\t\tawait this.baselines.setAll(baselines);\n\n\t\t// this.ack(baselines[baselines.length - 1].timestamp);\n\n\t\tconst affectedOidSet = new Set<ObjectIdentifier>();\n\t\tbaselines.forEach((baseline) => {\n\t\t\taffectedOidSet.add(getOidRoot(baseline.oid));\n\t\t});\n\n\t\treturn Array.from(affectedOidSet);\n\t};\n\n\tupdateLastSynced = async (timestamp: string) => {\n\t\tif (this._closing) return;\n\n\t\treturn this.localReplica.update({\n\t\t\tlastSyncedLogicalTime: timestamp,\n\t\t});\n\t};\n\n\tlastSyncedTimestamp = async () => {\n\t\tconst localReplicaInfo = await this.localReplica.get();\n\t\treturn localReplicaInfo.lastSyncedLogicalTime;\n\t};\n\n\tprivate tryAutonomousRebase = async () => {\n\t\tif (this.disableRebasing) return;\n\n\t\tconst localReplicaInfo = await this.localReplica.get();\n\t\tif (localReplicaInfo.lastSyncedLogicalTime) return; // cannot autonomously rebase if we've synced\n\t\t// but if we have never synced... we can rebase everything!\n\t\tawait this.runRebase(this.now);\n\t};\n\n\t/**\n\t * Attempt to autonomously rebase local documents without server intervention.\n\t * This can currently only happen for a client who has never synced before.\n\t * The goal is to allow local-only clients to compress their history to exactly\n\t * their undo stack.\n\t */\n\tprivate runRebase = async (globalAckTimestamp: string) => {\n\t\tif (this._closing) return;\n\n\t\t// find all operations before the global ack\n\t\tlet lastTimestamp;\n\t\tconst toRebase = new Set<ObjectIdentifier>();\n\t\tconst transaction = this.db.transaction(\n\t\t\t['baselines', 'operations'],\n\t\t\t'readwrite',\n\t\t);\n\t\tlet operationCount = 0;\n\t\tawait this.operations.iterateOverAllOperations(\n\t\t\t(patch) => {\n\t\t\t\ttoRebase.add(patch.oid);\n\t\t\t\tlastTimestamp = patch.timestamp;\n\t\t\t\toperationCount++;\n\t\t\t},\n\t\t\t{\n\t\t\t\tbefore: globalAckTimestamp,\n\t\t\t\ttransaction,\n\t\t\t},\n\t\t);\n\n\t\tif (!toRebase.size) {\n\t\t\tthis.log('Cannot rebase, no operations prior to', globalAckTimestamp);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._closing) {\n\t\t\treturn;\n\t\t}\n\n\t\t// rebase each affected document\n\t\tlet newBaselines = [];\n\t\tfor (const oid of toRebase) {\n\t\t\tnewBaselines.push(\n\t\t\t\tawait this.rebase(\n\t\t\t\t\toid,\n\t\t\t\t\tlastTimestamp || globalAckTimestamp,\n\t\t\t\t\ttransaction,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tthis.emit('rebase', newBaselines);\n\t};\n\n\trebase = async (\n\t\toid: ObjectIdentifier,\n\t\tupTo: string,\n\t\tprovidedTx?: IDBTransaction,\n\t) => {\n\t\t// including replica Id for testing I guess\n\t\tconst replicaId = (await this.localReplica.get()).id;\n\n\t\tthis.log('[', replicaId, ']', 'Rebasing', oid, 'up to', upTo);\n\t\tconst transaction =\n\t\t\tprovidedTx ||\n\t\t\tthis.db.transaction(['operations', 'baselines'], 'readwrite');\n\t\tconst baseline = await this.baselines.get(oid, { transaction });\n\t\tlet current: any = baseline?.snapshot || undefined;\n\t\tlet operationsApplied = 0;\n\t\tconst deletedRefs: Ref[] = [];\n\t\tawait this.operations.iterateOverAllOperationsForEntity(\n\t\t\toid,\n\t\t\t(patch, store) => {\n\t\t\t\t// FIXME: this seems like the wrong place to do this\n\t\t\t\t// but it's here as a safety measure...\n\t\t\t\tif (!baseline || patch.timestamp > baseline.timestamp) {\n\t\t\t\t\tcurrent = applyPatch(current, patch.data, deletedRefs);\n\t\t\t\t}\n\t\t\t\t// delete all prior operations to the baseline\n\t\t\t\toperationsApplied++;\n\t\t\t\tstore.delete(patch.oid_timestamp);\n\t\t\t},\n\t\t\t{\n\t\t\t\tto: upTo,\n\t\t\t\ttransaction,\n\t\t\t},\n\t\t);\n\t\tif (current) {\n\t\t\tassignOid(current, oid);\n\t\t}\n\t\tconst newBaseline = {\n\t\t\toid,\n\t\t\tsnapshot: current,\n\t\t\ttimestamp: upTo,\n\t\t};\n\t\tif (newBaseline.snapshot) {\n\t\t\tawait this.baselines.set(newBaseline, { transaction });\n\t\t} else {\n\t\t\tawait this.baselines.delete(oid, { transaction });\n\t\t}\n\n\t\tthis.log(\n\t\t\t'successfully rebased',\n\t\t\toid,\n\t\t\t'up to',\n\t\t\tupTo,\n\t\t\t':',\n\t\t\tcurrent,\n\t\t\t'and deleted',\n\t\t\toperationsApplied,\n\t\t\t'operations',\n\t\t);\n\n\t\t// cleanup deleted refs\n\t\tif (deletedRefs.length) {\n\t\t\tconst fileRefs = deletedRefs.filter(isFileRef);\n\t\t\tif (fileRefs.length) {\n\t\t\t\tthis.emit('filesDeleted', fileRefs);\n\t\t\t}\n\t\t}\n\n\t\treturn newBaseline;\n\t};\n\n\treset = async () => {\n\t\tawait this.operations.reset();\n\t\tawait this.baselines.reset();\n\t\tawait this.localReplica.reset();\n\t};\n\n\tupdateSchema = async (schema: StorageSchema, overrideConflict?: number) => {\n\t\tconst storedSchema = await this.schema.get();\n\t\tif (storedSchema) {\n\t\t\t// version changes will be handled by migration routines in\n\t\t\t// the actual idb database loading code (see: initializeDatabases)\n\n\t\t\t// but this check determines if the schema has been changed without\n\t\t\t// a version change. if so, it will error.\n\t\t\tif (\n\t\t\t\toverrideConflict === storedSchema.version &&\n\t\t\t\tstoredSchema.version === schema.version &&\n\t\t\t\tJSON.stringify(storedSchema) !== JSON.stringify(schema)\n\t\t\t) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Schema mismatch for version ${schema.version}\n\t\t\t\t\t${JSON.stringify(storedSchema)}\n\t\t\t\t\t${JSON.stringify(schema)}`,\n\t\t\t\t);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Schema has changed without a version change! Any changes to your schema must be accompanied by a change in schema version and a migration routine.',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tawait this.schema.set(schema);\n\t};\n\n\tsetGlobalAck = async (timestamp: string) => {\n\t\tif (this._closing) return;\n\t\tawait this.ackInfo.setGlobalAck(timestamp);\n\t\tif (!this.disableRebasing) {\n\t\t\tawait this.runRebase(timestamp);\n\t\t}\n\t};\n\n\texport = async (): Promise<ExportData> => {\n\t\tconst db = this.db;\n\t\tconst [baselines, operations] = await getAllFromObjectStores(db, [\n\t\t\t'baselines',\n\t\t\t'operations',\n\t\t]);\n\t\tconst localReplica = await this.localReplica.get();\n\t\tconst schema = await this.schema.get();\n\t\tif (!schema) {\n\t\t\tthrow new Error('Cannot export Client data before initializing');\n\t\t}\n\t\treturn {\n\t\t\toperations,\n\t\t\tbaselines,\n\t\t\tlocalReplica,\n\t\t\tschema,\n\t\t};\n\t};\n\n\t/**\n\t * Resets local metadata and clears operation/baseline stores.\n\t * DOES NOT add operations/baselines - this should be done\n\t * through the normal higher level systems.\n\t */\n\tresetFrom = async (data: ExportData) => {\n\t\tconst db = this.db;\n\t\tconst transaction = db.transaction(\n\t\t\t['baselines', 'operations', 'info'],\n\t\t\t'readwrite',\n\t\t);\n\t\tawait storeRequestPromise(transaction.objectStore('baselines').clear());\n\t\tawait storeRequestPromise(transaction.objectStore('operations').clear());\n\t\tawait storeRequestPromise(transaction.objectStore('info').clear());\n\t\tawait this.localReplica.update(\n\t\t\t{\n\t\t\t\tackedLogicalTime: data.localReplica.ackedLogicalTime,\n\t\t\t\tlastSyncedLogicalTime: data.localReplica.lastSyncedLogicalTime,\n\t\t\t},\n\t\t\t{ transaction },\n\t\t);\n\t};\n\n\tstats = async () => {\n\t\tconst db = this.db;\n\t\tconst operationsSize = await getSizeOfObjectStore(db, 'operations');\n\t\tconst baselinesSize = await getSizeOfObjectStore(db, 'baselines');\n\n\t\treturn {\n\t\t\toperationsSize,\n\t\t\tbaselinesSize,\n\t\t};\n\t};\n}\n", "import { closeDatabase, storeRequestPromise } from '../idb.js';\n\nconst migrations = [version1, version2, version3, version4];\n\nexport function openMetadataDatabase({\n\tindexedDB = window.indexedDB,\n\tnamespace,\n\tlog,\n}: {\n\tindexedDB?: IDBFactory;\n\tnamespace: string;\n\tlog?: (...args: any[]) => void;\n}): Promise<{ wasInitialized: boolean; db: IDBDatabase }> {\n\treturn new Promise<{ wasInitialized: boolean; db: IDBDatabase }>(\n\t\t(resolve, reject) => {\n\t\t\tconst request = indexedDB.open(`${namespace}_meta`, 4);\n\t\t\tlet wasInitialized = false;\n\t\t\trequest.onupgradeneeded = async (event) => {\n\t\t\t\tconst db = request.result;\n\t\t\t\tconst tx = request.transaction!;\n\n\t\t\t\tconst toRun = migrations.slice(event.oldVersion);\n\t\t\t\tfor (const migration of toRun) {\n\t\t\t\t\tawait migration(db, tx);\n\t\t\t\t}\n\n\t\t\t\tif (!event.oldVersion) {\n\t\t\t\t\twasInitialized = true;\n\t\t\t\t}\n\t\t\t};\n\t\t\trequest.onerror = () => {\n\t\t\t\tconsole.error('Error opening database', request.error);\n\t\t\t\treject(request.error);\n\t\t\t};\n\t\t\trequest.onsuccess = () => {\n\t\t\t\tresolve({ db: request.result, wasInitialized });\n\t\t\t};\n\t\t},\n\t);\n}\n\nexport async function openWIPMetadataDatabase({\n\twipNamespace,\n\tnamespace,\n\tindexedDB,\n\tlog,\n}: {\n\tindexedDB?: IDBFactory;\n\tnamespace: string;\n\twipNamespace: string;\n\tlog?: (...args: any[]) => void;\n}): Promise<{ wasInitialized: boolean; db: IDBDatabase }> {\n\tconst result = await openMetadataDatabase({\n\t\tnamespace: wipNamespace,\n\t\tindexedDB,\n\t\tlog,\n\t});\n\n\t// this WIP database was already set up.\n\tif (!result.wasInitialized) {\n\t\treturn result;\n\t}\n\n\tlog?.('debug', 'Beginning copy of production metadata database to WIP');\n\t// copy all data from production metadata database\n\tconst { db: prodDb } = await openMetadataDatabase({\n\t\tnamespace,\n\t\tindexedDB,\n\t\tlog,\n\t});\n\n\tconst tx = prodDb.transaction(\n\t\t['baselines', 'operations', 'info'],\n\t\t'readonly',\n\t);\n\tconst [baselines, operations, info] = await Promise.all([\n\t\tstoreRequestPromise(tx.objectStore('baselines').getAll()),\n\t\tstoreRequestPromise(tx.objectStore('operations').getAll()),\n\t\tstoreRequestPromise(tx.objectStore('info').getAll()),\n\t]);\n\n\tconst wipTx = result.db.transaction(\n\t\t['baselines', 'operations', 'info'],\n\t\t'readwrite',\n\t);\n\tconst wipBaselines = wipTx.objectStore('baselines');\n\tconst wipOperations = wipTx.objectStore('operations');\n\tconst wipInfo = wipTx.objectStore('info');\n\n\tfor (const baseline of baselines) {\n\t\twipBaselines.put(baseline);\n\t}\n\tfor (const operation of operations) {\n\t\twipOperations.put(operation);\n\t}\n\tfor (const infoItem of info) {\n\t\twipInfo.put(infoItem);\n\t}\n\n\tawait new Promise<void>((resolve, reject) => {\n\t\twipTx.oncomplete = () => {\n\t\t\tresolve();\n\t\t};\n\t\twipTx.onerror = (event) => {\n\t\t\treject(event);\n\t\t};\n\t\twipTx.onabort = (event) => {\n\t\t\treject(event);\n\t\t};\n\t});\n\n\tawait closeDatabase(prodDb);\n\n\tlog?.(\n\t\t'debug',\n\t\t'Finished copy of production metadata database to WIP. Copied:',\n\t\tbaselines.length,\n\t\t'baselines,',\n\t\toperations.length,\n\t\t'operations',\n\t);\n\n\treturn result;\n}\n\nasync function version1(db: IDBDatabase, tx: IDBTransaction) {\n\tconst baselinesStore = db.createObjectStore('baselines', {\n\t\tkeyPath: 'oid',\n\t});\n\tconst operationsStore = db.createObjectStore('operations', {\n\t\tkeyPath: 'oid_timestamp',\n\t});\n\tconst infoStore = db.createObjectStore('info', { keyPath: 'type' });\n\tbaselinesStore.createIndex('timestamp', 'timestamp');\n\toperationsStore.createIndex('isLocal_timestamp', 'isLocal_timestamp');\n\toperationsStore.createIndex('documentOid_timestamp', 'documentOid_timestamp');\n}\n\n/**\n * 1 -> 2 changes:\n *\n * Consolidate compound index names:\n *\n * Operations:\n * - isLocal_timestamp -> l_t\n * - documentOid_timestamp -> d_t\n */\nasync function version2(db: IDBDatabase, tx: IDBTransaction) {\n\tconst operations = tx.objectStore('operations');\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst cursorReq = operations.openCursor();\n\t\tcursorReq.onsuccess = () => {\n\t\t\t// rename the consolidated fields\n\t\t\tconst cursor = cursorReq.result;\n\t\t\tif (cursor) {\n\t\t\t\tconst { isLocal_timestamp, documentOid_timestamp, ...value } =\n\t\t\t\t\tcursor.value;\n\t\t\t\tcursor.update({\n\t\t\t\t\t...value,\n\t\t\t\t\tl_t: isLocal_timestamp,\n\t\t\t\t\td_t: documentOid_timestamp,\n\t\t\t\t});\n\t\t\t\tcursor.continue();\n\t\t\t} else {\n\t\t\t\tresolve();\n\t\t\t}\n\t\t};\n\t\tcursorReq.onerror = (event) => {\n\t\t\treject(cursorReq.error);\n\t\t};\n\t});\n\t// remove the old indexes\n\toperations.deleteIndex('isLocal_timestamp');\n\toperations.deleteIndex('documentOid_timestamp');\n\t// create the new indexes\n\toperations.createIndex('l_t', 'l_t', { unique: false });\n\toperations.createIndex('o_t', 'o_t', { unique: false });\n\toperations.createIndex('d_t', 'd_t', { unique: false });\n}\n\n/**\n * 2 -> 3 changes:\n *\n * Add timestamp index to operations\n */\nasync function version3(db: IDBDatabase, tx: IDBTransaction) {\n\tconst operations = tx.objectStore('operations');\n\toperations.createIndex('timestamp', 'timestamp');\n}\n\nasync function version4(db: IDBDatabase, tx: IDBTransaction) {\n\tconst files = db.createObjectStore('files', {\n\t\tkeyPath: 'id',\n\t});\n\tfiles.createIndex('remote', 'remote');\n\tfiles.createIndex('deletedAt', 'deletedAt');\n}\n", "import {\n\tassert,\n\tCollectionCompoundIndexFilter,\n\tCollectionFilter,\n\tcreateCompoundIndexValue,\n\tcreateLowerBoundIndexValue,\n\tcreateUpperBoundIndexValue,\n\tisMatchIndexFilter,\n\tisRangeIndexFilter,\n\tisSortIndexFilter,\n\tisStartsWithIndexFilter,\n\tMatchCollectionIndexFilter,\n\tRangeCollectionIndexFilter,\n\tsanitizeIndexValue,\n\tSortIndexFilter,\n\tStartsWithIndexFilter,\n\tStorageSchema,\n} from '@verdant-web/common';\n\nconst matchIndexToIdbKeyRange = (filter: MatchCollectionIndexFilter) => {\n\treturn IDBKeyRange.only(sanitizeIndexValue(filter.equals));\n};\n\nconst sortIndexToIdbKeyRange = (filter: SortIndexFilter) => {\n\treturn undefined;\n};\n\nconst rangeIndexToIdbKeyRange = (filter: RangeCollectionIndexFilter) => {\n\tconst lower = filter.gte || filter.gt;\n\tconst upper = filter.lte || filter.lt;\n\tif (lower === upper) {\n\t\treturn IDBKeyRange.only(sanitizeIndexValue(lower));\n\t}\n\tif (!lower) {\n\t\treturn IDBKeyRange.upperBound(sanitizeIndexValue(upper), !!filter.lt);\n\t} else if (!upper) {\n\t\treturn IDBKeyRange.lowerBound(sanitizeIndexValue(lower), !!filter.gt);\n\t} else {\n\t\treturn IDBKeyRange.bound(\n\t\t\tsanitizeIndexValue(lower),\n\t\t\tsanitizeIndexValue(upper),\n\t\t\t!!filter.gt,\n\t\t\t!!filter.lt,\n\t\t);\n\t}\n};\n\nconst compoundIndexToIdbKeyRange = (\n\t// FIXME:\n\tschema: any,\n\tcollection: string,\n\tfilter: CollectionCompoundIndexFilter,\n) => {\n\t// validate the usage of the compound index:\n\t// - all match fields must be contiguous at the start of the compound order\n\tconst indexDefinition =\n\t\tschema.collections[collection].compounds[filter.where];\n\tassert(\n\t\tindexDefinition,\n\t\t`Index ${filter.where} does not exist on collection ${collection}`,\n\t);\n\tconst matchedKeys = Object.keys(filter.match).sort(\n\t\t(a, b) => indexDefinition.of.indexOf(a) - indexDefinition.of.indexOf(b),\n\t);\n\tfor (const key of matchedKeys) {\n\t\tif (indexDefinition.of.indexOf(key) !== matchedKeys.indexOf(key)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Compound index ${filter.where} does not have ${key} at the start of its order`,\n\t\t\t);\n\t\t}\n\t}\n\n\tconst matchedValues = matchedKeys.map(\n\t\t(key) => filter.match[key as keyof typeof filter.match] as string | number,\n\t);\n\n\t// special case: all match fields are specified - we don't need a range\n\t// query, just a single key query\n\tif (matchedKeys.length === indexDefinition.of.length) {\n\t\treturn IDBKeyRange.only(createCompoundIndexValue(...matchedValues));\n\t}\n\n\t// create our bounds for the matched values\n\tconst lower = createLowerBoundIndexValue(...matchedValues);\n\tconst upper = createUpperBoundIndexValue(...matchedValues);\n\treturn IDBKeyRange.bound(lower, upper);\n};\n\nfunction startsWithIndexToIdbKeyRange(filter: StartsWithIndexFilter) {\n\tconst lower = filter.startsWith;\n\tconst upper = filter.startsWith + '\\uffff';\n\treturn IDBKeyRange.bound(lower, upper);\n}\n\nexport function getRange(\n\tschema: StorageSchema,\n\tcollection: string,\n\tindex?: CollectionFilter,\n) {\n\tif (!index) return undefined;\n\tif (isRangeIndexFilter(index)) return rangeIndexToIdbKeyRange(index);\n\tif (isMatchIndexFilter(index)) return matchIndexToIdbKeyRange(index);\n\tif (isSortIndexFilter(index)) return sortIndexToIdbKeyRange(index);\n\tif (isStartsWithIndexFilter(index))\n\t\treturn startsWithIndexToIdbKeyRange(index);\n\treturn compoundIndexToIdbKeyRange(schema, collection, index);\n}\n", "import { CollectionFilter, createOid } from '@verdant-web/common';\nimport { Context } from '../context.js';\nimport { getRange } from './ranges.js';\n\nfunction getStore(db: IDBDatabase, collection: string, write?: boolean) {\n\treturn db\n\t\t.transaction(collection, write ? 'readwrite' : 'readonly')\n\t\t.objectStore(collection);\n}\n\nexport async function findOneOid({\n\tcollection,\n\tindex,\n\tcontext,\n}: {\n\tcollection: string;\n\tindex?: CollectionFilter;\n\tcontext: Context;\n}) {\n\tconst store = getStore(context.documentDb, collection);\n\tconst source = index ? store.index(index.where) : store;\n\tconst range = getRange(context.schema, collection, index);\n\tconst direction = index?.order === 'desc' ? 'prev' : 'next';\n\tconst request = source.openCursor(range, direction);\n\tconst result = await new Promise<string | null>((resolve, reject) => {\n\t\trequest.onsuccess = () => {\n\t\t\tconst cursor = request.result;\n\t\t\tif (cursor) {\n\t\t\t\tresolve(createOid(collection, cursor.primaryKey.toString()));\n\t\t\t} else {\n\t\t\t\tresolve(null);\n\t\t\t}\n\t\t};\n\t\trequest.onerror = () => {\n\t\t\tif (request.error?.name === 'InvalidStateError') {\n\t\t\t\tcontext.log(\n\t\t\t\t\t'error',\n\t\t\t\t\t`findOne query failed with InvalidStateError`,\n\t\t\t\t\trequest.error,\n\t\t\t\t);\n\t\t\t\tresolve(null);\n\t\t\t} else {\n\t\t\t\treject(request.error);\n\t\t\t}\n\t\t};\n\t});\n\treturn result;\n}\n\nexport async function findAllOids({\n\tcollection,\n\tindex,\n\tcontext,\n}: {\n\tcollection: string;\n\tindex?: CollectionFilter;\n\tcontext: Context;\n}) {\n\tconst store = getStore(context.documentDb, collection);\n\tconst source = index ? store.index(index.where) : store;\n\tconst range = getRange(context.schema, collection, index);\n\tconst direction = index?.order === 'desc' ? 'prev' : 'next';\n\tconst request = source.openCursor(range, direction);\n\tconst result = await new Promise<string[]>((resolve, reject) => {\n\t\tconst results = new Set<string>();\n\t\trequest.onsuccess = () => {\n\t\t\tconst cursor = request.result;\n\t\t\tif (cursor) {\n\t\t\t\tresults.add(createOid(collection, cursor.primaryKey.toString()));\n\t\t\t\tcursor.continue();\n\t\t\t} else {\n\t\t\t\tresolve(Array.from(results));\n\t\t\t}\n\t\t};\n\t\trequest.onerror = () => {\n\t\t\tif (request.error?.name === 'InvalidStateError') {\n\t\t\t\tcontext.log(\n\t\t\t\t\t'error',\n\t\t\t\t\t`findAll query failed with InvalidStateError`,\n\t\t\t\t\trequest.error,\n\t\t\t\t);\n\t\t\t\tresolve([]);\n\t\t\t} else {\n\t\t\t\treject(request.error);\n\t\t\t}\n\t\t};\n\t});\n\treturn result;\n}\n\nexport async function findPageOfOids({\n\tcollection,\n\tindex,\n\tcontext,\n\tlimit,\n\toffset,\n}: {\n\tcollection: string;\n\tindex?: CollectionFilter;\n\tcontext: Context;\n\tlimit?: number;\n\toffset?: number;\n}) {\n\tconst store = getStore(context.documentDb, collection);\n\tconst source = index ? store.index(index.where) : store;\n\tconst range = getRange(context.schema, collection, index);\n\tconst direction = index?.order === 'desc' ? 'prev' : 'next';\n\tconst request = source.openCursor(range, direction);\n\tlet hasDoneOffset = !offset;\n\tlet hasNextPage = false;\n\tlet visited = 0;\n\tconst result = await new Promise<string[]>((resolve, reject) => {\n\t\tconst results = new Set<string>();\n\t\trequest.onsuccess = () => {\n\t\t\tvisited++;\n\t\t\tconst cursor = request.result;\n\t\t\tif (cursor) {\n\t\t\t\tif (offset && !hasDoneOffset) {\n\t\t\t\t\tcursor.advance(offset);\n\t\t\t\t\thasDoneOffset = true;\n\t\t\t\t} else {\n\t\t\t\t\tif (limit && results.size < limit) {\n\t\t\t\t\t\tresults.add(createOid(collection, cursor.primaryKey.toString()));\n\t\t\t\t\t}\n\t\t\t\t\tif (limit && visited > limit) {\n\t\t\t\t\t\thasNextPage = true;\n\t\t\t\t\t\tresolve(Array.from(results));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcursor.continue();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresolve(Array.from(results));\n\t\t\t}\n\t\t};\n\t\trequest.onerror = () => {\n\t\t\tif (request.error?.name === 'InvalidStateError') {\n\t\t\t\tcontext.log(\n\t\t\t\t\t'error',\n\t\t\t\t\t`find query failed with InvalidStateError`,\n\t\t\t\t\trequest.error,\n\t\t\t\t);\n\t\t\t\tresolve([]);\n\t\t\t} else {\n\t\t\t\treject(request.error);\n\t\t\t}\n\t\t};\n\t});\n\n\treturn {\n\t\tresult: result as string[],\n\t\thasNextPage,\n\t};\n}\n", "export async function getDatabaseVersion(\n\tindexedDB: IDBFactory,\n\tnamespace: string,\n\tversion: number,\n\tlog?: (...args: any[]) => void,\n): Promise<number> {\n\tfunction openAndGetVersion(\n\t\tresolve: (res: [number, IDBDatabase]) => void,\n\t\treject: (err: Error) => void,\n\t) {\n\t\tlet currentVersion: number;\n\t\tlet database: IDBDatabase;\n\t\tconst request = indexedDB.open(\n\t\t\t[namespace, 'collections'].join('_'),\n\t\t\tversion,\n\t\t);\n\t\trequest.onupgradeneeded = async (event) => {\n\t\t\tcurrentVersion = event.oldVersion;\n\t\t\tconst transaction = request.transaction!;\n\t\t\tdatabase = request.result;\n\t\t\ttransaction.abort();\n\t\t};\n\t\trequest.onsuccess = (event) => {\n\t\t\tresolve([request.result.version, request.result]);\n\t\t};\n\t\trequest.onblocked = (event) => {\n\t\t\t// retry if blocked\n\t\t\tlog?.('Database blocked, waiting...');\n\t\t\t// setTimeout(() => {\n\t\t\t// \topenAndGetVersion(resolve, reject);\n\t\t\t// }, 200);\n\t\t};\n\t\trequest.onerror = (event) => {\n\t\t\t// FIXME: this fails if the code is older than the local database\n\t\t\tresolve([currentVersion!, database!]);\n\t\t};\n\t}\n\tconst [currentVersion, db] = await new Promise<[number, IDBDatabase]>(\n\t\topenAndGetVersion,\n\t);\n\tawait closeDatabase(db);\n\treturn currentVersion;\n}\n\nexport async function closeDatabase(db: IDBDatabase) {\n\tdb.close();\n\t// FIXME: this isn't right!!!!\n\tawait new Promise<void>((resolve) => resolve());\n}\n\n/**\n * Upgrades the database to the given version, using the given upgrader function.\n */\nexport async function upgradeDatabase(\n\tindexedDb: IDBFactory,\n\tnamespace: string,\n\tversion: number,\n\tupgrader: (\n\t\ttransaction: IDBTransaction,\n\t\tdb: IDBDatabase,\n\t\tevent: IDBVersionChangeEvent,\n\t) => void,\n\tlog?: (...args: any[]) => void,\n): Promise<void> {\n\tfunction openAndUpgrade(resolve: () => void, reject: (err: Error) => void) {\n\t\tconst request = indexedDb.open(\n\t\t\t[namespace, 'collections'].join('_'),\n\t\t\tversion,\n\t\t);\n\t\tlet wasUpgraded = false;\n\t\trequest.onupgradeneeded = (event) => {\n\t\t\tconst transaction = request.transaction!;\n\t\t\tupgrader(transaction, request.result, event);\n\t\t\twasUpgraded = true;\n\t\t};\n\t\trequest.onsuccess = (event) => {\n\t\t\trequest.result.close();\n\t\t\tif (wasUpgraded) {\n\t\t\t\tresolve();\n\t\t\t} else {\n\t\t\t\treject(\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t'Database was not upgraded when a version change was expected',\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t};\n\t\trequest.onerror = (event) => {\n\t\t\treject(request.error || new Error('Unknown error'));\n\t\t};\n\t\trequest.onblocked = (event) => {\n\t\t\tlog?.('Database upgrade blocked, waiting...');\n\t\t\t// setTimeout(() => {\n\t\t\t// \topenAndUpgrade(resolve, reject);\n\t\t\t// }, 200);\n\t\t};\n\t}\n\treturn new Promise(openAndUpgrade);\n}\n\nexport async function acquireLock(\n\tnamespace: string,\n\tprocedure: () => Promise<void>,\n) {\n\tif (typeof navigator !== 'undefined' && navigator.locks) {\n\t\tawait navigator.locks.request(`verdant_migration_${namespace}`, procedure);\n\t} else {\n\t\t// TODO: is there a fallback?\n\t\tawait procedure();\n\t}\n}\n\nexport async function openDatabase(\n\tindexedDb: IDBFactory,\n\tnamespace: string,\n\tversion: number,\n\tlog?: (...args: any[]) => void,\n): Promise<IDBDatabase> {\n\tlog?.('debug', 'Opening database', namespace, 'at version', version);\n\tconst db = await new Promise<IDBDatabase>((resolve, reject) => {\n\t\tconst request = indexedDb.open(\n\t\t\t[namespace, 'collections'].join('_'),\n\t\t\tversion,\n\t\t);\n\t\trequest.onupgradeneeded = async (event) => {\n\t\t\tconst transaction = request.transaction!;\n\t\t\ttransaction.abort();\n\n\t\t\tlog?.(\n\t\t\t\t'error',\n\t\t\t\t'Database upgrade needed, but not expected',\n\t\t\t\t'Expected',\n\t\t\t\tversion,\n\t\t\t\t'Got',\n\t\t\t\trequest.result.version,\n\t\t\t);\n\t\t\treject(\n\t\t\t\trequest.error ||\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t`Migration error: database version changed unexpectedly when reading current data. Expected ${version}, got ${request.result.version}`,\n\t\t\t\t\t),\n\t\t\t);\n\t\t};\n\t\trequest.onsuccess = (event) => {\n\t\t\tresolve(request.result);\n\t\t};\n\t\trequest.onblocked = (event) => {\n\t\t\treject(new Error('Migration error: database blocked'));\n\t\t};\n\t\trequest.onerror = (event) => {\n\t\t\treject(new Error('Migration error: database error'));\n\t\t};\n\t});\n\n\tdb.addEventListener('versionchange', (event) => {\n\t\tdb.close();\n\t});\n\n\treturn db;\n}\n", "export class MigrationPathError extends Error {\n\treadonly name = 'MigrationPathError';\n\n\tconstructor(public readonly message: string) {\n\t\tsuper(message);\n\t}\n}\n", "import { Migration } from '@verdant-web/common';\nimport { MigrationPathError } from './errors.js';\n\nexport function getMigrationPath({\n\tcurrentVersion,\n\ttargetVersion,\n\tmigrations,\n}: {\n\tcurrentVersion: number;\n\ttargetVersion: number;\n\tmigrations: Migration[];\n}) {\n\tconst path = getNextPathStep({\n\t\tcurrentVersion,\n\t\ttargetVersion,\n\t\tmigrations,\n\t});\n\tif (!path) {\n\t\tthrow new MigrationPathError(\n\t\t\t`No migration path found from ${currentVersion} to ${targetVersion}! This is a bug. If you're seeing this, contact the developer and provide them with the full contents of this message.`,\n\t\t);\n\t}\n\treturn path;\n}\n\nfunction getNextPathStep({\n\tcurrentVersion,\n\ttargetVersion,\n\tmigrations,\n}: {\n\tcurrentVersion: number;\n\ttargetVersion: number;\n\tmigrations: Migration[];\n}): Migration[] | null {\n\tif (currentVersion === targetVersion) {\n\t\treturn [];\n\t}\n\n\tconst fromHere = migrations\n\t\t.filter((m) => m.oldSchema.version === currentVersion)\n\t\t.sort((a, b) => b.newSchema.version - a.newSchema.version);\n\n\t// keep trying next steps, starting from the largest step,\n\t// until we find one that leads to the target version down the line\n\twhile (fromHere.length > 0) {\n\t\tconst next = fromHere.shift()!;\n\t\t// this one goes too far (probably never relevant, but still)\n\t\tif (next.newSchema.version > targetVersion) {\n\t\t\treturn null;\n\t\t}\n\t\t// exact match - we're done, return the path\n\t\tif (next.newSchema.version === targetVersion) {\n\t\t\treturn [next];\n\t\t}\n\t\t// look ahead a down the line. do we reach the target? if so,\n\t\t// we choose this path.\n\t\tconst nextPath = getNextPathStep({\n\t\t\tcurrentVersion: next.newSchema.version,\n\t\t\ttargetVersion,\n\t\t\tmigrations,\n\t\t});\n\t\tif (nextPath) {\n\t\t\treturn [next, ...nextPath];\n\t\t}\n\n\t\t// otherwise, try the next one with a smaller increment\n\t}\n\n\t// no paths from here match at all! if another layer is calling this one,\n\t// it will fallback to its next longest step. otherwise there may\n\t// be no paths at all...\n\treturn null;\n}\n", "import {\n\tCollectionFilter,\n\tMigration,\n\tMigrationEngine,\n\tObjectIdentifier,\n\tStorageSchema,\n\taddFieldDefaults,\n\tassert,\n\tassignIndexValues,\n\tassignOidPropertiesToAllSubObjects,\n\tassignOidsToAllSubObjects,\n\tcloneDeep,\n\tcreateOid,\n\tdecomposeOid,\n\tdiffToPatches,\n\tgetIndexValues,\n\tgetOidRoot,\n\thasOid,\n\tinitialToPatches,\n\tremoveOidPropertiesFromAllSubObjects,\n} from '@verdant-web/common';\nimport { Context } from '../context.js';\nimport { storeRequestPromise } from '../idb.js';\nimport { Metadata } from '../metadata/Metadata.js';\nimport { ClientOperation } from '../metadata/OperationsStore.js';\nimport { findAllOids, findOneOid } from '../queries/dbQueries.js';\nimport {\n\tacquireLock,\n\tcloseDatabase,\n\tgetDatabaseVersion,\n\topenDatabase,\n\tupgradeDatabase,\n} from './db.js';\nimport { getMigrationPath } from './paths.js';\n\nconst globalIDB =\n\ttypeof window !== 'undefined' ? window.indexedDB : (undefined as any);\n\ntype OpenDocumentDbContext = Omit<Context, 'documentDb'>;\n\nexport async function openDocumentDatabase({\n\tversion,\n\tindexedDB = globalIDB,\n\tmigrations,\n\tmeta,\n\tcontext,\n}: {\n\tversion: number;\n\tmigrations: Migration<any>[];\n\tindexedDB?: IDBFactory;\n\tmeta: Metadata;\n\tcontext: OpenDocumentDbContext;\n}) {\n\tif (context.schema.wip) {\n\t\tthrow new Error('Cannot open a production client with a WIP schema!');\n\t}\n\n\tconst currentVersion = await getDatabaseVersion(\n\t\tindexedDB,\n\t\tcontext.namespace,\n\t\tversion,\n\t\tcontext.log,\n\t);\n\n\tcontext.log(\n\t\t'debug',\n\t\t'Current database version:',\n\t\tcurrentVersion,\n\t\t'target version:',\n\t\tversion,\n\t);\n\n\tconst toRun = getMigrationPath({\n\t\tcurrentVersion,\n\t\ttargetVersion: version,\n\t\tmigrations,\n\t});\n\n\tif (toRun.length > 0) {\n\t\tcontext.log(\n\t\t\t'debug',\n\t\t\t'Migrations to run:',\n\t\t\ttoRun.map((m) => m.version),\n\t\t);\n\t\tawait runMigrations({ context, toRun, meta, indexedDB });\n\t}\n\treturn openDatabase(indexedDB, context.namespace, version, context.log);\n}\n\nexport async function openWIPDocumentDatabase({\n\tversion,\n\tindexedDB = globalIDB,\n\tmigrations,\n\tmeta,\n\tcontext,\n\twipNamespace,\n}: {\n\tversion: number;\n\tmigrations: Migration<any>[];\n\tindexedDB?: IDBFactory;\n\tmeta: Metadata;\n\tcontext: OpenDocumentDbContext;\n\twipNamespace: string;\n}) {\n\tcontext.log('debug', 'Opening WIP database', wipNamespace);\n\tconst currentWIPVersion = await getDatabaseVersion(\n\t\tindexedDB,\n\t\twipNamespace,\n\t\tversion,\n\t\tcontext.log,\n\t);\n\n\tif (currentWIPVersion === version) {\n\t\tcontext.log('info', `WIP schema is up-to-date; not refreshing database`);\n\t} else {\n\t\tcontext.log('info', `WIP schema is out-of-date; refreshing database`);\n\n\t\t// first we need to copy the data from the production database to the WIP database\n\t\t// at the current (non-wip) version.\n\n\t\tconst initialToRun = getMigrationPath({\n\t\t\tcurrentVersion: currentWIPVersion,\n\t\t\ttargetVersion: version - 1,\n\t\t\tmigrations,\n\t\t});\n\n\t\tif (initialToRun.length > 0) {\n\t\t\tawait runMigrations({\n\t\t\t\tcontext,\n\t\t\t\ttoRun: initialToRun,\n\t\t\t\tmeta,\n\t\t\t\tindexedDB,\n\t\t\t\tnamespace: wipNamespace,\n\t\t\t});\n\n\t\t\t// now, we copy the data from the main database.\n\t\t\tconst mainDatabase = await openDatabase(\n\t\t\t\tindexedDB,\n\t\t\t\tcontext.namespace,\n\t\t\t\tversion - 1,\n\t\t\t\tcontext.log,\n\t\t\t);\n\n\t\t\tconst wipDatabase = await openDatabase(\n\t\t\t\tindexedDB,\n\t\t\t\twipNamespace,\n\t\t\t\tversion - 1,\n\t\t\t\tcontext.log,\n\t\t\t);\n\n\t\t\t// DOMStringList... doesn't have iterable... why\n\t\t\tconst mainDatabaseStoreNames = new Array<string>();\n\t\t\tfor (let i = 0; i < mainDatabase.objectStoreNames.length; i++) {\n\t\t\t\tmainDatabaseStoreNames.push(mainDatabase.objectStoreNames[i]);\n\t\t\t}\n\n\t\t\tconst copyFromTransaction = mainDatabase.transaction(\n\t\t\t\tmainDatabaseStoreNames,\n\t\t\t\t'readonly',\n\t\t\t);\n\t\t\tconst copyFromStores = mainDatabaseStoreNames.map((name) =>\n\t\t\t\tcopyFromTransaction.objectStore(name),\n\t\t\t);\n\t\t\tconst allObjects = await Promise.all(\n\t\t\t\tcopyFromStores.map((store) => storeRequestPromise(store.getAll())),\n\t\t\t);\n\n\t\t\tconst copyToTransaction = wipDatabase.transaction(\n\t\t\t\tmainDatabaseStoreNames,\n\t\t\t\t'readwrite',\n\t\t\t);\n\t\t\tconst copyToStores = mainDatabaseStoreNames.map((name) =>\n\t\t\t\tcopyToTransaction.objectStore(name),\n\t\t\t);\n\n\t\t\tfor (let i = 0; i < copyToStores.length; i++) {\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tallObjects[i].map((obj) => {\n\t\t\t\t\t\treturn storeRequestPromise(copyToStores[i].put(obj));\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst toRun = getMigrationPath({\n\t\t\tcurrentVersion: version - 1,\n\t\t\ttargetVersion: version,\n\t\t\tmigrations,\n\t\t});\n\n\t\tif (toRun.length > 0) {\n\t\t\tawait runMigrations({\n\t\t\t\tcontext,\n\t\t\t\ttoRun,\n\t\t\t\tmeta,\n\t\t\t\tindexedDB,\n\t\t\t\tnamespace: wipNamespace,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn openDatabase(indexedDB, wipNamespace, version, context.log);\n}\n\nasync function runMigrations({\n\tcontext,\n\ttoRun,\n\tmeta,\n\tindexedDB = globalIDB,\n\tnamespace = context.namespace,\n}: {\n\tcontext: OpenDocumentDbContext;\n\ttoRun: Migration<any>[];\n\tmeta: Metadata;\n\tindexedDB?: IDBFactory;\n\tnamespace?: string;\n}) {\n\tawait acquireLock(namespace, async () => {\n\t\t// now the fun part\n\t\tfor (const migration of toRun) {\n\t\t\t// special case: if this is the version 1 migration, we have no pre-existing database\n\t\t\t// to use for the migration.\n\t\t\tlet engine: MigrationEngine;\n\t\t\t// migrations from 0 (i.e. initial migrations) don't attempt to open an existing db\n\t\t\tif (migration.oldSchema.version === 0) {\n\t\t\t\tengine = getInitialMigrationEngine({\n\t\t\t\t\tmeta,\n\t\t\t\t\tmigration,\n\t\t\t\t\tcontext,\n\t\t\t\t});\n\t\t\t\tawait migration.migrate(engine);\n\t\t\t} else {\n\t\t\t\t// open the database with the current (old) version for this migration. this should\n\t\t\t\t// align with the database's current version.\n\t\t\t\tconst originalDatabase = await openDatabase(\n\t\t\t\t\tindexedDB,\n\t\t\t\t\tnamespace,\n\t\t\t\t\tmigration.oldSchema.version,\n\t\t\t\t\tcontext.log,\n\t\t\t\t);\n\n\t\t\t\t// this will only write to our metadata store via operations!\n\t\t\t\tengine = getMigrationEngine({\n\t\t\t\t\tmeta,\n\t\t\t\t\tmigration,\n\t\t\t\t\tcontext: {\n\t\t\t\t\t\t...context,\n\t\t\t\t\t\tdocumentDb: originalDatabase,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\ttry {\n\t\t\t\t\tawait migration.migrate(engine);\n\t\t\t\t\t// wait on any out-of-band async operations to complete\n\t\t\t\t\tawait Promise.all(engine.awaitables);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tcontext.log(\n\t\t\t\t\t\t'critical',\n\t\t\t\t\t\t`Migration failed (${migration.oldSchema.version} -> ${migration.newSchema.version})`,\n\t\t\t\t\t\terr,\n\t\t\t\t\t);\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\n\t\t\t\t// now we have to open the database again with the next version and\n\t\t\t\t// make the appropriate schema changes during the upgrade.\n\t\t\t\tawait closeDatabase(originalDatabase);\n\t\t\t}\n\n\t\t\tcontext.log(\n\t\t\t\t'debug',\n\t\t\t\t'Upgrading database',\n\t\t\t\tnamespace,\n\t\t\t\t'to version',\n\t\t\t\tmigration.newSchema.version,\n\t\t\t);\n\t\t\tawait upgradeDatabase(\n\t\t\t\tindexedDB,\n\t\t\t\tnamespace,\n\t\t\t\tmigration.newSchema.version,\n\t\t\t\t(transaction, db) => {\n\t\t\t\t\tfor (const newCollection of migration.addedCollections) {\n\t\t\t\t\t\tdb.createObjectStore(newCollection, {\n\t\t\t\t\t\t\tkeyPath:\n\t\t\t\t\t\t\t\tmigration.newSchema.collections[newCollection].primaryKey,\n\t\t\t\t\t\t\tautoIncrement: false,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const collection of migration.allCollections) {\n\t\t\t\t\t\tconst store = transaction.objectStore(collection);\n\t\t\t\t\t\t// apply new indexes\n\t\t\t\t\t\tfor (const newIndex of migration.addedIndexes[collection] || []) {\n\t\t\t\t\t\t\tstore.createIndex(newIndex.name, newIndex.name, {\n\t\t\t\t\t\t\t\tmultiEntry: newIndex.multiEntry,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// remove old indexes\n\t\t\t\t\t\tfor (const oldIndex of migration.removedIndexes[collection] || []) {\n\t\t\t\t\t\t\tstore.deleteIndex(oldIndex.name);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (const removedCollection of migration.removedCollections) {\n\t\t\t\t\t\t// !! can't delete the store, because old operations that relate to\n\t\t\t\t\t\t// this store may still exist in history. instead, we can clear it out\n\t\t\t\t\t\t// and leave it in place\n\t\t\t\t\t\ttransaction.objectStore(removedCollection).clear();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcontext.log,\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * In cases where operations from the future have been\n\t\t\t * received by this client, we may have created entire\n\t\t\t * documents in metadata which were not written to storage\n\t\t\t * because all of their operations were in the future (\n\t\t\t * i.e. in the next version). We have to find those documents\n\t\t\t * and also write their snapshots to storage, because they\n\t\t\t * won't be present in storage already to 'refresh,' so\n\t\t\t * if we don't analyze metadata for 'future' operations like\n\t\t\t * this, we won't know they exist.\n\t\t\t *\n\t\t\t * This led to behavior where the metadata would be properly\n\t\t\t * synced, but after upgrading the app and migrating, items\n\t\t\t * would be missing from findAll and findOne queries.\n\t\t\t */\n\t\t\tconst docsWithUnappliedMigrations = await getDocsWithUnappliedMigrations({\n\t\t\t\tmeta,\n\t\t\t\tcurrentVersion: migration.oldSchema.version,\n\t\t\t\tnewVersion: migration.newSchema.version,\n\t\t\t});\n\n\t\t\t// once the schema is ready, we can write back the migrated documents\n\t\t\tconst upgradedDatabase = await openDatabase(\n\t\t\t\tindexedDB,\n\t\t\t\tnamespace,\n\t\t\t\tmigration.newSchema.version,\n\t\t\t\tcontext.log,\n\t\t\t);\n\t\t\tfor (const collection of migration.allCollections) {\n\t\t\t\t// first step is to read in all the keys we need to rewrite\n\t\t\t\tconst documentReadTransaction = upgradedDatabase.transaction(\n\t\t\t\t\tcollection,\n\t\t\t\t\t'readwrite',\n\t\t\t\t);\n\t\t\t\tconst readStore = documentReadTransaction.objectStore(collection);\n\t\t\t\tconst keys = await getAllKeys(readStore);\n\t\t\t\t// map the keys to OIDs\n\t\t\t\tconst oids = keys.map((key) => createOid(collection, `${key}`));\n\t\t\t\toids.push(\n\t\t\t\t\t...engine.newOids.filter((oid) => {\n\t\t\t\t\t\treturn decomposeOid(oid).collection === collection;\n\t\t\t\t\t}),\n\t\t\t\t\t...docsWithUnappliedMigrations.filter((oid) => {\n\t\t\t\t\t\treturn decomposeOid(oid).collection === collection;\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst snapshots = await Promise.all(\n\t\t\t\t\toids.map(async (oid) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst snap = await meta.getDocumentSnapshot(oid);\n\t\t\t\t\t\t\treturn [oid, snap];\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t// this seems to happen with baselines/ops which are not fully\n\t\t\t\t\t\t\t// cleaned up after deletion?\n\t\t\t\t\t\t\tcontext.log(\n\t\t\t\t\t\t\t\t'error',\n\t\t\t\t\t\t\t\t'Could not regenerate snapshot during migration for oid',\n\t\t\t\t\t\t\t\toid,\n\t\t\t\t\t\t\t\t'this document will not be preserved',\n\t\t\t\t\t\t\t\te,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst views = snapshots\n\t\t\t\t\t.filter((s): s is [string, any] => !!s)\n\t\t\t\t\t.map(([oid, snapshot]) => {\n\t\t\t\t\t\tif (!snapshot) return [oid, undefined];\n\t\t\t\t\t\tconst view = getIndexValues(\n\t\t\t\t\t\t\tmigration.newSchema.collections[collection],\n\t\t\t\t\t\t\tsnapshot,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn [oid, view];\n\t\t\t\t\t});\n\n\t\t\t\t// now we can write the documents back\n\t\t\t\tconst documentWriteTransaction = upgradedDatabase.transaction(\n\t\t\t\t\tcollection,\n\t\t\t\t\t'readwrite',\n\t\t\t\t);\n\t\t\t\tconst writeStore = documentWriteTransaction.objectStore(collection);\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tviews.map(([oid, view]) => {\n\t\t\t\t\t\tif (view) {\n\t\t\t\t\t\t\treturn putView(writeStore, view).catch((err) => {\n\t\t\t\t\t\t\t\tview;\n\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst { id } = decomposeOid(oid);\n\t\t\t\t\t\t\treturn deleteView(writeStore, id);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tawait closeDatabase(upgradedDatabase);\n\n\t\t\tcontext.log('debug', `Migration of ${namespace} complete.`);\n\t\t\tcontext.log(`\n\t\t\t\t\u2B06\uFE0F v${migration.newSchema.version} Migration complete. Here's the rundown:\n\t\t\t\t\t- Added collections: ${migration.addedCollections.join(', ')}\n\t\t\t\t\t- Removed collections: ${migration.removedCollections.join(', ')}\n\t\t\t\t\t- Changed collections: ${migration.changedCollections.join(', ')}\n\t\t\t\t\t- New indexes: ${Object.keys(migration.addedIndexes)\n\t\t\t\t\t\t.map((col) =>\n\t\t\t\t\t\t\tmigration.addedIndexes[col].map((i) => `${col}.${i.name}`),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.flatMap((i) => i)\n\t\t\t\t\t\t.join(', ')}\n\t\t\t\t\t- Removed indexes: ${Object.keys(migration.removedIndexes)\n\t\t\t\t\t\t.map((col) =>\n\t\t\t\t\t\t\tmigration.removedIndexes[col].map((i) => `${col}.${i.name}`),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.flatMap((i) => i)\n\t\t\t\t\t\t.join(', ')}\n\t\t\t`);\n\t\t}\n\t});\n}\n\nfunction getMigrationMutations({\n\tmigration,\n\tmeta,\n\tgetMigrationNow,\n\tnewOids,\n}: {\n\tmigration: Migration<any>;\n\tnewOids: string[];\n\tgetMigrationNow: () => string;\n\tmeta: Metadata;\n}) {\n\treturn migration.allCollections.reduce((acc, collectionName) => {\n\t\tacc[collectionName] = {\n\t\t\tput: async (doc: any) => {\n\t\t\t\t// add defaults\n\t\t\t\taddFieldDefaults(migration.newSchema.collections[collectionName], doc);\n\t\t\t\tconst primaryKey =\n\t\t\t\t\tdoc[migration.newSchema.collections[collectionName].primaryKey];\n\t\t\t\tconst oid = createOid(collectionName, primaryKey);\n\t\t\t\tnewOids.push(oid);\n\t\t\t\tawait meta.insertLocalOperation(\n\t\t\t\t\tinitialToPatches(doc, oid, getMigrationNow),\n\t\t\t\t);\n\t\t\t\treturn doc;\n\t\t\t},\n\t\t\tdelete: (id: string) => {\n\t\t\t\tconst oid = createOid(collectionName, id);\n\t\t\t\treturn meta.insertLocalOperation([\n\t\t\t\t\t{\n\t\t\t\t\t\toid,\n\t\t\t\t\t\ttimestamp: getMigrationNow(),\n\t\t\t\t\t\tdata: { op: 'delete' },\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t},\n\t\t};\n\t\treturn acc;\n\t}, {} as any);\n}\n\nfunction getMigrationQueries({\n\tmigration,\n\tcontext,\n\tmeta,\n}: {\n\tmigration: Migration<any>;\n\tcontext: Context;\n\tmeta: Metadata;\n}) {\n\treturn migration.oldCollections.reduce((acc, collectionName) => {\n\t\tacc[collectionName] = {\n\t\t\tget: async (id: string) => {\n\t\t\t\tconst oid = createOid(collectionName, id);\n\t\t\t\tconst doc = await meta.getDocumentSnapshot(oid, {\n\t\t\t\t\t// only get the snapshot up to the previous version (newer operations may have synced)\n\t\t\t\t\tto: meta.time.now(migration.oldSchema.version),\n\t\t\t\t});\n\t\t\t\treturn doc;\n\t\t\t},\n\t\t\tfindOne: async (filter: CollectionFilter) => {\n\t\t\t\tconst oid = await findOneOid({\n\t\t\t\t\tcollection: collectionName,\n\t\t\t\t\tindex: filter,\n\t\t\t\t\tcontext,\n\t\t\t\t});\n\t\t\t\tif (!oid) return null;\n\t\t\t\tconst doc = await meta.getDocumentSnapshot(oid, {\n\t\t\t\t\t// only get the snapshot up to the previous version (newer operations may have synced)\n\t\t\t\t\tto: meta.time.now(migration.oldSchema.version),\n\t\t\t\t});\n\t\t\t\treturn doc;\n\t\t\t},\n\t\t\tfindAll: async (filter: CollectionFilter) => {\n\t\t\t\tconst oids = await findAllOids({\n\t\t\t\t\tcollection: collectionName,\n\t\t\t\t\tindex: filter,\n\t\t\t\t\tcontext,\n\t\t\t\t});\n\t\t\t\tconst docs = await Promise.all(\n\t\t\t\t\toids.map((oid) =>\n\t\t\t\t\t\tmeta.getDocumentSnapshot(oid, {\n\t\t\t\t\t\t\t// only get the snapshot up to the previous version (newer operations may have synced)\n\t\t\t\t\t\t\tto: meta.time.now(migration.oldSchema.version),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\treturn docs;\n\t\t\t},\n\t\t};\n\t\treturn acc;\n\t}, {} as any);\n}\n\nfunction getMigrationEngine({\n\tmeta,\n\tmigration,\n\tcontext,\n}: {\n\tlog?: (...args: any[]) => void;\n\tmigration: Migration;\n\tmeta: Metadata;\n\tcontext: Context;\n}): MigrationEngine {\n\tfunction getMigrationNow() {\n\t\treturn meta.time.zero(migration.version);\n\t}\n\n\tconst newOids = new Array<ObjectIdentifier>();\n\n\tconst queries = getMigrationQueries({\n\t\tmigration,\n\t\tcontext,\n\t\tmeta,\n\t});\n\tconst mutations = getMigrationMutations({\n\t\tmigration,\n\t\tgetMigrationNow,\n\t\tnewOids,\n\t\tmeta,\n\t});\n\tconst awaitables = new Array<Promise<any>>();\n\tconst engine: MigrationEngine = {\n\t\tlog: context.log,\n\t\tnewOids,\n\t\tmigrate: async (collection, strategy) => {\n\t\t\tconst docs = await queries[collection].findAll();\n\n\t\t\tawait Promise.all(\n\t\t\t\tdocs.filter(Boolean).map(async (doc: any) => {\n\t\t\t\t\tassert(\n\t\t\t\t\t\thasOid(doc),\n\t\t\t\t\t\t`Document is missing an OID: ${JSON.stringify(doc)}`,\n\t\t\t\t\t);\n\t\t\t\t\tconst original = cloneDeep(doc);\n\t\t\t\t\t// @ts-ignore - excessive type resolution\n\t\t\t\t\tconst newValue = await strategy(doc);\n\t\t\t\t\tif (newValue) {\n\t\t\t\t\t\t// the migration has altered the shape of our document. we need\n\t\t\t\t\t\t// to create the operation from the diff and write it to meta as\n\t\t\t\t\t\t// a migration patch\n\t\t\t\t\t\tremoveOidPropertiesFromAllSubObjects(original);\n\t\t\t\t\t\tremoveOidPropertiesFromAllSubObjects(newValue);\n\t\t\t\t\t\tassignOidsToAllSubObjects(newValue);\n\t\t\t\t\t\tconst patches = diffToPatches(\n\t\t\t\t\t\t\toriginal,\n\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\tgetMigrationNow,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t[],\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tmergeUnknownObjects: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (patches.length > 0) {\n\t\t\t\t\t\t\tawait meta.insertLocalOperation(patches);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tqueries,\n\t\tmutations,\n\t\tawaitables,\n\t};\n\treturn engine;\n}\n\nfunction getInitialMigrationEngine({\n\tmeta,\n\tmigration,\n\tcontext,\n}: {\n\tcontext: OpenDocumentDbContext;\n\tmigration: Migration;\n\tmeta: Metadata;\n}): MigrationEngine {\n\tfunction getMigrationNow() {\n\t\treturn meta.time.zero(migration.version);\n\t}\n\n\tconst newOids = new Array<ObjectIdentifier>();\n\n\tconst queries = new Proxy({} as any, {\n\t\tget() {\n\t\t\tthrow new Error(\n\t\t\t\t'Queries are not available in initial migrations; there is no database yet!',\n\t\t\t);\n\t\t},\n\t}) as any;\n\n\tconst mutations = getMigrationMutations({\n\t\tmigration,\n\t\tgetMigrationNow,\n\t\tnewOids,\n\t\tmeta,\n\t});\n\tconst engine: MigrationEngine = {\n\t\tlog: context.log,\n\t\tnewOids,\n\t\tmigrate: () => {\n\t\t\tthrow new Error(\n\t\t\t\t'Calling migrate() in initial migrations is not supported! Use initial migrations to seed initial data using mutations.',\n\t\t\t);\n\t\t},\n\t\tqueries,\n\t\tmutations,\n\t\tawaitables: [],\n\t};\n\treturn engine;\n}\n\nasync function getAllKeys(store: IDBObjectStore) {\n\treturn new Promise<IDBValidKey[]>((resolve, reject) => {\n\t\tconst request = store.getAllKeys();\n\t\trequest.onsuccess = (event) => {\n\t\t\tresolve(request.result);\n\t\t};\n\t\trequest.onerror = (event) => {\n\t\t\treject(request.error);\n\t\t};\n\t});\n}\n\nasync function deleteView(store: IDBObjectStore, id: string) {\n\tconst request = store.delete(id);\n\treturn new Promise<void>((resolve, reject) => {\n\t\trequest.onsuccess = (event) => {\n\t\t\tresolve();\n\t\t};\n\t\trequest.onerror = (event) => {\n\t\t\treject(request.error);\n\t\t};\n\t});\n}\n\nasync function putView(store: IDBObjectStore, view: any) {\n\tconst request = store.put(view);\n\treturn new Promise<void>((resolve, reject) => {\n\t\trequest.onsuccess = (event) => {\n\t\t\tresolve();\n\t\t};\n\t\trequest.onerror = (event) => {\n\t\t\treject(request.error);\n\t\t};\n\t});\n}\n\n/**\n * Gets a list of root OIDs for all documents which had operations stored already\n * that were not applied to their queryable snapshots because they were in the\n * future. These documents need to be refreshed in storage.\n */\nasync function getDocsWithUnappliedMigrations({\n\tmeta,\n\tcurrentVersion,\n\tnewVersion: _,\n}: {\n\tcurrentVersion: number;\n\tnewVersion: number;\n\tmeta: Metadata;\n}) {\n\t// scan for all operations in metadata after the current version.\n\t// this could be more efficient if also filtering below or equal newVersion but\n\t// that seems so unlikely in practice...\n\tconst unappliedOperations: ClientOperation[] = [];\n\tawait meta.operations.iterateOverAllOperations(\n\t\t(op) => unappliedOperations.push(op),\n\t\t{\n\t\t\tfrom: meta.time.zero(currentVersion + 1),\n\t\t},\n\t);\n\treturn Array.from(\n\t\tnew Set(unappliedOperations.map((op) => getOidRoot(op.oid))),\n\t);\n}\n", "import { EventSubscriber } from '@verdant-web/common';\n\ntype Undoable = () => Undoable | Promise<Undoable>;\n\nexport class UndoHistory extends EventSubscriber<{ change: () => void }> {\n\tprivate _undoable: Undoable[] = [];\n\tprivate _undone: Undoable[] = [];\n\n\tget canUndo() {\n\t\treturn this._undoable.length > 0;\n\t}\n\tget canRedo() {\n\t\treturn this._undone.length > 0;\n\t}\n\n\tundo = async () => {\n\t\tconst next = this._undoable.pop();\n\t\tif (next) {\n\t\t\tthis._undone.push(await next());\n\t\t\tthis.emit('change');\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\tredo = async () => {\n\t\tconst next = this._undone.pop();\n\t\tif (next) {\n\t\t\tthis._undoable.push(await next());\n\t\t\tthis.emit('change');\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\taddUndo = (undoPoint: Undoable) => {\n\t\tthis._undoable.push(undoPoint);\n\t\tthis._undone = [];\n\t\tthis.emit('change');\n\t};\n\n\taddRedo = (redoPoint: Undoable) => {\n\t\tthis._undone.push(redoPoint);\n\t\tthis.emit('change');\n\t};\n\n\tclear = () => {\n\t\tthis._undoable = [];\n\t\tthis._undone = [];\n\t\tthis.emit('change');\n\t};\n}\n", "import {\n\taddFieldDefaults,\n\tassert,\n\tcreateOid,\n\tSchemaCollection,\n\tStorageCollectionSchema,\n\tStorageDocument,\n\tStorageSchema,\n} from '@verdant-web/common';\nimport { EntityStore } from './entities/EntityStore.js';\nimport { Metadata } from './metadata/Metadata.js';\n\n/**\n * Exposes functionality for creating documents,\n * the only mutation which is available as an entry\n * point in the storage system.\n */\nexport class DocumentManager<Schema extends StorageSchema<any>> {\n\tconstructor(\n\t\tprivate meta: Metadata,\n\t\tprivate schema: Schema,\n\t\tprivate entities: EntityStore,\n\t) {}\n\n\tprivate getOid = (collection: string, init: any) => {\n\t\tconst primaryKeyName = this.schema.collections[collection]\n\t\t\t.primaryKey as Exclude<\n\t\t\tkeyof StorageDocument<SchemaCollection<Schema, any>>,\n\t\t\tsymbol\n\t\t>;\n\t\tconst primaryKey = init[primaryKeyName];\n\t\tassert(\n\t\t\tprimaryKey,\n\t\t\t`Document must have a primary key: ${primaryKeyName.toString()} (got: ${JSON.stringify(\n\t\t\t\tinit,\n\t\t\t)})`,\n\t\t);\n\t\treturn createOid(collection, primaryKey);\n\t};\n\n\tprivate addDefaults = (collectionName: string, init: any) => {\n\t\tconst collection = this.schema.collections[\n\t\t\tcollectionName\n\t\t] as StorageCollectionSchema;\n\t\treturn addFieldDefaults(collection, init);\n\t};\n\n\tcreate = async (\n\t\tcollection: string,\n\t\tinit: any,\n\t\toptions: { undoable?: boolean } = {},\n\t) => {\n\t\tconst defaulted = this.addDefaults(collection, init);\n\t\tconst oid = this.getOid(collection, defaulted);\n\t\t// documents are always objects at the root\n\t\treturn this.entities.create(defaulted, oid, options) as any;\n\t};\n\n\tdelete = async (\n\t\tcollection: string,\n\t\tprimaryKey: string,\n\t\toptions: { undoable?: boolean } = {},\n\t) => {\n\t\tconst oid = createOid(collection, primaryKey);\n\t\treturn this.entities.delete(oid, options);\n\t};\n\n\tdeleteAll = async (\n\t\tids: [string, string][],\n\t\toptions: { undoable?: boolean } = {},\n\t) => {\n\t\treturn this.entities.deleteAll(\n\t\t\tids.map(([collection, primaryKey]) => createOid(collection, primaryKey)),\n\t\t\toptions,\n\t\t);\n\t};\n\n\tdeleteAllFromCollection = async (\n\t\tcollection: string,\n\t\tids: string[],\n\t\toptions: { undoable?: boolean } = {},\n\t) => {\n\t\treturn this.entities.deleteAll(\n\t\t\tids.map((primaryKey) => createOid(collection, primaryKey)),\n\t\t\toptions,\n\t\t);\n\t};\n}\n", "import { EventSubscriber, FileData } from '@verdant-web/common';\n\nexport type EntityFileEvents = {\n\tchange: () => void;\n};\n\nexport const UPDATE = Symbol('entity-file-update');\nexport const MARK_FAILED = Symbol('entity-file-mark-failed');\n\n/**\n * Provides a consistent interface for files used in an app via\n * Entity access.\n */\nexport class EntityFile extends EventSubscriber<EntityFileEvents> {\n\t// cached object URL for a local blob file, if applicable\n\tprivate _objectUrl: string | null = null;\n\tprivate _fileData: FileData | null = null;\n\tprivate _loading = true;\n\tprivate _failed = false;\n\tprivate _disposed = false;\n\tprivate _downloadRemote = false;\n\n\tconstructor(\n\t\tpublic readonly id: string,\n\t\t{\n\t\t\tdownloadRemote = false,\n\t\t}: {\n\t\t\tdownloadRemote?: boolean;\n\t\t} = {},\n\t) {\n\t\tsuper();\n\t\tthis._downloadRemote = downloadRemote;\n\t}\n\n\tget downloadRemote() {\n\t\treturn this._downloadRemote;\n\t}\n\n\t[UPDATE] = (fileData: FileData) => {\n\t\tthis._loading = false;\n\t\tthis._failed = false;\n\t\tthis._disposed = false;\n\t\tthis._fileData = fileData;\n\t\tif (fileData.file) {\n\t\t\tif (this._objectUrl) {\n\t\t\t\tURL.revokeObjectURL(this._objectUrl);\n\t\t\t}\n\t\t\tthis._objectUrl = URL.createObjectURL(fileData.file);\n\t\t}\n\t\tthis.emit('change');\n\t};\n\n\t[MARK_FAILED] = () => {\n\t\tthis._failed = true;\n\t\tthis._loading = false;\n\t\tthis.emit('change');\n\t};\n\n\tget url(): string | null {\n\t\tif (this.loading) return null;\n\t\tif (this._objectUrl) return this._objectUrl;\n\t\treturn this._fileData?.url ?? null;\n\t}\n\n\tget name(): string | null {\n\t\treturn this._fileData?.name ?? null;\n\t}\n\n\tget type(): string | null {\n\t\treturn this._fileData?.type ?? null;\n\t}\n\n\tget loading() {\n\t\treturn this._loading;\n\t}\n\n\tget failed() {\n\t\treturn this._failed;\n\t}\n\n\tdispose = () => {\n\t\tif (this._objectUrl) {\n\t\t\tURL.revokeObjectURL(this._objectUrl);\n\t\t}\n\t\tthis._disposed = true;\n\t};\n}\n", "import { createFileRef, FileData } from '@verdant-web/common';\nimport cuid from 'cuid';\n\nexport function createFileData(file: File): FileData {\n\treturn {\n\t\tid: cuid(),\n\t\tfile: file,\n\t\turl: undefined,\n\t\tremote: false,\n\t\tname: file.name,\n\t\ttype: file.type,\n\t};\n}\n\n/**\n * Replaces File values with refs and returns the normalized value.\n * The list of files passed to the second argument will be populated with the files found in the value.\n */\nexport function processValueFiles(\n\tvalue: any,\n\tonFileIdentified: (fileData: FileData) => void,\n): any {\n\tif (typeof window !== 'undefined' && value instanceof File) {\n\t\tconst data = createFileData(value);\n\t\tonFileIdentified(data);\n\t\treturn createFileRef(data.id);\n\t}\n\n\tif (Array.isArray(value)) {\n\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\tvalue[i] = processValueFiles(value[i], onFileIdentified);\n\t\t}\n\t\treturn value;\n\t}\n\n\tif (typeof value === 'object') {\n\t\tfor (const key in value) {\n\t\t\tvalue[key] = processValueFiles(value[key], onFileIdentified);\n\t\t}\n\t\treturn value;\n\t}\n\n\treturn value;\n}\n\nexport function fileToArrayBuffer(file: File | Blob) {\n\treturn new Promise<ArrayBuffer>((resolve, reject) => {\n\t\tconst reader = new FileReader();\n\t\treader.onload = () => {\n\t\t\tresolve(reader.result as ArrayBuffer);\n\t\t};\n\t\treader.onerror = reject;\n\t\treader.readAsArrayBuffer(file);\n\t});\n}\n", "import { FileData } from '@verdant-web/common';\nimport { IDBService } from '../IDBService.js';\nimport { fileToArrayBuffer } from './utils.js';\n\n/**\n * When stored in IDB, replace the file blob with an array buffer\n * since it's more compatible, and replace remote boolean with\n * a string since IDB doesn't support boolean indexes.\n */\ninterface StoredFileData extends Omit<FileData, 'remote' | 'file'> {\n\tremote: 'true' | 'false';\n\tbuffer?: ArrayBuffer;\n\tdeletedAt: number | null;\n}\n\nexport interface ReturnedFileData extends FileData {\n\tdeletedAt: number | null;\n}\n\nexport class FileStorage extends IDBService {\n\taddFile = async (\n\t\tfile: FileData,\n\t\t{\n\t\t\ttransaction,\n\t\t\tdownloadRemote = false,\n\t\t}: { transaction?: IDBTransaction; downloadRemote?: boolean } = {},\n\t) => {\n\t\tlet buffer = file.file ? await fileToArrayBuffer(file.file) : undefined;\n\t\tif (!buffer && downloadRemote && file.url) {\n\t\t\ttry {\n\t\t\t\tbuffer = await fetch(file.url, {\n\t\t\t\t\tmethod: 'GET',\n\t\t\t\t\tcredentials: 'include',\n\t\t\t\t}).then((r) => r.arrayBuffer());\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Failed to download file to cache it locally. The file will still be available using its URL. Check the file server's CORS configuration.\",\n\t\t\t\t\terr,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn this.run(\n\t\t\t'files',\n\t\t\t(store) => {\n\t\t\t\treturn store.put({\n\t\t\t\t\tid: file.id,\n\t\t\t\t\t// IDB doesn't support boolean indexes\n\t\t\t\t\tremote: file.remote ? 'true' : 'false',\n\t\t\t\t\tdeletedAt: null,\n\t\t\t\t\tname: file.name,\n\t\t\t\t\ttype: file.type,\n\t\t\t\t\turl: file.url,\n\t\t\t\t\tbuffer,\n\t\t\t\t} as StoredFileData);\n\t\t\t},\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t};\n\n\tprivate hydrateFileData = (raw: StoredFileData): ReturnedFileData => {\n\t\t(raw as any).remote = raw.remote === 'true';\n\t\tconst buffer = raw.buffer;\n\t\tdelete raw.buffer;\n\t\t(raw as unknown as FileData).file = buffer\n\t\t\t? arrayBufferToBlob(buffer, raw.type)\n\t\t\t: undefined;\n\t\treturn raw as unknown as ReturnedFileData;\n\t};\n\n\tmarkUploaded = async (\n\t\tid: string,\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t) => {\n\t\tconst current = await this.getFileRaw(id, { transaction });\n\n\t\tif (!current) {\n\t\t\tthrow new Error('File is not in local database');\n\t\t}\n\n\t\treturn this.run(\n\t\t\t'files',\n\t\t\t(store) => {\n\t\t\t\treturn store.put({\n\t\t\t\t\t...current,\n\t\t\t\t\tremote: 'true',\n\t\t\t\t} as StoredFileData);\n\t\t\t},\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t};\n\n\tprivate getFileRaw = async (\n\t\tid: string,\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t): Promise<StoredFileData | undefined> => {\n\t\tconst raw = await this.run<StoredFileData>(\n\t\t\t'files',\n\t\t\t(store) => {\n\t\t\t\treturn store.get(id);\n\t\t\t},\n\t\t\t'readonly',\n\t\t\ttransaction,\n\t\t);\n\t\tif (!raw) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn raw;\n\t};\n\n\tgetFile = async (\n\t\tid: string,\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t): Promise<ReturnedFileData | undefined> => {\n\t\tconst raw = await this.getFileRaw(id, { transaction });\n\t\tif (!raw) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn this.hydrateFileData(raw);\n\t};\n\n\tdeleteFile(\n\t\tid: string,\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t) {\n\t\treturn this.run<undefined>(\n\t\t\t'files',\n\t\t\t(store) => {\n\t\t\t\treturn store.delete(id);\n\t\t\t},\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t}\n\n\tmarkPendingDelete = async (\n\t\tid: string,\n\t\t{ transaction }: { transaction?: IDBTransaction } = {},\n\t) => {\n\t\tconst current = await this.getFileRaw(id, { transaction });\n\n\t\tif (!current) {\n\t\t\tthrow new Error('File is not in local database');\n\t\t}\n\n\t\treturn this.run(\n\t\t\t'files',\n\t\t\t(store) => {\n\t\t\t\treturn store.put({\n\t\t\t\t\t...current,\n\t\t\t\t\tdeletedAt: Date.now(),\n\t\t\t\t} as StoredFileData);\n\t\t\t},\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t};\n\n\tlistUnsynced = async () => {\n\t\tconst raw = await this.run<StoredFileData[]>(\n\t\t\t'files',\n\t\t\t(store) => {\n\t\t\t\treturn store.index('remote').getAll('false');\n\t\t\t},\n\t\t\t'readonly',\n\t\t);\n\t\treturn raw.map(this.hydrateFileData);\n\t};\n\n\titerateOverPendingDelete = (\n\t\titerator: (file: ReturnedFileData, store: IDBObjectStore) => void,\n\t\ttransaction?: IDBTransaction,\n\t) => {\n\t\treturn this.iterate<StoredFileData>(\n\t\t\t'files',\n\t\t\t(store) => {\n\t\t\t\treturn store\n\t\t\t\t\t.index('deletedAt')\n\t\t\t\t\t.openCursor(IDBKeyRange.lowerBound(0, true));\n\t\t\t},\n\t\t\t(value, store) => {\n\t\t\t\titerator(this.hydrateFileData(value), store);\n\t\t\t},\n\t\t\t'readwrite',\n\t\t\ttransaction,\n\t\t);\n\t};\n}\n\nexport function arrayBufferToBlob(buffer: ArrayBuffer, type: string) {\n\treturn new Blob([buffer], { type });\n}\n", "import { FileData, FileRef } from '@verdant-web/common';\nimport { Context } from '../context.js';\nimport { Metadata } from '../metadata/Metadata.js';\nimport { Sync } from '../sync/Sync.js';\nimport { EntityFile, MARK_FAILED, UPDATE } from './EntityFile.js';\nimport { FileStorage, ReturnedFileData } from './FileStorage.js';\n\n/**\n * Default: if file was deleted > 3 days ago\n */\nfunction defaultCanCleanup(fileData: ReturnedFileData) {\n\treturn (\n\t\tfileData.deletedAt !== null &&\n\t\tfileData.deletedAt < Date.now() - 1000 * 60 * 24 * 3\n\t);\n}\n\nexport interface FileManagerConfig {\n\t/**\n\t * Override the heuristic for deciding when a deleted file can be cleaned up.\n\t * By default this waits 3 days since deletion, then deletes the file data.\n\t * If the file has been synchronized to a server, it could still be restored\n\t * if the server has not yet deleted it.\n\t */\n\tcanCleanupDeletedFile?: (file: ReturnedFileData) => boolean;\n}\n\nexport class FileManager {\n\tprivate storage;\n\tprivate sync;\n\tprivate context;\n\n\tprivate files = new Map<string, EntityFile>();\n\tprivate config: Required<FileManagerConfig>;\n\tprivate meta: Metadata;\n\n\tconstructor({\n\t\tdb,\n\t\tsync,\n\t\tcontext,\n\t\tmeta,\n\t\tconfig = {},\n\t}: {\n\t\tdb: IDBDatabase;\n\t\tsync: Sync;\n\t\tcontext: Context;\n\t\tconfig?: FileManagerConfig;\n\t\tmeta: Metadata;\n\t}) {\n\t\tthis.storage = new FileStorage(db);\n\t\tthis.sync = sync;\n\t\tthis.context = context;\n\t\tthis.meta = meta;\n\t\tthis.config = {\n\t\t\tcanCleanupDeletedFile: defaultCanCleanup,\n\t\t\t...config,\n\t\t};\n\n\t\tthis.sync.subscribe('onlineChange', this.onOnlineChange);\n\t\tthis.meta.subscribe('filesDeleted', this.handleFileRefsDeleted);\n\t\t// check on startup to see if files can be cleaned up\n\t\tthis.tryCleanupDeletedFiles();\n\t}\n\n\tadd = async (fileInput: Omit<FileData, 'remote'>) => {\n\t\tconst file = fileInput as unknown as FileData;\n\t\tfile.remote = false;\n\t\t// immediately cache the file\n\t\tif (!this.files.has(file.id)) {\n\t\t\tconst entityFile = new EntityFile(file.id);\n\t\t\tentityFile[UPDATE](file);\n\t\t\tthis.files.set(file.id, entityFile);\n\t\t} else {\n\t\t\tthis.files.get(file.id);\n\t\t}\n\t\t// write to local storage and send to sync immediately\n\t\tawait this.storage.addFile(file);\n\t\t// send to sync\n\t\tif (file.file) {\n\t\t\tconst result = await this.sync.uploadFile(file);\n\t\t\tif (result.success) {\n\t\t\t\tawait this.storage.markUploaded(file.id);\n\t\t\t} else {\n\t\t\t\tthis.context.log('error', 'Failed to upload file');\n\t\t\t}\n\t\t}\n\t};\n\n\tprivate uploadFile = async (file: FileData, retries = 0) => {\n\t\tconst result = await this.sync.uploadFile(file);\n\t\tif (result.success) {\n\t\t\tawait this.storage.markUploaded(file.id);\n\t\t} else {\n\t\t\tif (result.retry && retries < 5) {\n\t\t\t\tthis.context.log('error', 'Error uploading file, retrying...');\n\t\t\t\t// schedule a retry\n\t\t\t\tsetTimeout(this.uploadFile, 1000, file, retries + 1);\n\t\t\t} else {\n\t\t\t\tthis.context.log(\n\t\t\t\t\t'error',\n\t\t\t\t\t'Failed to upload file. Not retrying until next sync.',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Immediately returns an EntityFile to use, then either loads\n\t * the file from cache, local database, or the server.\n\t */\n\tget = (id: string) => {\n\t\tif (this.files.has(id)) {\n\t\t\treturn this.files.get(id)!;\n\t\t}\n\t\tconst file = new EntityFile(id);\n\t\tthis.files.set(id, file);\n\t\tthis.load(file);\n\t\treturn file;\n\t};\n\n\tprivate load = async (file: EntityFile, retries = 0) => {\n\t\tif (retries > 5) {\n\t\t\tfile[MARK_FAILED]();\n\t\t\treturn;\n\t\t}\n\n\t\tconst fileData = await this.storage.getFile(file.id);\n\t\tif (fileData) {\n\t\t\tfile[UPDATE](fileData);\n\t\t} else {\n\t\t\t// maybe we don't have it yet, it might be on the server still.\n\t\t\ttry {\n\t\t\t\tconst result = await this.sync.getFile(file.id);\n\t\t\t\tif (result.success) {\n\t\t\t\t\tfile[UPDATE](result.data);\n\t\t\t\t\tawait this.storage.addFile(result.data, {\n\t\t\t\t\t\tdownloadRemote: file.downloadRemote,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tfile[MARK_FAILED]();\n\t\t\t\t\tif (result.retry) {\n\t\t\t\t\t\t// schedule a retry\n\t\t\t\t\t\tsetTimeout(this.load, 1000, file, retries + 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tthis.context.log('error', 'Failed to load file', err);\n\t\t\t\tfile[MARK_FAILED]();\n\t\t\t\t// schedule a retry\n\t\t\t\tsetTimeout(this.load, 1000, file, retries + 1);\n\t\t\t}\n\t\t}\n\t};\n\n\tlistUnsynced = async () => {\n\t\treturn this.storage.listUnsynced();\n\t};\n\n\tprivate onOnlineChange = async (online: boolean) => {\n\t\t// if online, try to upload any unsynced files\n\t\tif (online) {\n\t\t\tconst unsynced = await this.listUnsynced();\n\t\t\tawait Promise.all(unsynced.map(this.uploadFile));\n\t\t}\n\t};\n\n\tprivate tryCleanupDeletedFiles = async () => {\n\t\tlet count = 0;\n\t\tlet skipCount = 0;\n\t\tawait this.storage.iterateOverPendingDelete((fileData, store) => {\n\t\t\tif (this.config.canCleanupDeletedFile(fileData)) {\n\t\t\t\tcount++;\n\t\t\t\tstore.delete(fileData.id);\n\t\t\t} else {\n\t\t\t\tskipCount++;\n\t\t\t}\n\t\t});\n\n\t\tthis.context.log(\n\t\t\t'info',\n\t\t\t`Cleaned up ${count} files, skipped ${skipCount} files`,\n\t\t);\n\t};\n\n\tprivate handleFileRefsDeleted = async (fileRefs: FileRef[]) => {\n\t\tconst tx = this.storage.createTransaction(['files'], 'readwrite');\n\t\tawait Promise.all(\n\t\t\tfileRefs.map(async (fileRef) => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.storage.markPendingDelete(fileRef.id, { transaction: tx });\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthis.context.log('error', 'Failed to mark file for deletion', err);\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t\tthis.context.log(\n\t\t\t'info',\n\t\t\t`Marked ${fileRefs.length} files as pending delete`,\n\t\t);\n\t};\n}\n", "import {\n\tassert,\n\tassignOid,\n\tcloneDeep,\n\tcreateRef,\n\tdecomposeOid,\n\tEventSubscriber,\n\tFileData,\n\tFileRef,\n\tisFileRef,\n\tisObjectRef,\n\tmaybeGetOid,\n\tObjectIdentifier,\n\tOperation,\n\tPatchCreator,\n\tStorageFieldSchema,\n\tStorageFieldsSchema,\n\tTimestampProvider,\n\ttraverseCollectionFieldsAndApplyDefaults,\n} from '@verdant-web/common';\nimport { EntityFile } from '../files/EntityFile.js';\nimport { processValueFiles } from '../files/utils.js';\n\nexport const ADD_OPERATIONS = '@@addOperations';\nexport const DELETE = '@@delete';\nexport const REBASE = '@@rebase';\nconst REFRESH = '@@refresh';\nexport const DEEP_CHANGE = '@@deepChange';\n\nexport interface CacheTools {\n\tcomputeView(oid: ObjectIdentifier): {\n\t\tview: any;\n\t\tdeleted: boolean;\n\t\tlastTimestamp: number | null;\n\t};\n\tgetEntity(\n\t\toid: ObjectIdentifier,\n\t\tschema: StorageFieldSchema,\n\t\tparent?: Entity,\n\t): Entity;\n\thasOid(oid: ObjectIdentifier): boolean;\n\tweakRef<T extends object>(value: T): WeakRef<T>;\n}\n\nexport interface StoreTools {\n\taddLocalOperations(operations: Operation[]): void;\n\tpatchCreator: PatchCreator;\n\taddFile: (file: FileData) => void;\n\tgetFile: (id: string) => EntityFile;\n\ttime: TimestampProvider;\n\tnow: string;\n}\n\nexport type AccessibleEntityProperty<T> = T extends Array<any>\n\t? number\n\t: T extends object\n\t? keyof T\n\t: never;\n\ntype DataFromInit<Init> = Init extends { [key: string]: any }\n\t? {\n\t\t\t[Key in keyof Init]: Init[Key];\n\t }\n\t: Init extends Array<any>\n\t? Init\n\t: any;\n\nexport type EntityShape<E extends Entity<any, any>> = E extends Entity<\n\tinfer Value,\n\tany\n>\n\t? Value\n\t: never;\n\n// reduces keys of an object to only ones with an optional\n// value\ntype DeletableKeys<T> = keyof {\n\t[Key in keyof T as IfNullableThen<T[Key], Key>]: Key;\n};\ntype IfNullableThen<T, Out> = undefined extends T\n\t? Out\n\t: null extends T\n\t? Out\n\t: never;\n\nexport function refreshEntity(\n\tentity: Entity<any, any>,\n\tinfo: EntityChangeInfo,\n) {\n\treturn entity[REFRESH](info);\n}\n\nexport interface EntityChangeInfo {\n\tisLocal?: boolean;\n}\n\ntype EntityEvents = {\n\tchange: (info: EntityChangeInfo) => void;\n\tchangeDeep: (target: Entity<any, any>, info: EntityChangeInfo) => void;\n\tdelete: (info: EntityChangeInfo) => void;\n\trestore: (info: EntityChangeInfo) => void;\n};\n\ntype BaseEntityValue = { [Key: string]: any } | any[];\n\nexport class Entity<\n\t\tInit = any,\n\t\tKeyValue extends BaseEntityValue = any,\n\t\tSnapshot extends any = DataFromInit<Init>,\n\t>\n\timplements\n\t\tObjectEntity<Init, KeyValue, Snapshot>,\n\t\tListEntity<Init, KeyValue, Snapshot>\n{\n\t// if current is null, the entity was deleted.\n\tprotected _current: any | null = null;\n\n\treadonly oid: ObjectIdentifier;\n\treadonly collection: string;\n\tprotected readonly store: StoreTools;\n\tprotected readonly fieldSchema;\n\tprotected readonly cache: CacheTools;\n\tprotected _deleted = false;\n\tprotected parent: WeakRef<Entity<any, any>> | undefined;\n\tprotected readonly readonlyKeys: (keyof Init)[];\n\n\tprivate cachedSnapshot: any = null;\n\tprivate cachedDestructure: KeyValue | null = null;\n\tprivate cachedDeepUpdatedAt: number | null = null;\n\n\tprivate _updatedAt: number | null = null;\n\n\tprotected events;\n\n\tprotected hasSubscribersToDeepChanges() {\n\t\treturn this.events.subscriberCount('changeDeep') > 0;\n\t}\n\n\tget hasSubscribers() {\n\t\tif (this.events.totalSubscriberCount() > 0) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// even if nobody subscribes directly to this entity, if a parent\n\t\t// has a deep subscription that counts.\n\t\tlet parent = this.parent?.deref();\n\t\twhile (parent) {\n\t\t\tif (parent.hasSubscribersToDeepChanges()) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tparent = parent.parent?.deref();\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tget deleted() {\n\t\treturn this._deleted;\n\t}\n\n\tprotected get value() {\n\t\treturn this._current;\n\t}\n\n\tget isList() {\n\t\treturn Array.isArray(this._current) as any;\n\t}\n\n\tget updatedAt() {\n\t\treturn this._updatedAt;\n\t}\n\n\tget deepUpdatedAt() {\n\t\tif (this.cachedDeepUpdatedAt) return this.cachedDeepUpdatedAt;\n\t\t// iterate over all children and take the latest timestamp\n\t\tlet latest: number | null = this._updatedAt;\n\t\tif (this.isList) {\n\t\t\tthis.forEach((child) => {\n\t\t\t\tif ((child as any) instanceof Entity) {\n\t\t\t\t\tconst childTimestamp = child.deepUpdatedAt;\n\t\t\t\t\tif (childTimestamp && (!latest || childTimestamp > latest)) {\n\t\t\t\t\t\tlatest = childTimestamp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tthis.values().forEach((child) => {\n\t\t\t\tif ((child as any) instanceof Entity) {\n\t\t\t\t\tconst childTimestamp = child.deepUpdatedAt;\n\t\t\t\t\tif (childTimestamp && (!latest || childTimestamp > latest)) {\n\t\t\t\t\t\tlatest = childTimestamp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tthis.cachedDeepUpdatedAt = latest;\n\t\treturn latest;\n\t}\n\n\tget uid() {\n\t\treturn this.oid;\n\t}\n\n\tconstructor({\n\t\toid,\n\t\tstore,\n\t\tfieldSchema,\n\t\tcache,\n\t\tparent,\n\t\tonAllUnsubscribed,\n\t\treadonlyKeys = [],\n\t}: {\n\t\toid: ObjectIdentifier;\n\t\tstore: StoreTools;\n\t\tfieldSchema: StorageFieldSchema | StorageFieldsSchema;\n\t\tcache: CacheTools;\n\t\tparent?: Entity<any, any>;\n\t\tonAllUnsubscribed?: () => void;\n\t\treadonlyKeys?: (keyof Init)[];\n\t}) {\n\t\tthis.oid = oid;\n\t\tconst { collection } = decomposeOid(oid);\n\t\tthis.collection = collection;\n\t\tthis.store = store;\n\t\tthis.fieldSchema = fieldSchema;\n\t\tthis.readonlyKeys = readonlyKeys;\n\t\tthis.cache = cache;\n\t\tthis.parent = parent && this.cache.weakRef(parent);\n\t\tconst { view, deleted, lastTimestamp } = this.cache.computeView(oid);\n\t\tthis._current = view;\n\t\tthis._deleted = deleted;\n\t\tthis._updatedAt = lastTimestamp ? lastTimestamp : null;\n\t\tthis.cachedDeepUpdatedAt = null;\n\t\tthis.events = new EventSubscriber<EntityEvents>(() => {\n\t\t\tif (!this.hasSubscribers) {\n\t\t\t\tonAllUnsubscribed?.();\n\t\t\t}\n\t\t});\n\n\t\tif (this.oid.includes('.') && !this.parent) {\n\t\t\tthrow new Error('Parent must be provided for sub entities');\n\t\t}\n\t\tassert(!!fieldSchema, 'Field schema must be provided');\n\t}\n\n\tprivate [REFRESH] = (info: EntityChangeInfo) => {\n\t\tconst { view, deleted, lastTimestamp } = this.cache.computeView(this.oid);\n\t\tthis._current = view;\n\t\tconst restored = this._deleted && !deleted;\n\t\tthis._deleted = deleted;\n\t\tthis.cachedDestructure = null;\n\t\tthis._updatedAt = lastTimestamp ? lastTimestamp : null;\n\t\tthis.cachedDeepUpdatedAt = null;\n\n\t\tif (this._deleted) {\n\t\t\tthis.events.emit('delete', info);\n\t\t} else {\n\t\t\tthis.events.emit('change', info);\n\t\t\tthis[DEEP_CHANGE](this as unknown as Entity<any, any>, info);\n\t\t}\n\t\tif (restored) {\n\t\t\tthis.cachedSnapshot = null;\n\t\t\tthis.events.emit('restore', info);\n\t\t}\n\t};\n\n\tprivate [DEEP_CHANGE] = (\n\t\tsource: Entity<any, any>,\n\t\tinfo: EntityChangeInfo,\n\t) => {\n\t\tthis.cachedSnapshot = null;\n\t\tthis.cachedDeepUpdatedAt = null;\n\t\tthis.events.emit('changeDeep', source, info);\n\t\tconst parent = this.parent?.deref();\n\t\tif (parent) {\n\t\t\tparent[DEEP_CHANGE](source, info);\n\t\t}\n\t};\n\n\tprotected getChildFieldSchema = (key: any) => {\n\t\tif (this.fieldSchema.type === 'object') {\n\t\t\treturn this.fieldSchema.properties[key];\n\t\t} else if (this.fieldSchema.type === 'array') {\n\t\t\treturn this.fieldSchema.items;\n\t\t} else if (this.fieldSchema.type === 'map') {\n\t\t\treturn this.fieldSchema.values;\n\t\t} else if (this.fieldSchema.type === 'any') {\n\t\t\treturn this.fieldSchema;\n\t\t}\n\t\tthrow new Error('Invalid field schema');\n\t};\n\n\tdispose = () => {\n\t\tthis.events.dispose();\n\t};\n\n\tsubscribe = <EventName extends keyof EntityEvents>(\n\t\tevent: EventName,\n\t\tcallback: EntityEvents[EventName],\n\t) => {\n\t\tconst unsubscribe = this.events.subscribe(event, callback);\n\n\t\treturn unsubscribe;\n\t};\n\n\tprotected addPatches = (patches: Operation[]) => {\n\t\tthis.store.addLocalOperations(patches);\n\t};\n\n\tprotected cloneCurrent = () => {\n\t\tif (this._current === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn cloneDeep(this._current);\n\t};\n\n\tprotected getSubObject = (\n\t\toid: ObjectIdentifier,\n\t\tkey: any,\n\t): Entity<any, any> => {\n\t\tconst fieldSchema = this.getChildFieldSchema(key);\n\t\t// this is a failure case, but trying to be graceful about it...\n\t\t// @ts-ignore\n\t\t// if (!fieldSchema) return null;\n\t\treturn this.cache.getEntity(oid, fieldSchema, this);\n\t};\n\n\tprotected wrapValue = <Key extends keyof KeyValue>(\n\t\tvalue: any,\n\t\tkey: Key,\n\t): KeyValue[Key] => {\n\t\tif (isObjectRef(value)) {\n\t\t\tconst oid = value.id;\n\t\t\tconst subObject = this.getSubObject(oid, key);\n\t\t\tif (subObject) {\n\t\t\t\treturn subObject as any;\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`CACHE MISS: Subobject ${oid} does not exist on ${this.oid}`,\n\t\t\t);\n\t\t} else if (isFileRef(value)) {\n\t\t\tconst file = this.store.getFile(value.id);\n\t\t\tif (file) {\n\t\t\t\tfile.subscribe('change', () => {\n\t\t\t\t\tthis[DEEP_CHANGE](this, {\n\t\t\t\t\t\tisLocal: false,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn file as any;\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t};\n\n\tprotected processInputValue = (value: any, key: any) => {\n\t\t// disassociate incoming OIDs on values and generally break object\n\t\t// references. cloning doesn't work on files so those are\n\t\t// filtered out.\n\t\t// The goal here is to be safe about a bunch of cases that could\n\t\t// result in corrupt data, like...\n\t\t// ent1.set('objField', ent2.get('objField'))\n\t\t// or\n\t\t// var shared = { foo: 'bar' };\n\t\t// ent1.set('objField', shared);\n\t\t// ent2.set('objField', shared);\n\t\t// ... each of these would result in the same object being\n\t\t// referenced in multiple entities, which could mean introduction\n\t\t// of foreign OIDs, or one object being assigned different OIDs\n\t\t// with unexpected results.\n\t\tif (!(value instanceof File)) {\n\t\t\tvalue = cloneDeep(value, false);\n\t\t}\n\t\tconst fieldSchema = this.getChildFieldSchema(key);\n\t\tif (fieldSchema) {\n\t\t\ttraverseCollectionFieldsAndApplyDefaults(value, fieldSchema);\n\t\t}\n\t\treturn processValueFiles(value, this.store.addFile);\n\t};\n\n\tget = <Key extends keyof KeyValue>(key: Key): KeyValue[Key] => {\n\t\tif (this.value === undefined || this.value === null) {\n\t\t\tthrow new Error('Cannot access deleted entity');\n\t\t}\n\n\t\tconst value = this.value[key];\n\t\treturn this.wrapValue(value, key);\n\t};\n\n\tgetAll = (): KeyValue => {\n\t\tif (this.value === undefined || this.value === null) {\n\t\t\tthrow new Error('Cannot access deleted entity');\n\t\t}\n\n\t\tif (this.cachedDestructure) return this.cachedDestructure;\n\n\t\tlet result: any;\n\t\tif (Array.isArray(this.value)) {\n\t\t\tresult = this.value.map((value, index) =>\n\t\t\t\tthis.wrapValue(value, index as any),\n\t\t\t) as any;\n\t\t} else {\n\t\t\tresult = {} as any;\n\t\t\tfor (const key in this.value) {\n\t\t\t\tresult[key as any] = this.get(key as any);\n\t\t\t}\n\t\t}\n\t\tthis.cachedDestructure = result;\n\t\treturn result;\n\t};\n\n\tprivate getFileSnapshot(item: FileRef) {\n\t\tconst file = this.store.getFile(item.id);\n\t\tif (file.url) {\n\t\t\treturn { id: item.id, url: file.url };\n\t\t} else if (file.loading || file.failed) {\n\t\t\treturn { id: item.id, url: undefined };\n\t\t} else {\n\t\t\treturn { id: item.id, url: null };\n\t\t}\n\t}\n\n\t/**\n\t * Returns a copy of the entity and all sub-objects as\n\t * a plain object or array.\n\t */\n\tgetSnapshot = (): any => {\n\t\tif (!this.value) {\n\t\t\treturn null;\n\t\t}\n\t\tif (this.deleted) {\n\t\t\treturn null;\n\t\t}\n\t\tif (this.cachedSnapshot) {\n\t\t\treturn this.cachedSnapshot;\n\t\t}\n\t\tlet snapshot;\n\t\tif (Array.isArray(this.value)) {\n\t\t\tsnapshot = this.value.map((item, idx) => {\n\t\t\t\tif (isObjectRef(item)) {\n\t\t\t\t\treturn this.getSubObject(item.id, idx)?.getSnapshot();\n\t\t\t\t} else if (isFileRef(item)) {\n\t\t\t\t\treturn this.getFileSnapshot(item);\n\t\t\t\t}\n\t\t\t\treturn item;\n\t\t\t}) as Snapshot;\n\t\t} else {\n\t\t\tsnapshot = { ...this.value };\n\t\t\tfor (const [key, value] of Object.entries(snapshot)) {\n\t\t\t\tif (isObjectRef(value)) {\n\t\t\t\t\tsnapshot[key] = this.getSubObject(value.id, key)?.getSnapshot();\n\t\t\t\t} else if (isFileRef(value)) {\n\t\t\t\t\tsnapshot[key] = this.getFileSnapshot(value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tassignOid(snapshot, this.oid);\n\t\tthis.cachedSnapshot = snapshot;\n\t\treturn snapshot;\n\t};\n\n\t/**\n\t * Object methods\n\t */\n\tkeys = () => {\n\t\treturn Object.keys(this.value || {});\n\t};\n\tentries = () => {\n\t\treturn Object.entries(this.getAll());\n\t};\n\tvalues = () => {\n\t\treturn Object.values(this.getAll());\n\t};\n\tset = <Key extends keyof Init>(key: Key, value: Init[Key]) => {\n\t\tif (this.readonlyKeys.includes(key)) {\n\t\t\tthrow new Error(`Cannot set readonly key ${key.toString()}`);\n\t\t}\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createSet(\n\t\t\t\tthis.oid,\n\t\t\t\tkey as string | number,\n\t\t\t\tthis.processInputValue(value, key),\n\t\t\t),\n\t\t);\n\t};\n\tdelete = (key: any) => {\n\t\tif (Array.isArray(this.value)) {\n\t\t\tthis.addPatches(\n\t\t\t\tthis.store.patchCreator.createListDelete(this.oid, key as number, 1),\n\t\t\t);\n\t\t} else {\n\t\t\t// the key must be deletable - i.e. optional in the schema\n\t\t\tconst deleteMode = this.getDeleteMode(key);\n\t\t\tif (!deleteMode) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot delete key ${key} - the property is not marked as optional in the schema`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (deleteMode === 'delete') {\n\t\t\t\tthis.addPatches(this.store.patchCreator.createRemove(this.oid, key));\n\t\t\t} else {\n\t\t\t\tthis.addPatches(this.store.patchCreator.createSet(this.oid, key, null));\n\t\t\t}\n\t\t}\n\t};\n\tprivate getDeleteMode = (key: any) => {\n\t\tif (this.readonlyKeys.includes(key)) {\n\t\t\treturn false;\n\t\t}\n\t\t// 'any' is always deletable, and map values can be removed completely\n\t\tif (this.fieldSchema.type === 'any' || this.fieldSchema.type === 'map') {\n\t\t\treturn 'delete';\n\t\t}\n\n\t\tif (this.fieldSchema.type === 'object') {\n\t\t\tconst property = this.fieldSchema.properties[key];\n\t\t\tif (!property) {\n\t\t\t\t// huh, trying to delete a field that isn't specified\n\t\t\t\t// in the schema. we should use 'delete' mode.\n\t\t\t\treturn 'delete';\n\t\t\t}\n\t\t\tif (property.type === 'any') return 'delete';\n\t\t\t// map can't be nullable\n\t\t\t// TODO: should it be?\n\t\t\tif (property.type === 'map') return false;\n\t\t\t// nullable properties can only be set null\n\t\t\tif (property.nullable) return 'null';\n\t\t}\n\t\t// no other parent objects support deleting\n\t\treturn false;\n\t};\n\t/** @deprecated - renamed to delete */\n\tremove = this.delete.bind(this);\n\n\tupdate = (\n\t\tvalue: Partial<Snapshot>,\n\t\t{\n\t\t\treplaceSubObjects = false,\n\t\t\tmerge = true,\n\t\t}: { replaceSubObjects?: boolean; merge?: boolean } = {\n\t\t\t/**\n\t\t\t * If true, merged sub-objects will be replaced entirely if there's\n\t\t\t * ambiguity about their identity.\n\t\t\t */\n\t\t\treplaceSubObjects: false,\n\t\t\t/**\n\t\t\t * If false, omitted keys will erase their respective fields.\n\t\t\t */\n\t\t\tmerge: true,\n\t\t},\n\t) => {\n\t\tif (\n\t\t\t!merge &&\n\t\t\tthis.fieldSchema.type !== 'any' &&\n\t\t\tthis.fieldSchema.type !== 'map'\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t'Cannot use .update without merge if the field has a strict schema type. merge: false is only available on \"any\" or \"map\" types.',\n\t\t\t);\n\t\t}\n\t\tfor (const [key, field] of Object.entries(value)) {\n\t\t\tif (this.readonlyKeys.includes(key as any)) {\n\t\t\t\tthrow new Error(`Cannot set readonly key ${key.toString()}`);\n\t\t\t}\n\t\t\tconst fieldSchema = this.getChildFieldSchema(key);\n\t\t\tif (fieldSchema) {\n\t\t\t\ttraverseCollectionFieldsAndApplyDefaults(field, fieldSchema);\n\t\t\t}\n\t\t}\n\t\tconst withoutFiles = processValueFiles(value, this.store.addFile);\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createDiff(\n\t\t\t\tthis.getSnapshot(),\n\t\t\t\tassignOid(withoutFiles, this.oid),\n\t\t\t\t{\n\t\t\t\t\tmergeUnknownObjects: !replaceSubObjects,\n\t\t\t\t\tdefaultUndefined: merge,\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\t};\n\n\t/**\n\t * List methods\n\t */\n\n\t/**\n\t * Returns the referent value of an item in the list, used for\n\t * operations which act on items. if the item is an object,\n\t * it will attempt to create an OID reference to it. If it\n\t * is a primitive, it will return the primitive.\n\t */\n\tprivate getItemRefValue = (item: ListItemValue<KeyValue>) => {\n\t\tif (typeof item === 'object') {\n\t\t\tconst itemOid = maybeGetOid(item);\n\t\t\tif (!itemOid || !this.cache.hasOid(itemOid)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot move object ${JSON.stringify(\n\t\t\t\t\t\titem,\n\t\t\t\t\t)} which does not exist in this list`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn itemOid;\n\t\t} else {\n\t\t\treturn item;\n\t\t}\n\t};\n\n\tget length() {\n\t\treturn this.value.length;\n\t}\n\n\tpush = (value: ListItemInit<Init>) => {\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createListPush(\n\t\t\t\tthis.oid,\n\t\t\t\tthis.processInputValue(value, this.value.length),\n\t\t\t),\n\t\t);\n\t};\n\tinsert = (index: number, value: ListItemInit<Init>) => {\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createListInsert(\n\t\t\t\tthis.oid,\n\t\t\t\tindex,\n\t\t\t\tthis.processInputValue(value, index),\n\t\t\t),\n\t\t);\n\t};\n\tmove = (from: number, to: number) => {\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createListMoveByIndex(this.oid, from, to),\n\t\t);\n\t};\n\tmoveItem = (item: ListItemValue<KeyValue>, to: number) => {\n\t\tconst itemRef = this.getItemRefValue(item);\n\t\tif (isObjectRef(itemRef)) {\n\t\t\tthis.addPatches(\n\t\t\t\tthis.store.patchCreator.createListMoveByRef(this.oid, itemRef, to),\n\t\t\t);\n\t\t} else {\n\t\t\tconst index = this.value.indexOf(itemRef);\n\t\t\tthis.addPatches(\n\t\t\t\tthis.store.patchCreator.createListMoveByIndex(this.oid, index, to),\n\t\t\t);\n\t\t}\n\t};\n\tremoveAll = (item: ListItemValue<KeyValue>) => {\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createListRemove(\n\t\t\t\tthis.oid,\n\t\t\t\tthis.getItemRefValue(item),\n\t\t\t),\n\t\t);\n\t};\n\tremoveFirst = (item: ListItemValue<KeyValue>) => {\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createListRemove(\n\t\t\t\tthis.oid,\n\t\t\t\tthis.getItemRefValue(item),\n\t\t\t\t'first',\n\t\t\t),\n\t\t);\n\t};\n\tremoveLast = (item: ListItemValue<KeyValue>) => {\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createListRemove(\n\t\t\t\tthis.oid,\n\t\t\t\tthis.getItemRefValue(item),\n\t\t\t\t'last',\n\t\t\t),\n\t\t);\n\t};\n\tadd = (item: ListItemValue<KeyValue>) => {\n\t\tthis.addPatches(\n\t\t\tthis.store.patchCreator.createListAdd(\n\t\t\t\tthis.oid,\n\t\t\t\tthis.processInputValue(item, this.value.length),\n\t\t\t),\n\t\t);\n\t};\n\thas = (item: ListItemValue<KeyValue>) => {\n\t\tif (typeof item === 'object') {\n\t\t\treturn this.value.some((val: unknown) => {\n\t\t\t\tif (isObjectRef(val)) return val.id === maybeGetOid(item);\n\t\t\t\t// Sets of files don't work right now, there's no way to compare them\n\t\t\t\t// effectively.\n\t\t\t\tif (isFileRef(val)) return false;\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\t\treturn this.value.includes(item);\n\t};\n\n\t// list implements an iterator which maps items to wrapped\n\t// versions\n\t[Symbol.iterator]() {\n\t\tlet index = 0;\n\t\treturn {\n\t\t\tnext: () => {\n\t\t\t\tif (index < this.value.length) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalue: this.get(index++) as ListItemValue<KeyValue>,\n\t\t\t\t\t\tdone: false,\n\t\t\t\t\t} as const;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tvalue: undefined,\n\t\t\t\t\tdone: true,\n\t\t\t\t} as const;\n\t\t\t},\n\t\t};\n\t}\n\n\t// additional access methods\n\n\tprivate getAsWrapped = (): ListItemValue<KeyValue>[] => {\n\t\tif (!this.isList) throw new Error('Cannot map items of a non-list');\n\t\treturn this.value.map(this.wrapValue);\n\t};\n\n\tmap = <U>(callback: (value: ListItemValue<KeyValue>, index: number) => U) => {\n\t\treturn this.getAsWrapped().map(callback);\n\t};\n\n\tfilter = (\n\t\tcallback: (value: ListItemValue<KeyValue>, index: number) => boolean,\n\t) => {\n\t\treturn this.getAsWrapped().filter((val, index) => {\n\t\t\treturn callback(val, index);\n\t\t});\n\t};\n\n\tforEach = (\n\t\tcallback: (value: ListItemValue<KeyValue>, index: number) => void,\n\t) => {\n\t\tthis.getAsWrapped().forEach(callback);\n\t};\n\n\tsome = (predicate: (value: ListItemValue<KeyValue>) => boolean) => {\n\t\treturn this.getAsWrapped().some(predicate);\n\t};\n\n\tevery = (predicate: (value: ListItemValue<KeyValue>) => boolean) => {\n\t\treturn this.getAsWrapped().every(predicate);\n\t};\n\n\tfind = (predicate: (value: ListItemValue<KeyValue>) => boolean) => {\n\t\treturn this.getAsWrapped().find(predicate);\n\t};\n\n\tincludes = (item: ListItemValue<KeyValue>) => {\n\t\treturn this.has(item);\n\t};\n}\n\nexport interface BaseEntity<\n\tInit,\n\tValue extends BaseEntityValue,\n\tSnapshot = DataFromInit<Init>,\n> {\n\tdispose: () => void;\n\tsubscribe<EventName extends keyof EntityEvents>(\n\t\tevent: EventName,\n\t\tcallback: EntityEvents[EventName],\n\t): () => void;\n\tget<Key extends keyof Value>(key: Key): Value[Key];\n\tgetAll(): Value;\n\tgetSnapshot(): Snapshot;\n\treadonly deleted: boolean;\n\treadonly hasSubscribers: boolean;\n}\n\nexport interface ObjectEntity<\n\tInit,\n\tValue extends BaseEntityValue,\n\tSnapshot = DataFromInit<Init>,\n> extends BaseEntity<Init, Value, Snapshot> {\n\tkeys(): string[];\n\tentries(): [string, Exclude<Value[keyof Value], undefined>][];\n\tvalues(): Exclude<Value[keyof Value], undefined>[];\n\tset<Key extends keyof Init>(key: Key, value: Init[Key]): void;\n\tdelete(key: DeletableKeys<Value>): void;\n\tupdate(\n\t\tvalue: Partial<Snapshot>,\n\t\toptions?: { replaceSubObjects?: boolean; merge?: boolean },\n\t): void;\n\treadonly isList: false;\n}\n\nexport interface ListEntity<\n\tInit,\n\tValue extends BaseEntityValue,\n\tSnapshot = DataFromInit<Init>,\n> extends Iterable<ListItemValue<Value>>,\n\t\tBaseEntity<Init, Value, Snapshot> {\n\treadonly isList: true;\n\treadonly length: number;\n\tpush(value: ListItemInit<Init>): void;\n\tinsert(index: number, value: ListItemInit<Init>): void;\n\tmove(from: number, to: number): void;\n\tmoveItem(item: ListItemValue<Value>, to: number): void;\n\t/**\n\t * A Set operation which adds a value if an equivalent value is not already present.\n\t * Object values are never the same.\n\t */\n\tadd(value: ListItemValue<Value>): void;\n\tremoveAll(item: ListItemValue<Value>): void;\n\tremoveFirst(item: ListItemValue<Value>): void;\n\tremoveLast(item: ListItemValue<Value>): void;\n\tmap<U>(callback: (value: ListItemValue<Value>, index: number) => U): U[];\n\tfilter(\n\t\tcallback: (value: ListItemValue<Value>, index: number) => boolean,\n\t): ListItemValue<Value>[];\n\tdelete(index: number): void;\n\thas(value: ListItemValue<Value>): boolean;\n\tforEach(callback: (value: ListItemValue<Value>, index: number) => void): void;\n\tsome(predicate: (value: ListItemValue<Value>) => boolean): boolean;\n\tevery(predicate: (value: ListItemValue<Value>) => boolean): boolean;\n\tfind(\n\t\tpredicate: (value: ListItemValue<Value>) => boolean,\n\t): ListItemValue<Value> | undefined;\n\tincludes(value: ListItemValue<Value>): boolean;\n}\n\nexport type AnyEntity<\n\tInit,\n\tKeyValue extends BaseEntityValue,\n\tSnapshot extends any,\n> =\n\t| ListEntity<Init, KeyValue, Snapshot>\n\t| ObjectEntity<Init, KeyValue, Snapshot>;\n\ntype ListItemValue<KeyValue> = KeyValue extends Array<infer T> ? T : never;\ntype ListItemInit<Init> = Init extends Array<infer T> ? T : never;\n\nexport type EntityDestructured<T extends AnyEntity<any, any, any> | null> =\n\t| (T extends ListEntity<any, infer KeyValue, any>\n\t\t\t? KeyValue\n\t\t\t: T extends ObjectEntity<any, infer KeyValue, any>\n\t\t\t? KeyValue\n\t\t\t: never)\n\t| (T extends null ? null : never);\n", "export class Resolvable<T> {\n\treadonly promise: Promise<T>;\n\tprivate _resolve: (value: T) => void;\n\tprivate _reject: (reason?: any) => void;\n\n\tconstructor() {\n\t\tlet resolve: (value: T) => void;\n\t\tlet reject: (reason?: any) => void;\n\t\tthis.promise = new Promise((res, rej) => {\n\t\t\tresolve = res;\n\t\t\treject = rej;\n\t\t});\n\t\tthis._resolve = resolve!;\n\t\tthis._reject = reject!;\n\t}\n\n\tresolve(value: T) {\n\t\tthis._resolve(value);\n\t}\n\n\treject(reason?: any) {\n\t\tthis._reject(reason);\n\t}\n}\n", "import {\n\tapplyPatch,\n\tassignOid,\n\tcloneDeep,\n\tcompareTimestampSchemaVersions,\n\tDocumentBaseline,\n\tEventSubscriber,\n\tObjectIdentifier,\n\tOperation,\n\tStorageFieldSchema,\n} from '@verdant-web/common';\nimport { Entity, refreshEntity, StoreTools } from './Entity.js';\nimport type { EntityStore } from './EntityStore.js';\nimport { Context } from '../context.js';\nimport { TaggedOperation } from '../types.js';\nimport { Resolvable } from '../utils/Resolvable.js';\n\n/**\n * Local operations: operations on this client that haven't\n * yet been synced and are only applied in-memory. These are\n * always applied after all other operations, they are conceptually\n * 'in the future' as they are not yet synced or stored.\n *\n * Confirmed operations: operations that have been synced and\n * stored in the database.\n *\n * Unconfirmed operations: operations received from sync which\n * have not been stored yet and are only in memory. These exist\n * because new incoming operations are synchronously applied to\n * cached entities while storage goes on async.\n */\nexport class DocumentFamilyCache extends EventSubscriber<\n\tRecord<`change:${string}`, () => void> & {\n\t\t'change:*': (oid: ObjectIdentifier) => void;\n\t}\n> {\n\treadonly oid: ObjectIdentifier;\n\tprivate operationsMap: Map<ObjectIdentifier, TaggedOperation[]>;\n\tprivate localOperationsMap: Map<ObjectIdentifier, Operation[]>;\n\tprivate baselinesMap: Map<ObjectIdentifier, DocumentBaseline>;\n\n\tprivate entities: Map<ObjectIdentifier, WeakRef<Entity>> = new Map();\n\n\tprivate context;\n\tprivate storeTools: StoreTools;\n\n\tprivate _initialized = new Resolvable<boolean>();\n\tget initializedPromise() {\n\t\treturn this._initialized.promise;\n\t}\n\tsetInitialized = () => {\n\t\tthis._initialized.resolve(true);\n\t};\n\n\tconstructor({\n\t\toid,\n\t\tstore,\n\t\tcontext,\n\t}: {\n\t\toid: ObjectIdentifier;\n\t\tstore: EntityStore;\n\t\tcontext: Context;\n\t}) {\n\t\tsuper();\n\t\tthis.oid = oid;\n\t\tthis.operationsMap = new Map();\n\t\tthis.localOperationsMap = new Map();\n\t\tthis.baselinesMap = new Map();\n\t\tthis.storeTools = {\n\t\t\taddLocalOperations: store.addLocalOperations,\n\t\t\tpatchCreator: store.meta.patchCreator,\n\t\t\taddFile: store.files.add,\n\t\t\tgetFile: store.files.get,\n\t\t\ttime: store.meta.time,\n\t\t\tnow: store.meta.now,\n\t\t};\n\t\tthis.context = context;\n\t}\n\n\tget weakRef() {\n\t\treturn this.context.weakRef;\n\t}\n\n\tinsertLocalOperations = (operations: Operation[]) => {\n\t\tconst oidSet = new Set<ObjectIdentifier>();\n\t\tfor (const operation of operations) {\n\t\t\tconst { oid } = operation;\n\t\t\toidSet.add(oid);\n\t\t\tconst existingOperations = this.localOperationsMap.get(oid) || [];\n\t\t\texistingOperations.push(operation);\n\t\t\tthis.localOperationsMap.set(oid, existingOperations);\n\t\t}\n\t\tfor (const oid of oidSet) {\n\t\t\tconst entityRef = this.entities.get(oid);\n\t\t\tconst entity = entityRef?.deref();\n\t\t\tif (entity) {\n\t\t\t\trefreshEntity(entity, { isLocal: true });\n\t\t\t\tthis.emit(`change:${oid}`);\n\t\t\t\tthis.emit('change:*', oid);\n\t\t\t}\n\t\t}\n\t};\n\n\tinsertOperations = (\n\t\toperations: TaggedOperation[],\n\t\tinfo: {\n\t\t\tisLocal: boolean;\n\t\t\taffectedOids?: Set<ObjectIdentifier>;\n\t\t},\n\t) => {\n\t\tfor (const operation of operations) {\n\t\t\tconst { oid } = operation;\n\t\t\tinfo.affectedOids?.add(oid);\n\t\t\tconst existingOperations = this.operationsMap.get(oid) || [];\n\t\t\t// insert in order of timestamp\n\t\t\tconst index = existingOperations.findIndex(\n\t\t\t\t(op) => op.timestamp >= operation.timestamp,\n\t\t\t);\n\t\t\t// ensure the operation doesn't already exist in this position\n\t\t\tif (index !== -1) {\n\t\t\t\tif (existingOperations[index].timestamp === operation.timestamp) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\texistingOperations.splice(index, 0, operation);\n\t\t\t} else {\n\t\t\t\texistingOperations.push(operation);\n\t\t\t}\n\t\t\tthis.operationsMap.set(oid, existingOperations);\n\n\t\t\t// FIXME: seems inefficient\n\t\t\tconst unconfirmedOperations = this.localOperationsMap.get(oid);\n\t\t\tif (unconfirmedOperations) {\n\t\t\t\tthis.localOperationsMap.set(\n\t\t\t\t\toid,\n\t\t\t\t\tunconfirmedOperations.filter(\n\t\t\t\t\t\t(op) => op.timestamp !== operation.timestamp,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Insert new baselines for objects in this family.\n\t * Automatically drops operations before the new baseline.\n\t */\n\tinsertBaselines = (\n\t\tbaselines: DocumentBaseline[],\n\t\t{\n\t\t\taffectedOids,\n\t\t}: { isLocal: boolean; affectedOids?: Set<ObjectIdentifier> },\n\t) => {\n\t\tfor (const baseline of baselines) {\n\t\t\tconst { oid } = baseline;\n\t\t\t// opt out if our baseline is newer.\n\t\t\tconst existing = this.baselinesMap.get(oid);\n\t\t\tif (existing?.timestamp && existing.timestamp >= baseline.timestamp) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\taffectedOids?.add(oid);\n\t\t\tthis.baselinesMap.set(oid, baseline);\n\t\t\t// drop operations before the baseline\n\t\t\tconst ops = this.operationsMap.get(oid) || [];\n\t\t\twhile (ops[0]?.timestamp < baseline.timestamp) {\n\t\t\t\tops.shift();\n\t\t\t}\n\t\t}\n\t};\n\n\taddData = ({\n\t\toperations,\n\t\tbaselines,\n\t\treset,\n\t\tisLocal,\n\t}: {\n\t\toperations: TaggedOperation[];\n\t\tbaselines: DocumentBaseline[];\n\t\treset?: boolean;\n\t\tisLocal?: boolean;\n\t}) => {\n\t\tif (reset) {\n\t\t\tthis.operationsMap.clear();\n\t\t\tthis.baselinesMap.clear();\n\t\t}\n\t\tconst info = {\n\t\t\tisLocal: isLocal || false,\n\t\t\taffectedOids: new Set<ObjectIdentifier>(),\n\t\t};\n\t\tthis.insertBaselines(baselines, info);\n\t\t// for reset scenario, don't immediately update entities;\n\t\t// we will update all of them in one go.\n\t\tthis.insertOperations(operations, info);\n\t\tif (reset) {\n\t\t\tfor (const entityRef of this.entities.values()) {\n\t\t\t\tconst entity = entityRef.deref();\n\t\t\t\tif (entity) {\n\t\t\t\t\trefreshEntity(entity, info);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const oid of info.affectedOids) {\n\t\t\t\tconst entityRef = this.entities.get(oid);\n\t\t\t\tconst entity = entityRef?.deref();\n\t\t\t\tif (entity) {\n\t\t\t\t\trefreshEntity(entity, info);\n\t\t\t\t\tthis.emit(`change:${oid}`);\n\t\t\t\t\tthis.emit('change:*', oid);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tprivate applyOperations = (\n\t\tview: any,\n\t\tdeleted: boolean,\n\t\toperations: Operation[],\n\t\tafter?: string,\n\t): {\n\t\tview: any;\n\t\tdeleted: boolean;\n\t\tempty: boolean;\n\t} => {\n\t\tlet futureSeen: string | undefined = undefined;\n\t\tconst now = this.storeTools.now;\n\t\tfor (const operation of operations) {\n\t\t\tif (after && operation.timestamp <= after) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (compareTimestampSchemaVersions(operation.timestamp, now) > 0) {\n\t\t\t\t// we don't apply patches from future versions\n\t\t\t\tfutureSeen = operation.timestamp;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (operation.data.op === 'delete') {\n\t\t\t\tdeleted = true;\n\t\t\t} else {\n\t\t\t\tview = applyPatch(view, operation.data);\n\t\t\t\tif (operation.data.op === 'initialize') {\n\t\t\t\t\tdeleted = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (futureSeen) {\n\t\t\tthis.context.globalEvents.emit('futureSeen', futureSeen);\n\t\t}\n\t\treturn { view, deleted, empty: !view && !operations.length };\n\t};\n\n\tcomputeView = (oid: ObjectIdentifier) => {\n\t\tif (\n\t\t\tthis.baselinesMap.size === 0 &&\n\t\t\tthis.operationsMap.size === 0 &&\n\t\t\tthis.localOperationsMap.size === 0\n\t\t) {\n\t\t\tthis.context.log('debug', `Entity ${oid} accessed with no data at all`);\n\t\t\treturn { view: null, deleted: true, lastTimestamp: null };\n\t\t}\n\t\tconst confirmed = this.computeConfirmedView(oid);\n\t\tconst unconfirmedOperations = this.localOperationsMap.get(oid) || [];\n\t\tif (confirmed.empty && !unconfirmedOperations.length) {\n\t\t\tthis.context.log(\n\t\t\t\t'debug',\n\t\t\t\t`Entity ${oid} accessed with no local data at all`,\n\t\t\t);\n\t\t\treturn { view: null, deleted: true, lastTimestamp: null };\n\t\t}\n\t\tlet { view, deleted } = this.applyOperations(\n\t\t\tconfirmed.view,\n\t\t\tconfirmed.deleted,\n\t\t\tunconfirmedOperations,\n\t\t);\n\t\tif (view) {\n\t\t\tassignOid(view, oid);\n\t\t}\n\t\treturn { view, deleted, lastTimestamp: this.getLastTimestamp(oid) };\n\t};\n\n\tcomputeConfirmedView = (\n\t\toid: ObjectIdentifier,\n\t): {\n\t\tview: any;\n\t\tdeleted: boolean;\n\t\tempty: boolean;\n\t} => {\n\t\tconst baseline = this.baselinesMap.get(oid);\n\t\tconst operations = this.operationsMap.get(oid) || [];\n\t\tconst snapshot = cloneDeep(baseline?.snapshot || undefined);\n\t\tconst result = this.applyOperations(\n\t\t\tsnapshot,\n\t\t\t!snapshot,\n\t\t\toperations,\n\t\t\tbaseline?.timestamp,\n\t\t);\n\t\tif (result.view) {\n\t\t\tassignOid(result.view, oid);\n\t\t}\n\t\tif (result.empty) {\n\t\t\tthis.context.log(\n\t\t\t\t'debug',\n\t\t\t\t`Entity ${oid} accessed with no confirmed data`,\n\t\t\t);\n\t\t}\n\t\treturn result;\n\t};\n\n\tgetLastTimestamp = (oid: ObjectIdentifier) => {\n\t\tlet operations = this.localOperationsMap.get(oid);\n\t\tif (!operations?.length) {\n\t\t\toperations = this.operationsMap.get(oid) || [];\n\t\t}\n\t\tlet logicalTimestamp: string | null = null;\n\t\tif (operations.length) {\n\t\t\tlogicalTimestamp = operations[operations.length - 1]?.timestamp;\n\t\t} else {\n\t\t\tlogicalTimestamp = this.baselinesMap.get(oid)?.timestamp ?? null;\n\t\t}\n\t\tif (!logicalTimestamp) return null;\n\t\treturn this.storeTools.time.getWallClockTime(logicalTimestamp);\n\t};\n\n\tgetEntity = (\n\t\toid: ObjectIdentifier,\n\t\tschema: StorageFieldSchema,\n\t\tparent?: Entity,\n\t\treadonlyKeys?: string[],\n\t): Entity => {\n\t\tlet entityRef = this.entities.get(oid);\n\t\tlet entity = entityRef?.deref();\n\t\tif (!entity) {\n\t\t\tentity = new Entity({\n\t\t\t\toid,\n\t\t\t\tcache: this,\n\t\t\t\tfieldSchema: schema,\n\t\t\t\tstore: this.storeTools,\n\t\t\t\tparent,\n\t\t\t\treadonlyKeys,\n\t\t\t});\n\n\t\t\t// immediately add to cache and queue a removal if nobody subscribed\n\t\t\tthis.entities.set(oid, this.context.weakRef(entity));\n\t\t}\n\n\t\treturn entity as any;\n\t};\n\n\thasOid = (oid: ObjectIdentifier) => {\n\t\treturn this.operationsMap.has(oid) || this.baselinesMap.has(oid);\n\t};\n\n\tdispose = () => {\n\t\tthis.entities.forEach((entity) => entity.deref()?.dispose());\n\t\tthis.entities.clear();\n\t};\n\n\treset = ({\n\t\toperations,\n\t\tbaselines,\n\t\tdropExistingUnconfirmed: dropUnconfirmed = false,\n\t\tunconfirmedOperations,\n\t\tdropAll,\n\t}: {\n\t\toperations: TaggedOperation[];\n\t\tunconfirmedOperations?: Operation[];\n\t\tbaselines: DocumentBaseline[];\n\t\t/**\n\t\t * Whether to drop operations which are only in-memory. Unconfirmed operations\n\t\t * will not be restored from storage until they are persisted, so it's not advisable\n\t\t * to use this unless the intention is to completely clear the entities.\n\t\t */\n\t\tdropExistingUnconfirmed?: boolean;\n\t\t/**\n\t\t * Drop unconfirmed and confirmed data before resetting to incoming data.\n\t\t * This is dangerous due to race conditions. Only use when a full reset is\n\t\t * required.\n\t\t */\n\t\tdropAll?: boolean;\n\t}) => {\n\t\tthis.context.log(\n\t\t\t'debug',\n\t\t\t`Resetting cache for ${this.oid} with ${operations.length} ops and ${baselines.length} baselines, dropUnconfirmed=${dropUnconfirmed}`,\n\t\t);\n\t\tconst info = { isLocal: false, affectedOids: new Set<ObjectIdentifier>() };\n\n\t\t// NOTE: not clearing these maps... there are even more\n\t\t// race conditions where we begin opening a cache, queue up a\n\t\t// reset, then receive incoming operations before the reset\n\t\t// actually hits this function, so those incoming ops are\n\t\t// dropped.\n\t\t// FIXME: include this in a future refactor of this\n\t\t// whole system.\n\n\t\tif (dropAll) this.baselinesMap.clear();\n\t\tthis.insertBaselines(baselines, info);\n\n\t\tif (dropAll) this.operationsMap.clear();\n\t\tthis.insertOperations(operations, info);\n\n\t\tif (unconfirmedOperations || dropUnconfirmed) {\n\t\t\tthis.localOperationsMap.clear();\n\t\t\tif (unconfirmedOperations) {\n\t\t\t\tthis.insertLocalOperations(unconfirmedOperations);\n\t\t\t}\n\t\t}\n\n\t\tfor (const oid of this.entities.keys()) {\n\t\t\tconst entityRef = this.entities.get(oid);\n\t\t\tconst entity = entityRef?.deref();\n\t\t\tif (entity) {\n\t\t\t\trefreshEntity(entity, info);\n\t\t\t\tthis.emit(`change:${oid}`);\n\t\t\t\tthis.emit('change:*', oid);\n\t\t\t}\n\t\t}\n\t};\n}\n", "import {\n\tassert,\n\tassignIndexValues,\n\tassignOid,\n\tassignOidPropertiesToAllSubObjects,\n\tBatcher,\n\tcloneDeep,\n\tdecomposeOid,\n\tDocumentBaseline,\n\tEventSubscriber,\n\tgenerateId,\n\tgetIndexValues,\n\tgetOidRoot,\n\tgetUndoOperations,\n\tgroupBaselinesByRootOid,\n\tgroupPatchesByIdentifier,\n\tgroupPatchesByRootOid,\n\tObjectIdentifier,\n\tOperation,\n\tremoveOidsFromAllSubObjects,\n\tStorageCollectionSchema,\n\tStorageObjectFieldSchema,\n} from '@verdant-web/common';\nimport { Context } from '../context.js';\nimport { FileManager } from '../files/FileManager.js';\nimport { processValueFiles } from '../files/utils.js';\nimport { storeRequestPromise } from '../idb.js';\nimport { Metadata } from '../metadata/Metadata.js';\nimport { DocumentFamilyCache } from './DocumentFamiliyCache.js';\nimport { TaggedOperation } from '../types.js';\n\nconst DEFAULT_BATCH_KEY = '@@default';\n\nexport interface OperationBatch {\n\trun: (fn: () => void) => this;\n\tflush: () => Promise<void>;\n\tdiscard: () => void;\n}\n\nexport class EntityStore {\n\tprivate documentFamilyCaches = new Map<string, DocumentFamilyCache>();\n\n\tpublic meta;\n\tprivate operationBatcher;\n\tpublic files;\n\n\tprivate context: Context;\n\n\tprivate unsubscribes: (() => void)[] = [];\n\n\tprivate _disposed = false;\n\n\tprivate get log() {\n\t\treturn this.context.log;\n\t}\n\tprivate get db() {\n\t\treturn this.context.documentDb;\n\t}\n\tprivate get undoHistory() {\n\t\treturn this.context.undoHistory;\n\t}\n\tprivate get schema() {\n\t\treturn this.context.schema;\n\t}\n\n\tprivate currentBatchKey = DEFAULT_BATCH_KEY;\n\tprivate defaultBatchTimeout: number;\n\n\tconstructor({\n\t\tcontext,\n\t\tmeta,\n\t\tbatchTimeout = 200,\n\t\tfiles,\n\t}: {\n\t\tcontext: Context;\n\t\tmeta: Metadata;\n\t\tfiles: FileManager;\n\t\tbatchTimeout?: number;\n\t}) {\n\t\tthis.context = context;\n\n\t\tthis.defaultBatchTimeout = batchTimeout;\n\t\tthis.meta = meta;\n\t\tthis.files = files;\n\t\tthis.operationBatcher = new Batcher<Operation, { undoable?: boolean }>(\n\t\t\tthis.flushOperations,\n\t\t);\n\t\t// initialize default batch\n\t\tthis.operationBatcher.add({\n\t\t\tkey: DEFAULT_BATCH_KEY,\n\t\t\titems: [],\n\t\t\tmax: 100,\n\t\t\ttimeout: batchTimeout,\n\t\t\tuserData: { undoable: true },\n\t\t});\n\t\tthis.unsubscribes.push(this.meta.subscribe('rebase', this.handleRebase));\n\t}\n\n\tsetContext = (context: Context) => {\n\t\tthis.context = context;\n\t};\n\n\tprivate getDocumentSchema = (\n\t\toid: ObjectIdentifier,\n\t): { schema: StorageObjectFieldSchema | null; readonlyKeys: string[] } => {\n\t\tconst { collection } = decomposeOid(oid);\n\t\tif (!this.schema.collections[collection]) {\n\t\t\tthis.log('warn', `Missing schema for collection: ${collection}`);\n\t\t\treturn { schema: null, readonlyKeys: [] };\n\t\t}\n\t\tconst schema = this.schema.collections[collection];\n\t\treturn {\n\t\t\treadonlyKeys: [schema.primaryKey],\n\t\t\tschema: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: schema.fields as any,\n\t\t\t} as const,\n\t\t};\n\t};\n\n\tprivate refreshFamilyCache = async (\n\t\tfamilyCache: DocumentFamilyCache,\n\t\tdropUnconfirmed = false,\n\t\tdropAll = false,\n\t) => {\n\t\t// avoid writing to disposed db\n\t\tif (this._disposed) {\n\t\t\tthis.context.log(\n\t\t\t\t'debug',\n\t\t\t\t`EntityStore is disposed, not refreshing ${familyCache.oid} cache`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// metadata must be loaded from database to initialize family cache\n\t\tconst transaction = this.meta.createTransaction([\n\t\t\t'baselines',\n\t\t\t'operations',\n\t\t]);\n\n\t\tconst baselines: DocumentBaseline[] = [];\n\t\tconst operations: TaggedOperation[] = [];\n\n\t\tawait Promise.all([\n\t\t\tthis.meta.baselines.iterateOverAllForDocument(\n\t\t\t\tfamilyCache.oid,\n\t\t\t\t(baseline) => {\n\t\t\t\t\tbaselines.push(baseline);\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttransaction,\n\t\t\t\t\tmode: 'readwrite',\n\t\t\t\t},\n\t\t\t),\n\t\t\tthis.meta.operations.iterateOverAllOperationsForDocument(\n\t\t\t\tfamilyCache.oid,\n\t\t\t\t(op) => {\n\t\t\t\t\t(op as TaggedOperation).confirmed = true;\n\t\t\t\t\toperations.push(op as TaggedOperation);\n\t\t\t\t},\n\t\t\t\t{ transaction, mode: 'readwrite' },\n\t\t\t),\n\t\t]);\n\t\tfamilyCache.reset({\n\t\t\toperations,\n\t\t\tbaselines,\n\t\t\tdropExistingUnconfirmed: dropUnconfirmed,\n\t\t\tdropAll,\n\t\t});\n\t};\n\n\tprivate openFamilyCache = async (oid: ObjectIdentifier) => {\n\t\tconst documentOid = getOidRoot(oid);\n\t\tlet familyCache = this.documentFamilyCaches.get(documentOid);\n\t\tif (!familyCache) {\n\t\t\tthis.context.log('debug', 'opening family cache for', documentOid);\n\t\t\t// metadata must be loaded from database to initialize family cache\n\t\t\tfamilyCache = new DocumentFamilyCache({\n\t\t\t\toid: documentOid,\n\t\t\t\tstore: this,\n\t\t\t\tcontext: this.context,\n\t\t\t});\n\n\t\t\t// PROBLEM: because the next line is async, it yields to\n\t\t\t// queued promises which may need data from this cache,\n\t\t\t// but the cache is empty. But if we move the set to\n\t\t\t// after the async, we can clobber an existing cache\n\t\t\t// with race conditions...\n\t\t\t// So as an attempt to fix that, I've added a promise\n\t\t\t// on DocumentFamilyCache which I manually resolve\n\t\t\t// with setInitialized, then await initializedPromise\n\t\t\t// further down even if there was a cache hit.\n\t\t\t// Surely there is a better pattern for this.\n\t\t\t// FIXME:\n\t\t\tthis.documentFamilyCaches.set(documentOid, familyCache);\n\t\t\tawait this.refreshFamilyCache(familyCache);\n\t\t\tfamilyCache.setInitialized();\n\n\t\t\t// this.unsubscribes.push(\n\t\t\t// \tfamilyCache.subscribe('change:*', this.onEntityChange),\n\t\t\t// );\n\n\t\t\t// TODO: cleanup cache when all documents are disposed\n\t\t}\n\t\tawait familyCache.initializedPromise;\n\n\t\treturn familyCache;\n\t};\n\n\tprivate onEntityChange = async (oid: ObjectIdentifier) => {\n\t\t// queueMicrotask(() => this.writeDocumentToStorage(oid));\n\t};\n\n\tprivate writeDocumentToStorage = async (oid: ObjectIdentifier) => {\n\t\tif (this._disposed) {\n\t\t\tthis.log('warn', 'EntityStore is disposed, not writing to storage');\n\t\t\treturn;\n\t\t}\n\t\tconst rootOid = getOidRoot(oid);\n\t\tconst { id, collection } = decomposeOid(rootOid);\n\t\tconst entity = await this.get(rootOid);\n\n\t\tif (this._disposed) {\n\t\t\tthis.log('warn', 'EntityStore is disposed, not writing to storage');\n\t\t\treturn;\n\t\t}\n\n\t\tconst snapshot = entity?.getSnapshot();\n\t\tif (snapshot) {\n\t\t\tconst stored = getIndexValues(\n\t\t\t\tthis.schema.collections[collection],\n\t\t\t\tsnapshot,\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tconst tx = this.db.transaction(collection, 'readwrite');\n\t\t\t\tconst store = tx.objectStore(collection);\n\t\t\t\tawait storeRequestPromise(store.put(stored));\n\t\t\t\tthis.log('info', '\uD83D\uDCDD', 'wrote', collection, id, 'to storage', stored);\n\t\t\t} catch (err) {\n\t\t\t\t// if the document can't be written, something's very wrong :(\n\t\t\t\t// log the error and move on...\n\t\t\t\tthis.log(\n\t\t\t\t\t\"\u26A0\uFE0F CRITICAL: possibly corrupt data couldn't be written to queryable storage. This is probably a bug in verdant! Please report at https://github.com/a-type/verdant/issues\",\n\t\t\t\t\t'\\n',\n\t\t\t\t\t'Invalid data:',\n\t\t\t\t\tJSON.stringify(stored),\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tconst tx = this.db.transaction(collection, 'readwrite');\n\t\t\tconst store = tx.objectStore(collection);\n\t\t\tawait storeRequestPromise(store.delete(id));\n\t\t\tthis.log('info', '\u274C', 'deleted', collection, id, 'from storage');\n\t\t}\n\t};\n\n\tget = async (oid: ObjectIdentifier) => {\n\t\tconst familyCache = await this.openFamilyCache(oid);\n\t\tconst { schema, readonlyKeys } = this.getDocumentSchema(oid);\n\t\tif (!schema) {\n\t\t\treturn null;\n\t\t}\n\t\treturn familyCache.getEntity(oid, schema, undefined, readonlyKeys);\n\t};\n\n\t/**\n\t * Advanced usage!\n\t * Immediately returns an entity if it exists in the memory cache. An\n\t * entity would be cached if it has been retrieved by a live query.\n\t */\n\tgetCached = (oid: ObjectIdentifier) => {\n\t\tconst cache = this.documentFamilyCaches.get(oid);\n\t\tif (cache) {\n\t\t\tconst { schema, readonlyKeys } = this.getDocumentSchema(oid);\n\t\t\tif (!schema) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn cache.getEntity(oid, schema, undefined, readonlyKeys);\n\t\t}\n\t\treturn null;\n\t};\n\n\t/**\n\t * Creates a new document and returns an Entity for it. The created\n\t * document is submitted to storage and sync.\n\t */\n\tcreate = async (\n\t\tinitial: any,\n\t\toid: ObjectIdentifier,\n\t\toptions: { undoable?: boolean },\n\t) => {\n\t\t// remove all OID associations from initial data\n\t\tremoveOidsFromAllSubObjects(initial);\n\t\t// first grab any file and replace them with refs\n\t\tconst processed = processValueFiles(initial, this.files.add);\n\n\t\tassignOid(processed, oid);\n\t\tconst operations = this.meta.patchCreator.createInitialize(processed, oid);\n\t\tconst familyCache = await this.openFamilyCache(oid);\n\t\tfamilyCache.insertLocalOperations(operations);\n\t\t// don't enqueue these, submit as distinct operation.\n\t\t// we do this so it can be immediately queryable from storage...\n\t\t// only holding it in memory would introduce lag before it shows up\n\t\t// in other queries.\n\t\tawait this.submitOperations(operations, options);\n\t\tconst { schema, readonlyKeys } = this.getDocumentSchema(oid);\n\t\tif (!schema) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot create a document in the ${\n\t\t\t\t\tdecomposeOid(oid).collection\n\t\t\t\t} collection; it is not defined in the current schema version.`,\n\t\t\t);\n\t\t}\n\t\treturn familyCache.getEntity(oid, schema, undefined, readonlyKeys);\n\t};\n\n\tprivate addOperationsToOpenCaches = async (\n\t\toperations: Operation[],\n\t\tinfo: { isLocal: boolean; confirmed?: boolean },\n\t) => {\n\t\tconst operationsByOid = groupPatchesByRootOid(operations);\n\t\tconst oids = Object.keys(operationsByOid);\n\t\toids.forEach((oid) => {\n\t\t\tconst familyCache = this.documentFamilyCaches.get(oid);\n\t\t\tif (familyCache) {\n\t\t\t\tthis.log(\n\t\t\t\t\t'adding',\n\t\t\t\t\tinfo.confirmed ? 'confirmed' : 'unconfirmed',\n\t\t\t\t\t'operations to cache',\n\t\t\t\t\toid,\n\t\t\t\t\toperationsByOid[oid].length,\n\t\t\t\t);\n\t\t\t\tif (info.isLocal) {\n\t\t\t\t\tfamilyCache.insertLocalOperations(operationsByOid[oid]);\n\t\t\t\t} else {\n\t\t\t\t\tfamilyCache.insertOperations(operationsByOid[oid], info);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t};\n\n\tprivate addBaselinesToOpenCaches = async (\n\t\tbaselines: DocumentBaseline[],\n\t\tinfo: { isLocal: boolean },\n\t) => {\n\t\tconst baselinesByOid = groupBaselinesByRootOid(baselines);\n\t\tconst oids = Object.keys(baselinesByOid);\n\t\toids.forEach((oid) => {\n\t\t\tconst cache = this.documentFamilyCaches.get(oid);\n\t\t\tif (cache) {\n\t\t\t\tthis.log(\n\t\t\t\t\t'adding',\n\t\t\t\t\t'baselines to cache',\n\t\t\t\t\toid,\n\t\t\t\t\tbaselinesByOid[oid].length,\n\t\t\t\t);\n\t\t\t\tcache.insertBaselines(baselinesByOid[oid], info);\n\t\t\t}\n\t\t});\n\t};\n\n\tprivate addDataToOpenCaches = ({\n\t\tbaselines,\n\t\toperations,\n\t\treset,\n\t\tisLocal,\n\t}: {\n\t\tbaselines: DocumentBaseline[];\n\t\toperations: TaggedOperation[];\n\t\treset?: boolean;\n\t\tisLocal?: boolean;\n\t}) => {\n\t\tconst baselinesByDocumentOid = groupBaselinesByRootOid(baselines);\n\t\tconst operationsByDocumentOid = groupPatchesByRootOid(operations);\n\t\tconst allDocumentOids = Array.from(\n\t\t\tnew Set(\n\t\t\t\tObject.keys(baselinesByDocumentOid).concat(\n\t\t\t\t\tObject.keys(operationsByDocumentOid),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\t\tfor (const oid of allDocumentOids) {\n\t\t\tconst familyCache = this.documentFamilyCaches.get(oid);\n\t\t\tif (familyCache) {\n\t\t\t\tfamilyCache.addData({\n\t\t\t\t\toperations: operationsByDocumentOid[oid] || [],\n\t\t\t\t\tbaselines: baselinesByDocumentOid[oid] || [],\n\t\t\t\t\treset,\n\t\t\t\t\tisLocal,\n\t\t\t\t});\n\t\t\t\tthis.log(\n\t\t\t\t\t'debug',\n\t\t\t\t\t'Added data to cache for',\n\t\t\t\t\toid,\n\t\t\t\t\toperationsByDocumentOid[oid]?.length ?? 0,\n\t\t\t\t\t'operations',\n\t\t\t\t\tbaselinesByDocumentOid[oid]?.length ?? 0,\n\t\t\t\t\t'baselines',\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.log(\n\t\t\t\t\t'debug',\n\t\t\t\t\t'Could not add data to cache for',\n\t\t\t\t\toid,\n\t\t\t\t\t'because it is not open',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn allDocumentOids;\n\t};\n\n\taddData = async ({\n\t\toperations,\n\t\tbaselines,\n\t\treset,\n\t}: {\n\t\toperations: Operation[];\n\t\tbaselines: DocumentBaseline[];\n\t\treset?: boolean;\n\t}) => {\n\t\tif (this._disposed) {\n\t\t\tthis.log('warn', 'EntityStore is disposed, not adding data');\n\t\t\treturn;\n\t\t}\n\t\t// convert operations to tagged operations with confirmed = false\n\t\t// while we process and store them. this is in-place so as to\n\t\t// not allocate a bunch of objects...\n\t\tconst taggedOperations = operations as TaggedOperation[];\n\t\tfor (const op of taggedOperations) {\n\t\t\top.confirmed = false;\n\t\t}\n\n\t\tlet allDocumentOids: string[] = [];\n\t\t// in a reset scenario, it only makes things confusing if we\n\t\t// optimistically apply incoming operations, since the local\n\t\t// history is out of sync\n\t\tif (reset) {\n\t\t\tthis.log(\n\t\t\t\t'Resetting local store to replicate remote synced data',\n\t\t\t\tbaselines.length,\n\t\t\t\t'baselines, and',\n\t\t\t\toperations.length,\n\t\t\t\t'operations',\n\t\t\t);\n\t\t\tawait this.meta.reset();\n\t\t\tawait this.resetStoredDocuments();\n\t\t\tallDocumentOids = Array.from(\n\t\t\t\tnew Set(\n\t\t\t\t\tbaselines\n\t\t\t\t\t\t.map((b) => getOidRoot(b.oid))\n\t\t\t\t\t\t.concat(operations.map((o) => getOidRoot(o.oid))),\n\t\t\t\t),\n\t\t\t);\n\t\t} else {\n\t\t\t// first, synchronously add data to any open caches for immediate change propagation\n\t\t\tallDocumentOids = this.addDataToOpenCaches({\n\t\t\t\toperations: taggedOperations,\n\t\t\t\tbaselines,\n\t\t\t\treset,\n\t\t\t});\n\t\t}\n\n\t\t// then, asynchronously add data to storage\n\t\tawait this.meta.insertRemoteBaselines(baselines);\n\t\tawait this.meta.insertRemoteOperations(operations);\n\n\t\tif (reset) {\n\t\t\tawait this.refreshAllCaches(true, true);\n\t\t}\n\n\t\t// recompute all affected documents for querying\n\t\tfor (const oid of allDocumentOids) {\n\t\t\tawait this.writeDocumentToStorage(oid);\n\t\t}\n\n\t\t// notify active queries\n\t\tconst affectedCollections = Array.from(\n\t\t\tnew Set<string>(\n\t\t\t\tallDocumentOids.map((oid) => decomposeOid(oid).collection),\n\t\t\t),\n\t\t);\n\t\tthis.context.log('changes to collections', affectedCollections);\n\t\tthis.context.entityEvents.emit('collectionsChanged', affectedCollections);\n\t};\n\n\taddLocalOperations = async (operations: Operation[]) => {\n\t\tthis.log('Adding local operations', operations.length);\n\t\tthis.addOperationsToOpenCaches(operations, {\n\t\t\tisLocal: true,\n\t\t\tconfirmed: false,\n\t\t});\n\t\tthis.operationBatcher.add({\n\t\t\tkey: this.currentBatchKey,\n\t\t\titems: operations,\n\t\t});\n\t};\n\n\tbatch = ({\n\t\tundoable = true,\n\t\tbatchName = generateId(),\n\t\tmax = null,\n\t\ttimeout = this.defaultBatchTimeout,\n\t}: {\n\t\tundoable?: boolean;\n\t\tbatchName?: string;\n\t\tmax?: number | null;\n\t\ttimeout?: number | null;\n\t} = {}): OperationBatch => {\n\t\tconst internalBatch = this.operationBatcher.add({\n\t\t\tkey: batchName,\n\t\t\tmax,\n\t\t\ttimeout,\n\t\t\titems: [],\n\t\t\tuserData: { undoable },\n\t\t});\n\t\tconst externalApi: OperationBatch = {\n\t\t\trun: (fn: () => void) => {\n\t\t\t\t// while the provided function runs, operations are forwarded\n\t\t\t\t// to the new batch instead of default. this relies on the function\n\t\t\t\t// being synchronous.\n\t\t\t\tthis.currentBatchKey = batchName;\n\t\t\t\tfn();\n\t\t\t\tthis.currentBatchKey = DEFAULT_BATCH_KEY;\n\t\t\t\treturn externalApi;\n\t\t\t},\n\t\t\tflush: async () => {\n\t\t\t\t// before running a batch, the default operations must be flushed\n\t\t\t\t// this better preserves undo history behavior...\n\t\t\t\t// if we left the default batch open while flushing a named batch,\n\t\t\t\t// then the default batch would be flushed after the named batch,\n\t\t\t\t// and the default batch could contain operations both prior and\n\t\t\t\t// after the named batch. this would result in a confusing undo\n\t\t\t\t// history where the first undo might reverse changes before and\n\t\t\t\t// after a set of other changes.\n\t\t\t\tawait this.operationBatcher.flush(DEFAULT_BATCH_KEY);\n\t\t\t\treturn internalBatch.flush();\n\t\t\t},\n\t\t\tdiscard: () => {\n\t\t\t\tthis.operationBatcher.discard(batchName);\n\t\t\t},\n\t\t};\n\t\treturn externalApi;\n\t};\n\n\t/**\n\t * @deprecated use `batch` instead\n\t */\n\tflushPatches = async () => {\n\t\tawait this.operationBatcher.flush(this.currentBatchKey);\n\t};\n\n\tflushAllBatches = async () => {\n\t\tawait Promise.all(this.operationBatcher.flushAll());\n\t};\n\n\tprivate flushOperations = async (\n\t\toperations: Operation[],\n\t\tbatchKey: string,\n\t\tmeta: { undoable?: boolean },\n\t) => {\n\t\tif (!operations.length) return;\n\n\t\tthis.log('Flushing operations', operations.length, 'to storage / sync');\n\t\t// rewrite timestamps of all operations to now - this preserves\n\t\t// the linear history of operations which are sent to the server.\n\t\t// even if multiple batches are spun up in parallel and flushed\n\t\t// after delay, the final operations in each one should reflect\n\t\t// when the batch flushed, not when the changes were made.\n\t\t// This also corresponds to user-observed behavior, since unconfirmed\n\t\t// operations are applied universally after confirmed operations locally,\n\t\t// so even operations which were made before a remote operation but\n\t\t// have not been confirmed yet will appear to come after the remote one\n\t\t// despite the provisional timestamp being earlier (see DocumentFamilyCache#computeView)\n\t\tfor (const op of operations) {\n\t\t\top.timestamp = this.meta.now;\n\t\t}\n\t\tawait this.submitOperations(operations, meta);\n\t};\n\n\tprivate submitOperations = async (\n\t\toperations: Operation[],\n\t\t{ undoable = true }: { undoable?: boolean } = {},\n\t) => {\n\t\tif (undoable) {\n\t\t\t// FIXME: this is too slow and needs to be optimized.\n\t\t\tthis.undoHistory.addUndo(await this.createUndo(operations));\n\t\t}\n\t\tawait this.meta.insertLocalOperation(operations);\n\n\t\t// confirm the operations\n\t\tthis.addDataToOpenCaches({ operations, baselines: [] });\n\n\t\t// recompute all affected documents for querying\n\t\tconst allDocumentOids = Array.from(\n\t\t\tnew Set(operations.map((op) => getOidRoot(op.oid))),\n\t\t);\n\t\tfor (const oid of allDocumentOids) {\n\t\t\tawait this.writeDocumentToStorage(oid);\n\t\t}\n\n\t\t// TODO: find a more efficient and straightforward way to update affected\n\t\t// queries. Move to Metadata?\n\t\tconst affectedCollections = new Set(\n\t\t\toperations.map(({ oid }) => decomposeOid(oid).collection),\n\t\t);\n\t\tthis.context.log('changes to collections', affectedCollections);\n\t\tthis.context.entityEvents.emit(\n\t\t\t'collectionsChanged',\n\t\t\tArray.from(affectedCollections),\n\t\t);\n\t};\n\n\tprivate getInverseOperations = async (ops: Operation[]) => {\n\t\tconst grouped = groupPatchesByIdentifier(ops);\n\t\tconst inverseOps: Operation[] = [];\n\t\tconst getNow = () => this.meta.now;\n\t\tfor (const [oid, patches] of Object.entries(grouped)) {\n\t\t\tconst familyCache = await this.openFamilyCache(oid);\n\t\t\tlet { view, deleted } = familyCache.computeConfirmedView(oid);\n\t\t\tconst inverse = getUndoOperations(oid, view, patches, getNow);\n\t\t\tinverseOps.unshift(...inverse);\n\t\t}\n\t\treturn inverseOps;\n\t};\n\n\tprivate createUndo = async (ops: Operation[]) => {\n\t\tconst inverseOps = await this.getInverseOperations(ops);\n\t\treturn async () => {\n\t\t\tconst redo = await this.createUndo(inverseOps);\n\t\t\tawait this.submitOperations(\n\t\t\t\tinverseOps.map((op) => {\n\t\t\t\t\top.timestamp = this.meta.now;\n\t\t\t\t\treturn op;\n\t\t\t\t}),\n\t\t\t\t// undos should not generate their own undo operations\n\t\t\t\t// since they already calculate redo as the inverse.\n\t\t\t\t{ undoable: false },\n\t\t\t);\n\t\t\treturn redo;\n\t\t};\n\t};\n\n\tdelete = async (oid: ObjectIdentifier, options?: { undoable?: boolean }) => {\n\t\tassert(\n\t\t\toid === getOidRoot(oid),\n\t\t\t'Only root documents may be deleted via client methods',\n\t\t);\n\t\t// we need to get all sub-object oids to delete alongside the root\n\t\tconst allOids = await this.meta.getAllDocumentRelatedOids(oid);\n\t\tconst patches = this.meta.patchCreator.createDeleteAll(allOids);\n\t\t// don't enqueue these, submit as distinct operation\n\t\tawait this.submitOperations(patches, options);\n\t};\n\n\tdeleteAll = async (\n\t\toids: ObjectIdentifier[],\n\t\toptions?: { undoable?: boolean },\n\t) => {\n\t\tconst allOids = await Promise.all(\n\t\t\toids.map((oid) => this.meta.getAllDocumentRelatedOids(oid)),\n\t\t);\n\t\tconst patches = this.meta.patchCreator.createDeleteAll(allOids.flat());\n\t\t// don't enqueue these, submit as distinct operation\n\t\tawait this.submitOperations(patches, options);\n\t};\n\n\treset = async () => {\n\t\tthis.context.log('warn', 'Resetting local database');\n\t\tawait this.resetStoredDocuments();\n\t\tawait this.refreshAllCaches(true);\n\t\t// this.context.entityEvents.emit(\n\t\t// \t'collectionsChanged',\n\t\t// \tObject.keys(this.schema.collections),\n\t\t// );\n\t};\n\n\tdestroy = async () => {\n\t\tthis._disposed = true;\n\t\tfor (const unsubscribe of this.unsubscribes) {\n\t\t\tunsubscribe();\n\t\t}\n\t\tfor (const cache of this.documentFamilyCaches.values()) {\n\t\t\tcache.dispose();\n\t\t}\n\t\tthis.documentFamilyCaches.clear();\n\t\tawait this.flushAllBatches();\n\t};\n\n\tprivate handleRebase = (baselines: DocumentBaseline[]) => {\n\t\tthis.log('debug', 'Reacting to rebases', baselines.length);\n\t\t// update any open caches with new baseline. this will automatically\n\t\t// drop operations before the baseline.\n\t\tthis.addBaselinesToOpenCaches(baselines, { isLocal: true });\n\t};\n\n\tprivate resetStoredDocuments = async () => {\n\t\tconst tx = this.db.transaction(\n\t\t\tObject.keys(this.schema.collections),\n\t\t\t'readwrite',\n\t\t);\n\t\tfor (const collection of Object.keys(this.schema.collections)) {\n\t\t\tconst store = tx.objectStore(collection);\n\t\t\tawait storeRequestPromise(store.clear());\n\t\t}\n\t};\n\n\tprivate refreshAllCaches = async (\n\t\tdropUnconfirmed = false,\n\t\tdropAll = false,\n\t) => {\n\t\tfor (const [_, cache] of this.documentFamilyCaches) {\n\t\t\tawait this.refreshFamilyCache(cache, dropUnconfirmed, dropAll);\n\t\t}\n\t};\n}\n", "import {\n\tServerMessage,\n\tEventSubscriber,\n\tBatcher,\n\tBatch,\n} from '@verdant-web/common';\nimport type { UserInfo } from '../index.js';\nimport { LocalReplicaInfo } from '../metadata/LocalReplicaStore.js';\n\nexport const HANDLE_MESSAGE = Symbol('handleMessage');\n\nexport class PresenceManager<\n\tProfile = any,\n\tPresence = any,\n> extends EventSubscriber<{\n\tpeerChanged: (userId: string, presence: UserInfo<Profile, Presence>) => void;\n\tselfChanged: (presence: UserInfo<Profile, Presence>) => void;\n\tpeersChanged: (peers: Record<string, any>) => void;\n\tpeerLeft: (userId: string, lastPresence: UserInfo<Profile, Presence>) => void;\n\tupdate: (presence: Partial<Presence>) => void;\n}> {\n\tprivate _peers = {} as Record<string, UserInfo<Profile, Presence>>;\n\tprivate _self = { profile: {} } as UserInfo<Profile, Presence>;\n\t// keep track of own replica IDs - applications may care if we're \"alone\" but with multiple devices.\n\tprivate _selfReplicaIds = new Set<string>();\n\tprivate _peerIds = new Array<string>();\n\tprivate _updateBatcher;\n\tprivate _updateBatch: Batch<Partial<Presence>>;\n\n\tget self() {\n\t\treturn this._self;\n\t}\n\n\tget peers() {\n\t\treturn this._peers;\n\t}\n\n\tget peerIds() {\n\t\treturn this._peerIds;\n\t}\n\n\tget everyone() {\n\t\tconst everyone = { ...this._peers };\n\t\teveryone[this.self.id] = this.self;\n\t\treturn everyone;\n\t}\n\n\tget selfReplicaIds() {\n\t\treturn this._selfReplicaIds;\n\t}\n\n\tconstructor({\n\t\tinitialPresence,\n\t\tupdateBatchTimeout = 200,\n\t\tdefaultProfile,\n\t}: {\n\t\tinitialPresence: Presence;\n\t\tdefaultProfile: Profile;\n\t\tupdateBatchTimeout?: number;\n\t}) {\n\t\tsuper();\n\t\tthis.self.presence = initialPresence;\n\t\tthis.self.profile = defaultProfile;\n\n\t\tthis._updateBatcher = new Batcher(this.flushPresenceUpdates);\n\t\tthis._updateBatch = this._updateBatcher.add({\n\t\t\tmax: 25,\n\t\t\ttimeout: updateBatchTimeout,\n\t\t\titems: [],\n\t\t\tkey: 'default',\n\t\t});\n\t}\n\n\t/**\n\t * Decides if an update is for the local user or not. Even if it's a different replica\n\t * than the local one.\n\t *\n\t * If the replicaId matches, we use that first - we may not know the local replica's User ID yet,\n\t * e.g. on the first presence update.\n\t *\n\t * Otherwise, match the user ID to our local copy.\n\t */\n\tprivate isSelf = (\n\t\tlocalReplicaInfo: LocalReplicaInfo,\n\t\tuserInfo: UserInfo<Profile, Presence>,\n\t) => {\n\t\treturn (\n\t\t\tlocalReplicaInfo.id === userInfo.replicaId ||\n\t\t\tthis._selfReplicaIds.has(userInfo.replicaId) ||\n\t\t\tthis._self.id === userInfo.id\n\t\t);\n\t};\n\n\t[HANDLE_MESSAGE] = async (\n\t\tlocalReplicaInfo: LocalReplicaInfo,\n\t\tmessage: ServerMessage,\n\t) => {\n\t\tlet peersChanged = false;\n\t\tconst peerIdsSet = new Set<string>(this.peerIds);\n\n\t\tif (message.type === 'presence-changed') {\n\t\t\tif (this.isSelf(localReplicaInfo, message.userInfo)) {\n\t\t\t\tthis._self = message.userInfo;\n\t\t\t\tthis._selfReplicaIds.add(message.userInfo.replicaId);\n\t\t\t\tthis.emit('selfChanged', message.userInfo);\n\t\t\t} else {\n\t\t\t\tpeerIdsSet.add(message.userInfo.id);\n\t\t\t\tthis._peers[message.userInfo.id] = message.userInfo;\n\t\t\t\tpeersChanged = true;\n\t\t\t\tthis.emit('peerChanged', message.userInfo.id, message.userInfo);\n\t\t\t}\n\t\t} else if (message.type === 'sync-resp') {\n\t\t\t// reset to provided presence data, which includes all peers.\n\t\t\tthis._peers = {};\n\t\t\tpeerIdsSet.clear();\n\n\t\t\tfor (const [id, userInfo] of Object.entries(message.peerPresence)) {\n\t\t\t\tif (this.isSelf(localReplicaInfo, userInfo)) {\n\t\t\t\t\tthis._self = userInfo;\n\t\t\t\t\tthis._selfReplicaIds.add(userInfo.replicaId);\n\t\t\t\t\tthis.emit('selfChanged', userInfo);\n\t\t\t\t} else {\n\t\t\t\t\tpeersChanged = true;\n\t\t\t\t\tpeerIdsSet.add(id);\n\t\t\t\t\tthis._peers[id] = userInfo;\n\t\t\t\t\tthis.emit('peerChanged', id, userInfo);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (message.type === 'presence-offline') {\n\t\t\tpeerIdsSet.delete(message.userId);\n\t\t\tthis._selfReplicaIds.delete(message.replicaId);\n\t\t\tconst lastPresence = this._peers[message.userId];\n\t\t\tdelete this._peers[message.userId];\n\t\t\tpeersChanged = true;\n\t\t\tthis.emit('peerLeft', message.userId, lastPresence);\n\t\t}\n\t\tif (peersChanged) {\n\t\t\tthis._peerIds = Array.from(peerIdsSet);\n\t\t\tthis.emit('peersChanged', this._peers);\n\t\t}\n\t};\n\n\tupdate = async (presence: Partial<Presence>) => {\n\t\tthis._updateBatch.update({\n\t\t\titems: [presence],\n\t\t});\n\t\t// proactively update the local presence\n\t\tthis.self.presence = { ...this.self.presence, ...presence };\n\t\tthis.emit('selfChanged', this.self);\n\t};\n\n\tflushPresenceUpdates = (presenceUpdates: Partial<Presence>[]) => {\n\t\tconst presence = presenceUpdates.reduce((acc, update) => {\n\t\t\treturn { ...acc, ...update };\n\t\t}, this.self.presence);\n\t\tthis.emit('update', presence);\n\t};\n}\n", "import { FileData } from '@verdant-web/common';\nimport { ServerSyncEndpointProvider } from './ServerSyncEndpointProvider.js';\n\nexport interface FileUploadResult {\n\tsuccess: boolean;\n\tretry: boolean;\n}\n\nexport type FilePullResult =\n\t| {\n\t\t\tsuccess: true;\n\t\t\tdata: FileData;\n\t }\n\t| {\n\t\t\tsuccess: false;\n\t\t\tretry: boolean;\n\t };\n\nexport class FileSync {\n\tprivate endpointProvider: ServerSyncEndpointProvider;\n\tprivate log: (...args: any[]) => any;\n\n\tconstructor({\n\t\tendpointProvider,\n\t\tlog,\n\t}: {\n\t\tendpointProvider: ServerSyncEndpointProvider;\n\t\tlog: (...args: any[]) => any;\n\t}) {\n\t\tthis.endpointProvider = endpointProvider;\n\t\tthis.log = log;\n\t}\n\n\tuploadFile = async (data: FileData): Promise<FileUploadResult> => {\n\t\tconst file = data.file;\n\n\t\tif (!file) {\n\t\t\tthrow new Error('Cannot upload a non-local file');\n\t\t}\n\n\t\t// multipart upload\n\t\tconst { files: fileEndpoint, token } =\n\t\t\tawait this.endpointProvider.getEndpoints();\n\n\t\tconst formData = new window.FormData();\n\t\tformData.append('file', file);\n\n\t\ttry {\n\t\t\tconst response = await fetch(fileEndpoint + `/${data.id}`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: formData,\n\t\t\t\tcredentials: 'include',\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Bearer ${token}`,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (response.ok) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tretry: false,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tthis.log(\n\t\t\t\t\t'error',\n\t\t\t\t\t'File upload failed',\n\t\t\t\t\tresponse.status,\n\t\t\t\t\tawait response.text(),\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tretry: response.status >= 500,\n\t\t\t\t};\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.log('error', 'File upload failed', e);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tretry: true,\n\t\t\t};\n\t\t}\n\t};\n\n\tgetFile = async (id: string): Promise<FilePullResult> => {\n\t\tconst { files: fileEndpoint, token } =\n\t\t\tawait this.endpointProvider.getEndpoints();\n\n\t\ttry {\n\t\t\tconst response = await fetch(fileEndpoint + `/${id}`, {\n\t\t\t\tmethod: 'GET',\n\t\t\t\tcredentials: 'include',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${token}`,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (response.ok) {\n\t\t\t\tconst data = await response.json();\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tdata,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tthis.log(\n\t\t\t\t\t'error',\n\t\t\t\t\t'File information fetch failed',\n\t\t\t\t\tresponse.status,\n\t\t\t\t\tawait response.text(),\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tretry: response.status >= 500 || response.status === 404,\n\t\t\t\t};\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.log('error', 'File information fetch failed', e);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tretry: true,\n\t\t\t};\n\t\t}\n\t};\n}\n", "import { EventSubscriber } from '@verdant-web/common';\n\nexport class Heartbeat extends EventSubscriber<{\n\tmissed: () => void;\n\tbeat: () => void;\n}> {\n\tprivate _interval: number;\n\tprivate deadlineLength: number;\n\tprivate nextBeat: NodeJS.Timeout | null = null;\n\tprivate deadline: NodeJS.Timeout | null = null;\n\n\tget interval() {\n\t\treturn this._interval;\n\t}\n\n\tconstructor({\n\t\tinterval = 15 * 1000,\n\t\tdeadlineLength = 3 * 1000,\n\t\trestartOnTabFocus = true,\n\t}: {\n\t\tinterval?: number;\n\t\tdeadlineLength?: number;\n\t\trestartOnTabFocus?: boolean;\n\t} = {}) {\n\t\tsuper();\n\t\tthis._interval = interval;\n\t\tthis.deadlineLength = deadlineLength;\n\t\tif (typeof window !== 'undefined' && restartOnTabFocus) {\n\t\t\twindow.addEventListener('pageshow', () => this.start(true));\n\t\t}\n\t}\n\n\tkeepAlive = () => {\n\t\tif (this.deadline) {\n\t\t\tclearTimeout(this.deadline);\n\t\t\tthis.deadline = null;\n\t\t\tthis.start();\n\t\t}\n\t};\n\n\tstart = (immediate = false) => {\n\t\tthis.stop();\n\t\tif (immediate) {\n\t\t\tthis.beat();\n\t\t} else {\n\t\t\tthis.nextBeat = setTimeout(this.beat, this._interval);\n\t\t}\n\t};\n\n\tstop = () => {\n\t\tif (this.nextBeat) {\n\t\t\tclearTimeout(this.nextBeat);\n\t\t}\n\t\tif (this.deadline) {\n\t\t\tclearTimeout(this.deadline);\n\t\t}\n\t};\n\n\tprivate beat = async () => {\n\t\tthis.emit('beat');\n\t\tthis.deadline = setTimeout(this.onDeadline, this.deadlineLength);\n\t};\n\n\tprivate onDeadline = () => {\n\t\tthis.deadline = null;\n\t\tthis.emit('missed');\n\t};\n\n\t/**\n\t * Only takes affect after the next beat\n\t */\n\tsetInterval = (interval: number) => {\n\t\tthis._interval = interval;\n\t};\n}\n", "import {\n\tClientMessage,\n\tEventSubscriber,\n\tServerMessage,\n} from '@verdant-web/common';\nimport { Metadata } from '../metadata/Metadata.js';\nimport { PresenceManager } from './PresenceManager.js';\nimport { Heartbeat } from './Heartbeat.js';\nimport { ServerSyncEndpointProvider } from './ServerSyncEndpointProvider.js';\nimport { SyncTransport, SyncTransportEvents } from './Sync.js';\n\nexport class PushPullSync\n\textends EventSubscriber<SyncTransportEvents>\n\timplements SyncTransport\n{\n\treadonly meta: Metadata;\n\treadonly presence: PresenceManager;\n\tprivate endpointProvider;\n\tprivate heartbeat;\n\n\treadonly mode = 'pull';\n\tprivate log;\n\n\tprivate _isConnected = false;\n\tprivate _status: 'active' | 'paused' = 'paused';\n\tprivate _hasSynced = false;\n\n\tconstructor({\n\t\tendpointProvider,\n\t\tmeta,\n\t\tpresence,\n\t\tinterval = 15 * 1000,\n\t\tlog = () => {},\n\t}: {\n\t\tendpointProvider: ServerSyncEndpointProvider;\n\t\tmeta: Metadata;\n\t\tpresence: PresenceManager;\n\t\tinterval?: number;\n\t\tlog?: (...args: any[]) => any;\n\t}) {\n\t\tsuper();\n\t\tthis.log = log;\n\t\tthis.meta = meta;\n\t\tthis.presence = presence;\n\t\tthis.endpointProvider = endpointProvider;\n\n\t\tthis.heartbeat = new Heartbeat({\n\t\t\tinterval,\n\t\t});\n\t\tthis.heartbeat.subscribe('beat', this.onHeartbeat);\n\t\tthis.heartbeat.subscribe('missed', this.onHeartbeatMissed);\n\t}\n\n\tsetInterval = (interval: number) => {\n\t\tthis.heartbeat.setInterval(interval);\n\t};\n\n\tget interval() {\n\t\treturn this.heartbeat.interval;\n\t}\n\n\tprivate sendRequest = async (messages: ClientMessage[]) => {\n\t\tthis.log('Sending sync request', messages);\n\t\ttry {\n\t\t\tconst { http: host, token } = await this.endpointProvider.getEndpoints();\n\t\t\tconst response = await fetch(host, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${token}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tmessages,\n\t\t\t\t}),\n\t\t\t\tcredentials: 'include',\n\t\t\t});\n\t\t\tif (response.ok) {\n\t\t\t\tthis.heartbeat.keepAlive();\n\t\t\t\tconst json = (await response.json()) as {\n\t\t\t\t\tmessages: ServerMessage[];\n\t\t\t\t};\n\t\t\t\tfor (const message of json.messages) {\n\t\t\t\t\tthis.handleServerMessage(message);\n\t\t\t\t}\n\t\t\t\tif (!this._isConnected) {\n\t\t\t\t\tthis._isConnected = true;\n\t\t\t\t\tthis.emit('onlineChange', true);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.log('Sync request failed', response.status, await response.text());\n\n\t\t\t\tif (this._isConnected) {\n\t\t\t\t\tthis._isConnected = false;\n\t\t\t\t\tthis.emit('onlineChange', false);\n\t\t\t\t}\n\n\t\t\t\t// only keep trying if the error was not 4xx\n\t\t\t\tif (response.status >= 500) {\n\t\t\t\t\tthis.heartbeat.keepAlive();\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (this._isConnected) {\n\t\t\t\tthis._isConnected = false;\n\t\t\t\tthis.emit('onlineChange', false);\n\t\t\t}\n\t\t\tthis.log(error);\n\n\t\t\tthis.heartbeat.keepAlive();\n\t\t}\n\t};\n\n\tprivate handleServerMessage = async (message: ServerMessage) => {\n\t\tif (message.type === 'sync-resp') {\n\t\t\tif (message.ackThisNonce) {\n\t\t\t\t// we need to ack the nonce to confirm that we received the sync-resp\n\t\t\t\tthis.log('Sending sync ack', message.ackThisNonce);\n\t\t\t\tthis.sendRequest([\n\t\t\t\t\tawait this.meta.messageCreator.createAck(message.ackThisNonce),\n\t\t\t\t]);\n\t\t\t}\n\t\t\t// but we can go ahead and preemptively allow ops to be sent\n\t\t\tthis._hasSynced = true;\n\t\t}\n\t\tthis.emit('message', message);\n\t};\n\n\tsend = (message: ClientMessage) => {\n\t\t// only certain messages are sent for pull-based sync.\n\t\tswitch (message.type) {\n\t\t\tcase 'presence-update':\n\t\t\tcase 'sync':\n\t\t\tcase 'heartbeat':\n\t\t\t\treturn this.sendRequest([message]);\n\t\t\tcase 'op':\n\t\t\t\tif (this._hasSynced) {\n\t\t\t\t\treturn this.sendRequest([message]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tstart(): void {\n\t\tif (this.status === 'active') {\n\t\t\treturn;\n\t\t}\n\t\tthis.heartbeat.start(true);\n\t\tthis._status = 'active';\n\t}\n\tstop(): void {\n\t\tthis.heartbeat.stop();\n\t\tthis._status = 'paused';\n\t}\n\n\tdispose = () => {};\n\treconnect(): void {\n\t\tthis.heartbeat.start(true);\n\t}\n\n\t// on a heartbeat, do a sync\n\tprivate onHeartbeat = async () => {\n\t\t// for HTTP sync we send presence first, so that the sync-resp message\n\t\t// will include the client's own presence info and fill in missing profile\n\t\t// data on the first request. otherwise it would have to wait for the second.\n\t\tthis.sendRequest([\n\t\t\tawait this.meta.messageCreator.createPresenceUpdate(\n\t\t\t\tthis.presence.self.presence,\n\t\t\t),\n\t\t\tawait this.meta.messageCreator.createSyncStep1(),\n\t\t]);\n\t};\n\n\t// if the server fails to respond in a certain amount of time, we assume\n\t// the connection is lost and go offline.\n\tprivate onHeartbeatMissed = async () => {\n\t\tthis.emit('onlineChange', false);\n\t\tthis.log('Missed heartbeat');\n\t\tthis._isConnected = false;\n\t};\n\n\tget isConnected(): boolean {\n\t\treturn this._isConnected;\n\t}\n\tget status() {\n\t\treturn this._status;\n\t}\n}\n", "/**\n * The code was extracted from:\n * https://github.com/davidchambers/Base64.js\n */\n\nvar chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\nfunction InvalidCharacterError(message) {\n this.message = message;\n}\n\nInvalidCharacterError.prototype = new Error();\nInvalidCharacterError.prototype.name = \"InvalidCharacterError\";\n\nfunction polyfill(input) {\n var str = String(input).replace(/=+$/, \"\");\n if (str.length % 4 == 1) {\n throw new InvalidCharacterError(\n \"'atob' failed: The string to be decoded is not correctly encoded.\"\n );\n }\n for (\n // initialize result and counters\n var bc = 0, bs, buffer, idx = 0, output = \"\";\n // get next character\n (buffer = str.charAt(idx++));\n // character found in table? initialize bit storage and add its ascii value;\n ~buffer &&\n ((bs = bc % 4 ? bs * 64 + buffer : buffer),\n // and if not first of each 4 characters,\n // convert the first 8 bits to one ascii character\n bc++ % 4) ?\n (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6)))) :\n 0\n ) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer);\n }\n return output;\n}\n\nexport default (typeof window !== \"undefined\" &&\n window.atob &&\n window.atob.bind(window)) ||\npolyfill;", "import atob from \"./atob\";\n\nfunction b64DecodeUnicode(str) {\n return decodeURIComponent(\n atob(str).replace(/(.)/g, function(m, p) {\n var code = p.charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n })\n );\n}\n\nexport default function(str) {\n var output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n throw \"Illegal base64url string!\";\n }\n\n try {\n return b64DecodeUnicode(output);\n } catch (err) {\n return atob(output);\n }\n}", "\"use strict\";\n\nimport base64_url_decode from \"./base64_url_decode\";\n\nexport function InvalidTokenError(message) {\n this.message = message;\n}\n\nInvalidTokenError.prototype = new Error();\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\n\nexport default function(token, options) {\n if (typeof token !== \"string\") {\n throw new InvalidTokenError(\"Invalid token specified\");\n }\n\n options = options || {};\n var pos = options.header === true ? 0 : 1;\n try {\n return JSON.parse(base64_url_decode(token.split(\".\")[pos]));\n } catch (e) {\n throw new InvalidTokenError(\"Invalid token specified: \" + e.message);\n }\n}", "import { assert, ReplicaType } from '@verdant-web/common';\nimport { default as jwtDecode } from 'jwt-decode';\n\nexport interface ServerSyncEndpointProviderConfig {\n\t/**\n\t * The location of the endpoint used to retrieve an\n\t * authorization token for the client.\n\t */\n\tauthEndpoint?: string;\n\t/**\n\t * A custom fetch function to retrieve authorization\n\t * data.\n\t */\n\tfetchAuth?: () => Promise<{\n\t\taccessToken: string;\n\t}>;\n}\n\nexport class ServerSyncEndpointProvider {\n\tprivate cached = null as {\n\t\thttp: string;\n\t\twebsocket: string;\n\t\tfiles: string;\n\t\ttoken: string;\n\t} | null;\n\ttype: ReplicaType = ReplicaType.Realtime;\n\n\tconstructor(private config: ServerSyncEndpointProviderConfig) {\n\t\tif (!config.authEndpoint && !config.fetchAuth) {\n\t\t\tthrow new Error(\n\t\t\t\t'Either authEndpoint or fetchAuth must be provided to ServerSyncEndpointProvider',\n\t\t\t);\n\t\t}\n\t}\n\n\tgetEndpoints = async () => {\n\t\tif (this.cached) {\n\t\t\treturn this.cached;\n\t\t}\n\n\t\tlet result: { accessToken: string };\n\t\tif (this.config.fetchAuth) {\n\t\t\tresult = await this.config.fetchAuth();\n\t\t} else {\n\t\t\tresult = await fetch(this.config.authEndpoint!, {\n\t\t\t\tcredentials: 'include',\n\t\t\t}).then((res) => {\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Auth endpoint returned non-200 response: ${res.status}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\treturn res.json();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tassert(result.accessToken, 'No access token provided from auth endpoint');\n\t\tconst decoded = (jwtDecode as any)(result.accessToken);\n\t\tassert(decoded.url, 'No sync endpoint provided from auth endpoint');\n\t\tassert(\n\t\t\tdecoded.type !== undefined,\n\t\t\t'No replica type provided from auth endpoint',\n\t\t);\n\t\tthis.type = parseInt(decoded.type + '');\n\t\tconst url = new URL(decoded.url);\n\t\turl.protocol = url.protocol.replace('ws', 'http');\n\t\tconst httpEndpoint = url.toString();\n\t\turl.protocol = url.protocol.replace('http', 'ws');\n\t\tconst websocketEndpoint = url.toString();\n\t\tlet fileEndpoint: string = decoded.file;\n\t\tif (!fileEndpoint) {\n\t\t\t// default to http endpoint + '/files';\n\t\t\tconst fileUrl = new URL(httpEndpoint);\n\t\t\tfileUrl.pathname = fileUrl.pathname + '/files';\n\t\t\tfileEndpoint = fileUrl.toString();\n\t\t}\n\t\tthis.cached = {\n\t\t\thttp: httpEndpoint,\n\t\t\twebsocket: websocketEndpoint,\n\t\t\tfiles: fileEndpoint,\n\t\t\ttoken: result.accessToken,\n\t\t};\n\t\treturn this.cached;\n\t};\n}\n", "import { EventSubscriber } from '@verdant-web/common';\n\nexport class BackoffScheduler extends EventSubscriber<{\n\ttrigger: () => void;\n}> {\n\tprivate readonly backoff: Backoff;\n\tprivate timer: NodeJS.Timeout | null = null;\n\tprivate isScheduled = false;\n\n\tconstructor(backoff: Backoff) {\n\t\tsuper();\n\t\tthis.backoff = backoff;\n\t}\n\n\tnext = () => {\n\t\tif (!this.isScheduled) {\n\t\t\tthis.isScheduled = true;\n\t\t\tthis.timer = setTimeout(() => {\n\t\t\t\tthis.emit('trigger');\n\t\t\t\tthis.isScheduled = false;\n\t\t\t\tthis.backoff.next();\n\t\t\t}, this.backoff.current);\n\t\t}\n\t};\n\n\treset = () => {\n\t\tthis.backoff.reset();\n\t\tif (this.timer) {\n\t\t\tclearTimeout(this.timer);\n\t\t\tthis.timer = null;\n\t\t}\n\t};\n}\n\nexport class Backoff {\n\tcurrent = 0;\n\tprivate readonly max: number;\n\tprivate readonly factor: number;\n\n\tconstructor(max: number, factor: number) {\n\t\tthis.max = max;\n\t\tthis.factor = factor;\n\t}\n\n\tnext = () => {\n\t\tthis.current = Math.min(this.max, this.current * this.factor);\n\t};\n\n\treset = () => {\n\t\tthis.current = 0;\n\t};\n}\n", "import {\n\tClientMessage,\n\tEventSubscriber,\n\tServerMessage,\n} from '@verdant-web/common';\nimport { Backoff, BackoffScheduler } from '../BackoffScheduler.js';\nimport { Metadata } from '../metadata/Metadata.js';\nimport { Heartbeat } from './Heartbeat.js';\nimport { PresenceManager } from './PresenceManager.js';\nimport { ServerSyncEndpointProvider } from './ServerSyncEndpointProvider.js';\nimport { SyncTransport, SyncTransportEvents } from './Sync.js';\n\nexport class WebSocketSync\n\textends EventSubscriber<SyncTransportEvents>\n\timplements SyncTransport\n{\n\tprivate meta: Metadata;\n\treadonly presence: PresenceManager;\n\tprivate socket: WebSocket | null = null;\n\t// messages awaiting websocket connection to send\n\tprivate connectQueue: ClientMessage[] = [];\n\t// messages awaiting sync response to send\n\tprivate syncQueue: ClientMessage[] = [];\n\tprivate endpointProvider;\n\tprivate _status: 'active' | 'paused' = 'paused';\n\tprivate synced = false;\n\tprivate hasStartedSync = false;\n\n\treadonly mode = 'realtime';\n\tprivate log = (...args: any[]) => {};\n\n\tprivate heartbeat = new Heartbeat();\n\n\tprivate reconnectScheduler = new BackoffScheduler(\n\t\tnew Backoff(60 * 1000, 1.5),\n\t);\n\n\tconstructor({\n\t\tendpointProvider,\n\t\tmeta,\n\t\tpresence,\n\t\tlog,\n\t}: {\n\t\tendpointProvider: ServerSyncEndpointProvider;\n\t\tmeta: Metadata;\n\t\tpresence: PresenceManager;\n\t\tlog?: (...args: any[]) => any;\n\t}) {\n\t\tsuper();\n\t\tthis.log = log || this.log;\n\t\tthis.endpointProvider = endpointProvider;\n\t\tthis.meta = meta;\n\t\tthis.presence = presence;\n\n\t\tthis.reconnectScheduler.subscribe('trigger', this.initializeSocket);\n\t\tthis.heartbeat.subscribe('beat', this.sendHeartbeat);\n\t}\n\n\tprivate onOpen = () => {\n\t\tif (!this.socket) {\n\t\t\tthrow new Error('Invalid sync state: online but socket is null');\n\t\t}\n\t\tthis.synced = false;\n\t\tif (this.connectQueue.length) {\n\t\t\tfor (const msg of this.connectQueue) {\n\t\t\t\tthis.log('Sending queued message', JSON.stringify(msg, null, 2));\n\t\t\t\tthis.socket.send(JSON.stringify(msg));\n\t\t\t}\n\t\t\tthis.connectQueue = [];\n\t\t}\n\t\tthis.log('Sync connected');\n\t\tthis.onOnlineChange(true);\n\t\tthis.reconnectScheduler.reset();\n\t};\n\n\tprivate onOnlineChange = async (online: boolean) => {\n\t\tthis.log('Socket online change', online);\n\t\tif (!online) {\n\t\t\tthis.hasStartedSync = false;\n\t\t\tthis.synced = false;\n\t\t\tthis.heartbeat.stop();\n\t\t} else {\n\t\t\tthis.log('Starting sync');\n\t\t\tthis.hasStartedSync = true;\n\t\t\tthis.synced = false;\n\t\t\tthis.send(\n\t\t\t\tawait this.meta.messageCreator.createPresenceUpdate(\n\t\t\t\t\tthis.presence.self.presence,\n\t\t\t\t),\n\t\t\t);\n\t\t\tthis.send(await this.meta.messageCreator.createSyncStep1());\n\t\t\tthis.heartbeat.start();\n\t\t}\n\t\tthis.emit('onlineChange', online);\n\t};\n\n\tprivate onMessage = async (event: MessageEvent) => {\n\t\tconst message = JSON.parse(event.data) as ServerMessage;\n\t\tswitch (message.type) {\n\t\t\tcase 'sync-resp':\n\t\t\t\tif (message.ackThisNonce) {\n\t\t\t\t\t// we need to send the ack to confirm we got the response\n\t\t\t\t\tthis.send(\n\t\t\t\t\t\tawait this.meta.messageCreator.createAck(message.ackThisNonce),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthis.hasStartedSync = true;\n\t\t\t\tthis.synced = true;\n\t\t\t\tif (this.syncQueue.length) {\n\t\t\t\t\tfor (const msg of this.syncQueue) {\n\t\t\t\t\t\tthis.send(msg);\n\t\t\t\t\t}\n\t\t\t\t\tthis.syncQueue = [];\n\t\t\t\t}\n\t\t\tcase 'need-since':\n\t\t\tcase 'presence-changed':\n\t\t\tcase 'presence-offline':\n\t\t\t\tthis.emit('message', message);\n\t\t\t\tbreak;\n\t\t\tcase 'op-re':\n\t\t\t\tif (!this.hasStartedSync) {\n\t\t\t\t\tthis.log(\n\t\t\t\t\t\t`Skipping op-re message because sync hasn't started yet`,\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tthis.emit('message', message);\n\t\t\t\tbreak;\n\t\t\tcase 'heartbeat-response':\n\t\t\t\tthis.heartbeat.keepAlive();\n\t\t\t\tthis.emit('message', message);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif (this.synced) {\n\t\t\t\t\tthis.emit('message', message);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tprivate onError = (event: Event) => {\n\t\tthis.log(event);\n\t\tthis.reconnectScheduler.next();\n\n\t\tthis.log(`Attempting reconnect to websocket sync`);\n\t};\n\n\tprivate onClose = (event: CloseEvent) => {\n\t\tthis.log('Sync disconnected');\n\t\tthis.onOnlineChange(false);\n\t\tthis.onError(event);\n\t};\n\n\tprivate initializeSocket = async () => {\n\t\tconst endpoint = await this.endpointProvider.getEndpoints();\n\t\t// abusing protocols to pass the auth token\n\t\tthis.socket = new WebSocket(endpoint.websocket, ['Bearer', endpoint.token]);\n\t\tthis.socket.addEventListener('message', this.onMessage);\n\t\tthis.socket.addEventListener('open', this.onOpen);\n\t\tthis.socket.addEventListener('error', this.onError);\n\t\tthis.socket.addEventListener('close', this.onClose);\n\t\treturn this.socket;\n\t};\n\n\tprivate sendHeartbeat = async () => {\n\t\tthis.send(await this.meta.messageCreator.createHeartbeat());\n\t};\n\n\treconnect = () => {\n\t\tthis.stop();\n\t\tthis.start();\n\t};\n\n\tprivate canSkipSyncWait = (message: ClientMessage) => {\n\t\treturn (\n\t\t\tmessage.type === 'sync' ||\n\t\t\tmessage.type === 'presence-update' ||\n\t\t\tmessage.type === 'sync-ack' ||\n\t\t\tmessage.type === 'heartbeat'\n\t\t);\n\t};\n\n\tsend = (message: ClientMessage) => {\n\t\tif (this.status !== 'active') return;\n\n\t\t// wait until a sync has started before doing anything other than sync.\n\t\t// new \"op\" messages can arrive before sync has started, so we need to wait\n\t\tif (!this.hasStartedSync && !this.canSkipSyncWait(message)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.canSkipSyncWait(message)) {\n\t\t\tif (this.socket?.readyState === WebSocket.OPEN) {\n\t\t\t\tthis.log('Sending message', JSON.stringify(message, null, 2));\n\t\t\t\tthis.socket!.send(JSON.stringify(message));\n\t\t\t} else {\n\t\t\t\tthis.log(\n\t\t\t\t\t'Enqueueing message until socket is open',\n\t\t\t\t\tJSON.stringify(message, null, 2),\n\t\t\t\t);\n\t\t\t\tthis.connectQueue.push(message);\n\t\t\t}\n\t\t} else if (this.synced) {\n\t\t\tif (this.socket?.readyState === WebSocket.OPEN) {\n\t\t\t\tthis.log('Sending message', JSON.stringify(message, null, 2));\n\t\t\t\tthis.socket.send(JSON.stringify(message));\n\t\t\t}\n\t\t} else if (this.hasStartedSync) {\n\t\t\tthis.log(\n\t\t\t\t'Enqueueing message until synced',\n\t\t\t\tJSON.stringify(message, null, 2),\n\t\t\t);\n\t\t\tthis.syncQueue.push(message);\n\t\t}\n\t};\n\n\tdispose = () => {\n\t\tthis.socket?.removeEventListener('message', this.onMessage);\n\t\tthis.socket?.removeEventListener('close', this.onClose);\n\t\tthis.socket?.close();\n\t};\n\n\tstart = () => {\n\t\tif (this.socket) {\n\t\t\treturn;\n\t\t}\n\t\tthis.initializeSocket();\n\t\tthis._status = 'active';\n\t};\n\n\tstop = () => {\n\t\tthis.dispose();\n\t\tthis.socket = null;\n\t\tthis._status = 'paused';\n\t};\n\n\tget isConnected() {\n\t\treturn this.socket?.readyState === WebSocket.OPEN;\n\t}\n\n\tget status() {\n\t\treturn this._status;\n\t}\n}\n", "import {\n\tClientMessage,\n\tDocumentBaseline,\n\tEventSubscriber,\n\tFileData,\n\tOperation,\n\tReplicaType,\n\tServerMessage,\n} from '@verdant-web/common';\nimport { Metadata } from '../metadata/Metadata.js';\nimport { HANDLE_MESSAGE, PresenceManager } from './PresenceManager.js';\nimport { FilePullResult, FileSync, FileUploadResult } from './FileSync.js';\nimport { PushPullSync } from './PushPullSync.js';\nimport {\n\tServerSyncEndpointProvider,\n\tServerSyncEndpointProviderConfig,\n} from './ServerSyncEndpointProvider.js';\nimport { WebSocketSync } from './WebSocketSync.js';\n\ntype SyncEvents = {\n\tonlineChange: (isOnline: boolean) => void;\n};\n\nexport type SyncTransportEvents = SyncEvents & {\n\tmessage: (message: ServerMessage) => void;\n};\n\nexport interface SyncTransport {\n\tsubscribe(\n\t\tevent: 'onlineChange',\n\t\thandler: (online: boolean) => void,\n\t): () => void;\n\n\treadonly presence: PresenceManager;\n\n\treadonly mode: SyncTransportMode;\n\n\tsend(message: ClientMessage): void;\n\n\tstart(): void;\n\tstop(): void;\n\n\tdispose(): void;\n\n\treconnect(): void;\n\n\treadonly isConnected: boolean;\n\treadonly status: 'active' | 'paused';\n}\n\nexport interface Sync<Presence = any, Profile = any> extends SyncTransport {\n\tsetMode(mode: SyncTransportMode): void;\n\tsetPullInterval(interval: number): void;\n\treadonly pullInterval: number;\n\tuploadFile(data: FileData): Promise<FileUploadResult>;\n\tgetFile(fileId: string): Promise<FilePullResult>;\n\treadonly presence: PresenceManager<Profile, Presence>;\n}\n\nexport class NoSync<Presence = any, Profile = any>\n\textends EventSubscriber<SyncEvents>\n\timplements Sync<Presence, Profile>\n{\n\treadonly mode = 'pull';\n\n\tpublic send(): void {}\n\n\tpublic start(): void {}\n\n\tpublic stop(): void {}\n\n\tpublic dispose = () => {};\n\n\tpublic reconnect(): void {}\n\n\tpublic setMode(): void {}\n\tpublic setPullInterval(): void {}\n\n\tpublic readonly isConnected = false;\n\tpublic readonly status = 'paused';\n\tpublic readonly pullInterval = 0;\n\n\tpublic readonly presence = new PresenceManager<Profile, Presence>({\n\t\tinitialPresence: {} as any,\n\t\tdefaultProfile: {} as any,\n\t});\n\n\tuploadFile = async () => {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tretry: false,\n\t\t};\n\t};\n\n\tgetFile = async (): Promise<FilePullResult> => {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tretry: false,\n\t\t};\n\t};\n}\n\nexport type SyncTransportMode = 'realtime' | 'pull';\n\nexport interface ServerSyncOptions<Profile = any, Presence = any>\n\textends ServerSyncEndpointProviderConfig {\n\t/**\n\t * When a client first connects, it will use this presence value.\n\t */\n\tinitialPresence: Presence;\n\t/**\n\t * Before connecting to the server, the local client will have\n\t * this value for their profile data. You can either cache and store\n\t * profile data from a previous connection or provide defaults like\n\t * empty strings.\n\t */\n\tdefaultProfile: Profile;\n\n\t/**\n\t * Provide `false` to disable transport selection. Transport selection\n\t * automatically switches between HTTP and WebSocket based sync depending\n\t * on the number of peers connected. If a user is alone, they will use\n\t * HTTP push/pull to sync changes. If another user joins, both users will\n\t * be upgraded to websockets.\n\t *\n\t * Provide `peers-only` to only automatically use websockets if other\n\t * users connect, but not if another device for the current user connects.\n\t * By default, automatic transport selection will upgrade to websockets if\n\t * another device from the current user connects, but if realtime sync is\n\t * not necessary for such cases, you can save bandwidth by disabling this.\n\t *\n\t * Turning off this feature allows you more control over the transport\n\t * which can be useful for low-power devices or to save server traffic.\n\t * To modify transport modes manually, utilize `client.sync.setMode`.\n\t * The built-in behavior is essentially switching modes based on\n\t * the number of peers detected by client.sync.presence.\n\t */\n\tautomaticTransportSelection?: boolean | 'peers-only';\n\tinitialTransport?: SyncTransportMode;\n\tautoStart?: boolean;\n\t/**\n\t * Optionally specify an interval, in milliseconds, to poll the server\n\t * when in pull mode.\n\t */\n\tpullInterval?: number;\n\t/**\n\t * Presence updates are batched to reduce number of requests / messages\n\t * sent to the server. You can specify the batching time slice, in milliseconds,\n\t */\n\tpresenceUpdateBatchTimeout?: number;\n\t/**\n\t * Experimental: sync messages over a broadcast channel between tabs.\n\t * Fixes tabs not reactively updating to changes when other tabs are open,\n\t * but is not yet thoroughly vetted.\n\t */\n\tuseBroadcastChannel?: boolean;\n}\n\nexport class ServerSync<Presence = any, Profile = any>\n\textends EventSubscriber<\n\t\tSyncEvents & { syncingChange: (syncing: boolean) => void }\n\t>\n\timplements Sync<Presence, Profile>\n{\n\tprivate webSocketSync: WebSocketSync;\n\tprivate pushPullSync: PushPullSync;\n\tprivate fileSync: FileSync;\n\tprivate activeSync: SyncTransport;\n\tprivate endpointProvider;\n\tprivate onData: (data: {\n\t\toperations: Operation[];\n\t\tbaselines: DocumentBaseline[];\n\t\treset?: boolean;\n\t}) => Promise<void>;\n\tprivate broadcastChannel: BroadcastChannel | null = null;\n\tprivate _activelySyncing = false;\n\n\tprivate meta: Metadata;\n\n\treadonly presence: PresenceManager<Profile, Presence>;\n\n\tprivate log;\n\n\tconstructor(\n\t\t{\n\t\t\tauthEndpoint,\n\t\t\tfetchAuth,\n\t\t\tinitialPresence,\n\t\t\tautomaticTransportSelection = true,\n\t\t\tautoStart,\n\t\t\tinitialTransport,\n\t\t\tpullInterval,\n\t\t\tpresenceUpdateBatchTimeout,\n\t\t\tdefaultProfile,\n\t\t\tuseBroadcastChannel,\n\t\t}: ServerSyncOptions<Profile, Presence>,\n\t\t{\n\t\t\tmeta,\n\t\t\tlog,\n\t\t\tonData,\n\t\t}: {\n\t\t\tmeta: Metadata;\n\t\t\tlog?: (...args: any[]) => void;\n\t\t\tonData: (data: {\n\t\t\t\toperations: Operation[];\n\t\t\t\tbaselines: DocumentBaseline[];\n\t\t\t\treset?: boolean;\n\t\t\t}) => Promise<void>;\n\t\t},\n\t) {\n\t\tsuper();\n\t\tthis.meta = meta;\n\t\tthis.onData = onData;\n\t\tthis.log = log || (() => {});\n\t\tthis.presence = new PresenceManager({\n\t\t\tinitialPresence,\n\t\t\tdefaultProfile,\n\t\t\tupdateBatchTimeout: presenceUpdateBatchTimeout,\n\t\t});\n\t\tthis.endpointProvider = new ServerSyncEndpointProvider({\n\t\t\tauthEndpoint,\n\t\t\tfetchAuth,\n\t\t});\n\n\t\tthis.webSocketSync = new WebSocketSync({\n\t\t\tendpointProvider: this.endpointProvider,\n\t\t\tmeta,\n\t\t\tpresence: this.presence,\n\t\t\tlog: this.log,\n\t\t});\n\t\tthis.pushPullSync = new PushPullSync({\n\t\t\tendpointProvider: this.endpointProvider,\n\t\t\tmeta,\n\t\t\tpresence: this.presence,\n\t\t\tlog: this.log,\n\t\t\tinterval: pullInterval,\n\t\t});\n\t\tthis.fileSync = new FileSync({\n\t\t\tendpointProvider: this.endpointProvider,\n\t\t\tlog: this.log,\n\t\t});\n\t\tif (useBroadcastChannel && 'BroadcastChannel' in window) {\n\t\t\tthis.broadcastChannel = new BroadcastChannel('verdant');\n\t\t\tthis.broadcastChannel.addEventListener(\n\t\t\t\t'message',\n\t\t\t\tthis.handleBroadcastChannelMessage,\n\t\t\t);\n\t\t}\n\t\tif (initialTransport === 'realtime') {\n\t\t\tthis.activeSync = this.webSocketSync;\n\t\t} else {\n\t\t\tthis.activeSync = this.pushPullSync;\n\t\t}\n\n\t\tthis.presence.subscribe('update', this.handlePresenceUpdate);\n\n\t\tthis.meta.subscribe('message', this.send);\n\n\t\tthis.webSocketSync.subscribe('message', this.handleMessage);\n\t\tthis.webSocketSync.subscribe('onlineChange', this.handleOnlineChange);\n\n\t\tthis.pushPullSync.subscribe('message', this.handleMessage);\n\t\tthis.pushPullSync.subscribe('onlineChange', this.handleOnlineChange);\n\n\t\tif (automaticTransportSelection && this.canDoRealtime) {\n\t\t\t// automatically shift between transport modes depending\n\t\t\t// on whether any peers are present\n\t\t\tconst decideIfUpgrade = () => {\n\t\t\t\tif (switchoverTimeout) {\n\t\t\t\t\tclearTimeout(switchoverTimeout);\n\t\t\t\t}\n\t\t\t\tconst hasPeers = Object.keys(this.presence.peers).length > 0;\n\t\t\t\tconst shouldUpgrade =\n\t\t\t\t\thasPeers ||\n\t\t\t\t\t(automaticTransportSelection !== 'peers-only' &&\n\t\t\t\t\t\tthis.presence.selfReplicaIds.size > 1);\n\t\t\t\tif (shouldUpgrade && this.mode === 'pull') {\n\t\t\t\t\tthis.setMode('realtime');\n\t\t\t\t} else if (!shouldUpgrade && this.mode === 'realtime') {\n\t\t\t\t\t// wait 1 second then switch to pull mode if still empty\n\t\t\t\t\tswitchoverTimeout = setTimeout(() => {\n\t\t\t\t\t\tif (Object.keys(this.presence.peers).length === 0) {\n\t\t\t\t\t\t\tthis.setMode('pull');\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 1000);\n\t\t\t\t}\n\t\t\t};\n\t\t\tlet switchoverTimeout: NodeJS.Timer;\n\t\t\tthis.presence.subscribe('peersChanged', decideIfUpgrade);\n\t\t\tif (automaticTransportSelection !== 'peers-only') {\n\t\t\t\tthis.presence.subscribe('selfChanged', decideIfUpgrade);\n\t\t\t}\n\t\t}\n\n\t\tif (autoStart) {\n\t\t\tthis.start();\n\t\t}\n\t}\n\n\tget canDoRealtime() {\n\t\treturn (\n\t\t\tthis.endpointProvider.type === ReplicaType.Realtime ||\n\t\t\tthis.endpointProvider.type === ReplicaType.PassiveRealtime ||\n\t\t\tthis.endpointProvider.type === ReplicaType.ReadOnlyRealtime\n\t\t);\n\t}\n\n\tget syncing() {\n\t\treturn this._activelySyncing;\n\t}\n\n\tprivate handleBroadcastChannelMessage = (event: MessageEvent) => {\n\t\tif (event.data.type === 'sync') {\n\t\t\tthis.handleMessage(event.data.message);\n\t\t}\n\t};\n\n\tprivate handleMessage = async (message: ServerMessage) => {\n\t\t// TODO: move this into metadata\n\t\tif (message.type === 'op-re' || message.type === 'sync-resp') {\n\t\t\tfor (const op of message.operations) {\n\t\t\t\tthis.meta.time.update(op.timestamp);\n\t\t\t}\n\t\t}\n\n\t\tthis.log('sync message', JSON.stringify(message, null, 2));\n\t\tswitch (message.type) {\n\t\t\tcase 'op-re':\n\t\t\t\tawait this.onData({\n\t\t\t\t\toperations: message.operations,\n\t\t\t\t\tbaselines: message.baselines,\n\t\t\t\t});\n\t\t\t\tif (message.globalAckTimestamp) {\n\t\t\t\t\tawait this.meta.setGlobalAck(message.globalAckTimestamp);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'global-ack':\n\t\t\t\tawait this.meta.setGlobalAck(message.timestamp);\n\t\t\t\tbreak;\n\t\t\tcase 'sync-resp':\n\t\t\t\tthis._activelySyncing = true;\n\t\t\t\tthis.emit('syncingChange', true);\n\t\t\t\tawait this.onData({\n\t\t\t\t\toperations: message.operations,\n\t\t\t\t\tbaselines: message.baselines,\n\t\t\t\t\treset: message.overwriteLocalData,\n\t\t\t\t});\n\n\t\t\t\tif (message.globalAckTimestamp) {\n\t\t\t\t\tawait this.meta.setGlobalAck(message.globalAckTimestamp);\n\t\t\t\t}\n\n\t\t\t\tawait this.meta.updateLastSynced(message.ackedTimestamp);\n\t\t\t\tthis._activelySyncing = false;\n\t\t\t\tthis.emit('syncingChange', false);\n\t\t\t\tbreak;\n\t\t\tcase 'need-since':\n\t\t\t\tthis.activeSync.send(\n\t\t\t\t\tawait this.meta.messageCreator.createSyncStep1(message.since),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase 'server-ack':\n\t\t\t\tawait this.meta.updateLastSynced(message.timestamp);\n\t\t}\n\n\t\tthis.broadcastChannel?.postMessage({\n\t\t\ttype: 'sync',\n\t\t\tmessage,\n\t\t});\n\n\t\t// update presence if necessary\n\t\tthis.presence[HANDLE_MESSAGE](await this.meta.localReplica.get(), message);\n\t};\n\tprivate handleOnlineChange = (online: boolean) => {\n\t\tthis.emit('onlineChange', online);\n\t};\n\tprivate handlePresenceUpdate = async (presence: any) => {\n\t\tthis.send(await this.meta.messageCreator.createPresenceUpdate(presence));\n\t};\n\n\tsetMode = (transport: SyncTransportMode) => {\n\t\tif (transport === 'realtime' && !this.canDoRealtime) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot switch to realtime mode, because the current auth token does not allow it`,\n\t\t\t);\n\t\t}\n\n\t\tlet newSync: SyncTransport;\n\t\tif (transport === 'realtime') {\n\t\t\tnewSync = this.webSocketSync;\n\t\t} else {\n\t\t\tnewSync = this.pushPullSync;\n\t\t}\n\n\t\tif (newSync === this.activeSync) return;\n\t\tthis.log('switching to', transport, 'mode');\n\n\t\t// transfer state to new sync\n\t\tif (this.activeSync.status === 'active') {\n\t\t\tnewSync.start();\n\t\t}\n\t\tthis.activeSync.stop();\n\t\tthis.activeSync = newSync;\n\t};\n\n\tsetPullInterval = (interval: number) => {\n\t\tthis.pushPullSync.setInterval(interval);\n\t};\n\n\tget pullInterval() {\n\t\treturn this.pushPullSync.interval;\n\t}\n\n\tsend = (message: ClientMessage) => {\n\t\tif (this.activeSync.status === 'active') {\n\t\t\treturn this.activeSync.send(message);\n\t\t}\n\t};\n\n\tuploadFile = async (info: FileData) => {\n\t\tif (this.activeSync.status === 'active') {\n\t\t\treturn this.fileSync.uploadFile(info);\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tretry: false,\n\t\t\t};\n\t\t}\n\t};\n\n\tgetFile = async (id: string) => {\n\t\t// TODO: should this error? or just try anyway?\n\t\tif (this.activeSync.status === 'active') {\n\t\t\treturn this.fileSync.getFile(id);\n\t\t} else {\n\t\t\tthrow new Error('Offline, cannot retrieve remote file details');\n\t\t}\n\t};\n\n\tpublic start = () => {\n\t\treturn this.activeSync.start();\n\t};\n\n\tpublic stop = () => {\n\t\treturn this.activeSync.stop();\n\t};\n\n\tpublic dispose = () => {\n\t\tthis.webSocketSync.dispose();\n\t\tthis.pushPullSync.dispose();\n\t};\n\n\tpublic reconnect = () => {\n\t\treturn this.activeSync.reconnect();\n\t};\n\n\tpublic get isConnected(): boolean {\n\t\treturn this.activeSync.isConnected;\n\t}\n\n\tpublic get status() {\n\t\treturn this.activeSync.status;\n\t}\n\n\tpublic get mode() {\n\t\treturn this.activeSync.mode;\n\t}\n}\n", "export class Disposable {\n\tprivate _disposes: (() => void)[] = [];\n\tprotected disposed = false;\n\n\tdispose = () => {\n\t\tthis.disposed = true;\n\t\tthis._disposes.forEach((dispose) => dispose());\n\t\tthis._disposes = [];\n\t};\n\n\tprotected addDispose = (dispose: () => void) => {\n\t\tthis._disposes.push(dispose);\n\t};\n}\n", "import { CollectionIndexFilter, hashObject } from '@verdant-web/common';\nimport { Entity } from '../entities/Entity.js';\n\nfunction existsFilter<T>(x: T | null): x is T {\n\treturn x !== null;\n}\n\nexport function filterResultSet(results: any): any {\n\tif (Array.isArray(results)) {\n\t\treturn results.map(filterResultSet).filter(existsFilter);\n\t} else if (results instanceof Entity) {\n\t\treturn results.deleted ? null : results;\n\t} else {\n\t\treturn results;\n\t}\n}\n\nexport function areIndexesEqual(\n\ta?: CollectionIndexFilter,\n\tb?: CollectionIndexFilter,\n) {\n\treturn (!a && !b) || (a && b && hashObject(a) === hashObject(b));\n}\n", "import { EventSubscriber } from '@verdant-web/common';\nimport { Context } from '../context.js';\nimport { Entity } from '../entities/Entity.js';\nimport { Disposable } from '../utils/Disposable.js';\nimport { filterResultSet } from './utils.js';\n\nexport type BaseQueryEvents = {\n\tchange: (value: any) => void;\n\tstatusChange: (status: QueryStatus) => void;\n};\n\nexport type BaseQueryOptions<T> = {\n\tcontext: Context;\n\tinitial: T;\n\tcollection: string;\n\tkey: string;\n\tshouldUpdate?: (updatedCollections: string[]) => boolean;\n};\n\nexport type QueryStatus = 'initial' | 'initializing' | 'revalidating' | 'ready';\n\nexport const ON_ALL_UNSUBSCRIBED = Symbol('ON_ALL_UNSUBSCRIBED');\nexport const UPDATE = Symbol('UPDATE');\n\n// export interface BaseQuery<T> {\n// \tsubscribe(event: 'change', callback: (value: T) => void): () => void;\n// \tsubscribe(event: 'statusChange', callback: (status: QueryStatus) => void): () => void;\n// \tsubscribe(callback: (value: T) => void): () => void;\n// }\n\nexport abstract class BaseQuery<T> extends Disposable {\n\tprivate _rawValue;\n\tprivate _value;\n\n\tprivate _events;\n\tprivate _internalUnsubscribes: (() => void)[] = [];\n\tprivate _allUnsubscribedHandler?: (query: BaseQuery<T>) => void;\n\tprivate _status: QueryStatus = 'initial';\n\tprivate _executionPromise: Promise<T> | null = null;\n\n\tprotected context;\n\n\treadonly collection;\n\treadonly key;\n\n\tconstructor({\n\t\tinitial,\n\t\tcontext,\n\t\tcollection,\n\t\tkey,\n\t\tshouldUpdate,\n\t}: BaseQueryOptions<T>) {\n\t\tsuper();\n\t\tthis._rawValue = initial;\n\t\tthis._value = initial;\n\t\tthis._events = new EventSubscriber<BaseQueryEvents>(\n\t\t\t(event: keyof BaseQueryEvents) => {\n\t\t\t\tif (event === 'change') this._allUnsubscribedHandler?.(this);\n\t\t\t},\n\t\t);\n\t\tthis.context = context;\n\t\tthis.key = key;\n\t\tthis.collection = collection;\n\t\tconst shouldUpdateFn =\n\t\t\tshouldUpdate ||\n\t\t\t((collections: string[]) => collections.includes(collection));\n\t\tthis.addDispose(\n\t\t\tthis.context.entityEvents.subscribe(\n\t\t\t\t'collectionsChanged',\n\t\t\t\t(collections) => {\n\t\t\t\t\tif (shouldUpdateFn(collections)) {\n\t\t\t\t\t\tthis.context.log('info', 'Updating query', this.key);\n\t\t\t\t\t\tthis.execute();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\t}\n\n\tget current() {\n\t\treturn this._value;\n\t}\n\n\tget resolved() {\n\t\tif (this.status === 'ready') return Promise.resolve(this._value);\n\t\treturn this._executionPromise ?? this.execute();\n\t}\n\n\tget subscribed() {\n\t\treturn this._events.totalSubscriberCount() > 0;\n\t}\n\n\tget status() {\n\t\treturn this._status;\n\t}\n\n\t/**\n\t * Subscribe to changes in the query value.\n\t *\n\t * @deprecated use the two parameter form instead\n\t */\n\tsubscribe(callback: (value: T) => void): () => void;\n\t/**\n\t * Subscribe to changes in the query value.\n\t */\n\tsubscribe(event: 'change', callback: (value: T) => void): () => void;\n\t/**\n\t * Subscribe to changes in the query state.\n\t */\n\tsubscribe(\n\t\tevent: 'statusChange',\n\t\tcallback: (status: QueryStatus) => void,\n\t): () => void;\n\tsubscribe(eventOrCallback: any, callback?: any) {\n\t\t// change subscription has special behavior...\n\t\tif (callback === undefined && typeof eventOrCallback === 'function') {\n\t\t\t// accessing for side effects... eh\n\t\t\tthis.resolved;\n\t\t\treturn this._events.subscribe('change', eventOrCallback);\n\t\t} else if (eventOrCallback === 'change' && callback !== undefined) {\n\t\t\t// accessing for side effects... eh\n\t\t\tthis.resolved;\n\t\t\treturn this._events.subscribe('change', callback);\n\t\t} else if (\n\t\t\teventOrCallback === 'statusChange' &&\n\t\t\ttypeof callback === 'function'\n\t\t) {\n\t\t\treturn this._events.subscribe(eventOrCallback, callback);\n\t\t} else {\n\t\t\tthrow new Error('Invalid invocation of Query.subscribe');\n\t\t}\n\t}\n\n\tprotected setValue = (value: T) => {\n\t\tthis._rawValue = value;\n\t\tthis.subscribeToDeleteAndRestore(this._rawValue);\n\t\tthis._value = filterResultSet(value);\n\t\tthis._status = 'ready';\n\t\tthis._events.emit('change', this._value);\n\t};\n\n\t// re-applies filtering if results have changed\n\tprotected refreshValue = () => {\n\t\tthis.setValue(this._rawValue);\n\t};\n\n\tprivate subscribeToDeleteAndRestore = (value: T) => {\n\t\twhile (this._internalUnsubscribes.length) {\n\t\t\tthis._internalUnsubscribes.pop()?.();\n\t\t}\n\n\t\tif (Array.isArray(value)) {\n\t\t\tvalue.forEach((entity: any) => {\n\t\t\t\tif (entity instanceof Entity) {\n\t\t\t\t\tthis._internalUnsubscribes.push(\n\t\t\t\t\t\tentity.subscribe('delete', this.refreshValue),\n\t\t\t\t\t);\n\t\t\t\t\tthis._internalUnsubscribes.push(\n\t\t\t\t\t\tentity.subscribe('restore', this.refreshValue),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (value instanceof Entity) {\n\t\t\tthis._internalUnsubscribes.push(\n\t\t\t\tvalue.subscribe('delete', this.refreshValue),\n\t\t\t);\n\t\t\tthis._internalUnsubscribes.push(\n\t\t\t\tvalue.subscribe('restore', () => {\n\t\t\t\t\tthis.refreshValue();\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t};\n\n\texecute = () => {\n\t\tthis.context.log('debug', 'Executing query', this.key);\n\n\t\tif (this._status === 'initial') {\n\t\t\tthis._status = 'initializing';\n\t\t} else if (this._status === 'ready') {\n\t\t\tthis._status = 'revalidating';\n\t\t}\n\t\t// no status change needed if already in a 'running' status.\n\n\t\tthis._executionPromise = this.run()\n\t\t\t.then(() => this._value)\n\t\t\t.catch((err) => {\n\t\t\t\tif (err instanceof Error) {\n\t\t\t\t\tif (\n\t\t\t\t\t\terr.name === 'InvalidStateError' ||\n\t\t\t\t\t\terr.name === 'InvalidAccessError'\n\t\t\t\t\t) {\n\t\t\t\t\t\t// possibly accessing db while it's closed. not much we can do.\n\t\t\t\t\t\treturn this._value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthrow err;\n\t\t\t});\n\t\treturn this._executionPromise;\n\t};\n\tprotected abstract run(): Promise<void>;\n\n\t[ON_ALL_UNSUBSCRIBED] = (handler: (query: BaseQuery<T>) => void) => {\n\t\tthis._allUnsubscribedHandler = handler;\n\t};\n}\n", "import { createOid } from '@verdant-web/common';\nimport { BaseQuery, BaseQueryOptions } from './BaseQuery.js';\n\nexport class GetQuery<T> extends BaseQuery<T | null> {\n\tprivate hydrate;\n\tprivate oid;\n\n\tconstructor({\n\t\tid,\n\t\thydrate,\n\t\t...rest\n\t}: {\n\t\tid: string;\n\t\thydrate: (oid: string) => Promise<T>;\n\t} & Omit<BaseQueryOptions<T | null>, 'initial'>) {\n\t\tsuper({\n\t\t\tinitial: null,\n\t\t\t...rest,\n\t\t});\n\t\tthis.oid = createOid(rest.collection, id);\n\t\tthis.hydrate = hydrate;\n\t}\n\n\tprotected run = async () => {\n\t\tconst value = await this.hydrate(this.oid);\n\t\tthis.setValue(value);\n\t};\n}\n", "import { CollectionFilter } from '@verdant-web/common';\nimport { BaseQuery, BaseQueryOptions, UPDATE } from './BaseQuery.js';\nimport { findOneOid } from './dbQueries.js';\nimport { areIndexesEqual } from './utils.js';\n\nexport class FindOneQuery<T> extends BaseQuery<T | null> {\n\tprivate index;\n\tprivate hydrate;\n\n\tconstructor({\n\t\tindex,\n\t\thydrate,\n\t\t...rest\n\t}: {\n\t\tindex?: CollectionFilter;\n\t\thydrate: (oid: string) => Promise<T>;\n\t} & Omit<BaseQueryOptions<T | null>, 'initial'>) {\n\t\tsuper({\n\t\t\tinitial: null,\n\t\t\t...rest,\n\t\t});\n\t\tthis.index = index;\n\t\tthis.hydrate = hydrate;\n\t}\n\n\tprotected run = async () => {\n\t\tconst oid = await findOneOid({\n\t\t\tcollection: this.collection,\n\t\t\tindex: this.index,\n\t\t\tcontext: this.context,\n\t\t});\n\t\tthis.setValue(oid ? await this.hydrate(oid) : null);\n\t};\n\n\t[UPDATE] = (index: CollectionFilter | undefined) => {\n\t\tif (areIndexesEqual(this.index, index)) return;\n\t\tthis.index = index;\n\t\tthis.execute();\n\t};\n}\n", "import { CollectionFilter } from '@verdant-web/common';\nimport { BaseQuery, BaseQueryOptions, UPDATE } from './BaseQuery.js';\nimport { findPageOfOids } from './dbQueries.js';\nimport { areIndexesEqual } from './utils.js';\n\nexport class FindPageQuery<T> extends BaseQuery<T[]> {\n\tprivate index;\n\tprivate hydrate;\n\tprivate _pageSize: number;\n\tprivate _page: number;\n\tprivate _hasNextPage: boolean = false;\n\n\tget pageSize() {\n\t\treturn this._pageSize;\n\t}\n\n\tget page() {\n\t\treturn this._page;\n\t}\n\n\tget hasNextPage() {\n\t\treturn this._hasNextPage;\n\t}\n\n\tget hasPreviousPage() {\n\t\treturn this._page > 0;\n\t}\n\n\tconstructor({\n\t\tindex,\n\t\thydrate,\n\t\tpageSize,\n\t\tpage,\n\t\t...rest\n\t}: {\n\t\tindex?: CollectionFilter;\n\t\thydrate: (oid: string) => Promise<T>;\n\t\tpageSize: number;\n\t\tpage: number;\n\t} & Omit<BaseQueryOptions<T[]>, 'initial'>) {\n\t\tsuper({\n\t\t\tinitial: [],\n\t\t\t...rest,\n\t\t});\n\t\tthis.index = index;\n\t\tthis.hydrate = hydrate;\n\t\tthis._pageSize = pageSize;\n\t\tthis._page = page;\n\t}\n\n\tprotected run = async () => {\n\t\tconst { result, hasNextPage } = await findPageOfOids({\n\t\t\tcollection: this.collection,\n\t\t\tindex: this.index,\n\t\t\tcontext: this.context,\n\t\t\tlimit: this._pageSize,\n\t\t\toffset: this._page * this._pageSize,\n\t\t});\n\t\tthis._hasNextPage = hasNextPage;\n\t\tthis.setValue(await Promise.all(result.map(this.hydrate)));\n\t};\n\n\tnextPage = async () => {\n\t\tif (!this.hasNextPage) return;\n\n\t\tthis._page++;\n\t\tawait this.run();\n\t};\n\n\tpreviousPage = async () => {\n\t\tif (this._page === 0) return;\n\n\t\tthis._page--;\n\t\tawait this.run();\n\t};\n\n\tsetPage = async (page: number) => {\n\t\tthis._page = page;\n\t\tawait this.run();\n\t};\n\n\t[UPDATE] = (index: CollectionFilter | undefined) => {\n\t\tif (areIndexesEqual(this.index, index)) return;\n\t\tthis.index = index;\n\t\tthis.execute();\n\t};\n}\n", "import { CollectionFilter } from '@verdant-web/common';\nimport { BaseQuery, BaseQueryOptions, UPDATE } from './BaseQuery.js';\nimport { findPageOfOids } from './dbQueries.js';\nimport { areIndexesEqual } from './utils.js';\n\nexport class FindInfiniteQuery<T> extends BaseQuery<T[]> {\n\tprivate index;\n\tprivate hydrate;\n\tprivate _upToPage = 1;\n\tprivate _pageSize: number;\n\tprivate _hasNextPage: boolean = false;\n\n\tget pageSize() {\n\t\treturn this._pageSize;\n\t}\n\n\tget hasMore() {\n\t\treturn this._hasNextPage;\n\t}\n\n\tconstructor({\n\t\thydrate,\n\t\tpageSize,\n\t\tindex,\n\t\t...rest\n\t}: {\n\t\thydrate: (oid: string) => Promise<T>;\n\t\tpageSize: number;\n\t\tindex?: CollectionFilter;\n\t} & Omit<BaseQueryOptions<T[]>, 'initial'>) {\n\t\tsuper({\n\t\t\tinitial: [],\n\t\t\t...rest,\n\t\t});\n\t\tthis.index = index;\n\t\tthis.hydrate = hydrate;\n\t\tthis._pageSize = pageSize;\n\t}\n\n\tprotected run = async () => {\n\t\tconst { result, hasNextPage } = await findPageOfOids({\n\t\t\tcollection: this.collection,\n\t\t\tcontext: this.context,\n\t\t\tlimit: this._pageSize * this._upToPage,\n\t\t\toffset: 0,\n\t\t\tindex: this.index,\n\t\t});\n\t\tthis._hasNextPage = hasNextPage;\n\t\tthis.setValue(await Promise.all(result.map(this.hydrate)));\n\t};\n\n\tpublic loadMore = async () => {\n\t\tconst { result, hasNextPage } = await findPageOfOids({\n\t\t\tcollection: this.collection,\n\t\t\tcontext: this.context,\n\t\t\tlimit: this._pageSize,\n\t\t\toffset: this._pageSize * this._upToPage,\n\t\t\tindex: this.index,\n\t\t});\n\t\tthis._hasNextPage = hasNextPage;\n\t\tthis._upToPage++;\n\t\tthis.setValue([\n\t\t\t...this.current,\n\t\t\t...(await Promise.all(result.map(this.hydrate))),\n\t\t]);\n\t};\n\n\t[UPDATE] = (index: CollectionFilter | undefined) => {\n\t\tif (areIndexesEqual(this.index, index)) return;\n\t\tthis.index = index;\n\t\tthis.execute();\n\t};\n}\n", "import { CollectionFilter } from '@verdant-web/common';\nimport { BaseQuery, BaseQueryOptions, UPDATE } from './BaseQuery.js';\nimport { findAllOids } from './dbQueries.js';\nimport { areIndexesEqual } from './utils.js';\n\nexport class FindAllQuery<T> extends BaseQuery<T[]> {\n\tprivate index;\n\tprivate hydrate;\n\n\tconstructor({\n\t\tindex,\n\t\thydrate,\n\t\t...rest\n\t}: {\n\t\tindex?: CollectionFilter;\n\t\thydrate: (oid: string) => Promise<T>;\n\t} & Omit<BaseQueryOptions<T[]>, 'initial'>) {\n\t\tsuper({\n\t\t\tinitial: [],\n\t\t\t...rest,\n\t\t});\n\t\tthis.index = index;\n\t\tthis.hydrate = hydrate;\n\t}\n\n\tprotected run = async () => {\n\t\tconst oids = await findAllOids({\n\t\t\tcollection: this.collection,\n\t\t\tindex: this.index,\n\t\t\tcontext: this.context,\n\t\t});\n\t\tthis.setValue(await Promise.all(oids.map(this.hydrate)));\n\t};\n\n\t[UPDATE] = (index: CollectionFilter | undefined) => {\n\t\tif (areIndexesEqual(this.index, index)) return;\n\t\tthis.index = index;\n\t\tthis.execute();\n\t};\n}\n", "import { CollectionFilter, hashObject } from '@verdant-web/common';\nimport { Context } from '../context.js';\nimport { EntityStore } from '../entities/EntityStore.js';\nimport { GetQuery } from './GetQuery.js';\nimport { QueryCache } from './QueryCache.js';\nimport { FindOneQuery } from './FindOneQuery.js';\nimport { FindPageQuery } from './FindPageQuery.js';\nimport { FindInfiniteQuery } from './FindInfiniteQuery.js';\nimport { FindAllQuery } from './FindAllQuery.js';\nimport { DocumentManager } from '../DocumentManager.js';\nimport { ObjectEntity } from '../index.js';\nimport { UPDATE } from './BaseQuery.js';\n\nexport class CollectionQueries<\n\tT extends ObjectEntity<any, any>,\n\tInit,\n\tFilter extends CollectionFilter,\n> {\n\tprivate cache;\n\tprivate collection;\n\tprivate hydrate: (oid: string) => Promise<T>;\n\tprivate context;\n\tprivate documentManager;\n\n\tput: (init: Init, options?: { undoable?: boolean }) => Promise<T>;\n\tdelete: (id: string, options?: { undoable?: boolean }) => Promise<void>;\n\tdeleteAll: (ids: string[], options?: { undoable?: boolean }) => Promise<void>;\n\n\tconstructor({\n\t\tcollection,\n\t\tcache,\n\t\tentities,\n\t\tcontext,\n\t\tdocumentManager,\n\t}: {\n\t\tcollection: string;\n\t\tcache: QueryCache;\n\t\tentities: EntityStore;\n\t\tcontext: Context;\n\t\tdocumentManager: DocumentManager<any>;\n\t}) {\n\t\tthis.cache = cache;\n\t\tthis.collection = collection;\n\t\tthis.hydrate = entities.get as any;\n\t\tthis.context = context;\n\t\tthis.documentManager = documentManager;\n\n\t\tthis.put = this.documentManager.create.bind(\n\t\t\tthis.documentManager,\n\t\t\tthis.collection,\n\t\t);\n\t\tthis.delete = this.documentManager.delete.bind(\n\t\t\tthis.documentManager,\n\t\t\tthis.collection,\n\t\t);\n\t\tthis.deleteAll = this.documentManager.deleteAllFromCollection.bind(\n\t\t\tthis.documentManager,\n\t\t\tthis.collection,\n\t\t);\n\t}\n\n\tprivate serializeIndex = (index?: CollectionFilter) => {\n\t\tif (!index) return '';\n\t\treturn hashObject(index);\n\t};\n\n\tget = (id: string) => {\n\t\tconst key = `get:${this.collection}:${id}`;\n\t\treturn this.cache.getOrSet(\n\t\t\tkey,\n\t\t\t() =>\n\t\t\t\tnew GetQuery<T>({\n\t\t\t\t\tid,\n\t\t\t\t\tcollection: this.collection,\n\t\t\t\t\thydrate: this.hydrate,\n\t\t\t\t\tcontext: this.context,\n\t\t\t\t\tkey,\n\t\t\t\t}),\n\t\t);\n\t};\n\n\tfindOne = ({\n\t\tindex,\n\t\tkey: providedKey,\n\t}: { index?: Filter; key?: string } = {}) => {\n\t\tconst key =\n\t\t\tprovidedKey || `findOne:${this.collection}:${this.serializeIndex(index)}`;\n\t\treturn this.cache.getOrSet(\n\t\t\tkey,\n\t\t\t() =>\n\t\t\t\tnew FindOneQuery<T>({\n\t\t\t\t\tindex,\n\t\t\t\t\tcollection: this.collection,\n\t\t\t\t\thydrate: this.hydrate,\n\t\t\t\t\tcontext: this.context,\n\t\t\t\t\tkey,\n\t\t\t\t}),\n\t\t\t(existing) => {\n\t\t\t\texisting[UPDATE](index);\n\t\t\t},\n\t\t);\n\t};\n\n\tfindAll = ({\n\t\tindex,\n\t\tkey: providedKey,\n\t}: { index?: Filter; key?: string } = {}) => {\n\t\tconst key =\n\t\t\tprovidedKey || `findAll:${this.collection}:${this.serializeIndex(index)}`;\n\t\treturn this.cache.getOrSet(\n\t\t\tkey,\n\t\t\t() =>\n\t\t\t\tnew FindAllQuery<T>({\n\t\t\t\t\tindex,\n\t\t\t\t\tcollection: this.collection,\n\t\t\t\t\thydrate: this.hydrate,\n\t\t\t\t\tcontext: this.context,\n\t\t\t\t\tkey,\n\t\t\t\t}),\n\t\t\t(existing) => {\n\t\t\t\texisting[UPDATE](index);\n\t\t\t},\n\t\t);\n\t};\n\n\tfindPage = ({\n\t\tindex,\n\t\tpageSize,\n\t\tpage,\n\t\tkey: providedKey,\n\t}: {\n\t\tindex?: Filter;\n\t\tpageSize: number;\n\t\tpage: number;\n\t\tkey?: string;\n\t}) => {\n\t\tconst key =\n\t\t\tprovidedKey ||\n\t\t\t`findPage:${this.collection}:${this.serializeIndex(index)}:${pageSize}`;\n\t\treturn this.cache.getOrSet(\n\t\t\tkey,\n\t\t\t() =>\n\t\t\t\tnew FindPageQuery<T>({\n\t\t\t\t\tindex,\n\t\t\t\t\tcollection: this.collection,\n\t\t\t\t\thydrate: this.hydrate,\n\t\t\t\t\tcontext: this.context,\n\t\t\t\t\tkey,\n\t\t\t\t\tpageSize,\n\t\t\t\t\tpage,\n\t\t\t\t}),\n\t\t\t(existing) => {\n\t\t\t\texisting[UPDATE](index);\n\t\t\t},\n\t\t);\n\t};\n\n\tfindAllInfinite = ({\n\t\tindex,\n\t\tpageSize,\n\t\tkey: providedKey,\n\t}: {\n\t\tindex?: Filter;\n\t\tpageSize: number;\n\t\tkey?: string;\n\t}) => {\n\t\tconst key =\n\t\t\tprovidedKey ||\n\t\t\t`findAllInfinite:${this.collection}:${this.serializeIndex(\n\t\t\t\tindex,\n\t\t\t)}:${pageSize}`;\n\t\treturn this.cache.getOrSet(\n\t\t\tkey,\n\t\t\t() =>\n\t\t\t\tnew FindInfiniteQuery<T>({\n\t\t\t\t\tindex,\n\t\t\t\t\tcollection: this.collection,\n\t\t\t\t\thydrate: this.hydrate,\n\t\t\t\t\tcontext: this.context,\n\t\t\t\t\tkey,\n\t\t\t\t\tpageSize,\n\t\t\t\t}),\n\t\t\t(existing) => {\n\t\t\t\texisting[UPDATE](index);\n\t\t\t},\n\t\t);\n\t};\n}\n", "import { Context } from '../context.js';\nimport { Disposable } from '../utils/Disposable.js';\nimport { BaseQuery, ON_ALL_UNSUBSCRIBED } from './BaseQuery.js';\n\nexport class QueryCache extends Disposable {\n\tprivate _cache: Map<string, BaseQuery<any>> = new Map();\n\tprivate _evictionTime;\n\tprivate context;\n\n\tconstructor({\n\t\tevictionTime = 5 * 1000,\n\t\tcontext,\n\t}: {\n\t\tevictionTime?: number;\n\t\tcontext: Context;\n\t}) {\n\t\tsuper();\n\n\t\tthis._evictionTime = evictionTime;\n\t\tthis.context = context;\n\t}\n\n\tget<T extends BaseQuery<any>>(key: string): T | null {\n\t\treturn (this._cache.get(key) as T) || null;\n\t}\n\n\tset<V extends BaseQuery<any>>(value: V) {\n\t\tthis._cache.set(value.key, value);\n\t\tvalue[ON_ALL_UNSUBSCRIBED](this.onQueryUnsubscribed);\n\t\treturn value;\n\t}\n\n\tgetOrSet<V extends BaseQuery<any>>(\n\t\tkey: string,\n\t\tcreate: () => V,\n\t\tupdate?: (query: V) => void,\n\t) {\n\t\tconst existing = this.get<V>(key);\n\t\tif (existing) {\n\t\t\tupdate?.(existing);\n\t\t\treturn existing;\n\t\t}\n\t\treturn this.set(create());\n\t}\n\n\tprivate onQueryUnsubscribed = (query: BaseQuery<any>) => {\n\t\tsetTimeout(() => {\n\t\t\tif (query.subscribed) return;\n\t\t\t// double check before evicting... possible the cache\n\t\t\t// got a different version of this query.\n\t\t\tif (this._cache.get(query.key) === query) {\n\t\t\t\tthis._cache.delete(query.key);\n\t\t\t}\n\t\t}, this._evictionTime);\n\t};\n}\n", "import {\n\tassert,\n\tdebounce,\n\tDocumentBaseline,\n\tEventSubscriber,\n\tMigration,\n\tOperation,\n\tSchemaCollection,\n} from '@verdant-web/common';\nimport { Context } from '../context.js';\nimport { DocumentManager } from '../DocumentManager.js';\nimport { FileManager, FileManagerConfig } from '../files/FileManager.js';\nimport {\n\tcloseDatabase,\n\tdeleteAllDatabases,\n\tgetSizeOfObjectStore,\n} from '../idb.js';\nimport { ExportData, Metadata } from '../metadata/Metadata.js';\nimport { openDocumentDatabase } from '../migration/openDatabase.js';\nimport { EntityStore } from '../entities/EntityStore.js';\nimport { NoSync, ServerSync, ServerSyncOptions, Sync } from '../sync/Sync.js';\nimport { CollectionQueries } from '../queries/CollectionQueries.js';\nimport { QueryCache } from '../queries/QueryCache.js';\n\ninterface ClientConfig<Presence = any> {\n\tsyncConfig?: ServerSyncOptions<Presence>;\n\tmigrations: Migration[];\n\tfiles?: FileManagerConfig;\n}\n\n// not actually used below, but helpful for internal code which\n// might rely on this stuff...\nexport type ClientWithCollections = Client & {\n\t[key: string]: CollectionQueries<any, any, any>;\n};\n\nexport class Client<Presence = any, Profile = any> extends EventSubscriber<{\n\t/**\n\t * Called when a change from a future version of the application has\n\t * been witnessed. These changes are not applied but it indicates\n\t * the app has been updated and a peer is using a newer version.\n\t * You should listen to this event and prompt the user to reload\n\t * their client, or reload it for them.\n\t *\n\t * This event may be called multiple times.\n\t */\n\tfutureSeen: () => void;\n}> {\n\treadonly meta: Metadata;\n\tprivate _entities: EntityStore;\n\tprivate _queryCache: QueryCache;\n\tprivate _documentManager: DocumentManager<any>;\n\tprivate _fileManager: FileManager;\n\n\treadonly collectionNames: string[];\n\n\tprivate _sync!: Sync<Presence, Profile>;\n\n\tget sync() {\n\t\treturn this._sync;\n\t}\n\n\tget entities() {\n\t\treturn this._entities;\n\t}\n\n\tget documentManager() {\n\t\treturn this._documentManager;\n\t}\n\n\tconstructor(\n\t\tprivate config: ClientConfig,\n\t\tprivate context: Context,\n\t\tcomponents: { meta: Metadata },\n\t) {\n\t\tsuper();\n\t\tthis.meta = components.meta;\n\t\tthis.collectionNames = Object.keys(context.schema.collections);\n\t\tthis._sync =\n\t\t\tthis.config.syncConfig && !context.schema.wip\n\t\t\t\t? new ServerSync<Presence, Profile>(this.config.syncConfig, {\n\t\t\t\t\t\tmeta: this.meta,\n\t\t\t\t\t\tonData: this.addData,\n\t\t\t\t\t\tlog: this.context.log,\n\t\t\t\t })\n\t\t\t\t: new NoSync<Presence, Profile>();\n\t\tif (context.schema.wip && this.config.syncConfig) {\n\t\t\tcontext.log(\n\t\t\t\t'warn',\n\t\t\t\t'\u26A0\uFE0F\u26A0\uFE0F Sync is disabled for WIP schemas. Commit your schema changes to start syncing again. \u26A0\uFE0F\u26A0\uFE0F',\n\t\t\t);\n\t\t}\n\n\t\tthis._fileManager = new FileManager({\n\t\t\tdb: this.metaDb,\n\t\t\tsync: this.sync,\n\t\t\tcontext: this.context,\n\t\t\tconfig: this.config.files,\n\t\t\tmeta: this.meta,\n\t\t});\n\t\tthis._entities = new EntityStore({\n\t\t\tcontext: this.context,\n\t\t\tmeta: this.meta,\n\t\t\tfiles: this._fileManager,\n\t\t});\n\t\tthis._queryCache = new QueryCache({\n\t\t\tcontext,\n\t\t});\n\t\tthis._documentManager = new DocumentManager(\n\t\t\tthis.meta,\n\t\t\tthis.schema,\n\t\t\tthis._entities,\n\t\t);\n\n\t\tconst notifyFutureSeen = debounce(() => {\n\t\t\tthis.emit('futureSeen');\n\t\t}, 300);\n\t\tthis.context.globalEvents.subscribe('futureSeen', notifyFutureSeen);\n\n\t\tthis.documentDb.addEventListener('versionchange', () => {\n\t\t\tthis.context.log?.(\n\t\t\t\t`Another tab has requested a version change for ${this.namespace}`,\n\t\t\t);\n\t\t\tthis.documentDb.close();\n\t\t\tif (typeof window !== 'undefined') {\n\t\t\t\twindow.location.reload();\n\t\t\t}\n\t\t});\n\n\t\tthis.metaDb.addEventListener('versionchange', () => {\n\t\t\tthis.context.log?.(\n\t\t\t\t`Another tab has requested a version change for ${this.namespace}`,\n\t\t\t);\n\t\t\tthis.metaDb.close();\n\t\t\tif (typeof window !== 'undefined') {\n\t\t\t\twindow.location.reload();\n\t\t\t}\n\t\t});\n\n\t\t// self-assign collection shortcuts. these are not typed\n\t\t// here but are typed in the generated code...\n\t\tfor (const [name, _collection] of Object.entries(\n\t\t\tcontext.schema.collections,\n\t\t)) {\n\t\t\tconst collectionName = name;\n\t\t\t(this as any)[collectionName] = new CollectionQueries({\n\t\t\t\tcollection: collectionName,\n\t\t\t\tcache: this._queryCache,\n\t\t\t\tcontext: this.context,\n\t\t\t\tentities: this.entities,\n\t\t\t\tdocumentManager: this.documentManager,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate addData = (data: {\n\t\toperations: Operation[];\n\t\tbaselines: DocumentBaseline[];\n\t\treset?: boolean;\n\t}) => {\n\t\treturn this._entities.addData(data);\n\t};\n\n\tget documentDb() {\n\t\treturn this.context.documentDb;\n\t}\n\n\tget metaDb() {\n\t\treturn this.context.metaDb;\n\t}\n\n\tget schema() {\n\t\treturn this.context.schema;\n\t}\n\n\tget namespace() {\n\t\treturn this.context.namespace;\n\t}\n\n\tget undoHistory() {\n\t\treturn this.context.undoHistory;\n\t}\n\n\t/**\n\t * @deprecated - use client.sync.presence instead\n\t */\n\tget presence() {\n\t\treturn this.sync.presence;\n\t}\n\n\t/**\n\t * Batch multiple operations together to be executed in a single transaction.\n\t * The changes made will not be included in the same undo history step as\n\t * any other changes made outside of the batch. You can also disable undo\n\t * for your batch to omit changes from undo history.\n\t *\n\t * Provide a batch name to apply multiple changes to the same batch\n\t * across different invocations. Batches will automatically flush after\n\t * a short delay or if they reach a maximum size.\n\t */\n\tget batch() {\n\t\treturn this.entities.batch;\n\t}\n\n\tstats = async () => {\n\t\tconst collectionNames = Object.keys(this.schema.collections);\n\t\tlet collections = {} as Record<string, { count: number; size: number }>;\n\t\tfor (const collectionName of collectionNames) {\n\t\t\tcollections[collectionName] = await getSizeOfObjectStore(\n\t\t\t\tthis.documentDb,\n\t\t\t\tcollectionName,\n\t\t\t);\n\t\t}\n\t\tconst meta = await this.meta.stats();\n\t\tconst storage =\n\t\t\ttypeof navigator !== 'undefined' &&\n\t\t\ttypeof navigator.storage !== 'undefined' &&\n\t\t\t'estimate' in navigator.storage\n\t\t\t\t? await navigator.storage.estimate()\n\t\t\t\t: undefined;\n\n\t\t// determine data:metadata ratio for total size of all collections vs metadata\n\t\tconst totalCollectionsSize = Object.values(collections).reduce(\n\t\t\t(acc, { size }) => acc + size,\n\t\t\t0,\n\t\t);\n\t\tconst totalMetaSize = meta.baselinesSize.size + meta.operationsSize.size;\n\t\tconst metaToDataRatio = totalMetaSize / totalCollectionsSize;\n\n\t\treturn {\n\t\t\tcollections,\n\t\t\tmeta,\n\t\t\tstorage,\n\t\t\ttotalMetaSize,\n\t\t\ttotalCollectionsSize,\n\t\t\tmetaToDataRatio,\n\t\t\tquotaUsage:\n\t\t\t\tstorage?.usage && storage?.quota\n\t\t\t\t\t? storage.usage / storage.quota\n\t\t\t\t\t: undefined,\n\t\t};\n\t};\n\n\tclose = async () => {\n\t\tthis.sync.stop();\n\t\tthis.sync.dispose();\n\t\t// this step does have the potential to flush\n\t\t// changes to storage, so don't close metadata db yet\n\t\tawait this._entities.destroy();\n\n\t\tthis.meta.close();\n\n\t\t// the idea here is to flush the microtask queue -\n\t\t// we may have queued tasks related to queries that\n\t\t// we want to settle before closing the databases\n\t\t// to avoid invalid state errors\n\t\tawait new Promise<void>(async (resolve) => {\n\t\t\tawait closeDatabase(this.documentDb);\n\t\t\tawait closeDatabase(this.metaDb);\n\t\t\tresolve();\n\t\t});\n\n\t\tthis.context.log?.('Client closed');\n\t};\n\n\t__dangerous__resetLocal = async () => {\n\t\tthis.sync.stop();\n\t\tawait deleteAllDatabases(this.namespace, indexedDB);\n\t};\n\n\texport = async () => {\n\t\tconst metaExport = await this.meta.export();\n\t\treturn Buffer.from(JSON.stringify(metaExport));\n\t};\n\n\timport = async (buffer: Buffer) => {\n\t\tthis.context.log('Importing data...');\n\t\t// close the document DB\n\t\tawait closeDatabase(this.context.documentDb);\n\n\t\tconst metaExport = JSON.parse(buffer.toString()) as ExportData;\n\t\tawait this.meta.resetFrom(metaExport);\n\t\t// now reset the document DB to the specified version\n\t\t// and run migrations to get it to the latest version\n\t\tconst version = metaExport.schema.version;\n\t\tconst deleteReq = indexedDB.deleteDatabase(\n\t\t\t[this.namespace, 'collections'].join('_'),\n\t\t);\n\t\tawait new Promise((resolve, reject) => {\n\t\t\tdeleteReq.onsuccess = resolve;\n\t\t\tdeleteReq.onerror = reject;\n\t\t});\n\t\t// reset our context to the imported schema for now\n\t\tconst currentSchema = this.context.schema;\n\t\tthis.context.schema = metaExport.schema;\n\t\t// now open the document DB empty at the specified version\n\t\t// and initialize it from the meta DB\n\t\tthis.context.documentDb = await openDocumentDatabase({\n\t\t\tmeta: this.meta,\n\t\t\tmigrations: this.config.migrations,\n\t\t\tcontext: this.context,\n\t\t\tversion,\n\t\t});\n\t\t// re-initialize data\n\t\tthis.context.log('Re-initializing data from imported data...');\n\t\tawait this._entities.addData({\n\t\t\toperations: metaExport.operations,\n\t\t\tbaselines: metaExport.baselines,\n\t\t\treset: true,\n\t\t});\n\t\t// close the database and reopen to latest version, applying\n\t\t// migrations\n\t\tawait closeDatabase(this.context.documentDb);\n\t\tthis.context.log('Migrating up to latest schema...');\n\t\t// put the schema back\n\t\tthis.context.schema = currentSchema;\n\t\tthis.context.documentDb = await openDocumentDatabase({\n\t\t\tmeta: this.meta,\n\t\t\tmigrations: this.config.migrations,\n\t\t\tcontext: this.context,\n\t\t\tversion: currentSchema.version,\n\t\t});\n\t};\n}\n", "/**\n * This exists since I'm a little anxious about using WeakRef in production\n * and want to be able to roll it back quickly to debug issues. Basically by adding\n * import { WeakRef } from 'FakeWeakRef' to the top of the file, we can switch back\n * to using a simple object reference.\n */\n\nexport class FakeWeakRef<T extends symbol | object> {\n\tconstructor(value: T) {\n\t\tthis.value = value;\n\t}\n\n\tvalue: T;\n\n\tderef(): T | undefined {\n\t\treturn this.value;\n\t}\n}\n", "import {\n\tEventSubscriber,\n\tMigration,\n\tStorageSchema,\n\thashObject,\n} from '@verdant-web/common';\nimport { Context } from '../context.js';\nimport { FileManagerConfig } from '../files/FileManager.js';\nimport { Metadata } from '../metadata/Metadata.js';\nimport {\n\topenMetadataDatabase,\n\topenWIPMetadataDatabase,\n} from '../metadata/openMetadataDatabase.js';\nimport {\n\topenDocumentDatabase,\n\topenWIPDocumentDatabase,\n} from '../migration/openDatabase.js';\nimport { ServerSyncOptions } from '../sync/Sync.js';\nimport { UndoHistory } from '../UndoHistory.js';\nimport { Client } from './Client.js';\nimport {\n\tdeleteAllDatabases,\n\tdeleteDatabase,\n\tgetAllDatabaseNamesAndVersions,\n} from '../idb.js';\nimport { FakeWeakRef } from '../FakeWeakRef.js';\n\nexport interface ClientDescriptorOptions<Presence = any, Profile = any> {\n\t/** The schema used to create this client */\n\tschema: StorageSchema<any>;\n\t/** Migrations, in order, to upgrade to each successive version of the schema */\n\tmigrations: Migration<any>[];\n\t/** Provide a sync config to turn on synchronization with a server */\n\tsync?: ServerSyncOptions<Profile, Presence>;\n\t/** Optionally override the IndexedDB implementation */\n\tindexedDb?: IDBFactory;\n\t/**\n\t * Namespaces are used to separate data from different clients in IndexedDB.\n\t */\n\tnamespace: string;\n\t/**\n\t * Provide your own UndoHistory to have a unified undo system across multiple\n\t * clients if you so desire.\n\t */\n\tundoHistory?: UndoHistory;\n\t/**\n\t * Provide a log function to log internal debug messages\n\t */\n\tlog?: (...args: any[]) => void;\n\tdisableRebasing?: boolean;\n\t/**\n\t * Provide a specific schema number to override the schema version\n\t * in the database. This is useful for testing migrations or recovering\n\t * from a mistakenly deployed incorrect schema. A specific version is required\n\t * so that you don't leave this on accidentally for all new schemas.\n\t */\n\toverrideSchemaConflict?: number;\n\t/**\n\t * Configuration for file management\n\t */\n\tfiles?: FileManagerConfig;\n\t/**\n\t * Enables experimental WeakRef usage to cull documents\n\t * from cache that aren't being used. This is a performance\n\t * optimization which has been tested under all Verdant's test\n\t * suites but I still want to keep testing it in the real world\n\t * before turning it on.\n\t */\n\tEXPERIMENTAL_weakRefs?: boolean;\n}\n\n/**\n * Since storage initialization is async, this class wraps the core\n * Storage creation promise and exposes some metadata which can\n * be useful immediately.\n */\nexport class ClientDescriptor<\n\tPresence = any,\n\tProfile = any,\n\tClientImpl extends Client = Client,\n> {\n\tprivate readonly _readyPromise: Promise<ClientImpl>;\n\t// assertions because these are defined by plucking them from\n\t// Promise initializer\n\tprivate resolveReady!: (storage: ClientImpl) => void;\n\tprivate rejectReady!: (err: Error) => void;\n\tprivate _resolvedValue: ClientImpl | undefined;\n\tprivate _initializing = false;\n\tprivate _namespace: string;\n\n\tget namespace() {\n\t\treturn this._namespace;\n\t}\n\n\tconstructor(\n\t\tprivate readonly init: ClientDescriptorOptions<Presence, Profile>,\n\t) {\n\t\tthis._readyPromise = new Promise((resolve, reject) => {\n\t\t\tthis.resolveReady = resolve;\n\t\t\tthis.rejectReady = reject;\n\t\t});\n\t\tthis._namespace = init.namespace;\n\t}\n\n\tprivate initialize = async (init: ClientDescriptorOptions) => {\n\t\t// if server-side and no alternative IndexedDB implementation was provided,\n\t\t// we can't initialize the storage\n\t\tif (typeof window === 'undefined' && !init.indexedDb) {\n\t\t\tthrow new Error(\n\t\t\t\t'A verdant client was initialized in an environment without IndexedDB. If you are using verdant in a server-rendered framework, you must enforce that all clients are initialized on the client-side, or you must provide some mock interface of IDBFactory to the ClientDescriptor options.',\n\t\t\t);\n\t\t}\n\n\t\tif (this._initializing || this._resolvedValue) {\n\t\t\treturn this._readyPromise;\n\t\t}\n\t\tthis._initializing = true;\n\t\ttry {\n\t\t\tlet storage: ClientImpl;\n\t\t\tif (init.schema.wip) {\n\t\t\t\tstorage = await this.initializeWIPDatabases(init);\n\t\t\t} else {\n\t\t\t\tstorage = await this.initializeDatabases(init);\n\t\t\t\tthis.cleanupWIPDatabases(init);\n\t\t\t}\n\n\t\t\tthis.resolveReady(storage);\n\t\t\tthis._resolvedValue = storage;\n\t\t\treturn storage;\n\t\t} catch (err) {\n\t\t\tthis.rejectReady(err as Error);\n\t\t\tthrow err;\n\t\t} finally {\n\t\t\tthis._initializing = false;\n\t\t}\n\t};\n\n\tprivate initializeDatabases = async (init: ClientDescriptorOptions) => {\n\t\tconst { db: metaDb } = await openMetadataDatabase({\n\t\t\tindexedDB: init.indexedDb,\n\t\t\tlog: init.log,\n\t\t\tnamespace: init.namespace,\n\t\t});\n\n\t\tconst context: Omit<Context, 'documentDb'> = {\n\t\t\tnamespace: this._namespace,\n\t\t\tmetaDb,\n\t\t\tschema: init.schema,\n\t\t\tlog: init.log || (() => {}),\n\t\t\tundoHistory: init.undoHistory || new UndoHistory(),\n\t\t\tentityEvents: new EventSubscriber(),\n\t\t\tglobalEvents: new EventSubscriber(),\n\t\t\tweakRef: (value) => {\n\t\t\t\tif (init.EXPERIMENTAL_weakRefs) {\n\t\t\t\t\treturn new WeakRef(value);\n\t\t\t\t} else {\n\t\t\t\t\treturn new FakeWeakRef(value) as unknown as WeakRef<typeof value>;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t\tconst meta = new Metadata({\n\t\t\tcontext,\n\t\t\tdisableRebasing: init.disableRebasing,\n\t\t});\n\n\t\t// verify schema integrity\n\t\tawait meta.updateSchema(init.schema, init.overrideSchemaConflict);\n\n\t\tconst documentDb = await openDocumentDatabase({\n\t\t\tcontext,\n\t\t\tversion: init.schema.version,\n\t\t\tmeta,\n\t\t\tmigrations: init.migrations,\n\t\t\tindexedDB: init.indexedDb,\n\t\t});\n\n\t\tconst fullContext: Context = Object.assign(context, { documentDb });\n\n\t\tconst storage = new Client(\n\t\t\t{\n\t\t\t\tsyncConfig: init.sync,\n\t\t\t\tmigrations: init.migrations,\n\t\t\t\tfiles: init.files,\n\t\t\t},\n\t\t\tfullContext,\n\t\t\t{\n\t\t\t\tmeta,\n\t\t\t},\n\t\t) as ClientImpl;\n\n\t\treturn storage;\n\t};\n\n\tprivate initializeWIPDatabases = async (init: ClientDescriptorOptions) => {\n\t\tconst schemaHash = hashObject(init.schema);\n\t\tconsole.info(`WIP schema in use. Opening database with hash ${schemaHash}`);\n\n\t\tconst wipNamespace = `@@wip_${init.namespace}_${schemaHash}`;\n\t\tconst { db: metaDb } = await openWIPMetadataDatabase({\n\t\t\tindexedDB: init.indexedDb,\n\t\t\tlog: init.log,\n\t\t\tnamespace: init.namespace,\n\t\t\twipNamespace: wipNamespace,\n\t\t});\n\n\t\tconst context: Omit<Context, 'documentDb'> = {\n\t\t\tnamespace: this._namespace,\n\t\t\tmetaDb,\n\t\t\tschema: init.schema,\n\t\t\tlog: init.log || (() => {}),\n\t\t\tundoHistory: init.undoHistory || new UndoHistory(),\n\t\t\tentityEvents: new EventSubscriber(),\n\t\t\tglobalEvents: new EventSubscriber(),\n\t\t\tweakRef: (value) => {\n\t\t\t\tif (init.EXPERIMENTAL_weakRefs) {\n\t\t\t\t\treturn new WeakRef(value);\n\t\t\t\t} else {\n\t\t\t\t\treturn new FakeWeakRef(value) as unknown as WeakRef<typeof value>;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t\tconst meta = new Metadata({\n\t\t\tcontext,\n\t\t\tdisableRebasing: init.disableRebasing,\n\t\t});\n\n\t\t// verify schema integrity\n\t\tawait meta.updateSchema(init.schema, init.overrideSchemaConflict);\n\n\t\tconst documentDb = await openWIPDocumentDatabase({\n\t\t\tcontext,\n\t\t\tversion: init.schema.version,\n\t\t\tmeta,\n\t\t\tmigrations: init.migrations,\n\t\t\tindexedDB: init.indexedDb,\n\t\t\twipNamespace,\n\t\t});\n\n\t\tconst fullContext: Context = Object.assign(context, { documentDb });\n\n\t\tconst storage = new Client(\n\t\t\t{\n\t\t\t\tsyncConfig: init.sync,\n\t\t\t\tmigrations: init.migrations,\n\t\t\t\tfiles: init.files,\n\t\t\t},\n\t\t\tfullContext,\n\t\t\t{\n\t\t\t\tmeta,\n\t\t\t},\n\t\t) as ClientImpl;\n\n\t\treturn storage;\n\t};\n\n\tprivate cleanupWIPDatabases = async (init: ClientDescriptorOptions) => {\n\t\tconst databaseInfo = await getAllDatabaseNamesAndVersions(init.indexedDb);\n\t\tconst wipDatabases = databaseInfo\n\t\t\t.filter((db) => db.name?.startsWith('@@wip_'))\n\t\t\t.map((db) => db.name!);\n\t\t// don't clear a current WIP database.\n\t\tconst wipDatabasesToDelete = wipDatabases.filter(\n\t\t\t(db) =>\n\t\t\t\t!db.startsWith(`@@wip_${init.namespace}_${hashObject(init.schema)}`),\n\t\t);\n\t\tfor (const db of wipDatabasesToDelete) {\n\t\t\tawait deleteDatabase(db, init.indexedDb);\n\t\t}\n\t};\n\n\tget current() {\n\t\t// exposing an immediate value if already resolved lets us\n\t\t// skip the promise microtask when accessing this externally if\n\t\t// the initialization has been completed.\n\t\treturn this._resolvedValue;\n\t}\n\n\tget readyPromise() {\n\t\treturn this._readyPromise;\n\t}\n\n\tget schema() {\n\t\treturn this.init.schema;\n\t}\n\n\topen = () => this.initialize(this.init);\n\n\tclose = async () => {\n\t\tif (this._resolvedValue) {\n\t\t\tthis._resolvedValue.close();\n\t\t}\n\t\tif (this._initializing) {\n\t\t\t(await this._readyPromise).close();\n\t\t}\n\t};\n\n\t__dangerous__resetLocal = async () => {\n\t\tawait deleteAllDatabases(this.namespace);\n\t};\n}\n", "import * as everything from './index.js';\n\n(window as any).Verdant = everything;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["require_pad", "__commonJSMin", "exports", "module", "num", "size", "s", "require_fingerprint_browser", "__commonJSMin", "exports", "module", "pad", "env", "globalCount", "mimeTypesLength", "clientId", "require_getRandomValue_browser", "__commonJSMin", "exports", "module", "getRandomValue", "crypto", "lim", "require_cuid", "__commonJSMin", "exports", "module", "fingerprint", "pad", "getRandomValue", "c", "blockSize", "base", "discreteValues", "randomBlock", "safeCounter", "cuid", "letter", "timestamp", "counter", "print", "random", "date", "stringToCheck", "stringLength", "require_object_hash", "__commonJSMin", "exports", "module", "e", "r", "o", "i", "u", "s", "n", "t", "a", "w", "b", "m", "c", "d", "h", "p", "g", "y", "l", "f", "O", "H", "j", "C", "v", "_", "E", "I", "A", "Y", "B", "F", "L", "U", "D", "x", "T", "M", "k", "N", "S", "src_exports", "__export", "Client", "ClientDescriptor", "Entity", "EntityFile", "MigrationPathError", "ServerSync", "collection", "createDefaultMigration", "createMigration", "migrate", "schema", "import_cuid", "VERSION_BLOCK_LENGTH", "ENCODING_NUMBER_RADIX", "encodeVersion", "version", "OLD_encodeVersion", "HybridLogicalClockTimestampProvider", "generateNodeId", "version", "getHlcNow", "OLD_encodeVersion", "OLD_serializeHlcTimestamp", "remoteTimestamp", "hlcString", "VERSION_BLOCK_LENGTH", "updateFromRemote", "deserializeHlcTimestamp", "raw", "encodeVersion", "serializeHlcTimestamp", "timestamp", "ClockDriftError", "args", "OverflowError", "COUNTER_BLOCK_LENGTH", "NODE_BLOCK_LENGTH", "MAX_CLOCK_DRIFT", "TIME_BLOCK_LENGTH", "cuid", "ts", "dateString", "ENCODING_NUMBER_RADIX", "counter", "node", "prev", "wallTime", "newWallTime", "newCounter", "local", "remote", "newTime", "maxCounter", "clock", "time", "counterNum", "OLD_serializeHlcTimestamp", "ts", "dateString", "counter", "node", "getTimestampSchemaVersion", "timestamp", "VERSION_BLOCK_LENGTH", "compareTimestampSchemaVersions", "a", "b", "isFileRef", "value", "createFileRef", "id", "getRandomValues", "rnds8", "rng", "regex_default", "validate", "uuid", "regex_default", "validate_default", "byteToHex", "i", "stringify", "arr", "offset", "uuid", "validate_default", "stringify_default", "v4", "options", "buf", "offset", "rnds", "rng", "i", "stringify_default", "v4_default", "isRef", "obj", "isObjectRef", "isFileRef", "compareRefs", "a", "b", "import_object_hash", "orderedReplacer", "_", "v", "ka", "kb", "stableStringify", "obj", "cloneDeep", "copyOids", "isObject", "oid", "maybeGetOid", "clone", "key", "value", "assignOid", "hashObject", "hash", "roughSizeOfObject", "object", "objectList", "stack", "bytes", "i", "assert", "condition", "message", "generateId", "length", "v4_default", "findLastIndex", "array", "predicate", "debounce", "fn", "wait", "timeout", "args", "context", "LEGACY_OID_KEY", "OID_KEY", "COLLECTION_SEPARATOR", "RANDOM_SEPARATOR", "oidMap", "getOid", "obj", "oid", "maybeGetOid", "assert", "isObject", "assignOid", "hasOid", "removeOid", "isOidKey", "key", "ensureOid", "rootOid", "createSubId", "createSubOid", "ensureCompatibleOid", "existingOid", "areOidsRelated", "SANTIIZE_PLACEHOLDERS", "sanitizeFragment", "id", "unsanitizeFragment", "createOid", "collection", "documentId", "subId", "root", "createOidSubId", "decomposeOid", "core", "random", "idOrLegacyPathId", "assignOidsToAllSubObjects", "obj", "createSubId", "rootOid", "getOid", "item", "i", "isObject", "isRef", "ensureCompatibleOid", "key", "maybeGetOidProperty", "obj", "isObject", "OID_KEY", "LEGACY_OID_KEY", "removeOidProperty", "copyOidFromPropertyToSystem", "obj", "oid", "maybeGetOidProperty", "assignOid", "removeOidPropertiesFromAllSubObjects", "removeOidProperty", "i", "isObject", "key", "removeOidsFromAllSubObjects", "removeOid", "createOidSubId", "v4_default", "createRef", "normalize", "refs", "getOid", "copy", "value", "isObjectRef", "isFileRef", "itemOid", "isRef", "getOidRoot", "oid", "RANDOM_SEPARATOR", "getOidSubIdRange", "root", "lastSubId", "createSubOid", "getLegacyDotOidSubIdRange", "areOidsRelated", "oidA", "oidB", "getOidRoot", "isLegacyDotOid", "oid", "RANDOM_SEPARATOR", "isObjectRef", "obj", "isDiffableObject", "val", "isObject", "isRef", "compareNonDiffable", "a", "b", "compareRefs", "diffToPatches", "from", "to", "getNow", "createSubId", "patches", "options", "oid", "getOid", "diffItems", "key", "value", "oldValue", "oldValueOid", "maybeGetOid", "valueOid", "areOidsRelated", "cloneDeep", "createSubOid", "assignOid", "ensureOid", "assert", "initialToPatches", "createRef", "i", "deletedItemsAtEnd", "oldKeys", "isOidKey", "initialToPatches", "initial", "rootOid", "getNow", "createSubId", "patches", "assignOid", "assignOidsToAllSubObjects", "normalized", "normalize", "key", "value", "removeOid", "groupPatchesByIdentifier", "patches", "grouped", "patch", "groupPatchesByRootOid", "root", "getOidRoot", "groupBaselinesByRootOid", "baselines", "listCheck", "obj", "maybeGetOid", "applyPatch", "base", "deletedRefs", "baseAsAny", "index", "spliceResult", "checkRef", "field", "isRef", "valueToRemove", "isObjectRef", "findLastIndex", "item", "isObject", "cloneDeep", "substituteRefsWithObjects", "base", "refs", "used", "i", "item", "dereference", "isObject", "isFileRef", "assert", "maybeGetOid", "key", "input", "isObjectRef", "resolved", "assignOid", "isNullable", "field", "hasDefault", "isIndexed", "addFieldDefaults", "collection", "value", "key", "defaultValue", "getFieldDefault", "traverseCollectionFieldsAndApplyDefaults", "subField", "item", "OID_KEY", "LEGACY_OID_KEY", "removeExtraProperties", "fieldValue", "traverseCollectionFieldsAndRemoveExtraProperties", "isObject", "isMatchIndexFilter", "filter", "isRangeIndexFilter", "isCompoundIndexFilter", "isStartsWithIndexFilter", "isSortIndexFilter", "collection", "synthetics", "indexes", "input", "finalIndexes", "key", "field", "isIndexed", "schema", "COMPOUND_INDEX_SEPARATOR", "COMPOUND_INDEX_LOWER_BOUND_SEPARATOR", "COMPOUND_INDEX_UPPER_BOUND_SEPARATOR", "createCompoundIndexValue", "fields", "value", "expandArrayIndex", "createUpperBoundIndexValue", "createLowerBoundIndexValue", "field", "newValue", "previousValue", "fieldValue", "item", "isDirectSynthetic", "index", "computeSynthetics", "schema", "obj", "result", "name", "property", "sanitizeIndexValue", "computeCompoundIndices", "doc", "acc", "indexKey", "key", "computeIndexedFields", "isIndexed", "getIndexValues", "NULL_INDEX_VALUE", "sanitizeIndexValue", "value", "emptySchema", "migrate", "oldSchemaOrNewSchema", "newSchemaOrProcedure", "procedureIfTwoSchemas", "isProcedureSecondArgument", "oldSchema", "newSchema", "procedure", "changedCollections", "key", "stableStringify", "removedCollections", "addedCollections", "autoMigratedCollections", "collection", "oldFields", "newFields", "addedIndexes", "removedIndexes", "changed", "oldIndexes", "getIndexes", "newIndexes", "added", "index", "i", "removed", "withDefaults", "collectionName", "val", "addFieldDefaults", "autoMigration", "removeExtraProperties", "engine", "migratedCollections", "strategy", "auto", "wrapped", "baseValue", "assignOid", "getOid", "name", "unmigrated", "getIndexes", "collection", "key", "fieldName", "createDefaultMigration", "schema", "newSchema", "migrate", "info", "old", "createMigration", "maybeOldSchema", "maybeNewSchemaOrProcedure", "maybeProcedure", "isProcedureSecondArgument", "oldSchema", "emptySchema", "procedure", "assert", "changedCollections", "addedCollections", "removedCollections", "addedIndexes", "removedIndexes", "autoMigratedCollections", "autoMigration", "getMigrationInfo", "engine", "migratedCollections", "strategy", "auto", "wrapped", "val", "baseValue", "assignOid", "getOid", "name", "unmigrated", "stableStringify", "oldFields", "newFields", "hasDefault", "changed", "oldIndexes", "newIndexes", "added", "index", "i", "removed", "collectionName", "addFieldDefaults", "removeExtraProperties", "PatchCreator", "getNow", "createSubId", "from", "to", "options", "diffToPatches", "obj", "oid", "initialToPatches", "key", "value", "isObject", "isRef", "itemOid", "createSubOid", "createRef", "index", "only", "count", "fromIndex", "toIndex", "oids", "EventSubscriber", "_onAllUnsubscribed", "event", "acc", "count", "callback", "key", "generateId", "subscribers", "args", "c", "events", "getUndoOperations", "oid", "initial", "operations", "getNow", "state", "cloneDeep", "undoOperations", "operation", "undo", "getUndoOperation", "applyPatch", "data", "index", "indexesOfValue", "Batcher", "flusher", "key", "batch", "userData", "items", "max", "timeout", "Batch", "startedAt", "needsSchedule", "storeRequestPromise", "request", "resolve", "reject", "getSizeOfObjectStore", "database", "storeName", "resolve", "reject", "tx", "cursorReq", "count", "size", "e", "cursor", "roughSizeOfObject", "getAllFromObjectStores", "db", "stores", "transaction", "promises", "store", "objectStore", "storeRequestPromise", "closeDatabase", "deleteAllDatabases", "namespace", "indexedDB", "req1", "req2", "deleteDatabase", "name", "getAllDatabaseNamesAndVersions", "IDBService", "db", "storeNames", "mode", "storeName", "getRequest", "transaction", "store", "request", "storeRequestPromise", "getRequests", "requests", "iterator", "req", "resolve", "reject", "cursor", "AckInfoStore", "IDBService", "result", "store", "ack", "BaselinesStore", "IDBService", "db", "oid", "mode", "transaction", "baselines", "baseline", "iterator", "store", "root", "getOidRoot", "start", "end", "getOidSubIdRange", "isLegacyDotOid", "docOids", "dotStart", "dotEnd", "getLegacyDotOidSubIdRange", "timestamp", "range", "import_cuid", "LocalReplicaStore", "IDBService", "transaction", "lookup", "store", "replicaInfo", "cuid", "data", "localReplicaInfo", "localInfo", "MessageCreator", "meta", "init", "localInfo", "op", "targetVersion", "since", "localReplicaInfo", "provideChangesSince", "operations", "affectedDocs", "patch", "getOidRoot", "baselines", "presence", "nonce", "OperationsStore", "IDBService", "oid", "iterator", "to", "from", "after", "mode", "providedTx", "store", "index", "startTimestamp", "start", "createCompoundIndexValue", "createLowerBoundIndexValue", "end", "createUpperBoundIndexValue", "range", "request", "resolve", "reject", "previousTimestamp", "event", "cursor", "value", "assert", "before", "transaction", "patches", "patch", "getOidRoot", "operations", "affected", "op", "SchemaStore", "db", "currentVersion", "request", "value", "storeRequestPromise", "schema", "Metadata", "EventSubscriber", "disableRebasing", "context", "HybridLogicalClockTimestampProvider", "stores", "oid", "oids", "documentOid", "getOidRoot", "assert", "transaction", "baseline", "patch", "options", "baselines", "objectMap", "assignOid", "op", "obj", "newObj", "applyPatch", "root", "substituteRefsWithObjects", "timestamp", "localReplicaInfo", "operations", "operation", "message", "affectedDocumentOids", "affectedOidSet", "globalAckTimestamp", "lastTimestamp", "toRebase", "operationCount", "newBaselines", "upTo", "providedTx", "replicaId", "current", "operationsApplied", "deletedRefs", "store", "newBaseline", "fileRefs", "isFileRef", "schema", "overrideConflict", "storedSchema", "db", "getAllFromObjectStores", "localReplica", "data", "storeRequestPromise", "operationsSize", "getSizeOfObjectStore", "baselinesSize", "SchemaStore", "OperationsStore", "BaselinesStore", "LocalReplicaStore", "AckInfoStore", "MessageCreator", "PatchCreator", "migrations", "version1", "version2", "version3", "version4", "openMetadataDatabase", "indexedDB", "namespace", "log", "resolve", "reject", "request", "wasInitialized", "event", "db", "tx", "toRun", "migration", "openWIPMetadataDatabase", "wipNamespace", "result", "prodDb", "baselines", "operations", "info", "storeRequestPromise", "wipTx", "wipBaselines", "wipOperations", "wipInfo", "baseline", "operation", "infoItem", "closeDatabase", "baselinesStore", "operationsStore", "infoStore", "cursorReq", "cursor", "isLocal_timestamp", "documentOid_timestamp", "value", "files", "matchIndexToIdbKeyRange", "filter", "sanitizeIndexValue", "sortIndexToIdbKeyRange", "rangeIndexToIdbKeyRange", "lower", "upper", "compoundIndexToIdbKeyRange", "schema", "collection", "indexDefinition", "assert", "matchedKeys", "a", "b", "key", "matchedValues", "createCompoundIndexValue", "createLowerBoundIndexValue", "createUpperBoundIndexValue", "startsWithIndexToIdbKeyRange", "getRange", "index", "isRangeIndexFilter", "isMatchIndexFilter", "isSortIndexFilter", "isStartsWithIndexFilter", "getStore", "db", "collection", "write", "findOneOid", "index", "context", "store", "source", "range", "getRange", "direction", "request", "resolve", "reject", "cursor", "createOid", "findAllOids", "results", "findPageOfOids", "limit", "offset", "hasDoneOffset", "hasNextPage", "visited", "getDatabaseVersion", "indexedDB", "namespace", "version", "log", "openAndGetVersion", "resolve", "reject", "currentVersion", "database", "request", "event", "transaction", "db", "closeDatabase", "upgradeDatabase", "indexedDb", "upgrader", "openAndUpgrade", "wasUpgraded", "acquireLock", "procedure", "openDatabase", "MigrationPathError", "message", "getMigrationPath", "currentVersion", "targetVersion", "migrations", "path", "getNextPathStep", "MigrationPathError", "fromHere", "m", "a", "b", "next", "nextPath", "globalIDB", "openDocumentDatabase", "version", "indexedDB", "migrations", "meta", "context", "currentVersion", "getDatabaseVersion", "toRun", "getMigrationPath", "m", "runMigrations", "openDatabase", "openWIPDocumentDatabase", "wipNamespace", "currentWIPVersion", "initialToRun", "mainDatabase", "wipDatabase", "mainDatabaseStoreNames", "i", "copyFromTransaction", "copyFromStores", "name", "allObjects", "store", "storeRequestPromise", "copyToTransaction", "copyToStores", "obj", "namespace", "acquireLock", "migration", "engine", "getInitialMigrationEngine", "originalDatabase", "getMigrationEngine", "err", "closeDatabase", "upgradeDatabase", "transaction", "db", "newCollection", "collection", "newIndex", "oldIndex", "removedCollection", "docsWithUnappliedMigrations", "getDocsWithUnappliedMigrations", "upgradedDatabase", "readStore", "oids", "getAllKeys", "key", "createOid", "oid", "decomposeOid", "views", "snap", "e", "s", "snapshot", "view", "getIndexValues", "writeStore", "putView", "id", "deleteView", "col", "getMigrationMutations", "getMigrationNow", "newOids", "acc", "collectionName", "doc", "addFieldDefaults", "primaryKey", "initialToPatches", "getMigrationQueries", "filter", "findOneOid", "findAllOids", "queries", "mutations", "awaitables", "strategy", "docs", "assert", "hasOid", "original", "cloneDeep", "newValue", "removeOidPropertiesFromAllSubObjects", "assignOidsToAllSubObjects", "patches", "diffToPatches", "resolve", "reject", "request", "event", "_", "unappliedOperations", "op", "getOidRoot", "UndoHistory", "EventSubscriber", "next", "undoPoint", "redoPoint", "DocumentManager", "meta", "schema", "entities", "collection", "init", "primaryKeyName", "primaryKey", "assert", "createOid", "collectionName", "addFieldDefaults", "options", "defaulted", "oid", "ids", "UPDATE", "MARK_FAILED", "_a", "_b", "EntityFile", "EventSubscriber", "id", "downloadRemote", "fileData", "import_cuid", "createFileData", "file", "cuid", "processValueFiles", "value", "onFileIdentified", "data", "createFileRef", "i", "key", "fileToArrayBuffer", "resolve", "reject", "reader", "FileStorage", "IDBService", "file", "transaction", "downloadRemote", "buffer", "fileToArrayBuffer", "r", "err", "store", "raw", "arrayBufferToBlob", "id", "current", "iterator", "value", "type", "defaultCanCleanup", "fileData", "FileManager", "db", "sync", "context", "meta", "config", "fileInput", "file", "UPDATE", "entityFile", "EntityFile", "retries", "result", "id", "MARK_FAILED", "err", "online", "unsynced", "count", "skipCount", "store", "fileRefs", "tx", "fileRef", "FileStorage", "REFRESH", "DEEP_CHANGE", "refreshEntity", "entity", "info", "_a", "_b", "Entity", "_Entity", "oid", "store", "fieldSchema", "cache", "parent", "onAllUnsubscribed", "readonlyKeys", "view", "deleted", "lastTimestamp", "restored", "source", "key", "event", "callback", "patches", "cloneDeep", "value", "isObjectRef", "subObject", "isFileRef", "file", "traverseCollectionFieldsAndApplyDefaults", "processValueFiles", "result", "index", "snapshot", "item", "idx", "assignOid", "deleteMode", "property", "replaceSubObjects", "merge", "field", "withoutFiles", "itemOid", "maybeGetOid", "from", "to", "itemRef", "val", "predicate", "collection", "decomposeOid", "EventSubscriber", "assert", "latest", "child", "childTimestamp", "Resolvable", "resolve", "reject", "res", "rej", "value", "reason", "DocumentFamilyCache", "EventSubscriber", "oid", "store", "context", "Resolvable", "operations", "oidSet", "operation", "existingOperations", "entity", "refreshEntity", "info", "index", "op", "unconfirmedOperations", "baselines", "affectedOids", "baseline", "existing", "ops", "reset", "isLocal", "entityRef", "view", "deleted", "after", "futureSeen", "now", "compareTimestampSchemaVersions", "applyPatch", "confirmed", "assignOid", "snapshot", "cloneDeep", "result", "logicalTimestamp", "schema", "parent", "readonlyKeys", "Entity", "dropUnconfirmed", "dropAll", "DEFAULT_BATCH_KEY", "EntityStore", "context", "meta", "batchTimeout", "files", "oid", "collection", "decomposeOid", "schema", "familyCache", "dropUnconfirmed", "dropAll", "transaction", "baselines", "operations", "baseline", "op", "documentOid", "getOidRoot", "DocumentFamilyCache", "rootOid", "id", "entity", "snapshot", "stored", "getIndexValues", "store", "storeRequestPromise", "readonlyKeys", "cache", "initial", "options", "removeOidsFromAllSubObjects", "processed", "processValueFiles", "assignOid", "info", "operationsByOid", "groupPatchesByRootOid", "baselinesByOid", "groupBaselinesByRootOid", "reset", "isLocal", "baselinesByDocumentOid", "operationsByDocumentOid", "allDocumentOids", "taggedOperations", "b", "o", "affectedCollections", "undoable", "batchName", "generateId", "max", "timeout", "internalBatch", "externalApi", "fn", "batchKey", "ops", "grouped", "groupPatchesByIdentifier", "inverseOps", "getNow", "patches", "view", "deleted", "inverse", "getUndoOperations", "redo", "assert", "allOids", "oids", "unsubscribe", "tx", "_", "Batcher", "HANDLE_MESSAGE", "_a", "PresenceManager", "EventSubscriber", "initialPresence", "updateBatchTimeout", "defaultProfile", "localReplicaInfo", "userInfo", "message", "peersChanged", "peerIdsSet", "id", "lastPresence", "presence", "presenceUpdates", "acc", "update", "Batcher", "everyone", "FileSync", "endpointProvider", "log", "data", "file", "fileEndpoint", "token", "formData", "response", "e", "id", "Heartbeat", "EventSubscriber", "interval", "deadlineLength", "restartOnTabFocus", "immediate", "PushPullSync", "EventSubscriber", "endpointProvider", "meta", "presence", "interval", "log", "messages", "host", "token", "response", "json", "message", "error", "Heartbeat", "InvalidCharacterError", "message", "this", "prototype", "Error", "name", "r", "window", "atob", "bind", "input", "str", "String", "replace", "length", "bs", "buffer", "bc", "idx", "output", "charAt", "fromCharCode", "indexOf", "t", "decodeURIComponent", "m", "p", "code", "charCodeAt", "toString", "toUpperCase", "err", "InvalidTokenError", "o", "token", "options", "pos", "header", "JSON", "parse", "base64_url_decode", "split", "e", "jwt_decode_esm_default", "ServerSyncEndpointProvider", "config", "result", "res", "assert", "decoded", "jwt_decode_esm_default", "url", "httpEndpoint", "websocketEndpoint", "fileEndpoint", "fileUrl", "BackoffScheduler", "EventSubscriber", "backoff", "Backoff", "max", "factor", "WebSocketSync", "EventSubscriber", "endpointProvider", "meta", "presence", "log", "args", "Heartbeat", "BackoffScheduler", "Backoff", "msg", "online", "event", "message", "endpoint", "NoSync", "EventSubscriber", "PresenceManager", "ServerSync", "authEndpoint", "fetchAuth", "initialPresence", "automaticTransportSelection", "autoStart", "initialTransport", "pullInterval", "presenceUpdateBatchTimeout", "defaultProfile", "useBroadcastChannel", "meta", "log", "onData", "event", "message", "op", "HANDLE_MESSAGE", "online", "presence", "transport", "newSync", "interval", "info", "id", "ServerSyncEndpointProvider", "WebSocketSync", "PushPullSync", "FileSync", "decideIfUpgrade", "switchoverTimeout", "shouldUpgrade", "Disposable", "dispose", "existsFilter", "x", "filterResultSet", "results", "Entity", "areIndexesEqual", "a", "b", "hashObject", "ON_ALL_UNSUBSCRIBED", "UPDATE", "_a", "BaseQuery", "Disposable", "initial", "context", "collection", "key", "shouldUpdate", "value", "filterResultSet", "entity", "Entity", "err", "handler", "EventSubscriber", "event", "shouldUpdateFn", "collections", "eventOrCallback", "callback", "GetQuery", "BaseQuery", "id", "hydrate", "rest", "value", "createOid", "_a", "FindOneQuery", "BaseQuery", "index", "hydrate", "rest", "oid", "findOneOid", "areIndexesEqual", "UPDATE", "_a", "FindPageQuery", "BaseQuery", "index", "hydrate", "pageSize", "page", "rest", "result", "hasNextPage", "findPageOfOids", "areIndexesEqual", "UPDATE", "_a", "FindInfiniteQuery", "BaseQuery", "hydrate", "pageSize", "index", "rest", "result", "hasNextPage", "findPageOfOids", "areIndexesEqual", "UPDATE", "_a", "FindAllQuery", "BaseQuery", "index", "hydrate", "rest", "oids", "findAllOids", "areIndexesEqual", "UPDATE", "CollectionQueries", "collection", "cache", "entities", "context", "documentManager", "index", "hashObject", "id", "key", "GetQuery", "providedKey", "FindOneQuery", "existing", "UPDATE", "FindAllQuery", "pageSize", "page", "FindPageQuery", "FindInfiniteQuery", "QueryCache", "Disposable", "evictionTime", "context", "query", "key", "value", "ON_ALL_UNSUBSCRIBED", "create", "update", "existing", "Client", "EventSubscriber", "config", "context", "components", "data", "collectionNames", "collections", "collectionName", "getSizeOfObjectStore", "meta", "storage", "totalCollectionsSize", "acc", "size", "totalMetaSize", "metaToDataRatio", "resolve", "closeDatabase", "deleteAllDatabases", "metaExport", "buffer", "version", "deleteReq", "reject", "currentSchema", "openDocumentDatabase", "ServerSync", "NoSync", "FileManager", "EntityStore", "QueryCache", "DocumentManager", "notifyFutureSeen", "debounce", "name", "_collection", "CollectionQueries", "FakeWeakRef", "value", "ClientDescriptor", "init", "storage", "err", "metaDb", "openMetadataDatabase", "context", "UndoHistory", "EventSubscriber", "value", "FakeWeakRef", "meta", "Metadata", "documentDb", "openDocumentDatabase", "fullContext", "Client", "schemaHash", "hashObject", "wipNamespace", "openWIPMetadataDatabase", "openWIPDocumentDatabase", "wipDatabasesToDelete", "getAllDatabaseNamesAndVersions", "db", "deleteDatabase", "deleteAllDatabases", "resolve", "reject", "src_exports"]
|
|
7
7
|
}
|