react-mnemonic 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Mnemonic/codecs.ts","../src/Mnemonic/json-schema.ts","../src/Mnemonic/schema.ts","../src/Mnemonic/runtime.ts","../src/Mnemonic/use-shared.ts","../src/Mnemonic/optional-bridge-adapter.ts","../src/Mnemonic/optional-bridge.tsx","../src/Mnemonic/optional-bridge-provider.tsx","../src/Mnemonic/provider.tsx","../src/Mnemonic/use.ts","../src/Mnemonic/recovery.ts","../src/Mnemonic/key.ts","../src/Mnemonic/schema-registry.ts","../src/Mnemonic/schema-helpers.ts","../src/Mnemonic/typed-schema.ts","../src/Mnemonic/structural-migrations.ts"],"names":["objectHasOwn","parseEnvelope","decodeStringPayload","buildFallbackResult","createContext","useContext","useMemo","store","useEffect","validateAgainstSchema","useCallback","getSchemaForVersion","decodeAutoschemaEnvelope","decodeCodecManagedEnvelope","decodeSchemaManagedEnvelope","warnOnce","isDevelopmentRuntime","children"],"mappings":";;;;;;AAoCO,IAAM,UAAA,GAAN,cAAyB,KAAA,CAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAelC,WAAA,CAAY,SAAiB,KAAA,EAAiB;AAC1C,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAGb,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EACpD;AACJ;AA+BO,IAAM,SAAA,GAAwB;AAAA,EACjC,MAAA,EAAQ,CAAC,KAAA,KAAU,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EACvC,MAAA,EAAQ,CAAC,OAAA,KAAY,IAAA,CAAK,MAAM,OAAO;AAC3C;AAgDO,SAAS,WAAA,CAAe,QAA8B,MAAA,EAA0C;AACnG,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAC5B;;;ACxCA,SAAS,WAAA,CAAY,OAAgB,IAAA,EAA+B;AAChE,EAAA,QAAQ,IAAA;AAAM,IACV,KAAK,QAAA;AACD,MAAA,OAAO,OAAO,KAAA,KAAU,QAAA;AAAA,IAC5B,KAAK,QAAA;AACD,MAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,SAAS,KAAK,CAAA;AAAA,IAC7D,KAAK,SAAA;AACD,MAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,UAAU,KAAK,CAAA;AAAA,IAC9D,KAAK,SAAA;AACD,MAAA,OAAO,OAAO,KAAA,KAAU,SAAA;AAAA,IAC5B,KAAK,MAAA;AACD,MAAA,OAAO,KAAA,KAAU,IAAA;AAAA,IACrB,KAAK,QAAA;AACD,MAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA,IAC9E,KAAK,OAAA;AACD,MAAA,OAAO,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA,IAC9B;AACI,MAAA,OAAO,KAAA;AAAA;AAEnB;AAMA,SAAS,kBAAA,CAAmB,GAAuB,CAAA,EAAgC;AAC/E,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AAC/B,IAAA,IAAI,CAAC,cAAc,CAAA,CAAE,CAAC,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,OAAO,KAAA;AAAA,EAC3C;AACA,EAAA,OAAO,IAAA;AACX;AAEA,SAAS,mBAAA,CAAoB,GAA4B,CAAA,EAAqC;AAC1F,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAC3B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA;AAC1C,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACrB,IAAA,IAAI,CAAC,YAAA,CAAa,CAAA,EAAG,GAAG,GAAG,OAAO,KAAA;AAClC,IAAA,IAAI,CAAC,cAAc,CAAA,CAAE,GAAG,GAAG,CAAA,CAAE,GAAG,CAAC,CAAA,EAAG,OAAO,KAAA;AAAA,EAC/C;AACA,EAAA,OAAO,IAAA;AACX;AAEO,SAAS,aAAA,CAAc,GAAY,CAAA,EAAqB;AAC3D,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,EAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,EAAM,OAAO,KAAA;AACrC,EAAA,IAAI,OAAO,CAAA,KAAM,OAAO,CAAA,EAAG,OAAO,KAAA;AAElC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AAClB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAG,OAAO,KAAA;AAC9B,IAAA,OAAO,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAAA,EAClC;AAEA,EAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACvB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAO,KAAA;AAC7B,IAAA,OAAO,mBAAA,CAAoB,GAA8B,CAA4B,CAAA;AAAA,EACzF;AAEA,EAAA,OAAO,KAAA;AACX;AAeA,IAAM,aAAA,uBAAoB,OAAA,EAAuC;AAkB1D,SAAS,cAAc,MAAA,EAAuC;AACjE,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA;AACvC,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,MAAM,QAAA,GAAW,eAAe,MAAM,CAAA;AACtC,EAAA,aAAA,CAAc,GAAA,CAAI,QAAQ,QAAQ,CAAA;AAClC,EAAA,OAAO,QAAA;AACX;AAGA,SAAS,gBAAgB,KAAA,EAAyB;AAC9C,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA;AAC9C;AAEA,SAAS,mBAAmB,KAAA,EAAkD;AAC1E,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC9E;AAEA,SAAS,YAAA,CAAa,OAAe,QAAA,EAAgC;AACjE,EAAA,MAAM,SAAU,MAAA,CAAsF,MAAA;AACtG,EAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAC9B,IAAA,OAAO,MAAA,CAAO,OAAO,QAAQ,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,MAAA,CAAO,wBAAA,CAAyB,KAAA,EAAO,QAAQ,CAAA,KAAM,MAAA;AAChE;AAOA,SAAS,eAAe,MAAA,EAAuC;AAC3D,EAAA,MAAM,QAAA,GAAW,wBAAwB,MAAM,CAAA;AAC/C,EAAA,MAAM,eAAA,GAAkB;AAAA,IACpB,wBAAwB,MAAM,CAAA;AAAA,IAC9B,yBAAyB,MAAM,CAAA;AAAA,IAC/B,0BAA0B,MAAM,CAAA;AAAA,IAChC,0BAA0B,MAAM,CAAA;AAAA,IAChC,0BAA0B,MAAM,CAAA;AAAA,IAChC,yBAAyB,MAAM;AAAA,GACnC,CAAE,MAAA,CAAO,CAAC,IAAA,KAAiC,SAAS,IAAI,CAAA;AAExD,EAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,eAAA,CAAgB,MAAA,KAAW,CAAA,EAAG;AACnD,IAAA,OAAO,CAAC,MAAA,EAAiB,KAAA,KAAmB,EAAC;AAAA,EACjD;AAEA,EAAA,OAAO,CAAC,KAAA,EAAgB,IAAA,GAAe,EAAA,KAAoC;AACvE,IAAA,MAAM,SAAsC,EAAC;AAC7C,IAAA,IAAI,YAAY,CAAC,QAAA,CAAS,KAAA,EAAO,IAAA,EAAM,MAAM,CAAA,EAAG;AAC5C,MAAA,OAAO,MAAA;AAAA,IACX;AACA,IAAA,KAAA,MAAW,QAAQ,eAAA,EAAiB;AAChC,MAAA,IAAA,CAAK,KAAA,EAAO,MAAM,MAAM,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO,MAAA;AAAA,EACX,CAAA;AACJ;AAEA,SAAS,wBAAwB,MAAA,EAA+C;AAC5E,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAW;AAC3B,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,IAAI,MAAA,CAAO,IAAA,GAAO,CAAC,MAAA,CAAO,IAAI,CAAA;AAC7E,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA;AAC5C,EAAA,OAAO,CAAC,KAAA,EAAO,IAAA,EAAM,MAAA,KAAW;AAC5B,IAAA,IAAI,aAAA,CAAc,KAAK,CAAC,IAAA,KAAS,YAAY,KAAA,EAAO,IAAI,CAAC,CAAA,EAAG;AACxD,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,IAAA;AAAA,MACA,SAAS,CAAA,cAAA,EAAiB,SAAS,CAAA,MAAA,EAAS,aAAA,CAAc,KAAK,CAAC,CAAA,CAAA;AAAA,MAChE,OAAA,EAAS;AAAA,KACZ,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACX,CAAA;AACJ;AAEA,SAAS,wBAAwB,MAAA,EAA2C;AACxE,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAW;AAC3B,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,gBAAA,GAAmB,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,CAAC,MAAA,KAAW,eAAA,CAAgB,MAAM,CAAC,CAAC,CAAA;AACxF,EAAA,MAAM,kBAAA,GAAqB,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,MAAA,KAAW,CAAC,eAAA,CAAgB,MAAM,CAAC,CAAA;AAElF,EAAA,OAAO,CAAC,KAAA,EAAO,IAAA,EAAM,MAAA,KAAW;AAC5B,IAAA,MAAM,iBAAiB,eAAA,CAAgB,KAAK,CAAA,IAAK,gBAAA,CAAiB,IAAI,KAAK,CAAA;AAC3E,IAAA,MAAM,YAAA,GAAe,CAAC,cAAA,IAAkB,kBAAA,CAAmB,IAAA,CAAK,CAAC,KAAA,KAAU,aAAA,CAAc,KAAA,EAAO,KAAK,CAAC,CAAA;AACtG,IAAA,IAAI,kBAAkB,YAAA,EAAc;AAChC,MAAA;AAAA,IACJ;AACA,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,IAAA;AAAA,MACA,OAAA,EAAS,CAAA,oCAAA,CAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACZ,CAAA;AAAA,EACL,CAAA;AACJ;AAEA,SAAS,yBAAyB,MAAA,EAA2C;AACzE,EAAA,IAAI,EAAE,WAAW,MAAA,CAAA,EAAS;AACtB,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,OAAO,CAAC,KAAA,EAAO,IAAA,EAAM,MAAA,KAAW;AAC5B,IAAA,IAAI,aAAA,CAAc,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAG;AACpC,MAAA;AAAA,IACJ;AACA,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,IAAA;AAAA,MACA,OAAA,EAAS,CAAA,0BAAA,CAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACZ,CAAA;AAAA,EACL,CAAA;AACJ;AAEA,SAAS,0BAA0B,MAAA,EAA2C;AAC1E,EAAA,MAAM,UAAA,GAAa,OAAO,OAAA,KAAY,MAAA;AACtC,EAAA,MAAM,UAAA,GAAa,OAAO,OAAA,KAAY,MAAA;AACtC,EAAA,MAAM,QAAA,GAAW,OAAO,gBAAA,KAAqB,MAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,OAAO,gBAAA,KAAqB,MAAA;AAC7C,EAAA,IAAI,CAAC,UAAA,IAAc,CAAC,cAAc,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU;AACtD,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,EAAA,MAAM,QAAQ,MAAA,CAAO,gBAAA;AACrB,EAAA,MAAM,QAAQ,MAAA,CAAO,gBAAA;AAErB,EAAA,OAAO,CAAC,KAAA,EAAO,IAAA,EAAM,MAAA,KAAW;AAC5B,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,UAAA,IAAc,QAAQ,OAAA,EAAU;AAChC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,IAAA;AAAA,QACA,OAAA,EAAS,CAAA,MAAA,EAAS,KAAK,CAAA,sBAAA,EAAyB,OAAQ,CAAA,CAAA;AAAA,QACxD,OAAA,EAAS;AAAA,OACZ,CAAA;AAAA,IACL;AACA,IAAA,IAAI,UAAA,IAAc,QAAQ,OAAA,EAAU;AAChC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,IAAA;AAAA,QACA,OAAA,EAAS,CAAA,MAAA,EAAS,KAAK,CAAA,yBAAA,EAA4B,OAAQ,CAAA,CAAA;AAAA,QAC3D,OAAA,EAAS;AAAA,OACZ,CAAA;AAAA,IACL;AACA,IAAA,IAAI,QAAA,IAAY,SAAS,KAAA,EAAQ;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,IAAA;AAAA,QACA,OAAA,EAAS,CAAA,MAAA,EAAS,KAAK,CAAA,sCAAA,EAAyC,KAAM,CAAA,CAAA;AAAA,QACtE,OAAA,EAAS;AAAA,OACZ,CAAA;AAAA,IACL;AACA,IAAA,IAAI,QAAA,IAAY,SAAS,KAAA,EAAQ;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,IAAA;AAAA,QACA,OAAA,EAAS,CAAA,MAAA,EAAS,KAAK,CAAA,mCAAA,EAAsC,KAAM,CAAA,CAAA;AAAA,QACnE,OAAA,EAAS;AAAA,OACZ,CAAA;AAAA,IACL;AAAA,EACJ,CAAA;AACJ;AAEA,SAAS,0BAA0B,MAAA,EAA2C;AAC1E,EAAA,MAAM,YAAA,GAAe,OAAO,SAAA,KAAc,MAAA;AAC1C,EAAA,MAAM,YAAA,GAAe,OAAO,SAAA,KAAc,MAAA;AAC1C,EAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,YAAA,EAAc;AAChC,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AACzB,EAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AACzB,EAAA,OAAO,CAAC,KAAA,EAAO,IAAA,EAAM,MAAA,KAAW;AAC5B,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,YAAA,IAAgB,KAAA,CAAM,MAAA,GAAS,SAAA,EAAY;AAC3C,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,IAAA;AAAA,QACA,OAAA,EAAS,CAAA,cAAA,EAAiB,KAAA,CAAM,MAAM,2BAA2B,SAAU,CAAA,CAAA;AAAA,QAC3E,OAAA,EAAS;AAAA,OACZ,CAAA;AAAA,IACL;AACA,IAAA,IAAI,YAAA,IAAgB,KAAA,CAAM,MAAA,GAAS,SAAA,EAAY;AAC3C,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,IAAA;AAAA,QACA,OAAA,EAAS,CAAA,cAAA,EAAiB,KAAA,CAAM,MAAM,8BAA8B,SAAU,CAAA,CAAA;AAAA,QAC9E,OAAA,EAAS;AAAA,OACZ,CAAA;AAAA,IACL;AAAA,EACJ,CAAA;AACJ;AAEA,SAAS,0BAA0B,MAAA,EAA2C;AAC1E,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,QAAA,IAAY,EAAC;AACzC,EAAA,MAAM,kBAAA,GAAqB,MAAA,CAAO,UAAA,GAC3B,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,cAAc,CAAA,KAAM;AAAA,IAC/D,IAAA;AAAA,IACA,cAAc,cAAc;AAAA,GAC/B,CAAA,GACD,IAAA;AACN,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,oBAAA,KAAyB,MAAA,IAAa,OAAO,oBAAA,KAAyB,IAAA;AACrG,EAAA,MAAM,iBAAA,GAAoB,OAAO,oBAAA,KAAyB,KAAA;AAC1D,EAAA,MAAM,sBACF,eAAA,IAAmB,CAAC,oBAAoB,aAAA,CAAc,MAAA,CAAO,oBAAkC,CAAA,GAAI,IAAA;AACvG,EAAA,MAAM,eAAA,GAAkB,eAAA,GAAkB,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,EAAE,CAAC,CAAA,GAAI,IAAA;AAC1F,EAAA,MAAM,wBAAgD,EAAC;AAEvD,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AACzB,IAAA,qBAAA,CAAsB,IAAA,CAAK,0BAAA,CAA2B,YAAY,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,uBAAuB,IAAA,EAAM;AAC7B,IAAA,qBAAA,CAAsB,IAAA,CAAK,0BAAA,CAA2B,kBAAkB,CAAC,CAAA;AAAA,EAC7E;AACA,EAAA,IAAI,eAAA,EAAiB;AACjB,IAAA,qBAAA,CAAsB,IAAA;AAAA,MAClB,4BAAA,CAA6B;AAAA,QACzB,iBAAA;AAAA,QACA,mBAAA;AAAA,QACA,eAAA,EAAiB,eAAA,oBAAmB,IAAI,GAAA;AAAY,OACvD;AAAA,KACL;AAAA,EACJ;AAEA,EAAA,IAAI,qBAAA,CAAsB,WAAW,CAAA,EAAG;AACpC,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,OAAO,CAAC,KAAA,EAAO,IAAA,EAAM,MAAA,KAAW;AAC5B,IAAA,IAAI,CAAC,kBAAA,CAAmB,KAAK,CAAA,EAAG;AAC5B,MAAA;AAAA,IACJ;AAEA,IAAA,KAAA,MAAW,QAAQ,qBAAA,EAAuB;AACtC,MAAA,IAAA,CAAK,KAAA,EAAO,MAAM,MAAM,CAAA;AAAA,IAC5B;AAAA,EACJ,CAAA;AACJ;AAEA,SAAS,2BAA2B,YAAA,EAAuD;AACvF,EAAA,OAAO,CAAC,KAAA,EAAO,IAAA,EAAM,MAAA,KAAW;AAC5B,IAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACpC,MAAA,IAAI,YAAA,CAAa,KAAA,EAAO,WAAW,CAAA,EAAG;AAClC,QAAA;AAAA,MACJ;AACA,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,IAAA;AAAA,QACA,OAAA,EAAS,8BAA8B,WAAW,CAAA,CAAA,CAAA;AAAA,QAClD,OAAA,EAAS;AAAA,OACZ,CAAA;AAAA,IACL;AAAA,EACJ,CAAA;AACJ;AAEA,SAAS,2BAA2B,kBAAA,EAAyE;AACzG,EAAA,OAAO,CAAC,KAAA,EAAO,IAAA,EAAM,MAAA,KAAW;AAC5B,IAAA,KAAA,MAAW,CAAC,YAAA,EAAc,SAAS,CAAA,IAAK,kBAAA,EAAoB;AACxD,MAAA,IAAI,CAAC,YAAA,CAAa,KAAA,EAAO,YAAY,CAAA,EAAG;AACpC,QAAA;AAAA,MACJ;AACA,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,SAAA,CAAU,KAAA,CAAM,YAAY,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,CAAC,CAAA;AAAA,IAC5E;AAAA,EACJ,CAAA;AACJ;AAEA,SAAS,4BAAA,CAA6B;AAAA,EAClC,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACJ,CAAA,EAIyB;AACrB,EAAA,OAAO,CAAC,KAAA,EAAO,IAAA,EAAM,MAAA,KAAW;AAC5B,IAAA,KAAA,MAAW,SAAA,IAAa,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACxC,MAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA,EAAG;AAChC,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,iBAAA,EAAmB;AACnB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACR,IAAA;AAAA,UACA,OAAA,EAAS,wBAAwB,SAAS,CAAA,gBAAA,CAAA;AAAA,UAC1C,OAAA,EAAS;AAAA,SACZ,CAAA;AACD,QAAA;AAAA,MACJ;AACA,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,mBAAA,CAAqB,KAAA,CAAM,SAAS,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAC,CAAA;AAAA,IACjF;AAAA,EACJ,CAAA;AACJ;AAEA,SAAS,yBAAyB,MAAA,EAA2C;AACzE,EAAA,MAAM,WAAA,GAAc,OAAO,QAAA,KAAa,MAAA;AACxC,EAAA,MAAM,WAAA,GAAc,OAAO,QAAA,KAAa,MAAA;AACxC,EAAA,MAAM,iBAAiB,MAAA,CAAO,KAAA,GAAQ,aAAA,CAAc,MAAA,CAAO,KAAK,CAAA,GAAI,IAAA;AACpE,EAAA,IAAI,CAAC,WAAA,IAAe,CAAC,WAAA,IAAe,mBAAmB,IAAA,EAAM;AACzD,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,EAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,EAAA,OAAO,CAAC,KAAA,EAAO,IAAA,EAAM,MAAA,KAAW;AAC5B,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvB,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,WAAA,IAAe,KAAA,CAAM,MAAA,GAAS,QAAA,EAAW;AACzC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,IAAA;AAAA,QACA,OAAA,EAAS,CAAA,aAAA,EAAgB,KAAA,CAAM,MAAM,0BAA0B,QAAS,CAAA,CAAA;AAAA,QACxE,OAAA,EAAS;AAAA,OACZ,CAAA;AAAA,IACL;AACA,IAAA,IAAI,WAAA,IAAe,KAAA,CAAM,MAAA,GAAS,QAAA,EAAW;AACzC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,IAAA;AAAA,QACA,OAAA,EAAS,CAAA,aAAA,EAAgB,KAAA,CAAM,MAAM,6BAA6B,QAAS,CAAA,CAAA;AAAA,QAC3E,OAAA,EAAS;AAAA,OACZ,CAAA;AAAA,IACL;AACA,IAAA,IAAI,mBAAmB,IAAA,EAAM;AACzB,MAAA;AAAA,IACJ;AACA,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,IAAI,CAAA,IAAK,KAAA,CAAM,SAAQ,EAAG;AACzC,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,cAAA,CAAe,IAAA,EAAM,GAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAC,CAAA;AAAA,IAC3D;AAAA,EACJ,CAAA;AACJ;AAcO,SAAS,kBAAA,CAAmB,KAAA,EAAgB,MAAA,EAAoB,IAAA,GAAe,EAAA,EAAiC;AACnH,EAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA;AACrC,EAAA,OAAO,QAAA,CAAS,OAAO,IAAI,CAAA;AAC/B;AAKA,SAAS,cAAc,KAAA,EAAwB;AAC3C,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,MAAA;AAC3B,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,OAAA;AACjC,EAAA,OAAO,OAAO,KAAA;AAClB;AAYO,SAAS,gBAAgB,MAAA,EAA6B;AACzD,EAAA,IAAI,MAAA,KAAW,IAAA,EAAM,OAAO,EAAE,MAAM,MAAA,EAAO;AAC3C,EAAA,IAAI,MAAM,OAAA,CAAQ,MAAM,GAAG,OAAO,EAAE,MAAM,OAAA,EAAQ;AAClD,EAAA,QAAQ,OAAO,MAAA;AAAQ,IACnB,KAAK,QAAA;AACD,MAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAAA,IAC5B,KAAK,QAAA;AACD,MAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAAA,IAC5B,KAAK,SAAA;AACD,MAAA,OAAO,EAAE,MAAM,SAAA,EAAU;AAAA,IAC7B,KAAK,QAAA;AACD,MAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAAA,IAC5B;AACI,MAAA,OAAO,EAAC;AAAA;AAEpB;;;ACrhBO,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BnC,WAAA,CAAY,IAAA,EAA2B,OAAA,EAAiB,KAAA,EAAiB;AACrE,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EACpD;AACJ;;;AC1EA,SAAS,gBAAA,GAA+C;AACpD,EAAA,OAAQ,UAAA,CAA4C,OAAA;AACxD;AAEO,SAAS,iBAAA,GAAwC;AACpD,EAAA,MAAM,iBAAiB,gBAAA,EAAiB;AACxC,EAAA,IAAI,cAAA,EAAgB,GAAA,EAAK,QAAA,KAAa,MAAA,EAAW;AAC7C,IAAA,OAAO,eAAe,GAAA,CAAI,QAAA;AAAA,EAC9B;AACA,EAAA,OAAO,MAAA;AACX;AAEO,SAAS,wBAAA,GAA0C;AACtD,EAAA,MAAM,eAAgB,UAAA,CAAmC,MAAA;AACzD,EAAA,IAAI,CAAC,YAAA,EAAc,OAAO,EAAC;AAE3B,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,MAAM,UAAA,GAAa,CAAC,MAAA,KAA8B;AAC9C,IAAA,IAAI;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACJ,CAAA;AAEA,EAAA,UAAA,CAAW,MAAM,aAAa,YAAY,CAAA;AAC1C,EAAA,UAAA,CAAW,MAAM,aAAa,cAAc,CAAA;AAC5C,EAAA,OAAO,QAAA;AACX;;;ACuCA,IAAM,kBAAA,0BAA4B,uBAAuB,CAAA;AACzD,IAAM,0BAAA,uBAAiC,OAAA,EAAqC;AAC5E,IAAM,yBAAA,uBAAgC,OAAA,EAA6B;AACnE,IAAM,mBAAA,uBAA0B,OAAA,EAAwB;AACxD,IAAI,sBAAA,GAAyB,CAAA;AAEtB,SAAS,iBAAA,CAAkB,SAAiB,OAAA,EAA0B;AACzE,EAAA,OAAO,KAAK,SAAA,CAAU;AAAA,IAClB,OAAA;AAAA,IACA;AAAA,GACwB,CAAA;AAChC;AAEO,SAAS,gBAAA,CACZ,KAAA,EACA,UAAA,EACA,KAAA,EACoB;AACpB,EAAA,MAAM,MAAA,GAAS,EAAE,KAAA,EAAM;AACvB,EAAA,IAAI,UAAU,MAAA,EAAW;AACrB,IAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAK,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,UAAA,KAAe,MAAA,EAAW,MAAA,CAAO,UAAA,GAAa,UAAA;AAClD,EAAA,OAAO,MAAA;AACX;AAEA,SAAS,oBAAA,GAAgC;AACrC,EAAA,OAAO,mBAAkB,KAAM,aAAA;AACnC;AAEA,SAAS,sBAAsB,GAAA,EAA0B;AACrD,EAAA,IAAI,QAAA,GAAW,yBAAA,CAA0B,GAAA,CAAI,GAAG,CAAA;AAChD,EAAA,IAAI,CAAC,QAAA,EAAU;AACX,IAAA,QAAA,uBAAe,GAAA,EAAY;AAC3B,IAAA,yBAAA,CAA0B,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,QAAA;AACX;AAEA,SAAS,QAAA,CAAS,GAAA,EAAa,EAAA,EAAY,OAAA,EAAuB;AAC9D,EAAA,MAAM,QAAA,GAAW,sBAAsB,GAAG,CAAA;AAC1C,EAAA,IAAI,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG;AACtB,EAAA,QAAA,CAAS,IAAI,EAAE,CAAA;AACf,EAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AACxB;AAEA,SAAS,sBAAsB,KAAA,EAAwB;AACnD,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC7B,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,SAAA,CAAU,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,IAAA,CAAK,GAAG,EAAE,IAAA,EAAK;AACnF,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,WAAA;AAC3B,IAAA,OAAO,YAAY,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,IAAI,MAAM,CAAA,CAAA,CAAA;AAAA,EACrD;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,SAAiB,CAAA,EAAG,KAAA,CAAM,UAAU,CAAA,CAAA,CAAA;AACzD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,MAAM,QAAA,EAAS;AACrD,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,WAAA;AAChC,EAAA,IAAI;AACA,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC/B,CAAA,CAAA,MAAQ;AACJ,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,KAAK,KAAK,CAAA;AAChD,IAAA,IAAI,UAAU,IAAA,KAAS,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,UAAA,CAAA,EAAa;AAC9E,MAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,qBAAA,CAAsB,KAAK,CAAC,CAAA,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,GAAA;AAAA,EACX;AACJ;AAEA,SAAS,aAAa,KAAA,EAAiC;AACnD,EAAA,OAAO,UAAU,IAAA,KAAS,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,KAAU,UAAA,CAAA;AAC5E;AAEA,SAASA,aAAAA,CAAa,OAAe,QAAA,EAAgC;AACjE,EAAA,MAAM,SAAU,MAAA,CAAsF,MAAA;AACtG,EAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAC9B,IAAA,OAAO,MAAA,CAAO,OAAO,QAAQ,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,MAAA,CAAO,wBAAA,CAAyB,KAAA,EAAO,QAAQ,CAAA,KAAM,MAAA;AAChE;AAEA,SAAS,sBAAsB,KAAA,EAAuB;AAClD,EAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,GAAA,CAAI,KAAK,CAAA;AAC9C,EAAA,IAAI,QAAA,KAAa,QAAW,OAAO,QAAA;AACnC,EAAA,MAAM,EAAA,GAAK,sBAAA,EAAA;AACX,EAAA,mBAAA,CAAoB,GAAA,CAAI,OAAO,EAAE,CAAA;AACjC,EAAA,OAAO,EAAA;AACX;AAEA,SAAS,wBAAA,CAA4B;AAAA,EACjC,GAAA;AAAA,EACA,GAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA;AACJ,CAAA,EASW;AACP,EAAA,MAAM,iBACF,QAAA,IAAY,IAAA,IAAQ,CAAC,YAAA,CAAa,QAAQ,CAAA,GACpC,oBAAA,GACA,CAAA,MAAA,EAAS,qBAAA,CAAuB,SAAkC,MAAM,CAAC,IAAI,qBAAA,CAAuB,QAAA,CAAkC,MAAM,CAAC,CAAA,CAAA;AACvJ,EAAA,MAAM,kBAAA,GACF,SAAA,IAAa,IAAA,IAAQ,CAAC,YAAA,CAAa,SAAS,CAAA,GACtC,cAAA,GACA,CAAA,UAAA,EAAa,qBAAA,CAAsB,SAAS,CAAC,CAAA,CAAA;AAEvD,EAAA,OAAO,KAAK,SAAA,CAAU;AAAA,IAClB,GAAA;AAAA,IACA,YAAA,EAAc,sBAAsB,YAAY,CAAA;AAAA,IAChD,KAAA,EAAO,cAAA;AAAA,IACP,eAAe,aAAA,IAAiB,IAAA;AAAA,IAChC,cAAA,EAAgB,QAAQ,cAAc,CAAA;AAAA,IACtC,SAAA,EAAW,kBAAA;AAAA,IACX,YAAA,EAAc,YAAY,SAAA,IAAa,IAAA;AAAA,IACvC,cAAA,EAAgB,YAAY,WAAA,KAAgB,MAAA;AAAA,IAC5C,iBAAA,EAAoB,IAAkC,YAAA,IAAgB;AAAA,GACzE,CAAA;AACL;AAEO,SAAS,sBAAA,CACZ,iBACA,OAAA,EACgC;AAChC,EAAA,IAAI,OAAO,oBAAoB,QAAA,EAAU;AACrC,IAAA,OAAO,eAAA;AAAA,EACX;AACA,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,EACnF;AACA,EAAA,OAAO;AAAA,IACH,GAAA,EAAK,eAAA;AAAA,IACL;AAAA,GACJ;AACJ;AAUO,SAAS,2BAAA,CACZ,GAAA,EACA,eAAA,EACA,OAAA,EACA,aAAA,EAC2B;AAC3B,EAAA,MAAM,UAAA,GAAa,sBAAA,CAAuB,eAAA,EAAiB,OAAO,CAAA;AAClE,EAAA,MAAM,MAAM,UAAA,CAAW,GAAA;AACvB,EAAA,MAAM,kBAAkB,UAAA,CAAW,OAAA;AAEnC,EAAA,MAAM;AAAA,IACF,YAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA,IACA,KAAA,EAAO,QAAA;AAAA,IACP,MAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAA,EAAK;AAAA,GACT,GAAI,eAAA;AAEJ,EAAA,MAAM,QAAQ,QAAA,IAAY,SAAA;AAC1B,EAAA,MAAM,aAAA,GAAgB,UAAA,EAAY,SAAA,IAAa,GAAA,CAAI,YAAA;AACnD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,QAAA,CAAS,kBAAkB,aAAa,CAAA;AAC5E,EAAA,MAAM,qBAAqB,oBAAA,EAAqB;AAChD,EAAA,MAAM,mBAAA,GAAsB,OAAA;AAAA,IACxB,MACI,qBACM,wBAAA,CAAyB;AAAA,MACrB,GAAA;AAAA,MACA,GAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAC,GAAI,EAAE,aAAA,EAAc;AAAA,MACvD,SAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACH,CAAA,GACD,IAAA;AAAA,IACV;AAAA,MACI,kBAAA;AAAA,MACA,GAAA;AAAA,MACA,GAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA,EAAY,SAAA;AAAA,MACZ,UAAA,EAAY;AAAA;AAChB,GACJ;AAEA,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAChB,CAAC,KAAA,KACG,OAAO,iBAAiB,UAAA,GACjB,YAAA,CAAyD,KAAK,CAAA,GAC/D,YAAA;AAAA,IACV,CAAC,YAAY;AAAA,GACjB;AAEA,EAAA,MAAM,cAAA,GAAiB,YAAY,MAAM;AACrC,IAAA,MAAM,cAAc,UAAA,EAAY,WAAA;AAChC,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC3B,MAAA,OAAO,WAAA,EAAY;AAAA,IACvB;AACA,IAAA,OAAO,OAAO,WAAA,KAAgB,UAAA,GAAc,WAAA,EAAwB,GAAI,WAAA;AAAA,EAC5E,CAAA,EAAG,CAAC,WAAA,EAAa,UAAA,EAAY,WAAW,CAAC,CAAA;AAEzC,EAAA,MAAMC,cAAAA,GAAgB,WAAA;AAAA,IAClB,CAAC,OAAA,KAAkG;AAC/F,MAAA,IAAI;AACA,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,QAAA,IACI,OAAO,MAAA,KAAW,QAAA,IAClB,UAAU,IAAA,IACV,CAAC,OAAO,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA,IAChC,OAAO,OAAA,GAAU,CAAA,IACjB,CAACD,aAAAA,CAAa,MAAA,EAAQ,SAAS,CAAA,EACjC;AACE,UAAA,OAAO;AAAA,YACH,EAAA,EAAI,KAAA;AAAA,YACJ,OAAO,IAAI,WAAA,CAAY,kBAAA,EAAoB,CAAA,0BAAA,EAA6B,GAAG,CAAA,CAAA,CAAG;AAAA,WAClF;AAAA,QACJ;AACA,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,QAAA,EAAU,MAAA,EAAO;AAAA,MACxC,SAAS,GAAA,EAAK;AACV,QAAA,OAAO;AAAA,UACH,EAAA,EAAI,KAAA;AAAA,UACJ,OAAO,IAAI,WAAA,CAAY,oBAAoB,CAAA,0BAAA,EAA6B,GAAG,KAAK,GAAG;AAAA,SACvF;AAAA,MACJ;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,GAAG;AAAA,GACR;AAEA,EAAA,MAAME,oBAAAA,GAAsB,WAAA;AAAA,IACxB,CAAI,SAAiB,WAAA,KAAoD;AACrE,MAAA,IAAI;AACA,QAAA,OAAO,WAAA,CAAY,OAAO,OAAO,CAAA;AAAA,MACrC,SAAS,GAAA,EAAK;AACV,QAAA,MAAM,GAAA,YAAe,aAAa,GAAA,GAAM,IAAI,WAAW,CAAA,6BAAA,EAAgC,GAAG,KAAK,GAAG,CAAA;AAAA,MACtG;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,GAAG;AAAA,GACR;AAEA,EAAA,MAAMC,oBAAAA,GAAsB,WAAA;AAAA,IACxB,CAA4B,OAAkC,KAAA,KAAwC;AAClG,MAAA,OAAO,gBAAA,CAAiB,WAAA,CAAY,KAAK,CAAA,EAAG,QAAW,KAAK,CAAA;AAAA,IAChE,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GAChB;AAEA,EAAA,OAAO;AAAA,IACH,GAAA;AAAA,IACA,GAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA,EAAAF,cAAAA;AAAA,IACA,mBAAA,EAAAC,oBAAAA;AAAA,IACA,mBAAA,EAAAC,oBAAAA;AAAA,IACA,kBAAA;AAAA,IACA,mBAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACJ;AACJ;AAEO,SAAS,iBAAA,CAAgD;AAAA,EAC5D,GAAA;AAAA,EACA,SAAA;AAAA,EACA,mBAAA,EAAAA;AACJ,CAAA,EAOG;AACC,EAAA,OAAO,WAAA;AAAA,IACH,CAAC;AAAA,MACG,KAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACJ,KAA0D;AACtD,MAAA,IAAI,CAAC,SAAA,EAAW;AACZ,QAAA,OAAO,gBAAA,CAAiB,KAAA,EAAO,UAAA,EAAY,KAAK,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,OAAA,GAA6E;AAAA,QAC/E,GAAA;AAAA,QACA;AAAA,OACJ;AACA,MAAA,IAAI,kBAAkB,MAAA,EAAW;AAC7B,QAAA,OAAA,CAAQ,aAAA,GAAgB,aAAA;AAAA,MAC5B;AAEA,MAAA,MAAM,sBAAsB,MAAM;AAC9B,QAAA,IAAI;AACA,UAAA,OAAO,oBAAoB,KAAK,CAAA;AAAA,QACpC,CAAA,CAAA,MAAQ;AACJ,UAAA,OAAO,UAAA;AAAA,QACX;AAAA,MACJ,CAAA,GAAG;AAEH,MAAA,IAAI;AACA,QAAA,MAAM,UAAA,GAAa,SAAA,CAAU,KAAA,EAAO,OAAO,CAAA;AAC3C,QAAA,MAAM,SAAA,GAAY,WAAA,GAAc,WAAA,CAAY,UAAA,EAAY,KAAK,CAAA,GAAI,KAAA;AACjE,QAAA,MAAM,cAAA,GAAiB,oBAAoB,UAAU,CAAA;AACrD,QAAA,MAAM,cAAA,GACF,kBAAA,KAAuB,KAAA,CAAA,IAAa,cAAA,KAAmB,qBACjD,cAAA,GACA,UAAA;AACV,QAAA,OAAO,gBAAA,CAAiB,UAAA,EAAY,cAAA,EAAgB,SAAS,CAAA;AAAA,MACjE,SAAS,GAAA,EAAK;AACV,QAAA,MAAM,QAAA,GACF,GAAA,YAAe,WAAA,GACT,GAAA,GACA,IAAI,YAAY,kBAAA,EAAoB,CAAA,+BAAA,EAAkC,GAAG,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AAC3F,QAAA,OAAOA,oBAAAA,CAAoB,UAAU,KAAK,CAAA;AAAA,MAC9C;AAAA,IACJ,CAAA;AAAA,IACA,CAACA,oBAAAA,EAAqB,GAAA,EAAK,SAAS;AAAA,GACxC;AACJ;AAEO,SAAS,mBAAA,CACZ,QACA,MAAA,EACmB;AACnB,EAAA,MAAM;AAAA,IACF,GAAA;AAAA,IACA,GAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,kBAAA;AAAA,IACA,mBAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACJ,GAAI,MAAA;AACJ,EAAA,MAAM,EAAE,aAAA,EAAe,cAAA,EAAgB,SAAS,IAAA,EAAM,qBAAA,EAAuB,iBAAgB,GAAI,MAAA;AAEjG,EAAA,MAAM,oBAAA,GAAuB,WAAA;AAAA,IACzB,MACI,UAAA,EAAY,WAAA,KAAgB,MAAA,GAAY,IAAA,GAAO,kBAAA;AAAA,IACnD,CAAC,YAAY,WAAW;AAAA,GAC5B;AAEA,EAAA,MAAM,gBAAA,GAAmB,aAAA,KAAkB,aAAA,IAAiB,CAAC,UAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IACd,CAAC,QAAA,KAAyB;AACtB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACT,QAAA,OAAO,MAAM,MAAA;AAAA,MACjB;AACA,MAAA,IAAI,gBAAA,EAAkB;AAClB,QAAA,OAAO,MAAM,MAAA;AAAA,MACjB;AACA,MAAA,OAAO,GAAA,CAAI,YAAA,CAAa,GAAA,EAAK,QAAQ,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,GAAA,EAAK,gBAAA,EAAkB,GAAG;AAAA,GACvC;AAEA,EAAA,MAAM,GAAA,GAAM,oBAAA;AAAA,IACR,SAAA;AAAA,IACA,MAAO,UAAU,CAAC,gBAAA,GAAmB,IAAI,cAAA,CAAe,GAAG,IAAI,oBAAA,EAAqB;AAAA,IACpF;AAAA,GACJ;AAEA,EAAA,MAAM,OAAA,GAAU,QAAQ,MAAM;AAC1B,IAAA,IAAI,QAAQ,kBAAA,EAAoB;AAC5B,MAAA,OAAO,gBAAA,CAA2B,gBAAgB,CAAA;AAAA,IACtD;AACA,IAAA,OAAO,cAAc,GAAG,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,aAAA,EAAe,cAAA,EAAgB,GAAG,CAAC,CAAA;AACvC,EAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AAEtB,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,IAAI,CAAC,kBAAA,EAAoB;AAEzB,IAAA,MAAM,eAAgB,UAAA,CAAmC,MAAA;AAEzD,IAAA,IAAI,mBAAmB,GAAA,CAAI,gBAAA,IAAoB,MAAA,MAAY,MAAA,IAAU,iBAAiB,MAAA,EAAW;AAC7F,MAAA,QAAA;AAAA,QACI,GAAA;AAAA,QACA,kBAAkB,GAAG,CAAA,CAAA;AAAA,QACrB,8BAA8B,GAAG,CAAA,gWAAA;AAAA,OACrC;AAAA,IACJ;AAEA,IAAA,qBAAA,GAAwB;AAAA,MACpB,GAAA;AAAA,MACA,GAAA;AAAA,MACA,cAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAU,CAAC,EAAA,EAAI,YAAY,QAAA,CAAS,GAAA,EAAK,IAAI,OAAO;AAAA,KACvD,CAAA;AAED,IAAA,IAAI,YAAA,GAAe,0BAAA,CAA2B,GAAA,CAAI,GAAG,CAAA;AACrD,IAAA,IAAI,CAAC,YAAA,EAAc;AACf,MAAA,YAAA,uBAAmB,GAAA,EAAoB;AACvC,MAAA,0BAAA,CAA2B,GAAA,CAAI,KAAK,YAAY,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI,wBAAwB,IAAA,EAAM;AAC9B,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AAC7C,IAAA,IAAI,qBAAqB,MAAA,EAAW;AAChC,MAAA,YAAA,CAAa,GAAA,CAAI,KAAK,mBAAmB,CAAA;AACzC,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,qBAAqB,mBAAA,EAAqB;AAC1C,MAAA;AAAA,IACJ;AAEA,IAAA,QAAA;AAAA,MACI,GAAA;AAAA,MACA,qBAAqB,GAAG,CAAA,CAAA;AAAA,MACxB,CAAA,kEAAA,EAAqE,GAAG,CAAA,gBAAA,EAAmB,GAAA,CAAI,OAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,sKAAA;AAAA,KACtH;AAAA,EACJ,CAAA,EAAG;AAAA,IACC,MAAA;AAAA,IACA,qBAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA,kBAAA;AAAA,IACA,mBAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA,CAAI;AAAA,GACP,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,UAAA,EAAY;AAChB,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACtB,CAAA,EAAG,CAAC,UAAA,EAAY,aAAa,CAAC,CAAA;AAE9B,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,IAAI,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,UAAA,KAAe,GAAA,EAAK;AAClD,MAAA,GAAA,CAAI,MAAA,CAAO,GAAA,EAAK,OAAA,CAAQ,UAAU,CAAA;AAAA,IACtC;AAAA,EACJ,CAAA,EAAG,CAAC,MAAA,EAAQ,GAAA,EAAK,QAAQ,UAAA,EAAY,GAAA,EAAK,GAAG,CAAC,CAAA;AAE9C,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,eAAA,GAAkB,OAAO,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAA,EAAS,eAAe,CAAC,CAAA;AAErC,EAAA,MAAM,OAAA,GAAU,OAAU,KAAK,CAAA;AAE/B,EAAA,MAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC5B,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,IAAI,QAAQ,OAAA,EAAS;AACrB,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,IAAA,OAAA,GAAU,KAAK,CAAA;AACf,IAAA,OAAA,CAAQ,OAAA,GAAU,KAAA;AAAA,EAEtB,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,MAAA,CAAO,EAAA,CAAG,IAAA,EAAM,KAAK,CAAA,EAAG;AAC5B,IAAA,OAAA,CAAQ,OAAA,GAAU,KAAA;AAClB,IAAA,QAAA,GAAW,OAAO,IAAI,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAC,CAAA;AAE5B,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,IAAI,CAAC,cAAA,EAAgB;AACrB,IAAA,MAAM,eAAgB,UAAA,CAAmC,MAAA;AACzD,IAAA,IAAI,iBAAiB,MAAA,EAAW;AAEhC,IAAA,MAAM,UAAA,GAAa,IAAI,MAAA,GAAS,GAAA;AAEhC,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAoB;AACjC,MAAA,IAAI,CAAA,CAAE,QAAQ,IAAA,EAAM;AAChB,QAAA,GAAA,CAAI,UAAU,GAAG,CAAA;AACjB,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,CAAA,CAAE,QAAQ,UAAA,EAAY;AAC1B,MAAA,IAAI,CAAA,CAAE,YAAY,IAAA,EAAM;AACpB,QAAA,GAAA,CAAI,UAAU,GAAG,CAAA;AACjB,QAAA;AAAA,MACJ;AACA,MAAA,GAAA,CAAI,MAAA,CAAO,GAAA,EAAK,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC9B,CAAA;AAEA,IAAA,YAAA,CAAa,gBAAA,CAAiB,WAAW,OAAO,CAAA;AAChD,IAAA,OAAO,MAAM,YAAA,CAAa,mBAAA,CAAoB,SAAA,EAAW,OAAO,CAAA;AAAA,EACpE,GAAG,CAAC,MAAA,EAAQ,cAAA,EAAgB,GAAA,EAAK,GAAG,CAAC,CAAA;AAErC,EAAA,MAAM,GAAA,GAAM,QAAQ,MAAM;AACtB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACT,MAAA,OAAO,MAAM,MAAA;AAAA,IACjB;AACA,IAAA,OAAO,CAAC,IAAA,KAA8B;AAClC,MAAA,MAAM,OAAA,GACF,OAAO,IAAA,KAAS,UAAA,GAAc,IAAA,CAAqB,aAAA,CAAc,GAAA,CAAI,cAAA,CAAe,GAAG,CAAC,CAAA,CAAE,KAAK,CAAA,GAAI,IAAA;AACvG,MAAA,IAAI;AACA,QAAA,MAAM,OAAA,GAAU,eAAe,OAAO,CAAA;AACtC,QAAA,GAAA,CAAI,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,MAC3B,SAAS,GAAA,EAAK;AACV,QAAA,IAAI,eAAe,WAAA,EAAa;AAC5B,UAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,GAAG,CAAA,GAAA,EAAM,IAAI,IAAI,CAAA,EAAA,CAAA,EAAM,IAAI,OAAO,CAAA;AACpF,UAAA;AAAA,QACJ;AACA,QAAA,IAAI,eAAe,UAAA,EAAY;AAC3B,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uCAAA,EAA0C,GAAG,CAAA,EAAA,CAAA,EAAM,IAAI,OAAO,CAAA;AAC5E,UAAA;AAAA,QACJ;AACA,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kCAAA,EAAqC,GAAG,CAAA,EAAA,CAAA,EAAM,GAAG,CAAA;AAAA,MACnE;AAAA,IACJ,CAAA;AAAA,EACJ,GAAG,CAAC,MAAA,EAAQ,KAAK,GAAA,EAAK,aAAA,EAAe,cAAc,CAAC,CAAA;AAEpD,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAM;AACxB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACT,MAAA,OAAO,MAAM,MAAA;AAAA,IACjB;AACA,IAAA,OAAO,MAAM;AACT,MAAA,MAAM,IAAI,WAAA,EAAY;AACtB,MAAA,IAAI;AACA,QAAA,MAAM,OAAA,GAAU,eAAe,CAAC,CAAA;AAChC,QAAA,GAAA,CAAI,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,MAC3B,SAAS,GAAA,EAAK;AACV,QAAA,IAAI,eAAe,WAAA,EAAa;AAC5B,UAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,GAAG,CAAA,GAAA,EAAM,IAAI,IAAI,CAAA,EAAA,CAAA,EAAM,IAAI,OAAO,CAAA;AACpF,UAAA;AAAA,QACJ;AACA,QAAA,IAAI,eAAe,UAAA,EAAY;AAC3B,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uCAAA,EAA0C,GAAG,CAAA,EAAA,CAAA,EAAM,IAAI,OAAO,CAAA;AAAA,QAChF;AACA,QAAA;AAAA,MACJ;AAAA,IACJ,CAAA;AAAA,EACJ,GAAG,CAAC,MAAA,EAAQ,KAAK,GAAA,EAAK,WAAA,EAAa,cAAc,CAAC,CAAA;AAElD,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAM;AACzB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACT,MAAA,OAAO,MAAM,MAAA;AAAA,IACjB;AACA,IAAA,OAAO,MAAM,GAAA,CAAI,SAAA,CAAU,GAAG,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,MAAA,EAAQ,GAAA,EAAK,GAAG,CAAC,CAAA;AAErB,EAAA,OAAO,OAAA;AAAA,IACH,OAAO;AAAA,MACH,KAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACJ,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,MAAM;AAAA,GAC9B;AACJ;;;AC1oBA,SAAS,4BAA+B,YAAA,EAAgE;AACpG,EAAA,OAAO,OAAO,YAAA,KAAiB,UAAA,GAAc,YAAA,EAAyB,GAAI,YAAA;AAC9E;AAEA,SAASH,aAAAA,CAAa,OAAe,QAAA,EAAgC;AACjE,EAAA,MAAM,SAAU,MAAA,CAAsF,MAAA;AACtG,EAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAC9B,IAAA,OAAO,MAAA,CAAO,OAAO,QAAQ,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,MAAA,CAAO,wBAAA,CAAyB,KAAA,EAAO,QAAQ,CAAA,KAAM,MAAA;AAChE;AAEA,SAAS,aAAA,CAAc,KAAa,OAAA,EAAmC;AACnE,EAAA,IAAI;AACA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,IAAA,IACI,OAAO,MAAA,KAAW,QAAA,IAClB,UAAU,IAAA,IACV,CAAC,OAAO,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA,IAChC,OAAO,OAAA,GAAU,CAAA,IACjB,CAACA,aAAAA,CAAa,MAAA,EAAQ,SAAS,CAAA,EACjC;AACE,MAAA,MAAM,IAAI,WAAA,CAAY,kBAAA,EAAoB,CAAA,0BAAA,EAA6B,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IACjF;AACA,IAAA,OAAO,MAAA;AAAA,EACX,SAAS,KAAA,EAAO;AACZ,IAAA,IAAI,iBAAiB,WAAA,EAAa;AAC9B,MAAA,MAAM,KAAA;AAAA,IACV;AACA,IAAA,MAAM,IAAI,WAAA,CAAY,kBAAA,EAAoB,CAAA,0BAAA,EAA6B,GAAG,KAAK,KAAK,CAAA;AAAA,EACxF;AACJ;AAEA,SAAS,mBAAA,CAAuB,GAAA,EAAa,OAAA,EAAiB,OAAA,EAA2C;AACrG,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,SAAA;AAC/B,EAAA,IAAI;AACA,IAAA,OAAO,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,EAC/B,SAAS,KAAA,EAAO;AACZ,IAAA,MAAM,KAAA,YAAiB,aAAa,KAAA,GAAQ,IAAI,WAAW,CAAA,6BAAA,EAAgC,GAAG,KAAK,KAAK,CAAA;AAAA,EAC5G;AACJ;AAEA,SAAS,qBAAA,CAAsB,GAAA,EAAa,KAAA,EAAgB,UAAA,EAA8B;AACtF,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,KAAA,EAAO,UAAU,CAAA;AACnD,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACrB,IAAA;AAAA,EACJ;AACA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,CAAC,UAAU,CAAA,EAAG,KAAA,CAAM,IAAA,IAAQ,GAAG,KAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AACzF,EAAA,MAAM,IAAI,WAAA,CAAY,eAAA,EAAiB,qCAAqC,GAAG,CAAA,GAAA,EAAM,OAAO,CAAA,CAAE,CAAA;AAClG;AAEA,SAAS,sBAAsB,cAAA,EAA0C;AACrE,EAAA,OAAO,cAAA,KAAmB,MAAA;AAC9B;AAEA,SAAS,oBAAuB,OAAA,EAA+D;AAC3F,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,2BAAA,CAA4B,OAAA,CAAQ,YAAY;AAAA,GAC3D;AACJ;AAEA,SAAS,eAAA,CAAgB,gBAA4C,GAAA,EAAoC;AACrG,EAAA,OAAO,cAAA,EAAgB,gBAAgB,GAAG,CAAA;AAC9C;AAEA,SAAS,mBAAA,CACL,cAAA,EACA,GAAA,EACA,OAAA,EACqB;AACrB,EAAA,OAAO,cAAA,EAAgB,SAAA,CAAU,GAAA,EAAK,OAAO,CAAA;AACjD;AAEA,SAAS,gBAAA,CACL,cAAA,EACA,GAAA,EACA,WAAA,EACA,SAAA,EACoB;AACpB,EAAA,OAAO,cAAA,EAAgB,gBAAA,CAAiB,GAAA,EAAK,WAAA,EAAa,SAAS,CAAA,IAAK,IAAA;AAC5E;AAEA,SAAS,mBAAA,CACL,GAAA,EACA,SAAA,EACA,OAAA,EACA,cAAA,EACM;AACN,EAAA,MAAM,eAAA,GAAkB,QAAQ,MAAA,EAAQ,OAAA;AACxC,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,cAAA,EAAgB,GAAG,CAAA;AACxD,EAAA,MAAM,YAAA,GACF,oBAAoB,MAAA,GACd,YAAA,GACC,oBAAoB,cAAA,EAAgB,GAAA,EAAK,eAAe,CAAA,IAAK,YAAA;AAExE,EAAA,IAAI,CAAC,YAAA,EAAc;AACf,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,SAAA;AAC/B,IAAA,OAAO,iBAAA,CAAkB,CAAA,EAAG,KAAA,CAAM,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,EACvD;AAEA,EAAA,IAAI,YAAA,GAAwB,SAAA;AAC5B,EAAA,MAAM,cAAA,GAAiB,cAAA,EAAgB,iBAAA,GAAoB,GAAA,EAAK,aAAa,OAAO,CAAA;AACpF,EAAA,IAAI,cAAA,EAAgB;AAChB,IAAA,IAAI;AACA,MAAA,YAAA,GAAe,cAAA,CAAe,QAAQ,YAAY,CAAA;AAAA,IACtD,SAAS,KAAA,EAAO;AACZ,MAAA,MAAM,KAAA,YAAiB,cACjB,KAAA,GACA,IAAI,YAAY,kBAAA,EAAoB,CAAA,qCAAA,EAAwC,GAAG,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,IACnG;AAAA,EACJ;AAEA,EAAA,qBAAA,CAAsB,GAAA,EAAK,YAAA,EAAc,YAAA,CAAa,MAAM,CAAA;AAC5D,EAAA,OAAO,iBAAA,CAAkB,YAAA,CAAa,OAAA,EAAS,YAAY,CAAA;AAC/D;AAEA,SAAS,0BAAA,CACL,GAAA,EACA,QAAA,EACA,OAAA,EACqB;AACrB,EAAA,IAAI,OAAO,QAAA,CAAS,OAAA,KAAY,QAAA,EAAU;AACtC,IAAA,OAAO;AAAA,MACH,OAAO,QAAA,CAAS;AAAA,KACpB;AAAA,EACJ;AAEA,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,mBAAA,CAAoB,GAAA,EAAK,QAAA,CAAS,SAAS,OAAO;AAAA,GAC7D;AACJ;AAEA,SAAS,wBAAA,CACL,GAAA,EACA,QAAA,EACA,OAAA,EACA,cAAA,EACqB;AACrB,EAAA,IAAI,CAAC,gBAAgB,cAAA,EAAgB;AACjC,IAAA,MAAM,IAAI,WAAA;AAAA,MACN,4BAAA;AAAA,MACA,kEAAkE,GAAG,CAAA,CAAA;AAAA,KACzE;AAAA,EACJ;AAEA,EAAA,MAAM,OAAA,GACF,OAAO,QAAA,CAAS,OAAA,KAAY,QAAA,GACtB,mBAAA,CAAoB,GAAA,EAAK,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA,GACjD,QAAA,CAAS,OAAA;AACpB,EAAA,MAAM,aAAA,GAA2B;AAAA,IAC7B,GAAA;AAAA,IACA,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ,gBAAgB,OAAO;AAAA,GACnC;AAEA,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,OAAA;AAAA,IACP,UAAA,EAAY,iBAAA,CAAkB,aAAA,CAAc,OAAA,EAAS,OAAO,CAAA;AAAA,IAC5D;AAAA,GACJ;AACJ;AAEA,SAAS,2BAAA,CACL,GAAA,EACA,QAAA,EACA,gBAAA,EACA,cACA,cAAA,EACqB;AACrB,EAAA,IAAI,UAAmB,QAAA,CAAS,OAAA;AAChC,EAAA,qBAAA,CAAsB,GAAA,EAAK,OAAA,EAAS,gBAAA,CAAiB,MAAM,CAAA;AAE3D,EAAA,IAAI,CAAC,YAAA,IAAgB,QAAA,CAAS,OAAA,IAAW,aAAa,OAAA,EAAS;AAC3D,IAAA,OAAO;AAAA,MACH,KAAA,EAAO;AAAA,KACX;AAAA,EACJ;AAEA,EAAA,MAAM,OAAO,gBAAA,CAAiB,cAAA,EAAgB,KAAK,QAAA,CAAS,OAAA,EAAS,aAAa,OAAO,CAAA;AACzF,EAAA,IAAI,CAAC,IAAA,EAAM;AACP,IAAA,MAAM,IAAI,WAAA;AAAA,MACN,0BAAA;AAAA,MACA,8BAA8B,GAAG,CAAA,QAAA,EAAW,SAAS,OAAO,CAAA,KAAA,EAAQ,aAAa,OAAO,CAAA;AAAA,KAC5F;AAAA,EACJ;AAEA,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACrB,IAAA,OAAA,GAAU,IAAA,CAAK,QAAQ,OAAO,CAAA;AAAA,EAClC;AAEA,EAAA,qBAAA,CAAsB,GAAA,EAAK,OAAA,EAAS,YAAA,CAAa,MAAM,CAAA;AACvD,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,OAAA;AAAA,IACP,UAAA,EAAY,iBAAA,CAAkB,YAAA,CAAa,OAAA,EAAS,OAAO;AAAA,GAC/D;AACJ;AAEA,SAAS,oBAAA,CACL,GAAA,EACA,GAAA,EACA,OAAA,EACA,KACA,cAAA,EACqB;AACrB,EAAA,IAAI,OAAO,IAAA,EAAM;AACb,IAAA,OAAO,oBAAoB,OAAO,CAAA;AAAA,EACtC;AAEA,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,GAAA,EAAK,GAAG,CAAA;AACvC,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,cAAA,EAAgB,GAAG,CAAA;AACxD,EAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,cAAA,EAAgB,GAAA,EAAK,SAAS,OAAO,CAAA;AAElF,EAAA,IAAI,GAAA,CAAI,UAAA,KAAe,QAAA,IAAY,CAAC,gBAAA,EAAkB;AAClD,IAAA,MAAM,IAAI,YAAY,kBAAA,EAAoB,CAAA,mBAAA,EAAsB,GAAG,CAAA,GAAA,EAAM,QAAA,CAAS,OAAO,CAAA,CAAE,CAAA;AAAA,EAC/F;AAEA,EAAA,IAAI,GAAA,CAAI,UAAA,KAAe,YAAA,IAAgB,CAAC,gBAAA,EAAkB;AACtD,IAAA,OAAO,wBAAA,CAAyB,GAAA,EAAK,QAAA,EAAU,OAAA,EAAS,cAAc,CAAA;AAAA,EAC1E;AAEA,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACnB,IAAA,OAAO,0BAAA,CAA2B,GAAA,EAAK,QAAA,EAAU,OAAO,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,2BAAA,CAA4B,GAAA,EAAK,QAAA,EAAU,gBAAA,EAAkB,cAAc,cAAc,CAAA;AACpG;AAEO,SAAS,4BAAA,CAA6B;AAAA,EACzC,GAAA;AAAA,EACA;AACJ,CAAA,EAAyD;AACrD,EAAA,OAAO;AAAA,IACH,SAAA,EAAW,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA,CAAI,MAAA;AAAA,IACpE,YAAA,EAAc;AAAA,MACV,WAAA,EAAa,IAAA;AAAA,MACb,MAAA,EAAQ,sBAAsB,cAAc;AAAA,KAChD;AAAA,IACA,cAAc,CAAC,GAAA,EAAK,aAAa,GAAA,CAAI,YAAA,CAAa,KAAK,QAAQ,CAAA;AAAA,IAC/D,cAAA,EAAgB,CAAC,GAAA,KAAQ,GAAA,CAAI,eAAe,GAAG,CAAA;AAAA,IAC/C,cAAA,EAAgB,CAAC,GAAA,EAAK,GAAA,EAAK,OAAA,KAAY;AACnC,MAAA,IAAI;AACA,QAAA,OAAO,oBAAA,CAAqB,GAAA,EAAK,GAAA,EAAK,OAAA,EAAS,KAAK,cAAc,CAAA;AAAA,MACtE,CAAA,CAAA,MAAQ;AACJ,QAAA,OAAO,oBAAoB,OAAO,CAAA;AAAA,MACtC;AAAA,IACJ,CAAA;AAAA,IACA,QAAA,EAAU,CAAC,GAAA,EAAK,SAAA,EAAW,OAAA,KAAY;AACnC,MAAA,IAAI;AACA,QAAA,GAAA,CAAI,OAAO,GAAA,EAAK,mBAAA,CAAoB,KAAK,SAAA,EAAW,OAAA,EAAS,cAAc,CAAC,CAAA;AAAA,MAChF,SAAS,KAAA,EAAO;AACZ,QAAA,IAAI,iBAAiB,WAAA,EAAa;AAC9B,UAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,GAAG,CAAA,GAAA,EAAM,MAAM,IAAI,CAAA,EAAA,CAAA,EAAM,MAAM,OAAO,CAAA;AACxF,UAAA;AAAA,QACJ;AACA,QAAA,IAAI,iBAAiB,UAAA,EAAY;AAC7B,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gCAAA,EAAmC,GAAG,CAAA,EAAA,CAAA,EAAM,MAAM,OAAO,CAAA;AACvE,UAAA;AAAA,QACJ;AACA,QAAA,MAAM,KAAA;AAAA,MACV;AAAA,IACJ,CAAA;AAAA,IACA,WAAA,EAAa,CAAC,GAAA,KAAQ;AAClB,MAAA,GAAA,CAAI,UAAU,GAAG,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,cAAA,EAAgB,CAAC,GAAA,EAAK,GAAA,EAAK,QAAA,KAAa;AACpC,MAAA,IAAI,QAAA,CAAS,aAAA,IAAiB,cAAA,EAAgB,cAAA,EAAgB;AAC1D,QAAA,IAAI,CAAC,eAAe,SAAA,CAAU,QAAA,CAAS,cAAc,GAAA,EAAK,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA,EAAG;AACvF,UAAA,IAAI;AACA,YAAA,cAAA,CAAe,cAAA,CAAe,SAAS,aAAa,CAAA;AAAA,UACxD,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACJ;AAAA,MACJ;AACA,MAAA,IAAI,QAAA,CAAS,UAAA,KAAe,MAAA,IAAa,QAAA,CAAS,eAAe,GAAA,EAAK;AAClE,QAAA,GAAA,CAAI,MAAA,CAAO,GAAA,EAAK,QAAA,CAAS,UAAU,CAAA;AAAA,MACvC;AAAA,IACJ;AAAA,GACJ;AACJ;AClRO,IAAM,6BAAA,GAAgC,cAAqD,IAAI,CAAA;;;ACT/F,SAAS,8BAAA,CAA+B;AAAA,EAC3C,MAAA;AAAA,EACA;AACJ,CAAA,EAA6D;AACzD,EAAA,OAAO,cAAc,6BAAA,CAA8B,QAAA,EAAU,EAAE,KAAA,EAAO,MAAA,IAAU,QAAQ,CAAA;AAC5F;ACUA,IAAM,eAAA,GAAkBI,cAA+B,IAAI,CAAA;AAyBpD,SAAS,WAAA,GAAwB;AACpC,EAAA,MAAM,UAAU,mBAAA,EAAoB;AACpC,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,EACxE;AACA,EAAA,OAAO,OAAA;AACX;AAQO,SAAS,mBAAA,GAAuC;AACnD,EAAA,OAAOC,WAAW,eAAe,CAAA;AACrC;AA2BA,SAAS,qBAAA,GAAiD;AACtD,EAAA,MAAM,eAAgB,UAAA,CAAmC,MAAA;AACzD,EAAA,IAAI,YAAA,KAAiB,QAAW,OAAO,MAAA;AACvC,EAAA,IAAI;AACA,IAAA,OAAO,YAAA,CAAa,YAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,MAAA;AAAA,EACX;AACJ;AAsEA,SAAS,wBAAwB,OAAA,EAA2C;AACxE,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,IAAI;AACA,IAAA,OAAO,OAAO,OAAA,CAAQ,MAAA,KAAW,QAAA,IAAY,OAAO,QAAQ,GAAA,KAAQ,UAAA;AAAA,EACxE,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;AAEA,SAAS,mBAAA,GAA+B;AACpC,EAAA,MAAM,MAAM,iBAAA,EAAkB;AAC9B,EAAA,IAAI,QAAQ,MAAA,EAAW;AACnB,IAAA,OAAO,IAAA;AAAA,EACX;AACA,EAAA,OAAO,GAAA,KAAQ,YAAA;AACnB;AAEA,SAAS,kBAAA,GAAoD;AACzD,EAAA,MAAM,OAAQ,UAAA,CAAqC,OAAA;AACnD,EAAA,OAAO,OAAO,IAAA,KAAS,UAAA,GAAc,IAAA,GAAkC,IAAA;AAC3E;AAEA,SAAS,uBAAA,GAAmC;AACxC,EAAA,OAAO,OAAQ,WAAkD,oBAAA,KAAyB,UAAA;AAC9F;AAEA,SAAS,cAAc,KAAA,EAA+C;AAClE,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,KAAA;AAC1B,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,KAAU,YAAY,OAAO,KAAA;AACrE,EAAA,OAAO,OAAQ,MAA6B,IAAA,KAAS,UAAA;AACzD;AAEA,SAAS,mBAAA,CACL,kBACA,aAAA,EACyC;AACzC,EAAA,MAAM,8BAAA,GACF,kBAAkB,MAAA,IAClB,gBAAA,KAAqB,UACrB,wBAAA,EAAyB,CAAE,SAAS,aAAa,CAAA;AACrD,EAAA,IAAK,gBAAA,KAAqB,MAAA,IAAa,aAAA,KAAkB,MAAA,IAAc,8BAAA,EAAgC;AACnG,IAAA,OAAO,uBAAA;AAAA,EACX;AACA,EAAA,IAAI,OAAO,aAAA,EAAe,gBAAA,KAAqB,UAAA,EAAY;AACvD,IAAA,OAAO,wBAAA;AAAA,EACX;AACA,EAAA,OAAO,MAAA;AACX;AAEA,SAAS,iBAAA,GAAsD;AAC3D,EAAA,OAAQ,UAAA,CAAiD,MAAA;AAC7D;AAEA,SAAS,qBAAqB,IAAA,EAAqC;AAC/D,EAAA,MAAM,QAAA,uBAAe,GAAA,CAAI,CAAC,aAAa,SAAA,EAAW,MAAA,EAAQ,cAAA,EAAgB,QAAQ,CAAC,CAAA;AACnF,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACjC,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACvB,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,wBAAA,CAAyB,IAAA,EAAM,GAAG,CAAA;AAC5D,IAAA,IAAI,UAAA,IAAc,CAAC,UAAA,CAAW,YAAA,EAAc;AAC5C,IAAA,IAAI;AACA,MAAA,OAAO,KAAK,GAAG,CAAA;AAAA,IACnB,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACJ;AACJ;AAEA,SAAS,mBAAmB,cAAA,EAAsD;AAC9E,EAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAE5B,EAAA,MAAM,eAAe,iBAAA,EAAkB;AACvC,EAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAE1B,EAAA,MAAM,gBAAA,GAAmB,oBAAmB,KAAM,IAAA;AAClD,EAAA,MAAM,gCAAgC,uBAAA,EAAwB;AAC9D,EAAA,MAAM,WAAW,YAAA,CAAa,2BAAA;AAC9B,EAAA,MAAM,OACF,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,GAAY,WAAuC,EAAC;AAExF,EAAA,oBAAA,CAAqB,IAAI,CAAA;AAEzB,EAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,OAAO,IAAA,CAAK,cAAc,QAAA,EAAU;AACvD,IAAA,IAAA,CAAK,YAAY,EAAC;AAAA,EACtB;AAEA,EAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,OAAO,IAAA,CAAK,iBAAiB,QAAA,EAAU;AAC7D,IAAA,IAAA,CAAK,eAAe,EAAC;AAAA,EACzB;AAEA,EAAA,MAAM,eAAe,IAAA,CAAK,YAAA;AAC1B,EAAA,YAAA,CAAa,OAAA,GAAU,gBAAA;AACvB,EAAA,YAAA,CAAa,oBAAA,GAAuB,6BAAA;AAEpC,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,OAAO,IAAA,CAAK,WAAW,QAAA,EAAU;AACjD,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACV,OAAA,EAAS,CAAA;AAAA,MACT,WAAA,EAAa,KAAK,GAAA,EAAI;AAAA,MACtB,UAAA,EAAY;AAAA,KAChB;AAAA,EACJ;AAEA,EAAA,MAAM,OAAO,IAAA,CAAK,MAAA;AAClB,EAAA,IAAI,OAAO,KAAK,OAAA,KAAY,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA,EAAG;AACpE,IAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AAAA,EACnB;AACA,EAAA,IAAI,OAAO,KAAK,WAAA,KAAgB,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA,EAAG;AAC5E,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,GAAA,EAAI;AAAA,EAChC;AACA,EAAA,IAAI,OAAO,IAAA,CAAK,UAAA,KAAe,QAAA,EAAU;AACrC,IAAA,IAAA,CAAK,UAAA,GAAa,EAAA;AAAA,EACtB;AAEA,EAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AACvB,EAAA,IAAI,OAAO,IAAA,CAAK,OAAA,KAAY,UAAA,EAAY;AACpC,IAAA,IAAA,CAAK,OAAA,GAAU,CAAC,SAAA,KAAkD;AAC9D,MAAA,MAAM,KAAA,GAAQ,UAAU,SAAS,CAAA;AACjC,MAAA,IAAI,CAAC,KAAA,IAAS,OAAO,MAAM,OAAA,EAAS,KAAA,KAAU,YAAY,OAAO,IAAA;AAEjE,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAM;AACjC,MAAA,IAAI,IAAA,EAAM;AACN,QAAA,KAAA,CAAM,UAAA,GAAa,KAAK,GAAA,EAAI;AAC5B,QAAA,KAAA,CAAM,UAAA,GAAa,IAAA;AACnB,QAAA,OAAO,IAAA;AAAA,MACX;AAEA,MAAA,KAAA,CAAM,UAAA,KAAN,KAAA,CAAM,UAAA,GAAe,IAAA,CAAK,GAAA,EAAI,CAAA;AAC9B,MAAA,OAAO,IAAA;AAAA,IACX,CAAA;AAAA,EACJ;AAEA,EAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACjC,IAAA,IAAA,CAAK,IAAA,GAAO,MACR,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,CACnB,GAAA,CAAI,CAAC,CAAC,SAAA,EAAW,KAAK,CAAA,KAAM;AACzB,MAAA,MAAM,IAAA,GAAO,OAAO,KAAA,CAAM,OAAA,EAAS,UAAU,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAM,GAAI,MAAA;AAClF,MAAA,MAAM,SAAA,GAAY,QAAQ,IAAI,CAAA;AAC9B,MAAA,IAAI,SAAA,EAAW;AACX,QAAA,KAAA,CAAM,UAAA,GAAa,KAAK,GAAA,EAAI;AAC5B,QAAA,KAAA,CAAM,UAAA,GAAa,IAAA;AAAA,MACvB,CAAA,MAAO;AACH,QAAA,KAAA,CAAM,UAAA,KAAN,KAAA,CAAM,UAAA,GAAe,IAAA,CAAK,GAAA,EAAI,CAAA;AAAA,MAClC;AACA,MAAA,OAAO;AAAA,QACH,SAAA;AAAA,QACA,SAAA;AAAA,QACA,cAAc,KAAA,CAAM,YAAA;AAAA,QACpB,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,YAAY,KAAA,CAAM;AAAA,OACtB;AAAA,IACJ,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,EAChF;AAEA,EAAA,YAAA,CAAa,2BAAA,GAA8B,IAAA;AAC3C,EAAA,OAAO,IAAA;AACX;AAEA,SAAS,mBAAA,CAAoB,IAAA,EAAmC,SAAA,EAAmB,MAAA,EAAsB;AACrG,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,IAAA,CAAK,OAAO,OAAA,IAAW,CAAA;AACvB,EAAA,IAAA,CAAK,MAAA,CAAO,WAAA,GAAc,IAAA,CAAK,GAAA,EAAI;AACnC,EAAA,IAAA,CAAK,MAAA,CAAO,UAAA,GAAa,CAAA,EAAG,SAAS,IAAI,MAAM,CAAA,CAAA;AACnD;AAEA,SAAS,oBAAoB,GAAA,EAAsB;AAC/C,EAAA,IAAI;AACA,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,GAAA;AAAA,EACX;AACJ;AAEA,SAAS,cAAA,CACL,OAAA,EACA,UAAA,EACA,SAAA,EACa;AACb,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,IAAI;AACA,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA;AACtC,IAAA,IAAI,aAAA,CAAc,GAAG,CAAA,EAAG;AACpB,MAAA,SAAA,CAAU,gBAAA,CAAiB,WAAW,GAAG,CAAA;AACzC,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,SAAA,CAAU,eAAA,EAAgB;AAC1B,IAAA,OAAO,GAAA;AAAA,EACX,SAAS,KAAA,EAAO;AACZ,IAAA,SAAA,CAAU,cAAc,KAAK,CAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;AAEA,SAAS,sBAAA,CACL,OAAA,EACA,MAAA,EACA,SAAA,EACQ;AACR,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,OAAO,EAAC;AAAA,EACZ;AAEA,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,IAAI;AACA,IAAA,MAAM,gBAAgB,OAAA,CAAQ,MAAA;AAC9B,IAAA,MAAM,gBAAgB,OAAA,CAAQ,GAAA;AAC9B,IAAA,IAAI,OAAO,aAAA,KAAkB,QAAA,IAAY,OAAO,kBAAkB,UAAA,EAAY;AAC1E,MAAA,OAAO,EAAC;AAAA,IACZ;AACA,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,aAAA,EAAe,KAAA,EAAA,EAAS;AAChD,MAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AACjD,MAAA,IAAI,CAAC,OAAA,EAAS,UAAA,CAAW,MAAM,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,IAC1C;AACA,IAAA,SAAA,CAAU,eAAA,EAAgB;AAAA,EAC9B,SAAS,KAAA,EAAO;AACZ,IAAA,SAAA,CAAU,cAAc,KAAK,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,IAAA;AACX;AAEA,SAAS,yBAAA,CAA0B;AAAA,EAC/B,GAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA;AACJ,CAAA,EAOY;AACR,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,OAAA,EAAS,UAAA,EAAY,SAAS,CAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,IAAK,IAAA;AACjC,EAAA,IAAI,UAAU,MAAA,EAAQ;AAClB,IAAA,OAAO,KAAA;AAAA,EACX;AACA,EAAA,KAAA,CAAM,GAAA,CAAI,KAAK,KAAK,CAAA;AACpB,EAAA,IAAA,CAAK,GAAG,CAAA;AACR,EAAA,OAAO,IAAA;AACX;AAEA,SAAS,0BAAA,CAA2B;AAAA,EAChC,WAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA;AACJ,CAAA,EAQY;AACR,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,KAAA,MAAW,kBAAkB,WAAA,EAAa;AACtC,IAAA,IAAI,CAAC,cAAA,CAAe,UAAA,CAAW,MAAM,CAAA,EAAG;AACxC,IAAA,MAAM,GAAA,GAAM,cAAA,CAAe,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAC9C,IAAA,MAAM,WAAA,GAAc,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,IAAI,WAAA,IAAe,WAAA,CAAY,IAAA,GAAO,CAAA,EAAG;AACrC,MAAA,OAAA,GACI,yBAAA,CAA0B;AAAA,QACtB,GAAA;AAAA,QACA,UAAA,EAAY,cAAA;AAAA,QACZ,OAAA;AAAA,QACA,KAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACH,CAAA,IAAK,OAAA;AACV,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG;AAChB,MAAA,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,IACpB;AAAA,EACJ;AAEA,EAAA,OAAO,OAAA;AACX;AAEA,SAAS,+BAAA,CAAgC;AAAA,EACrC,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA;AACJ,CAAA,EAOY;AACR,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,WAAW,CAAA,IAAK,SAAA,EAAW;AACxC,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC5B,IAAA,OAAA,GACI,yBAAA,CAA0B;AAAA,MACtB,GAAA;AAAA,MACA,UAAA,EAAY,CAAA,EAAG,MAAM,CAAA,EAAG,GAAG,CAAA,CAAA;AAAA,MAC3B,OAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACH,CAAA,IAAK,OAAA;AAAA,EACd;AAEA,EAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,IAAA,EAAK,EAAG;AAC5B,IAAA,MAAM,WAAA,GAAc,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,IAAI,WAAA,IAAe,WAAA,CAAY,IAAA,GAAO,CAAA,EAAG;AACzC,IAAA,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,EACpB;AAEA,EAAA,OAAO,OAAA;AACX;AAEA,SAAS,yBAAA,CAA0B;AAAA,EAC/B,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACJ,CAAA,EAOwB;AACpB,EAAA,OAAO;AAAA,IACH,UAAU,MAAM,KAAA;AAAA,IAChB,MAAM,MAAM;AACR,MAAA,MAAM,OAAO,IAAA,EAAK;AAClB,MAAA,OAAA,CAAQ,KAAA;AAAA,QACJ,MAAA,CAAO,QAAQ,IAAI,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,MAAO;AAAA,UACxC,GAAA;AAAA,UACA,KAAA;AAAA,UACA,OAAA,EAAS,oBAAoB,KAAK;AAAA,SACtC,CAAE;AAAA,OACN;AACA,MAAA,OAAO,IAAA;AAAA,IACX,CAAA;AAAA,IACA,GAAA,EAAK,CAAC,GAAA,KAAgB;AAClB,MAAA,MAAM,GAAA,GAAM,YAAY,GAAG,CAAA;AAC3B,MAAA,IAAI,GAAA,IAAO,MAAM,OAAO,MAAA;AACxB,MAAA,OAAO,oBAAoB,GAAG,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,GAAA,EAAK,CAAC,GAAA,EAAa,KAAA,KAAmB;AAClC,MAAA,QAAA,CAAS,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,IACvC,CAAA;AAAA,IACA,MAAA,EAAQ,CAAC,GAAA,KAAgB,SAAA,CAAU,GAAG,CAAA;AAAA,IACtC,OAAO,MAAM;AACT,MAAA,KAAA,MAAW,GAAA,IAAO,MAAK,EAAG;AACtB,QAAA,SAAA,CAAU,GAAG,CAAA;AAAA,MACjB;AAAA,IACJ,CAAA;AAAA,IACA;AAAA,GACJ;AACJ;AAEA,SAAS,uBAAA,CAAwB;AAAA,EAC7B,OAAA;AAAA,EACA,yBAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA;AACJ,CAAA,EAUqC;AACjC,EAAA,OAAO,CAAC,WAAA,KAA2B;AAC/B,IAAA,IAAI,CAAC,OAAA,IAAW,yBAAA,EAA0B,EAAG;AAC7C,IAAA,IAAI,WAAA,EAAa,WAAW,CAAA,EAAG;AAE/B,IAAA,MAAM,eAAe,WAAA,KAAgB,MAAA;AACrC,IAAA,MAAM,OAAA,GAAU,eACV,+BAAA,CAAgC;AAAA,MAC5B,MAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACH,IACD,0BAAA,CAA2B;AAAA,MACvB,WAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACH,CAAA;AAEP,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,mBAAA,CAAoB,YAAA,EAAc,SAAA,EAAW,YAAA,GAAe,aAAA,GAAgB,iBAAiB,CAAA;AAAA,IACjG;AAAA,EACJ,CAAA;AACJ;AAEA,SAAS,wBAAA,CAAyB;AAAA,EAC9B,YAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACJ,CAAA,EASS;AACL,EAAA,IAAI,WAAA,GAAc,CAAA,+BAAA,EAAkC,SAAS,CAAA,4DAAA,EAA+D,SAAS,CAAA,EAAA,CAAA;AAErI,EAAA,IAAI,CAAC,YAAA,CAAa,YAAA,CAAa,OAAA,EAAS;AACpC,IAAA,OAAA,CAAQ,IAAA;AAAA,MACJ,oEAAoE,SAAS,CAAA,qBAAA;AAAA,KACjF;AACA,IAAA;AAAA,EACJ;AAEA,EAAA,MAAM,YAAA,GAAe,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AACnD,EAAA,IAAI,YAAA,EAAc;AACd,IAAA,MAAM,gBAAA,GAAmB,qDAAqD,SAAS,CAAA,kFAAA,CAAA;AACvF,IAAA,IAAI,CAAC,qBAAoB,EAAG;AACxB,MAAA,MAAM,IAAI,MAAM,gBAAgB,CAAA;AAAA,IACpC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,gBAAgB,CAAA,uDAAA,CAAyD,CAAA;AACzF,IAAA,OAAA,CAAQ,IAAA;AAAA,MACJ,kCAAkC,SAAS,CAAA,0DAAA;AAAA,KAC/C;AACA,IAAA;AAAA,EACJ;AAEA,EAAA,MAAM,cAAc,yBAAA,CAA0B;AAAA,IAC1C,KAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACH,CAAA;AACD,EAAA,MAAM,cAAc,kBAAA,EAAmB;AACvC,EAAA,IAAI,CAAC,WAAA,EAAa;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,kEAAA,EAAqE,SAAS,CAAA,EAAA,CAAI,CAAA;AAC/F,IAAA;AAAA,EACJ;AAKA,EAAA,KAAA,CAAM,yBAAA,GAA4B,WAAA;AAElC,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,YAAA,CAAa,SAAA,CAAU,SAAS,CAAA,GAAI;AAAA,IAChC,SAAA;AAAA,IACA,OAAA,EAAS,IAAI,WAAA,CAAY,WAAW,CAAA;AAAA,IACpC,YAAA,EAAc,GAAA;AAAA,IACd,UAAA,EAAY,GAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GAChB;AACA,EAAA,mBAAA,CAAoB,YAAA,EAAc,WAAW,+BAA+B,CAAA;AAC5E,EAAA,OAAA,CAAQ,KAAK,WAAW,CAAA;AAC5B;AA+GO,SAAS,gBAAA,CAAiB;AAAA,EAC7B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,UAAA,GAAa,SAAA;AAAA,EACb,cAAA;AAAA,EACA;AACJ,CAAA,EAA0B;AACtB,EAAA,IAAI,UAAA,KAAe,QAAA,IAAY,CAAC,cAAA,EAAgB;AAC5C,IAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,EAC1E;AACA,EAAA,IAAI,UAAA,KAAe,YAAA,IAAgB,OAAO,cAAA,EAAgB,mBAAmB,UAAA,EAAY;AACrF,IAAA,MAAM,IAAI,MAAM,yEAAyE,CAAA;AAAA,EAC7F;AAEA,EAAA,MAAM,KAAA,GAAQC,QAA0B,MAAM;AAC1C,IAAA,MAAM,MAAA,GAAS,GAAG,SAAS,CAAA,CAAA,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,WAAW,qBAAA,EAAsB;AAC5C,IAAA,MAAM,YAAA,GAAe,KAAK,SAAA,IAAa,WAAA;AACvC,IAAA,MAAM,YAAA,GAAe,mBAAmB,cAAc,CAAA;AACtD,IAAA,MAAM,gBAAA,GAAmB,wBAAwB,EAAE,CAAA;AACnD,IAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,OAAA,EAAS,EAAE,CAAA;AAOxD,IAAA,MAAM,KAAA,uBAAY,GAAA,EAA2B;AAO7C,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAA2B;AAGjD,IAAA,IAAI,gBAAA,GAAmB,KAAA;AAGvB,IAAA,IAAI,iBAAA,GAAoB,KAAA;AAGxB,IAAA,IAAI,8BAAA,GAAiC,KAAA;AACrC,IAAA,MAAM,sBAAA,GAAiD;AAAA,MACnD,aAAA,EAAe,CAAC,GAAA,KAAQ,cAAA,CAAe,GAAG,CAAA;AAAA,MAC1C,iBAAiB,MAAM;AACnB,QAAA,iBAAA,GAAoB,KAAA;AAAA,MACxB,CAAA;AAAA,MACA,kBAAkB,CAAC,MAAA,EAAQ,QAAA,KAAa,mCAAA,CAAoC,QAAQ,QAAQ;AAAA,KAChG;AAQA,IAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KAAgB,MAAA,GAAS,GAAA;AAQ1C,IAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB;AAC1B,MAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAC7B,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,KAAA,MAAW,EAAA,IAAM,KAAK,EAAA,EAAG;AAAA,IAC7B,CAAA;AAQA,IAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,KAAuB;AAC3C,MAAA,IAAI,CAAC,iBAAA,IAAqB,GAAA,YAAe,YAAA,IAAgB,GAAA,CAAI,SAAS,oBAAA,EAAsB;AACxF,QAAA,OAAA,CAAQ,KAAA;AAAA,UACJ,CAAA,iCAAA,EAAoC,GAAA,CAAI,IAAI,CAAA,GAAA,EAAM,IAAI,OAAO,CAAA,+CAAA;AAAA,SAEjE;AACA,QAAA,iBAAA,GAAoB,IAAA;AAAA,MACxB;AAAA,IACJ,CAAA;AAOA,IAAA,MAAM,mCAAA,GAAsC,CACxC,MAAA,EACA,QAAA,KACO;AACP,MAAA,8BAAA,GAAiC,IAAA;AACjC,MAAA,KAAK,QAAQ,OAAA,CAAQ,QAAQ,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AACpD,MAAA,IAAI,iBAAA,EAAmB;AACvB,MAAA,OAAA,CAAQ,KAAA;AAAA,QACJ,0BAA0B,MAAM,CAAA,iJAAA;AAAA,OAGpC;AACA,MAAA,iBAAA,GAAoB,IAAA;AAAA,IACxB,CAAA;AASA,IAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAA+B;AAChD,MAAA,IAAI,KAAA,CAAM,IAAI,GAAG,CAAA,SAAU,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,IAAK,IAAA;AAC7C,MAAA,IAAI,CAAC,MAAM,8BAAA,EAAgC;AACvC,QAAA,KAAA,CAAM,GAAA,CAAI,KAAK,IAAI,CAAA;AACnB,QAAA,OAAO,IAAA;AAAA,MACX;AACA,MAAA,MAAM,MAAM,cAAA,CAAe,EAAA,EAAI,OAAA,CAAQ,GAAG,GAAG,sBAAsB,CAAA;AACnE,MAAA,KAAA,CAAM,GAAA,CAAI,KAAK,GAAG,CAAA;AAClB,MAAA,OAAO,GAAA;AAAA,IACX,CAAA;AASA,IAAA,MAAM,QAAA,GAAW,CAAC,GAAA,EAAa,GAAA,KAAgB;AAC3C,MAAA,KAAA,CAAM,GAAA,CAAI,KAAK,GAAG,CAAA;AAClB,MAAA,IAAI,EAAA,IAAM,CAAC,8BAAA,EAAgC;AACvC,QAAA,IAAI;AACA,UAAA,MAAM,SAAS,EAAA,CAAG,OAAA,CAAQ,OAAA,CAAQ,GAAG,GAAG,GAAG,CAAA;AAC3C,UAAA,IAAI,aAAA,CAAc,MAAM,CAAA,EAAG;AACvB,YAAA,mCAAA,CAAoC,WAAW,MAAM,CAAA;AAAA,UACzD,CAAA,MAAO;AACH,YAAA,gBAAA,GAAmB,KAAA;AACnB,YAAA,iBAAA,GAAoB,KAAA;AAAA,UACxB;AAAA,QACJ,SAAS,GAAA,EAAK;AACV,UAAA,IAAI,CAAC,gBAAA,IAAoB,GAAA,YAAe,YAAA,IAAgB,GAAA,CAAI,SAAS,oBAAA,EAAsB;AACvF,YAAA,OAAA,CAAQ,KAAA;AAAA,cACJ,kDAAkD,GAAG,CAAA,iDAAA;AAAA,aAEzD;AACA,YAAA,gBAAA,GAAmB,IAAA;AAAA,UACvB;AACA,UAAA,cAAA,CAAe,GAAG,CAAA;AAAA,QACtB;AAAA,MACJ;AACA,MAAA,IAAA,CAAK,GAAG,CAAA;AACR,MAAA,mBAAA,CAAoB,YAAA,EAAc,SAAA,EAAW,CAAA,IAAA,EAAO,GAAG,CAAA,CAAE,CAAA;AAAA,IAC7D,CAAA;AAQA,IAAA,MAAM,SAAA,GAAY,CAAC,GAAA,KAAgB;AAC/B,MAAA,KAAA,CAAM,GAAA,CAAI,KAAK,IAAI,CAAA;AACnB,MAAA,IAAI,EAAA,IAAM,CAAC,8BAAA,EAAgC;AACvC,QAAA,IAAI;AACA,UAAA,MAAM,MAAA,GAAS,EAAA,CAAG,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAC,CAAA;AACzC,UAAA,IAAI,aAAA,CAAc,MAAM,CAAA,EAAG;AACvB,YAAA,mCAAA,CAAoC,cAAc,MAAM,CAAA;AAAA,UAC5D,CAAA,MAAO;AACH,YAAA,iBAAA,GAAoB,KAAA;AAAA,UACxB;AAAA,QACJ,SAAS,GAAA,EAAK;AACV,UAAA,cAAA,CAAe,GAAG,CAAA;AAAA,QACtB;AAAA,MACJ;AACA,MAAA,IAAA,CAAK,GAAG,CAAA;AACR,MAAA,mBAAA,CAAoB,YAAA,EAAc,SAAA,EAAW,CAAA,OAAA,EAAU,GAAG,CAAA,CAAE,CAAA;AAAA,IAChE,CAAA;AAUA,IAAA,MAAM,YAAA,GAAe,CAAC,GAAA,EAAa,QAAA,KAAoC;AACnE,MAAA,IAAI,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAC3B,MAAA,IAAI,CAAC,GAAA,EAAK;AACN,QAAA,GAAA,uBAAU,GAAA,EAAI;AACd,QAAA,SAAA,CAAU,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,MAC1B;AACA,MAAA,GAAA,CAAI,IAAI,QAAQ,CAAA;AAGhB,MAAA,WAAA,CAAY,GAAG,CAAA;AAEf,MAAA,OAAO,MAAM;AACT,QAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAC3B,QAAA,IAAI,CAAC,CAAA,EAAG;AACR,QAAA,CAAA,CAAE,OAAO,QAAQ,CAAA;AACjB,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,CAAA,EAAG,SAAA,CAAU,OAAO,GAAG,CAAA;AAAA,MAC1C,CAAA;AAAA,IACJ,CAAA;AASA,IAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,KAAgB,WAAA,CAAY,GAAG,CAAA;AAQvD,IAAA,MAAM,OAAO,MAAM;AACf,MAAA,IAAI,8BAAA,EAAgC;AAChC,QAAA,OAAO,KAAA,CAAM,KAAK,KAAA,CAAM,OAAA,EAAS,CAAA,CAC5B,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,IAAS,IAAI,CAAA,CACnC,GAAA,CAAI,CAAC,CAAC,GAAG,MAAM,GAAG,CAAA;AAAA,MAC3B;AACA,MAAA,IAAI,CAAC,gBAAA,EAAkB,OAAO,EAAC;AAC/B,MAAA,OAAO,sBAAA,CAAuB,EAAA,EAAI,MAAA,EAAQ,sBAAsB,CAAA;AAAA,IACpE,CAAA;AAQA,IAAA,MAAM,OAAO,MAAM;AACf,MAAA,MAAM,MAA8B,EAAC;AACrC,MAAA,KAAA,MAAW,CAAA,IAAK,MAAK,EAAG;AACpB,QAAA,MAAM,GAAA,GAAM,YAAY,CAAC,CAAA;AACzB,QAAA,IAAI,GAAA,IAAO,IAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA;AAAA,MAC9B;AACA,MAAA,OAAO,GAAA;AAAA,IACX,CAAA;AAaA,IAAA,MAAM,oBAAoB,uBAAA,CAAwB;AAAA,MAC9C,OAAA,EAAS,EAAA;AAAA,MACT,2BAA2B,MAAM,8BAAA;AAAA,MACjC,MAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA,EAAW,sBAAA;AAAA,MACX,YAAA;AAAA,MACA;AAAA,KACH,CAAA;AAMD,IAAA,MAAMC,MAAAA,GAA0C;AAAA,MAC5C,MAAA;AAAA,MACA,gBAAA;AAAA,MACA,YAAA;AAAA,MACA,cAAA;AAAA,MACA,MAAA,EAAQ,QAAA;AAAA,MACR,SAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA;AAAA,MACA,iBAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA,gBAAA;AAAA,MACA,GAAI,cAAA,GAAiB,EAAE,cAAA,KAAmB;AAAC,KAC/C;AAMA,IAAA,IAAI,YAAA,EAAc;AACd,MAAA,wBAAA,CAAyB;AAAA,QACrB,YAAA;AAAA,QACA,SAAA;AAAA,QACA,KAAA,EAAAA,MAAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACH,CAAA;AAAA,IACL;AAEA,IAAA,OAAOA,MAAAA;AAAA,EACX,CAAA,EAAG,CAAC,SAAA,EAAW,OAAA,EAAS,gBAAgB,UAAA,EAAY,cAAA,EAAgB,GAAA,EAAK,SAAS,CAAC,CAAA;AAEnF,EAAA,MAAM,cAAA,GAAiBD,OAAAA;AAAA,IACnB,MACI,4BAAA,CAA6B;AAAA,MACzB,GAAA,EAAK,KAAA;AAAA,MACL,GAAI,cAAA,GAAiB,EAAE,cAAA,KAAmB;AAAC,KAC9C,CAAA;AAAA,IACL,CAAC,gBAAgB,KAAK;AAAA,GAC1B;AAGA,EAAAE,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,SAAS,gBAAA,EAAkB;AAChC,IAAA,OAAO,QAAQ,gBAAA,CAAiB,CAAC,gBAAgB,KAAA,CAAM,iBAAA,CAAkB,WAAW,CAAC,CAAA;AAAA,EACzF,CAAA,EAAG,CAAC,OAAA,EAAS,KAAK,CAAC,CAAA;AAEnB,EAAA,uBACI,GAAA,CAAC,eAAA,CAAgB,QAAA,EAAhB,EAAyB,KAAA,EAAO,KAAA,EAC7B,QAAA,kBAAA,GAAA,CAAC,8BAAA,EAAA,EAA+B,MAAA,EAAQ,cAAA,EAAiB,QAAA,EAAS,CAAA,EACtE,CAAA;AAER;ACrjCO,SAAS,2BAAA,CACZ,KAAA,EACA,UAAA,EACA,MAAA,GAAS,IAAA,EACU;AACnB,EAAA,MAAM,MAAA,GAAS,4BAA4B,KAAA,EAAO,UAAA,EAAY,QAAW,UAAA,CAAW,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAC3G,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAK,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAW,aAAA,EAAAP,cAAAA,EAAe,mBAAA,EAAAC,oBAAAA,EAAqB,mBAAA,EAAAC,sBAAoB,GAC1G,MAAA;AACJ,EAAA,MAAM,aAAa,GAAA,CAAI,UAAA;AACvB,EAAA,MAAM,iBAAiB,GAAA,CAAI,cAAA;AAE3B,EAAA,MAAMM,sBAAAA,GAAwBC,WAAAA;AAAA,IAC1B,CAAC,OAAgB,UAAA,KAAiC;AAC9C,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,KAAA,EAAO,UAAU,CAAA;AACnD,MAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACnB,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,IAAA,IAAQ,GAAG,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAC7E,QAAA,MAAM,IAAI,WAAA,CAAY,eAAA,EAAiB,qCAAqC,GAAG,CAAA,GAAA,EAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAClG;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,GAAG;AAAA,GACR;AAEA,EAAA,MAAM,aAAA,GAAgBJ,QAAQ,MAAM;AAChC,IAAA,IAAI,CAAC,cAAA,IAAkB,UAAA,KAAe,YAAA,EAAc,OAAO,IAAA;AAC3D,IAAA,OAAO;AAAA,MACH,YAAA,EAAc,MAAA;AAAA,MACd,eAAA,EAAiB,KAAA;AAAA,MACjB,eAAA,sBAAqB,GAAA,EAAmC;AAAA,MACxD,cAAA,sBAAoB,GAAA;AAAkC,KAC1D;AAAA,EACJ,CAAA,EAAG,CAAC,cAAA,EAAgB,UAAA,EAAY,GAAG,CAAC,CAAA;AAEpC,EAAA,MAAMK,oBAAAA,GAAsBD,WAAAA;AAAA,IACxB,CAAC,OAAA,KAA2C;AACxC,MAAA,IAAI,CAAC,gBAAgB,OAAO,MAAA;AAC5B,MAAA,IAAI,CAAC,aAAA,EAAe,OAAO,cAAA,CAAe,SAAA,CAAU,KAAK,OAAO,CAAA;AAChE,MAAA,IAAI,aAAA,CAAc,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAA,EAAG;AAC5C,QAAA,OAAO,aAAA,CAAc,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAA;AAAA,MACpD;AACA,MAAA,MAAM,UAAA,GAAa,cAAA,CAAe,SAAA,CAAU,GAAA,EAAK,OAAO,CAAA;AACxD,MAAA,aAAA,CAAc,eAAA,CAAgB,GAAA,CAAI,OAAA,EAAS,UAAU,CAAA;AACrD,MAAA,OAAO,UAAA;AAAA,IACX,CAAA;AAAA,IACA,CAAC,cAAA,EAAgB,aAAA,EAAe,GAAG;AAAA,GACvC;AAEA,EAAA,MAAM,qBAAA,GAAwBA,YAAY,MAA6B;AACnE,IAAA,IAAI,CAAC,gBAAgB,OAAO,MAAA;AAC5B,IAAA,IAAI,CAAC,aAAA,EAAe,OAAO,cAAA,CAAe,gBAAgB,GAAG,CAAA;AAC7D,IAAA,IAAI,aAAA,CAAc,eAAA,EAAiB,OAAO,aAAA,CAAc,YAAA;AACxD,IAAA,MAAM,UAAA,GAAa,cAAA,CAAe,eAAA,CAAgB,GAAG,CAAA;AACrD,IAAA,aAAA,CAAc,YAAA,GAAe,UAAA;AAC7B,IAAA,aAAA,CAAc,eAAA,GAAkB,IAAA;AAChC,IAAA,OAAO,UAAA;AAAA,EACX,CAAA,EAAG,CAAC,cAAA,EAAgB,aAAA,EAAe,GAAG,CAAC,CAAA;AAEvC,EAAA,MAAM,sBAAA,GAAyBA,WAAAA;AAAA,IAC3B,CAAC,aAAqB,SAAA,KAA4C;AAC9D,MAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAC5B,MAAA,IAAI,CAAC,eAAe,OAAO,cAAA,CAAe,iBAAiB,GAAA,EAAK,WAAA,EAAa,SAAS,CAAA,IAAK,IAAA;AAC3F,MAAA,MAAM,QAAA,GAAW,CAAA,EAAG,WAAW,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA;AAC7C,MAAA,IAAI,aAAA,CAAc,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC5C,QAAA,OAAO,aAAA,CAAc,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,IAAK,IAAA;AAAA,MACzD;AACA,MAAA,MAAM,OAAO,cAAA,CAAe,gBAAA,CAAiB,GAAA,EAAK,WAAA,EAAa,SAAS,CAAA,IAAK,IAAA;AAC7E,MAAA,aAAA,CAAc,cAAA,CAAe,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AAC/C,MAAA,OAAO,IAAA;AAAA,IACX,CAAA;AAAA,IACA,CAAC,cAAA,EAAgB,aAAA,EAAe,GAAG;AAAA,GACvC;AAEA,EAAA,MAAM,wBAAA,GAA2BA,WAAAA,CAAY,CAAC,OAAA,EAAiB,KAAA,KAA2B;AACtF,IAAA,OAAO,iBAAA,CAAkB,SAAS,KAAK,CAAA;AAAA,EAC3C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAiB,iBAAA,CAAsC;AAAA,IACzD,GAAA;AAAA,IACA,SAAA;AAAA,IACA,mBAAA,EAAAP;AAAA,GACH,CAAA;AAED,EAAA,MAAM,wBAAA,GAA2BO,YAAY,MAA6B;AACtE,IAAA,MAAM,kBAAkB,MAAA,EAAQ,OAAA;AAChC,IAAA,MAAM,eAAe,qBAAA,EAAsB;AAC3C,IAAA,IAAI,eAAA,KAAoB,QAAW,OAAO,YAAA;AAE1C,IAAA,MAAM,cAAA,GAAiBC,qBAAoB,eAAe,CAAA;AAC1D,IAAA,IAAI,gBAAgB,OAAO,cAAA;AAE3B,IAAA,OAAO,UAAA,KAAe,WAAW,MAAA,GAAY,YAAA;AAAA,EACjD,GAAG,CAAC,qBAAA,EAAuBA,sBAAqB,MAAA,EAAQ,OAAA,EAAS,UAAU,CAAC,CAAA;AAE5E,EAAA,MAAM,cAAA,GAAiBD,WAAAA;AAAA,IACnB,CAAC,SAAA,KAAyB;AACtB,MAAA,MAAM,kBAAkB,MAAA,EAAQ,OAAA;AAChC,MAAA,MAAM,eAAe,wBAAA,EAAyB;AAE9C,MAAA,IAAI,CAAC,YAAA,EAAc;AACf,QAAA,IAAI,eAAA,KAAoB,MAAA,IAAa,UAAA,KAAe,QAAA,EAAU;AAC1D,UAAA,MAAM,IAAI,WAAA;AAAA,YACN,uBAAA;AAAA,YACA,kCAAkC,GAAG,CAAA,gBAAA;AAAA,WACzC;AAAA,QACJ;AACA,QAAA,OAAO,iBAAA,CAAkB,CAAA,EAAG,KAAA,CAAM,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,MACvD;AAEA,MAAA,IAAI,YAAA,GAAwB,SAAA;AAC5B,MAAA,MAAM,cAAA,GAAiB,cAAA,EAAgB,iBAAA,GAAoB,GAAA,EAAK,aAAa,OAAO,CAAA;AACpF,MAAA,IAAI,cAAA,EAAgB;AAChB,QAAA,IAAI;AACA,UAAA,YAAA,GAAe,cAAA,CAAe,QAAQ,YAAY,CAAA;AAAA,QACtD,SAAS,GAAA,EAAK;AACV,UAAA,MAAM,GAAA,YAAe,cACf,GAAA,GACA,IAAI,YAAY,kBAAA,EAAoB,CAAA,qCAAA,EAAwC,GAAG,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AAAA,QACjG;AAAA,MACJ;AAEA,MAAAD,sBAAAA,CAAsB,YAAA,EAAc,YAAA,CAAa,MAAM,CAAA;AACvD,MAAA,OAAO,wBAAA,CAAyB,YAAA,CAAa,OAAA,EAAS,YAAY,CAAA;AAAA,IACtE,CAAA;AAAA,IACA;AAAA,MACI,MAAA,EAAQ,OAAA;AAAA,MACR,GAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,cAAA;AAAA,MACAA,sBAAAA;AAAA,MACA,wBAAA;AAAA,MACA;AAAA;AACJ,GACJ;AAEA,EAAA,MAAMG,yBAAAA,GAA2BF,WAAAA;AAAA,IAC7B,CAAC,UAA4B,YAAA,KAAwC;AACjE,MAAA,IAAI,YAAA,EAAc;AACd,QAAA,OAAOP,oBAAAA;AAAA,UACH,IAAI,YAAY,kBAAA,EAAoB,CAAA,mBAAA,EAAsB,GAAG,CAAA,GAAA,EAAM,QAAA,CAAS,OAAO,CAAA,CAAE;AAAA,SACzF;AAAA,MACJ;AACA,MAAA,IAAI,CAAC,cAAA,IAAkB,OAAO,cAAA,CAAe,mBAAmB,UAAA,EAAY;AACxE,QAAA,OAAOA,oBAAAA;AAAA,UACH,IAAI,WAAA;AAAA,YACA,4BAAA;AAAA,YACA,kEAAkE,GAAG,CAAA,CAAA;AAAA;AACzE,SACJ;AAAA,MACJ;AACA,MAAA,IAAI;AACA,QAAA,MAAM,OAAA,GACF,OAAO,QAAA,CAAS,OAAA,KAAY,QAAA,GACtBD,qBAAuB,QAAA,CAAS,OAAA,EAAS,KAAK,CAAA,GAC7C,QAAA,CAAS,OAAA;AACpB,QAAA,MAAM,mBAAA,GAAsB,CAAC,KAAA,MAAyB;AAAA,UAClD,GAAA;AAAA,UACA,OAAA,EAAS,CAAA;AAAA,UACT,MAAA,EAAQ,gBAAgB,KAAK;AAAA,SACjC,CAAA;AACA,QAAA,MAAM,QAAA,GAAW,oBAAoB,OAAO,CAAA;AAC5C,QAAA,OAAO,cAAA,CAAe;AAAA,UAClB,KAAA,EAAO,OAAA;AAAA,UACP,KAAA,EAAO,EAAE,aAAA,EAAe,QAAA,EAAS;AAAA,UACjC,UAAA,EAAY,wBAAA,CAAyB,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAAA,UAC9D,kBAAkB,QAAA,CAAS,OAAA;AAAA,UAC3B,qBAAqB,CAAC,KAAA,KAAU,wBAAA,CAAyB,QAAA,CAAS,SAAS,KAAK,CAAA;AAAA,UAChF,WAAA,EAAa,CAAC,KAAA,MAAW;AAAA,YACrB,aAAA,EAAe,oBAAoB,KAAK;AAAA,WAC5C;AAAA,SACH,CAAA;AAAA,MACL,SAAS,GAAA,EAAK;AACV,QAAA,MAAM,QAAA,GACF,GAAA,YAAe,WAAA,IAAe,GAAA,YAAe,UAAA,GACvC,GAAA,GACA,IAAI,WAAA,CAAY,eAAA,EAAiB,CAAA,qCAAA,EAAwC,GAAG,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AAC9F,QAAA,OAAOC,qBAAoB,QAAQ,CAAA;AAAA,MACvC;AAAA,IACJ,CAAA;AAAA,IACA;AAAA,MACI,cAAA;AAAA,MACAA,oBAAAA;AAAA,MACA,wBAAA;AAAA,MACA,KAAA;AAAA,MACAD,oBAAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA;AACJ,GACJ;AAEA,EAAA,MAAMW,2BAAAA,GAA6BH,WAAAA;AAAA,IAC/B,CAAC,UAA4B,YAAA,KAAwC;AACjE,MAAA,IAAI,OAAO,QAAA,CAAS,OAAA,KAAY,QAAA,EAAU;AACtC,QAAA,OAAO,cAAA,CAAe;AAAA,UAClB,OAAO,QAAA,CAAS,OAAA;AAAA,UAChB,kBAAkB,QAAA,CAAS,OAAA;AAAA,UAC3B,GAAI,YAAA,GAAe,EAAE,eAAe,YAAA,CAAa,OAAA,KAAY,EAAC;AAAA,UAC9D,mBAAA,EAAqB;AAAA,SACxB,CAAA;AAAA,MACL;AACA,MAAA,IAAI;AACA,QAAA,MAAM,OAAA,GAAUR,oBAAAA,CAAuB,QAAA,CAAS,OAAA,EAAS,KAAK,CAAA;AAC9D,QAAA,OAAO,cAAA,CAAe;AAAA,UAClB,KAAA,EAAO,OAAA;AAAA,UACP,kBAAkB,QAAA,CAAS,OAAA;AAAA,UAC3B,GAAI,YAAA,GAAe,EAAE,eAAe,YAAA,CAAa,OAAA,KAAY,EAAC;AAAA,UAC9D,mBAAA,EAAqB;AAAA,SACxB,CAAA;AAAA,MACL,SAAS,GAAA,EAAK;AACV,QAAA,OAAOC,qBAAoB,GAA+B,CAAA;AAAA,MAC9D;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,cAAA,EAAgBA,oBAAAA,EAAqB,KAAA,EAAOD,sBAAqB,cAAc;AAAA,GACpF;AAEA,EAAA,MAAMY,4BAAAA,GAA8BJ,WAAAA;AAAA,IAChC,CAAC,QAAA,EAA4B,gBAAA,EAA6B,YAAA,KAAwC;AAC9F,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI;AACA,QAAA,OAAA,GAAU,QAAA,CAAS,OAAA;AACnB,QAAAD,sBAAAA,CAAsB,OAAA,EAAS,gBAAA,CAAiB,MAAM,CAAA;AAAA,MAC1D,SAAS,GAAA,EAAK;AACV,QAAA,MAAM,QAAA,GACF,GAAA,YAAe,WAAA,IAAe,GAAA,YAAe,UAAA,GACvC,GAAA,GACA,IAAI,WAAA,CAAY,eAAA,EAAiB,CAAA,8BAAA,EAAiC,GAAG,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AACvF,QAAA,OAAON,qBAAoB,QAAQ,CAAA;AAAA,MACvC;AAEA,MAAA,IAAI,CAAC,YAAA,IAAgB,QAAA,CAAS,OAAA,IAAW,aAAa,OAAA,EAAS;AAC3D,QAAA,OAAO,cAAA,CAAe;AAAA,UAClB,KAAA,EAAO,OAAA;AAAA,UACP,kBAAkB,QAAA,CAAS,OAAA;AAAA,UAC3B,GAAI,YAAA,GAAe,EAAE,eAAe,YAAA,CAAa,OAAA,KAAY,EAAC;AAAA,UAC9D,mBAAA,EAAqB;AAAA,SACxB,CAAA;AAAA,MACL;AAEA,MAAA,MAAM,IAAA,GAAO,sBAAA,CAAuB,QAAA,CAAS,OAAA,EAAS,aAAa,OAAO,CAAA;AAC1E,MAAA,IAAI,CAAC,IAAA,EAAM;AACP,QAAA,OAAOA,oBAAAA;AAAA,UACH,IAAI,WAAA;AAAA,YACA,0BAAA;AAAA,YACA,8BAA8B,GAAG,CAAA,QAAA,EAAW,SAAS,OAAO,CAAA,KAAA,EAAQ,aAAa,OAAO,CAAA;AAAA;AAC5F,SACJ;AAAA,MACJ;AAEA,MAAA,IAAI;AACA,QAAA,IAAI,QAAA,GAAW,OAAA;AACf,QAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACrB,UAAA,QAAA,GAAW,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAAA,QACpC;AACA,QAAAM,sBAAAA,CAAsB,QAAA,EAAU,YAAA,CAAa,MAAM,CAAA;AACnD,QAAA,OAAO,cAAA,CAAe;AAAA,UAClB,KAAA,EAAO,QAAA;AAAA,UACP,UAAA,EAAY,wBAAA,CAAyB,YAAA,CAAa,OAAA,EAAS,QAAQ,CAAA;AAAA,UACnE,kBAAkB,QAAA,CAAS,OAAA;AAAA,UAC3B,eAAe,YAAA,CAAa,OAAA;AAAA,UAC5B,mBAAA,EAAqB;AAAA,SACxB,CAAA;AAAA,MACL,SAAS,GAAA,EAAK;AACV,QAAA,MAAM,QAAA,GACF,GAAA,YAAe,WAAA,IAAe,GAAA,YAAe,UAAA,GACvC,GAAA,GACA,IAAI,WAAA,CAAY,kBAAA,EAAoB,CAAA,0BAAA,EAA6B,GAAG,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AACtF,QAAA,OAAON,qBAAoB,QAAQ,CAAA;AAAA,MACvC;AAAA,IACJ,CAAA;AAAA,IACA;AAAA,MACI,cAAA;AAAA,MACAA,oBAAAA;AAAA,MACA,wBAAA;AAAA,MACA,cAAA;AAAA,MACA,sBAAA;AAAA,MACA,GAAA;AAAA,MACAM;AAAA;AACJ,GACJ;AAEA,EAAA,MAAM,aAAA,GAAgBC,WAAAA;AAAA,IAClB,CAAC,OAAA,KAA2B;AACxB,MAAA,IAAI,OAAA,IAAW,IAAA,EAAM,OAAOP,oBAAAA,EAAoB;AAEhD,MAAA,MAAM,MAAA,GAASF,eAAc,OAAO,CAAA;AACpC,MAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,OAAOE,oBAAAA,CAAoB,OAAO,KAAK,CAAA;AACvD,MAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AAExB,MAAA,MAAM,gBAAA,GAAmBQ,oBAAAA,CAAoB,QAAA,CAAS,OAAO,CAAA;AAC7D,MAAA,MAAM,eAAe,qBAAA,EAAsB;AAE3C,MAAA,IAAI,UAAA,KAAe,QAAA,IAAY,CAAC,gBAAA,EAAkB;AAC9C,QAAA,OAAOR,oBAAAA;AAAA,UACH,IAAI,YAAY,kBAAA,EAAoB,CAAA,mBAAA,EAAsB,GAAG,CAAA,GAAA,EAAM,QAAA,CAAS,OAAO,CAAA,CAAE;AAAA,SACzF;AAAA,MACJ;AAEA,MAAA,IAAI,UAAA,KAAe,YAAA,IAAgB,CAAC,gBAAA,EAAkB;AAClD,QAAA,OAAOS,yBAAAA,CAAyB,UAAU,YAAY,CAAA;AAAA,MAC1D;AAEA,MAAA,IAAI,CAAC,gBAAA,EAAkB;AACnB,QAAA,OAAOC,2BAAAA,CAA2B,UAAU,YAAY,CAAA;AAAA,MAC5D;AAEA,MAAA,OAAOC,4BAAAA,CAA4B,QAAA,EAAU,gBAAA,EAAkB,YAAY,CAAA;AAAA,IAC/E,CAAA;AAAA,IACA;AAAA,MACIX,oBAAAA;AAAA,MACAS,yBAAAA;AAAA,MACAC,2BAAAA;AAAA,MACAC,4BAAAA;AAAA,MACAb,cAAAA;AAAA,MACA,UAAA;AAAA,MACAU,oBAAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA;AACJ,GACJ;AAEA,EAAA,MAAM,qBAAA,GAAwBD,WAAAA;AAAA,IAC1B,CAAC,EAAE,QAAA,EAAAK,SAAAA,EAAS,KAA2D;AACnE,MAAA,IAAI,CAAC,QAAA,IAAY,MAAA,EAAQ,YAAY,MAAA,IAAa,CAAC,IAAI,cAAA,EAAgB;AACvE,MAAAA,SAAAA;AAAA,QACI,gBAAgB,GAAG,CAAA,CAAA;AAAA,QACnB,8BAA8B,GAAG,CAAA,wNAAA;AAAA,OACrC;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,GAAA,CAAI,cAAA,EAAgB,QAAA,EAAU,GAAA,EAAK,QAAQ,OAAO;AAAA,GACvD;AAEA,EAAA,MAAM,eAAA,GAAkBL,WAAAA;AAAA,IACpB,CAAC,OAAA,KAA2C;AACxC,MAAA,IAAI,CAAC,OAAA,CAAQ,aAAA,IAAiB,CAAC,gBAAgB,cAAA,EAAgB;AAC/D,MAAA,IAAI,cAAA,CAAe,UAAU,OAAA,CAAQ,aAAA,CAAc,KAAK,OAAA,CAAQ,aAAA,CAAc,OAAO,CAAA,EAAG;AACxF,MAAA,IAAI;AACA,QAAA,cAAA,CAAe,cAAA,CAAe,QAAQ,aAAa,CAAA;AAAA,MACvD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,cAAc;AAAA,GACnB;AAEA,EAAA,OAAO,oBAAoB,MAAA,EAAQ;AAAA,IAC/B,MAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACH,CAAA;AACL;AAEA,SAAS,qBAAwB,UAAA,EAAmE;AAChG,EAAA,OAAO,2BAAA,CAA4B,WAAA,EAAY,EAAG,UAAU,CAAA;AAChE;AAOO,SAAS,cAAA,CACZ,iBACA,OAAA,EACmB;AACnB,EAAA,OAAO,oBAAA,CAAqB,sBAAA,CAAuB,eAAA,EAAiB,OAAO,CAAC,CAAA;AAChF;ACrYA,SAAS,WAAW,IAAA,EAAmC;AACnD,EAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,IAAI,CAAC,CAAA;AAC5B;AAEA,SAASM,qBAAAA,GAAgC;AACrC,EAAA,OAAO,mBAAkB,KAAM,aAAA;AACnC;AAEA,IAAM,0BAAA,uBAAiC,OAAA,EAA6B;AAEpE,SAAS,gBAAA,CAAiB,GAAA,EAAa,EAAA,EAAY,OAAA,EAAuB;AACtE,EAAA,IAAI,QAAA,GAAW,0BAAA,CAA2B,GAAA,CAAI,GAAG,CAAA;AACjD,EAAA,IAAI,CAAC,QAAA,EAAU;AACX,IAAA,QAAA,uBAAe,GAAA,EAAY;AAC3B,IAAA,0BAAA,CAA2B,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,EAChD;AACA,EAAA,IAAI,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG;AACtB,EAAA,QAAA,CAAS,IAAI,EAAE,CAAA;AACf,EAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AACxB;AAiBO,SAAS,mBAAA,CAAoB,OAAA,GAAsC,EAAC,EAAyB;AAChG,EAAA,OAAO,0BAAA,CAA2B,WAAA,EAAY,EAAG,OAAO,CAAA;AAC5D;AAEO,SAAS,2BACZ,GAAA,EACA,OAAA,GAAsC,EAAC,EACvC,SAAS,IAAA,EACW;AACpB,EAAA,MAAM,EAAE,WAAU,GAAI,OAAA;AAEtB,EAAA,MAAM,SAAA,GAAYV,QAAQ,MAAM;AAC5B,IAAA,IAAI,CAAC,QAAQ,OAAO,EAAA;AACpB,IAAA,OAAO,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA,CAAI,MAAA;AAAA,EACpE,CAAA,EAAG,CAAC,MAAA,EAAQ,GAAA,CAAI,MAAM,CAAC,CAAA;AAEvB,EAAA,MAAM,YAAA,GAAeI,WAAAA;AAAA,IACjB,CAAC,QAAgC,WAAA,KAA0B;AACvD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,KAAA,GAA+B;AAAA,QACjC,MAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACJ;AACA,MAAA,SAAA,GAAY,KAAK,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,SAAA,EAAW,SAAS;AAAA,GACjC;AAEA,EAAA,MAAM,QAAA,GAAWA,WAAAA,CAAY,MAAO,MAAA,GAAS,GAAA,CAAI,IAAA,EAAK,GAAI,EAAC,EAAI,CAAC,MAAA,EAAQ,GAAG,CAAC,CAAA;AAE5E,EAAA,MAAM,iBAAA,GAAoBA,WAAAA;AAAA,IACtB,CAAC,QAAgC,IAAA,KAA4B;AACzD,MAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,MAAA,MAAM,WAAA,GAAc,WAAW,IAAI,CAAA;AACnC,MAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC3B,QAAA,GAAA,CAAI,UAAU,GAAG,CAAA;AAAA,MACrB;AACA,MAAA,YAAA,CAAa,QAAQ,WAAW,CAAA;AAChC,MAAA,OAAO,WAAA;AAAA,IACX,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,GAAA,EAAK,YAAY;AAAA,GAC9B;AAEA,EAAA,MAAM,SAAA,GAAYA,WAAAA;AAAA,IACd,CAAC,IAAA,KAA4B,iBAAA,CAAkB,YAAA,EAAc,IAAI,CAAA;AAAA,IACjE,CAAC,iBAAiB;AAAA,GACtB;AAEA,EAAA,MAAM,QAAA,GAAWA,YAAY,MAAM;AAC/B,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,IAAA,IAAI,CAAC,IAAI,gBAAA,EAAkB;AACvB,MAAA,IAAIM,uBAAqB,EAAG;AACxB,QAAA,gBAAA;AAAA,UACI,GAAA;AAAA,UACA,mCAAA;AAAA,UACA,8EAA8E,SAAS,CAAA,6HAAA;AAAA,SAC3F;AAAA,MACJ;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACN;AAAA,OACJ;AAAA,IACJ;AACA,IAAA,OAAO,iBAAA,CAAkB,WAAA,EAAa,GAAA,CAAI,IAAA,EAAM,CAAA;AAAA,EACpD,GAAG,CAAC,MAAA,EAAQ,GAAA,EAAK,iBAAA,EAAmB,SAAS,CAAC,CAAA;AAE9C,EAAA,MAAM,aAAA,GAAgBN,WAAAA;AAAA,IAClB,CAAC,SAAA,KAAwC;AACrC,MAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,MAAA,IAAI,CAAC,IAAI,gBAAA,EAAkB;AACvB,QAAA,IAAIM,uBAAqB,EAAG;AACxB,UAAA,gBAAA;AAAA,YACI,GAAA;AAAA,YACA,wCAAA;AAAA,YACA,mFAAmF,SAAS,CAAA,6HAAA;AAAA,WAChG;AAAA,QACJ;AACA,QAAA,MAAM,IAAI,KAAA;AAAA,UACN;AAAA,SACJ;AAAA,MACJ;AACA,MAAA,OAAO,iBAAA;AAAA,QACH,gBAAA;AAAA,QACA,GAAA,CAAI,MAAK,CAAE,MAAA,CAAO,CAAC,GAAA,KAAQ,SAAA,CAAU,GAAG,CAAC;AAAA,OAC7C;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,GAAA,EAAK,iBAAA,EAAmB,SAAS;AAAA,GAC9C;AAEA,EAAA,OAAOV,OAAAA;AAAA,IACH,OAAO;AAAA,MACH,SAAA;AAAA,MACA,gBAAA,EAAkB,MAAA,GAAS,GAAA,CAAI,gBAAA,GAAmB,KAAA;AAAA,MAClD,QAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACJ,CAAA;AAAA,IACA,CAAC,WAAW,MAAA,EAAQ,GAAA,CAAI,kBAAkB,QAAA,EAAU,QAAA,EAAU,WAAW,aAAa;AAAA,GAC1F;AACJ;;;AChHO,SAAS,iBAAA,CACZ,aACA,OAAA,EACsC;AACtC,EAAA,IAAI,OAAO,gBAAgB,QAAA,EAAU;AACjC,IAAA,OAAO,OAAO,MAAA,CAAO;AAAA,MACjB,KAAK,WAAA,CAAY,GAAA;AAAA,MACjB,OAAA,EAAS;AAAA,QACL,GAAG,OAAA;AAAA,QACH,MAAA,EAAQ,EAAE,OAAA,EAAS,WAAA,CAAY,OAAA;AAAQ;AAC3C,KACH,CAAA;AAAA,EACL;AAEA,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACjB,GAAA,EAAK,WAAA;AAAA,IACL;AAAA,GACH,CAAA;AACL;;;AClDA,SAAS,gBAAA,CAAiB,KAAa,OAAA,EAAyB;AAC5D,EAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAC5B;AAEA,SAAS,mBAAA,CAAoB,KAAa,WAAA,EAA6B;AACnE,EAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAChC;AAEA,SAAS,eAAA,CAAgB,OAAe,KAAA,EAAqB;AACzD,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,IAAK,QAAQ,CAAA,EAAG;AACvC,IAAA,MAAM,IAAI,WAAA,CAAY,yBAAA,EAA2B,CAAA,EAAG,KAAK,CAAA,+BAAA,CAAiC,CAAA;AAAA,EAC9F;AACJ;AAsBO,SAAS,oBAAA,CAAqB,OAAA,GAAuC,EAAC,EAAmB;AAC5F,EAAA,MAAM,EAAE,OAAA,GAAU,IAAI,UAAA,GAAa,IAAG,GAAI,OAAA;AAE1C,EAAA,MAAM,sBAAA,uBAA6B,GAAA,EAAuB;AAC1D,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAuB;AACrD,EAAA,MAAM,8BAAA,uBAAqC,GAAA,EAA2B;AACtE,EAAA,MAAM,6BAAA,uBAAoC,GAAA,EAA2B;AAErE,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC1B,IAAA,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS,CAAA,wBAAA,EAA2B,MAAA,CAAO,GAAG,CAAA,CAAA,CAAG,CAAA;AAExE,IAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,MAAA,CAAO,GAAA,EAAK,OAAO,OAAO,CAAA;AACtD,IAAA,IAAI,sBAAA,CAAuB,GAAA,CAAI,EAAE,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,WAAA;AAAA,QACN,8BAAA;AAAA,QACA,CAAA,qCAAA,EAAwC,MAAA,CAAO,GAAG,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA;AAAA,OACjF;AAAA,IACJ;AAEA,IAAA,sBAAA,CAAuB,GAAA,CAAI,IAAI,MAAM,CAAA;AAErC,IAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA;AACtD,IAAA,IAAI,CAAC,aAAA,IAAiB,MAAA,CAAO,OAAA,GAAU,cAAc,OAAA,EAAS;AAC1D,MAAA,iBAAA,CAAkB,GAAA,CAAI,MAAA,CAAO,GAAA,EAAK,MAAM,CAAA;AAAA,IAC5C;AAAA,EACJ;AAEA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAChC,IAAA,eAAA,CAAgB,SAAA,CAAU,WAAA,EAAa,CAAA,+BAAA,EAAkC,SAAA,CAAU,GAAG,CAAA,CAAA,CAAG,CAAA;AACzF,IAAA,eAAA,CAAgB,SAAA,CAAU,SAAA,EAAW,CAAA,6BAAA,EAAgC,SAAA,CAAU,GAAG,CAAA,CAAA,CAAG,CAAA;AAErF,IAAA,IAAI,SAAA,CAAU,SAAA,GAAY,SAAA,CAAU,WAAA,EAAa;AAC7C,MAAA,MAAM,IAAI,WAAA;AAAA,QACN,yBAAA;AAAA,QACA,CAAA,oBAAA,EAAuB,UAAU,GAAG,CAAA,EAAA,EAAK,UAAU,WAAW,CAAA,IAAA,EAAO,UAAU,SAAS,CAAA,iBAAA;AAAA,OAC5F;AAAA,IACJ;AAEA,IAAA,IAAI,SAAA,CAAU,WAAA,KAAgB,SAAA,CAAU,SAAA,EAAW;AAC/C,MAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,SAAA,CAAU,GAAA,EAAK,UAAU,WAAW,CAAA;AAChE,MAAA,IAAI,8BAAA,CAA+B,GAAA,CAAI,EAAE,CAAA,EAAG;AACxC,QAAA,MAAM,IAAI,WAAA;AAAA,UACN,yBAAA;AAAA,UACA,CAAA,8CAAA,EAAiD,SAAA,CAAU,GAAG,CAAA,UAAA,EAAa,UAAU,WAAW,CAAA;AAAA,SACpG;AAAA,MACJ;AACA,MAAA,8BAAA,CAA+B,GAAA,CAAI,IAAI,SAAS,CAAA;AAChD,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,SAAA,CAAU,GAAA,EAAK,UAAU,WAAW,CAAA;AACxE,IAAA,IAAI,6BAAA,CAA8B,GAAA,CAAI,OAAO,CAAA,EAAG;AAC5C,MAAA,MAAM,QAAA,GAAW,6BAAA,CAA8B,GAAA,CAAI,OAAO,CAAA;AAC1D,MAAA,MAAM,IAAI,WAAA;AAAA,QACN,yBAAA;AAAA,QACA,sCAAsC,SAAA,CAAU,GAAG,CAAA,aAAA,EAAgB,SAAA,CAAU,WAAW,CAAA,EAAA,EACjF,QAAA,CAAS,WAAW,CAAA,IAAA,EAAO,SAAS,SAAS,CAAA,gBAAA,EAC7C,UAAU,WAAW,CAAA,IAAA,EAAO,UAAU,SAAS,CAAA;AAAA,OAC1D;AAAA,IACJ;AAEA,IAAA,6BAAA,CAA8B,GAAA,CAAI,SAAS,SAAS,CAAA;AAAA,EACxD;AACA,EAAA,OAAO;AAAA,IACH,SAAA,CAAU,KAAK,OAAA,EAAS;AACpB,MAAA,OAAO,sBAAA,CAAuB,GAAA,CAAI,gBAAA,CAAiB,GAAA,EAAK,OAAO,CAAC,CAAA;AAAA,IACpE,CAAA;AAAA,IACA,gBAAgB,GAAA,EAAK;AACjB,MAAA,OAAO,iBAAA,CAAkB,IAAI,GAAG,CAAA;AAAA,IACpC,CAAA;AAAA,IACA,gBAAA,CAAiB,GAAA,EAAK,WAAA,EAAa,SAAA,EAAiC;AAChE,MAAA,IAAI,WAAA,KAAgB,SAAA,EAAW,OAAO,EAAC;AACvC,MAAA,IAAI,SAAA,GAAY,aAAa,OAAO,IAAA;AAEpC,MAAA,MAAM,OAAwB,EAAC;AAC/B,MAAA,IAAI,cAAA,GAAiB,WAAA;AAErB,MAAA,OAAO,iBAAiB,SAAA,EAAW;AAC/B,QAAA,MAAM,OAAO,6BAAA,CAA8B,GAAA,CAAI,mBAAA,CAAoB,GAAA,EAAK,cAAc,CAAC,CAAA;AACvF,QAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,QAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,QAAA,cAAA,GAAiB,IAAA,CAAK,SAAA;AAAA,MAC1B;AAEA,MAAA,OAAO,cAAA,KAAmB,YAAY,IAAA,GAAO,IAAA;AAAA,IACjD,CAAA;AAAA,IACA,iBAAA,CAAkB,KAAK,OAAA,EAAS;AAC5B,MAAA,OAAO,8BAAA,CAA+B,GAAA,CAAI,gBAAA,CAAiB,GAAA,EAAK,OAAO,CAAC,CAAA;AAAA,IAC5E;AAAA,GACJ;AACJ;;;ACvHO,SAAS,eAAA,CACZ,GAAA,EACA,OAAA,EACA,MAAA,EACoD;AACpD,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACjB,GAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACH,CAAA;AACL;AAQO,SAAS,eAAA,CACZ,UAAA,EACA,QAAA,EACA,OAAA,EAC4B;AAC5B,EAAA,IAAI,UAAA,CAAW,GAAA,KAAQ,QAAA,CAAS,GAAA,EAAK;AACjC,IAAA,MAAM,IAAI,WAAA;AAAA,MACN,yBAAA;AAAA,MACA,CAAA,6CAAA,EAAgD,UAAA,CAAW,GAAG,CAAA,OAAA,EAAU,SAAS,GAAG,CAAA,CAAA;AAAA,KACxF;AAAA,EACJ;AAEA,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACjB,KAAK,UAAA,CAAW,GAAA;AAAA,IAChB,aAAa,UAAA,CAAW,OAAA;AAAA,IACxB,WAAW,QAAA,CAAS,OAAA;AAAA,IACpB;AAAA,GACH,CAAA;AACL;AAKO,SAAS,oBAAA,CACZ,QACA,OAAA,EACgC;AAChC,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACjB,KAAK,MAAA,CAAO,GAAA;AAAA,IACZ,aAAa,MAAA,CAAO,OAAA;AAAA,IACpB,WAAW,MAAA,CAAO,OAAA;AAAA,IAClB;AAAA,GACH,CAAA;AACL;;;ACtDA,IAAM,oBAAA,0BAA8B,wBAAwB,CAAA;AAiC5D,SAAS,YAAe,MAAA,EAAgD;AACpE,EAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,MAAA,EAAO;AAC1B,EAAA,IAAK,MAAA,CAAwC,oBAAoB,CAAA,EAAG;AAChE,IAAA,MAAA,CAAO,cAAA,CAAe,OAAO,oBAAA,EAAsB;AAAA,MAC/C,KAAA,EAAO,IAAA;AAAA,MACP,UAAA,EAAY,KAAA;AAAA,MACZ,YAAA,EAAc;AAAA,KACjB,CAAA;AAAA,EACL;AACA,EAAA,OAAO,KAAA;AACX;AAEA,SAAS,iBAAiB,MAAA,EAAgE;AACtF,EAAA,OAAO,OAAA,CAAS,MAAA,CAAwC,oBAAoB,CAAC,CAAA;AACjF;AAEA,SAAS,aAAgB,MAAA,EAAwD;AAC7E,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM,CAAA;AAChC,EAAA,MAAA,CAAO,cAAA,CAAe,OAAO,oBAAA,EAAsB;AAAA,IAC/C,KAAA,EAAO,IAAA;AAAA,IACP,UAAA,EAAY,KAAA;AAAA,IACZ,YAAA,EAAc;AAAA,GACjB,CAAA;AACD,EAAA,OAAO,KAAA;AACX;AAEA,SAAS,sBAAyB,MAAA,EAA6E;AAC3G,EAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,MAAA,EAAO;AAC1B,EAAA,OAAQ,MAAuC,oBAAoB,CAAA;AACnE,EAAA,OAAO,KAAA;AACX;AAEA,SAAS,QAAA,CACL,IAAA,EACA,KAAA,GAAkC,EAAC,EACjB;AAClB,EAAA,OAAO;AAAA,IACH,IAAA;AAAA,IACA,GAAG;AAAA,GACP;AACJ;AAEA,SAAS,YAAY,IAAA,EAAoD;AACrE,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,IAAA;AAC/B,EAAA,OAAO,KAAA,CAAM,QAAQ,IAAI,CAAA,GAAI,CAAC,GAAG,IAAI,CAAA,GAAI,CAAC,IAAI,CAAA;AAClD;AAEA,SAAS,eAAe,IAAA,EAA0E;AAC9F,EAAA,MAAM,KAAA,GAAQ,YAAY,IAAI,CAAA;AAC9B,EAAA,IAAI,UAAU,IAAA,EAAM;AAChB,IAAA,OAAO,MAAA;AAAA,EACX;AAEA,EAAA,OAAO,KAAA,CAAM,SAAS,MAAM,CAAA,GAAI,QAAQ,CAAC,GAAG,OAAO,MAAM,CAAA;AAC7D;AAEA,SAAS,eAAkB,MAAA,EAAuD;AAC9E,EAAA,IAAI,OAAO,IAAA,EAAM;AACb,IAAA,MAAM,YAAA,GAAe,cAAA,CAAe,MAAA,CAAO,IAAI,CAAA;AAC/C,IAAA,OAAO;AAAA,MACH,GAAG,MAAA;AAAA,MACH,GAAI,YAAA,GAAe,EAAE,IAAA,EAAM,YAAA,KAAiB,EAAC;AAAA,MAC7C,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,GAAI,MAAA,CAAO,IAAA,GAAO,CAAC,GAAG,MAAA,CAAO,IAAA,EAAM,IAAI;AAAA,KAC1E;AAAA,EACJ;AAEA,EAAA,IAAI,WAAW,MAAA,EAAQ;AACnB,IAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,GAAG,MAAK,GAAI,MAAA;AACvC,IAAA,MAAM,YAAA,GAAe,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC7C,IAAA,IAAI,UAAA,KAAe,IAAA,IAAQ,UAAA,KAAe,MAAA,EAAW;AACjD,MAAA,OAAO;AAAA,QACH,GAAG,MAAA;AAAA,QACH,GAAI,YAAA,GAAe,EAAE,IAAA,EAAM,YAAA,KAAiB;AAAC,OACjD;AAAA,IACJ;AAEA,IAAA,OAAO;AAAA,MACH,GAAG,IAAA;AAAA,MACH,GAAI,YAAA,GAAe,EAAE,IAAA,EAAM,YAAA,KAAiB,EAAC;AAAA,MAC7C,IAAA,EAAM,CAAC,UAAA,EAAY,IAAI;AAAA,KAC3B;AAAA,EACJ;AAEA,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA;AACrC,EAAA,IAAI,UAAU,IAAA,EAAM;AAChB,IAAA,MAAM,IAAI,WAAA;AAAA,MACN,4BAAA;AAAA,MACA;AAAA,KACJ;AAAA,EACJ;AAEA,EAAA,OAAO;AAAA,IACH,GAAG,MAAA;AAAA,IACH,IAAA,EAAM,MAAM,QAAA,CAAS,MAAM,IAAI,KAAA,GAAQ,CAAC,GAAG,KAAA,EAAO,MAAM;AAAA,GAC5D;AACJ;AAUO,IAAM,cAAA,GAAiB;AAAA,EAC1B,MAAA,CAAO,OAAA,GAA+B,EAAC,EAA4B;AAC/D,IAAA,OAAO,QAAA,CAAiB,UAAU,OAAO,CAAA;AAAA,EAC7C,CAAA;AAAA,EAEA,MAAA,CAAO,OAAA,GAA+B,EAAC,EAA4B;AAC/D,IAAA,OAAO,QAAA,CAAiB,UAAU,OAAO,CAAA;AAAA,EAC7C,CAAA;AAAA,EAEA,OAAA,CAAQ,OAAA,GAA+B,EAAC,EAA4B;AAChE,IAAA,OAAO,QAAA,CAAiB,WAAW,OAAO,CAAA;AAAA,EAC9C,CAAA;AAAA,EAEA,OAAA,GAAoC;AAChC,IAAA,OAAO,SAAkB,SAAS,CAAA;AAAA,EACtC,CAAA;AAAA,EAEA,SAAA,GAAmC;AAC/B,IAAA,OAAO,SAAe,MAAM,CAAA;AAAA,EAChC,CAAA;AAAA,EAEA,QAA6C,KAAA,EAAwC;AACjF,IAAA,OAAO;AAAA,MACH,KAAA,EAAO;AAAA,KACX;AAAA,EACJ,CAAA;AAAA,EAEA,KACI,MAAA,EACgC;AAChC,IAAA,OAAO;AAAA,MACH,IAAA,EAAM;AAAA,KACV;AAAA,EACJ,CAAA;AAAA,EAEA,SAAY,MAAA,EAAwD;AAChE,IAAA,OAAO,aAAa,MAAM,CAAA;AAAA,EAC9B,CAAA;AAAA,EAEA,SAAY,MAAA,EAAuD;AAC/D,IAAA,OAAO,eAAe,MAAM,CAAA;AAAA,EAChC,CAAA;AAAA,EAEA,KAAA,CACI,UAAA,EACA,OAAA,GAA8B,EAAC,EACqB;AACpD,IAAA,OAAO,SAA8C,OAAA,EAAS;AAAA,MAC1D,KAAA,EAAO,sBAAsB,UAAU,CAAA;AAAA,MACvC,GAAG;AAAA,KACN,CAAA;AAAA,EACL,CAAA;AAAA,EAEA,MAAA,CACI,KAAA,EACA,OAAA,GAA+B,EAAC,EACe;AAC/C,IAAA,MAAM,aAAyC,EAAC;AAChD,IAAA,MAAM,WAAqB,EAAC;AAE5B,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,MAAA,UAAA,CAAW,IAAI,CAAA,GAAI,qBAAA,CAAsB,MAAM,CAAA;AAC/C,MAAA,IAAI,CAAC,gBAAA,CAAiB,MAAM,CAAA,EAAG;AAC3B,QAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,MACtB;AAAA,IACJ;AAEA,IAAA,MAAM,MAAA,GAAqB;AAAA,MACvB,IAAA,EAAM,QAAA;AAAA,MACN,UAAA;AAAA,MACA,GAAG;AAAA,KACP;AAEA,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACrB,MAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAAA,IACtB;AAEA,IAAA,OAAO,MAAA;AAAA,EACX,CAAA;AAAA,EAEA,OACI,WAAA,EACmE;AACnE,IAAA,OAAO,SAA6D,QAAA,EAAU;AAAA,MAC1E,oBAAA,EAAsB,sBAAsB,WAAW;AAAA,KAC1D,CAAA;AAAA,EACL;AACJ;;;ACnLA,SAAS,eAAkB,OAAA,EAA8D;AACrF,EAAA,IAAI,SAAS,OAAO,OAAA;AACpB,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,CAAC,IAAA,KAAa,IAAA,CAA2B,EAAA;AAAA,IAChD,WAAA,EAAa,CAAC,IAAA,KAAa,IAAA,CAA2B,QAAA;AAAA,IACtD,cAAc,CAAC,IAAA,EAAS,cAAmB,EAAE,GAAI,MAAiB,QAAA,EAAS,CAAA;AAAA,IAC3E,QAAQ,CAAC,IAAA,EAAS,QAAgB,EAAE,GAAI,MAAiB,EAAA,EAAG;AAAA,GAChE;AACJ;AAqBO,SAAS,YAAA,CAAgB,IAAA,EAAS,EAAA,EAAY,OAAA,EAAmD;AACpG,EAAA,MAAM,IAAA,GAAO,eAAe,OAAO,CAAA;AACnC,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,KAAM,IAAI,OAAO,IAAA;AACpC,EAAA,KAAA,MAAW,SAAS,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,IAAK,EAAC,EAAG;AAC9C,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAA,EAAO,EAAA,EAAI,IAAI,CAAA;AAC1C,IAAA,IAAI,OAAO,OAAO,KAAA;AAAA,EACtB;AACA,EAAA,OAAO,MAAA;AACX;AA2BO,SAAS,oBAAA,CAAwB,IAAA,EAAS,QAAA,EAAkB,KAAA,EAAU,OAAA,EAAuC;AAChH,EAAA,MAAM,IAAA,GAAO,eAAe,OAAO,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAEhC,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAA0B;AACrC,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,KAAM,QAAA,EAAU;AAC/B,MAAA,MAAMW,SAAAA,GAAW,CAAC,GAAI,IAAA,CAAK,YAAY,IAAI,CAAA,IAAK,EAAG,CAAA;AACnD,MAAA,IAAIA,SAAAA,CAAS,KAAK,CAAC,QAAA,KAAa,KAAK,KAAA,CAAM,QAAQ,CAAA,KAAM,OAAO,CAAA,EAAG;AAC/D,QAAA,OAAO,CAAC,MAAM,KAAK,CAAA;AAAA,MACvB;AACA,MAAA,OAAO,CAAC,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,CAAC,GAAGA,SAAAA,EAAU,KAAK,CAAC,CAAA,EAAG,IAAI,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACtC,IAAA,IAAI,CAAC,QAAA,EAAU,MAAA,EAAQ,OAAO,CAAC,MAAM,KAAK,CAAA;AAE1C,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,GAAA,CAAI,CAAC,aAAA,KAAkB;AACjD,MAAA,IAAI,UAAU,OAAO,aAAA;AACrB,MAAA,MAAM,CAAC,SAAA,EAAW,SAAS,CAAA,GAAI,MAAM,aAAa,CAAA;AAClD,MAAA,QAAA,KAAA,QAAA,GAAa,SAAA,CAAA;AACb,MAAA,OAAA,KAAA,OAAA,GAAY,SAAA,KAAc,aAAA,CAAA;AAC1B,MAAA,OAAO,SAAA;AAAA,IACX,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,OAAA,EAAS,OAAO,CAAC,MAAM,QAAQ,CAAA;AACpC,IAAA,OAAO,CAAC,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,YAAY,GAAG,QAAQ,CAAA;AAAA,EAC3D,CAAA;AAEA,EAAA,OAAO,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA;AACxB;AA2BO,SAAS,UAAA,CAAc,IAAA,EAAS,SAAA,EAAmB,MAAA,EAAgB,OAAA,EAAuC;AAC7G,EAAA,MAAM,IAAA,GAAO,eAAe,OAAO,CAAA;AACnC,EAAA,IAAI,SAAA,KAAc,QAAQ,OAAO,IAAA;AACjC,EAAA,IAAI,CAAC,YAAA,CAAa,IAAA,EAAM,SAAA,EAAW,IAAI,GAAG,OAAO,IAAA;AACjD,EAAA,IAAI,YAAA,CAAa,IAAA,EAAM,MAAA,EAAQ,IAAI,GAAG,OAAO,IAAA;AAE7C,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAe;AAC1B,IAAA,IAAI,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,KAAM,YAAY,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA,GAAI,IAAA;AAC5E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAC1C,IAAA,IAAI,CAAC,QAAA,EAAU,MAAA,EAAQ,OAAO,QAAA;AAE9B,IAAA,IAAI,UAAU,QAAA,KAAa,IAAA;AAC3B,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,KAAU;AACzC,MAAA,MAAM,SAAA,GAAY,MAAM,KAAK,CAAA;AAC7B,MAAA,OAAA,KAAA,OAAA,GAAY,SAAA,KAAc,KAAA,CAAA;AAC1B,MAAA,OAAO,SAAA;AAAA,IACX,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,YAAY,CAAA;AAAA,EACnD,CAAA;AAEA,EAAA,OAAO,MAAM,IAAI,CAAA;AACrB;AA2BO,SAAS,gBAAA,CAAuB,IAAA,EAAS,MAAA,EAAwB,OAAA,EAAuC;AAC3G,EAAA,MAAM,IAAA,GAAO,eAAe,OAAO,CAAA;AAEnC,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAe;AAC1B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACtC,IAAA,IAAI,CAAC,QAAA,EAAU,MAAA,EAAQ,OAAO,IAAA;AAE9B,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAO;AACxB,IAAA,MAAM,eAAoB,EAAC;AAE3B,IAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC1B,MAAA,MAAM,eAAA,GAAkB,MAAM,KAAK,CAAA;AACnC,MAAA,OAAA,KAAA,OAAA,GAAY,eAAA,KAAoB,KAAA,CAAA;AAEhC,MAAA,MAAM,GAAA,GAAM,OAAO,eAAe,CAAA;AAClC,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACf,QAAA,OAAA,GAAU,IAAA;AACV,QAAA;AAAA,MACJ;AAEA,MAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,MAAA,YAAA,CAAa,KAAK,eAAe,CAAA;AAAA,IACrC;AAEA,IAAA,IAAI,CAAC,OAAA,IAAW,YAAA,CAAa,MAAA,KAAW,QAAA,CAAS,QAAQ,OAAO,IAAA;AAChE,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,YAAY,CAAA;AAAA,EAC/C,CAAA;AAEA,EAAA,OAAO,MAAM,IAAI,CAAA;AACrB","file":"schema.js","sourcesContent":["// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\n/**\n * @fileoverview Codec implementations for encoding and decoding values to/from storage.\n *\n * This module provides the built-in JSON codec and a factory for creating custom\n * codecs. Codecs handle the bidirectional transformation between typed JavaScript\n * values and their string representations for storage.\n *\n * Codecs are a low-level mechanism for keys that opt out of the JSON Schema\n * validation system. When a schema is registered for a key, the schema's\n * JSON Schema is used for validation and the payload is stored as a JSON value\n * directly (no codec encoding needed).\n */\n\nimport type { Codec } from \"./types\";\n\n/**\n * Custom error class for codec encoding and decoding failures.\n *\n * Thrown when a codec cannot successfully encode a value to a string or\n * decode a string back to its typed representation. This allows callers\n * to distinguish codec errors from other types of errors.\n *\n * @example\n * ```typescript\n * try {\n * const value = JSONCodec.decode('not-valid-json');\n * } catch (error) {\n * if (error instanceof CodecError) {\n * console.error('Failed to decode:', error.message);\n * }\n * }\n * ```\n */\nexport class CodecError extends Error {\n /**\n * The underlying error that caused the codec failure, if any.\n *\n * Useful for debugging when wrapping errors from JSON.parse or\n * other parsing operations.\n */\n readonly cause?: unknown;\n\n /**\n * Creates a new CodecError.\n *\n * @param message - Human-readable error description\n * @param cause - Optional underlying error that caused this failure\n */\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"CodecError\";\n this.cause = cause;\n\n // Required for proper instanceof behavior when targeting ES5\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * JSON codec for encoding and decoding JSON-serializable values.\n *\n * This is the default codec used by `useMnemonicKey` when no codec is specified.\n * It uses `JSON.stringify` for encoding and `JSON.parse` for decoding, making it\n * suitable for objects, arrays, and primitive values.\n *\n * @remarks\n * - Supports any JSON-serializable type: objects, arrays, strings, numbers, booleans, null\n * - Does not preserve JavaScript-specific types like Date, Map, Set, or undefined\n * - Throws standard JSON parsing errors for malformed JSON strings\n *\n * @example\n * ```typescript\n * // Used automatically as the default\n * const { value, set } = useMnemonicKey('userProfile', {\n * defaultValue: { name: 'Guest', preferences: { theme: 'dark' } }\n * // codec: JSONCodec is implicit\n * });\n *\n * // Can be specified explicitly\n * const { value, set } = useMnemonicKey('settings', {\n * defaultValue: { notifications: true },\n * codec: JSONCodec\n * });\n * ```\n *\n * @see {@link createCodec} - For custom encoding schemes\n */\nexport const JSONCodec: Codec<any> = {\n encode: (value) => JSON.stringify(value),\n decode: (encoded) => JSON.parse(encoded),\n};\n\n/**\n * Factory function for creating custom codecs.\n *\n * Creates a `Codec<T>` from separate encode and decode functions. This is\n * useful for implementing custom serialization strategies for types that\n * aren't supported by JSONCodec. Using a custom codec on a key opts out\n * of JSON Schema validation for that key.\n *\n * @template T - The TypeScript type of values to encode/decode\n *\n * @param encode - Function that converts a typed value to a string\n * @param decode - Function that converts a string back to a typed value\n * @returns A `Codec<T>` object compatible with useMnemonicKey\n *\n * @example\n * ```typescript\n * // Codec for Date objects\n * const DateCodec = createCodec<Date>(\n * (date) => date.toISOString(),\n * (str) => new Date(str)\n * );\n *\n * const { value, set } = useMnemonicKey('lastLogin', {\n * defaultValue: new Date(),\n * codec: DateCodec\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Codec for Set<string>\n * const StringSetCodec = createCodec<Set<string>>(\n * (set) => JSON.stringify(Array.from(set)),\n * (str) => new Set(JSON.parse(str))\n * );\n *\n * const { value, set } = useMnemonicKey('tags', {\n * defaultValue: new Set<string>(),\n * codec: StringSetCodec\n * });\n * ```\n *\n * @see {@link Codec} - The codec interface\n * @see {@link CodecError} - Error to throw when encoding/decoding fails\n * @see {@link JSONCodec} - Built-in codec for JSON values\n */\nexport function createCodec<T>(encode: (value: T) => string, decode: (encoded: string) => T): Codec<T> {\n return { encode, decode };\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\n/**\n * @fileoverview JSON Schema subset validator for Mnemonic.\n *\n * This module implements a minimal JSON Schema validator sufficient for\n * validating localStorage state. Only a subset of JSON Schema keywords\n * are supported; see {@link JsonSchema} for the full list.\n *\n * JSON Schema documents are plain JSON objects (inherently serializable),\n * making them suitable for storage alongside the data they describe.\n */\n\n/**\n * Supported JSON Schema type keywords.\n *\n * `\"integer\"` is a JSON Schema keyword meaning \"a number that is a whole number.\"\n */\nexport type JsonSchemaType = \"string\" | \"number\" | \"integer\" | \"boolean\" | \"null\" | \"object\" | \"array\";\n\n/**\n * A subset of JSON Schema sufficient for localStorage state management.\n *\n * Supported keywords:\n * type, enum, const,\n * minimum, maximum, exclusiveMinimum, exclusiveMaximum,\n * minLength, maxLength,\n * properties, required, additionalProperties,\n * items, minItems, maxItems\n *\n * Deliberately omitted: $ref, $id, $schema, $defs, allOf, anyOf,\n * oneOf, not, pattern, format, patternProperties, if/then/else,\n * dependencies, uniqueItems, multipleOf, propertyNames.\n *\n * An empty schema `{}` accepts any value.\n */\nexport interface JsonSchema {\n /** The expected JSON type(s). An array form like `[\"string\", \"null\"]` accepts either type. */\n type?: JsonSchemaType | JsonSchemaType[];\n\n /** The value must be deeply equal to one of these entries. */\n enum?: readonly unknown[];\n\n /** The value must be deeply equal to this exact value. */\n const?: unknown;\n\n /** Inclusive lower bound for numbers. */\n minimum?: number;\n\n /** Inclusive upper bound for numbers. */\n maximum?: number;\n\n /** Exclusive lower bound for numbers. */\n exclusiveMinimum?: number;\n\n /** Exclusive upper bound for numbers. */\n exclusiveMaximum?: number;\n\n /** Minimum string length (inclusive). */\n minLength?: number;\n\n /** Maximum string length (inclusive). */\n maxLength?: number;\n\n /** Property name to sub-schema mapping for objects. */\n properties?: Record<string, JsonSchema>;\n\n /** Properties that must be present on the object. */\n required?: readonly string[];\n\n /**\n * Controls extra properties not listed in `properties`.\n * `false` disallows them. A schema validates their values.\n * `true` (or omitted) allows anything.\n */\n additionalProperties?: boolean | JsonSchema;\n\n /** Schema applied to every element of an array. */\n items?: JsonSchema;\n\n /** Minimum array length (inclusive). */\n minItems?: number;\n\n /** Maximum array length (inclusive). */\n maxItems?: number;\n}\n\n/**\n * A single validation error produced by {@link validateJsonSchema}.\n */\nexport type JsonSchemaValidationError = {\n /** JSON Pointer path to the failing value (e.g., \"/foo/bar/0\"). Empty string for root. */\n path: string;\n /** Human-readable error description. */\n message: string;\n /** The JSON Schema keyword that failed. */\n keyword: string;\n};\n\n/**\n * Tests whether a value matches a single JSON Schema type keyword.\n */\nfunction matchesType(value: unknown, type: JsonSchemaType): boolean {\n switch (type) {\n case \"string\":\n return typeof value === \"string\";\n case \"number\":\n return typeof value === \"number\" && Number.isFinite(value);\n case \"integer\":\n return typeof value === \"number\" && Number.isInteger(value);\n case \"boolean\":\n return typeof value === \"boolean\";\n case \"null\":\n return value === null;\n case \"object\":\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n case \"array\":\n return Array.isArray(value);\n default:\n return false;\n }\n}\n\n/**\n * Structural deep equality for JSON values (null, booleans, numbers, strings,\n * arrays, and plain objects). Used by `enum` and `const` keywords.\n */\nfunction jsonDeepEqualArray(a: readonly unknown[], b: readonly unknown[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!jsonDeepEqual(a[i], b[i])) return false;\n }\n return true;\n}\n\nfunction jsonDeepEqualObject(a: Record<string, unknown>, b: Record<string, unknown>): boolean {\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) return false;\n for (const key of aKeys) {\n if (!objectHasOwn(b, key)) return false;\n if (!jsonDeepEqual(a[key], b[key])) return false;\n }\n return true;\n}\n\nexport function jsonDeepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (typeof a !== typeof b) return false;\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b)) return false;\n return jsonDeepEqualArray(a, b);\n }\n\n if (typeof a === \"object\") {\n if (Array.isArray(b)) return false;\n return jsonDeepEqualObject(a as Record<string, unknown>, b as Record<string, unknown>);\n }\n\n return false;\n}\n\n/**\n * A pre-compiled validation function generated by {@link compileSchema}.\n *\n * Accepts a value and an optional JSON Pointer path for error reporting.\n * Returns an array of validation errors (empty = valid).\n */\nexport type CompiledValidator = (value: unknown, path?: string) => JsonSchemaValidationError[];\n\ntype ValidationStep = (value: unknown, path: string, errors: JsonSchemaValidationError[]) => void;\ntype TypeValidationStep = (value: unknown, path: string, errors: JsonSchemaValidationError[]) => boolean;\ntype ObjectValidationStep = (value: Record<string, unknown>, path: string, errors: JsonSchemaValidationError[]) => void;\n\n/** Module-level cache: schema object identity → compiled validator. */\nconst compiledCache = new WeakMap<JsonSchema, CompiledValidator>();\n\n/**\n * Pre-compiles a {@link JsonSchema} into a reusable validation function.\n *\n * Inspects the schema once and builds a specialized closure that\n * eliminates runtime branching for unused keywords, pre-converts\n * `required` arrays to `Set`s, recursively pre-compiles nested property\n * and item schemas, and pre-builds primitive `Set`s for O(1) enum\n * lookups when possible.\n *\n * Results are cached by schema object identity in a `WeakMap`, so\n * calling `compileSchema` with the same schema reference is free\n * after the first call.\n *\n * @param schema - The JSON Schema to compile\n * @returns A compiled validation function\n */\nexport function compileSchema(schema: JsonSchema): CompiledValidator {\n const cached = compiledCache.get(schema);\n if (cached) return cached;\n\n const compiled = buildValidator(schema);\n compiledCache.set(schema, compiled);\n return compiled;\n}\n\n/** Determines whether a value is a JSON primitive (not object/array). */\nfunction isJsonPrimitive(value: unknown): boolean {\n return value === null || typeof value !== \"object\";\n}\n\nfunction isJsonObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction objectHasOwn(value: object, property: PropertyKey): boolean {\n const hasOwn = (Object as typeof Object & { hasOwn?: (target: object, key: PropertyKey) => boolean }).hasOwn;\n if (typeof hasOwn === \"function\") {\n return hasOwn(value, property);\n }\n return Object.getOwnPropertyDescriptor(value, property) !== undefined;\n}\n\n/**\n * Internal: builds a compiled validator closure for a single schema.\n * All keyword-specific logic is resolved at build time so the returned\n * function contains only the checks that are relevant.\n */\nfunction buildValidator(schema: JsonSchema): CompiledValidator {\n const typeStep = buildTypeValidationStep(schema);\n const validationSteps = [\n buildEnumValidationStep(schema),\n buildConstValidationStep(schema),\n buildNumberValidationStep(schema),\n buildStringValidationStep(schema),\n buildObjectValidationStep(schema),\n buildArrayValidationStep(schema),\n ].filter((step): step is ValidationStep => step !== null);\n\n if (typeStep === null && validationSteps.length === 0) {\n return (_value: unknown, _path?: string) => [];\n }\n\n return (value: unknown, path: string = \"\"): JsonSchemaValidationError[] => {\n const errors: JsonSchemaValidationError[] = [];\n if (typeStep && !typeStep(value, path, errors)) {\n return errors;\n }\n for (const step of validationSteps) {\n step(value, path, errors);\n }\n return errors;\n };\n}\n\nfunction buildTypeValidationStep(schema: JsonSchema): TypeValidationStep | null {\n if (schema.type === undefined) {\n return null;\n }\n\n const resolvedTypes = Array.isArray(schema.type) ? schema.type : [schema.type];\n const typeLabel = JSON.stringify(schema.type);\n return (value, path, errors) => {\n if (resolvedTypes.some((type) => matchesType(value, type))) {\n return true;\n }\n errors.push({\n path,\n message: `Expected type ${typeLabel}, got ${jsonTypeLabel(value)}`,\n keyword: \"type\",\n });\n return false;\n };\n}\n\nfunction buildEnumValidationStep(schema: JsonSchema): ValidationStep | null {\n if (schema.enum === undefined) {\n return null;\n }\n\n const enumPrimitiveSet = new Set(schema.enum.filter((member) => isJsonPrimitive(member)));\n const enumComplexMembers = schema.enum.filter((member) => !isJsonPrimitive(member));\n\n return (value, path, errors) => {\n const primitiveMatch = isJsonPrimitive(value) && enumPrimitiveSet.has(value);\n const complexMatch = !primitiveMatch && enumComplexMembers.some((entry) => jsonDeepEqual(value, entry));\n if (primitiveMatch || complexMatch) {\n return;\n }\n errors.push({\n path,\n message: `Value does not match any enum member`,\n keyword: \"enum\",\n });\n };\n}\n\nfunction buildConstValidationStep(schema: JsonSchema): ValidationStep | null {\n if (!(\"const\" in schema)) {\n return null;\n }\n\n return (value, path, errors) => {\n if (jsonDeepEqual(value, schema.const)) {\n return;\n }\n errors.push({\n path,\n message: `Value does not match const`,\n keyword: \"const\",\n });\n };\n}\n\nfunction buildNumberValidationStep(schema: JsonSchema): ValidationStep | null {\n const hasMinimum = schema.minimum !== undefined;\n const hasMaximum = schema.maximum !== undefined;\n const hasExMin = schema.exclusiveMinimum !== undefined;\n const hasExMax = schema.exclusiveMaximum !== undefined;\n if (!hasMinimum && !hasMaximum && !hasExMin && !hasExMax) {\n return null;\n }\n\n const minimum = schema.minimum;\n const maximum = schema.maximum;\n const exMin = schema.exclusiveMinimum;\n const exMax = schema.exclusiveMaximum;\n\n return (value, path, errors) => {\n if (typeof value !== \"number\") {\n return;\n }\n if (hasMinimum && value < minimum!) {\n errors.push({\n path,\n message: `Value ${value} is less than minimum ${minimum!}`,\n keyword: \"minimum\",\n });\n }\n if (hasMaximum && value > maximum!) {\n errors.push({\n path,\n message: `Value ${value} is greater than maximum ${maximum!}`,\n keyword: \"maximum\",\n });\n }\n if (hasExMin && value <= exMin!) {\n errors.push({\n path,\n message: `Value ${value} is not greater than exclusiveMinimum ${exMin!}`,\n keyword: \"exclusiveMinimum\",\n });\n }\n if (hasExMax && value >= exMax!) {\n errors.push({\n path,\n message: `Value ${value} is not less than exclusiveMaximum ${exMax!}`,\n keyword: \"exclusiveMaximum\",\n });\n }\n };\n}\n\nfunction buildStringValidationStep(schema: JsonSchema): ValidationStep | null {\n const hasMinLength = schema.minLength !== undefined;\n const hasMaxLength = schema.maxLength !== undefined;\n if (!hasMinLength && !hasMaxLength) {\n return null;\n }\n\n const minLength = schema.minLength;\n const maxLength = schema.maxLength;\n return (value, path, errors) => {\n if (typeof value !== \"string\") {\n return;\n }\n if (hasMinLength && value.length < minLength!) {\n errors.push({\n path,\n message: `String length ${value.length} is less than minLength ${minLength!}`,\n keyword: \"minLength\",\n });\n }\n if (hasMaxLength && value.length > maxLength!) {\n errors.push({\n path,\n message: `String length ${value.length} is greater than maxLength ${maxLength!}`,\n keyword: \"maxLength\",\n });\n }\n };\n}\n\nfunction buildObjectValidationStep(schema: JsonSchema): ValidationStep | null {\n const requiredKeys = schema.required ?? [];\n const propertyValidators = schema.properties\n ? (Object.entries(schema.properties).map(([name, propertySchema]) => [\n name,\n compileSchema(propertySchema),\n ]) satisfies [string, CompiledValidator][])\n : null;\n const checkAdditional = schema.additionalProperties !== undefined && schema.additionalProperties !== true;\n const additionalIsFalse = schema.additionalProperties === false;\n const additionalValidator =\n checkAdditional && !additionalIsFalse ? compileSchema(schema.additionalProperties as JsonSchema) : null;\n const definedPropKeys = checkAdditional ? new Set(Object.keys(schema.properties ?? {})) : null;\n const objectValidationSteps: ObjectValidationStep[] = [];\n\n if (requiredKeys.length > 0) {\n objectValidationSteps.push(createRequiredPropertyStep(requiredKeys));\n }\n if (propertyValidators !== null) {\n objectValidationSteps.push(createDeclaredPropertyStep(propertyValidators));\n }\n if (checkAdditional) {\n objectValidationSteps.push(\n createAdditionalPropertyStep({\n additionalIsFalse,\n additionalValidator,\n definedPropKeys: definedPropKeys ?? new Set<string>(),\n }),\n );\n }\n\n if (objectValidationSteps.length === 0) {\n return null;\n }\n\n return (value, path, errors) => {\n if (!isJsonObjectRecord(value)) {\n return;\n }\n\n for (const step of objectValidationSteps) {\n step(value, path, errors);\n }\n };\n}\n\nfunction createRequiredPropertyStep(requiredKeys: readonly string[]): ObjectValidationStep {\n return (value, path, errors) => {\n for (const requiredKey of requiredKeys) {\n if (objectHasOwn(value, requiredKey)) {\n continue;\n }\n errors.push({\n path,\n message: `Missing required property \"${requiredKey}\"`,\n keyword: \"required\",\n });\n }\n };\n}\n\nfunction createDeclaredPropertyStep(propertyValidators: [string, CompiledValidator][]): ObjectValidationStep {\n return (value, path, errors) => {\n for (const [propertyName, validator] of propertyValidators) {\n if (!objectHasOwn(value, propertyName)) {\n continue;\n }\n errors.push(...validator(value[propertyName], `${path}/${propertyName}`));\n }\n };\n}\n\nfunction createAdditionalPropertyStep({\n additionalIsFalse,\n additionalValidator,\n definedPropKeys,\n}: {\n additionalIsFalse: boolean;\n additionalValidator: CompiledValidator | null;\n definedPropKeys: Set<string>;\n}): ObjectValidationStep {\n return (value, path, errors) => {\n for (const objectKey of Object.keys(value)) {\n if (definedPropKeys.has(objectKey)) {\n continue;\n }\n if (additionalIsFalse) {\n errors.push({\n path,\n message: `Additional property \"${objectKey}\" is not allowed`,\n keyword: \"additionalProperties\",\n });\n continue;\n }\n errors.push(...additionalValidator!(value[objectKey], `${path}/${objectKey}`));\n }\n };\n}\n\nfunction buildArrayValidationStep(schema: JsonSchema): ValidationStep | null {\n const hasMinItems = schema.minItems !== undefined;\n const hasMaxItems = schema.maxItems !== undefined;\n const itemsValidator = schema.items ? compileSchema(schema.items) : null;\n if (!hasMinItems && !hasMaxItems && itemsValidator === null) {\n return null;\n }\n\n const minItems = schema.minItems;\n const maxItems = schema.maxItems;\n return (value, path, errors) => {\n if (!Array.isArray(value)) {\n return;\n }\n if (hasMinItems && value.length < minItems!) {\n errors.push({\n path,\n message: `Array length ${value.length} is less than minItems ${minItems!}`,\n keyword: \"minItems\",\n });\n }\n if (hasMaxItems && value.length > maxItems!) {\n errors.push({\n path,\n message: `Array length ${value.length} is greater than maxItems ${maxItems!}`,\n keyword: \"maxItems\",\n });\n }\n if (itemsValidator === null) {\n return;\n }\n for (const [index, item] of value.entries()) {\n errors.push(...itemsValidator(item, `${path}/${index}`));\n }\n };\n}\n\n/**\n * Validates a value against a {@link JsonSchema}.\n *\n * Returns an empty array when the value is valid.\n * Returns one or more {@link JsonSchemaValidationError} entries on failure.\n * Short-circuits on type mismatch (does not report downstream keyword errors).\n *\n * @param value - The value to validate\n * @param schema - The JSON Schema to validate against\n * @param path - Internal: JSON Pointer path for error reporting (default: `\"\"`)\n * @returns Array of validation errors (empty = valid)\n */\nexport function validateJsonSchema(value: unknown, schema: JsonSchema, path: string = \"\"): JsonSchemaValidationError[] {\n const compiled = compileSchema(schema);\n return compiled(value, path);\n}\n\n/**\n * Returns a human-readable label for the JSON type of a value.\n */\nfunction jsonTypeLabel(value: unknown): string {\n if (value === null) return \"null\";\n if (Array.isArray(value)) return \"array\";\n return typeof value;\n}\n\n/**\n * Infers a minimal {@link JsonSchema} from a sample value.\n *\n * Used by autoschema mode to register a schema from the first\n * successfully decoded value. The inferred schema only constrains\n * the top-level type.\n *\n * @param sample - A decoded value to infer a schema from\n * @returns A minimal JsonSchema that accepts values of the same top-level type\n */\nexport function inferJsonSchema(sample: unknown): JsonSchema {\n if (sample === null) return { type: \"null\" };\n if (Array.isArray(sample)) return { type: \"array\" };\n switch (typeof sample) {\n case \"string\":\n return { type: \"string\" };\n case \"number\":\n return { type: \"number\" };\n case \"boolean\":\n return { type: \"boolean\" };\n case \"object\":\n return { type: \"object\" };\n default:\n return {};\n }\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\n/**\n * @fileoverview Schema versioning primitives for Mnemonic.\n *\n * This module defines the envelope format used to wrap every persisted value\n * and the error class thrown when schema-related operations fail.\n */\n\n/**\n * Error thrown for schema registry, versioning, and migration failures.\n *\n * Each instance carries a machine-readable {@link code} that categorises\n * the failure. When a `defaultValue` factory is provided to\n * `useMnemonicKey`, the `SchemaError` is passed as the `error` argument\n * so the factory can inspect the failure reason.\n *\n * Error codes:\n *\n * | Code | Meaning |\n * | ------------------------------- | --------------------------------------------------------------- |\n * | `INVALID_ENVELOPE` | The raw stored value is not a valid `MnemonicEnvelope`. |\n * | `SCHEMA_NOT_FOUND` | No schema registered for the stored key + version. |\n * | `WRITE_SCHEMA_REQUIRED` | Strict mode requires a schema to write, but none was found. |\n * | `MIGRATION_PATH_NOT_FOUND` | No contiguous migration path between the stored and latest version. |\n * | `MIGRATION_FAILED` | A migration step threw during execution. |\n * | `MIGRATION_GRAPH_INVALID` | The schema registry helper received an ambiguous or cyclic migration graph. |\n * | `RECONCILE_FAILED` | A read-time reconciliation hook threw or returned an unpersistable value. |\n * | `SCHEMA_REGISTRATION_CONFLICT` | `registerSchema` was called with a conflicting definition. |\n * | `TYPE_MISMATCH` | The decoded value failed JSON Schema validation. |\n * | `MODE_CONFIGURATION_INVALID` | The schema mode requires a capability the registry doesn't provide. |\n *\n * @example\n * ```typescript\n * defaultValue: (error) => {\n * if (error instanceof SchemaError) {\n * console.warn(`Schema issue [${error.code}]:`, error.message);\n * }\n * return { name: \"Guest\" };\n * }\n * ```\n *\n * @see {@link SchemaMode} - How the provider uses schemas\n * @see {@link SchemaRegistry} - Where schemas and migrations are registered\n */\nexport class SchemaError extends Error {\n /**\n * Machine-readable code identifying the category of schema failure.\n */\n readonly code:\n | \"INVALID_ENVELOPE\"\n | \"SCHEMA_NOT_FOUND\"\n | \"WRITE_SCHEMA_REQUIRED\"\n | \"MIGRATION_PATH_NOT_FOUND\"\n | \"MIGRATION_FAILED\"\n | \"MIGRATION_GRAPH_INVALID\"\n | \"RECONCILE_FAILED\"\n | \"SCHEMA_REGISTRATION_CONFLICT\"\n | \"TYPE_MISMATCH\"\n | \"MODE_CONFIGURATION_INVALID\";\n\n /**\n * The underlying error that caused this failure, if any.\n */\n readonly cause?: unknown;\n\n /**\n * Creates a new SchemaError.\n *\n * @param code - Machine-readable failure category\n * @param message - Human-readable error description\n * @param cause - Optional underlying error\n */\n constructor(code: SchemaError[\"code\"], message: string, cause?: unknown) {\n super(message);\n this.name = \"SchemaError\";\n this.code = code;\n this.cause = cause;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * The JSON envelope that wraps every value persisted by the library.\n *\n * All values are stored as `JSON.stringify({ version, payload })`. The\n * `version` field tells the read path which schema to use for validating\n * the `payload`.\n *\n * - When no schema is active (codec-only mode), `version` is `0` and\n * `payload` is a codec-encoded string.\n * - When a schema is active, `version` corresponds to the schema version\n * and `payload` is the JSON value directly (not string-encoded).\n *\n * @internal\n */\nexport type MnemonicEnvelope = {\n /**\n * Schema version number.\n *\n * Non-negative integer. Any version (including `0`) may have a\n * registered {@link KeySchema}.\n */\n version: number;\n\n /**\n * The stored value.\n *\n * For schema-managed keys, this is a JSON value (object, array,\n * string, number, boolean, or null). For codec-managed keys, this\n * is a string produced by `Codec.encode`.\n */\n payload: unknown;\n};\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport type { StorageLike } from \"./types\";\n\ntype RuntimeProcess = { env?: { NODE_ENV?: string } };\n\nfunction getGlobalProcess(): RuntimeProcess | undefined {\n return (globalThis as { process?: RuntimeProcess }).process;\n}\n\nexport function getRuntimeNodeEnv(): string | undefined {\n const runtimeProcess = getGlobalProcess();\n if (runtimeProcess?.env?.NODE_ENV !== undefined) {\n return runtimeProcess.env.NODE_ENV;\n }\n return undefined;\n}\n\nexport function getNativeBrowserStorages(): StorageLike[] {\n const globalWindow = (globalThis as { window?: Window }).window;\n if (!globalWindow) return [];\n\n const storages: StorageLike[] = [];\n const addStorage = (getter: () => StorageLike) => {\n try {\n storages.push(getter());\n } catch {\n // Ignore blocked browser storage access and continue probing others.\n }\n };\n\n addStorage(() => globalWindow.localStorage);\n addStorage(() => globalWindow.sessionStorage);\n return storages;\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { useSyncExternalStore, useMemo, useEffect, useRef, useCallback, useState } from \"react\";\nimport { useMnemonic } from \"./provider\";\nimport { JSONCodec, CodecError } from \"./codecs\";\nimport { SchemaError, type MnemonicEnvelope } from \"./schema\";\nimport { getRuntimeNodeEnv } from \"./runtime\";\nimport type { Mnemonic, MnemonicKeyDescriptor, MnemonicKeyState, UseMnemonicKeyOptions } from \"./types\";\n\nexport type ReadResult<T, Extra extends object = {}> = {\n value: T;\n rewriteRaw?: string;\n} & Extra;\n\ntype SharedMnemonicKeyContext<T> = {\n api: Mnemonic;\n key: string;\n codec: NonNullable<UseMnemonicKeyOptions<T>[\"codec\"]>;\n codecOpt: UseMnemonicKeyOptions<T>[\"codec\"];\n schema: UseMnemonicKeyOptions<T>[\"schema\"];\n reconcile: UseMnemonicKeyOptions<T>[\"reconcile\"];\n onMount: UseMnemonicKeyOptions<T>[\"onMount\"];\n onChange: UseMnemonicKeyOptions<T>[\"onChange\"];\n listenCrossTab: UseMnemonicKeyOptions<T>[\"listenCrossTab\"];\n getFallback: (error?: CodecError | SchemaError) => T;\n getServerValue: () => T;\n parseEnvelope: (rawText: string) =>\n | {\n ok: true;\n envelope: MnemonicEnvelope;\n }\n | {\n ok: false;\n error: SchemaError;\n };\n decodeStringPayload: <V>(payload: string, activeCodec: { decode: (encoded: string) => V }) => V;\n buildFallbackResult: <Extra extends object = {}>(\n error?: CodecError | SchemaError,\n extra?: Extra,\n ) => ReadResult<T, Extra>;\n developmentRuntime: boolean;\n contractFingerprint: string | null;\n hasMounted: boolean;\n setHasMounted: (value: boolean) => void;\n hydrationMode: NonNullable<UseMnemonicKeyOptions<T>[\"ssr\"]>[\"hydration\"] | undefined;\n ssrOptions: UseMnemonicKeyOptions<T>[\"ssr\"];\n};\n\ntype UseMnemonicKeyStateConfig<T, Extra extends object> = {\n decodeForRead: (rawText: string | null) => ReadResult<T, Extra>;\n encodeForWrite: (nextValue: T) => string;\n active?: boolean;\n additionalDevWarnings?: (args: {\n api: Mnemonic;\n key: string;\n listenCrossTab: UseMnemonicKeyOptions<T>[\"listenCrossTab\"];\n codecOpt: UseMnemonicKeyOptions<T>[\"codec\"];\n schema: UseMnemonicKeyOptions<T>[\"schema\"];\n warnOnce: (id: string, message: string) => void;\n }) => void;\n onDecodedEffect?: (decoded: ReadResult<T, Extra>) => void;\n};\n\ntype ApplyReconcileArgs<T, Extra extends object> = {\n value: T;\n rewriteRaw?: string;\n extra?: Extra;\n persistedVersion: number;\n latestVersion?: number;\n serializeForPersist: (value: T) => string;\n deriveExtra?: (value: T, extra?: Extra) => Extra | undefined;\n};\n\nconst SSR_SNAPSHOT_TOKEN = Symbol(\"mnemonic:ssr-snapshot\");\nconst diagnosticContractRegistry = new WeakMap<object, Map<string, string>>();\nconst diagnosticWarningRegistry = new WeakMap<object, Set<string>>();\nconst diagnosticObjectIds = new WeakMap<object, number>();\nlet nextDiagnosticObjectId = 1;\n\nexport function serializeEnvelope(version: number, payload: unknown): string {\n return JSON.stringify({\n version,\n payload,\n } satisfies MnemonicEnvelope);\n}\n\nexport function withReadMetadata<T, Extra extends object = {}>(\n value: T,\n rewriteRaw?: string,\n extra?: Extra,\n): ReadResult<T, Extra> {\n const result = { value } as ReadResult<T, Extra>;\n if (extra !== undefined) {\n Object.assign(result, extra);\n }\n if (rewriteRaw !== undefined) result.rewriteRaw = rewriteRaw;\n return result;\n}\n\nfunction isDevelopmentRuntime(): boolean {\n return getRuntimeNodeEnv() === \"development\";\n}\n\nfunction getDiagnosticWarnings(api: object): Set<string> {\n let warnings = diagnosticWarningRegistry.get(api);\n if (!warnings) {\n warnings = new Set<string>();\n diagnosticWarningRegistry.set(api, warnings);\n }\n return warnings;\n}\n\nfunction warnOnce(api: object, id: string, message: string): void {\n const warnings = getDiagnosticWarnings(api);\n if (warnings.has(id)) return;\n warnings.add(id);\n console.warn(message);\n}\n\nfunction stableDiagnosticValue(value: unknown): string {\n if (typeof value === \"function\") {\n const source = Function.prototype.toString.call(value).split(/\\s+/).join(\" \").trim();\n const name = value.name || \"anonymous\";\n return `[factory:${name}/${value.length}:${source}]`;\n }\n if (typeof value === \"bigint\") return `${value.toString()}n`;\n if (typeof value === \"symbol\") return value.toString();\n if (value === undefined) return \"undefined\";\n try {\n return JSON.stringify(value);\n } catch {\n const tag = Object.prototype.toString.call(value);\n if (value !== null && (typeof value === \"object\" || typeof value === \"function\")) {\n return `${tag}#${getDiagnosticObjectId(value)}`;\n }\n return tag;\n }\n}\n\nfunction isObjectLike(value: unknown): value is object {\n return value !== null && (typeof value === \"object\" || typeof value === \"function\");\n}\n\nfunction objectHasOwn(value: object, property: PropertyKey): boolean {\n const hasOwn = (Object as typeof Object & { hasOwn?: (target: object, key: PropertyKey) => boolean }).hasOwn;\n if (typeof hasOwn === \"function\") {\n return hasOwn(value, property);\n }\n return Object.getOwnPropertyDescriptor(value, property) !== undefined;\n}\n\nfunction getDiagnosticObjectId(value: object): number {\n const existing = diagnosticObjectIds.get(value);\n if (existing !== undefined) return existing;\n const id = nextDiagnosticObjectId++;\n diagnosticObjectIds.set(value, id);\n return id;\n}\n\nfunction buildContractFingerprint<T>({\n api,\n key,\n defaultValue,\n codecOpt,\n schemaVersion,\n reconcile,\n listenCrossTab,\n ssrOptions,\n}: {\n api: object;\n key: string;\n defaultValue: UseMnemonicKeyOptions<T>[\"defaultValue\"];\n codecOpt: UseMnemonicKeyOptions<T>[\"codec\"];\n schemaVersion?: number;\n reconcile: UseMnemonicKeyOptions<T>[\"reconcile\"];\n listenCrossTab: UseMnemonicKeyOptions<T>[\"listenCrossTab\"];\n ssrOptions: UseMnemonicKeyOptions<T>[\"ssr\"];\n}): string {\n const codecSignature =\n codecOpt == null || !isObjectLike(codecOpt)\n ? \"default-json-codec\"\n : `codec:${stableDiagnosticValue((codecOpt as { encode?: unknown }).encode)}:${stableDiagnosticValue((codecOpt as { decode?: unknown }).decode)}`;\n const reconcileSignature =\n reconcile == null || !isObjectLike(reconcile)\n ? \"no-reconcile\"\n : `reconcile:${stableDiagnosticValue(reconcile)}`;\n\n return JSON.stringify({\n key,\n defaultValue: stableDiagnosticValue(defaultValue),\n codec: codecSignature,\n schemaVersion: schemaVersion ?? null,\n listenCrossTab: Boolean(listenCrossTab),\n reconcile: reconcileSignature,\n ssrHydration: ssrOptions?.hydration ?? null,\n hasServerValue: ssrOptions?.serverValue !== undefined,\n providerHydration: (api as { ssrHydration?: string }).ssrHydration ?? null,\n });\n}\n\nexport function resolveMnemonicKeyArgs<T>(\n keyOrDescriptor: string | MnemonicKeyDescriptor<T, string>,\n options?: UseMnemonicKeyOptions<T>,\n): MnemonicKeyDescriptor<T, string> {\n if (typeof keyOrDescriptor !== \"string\") {\n return keyOrDescriptor;\n }\n if (!options) {\n throw new Error(\"useMnemonicKey requires options when called with a string key\");\n }\n return {\n key: keyOrDescriptor,\n options,\n };\n}\n\nexport function useMnemonicKeyShared<T>(\n keyOrDescriptor: string | MnemonicKeyDescriptor<T, string>,\n options: UseMnemonicKeyOptions<T> | undefined,\n schemaVersion?: number,\n): SharedMnemonicKeyContext<T> {\n return useMnemonicKeySharedFromApi(useMnemonic(), keyOrDescriptor, options, schemaVersion);\n}\n\nexport function useMnemonicKeySharedFromApi<T>(\n api: Mnemonic,\n keyOrDescriptor: string | MnemonicKeyDescriptor<T, string>,\n options: UseMnemonicKeyOptions<T> | undefined,\n schemaVersion?: number,\n): SharedMnemonicKeyContext<T> {\n const descriptor = resolveMnemonicKeyArgs(keyOrDescriptor, options);\n const key = descriptor.key;\n const resolvedOptions = descriptor.options;\n\n const {\n defaultValue,\n onMount,\n onChange,\n listenCrossTab,\n codec: codecOpt,\n schema,\n reconcile,\n ssr: ssrOptions,\n } = resolvedOptions;\n\n const codec = codecOpt ?? JSONCodec;\n const hydrationMode = ssrOptions?.hydration ?? api.ssrHydration;\n const [hasMounted, setHasMounted] = useState(hydrationMode !== \"client-only\");\n const developmentRuntime = isDevelopmentRuntime();\n const contractFingerprint = useMemo(\n () =>\n developmentRuntime\n ? buildContractFingerprint({\n api,\n key,\n defaultValue,\n codecOpt,\n ...(schemaVersion === undefined ? {} : { schemaVersion }),\n reconcile,\n listenCrossTab,\n ssrOptions,\n })\n : null,\n [\n developmentRuntime,\n api,\n key,\n defaultValue,\n codecOpt,\n schemaVersion,\n reconcile,\n listenCrossTab,\n ssrOptions?.hydration,\n ssrOptions?.serverValue,\n ],\n );\n\n const getFallback = useCallback(\n (error?: CodecError | SchemaError) =>\n typeof defaultValue === \"function\"\n ? (defaultValue as (error?: CodecError | SchemaError) => T)(error)\n : defaultValue,\n [defaultValue],\n );\n\n const getServerValue = useCallback(() => {\n const serverValue = ssrOptions?.serverValue;\n if (serverValue === undefined) {\n return getFallback();\n }\n return typeof serverValue === \"function\" ? (serverValue as () => T)() : serverValue;\n }, [getFallback, ssrOptions?.serverValue]);\n\n const parseEnvelope = useCallback(\n (rawText: string): { ok: true; envelope: MnemonicEnvelope } | { ok: false; error: SchemaError } => {\n try {\n const parsed = JSON.parse(rawText) as MnemonicEnvelope;\n if (\n typeof parsed !== \"object\" ||\n parsed == null ||\n !Number.isInteger(parsed.version) ||\n parsed.version < 0 ||\n !objectHasOwn(parsed, \"payload\")\n ) {\n return {\n ok: false,\n error: new SchemaError(\"INVALID_ENVELOPE\", `Invalid envelope for key \"${key}\"`),\n };\n }\n return { ok: true, envelope: parsed };\n } catch (err) {\n return {\n ok: false,\n error: new SchemaError(\"INVALID_ENVELOPE\", `Invalid envelope for key \"${key}\"`, err),\n };\n }\n },\n [key],\n );\n\n const decodeStringPayload = useCallback(\n <V>(payload: string, activeCodec: { decode: (encoded: string) => V }) => {\n try {\n return activeCodec.decode(payload);\n } catch (err) {\n throw err instanceof CodecError ? err : new CodecError(`Codec decode failed for key \"${key}\"`, err);\n }\n },\n [key],\n );\n\n const buildFallbackResult = useCallback(\n <Extra extends object = {}>(error?: CodecError | SchemaError, extra?: Extra): ReadResult<T, Extra> => {\n return withReadMetadata(getFallback(error), undefined, extra);\n },\n [getFallback],\n );\n\n return {\n api,\n key,\n codec,\n codecOpt,\n schema,\n reconcile,\n onMount,\n onChange,\n listenCrossTab,\n getFallback,\n getServerValue,\n parseEnvelope,\n decodeStringPayload,\n buildFallbackResult,\n developmentRuntime,\n contractFingerprint,\n hasMounted,\n setHasMounted,\n hydrationMode,\n ssrOptions,\n };\n}\n\nexport function useApplyReconcile<T, Extra extends object = {}>({\n key,\n reconcile,\n buildFallbackResult,\n}: {\n key: string;\n reconcile: UseMnemonicKeyOptions<T>[\"reconcile\"];\n buildFallbackResult: <ResultExtra extends object = {}>(\n error?: CodecError | SchemaError,\n extra?: ResultExtra,\n ) => ReadResult<T, ResultExtra>;\n}) {\n return useCallback(\n ({\n value,\n rewriteRaw,\n extra,\n persistedVersion,\n latestVersion,\n serializeForPersist,\n deriveExtra,\n }: ApplyReconcileArgs<T, Extra>): ReadResult<T, Extra> => {\n if (!reconcile) {\n return withReadMetadata(value, rewriteRaw, extra);\n }\n\n const context: { key: string; persistedVersion: number; latestVersion?: number } = {\n key,\n persistedVersion,\n };\n if (latestVersion !== undefined) {\n context.latestVersion = latestVersion;\n }\n\n const baselineSerialized = (() => {\n try {\n return serializeForPersist(value);\n } catch {\n return rewriteRaw;\n }\n })();\n\n try {\n const reconciled = reconcile(value, context);\n const nextExtra = deriveExtra ? deriveExtra(reconciled, extra) : extra;\n const nextSerialized = serializeForPersist(reconciled);\n const nextRewriteRaw =\n baselineSerialized === undefined || nextSerialized !== baselineSerialized\n ? nextSerialized\n : rewriteRaw;\n return withReadMetadata(reconciled, nextRewriteRaw, nextExtra);\n } catch (err) {\n const typedErr =\n err instanceof SchemaError\n ? err\n : new SchemaError(\"RECONCILE_FAILED\", `Reconciliation failed for key \"${key}\"`, err);\n return buildFallbackResult(typedErr, extra);\n }\n },\n [buildFallbackResult, key, reconcile],\n );\n}\n\nexport function useMnemonicKeyState<T, Extra extends object>(\n shared: SharedMnemonicKeyContext<T>,\n config: UseMnemonicKeyStateConfig<T, Extra>,\n): MnemonicKeyState<T> {\n const {\n api,\n key,\n codecOpt,\n schema,\n onMount,\n onChange,\n listenCrossTab,\n getFallback,\n getServerValue,\n developmentRuntime,\n contractFingerprint,\n hasMounted,\n setHasMounted,\n hydrationMode,\n ssrOptions,\n } = shared;\n const { decodeForRead, encodeForWrite, active = true, additionalDevWarnings, onDecodedEffect } = config;\n\n const getServerRawSnapshot = useCallback(\n (): string | typeof SSR_SNAPSHOT_TOKEN | null =>\n ssrOptions?.serverValue === undefined ? null : SSR_SNAPSHOT_TOKEN,\n [ssrOptions?.serverValue],\n );\n\n const deferStorageRead = hydrationMode === \"client-only\" && !hasMounted;\n const subscribe = useCallback(\n (listener: () => void) => {\n if (!active) {\n return () => undefined;\n }\n if (deferStorageRead) {\n return () => undefined;\n }\n return api.subscribeRaw(key, listener);\n },\n [active, api, deferStorageRead, key],\n );\n\n const raw = useSyncExternalStore(\n subscribe,\n () => (active && !deferStorageRead ? api.getRawSnapshot(key) : getServerRawSnapshot()),\n getServerRawSnapshot,\n );\n\n const decoded = useMemo(() => {\n if (raw === SSR_SNAPSHOT_TOKEN) {\n return withReadMetadata<T, Extra>(getServerValue());\n }\n return decodeForRead(raw);\n }, [decodeForRead, getServerValue, raw]);\n const value = decoded.value;\n\n useEffect(() => {\n if (!active) return;\n if (!developmentRuntime) return;\n\n const globalWindow = (globalThis as { window?: Window }).window;\n\n if (listenCrossTab && (api.crossTabSyncMode ?? \"none\") === \"none\" && globalWindow !== undefined) {\n warnOnce(\n api,\n `listenCrossTab:${key}`,\n `[Mnemonic] useMnemonicKey(\"${key}\") enabled listenCrossTab, but the active storage backend may not be able to notify external changes. If you're using a custom Storage-like wrapper around localStorage, ensure it forwards browser \"storage\" events or implements storage.onExternalChange(...); otherwise, use localStorage or implement storage.onExternalChange(...) on your custom backend.`,\n );\n }\n\n additionalDevWarnings?.({\n api,\n key,\n listenCrossTab,\n codecOpt,\n schema,\n warnOnce: (id, message) => warnOnce(api, id, message),\n });\n\n let keyContracts = diagnosticContractRegistry.get(api);\n if (!keyContracts) {\n keyContracts = new Map<string, string>();\n diagnosticContractRegistry.set(api, keyContracts);\n }\n\n if (contractFingerprint === null) {\n return;\n }\n const previousContract = keyContracts.get(key);\n if (previousContract === undefined) {\n keyContracts.set(key, contractFingerprint);\n return;\n }\n if (previousContract === contractFingerprint) {\n return;\n }\n\n warnOnce(\n api,\n `contract-conflict:${key}`,\n `[Mnemonic] Conflicting useMnemonicKey contracts detected for key \"${key}\" in namespace \"${api.prefix.slice(0, -1)}\". Reuse a shared descriptor with defineMnemonicKey(...) or align defaultValue/codec/schema/reconcile options so every consumer describes the same persisted contract.`,\n );\n }, [\n active,\n additionalDevWarnings,\n api,\n key,\n developmentRuntime,\n contractFingerprint,\n listenCrossTab,\n codecOpt,\n schema,\n api.crossTabSyncMode,\n ]);\n\n useEffect(() => {\n if (hasMounted) return;\n setHasMounted(true);\n }, [hasMounted, setHasMounted]);\n\n useEffect(() => {\n if (!active) return;\n if (decoded.rewriteRaw && decoded.rewriteRaw !== raw) {\n api.setRaw(key, decoded.rewriteRaw);\n }\n }, [active, api, decoded.rewriteRaw, key, raw]);\n\n useEffect(() => {\n if (!active) return;\n onDecodedEffect?.(decoded);\n }, [active, decoded, onDecodedEffect]);\n\n const prevRef = useRef<T>(value);\n\n const mounted = useRef(false);\n useEffect(() => {\n if (!active) return;\n if (mounted.current) return;\n mounted.current = true;\n onMount?.(value);\n prevRef.current = value;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active]);\n\n useEffect(() => {\n if (!active) return;\n const prev = prevRef.current;\n if (Object.is(prev, value)) return;\n prevRef.current = value;\n onChange?.(value, prev);\n }, [active, value, onChange]);\n\n useEffect(() => {\n if (!active) return;\n if (!listenCrossTab) return;\n const globalWindow = (globalThis as { window?: Window }).window;\n if (globalWindow === undefined) return;\n\n const storageKey = api.prefix + key;\n\n const handler = (e: StorageEvent) => {\n if (e.key === null) {\n api.removeRaw(key);\n return;\n }\n if (e.key !== storageKey) return;\n if (e.newValue == null) {\n api.removeRaw(key);\n return;\n }\n api.setRaw(key, e.newValue);\n };\n\n globalWindow.addEventListener(\"storage\", handler);\n return () => globalWindow.removeEventListener(\"storage\", handler);\n }, [active, listenCrossTab, api, key]);\n\n const set = useMemo(() => {\n if (!active) {\n return () => undefined;\n }\n return (next: T | ((cur: T) => T)) => {\n const nextVal =\n typeof next === \"function\" ? (next as (c: T) => T)(decodeForRead(api.getRawSnapshot(key)).value) : next;\n try {\n const encoded = encodeForWrite(nextVal);\n api.setRaw(key, encoded);\n } catch (err) {\n if (err instanceof SchemaError) {\n console.error(`[Mnemonic] Schema error for key \"${key}\" (${err.code}):`, err.message);\n return;\n }\n if (err instanceof CodecError) {\n console.error(`[Mnemonic] Codec encode error for key \"${key}\":`, err.message);\n return;\n }\n console.error(`[Mnemonic] Failed to persist key \"${key}\":`, err);\n }\n };\n }, [active, api, key, decodeForRead, encodeForWrite]);\n\n const reset = useMemo(() => {\n if (!active) {\n return () => undefined;\n }\n return () => {\n const v = getFallback();\n try {\n const encoded = encodeForWrite(v);\n api.setRaw(key, encoded);\n } catch (err) {\n if (err instanceof SchemaError) {\n console.error(`[Mnemonic] Schema error for key \"${key}\" (${err.code}):`, err.message);\n return;\n }\n if (err instanceof CodecError) {\n console.error(`[Mnemonic] Codec encode error for key \"${key}\":`, err.message);\n }\n return;\n }\n };\n }, [active, api, key, getFallback, encodeForWrite]);\n\n const remove = useMemo(() => {\n if (!active) {\n return () => undefined;\n }\n return () => api.removeRaw(key);\n }, [active, api, key]);\n\n return useMemo<MnemonicKeyState<T>>(\n () => ({\n value,\n set,\n reset,\n remove,\n }),\n [value, set, reset, remove],\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { CodecError, JSONCodec } from \"./codecs\";\nimport { inferJsonSchema, validateJsonSchema } from \"./json-schema\";\nimport { SchemaError, type MnemonicEnvelope } from \"./schema\";\nimport { serializeEnvelope } from \"./use-shared\";\nimport type { JsonSchema } from \"./json-schema\";\nimport type { KeySchema, MigrationPath, Mnemonic, OptionalMnemonicKeyOptions, SchemaRegistry } from \"./types\";\nimport type { MnemonicOptionalBridgeInternal, OptionalReadResult } from \"./optional-bridge\";\n\ntype OptionalBridgeConfig = {\n api: Mnemonic;\n schemaRegistry?: SchemaRegistry;\n};\n\nfunction resolveOptionalDefaultValue<T>(defaultValue: OptionalMnemonicKeyOptions<T>[\"defaultValue\"]): T {\n return typeof defaultValue === \"function\" ? (defaultValue as () => T)() : defaultValue;\n}\n\nfunction objectHasOwn(value: object, property: PropertyKey): boolean {\n const hasOwn = (Object as typeof Object & { hasOwn?: (target: object, key: PropertyKey) => boolean }).hasOwn;\n if (typeof hasOwn === \"function\") {\n return hasOwn(value, property);\n }\n return Object.getOwnPropertyDescriptor(value, property) !== undefined;\n}\n\nfunction parseEnvelope(key: string, rawText: string): MnemonicEnvelope {\n try {\n const parsed = JSON.parse(rawText) as MnemonicEnvelope;\n if (\n typeof parsed !== \"object\" ||\n parsed == null ||\n !Number.isInteger(parsed.version) ||\n parsed.version < 0 ||\n !objectHasOwn(parsed, \"payload\")\n ) {\n throw new SchemaError(\"INVALID_ENVELOPE\", `Invalid envelope for key \"${key}\"`);\n }\n return parsed;\n } catch (error) {\n if (error instanceof SchemaError) {\n throw error;\n }\n throw new SchemaError(\"INVALID_ENVELOPE\", `Invalid envelope for key \"${key}\"`, error);\n }\n}\n\nfunction decodeStringPayload<T>(key: string, payload: string, options: OptionalMnemonicKeyOptions<T>): T {\n const codec = options.codec ?? JSONCodec;\n try {\n return codec.decode(payload);\n } catch (error) {\n throw error instanceof CodecError ? error : new CodecError(`Codec decode failed for key \"${key}\"`, error);\n }\n}\n\nfunction validateAgainstSchema(key: string, value: unknown, jsonSchema: JsonSchema): void {\n const errors = validateJsonSchema(value, jsonSchema);\n if (errors.length === 0) {\n return;\n }\n const message = errors.map((entry) => `${entry.path || \"/\"}: ${entry.message}`).join(\"; \");\n throw new SchemaError(\"TYPE_MISMATCH\", `Schema validation failed for key \"${key}\": ${message}`);\n}\n\nfunction getSchemaCapabilities(schemaRegistry?: SchemaRegistry): boolean {\n return schemaRegistry !== undefined;\n}\n\nfunction buildFallbackResult<T>(options: OptionalMnemonicKeyOptions<T>): OptionalReadResult<T> {\n return {\n value: resolveOptionalDefaultValue(options.defaultValue),\n };\n}\n\nfunction getLatestSchema(schemaRegistry: SchemaRegistry | undefined, key: string): KeySchema | undefined {\n return schemaRegistry?.getLatestSchema(key);\n}\n\nfunction getSchemaForVersion(\n schemaRegistry: SchemaRegistry | undefined,\n key: string,\n version: number,\n): KeySchema | undefined {\n return schemaRegistry?.getSchema(key, version);\n}\n\nfunction getMigrationPath(\n schemaRegistry: SchemaRegistry | undefined,\n key: string,\n fromVersion: number,\n toVersion: number,\n): MigrationPath | null {\n return schemaRegistry?.getMigrationPath(key, fromVersion, toVersion) ?? null;\n}\n\nfunction encodeValueForWrite<T>(\n key: string,\n nextValue: T,\n options: OptionalMnemonicKeyOptions<T>,\n schemaRegistry?: SchemaRegistry,\n): string {\n const explicitVersion = options.schema?.version;\n const latestSchema = getLatestSchema(schemaRegistry, key);\n const targetSchema =\n explicitVersion === undefined\n ? latestSchema\n : (getSchemaForVersion(schemaRegistry, key, explicitVersion) ?? latestSchema);\n\n if (!targetSchema) {\n const codec = options.codec ?? JSONCodec;\n return serializeEnvelope(0, codec.encode(nextValue));\n }\n\n let valueToStore: unknown = nextValue;\n const writeMigration = schemaRegistry?.getWriteMigration?.(key, targetSchema.version);\n if (writeMigration) {\n try {\n valueToStore = writeMigration.migrate(valueToStore);\n } catch (error) {\n throw error instanceof SchemaError\n ? error\n : new SchemaError(\"MIGRATION_FAILED\", `Write-time migration failed for key \"${key}\"`, error);\n }\n }\n\n validateAgainstSchema(key, valueToStore, targetSchema.schema);\n return serializeEnvelope(targetSchema.version, valueToStore);\n}\n\nfunction decodeCodecManagedEnvelope<T>(\n key: string,\n envelope: MnemonicEnvelope,\n options: OptionalMnemonicKeyOptions<T>,\n): OptionalReadResult<T> {\n if (typeof envelope.payload !== \"string\") {\n return {\n value: envelope.payload as T,\n };\n }\n\n return {\n value: decodeStringPayload(key, envelope.payload, options),\n };\n}\n\nfunction decodeAutoschemaEnvelope<T>(\n key: string,\n envelope: MnemonicEnvelope,\n options: OptionalMnemonicKeyOptions<T>,\n schemaRegistry: SchemaRegistry | undefined,\n): OptionalReadResult<T> {\n if (!schemaRegistry?.registerSchema) {\n throw new SchemaError(\n \"MODE_CONFIGURATION_INVALID\",\n `Autoschema mode requires schema registry registration for key \"${key}\"`,\n );\n }\n\n const decoded =\n typeof envelope.payload === \"string\"\n ? decodeStringPayload(key, envelope.payload, options)\n : (envelope.payload as T);\n const pendingSchema: KeySchema = {\n key,\n version: 1,\n schema: inferJsonSchema(decoded),\n };\n\n return {\n value: decoded,\n rewriteRaw: serializeEnvelope(pendingSchema.version, decoded),\n pendingSchema,\n };\n}\n\nfunction decodeSchemaManagedEnvelope<T>(\n key: string,\n envelope: MnemonicEnvelope,\n schemaForVersion: KeySchema,\n latestSchema: KeySchema | undefined,\n schemaRegistry: SchemaRegistry | undefined,\n): OptionalReadResult<T> {\n let current: unknown = envelope.payload;\n validateAgainstSchema(key, current, schemaForVersion.schema);\n\n if (!latestSchema || envelope.version >= latestSchema.version) {\n return {\n value: current as T,\n };\n }\n\n const path = getMigrationPath(schemaRegistry, key, envelope.version, latestSchema.version);\n if (!path) {\n throw new SchemaError(\n \"MIGRATION_PATH_NOT_FOUND\",\n `No migration path for key \"${key}\" from v${envelope.version} to v${latestSchema.version}`,\n );\n }\n\n for (const step of path) {\n current = step.migrate(current);\n }\n\n validateAgainstSchema(key, current, latestSchema.schema);\n return {\n value: current as T,\n rewriteRaw: serializeEnvelope(latestSchema.version, current),\n };\n}\n\nfunction decodePersistedValue<T>(\n key: string,\n raw: string | null,\n options: OptionalMnemonicKeyOptions<T>,\n api: Mnemonic,\n schemaRegistry?: SchemaRegistry,\n): OptionalReadResult<T> {\n if (raw == null) {\n return buildFallbackResult(options);\n }\n\n const envelope = parseEnvelope(key, raw);\n const latestSchema = getLatestSchema(schemaRegistry, key);\n const schemaForVersion = getSchemaForVersion(schemaRegistry, key, envelope.version);\n\n if (api.schemaMode === \"strict\" && !schemaForVersion) {\n throw new SchemaError(\"SCHEMA_NOT_FOUND\", `No schema for key \"${key}\" v${envelope.version}`);\n }\n\n if (api.schemaMode === \"autoschema\" && !schemaForVersion) {\n return decodeAutoschemaEnvelope(key, envelope, options, schemaRegistry);\n }\n\n if (!schemaForVersion) {\n return decodeCodecManagedEnvelope(key, envelope, options);\n }\n\n return decodeSchemaManagedEnvelope(key, envelope, schemaForVersion, latestSchema, schemaRegistry);\n}\n\nexport function createMnemonicOptionalBridge({\n api,\n schemaRegistry,\n}: OptionalBridgeConfig): MnemonicOptionalBridgeInternal {\n return {\n namespace: api.prefix.endsWith(\".\") ? api.prefix.slice(0, -1) : api.prefix,\n capabilities: {\n persistence: true,\n schema: getSchemaCapabilities(schemaRegistry),\n },\n subscribeRaw: (key, listener) => api.subscribeRaw(key, listener),\n getRawSnapshot: (key) => api.getRawSnapshot(key),\n decodeSnapshot: (key, raw, options) => {\n try {\n return decodePersistedValue(key, raw, options, api, schemaRegistry);\n } catch {\n return buildFallbackResult(options);\n }\n },\n setValue: (key, nextValue, options) => {\n try {\n api.setRaw(key, encodeValueForWrite(key, nextValue, options, schemaRegistry));\n } catch (error) {\n if (error instanceof SchemaError) {\n console.error(`[Mnemonic] Schema error for key \"${key}\" (${error.code}):`, error.message);\n return;\n }\n if (error instanceof CodecError) {\n console.error(`[Mnemonic] Codec error for key \"${key}\":`, error.message);\n return;\n }\n throw error;\n }\n },\n removeValue: (key) => {\n api.removeRaw(key);\n },\n commitSnapshot: (key, raw, snapshot) => {\n if (snapshot.pendingSchema && schemaRegistry?.registerSchema) {\n if (!schemaRegistry.getSchema(snapshot.pendingSchema.key, snapshot.pendingSchema.version)) {\n try {\n schemaRegistry.registerSchema(snapshot.pendingSchema);\n } catch {\n // Ignore registration races; the next read/write enforces schema validity.\n }\n }\n }\n if (snapshot.rewriteRaw !== undefined && snapshot.rewriteRaw !== raw) {\n api.setRaw(key, snapshot.rewriteRaw);\n }\n },\n };\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { createContext, useContext } from \"react\";\nimport type { KeySchema, Listener, MnemonicOptionalBridge, OptionalMnemonicKeyOptions, Unsubscribe } from \"./types\";\n\nexport type OptionalReadResult<T> = {\n value: T;\n rewriteRaw?: string;\n pendingSchema?: KeySchema;\n};\n\nexport interface MnemonicOptionalBridgeInternal extends MnemonicOptionalBridge {\n subscribeRaw(key: string, listener: Listener): Unsubscribe;\n getRawSnapshot(key: string): string | null;\n decodeSnapshot<T>(key: string, raw: string | null, options: OptionalMnemonicKeyOptions<T>): OptionalReadResult<T>;\n setValue<T>(key: string, nextValue: T, options: OptionalMnemonicKeyOptions<T>): void;\n removeValue(key: string): void;\n commitSnapshot<T>(key: string, raw: string | null, snapshot: OptionalReadResult<T>): void;\n}\n\nexport const MnemonicOptionalBridgeContext = createContext<MnemonicOptionalBridgeInternal | null>(null);\n\nexport function useMnemonicOptionalBridge(): MnemonicOptionalBridgeInternal | null {\n return useContext(MnemonicOptionalBridgeContext);\n}\n\nexport function toPublicMnemonicOptionalBridge(\n bridge: MnemonicOptionalBridgeInternal | null,\n): MnemonicOptionalBridge | null {\n if (!bridge) {\n return null;\n }\n return {\n namespace: bridge.namespace,\n capabilities: bridge.capabilities,\n };\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { createElement, type ReactNode } from \"react\";\nimport { MnemonicOptionalBridgeContext } from \"./optional-bridge\";\nimport type { MnemonicOptionalBridgeInternal } from \"./optional-bridge\";\n\nexport interface MnemonicOptionalBridgeProviderProps {\n readonly bridge: MnemonicOptionalBridgeInternal;\n readonly children: ReactNode;\n}\n\nexport function MnemonicOptionalBridgeProvider({\n bridge,\n children,\n}: Readonly<MnemonicOptionalBridgeProviderProps>): ReactNode {\n return createElement(MnemonicOptionalBridgeContext.Provider, { value: bridge }, children);\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\n/**\n * @fileoverview React Context provider for persistent state management.\n *\n * This module exports the MnemonicProvider component and useMnemonic hook,\n * which together provide a namespace-scoped storage API to child components.\n * The provider creates an in-memory cache with read-through behavior to localStorage\n * (or a synchronous custom storage backend) and implements the React external\n * store contract.\n */\n\nimport { createContext, useContext, useMemo, useEffect, ReactNode } from \"react\";\nimport { createMnemonicOptionalBridge } from \"./optional-bridge-adapter\";\nimport { MnemonicOptionalBridgeProvider } from \"./optional-bridge-provider\";\nimport { getNativeBrowserStorages, getRuntimeNodeEnv } from \"./runtime\";\nimport type { Mnemonic, MnemonicProviderOptions, StorageLike, Listener, Unsubscribe } from \"./types\";\n\n/**\n * React Context for the Mnemonic store.\n *\n * Provides access to the low-level storage API. Consumer code should use\n * `useMnemonicKey` instead of accessing this context directly.\n *\n * @internal\n */\nconst MnemonicContext = createContext<Mnemonic | null>(null);\n\n/**\n * Hook to access the Mnemonic store from context.\n *\n * This is a low-level hook used internally by `useMnemonicKey`. Most applications\n * should use `useMnemonicKey` instead, which provides a higher-level, type-safe API.\n *\n * @returns The Mnemonic store instance\n *\n * @throws {Error} If called outside of a MnemonicProvider\n *\n * @example\n * ```tsx\n * // Internal usage (prefer useMnemonicKey for application code)\n * function MyComponent() {\n * const store = useMnemonic();\n * const raw = store.getRawSnapshot('myKey');\n * // ...\n * }\n * ```\n *\n * @see {@link useMnemonicKey} - Higher-level hook for application code\n * @see {@link MnemonicProvider} - Required provider component\n */\nexport function useMnemonic(): Mnemonic {\n const context = useMnemonicOptional();\n if (!context) {\n throw new Error(\"useMnemonic must be used within a MnemonicProvider\");\n }\n return context;\n}\n\n/**\n * Hook to access the Mnemonic store when one is available.\n *\n * Unlike {@link useMnemonic}, this hook never throws. It returns `null`\n * when no provider is mounted above the caller.\n */\nexport function useMnemonicOptional(): Mnemonic | null {\n return useContext(MnemonicContext);\n}\n\n/**\n * Props for the MnemonicProvider component.\n *\n * Extends MnemonicProviderOptions with required children prop.\n *\n * @see {@link MnemonicProviderOptions} - Configuration options\n * @see {@link MnemonicProvider} - Provider component\n */\nexport interface MnemonicProviderProps extends Readonly<MnemonicProviderOptions> {\n /**\n * React children to render within the provider.\n */\n readonly children: ReactNode;\n}\n\n/**\n * Helper function to safely access window.localStorage in browser environments.\n *\n * Returns undefined in non-browser environments (SSR) or when localStorage\n * is unavailable (e.g., in private browsing mode with strict settings).\n *\n * @returns localStorage if available, undefined otherwise\n *\n * @internal\n */\nfunction defaultBrowserStorage(): StorageLike | undefined {\n const globalWindow = (globalThis as { window?: Window }).window;\n if (globalWindow === undefined) return undefined;\n try {\n return globalWindow.localStorage;\n } catch {\n return undefined;\n }\n}\n\n/** Internal store type with reload capability, not exposed to consumers. */\ntype MnemonicInternal = Mnemonic & {\n reloadFromStorage: (changedKeys?: string[]) => void;\n};\n\n/** Internal store extension to retain a strong provider API reference while mounted. */\ntype MnemonicInternalWithDevToolsHold = MnemonicInternal & {\n __devToolsProviderApiHold?: DevToolsProviderApi;\n};\n\n/** Minimal WeakRef shape so we can compile against ES2020 libs. */\ntype WeakRefLike<T extends object> = {\n deref: () => T | undefined;\n};\n\ntype WeakRefConstructorLike = new <T extends object>(target: T) => WeakRefLike<T>;\n\ntype DevToolsProviderApi = {\n getStore: () => MnemonicInternal;\n dump: () => Record<string, string>;\n get: (key: string) => unknown;\n set: (key: string, value: unknown) => void;\n remove: (key: string) => void;\n clear: () => void;\n keys: () => string[];\n};\n\ntype DevToolsProviderEntry = {\n namespace: string;\n weakRef: WeakRefLike<DevToolsProviderApi>;\n registeredAt: number;\n lastSeenAt: number;\n staleSince: number | null;\n};\n\ntype DevToolsProviderDescriptor = {\n namespace: string;\n available: boolean;\n registeredAt: number;\n lastSeenAt: number;\n staleSince: number | null;\n};\n\ntype DevToolsRegistryRoot = {\n providers: Record<string, DevToolsProviderEntry>;\n resolve: (namespace: string) => DevToolsProviderApi | null;\n list: () => DevToolsProviderDescriptor[];\n capabilities: {\n weakRef: boolean;\n finalizationRegistry: boolean;\n };\n __meta: {\n version: number;\n lastUpdated: number;\n lastChange: string;\n };\n};\n\ntype DevToolsGlobalWindow = Window & {\n __REACT_MNEMONIC_DEVTOOLS__?: unknown;\n};\n\ntype StorageAccessCallbacks = {\n onAccessError: (error: unknown) => void;\n onAccessSuccess: () => void;\n onAsyncViolation: (method: \"getItem\" | \"setItem\" | \"removeItem\", thenable: PromiseLike<unknown>) => void;\n};\n\nfunction detectEnumerableStorage(storage: StorageLike | undefined): boolean {\n if (!storage) return false;\n try {\n return typeof storage.length === \"number\" && typeof storage.key === \"function\";\n } catch {\n return false;\n }\n}\n\nfunction isProductionRuntime(): boolean {\n const env = getRuntimeNodeEnv();\n if (env === undefined) {\n return true;\n }\n return env === \"production\";\n}\n\nfunction weakRefConstructor(): WeakRefConstructorLike | null {\n const ctor = (globalThis as { WeakRef?: unknown }).WeakRef;\n return typeof ctor === \"function\" ? (ctor as WeakRefConstructorLike) : null;\n}\n\nfunction hasFinalizationRegistry(): boolean {\n return typeof (globalThis as { FinalizationRegistry?: unknown }).FinalizationRegistry === \"function\";\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n if (value == null) return false;\n if (typeof value !== \"object\" && typeof value !== \"function\") return false;\n return typeof (value as { then?: unknown }).then === \"function\";\n}\n\nfunction getCrossTabSyncMode(\n requestedStorage: StorageLike | undefined,\n activeStorage: StorageLike | undefined,\n): NonNullable<Mnemonic[\"crossTabSyncMode\"]> {\n const isExplicitNativeBrowserStorage =\n activeStorage !== undefined &&\n requestedStorage !== undefined &&\n getNativeBrowserStorages().includes(activeStorage);\n if ((requestedStorage === undefined && activeStorage !== undefined) || isExplicitNativeBrowserStorage) {\n return \"browser-storage-event\";\n }\n if (typeof activeStorage?.onExternalChange === \"function\") {\n return \"custom-external-change\";\n }\n return \"none\";\n}\n\nfunction getDevToolsWindow(): DevToolsGlobalWindow | undefined {\n return (globalThis as { window?: DevToolsGlobalWindow }).window;\n}\n\nfunction sanitizeDevToolsRoot(root: Record<string, unknown>): void {\n const reserved = new Set([\"providers\", \"resolve\", \"list\", \"capabilities\", \"__meta\"]);\n for (const key of Object.keys(root)) {\n if (reserved.has(key)) continue;\n const descriptor = Object.getOwnPropertyDescriptor(root, key);\n if (descriptor && !descriptor.configurable) continue;\n try {\n delete root[key];\n } catch {\n // Ignore hostile legacy properties so devtools init stays fail-safe.\n }\n }\n}\n\nfunction ensureDevToolsRoot(enableDevTools: boolean): DevToolsRegistryRoot | null {\n if (!enableDevTools) return null;\n\n const globalWindow = getDevToolsWindow();\n if (!globalWindow) return null;\n\n const weakRefSupported = weakRefConstructor() !== null;\n const finalizationRegistrySupported = hasFinalizationRegistry();\n const existing = globalWindow.__REACT_MNEMONIC_DEVTOOLS__;\n const root: Record<string, unknown> =\n existing && typeof existing === \"object\" ? (existing as Record<string, unknown>) : {};\n\n sanitizeDevToolsRoot(root);\n\n if (!root.providers || typeof root.providers !== \"object\") {\n root.providers = {};\n }\n\n if (!root.capabilities || typeof root.capabilities !== \"object\") {\n root.capabilities = {};\n }\n\n const capabilities = root.capabilities as DevToolsRegistryRoot[\"capabilities\"];\n capabilities.weakRef = weakRefSupported;\n capabilities.finalizationRegistry = finalizationRegistrySupported;\n\n if (!root.__meta || typeof root.__meta !== \"object\") {\n root.__meta = {\n version: 0,\n lastUpdated: Date.now(),\n lastChange: \"\",\n };\n }\n\n const meta = root.__meta as DevToolsRegistryRoot[\"__meta\"];\n if (typeof meta.version !== \"number\" || !Number.isFinite(meta.version)) {\n meta.version = 0;\n }\n if (typeof meta.lastUpdated !== \"number\" || !Number.isFinite(meta.lastUpdated)) {\n meta.lastUpdated = Date.now();\n }\n if (typeof meta.lastChange !== \"string\") {\n meta.lastChange = \"\";\n }\n\n const providers = root.providers as Record<string, DevToolsProviderEntry>;\n if (typeof root.resolve !== \"function\") {\n root.resolve = (namespace: string): DevToolsProviderApi | null => {\n const entry = providers[namespace];\n if (!entry || typeof entry.weakRef?.deref !== \"function\") return null;\n\n const live = entry.weakRef.deref();\n if (live) {\n entry.lastSeenAt = Date.now();\n entry.staleSince = null;\n return live;\n }\n\n entry.staleSince ??= Date.now();\n return null;\n };\n }\n\n if (typeof root.list !== \"function\") {\n root.list = (): DevToolsProviderDescriptor[] =>\n Object.entries(providers)\n .map(([namespace, entry]) => {\n const live = typeof entry.weakRef?.deref === \"function\" ? entry.weakRef.deref() : undefined;\n const available = Boolean(live);\n if (available) {\n entry.lastSeenAt = Date.now();\n entry.staleSince = null;\n } else {\n entry.staleSince ??= Date.now();\n }\n return {\n namespace,\n available,\n registeredAt: entry.registeredAt,\n lastSeenAt: entry.lastSeenAt,\n staleSince: entry.staleSince,\n };\n })\n .sort((left, right) => left.namespace.localeCompare(right.namespace));\n }\n\n globalWindow.__REACT_MNEMONIC_DEVTOOLS__ = root;\n return root as DevToolsRegistryRoot;\n}\n\nfunction bumpDevToolsVersion(root: DevToolsRegistryRoot | null, namespace: string, reason: string): void {\n if (!root) return;\n root.__meta.version += 1;\n root.__meta.lastUpdated = Date.now();\n root.__meta.lastChange = `${namespace}.${reason}`;\n}\n\nfunction decodeDevToolsValue(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\nfunction readStorageRaw(\n storage: StorageLike | undefined,\n storageKey: string,\n callbacks: StorageAccessCallbacks,\n): string | null {\n if (!storage) return null;\n\n try {\n const raw = storage.getItem(storageKey);\n if (isPromiseLike(raw)) {\n callbacks.onAsyncViolation(\"getItem\", raw);\n return null;\n }\n callbacks.onAccessSuccess();\n return raw;\n } catch (error) {\n callbacks.onAccessError(error);\n return null;\n }\n}\n\nfunction enumerateNamespaceKeys(\n storage: StorageLike | undefined,\n prefix: string,\n callbacks: Pick<StorageAccessCallbacks, \"onAccessError\" | \"onAccessSuccess\">,\n): string[] {\n if (!storage) {\n return [];\n }\n\n const keys: string[] = [];\n try {\n const storageLength = storage.length;\n const getStorageKey = storage.key;\n if (typeof storageLength !== \"number\" || typeof getStorageKey !== \"function\") {\n return [];\n }\n for (let index = 0; index < storageLength; index++) {\n const fullKey = getStorageKey.call(storage, index);\n if (!fullKey?.startsWith(prefix)) continue;\n keys.push(fullKey.slice(prefix.length));\n }\n callbacks.onAccessSuccess();\n } catch (error) {\n callbacks.onAccessError(error);\n }\n return keys;\n}\n\nfunction syncCacheEntryFromStorage({\n key,\n storageKey,\n storage,\n cache,\n emit,\n callbacks,\n}: {\n key: string;\n storageKey: string;\n storage: StorageLike | undefined;\n cache: Map<string, string | null>;\n emit: (key: string) => void;\n callbacks: StorageAccessCallbacks;\n}): boolean {\n const fresh = readStorageRaw(storage, storageKey, callbacks);\n const cached = cache.get(key) ?? null;\n if (fresh === cached) {\n return false;\n }\n cache.set(key, fresh);\n emit(key);\n return true;\n}\n\nfunction reloadNamedKeysFromStorage({\n changedKeys,\n prefix,\n storage,\n listeners,\n cache,\n emit,\n callbacks,\n}: {\n changedKeys: string[];\n prefix: string;\n storage: StorageLike | undefined;\n listeners: Map<string, Set<Listener>>;\n cache: Map<string, string | null>;\n emit: (key: string) => void;\n callbacks: StorageAccessCallbacks;\n}): boolean {\n let changed = false;\n\n for (const fullStorageKey of changedKeys) {\n if (!fullStorageKey.startsWith(prefix)) continue;\n const key = fullStorageKey.slice(prefix.length);\n const listenerSet = listeners.get(key);\n if (listenerSet && listenerSet.size > 0) {\n changed =\n syncCacheEntryFromStorage({\n key,\n storageKey: fullStorageKey,\n storage,\n cache,\n emit,\n callbacks,\n }) || changed;\n continue;\n }\n if (cache.has(key)) {\n cache.delete(key);\n }\n }\n\n return changed;\n}\n\nfunction reloadSubscribedKeysFromStorage({\n prefix,\n storage,\n listeners,\n cache,\n emit,\n callbacks,\n}: {\n prefix: string;\n storage: StorageLike | undefined;\n listeners: Map<string, Set<Listener>>;\n cache: Map<string, string | null>;\n emit: (key: string) => void;\n callbacks: StorageAccessCallbacks;\n}): boolean {\n let changed = false;\n\n for (const [key, listenerSet] of listeners) {\n if (listenerSet.size === 0) continue;\n changed =\n syncCacheEntryFromStorage({\n key,\n storageKey: `${prefix}${key}`,\n storage,\n cache,\n emit,\n callbacks,\n }) || changed;\n }\n\n for (const key of cache.keys()) {\n const listenerSet = listeners.get(key);\n if (listenerSet && listenerSet.size > 0) continue;\n cache.delete(key);\n }\n\n return changed;\n}\n\nfunction createDevToolsProviderApi({\n store,\n dump,\n keys,\n readThrough,\n writeRaw,\n removeRaw,\n}: {\n store: MnemonicInternal;\n dump: () => Record<string, string>;\n keys: () => string[];\n readThrough: (key: string) => string | null;\n writeRaw: (key: string, raw: string) => void;\n removeRaw: (key: string) => void;\n}): DevToolsProviderApi {\n return {\n getStore: () => store,\n dump: () => {\n const data = dump();\n console.table(\n Object.entries(data).map(([key, value]) => ({\n key,\n value,\n decoded: decodeDevToolsValue(value),\n })),\n );\n return data;\n },\n get: (key: string) => {\n const raw = readThrough(key);\n if (raw == null) return undefined;\n return decodeDevToolsValue(raw);\n },\n set: (key: string, value: unknown) => {\n writeRaw(key, JSON.stringify(value));\n },\n remove: (key: string) => removeRaw(key),\n clear: () => {\n for (const key of keys()) {\n removeRaw(key);\n }\n },\n keys,\n };\n}\n\nfunction createReloadFromStorage({\n storage,\n hasAsyncContractViolation,\n prefix,\n listeners,\n cache,\n emit,\n callbacks,\n devToolsRoot,\n namespace,\n}: {\n storage: StorageLike | undefined;\n hasAsyncContractViolation: () => boolean;\n prefix: string;\n listeners: Map<string, Set<Listener>>;\n cache: Map<string, string | null>;\n emit: (key: string) => void;\n callbacks: StorageAccessCallbacks;\n devToolsRoot: DevToolsRegistryRoot | null;\n namespace: string;\n}): (changedKeys?: string[]) => void {\n return (changedKeys?: string[]) => {\n if (!storage || hasAsyncContractViolation()) return;\n if (changedKeys?.length === 0) return;\n\n const isFullReload = changedKeys === undefined;\n const changed = isFullReload\n ? reloadSubscribedKeysFromStorage({\n prefix,\n storage,\n listeners,\n cache,\n emit,\n callbacks,\n })\n : reloadNamedKeysFromStorage({\n changedKeys,\n prefix,\n storage,\n listeners,\n cache,\n emit,\n callbacks,\n });\n\n if (changed) {\n bumpDevToolsVersion(devToolsRoot, namespace, isFullReload ? \"reload:full\" : \"reload:granular\");\n }\n };\n}\n\nfunction registerDevToolsProvider({\n devToolsRoot,\n namespace,\n store,\n dump,\n keys,\n readThrough,\n writeRaw,\n removeRaw,\n}: {\n devToolsRoot: DevToolsRegistryRoot;\n namespace: string;\n store: MnemonicInternalWithDevToolsHold;\n dump: () => Record<string, string>;\n keys: () => string[];\n readThrough: (key: string) => string | null;\n writeRaw: (key: string, raw: string) => void;\n removeRaw: (key: string) => void;\n}): void {\n let infoMessage = `[Mnemonic DevTools] Namespace \"${namespace}\" available via window.__REACT_MNEMONIC_DEVTOOLS__.resolve(\"${namespace}\")`;\n\n if (!devToolsRoot.capabilities.weakRef) {\n console.info(\n `[Mnemonic DevTools] WeakRef is not available; registry provider \"${namespace}\" was not registered.`,\n );\n return;\n }\n\n const existingLive = devToolsRoot.resolve(namespace);\n if (existingLive) {\n const duplicateMessage = `[Mnemonic DevTools] Duplicate provider namespace \"${namespace}\" detected. Each window must have at most one live MnemonicProvider per namespace.`;\n if (!isProductionRuntime()) {\n throw new Error(duplicateMessage);\n }\n console.warn(`${duplicateMessage} Keeping the first provider and ignoring the duplicate.`);\n console.info(\n `[Mnemonic DevTools] Namespace \"${namespace}\" already registered. Keeping existing provider reference.`,\n );\n return;\n }\n\n const providerApi = createDevToolsProviderApi({\n store,\n dump,\n keys,\n readThrough,\n writeRaw,\n removeRaw,\n });\n const WeakRefCtor = weakRefConstructor();\n if (!WeakRefCtor) {\n console.info(`[Mnemonic DevTools] WeakRef became unavailable while registering \"${namespace}\".`);\n return;\n }\n\n // Keep a strong reference for the mounted provider lifetime.\n // The global registry still only exposes a WeakRef, but this\n // prevents premature collection while the provider is active.\n store.__devToolsProviderApiHold = providerApi;\n\n const now = Date.now();\n devToolsRoot.providers[namespace] = {\n namespace,\n weakRef: new WeakRefCtor(providerApi),\n registeredAt: now,\n lastSeenAt: now,\n staleSince: null,\n };\n bumpDevToolsVersion(devToolsRoot, namespace, \"registry:namespace-registered\");\n console.info(infoMessage);\n}\n\n/**\n * React Context provider for namespace-isolated persistent state.\n *\n * Creates a scoped storage environment where all keys are automatically prefixed\n * with the namespace to prevent collisions. Implements an in-memory cache with\n * read-through behavior to the underlying storage backend (localStorage by default).\n *\n * This provider must wrap any components that use `useMnemonicKey`. Multiple\n * providers with different namespaces can coexist in the same application.\n *\n * @param props - Provider configuration and children\n * @param props.children - React children to render within the provider\n * @param props.namespace - Unique namespace for isolating storage keys\n * @param props.storage - Optional synchronous custom storage backend (defaults to localStorage)\n * @param props.enableDevTools - Enable DevTools debugging interface (defaults to false)\n * @param props.schemaMode - Schema enforcement mode (default: \"default\")\n * @param props.schemaRegistry - Optional schema registry for storing schemas and migrations\n * @param props.ssr - Optional SSR defaults for descendant hooks\n *\n * @example\n * ```tsx\n * // Basic usage with default settings\n * function App() {\n * return (\n * <MnemonicProvider namespace=\"myApp\">\n * <MyComponents />\n * </MnemonicProvider>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With a synchronous custom storage backend\n * function App() {\n * return (\n * <MnemonicProvider\n * namespace=\"myApp\"\n * storage={window.sessionStorage}\n * >\n * <MyComponents />\n * </MnemonicProvider>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With DevTools enabled (development only)\n * function App() {\n * return (\n * <MnemonicProvider\n * namespace=\"myApp\"\n * enableDevTools={process.env.NODE_ENV === 'development'}\n * >\n * <MyComponents />\n * </MnemonicProvider>\n * );\n * }\n *\n * // Then in browser console:\n * const dt = window.__REACT_MNEMONIC_DEVTOOLS__.resolve('myApp')\n * dt?.dump()\n * dt?.get('user')\n * dt?.set('theme', 'dark')\n * ```\n *\n * @example\n * ```tsx\n * // Multiple providers with different namespaces\n * function App() {\n * return (\n * <MnemonicProvider namespace=\"user-prefs\">\n * <UserSettings />\n * <MnemonicProvider namespace=\"app-state\">\n * <Dashboard />\n * </MnemonicProvider>\n * </MnemonicProvider>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Delay persisted storage reads until after client mount\n * function App() {\n * return (\n * <MnemonicProvider\n * namespace=\"myApp\"\n * ssr={{ hydration: \"client-only\" }}\n * >\n * <MyComponents />\n * </MnemonicProvider>\n * );\n * }\n * ```\n *\n * @remarks\n * - Creates a stable store instance that only recreates when namespace, storage, or enableDevTools change\n * - All storage operations are cached in memory for fast reads\n * - Storage failures are handled gracefully (logged but not thrown)\n * - `StorageLike` is intentionally synchronous for v1; async persistence must sit behind a sync facade\n * - In SSR environments, the provider is safe by default: hooks render\n * `defaultValue` unless configured with an explicit `ssr.serverValue`\n * - The store implements React's useSyncExternalStore contract for efficient updates\n *\n * @see {@link useMnemonicKey} - Hook for using persistent state\n * @see {@link MnemonicProviderOptions} - Configuration options\n */\nexport function MnemonicProvider({\n children,\n namespace,\n storage,\n enableDevTools = false,\n schemaMode = \"default\",\n schemaRegistry,\n ssr,\n}: MnemonicProviderProps) {\n if (schemaMode === \"strict\" && !schemaRegistry) {\n throw new Error(\"MnemonicProvider strict mode requires schemaRegistry\");\n }\n if (schemaMode === \"autoschema\" && typeof schemaRegistry?.registerSchema !== \"function\") {\n throw new Error(\"MnemonicProvider autoschema mode requires schemaRegistry.registerSchema\");\n }\n\n const store = useMemo<MnemonicInternal>(() => {\n const prefix = `${namespace}.`;\n const st = storage ?? defaultBrowserStorage();\n const ssrHydration = ssr?.hydration ?? \"immediate\";\n const devToolsRoot = ensureDevToolsRoot(enableDevTools);\n const canEnumerateKeys = detectEnumerableStorage(st);\n const crossTabSyncMode = getCrossTabSyncMode(storage, st);\n\n /**\n * In-memory cache of raw string values.\n * Maps unprefixed keys to their raw string values (or null if not present).\n * Provides fast reads without hitting storage on every access.\n */\n const cache = new Map<string, string | null>();\n\n /**\n * Per-key listener registry.\n * Maps unprefixed keys to sets of listener functions.\n * Used to notify React components when values change.\n */\n const listeners = new Map<string, Set<Listener>>();\n\n /** Whether a QuotaExceededError has already been logged since the last successful write. */\n let quotaErrorLogged = false;\n\n /** Whether a non-quota DOMException has already been logged since the last successful storage access. */\n let accessErrorLogged = false;\n\n /** Whether the storage backend has violated the synchronous StorageLike contract. */\n let asyncContractViolationDetected = false;\n const storageAccessCallbacks: StorageAccessCallbacks = {\n onAccessError: (err) => logAccessError(err),\n onAccessSuccess: () => {\n accessErrorLogged = false;\n },\n onAsyncViolation: (method, thenable) => handleAsyncStorageContractViolation(method, thenable),\n };\n\n /**\n * Converts an unprefixed key to a fully-qualified storage key.\n *\n * @param key - Unprefixed key\n * @returns Prefixed key with namespace\n */\n const fullKey = (key: string) => prefix + key;\n\n /**\n * Notifies all listeners subscribed to a specific key.\n * Called after mutations (set/remove) to trigger React re-renders.\n *\n * @param key - Unprefixed key that changed\n */\n const emit = (key: string) => {\n const set = listeners.get(key);\n if (!set) return;\n for (const fn of set) fn();\n };\n\n /**\n * Logs a storage-access DOMException once, squelching repeats until\n * a successful storage operation resets the flag. Ignores\n * QuotaExceededError (handled separately in writeRaw) and silently\n * swallows all non-DOMException errors.\n */\n const logAccessError = (err: unknown): void => {\n if (!accessErrorLogged && err instanceof DOMException && err.name !== \"QuotaExceededError\") {\n console.error(\n `[Mnemonic] Storage access error (${err.name}): ${err.message}. ` +\n \"Data is cached in memory but may not persist.\",\n );\n accessErrorLogged = true;\n }\n };\n\n /**\n * Marks the storage backend as incompatible with the synchronous\n * StorageLike contract, consumes the offending thenable to avoid\n * unhandled rejections, and logs the problem once.\n */\n const handleAsyncStorageContractViolation = (\n method: \"getItem\" | \"setItem\" | \"removeItem\",\n thenable: PromiseLike<unknown>,\n ): void => {\n asyncContractViolationDetected = true;\n void Promise.resolve(thenable).catch(() => undefined);\n if (accessErrorLogged) return;\n console.error(\n `[Mnemonic] StorageLike.${method} returned a Promise. ` +\n \"StorageLike must remain synchronous for react-mnemonic v1. \" +\n \"Wrap async persistence behind a synchronous cache facade instead.\",\n );\n accessErrorLogged = true;\n };\n\n /**\n * Read-through cache accessor.\n * Returns cached value if available, otherwise reads from storage and caches.\n *\n * @param key - Unprefixed key to read\n * @returns Raw string value, or null if not present\n */\n const readThrough = (key: string): string | null => {\n if (cache.has(key)) return cache.get(key) ?? null;\n if (!st || asyncContractViolationDetected) {\n cache.set(key, null);\n return null;\n }\n const raw = readStorageRaw(st, fullKey(key), storageAccessCallbacks);\n cache.set(key, raw);\n return raw;\n };\n\n /**\n * Writes a raw string value to both cache and storage.\n * Notifies listeners after the write completes.\n *\n * @param key - Unprefixed key to write\n * @param raw - Raw string value to store\n */\n const writeRaw = (key: string, raw: string) => {\n cache.set(key, raw);\n if (st && !asyncContractViolationDetected) {\n try {\n const result = st.setItem(fullKey(key), raw);\n if (isPromiseLike(result)) {\n handleAsyncStorageContractViolation(\"setItem\", result);\n } else {\n quotaErrorLogged = false;\n accessErrorLogged = false;\n }\n } catch (err) {\n if (!quotaErrorLogged && err instanceof DOMException && err.name === \"QuotaExceededError\") {\n console.error(\n `[Mnemonic] Storage quota exceeded writing key \"${key}\". ` +\n \"Data is cached in memory but will not persist.\",\n );\n quotaErrorLogged = true;\n }\n logAccessError(err);\n }\n }\n emit(key);\n bumpDevToolsVersion(devToolsRoot, namespace, `set:${key}`);\n };\n\n /**\n * Removes a key from both cache and storage.\n * Notifies listeners after the removal completes.\n *\n * @param key - Unprefixed key to remove\n */\n const removeRaw = (key: string) => {\n cache.set(key, null);\n if (st && !asyncContractViolationDetected) {\n try {\n const result = st.removeItem(fullKey(key));\n if (isPromiseLike(result)) {\n handleAsyncStorageContractViolation(\"removeItem\", result);\n } else {\n accessErrorLogged = false;\n }\n } catch (err) {\n logAccessError(err);\n }\n }\n emit(key);\n bumpDevToolsVersion(devToolsRoot, namespace, `remove:${key}`);\n };\n\n /**\n * Subscribes a listener to changes for a specific key.\n * Implements the React external store subscription contract.\n *\n * @param key - Unprefixed key to subscribe to\n * @param listener - Callback invoked when the value changes\n * @returns Unsubscribe function\n */\n const subscribeRaw = (key: string, listener: Listener): Unsubscribe => {\n let set = listeners.get(key);\n if (!set) {\n set = new Set();\n listeners.set(key, set);\n }\n set.add(listener);\n\n // Ensure cache is primed so snapshots are stable.\n readThrough(key);\n\n return () => {\n const s = listeners.get(key);\n if (!s) return;\n s.delete(listener);\n if (s.size === 0) listeners.delete(key);\n };\n };\n\n /**\n * Gets the current snapshot of a key's raw value.\n * Implements the React external store snapshot contract.\n *\n * @param key - Unprefixed key to read\n * @returns Raw string value, or null if not present\n */\n const getRawSnapshot = (key: string) => readThrough(key);\n\n /**\n * Enumerates all keys in this namespace.\n * Iterates through storage and filters keys by namespace prefix.\n *\n * @returns Array of unprefixed key names\n */\n const keys = () => {\n if (asyncContractViolationDetected) {\n return Array.from(cache.entries())\n .filter(([, value]) => value != null)\n .map(([key]) => key);\n }\n if (!canEnumerateKeys) return [];\n return enumerateNamespaceKeys(st, prefix, storageAccessCallbacks);\n };\n\n /**\n * Dumps all key-value pairs in this namespace.\n * Useful for debugging and DevTools integration.\n *\n * @returns Object mapping unprefixed keys to raw string values\n */\n const dump = () => {\n const out: Record<string, string> = {};\n for (const k of keys()) {\n const raw = readThrough(k);\n if (raw != null) out[k] = raw;\n }\n return out;\n };\n\n /**\n * Re-reads keys from the underlying storage, updating the cache and\n * emitting change notifications for any keys whose values differ.\n *\n * @param changedKeys - Optional array of fully-qualified storage keys\n * that changed. When undefined, performs a blanket reload of all\n * actively subscribed keys. When an empty array, does nothing.\n *\n * Called by the onExternalChange subscription when the storage adapter\n * signals that data has changed externally (e.g., from another tab).\n */\n const reloadFromStorage = createReloadFromStorage({\n storage: st,\n hasAsyncContractViolation: () => asyncContractViolationDetected,\n prefix,\n listeners,\n cache,\n emit,\n callbacks: storageAccessCallbacks,\n devToolsRoot,\n namespace,\n });\n\n /**\n * The Mnemonic store API object.\n * Implements the contract expected by useSyncExternalStore.\n */\n const store: MnemonicInternalWithDevToolsHold = {\n prefix,\n canEnumerateKeys,\n subscribeRaw,\n getRawSnapshot,\n setRaw: writeRaw,\n removeRaw,\n keys,\n dump,\n reloadFromStorage,\n schemaMode,\n ssrHydration,\n crossTabSyncMode,\n ...(schemaRegistry ? { schemaRegistry } : {}),\n };\n\n /**\n * DevTools integration.\n * Exposes a weak-provider registry on the window object when enabled.\n */\n if (devToolsRoot) {\n registerDevToolsProvider({\n devToolsRoot,\n namespace,\n store,\n dump,\n keys,\n readThrough,\n writeRaw,\n removeRaw,\n });\n }\n\n return store;\n }, [namespace, storage, enableDevTools, schemaMode, schemaRegistry, ssr?.hydration]);\n\n const optionalBridge = useMemo(\n () =>\n createMnemonicOptionalBridge({\n api: store,\n ...(schemaRegistry ? { schemaRegistry } : {}),\n }),\n [schemaRegistry, store],\n );\n\n // Subscribe to external storage changes (e.g., cross-tab BroadcastChannel)\n useEffect(() => {\n if (!storage?.onExternalChange) return;\n return storage.onExternalChange((changedKeys) => store.reloadFromStorage(changedKeys));\n }, [storage, store]);\n\n return (\n <MnemonicContext.Provider value={store}>\n <MnemonicOptionalBridgeProvider bridge={optionalBridge}>{children}</MnemonicOptionalBridgeProvider>\n </MnemonicContext.Provider>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\n/**\n * @fileoverview React hook for type-safe, persistent state management.\n *\n * This module exports the `useMnemonicKey` hook, which provides a React-friendly\n * API for reading and writing persistent state with automatic synchronization,\n * encoding/decoding, and JSON Schema validation.\n */\n\nimport { useMemo, useCallback } from \"react\";\nimport { CodecError } from \"./codecs\";\nimport { useMnemonic } from \"./provider\";\nimport { SchemaError, type MnemonicEnvelope } from \"./schema\";\nimport { inferJsonSchema, validateJsonSchema } from \"./json-schema\";\nimport {\n resolveMnemonicKeyArgs,\n serializeEnvelope,\n useApplyReconcile,\n useMnemonicKeySharedFromApi,\n useMnemonicKeyState,\n} from \"./use-shared\";\nimport type { JsonSchema } from \"./json-schema\";\nimport type {\n KeySchema,\n MigrationPath,\n Mnemonic,\n MnemonicKeyDescriptor,\n MnemonicKeyState,\n UseMnemonicKeyOptions,\n} from \"./types\";\n\ntype SchemaReadExtra = {\n pendingSchema?: KeySchema;\n};\n\nexport function useSchemaMnemonicKeyFromApi<T>(\n store: Mnemonic,\n descriptor: MnemonicKeyDescriptor<T, string>,\n active = true,\n): MnemonicKeyState<T> {\n const shared = useMnemonicKeySharedFromApi(store, descriptor, undefined, descriptor.options.schema?.version);\n const { api, key, codec, codecOpt, schema, reconcile, parseEnvelope, decodeStringPayload, buildFallbackResult } =\n shared;\n const schemaMode = api.schemaMode;\n const schemaRegistry = api.schemaRegistry;\n\n const validateAgainstSchema = useCallback(\n (value: unknown, jsonSchema: JsonSchema): void => {\n const errors = validateJsonSchema(value, jsonSchema);\n if (errors.length > 0) {\n const message = errors.map((e) => `${e.path || \"/\"}: ${e.message}`).join(\"; \");\n throw new SchemaError(\"TYPE_MISMATCH\", `Schema validation failed for key \"${key}\": ${message}`);\n }\n },\n [key],\n );\n\n const registryCache = useMemo(() => {\n if (!schemaRegistry || schemaMode === \"autoschema\") return null;\n return {\n latestSchema: undefined as KeySchema | undefined,\n latestSchemaSet: false,\n schemaByVersion: new Map<number, KeySchema | undefined>(),\n migrationPaths: new Map<string, MigrationPath | null>(),\n };\n }, [schemaRegistry, schemaMode, key]);\n\n const getSchemaForVersion = useCallback(\n (version: number): KeySchema | undefined => {\n if (!schemaRegistry) return undefined;\n if (!registryCache) return schemaRegistry.getSchema(key, version);\n if (registryCache.schemaByVersion.has(version)) {\n return registryCache.schemaByVersion.get(version);\n }\n const nextSchema = schemaRegistry.getSchema(key, version);\n registryCache.schemaByVersion.set(version, nextSchema);\n return nextSchema;\n },\n [schemaRegistry, registryCache, key],\n );\n\n const getLatestSchemaForKey = useCallback((): KeySchema | undefined => {\n if (!schemaRegistry) return undefined;\n if (!registryCache) return schemaRegistry.getLatestSchema(key);\n if (registryCache.latestSchemaSet) return registryCache.latestSchema;\n const nextSchema = schemaRegistry.getLatestSchema(key);\n registryCache.latestSchema = nextSchema;\n registryCache.latestSchemaSet = true;\n return nextSchema;\n }, [schemaRegistry, registryCache, key]);\n\n const getMigrationPathForKey = useCallback(\n (fromVersion: number, toVersion: number): MigrationPath | null => {\n if (!schemaRegistry) return null;\n if (!registryCache) return schemaRegistry.getMigrationPath(key, fromVersion, toVersion) ?? null;\n const cacheKey = `${fromVersion}->${toVersion}`;\n if (registryCache.migrationPaths.has(cacheKey)) {\n return registryCache.migrationPaths.get(cacheKey) ?? null;\n }\n const path = schemaRegistry.getMigrationPath(key, fromVersion, toVersion) ?? null;\n registryCache.migrationPaths.set(cacheKey, path);\n return path;\n },\n [schemaRegistry, registryCache, key],\n );\n\n const buildSchemaManagedResult = useCallback((version: number, value: unknown): string => {\n return serializeEnvelope(version, value);\n }, []);\n\n const applyReconcile = useApplyReconcile<T, SchemaReadExtra>({\n key,\n reconcile,\n buildFallbackResult,\n });\n\n const resolveTargetWriteSchema = useCallback((): KeySchema | undefined => {\n const explicitVersion = schema?.version;\n const latestSchema = getLatestSchemaForKey();\n if (explicitVersion === undefined) return latestSchema;\n\n const explicitSchema = getSchemaForVersion(explicitVersion);\n if (explicitSchema) return explicitSchema;\n\n return schemaMode === \"strict\" ? undefined : latestSchema;\n }, [getLatestSchemaForKey, getSchemaForVersion, schema?.version, schemaMode]);\n\n const encodeForWrite = useCallback(\n (nextValue: T): string => {\n const explicitVersion = schema?.version;\n const targetSchema = resolveTargetWriteSchema();\n\n if (!targetSchema) {\n if (explicitVersion !== undefined && schemaMode === \"strict\") {\n throw new SchemaError(\n \"WRITE_SCHEMA_REQUIRED\",\n `Write requires schema for key \"${key}\" in strict mode`,\n );\n }\n return serializeEnvelope(0, codec.encode(nextValue));\n }\n\n let valueToStore: unknown = nextValue;\n const writeMigration = schemaRegistry?.getWriteMigration?.(key, targetSchema.version);\n if (writeMigration) {\n try {\n valueToStore = writeMigration.migrate(valueToStore);\n } catch (err) {\n throw err instanceof SchemaError\n ? err\n : new SchemaError(\"MIGRATION_FAILED\", `Write-time migration failed for key \"${key}\"`, err);\n }\n }\n\n validateAgainstSchema(valueToStore, targetSchema.schema);\n return buildSchemaManagedResult(targetSchema.version, valueToStore);\n },\n [\n schema?.version,\n key,\n schemaMode,\n codec,\n schemaRegistry,\n validateAgainstSchema,\n resolveTargetWriteSchema,\n buildSchemaManagedResult,\n ],\n );\n\n const decodeAutoschemaEnvelope = useCallback(\n (envelope: MnemonicEnvelope, latestSchema: KeySchema | undefined) => {\n if (latestSchema) {\n return buildFallbackResult(\n new SchemaError(\"SCHEMA_NOT_FOUND\", `No schema for key \"${key}\" v${envelope.version}`),\n );\n }\n if (!schemaRegistry || typeof schemaRegistry.registerSchema !== \"function\") {\n return buildFallbackResult(\n new SchemaError(\n \"MODE_CONFIGURATION_INVALID\",\n `Autoschema mode requires schema registry registration for key \"${key}\"`,\n ),\n );\n }\n try {\n const decoded =\n typeof envelope.payload === \"string\"\n ? decodeStringPayload<T>(envelope.payload, codec)\n : (envelope.payload as T);\n const inferSchemaForValue = (value: T): KeySchema => ({\n key,\n version: 1,\n schema: inferJsonSchema(value),\n });\n const inferred = inferSchemaForValue(decoded);\n return applyReconcile({\n value: decoded,\n extra: { pendingSchema: inferred },\n rewriteRaw: buildSchemaManagedResult(inferred.version, decoded),\n persistedVersion: envelope.version,\n serializeForPersist: (value) => buildSchemaManagedResult(inferred.version, value),\n deriveExtra: (value) => ({\n pendingSchema: inferSchemaForValue(value),\n }),\n });\n } catch (err) {\n const typedErr =\n err instanceof SchemaError || err instanceof CodecError\n ? err\n : new SchemaError(\"TYPE_MISMATCH\", `Autoschema inference failed for key \"${key}\"`, err);\n return buildFallbackResult(typedErr);\n }\n },\n [\n applyReconcile,\n buildFallbackResult,\n buildSchemaManagedResult,\n codec,\n decodeStringPayload,\n key,\n schemaRegistry,\n ],\n );\n\n const decodeCodecManagedEnvelope = useCallback(\n (envelope: MnemonicEnvelope, latestSchema: KeySchema | undefined) => {\n if (typeof envelope.payload !== \"string\") {\n return applyReconcile({\n value: envelope.payload as T,\n persistedVersion: envelope.version,\n ...(latestSchema ? { latestVersion: latestSchema.version } : {}),\n serializeForPersist: encodeForWrite,\n });\n }\n try {\n const decoded = decodeStringPayload<T>(envelope.payload, codec);\n return applyReconcile({\n value: decoded,\n persistedVersion: envelope.version,\n ...(latestSchema ? { latestVersion: latestSchema.version } : {}),\n serializeForPersist: encodeForWrite,\n });\n } catch (err) {\n return buildFallbackResult(err as CodecError | SchemaError);\n }\n },\n [applyReconcile, buildFallbackResult, codec, decodeStringPayload, encodeForWrite],\n );\n\n const decodeSchemaManagedEnvelope = useCallback(\n (envelope: MnemonicEnvelope, schemaForVersion: KeySchema, latestSchema: KeySchema | undefined) => {\n let current: unknown;\n try {\n current = envelope.payload;\n validateAgainstSchema(current, schemaForVersion.schema);\n } catch (err) {\n const typedErr =\n err instanceof SchemaError || err instanceof CodecError\n ? err\n : new SchemaError(\"TYPE_MISMATCH\", `Schema decode failed for key \"${key}\"`, err);\n return buildFallbackResult(typedErr);\n }\n\n if (!latestSchema || envelope.version >= latestSchema.version) {\n return applyReconcile({\n value: current as T,\n persistedVersion: envelope.version,\n ...(latestSchema ? { latestVersion: latestSchema.version } : {}),\n serializeForPersist: encodeForWrite,\n });\n }\n\n const path = getMigrationPathForKey(envelope.version, latestSchema.version);\n if (!path) {\n return buildFallbackResult(\n new SchemaError(\n \"MIGRATION_PATH_NOT_FOUND\",\n `No migration path for key \"${key}\" from v${envelope.version} to v${latestSchema.version}`,\n ),\n );\n }\n\n try {\n let migrated = current;\n for (const step of path) {\n migrated = step.migrate(migrated);\n }\n validateAgainstSchema(migrated, latestSchema.schema);\n return applyReconcile({\n value: migrated as T,\n rewriteRaw: buildSchemaManagedResult(latestSchema.version, migrated),\n persistedVersion: envelope.version,\n latestVersion: latestSchema.version,\n serializeForPersist: encodeForWrite,\n });\n } catch (err) {\n const typedErr =\n err instanceof SchemaError || err instanceof CodecError\n ? err\n : new SchemaError(\"MIGRATION_FAILED\", `Migration failed for key \"${key}\"`, err);\n return buildFallbackResult(typedErr);\n }\n },\n [\n applyReconcile,\n buildFallbackResult,\n buildSchemaManagedResult,\n encodeForWrite,\n getMigrationPathForKey,\n key,\n validateAgainstSchema,\n ],\n );\n\n const decodeForRead = useCallback(\n (rawText: string | null) => {\n if (rawText == null) return buildFallbackResult();\n\n const parsed = parseEnvelope(rawText);\n if (!parsed.ok) return buildFallbackResult(parsed.error);\n const envelope = parsed.envelope;\n\n const schemaForVersion = getSchemaForVersion(envelope.version);\n const latestSchema = getLatestSchemaForKey();\n\n if (schemaMode === \"strict\" && !schemaForVersion) {\n return buildFallbackResult(\n new SchemaError(\"SCHEMA_NOT_FOUND\", `No schema for key \"${key}\" v${envelope.version}`),\n );\n }\n\n if (schemaMode === \"autoschema\" && !schemaForVersion) {\n return decodeAutoschemaEnvelope(envelope, latestSchema);\n }\n\n if (!schemaForVersion) {\n return decodeCodecManagedEnvelope(envelope, latestSchema);\n }\n\n return decodeSchemaManagedEnvelope(envelope, schemaForVersion, latestSchema);\n },\n [\n buildFallbackResult,\n decodeAutoschemaEnvelope,\n decodeCodecManagedEnvelope,\n decodeSchemaManagedEnvelope,\n parseEnvelope,\n schemaMode,\n getSchemaForVersion,\n getLatestSchemaForKey,\n key,\n ],\n );\n\n const additionalDevWarnings = useCallback(\n ({ warnOnce }: { warnOnce: (id: string, message: string) => void }) => {\n if (!codecOpt || schema?.version === undefined || !api.schemaRegistry) return;\n warnOnce(\n `codec+schema:${key}`,\n `[Mnemonic] useMnemonicKey(\"${key}\") received both a custom codec and schema.version. Schema-managed reads/writes do not use the codec path. Remove the codec for schema-managed storage, or remove schema.version if you intended codec-only persistence.`,\n );\n },\n [api.schemaRegistry, codecOpt, key, schema?.version],\n );\n\n const onDecodedEffect = useCallback(\n (decoded: { pendingSchema?: KeySchema }) => {\n if (!decoded.pendingSchema || !schemaRegistry?.registerSchema) return;\n if (schemaRegistry.getSchema(decoded.pendingSchema.key, decoded.pendingSchema.version)) return;\n try {\n schemaRegistry.registerSchema(decoded.pendingSchema);\n } catch {\n // Ignore registration races; write/read paths will enforce schema validity.\n }\n },\n [schemaRegistry],\n );\n\n return useMnemonicKeyState(shared, {\n active,\n decodeForRead,\n encodeForWrite,\n additionalDevWarnings,\n onDecodedEffect,\n });\n}\n\nfunction useSchemaMnemonicKey<T>(descriptor: MnemonicKeyDescriptor<T, string>): MnemonicKeyState<T> {\n return useSchemaMnemonicKeyFromApi(useMnemonic(), descriptor);\n}\n\n/**\n * React hook for persistent, type-safe state management.\n */\nexport function useMnemonicKey<T, K extends string>(descriptor: MnemonicKeyDescriptor<T, K>): MnemonicKeyState<T>;\nexport function useMnemonicKey<T>(key: string, options: UseMnemonicKeyOptions<T>): MnemonicKeyState<T>;\nexport function useMnemonicKey<T>(\n keyOrDescriptor: string | MnemonicKeyDescriptor<T, string>,\n options?: UseMnemonicKeyOptions<T>,\n): MnemonicKeyState<T> {\n return useSchemaMnemonicKey(resolveMnemonicKeyArgs(keyOrDescriptor, options));\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { useCallback, useMemo } from \"react\";\nimport { useMnemonic } from \"./provider\";\nimport { getRuntimeNodeEnv } from \"./runtime\";\nimport type {\n Mnemonic,\n MnemonicRecoveryAction,\n MnemonicRecoveryEvent,\n MnemonicRecoveryHook,\n UseMnemonicRecoveryOptions,\n} from \"./types\";\n\nfunction uniqueKeys(keys: readonly string[]): string[] {\n return [...new Set(keys)];\n}\n\nfunction isDevelopmentRuntime(): boolean {\n return getRuntimeNodeEnv() === \"development\";\n}\n\nconst recoveryDiagnosticWarnings = new WeakMap<object, Set<string>>();\n\nfunction warnRecoveryOnce(api: object, id: string, message: string): void {\n let warnings = recoveryDiagnosticWarnings.get(api);\n if (!warnings) {\n warnings = new Set<string>();\n recoveryDiagnosticWarnings.set(api, warnings);\n }\n if (warnings.has(id)) return;\n warnings.add(id);\n console.warn(message);\n}\n\n/**\n * Hook for namespace-scoped recovery actions such as hard reset and selective clear.\n *\n * Applications can use this to offer self-service recovery UX for corrupt or\n * legacy persisted state. The hook operates on the current provider namespace.\n *\n * See the\n * [Reset and Recovery guide](https://thirtytwobits.github.io/react-mnemonic/docs/guides/reset-and-recovery)\n * for soft-reset and hard-reset patterns.\n *\n * @param options - Optional recovery callback for telemetry/auditing\n * @returns Namespace recovery helpers\n *\n * @throws {Error} If used outside of a MnemonicProvider\n */\nexport function useMnemonicRecovery(options: UseMnemonicRecoveryOptions = {}): MnemonicRecoveryHook {\n return useMnemonicRecoveryFromApi(useMnemonic(), options);\n}\n\nexport function useMnemonicRecoveryFromApi(\n api: Mnemonic,\n options: UseMnemonicRecoveryOptions = {},\n active = true,\n): MnemonicRecoveryHook {\n const { onRecover } = options;\n\n const namespace = useMemo(() => {\n if (!active) return \"\";\n return api.prefix.endsWith(\".\") ? api.prefix.slice(0, -1) : api.prefix;\n }, [active, api.prefix]);\n\n const emitRecovery = useCallback(\n (action: MnemonicRecoveryAction, clearedKeys: string[]) => {\n if (!active) return;\n const event: MnemonicRecoveryEvent = {\n action,\n namespace,\n clearedKeys,\n };\n onRecover?.(event);\n },\n [active, namespace, onRecover],\n );\n\n const listKeys = useCallback(() => (active ? api.keys() : []), [active, api]);\n\n const clearResolvedKeys = useCallback(\n (action: MnemonicRecoveryAction, keys: readonly string[]) => {\n if (!active) return [];\n const clearedKeys = uniqueKeys(keys);\n for (const key of clearedKeys) {\n api.removeRaw(key);\n }\n emitRecovery(action, clearedKeys);\n return clearedKeys;\n },\n [active, api, emitRecovery],\n );\n\n const clearKeys = useCallback(\n (keys: readonly string[]) => clearResolvedKeys(\"clear-keys\", keys),\n [clearResolvedKeys],\n );\n\n const clearAll = useCallback(() => {\n if (!active) return [];\n if (!api.canEnumerateKeys) {\n if (isDevelopmentRuntime()) {\n warnRecoveryOnce(\n api,\n \"recovery-clear-all-non-enumerable\",\n `[Mnemonic] clearAll() requires an enumerable storage backend in namespace \"${namespace}\". Use clearKeys([...]) with an explicit durable-key list, or supply a storage backend that implements length and key(index).`,\n );\n }\n throw new Error(\n \"clearAll requires an enumerable storage backend. Use clearKeys([...]) with an explicit key list instead.\",\n );\n }\n return clearResolvedKeys(\"clear-all\", api.keys());\n }, [active, api, clearResolvedKeys, namespace]);\n\n const clearMatching = useCallback(\n (predicate: (key: string) => boolean) => {\n if (!active) return [];\n if (!api.canEnumerateKeys) {\n if (isDevelopmentRuntime()) {\n warnRecoveryOnce(\n api,\n \"recovery-clear-matching-non-enumerable\",\n `[Mnemonic] clearMatching() requires an enumerable storage backend in namespace \"${namespace}\". Use clearKeys([...]) with an explicit durable-key list, or supply a storage backend that implements length and key(index).`,\n );\n }\n throw new Error(\n \"clearMatching requires an enumerable storage backend. Use clearKeys([...]) with an explicit key list instead.\",\n );\n }\n return clearResolvedKeys(\n \"clear-matching\",\n api.keys().filter((key) => predicate(key)),\n );\n },\n [active, api, clearResolvedKeys, namespace],\n );\n\n return useMemo(\n () => ({\n namespace,\n canEnumerateKeys: active ? api.canEnumerateKeys : false,\n listKeys,\n clearAll,\n clearKeys,\n clearMatching,\n }),\n [namespace, active, api.canEnumerateKeys, listKeys, clearAll, clearKeys, clearMatching],\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport type { JsonSchema } from \"./json-schema\";\nimport type { KeySchema, MnemonicKeyDescriptor, SchemaBoundKeyOptions, UseMnemonicKeyOptions } from \"./types\";\n\n/**\n * Define a reusable, importable contract for a persisted key.\n *\n * This packages the storage key and the canonical `useMnemonicKey(...)`\n * options into a single object that can be shared across components, docs,\n * and generated code.\n *\n * @template K - The literal storage key name\n * @template T - The decoded value type for the key\n *\n * @param key - The unprefixed storage key\n * @param options - Canonical hook options for the key\n * @returns A descriptor that can be passed directly to `useMnemonicKey(...)`\n *\n * @example\n * ```typescript\n * const themeKey = defineMnemonicKey(\"theme\", {\n * defaultValue: \"light\" as \"light\" | \"dark\",\n * listenCrossTab: true,\n * });\n *\n * const { value, set } = useMnemonicKey(themeKey);\n * ```\n */\nexport function defineMnemonicKey<const K extends string, T>(\n key: K,\n options: UseMnemonicKeyOptions<T>,\n): MnemonicKeyDescriptor<T, K>;\nexport function defineMnemonicKey<const K extends string, TSchema extends KeySchema<unknown, K, JsonSchema>>(\n keySchema: TSchema,\n options: SchemaBoundKeyOptions<TSchema extends KeySchema<infer TValue, string, JsonSchema> ? TValue : never>,\n): MnemonicKeyDescriptor<TSchema extends KeySchema<infer TValue, string, JsonSchema> ? TValue : never, TSchema[\"key\"]>;\nexport function defineMnemonicKey(\n keyOrSchema: string | KeySchema<unknown, string, JsonSchema>,\n options: UseMnemonicKeyOptions<unknown> | SchemaBoundKeyOptions<unknown>,\n): MnemonicKeyDescriptor<unknown, string> {\n if (typeof keyOrSchema !== \"string\") {\n return Object.freeze({\n key: keyOrSchema.key,\n options: {\n ...options,\n schema: { version: keyOrSchema.version },\n },\n });\n }\n\n return Object.freeze({\n key: keyOrSchema,\n options,\n });\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { SchemaError } from \"./schema\";\nimport type { CreateSchemaRegistryOptions, KeySchema, MigrationRule, MigrationPath, SchemaRegistry } from \"./types\";\n\nfunction schemaVersionKey(key: string, version: number): string {\n return `${key}:${version}`;\n}\n\nfunction migrationVersionKey(key: string, fromVersion: number): string {\n return `${key}:${fromVersion}`;\n}\n\nfunction validateVersion(value: number, label: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new SchemaError(\"MIGRATION_GRAPH_INVALID\", `${label} must be a non-negative integer`);\n }\n}\n\n/**\n * Create an immutable schema registry for common default/strict-mode setups.\n *\n * The helper indexes schemas and migrations up front, validates duplicate and\n * ambiguous definitions, and returns a {@link SchemaRegistry} ready to pass to\n * `MnemonicProvider`.\n *\n * Most applications should prefer this helper over manually implementing\n * {@link SchemaRegistry}.\n *\n * See the\n * [Schema Migration guide](https://thirtytwobits.github.io/react-mnemonic/docs/guides/schema-migration)\n * for end-to-end registry and migration patterns.\n *\n * @param options - Initial schema and migration definitions\n * @returns An indexed immutable schema registry\n *\n * @throws {SchemaError} With `SCHEMA_REGISTRATION_CONFLICT` for duplicate\n * schemas, or `MIGRATION_GRAPH_INVALID` for invalid migration graphs\n */\nexport function createSchemaRegistry(options: CreateSchemaRegistryOptions = {}): SchemaRegistry {\n const { schemas = [], migrations = [] } = options;\n\n const schemasByKeyAndVersion = new Map<string, KeySchema>();\n const latestSchemaByKey = new Map<string, KeySchema>();\n const writeMigrationsByKeyAndVersion = new Map<string, MigrationRule>();\n const migrationsByKeyAndFromVersion = new Map<string, MigrationRule>();\n\n for (const schema of schemas) {\n validateVersion(schema.version, `Schema version for key \"${schema.key}\"`);\n\n const id = schemaVersionKey(schema.key, schema.version);\n if (schemasByKeyAndVersion.has(id)) {\n throw new SchemaError(\n \"SCHEMA_REGISTRATION_CONFLICT\",\n `Duplicate schema registered for key \"${schema.key}\" version ${schema.version}`,\n );\n }\n\n schemasByKeyAndVersion.set(id, schema);\n\n const currentLatest = latestSchemaByKey.get(schema.key);\n if (!currentLatest || schema.version > currentLatest.version) {\n latestSchemaByKey.set(schema.key, schema);\n }\n }\n\n for (const migration of migrations) {\n validateVersion(migration.fromVersion, `Migration fromVersion for key \"${migration.key}\"`);\n validateVersion(migration.toVersion, `Migration toVersion for key \"${migration.key}\"`);\n\n if (migration.toVersion < migration.fromVersion) {\n throw new SchemaError(\n \"MIGRATION_GRAPH_INVALID\",\n `Backward migration \"${migration.key}\" ${migration.fromVersion} -> ${migration.toVersion} is not supported`,\n );\n }\n\n if (migration.fromVersion === migration.toVersion) {\n const id = schemaVersionKey(migration.key, migration.fromVersion);\n if (writeMigrationsByKeyAndVersion.has(id)) {\n throw new SchemaError(\n \"MIGRATION_GRAPH_INVALID\",\n `Duplicate write migration registered for key \"${migration.key}\" version ${migration.fromVersion}`,\n );\n }\n writeMigrationsByKeyAndVersion.set(id, migration);\n continue;\n }\n\n const edgeKey = migrationVersionKey(migration.key, migration.fromVersion);\n if (migrationsByKeyAndFromVersion.has(edgeKey)) {\n const existing = migrationsByKeyAndFromVersion.get(edgeKey)!;\n throw new SchemaError(\n \"MIGRATION_GRAPH_INVALID\",\n `Ambiguous migration graph for key \"${migration.key}\" at version ${migration.fromVersion}: ` +\n `${existing.fromVersion} -> ${existing.toVersion} conflicts with ` +\n `${migration.fromVersion} -> ${migration.toVersion}`,\n );\n }\n\n migrationsByKeyAndFromVersion.set(edgeKey, migration);\n }\n return {\n getSchema(key, version) {\n return schemasByKeyAndVersion.get(schemaVersionKey(key, version));\n },\n getLatestSchema(key) {\n return latestSchemaByKey.get(key);\n },\n getMigrationPath(key, fromVersion, toVersion): MigrationPath | null {\n if (fromVersion === toVersion) return [];\n if (toVersion < fromVersion) return null;\n\n const path: MigrationRule[] = [];\n let currentVersion = fromVersion;\n\n while (currentVersion < toVersion) {\n const next = migrationsByKeyAndFromVersion.get(migrationVersionKey(key, currentVersion));\n if (!next) return null;\n\n path.push(next);\n currentVersion = next.toVersion;\n }\n\n return currentVersion === toVersion ? path : null;\n },\n getWriteMigration(key, version) {\n return writeMigrationsByKeyAndVersion.get(schemaVersionKey(key, version));\n },\n };\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { SchemaError } from \"./schema\";\nimport type { JsonSchema } from \"./json-schema\";\nimport type { InferJsonSchemaValue } from \"./typed-schema\";\nimport type { KeySchema, MigrationRule } from \"./types\";\n\n/**\n * Create a versioned key schema that preserves the decoded value type inferred\n * from a typed schema helper.\n */\nexport function defineKeySchema<const K extends string, TSchema extends JsonSchema>(\n key: K,\n version: number,\n schema: TSchema,\n): KeySchema<InferJsonSchemaValue<TSchema>, K, TSchema> {\n return Object.freeze({\n key,\n version,\n schema,\n });\n}\n\n/**\n * Create a typed migration rule between two key schema versions.\n *\n * The `migrate(...)` callback is inferred from the source and target schemas,\n * which keeps migration logic aligned with the registered runtime schemas.\n */\nexport function defineMigration<const K extends string, TFrom, TTo>(\n fromSchema: KeySchema<TFrom, K>,\n toSchema: KeySchema<TTo, K>,\n migrate: (value: TFrom) => TTo,\n): MigrationRule<TFrom, TTo, K> {\n if (fromSchema.key !== toSchema.key) {\n throw new SchemaError(\n \"MIGRATION_GRAPH_INVALID\",\n `Migration schemas must target the same key: \"${fromSchema.key}\" !== \"${toSchema.key}\"`,\n );\n }\n\n return Object.freeze({\n key: fromSchema.key,\n fromVersion: fromSchema.version,\n toVersion: toSchema.version,\n migrate,\n });\n}\n\n/**\n * Create a typed write-time normalization rule for a single key schema.\n */\nexport function defineWriteMigration<const K extends string, TValue>(\n schema: KeySchema<TValue, K>,\n migrate: (value: TValue) => TValue,\n): MigrationRule<TValue, TValue, K> {\n return Object.freeze({\n key: schema.key,\n fromVersion: schema.version,\n toVersion: schema.version,\n migrate,\n });\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport type { JsonSchema, JsonSchemaType } from \"./json-schema\";\nimport { SchemaError } from \"./schema\";\n\ndeclare const typedSchemaBrand: unique symbol;\ndeclare const optionalSchemaBrand: unique symbol;\n\nconst optionalSchemaMarker = Symbol(\"mnemonicOptionalSchema\");\n\ntype JsonPrimitive = string | number | boolean | null;\ntype JsonConstValue = JsonPrimitive | readonly JsonConstValue[] | { readonly [key: string]: JsonConstValue };\n\nexport type TypedJsonSchema<T> = JsonSchema & {\n readonly [typedSchemaBrand]?: T;\n};\n\ntype OptionalTypedJsonSchema<T> = TypedJsonSchema<T> & {\n readonly [optionalSchemaBrand]: true;\n};\n\nexport type InferJsonSchemaValue<TSchema> = TSchema extends TypedJsonSchema<infer TValue> ? TValue : unknown;\n\ntype ObjectValueFromSchemas<\n TShape extends Record<string, TypedJsonSchema<unknown> | OptionalTypedJsonSchema<unknown>>,\n> = {\n [K in keyof TShape as TShape[K] extends OptionalTypedJsonSchema<unknown> ? never : K]: InferJsonSchemaValue<\n TShape[K]\n >;\n} & {\n [K in keyof TShape as TShape[K] extends OptionalTypedJsonSchema<unknown> ? K : never]?: InferJsonSchemaValue<\n TShape[K]\n >;\n};\n\ntype StringSchemaOptions = Pick<JsonSchema, \"minLength\" | \"maxLength\">;\ntype NumberSchemaOptions = Pick<JsonSchema, \"minimum\" | \"maximum\" | \"exclusiveMinimum\" | \"exclusiveMaximum\">;\ntype ArraySchemaOptions = Pick<JsonSchema, \"minItems\" | \"maxItems\">;\ntype ObjectSchemaOptions = Pick<JsonSchema, \"additionalProperties\">;\ntype JsonSchemaTypeInput = JsonSchemaType | JsonSchemaType[] | undefined;\n\nfunction cloneSchema<T>(schema: TypedJsonSchema<T>): TypedJsonSchema<T> {\n const clone = { ...schema } as TypedJsonSchema<T>;\n if ((schema as Record<PropertyKey, unknown>)[optionalSchemaMarker]) {\n Object.defineProperty(clone, optionalSchemaMarker, {\n value: true,\n enumerable: false,\n configurable: false,\n });\n }\n return clone;\n}\n\nfunction isOptionalSchema(schema: JsonSchema): schema is OptionalTypedJsonSchema<unknown> {\n return Boolean((schema as Record<PropertyKey, unknown>)[optionalSchemaMarker]);\n}\n\nfunction markOptional<T>(schema: TypedJsonSchema<T>): OptionalTypedJsonSchema<T> {\n const clone = cloneSchema(schema) as OptionalTypedJsonSchema<T>;\n Object.defineProperty(clone, optionalSchemaMarker, {\n value: true,\n enumerable: false,\n configurable: false,\n });\n return clone;\n}\n\nfunction withoutOptionalMarker<T>(schema: TypedJsonSchema<T> | OptionalTypedJsonSchema<T>): TypedJsonSchema<T> {\n const clone = { ...schema } as TypedJsonSchema<T>;\n delete (clone as Record<PropertyKey, unknown>)[optionalSchemaMarker];\n return clone;\n}\n\nfunction withType<T>(\n type: JsonSchemaType | JsonSchemaType[],\n extra: Omit<JsonSchema, \"type\"> = {},\n): TypedJsonSchema<T> {\n return {\n type,\n ...extra,\n } as TypedJsonSchema<T>;\n}\n\nfunction toTypeArray(type: JsonSchemaTypeInput): JsonSchemaType[] | null {\n if (type === undefined) return null;\n return Array.isArray(type) ? [...type] : [type];\n}\n\nfunction appendNullType(type: JsonSchemaTypeInput): JsonSchemaType | JsonSchemaType[] | undefined {\n const types = toTypeArray(type);\n if (types === null) {\n return undefined;\n }\n\n return types.includes(\"null\") ? types : [...types, \"null\"];\n}\n\nfunction nullableSchema<T>(schema: TypedJsonSchema<T>): TypedJsonSchema<T | null> {\n if (schema.enum) {\n const nullableType = appendNullType(schema.type);\n return {\n ...schema,\n ...(nullableType ? { type: nullableType } : {}),\n enum: schema.enum.includes(null) ? schema.enum : [...schema.enum, null],\n } as TypedJsonSchema<T | null>;\n }\n\n if (\"const\" in schema) {\n const { const: constValue, ...rest } = schema as TypedJsonSchema<T> & { const?: JsonConstValue | null };\n const nullableType = appendNullType(rest.type);\n if (constValue === null || constValue === undefined) {\n return {\n ...schema,\n ...(nullableType ? { type: nullableType } : {}),\n } as TypedJsonSchema<T | null>;\n }\n\n return {\n ...rest,\n ...(nullableType ? { type: nullableType } : {}),\n enum: [constValue, null],\n } as TypedJsonSchema<T | null>;\n }\n\n const types = toTypeArray(schema.type);\n if (types === null) {\n throw new SchemaError(\n \"MODE_CONFIGURATION_INVALID\",\n \"mnemonicSchema.nullable(...) requires a schema with type, enum, or const\",\n );\n }\n\n return {\n ...schema,\n type: types.includes(\"null\") ? types : [...types, \"null\"],\n } as TypedJsonSchema<T | null>;\n}\n\n/**\n * Builder helpers for strongly typed schemas backed by Mnemonic's built-in\n * JSON Schema subset.\n *\n * The returned schemas are plain `JsonSchema` objects at runtime, so they can\n * be registered directly in `createSchemaRegistry(...)` while also carrying a\n * phantom TypeScript type for inference.\n */\nexport const mnemonicSchema = {\n string(options: StringSchemaOptions = {}): TypedJsonSchema<string> {\n return withType<string>(\"string\", options);\n },\n\n number(options: NumberSchemaOptions = {}): TypedJsonSchema<number> {\n return withType<number>(\"number\", options);\n },\n\n integer(options: NumberSchemaOptions = {}): TypedJsonSchema<number> {\n return withType<number>(\"integer\", options);\n },\n\n boolean(): TypedJsonSchema<boolean> {\n return withType<boolean>(\"boolean\");\n },\n\n nullValue(): TypedJsonSchema<null> {\n return withType<null>(\"null\");\n },\n\n literal<const TValue extends JsonConstValue>(value: TValue): TypedJsonSchema<TValue> {\n return {\n const: value,\n } as TypedJsonSchema<TValue>;\n },\n\n enum<const TValues extends readonly [JsonPrimitive, ...JsonPrimitive[]]>(\n values: TValues,\n ): TypedJsonSchema<TValues[number]> {\n return {\n enum: values,\n } as TypedJsonSchema<TValues[number]>;\n },\n\n optional<T>(schema: TypedJsonSchema<T>): OptionalTypedJsonSchema<T> {\n return markOptional(schema);\n },\n\n nullable<T>(schema: TypedJsonSchema<T>): TypedJsonSchema<T | null> {\n return nullableSchema(schema);\n },\n\n array<TItemSchema extends TypedJsonSchema<unknown>>(\n itemSchema: TItemSchema,\n options: ArraySchemaOptions = {},\n ): TypedJsonSchema<InferJsonSchemaValue<TItemSchema>[]> {\n return withType<InferJsonSchemaValue<TItemSchema>[]>(\"array\", {\n items: withoutOptionalMarker(itemSchema),\n ...options,\n });\n },\n\n object<TShape extends Record<string, TypedJsonSchema<unknown> | OptionalTypedJsonSchema<unknown>>>(\n shape: TShape,\n options: ObjectSchemaOptions = {},\n ): TypedJsonSchema<ObjectValueFromSchemas<TShape>> {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [name, schema] of Object.entries(shape)) {\n properties[name] = withoutOptionalMarker(schema);\n if (!isOptionalSchema(schema)) {\n required.push(name);\n }\n }\n\n const result: JsonSchema = {\n type: \"object\",\n properties,\n ...options,\n };\n\n if (required.length > 0) {\n result.required = required;\n }\n\n return result as TypedJsonSchema<ObjectValueFromSchemas<TShape>>;\n },\n\n record<TValueSchema extends TypedJsonSchema<unknown>>(\n valueSchema: TValueSchema,\n ): TypedJsonSchema<Record<string, InferJsonSchemaValue<TValueSchema>>> {\n return withType<Record<string, InferJsonSchemaValue<TValueSchema>>>(\"object\", {\n additionalProperties: withoutOptionalMarker(valueSchema),\n });\n },\n};\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\n/**\n * Adapter functions for structural migration helpers.\n *\n * These helpers assume tree-like data, but not a specific node shape. Supply a\n * `StructuralTreeHelpers<T>` when your nodes use custom field names. When your\n * nodes already look like `{ id, children }`, the exported helpers work without\n * any adapter configuration.\n *\n * @template T - Tree node type\n */\nexport interface StructuralTreeHelpers<T> {\n /**\n * Returns the stable identifier for a node.\n */\n getId: (node: T) => string;\n\n /**\n * Returns the node's child list, or `undefined` when it has no children.\n */\n getChildren: (node: T) => readonly T[] | undefined;\n\n /**\n * Returns a copy of the node with a new child list.\n */\n withChildren: (node: T, children: T[]) => T;\n\n /**\n * Returns a copy of the node with a new identifier.\n */\n withId: (node: T, id: string) => T;\n}\n\n/**\n * Default tree node shape supported by the structural migration helpers.\n *\n * If your nodes already use `id` and `children`, you can call the helpers\n * directly without supplying `StructuralTreeHelpers`.\n *\n * @template T - Tree node type\n */\nexport interface StructuralNode<T> {\n /**\n * Stable node identifier used for lookup and rename operations.\n */\n id: string;\n\n /**\n * Optional child nodes.\n */\n children?: readonly T[];\n}\n\nfunction resolveHelpers<T>(helpers?: StructuralTreeHelpers<T>): StructuralTreeHelpers<T> {\n if (helpers) return helpers;\n return {\n getId: (node: T) => (node as StructuralNode<T>).id,\n getChildren: (node: T) => (node as StructuralNode<T>).children,\n withChildren: (node: T, children: T[]) => ({ ...(node as object), children }) as T,\n withId: (node: T, id: string) => ({ ...(node as object), id }) as T,\n };\n}\n\n/**\n * Finds the first node with the requested id using depth-first traversal.\n *\n * @template T - Tree node type (must extend `{ id: string; children?: readonly T[] }` when `helpers` is omitted)\n * @param root - Root node to search\n * @param id - Target node id\n * @returns The matching node, or `undefined`\n */\nexport function findNodeById<T extends StructuralNode<T>>(root: T, id: string): T | undefined;\n/**\n * Finds the first node with the requested id using depth-first traversal.\n *\n * @template T - Tree node type\n * @param root - Root node to search\n * @param id - Target node id\n * @param helpers - Adapter for custom node shapes\n * @returns The matching node, or `undefined`\n */\nexport function findNodeById<T>(root: T, id: string, helpers: StructuralTreeHelpers<T>): T | undefined;\nexport function findNodeById<T>(root: T, id: string, helpers?: StructuralTreeHelpers<T>): T | undefined {\n const tree = resolveHelpers(helpers);\n if (tree.getId(root) === id) return root;\n for (const child of tree.getChildren(root) ?? []) {\n const match = findNodeById(child, id, tree);\n if (match) return match;\n }\n return undefined;\n}\n\n/**\n * Inserts a child under the target parent when none of that parent's existing\n * direct children share the same id. Returns the original tree when the parent\n * is missing or the child is already present as a direct child.\n *\n * @template T - Tree node type (must extend `{ id: string; children?: readonly T[] }` when `helpers` is omitted)\n * @param root - Root node to update\n * @param parentId - Parent node that should receive the child\n * @param child - Child node to append\n * @returns Updated tree with the child inserted once\n */\nexport function insertChildIfMissing<T extends StructuralNode<T>>(root: T, parentId: string, child: T): T;\n/**\n * Inserts a child under the target parent when no existing child shares the\n * same id. Returns the original tree when the parent is missing or the child is\n * already present.\n *\n * @template T - Tree node type\n * @param root - Root node to update\n * @param parentId - Parent node that should receive the child\n * @param child - Child node to append\n * @param helpers - Adapter for custom node shapes\n * @returns Updated tree with the child inserted once\n */\nexport function insertChildIfMissing<T>(root: T, parentId: string, child: T, helpers: StructuralTreeHelpers<T>): T;\nexport function insertChildIfMissing<T>(root: T, parentId: string, child: T, helpers?: StructuralTreeHelpers<T>): T {\n const tree = resolveHelpers(helpers);\n const childId = tree.getId(child);\n\n const visit = (node: T): [T, boolean] => {\n if (tree.getId(node) === parentId) {\n const children = [...(tree.getChildren(node) ?? [])];\n if (children.some((existing) => tree.getId(existing) === childId)) {\n return [node, false];\n }\n return [tree.withChildren(node, [...children, child]), true];\n }\n\n const children = tree.getChildren(node);\n if (!children?.length) return [node, false];\n\n let inserted = false;\n let changed = false;\n const nextChildren = children.map((existingChild) => {\n if (inserted) return existingChild;\n const [nextChild, didInsert] = visit(existingChild);\n inserted ||= didInsert;\n changed ||= nextChild !== existingChild;\n return nextChild;\n });\n\n if (!changed) return [node, inserted];\n return [tree.withChildren(node, nextChildren), inserted];\n };\n\n return visit(root)[0];\n}\n\n/**\n * Renames every node with the source id while preserving tree structure.\n * Returns the original tree when the source id is missing or the target id\n * already exists elsewhere.\n *\n * @template T - Tree node type (must extend `{ id: string; children?: readonly T[] }` when `helpers` is omitted)\n * @param root - Root node to update\n * @param currentId - Existing id to rename\n * @param nextId - Replacement id\n * @returns Updated tree with matching node ids renamed\n */\nexport function renameNode<T extends StructuralNode<T>>(root: T, currentId: string, nextId: string): T;\n/**\n * Renames every node with the source id while preserving tree structure.\n * Returns the original tree when the source id is missing or the target id\n * already exists elsewhere.\n *\n * @template T - Tree node type\n * @param root - Root node to update\n * @param currentId - Existing id to rename\n * @param nextId - Replacement id\n * @param helpers - Adapter for custom node shapes\n * @returns Updated tree with matching node ids renamed\n */\nexport function renameNode<T>(root: T, currentId: string, nextId: string, helpers: StructuralTreeHelpers<T>): T;\nexport function renameNode<T>(root: T, currentId: string, nextId: string, helpers?: StructuralTreeHelpers<T>): T {\n const tree = resolveHelpers(helpers);\n if (currentId === nextId) return root;\n if (!findNodeById(root, currentId, tree)) return root;\n if (findNodeById(root, nextId, tree)) return root;\n\n const visit = (node: T): T => {\n let nextNode = tree.getId(node) === currentId ? tree.withId(node, nextId) : node;\n const children = tree.getChildren(nextNode);\n if (!children?.length) return nextNode;\n\n let changed = nextNode !== node;\n const nextChildren = children.map((child) => {\n const nextChild = visit(child);\n changed ||= nextChild !== child;\n return nextChild;\n });\n\n if (!changed) return node;\n return tree.withChildren(nextNode, nextChildren);\n };\n\n return visit(root);\n}\n\n/**\n * Deduplicates each node's immediate children while preserving the first child\n * encountered for each key. The helper traverses the full tree and returns the\n * original root when no duplicates are removed.\n *\n * @template T - Tree node type (must extend `{ id: string; children?: readonly T[] }` when `helpers` is omitted)\n * @template K - Deduplication key type\n * @param root - Root node to normalize\n * @param getKey - Function that computes a dedupe key for each child\n * @returns Updated tree with duplicate siblings removed\n */\nexport function dedupeChildrenBy<T extends StructuralNode<T>, K>(root: T, getKey: (node: T) => K): T;\n/**\n * Deduplicates each node's immediate children while preserving the first child\n * encountered for each key. The helper traverses the full tree and returns the\n * original root when no duplicates are removed.\n *\n * @template T - Tree node type\n * @template K - Deduplication key type\n * @param root - Root node to normalize\n * @param getKey - Function that computes a dedupe key for each child\n * @param helpers - Adapter for custom node shapes\n * @returns Updated tree with duplicate siblings removed\n */\nexport function dedupeChildrenBy<T, K>(root: T, getKey: (node: T) => K, helpers: StructuralTreeHelpers<T>): T;\nexport function dedupeChildrenBy<T, K>(root: T, getKey: (node: T) => K, helpers?: StructuralTreeHelpers<T>): T {\n const tree = resolveHelpers(helpers);\n\n const visit = (node: T): T => {\n const children = tree.getChildren(node);\n if (!children?.length) return node;\n\n let changed = false;\n const seen = new Set<K>();\n const nextChildren: T[] = [];\n\n for (const child of children) {\n const normalizedChild = visit(child);\n changed ||= normalizedChild !== child;\n\n const key = getKey(normalizedChild);\n if (seen.has(key)) {\n changed = true;\n continue;\n }\n\n seen.add(key);\n nextChildren.push(normalizedChild);\n }\n\n if (!changed && nextChildren.length === children.length) return node;\n return tree.withChildren(node, nextChildren);\n };\n\n return visit(root);\n}\n"]}
1
+ {"version":3,"sources":["../src/Mnemonic/codecs.ts","../src/Mnemonic/json-schema.ts","../src/Mnemonic/schema.ts","../src/Mnemonic/persistence-shared.ts","../src/Mnemonic/optional-bridge-adapter.ts","../src/Mnemonic/optional-bridge.tsx","../src/Mnemonic/optional-bridge-provider.tsx","../src/Mnemonic/runtime.ts","../src/Mnemonic/provider.tsx","../src/Mnemonic/use-shared.ts","../src/Mnemonic/use.ts","../src/Mnemonic/recovery.ts","../src/Mnemonic/key.ts","../src/Mnemonic/schema-registry.ts","../src/Mnemonic/schema-helpers.ts","../src/Mnemonic/typed-schema.ts","../src/Mnemonic/structural-migrations.ts"],"names":["objectHasOwn","createContext","useContext","store","useMemo","parseEnvelope","decodeStringPayload","buildFallbackResult","useEffect","useRef","validateAgainstSchema","useCallback","getSchemaForVersion","resolveTargetWriteSchema","decodeAutoschemaEnvelope","decodeCodecManagedEnvelope","decodeSchemaManagedEnvelope","warnOnce","isDevelopmentRuntime","children"],"mappings":"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","file":"schema.js","sourcesContent":["// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\n/**\n * @fileoverview Codec implementations for encoding and decoding values to/from storage.\n *\n * This module provides the built-in JSON codec and a factory for creating custom\n * codecs. Codecs handle the bidirectional transformation between typed JavaScript\n * values and their string representations for storage.\n *\n * Codecs are a low-level mechanism for keys that opt out of the JSON Schema\n * validation system. When a schema is registered for a key, the schema's\n * JSON Schema is used for validation and the payload is stored as a JSON value\n * directly (no codec encoding needed).\n */\n\nimport type { Codec } from \"./types\";\n\n/**\n * Custom error class for codec encoding and decoding failures.\n *\n * Thrown when a codec cannot successfully encode a value to a string or\n * decode a string back to its typed representation. This allows callers\n * to distinguish codec errors from other types of errors.\n *\n * @example\n * ```typescript\n * try {\n * const value = JSONCodec.decode('not-valid-json');\n * } catch (error) {\n * if (error instanceof CodecError) {\n * console.error('Failed to decode:', error.message);\n * }\n * }\n * ```\n */\nexport class CodecError extends Error {\n /**\n * The underlying error that caused the codec failure, if any.\n *\n * Useful for debugging when wrapping errors from JSON.parse or\n * other parsing operations.\n */\n readonly cause?: unknown;\n\n /**\n * Creates a new CodecError.\n *\n * @param message - Human-readable error description\n * @param cause - Optional underlying error that caused this failure\n */\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"CodecError\";\n this.cause = cause;\n\n // Required for proper instanceof behavior when targeting ES5\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * JSON codec for encoding and decoding JSON-serializable values.\n *\n * This is the default codec used by `useMnemonicKey` when no codec is specified.\n * It uses `JSON.stringify` for encoding and `JSON.parse` for decoding, making it\n * suitable for objects, arrays, and primitive values.\n *\n * @remarks\n * - Supports any JSON-serializable type: objects, arrays, strings, numbers, booleans, null\n * - Does not preserve JavaScript-specific types like Date, Map, Set, or undefined\n * - Throws standard JSON parsing errors for malformed JSON strings\n *\n * @example\n * ```typescript\n * // Used automatically as the default\n * const { value, set } = useMnemonicKey('userProfile', {\n * defaultValue: { name: 'Guest', preferences: { theme: 'dark' } }\n * // codec: JSONCodec is implicit\n * });\n *\n * // Can be specified explicitly\n * const { value, set } = useMnemonicKey('settings', {\n * defaultValue: { notifications: true },\n * codec: JSONCodec\n * });\n * ```\n *\n * @see {@link createCodec} - For custom encoding schemes\n */\nexport const JSONCodec: Codec<any> = {\n encode: (value) => JSON.stringify(value),\n decode: (encoded) => JSON.parse(encoded),\n};\n\n/**\n * Factory function for creating custom codecs.\n *\n * Creates a `Codec<T>` from separate encode and decode functions. This is\n * useful for implementing custom serialization strategies for types that\n * aren't supported by JSONCodec. Using a custom codec on a key opts out\n * of JSON Schema validation for that key.\n *\n * @template T - The TypeScript type of values to encode/decode\n *\n * @param encode - Function that converts a typed value to a string\n * @param decode - Function that converts a string back to a typed value\n * @returns A `Codec<T>` object compatible with useMnemonicKey\n *\n * @example\n * ```typescript\n * // Codec for Date objects\n * const DateCodec = createCodec<Date>(\n * (date) => date.toISOString(),\n * (str) => new Date(str)\n * );\n *\n * const { value, set } = useMnemonicKey('lastLogin', {\n * defaultValue: new Date(),\n * codec: DateCodec\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Codec for Set<string>\n * const StringSetCodec = createCodec<Set<string>>(\n * (set) => JSON.stringify(Array.from(set)),\n * (str) => new Set(JSON.parse(str))\n * );\n *\n * const { value, set } = useMnemonicKey('tags', {\n * defaultValue: new Set<string>(),\n * codec: StringSetCodec\n * });\n * ```\n *\n * @see {@link Codec} - The codec interface\n * @see {@link CodecError} - Error to throw when encoding/decoding fails\n * @see {@link JSONCodec} - Built-in codec for JSON values\n */\nexport function createCodec<T>(encode: (value: T) => string, decode: (encoded: string) => T): Codec<T> {\n return { encode, decode };\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\n/**\n * @fileoverview JSON Schema subset validator for Mnemonic.\n *\n * This module implements a minimal JSON Schema validator sufficient for\n * validating localStorage state. Only a subset of JSON Schema keywords\n * are supported; see {@link JsonSchema} for the full list.\n *\n * JSON Schema documents are plain JSON objects (inherently serializable),\n * making them suitable for storage alongside the data they describe.\n */\n\n/**\n * Supported JSON Schema type keywords.\n *\n * `\"integer\"` is a JSON Schema keyword meaning \"a number that is a whole number.\"\n */\nexport type JsonSchemaType = \"string\" | \"number\" | \"integer\" | \"boolean\" | \"null\" | \"object\" | \"array\";\n\n/**\n * A subset of JSON Schema sufficient for localStorage state management.\n *\n * Supported keywords:\n * type, enum, const,\n * minimum, maximum, exclusiveMinimum, exclusiveMaximum,\n * minLength, maxLength,\n * properties, required, additionalProperties,\n * items, minItems, maxItems\n *\n * Deliberately omitted: $ref, $id, $schema, $defs, allOf, anyOf,\n * oneOf, not, pattern, format, patternProperties, if/then/else,\n * dependencies, uniqueItems, multipleOf, propertyNames.\n *\n * An empty schema `{}` accepts any value.\n */\nexport interface JsonSchema {\n /** The expected JSON type(s). An array form like `[\"string\", \"null\"]` accepts either type. */\n type?: JsonSchemaType | JsonSchemaType[];\n\n /** The value must be deeply equal to one of these entries. */\n enum?: readonly unknown[];\n\n /** The value must be deeply equal to this exact value. */\n const?: unknown;\n\n /** Inclusive lower bound for numbers. */\n minimum?: number;\n\n /** Inclusive upper bound for numbers. */\n maximum?: number;\n\n /** Exclusive lower bound for numbers. */\n exclusiveMinimum?: number;\n\n /** Exclusive upper bound for numbers. */\n exclusiveMaximum?: number;\n\n /** Minimum string length (inclusive). */\n minLength?: number;\n\n /** Maximum string length (inclusive). */\n maxLength?: number;\n\n /** Property name to sub-schema mapping for objects. */\n properties?: Record<string, JsonSchema>;\n\n /** Properties that must be present on the object. */\n required?: readonly string[];\n\n /**\n * Controls extra properties not listed in `properties`.\n * `false` disallows them. A schema validates their values.\n * `true` (or omitted) allows anything.\n */\n additionalProperties?: boolean | JsonSchema;\n\n /** Schema applied to every element of an array. */\n items?: JsonSchema;\n\n /** Minimum array length (inclusive). */\n minItems?: number;\n\n /** Maximum array length (inclusive). */\n maxItems?: number;\n}\n\n/**\n * A single validation error produced by {@link validateJsonSchema}.\n */\nexport type JsonSchemaValidationError = {\n /** JSON Pointer path to the failing value (e.g., \"/foo/bar/0\"). Empty string for root. */\n path: string;\n /** Human-readable error description. */\n message: string;\n /** The JSON Schema keyword that failed. */\n keyword: string;\n};\n\n/**\n * Tests whether a value matches a single JSON Schema type keyword.\n */\nfunction matchesType(value: unknown, type: JsonSchemaType): boolean {\n switch (type) {\n case \"string\":\n return typeof value === \"string\";\n case \"number\":\n return typeof value === \"number\" && Number.isFinite(value);\n case \"integer\":\n return typeof value === \"number\" && Number.isInteger(value);\n case \"boolean\":\n return typeof value === \"boolean\";\n case \"null\":\n return value === null;\n case \"object\":\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n case \"array\":\n return Array.isArray(value);\n default:\n return false;\n }\n}\n\n/**\n * Structural deep equality for JSON values (null, booleans, numbers, strings,\n * arrays, and plain objects). Used by `enum` and `const` keywords.\n */\nfunction jsonDeepEqualArray(a: readonly unknown[], b: readonly unknown[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!jsonDeepEqual(a[i], b[i])) return false;\n }\n return true;\n}\n\nfunction jsonDeepEqualObject(a: Record<string, unknown>, b: Record<string, unknown>): boolean {\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) return false;\n for (const key of aKeys) {\n if (!objectHasOwn(b, key)) return false;\n if (!jsonDeepEqual(a[key], b[key])) return false;\n }\n return true;\n}\n\nexport function jsonDeepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (typeof a !== typeof b) return false;\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b)) return false;\n return jsonDeepEqualArray(a, b);\n }\n\n if (typeof a === \"object\") {\n if (Array.isArray(b)) return false;\n return jsonDeepEqualObject(a as Record<string, unknown>, b as Record<string, unknown>);\n }\n\n return false;\n}\n\n/**\n * A pre-compiled validation function generated by {@link compileSchema}.\n *\n * Accepts a value and an optional JSON Pointer path for error reporting.\n * Returns an array of validation errors (empty = valid).\n */\nexport type CompiledValidator = (value: unknown, path?: string) => JsonSchemaValidationError[];\n\ntype ValidationStep = (value: unknown, path: string, errors: JsonSchemaValidationError[]) => void;\ntype TypeValidationStep = (value: unknown, path: string, errors: JsonSchemaValidationError[]) => boolean;\ntype ObjectValidationStep = (value: Record<string, unknown>, path: string, errors: JsonSchemaValidationError[]) => void;\n\n/** Module-level cache: schema object identity → compiled validator. */\nconst compiledCache = new WeakMap<JsonSchema, CompiledValidator>();\n\n/**\n * Pre-compiles a {@link JsonSchema} into a reusable validation function.\n *\n * Inspects the schema once and builds a specialized closure that\n * eliminates runtime branching for unused keywords, pre-converts\n * `required` arrays to `Set`s, recursively pre-compiles nested property\n * and item schemas, and pre-builds primitive `Set`s for O(1) enum\n * lookups when possible.\n *\n * Results are cached by schema object identity in a `WeakMap`, so\n * calling `compileSchema` with the same schema reference is free\n * after the first call.\n *\n * @param schema - The JSON Schema to compile\n * @returns A compiled validation function\n */\nexport function compileSchema(schema: JsonSchema): CompiledValidator {\n const cached = compiledCache.get(schema);\n if (cached) return cached;\n\n const compiled = buildValidator(schema);\n compiledCache.set(schema, compiled);\n return compiled;\n}\n\n/** Determines whether a value is a JSON primitive (not object/array). */\nfunction isJsonPrimitive(value: unknown): boolean {\n return value === null || typeof value !== \"object\";\n}\n\nfunction isJsonObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction objectHasOwn(value: object, property: PropertyKey): boolean {\n const hasOwn = (Object as typeof Object & { hasOwn?: (target: object, key: PropertyKey) => boolean }).hasOwn;\n if (typeof hasOwn === \"function\") {\n return hasOwn(value, property);\n }\n return Object.getOwnPropertyDescriptor(value, property) !== undefined;\n}\n\n/**\n * Internal: builds a compiled validator closure for a single schema.\n * All keyword-specific logic is resolved at build time so the returned\n * function contains only the checks that are relevant.\n */\nfunction buildValidator(schema: JsonSchema): CompiledValidator {\n const typeStep = buildTypeValidationStep(schema);\n const validationSteps = [\n buildEnumValidationStep(schema),\n buildConstValidationStep(schema),\n buildNumberValidationStep(schema),\n buildStringValidationStep(schema),\n buildObjectValidationStep(schema),\n buildArrayValidationStep(schema),\n ].filter((step): step is ValidationStep => step !== null);\n\n if (typeStep === null && validationSteps.length === 0) {\n return (_value: unknown, _path?: string) => [];\n }\n\n return (value: unknown, path: string = \"\"): JsonSchemaValidationError[] => {\n const errors: JsonSchemaValidationError[] = [];\n if (typeStep && !typeStep(value, path, errors)) {\n return errors;\n }\n for (const step of validationSteps) {\n step(value, path, errors);\n }\n return errors;\n };\n}\n\nfunction buildTypeValidationStep(schema: JsonSchema): TypeValidationStep | null {\n if (schema.type === undefined) {\n return null;\n }\n\n const resolvedTypes = Array.isArray(schema.type) ? schema.type : [schema.type];\n const typeLabel = JSON.stringify(schema.type);\n return (value, path, errors) => {\n if (resolvedTypes.some((type) => matchesType(value, type))) {\n return true;\n }\n errors.push({\n path,\n message: `Expected type ${typeLabel}, got ${jsonTypeLabel(value)}`,\n keyword: \"type\",\n });\n return false;\n };\n}\n\nfunction buildEnumValidationStep(schema: JsonSchema): ValidationStep | null {\n if (schema.enum === undefined) {\n return null;\n }\n\n const enumPrimitiveSet = new Set(schema.enum.filter((member) => isJsonPrimitive(member)));\n const enumComplexMembers = schema.enum.filter((member) => !isJsonPrimitive(member));\n\n return (value, path, errors) => {\n const primitiveMatch = isJsonPrimitive(value) && enumPrimitiveSet.has(value);\n const complexMatch = !primitiveMatch && enumComplexMembers.some((entry) => jsonDeepEqual(value, entry));\n if (primitiveMatch || complexMatch) {\n return;\n }\n errors.push({\n path,\n message: `Value does not match any enum member`,\n keyword: \"enum\",\n });\n };\n}\n\nfunction buildConstValidationStep(schema: JsonSchema): ValidationStep | null {\n if (!(\"const\" in schema)) {\n return null;\n }\n\n return (value, path, errors) => {\n if (jsonDeepEqual(value, schema.const)) {\n return;\n }\n errors.push({\n path,\n message: `Value does not match const`,\n keyword: \"const\",\n });\n };\n}\n\nfunction buildNumberValidationStep(schema: JsonSchema): ValidationStep | null {\n const hasMinimum = schema.minimum !== undefined;\n const hasMaximum = schema.maximum !== undefined;\n const hasExMin = schema.exclusiveMinimum !== undefined;\n const hasExMax = schema.exclusiveMaximum !== undefined;\n if (!hasMinimum && !hasMaximum && !hasExMin && !hasExMax) {\n return null;\n }\n\n const minimum = schema.minimum;\n const maximum = schema.maximum;\n const exMin = schema.exclusiveMinimum;\n const exMax = schema.exclusiveMaximum;\n\n return (value, path, errors) => {\n if (typeof value !== \"number\") {\n return;\n }\n if (hasMinimum && value < minimum!) {\n errors.push({\n path,\n message: `Value ${value} is less than minimum ${minimum!}`,\n keyword: \"minimum\",\n });\n }\n if (hasMaximum && value > maximum!) {\n errors.push({\n path,\n message: `Value ${value} is greater than maximum ${maximum!}`,\n keyword: \"maximum\",\n });\n }\n if (hasExMin && value <= exMin!) {\n errors.push({\n path,\n message: `Value ${value} is not greater than exclusiveMinimum ${exMin!}`,\n keyword: \"exclusiveMinimum\",\n });\n }\n if (hasExMax && value >= exMax!) {\n errors.push({\n path,\n message: `Value ${value} is not less than exclusiveMaximum ${exMax!}`,\n keyword: \"exclusiveMaximum\",\n });\n }\n };\n}\n\nfunction buildStringValidationStep(schema: JsonSchema): ValidationStep | null {\n const hasMinLength = schema.minLength !== undefined;\n const hasMaxLength = schema.maxLength !== undefined;\n if (!hasMinLength && !hasMaxLength) {\n return null;\n }\n\n const minLength = schema.minLength;\n const maxLength = schema.maxLength;\n return (value, path, errors) => {\n if (typeof value !== \"string\") {\n return;\n }\n if (hasMinLength && value.length < minLength!) {\n errors.push({\n path,\n message: `String length ${value.length} is less than minLength ${minLength!}`,\n keyword: \"minLength\",\n });\n }\n if (hasMaxLength && value.length > maxLength!) {\n errors.push({\n path,\n message: `String length ${value.length} is greater than maxLength ${maxLength!}`,\n keyword: \"maxLength\",\n });\n }\n };\n}\n\nfunction buildObjectValidationStep(schema: JsonSchema): ValidationStep | null {\n const requiredKeys = schema.required ?? [];\n const propertyValidators = schema.properties\n ? (Object.entries(schema.properties).map(([name, propertySchema]) => [\n name,\n compileSchema(propertySchema),\n ]) satisfies [string, CompiledValidator][])\n : null;\n const checkAdditional = schema.additionalProperties !== undefined && schema.additionalProperties !== true;\n const additionalIsFalse = schema.additionalProperties === false;\n const additionalValidator =\n checkAdditional && !additionalIsFalse ? compileSchema(schema.additionalProperties as JsonSchema) : null;\n const definedPropKeys = checkAdditional ? new Set(Object.keys(schema.properties ?? {})) : null;\n const objectValidationSteps: ObjectValidationStep[] = [];\n\n if (requiredKeys.length > 0) {\n objectValidationSteps.push(createRequiredPropertyStep(requiredKeys));\n }\n if (propertyValidators !== null) {\n objectValidationSteps.push(createDeclaredPropertyStep(propertyValidators));\n }\n if (checkAdditional) {\n objectValidationSteps.push(\n createAdditionalPropertyStep({\n additionalIsFalse,\n additionalValidator,\n definedPropKeys: definedPropKeys ?? new Set<string>(),\n }),\n );\n }\n\n if (objectValidationSteps.length === 0) {\n return null;\n }\n\n return (value, path, errors) => {\n if (!isJsonObjectRecord(value)) {\n return;\n }\n\n for (const step of objectValidationSteps) {\n step(value, path, errors);\n }\n };\n}\n\nfunction createRequiredPropertyStep(requiredKeys: readonly string[]): ObjectValidationStep {\n return (value, path, errors) => {\n for (const requiredKey of requiredKeys) {\n if (objectHasOwn(value, requiredKey)) {\n continue;\n }\n errors.push({\n path,\n message: `Missing required property \"${requiredKey}\"`,\n keyword: \"required\",\n });\n }\n };\n}\n\nfunction createDeclaredPropertyStep(propertyValidators: [string, CompiledValidator][]): ObjectValidationStep {\n return (value, path, errors) => {\n for (const [propertyName, validator] of propertyValidators) {\n if (!objectHasOwn(value, propertyName)) {\n continue;\n }\n errors.push(...validator(value[propertyName], `${path}/${propertyName}`));\n }\n };\n}\n\nfunction createAdditionalPropertyStep({\n additionalIsFalse,\n additionalValidator,\n definedPropKeys,\n}: {\n additionalIsFalse: boolean;\n additionalValidator: CompiledValidator | null;\n definedPropKeys: Set<string>;\n}): ObjectValidationStep {\n return (value, path, errors) => {\n for (const objectKey of Object.keys(value)) {\n if (definedPropKeys.has(objectKey)) {\n continue;\n }\n if (additionalIsFalse) {\n errors.push({\n path,\n message: `Additional property \"${objectKey}\" is not allowed`,\n keyword: \"additionalProperties\",\n });\n continue;\n }\n errors.push(...additionalValidator!(value[objectKey], `${path}/${objectKey}`));\n }\n };\n}\n\nfunction buildArrayValidationStep(schema: JsonSchema): ValidationStep | null {\n const hasMinItems = schema.minItems !== undefined;\n const hasMaxItems = schema.maxItems !== undefined;\n const itemsValidator = schema.items ? compileSchema(schema.items) : null;\n if (!hasMinItems && !hasMaxItems && itemsValidator === null) {\n return null;\n }\n\n const minItems = schema.minItems;\n const maxItems = schema.maxItems;\n return (value, path, errors) => {\n if (!Array.isArray(value)) {\n return;\n }\n if (hasMinItems && value.length < minItems!) {\n errors.push({\n path,\n message: `Array length ${value.length} is less than minItems ${minItems!}`,\n keyword: \"minItems\",\n });\n }\n if (hasMaxItems && value.length > maxItems!) {\n errors.push({\n path,\n message: `Array length ${value.length} is greater than maxItems ${maxItems!}`,\n keyword: \"maxItems\",\n });\n }\n if (itemsValidator === null) {\n return;\n }\n for (const [index, item] of value.entries()) {\n errors.push(...itemsValidator(item, `${path}/${index}`));\n }\n };\n}\n\n/**\n * Validates a value against a {@link JsonSchema}.\n *\n * Returns an empty array when the value is valid.\n * Returns one or more {@link JsonSchemaValidationError} entries on failure.\n * Short-circuits on type mismatch (does not report downstream keyword errors).\n *\n * @param value - The value to validate\n * @param schema - The JSON Schema to validate against\n * @param path - Internal: JSON Pointer path for error reporting (default: `\"\"`)\n * @returns Array of validation errors (empty = valid)\n */\nexport function validateJsonSchema(value: unknown, schema: JsonSchema, path: string = \"\"): JsonSchemaValidationError[] {\n const compiled = compileSchema(schema);\n return compiled(value, path);\n}\n\n/**\n * Returns a human-readable label for the JSON type of a value.\n */\nfunction jsonTypeLabel(value: unknown): string {\n if (value === null) return \"null\";\n if (Array.isArray(value)) return \"array\";\n return typeof value;\n}\n\n/**\n * Infers a minimal {@link JsonSchema} from a sample value.\n *\n * Used by autoschema mode to register a schema from the first\n * successfully decoded value. The inferred schema only constrains\n * the top-level type.\n *\n * @param sample - A decoded value to infer a schema from\n * @returns A minimal JsonSchema that accepts values of the same top-level type\n */\nexport function inferJsonSchema(sample: unknown): JsonSchema {\n if (sample === null) return { type: \"null\" };\n if (Array.isArray(sample)) return { type: \"array\" };\n switch (typeof sample) {\n case \"string\":\n return { type: \"string\" };\n case \"number\":\n return { type: \"number\" };\n case \"boolean\":\n return { type: \"boolean\" };\n case \"object\":\n return { type: \"object\" };\n default:\n return {};\n }\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\n/**\n * @fileoverview Schema versioning primitives for Mnemonic.\n *\n * This module defines the envelope format used to wrap every persisted value\n * and the error class thrown when schema-related operations fail.\n */\n\n/**\n * Error thrown for schema registry, versioning, and migration failures.\n *\n * Each instance carries a machine-readable {@link code} that categorises\n * the failure. When a `defaultValue` factory is provided to\n * `useMnemonicKey`, the `SchemaError` is passed as the `error` argument\n * so the factory can inspect the failure reason.\n *\n * Error codes:\n *\n * | Code | Meaning |\n * | ------------------------------- | --------------------------------------------------------------- |\n * | `INVALID_ENVELOPE` | The raw stored value is not a valid `MnemonicEnvelope`. |\n * | `SCHEMA_NOT_FOUND` | No schema registered for the stored key + version. |\n * | `WRITE_SCHEMA_REQUIRED` | Strict mode requires a schema to write, but none was found. |\n * | `MIGRATION_PATH_NOT_FOUND` | No contiguous migration path between the stored and latest version. |\n * | `MIGRATION_FAILED` | A migration step threw during execution. |\n * | `MIGRATION_GRAPH_INVALID` | The schema registry helper received an ambiguous or cyclic migration graph. |\n * | `RECONCILE_FAILED` | A read-time reconciliation hook threw or returned an unpersistable value. |\n * | `SCHEMA_REGISTRATION_CONFLICT` | `registerSchema` was called with a conflicting definition. |\n * | `TYPE_MISMATCH` | The decoded value failed JSON Schema validation. |\n * | `MODE_CONFIGURATION_INVALID` | The schema mode requires a capability the registry doesn't provide. |\n *\n * @example\n * ```typescript\n * defaultValue: (error) => {\n * if (error instanceof SchemaError) {\n * console.warn(`Schema issue [${error.code}]:`, error.message);\n * }\n * return { name: \"Guest\" };\n * }\n * ```\n *\n * @see {@link SchemaMode} - How the provider uses schemas\n * @see {@link SchemaRegistry} - Where schemas and migrations are registered\n */\nexport class SchemaError extends Error {\n /**\n * Machine-readable code identifying the category of schema failure.\n */\n readonly code:\n | \"INVALID_ENVELOPE\"\n | \"SCHEMA_NOT_FOUND\"\n | \"WRITE_SCHEMA_REQUIRED\"\n | \"MIGRATION_PATH_NOT_FOUND\"\n | \"MIGRATION_FAILED\"\n | \"MIGRATION_GRAPH_INVALID\"\n | \"RECONCILE_FAILED\"\n | \"SCHEMA_REGISTRATION_CONFLICT\"\n | \"TYPE_MISMATCH\"\n | \"MODE_CONFIGURATION_INVALID\";\n\n /**\n * The underlying error that caused this failure, if any.\n */\n readonly cause?: unknown;\n\n /**\n * Creates a new SchemaError.\n *\n * @param code - Machine-readable failure category\n * @param message - Human-readable error description\n * @param cause - Optional underlying error\n */\n constructor(code: SchemaError[\"code\"], message: string, cause?: unknown) {\n super(message);\n this.name = \"SchemaError\";\n this.code = code;\n this.cause = cause;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * The JSON envelope that wraps every value persisted by the library.\n *\n * All values are stored as `JSON.stringify({ version, payload })`. The\n * `version` field tells the read path which schema to use for validating\n * the `payload`.\n *\n * - When no schema is active (codec-only mode), `version` is `0` and\n * `payload` is a codec-encoded string.\n * - When a schema is active, `version` corresponds to the schema version\n * and `payload` is the JSON value directly (not string-encoded).\n *\n * @internal\n */\nexport type MnemonicEnvelope = {\n /**\n * Schema version number.\n *\n * Non-negative integer. Any version (including `0`) may have a\n * registered {@link KeySchema}.\n */\n version: number;\n\n /**\n * The stored value.\n *\n * For schema-managed keys, this is a JSON value (object, array,\n * string, number, boolean, or null). For codec-managed keys, this\n * is a string produced by `Codec.encode`.\n */\n payload: unknown;\n};\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\n/**\n * Shared persistence primitives used by hook reads, optional\n * bridge decoding, and bootstrap recall.\n *\n * Keeping envelope parsing, schema lookup, and write encoding here ensures the\n * different entrypoints stay behaviorally aligned over time.\n */\n\nimport { CodecError } from \"./codecs\";\nimport { validateJsonSchema } from \"./json-schema\";\nimport { SchemaError, type MnemonicEnvelope } from \"./schema\";\nimport type { JsonSchema } from \"./json-schema\";\nimport type { Codec, KeySchema, MigrationPath, SchemaMode, SchemaRegistry } from \"./types\";\n\nfunction objectHasOwn(value: object, property: PropertyKey): boolean {\n const hasOwn = (Object as typeof Object & { hasOwn?: (target: object, key: PropertyKey) => boolean }).hasOwn;\n if (typeof hasOwn === \"function\") {\n return hasOwn(value, property);\n }\n return Object.getOwnPropertyDescriptor(value, property) !== undefined;\n}\n\n/**\n * Wraps a stored payload in the versioned mnemonic envelope format.\n */\nexport function serializeEnvelope(version: number, payload: unknown): string {\n return JSON.stringify({\n version,\n payload,\n } satisfies MnemonicEnvelope);\n}\n\n/**\n * Parses and validates a raw storage string as a mnemonic envelope.\n *\n * @throws {SchemaError} When the stored value is not valid JSON or does not\n * match the `{ version, payload }` envelope contract.\n */\nexport function parseEnvelope(key: string, rawText: string): MnemonicEnvelope {\n try {\n const parsed = JSON.parse(rawText) as MnemonicEnvelope;\n if (\n typeof parsed !== \"object\" ||\n parsed == null ||\n !Number.isInteger(parsed.version) ||\n parsed.version < 0 ||\n !objectHasOwn(parsed, \"payload\")\n ) {\n throw new SchemaError(\"INVALID_ENVELOPE\", `Invalid envelope for key \"${key}\"`);\n }\n return parsed;\n } catch (error) {\n if (error instanceof SchemaError) {\n throw error;\n }\n throw new SchemaError(\"INVALID_ENVELOPE\", `Invalid envelope for key \"${key}\"`, error);\n }\n}\n\n/**\n * Decodes a string payload using the active codec while normalizing thrown\n * errors to `CodecError`.\n */\nexport function decodeStringPayload<T>(key: string, payload: string, codec: Pick<Codec<T>, \"decode\">): T {\n try {\n return codec.decode(payload);\n } catch (error) {\n throw error instanceof CodecError ? error : new CodecError(`Codec decode failed for key \"${key}\"`, error);\n }\n}\n\n/**\n * Validates a decoded value against a JSON Schema and throws a typed\n * `SchemaError` when validation fails.\n */\nexport function validateAgainstSchema(key: string, value: unknown, jsonSchema: JsonSchema): void {\n const errors = validateJsonSchema(value, jsonSchema);\n if (errors.length === 0) {\n return;\n }\n const message = errors.map((entry) => `${entry.path || \"/\"}: ${entry.message}`).join(\"; \");\n throw new SchemaError(\"TYPE_MISMATCH\", `Schema validation failed for key \"${key}\": ${message}`);\n}\n\n/**\n * Looks up the latest registered schema for a key, if one exists.\n */\nexport function getLatestSchema(schemaRegistry: SchemaRegistry | undefined, key: string): KeySchema | undefined {\n return schemaRegistry?.getLatestSchema(key);\n}\n\n/**\n * Looks up the schema registered for a specific persisted version.\n */\nexport function getSchemaForVersion(\n schemaRegistry: SchemaRegistry | undefined,\n key: string,\n version: number,\n): KeySchema | undefined {\n return schemaRegistry?.getSchema(key, version);\n}\n\n/**\n * Resolves the migration path between two schema versions.\n */\nexport function getMigrationPath(\n schemaRegistry: SchemaRegistry | undefined,\n key: string,\n fromVersion: number,\n toVersion: number,\n): MigrationPath | null {\n return schemaRegistry?.getMigrationPath(key, fromVersion, toVersion) ?? null;\n}\n\n/**\n * Chooses the schema version that should govern an outgoing write.\n *\n * Explicit schema versions win when available. In non-strict modes the latest\n * known schema may be used as a fallback when the explicit version is missing.\n */\nexport function resolveTargetWriteSchema({\n key,\n explicitVersion,\n schemaMode,\n schemaRegistry,\n}: {\n key: string;\n explicitVersion: number | undefined;\n schemaMode: SchemaMode;\n schemaRegistry: SchemaRegistry | undefined;\n}): KeySchema | undefined {\n const latestSchema = getLatestSchema(schemaRegistry, key);\n if (explicitVersion === undefined) {\n return latestSchema;\n }\n\n const explicitSchema = getSchemaForVersion(schemaRegistry, key, explicitVersion);\n if (explicitSchema) {\n return explicitSchema;\n }\n\n return schemaMode === \"strict\" ? undefined : latestSchema;\n}\n\n/**\n * Encodes an outgoing value into its persisted envelope, applying optional\n * write-time migrations and schema validation first.\n */\nexport function encodePersistedValueForWrite<T>({\n key,\n nextValue,\n codec,\n explicitVersion,\n schemaMode,\n schemaRegistry,\n}: {\n key: string;\n nextValue: T;\n codec: Codec<T>;\n explicitVersion: number | undefined;\n schemaMode: SchemaMode;\n schemaRegistry: SchemaRegistry | undefined;\n}): string {\n const targetSchema = resolveTargetWriteSchema({\n key,\n explicitVersion,\n schemaMode,\n schemaRegistry,\n });\n\n if (!targetSchema) {\n if (explicitVersion !== undefined && schemaMode === \"strict\") {\n throw new SchemaError(\"WRITE_SCHEMA_REQUIRED\", `Write requires schema for key \"${key}\" in strict mode`);\n }\n return serializeEnvelope(0, codec.encode(nextValue));\n }\n\n let valueToStore: unknown = nextValue;\n const writeMigration = schemaRegistry?.getWriteMigration?.(key, targetSchema.version);\n if (writeMigration) {\n try {\n valueToStore = writeMigration.migrate(valueToStore);\n } catch (error) {\n throw error instanceof SchemaError\n ? error\n : new SchemaError(\"MIGRATION_FAILED\", `Write-time migration failed for key \"${key}\"`, error);\n }\n }\n\n validateAgainstSchema(key, valueToStore, targetSchema.schema);\n return serializeEnvelope(targetSchema.version, valueToStore);\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\n/**\n * Adapts a mounted provider into the optional-persistence bridge\n * contract used by `useMnemonicKeyOptional(...)`.\n *\n * This module mirrors the provider's persistence semantics closely so optional\n * consumers behave the same way once a real provider becomes available.\n */\n\nimport { CodecError, JSONCodec } from \"./codecs\";\nimport { inferJsonSchema } from \"./json-schema\";\nimport { SchemaError, type MnemonicEnvelope } from \"./schema\";\nimport {\n decodeStringPayload,\n encodePersistedValueForWrite,\n getLatestSchema,\n getMigrationPath,\n getSchemaForVersion,\n parseEnvelope,\n serializeEnvelope,\n validateAgainstSchema,\n} from \"./persistence-shared\";\nimport type { KeySchema, Mnemonic, OptionalMnemonicKeyOptions, SchemaRegistry } from \"./types\";\nimport type { MnemonicOptionalBridgeInternal, OptionalReadResult } from \"./optional-bridge\";\n\ntype OptionalBridgeConfig = {\n api: Mnemonic;\n schemaRegistry?: SchemaRegistry;\n};\n\nfunction resolveOptionalDefaultValue<T>(defaultValue: OptionalMnemonicKeyOptions<T>[\"defaultValue\"]): T {\n return typeof defaultValue === \"function\" ? (defaultValue as () => T)() : defaultValue;\n}\n\nfunction getSchemaCapabilities(schemaRegistry?: SchemaRegistry): boolean {\n return schemaRegistry !== undefined;\n}\n\nfunction buildFallbackResult<T>(options: OptionalMnemonicKeyOptions<T>): OptionalReadResult<T> {\n return {\n value: resolveOptionalDefaultValue(options.defaultValue),\n };\n}\n\nfunction encodeValueForWrite<T>(\n key: string,\n nextValue: T,\n options: OptionalMnemonicKeyOptions<T>,\n schemaMode: Mnemonic[\"schemaMode\"],\n schemaRegistry?: SchemaRegistry,\n): string {\n return encodePersistedValueForWrite({\n key,\n nextValue,\n codec: options.codec ?? JSONCodec,\n explicitVersion: options.schema?.version,\n schemaMode,\n schemaRegistry,\n });\n}\n\nfunction decodeCodecManagedEnvelope<T>(\n key: string,\n envelope: MnemonicEnvelope,\n options: OptionalMnemonicKeyOptions<T>,\n): OptionalReadResult<T> {\n if (typeof envelope.payload !== \"string\") {\n return {\n value: envelope.payload as T,\n };\n }\n\n return {\n value: decodeStringPayload(key, envelope.payload, options.codec ?? JSONCodec),\n };\n}\n\nfunction decodeAutoschemaEnvelope<T>(\n key: string,\n envelope: MnemonicEnvelope,\n options: OptionalMnemonicKeyOptions<T>,\n schemaRegistry: SchemaRegistry | undefined,\n): OptionalReadResult<T> {\n if (!schemaRegistry?.registerSchema) {\n throw new SchemaError(\n \"MODE_CONFIGURATION_INVALID\",\n `Autoschema mode requires schema registry registration for key \"${key}\"`,\n );\n }\n\n const decoded =\n typeof envelope.payload === \"string\"\n ? decodeStringPayload(key, envelope.payload, options.codec ?? JSONCodec)\n : (envelope.payload as T);\n const pendingSchema: KeySchema = {\n key,\n version: 1,\n schema: inferJsonSchema(decoded),\n };\n\n return {\n value: decoded,\n rewriteRaw: serializeEnvelope(pendingSchema.version, decoded),\n pendingSchema,\n };\n}\n\nfunction decodeSchemaManagedEnvelope<T>(\n key: string,\n envelope: MnemonicEnvelope,\n schemaForVersion: KeySchema,\n latestSchema: KeySchema | undefined,\n schemaRegistry: SchemaRegistry | undefined,\n): OptionalReadResult<T> {\n let current: unknown = envelope.payload;\n validateAgainstSchema(key, current, schemaForVersion.schema);\n\n if (!latestSchema || envelope.version >= latestSchema.version) {\n return {\n value: current as T,\n };\n }\n\n const path = getMigrationPath(schemaRegistry, key, envelope.version, latestSchema.version);\n if (!path) {\n throw new SchemaError(\n \"MIGRATION_PATH_NOT_FOUND\",\n `No migration path for key \"${key}\" from v${envelope.version} to v${latestSchema.version}`,\n );\n }\n\n for (const step of path) {\n current = step.migrate(current);\n }\n\n validateAgainstSchema(key, current, latestSchema.schema);\n return {\n value: current as T,\n rewriteRaw: serializeEnvelope(latestSchema.version, current),\n };\n}\n\nfunction decodePersistedValue<T>(\n key: string,\n raw: string | null,\n options: OptionalMnemonicKeyOptions<T>,\n api: Mnemonic,\n schemaRegistry?: SchemaRegistry,\n): OptionalReadResult<T> {\n if (raw == null) {\n return buildFallbackResult(options);\n }\n\n const envelope = parseEnvelope(key, raw);\n const latestSchema = getLatestSchema(schemaRegistry, key);\n const schemaForVersion = getSchemaForVersion(schemaRegistry, key, envelope.version);\n\n if (api.schemaMode === \"strict\" && !schemaForVersion) {\n throw new SchemaError(\"SCHEMA_NOT_FOUND\", `No schema for key \"${key}\" v${envelope.version}`);\n }\n\n if (api.schemaMode === \"autoschema\" && !schemaForVersion) {\n return decodeAutoschemaEnvelope(key, envelope, options, schemaRegistry);\n }\n\n if (!schemaForVersion) {\n return decodeCodecManagedEnvelope(key, envelope, options);\n }\n\n return decodeSchemaManagedEnvelope(key, envelope, schemaForVersion, latestSchema, schemaRegistry);\n}\n\n/**\n * Creates the bridge used by optional hooks to delegate persistence work to a\n * mounted `MnemonicProvider`.\n *\n * The bridge keeps optional consumers aligned with provider reads and writes,\n * including schema validation, migrations, autoschema inference, and raw\n * snapshot rewrites after successful decode.\n */\nexport function createMnemonicOptionalBridge({\n api,\n schemaRegistry,\n}: OptionalBridgeConfig): MnemonicOptionalBridgeInternal {\n return {\n namespace: api.prefix.endsWith(\".\") ? api.prefix.slice(0, -1) : api.prefix,\n capabilities: {\n persistence: true,\n schema: getSchemaCapabilities(schemaRegistry),\n },\n subscribeRaw: (key, listener) => api.subscribeRaw(key, listener),\n getRawSnapshot: (key) => api.getRawSnapshot(key),\n decodeSnapshot: (key, raw, options) => {\n try {\n return decodePersistedValue(key, raw, options, api, schemaRegistry);\n } catch {\n return buildFallbackResult(options);\n }\n },\n setValue: (key, nextValue, options) => {\n try {\n api.setRaw(key, encodeValueForWrite(key, nextValue, options, api.schemaMode, schemaRegistry));\n } catch (error) {\n if (error instanceof SchemaError) {\n console.error(`[Mnemonic] Schema error for key \"${key}\" (${error.code}):`, error.message);\n return;\n }\n if (error instanceof CodecError) {\n console.error(`[Mnemonic] Codec error for key \"${key}\":`, error.message);\n return;\n }\n throw error;\n }\n },\n removeValue: (key) => {\n api.removeRaw(key);\n },\n commitSnapshot: (key, raw, snapshot) => {\n if (snapshot.pendingSchema && schemaRegistry?.registerSchema) {\n if (!schemaRegistry.getSchema(snapshot.pendingSchema.key, snapshot.pendingSchema.version)) {\n try {\n schemaRegistry.registerSchema(snapshot.pendingSchema);\n } catch {\n // Ignore registration races; the next read/write enforces schema validity.\n }\n }\n }\n if (snapshot.rewriteRaw !== undefined && snapshot.rewriteRaw !== raw) {\n api.setRaw(key, snapshot.rewriteRaw);\n }\n },\n };\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { createContext, useContext } from \"react\";\nimport type { KeySchema, Listener, MnemonicOptionalBridge, OptionalMnemonicKeyOptions, Unsubscribe } from \"./types\";\n\nexport type OptionalReadResult<T> = {\n value: T;\n rewriteRaw?: string;\n pendingSchema?: KeySchema;\n};\n\nexport interface MnemonicOptionalBridgeInternal extends MnemonicOptionalBridge {\n subscribeRaw(key: string, listener: Listener): Unsubscribe;\n getRawSnapshot(key: string): string | null;\n decodeSnapshot<T>(key: string, raw: string | null, options: OptionalMnemonicKeyOptions<T>): OptionalReadResult<T>;\n setValue<T>(key: string, nextValue: T, options: OptionalMnemonicKeyOptions<T>): void;\n removeValue(key: string): void;\n commitSnapshot<T>(key: string, raw: string | null, snapshot: OptionalReadResult<T>): void;\n}\n\nexport const MnemonicOptionalBridgeContext = createContext<MnemonicOptionalBridgeInternal | null>(null);\n\nexport function useMnemonicOptionalBridge(): MnemonicOptionalBridgeInternal | null {\n return useContext(MnemonicOptionalBridgeContext);\n}\n\nexport function toPublicMnemonicOptionalBridge(\n bridge: MnemonicOptionalBridgeInternal | null,\n): MnemonicOptionalBridge | null {\n if (!bridge) {\n return null;\n }\n return {\n namespace: bridge.namespace,\n capabilities: bridge.capabilities,\n };\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { createElement, type ReactNode } from \"react\";\nimport { MnemonicOptionalBridgeContext } from \"./optional-bridge\";\nimport type { MnemonicOptionalBridgeInternal } from \"./optional-bridge\";\n\nexport interface MnemonicOptionalBridgeProviderProps {\n readonly bridge: MnemonicOptionalBridgeInternal;\n readonly children: ReactNode;\n}\n\nexport function MnemonicOptionalBridgeProvider({\n bridge,\n children,\n}: Readonly<MnemonicOptionalBridgeProviderProps>): ReactNode {\n return createElement(MnemonicOptionalBridgeContext.Provider, { value: bridge }, children);\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport type { StorageLike } from \"./types\";\n\ntype RuntimeProcess = { env?: { NODE_ENV?: string } };\n\nfunction getGlobalProcess(): RuntimeProcess | undefined {\n return (globalThis as { process?: RuntimeProcess }).process;\n}\n\n/**\n * Reads `process.env.NODE_ENV` when it is available in the current runtime.\n *\n * This stays tolerant of browser-only and edge runtimes where `process` may\n * be absent entirely.\n */\nexport function getRuntimeNodeEnv(): string | undefined {\n const runtimeProcess = getGlobalProcess();\n if (runtimeProcess?.env?.NODE_ENV !== undefined) {\n return runtimeProcess.env.NODE_ENV;\n }\n return undefined;\n}\n\n/**\n * Returns the browser's default persistent storage backend when it is\n * synchronously accessible.\n *\n * Access can fail in restricted browsing modes or server environments, so the\n * helper returns `undefined` instead of throwing.\n */\nexport function getDefaultBrowserStorage(): StorageLike | undefined {\n const globalWindow = (globalThis as { window?: Window }).window;\n if (globalWindow === undefined) return undefined;\n try {\n return globalWindow.localStorage;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Returns the native browser storage backends that are currently accessible.\n *\n * This is used for cross-tab sync detection and DevTools integration, so\n * blocked storages are ignored rather than surfaced as runtime errors.\n */\nexport function getNativeBrowserStorages(): StorageLike[] {\n const globalWindow = (globalThis as { window?: Window }).window;\n if (!globalWindow) return [];\n\n const storages: StorageLike[] = [];\n const addStorage = (getter: () => StorageLike) => {\n try {\n storages.push(getter());\n } catch {\n // Ignore blocked browser storage access and continue probing others.\n }\n };\n\n addStorage(() => globalWindow.localStorage);\n addStorage(() => globalWindow.sessionStorage);\n return storages;\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\n/**\n * @fileoverview React Context provider for persistent state management.\n *\n * This module exports the MnemonicProvider component and useMnemonic hook,\n * which together provide a namespace-scoped storage API to child components.\n * The provider creates an in-memory cache with read-through behavior to localStorage\n * (or a synchronous custom storage backend) and implements the React external\n * store contract.\n */\n\nimport { createContext, useContext, useMemo, useEffect, useRef, ReactNode } from \"react\";\nimport { createMnemonicOptionalBridge } from \"./optional-bridge-adapter\";\nimport { MnemonicOptionalBridgeProvider } from \"./optional-bridge-provider\";\nimport { getDefaultBrowserStorage, getNativeBrowserStorages, getRuntimeNodeEnv } from \"./runtime\";\nimport type { Mnemonic, MnemonicProviderOptions, StorageLike, Listener, Unsubscribe } from \"./types\";\n\n/**\n * React Context for the Mnemonic store.\n *\n * Provides access to the low-level storage API. Consumer code should use\n * `useMnemonicKey` instead of accessing this context directly.\n *\n * @internal\n */\nconst MnemonicContext = createContext<Mnemonic | null>(null);\nconst warnedNestedProviderStores = new WeakSet<Mnemonic>();\n\n/**\n * Hook to access the Mnemonic store from context.\n *\n * This is a low-level hook used internally by `useMnemonicKey`. Most applications\n * should use `useMnemonicKey` instead, which provides a higher-level, type-safe API.\n *\n * @returns The Mnemonic store instance\n *\n * @throws {Error} If called outside of a MnemonicProvider\n *\n * @example\n * ```tsx\n * // Internal usage (prefer useMnemonicKey for application code)\n * function MyComponent() {\n * const store = useMnemonic();\n * const raw = store.getRawSnapshot('myKey');\n * // ...\n * }\n * ```\n *\n * @see {@link useMnemonicKey} - Higher-level hook for application code\n * @see {@link MnemonicProvider} - Required provider component\n */\nexport function useMnemonic(): Mnemonic {\n const context = useMnemonicOptional();\n if (!context) {\n throw new Error(\"useMnemonic must be used within a MnemonicProvider\");\n }\n return context;\n}\n\n/**\n * Hook to access the Mnemonic store when one is available.\n *\n * Unlike {@link useMnemonic}, this hook never throws. It returns `null`\n * when no provider is mounted above the caller.\n */\nexport function useMnemonicOptional(): Mnemonic | null {\n return useContext(MnemonicContext);\n}\n\n/**\n * Props for the MnemonicProvider component.\n *\n * Extends MnemonicProviderOptions with required children prop.\n *\n * @see {@link MnemonicProviderOptions} - Configuration options\n * @see {@link MnemonicProvider} - Provider component\n */\nexport interface MnemonicProviderProps extends Readonly<MnemonicProviderOptions> {\n /**\n * React children to render within the provider.\n */\n readonly children: ReactNode;\n}\n\n/** Internal store type with reload capability, not exposed to consumers. */\ntype MnemonicInternal = Mnemonic & {\n reloadFromStorage: (changedKeys?: string[]) => void;\n};\n\n/** Internal store extension to retain a strong provider API reference while mounted. */\ntype MnemonicInternalWithDevToolsHold = MnemonicInternal & {\n __devToolsProviderApiHold?: DevToolsProviderApi;\n};\n\n/** Minimal WeakRef shape so we can compile against ES2020 libs. */\ntype WeakRefLike<T extends object> = {\n deref: () => T | undefined;\n};\n\ntype WeakRefConstructorLike = new <T extends object>(target: T) => WeakRefLike<T>;\n\ntype DevToolsProviderApi = {\n getStore: () => MnemonicInternal;\n dump: () => Record<string, string>;\n get: (key: string) => unknown;\n set: (key: string, value: unknown) => void;\n remove: (key: string) => void;\n clear: () => void;\n keys: () => string[];\n};\n\ntype DevToolsProviderEntry = {\n namespace: string;\n weakRef: WeakRefLike<DevToolsProviderApi>;\n registeredAt: number;\n lastSeenAt: number;\n staleSince: number | null;\n};\n\ntype DevToolsProviderDescriptor = {\n namespace: string;\n available: boolean;\n registeredAt: number;\n lastSeenAt: number;\n staleSince: number | null;\n};\n\ntype DevToolsRegistryRoot = {\n providers: Record<string, DevToolsProviderEntry>;\n resolve: (namespace: string) => DevToolsProviderApi | null;\n list: () => DevToolsProviderDescriptor[];\n capabilities: {\n weakRef: boolean;\n finalizationRegistry: boolean;\n };\n __meta: {\n version: number;\n lastUpdated: number;\n lastChange: string;\n };\n};\n\ntype DevToolsGlobalWindow = Window & {\n __REACT_MNEMONIC_DEVTOOLS__?: unknown;\n};\n\ntype StorageAccessCallbacks = {\n onAccessError: (error: unknown) => void;\n onAccessSuccess: () => void;\n onAsyncViolation: (method: \"getItem\" | \"setItem\" | \"removeItem\", thenable: PromiseLike<unknown>) => void;\n};\n\nfunction detectEnumerableStorage(storage: StorageLike | undefined): boolean {\n if (!storage) return false;\n try {\n return typeof storage.length === \"number\" && typeof storage.key === \"function\";\n } catch {\n return false;\n }\n}\n\nfunction isProductionRuntime(): boolean {\n const env = getRuntimeNodeEnv();\n if (env === undefined) {\n return true;\n }\n return env === \"production\";\n}\n\nfunction weakRefConstructor(): WeakRefConstructorLike | null {\n const ctor = (globalThis as { WeakRef?: unknown }).WeakRef;\n return typeof ctor === \"function\" ? (ctor as WeakRefConstructorLike) : null;\n}\n\nfunction hasFinalizationRegistry(): boolean {\n return typeof (globalThis as { FinalizationRegistry?: unknown }).FinalizationRegistry === \"function\";\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n if (value == null) return false;\n if (typeof value !== \"object\" && typeof value !== \"function\") return false;\n return typeof (value as { then?: unknown }).then === \"function\";\n}\n\nfunction getCrossTabSyncMode(\n requestedStorage: StorageLike | undefined,\n activeStorage: StorageLike | undefined,\n): NonNullable<Mnemonic[\"crossTabSyncMode\"]> {\n const isExplicitNativeBrowserStorage =\n activeStorage !== undefined &&\n requestedStorage !== undefined &&\n getNativeBrowserStorages().includes(activeStorage);\n if ((requestedStorage === undefined && activeStorage !== undefined) || isExplicitNativeBrowserStorage) {\n return \"browser-storage-event\";\n }\n if (typeof activeStorage?.onExternalChange === \"function\") {\n return \"custom-external-change\";\n }\n return \"none\";\n}\n\nfunction getDevToolsWindow(): DevToolsGlobalWindow | undefined {\n return (globalThis as { window?: DevToolsGlobalWindow }).window;\n}\n\nfunction sanitizeDevToolsRoot(root: Record<string, unknown>): void {\n const reserved = new Set([\"providers\", \"resolve\", \"list\", \"capabilities\", \"__meta\"]);\n for (const key of Object.keys(root)) {\n if (reserved.has(key)) continue;\n const descriptor = Object.getOwnPropertyDescriptor(root, key);\n if (descriptor && !descriptor.configurable) continue;\n try {\n delete root[key];\n } catch {\n // Ignore hostile legacy properties so devtools init stays fail-safe.\n }\n }\n}\n\nfunction ensureDevToolsRoot(enableDevTools: boolean): DevToolsRegistryRoot | null {\n if (!enableDevTools) return null;\n\n const globalWindow = getDevToolsWindow();\n if (!globalWindow) return null;\n\n const weakRefSupported = weakRefConstructor() !== null;\n const finalizationRegistrySupported = hasFinalizationRegistry();\n const existing = globalWindow.__REACT_MNEMONIC_DEVTOOLS__;\n const root: Record<string, unknown> =\n existing && typeof existing === \"object\" ? (existing as Record<string, unknown>) : {};\n\n sanitizeDevToolsRoot(root);\n\n if (!root.providers || typeof root.providers !== \"object\") {\n root.providers = {};\n }\n\n if (!root.capabilities || typeof root.capabilities !== \"object\") {\n root.capabilities = {};\n }\n\n const capabilities = root.capabilities as DevToolsRegistryRoot[\"capabilities\"];\n capabilities.weakRef = weakRefSupported;\n capabilities.finalizationRegistry = finalizationRegistrySupported;\n\n if (!root.__meta || typeof root.__meta !== \"object\") {\n root.__meta = {\n version: 0,\n lastUpdated: Date.now(),\n lastChange: \"\",\n };\n }\n\n const meta = root.__meta as DevToolsRegistryRoot[\"__meta\"];\n if (typeof meta.version !== \"number\" || !Number.isFinite(meta.version)) {\n meta.version = 0;\n }\n if (typeof meta.lastUpdated !== \"number\" || !Number.isFinite(meta.lastUpdated)) {\n meta.lastUpdated = Date.now();\n }\n if (typeof meta.lastChange !== \"string\") {\n meta.lastChange = \"\";\n }\n\n const providers = root.providers as Record<string, DevToolsProviderEntry>;\n if (typeof root.resolve !== \"function\") {\n root.resolve = (namespace: string): DevToolsProviderApi | null => {\n const entry = providers[namespace];\n if (!entry || typeof entry.weakRef?.deref !== \"function\") return null;\n\n const live = entry.weakRef.deref();\n if (live) {\n entry.lastSeenAt = Date.now();\n entry.staleSince = null;\n return live;\n }\n\n entry.staleSince ??= Date.now();\n return null;\n };\n }\n\n if (typeof root.list !== \"function\") {\n root.list = (): DevToolsProviderDescriptor[] =>\n Object.entries(providers)\n .map(([namespace, entry]) => {\n const live = typeof entry.weakRef?.deref === \"function\" ? entry.weakRef.deref() : undefined;\n const available = Boolean(live);\n if (available) {\n entry.lastSeenAt = Date.now();\n entry.staleSince = null;\n } else {\n entry.staleSince ??= Date.now();\n }\n return {\n namespace,\n available,\n registeredAt: entry.registeredAt,\n lastSeenAt: entry.lastSeenAt,\n staleSince: entry.staleSince,\n };\n })\n .sort((left, right) => left.namespace.localeCompare(right.namespace));\n }\n\n globalWindow.__REACT_MNEMONIC_DEVTOOLS__ = root;\n return root as DevToolsRegistryRoot;\n}\n\nfunction bumpDevToolsVersion(root: DevToolsRegistryRoot | null, namespace: string, reason: string): void {\n if (!root) return;\n root.__meta.version += 1;\n root.__meta.lastUpdated = Date.now();\n root.__meta.lastChange = `${namespace}.${reason}`;\n}\n\nfunction decodeDevToolsValue(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\nfunction readStorageRaw(\n storage: StorageLike | undefined,\n storageKey: string,\n callbacks: StorageAccessCallbacks,\n): string | null {\n if (!storage) return null;\n\n try {\n const raw = storage.getItem(storageKey);\n if (isPromiseLike(raw)) {\n callbacks.onAsyncViolation(\"getItem\", raw);\n return null;\n }\n callbacks.onAccessSuccess();\n return raw;\n } catch (error) {\n callbacks.onAccessError(error);\n return null;\n }\n}\n\nfunction enumerateNamespaceKeys(\n storage: StorageLike | undefined,\n prefix: string,\n callbacks: Pick<StorageAccessCallbacks, \"onAccessError\" | \"onAccessSuccess\">,\n): string[] {\n if (!storage) {\n return [];\n }\n\n const keys: string[] = [];\n try {\n const storageLength = storage.length;\n const getStorageKey = storage.key;\n if (typeof storageLength !== \"number\" || typeof getStorageKey !== \"function\") {\n return [];\n }\n for (let index = 0; index < storageLength; index++) {\n const fullKey = getStorageKey.call(storage, index);\n if (!fullKey?.startsWith(prefix)) continue;\n keys.push(fullKey.slice(prefix.length));\n }\n callbacks.onAccessSuccess();\n } catch (error) {\n callbacks.onAccessError(error);\n }\n return keys;\n}\n\nfunction syncCacheEntryFromStorage({\n key,\n storageKey,\n storage,\n cache,\n emit,\n callbacks,\n}: {\n key: string;\n storageKey: string;\n storage: StorageLike | undefined;\n cache: Map<string, string | null>;\n emit: (key: string) => void;\n callbacks: StorageAccessCallbacks;\n}): boolean {\n const fresh = readStorageRaw(storage, storageKey, callbacks);\n const cached = cache.get(key) ?? null;\n if (fresh === cached) {\n return false;\n }\n cache.set(key, fresh);\n emit(key);\n return true;\n}\n\nfunction reloadNamedKeysFromStorage({\n changedKeys,\n prefix,\n storage,\n listeners,\n cache,\n emit,\n callbacks,\n}: {\n changedKeys: string[];\n prefix: string;\n storage: StorageLike | undefined;\n listeners: Map<string, Set<Listener>>;\n cache: Map<string, string | null>;\n emit: (key: string) => void;\n callbacks: StorageAccessCallbacks;\n}): boolean {\n let changed = false;\n\n for (const fullStorageKey of changedKeys) {\n if (!fullStorageKey.startsWith(prefix)) continue;\n const key = fullStorageKey.slice(prefix.length);\n const listenerSet = listeners.get(key);\n if (listenerSet && listenerSet.size > 0) {\n changed =\n syncCacheEntryFromStorage({\n key,\n storageKey: fullStorageKey,\n storage,\n cache,\n emit,\n callbacks,\n }) || changed;\n continue;\n }\n if (cache.has(key)) {\n cache.delete(key);\n }\n }\n\n return changed;\n}\n\nfunction reloadSubscribedKeysFromStorage({\n prefix,\n storage,\n listeners,\n cache,\n emit,\n callbacks,\n}: {\n prefix: string;\n storage: StorageLike | undefined;\n listeners: Map<string, Set<Listener>>;\n cache: Map<string, string | null>;\n emit: (key: string) => void;\n callbacks: StorageAccessCallbacks;\n}): boolean {\n let changed = false;\n\n for (const [key, listenerSet] of listeners) {\n if (listenerSet.size === 0) continue;\n changed =\n syncCacheEntryFromStorage({\n key,\n storageKey: `${prefix}${key}`,\n storage,\n cache,\n emit,\n callbacks,\n }) || changed;\n }\n\n for (const key of cache.keys()) {\n const listenerSet = listeners.get(key);\n if (listenerSet && listenerSet.size > 0) continue;\n cache.delete(key);\n }\n\n return changed;\n}\n\nfunction createDevToolsProviderApi({\n store,\n dump,\n keys,\n readThrough,\n writeRaw,\n removeRaw,\n}: {\n store: MnemonicInternal;\n dump: () => Record<string, string>;\n keys: () => string[];\n readThrough: (key: string) => string | null;\n writeRaw: (key: string, raw: string) => void;\n removeRaw: (key: string) => void;\n}): DevToolsProviderApi {\n return {\n getStore: () => store,\n dump: () => {\n const data = dump();\n console.table(\n Object.entries(data).map(([key, value]) => ({\n key,\n value,\n decoded: decodeDevToolsValue(value),\n })),\n );\n return data;\n },\n get: (key: string) => {\n const raw = readThrough(key);\n if (raw == null) return undefined;\n return decodeDevToolsValue(raw);\n },\n set: (key: string, value: unknown) => {\n writeRaw(key, JSON.stringify(value));\n },\n remove: (key: string) => removeRaw(key),\n clear: () => {\n for (const key of keys()) {\n removeRaw(key);\n }\n },\n keys,\n };\n}\n\nfunction createReloadFromStorage({\n storage,\n hasAsyncContractViolation,\n prefix,\n listeners,\n cache,\n emit,\n callbacks,\n devToolsRoot,\n namespace,\n}: {\n storage: StorageLike | undefined;\n hasAsyncContractViolation: () => boolean;\n prefix: string;\n listeners: Map<string, Set<Listener>>;\n cache: Map<string, string | null>;\n emit: (key: string) => void;\n callbacks: StorageAccessCallbacks;\n devToolsRoot: DevToolsRegistryRoot | null;\n namespace: string;\n}): (changedKeys?: string[]) => void {\n return (changedKeys?: string[]) => {\n if (!storage || hasAsyncContractViolation()) return;\n if (changedKeys?.length === 0) return;\n\n const isFullReload = changedKeys === undefined;\n const changed = isFullReload\n ? reloadSubscribedKeysFromStorage({\n prefix,\n storage,\n listeners,\n cache,\n emit,\n callbacks,\n })\n : reloadNamedKeysFromStorage({\n changedKeys,\n prefix,\n storage,\n listeners,\n cache,\n emit,\n callbacks,\n });\n\n if (changed) {\n bumpDevToolsVersion(devToolsRoot, namespace, isFullReload ? \"reload:full\" : \"reload:granular\");\n }\n };\n}\n\nfunction registerDevToolsProvider({\n devToolsRoot,\n namespace,\n store,\n dump,\n keys,\n readThrough,\n writeRaw,\n removeRaw,\n}: {\n devToolsRoot: DevToolsRegistryRoot;\n namespace: string;\n store: MnemonicInternalWithDevToolsHold;\n dump: () => Record<string, string>;\n keys: () => string[];\n readThrough: (key: string) => string | null;\n writeRaw: (key: string, raw: string) => void;\n removeRaw: (key: string) => void;\n}): void {\n let infoMessage = `[Mnemonic DevTools] Namespace \"${namespace}\" available via window.__REACT_MNEMONIC_DEVTOOLS__.resolve(\"${namespace}\")`;\n\n if (!devToolsRoot.capabilities.weakRef) {\n console.info(\n `[Mnemonic DevTools] WeakRef is not available; registry provider \"${namespace}\" was not registered.`,\n );\n return;\n }\n\n const existingLive = devToolsRoot.resolve(namespace);\n if (existingLive) {\n const duplicateMessage = `[Mnemonic DevTools] Duplicate provider namespace \"${namespace}\" detected. Each window must have at most one live MnemonicProvider per namespace.`;\n if (!isProductionRuntime()) {\n throw new Error(duplicateMessage);\n }\n console.warn(`${duplicateMessage} Keeping the first provider and ignoring the duplicate.`);\n console.info(\n `[Mnemonic DevTools] Namespace \"${namespace}\" already registered. Keeping existing provider reference.`,\n );\n return;\n }\n\n const providerApi = createDevToolsProviderApi({\n store,\n dump,\n keys,\n readThrough,\n writeRaw,\n removeRaw,\n });\n const WeakRefCtor = weakRefConstructor();\n if (!WeakRefCtor) {\n console.info(`[Mnemonic DevTools] WeakRef became unavailable while registering \"${namespace}\".`);\n return;\n }\n\n // Keep a strong reference for the mounted provider lifetime.\n // The global registry still only exposes a WeakRef, but this\n // prevents premature collection while the provider is active.\n store.__devToolsProviderApiHold = providerApi;\n\n const now = Date.now();\n devToolsRoot.providers[namespace] = {\n namespace,\n weakRef: new WeakRefCtor(providerApi),\n registeredAt: now,\n lastSeenAt: now,\n staleSince: null,\n };\n bumpDevToolsVersion(devToolsRoot, namespace, \"registry:namespace-registered\");\n console.info(infoMessage);\n}\n\n/**\n * React Context provider for namespace-isolated persistent state.\n *\n * Creates a scoped storage environment where all keys are automatically prefixed\n * with the namespace to prevent collisions. Implements an in-memory cache with\n * read-through behavior to the underlying storage backend (localStorage by default).\n *\n * This provider must wrap any components that use `useMnemonicKey`. Multiple\n * providers with different namespaces can coexist in the same application.\n *\n * @param props - Provider configuration and children\n * @param props.children - React children to render within the provider\n * @param props.namespace - Unique namespace for isolating storage keys\n * @param props.storage - Optional synchronous custom storage backend (defaults to localStorage)\n * @param props.enableDevTools - Enable DevTools debugging interface (defaults to false)\n * @param props.schemaMode - Schema enforcement mode (default: \"default\")\n * @param props.schemaRegistry - Optional schema registry for storing schemas and migrations\n * @param props.ssr - Optional SSR defaults for descendant hooks\n *\n * @example\n * ```tsx\n * // Basic usage with default settings\n * function App() {\n * return (\n * <MnemonicProvider namespace=\"myApp\">\n * <MyComponents />\n * </MnemonicProvider>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With a synchronous custom storage backend\n * function App() {\n * return (\n * <MnemonicProvider\n * namespace=\"myApp\"\n * storage={window.sessionStorage}\n * >\n * <MyComponents />\n * </MnemonicProvider>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With DevTools enabled (development only)\n * function App() {\n * return (\n * <MnemonicProvider\n * namespace=\"myApp\"\n * enableDevTools={process.env.NODE_ENV === 'development'}\n * >\n * <MyComponents />\n * </MnemonicProvider>\n * );\n * }\n *\n * // Then in browser console:\n * const dt = window.__REACT_MNEMONIC_DEVTOOLS__.resolve('myApp')\n * dt?.dump()\n * dt?.get('user')\n * dt?.set('theme', 'dark')\n * ```\n *\n * @example\n * ```tsx\n * // Multiple providers with different namespaces\n * function App() {\n * return (\n * <MnemonicProvider namespace=\"user-prefs\">\n * <UserSettings />\n * <MnemonicProvider namespace=\"app-state\">\n * <Dashboard />\n * </MnemonicProvider>\n * </MnemonicProvider>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Delay persisted storage reads until after client mount\n * function App() {\n * return (\n * <MnemonicProvider\n * namespace=\"myApp\"\n * ssr={{ hydration: \"client-only\" }}\n * >\n * <MyComponents />\n * </MnemonicProvider>\n * );\n * }\n * ```\n *\n * @remarks\n * - Creates a stable store instance that only recreates when namespace, storage, or enableDevTools change\n * - All storage operations are cached in memory for fast reads\n * - Storage failures are handled gracefully (logged but not thrown)\n * - `StorageLike` is intentionally synchronous for v1; async persistence must sit behind a sync facade\n * - In SSR environments, the provider is safe by default: hooks render\n * `defaultValue` unless configured with an explicit `ssr.serverValue`\n * - The store implements React's useSyncExternalStore contract for efficient updates\n *\n * @see {@link useMnemonicKey} - Hook for using persistent state\n * @see {@link MnemonicProviderOptions} - Configuration options\n */\nexport function MnemonicProvider({\n children,\n namespace,\n storage,\n enableDevTools = false,\n schemaMode = \"default\",\n schemaRegistry,\n ssr,\n bootstrap,\n}: MnemonicProviderProps) {\n if (schemaMode === \"strict\" && !schemaRegistry) {\n throw new Error(\"MnemonicProvider strict mode requires schemaRegistry\");\n }\n if (schemaMode === \"autoschema\" && typeof schemaRegistry?.registerSchema !== \"function\") {\n throw new Error(\"MnemonicProvider autoschema mode requires schemaRegistry.registerSchema\");\n }\n\n const prefix = `${namespace}.`;\n const parentStore = useMnemonicOptional();\n const bootstrapRawSeed = useRef(bootstrap?.raw).current;\n\n useEffect(() => {\n if (isProductionRuntime()) return;\n if (parentStore?.prefix !== prefix) return;\n if (warnedNestedProviderStores.has(parentStore)) return;\n\n warnedNestedProviderStores.add(parentStore);\n console.warn(\n `[Mnemonic] Nested MnemonicProvider detected for namespace \"${namespace}\". ` +\n \"The nearest provider wins, so the inner provider creates a separate store \" +\n \"and cache even though the namespace matches. Prefer a single provider per \" +\n \"namespace, or use distinct namespaces for intentionally separate scopes.\",\n );\n }, [namespace, parentStore, prefix]);\n\n const store = useMemo<MnemonicInternal>(() => {\n const st = storage ?? getDefaultBrowserStorage();\n const ssrHydration = ssr?.hydration ?? \"immediate\";\n const devToolsRoot = ensureDevToolsRoot(enableDevTools);\n const canEnumerateKeys = detectEnumerableStorage(st);\n const crossTabSyncMode = getCrossTabSyncMode(storage, st);\n\n /**\n * In-memory cache of raw string values.\n * Maps unprefixed keys to their raw string values (or null if not present).\n * Provides fast reads without hitting storage on every access.\n *\n * Bootstrap seeds only populate confirmed raw strings. Confirmed\n * absences (`null`) are allowed in bootstrap snapshots, but the\n * provider revalidates them on first access so a value written between\n * bootstrap and mount is not missed.\n */\n const cache = new Map<string, string | null>();\n if (bootstrapRawSeed) {\n for (const [key, raw] of Object.entries(bootstrapRawSeed)) {\n if (raw != null) {\n cache.set(key, raw);\n }\n }\n }\n\n /**\n * Per-key listener registry.\n * Maps unprefixed keys to sets of listener functions.\n * Used to notify React components when values change.\n */\n const listeners = new Map<string, Set<Listener>>();\n\n /** Whether a QuotaExceededError has already been logged since the last successful write. */\n let quotaErrorLogged = false;\n\n /** Whether a non-quota DOMException has already been logged since the last successful storage access. */\n let accessErrorLogged = false;\n\n /** Whether the storage backend has violated the synchronous StorageLike contract. */\n let asyncContractViolationDetected = false;\n const storageAccessCallbacks: StorageAccessCallbacks = {\n onAccessError: (err) => logAccessError(err),\n onAccessSuccess: () => {\n accessErrorLogged = false;\n },\n onAsyncViolation: (method, thenable) => handleAsyncStorageContractViolation(method, thenable),\n };\n\n /**\n * Converts an unprefixed key to a fully-qualified storage key.\n *\n * @param key - Unprefixed key\n * @returns Prefixed key with namespace\n */\n const fullKey = (key: string) => prefix + key;\n\n /**\n * Notifies all listeners subscribed to a specific key.\n * Called after mutations (set/remove) to trigger React re-renders.\n *\n * @param key - Unprefixed key that changed\n */\n const emit = (key: string) => {\n const set = listeners.get(key);\n if (!set) return;\n for (const fn of set) fn();\n };\n\n /**\n * Logs a storage-access DOMException once, squelching repeats until\n * a successful storage operation resets the flag. Ignores\n * QuotaExceededError (handled separately in writeRaw) and silently\n * swallows all non-DOMException errors.\n */\n const logAccessError = (err: unknown): void => {\n if (!accessErrorLogged && err instanceof DOMException && err.name !== \"QuotaExceededError\") {\n console.error(\n `[Mnemonic] Storage access error (${err.name}): ${err.message}. ` +\n \"Data is cached in memory but may not persist.\",\n );\n accessErrorLogged = true;\n }\n };\n\n /**\n * Marks the storage backend as incompatible with the synchronous\n * StorageLike contract, consumes the offending thenable to avoid\n * unhandled rejections, and logs the problem once.\n */\n const handleAsyncStorageContractViolation = (\n method: \"getItem\" | \"setItem\" | \"removeItem\",\n thenable: PromiseLike<unknown>,\n ): void => {\n asyncContractViolationDetected = true;\n void Promise.resolve(thenable).catch(() => undefined);\n if (accessErrorLogged) return;\n console.error(\n `[Mnemonic] StorageLike.${method} returned a Promise. ` +\n \"StorageLike must remain synchronous for react-mnemonic v1. \" +\n \"Wrap async persistence behind a synchronous cache facade instead.\",\n );\n accessErrorLogged = true;\n };\n\n /**\n * Read-through cache accessor.\n * Returns cached value if available, otherwise reads from storage and caches.\n *\n * @param key - Unprefixed key to read\n * @returns Raw string value, or null if not present\n */\n const readThrough = (key: string): string | null => {\n if (cache.has(key)) return cache.get(key) ?? null;\n if (!st || asyncContractViolationDetected) {\n cache.set(key, null);\n return null;\n }\n const raw = readStorageRaw(st, fullKey(key), storageAccessCallbacks);\n cache.set(key, raw);\n return raw;\n };\n\n /**\n * Writes a raw string value to both cache and storage.\n * Notifies listeners after the write completes.\n *\n * @param key - Unprefixed key to write\n * @param raw - Raw string value to store\n */\n const writeRaw = (key: string, raw: string) => {\n cache.set(key, raw);\n if (st && !asyncContractViolationDetected) {\n try {\n const result = st.setItem(fullKey(key), raw);\n if (isPromiseLike(result)) {\n handleAsyncStorageContractViolation(\"setItem\", result);\n } else {\n quotaErrorLogged = false;\n accessErrorLogged = false;\n }\n } catch (err) {\n if (!quotaErrorLogged && err instanceof DOMException && err.name === \"QuotaExceededError\") {\n console.error(\n `[Mnemonic] Storage quota exceeded writing key \"${key}\". ` +\n \"Data is cached in memory but will not persist.\",\n );\n quotaErrorLogged = true;\n }\n logAccessError(err);\n }\n }\n emit(key);\n bumpDevToolsVersion(devToolsRoot, namespace, `set:${key}`);\n };\n\n /**\n * Removes a key from both cache and storage.\n * Notifies listeners after the removal completes.\n *\n * @param key - Unprefixed key to remove\n */\n const removeRaw = (key: string) => {\n cache.set(key, null);\n if (st && !asyncContractViolationDetected) {\n try {\n const result = st.removeItem(fullKey(key));\n if (isPromiseLike(result)) {\n handleAsyncStorageContractViolation(\"removeItem\", result);\n } else {\n accessErrorLogged = false;\n }\n } catch (err) {\n logAccessError(err);\n }\n }\n emit(key);\n bumpDevToolsVersion(devToolsRoot, namespace, `remove:${key}`);\n };\n\n /**\n * Subscribes a listener to changes for a specific key.\n * Implements the React external store subscription contract.\n *\n * @param key - Unprefixed key to subscribe to\n * @param listener - Callback invoked when the value changes\n * @returns Unsubscribe function\n */\n const subscribeRaw = (key: string, listener: Listener): Unsubscribe => {\n let set = listeners.get(key);\n if (!set) {\n set = new Set();\n listeners.set(key, set);\n }\n set.add(listener);\n\n // Ensure cache is primed so snapshots are stable.\n readThrough(key);\n\n return () => {\n const s = listeners.get(key);\n if (!s) return;\n s.delete(listener);\n if (s.size === 0) listeners.delete(key);\n };\n };\n\n /**\n * Gets the current snapshot of a key's raw value.\n * Implements the React external store snapshot contract.\n *\n * @param key - Unprefixed key to read\n * @returns Raw string value, or null if not present\n */\n const getRawSnapshot = (key: string) => readThrough(key);\n\n /**\n * Enumerates all keys in this namespace.\n * Iterates through storage and filters keys by namespace prefix.\n *\n * @returns Array of unprefixed key names\n */\n const keys = () => {\n if (asyncContractViolationDetected) {\n return Array.from(cache.entries())\n .filter(([, value]) => value != null)\n .map(([key]) => key);\n }\n if (!canEnumerateKeys) return [];\n return enumerateNamespaceKeys(st, prefix, storageAccessCallbacks);\n };\n\n /**\n * Dumps all key-value pairs in this namespace.\n * Useful for debugging and DevTools integration.\n *\n * @returns Object mapping unprefixed keys to raw string values\n */\n const dump = () => {\n const out: Record<string, string> = {};\n for (const k of keys()) {\n const raw = readThrough(k);\n if (raw != null) out[k] = raw;\n }\n return out;\n };\n\n /**\n * Re-reads keys from the underlying storage, updating the cache and\n * emitting change notifications for any keys whose values differ.\n *\n * @param changedKeys - Optional array of fully-qualified storage keys\n * that changed. When undefined, performs a blanket reload of all\n * actively subscribed keys. When an empty array, does nothing.\n *\n * Called by the onExternalChange subscription when the storage adapter\n * signals that data has changed externally (e.g., from another tab).\n */\n const reloadFromStorage = createReloadFromStorage({\n storage: st,\n hasAsyncContractViolation: () => asyncContractViolationDetected,\n prefix,\n listeners,\n cache,\n emit,\n callbacks: storageAccessCallbacks,\n devToolsRoot,\n namespace,\n });\n\n /**\n * The Mnemonic store API object.\n * Implements the contract expected by useSyncExternalStore.\n */\n const store: MnemonicInternalWithDevToolsHold = {\n prefix,\n canEnumerateKeys,\n subscribeRaw,\n getRawSnapshot,\n setRaw: writeRaw,\n removeRaw,\n keys,\n dump,\n reloadFromStorage,\n schemaMode,\n ssrHydration,\n crossTabSyncMode,\n ...(schemaRegistry ? { schemaRegistry } : {}),\n };\n\n /**\n * DevTools integration.\n * Exposes a weak-provider registry on the window object when enabled.\n */\n if (devToolsRoot) {\n registerDevToolsProvider({\n devToolsRoot,\n namespace,\n store,\n dump,\n keys,\n readThrough,\n writeRaw,\n removeRaw,\n });\n }\n\n return store;\n }, [namespace, storage, enableDevTools, schemaMode, schemaRegistry, ssr?.hydration, bootstrapRawSeed]);\n\n const optionalBridge = useMemo(\n () =>\n createMnemonicOptionalBridge({\n api: store,\n ...(schemaRegistry ? { schemaRegistry } : {}),\n }),\n [schemaRegistry, store],\n );\n\n // Subscribe to external storage changes (e.g., cross-tab BroadcastChannel)\n useEffect(() => {\n if (!storage?.onExternalChange) return;\n return storage.onExternalChange((changedKeys) => store.reloadFromStorage(changedKeys));\n }, [storage, store]);\n\n return (\n <MnemonicContext.Provider value={store}>\n <MnemonicOptionalBridgeProvider bridge={optionalBridge}>{children}</MnemonicOptionalBridgeProvider>\n </MnemonicContext.Provider>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { useSyncExternalStore, useMemo, useEffect, useRef, useCallback, useState } from \"react\";\nimport { useMnemonic } from \"./provider\";\nimport { JSONCodec, CodecError } from \"./codecs\";\nimport {\n decodeStringPayload as decodePersistedStringPayload,\n parseEnvelope as parsePersistedEnvelope,\n} from \"./persistence-shared\";\nimport { SchemaError, type MnemonicEnvelope } from \"./schema\";\nimport { getRuntimeNodeEnv } from \"./runtime\";\nimport type { Mnemonic, MnemonicKeyDescriptor, MnemonicKeyState, UseMnemonicKeyOptions } from \"./types\";\n\nexport type ReadResult<T, Extra extends object = {}> = {\n value: T;\n rewriteRaw?: string;\n} & Extra;\n\ntype SharedMnemonicKeyContext<T> = {\n api: Mnemonic;\n key: string;\n codec: NonNullable<UseMnemonicKeyOptions<T>[\"codec\"]>;\n codecOpt: UseMnemonicKeyOptions<T>[\"codec\"];\n schema: UseMnemonicKeyOptions<T>[\"schema\"];\n reconcile: UseMnemonicKeyOptions<T>[\"reconcile\"];\n onMount: UseMnemonicKeyOptions<T>[\"onMount\"];\n onChange: UseMnemonicKeyOptions<T>[\"onChange\"];\n listenCrossTab: UseMnemonicKeyOptions<T>[\"listenCrossTab\"];\n getFallback: (error?: CodecError | SchemaError) => T;\n getServerValue: () => T;\n parseEnvelope: (rawText: string) =>\n | {\n ok: true;\n envelope: MnemonicEnvelope;\n }\n | {\n ok: false;\n error: SchemaError;\n };\n decodeStringPayload: <V>(payload: string, activeCodec: { decode: (encoded: string) => V }) => V;\n buildFallbackResult: <Extra extends object = {}>(\n error?: CodecError | SchemaError,\n extra?: Extra,\n ) => ReadResult<T, Extra>;\n developmentRuntime: boolean;\n contractFingerprint: string | null;\n hasMounted: boolean;\n setHasMounted: (value: boolean) => void;\n hydrationMode: NonNullable<UseMnemonicKeyOptions<T>[\"ssr\"]>[\"hydration\"] | undefined;\n ssrOptions: UseMnemonicKeyOptions<T>[\"ssr\"];\n};\n\ntype UseMnemonicKeyStateConfig<T, Extra extends object> = {\n decodeForRead: (rawText: string | null) => ReadResult<T, Extra>;\n encodeForWrite: (nextValue: T) => string;\n active?: boolean;\n additionalDevWarnings?: (args: {\n api: Mnemonic;\n key: string;\n listenCrossTab: UseMnemonicKeyOptions<T>[\"listenCrossTab\"];\n codecOpt: UseMnemonicKeyOptions<T>[\"codec\"];\n schema: UseMnemonicKeyOptions<T>[\"schema\"];\n warnOnce: (id: string, message: string) => void;\n }) => void;\n onDecodedEffect?: (decoded: ReadResult<T, Extra>) => void;\n};\n\ntype ApplyReconcileArgs<T, Extra extends object> = {\n value: T;\n rewriteRaw?: string;\n extra?: Extra;\n persistedVersion: number;\n latestVersion?: number;\n serializeForPersist: (value: T) => string;\n deriveExtra?: (value: T, extra?: Extra) => Extra | undefined;\n};\n\nconst SSR_SNAPSHOT_TOKEN = Symbol(\"mnemonic:ssr-snapshot\");\nconst diagnosticContractRegistry = new WeakMap<object, Map<string, string>>();\nconst diagnosticWarningRegistry = new WeakMap<object, Set<string>>();\nconst diagnosticObjectIds = new WeakMap<object, number>();\nlet nextDiagnosticObjectId = 1;\n\n/**\n * Re-export the shared envelope serializer so hook reads and writes stay\n * aligned with bootstrap recall and optional bridge persistence.\n */\nexport { serializeEnvelope } from \"./persistence-shared\";\n\n/**\n * Attaches optional persistence metadata to a decoded value.\n */\nexport function withReadMetadata<T, Extra extends object = {}>(\n value: T,\n rewriteRaw?: string,\n extra?: Extra,\n): ReadResult<T, Extra> {\n const result = { value } as ReadResult<T, Extra>;\n if (extra !== undefined) {\n Object.assign(result, extra);\n }\n if (rewriteRaw !== undefined) result.rewriteRaw = rewriteRaw;\n return result;\n}\n\nfunction isDevelopmentRuntime(): boolean {\n return getRuntimeNodeEnv() === \"development\";\n}\n\nfunction getDiagnosticWarnings(api: object): Set<string> {\n let warnings = diagnosticWarningRegistry.get(api);\n if (!warnings) {\n warnings = new Set<string>();\n diagnosticWarningRegistry.set(api, warnings);\n }\n return warnings;\n}\n\nfunction warnOnce(api: object, id: string, message: string): void {\n const warnings = getDiagnosticWarnings(api);\n if (warnings.has(id)) return;\n warnings.add(id);\n console.warn(message);\n}\n\nfunction stableDiagnosticValue(value: unknown): string {\n if (typeof value === \"function\") {\n const source = Function.prototype.toString.call(value).split(/\\s+/).join(\" \").trim();\n const name = value.name || \"anonymous\";\n return `[factory:${name}/${value.length}:${source}]`;\n }\n if (typeof value === \"bigint\") return `${value.toString()}n`;\n if (typeof value === \"symbol\") return value.toString();\n if (value === undefined) return \"undefined\";\n try {\n return JSON.stringify(value);\n } catch {\n const tag = Object.prototype.toString.call(value);\n if (value !== null && (typeof value === \"object\" || typeof value === \"function\")) {\n return `${tag}#${getDiagnosticObjectId(value)}`;\n }\n return tag;\n }\n}\n\nfunction isObjectLike(value: unknown): value is object {\n return value !== null && (typeof value === \"object\" || typeof value === \"function\");\n}\n\nfunction getDiagnosticObjectId(value: object): number {\n const existing = diagnosticObjectIds.get(value);\n if (existing !== undefined) return existing;\n const id = nextDiagnosticObjectId++;\n diagnosticObjectIds.set(value, id);\n return id;\n}\n\nfunction buildContractFingerprint<T>({\n api,\n key,\n defaultValue,\n codecOpt,\n schemaVersion,\n reconcile,\n listenCrossTab,\n ssrOptions,\n}: {\n api: object;\n key: string;\n defaultValue: UseMnemonicKeyOptions<T>[\"defaultValue\"];\n codecOpt: UseMnemonicKeyOptions<T>[\"codec\"];\n schemaVersion?: number;\n reconcile: UseMnemonicKeyOptions<T>[\"reconcile\"];\n listenCrossTab: UseMnemonicKeyOptions<T>[\"listenCrossTab\"];\n ssrOptions: UseMnemonicKeyOptions<T>[\"ssr\"];\n}): string {\n const codecSignature =\n codecOpt == null || !isObjectLike(codecOpt)\n ? \"default-json-codec\"\n : `codec:${stableDiagnosticValue((codecOpt as { encode?: unknown }).encode)}:${stableDiagnosticValue((codecOpt as { decode?: unknown }).decode)}`;\n const reconcileSignature =\n reconcile == null || !isObjectLike(reconcile)\n ? \"no-reconcile\"\n : `reconcile:${stableDiagnosticValue(reconcile)}`;\n\n return JSON.stringify({\n key,\n defaultValue: stableDiagnosticValue(defaultValue),\n codec: codecSignature,\n schemaVersion: schemaVersion ?? null,\n listenCrossTab: Boolean(listenCrossTab),\n reconcile: reconcileSignature,\n ssrHydration: ssrOptions?.hydration ?? null,\n hasServerValue: ssrOptions?.serverValue !== undefined,\n providerHydration: (api as { ssrHydration?: string }).ssrHydration ?? null,\n });\n}\n\nexport function resolveMnemonicKeyArgs<T>(\n keyOrDescriptor: string | MnemonicKeyDescriptor<T, string>,\n options?: UseMnemonicKeyOptions<T>,\n): MnemonicKeyDescriptor<T, string> {\n if (typeof keyOrDescriptor !== \"string\") {\n return keyOrDescriptor;\n }\n if (!options) {\n throw new Error(\"useMnemonicKey requires options when called with a string key\");\n }\n return {\n key: keyOrDescriptor,\n options,\n };\n}\n\nexport function useMnemonicKeyShared<T>(\n keyOrDescriptor: string | MnemonicKeyDescriptor<T, string>,\n options: UseMnemonicKeyOptions<T> | undefined,\n schemaVersion?: number,\n): SharedMnemonicKeyContext<T> {\n return useMnemonicKeySharedFromApi(useMnemonic(), keyOrDescriptor, options, schemaVersion);\n}\n\nexport function useMnemonicKeySharedFromApi<T>(\n api: Mnemonic,\n keyOrDescriptor: string | MnemonicKeyDescriptor<T, string>,\n options: UseMnemonicKeyOptions<T> | undefined,\n schemaVersion?: number,\n): SharedMnemonicKeyContext<T> {\n const descriptor = resolveMnemonicKeyArgs(keyOrDescriptor, options);\n const key = descriptor.key;\n const resolvedOptions = descriptor.options;\n\n const {\n defaultValue,\n onMount,\n onChange,\n listenCrossTab,\n codec: codecOpt,\n schema,\n reconcile,\n ssr: ssrOptions,\n } = resolvedOptions;\n\n const codec = codecOpt ?? JSONCodec;\n const hydrationMode = ssrOptions?.hydration ?? api.ssrHydration;\n const [hasMounted, setHasMounted] = useState(hydrationMode !== \"client-only\");\n const developmentRuntime = isDevelopmentRuntime();\n const contractFingerprint = useMemo(\n () =>\n developmentRuntime\n ? buildContractFingerprint({\n api,\n key,\n defaultValue,\n codecOpt,\n ...(schemaVersion === undefined ? {} : { schemaVersion }),\n reconcile,\n listenCrossTab,\n ssrOptions,\n })\n : null,\n [\n developmentRuntime,\n api,\n key,\n defaultValue,\n codecOpt,\n schemaVersion,\n reconcile,\n listenCrossTab,\n ssrOptions?.hydration,\n ssrOptions?.serverValue,\n ],\n );\n\n const getFallback = useCallback(\n (error?: CodecError | SchemaError) =>\n typeof defaultValue === \"function\"\n ? (defaultValue as (error?: CodecError | SchemaError) => T)(error)\n : defaultValue,\n [defaultValue],\n );\n\n const getServerValue = useCallback(() => {\n const serverValue = ssrOptions?.serverValue;\n if (serverValue === undefined) {\n return getFallback();\n }\n return typeof serverValue === \"function\" ? (serverValue as () => T)() : serverValue;\n }, [getFallback, ssrOptions?.serverValue]);\n\n const parseEnvelope = useCallback(\n (rawText: string): { ok: true; envelope: MnemonicEnvelope } | { ok: false; error: SchemaError } => {\n try {\n return { ok: true, envelope: parsePersistedEnvelope(key, rawText) };\n } catch (error) {\n return {\n ok: false,\n error:\n error instanceof SchemaError\n ? error\n : new SchemaError(\"INVALID_ENVELOPE\", `Invalid envelope for key \"${key}\"`, error),\n };\n }\n },\n [key],\n );\n\n const decodeStringPayload = useCallback(\n <V>(payload: string, activeCodec: { decode: (encoded: string) => V }) => {\n return decodePersistedStringPayload(key, payload, activeCodec);\n },\n [key],\n );\n\n const buildFallbackResult = useCallback(\n <Extra extends object = {}>(error?: CodecError | SchemaError, extra?: Extra): ReadResult<T, Extra> => {\n return withReadMetadata(getFallback(error), undefined, extra);\n },\n [getFallback],\n );\n\n return {\n api,\n key,\n codec,\n codecOpt,\n schema,\n reconcile,\n onMount,\n onChange,\n listenCrossTab,\n getFallback,\n getServerValue,\n parseEnvelope,\n decodeStringPayload,\n buildFallbackResult,\n developmentRuntime,\n contractFingerprint,\n hasMounted,\n setHasMounted,\n hydrationMode,\n ssrOptions,\n };\n}\n\nexport function useApplyReconcile<T, Extra extends object = {}>({\n key,\n reconcile,\n buildFallbackResult,\n}: {\n key: string;\n reconcile: UseMnemonicKeyOptions<T>[\"reconcile\"];\n buildFallbackResult: <ResultExtra extends object = {}>(\n error?: CodecError | SchemaError,\n extra?: ResultExtra,\n ) => ReadResult<T, ResultExtra>;\n}) {\n return useCallback(\n ({\n value,\n rewriteRaw,\n extra,\n persistedVersion,\n latestVersion,\n serializeForPersist,\n deriveExtra,\n }: ApplyReconcileArgs<T, Extra>): ReadResult<T, Extra> => {\n if (!reconcile) {\n return withReadMetadata(value, rewriteRaw, extra);\n }\n\n const context: { key: string; persistedVersion: number; latestVersion?: number } = {\n key,\n persistedVersion,\n };\n if (latestVersion !== undefined) {\n context.latestVersion = latestVersion;\n }\n\n const baselineSerialized = (() => {\n try {\n return serializeForPersist(value);\n } catch {\n return rewriteRaw;\n }\n })();\n\n try {\n const reconciled = reconcile(value, context);\n const nextExtra = deriveExtra ? deriveExtra(reconciled, extra) : extra;\n const nextSerialized = serializeForPersist(reconciled);\n const nextRewriteRaw =\n baselineSerialized === undefined || nextSerialized !== baselineSerialized\n ? nextSerialized\n : rewriteRaw;\n return withReadMetadata(reconciled, nextRewriteRaw, nextExtra);\n } catch (err) {\n const typedErr =\n err instanceof SchemaError\n ? err\n : new SchemaError(\"RECONCILE_FAILED\", `Reconciliation failed for key \"${key}\"`, err);\n return buildFallbackResult(typedErr, extra);\n }\n },\n [buildFallbackResult, key, reconcile],\n );\n}\n\nexport function useMnemonicKeyState<T, Extra extends object>(\n shared: SharedMnemonicKeyContext<T>,\n config: UseMnemonicKeyStateConfig<T, Extra>,\n): MnemonicKeyState<T> {\n const {\n api,\n key,\n codecOpt,\n schema,\n onMount,\n onChange,\n listenCrossTab,\n getFallback,\n getServerValue,\n developmentRuntime,\n contractFingerprint,\n hasMounted,\n setHasMounted,\n hydrationMode,\n ssrOptions,\n } = shared;\n const { decodeForRead, encodeForWrite, active = true, additionalDevWarnings, onDecodedEffect } = config;\n\n const getServerRawSnapshot = useCallback(\n (): string | typeof SSR_SNAPSHOT_TOKEN | null =>\n ssrOptions?.serverValue === undefined ? null : SSR_SNAPSHOT_TOKEN,\n [ssrOptions?.serverValue],\n );\n\n const deferStorageRead = hydrationMode === \"client-only\" && !hasMounted;\n const subscribe = useCallback(\n (listener: () => void) => {\n if (!active) {\n return () => undefined;\n }\n if (deferStorageRead) {\n return () => undefined;\n }\n return api.subscribeRaw(key, listener);\n },\n [active, api, deferStorageRead, key],\n );\n\n const raw = useSyncExternalStore(\n subscribe,\n () => (active && !deferStorageRead ? api.getRawSnapshot(key) : getServerRawSnapshot()),\n getServerRawSnapshot,\n );\n\n const decoded = useMemo(() => {\n if (raw === SSR_SNAPSHOT_TOKEN) {\n return withReadMetadata<T, Extra>(getServerValue());\n }\n return decodeForRead(raw);\n }, [decodeForRead, getServerValue, raw]);\n const value = decoded.value;\n\n useEffect(() => {\n if (!active) return;\n if (!developmentRuntime) return;\n\n const globalWindow = (globalThis as { window?: Window }).window;\n\n if (listenCrossTab && (api.crossTabSyncMode ?? \"none\") === \"none\" && globalWindow !== undefined) {\n warnOnce(\n api,\n `listenCrossTab:${key}`,\n `[Mnemonic] useMnemonicKey(\"${key}\") enabled listenCrossTab, but the active storage backend may not be able to notify external changes. If you're using a custom Storage-like wrapper around localStorage, ensure it forwards browser \"storage\" events or implements storage.onExternalChange(...); otherwise, use localStorage or implement storage.onExternalChange(...) on your custom backend.`,\n );\n }\n\n additionalDevWarnings?.({\n api,\n key,\n listenCrossTab,\n codecOpt,\n schema,\n warnOnce: (id, message) => warnOnce(api, id, message),\n });\n\n let keyContracts = diagnosticContractRegistry.get(api);\n if (!keyContracts) {\n keyContracts = new Map<string, string>();\n diagnosticContractRegistry.set(api, keyContracts);\n }\n\n if (contractFingerprint === null) {\n return;\n }\n const previousContract = keyContracts.get(key);\n if (previousContract === undefined) {\n keyContracts.set(key, contractFingerprint);\n return;\n }\n if (previousContract === contractFingerprint) {\n return;\n }\n\n warnOnce(\n api,\n `contract-conflict:${key}`,\n `[Mnemonic] Conflicting useMnemonicKey contracts detected for key \"${key}\" in namespace \"${api.prefix.slice(0, -1)}\". Reuse a shared descriptor with defineMnemonicKey(...) or align defaultValue/codec/schema/reconcile options so every consumer describes the same persisted contract.`,\n );\n }, [\n active,\n additionalDevWarnings,\n api,\n key,\n developmentRuntime,\n contractFingerprint,\n listenCrossTab,\n codecOpt,\n schema,\n api.crossTabSyncMode,\n ]);\n\n useEffect(() => {\n if (hasMounted) return;\n setHasMounted(true);\n }, [hasMounted, setHasMounted]);\n\n useEffect(() => {\n if (!active) return;\n if (decoded.rewriteRaw && decoded.rewriteRaw !== raw) {\n api.setRaw(key, decoded.rewriteRaw);\n }\n }, [active, api, decoded.rewriteRaw, key, raw]);\n\n useEffect(() => {\n if (!active) return;\n onDecodedEffect?.(decoded);\n }, [active, decoded, onDecodedEffect]);\n\n const prevRef = useRef<T>(value);\n\n const mounted = useRef(false);\n useEffect(() => {\n if (!active) return;\n if (mounted.current) return;\n mounted.current = true;\n onMount?.(value);\n prevRef.current = value;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active]);\n\n useEffect(() => {\n if (!active) return;\n const prev = prevRef.current;\n if (Object.is(prev, value)) return;\n prevRef.current = value;\n onChange?.(value, prev);\n }, [active, value, onChange]);\n\n useEffect(() => {\n if (!active) return;\n if (!listenCrossTab) return;\n const globalWindow = (globalThis as { window?: Window }).window;\n if (globalWindow === undefined) return;\n\n const storageKey = api.prefix + key;\n\n const handler = (e: StorageEvent) => {\n if (e.key === null) {\n api.removeRaw(key);\n return;\n }\n if (e.key !== storageKey) return;\n if (e.newValue == null) {\n api.removeRaw(key);\n return;\n }\n api.setRaw(key, e.newValue);\n };\n\n globalWindow.addEventListener(\"storage\", handler);\n return () => globalWindow.removeEventListener(\"storage\", handler);\n }, [active, listenCrossTab, api, key]);\n\n const set = useMemo(() => {\n if (!active) {\n return () => undefined;\n }\n return (next: T | ((cur: T) => T)) => {\n const nextVal =\n typeof next === \"function\" ? (next as (c: T) => T)(decodeForRead(api.getRawSnapshot(key)).value) : next;\n try {\n const encoded = encodeForWrite(nextVal);\n api.setRaw(key, encoded);\n } catch (err) {\n if (err instanceof SchemaError) {\n console.error(`[Mnemonic] Schema error for key \"${key}\" (${err.code}):`, err.message);\n return;\n }\n if (err instanceof CodecError) {\n console.error(`[Mnemonic] Codec encode error for key \"${key}\":`, err.message);\n return;\n }\n console.error(`[Mnemonic] Failed to persist key \"${key}\":`, err);\n }\n };\n }, [active, api, key, decodeForRead, encodeForWrite]);\n\n const reset = useMemo(() => {\n if (!active) {\n return () => undefined;\n }\n return () => {\n const v = getFallback();\n try {\n const encoded = encodeForWrite(v);\n api.setRaw(key, encoded);\n } catch (err) {\n if (err instanceof SchemaError) {\n console.error(`[Mnemonic] Schema error for key \"${key}\" (${err.code}):`, err.message);\n return;\n }\n if (err instanceof CodecError) {\n console.error(`[Mnemonic] Codec encode error for key \"${key}\":`, err.message);\n }\n return;\n }\n };\n }, [active, api, key, getFallback, encodeForWrite]);\n\n const remove = useMemo(() => {\n if (!active) {\n return () => undefined;\n }\n return () => api.removeRaw(key);\n }, [active, api, key]);\n\n return useMemo<MnemonicKeyState<T>>(\n () => ({\n value,\n set,\n reset,\n remove,\n }),\n [value, set, reset, remove],\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\n/**\n * @fileoverview React hook for type-safe, persistent state management.\n *\n * This module exports the `useMnemonicKey` hook, which provides a React-friendly\n * API for reading and writing persistent state with automatic synchronization,\n * encoding/decoding, and JSON Schema validation.\n */\n\nimport { useMemo, useCallback } from \"react\";\nimport { CodecError } from \"./codecs\";\nimport { useMnemonic } from \"./provider\";\nimport { SchemaError, type MnemonicEnvelope } from \"./schema\";\nimport { inferJsonSchema, validateJsonSchema } from \"./json-schema\";\nimport {\n resolveMnemonicKeyArgs,\n serializeEnvelope,\n useApplyReconcile,\n useMnemonicKeySharedFromApi,\n useMnemonicKeyState,\n} from \"./use-shared\";\nimport type { JsonSchema } from \"./json-schema\";\nimport type {\n KeySchema,\n MigrationPath,\n Mnemonic,\n MnemonicKeyDescriptor,\n MnemonicKeyState,\n UseMnemonicKeyOptions,\n} from \"./types\";\n\ntype SchemaReadExtra = {\n pendingSchema?: KeySchema;\n};\n\nexport function useSchemaMnemonicKeyFromApi<T>(\n store: Mnemonic,\n descriptor: MnemonicKeyDescriptor<T, string>,\n active = true,\n): MnemonicKeyState<T> {\n const shared = useMnemonicKeySharedFromApi(store, descriptor, undefined, descriptor.options.schema?.version);\n const { api, key, codec, codecOpt, schema, reconcile, parseEnvelope, decodeStringPayload, buildFallbackResult } =\n shared;\n const schemaMode = api.schemaMode;\n const schemaRegistry = api.schemaRegistry;\n\n const validateAgainstSchema = useCallback(\n (value: unknown, jsonSchema: JsonSchema): void => {\n const errors = validateJsonSchema(value, jsonSchema);\n if (errors.length > 0) {\n const message = errors.map((e) => `${e.path || \"/\"}: ${e.message}`).join(\"; \");\n throw new SchemaError(\"TYPE_MISMATCH\", `Schema validation failed for key \"${key}\": ${message}`);\n }\n },\n [key],\n );\n\n const registryCache = useMemo(() => {\n if (!schemaRegistry || schemaMode === \"autoschema\") return null;\n return {\n latestSchema: undefined as KeySchema | undefined,\n latestSchemaSet: false,\n schemaByVersion: new Map<number, KeySchema | undefined>(),\n migrationPaths: new Map<string, MigrationPath | null>(),\n };\n }, [schemaRegistry, schemaMode, key]);\n\n const getSchemaForVersion = useCallback(\n (version: number): KeySchema | undefined => {\n if (!schemaRegistry) return undefined;\n if (!registryCache) return schemaRegistry.getSchema(key, version);\n if (registryCache.schemaByVersion.has(version)) {\n return registryCache.schemaByVersion.get(version);\n }\n const nextSchema = schemaRegistry.getSchema(key, version);\n registryCache.schemaByVersion.set(version, nextSchema);\n return nextSchema;\n },\n [schemaRegistry, registryCache, key],\n );\n\n const getLatestSchemaForKey = useCallback((): KeySchema | undefined => {\n if (!schemaRegistry) return undefined;\n if (!registryCache) return schemaRegistry.getLatestSchema(key);\n if (registryCache.latestSchemaSet) return registryCache.latestSchema;\n const nextSchema = schemaRegistry.getLatestSchema(key);\n registryCache.latestSchema = nextSchema;\n registryCache.latestSchemaSet = true;\n return nextSchema;\n }, [schemaRegistry, registryCache, key]);\n\n const getMigrationPathForKey = useCallback(\n (fromVersion: number, toVersion: number): MigrationPath | null => {\n if (!schemaRegistry) return null;\n if (!registryCache) return schemaRegistry.getMigrationPath(key, fromVersion, toVersion) ?? null;\n const cacheKey = `${fromVersion}->${toVersion}`;\n if (registryCache.migrationPaths.has(cacheKey)) {\n return registryCache.migrationPaths.get(cacheKey) ?? null;\n }\n const path = schemaRegistry.getMigrationPath(key, fromVersion, toVersion) ?? null;\n registryCache.migrationPaths.set(cacheKey, path);\n return path;\n },\n [schemaRegistry, registryCache, key],\n );\n\n const buildSchemaManagedResult = useCallback((version: number, value: unknown): string => {\n return serializeEnvelope(version, value);\n }, []);\n\n const applyReconcile = useApplyReconcile<T, SchemaReadExtra>({\n key,\n reconcile,\n buildFallbackResult,\n });\n\n const resolveTargetWriteSchema = useCallback((): KeySchema | undefined => {\n const explicitVersion = schema?.version;\n const latestSchema = getLatestSchemaForKey();\n if (explicitVersion === undefined) return latestSchema;\n\n const explicitSchema = getSchemaForVersion(explicitVersion);\n if (explicitSchema) return explicitSchema;\n\n return schemaMode === \"strict\" ? undefined : latestSchema;\n }, [getLatestSchemaForKey, getSchemaForVersion, schema?.version, schemaMode]);\n\n const encodeForWrite = useCallback(\n (nextValue: T): string => {\n const explicitVersion = schema?.version;\n const targetSchema = resolveTargetWriteSchema();\n\n if (!targetSchema) {\n if (explicitVersion !== undefined && schemaMode === \"strict\") {\n throw new SchemaError(\n \"WRITE_SCHEMA_REQUIRED\",\n `Write requires schema for key \"${key}\" in strict mode`,\n );\n }\n return serializeEnvelope(0, codec.encode(nextValue));\n }\n\n let valueToStore: unknown = nextValue;\n const writeMigration = schemaRegistry?.getWriteMigration?.(key, targetSchema.version);\n if (writeMigration) {\n try {\n valueToStore = writeMigration.migrate(valueToStore);\n } catch (err) {\n throw err instanceof SchemaError\n ? err\n : new SchemaError(\"MIGRATION_FAILED\", `Write-time migration failed for key \"${key}\"`, err);\n }\n }\n\n validateAgainstSchema(valueToStore, targetSchema.schema);\n return buildSchemaManagedResult(targetSchema.version, valueToStore);\n },\n [\n schema?.version,\n key,\n schemaMode,\n codec,\n schemaRegistry,\n validateAgainstSchema,\n resolveTargetWriteSchema,\n buildSchemaManagedResult,\n ],\n );\n\n const decodeAutoschemaEnvelope = useCallback(\n (envelope: MnemonicEnvelope, latestSchema: KeySchema | undefined) => {\n if (latestSchema) {\n return buildFallbackResult(\n new SchemaError(\"SCHEMA_NOT_FOUND\", `No schema for key \"${key}\" v${envelope.version}`),\n );\n }\n if (!schemaRegistry || typeof schemaRegistry.registerSchema !== \"function\") {\n return buildFallbackResult(\n new SchemaError(\n \"MODE_CONFIGURATION_INVALID\",\n `Autoschema mode requires schema registry registration for key \"${key}\"`,\n ),\n );\n }\n try {\n const decoded =\n typeof envelope.payload === \"string\"\n ? decodeStringPayload<T>(envelope.payload, codec)\n : (envelope.payload as T);\n const inferSchemaForValue = (value: T): KeySchema => ({\n key,\n version: 1,\n schema: inferJsonSchema(value),\n });\n const inferred = inferSchemaForValue(decoded);\n return applyReconcile({\n value: decoded,\n extra: { pendingSchema: inferred },\n rewriteRaw: buildSchemaManagedResult(inferred.version, decoded),\n persistedVersion: envelope.version,\n serializeForPersist: (value) => buildSchemaManagedResult(inferred.version, value),\n deriveExtra: (value) => ({\n pendingSchema: inferSchemaForValue(value),\n }),\n });\n } catch (err) {\n const typedErr =\n err instanceof SchemaError || err instanceof CodecError\n ? err\n : new SchemaError(\"TYPE_MISMATCH\", `Autoschema inference failed for key \"${key}\"`, err);\n return buildFallbackResult(typedErr);\n }\n },\n [\n applyReconcile,\n buildFallbackResult,\n buildSchemaManagedResult,\n codec,\n decodeStringPayload,\n key,\n schemaRegistry,\n ],\n );\n\n const decodeCodecManagedEnvelope = useCallback(\n (envelope: MnemonicEnvelope, latestSchema: KeySchema | undefined) => {\n if (typeof envelope.payload !== \"string\") {\n return applyReconcile({\n value: envelope.payload as T,\n persistedVersion: envelope.version,\n ...(latestSchema ? { latestVersion: latestSchema.version } : {}),\n serializeForPersist: encodeForWrite,\n });\n }\n try {\n const decoded = decodeStringPayload<T>(envelope.payload, codec);\n return applyReconcile({\n value: decoded,\n persistedVersion: envelope.version,\n ...(latestSchema ? { latestVersion: latestSchema.version } : {}),\n serializeForPersist: encodeForWrite,\n });\n } catch (err) {\n return buildFallbackResult(err as CodecError | SchemaError);\n }\n },\n [applyReconcile, buildFallbackResult, codec, decodeStringPayload, encodeForWrite],\n );\n\n const decodeSchemaManagedEnvelope = useCallback(\n (envelope: MnemonicEnvelope, schemaForVersion: KeySchema, latestSchema: KeySchema | undefined) => {\n let current: unknown;\n try {\n current = envelope.payload;\n validateAgainstSchema(current, schemaForVersion.schema);\n } catch (err) {\n const typedErr =\n err instanceof SchemaError || err instanceof CodecError\n ? err\n : new SchemaError(\"TYPE_MISMATCH\", `Schema decode failed for key \"${key}\"`, err);\n return buildFallbackResult(typedErr);\n }\n\n if (!latestSchema || envelope.version >= latestSchema.version) {\n return applyReconcile({\n value: current as T,\n persistedVersion: envelope.version,\n ...(latestSchema ? { latestVersion: latestSchema.version } : {}),\n serializeForPersist: encodeForWrite,\n });\n }\n\n const path = getMigrationPathForKey(envelope.version, latestSchema.version);\n if (!path) {\n return buildFallbackResult(\n new SchemaError(\n \"MIGRATION_PATH_NOT_FOUND\",\n `No migration path for key \"${key}\" from v${envelope.version} to v${latestSchema.version}`,\n ),\n );\n }\n\n try {\n let migrated = current;\n for (const step of path) {\n migrated = step.migrate(migrated);\n }\n validateAgainstSchema(migrated, latestSchema.schema);\n return applyReconcile({\n value: migrated as T,\n rewriteRaw: buildSchemaManagedResult(latestSchema.version, migrated),\n persistedVersion: envelope.version,\n latestVersion: latestSchema.version,\n serializeForPersist: encodeForWrite,\n });\n } catch (err) {\n const typedErr =\n err instanceof SchemaError || err instanceof CodecError\n ? err\n : new SchemaError(\"MIGRATION_FAILED\", `Migration failed for key \"${key}\"`, err);\n return buildFallbackResult(typedErr);\n }\n },\n [\n applyReconcile,\n buildFallbackResult,\n buildSchemaManagedResult,\n encodeForWrite,\n getMigrationPathForKey,\n key,\n validateAgainstSchema,\n ],\n );\n\n const decodeForRead = useCallback(\n (rawText: string | null) => {\n if (rawText == null) return buildFallbackResult();\n\n const parsed = parseEnvelope(rawText);\n if (!parsed.ok) return buildFallbackResult(parsed.error);\n const envelope = parsed.envelope;\n\n const schemaForVersion = getSchemaForVersion(envelope.version);\n const latestSchema = getLatestSchemaForKey();\n\n if (schemaMode === \"strict\" && !schemaForVersion) {\n return buildFallbackResult(\n new SchemaError(\"SCHEMA_NOT_FOUND\", `No schema for key \"${key}\" v${envelope.version}`),\n );\n }\n\n if (schemaMode === \"autoschema\" && !schemaForVersion) {\n return decodeAutoschemaEnvelope(envelope, latestSchema);\n }\n\n if (!schemaForVersion) {\n return decodeCodecManagedEnvelope(envelope, latestSchema);\n }\n\n return decodeSchemaManagedEnvelope(envelope, schemaForVersion, latestSchema);\n },\n [\n buildFallbackResult,\n decodeAutoschemaEnvelope,\n decodeCodecManagedEnvelope,\n decodeSchemaManagedEnvelope,\n parseEnvelope,\n schemaMode,\n getSchemaForVersion,\n getLatestSchemaForKey,\n key,\n ],\n );\n\n const additionalDevWarnings = useCallback(\n ({ warnOnce }: { warnOnce: (id: string, message: string) => void }) => {\n if (!codecOpt || schema?.version === undefined || !api.schemaRegistry) return;\n warnOnce(\n `codec+schema:${key}`,\n `[Mnemonic] useMnemonicKey(\"${key}\") received both a custom codec and schema.version. Schema-managed reads/writes do not use the codec path. Remove the codec for schema-managed storage, or remove schema.version if you intended codec-only persistence.`,\n );\n },\n [api.schemaRegistry, codecOpt, key, schema?.version],\n );\n\n const onDecodedEffect = useCallback(\n (decoded: { pendingSchema?: KeySchema }) => {\n if (!decoded.pendingSchema || !schemaRegistry?.registerSchema) return;\n if (schemaRegistry.getSchema(decoded.pendingSchema.key, decoded.pendingSchema.version)) return;\n try {\n schemaRegistry.registerSchema(decoded.pendingSchema);\n } catch {\n // Ignore registration races; write/read paths will enforce schema validity.\n }\n },\n [schemaRegistry],\n );\n\n return useMnemonicKeyState(shared, {\n active,\n decodeForRead,\n encodeForWrite,\n additionalDevWarnings,\n onDecodedEffect,\n });\n}\n\nfunction useSchemaMnemonicKey<T>(descriptor: MnemonicKeyDescriptor<T, string>): MnemonicKeyState<T> {\n return useSchemaMnemonicKeyFromApi(useMnemonic(), descriptor);\n}\n\n/**\n * React hook for persistent, type-safe state management.\n */\nexport function useMnemonicKey<T, K extends string>(descriptor: MnemonicKeyDescriptor<T, K>): MnemonicKeyState<T>;\nexport function useMnemonicKey<T>(key: string, options: UseMnemonicKeyOptions<T>): MnemonicKeyState<T>;\nexport function useMnemonicKey<T>(\n keyOrDescriptor: string | MnemonicKeyDescriptor<T, string>,\n options?: UseMnemonicKeyOptions<T>,\n): MnemonicKeyState<T> {\n return useSchemaMnemonicKey(resolveMnemonicKeyArgs(keyOrDescriptor, options));\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { useCallback, useMemo } from \"react\";\nimport { useMnemonic } from \"./provider\";\nimport { getRuntimeNodeEnv } from \"./runtime\";\nimport type {\n Mnemonic,\n MnemonicRecoveryAction,\n MnemonicRecoveryEvent,\n MnemonicRecoveryHook,\n UseMnemonicRecoveryOptions,\n} from \"./types\";\n\nfunction uniqueKeys(keys: readonly string[]): string[] {\n return [...new Set(keys)];\n}\n\nfunction isDevelopmentRuntime(): boolean {\n return getRuntimeNodeEnv() === \"development\";\n}\n\nconst recoveryDiagnosticWarnings = new WeakMap<object, Set<string>>();\n\nfunction warnRecoveryOnce(api: object, id: string, message: string): void {\n let warnings = recoveryDiagnosticWarnings.get(api);\n if (!warnings) {\n warnings = new Set<string>();\n recoveryDiagnosticWarnings.set(api, warnings);\n }\n if (warnings.has(id)) return;\n warnings.add(id);\n console.warn(message);\n}\n\n/**\n * Hook for namespace-scoped recovery actions such as hard reset and selective clear.\n *\n * Applications can use this to offer self-service recovery UX for corrupt or\n * legacy persisted state. The hook operates on the current provider namespace.\n *\n * See the\n * [Reset and Recovery guide](https://thirtytwobits.github.io/react-mnemonic/docs/guides/reset-and-recovery)\n * for soft-reset and hard-reset patterns.\n *\n * @param options - Optional recovery callback for telemetry/auditing\n * @returns Namespace recovery helpers\n *\n * @throws {Error} If used outside of a MnemonicProvider\n */\nexport function useMnemonicRecovery(options: UseMnemonicRecoveryOptions = {}): MnemonicRecoveryHook {\n return useMnemonicRecoveryFromApi(useMnemonic(), options);\n}\n\nexport function useMnemonicRecoveryFromApi(\n api: Mnemonic,\n options: UseMnemonicRecoveryOptions = {},\n active = true,\n): MnemonicRecoveryHook {\n const { onRecover } = options;\n\n const namespace = useMemo(() => {\n if (!active) return \"\";\n return api.prefix.endsWith(\".\") ? api.prefix.slice(0, -1) : api.prefix;\n }, [active, api.prefix]);\n\n const emitRecovery = useCallback(\n (action: MnemonicRecoveryAction, clearedKeys: string[]) => {\n if (!active) return;\n const event: MnemonicRecoveryEvent = {\n action,\n namespace,\n clearedKeys,\n };\n onRecover?.(event);\n },\n [active, namespace, onRecover],\n );\n\n const listKeys = useCallback(() => (active ? api.keys() : []), [active, api]);\n\n const clearResolvedKeys = useCallback(\n (action: MnemonicRecoveryAction, keys: readonly string[]) => {\n if (!active) return [];\n const clearedKeys = uniqueKeys(keys);\n for (const key of clearedKeys) {\n api.removeRaw(key);\n }\n emitRecovery(action, clearedKeys);\n return clearedKeys;\n },\n [active, api, emitRecovery],\n );\n\n const clearKeys = useCallback(\n (keys: readonly string[]) => clearResolvedKeys(\"clear-keys\", keys),\n [clearResolvedKeys],\n );\n\n const clearAll = useCallback(() => {\n if (!active) return [];\n if (!api.canEnumerateKeys) {\n if (isDevelopmentRuntime()) {\n warnRecoveryOnce(\n api,\n \"recovery-clear-all-non-enumerable\",\n `[Mnemonic] clearAll() requires an enumerable storage backend in namespace \"${namespace}\". Use clearKeys([...]) with an explicit durable-key list, or supply a storage backend that implements length and key(index).`,\n );\n }\n throw new Error(\n \"clearAll requires an enumerable storage backend. Use clearKeys([...]) with an explicit key list instead.\",\n );\n }\n return clearResolvedKeys(\"clear-all\", api.keys());\n }, [active, api, clearResolvedKeys, namespace]);\n\n const clearMatching = useCallback(\n (predicate: (key: string) => boolean) => {\n if (!active) return [];\n if (!api.canEnumerateKeys) {\n if (isDevelopmentRuntime()) {\n warnRecoveryOnce(\n api,\n \"recovery-clear-matching-non-enumerable\",\n `[Mnemonic] clearMatching() requires an enumerable storage backend in namespace \"${namespace}\". Use clearKeys([...]) with an explicit durable-key list, or supply a storage backend that implements length and key(index).`,\n );\n }\n throw new Error(\n \"clearMatching requires an enumerable storage backend. Use clearKeys([...]) with an explicit key list instead.\",\n );\n }\n return clearResolvedKeys(\n \"clear-matching\",\n api.keys().filter((key) => predicate(key)),\n );\n },\n [active, api, clearResolvedKeys, namespace],\n );\n\n return useMemo(\n () => ({\n namespace,\n canEnumerateKeys: active ? api.canEnumerateKeys : false,\n listKeys,\n clearAll,\n clearKeys,\n clearMatching,\n }),\n [namespace, active, api.canEnumerateKeys, listKeys, clearAll, clearKeys, clearMatching],\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport type { JsonSchema } from \"./json-schema\";\nimport type { KeySchema, MnemonicKeyDescriptor, SchemaBoundKeyOptions, UseMnemonicKeyOptions } from \"./types\";\n\n/**\n * Define a reusable, importable contract for a persisted key.\n *\n * This packages the storage key and the canonical `useMnemonicKey(...)`\n * options into a single object that can be shared across components, docs,\n * and generated code.\n *\n * @template K - The literal storage key name\n * @template T - The decoded value type for the key\n *\n * @param key - The unprefixed storage key\n * @param options - Canonical hook options for the key\n * @returns A descriptor that can be passed directly to `useMnemonicKey(...)`\n *\n * @example\n * ```typescript\n * const themeKey = defineMnemonicKey(\"theme\", {\n * defaultValue: \"light\" as \"light\" | \"dark\",\n * listenCrossTab: true,\n * });\n *\n * const { value, set } = useMnemonicKey(themeKey);\n * ```\n */\nexport function defineMnemonicKey<const K extends string, T>(\n key: K,\n options: UseMnemonicKeyOptions<T>,\n): MnemonicKeyDescriptor<T, K>;\nexport function defineMnemonicKey<const K extends string, TSchema extends KeySchema<unknown, K, JsonSchema>>(\n keySchema: TSchema,\n options: SchemaBoundKeyOptions<TSchema extends KeySchema<infer TValue, string, JsonSchema> ? TValue : never>,\n): MnemonicKeyDescriptor<TSchema extends KeySchema<infer TValue, string, JsonSchema> ? TValue : never, TSchema[\"key\"]>;\nexport function defineMnemonicKey(\n keyOrSchema: string | KeySchema<unknown, string, JsonSchema>,\n options: UseMnemonicKeyOptions<unknown> | SchemaBoundKeyOptions<unknown>,\n): MnemonicKeyDescriptor<unknown, string> {\n if (typeof keyOrSchema !== \"string\") {\n return Object.freeze({\n key: keyOrSchema.key,\n options: {\n ...options,\n schema: { version: keyOrSchema.version },\n },\n });\n }\n\n return Object.freeze({\n key: keyOrSchema,\n options,\n });\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { SchemaError } from \"./schema\";\nimport type { CreateSchemaRegistryOptions, KeySchema, MigrationRule, MigrationPath, SchemaRegistry } from \"./types\";\n\nfunction schemaVersionKey(key: string, version: number): string {\n return `${key}:${version}`;\n}\n\nfunction migrationVersionKey(key: string, fromVersion: number): string {\n return `${key}:${fromVersion}`;\n}\n\nfunction validateVersion(value: number, label: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new SchemaError(\"MIGRATION_GRAPH_INVALID\", `${label} must be a non-negative integer`);\n }\n}\n\n/**\n * Create an immutable schema registry for common default/strict-mode setups.\n *\n * The helper indexes schemas and migrations up front, validates duplicate and\n * ambiguous definitions, and returns a {@link SchemaRegistry} ready to pass to\n * `MnemonicProvider`.\n *\n * Most applications should prefer this helper over manually implementing\n * {@link SchemaRegistry}.\n *\n * See the\n * [Schema Migration guide](https://thirtytwobits.github.io/react-mnemonic/docs/guides/schema-migration)\n * for end-to-end registry and migration patterns.\n *\n * @param options - Initial schema and migration definitions\n * @returns An indexed immutable schema registry\n *\n * @throws {SchemaError} With `SCHEMA_REGISTRATION_CONFLICT` for duplicate\n * schemas, or `MIGRATION_GRAPH_INVALID` for invalid migration graphs\n */\nexport function createSchemaRegistry(options: CreateSchemaRegistryOptions = {}): SchemaRegistry {\n const { schemas = [], migrations = [] } = options;\n\n const schemasByKeyAndVersion = new Map<string, KeySchema>();\n const latestSchemaByKey = new Map<string, KeySchema>();\n const writeMigrationsByKeyAndVersion = new Map<string, MigrationRule>();\n const migrationsByKeyAndFromVersion = new Map<string, MigrationRule>();\n\n for (const schema of schemas) {\n validateVersion(schema.version, `Schema version for key \"${schema.key}\"`);\n\n const id = schemaVersionKey(schema.key, schema.version);\n if (schemasByKeyAndVersion.has(id)) {\n throw new SchemaError(\n \"SCHEMA_REGISTRATION_CONFLICT\",\n `Duplicate schema registered for key \"${schema.key}\" version ${schema.version}`,\n );\n }\n\n schemasByKeyAndVersion.set(id, schema);\n\n const currentLatest = latestSchemaByKey.get(schema.key);\n if (!currentLatest || schema.version > currentLatest.version) {\n latestSchemaByKey.set(schema.key, schema);\n }\n }\n\n for (const migration of migrations) {\n validateVersion(migration.fromVersion, `Migration fromVersion for key \"${migration.key}\"`);\n validateVersion(migration.toVersion, `Migration toVersion for key \"${migration.key}\"`);\n\n if (migration.toVersion < migration.fromVersion) {\n throw new SchemaError(\n \"MIGRATION_GRAPH_INVALID\",\n `Backward migration \"${migration.key}\" ${migration.fromVersion} -> ${migration.toVersion} is not supported`,\n );\n }\n\n if (migration.fromVersion === migration.toVersion) {\n const id = schemaVersionKey(migration.key, migration.fromVersion);\n if (writeMigrationsByKeyAndVersion.has(id)) {\n throw new SchemaError(\n \"MIGRATION_GRAPH_INVALID\",\n `Duplicate write migration registered for key \"${migration.key}\" version ${migration.fromVersion}`,\n );\n }\n writeMigrationsByKeyAndVersion.set(id, migration);\n continue;\n }\n\n const edgeKey = migrationVersionKey(migration.key, migration.fromVersion);\n if (migrationsByKeyAndFromVersion.has(edgeKey)) {\n const existing = migrationsByKeyAndFromVersion.get(edgeKey)!;\n throw new SchemaError(\n \"MIGRATION_GRAPH_INVALID\",\n `Ambiguous migration graph for key \"${migration.key}\" at version ${migration.fromVersion}: ` +\n `${existing.fromVersion} -> ${existing.toVersion} conflicts with ` +\n `${migration.fromVersion} -> ${migration.toVersion}`,\n );\n }\n\n migrationsByKeyAndFromVersion.set(edgeKey, migration);\n }\n return {\n getSchema(key, version) {\n return schemasByKeyAndVersion.get(schemaVersionKey(key, version));\n },\n getLatestSchema(key) {\n return latestSchemaByKey.get(key);\n },\n getMigrationPath(key, fromVersion, toVersion): MigrationPath | null {\n if (fromVersion === toVersion) return [];\n if (toVersion < fromVersion) return null;\n\n const path: MigrationRule[] = [];\n let currentVersion = fromVersion;\n\n while (currentVersion < toVersion) {\n const next = migrationsByKeyAndFromVersion.get(migrationVersionKey(key, currentVersion));\n if (!next) return null;\n\n path.push(next);\n currentVersion = next.toVersion;\n }\n\n return currentVersion === toVersion ? path : null;\n },\n getWriteMigration(key, version) {\n return writeMigrationsByKeyAndVersion.get(schemaVersionKey(key, version));\n },\n };\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport { SchemaError } from \"./schema\";\nimport type { JsonSchema } from \"./json-schema\";\nimport type { InferJsonSchemaValue } from \"./typed-schema\";\nimport type { KeySchema, MigrationRule } from \"./types\";\n\n/**\n * Create a versioned key schema that preserves the decoded value type inferred\n * from a typed schema helper.\n */\nexport function defineKeySchema<const K extends string, TSchema extends JsonSchema>(\n key: K,\n version: number,\n schema: TSchema,\n): KeySchema<InferJsonSchemaValue<TSchema>, K, TSchema> {\n return Object.freeze({\n key,\n version,\n schema,\n });\n}\n\n/**\n * Create a typed migration rule between two key schema versions.\n *\n * The `migrate(...)` callback is inferred from the source and target schemas,\n * which keeps migration logic aligned with the registered runtime schemas.\n */\nexport function defineMigration<const K extends string, TFrom, TTo>(\n fromSchema: KeySchema<TFrom, K>,\n toSchema: KeySchema<TTo, K>,\n migrate: (value: TFrom) => TTo,\n): MigrationRule<TFrom, TTo, K> {\n if (fromSchema.key !== toSchema.key) {\n throw new SchemaError(\n \"MIGRATION_GRAPH_INVALID\",\n `Migration schemas must target the same key: \"${fromSchema.key}\" !== \"${toSchema.key}\"`,\n );\n }\n\n return Object.freeze({\n key: fromSchema.key,\n fromVersion: fromSchema.version,\n toVersion: toSchema.version,\n migrate,\n });\n}\n\n/**\n * Create a typed write-time normalization rule for a single key schema.\n */\nexport function defineWriteMigration<const K extends string, TValue>(\n schema: KeySchema<TValue, K>,\n migrate: (value: TValue) => TValue,\n): MigrationRule<TValue, TValue, K> {\n return Object.freeze({\n key: schema.key,\n fromVersion: schema.version,\n toVersion: schema.version,\n migrate,\n });\n}\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\nimport type { JsonSchema, JsonSchemaType } from \"./json-schema\";\nimport { SchemaError } from \"./schema\";\n\ndeclare const typedSchemaBrand: unique symbol;\ndeclare const optionalSchemaBrand: unique symbol;\n\nconst optionalSchemaMarker = Symbol(\"mnemonicOptionalSchema\");\n\ntype JsonPrimitive = string | number | boolean | null;\ntype JsonConstValue = JsonPrimitive | readonly JsonConstValue[] | { readonly [key: string]: JsonConstValue };\n\nexport type TypedJsonSchema<T> = JsonSchema & {\n readonly [typedSchemaBrand]?: T;\n};\n\ntype OptionalTypedJsonSchema<T> = TypedJsonSchema<T> & {\n readonly [optionalSchemaBrand]: true;\n};\n\nexport type InferJsonSchemaValue<TSchema> = TSchema extends TypedJsonSchema<infer TValue> ? TValue : unknown;\n\ntype ObjectValueFromSchemas<\n TShape extends Record<string, TypedJsonSchema<unknown> | OptionalTypedJsonSchema<unknown>>,\n> = {\n [K in keyof TShape as TShape[K] extends OptionalTypedJsonSchema<unknown> ? never : K]: InferJsonSchemaValue<\n TShape[K]\n >;\n} & {\n [K in keyof TShape as TShape[K] extends OptionalTypedJsonSchema<unknown> ? K : never]?: InferJsonSchemaValue<\n TShape[K]\n >;\n};\n\ntype StringSchemaOptions = Pick<JsonSchema, \"minLength\" | \"maxLength\">;\ntype NumberSchemaOptions = Pick<JsonSchema, \"minimum\" | \"maximum\" | \"exclusiveMinimum\" | \"exclusiveMaximum\">;\ntype ArraySchemaOptions = Pick<JsonSchema, \"minItems\" | \"maxItems\">;\ntype ObjectSchemaOptions = Pick<JsonSchema, \"additionalProperties\">;\ntype JsonSchemaTypeInput = JsonSchemaType | JsonSchemaType[] | undefined;\n\nfunction cloneSchema<T>(schema: TypedJsonSchema<T>): TypedJsonSchema<T> {\n const clone = { ...schema } as TypedJsonSchema<T>;\n if ((schema as Record<PropertyKey, unknown>)[optionalSchemaMarker]) {\n Object.defineProperty(clone, optionalSchemaMarker, {\n value: true,\n enumerable: false,\n configurable: false,\n });\n }\n return clone;\n}\n\nfunction isOptionalSchema(schema: JsonSchema): schema is OptionalTypedJsonSchema<unknown> {\n return Boolean((schema as Record<PropertyKey, unknown>)[optionalSchemaMarker]);\n}\n\nfunction markOptional<T>(schema: TypedJsonSchema<T>): OptionalTypedJsonSchema<T> {\n const clone = cloneSchema(schema) as OptionalTypedJsonSchema<T>;\n Object.defineProperty(clone, optionalSchemaMarker, {\n value: true,\n enumerable: false,\n configurable: false,\n });\n return clone;\n}\n\nfunction withoutOptionalMarker<T>(schema: TypedJsonSchema<T> | OptionalTypedJsonSchema<T>): TypedJsonSchema<T> {\n const clone = { ...schema } as TypedJsonSchema<T>;\n delete (clone as Record<PropertyKey, unknown>)[optionalSchemaMarker];\n return clone;\n}\n\nfunction withType<T>(\n type: JsonSchemaType | JsonSchemaType[],\n extra: Omit<JsonSchema, \"type\"> = {},\n): TypedJsonSchema<T> {\n return {\n type,\n ...extra,\n } as TypedJsonSchema<T>;\n}\n\nfunction toTypeArray(type: JsonSchemaTypeInput): JsonSchemaType[] | null {\n if (type === undefined) return null;\n return Array.isArray(type) ? [...type] : [type];\n}\n\nfunction appendNullType(type: JsonSchemaTypeInput): JsonSchemaType | JsonSchemaType[] | undefined {\n const types = toTypeArray(type);\n if (types === null) {\n return undefined;\n }\n\n return types.includes(\"null\") ? types : [...types, \"null\"];\n}\n\nfunction nullableSchema<T>(schema: TypedJsonSchema<T>): TypedJsonSchema<T | null> {\n if (schema.enum) {\n const nullableType = appendNullType(schema.type);\n return {\n ...schema,\n ...(nullableType ? { type: nullableType } : {}),\n enum: schema.enum.includes(null) ? schema.enum : [...schema.enum, null],\n } as TypedJsonSchema<T | null>;\n }\n\n if (\"const\" in schema) {\n const { const: constValue, ...rest } = schema as TypedJsonSchema<T> & { const?: JsonConstValue | null };\n const nullableType = appendNullType(rest.type);\n if (constValue === null || constValue === undefined) {\n return {\n ...schema,\n ...(nullableType ? { type: nullableType } : {}),\n } as TypedJsonSchema<T | null>;\n }\n\n return {\n ...rest,\n ...(nullableType ? { type: nullableType } : {}),\n enum: [constValue, null],\n } as TypedJsonSchema<T | null>;\n }\n\n const types = toTypeArray(schema.type);\n if (types === null) {\n throw new SchemaError(\n \"MODE_CONFIGURATION_INVALID\",\n \"mnemonicSchema.nullable(...) requires a schema with type, enum, or const\",\n );\n }\n\n return {\n ...schema,\n type: types.includes(\"null\") ? types : [...types, \"null\"],\n } as TypedJsonSchema<T | null>;\n}\n\n/**\n * Builder helpers for strongly typed schemas backed by Mnemonic's built-in\n * JSON Schema subset.\n *\n * The returned schemas are plain `JsonSchema` objects at runtime, so they can\n * be registered directly in `createSchemaRegistry(...)` while also carrying a\n * phantom TypeScript type for inference.\n */\nexport const mnemonicSchema = {\n string(options: StringSchemaOptions = {}): TypedJsonSchema<string> {\n return withType<string>(\"string\", options);\n },\n\n number(options: NumberSchemaOptions = {}): TypedJsonSchema<number> {\n return withType<number>(\"number\", options);\n },\n\n integer(options: NumberSchemaOptions = {}): TypedJsonSchema<number> {\n return withType<number>(\"integer\", options);\n },\n\n boolean(): TypedJsonSchema<boolean> {\n return withType<boolean>(\"boolean\");\n },\n\n nullValue(): TypedJsonSchema<null> {\n return withType<null>(\"null\");\n },\n\n literal<const TValue extends JsonConstValue>(value: TValue): TypedJsonSchema<TValue> {\n return {\n const: value,\n } as TypedJsonSchema<TValue>;\n },\n\n enum<const TValues extends readonly [JsonPrimitive, ...JsonPrimitive[]]>(\n values: TValues,\n ): TypedJsonSchema<TValues[number]> {\n return {\n enum: values,\n } as TypedJsonSchema<TValues[number]>;\n },\n\n optional<T>(schema: TypedJsonSchema<T>): OptionalTypedJsonSchema<T> {\n return markOptional(schema);\n },\n\n nullable<T>(schema: TypedJsonSchema<T>): TypedJsonSchema<T | null> {\n return nullableSchema(schema);\n },\n\n array<TItemSchema extends TypedJsonSchema<unknown>>(\n itemSchema: TItemSchema,\n options: ArraySchemaOptions = {},\n ): TypedJsonSchema<InferJsonSchemaValue<TItemSchema>[]> {\n return withType<InferJsonSchemaValue<TItemSchema>[]>(\"array\", {\n items: withoutOptionalMarker(itemSchema),\n ...options,\n });\n },\n\n object<TShape extends Record<string, TypedJsonSchema<unknown> | OptionalTypedJsonSchema<unknown>>>(\n shape: TShape,\n options: ObjectSchemaOptions = {},\n ): TypedJsonSchema<ObjectValueFromSchemas<TShape>> {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [name, schema] of Object.entries(shape)) {\n properties[name] = withoutOptionalMarker(schema);\n if (!isOptionalSchema(schema)) {\n required.push(name);\n }\n }\n\n const result: JsonSchema = {\n type: \"object\",\n properties,\n ...options,\n };\n\n if (required.length > 0) {\n result.required = required;\n }\n\n return result as TypedJsonSchema<ObjectValueFromSchemas<TShape>>;\n },\n\n record<TValueSchema extends TypedJsonSchema<unknown>>(\n valueSchema: TValueSchema,\n ): TypedJsonSchema<Record<string, InferJsonSchemaValue<TValueSchema>>> {\n return withType<Record<string, InferJsonSchemaValue<TValueSchema>>>(\"object\", {\n additionalProperties: withoutOptionalMarker(valueSchema),\n });\n },\n};\n","// SPDX-License-Identifier: MIT\n// Copyright Scott Dixon\n\n/**\n * Adapter functions for structural migration helpers.\n *\n * These helpers assume tree-like data, but not a specific node shape. Supply a\n * `StructuralTreeHelpers<T>` when your nodes use custom field names. When your\n * nodes already look like `{ id, children }`, the exported helpers work without\n * any adapter configuration.\n *\n * @template T - Tree node type\n */\nexport interface StructuralTreeHelpers<T> {\n /**\n * Returns the stable identifier for a node.\n */\n getId: (node: T) => string;\n\n /**\n * Returns the node's child list, or `undefined` when it has no children.\n */\n getChildren: (node: T) => readonly T[] | undefined;\n\n /**\n * Returns a copy of the node with a new child list.\n */\n withChildren: (node: T, children: T[]) => T;\n\n /**\n * Returns a copy of the node with a new identifier.\n */\n withId: (node: T, id: string) => T;\n}\n\n/**\n * Default tree node shape supported by the structural migration helpers.\n *\n * If your nodes already use `id` and `children`, you can call the helpers\n * directly without supplying `StructuralTreeHelpers`.\n *\n * @template T - Tree node type\n */\nexport interface StructuralNode<T> {\n /**\n * Stable node identifier used for lookup and rename operations.\n */\n id: string;\n\n /**\n * Optional child nodes.\n */\n children?: readonly T[];\n}\n\nfunction resolveHelpers<T>(helpers?: StructuralTreeHelpers<T>): StructuralTreeHelpers<T> {\n if (helpers) return helpers;\n return {\n getId: (node: T) => (node as StructuralNode<T>).id,\n getChildren: (node: T) => (node as StructuralNode<T>).children,\n withChildren: (node: T, children: T[]) => ({ ...(node as object), children }) as T,\n withId: (node: T, id: string) => ({ ...(node as object), id }) as T,\n };\n}\n\n/**\n * Finds the first node with the requested id using depth-first traversal.\n *\n * @template T - Tree node type (must extend `{ id: string; children?: readonly T[] }` when `helpers` is omitted)\n * @param root - Root node to search\n * @param id - Target node id\n * @returns The matching node, or `undefined`\n */\nexport function findNodeById<T extends StructuralNode<T>>(root: T, id: string): T | undefined;\n/**\n * Finds the first node with the requested id using depth-first traversal.\n *\n * @template T - Tree node type\n * @param root - Root node to search\n * @param id - Target node id\n * @param helpers - Adapter for custom node shapes\n * @returns The matching node, or `undefined`\n */\nexport function findNodeById<T>(root: T, id: string, helpers: StructuralTreeHelpers<T>): T | undefined;\nexport function findNodeById<T>(root: T, id: string, helpers?: StructuralTreeHelpers<T>): T | undefined {\n const tree = resolveHelpers(helpers);\n if (tree.getId(root) === id) return root;\n for (const child of tree.getChildren(root) ?? []) {\n const match = findNodeById(child, id, tree);\n if (match) return match;\n }\n return undefined;\n}\n\n/**\n * Inserts a child under the target parent when none of that parent's existing\n * direct children share the same id. Returns the original tree when the parent\n * is missing or the child is already present as a direct child.\n *\n * @template T - Tree node type (must extend `{ id: string; children?: readonly T[] }` when `helpers` is omitted)\n * @param root - Root node to update\n * @param parentId - Parent node that should receive the child\n * @param child - Child node to append\n * @returns Updated tree with the child inserted once\n */\nexport function insertChildIfMissing<T extends StructuralNode<T>>(root: T, parentId: string, child: T): T;\n/**\n * Inserts a child under the target parent when no existing child shares the\n * same id. Returns the original tree when the parent is missing or the child is\n * already present.\n *\n * @template T - Tree node type\n * @param root - Root node to update\n * @param parentId - Parent node that should receive the child\n * @param child - Child node to append\n * @param helpers - Adapter for custom node shapes\n * @returns Updated tree with the child inserted once\n */\nexport function insertChildIfMissing<T>(root: T, parentId: string, child: T, helpers: StructuralTreeHelpers<T>): T;\nexport function insertChildIfMissing<T>(root: T, parentId: string, child: T, helpers?: StructuralTreeHelpers<T>): T {\n const tree = resolveHelpers(helpers);\n const childId = tree.getId(child);\n\n const visit = (node: T): [T, boolean] => {\n if (tree.getId(node) === parentId) {\n const children = [...(tree.getChildren(node) ?? [])];\n if (children.some((existing) => tree.getId(existing) === childId)) {\n return [node, false];\n }\n return [tree.withChildren(node, [...children, child]), true];\n }\n\n const children = tree.getChildren(node);\n if (!children?.length) return [node, false];\n\n let inserted = false;\n let changed = false;\n const nextChildren = children.map((existingChild) => {\n if (inserted) return existingChild;\n const [nextChild, didInsert] = visit(existingChild);\n inserted ||= didInsert;\n changed ||= nextChild !== existingChild;\n return nextChild;\n });\n\n if (!changed) return [node, inserted];\n return [tree.withChildren(node, nextChildren), inserted];\n };\n\n return visit(root)[0];\n}\n\n/**\n * Renames every node with the source id while preserving tree structure.\n * Returns the original tree when the source id is missing or the target id\n * already exists elsewhere.\n *\n * @template T - Tree node type (must extend `{ id: string; children?: readonly T[] }` when `helpers` is omitted)\n * @param root - Root node to update\n * @param currentId - Existing id to rename\n * @param nextId - Replacement id\n * @returns Updated tree with matching node ids renamed\n */\nexport function renameNode<T extends StructuralNode<T>>(root: T, currentId: string, nextId: string): T;\n/**\n * Renames every node with the source id while preserving tree structure.\n * Returns the original tree when the source id is missing or the target id\n * already exists elsewhere.\n *\n * @template T - Tree node type\n * @param root - Root node to update\n * @param currentId - Existing id to rename\n * @param nextId - Replacement id\n * @param helpers - Adapter for custom node shapes\n * @returns Updated tree with matching node ids renamed\n */\nexport function renameNode<T>(root: T, currentId: string, nextId: string, helpers: StructuralTreeHelpers<T>): T;\nexport function renameNode<T>(root: T, currentId: string, nextId: string, helpers?: StructuralTreeHelpers<T>): T {\n const tree = resolveHelpers(helpers);\n if (currentId === nextId) return root;\n if (!findNodeById(root, currentId, tree)) return root;\n if (findNodeById(root, nextId, tree)) return root;\n\n const visit = (node: T): T => {\n let nextNode = tree.getId(node) === currentId ? tree.withId(node, nextId) : node;\n const children = tree.getChildren(nextNode);\n if (!children?.length) return nextNode;\n\n let changed = nextNode !== node;\n const nextChildren = children.map((child) => {\n const nextChild = visit(child);\n changed ||= nextChild !== child;\n return nextChild;\n });\n\n if (!changed) return node;\n return tree.withChildren(nextNode, nextChildren);\n };\n\n return visit(root);\n}\n\n/**\n * Deduplicates each node's immediate children while preserving the first child\n * encountered for each key. The helper traverses the full tree and returns the\n * original root when no duplicates are removed.\n *\n * @template T - Tree node type (must extend `{ id: string; children?: readonly T[] }` when `helpers` is omitted)\n * @template K - Deduplication key type\n * @param root - Root node to normalize\n * @param getKey - Function that computes a dedupe key for each child\n * @returns Updated tree with duplicate siblings removed\n */\nexport function dedupeChildrenBy<T extends StructuralNode<T>, K>(root: T, getKey: (node: T) => K): T;\n/**\n * Deduplicates each node's immediate children while preserving the first child\n * encountered for each key. The helper traverses the full tree and returns the\n * original root when no duplicates are removed.\n *\n * @template T - Tree node type\n * @template K - Deduplication key type\n * @param root - Root node to normalize\n * @param getKey - Function that computes a dedupe key for each child\n * @param helpers - Adapter for custom node shapes\n * @returns Updated tree with duplicate siblings removed\n */\nexport function dedupeChildrenBy<T, K>(root: T, getKey: (node: T) => K, helpers: StructuralTreeHelpers<T>): T;\nexport function dedupeChildrenBy<T, K>(root: T, getKey: (node: T) => K, helpers?: StructuralTreeHelpers<T>): T {\n const tree = resolveHelpers(helpers);\n\n const visit = (node: T): T => {\n const children = tree.getChildren(node);\n if (!children?.length) return node;\n\n let changed = false;\n const seen = new Set<K>();\n const nextChildren: T[] = [];\n\n for (const child of children) {\n const normalizedChild = visit(child);\n changed ||= normalizedChild !== child;\n\n const key = getKey(normalizedChild);\n if (seen.has(key)) {\n changed = true;\n continue;\n }\n\n seen.add(key);\n nextChildren.push(normalizedChild);\n }\n\n if (!changed && nextChildren.length === children.length) return node;\n return tree.withChildren(node, nextChildren);\n };\n\n return visit(root);\n}\n"]}