@im-nobsidian/core 0.1.6 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/config.ts","../src/config/manager.ts","../src/utils/id.ts","../src/state/migrations/001-initial.ts","../src/state/migrations/002-file-registry.ts","../src/state/state-db.ts","../src/notion/property-mapper.ts","../src/notion/client.ts","../src/notion/block-builder.ts","../src/utils/hash.ts","../src/sync/change-detector.ts","../src/utils/logger.ts","../src/converter/pipeline.ts","../src/converter/pre-processors/frontmatter.ts","../src/converter/pre-processors/wikilink.ts","../src/converter/pre-processors/callout.ts","../src/converter/pre-processors/math.ts","../src/converter/pre-processors/embed.ts","../src/converter/pre-processors/preserve-marker.ts","../src/converter/pre-processors/unsupported-block-stripper.ts","../src/converter/pre-processors/properties-table.ts","../src/converter/pre-processors/html-annotation.ts","../src/converter/post-processors/mention-to-wikilink.ts","../src/converter/post-processors/preserve-marker-injector.ts","../src/converter/post-processors/callout-restorer.ts","../src/converter/post-processors/color-annotator.ts","../src/converter/post-processors/frontmatter-generator.ts","../src/converter/post-processors/local-image-restorer.ts","../src/converter/post-processors/properties-table-restorer.ts","../src/converter/pipeline-factory.ts","../src/converter/block-converter.ts","../src/sync/image-handler.ts","../src/sync/file-handler.ts","../src/utils/sanitize.ts","../src/converter/enhanced-md-converter.ts","../src/sync/database-syncer.ts","../src/sync/orchestrator.ts","../src/sync/node-vault-fs.ts","../src/converter/pre-processors/inline-db.ts","../src/conflict/merger.ts","../src/conflict/resolver.ts","../src/structure/tree-mapper.ts","../src/watcher/file-watcher.ts","../src/watcher/watch-sync-service.ts","../src/view/filter-engine.ts","../src/view/view-data-provider.ts","../src/view/entry-editor.ts","../src/view/color-map.ts"],"names":["stat","matter","WIKILINK_REGEX","escapeRegex","createHash","Sema","EXTENSION_TO_MIME","TOGGLE_START","TOGGLE_END","EMOJI_TYPE_MAP","extractAliases","title","pathParts","join","readFile","mkdir","writeFile","extractTitleFromPath"],"mappings":";;;;;;;;;;;;;;AAEA,IAAM,kBAAA,GAAqB,EAAE,MAAA,CAAO;AAAA,EAClC,UAAA,EAAY,EAAE,MAAA,EAAO;AAAA,EACrB,WAAA,EAAa,EAAE,MAAA,EAAO;AAAA,EACtB,iBAAiB,CAAA,CAAE,MAAA,CAAO,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC/C,UAAA,EAAY,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EACjC,aAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,MAAM;AAC1C,CAAC,CAAA;AAIM,IAAM,YAAA,GAAe,EAAE,MAAA,CAAO;AAAA,EACnC,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAAA,EACpB,MAAA,EAAQ,EAAE,MAAA,CAAO;AAAA,IACf,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,WAAW,MAAM,CAAA;AAAA,IACnC,UAAA,EAAY,EAAE,MAAA,EAAO;AAAA,IACrB,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IACjC,UAAA,EAAY,EAAE,IAAA,CAAK,CAAC,QAAQ,UAAU,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,IACvD,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAChC,WAAW,CAAA,CAAE,KAAA,CAAM,kBAAkB,CAAA,CAAE,OAAA,CAAQ,EAAE;AAAA,GAClD,CAAA;AAAA,EACD,IAAA,EAAM,EAAE,MAAA,CAAO;AAAA,IACb,SAAA,EAAW,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,QAAQ,MAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,IAC1D,gBAAA,EAAkB,CAAA,CACf,IAAA,CAAK,CAAC,aAAA,EAAe,cAAA,EAAgB,QAAA,EAAU,WAAW,CAAC,CAAA,CAC3D,OAAA,CAAQ,QAAQ,CAAA;AAAA,IACnB,QAAA,EAAU,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA;AAAA,IACnC,gBAAA,EAAkB,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,IAC1D,UAAA,EAAY,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA;AAAA,IACrC,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI;AAAA,GACpC,CAAA;AAAA,EACD,KAAA,EAAO,EAAE,MAAA,CAAO;AAAA,IACd,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,MAAM,CAAC,CAAA;AAAA,IAC7C,OAAA,EAAS,EAAE,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,IACvC,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,aAAa;AAAA,GAC9C,CAAA;AAAA,EACD,UAAA,EAAY,EAAE,MAAA,CAAO;AAAA,IACnB,iBAAA,EAAmB,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA;AAAA,IAC3C,eAAA,EAAiB,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA;AAAA,IACzC,kBAAA,EAAoB,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA;AAAA,IAC5C,aAAA,EAAe,CAAA,CAAE,IAAA,CAAK,CAAC,WAAA,EAAa,QAAQ,MAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,WAAW;AAAA,GACzE,CAAA;AAAA,EACD,QAAA,EAAU,EAAE,MAAA,CAAO;AAAA,IACjB,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAAA,IAChD,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC/C,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAI,CAAA,CAAE,GAAA,CAAI,GAAK,CAAA,CAAE,OAAA,CAAQ,GAAK,CAAA;AAAA,IACxD,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,OAAA,CAAQ,EAAE;AAAA,GACjD;AACH,CAAC;AAIM,IAAM,cAAA,GAAyB;AAAA,EACpC,OAAA,EAAS,CAAA;AAAA,EACT,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,UAAA,EAAY,EAAA;AAAA,IACZ,UAAA,EAAY,MAAA;AAAA,IACZ,WAAW;AAAC,GACd;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,SAAA,EAAW,MAAA;AAAA,IACX,gBAAA,EAAkB,QAAA;AAAA,IAClB,QAAA,EAAU,KAAA;AAAA,IACV,gBAAA,EAAkB,GAAA;AAAA,IAClB,UAAA,EAAY,KAAA;AAAA,IACZ,SAAA,EAAW;AAAA,GACb;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,IAChB,SAAS,EAAC;AAAA,IACV,WAAA,EAAa;AAAA,GACf;AAAA,EACA,UAAA,EAAY;AAAA,IACV,iBAAA,EAAmB,IAAA;AAAA,IACnB,eAAA,EAAiB,IAAA;AAAA,IACjB,kBAAA,EAAoB,IAAA;AAAA,IACpB,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,QAAA,EAAU;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY,CAAA;AAAA,IACZ,SAAA,EAAW,GAAA;AAAA,IACX,SAAA,EAAW;AAAA;AAEf;ACjFA,IAAM,WAAA,GAAc,aAAA;AACpB,IAAM,gBAAA,GAAmB,eAAA;AAElB,IAAM,gBAAN,MAAoB;AAAA,EAGzB,YAA6B,SAAA,EAAmB;AAAnB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAoB;AAAA,EAApB,SAAA;AAAA,EAFrB,MAAA,GAAwB,IAAA;AAAA,EAIhC,IAAI,SAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,gBAAgB,CAAA;AAAA,EAC9C;AAAA,EAEA,IAAI,UAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,WAAW,CAAA;AAAA,EACzC;AAAA,EAEA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,SAAS,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,IAAA,GAAwB;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AACnD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,IAAA,CAAK,MAAA,GAAS,YAAA,CAAa,KAAA,CAAM,MAAM,CAAA;AACvC,MAAA,OAAO,IAAA,CAAK,MAAA;AAAA,IACd,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2GAAA,EAA8B,IAAA,CAAK,UAAU,CAAA,CAAE,CAAA;AAAA,MACjE;AACA,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY;AACvD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qDAAA,EAAgB,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACjD;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,8EAAA,EAAqB,KAAK,UAAU;AAAA,sEAAA;AAAA,OACtC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,MAAA,EAA+B;AACxC,IAAA,MAAM,MAAM,IAAA,CAAK,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAC/C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,MAAM,CAAC,CAAA;AAC9C,IAAA,MAAM,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,OAAA,EAAS,OAAO,CAAA;AACjD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,MAAM,KAAK,MAAA,EAAgE;AACzE,IAAA,MAAM,MAAA,GAAiB;AAAA,MACrB,GAAG,cAAA;AAAA,MACH,MAAA,EAAQ;AAAA,QACN,GAAG,cAAA,CAAe,MAAA;AAAA,QAClB,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,YAAY,MAAA,CAAO;AAAA;AACrB,KACF;AAEA,IAAA,MAAM,IAAA,CAAK,KAAK,MAAM,CAAA;AACtB,IAAA,MAAM,KAAK,eAAA,EAAgB;AAC3B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,SAAA,GAAoB;AAClB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,uIAAmC,CAAA;AAAA,IACrD;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,MAAc,eAAA,GAAiC;AAC7C,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,YAAY,CAAA;AACvD,IAAA,MAAM,KAAA,GAAQ,gBAAA;AAEd,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,aAAA,EAAe,OAAO,CAAA;AACrD,MAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC5B,QAAA,MAAM,SAAA,CAAU,aAAA,EAAe,CAAA,EAAG,OAAA,CAAQ,SAAS;AAAA,EAAK,KAAK;AAAA,CAAA,EAAM,OAAO,CAAA;AAAA,MAC5E;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,SAAA,CAAU,aAAA,EAAe,CAAA,EAAG,KAAK;AAAA,CAAA,EAAM,OAAO,CAAA;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,MAAM,aAAA,GAAkC;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAAA,KAAAA,EAAK,GAAI,MAAM,OAAO,aAAkB,CAAA;AAChD,MAAA,MAAMA,KAAAA,CAAK,KAAK,UAAU,CAAA;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACF;AC9FO,SAAS,UAAA,GAAqB;AACnC,EAAA,OAAO,UAAA,EAAW;AACpB;AAEO,SAAS,kBAAkB,EAAA,EAAoB;AACpD,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AAC/B,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,EAAA,EAAI,OAAO,EAAA;AAC9B,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AAC1G;AAEO,SAAS,cAAA,CAAe,GAAW,CAAA,EAAoB;AAC5D,EAAA,OAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,EAAE,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA;AACnD;;;ACdO,IAAM,iBAAA,GAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;;;ACA1B,IAAM,uBAAA,GAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA,CAAA;;;ACMhC,IAAM,OAAA,GAAN,MAAM,QAAA,CAAQ;AAAA,EACF,EAAA;AAAA,EAET,YAAY,EAAA,EAAuB;AACzC,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,IAAA,CAAK,EAAA,CAAG,OAAO,oBAAoB,CAAA;AACnC,IAAA,IAAA,CAAK,EAAA,CAAG,OAAO,mBAAmB,CAAA;AAAA,EACpC;AAAA,EAEA,OAAO,KAAK,MAAA,EAAyB;AACnC,IAAA,MAAM,EAAA,GAAK,IAAI,QAAA,CAAS,MAAM,CAAA;AAC9B,IAAA,MAAM,OAAA,GAAU,IAAI,QAAA,CAAQ,EAAE,CAAA;AAC9B,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,MAAM,OAAA,GAAU,KAAK,gBAAA,EAAiB;AACtC,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,IAAA,CAAK,EAAA,CAAG,KAAK,iBAAiB,CAAA;AAAA,IAChC;AACA,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,IAAA,CAAK,EAAA,CAAG,KAAK,uBAAuB,CAAA;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,gBAAA,GAA2B;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,IAAA,CAAK,EAAA,CACd,OAAA,CAAQ,8DAA8D,EACtE,GAAA,EAAI;AACP,MAAA,OAAO,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,GAAI,CAAA;AAAA,IACnC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AAAA,EAChB;AAAA;AAAA,EAIA,UAAU,IAAA,EAAiC;AACzC,IAAA,MAAM,MAAM,IAAA,CAAK,EAAA,CAAG,QAAQ,kDAAkD,CAAA,CAAE,IAAI,IAAI,CAAA;AAGxF,IAAA,OAAO,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA;AAAA,EAClC;AAAA,EAEA,cAAc,MAAA,EAAmC;AAC/C,IAAA,MAAM,MAAM,IAAA,CAAK,EAAA,CAAG,QAAQ,mDAAmD,CAAA,CAAE,IAAI,MAAM,CAAA;AAG3F,IAAA,OAAO,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA;AAAA,EAClC;AAAA,EAEA,YAAY,MAAA,EAAkC;AAC5C,IAAA,MAAM,OAAO,IAAA,CAAK,EAAA,CACf,QAAQ,2CAA2C,CAAA,CACnD,IAAI,MAAM,CAAA;AACb,IAAA,OAAO,KAAK,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACvC;AAAA,EAEA,MAAA,GAAuB;AACrB,IAAA,MAAM,OAAO,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,0BAA0B,EAAE,GAAA,EAAI;AAC7D,IAAA,OAAO,KAAK,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACvC;AAAA,EAEA,OAAO,MAAA,EAAsC;AAC3C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,YAAY,CAAA;AAEnD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,QACC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAA;AAAA,OAOF,CACC,GAAA;AAAA,QACC,OAAO,YAAA,IAAgB,IAAA;AAAA,QACvB,OAAO,cAAA,IAAkB,IAAA;AAAA,QACzB,MAAA,CAAO,WAAA;AAAA,QACP,OAAO,gBAAA,IAAoB,IAAA;AAAA,QAC3B,MAAA,CAAO,iBAAA;AAAA,QACP,MAAA,CAAO,aAAA;AAAA,QACP,MAAA,CAAO,QAAA;AAAA,QACP,MAAA,CAAO,MAAA;AAAA,QACP,OAAO,YAAA,IAAgB,IAAA;AAAA,QACvB,QAAA,CAAS;AAAA,OACX;AACF,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,YAAY,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,MACC,CAAA;AAAA;AAAA;AAAA;AAAA,mDAAA;AAAA,KAKF,CACC,GAAA;AAAA,MACC,EAAA;AAAA,MACA,MAAA,CAAO,YAAA;AAAA,MACP,OAAO,YAAA,IAAgB,IAAA;AAAA,MACvB,OAAO,cAAA,IAAkB,IAAA;AAAA,MACzB,MAAA,CAAO,WAAA;AAAA,MACP,OAAO,gBAAA,IAAoB,IAAA;AAAA,MAC3B,MAAA,CAAO,iBAAA;AAAA,MACP,MAAA,CAAO,aAAA;AAAA,MACP,MAAA,CAAO,QAAA;AAAA,MACP,MAAA,CAAO,MAAA;AAAA,MACP,OAAO,YAAA,IAAgB;AAAA,KACzB;AACF,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,YAAY,CAAA;AAAA,EAC3C;AAAA,EAEA,YAAA,CAAa,IAAY,MAAA,EAA0B;AACjD,IAAA,IAAA,CAAK,GACF,OAAA,CAAQ,6EAA6E,CAAA,CACrF,GAAA,CAAI,QAAQ,EAAE,CAAA;AAAA,EACnB;AAAA,EAEA,UAAA,CAAW,EAAA,EAAY,IAAA,EAAc,QAAA,EAAgC;AACnE,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,QACC;AAAA,OACF,CACC,GAAA,CAAI,IAAA,EAAM,QAAA,EAAU,EAAE,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,QACC;AAAA,OACF,CACC,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,mBAAA,CAAoB,IAAY,UAAA,EAA0B;AACxD,IAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,MACC;AAAA,KACF,CACC,GAAA,CAAI,UAAA,EAAY,EAAE,CAAA;AAAA,EACvB;AAAA,EAEA,iBAAA,CAAkB,IAAY,QAAA,EAAwB;AACpD,IAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,MACC;AAAA,KACF,CACC,GAAA,CAAI,QAAA,EAAU,EAAE,CAAA;AAAA,EACrB;AAAA,EAEA,OAAO,EAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,qCAAqC,CAAA,CAAE,IAAI,EAAE,CAAA;AAAA,EAC/D;AAAA;AAAA,EAIA,gBAAgB,IAAA,EAAoC;AAClD,IAAA,MAAM,UAAU,IAAA,CAAK,EAAA,CAAG,QAAQ,4CAA4C,CAAA,CAAE,IAAI,IAAI,CAAA;AAItF,IAAA,IAAI,OAAA,EAAS,OAAO,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAE/C,IAAA,MAAM,OAAA,GAAU,KAAK,EAAA,CAClB,OAAA,CAAQ,iDAAiD,CAAA,CACzD,GAAA,CAAI,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,CAAI,CAAA;AAEpB,IAAA,IAAI,OAAA,EAAS,OAAO,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAE/C,IAAA,MAAM,UAAA,GAAa,KAAK,EAAA,CACrB,OAAA,CAAQ,uDAAuD,CAAA,CAC/D,GAAA,CAAI,CAAA,EAAA,EAAK,IAAI,CAAA,GAAA,CAAK,CAAA;AAErB,IAAA,OAAO,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA,GAAI,IAAA;AAAA,EACxD;AAAA,EAEA,cAAc,MAAA,EAAsC;AAClD,IAAA,MAAM,MAAM,IAAA,CAAK,EAAA,CACd,QAAQ,qDAAqD,CAAA,CAC7D,IAAI,MAAM,CAAA;AACb,IAAA,OAAO,GAAA,GAAM,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA,GAAI,IAAA;AAAA,EAC1C;AAAA,EAEA,eAAe,KAAA,EAA4B;AACzC,IAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,MACC,CAAA;AAAA,4CAAA;AAAA,KAEF,CACC,GAAA,CAAI,KAAA,CAAM,YAAA,EAAc,KAAA,CAAM,YAAA,EAAc,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,EAC3F;AAAA;AAAA,EAIA,QAAQ,GAAA,EAA4B;AAClC,IAAA,MAAM,MAAM,IAAA,CAAK,EAAA,CAAG,QAAQ,+CAA+C,CAAA,CAAE,IAAI,GAAG,CAAA;AAGpF,IAAA,OAAO,KAAK,KAAA,IAAS,IAAA;AAAA,EACvB;AAAA,EAEA,OAAA,CAAQ,KAAa,KAAA,EAAqB;AACxC,IAAA,IAAA,CAAK,GACF,OAAA,CAAQ,iEAAiE,CAAA,CACzE,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,EACnB;AAAA;AAAA,EAIA,iBAAiB,SAAA,EAA4B;AAC3C,IAAA,MAAM,MAAM,IAAA,CAAK,EAAA,CAAG,QAAQ,kDAAkD,CAAA,CAAE,IAAI,SAAS,CAAA;AAC7F,IAAA,OAAO,CAAC,CAAC,GAAA;AAAA,EACX;AAAA,EAEA,gBAAgB,SAAA,EAA6C;AAC3D,IAAA,MAAM,MAAM,IAAA,CAAK,EAAA,CACd,QAAQ,kDAAkD,CAAA,CAC1D,IAAI,SAAS,CAAA;AAChB,IAAA,OAAO,GAAA,GAAM,IAAA,CAAK,kBAAA,CAAmB,GAAG,CAAA,GAAI,IAAA;AAAA,EAC9C;AAAA,EAEA,iBAAiB,YAAA,EAA2C;AAC1D,IAAA,MAAM,OAAO,IAAA,CAAK,EAAA,CACf,QAAQ,sDAAsD,CAAA,CAC9D,IAAI,YAAY,CAAA;AACnB,IAAA,OAAO,KAAK,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,kBAAA,CAAmB,CAAC,CAAC,CAAA;AAAA,EACnD;AAAA,EAEA,aAAa,KAAA,EAAgC;AAC3C,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,IAAA,CAAK,EAAA,CACF,OAAA;AAAA,MACC,CAAA;AAAA;AAAA,oCAAA;AAAA,KAGF,CACC,GAAA;AAAA,MACC,EAAA;AAAA,MACA,KAAA,CAAM,SAAA;AAAA,MACN,KAAA,CAAM,YAAA;AAAA,MACN,KAAA,CAAM,YAAA;AAAA,MACN,KAAA,CAAM,QAAA;AAAA,MACN,KAAA,CAAM,QAAA;AAAA,MACN,KAAA,CAAM;AAAA,KACR;AAAA,EACJ;AAAA,EAEA,mBAAmB,SAAA,EAAyB;AAC1C,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,gDAAgD,CAAA,CAAE,IAAI,SAAS,CAAA;AAAA,EACjF;AAAA,EAEQ,mBAAmB,GAAA,EAA4C;AACrE,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,cAAc,GAAA,CAAI,cAAA;AAAA,MAClB,cAAc,GAAA,CAAI,cAAA;AAAA,MAClB,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,UAAU,GAAA,CAAI;AAAA,KAChB;AAAA,EACF;AAAA;AAAA,EAIA,oBAAA,CAAqB,MAAc,OAAA,EAAiC;AAClE,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,IAAA,CAAK,GAAG,OAAA,CAAQ,yCAAyC,EAAE,GAAA,CAAI,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE,CAAA;AACzF,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAQ,CAAA,iBAAA,EAAoB,IAAI,IAAI,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,EAClE;AAAA,EAEA,mBAAmB,IAAA,EAAgC;AACjD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE,CAAA;AACrD,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,IACzB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA,EAIA,YAAe,EAAA,EAAgB;AAC7B,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,EAAE,CAAA,EAAE;AAAA,EACjC;AAAA;AAAA,EAIQ,OAAO,GAAA,EAA6B;AAC1C,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,cAAc,GAAA,CAAI,aAAA;AAAA,MAClB,cAAc,GAAA,CAAI,cAAA;AAAA,MAClB,gBAAgB,GAAA,CAAI,gBAAA;AAAA,MACpB,aAAa,GAAA,CAAI,YAAA;AAAA,MACjB,kBAAkB,GAAA,CAAI,kBAAA;AAAA,MACtB,mBAAmB,GAAA,CAAI,mBAAA;AAAA,MACvB,eAAe,GAAA,CAAI,cAAA;AAAA,MACnB,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,cAAc,GAAA,CAAI,aAAA;AAAA,MAClB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,WAAW,GAAA,CAAI;AAAA,KACjB;AAAA,EACF;AAAA,EAEQ,eAAe,GAAA,EAAoC;AACzD,IAAA,OAAO;AAAA,MACL,cAAc,GAAA,CAAI,aAAA;AAAA,MAClB,cAAc,GAAA,CAAI,cAAA;AAAA,MAClB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAW,IAAI;AAAA,KACzC;AAAA,EACF;AACF;;;ACvUA,IAAM,UAAA,GAAa,qCAAA;AACnB,IAAM,cAAA,GAAiB,2BAAA;AAOhB,IAAM,iBAAN,MAAqB;AAAA,EAClB,MAAA,uBAAgD,GAAA,EAAI;AAAA,EACpD,gBAAA,GAA4C,IAAA;AAAA,EAEpD,oBAAoB,QAAA,EAAkC;AACpD,IAAA,IAAA,CAAK,gBAAA,GAAmB,QAAA;AAAA,EAC1B;AAAA,EAEA,WAAW,UAAA,EAAgE;AACzE,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,kBAAA,CACE,aACA,KAAA,EACqC;AACrC,IAAA,MAAM,MAAA,GAA8C;AAAA,MAClD,KAAA,EAAO,EAAE,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,EAAE,OAAA,EAAS,KAAA,EAAM,EAAG,CAAA;AAAE,KACjD;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACtD,MAAA,IAAI,QAAQ,OAAA,EAAS;AACrB,MAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AAE3C,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AACtC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,UAAA,CAAW,MAAM,KAAK,CAAA;AAC7D,QAAA,IAAI,SAAA,EAAW,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA;AAAA,MAC/B,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAC3C,QAAA,IAAI,QAAA,EAAU,MAAA,CAAO,GAAG,CAAA,GAAI,QAAA;AAAA,MAC9B;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,qBAAqB,WAAA,EAA+D;AAClF,IAAA,MAAM,SAAkC,EAAC;AAEzC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxD,MAAA,MAAM,IAAA,GAAO,OAAA;AACb,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AACpC,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,eAAA,CAAgB,MAAc,KAAA,EAA4C;AAChF,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,WAAA;AACH,QAAA,OAAO,EAAE,SAAA,EAAW,CAAC,EAAE,IAAA,EAAM,EAAE,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,EAAE,EAAG,CAAA,EAAE;AAAA,MAE7D,KAAK,QAAA;AACH,QAAA,OAAO,EAAE,QAAQ,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,MAErE,KAAK,QAAA;AACH,QAAA,OAAO,EAAE,MAAA,EAAQ,EAAE,MAAM,MAAA,CAAO,KAAK,GAAE,EAAE;AAAA,MAE3C,KAAK,cAAA,EAAgB;AACnB,QAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAC7B,QACA,MAAA,CAAO,KAAK,CAAA,CACT,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA;AAC1B,QAAA,OAAO,EAAE,YAAA,EAAc,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAmB,EAAE,IAAA,EAAM,MAAA,CAAO,IAAI,CAAA,EAAE,CAAE,CAAA,EAAE;AAAA,MAChF;AAAA,MAEA,KAAK,UAAA;AACH,QAAA,OAAO,EAAE,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA,EAAE;AAAA,MAEpC,KAAK,MAAA,EAAQ;AACX,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,WAAW,KAAA,EAAO;AACnE,UAAA,MAAM,GAAA,GAAM,KAAA;AACZ,UAAA,OAAO,EAAE,IAAA,EAAM,EAAE,KAAA,EAAO,GAAA,CAAI,OAAO,GAAA,EAAK,GAAA,CAAI,GAAA,IAAO,IAAA,EAAK,EAAE;AAAA,QAC5D;AACA,QAAA,MAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC5B,QAAA,IAAI,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA,EAAG;AAC5B,UAAA,OAAO,EAAE,IAAA,EAAM,EAAE,OAAO,OAAA,EAAS,GAAA,EAAK,MAAK,EAAE;AAAA,QAC/C;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,MAEA,KAAK,KAAA;AACH,QAAA,OAAO,EAAE,GAAA,EAAK,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,MAE9B,KAAK,OAAA;AACH,QAAA,OAAO,EAAE,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,MAEhC,KAAK,cAAA;AACH,QAAA,OAAO,EAAE,YAAA,EAAc,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,MAEvC,KAAK,QAAA;AACH,QAAA,OAAO,EAAE,MAAA,EAAQ,EAAE,MAAM,MAAA,CAAO,KAAK,GAAE,EAAE;AAAA,MAE3C,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACnD,QAAA,MAAM,MAA6B,EAAC;AACpC,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AACvB,UAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,cAAc,CAAA;AACtC,UAAA,IAAI,KAAA,GAAQ,CAAC,CAAA,IAAK,IAAA,CAAK,gBAAA,EAAkB;AACvC,YAAA,MAAM,SAAS,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA;AACrD,YAAA,IAAI,QAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,EAAA,EAAI,QAAQ,CAAA;AAAA,UACrC,CAAA,MAAA,IAAW,GAAA,CAAI,KAAA,CAAM,oBAAoB,CAAA,EAAG;AAC1C,YAAA,GAAA,CAAI,IAAA,CAAK,EAAE,EAAA,EAAI,GAAA,EAAK,CAAA;AAAA,UACtB;AAAA,QACF;AACA,QAAA,OAAO,IAAI,MAAA,GAAS,CAAA,GAAI,EAAE,QAAA,EAAU,KAAI,GAAI,IAAA;AAAA,MAC9C;AAAA,MAEA,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACnD,QAAA,MAAM,SAAA,GAAY,KAAA,CACf,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,UAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,UAAA,IAAI,CAAA,CAAE,MAAM,oBAAoB,CAAA,SAAU,EAAE,MAAA,EAAQ,MAAA,EAAiB,EAAA,EAAI,CAAA,EAAE;AAC3E,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA,CACA,MAAA,CAAO,OAAO,CAAA;AACjB,QAAA,OAAO,UAAU,MAAA,GAAS,CAAA,GAAI,EAAE,MAAA,EAAQ,WAAU,GAAI,IAAA;AAAA,MACxD;AAAA,MAEA,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,WAAW,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACtD,QAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM;AACnC,UAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,IAAQ,SAAS,CAAA,EAAG;AACrD,YAAA,MAAM,GAAA,GAAM,CAAA;AACZ,YAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,GAAA,CAAI,IAAA,IAAQ,MAAA,EAAQ,QAAA,EAAU,EAAE,GAAA,EAAK,GAAA,CAAI,GAAA,EAAI,EAAE;AAAA,UAClF;AACA,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,UAAA;AAAA,YACN,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,YACd,QAAA,EAAU,EAAE,GAAA,EAAK,MAAA,CAAO,CAAC,CAAA;AAAE,WAC7B;AAAA,QACF,CAAC,CAAA;AACD,QAAA,OAAO,EAAE,OAAO,QAAA,EAAS;AAAA,MAC3B;AAAA,MAEA,KAAK,cAAA;AAAA,MACL,KAAK,kBAAA;AAAA,MACL,KAAK,YAAA;AAAA,MACL,KAAK,gBAAA;AAAA,MACL,KAAK,SAAA;AAAA,MACL,KAAK,QAAA;AAAA,MACL,KAAK,WAAA;AAAA,MACL,KAAK,cAAA;AACH,QAAA,OAAO,IAAA;AAAA,MAET;AACE,QAAA,OAAO,EAAE,SAAA,EAAW,CAAC,EAAE,IAAA,EAAM,EAAE,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,EAAE,EAAG,CAAA,EAAE;AAAA;AAC/D,EACF;AAAA,EAEQ,gBAAgB,KAAA,EAA4C;AAClE,IAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,MAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAAA,IAC3B;AACA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,IACzB;AACA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,OAAO;AAAA,QACL,YAAA,EAAc,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,MAAA,CAAO,CAAC,CAAA,EAAE,CAAE;AAAA,OACtD;AAAA,IACF;AACA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAI,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA,EAAG;AAC1B,QAAA,OAAO,EAAE,IAAA,EAAM,EAAE,OAAO,KAAA,EAAO,GAAA,EAAK,MAAK,EAAE;AAAA,MAC7C;AACA,MAAA,IAAI,MAAM,UAAA,CAAW,SAAS,KAAK,KAAA,CAAM,UAAA,CAAW,UAAU,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,KAAK,KAAA,EAAM;AAAA,MACtB;AACA,MAAA,OAAO,EAAE,SAAA,EAAW,CAAC,EAAE,IAAA,EAAM,EAAE,OAAA,EAAS,KAAA,EAAM,EAAG,CAAA,EAAE;AAAA,IACrD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,aAAa,IAAA,EAAuD;AAC1E,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,WAAA,EAAa;AAChB,QAAA,MAAM,MAAM,IAAA,CAAK,SAAA;AACjB,QAAA,OAAO,GAAA,EAAK,IAAI,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,IAAK,IAAA;AAAA,MACnD;AAAA,MACA,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACd,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,MAAM,IAAA,CAAK,MAAA;AACjB,QAAA,OAAO,KAAK,IAAA,IAAQ,IAAA;AAAA,MACtB;AAAA,MACA,KAAK,cAAA,EAAgB;AACnB,QAAA,MAAM,QAAQ,IAAA,CAAK,YAAA;AACnB,QAAA,OAAO,OAAO,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,KAAK,EAAC;AAAA,MACvC;AAAA,MACA,KAAK,UAAA;AACH,QAAA,OAAO,IAAA,CAAK,QAAA;AAAA,MACd,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,UAAU,IAAA,CAAK,IAAA;AACrB,QAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,QAAA,IAAI,OAAA,CAAQ,KAAK,OAAO,EAAE,OAAO,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI;AACjE,QAAA,OAAO,OAAA,CAAQ,KAAA;AAAA,MACjB;AAAA,MACA,KAAK,KAAA;AACH,QAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MACd,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,KAAA;AAAA,MACd,KAAK,cAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACd,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,QAAA,OAAO,QAAQ,IAAA,IAAQ,IAAA;AAAA,MACzB;AAAA,MACA,KAAK,cAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACd,KAAK,kBAAA;AACH,QAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,MACd,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,QAAA,OAAO,MAAA,EAAQ,IAAI,CAAC,CAAA,KAAM,EAAE,IAAA,IAAQ,CAAA,CAAE,EAAE,CAAA,IAAK,EAAC;AAAA,MAChD;AAAA,MACA,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAQnB,QAAA,OACE,KAAA,EAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACjB,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,GAAA,EAAK,EAAE,IAAA,KAAS,MAAA,GAAS,EAAE,IAAA,EAAM,GAAA,GAAM,EAAE,QAAA,EAAU;AAAA,SACrD,CAAE,KAAK,EAAC;AAAA,MAEZ;AAAA,MACA,KAAK,SAAA,EAAW;AACd,QAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,QAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,QAAA,OAAO,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,MAC7B;AAAA,MACA,KAAK,UAAA,EAAY;AACf,QAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AACjB,QAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,MAAA,KAAW,CAAA,SAAU,EAAC;AACtC,QAAA,OAAO,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM;AACpB,UAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,YAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,aAAA,CAAc,EAAE,EAAE,CAAA;AACtD,YAAA,IAAI,KAAA,EAAO,OAAO,CAAA,EAAA,EAAK,KAAK,CAAA,EAAA,CAAA;AAAA,UAC9B;AACA,UAAA,OAAO,CAAA,CAAE,EAAA;AAAA,QACX,CAAC,CAAA;AAAA,MACH;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,QAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAC3B,UAAA,MAAM,MAAM,MAAA,CAAO,KAAA;AACnB,UAAA,OAAO,IAAI,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,YAAA,CAAa,IAAI,CAAC,CAAA;AAAA,QAClD;AACA,QAAA,OAAO,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,IAAK,IAAA;AAAA,MAChC;AAAA,MACA,KAAK,WAAA,EAAa;AAChB,QAAA,MAAM,MAAM,IAAA,CAAK,SAAA;AACjB,QAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,QAAA,OAAO,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,MAAM,CAAA,CAAA,GAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAAA,MACvE;AAAA,MACA,KAAK,YAAA;AAAA,MACL,KAAK,gBAAA,EAAkB;AACrB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAC3B,QAAA,OAAO,IAAA,EAAM,IAAA,IAAQ,IAAA,EAAM,EAAA,IAAM,IAAA;AAAA,MACnC;AAAA,MACA,KAAK,cAAA,EAAgB;AACnB,QAAA,MAAM,IAAI,IAAA,CAAK,YAAA;AACf,QAAA,OAAO,GAAG,KAAA,IAAS,IAAA;AAAA,MACrB;AAAA,MACA;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF;AACF;;;ACzRO,IAAM,YAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EACP,MAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,cAAA,GAAiB,IAAI,cAAA,EAAe;AAAA,EAErD,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO;AAAA,MACvB,MAAM,OAAA,CAAQ,KAAA;AAAA,MACd,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,KACjC,CAAA;AACD,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AACrB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,IAAA,CAAK,OAAA,CAAQ,eAAe,CAAC,CAAA;AAAA,EAC/C;AAAA,EAEA,iBAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA,EAIA,MAAM,QAAQ,MAAA,EAA6C;AACzD,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACV,MAAM,KAAK,MAAA,CAAO,KAAA,CAAM,SAAS,EAAE,OAAA,EAAS,QAAQ;AAAA,KACtD;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,MAAA,EAMe;AAC9B,IAAA,MAAM,MAAA,GACJ,MAAA,CAAO,UAAA,KAAe,UAAA,GAClB,EAAE,WAAA,EAAa,MAAA,CAAO,QAAA,EAAS,GAC/B,EAAE,OAAA,EAAS,MAAA,CAAO,QAAA,EAAS;AAEjC,IAAA,MAAM,UAAA,GACJ,OAAO,UAAA,KAAe,MAAA,GAClB,EAAE,KAAA,EAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAA,EAAS,OAAO,KAAA,EAAM,EAAG,CAAA,EAAE,EAAE,GACxD,MAAA,CAAO,UAAA,IAAwB;AAAA,MAC/B,KAAA,EAAO,EAAE,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,EAAE,OAAA,EAAS,MAAA,CAAO,KAAA,EAAM,EAAG,CAAA;AAAE,KACxD;AAEN,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACV,MACE,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO;AAAA,QACvB,MAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAU,MAAA,CAAO;AAAA,OAClB;AAAA,KACL;AAAA,EACF;AAAA,EAEA,MAAM,uBAAuB,MAAA,EAMG;AAC9B,IAAA,MAAM,MAAA,GACJ,MAAA,CAAO,UAAA,KAAe,UAAA,GAClB,EAAE,WAAA,EAAa,MAAA,CAAO,QAAA,EAAS,GAC/B,EAAE,OAAA,EAAS,MAAA,CAAO,QAAA,EAAS;AAEjC,IAAA,MAAM,UAAA,GACJ,OAAO,UAAA,KAAe,MAAA,GAClB,EAAE,KAAA,EAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAA,EAAS,OAAO,KAAA,EAAM,EAAG,CAAA,EAAE,EAAE,GACxD,MAAA,CAAO,UAAA,IAAwB;AAAA,MAC/B,KAAA,EAAO,EAAE,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,EAAE,OAAA,EAAS,MAAA,CAAO,KAAA,EAAM,EAAG,CAAA;AAAE,KACxD;AAEN,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACV,MACE,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO;AAAA,QACvB,MAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAU,MAAA,CAAO;AAAA,OAClB;AAAA,KACL;AAAA,EACF;AAAA,EAEA,MAAM,oBAAA,CACJ,MAAA,EACA,UAAA,EAC6B;AAC7B,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACV,MACE,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO;AAAA,QACvB,OAAA,EAAS,MAAA;AAAA,QACT;AAAA,OACD;AAAA,KACL;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,gBAAgB,MAAA,EAA+C;AACnE,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,gBAAA,CAAiB,EAAE,OAAA,EAAS,MAAA,EAAQ,CAAC,CAAA;AAAA,EACzF;AAAA,EAEA,MAAM,mBAAA,CAAoB,MAAA,EAAgB,QAAA,EAAiD;AACzF,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MAAc,MACxB,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,cAAA,CAAe;AAAA,QAC/B,OAAA,EAAS,MAAA;AAAA,QACT,IAAA,EAAM,iBAAA;AAAA,QACN,eAAA,EAAiB;AAAA,UACf,OAAA,EAAS,QAAA;AAAA,UACT,sBAAA,EAAwB;AAAA;AAC1B,OACD;AAAA,KACH;AAAA,EACF;AAAA,EAEA,MAAM,yBAAA,CACJ,MAAA,EACA,OAAA,EAC+B;AAC/B,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MAAc,MACxB,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,cAAA,CAAe;AAAA,QAC/B,OAAA,EAAS,MAAA;AAAA,QACT,IAAA,EAAM,gBAAA;AAAA,QACN,cAAA,EAAgB;AAAA,UACd,eAAA,EAAiB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,YACnC,SAAS,CAAA,CAAE,MAAA;AAAA,YACX,SAAS,CAAA,CAAE,MAAA;AAAA,YACX,mBAAA,EAAqB,EAAE,UAAA,IAAc;AAAA,WACvC,CAAE,CAAA;AAAA,UACF,sBAAA,EAAwB;AAAA;AAC1B,OACD;AAAA,KACH;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,QAAA,CACJ,MAAA,EACA,WAAA,EACA,aAAA,EAC6B;AAC7B,IAAA,MAAM,MAAA,GACJ,kBAAkB,UAAA,GAAa,EAAE,aAAa,WAAA,EAAY,GAAI,EAAE,OAAA,EAAS,WAAA,EAAY;AACvF,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACV,MACE,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO;AAAA,QACvB,OAAA,EAAS,MAAA;AAAA,QACT;AAAA,OACQ;AAAA,KACd;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,oBAAoB,UAAA,EAAsD;AACtF,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AAC3C,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AACvI,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,aAAA,CAAc,YAAY;AAChD,MAAA,MAAM,CAAA,GAAI,MAAM,KAAA,CAAM,CAAA,oCAAA,EAAuC,SAAS,CAAA,CAAA,EAAI;AAAA,QACxE,OAAA,EAAS;AAAA,UACP,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,UACnC,gBAAA,EAAkB,YAAA;AAAA,UAClB,cAAA,EAAgB;AAAA;AAClB,OACD,CAAA;AACD,MAAA,IAAI,CAAC,EAAE,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA;AAC/D,MAAA,OAAQ,MAAM,EAAE,IAAA,EAAK;AAAA,IACvB,CAAC,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,iBAAiB,UAAA,EAAqC;AAC1D,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,mBAAA,CAAoB,UAAU,CAAA;AACpD,IAAA,MAAM,WAAW,EAAA,CAAG,KAAA;AACpB,IAAA,OAAO,QAAA,GAAW,CAAC,CAAA,EAAG,UAAA,IAAc,EAAA;AAAA,EACtC;AAAA,EAEA,MAAM,kBACJ,UAAA,EACuD;AACvD,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,mBAAA,CAAoB,UAAU,CAAA;AACpD,IAAA,MAAM,aAAa,EAAA,CAAG,UAAA;AACtB,IAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AACzB,IAAA,MAAM,SAAuD,EAAC;AAC9D,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,MAAA,MAAA,CAAO,IAAI,IAAI,EAAE,EAAA,EAAI,KAAK,EAAA,EAAI,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,IAChD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,aAAA,CACJ,UAAA,EACA,OAAA,EACuE;AACvE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA;AAClD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA;AAAA,MAAc,MACxC,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,KAAA,CAAM;AAAA,QAC5B,cAAA,EAAgB,IAAA;AAAA,QAChB,cAAc,OAAA,EAAS,WAAA;AAAA,QACvB,SAAA,EAAW,SAAS,QAAA,IAAY,GAAA;AAAA,QAChC,QAAQ,OAAA,EAAS;AAAA,OAClB;AAAA,KACH;AACA,IAAA,OAAO;AAAA,MACL,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,YAAY,QAAA,CAAS;AAAA,KACvB;AAAA,EACF;AAAA,EAEA,MAAM,qBAAA,CAAsB,UAAA,EAAoB,MAAA,EAAiD;AAC/F,IAAA,MAAM,MAA4B,EAAC;AACnC,IAAA,IAAI,MAAA;AAEJ,IAAA,GAAG;AACD,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,UAAA,EAAY;AAAA,QACpD,WAAA,EAAa,MAAA;AAAA,QACb,QAAA,EAAU,GAAA;AAAA,QACV;AAAA,OACD,CAAA;AACD,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,QAAA,CAAS,OAAO,CAAA;AAC5B,MAAA,MAAA,GAAS,SAAS,UAAA,IAAc,MAAA;AAAA,IAClC,CAAA,QAAS,MAAA;AAET,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,gBAAgB,UAAA,EAAqC;AACzD,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,aAAA;AAAA,MAAc,MAClC,KAAK,MAAA,CAAO,SAAA,CAAU,SAAS,EAAE,WAAA,EAAa,YAAY;AAAA,KAC5D;AACA,IAAA,MAAM,cAAe,EAAA,CAA2D,YAAA;AAChF,IAAA,OAAO,WAAA,GAAc,CAAC,CAAA,EAAG,EAAA,IAAM,UAAA;AAAA,EACjC;AAAA,EAEA,MAAM,YAAY,MAAA,EAA+B;AAC/C,IAAA,MAAM,IAAA,CAAK,aAAA,CAAc,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA;AAAA,EAC9F;AAAA,EAEA,MAAM,gBAAgB,OAAA,EAAyC;AAC7D,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,aAAA;AAAA,QAAc,MACrC,KAAK,MAAA,CAAO,MAAA,CAAO,SAAS,EAAE,QAAA,EAAU,SAAS;AAAA,OACnD;AACA,MAAA,MAAM,CAAA,GAAI,KAAA;AAQV,MAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,IAAQ,CAAA,CAAE,OAAO,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAA;AACzD,MAAA,OAAO,KAAA,EAAO,IAAA,EAAM,GAAA,IAAO,KAAA,EAAO,UAAU,GAAA,IAAO,IAAA;AAAA,IACrD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,OAAA,EAA+C;AAC5D,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MAAc,MACxB,KAAK,MAAA,CAAO,MAAA,CAAO,SAAS,EAAE,QAAA,EAAU,SAAS;AAAA,KACnD;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,YAAA,CACJ,OAAA,EACA,OAAA,EAIC;AACD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA;AAAA,MAAc,MACxC,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,SAAS,IAAA,CAAK;AAAA,QAC/B,QAAA,EAAU,OAAA;AAAA,QACV,cAAc,OAAA,EAAS,WAAA;AAAA,QACvB,SAAA,EAAW,SAAS,QAAA,IAAY;AAAA,OACjC;AAAA,KACH;AACA,IAAA,OAAO;AAAA,MACL,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,YAAY,QAAA,CAAS;AAAA,KACvB;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,OAAA,EAAiD;AACtE,IAAA,MAAM,SAAgC,EAAC;AACvC,IAAA,IAAI,MAAA;AAEJ,IAAA,GAAG;AACD,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,SAAS,EAAE,WAAA,EAAa,QAAQ,CAAA;AACzE,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAgC,MAAA,IAAU,CAAC,CAAC,CAAA;AACpF,MAAA,MAAA,GAAS,SAAS,UAAA,IAAc,MAAA;AAAA,IAClC,CAAA,QAAS,MAAA;AAET,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,OAAwB,qBAAA,mBAAwB,IAAI,GAAA,CAAI;AAAA,IACtD,aAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AAAA,EAED,MAAM,qBAAqB,OAAA,EAAiD;AAC1E,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA;AAC1D,IAAA,MAAM,SAAA,GAAmC,CAAC,GAAG,cAAc,CAAA;AAE3D,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA,KAAM;AAC5C,MAAA,IAAI,CAAC,CAAA,CAAE,YAAA,EAAc,OAAO,KAAA;AAC5B,MAAA,IAAI,EAAE,IAAA,KAAS,YAAA,IAAgB,CAAA,CAAE,IAAA,KAAS,kBAAkB,OAAO,KAAA;AACnE,MAAA,IAAI,cAAa,qBAAA,CAAsB,GAAA,CAAI,CAAA,CAAE,IAAI,GAAG,OAAO,IAAA;AAC3D,MAAA,IAAI,CAAA,CAAE,SAAS,cAAA,EAAgB;AAC7B,QAAA,MAAM,EAAA,GAAK,CAAA;AACX,QAAA,OAAO,EAAA,CAAG,cAAc,WAAA,KAAgB,IAAA;AAAA,MAC1C;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,KAAA,MAAW,aAAa,QAAA,EAAU;AAChC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,oBAAA,CAAqB,UAAU,EAAE,CAAA;AAC3D,QAAA,SAAA,CAAU,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,MAC1B,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEA,MAAM,cAAA,CAAe,OAAA,EAAiB,QAAA,EAAoC;AACxE,IAAA,MAAM,UAAA,GAAa,GAAA;AACnB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,MAAA,EAAQ,KAAK,UAAA,EAAY;AACpD,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,IAAI,UAAU,CAAA;AAC9C,MAAA,MAAM,IAAA,CAAK,aAAA;AAAA,QAAc,MACvB,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,SAAS,MAAA,CAAO;AAAA,UACjC,QAAA,EAAU,OAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACX;AAAA,OACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,OAAA,EAAgC;AAChD,IAAA,MAAM,IAAA,CAAK,aAAA,CAAc,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,EAAE,QAAA,EAAU,OAAA,EAAS,CAAC,CAAA;AAAA,EACjF;AAAA;AAAA,EAIA,MAAM,UAAA,CAAW,QAAA,EAAgB,QAAA,EAAkB,WAAA,EAAsC;AACvF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA;AAAA,MAAc,MACtC,KAAK,MAAA,CAAO,WAAA,CAAY,OAAO,EAAE,QAAA,EAAU,YAAA,EAAc,WAAA,EAAa;AAAA,KACxE;AAEA,IAAA,MAAM,eAAgB,MAAA,CAAqC,EAAA;AAE3D,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,aAAA;AAAA,MAAc,MAC1C,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK;AAAA,QAC3B,cAAA,EAAgB,YAAA;AAAA,QAChB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA;AAAS,OAClC;AAAA,KACH;AAEA,IAAA,MAAM,SAAU,UAAA,CAA6C,MAAA;AAC7D,IAAA,IAAI,WAAW,SAAA,EAAW;AACxB,MAAA,MAAM,IAAA,CAAK,aAAA;AAAA,QAAc,MACvB,KAAK,MAAA,CAAO,WAAA,CAAY,SAAS,EAAE,cAAA,EAAgB,cAAc;AAAA,OACnE;AAAA,IACF;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,OAAO,MAAA,EAK6D;AACxE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA;AAAA,MAAc,MACxC,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO;AAAA,QACjB,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,cAAc,MAAA,CAAO,WAAA;AAAA,QACrB,SAAA,EAAW,OAAO,QAAA,IAAY;AAAA,OAC/B;AAAA,KACH;AACA,IAAA,OAAO;AAAA,MACL,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,YAAY,QAAA,CAAS;AAAA,KACvB;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,QAAA,EAAiD;AACnE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,oBAAA,CAAqB,QAAQ,CAAA;AACvD,IAAA,MAAM,kBAAkB,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,YAAY,CAAA;AAEpE,IAAA,IAAI,eAAA,CAAgB,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAE1C,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,GAAA,CAAI,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,OAAA,CAAQ,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA;AAC9E,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,oBAAoB,QAAA,EAAqC;AAC7D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,oBAAA,CAAqB,QAAQ,CAAA;AACvD,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,gBAAgB,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,uBAAuB,QAAA,EAAiD;AAC5E,IAAA,MAAM,MAA4B,EAAC;AACnC,IAAA,IAAI,YAAA,GAAyB,CAAC,QAAQ,CAAA;AAEtC,IAAA,OAAO,YAAA,CAAa,SAAS,CAAA,EAAG;AAC9B,MAAA,MAAM,YAAsB,EAAC;AAE7B,MAAA,KAAA,MAAW,MAAM,YAAA,EAAc;AAC7B,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,EAAE,CAAA;AAC5C,QAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,UAAA,GAAA,CAAI,KAAK,KAAK,CAAA;AACd,UAAA,SAAA,CAAU,IAAA,CAAK,MAAM,EAAE,CAAA;AAAA,QACzB;AAAA,MACF;AAEA,MAAA,YAAA,GAAe,SAAA;AAAA,IACjB;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,kBAAkB,UAAA,EAA2C;AACjE,IAAA,MAAM,WAAyB,EAAC;AAChC,IAAA,IAAI,MAAA;AAEJ,IAAA,GAAG;AACD,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA;AAAA,QAAc,MACxC,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK;AAAA,UACrB,WAAA,EAAa,UAAA;AAAA,UACb,YAAA,EAAc,MAAA;AAAA,UACd,SAAA,EAAW;AAAA,SACZ;AAAA,OACH;AAEA,MAAA,MAAM,WAAY,QAAA,CAAuC,OAAA;AACzD,MAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,EAAY,CAAA;AAClD,UAAA,IAAI,MAAA,EAAQ,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AAAA,QAClC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,MAAA,GAAU,QAAA,CAAuC,WAAA;AAAA,IACnD,CAAA,QAAS,MAAA;AAET,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,MAAA,EAA4C;AACxD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,aAAA,CAAc,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,EAAE,OAAA,EAAS,MAAA,EAAQ,CAAC,CAAA;AAE3F,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,OAAO,IAAA;AAEpB,IAAA,OAAO,kBAAkB,CAAC,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAM,uBAAuB,UAAA,EAAkD;AAC7E,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,iBAAA,CAAkB,UAAU,CAAA;AACrD,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MACnC;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAIA,aAAa,IAAA,EAA4C;AACvD,IAAA,MAAM,GAAA,GAAM,IAAA;AAOZ,IAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,OAAO,IAAA;AAEvB,IAAA,IAAI,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,MAAM,IAAA,EAAM;AAC/C,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,MAAA;AAAA,QACN,GAAA,EAAK,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,GAAA;AAAA,QACpB,UAAA,EAAY,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK;AAAA,OAC7B;AAAA,IACF;AACA,IAAA,IAAI,IAAI,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,GAAA,CAAI,MAAM,QAAA,EAAU;AACvD,MAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,KAAK,GAAA,CAAI,KAAA,CAAM,SAAS,GAAA,EAAI;AAAA,IACzD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAY,IAAA,EAA2C;AACrD,IAAA,MAAM,GAAA,GAAM,IAAA;AASZ,IAAA,IAAI,CAAC,GAAA,CAAI,IAAA,EAAM,OAAO,IAAA;AAEtB,IAAA,QAAQ,GAAA,CAAI,KAAK,IAAA;AAAM,MACrB,KAAK,OAAA;AACH,QAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,GAAA,CAAI,KAAK,KAAA,EAAO;AAAA,MACjD,KAAK,UAAA;AACH,QAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,OAAO,GAAA,CAAI,IAAA,CAAK,SAAU,GAAA,EAAI;AAAA,MAC3D,KAAK,MAAA;AACH,QAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,GAAA,CAAI,IAAA,CAAK,KAAM,GAAA,EAAI;AAAA,MACnD,KAAK,MAAA;AACH,QAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,IAAA,CAAM,IAAA,EAAM,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,IAAA,CAAM,KAAA,EAAM;AAAA,MACjF;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF;AAAA;AAAA,EAIA,aAAa,IAAA,EAAkC;AAC7C,IAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AAInB,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,EAAG;AACvC,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,IAAA,CAAK,KAAA,EAAO;AACvC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,IAAc,EAAE,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAChE,QAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,MACrB;AAAA,IACF;AACA,IAAA,OAAO,2BAAA;AAAA,EACT;AAAA,EAEA,kBAAkB,IAAA,EAAmD;AACnE,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,oBAAA,CAAqB,IAAA,CAAK,UAAqC,CAAA;AAAA,EAC5F;AAAA;AAAA,EAIQ,eAAA,GAAkB,CAAA;AAAA,EACT,kBAAA,GAAqB,GAAA;AAAA,EAEtC,MAAc,cAAiB,EAAA,EAAkC;AAC/D,IAAA,MAAM,IAAA,CAAK,KAAK,OAAA,EAAQ;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,eAAA;AAC3B,MAAA,IAAI,OAAA,GAAU,KAAK,kBAAA,EAAoB;AACrC,QAAA,MAAM,KAAA,CAAM,IAAA,CAAK,kBAAA,GAAqB,OAAO,CAAA;AAAA,MAC/C;AACA,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,GAAA,EAAI;AAChC,MAAA,OAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA;AAAA,IACvC,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,KAAK,OAAA,EAAQ;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAc,gBAAA,CAAoB,EAAA,EAAsB,OAAA,GAAkB,CAAA,EAAe;AACvF,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,WAAA,CAAY,KAAK,CAAA,IAAK,OAAA,GAAU,CAAA,EAAG;AACrC,QAAA,MAAM,SAAA,GAAY,kBAAkB,KAAK,CAAA,IAAK,MAAO,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA;AACxE,QAAA,MAAM,MAAA,GAAS,SAAA,IAAa,GAAA,GAAM,IAAA,CAAK,QAAO,GAAI,GAAA,CAAA;AAClD,QAAA,MAAM,MAAM,MAAM,CAAA;AAClB,QAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,EAAA,EAAI,OAAA,GAAU,CAAC,CAAA;AAAA,MAC9C;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,YAAY,KAAA,EAAyB;AAC5C,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AACxD,EAAA,MAAM,OAAQ,KAAA,CAA4B,IAAA;AAC1C,EAAA,IAAI,IAAA,KAAS,iCAAA,IAAqC,IAAA,KAAS,YAAA,IAAgB,SAAS,WAAA,EAAa;AAC/F,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,EAAE,QAAA,IAAY,KAAA,CAAA,EAAQ,OAAO,KAAA;AACjC,EAAA,MAAM,SAAU,KAAA,CAA6B,MAAA;AAC7C,EAAA,OAAO,WAAW,GAAA,IAAO,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,OAAO,MAAA,KAAW,GAAA;AAC1E;AAEA,SAAS,kBAAkB,KAAA,EAA+B;AACxD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,aAAa,KAAA,EAAO;AACrE,IAAA,MAAM,UAAW,KAAA,CAA8C,OAAA;AAC/D,IAAA,MAAM,UAAA,GAAa,UAAU,aAAa,CAAA;AAC1C,IAAA,IAAI,UAAA,EAAY,OAAO,MAAA,CAAO,UAAU,CAAA,GAAI,GAAA;AAAA,EAC9C;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAEA,SAAS,kBAAkB,CAAA,EAA6C;AACtE,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,cAAc,CAAA,CAAE,cAAA;AAAA,IAChB,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACzB,MAAA,IAAI,cAAc,CAAA,EAAG;AACnB,QAAA,OAAO,EAAE,QAAA,EAAU,CAAA,CAAE,QAAA,EAAU,SAAA,EAAW,EAAE,SAAA,EAAU;AAAA,MACxD;AACA,MAAA,OAAO,EAAE,SAAA,EAAW,CAAA,CAAE,SAAA,EAAW,SAAA,EAAW,EAAE,SAAA,EAAU;AAAA,IAC1D,CAAC,CAAA;AAAA,IACD,GAAG,qBAAA,CAAsB,CAAA,CAAE,aAAa;AAAA,GAC1C;AACA,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,sBACP,GAAA,EAC4B;AAC5B,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAElB,EAAA,MAAM,SAAqC,EAAC;AAE5C,EAAA,IAAI,YAAA,IAAgB,GAAA,IAAO,GAAA,CAAI,UAAA,EAAY;AACzC,IAAA,MAAA,CAAO,UAAA,GAAa,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC7C,YAAY,CAAA,CAAE,WAAA;AAAA,MACd,cAAc,CAAA,CAAE,aAAA;AAAA,MAChB,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,MAAM,CAAA,CAAE;AAAA,KACV,CAAE,CAAA;AAAA,EACJ;AAEA,EAAA,IAAI,UAAA,IAAc,GAAA,IAAO,GAAA,CAAI,QAAA,EAAU;AACrC,IAAA,MAAM,KAAK,GAAA,CAAI,QAAA;AACf,IAAA,MAAA,CAAO,OAAA,GAAU;AAAA,MACf,MAAM,EAAA,CAAG,IAAA;AAAA,MACT,YAAY,EAAA,CAAG,WAAA;AAAA,MACf,YAAA,EAAc,eAAA,IAAmB,EAAA,GAAM,EAAA,CAAG,aAAA,GAA2B,MAAA;AAAA,MACrE,MACE,MAAA,IAAU,EAAA,IAAM,GAAG,IAAA,GACb,EAAA,CAAG,KAA0B,IAAA,GAC/B,MAAA;AAAA,MACN,eAAA,EAAiB,mBAAA,IAAuB,EAAA,GAAM,EAAA,CAAG,iBAAA,GAAgC;AAAA,KACnF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,IAAW,GAAA,IAAO,GAAA,CAAI,KAAA,EAAO;AAC/B,IAAA,MAAA,CAAO,KAAA,GAAQ;AAAA,MACb,IAAA,EAAM,IAAI,KAAA,CAAM,IAAA;AAAA,MAChB,UAAA,EAAY,IAAI,KAAA,CAAM;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,IAAI,YAAA,IAAgB,GAAA,EAAK,MAAA,CAAO,SAAA,GAAY,GAAA,CAAI,UAAA;AAChD,EAAA,IAAI,cAAA,IAAkB,GAAA,EAAK,MAAA,CAAO,WAAA,GAAc,GAAA,CAAI,YAAA;AAEpD,EAAA,IAAI,sBAAsB,GAAA,EAAK;AAC7B,IAAA,MAAA,CAAO,iBAAiB,GAAA,CAAI,gBAAA;AAC5B,IAAA,MAAA,CAAO,mBAAmB,GAAA,CAAI,kBAAA;AAAA,EAChC;AAEA,EAAA,IAAI,YAAA,IAAgB,GAAA,EAAK,MAAA,CAAO,SAAA,GAAY,GAAA,CAAI,UAAA;AAEhD,EAAA,OAAO,MAAA;AACT;;;ACrsBA,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,SAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,mBAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAID,SAAS,UAAU,KAAA,EAA4B;AAC7C,EAAA,OAAO,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,GAAI,KAAA,GAAQ,SAAA;AAC3C;AAgDO,IAAM,kBAAA,GAAN,MAAM,mBAAA,CAAmB;AAAA;AAAA,EAG9B,OAAO,QAAA,CAAS,OAAA,EAAiB,OAAA,EAAsD;AACrF,IAAA,MAAM,OAAA,GAA8D,EAAE,OAAA,EAAQ;AAC9E,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,OAAA,CAAQ,IAAA,GAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,IAAA,EAAK;AAAA,IACrC;AACA,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,SAAS,IAAA,IAAQ,KAAA;AAAA,UACvB,MAAA,EAAQ,SAAS,MAAA,IAAU,KAAA;AAAA,UAC3B,SAAA,EAAW,SAAS,SAAA,IAAa,KAAA;AAAA,UACjC,aAAA,EAAe,SAAS,aAAA,IAAiB,KAAA;AAAA,UACzC,IAAA,EAAM,SAAS,IAAA,IAAQ,KAAA;AAAA,UACvB,KAAA,EAAO,SAAA,CAAU,OAAA,EAAS,KAAA,IAAS,SAAS;AAAA;AAC9C;AACF,KACF;AAAA,EACF;AAAA,EAEA,OAAO,cAAc,QAAA,EAA+C;AAClE,IAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC3B,MAAA,MAAM,OAAA,GAA8D;AAAA,QAClE,SAAS,GAAA,CAAI;AAAA,OACf;AACA,MAAA,IAAI,IAAI,IAAA,EAAM;AACZ,QAAA,OAAA,CAAQ,IAAA,GAAO,EAAE,GAAA,EAAK,GAAA,CAAI,IAAA,EAAK;AAAA,MACjC;AACA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,IAAI,IAAA,IAAQ,KAAA;AAAA,UAClB,MAAA,EAAQ,IAAI,MAAA,IAAU,KAAA;AAAA,UACtB,SAAA,EAAW,IAAI,SAAA,IAAa,KAAA;AAAA,UAC5B,aAAA,EAAe,IAAI,aAAA,IAAiB,KAAA;AAAA,UACpC,IAAA,EAAM,IAAI,IAAA,IAAQ,KAAA;AAAA,UAClB,KAAA,EAAO,SAAA,CAAU,GAAA,CAAI,KAAA,IAAS,SAAS;AAAA;AACzC,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,OAAO,iBAAiB,UAAA,EAA8C;AACpE,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,UAAA,EAAY,UAAU,EAAE,UAAA,IAAc,CAAA;AAAA,EACxD;AAAA,EAEA,OAAO,oBAAoB,MAAA,EAAyC;AAClE,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,EAAE,EAAA,EAAI,MAAA,EAAO,IAAK,CAAA;AAAA,EAC9E;AAAA,EAEA,OAAO,mBAAA,CAAoB,KAAA,EAAe,GAAA,EAAuC;AAC/E,IAAA,MAAM,IAAA,GAAwC,EAAE,KAAA,EAAM;AACtD,IAAA,IAAI,GAAA,OAAU,GAAA,GAAM,GAAA;AACpB,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK,EAAG,CAAA;AAAA,EAC9D;AAAA;AAAA,EAIA,OAAO,SAAA,CAAU,QAAA,EAA0B,KAAA,EAA6B;AACtE,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,WAAA;AAAA,MACN,SAAA,EAAW,EAAE,SAAA,EAAW,QAAA,EAAU,OAAO,SAAA,CAAU,KAAA,IAAS,SAAS,CAAA;AAAE,KACzE;AAAA,EACF;AAAA,EAEA,OAAO,OAAA,CACL,KAAA,EACA,QAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,GAAA,GAAM,WAAW,KAAK,CAAA,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAA,EAAW,QAAA;AAAA,MACX,KAAA,EAAO,SAAA,CAAU,OAAA,EAAS,KAAA,IAAS,SAAS,CAAA;AAAA,MAC5C,aAAA,EAAe,SAAS,YAAA,IAAgB;AAAA,KAC1C;AACA,IAAA,IAAI,OAAA,EAAS,YAAA,IAAgB,OAAA,EAAS,QAAA,EAAU;AAC9C,MAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,IAC1B;AACA,IAAA,OAAO,EAAE,QAAQ,OAAA,EAAS,IAAA,EAAM,KAAK,CAAC,GAAG,GAAG,IAAA,EAAK;AAAA,EACnD;AAAA,EAEA,OAAO,OAAA,CACL,QAAA,EACA,IAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAA,EAAW,QAAA;AAAA,MACX,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,QAAQ,WAAA,EAAY;AAAA,MAClD,KAAA,EAAO,SAAA,CAAU,OAAA,EAAS,KAAA,IAAS,SAAS;AAAA,KAC9C;AACA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,IAC1B;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,SAAS,IAAA,EAAK;AAAA,EAC3D;AAAA,EAEA,OAAO,MAAA,CAAO,QAAA,EAA0B,QAAA,EAA0B,KAAA,EAA6B;AAC7F,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAA,EAAW,QAAA;AAAA,MACX,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,SAAS;AAAA,KACrC;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,IAClB;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,QAAQ,IAAA,EAAK;AAAA,EACzD;AAAA,EAEA,OAAO,gBAAA,CACL,QAAA,EACA,QAAA,EACA,KAAA,EACa;AACb,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAA,EAAW,QAAA;AAAA,MACX,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,SAAS;AAAA,KACrC;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,IAClB;AACA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,oBAAA;AAAA,MACN,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF;AAAA,EAEA,OAAO,gBAAA,CACL,QAAA,EACA,QAAA,EACA,KAAA,EACa;AACb,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAA,EAAW,QAAA;AAAA,MACX,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,SAAS;AAAA,KACrC;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,IAClB;AACA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,oBAAA;AAAA,MACN,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF;AAAA,EAEA,OAAO,IAAA,CAAK,QAAA,EAA0B,OAAA,EAAmB,KAAA,EAA6B;AACpF,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,QAAA;AAAA,QACX,SAAS,OAAA,IAAW,KAAA;AAAA,QACpB,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,SAAS;AAAA;AACrC,KACF;AAAA,EACF;AAAA,EAEA,OAAO,KAAA,CAAM,QAAA,EAA0B,QAAA,EAA0B,KAAA,EAA6B;AAC5F,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAA,EAAW,QAAA;AAAA,MACX,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,SAAS;AAAA,KACrC;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,IAClB;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA,EAAK;AAAA,EACvD;AAAA,EAEA,OAAO,OAAA,GAAuB;AAC5B,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAM,SAAA,EAAW,OAAA,EAAS,EAAC,EAAE;AAAA,EACzD;AAAA,EAEA,OAAO,IAAA,CAAK,IAAA,EAAc,QAAA,EAAmB,OAAA,EAA+B;AAC1E,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,SAAA,EAAW,mBAAA,CAAmB,QAAA,CAAS,IAAI,CAAA;AAAA,MAC3C,UAAU,QAAA,IAAY;AAAA,KACxB;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,GAAU,mBAAA,CAAmB,QAAA,CAAS,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,EAAK;AAAA,EACrD;AAAA,EAEA,OAAO,cAAc,UAAA,EAAiC;AACpD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,EAAE,UAAA;AAAW,KACzB;AAAA,EACF;AAAA;AAAA,EAIA,OAAO,KAAA,CAAM,GAAA,EAAa,OAAA,EAA+B;AACvD,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,EAAE,GAAA;AAAI,KAClB;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,GAAU,mBAAA,CAAmB,QAAA,CAAS,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA,EAAK;AAAA,EACvD;AAAA,EAEA,OAAO,QAAA,CAAS,GAAA,EAAa,OAAA,EAA+B;AAC1D,IAAA,MAAM,IAAA,GAAgC,EAAE,GAAA,EAAI;AAC5C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,GAAU,mBAAA,CAAmB,QAAA,CAAS,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,UAAU,IAAA,EAAK;AAAA,EAC7D;AAAA,EAEA,OAAO,KAAA,CAAM,GAAA,EAAa,OAAA,EAA+B;AACvD,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,EAAE,GAAA;AAAI,KAClB;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,GAAU,mBAAA,CAAmB,QAAA,CAAS,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA,EAAK;AAAA,EACvD;AAAA,EAEA,OAAO,KAAA,CAAM,GAAA,EAAa,OAAA,EAA+B;AACvD,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,EAAE,GAAA;AAAI,KAClB;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,GAAU,mBAAA,CAAmB,QAAA,CAAS,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA,EAAK;AAAA,EACvD;AAAA,EAEA,OAAO,SAAA,CAAU,GAAA,EAAa,IAAA,EAAe,OAAA,EAA+B;AAC1E,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,EAAE,GAAA;AAAI,KAClB;AACA,IAAA,IAAI,IAAA,OAAW,IAAA,GAAO,IAAA;AACtB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,GAAU,mBAAA,CAAmB,QAAA,CAAS,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,EAAK;AAAA,EACrD;AAAA,EAEA,OAAO,GAAA,CAAI,GAAA,EAAa,OAAA,EAA+B;AACrD,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,EAAE,GAAA;AAAI,KAClB;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,GAAU,mBAAA,CAAmB,QAAA,CAAS,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,KAAK,IAAA,EAAK;AAAA,EACnD;AAAA,EAEA,OAAO,KAAA,CAAM,GAAA,EAAa,OAAA,EAA+B;AACvD,IAAA,MAAM,IAAA,GAAgC,EAAE,GAAA,EAAI;AAC5C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,GAAU,mBAAA,CAAmB,QAAA,CAAS,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA,EAAK;AAAA,EACvD;AAAA;AAAA,EAIA,OAAO,gBAAgB,KAAA,EAA6B;AAClD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,mBAAA;AAAA,MACN,mBAAmB,EAAE,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,SAAS,CAAA;AAAE,KAC5D;AAAA,EACF;AAAA,EAEA,OAAO,UAAA,GAA0B;AAC/B,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAM,YAAA,EAAc,UAAA,EAAY,EAAC,EAAE;AAAA,EAC/D;AAAA,EAEA,OAAO,WAAW,OAAA,EAAuC;AACvD,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,SAAA,MAAe;AAAA,MAC3C,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ,EAAE,QAAA,EAAU,SAAA;AAAU,KAChC,CAAE,CAAA;AACF,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,aAAA;AAAA,MACN,WAAA,EAAa,EAAE,QAAA;AAAS,KAC1B;AAAA,EACF;AAAA,EAEA,OAAO,oBAAoB,QAAA,EAAsC;AAC/D,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,cAAA;AAAA,MACN,YAAA,EAAc,EAAE,WAAA,EAAa,IAAA,EAAM,QAAA;AAAS,KAC9C;AAAA,EACF;AAAA,EAEA,OAAO,qBAAqB,eAAA,EAAsC;AAChE,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,cAAA;AAAA,MACN,cAAc,EAAE,WAAA,EAAa,EAAE,QAAA,EAAU,iBAAgB;AAAE,KAC7D;AAAA,EACF;AAAA,EAEA,OAAO,WAAW,MAAA,EAA6B;AAC7C,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,cAAA;AAAA,MACN,YAAA,EAAc,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,MAAA;AAAO,KACnD;AAAA,EACF;AAAA,EAEA,OAAO,KAAA,CAAM,IAAA,EAAkB,eAAA,EAA2B,YAAA,EAAqC;AAC7F,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG,IAAA,GAAO,CAAC,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA,CAAG,MAAA;AACvB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AAClC,MAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,CAAC,SAAS,mBAAA,CAAmB,QAAA,CAAS,IAAI,CAAC,CAAA;AACjE,MAAA,OAAO,KAAA,CAAM,SAAS,KAAA,EAAO;AAC3B,QAAA,KAAA,CAAM,IAAA,CAAK,mBAAA,CAAmB,QAAA,CAAS,EAAE,CAAC,CAAA;AAAA,MAC5C;AACA,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAM,WAAA;AAAA,QACN,SAAA,EAAW,EAAE,KAAA;AAAM,OACrB;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,WAAA,EAAa,KAAA;AAAA,QACb,mBAAmB,eAAA,IAAmB,IAAA;AAAA,QACtC,gBAAgB,YAAA,IAAgB,KAAA;AAAA,QAChC,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF;AACF;ACraO,SAAS,YAAY,OAAA,EAAyB;AACnD,EAAA,OAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,SAAS,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AACnE;AAEO,SAAS,kBAAkB,MAAA,EAAwB;AACxD,EAAA,OAAO,WAAW,QAAQ,CAAA,CAAE,OAAO,MAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AACzD;;;ACEO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,OAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAAmB;AAAA,EAAnB,OAAA;AAAA,EAE7B,mBAAmB,YAAA,EAAyC;AAC1D,IAAA,MAAM,UAAyB,EAAC;AAChC,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AAEtC,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,aAAA,CAAc,GAAA,CAAI,KAAK,IAAI,CAAA;AAC3B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,KAAK,IAAI,CAAA;AAE/C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,IAAA,EAAM,SAAA;AAAA,UACN,WAAA,EAAa,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA;AAAA,UACrC,YAAA,EAAc;AAAA,SACf,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,CAAO,iBAAA,IAAqB,IAAA,CAAK,KAAA,KAAU,OAAO,iBAAA,EAAmB;AACvE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAA,GAAc,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA;AAC5C,MAAA,IAAI,MAAA,CAAO,gBAAgB,WAAA,EAAa;AACtC,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,IAAA,EAAM,UAAA;AAAA,UACN,WAAA;AAAA,UACA,cAAc,MAAA,CAAO;AAAA,SACtB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,QAAQ,CAAA;AACvD,IAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,MAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AAC3C,QAAA,IAAI,MAAA,CAAO,QAAA,KAAa,aAAA,IAAiB,MAAA,CAAO,aAAa,aAAA,EAAe;AAC1E,UAAA,IAAI,CAAC,MAAA,CAAO,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA,EAAG;AAAA,QAC5C;AACA,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,MAAM,MAAA,CAAO,YAAA;AAAA,UACb,IAAA,EAAM,SAAA;AAAA,UACN,WAAA,EAAa,EAAA;AAAA,UACb,cAAc,MAAA,CAAO;AAAA,SACtB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EACjC;AAAA,EAEQ,YAAY,OAAA,EAAuC;AACzD,IAAA,MAAM,SAAwB,EAAC;AAC/B,IAAA,MAAM,UAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAS,CAAA;AAC1D,IAAA,MAAM,UAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAS,CAAA;AAC1D,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA;AAEjF,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AACvC,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AAEvC,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,MAAM,QAAQ,OAAA,CAAQ,IAAA;AAAA,QACpB,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,KAAgB,GAAA,CAAI,gBAAgB,CAAC,cAAA,CAAe,GAAA,CAAI,CAAA,CAAE,IAAI;AAAA,OACzE;AACA,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,cAAA,CAAe,GAAA,CAAI,MAAM,IAAI,CAAA;AAC7B,QAAA,cAAA,CAAe,GAAA,CAAI,IAAI,IAAI,CAAA;AAC3B,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,IAAA,EAAM,OAAA;AAAA,UACN,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,cAAc,GAAA,CAAI,YAAA;AAAA,UAClB,WAAW,GAAA,CAAI;AAAA,SAChB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAC,eAAe,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAChD;AACA,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAC,eAAe,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAChD;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAM,CAAA;AAErB,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;AC7FA,IAAM,aAAA,GAAwB;AAAA,EAC5B,IAAA,EAAM,CAAC,GAAA,EAAA,GAAQ,IAAA,KAAS,QAAQ,IAAA,CAAK,GAAA,EAAK,GAAG,IAAI,CAAA;AAAA,EACjD,KAAA,EAAO,CAAC,GAAA,EAAA,GAAQ,IAAA,KAAS,QAAQ,KAAA,CAAM,GAAA,EAAK,GAAG,IAAI,CAAA;AAAA,EACnD,IAAA,EAAM,CAAC,GAAA,EAAA,GAAQ,IAAA,KAAS,QAAQ,IAAA,CAAK,GAAA,EAAK,GAAG,IAAI,CAAA;AAAA,EACjD,OAAO,MAAM;AAAA,EAAC;AAChB,CAAA;AAEA,IAAI,aAAA,GAAwB,aAAA;AAErB,SAAS,UAAU,MAAA,EAAsB;AAC9C,EAAA,aAAA,GAAgB,MAAA;AAClB;AAEO,SAAS,SAAA,GAAoB;AAClC,EAAA,OAAO,aAAA;AACT;;;ACZO,IAAM,qBAAN,MAAyB;AAAA,EACb,gBAA6B,EAAC;AAAA,EAC9B,iBAA8B,EAAC;AAAA,EAEhD,qBAAqB,SAAA,EAA4B;AAC/C,IAAA,IAAA,CAAK,aAAA,CAAc,KAAK,SAAS,CAAA;AACjC,IAAA,IAAA,CAAK,aAAA,CAAc,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAAA,EACrD;AAAA,EAEA,sBAAsB,SAAA,EAA4B;AAChD,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,SAAS,CAAA;AAClC,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAAA,EACtD;AAAA,EAEA,WAAW,OAAA,EAAiC;AAC1C,IAAA,MAAM,WAAA,GAAc,2BAAA,CAA4B,IAAA,CAAK,OAAO,CAAA;AAC5D,IAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA;AACnD,IAAA,MAAM,gBAAA,GAAmB,gCAAA,CAAiC,IAAA,CAAK,OAAO,CAAA;AAEtE,IAAA,IAAI,WAAA,IAAe,mBAAmB,gBAAA,EAAkB;AACtD,MAAA,OAAO,WAAA;AAAA,IACT;AAEA,IAAA,OAAO,cAAA;AAAA,EACT;AAAA,EAEA,eAAA,CAAgB,UAAkB,OAAA,EAA8C;AAC9E,IAAA,IAAI,KAAA,GAAwB;AAAA,MAC1B,OAAA,EAAS,QAAA;AAAA,MACT,UAAU,EAAC;AAAA,MACX;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,aAAA,EAAe;AAC1C,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA;AACtC,QAAA,KAAA,GAAQ;AAAA,UACN,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB;AAAA,SACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,IAAA,CAAK,CAAA,CAAA,EAAI,SAAA,CAAU,IAAI,2BAA2B,KAAK,CAAA;AAAA,MACrE;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAa,KAAA,CAAM,QAAA,CAAS,UAAA,IAA0C,EAAC;AAAA,MACvE,MAAA,EAAQ,KAAA,CAAM,QAAA,CAAS,MAAA,IAAU,EAAC;AAAA,MAClC,eAAA,EAAiB,KAAA,CAAM,QAAA,CAAS,eAAA,IAAmB;AAAC,KACtD;AAAA,EACF;AAAA,EAEA,iBAAA,CACE,OAAA,EACA,OAAA,EACA,QAAA,EACQ;AACR,IAAA,IAAI,KAAA,GAAwB;AAAA,MAC1B,OAAA;AAAA,MACA,QAAA,EAAU,YAAY,EAAC;AAAA,MACvB;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,cAAA,EAAgB;AAC3C,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA;AACtC,QAAA,KAAA,GAAQ;AAAA,UACN,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB;AAAA,SACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,IAAA,CAAK,CAAA,CAAA,EAAI,SAAA,CAAU,IAAI,4BAA4B,KAAK,CAAA;AAAA,MACtE;AAAA,IACF;AAEA,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACf;AACF;ACvFO,IAAM,uBAAN,MAAgD;AAAA,EAC5C,IAAA,GAAO,sBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAIC,OAAA,CAAO,MAAM,OAAO,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,QAAQ,IAAA,EAAK;AAAA,MACtB,QAAA,EAAU;AAAA,QACR,GAAG,KAAA,CAAM,QAAA;AAAA,QACT,UAAA,EAAY;AAAA;AACd,KACF;AAAA,EACF;AACF;;;ACVA,IAAMC,eAAAA,GAAiB,yCAAA;AAIhB,IAAM,mBAAN,MAA4C;AAAA,EAIjD,YAA6B,OAAA,EAA8B;AAA9B,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAA+B;AAAA,EAA/B,OAAA;AAAA,EAHpB,IAAA,GAAO,kBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAIjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAQ;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,eAAA,GAAoC,KAAA,CAAM,QAAA,CAAS,eAAA,GACrD,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,eAAe,CAAA,GAClC,EAAC;AAEL,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,OAAA;AAAA,MAC7BA,eAAAA;AAAA,MACA,CAAC,MAAA,EAAQ,MAAA,EAAgB,OAAA,KAAqB;AAC5C,QAAA,MAAM,QAAQ,OAAA,IAAW,MAAA;AAEzB,QAAA,IAAI,KAAK,OAAA,EAAS;AAChB,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AACjC,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,OAAO,CAAA,kBAAA,EAAqB,KAAA,CAAM,YAAY,CAAA,EAAA,EAAK,KAAK,CAAA,eAAA,CAAA;AAAA,UAC1D;AAAA,QACF;AAEA,QAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,UACnB,IAAA,EAAM,UAAA;AAAA,UACN,MAAA,EAAQ,UAAU,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAQ,GAAI,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,UAC7D,UAAA,EAAY;AAAA,SACb,CAAA;AAED,QAAA,MAAM,aAAA,GAAgB,mBAAmB,MAAM,CAAA;AAC/C,QAAA,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,0BAAA,EAA6B,aAAa,CAAA,CAAA,CAAA;AAAA,MAC5D;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,QAAA;AAAA,MACT,QAAA,EAAU,EAAE,GAAG,KAAA,CAAM,UAAU,eAAA;AAAgB,KACjD;AAAA,EACF;AACF;;;ACrDA,IAAM,aAAA,GAAgB,iCAAA;AAEtB,IAAM,iBAAA,GAA4C;AAAA,EAChD,IAAA,EAAM,WAAA;AAAA,EACN,QAAA,EAAU,WAAA;AAAA,EACV,OAAA,EAAS,WAAA;AAAA,EACT,IAAA,EAAM,cAAA;AAAA,EACN,GAAA,EAAK,WAAA;AAAA,EACL,IAAA,EAAM,WAAA;AAAA,EACN,OAAA,EAAS,QAAA;AAAA,EACT,KAAA,EAAO,QAAA;AAAA,EACP,QAAA,EAAU,QAAA;AAAA,EACV,GAAA,EAAK,QAAA;AAAA,EACL,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,QAAA;AAAA,EACT,IAAA,EAAM,QAAA;AAAA,EACN,MAAA,EAAQ,WAAA;AAAA,EACR,KAAA,EAAO,WAAA;AAAA,EACP,GAAA,EAAK,WAAA;AAAA,EACL,OAAA,EAAS,WAAA;AAAA,EACT,KAAA,EAAO,WAAA;AAAA,EACP,IAAA,EAAM;AACR,CAAA;AAEO,IAAM,qBAAN,MAA8C;AAAA,EAC1C,IAAA,GAAO,oBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,KAAS,cAAA,EAAgB;AACzC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,OAAA;AAAA,MAC5B,aAAA;AAAA,MACA,CAAC,MAAA,EAAQ,IAAA,EAAc,QAAA,EAA8B,KAAA,KAA8B;AACjF,QAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,IAAA,CAAK,WAAA,EAAa,CAAA,IAAK,WAAA;AACvD,QAAA,MAAM,SAAA,GAAY,KAAA,EAAO,IAAA,EAAK,IAAK,IAAA;AACnC,QAAA,MAAM,WAAW,QAAA,GACb;AAAA,6BAAA,EAAkC,IAAI,CAAA,UAAA,EAAa,QAAA,KAAa,GAAA,GAAM,MAAA,GAAS,QAAQ,CAAA,GAAA,CAAA,GACvF;AAAA,6BAAA,EAAkC,IAAI,CAAA,GAAA,CAAA;AAE1C,QAAA,OAAO,CAAA,EAAA,EAAK,KAAK,CAAA,GAAA,EAAM,SAAS,KAAK,QAAQ,CAAA,CAAA;AAAA,MAC/C;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,UAAU,KAAA,CAAM;AAAA,KAClB;AAAA,EACF;AACF;;;ACpDA,IAAM,gBAAA,GAAmB,qBAAA;AACzB,IAAM,iBAAA,GAAoB,iCAAA;AAEnB,IAAM,iBAAN,MAA0C;AAAA,EACtC,IAAA,GAAO,gBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,UAAU,KAAA,CAAM,OAAA;AAEpB,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,gBAAA,EAAkB,CAAC,QAAQ,QAAA,KAAqB;AACxE,MAAA,OAAO,CAAA;AAAA,EAAO,QAAA,CAAS,MAAM;AAAA,EAAA,CAAA;AAAA,IAC/B,CAAC,CAAA;AAED,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,iBAAA,EAAmB,CAAC,QAAQ,QAAA,KAAqB;AACzE,MAAA,OAAO,CAAA,CAAA,EAAI,QAAA,CAAS,IAAA,EAAM,CAAA,CAAA,CAAA;AAAA,IAC5B,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,UAAU,KAAA,CAAM;AAAA,KAClB;AAAA,EACF;AACF;;;ACtBA,IAAM,oBAAA,GAAuB,oBAAA;AAC7B,IAAM,oBAAA,GAAuB,2BAAA;AAE7B,IAAM,WAAA,GAAc,CAAC,aAAA,EAAe,UAAA,EAAY,WAAW,CAAA;AAEpD,IAAM,gBAAN,MAAyC;AAAA,EACrC,IAAA,GAAO,eAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,MAAM,MAAA,GAA2B,KAAA,CAAM,QAAA,CAAS,MAAA,GAAS,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,GAAI,EAAC;AACvF,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,SAAA,KAAc,MAAA;AAE3C,IAAA,IAAI,UAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,oBAAA,EAAsB,CAAC,QAAQ,MAAA,KAAmB;AACpF,MAAA,IAAI,WAAA,CAAY,MAAM,CAAA,EAAG;AACvB,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAA,EAAK,MAAA,EAAQ,WAAW,MAAA,EAAQ,UAAA,EAAY,OAAO,CAAA;AACjE,QAAA,IAAI,MAAA,IAAU,CAAC,aAAA,CAAc,MAAM,CAAA,EAAG;AACpC,UAAA,MAAM,WAAW,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,MAAA;AAC5C,UAAA,OAAO,eAAQ,QAAQ;AAAA,8BAAA,EAAmC,MAAM,CAAA,GAAA,CAAA;AAAA,QAClE;AACA,QAAA,OAAO,CAAA,EAAA,EAAK,MAAM,CAAA,EAAA,EAAK,SAAA,CAAU,MAAM,CAAC,CAAA,CAAA,CAAA;AAAA,MAC1C;AACA,MAAA,MAAM,OAAA,GAAU,mBAAmB,MAAM,CAAA;AACzC,MAAA,OAAO,CAAA,CAAA,EAAI,MAAM,CAAA,uBAAA,EAA0B,OAAO,CAAA,CAAA,CAAA;AAAA,IACpD,CAAC,CAAA;AAED,IAAA,OAAA,GAAU,QAAQ,OAAA,CAAQ,oBAAA,EAAsB,CAAC,MAAA,EAAQ,KAAa,GAAA,KAAgB;AACpF,MAAA,IAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACnB,QAAA,OAAO,CAAA,qCAAA,EAAwC,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAAA,CAAA,EAAS,GAAA,IAAO,OAAO,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,MACvG;AACA,MAAA,IAAI,aAAA,CAAc,GAAG,CAAA,EAAG;AACtB,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAA,EAAK,UAAA,EAAY,MAAM,CAAA;AAAA,MACvC;AACA,MAAA,OAAO,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,IACzB,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,QAAA,EAAU,EAAE,GAAG,KAAA,CAAM,UAAU,MAAA;AAAO,KACxC;AAAA,EACF;AACF;AAEA,SAAS,YAAY,IAAA,EAAuB;AAC1C,EAAA,OAAO,yCAAA,CAA0C,KAAK,IAAI,CAAA;AAC5D;AAEA,SAAS,WAAW,GAAA,EAAsB;AACxC,EAAA,OAAO,YAAY,IAAA,CAAK,CAAC,SAAS,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA;AACtD;AAEA,SAAS,cAAc,GAAA,EAAsB;AAC3C,EAAA,OAAO,IAAI,UAAA,CAAW,SAAS,CAAA,IAAK,GAAA,CAAI,WAAW,UAAU,CAAA;AAC/D;;;ACrDA,IAAM,YAAA,GAAe,0CAAA;AAEd,IAAM,0BAAN,MAAmD;AAAA,EAC/C,IAAA,GAAO,yBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,MAAM,OAAA,GAA4B,KAAA,CAAM,QAAA,CAAS,eAAA,GAC7C,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,eAAe,CAAA,GAClC,EAAC;AAEL,IAAA,MAAM,UAAU,CAAC,GAAG,MAAM,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAC,CAAA;AACxD,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,QACb,MAAA,EAAQ,iBAAA,CAAkB,KAAA,CAAM,CAAC,CAAE,CAAA;AAAA,QACnC,YAAY,KAAA,CAAM;AAAA,OACnB,CAAA;AAAA,IACH;AAEA,IAAA,OAAO;AAAA,MACL,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAU,EAAE,GAAG,KAAA,CAAM,QAAA,EAAU,iBAAiB,OAAA;AAAQ,KAC1D;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,WAAA,EAA6C;AACtE,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,IAAA,IAAQ,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA,EAAG;AACzC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAC,CAAA,GAAI,kBAAA,CAAmB,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,IACzE;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;;;ACrCA,IAAM,yBAAA,GAA4B,wDAAA;AAE3B,IAAM,2BAAN,MAAoD;AAAA,EAChD,IAAA,GAAO,0BAAA;AAAA,EACP,KAAA,GAAQ,CAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAQ;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,2BAA2B,EAAE,CAAA;AAEnE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,MAAM,CAAA;AAAA,MAC1C,UAAU,KAAA,CAAM;AAAA,KAClB;AAAA,EACF;AACF;ACjBO,IAAM,0BAAN,MAAmD;AAAA,EAC/C,IAAA,GAAO,yBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAQ;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,UAAA,KAAe,UAAA,EAAY;AAC3C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,UAAA;AAClC,IAAA,IAAI,CAAC,UAAA,IAAc,MAAA,CAAO,KAAK,UAAU,CAAA,CAAE,WAAW,CAAA,EAAG;AACvD,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,gBAAyC,EAAC;AAChD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,MAAA,aAAA,CAAc,GAAG,CAAA,GAAI,KAAA;AAAA,IACvB;AAEA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,CAAE,WAAW,CAAA,EAAG;AAC3C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,UAAUD,OAAAA,CAAO,SAAA,CAAU,EAAA,EAAI,aAAa,EAAE,IAAA,EAAK;AACzD,IAAA,MAAM,WAAW,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AAC3C,IAAA,MAAM,SAAA,GAAY,yCAAyC,QAAA,GAAW,OAAA;AAEtE,IAAA,MAAM,OAAA,GAAU,SAAA,GAAY,aAAA,GAAgB,KAAA,CAAM,OAAA;AAElD,IAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS;AAAA,EAC7C;AACF;;;ACpCA,IAAM,eAAA,GAAkB,qBAAA;AAExB,IAAM,gBAAA,GAAmB,yDAAA;AAEzB,IAAM,wBAAA,GACJ,iFAAA;AAEK,IAAM,yBAAN,MAAkD;AAAA,EAC9C,IAAA,GAAO,wBAAA;AAAA,EACP,KAAA,GAAQ,CAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAQ;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,IAAI,UAAU,KAAA,CAAM,OAAA;AAEpB,IAAA,OAAA,GAAU,QAAQ,OAAA,CAAQ,wBAAA,EAA0B,CAAC,EAAA,EAAI,MAAA,EAAgB,SAAiB,IAAI,CAAA;AAE9F,IAAA,OAAA,GAAU,QAAQ,OAAA,CAAQ,eAAA,EAAiB,CAAC,EAAA,EAAI,SAAiB,IAAI,CAAA;AAErE,IAAA,OAAA,GAAU,QAAQ,OAAA,CAAQ,gBAAA,EAAkB,CAAC,EAAA,EAAI,MAAA,EAAgB,SAAiB,IAAI,CAAA;AAEtF,IAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS;AAAA,EAC7C;AACF;;;AC1BA,IAAM,iBAAA,GACJ,+EAAA;AAEF,IAAM,uBAAA,GAA0B,qDAAA;AAEhC,IAAM,oBAAA,GAAuB,kDAAA;AAEtB,IAAM,oBAAN,MAA6C;AAAA,EACzC,IAAA,GAAO,mBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,UAAU,KAAA,CAAM,OAAA;AAEpB,IAAA,OAAA,GAAU,OAAA,CAAQ,QAAQ,iBAAA,EAAmB,CAAC,QAAQ,OAAA,KAAoB,CAAA,EAAA,EAAK,OAAO,CAAA,EAAA,CAAI,CAAA;AAE1F,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,MAChB,uBAAA;AAAA,MACA,CAAC,MAAA,EAAQ,OAAA,EAAiB,aAAA,KAA0B;AAClD,QAAA,MAAM,MAAA,GAAS,mBAAmB,aAAa,CAAA;AAC/C,QAAA,OAAO,MAAA,KAAW,UAAU,CAAA,EAAA,EAAK,MAAM,OAAO,CAAA,EAAA,EAAK,MAAM,IAAI,OAAO,CAAA,EAAA,CAAA;AAAA,MACtE;AAAA,KACF;AAEA,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,MAChB,oBAAA;AAAA,MACA,CAAC,MAAA,EAAQ,QAAA,EAAkB,aAAA,KAA0B;AACnD,QAAA,MAAM,MAAA,GAAS,mBAAmB,aAAa,CAAA;AAC/C,QAAA,OAAO,MAAM,MAAM,CAAA,EAAA,CAAA;AAAA,MACrB;AAAA,KACF;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS;AAAA,EAC7C;AACF;;;AC7BO,IAAM,yBAAN,MAAkD;AAAA,EAC9C,IAAA,GAAO,wBAAA;AAAA,EACP,KAAA,GAAQ,GAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAQ;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,eAAA;AAC/B,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACpC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,IAAI,UAAU,KAAA,CAAM,OAAA;AAEpB,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAC,CAAA;AAEpF,IAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,MAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS;AAAA,IAC7C;AAEA,IAAA,MAAM,WAAA,GAAc,eAAe,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAClE,IAAA,MAAM,MAAA,GAAS,MAAA,GAAS,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAC7C,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,EAAQ,GAAI,MAAA,GAAS,IAAA;AAEvC,IAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS;AAAA,EAC7C;AAAA,EAEQ,aAAa,MAAA,EAAgC;AACnD,IAAA,MAAM,MAAA,GAAS,OAAO,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,CACxC,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,CAAC,CAAC,CAAA,CAAE,CAAA,CAC/C,IAAA,CAAK,GAAG,CAAA;AACX,IAAA,OAAO,CAAA,gBAAA,EAAmB,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,CAAA;AAAA,EACjD;AACF;;;ACxCA,IAAM,cAAA,GAAyC;AAAA,EAC7C,WAAA,EAAa,MAAA;AAAA,EACb,WAAA,EAAa,UAAA;AAAA,EACb,cAAA,EAAoB,MAAA;AAAA,EACpB,WAAA,EAAa,KAAA;AAAA,EACb,QAAA,EAAY,SAAA;AAAA,EACZ,QAAA,EAAY,UAAA;AAAA,EACZ,cAAA,EAAoB,SAAA;AAAA,EACpB,QAAA,EAAY,SAAA;AAAA,EACZ,WAAA,EAAa,QAAA;AAAA,EACb,WAAA,EAAa,KAAA;AAAA,EACb,WAAA,EAAa,SAAA;AAAA,EACb,WAAA,EAAa;AACf,CAAA;AAEA,IAAM,sBAAA,GAAyB,oEAAA;AAExB,IAAM,kBAAN,MAA2C;AAAA,EACvC,IAAA,GAAO,iBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,UAAU,KAAA,CAAM,OAAA;AAEpB,IAAA,OAAA,GAAU,QAAQ,OAAA,CAAQ,sBAAA,EAAwB,CAAC,MAAA,EAAQ,MAAc,QAAA,KAAsB;AAC7F,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,QAAA,GAAW,QAAA,KAAa,MAAA,GAAS,GAAA,GAAM,GAAA;AAC7C,QAAA,OAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,MAC9B;AACA,MAAA,OAAO,KAAK,IAAI,CAAA,CAAA,CAAA;AAAA,IAClB,CAAC,CAAA;AAED,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AAC1D,MAAA,MAAM,OAAA,GAAU,IAAI,MAAA,CAAO,CAAA,EAAA,EAAK,YAAY,KAAK,CAAC,sBAAsB,GAAG,CAAA;AAC3E,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,CAAC,QAAQ,KAAA,KAAkB;AAC5D,QAAA,IAAI,KAAA,CAAM,WAAA,EAAY,KAAM,IAAA,EAAM;AAChC,UAAA,OAAO,OAAO,IAAI,CAAA,CAAA,CAAA;AAAA,QACpB;AACA,QAAA,OAAO,CAAA,IAAA,EAAO,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA;AAAA,MAC9B,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,UAAU,KAAA,CAAM;AAAA,KAClB;AAAA,EACF;AACF;AAEA,SAAS,YAAY,GAAA,EAAqB;AACxC,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AAClD;;;ACnDA,IAAM,kBAAA,GACJ,iFAAA;AAEK,IAAM,iBAAN,MAA0C;AAAA,EACtC,IAAA,GAAO,gBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,OAAA;AAAA,MAC5B,kBAAA;AAAA,MACA,CAAC,MAAA,EAAQ,KAAA,EAAe,IAAA,KAAiB;AACvC,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA,GACzC,CAAA,OAAA,EAAU,KAAA,CAAM,OAAA,CAAQ,aAAA,EAAe,KAAK,CAAC,CAAA,CAAA,GAC7C,UAAU,KAAK,CAAA,CAAA;AACnB,QAAA,OAAO,CAAA,aAAA,EAAgB,QAAQ,CAAA,EAAA,EAAK,IAAI,CAAA,OAAA,CAAA;AAAA,MAC1C;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,UAAU,KAAA,CAAM;AAAA,KAClB;AAAA,EACF;AACF;ACtBO,IAAM,uBAAN,MAAgD;AAAA,EAC5C,IAAA,GAAO,sBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,UAAA;AAElC,IAAA,IAAI,CAAC,UAAA,IAAc,MAAA,CAAO,KAAK,UAAU,CAAA,CAAE,WAAW,CAAA,EAAG;AACvD,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,UAAA,GAAa,oBAAoB,UAAU,CAAA;AACjD,IAAA,MAAM,OAAA,GAAUA,OAAAA,CAAO,SAAA,CAAU,KAAA,CAAM,SAAS,UAAU,CAAA;AAE1D,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,UAAU,KAAA,CAAM;AAAA,KAClB;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,KAAA,EAAyD;AACpF,EAAA,MAAM,SAAkC,EAAC;AAEzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,MAAM,UAAA,GAAa,eAAe,KAAK,CAAA;AACvC,IAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,UAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAe,KAAA,EAAyB;AAC/C,EAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,IAAA,OAAO,aAAA,CAAc,KAAA,CAAM,WAAA,EAAa,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,cAAc,KAAK,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,WAAW,KAAA,EAAO;AACnE,IAAA,MAAM,OAAA,GAAU,KAAA;AAChB,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,KAAA,EAAO,aAAA,CAAc,OAAA,CAAQ,KAAK,CAAA;AAAA,MAClC,GAAI,OAAA,CAAQ,GAAA,GAAM,EAAE,GAAA,EAAK,cAAc,OAAA,CAAQ,GAAG,CAAA,EAAE,GAAI;AAAC,KAC3D;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,IAAM,WAAA,GAAc,4CAAA;AAEpB,SAAS,cAAc,OAAA,EAAyB;AAC9C,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AACxC,EAAA,IAAI,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA,EAAG;AAC7B,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,OAAA;AAAA,EAClC;AACA,EAAA,OAAO,OAAA;AACT;;;ACrEA,IAAM,wBAAA,GACJ,mEAAA;AAEK,IAAM,qBAAN,MAA8C;AAAA,EAC1C,IAAA,GAAO,oBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAQ;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,wBAAA,EAA0B,CAAC,QAAQ,MAAA,KAAmB;AAC1F,MAAA,OAAO,MAAM,MAAM,CAAA,EAAA,CAAA;AAAA,IACrB,CAAC,CAAA;AAED,IAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS;AAAA,EAC7C;AACF;ACjBA,IAAM,qBAAA,GAAwB,iEAAA;AAE9B,IAAM,kBAAA,GACJ,iGAAA;AAEK,IAAM,0BAAN,MAAmD;AAAA,EAC/C,IAAA,GAAO,yBAAA;AAAA,EACP,KAAA,GAAQ,CAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAQ;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,qBAAqB,CAAA;AAC3D,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO,SAAS,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,kBAAkB,CAAA;AACzD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,UAAU,CAAA;AAAA,IAChD;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,EAC5D;AAAA,EAEQ,eAAA,CAAgB,OAAuB,KAAA,EAA0C;AACvF,IAAA,MAAM,WAAA,GAAc,MAAM,CAAC,CAAA;AAC3B,IAAA,MAAM,YAAA,GAAe,CAAA;AAAA,EAAQ,WAAW,CAAA;AAAA,CAAA;AAExC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAASA,QAAO,YAAY,CAAA;AAClC,MAAA,MAAA,GAAS,MAAA,CAAO,IAAA;AAAA,IAClB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC5D;AAEA,IAAA,MAAM,UAAA,GAAsC;AAAA,MAC1C,GAAI,MAAM,QAAA,CAAS,UAAA;AAAA,MACnB,GAAG;AAAA,KACL;AAEA,IAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,qBAAA,EAAuB,EAAE,EAAE,SAAA,EAAU;AAE3E,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,QAAA,EAAU,EAAE,GAAG,KAAA,CAAM,UAAU,UAAA;AAAW,KAC5C;AAAA,EACF;AAAA,EAEQ,gBAAA,CAAiB,OAAuB,KAAA,EAA0C;AACxF,IAAA,MAAM,OAAO,KAAA,CAAM,CAAC,EAAG,IAAA,EAAK,CAAE,MAAM,IAAI,CAAA;AACxC,IAAA,MAAM,UAAA,GAAsC;AAAA,MAC1C,GAAI,MAAM,QAAA,CAAS;AAAA,KACrB;AAEA,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,KAAA,GAAQ,GAAA,CACX,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AACjB,MAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,QAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,QAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,QAAA,UAAA,CAAW,GAAG,CAAA,GAAI,gBAAA,CAAiB,QAAQ,CAAA;AAAA,MAC7C;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,kBAAA,EAAoB,EAAE,EAAE,SAAA,EAAU;AAExE,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,QAAA,EAAU,EAAE,GAAG,KAAA,CAAM,UAAU,UAAA;AAAW,KAC5C;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,GAAA,EAAsB;AAC9C,EAAA,IAAI,GAAA,KAAQ,EAAA,IAAM,GAAA,KAAQ,MAAA,EAAQ,OAAO,IAAA;AACzC,EAAA,IAAI,GAAA,KAAQ,QAAQ,OAAO,IAAA;AAC3B,EAAA,IAAI,GAAA,KAAQ,SAAS,OAAO,KAAA;AAE5B,EAAA,MAAM,QAAA,GAAW,YAAY,GAAG,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,OAAO,QAAQ,CAAA;AAC3B,EAAA,IAAI,CAAC,MAAM,GAAG,CAAA,IAAK,SAAS,IAAA,EAAK,KAAM,IAAI,OAAO,GAAA;AAElD,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,EAAG;AAC3B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACjC,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,KAAM,EAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,IAAU,CAAC,CAAA;AACpE,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AACtB,QAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,QAAA,OAAO,CAAC,MAAM,CAAC,CAAA,IAAK,EAAE,IAAA,EAAK,KAAM,KAAK,CAAA,GAAI,CAAA;AAAA,MAC5C,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,UAAA,CAAW,GAAG,KAAK,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AACxD,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,IAC5B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,YAAY,CAAA,EAAmB;AACtC,EAAA,IAAK,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,EAAE,QAAA,CAAS,GAAG,CAAA,IAAO,CAAA,CAAE,WAAW,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAI;AACpF,IAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,CAAA;AACT;;;AChGO,SAAS,sBAAsB,OAAA,EAA+C;AACnF,EAAA,MAAM,QAAA,GAAW,IAAI,kBAAA,EAAmB;AAExC,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,sBAAA,EAAwB,CAAA;AAC1D,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,wBAAA,EAA0B,CAAA;AAC5D,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,oBAAA,EAAsB,CAAA;AACxD,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,uBAAA,EAAyB,CAAA;AAC3D,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,gBAAA,CAAiB,OAAA,EAAS,gBAAgB,CAAC,CAAA;AAC7E,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,kBAAA,EAAoB,CAAA;AACtD,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,cAAA,EAAgB,CAAA;AAClD,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,aAAA,EAAe,CAAA;AACjD,EAAA,QAAA,CAAS,oBAAA,CAAqB,IAAI,uBAAA,EAAyB,CAAA;AAE3D,EAAA,QAAA,CAAS,qBAAA,CAAsB,IAAI,uBAAA,EAAyB,CAAA;AAC5D,EAAA,QAAA,CAAS,qBAAA,CAAsB,IAAI,kBAAA,EAAoB,CAAA;AACvD,EAAA,QAAA,CAAS,qBAAA,CAAsB,IAAI,sBAAA,EAAwB,CAAA;AAC3D,EAAA,QAAA,CAAS,qBAAA,CAAsB,IAAI,iBAAA,EAAmB,CAAA;AACtD,EAAA,QAAA,CAAS,qBAAA,CAAsB,IAAI,eAAA,EAAiB,CAAA;AACpD,EAAA,QAAA,CAAS,qBAAA,CAAsB,IAAI,cAAA,EAAgB,CAAA;AACnD,EAAA,QAAA,CAAS,qBAAA,CAAsB,IAAI,oBAAA,EAAsB,CAAA;AAEzD,EAAA,OAAO,QAAA;AACT;ACrCA,IAAM,6BAAA,GAAgC,CAAC,aAAA,EAAe,UAAU,CAAA;AAEhE,IAAM,mBAAA,GAAsB,sCAAA;AAC5B,IAAM,YAAA,GAAe,+BAAA;AACrB,IAAM,UAAA,GAAa,6BAAA;AACnB,IAAM,iBAAA,GAAoB,oCAAA;AAC1B,IAAM,UAAA,GAAa,yBAAA;AACnB,IAAM,eAAA,GAAkB,kCAAA;AAExB,IAAM,kBAAA,GAAqB;AAAA,EACzB,yCAAA;AAAA,EACA,yBAAA;AAAA,EACA,kCAAA;AAAA,EACA,wCAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,kBAAA,GAAqB;AAAA,EACzB,kCAAA;AAAA,EACA,iCAAA;AAAA,EACA,kCAAA;AAAA,EACA,iCAAA;AAAA,EACA,oCAAA;AAAA,EACA,8BAAA;AAAA,EACA,2BAAA;AAAA,EACA,iCAAA;AAAA,EACA,oCAAA;AAAA,EACA;AACF,CAAA;AAEA,SAASE,aAAY,GAAA,EAAqB;AACxC,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AAClD;AAIA,SAAS,gBAAgB,QAAA,EAA8C;AACrE,EAAA,IAAI,CAAC,UAAU,OAAO,EAAA;AACtB,EAAA,OAAO,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA,CAAE,KAAK,EAAE,CAAA;AAClD;AAeA,SAAS,mBAAmB,QAAA,EAAmD;AAC7E,EAAA,IAAI,CAAC,UAAU,OAAO,EAAA;AACtB,EAAA,OAAO,QAAA,CACJ,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,CAAA,CAAE,QAAA,EAAU;AACvC,MAAA,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,QAAA,CAAS,UAAU,CAAA,CAAA,CAAA;AAAA,IAClC;AAEA,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,OAAA,EAAS;AACrC,MAAA,OAAO,aAAA,CAAc,EAAE,OAAO,CAAA;AAAA,IAChC;AAEA,IAAA,IAAI,OAAO,CAAA,CAAE,UAAA;AACb,IAAA,MAAM,IAAI,CAAA,CAAE,WAAA;AACZ,IAAA,IAAI,CAAA,EAAG,IAAA,EAAM,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,CAAA;AAC7B,IAAA,IAAI,CAAA,EAAG,IAAA,EAAM,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,CAAA;AAC7B,IAAA,IAAI,CAAA,EAAG,MAAA,EAAQ,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAA;AAC9B,IAAA,IAAI,CAAA,EAAG,aAAA,EAAe,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,CAAA;AACtC,IAAA,IAAI,CAAA,EAAG,SAAA,EAAW,IAAA,GAAO,CAAA,GAAA,EAAM,IAAI,CAAA,IAAA,CAAA;AACnC,IAAA,IAAI,EAAE,IAAA,EAAM,IAAA,GAAO,IAAI,IAAI,CAAA,EAAA,EAAK,EAAE,IAAI,CAAA,CAAA,CAAA;AAEtC,IAAA,MAAM,QAAQ,CAAA,EAAG,KAAA;AACjB,IAAA,IAAI,KAAA,IAAS,UAAU,SAAA,EAAW;AAChC,MAAA,IAAA,GAAO,CAAA,sBAAA,EAAyB,KAAK,CAAA,GAAA,EAAM,IAAI,CAAA,sBAAA,CAAA;AAAA,IACjD;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACZ;AAEA,SAAS,cAAc,OAAA,EAA4D;AACjF,EAAA,QAAQ,QAAQ,IAAA;AAAM,IACpB,KAAK,MAAA;AACH,MAAA,OAAO,QAAQ,IAAA,GAAO,CAAA,EAAA,EAAK,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,EAAA,CAAA,GAAO,EAAA;AAAA,IACnD,KAAK,MAAA,EAAQ;AACX,MAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAM,OAAO,EAAA;AAC1B,MAAA,MAAM,KAAA,GAAQ,QAAQ,IAAA,CAAK,KAAA;AAC3B,MAAA,OAAO,OAAA,CAAQ,KAAK,GAAA,GAAM,CAAA,EAAG,KAAK,CAAA,QAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,CAAA,GAAK,KAAA;AAAA,IAC/D;AAAA,IACA,KAAK,MAAA;AACH,MAAA,OAAO,QAAQ,IAAA,EAAM,IAAA,GAAO,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,CAAA,GAAK,OAAA;AAAA,IACxD,KAAK,UAAA;AACH,MAAA,OAAO,QAAQ,QAAA,GAAW,CAAA,EAAA,EAAK,OAAA,CAAQ,QAAA,CAAS,EAAE,CAAA,EAAA,CAAA,GAAO,EAAA;AAAA,IAC3D;AACE,MAAA,OAAO,EAAA;AAAA;AAEb;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAClB,GAAA,GAA+B,IAAA;AAAA,EAC/B,MAAA,GAAwB,IAAA;AAAA,EAEhC,eAAe,MAAA,EAAsB;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAM,IAAI,gBAAA,CAAiB,EAAE,YAAA,EAAc,QAAQ,CAAA;AACxD,IAAA,IAAA,CAAK,0BAAA,EAA2B;AAAA,EAClC;AAAA,EAEQ,0BAAA,GAAmC;AACzC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AAEf,IAAA,KAAA,MAAW,aAAa,6BAAA,EAA+B;AACrD,MAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,SAAA,EAAW,CAAC,KAAA,KAAU;AAClD,QAAA,MAAM,EAAA,GAAK,MAAM,EAAA,IAAM,SAAA;AACvB,QAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,UACb,CAAA;AAAA,QAAA,EAAuD,SAAS,SAAS,EAAE;AAAA,kCAAA,EAAuC,SAAS,OAAO,EAAE,CAAA,EAAA;AAAA,SACtI;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,IAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,IAAA,IAAA,CAAK,8BAAA,EAA+B;AACpC,IAAA,IAAA,CAAK,2BAAA,EAA4B;AACjC,IAAA,IAAA,CAAK,wBAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,wBAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,IAAA,IAAA,CAAK,4BAAA,EAA6B;AAClC,IAAA,IAAA,CAAK,gCAAA,EAAiC;AACtC,IAAA,IAAA,CAAK,6BAAA,EAA8B;AACnC,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAC5B,IAAA,IAAA,CAAK,6BAAA,EAA8B;AACnC,IAAA,IAAA,CAAK,8BAAA,EAA+B;AACpC,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAC5B,IAAA,IAAA,CAAK,wBAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,0BAAA,EAA2B;AAChC,IAAA,IAAA,CAAK,iCAAA,EAAkC;AAAA,EACzC;AAAA,EAEQ,yBAAA,GAAkC;AACxC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,QAAA,EAAU,OAAO,KAAA,KAAU;AACvD,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,CAAA,CAAE,MAAA,EAAQ,SAAkB,CAAA;AAC7D,MAAA,MAAM,QAAA,GAAW,EAAE,YAAA,GAAe,MAAM,IAAI,cAAA,CAAe,CAAA,CAAE,EAAE,CAAA,GAAI,EAAC;AACpE,MAAA,MAAM,OAAA,GAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,IAAI,gBAAA,CAAiB,QAAQ,CAAA,CAAE,MAAA,GAAS,EAAA,KAAO,EAAA;AAC1F,MAAA,MAAM,WAAW,OAAA,CACd,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,IAAA,KAAkB,IAAA,CAAK,MAAK,GAAI,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,GAAK,IAAK,EACxD,IAAA,CAAK,IAAI,EACT,OAAA,EAAQ;AACX,MAAA,OAAO,GAAG,YAAY;AAAA,EAAA,EAAO,KAAK;AAAA,EAAK,QAAQ;AAAA,EAAK,UAAU,CAAA,CAAA;AAAA,IAChE,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,iCAAA,GAA0C;AAChD,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AAEjB,IAAA,KAAA,MAAW,KAAA,IAAS,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAY;AACtC,MAAA,MAAM,UAAA,GAAa,WAAW,KAAK,CAAA,CAAA;AACnC,MAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,UAAA,EAAY,OAAO,KAAA,KAAU;AACzD,QAAA,MAAM,CAAA,GAAI,KAAA;AAGV,QAAA,MAAM,WAAA,GAAc,EAAE,UAAU,CAAA;AAChC,QAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,WAAA,EAAa,SAAkB,CAAA;AAC/D,QAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAE/B,QAAA,IAAI,WAAA,EAAa,aAAA,IAAiB,CAAA,CAAE,YAAA,EAAc;AAChD,UAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,cAAA,CAAe,EAAE,EAAE,CAAA;AAC9C,UAAA,MAAM,OAAA,GAAA,CACH,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,IAAI,gBAAA,CAAiB,QAAQ,CAAA,CAAE,MAAA,GAAS,EAAA,KAAO,EAAA;AAC5E,UAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI;;AAAA,EAAO,OAAA,CAAQ,SAAS,CAAA,CAAA;AAAA,QAClD;AAEA,QAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,MAC1B,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,yBAAA,GAAkC;AACxC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAEpB,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,aAAA,EAAe,OAAO,KAAA,KAAU;AAC5D,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,KAAK,EAAE,QAAA,EAAU,CAAA,CAAE,EAAA,EAAI,CAAA;AACrE,MAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,MAAA,MAAM,QAAkB,EAAC;AAEzB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,QAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,cAAA,CAAe,IAAI,EAAE,CAAA;AAChD,QAAA,MAAM,OAAA,GAAA,CACH,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,IAAI,gBAAA,CAAiB,QAAQ,CAAA,CAAE,MAAA,GAAS,EAAA,KAAO,EAAA;AAC5E,QAAA,KAAA,CAAM,IAAA,CAAK,GAAG,UAAU;AAAA,EAAK,OAAA,CAAQ,OAAA,EAAS,CAAA,CAAE,CAAA;AAAA,MAClD;AAEA,MAAA,OAAO,GAAG,iBAAiB;AAAA,EAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA,EAAK,eAAe,CAAA,CAAA;AAAA,IACtE,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,QAAA,EAAU,YAAY,EAAE,CAAA;AAAA,EACxD;AAAA,EAEQ,8BAAA,GAAuC;AAC7C,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAEpB,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,cAAA,EAAgB,OAAO,KAAA,KAAU;AAC7D,MAAA,MAAM,CAAA,GAAI,KAAA;AAIV,MAAA,MAAM,QAAA,GAAW,CAAA,CAAE,YAAA,EAAc,WAAA,EAAa,YAAY,CAAA,CAAE,EAAA;AAE5D,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,MAAA,CAAO,SAAS,IAAA,CAAK,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA;AACzE,MAAA,MAAM,WAAsB,EAAC;AAC7B,MAAA,KAAA,MAAW,KAAA,IAAS,SAAS,OAAA,EAAkC;AAC7D,QAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,eAAA,CAAgB,KAAc,CAAA;AACvD,QAAA,IAAI,MAAA,EAAQ,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AAAA,MAClC;AACA,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,gBAAA,CAAiB,QAAiB,EAAE,MAAA,IAAU,EAAA;AAClE,MAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,IACzB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,2BAAA,GAAoC;AAC1C,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,UAAA,EAAY,OAAO,KAAA,KAAU;AACzD,MAAA,MAAM,CAAA,GAAI,KAAA;AAGV,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,QAAA,EAAU,GAAA,IAAO,EAAA;AAC/B,MAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,CAAA,CAAE,QAAA,EAAU,OAAO,CAAA;AACnD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,MAC5B;AACA,MAAA,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,IACxB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,wBAAA,GAAiC;AACvC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,OAAA,EAAS,OAAO,KAAA,KAAU;AACtD,MAAA,MAAM,CAAA,GAAI,KAAA;AAQV,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,IAAA,KAAS,UAAA,GAAa,CAAA,CAAE,KAAA,CAAM,QAAA,EAAU,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,IAAA,EAAM,GAAA;AAClF,MAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA;AAChD,MAAA,OAAO,CAAA,EAAA,EAAK,OAAA,IAAW,OAAO,CAAA,EAAA,EAAK,OAAO,EAAE,CAAA,CAAA,CAAA;AAAA,IAC9C,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,wBAAA,GAAiC;AACvC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,OAAA,EAAS,OAAO,KAAA,KAAU;AACtD,MAAA,MAAM,CAAA,GAAI,KAAA;AAQV,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,IAAA,KAAS,UAAA,GAAa,CAAA,CAAE,KAAA,CAAM,QAAA,EAAU,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,IAAA,EAAM,GAAA;AAClF,MAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA;AAChD,MAAA,OAAO,CAAA,EAAA,EAAK,OAAA,IAAW,OAAO,CAAA,EAAA,EAAK,OAAO,EAAE,CAAA,CAAA,CAAA;AAAA,IAC9C,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,uBAAA,GAAgC;AACtC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,MAAA,EAAQ,OAAO,KAAA,KAAU;AACrD,MAAA,MAAM,CAAA,GAAI,KAAA;AASV,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,IAAA,EAAM,IAAA,KAAS,UAAA,GAAa,CAAA,CAAE,IAAA,CAAK,QAAA,EAAU,GAAA,GAAM,CAAA,CAAE,IAAA,EAAM,IAAA,EAAM,GAAA;AAC/E,MAAA,MAAM,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,IAAQ,gBAAgB,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA,IAAK,MAAA;AACjE,MAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,GAAA,IAAO,EAAE,CAAA,CAAA,CAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,4BAAA,GAAqC;AAC3C,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,YAAA,EAAc,OAAO,KAAA,KAAU;AAC3D,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,UAAA,EAAY,KAAA,IAAS,UAAA;AACrC,MAAA,OAAO,KAAK,KAAK,CAAA,EAAA,CAAA;AAAA,IACnB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,gCAAA,GAAyC;AAC/C,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,gBAAA,EAAkB,OAAO,KAAA,KAAU;AAC/D,MAAA,MAAM,CAAA,GAAI,KAAA;AAGV,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,cAAA,EAAgB,KAAA,IAAS,UAAA;AACzC,MAAA,OAAO,iBAAiB,KAAK;AAAA,mCAAA,EAAwC,CAAA,CAAE,EAAE,CAAA,OAAA,EAAU,kBAAA,CAAmB,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA,IAC9G,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,6BAAA,GAAsC;AAC5C,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,cAAA,EAAgB,OAAO,KAAA,KAAU;AAC7D,MAAA,MAAM,CAAA,GAAI,KAAA;AAGV,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,YAAA,EAAc,OAAA,IAAW,EAAE,YAAA,EAAc,WAAA;AAC1D,MAAA,IAAI,CAAC,QAAQ,OAAO,EAAA;AACpB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,KAAA,CAAM,SAAS,EAAE,OAAA,EAAS,QAAQ,CAAA;AAC5D,QAAA,MAAM,CAAA,GAAI,IAAA;AAGV,QAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,MAAA,CAAO,CAAA,CAAE,UAAU,CAAA,EAAG;AAC9C,UAAA,IAAI,KAAK,IAAA,KAAS,OAAA,IAAW,KAAK,KAAA,GAAQ,CAAC,GAAG,UAAA,EAAY;AACxD,YAAA,OAAO,CAAA,EAAA,EAAK,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,UAAU,CAAA,EAAA,CAAA;AAAA,UACtC;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,OAAO,KAAK,MAAM,CAAA,EAAA,CAAA;AAAA,IACpB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,sBAAA,GAA+B;AACrC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,mBAAA,EAAqB,YAAY;AAC7D,MAAA,OAAO,CAAA,oBAAA,CAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,6BAAA,GAAsC;AAC5C,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,YAAA,EAAc,YAAY,EAAE,CAAA;AAAA,EAC5D;AAAA,EAEQ,8BAAA,GAAuC;AAC7C,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,cAAA,EAAgB,OAAO,KAAA,KAAU;AAC7D,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,YAAA,EAAc,GAAA,IAAO,EAAA;AACnC,MAAA,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,IACxB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,sBAAA,GAA+B;AACrC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,KAAA,EAAO,OAAO,KAAA,KAAU;AACpD,MAAA,MAAM,CAAA,GAAI,KAAA;AAQV,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,GAAA,EAAK,IAAA,KAAS,MAAA,GAAU,CAAA,CAAE,GAAA,CAAI,IAAA,EAAM,GAAA,IAAO,EAAA,GAAO,CAAA,CAAE,GAAA,EAAK,UAAU,GAAA,IAAO,EAAA;AACxF,MAAA,MAAM,OAAA,GAAU,EAAE,GAAA,EAAK,OAAA,GAAU,mBAAmB,CAAA,CAAE,GAAA,CAAI,OAAgB,CAAA,GAAI,EAAA;AAC9E,MAAA,OAAO,CAAA,WAAA,EAAO,OAAA,IAAW,KAAK,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,IACxC,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,wBAAA,GAAiC;AACvC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,OAAA,EAAS,OAAO,KAAA,KAAU;AACtD,MAAA,MAAM,CAAA,GAAI,KAAA;AAGV,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,GAAA,IAAO,EAAA;AAC5B,MAAA,MAAM,OAAA,GAAU,EAAE,KAAA,EAAO,OAAA,GAAU,mBAAmB,CAAA,CAAE,KAAA,CAAM,OAAgB,CAAA,GAAI,EAAA;AAClF,MAAA,OAAO,CAAA,CAAA,EAAI,OAAA,IAAW,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,IACnC,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,0BAAA,GAAmC;AACzC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAqB,SAAA,EAAW,OAAO,KAAA,KAAU;AACxD,MAAA,MAAM,CAAA,GAAI,KAAA;AAGV,MAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,CAAA,CAAE,OAAA,EAAS,SAAkB,CAAA;AAC7D,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,EAAS,IAAA,EAAM,KAAA,IAAS,EAAA;AAExC,MAAA,MAAM,QAAA,GAAW,EAAE,YAAA,GAAe,MAAM,IAAI,cAAA,CAAe,CAAA,CAAE,EAAE,CAAA,GAAI,EAAC;AACpE,MAAA,MAAM,OAAA,GAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,IAAI,gBAAA,CAAiB,QAAQ,CAAA,CAAE,MAAA,GAAS,EAAA,KAAO,EAAA;AAE1F,MAAA,MAAM,aAAA,GAAwC;AAAA,QAC5C,WAAA,EAAa,MAAA;AAAA,QACb,WAAA,EAAa,UAAA;AAAA,QACb,cAAA,EAAoB,MAAA;AAAA,QACpB,WAAA,EAAa,KAAA;AAAA,QACb,QAAA,EAAY,SAAA;AAAA,QACZ,QAAA,EAAY,UAAA;AAAA,QACZ,cAAA,EAAoB,SAAA;AAAA,QACpB,QAAA,EAAY,SAAA;AAAA,QACZ,WAAA,EAAa,QAAA;AAAA,QACb,WAAA,EAAa,KAAA;AAAA,QACb,WAAA,EAAa,SAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AACA,MAAA,MAAM,WAAA,GAAc,aAAA,CAAc,KAAK,CAAA,IAAK,MAAA;AAE5C,MAAA,IAAI,MAAA,GAAS,CAAA,IAAA,EAAO,WAAW,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA;AACxC,MAAA,IAAI,OAAA,EAAS,MAAK,EAAG;AACnB,QAAA,MAAM,QAAQ,OAAA,CACX,IAAA,EAAK,CACL,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,CAAA,KAAe,EAAE,IAAA,EAAK,GAAI,CAAA,EAAA,EAAK,CAAC,KAAK,GAAI,CAAA;AACjD,QAAA,MAAA,IAAU,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,MAClC;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,uBAAuB,QAAA,EAA6B;AAClD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAA;AACrD,IAAA,MAAM,MAAA,GAAS,iBAAiB,YAAY,CAAA;AAC5C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAC/C,IAAA,OAAO,yBAAyB,SAA2C,CAAA;AAAA,EAC7E;AAAA,EAEQ,cAAA,uBAA0C,GAAA,EAAI;AAAA,EAC9C,cAAA,uBAA4C,GAAA,EAAI;AAAA,EAChD,aAAA,GAAgB,CAAA;AAAA,EAChB,aAAA,GAAgB,CAAA;AAAA,EAEhB,mBAAmB,QAAA,EAA0B;AACnD,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AAErB,IAAA,IAAI,SAAA,GAAY,IAAA,CAAK,mBAAA,CAAoB,QAAQ,CAAA;AACjD,IAAA,SAAA,GAAY,IAAA,CAAK,oBAAoB,SAAS,CAAA;AAC9C,IAAA,SAAA,GAAY,IAAA,CAAK,gBAAgB,SAAS,CAAA;AAC1C,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEQ,gBAAgB,QAAA,EAA0B;AAChD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACjC,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,IAAI,WAAA,GAAc,KAAA;AAElB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,IAAA,CAAK,SAAA,EAAU,CAAE,UAAA,CAAW,KAAK,CAAA,EAAG;AACtC,QAAA,WAAA,GAAc,CAAC,WAAA;AAAA,MACjB;AAEA,MAAA,IAAI,CAAC,WAAA,IAAe,UAAA,CAAW,KAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AAChD,QAAA,MAAA,CAAO,KAAK,mBAAmB,CAAA;AAAA,MACjC,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,EACzB;AAAA,EAEQ,oBAAoB,QAAA,EAA0B;AACpD,IAAA,MAAM,OAAA,GAAU,IAAI,MAAA,CAAO,CAAA,CAAA,EAAIA,aAAY,YAAY,CAAC,KAAK,IAAI,CAAA;AACjE,IAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAA,CAAA,EAAIA,aAAY,UAAU,CAAC,KAAK,IAAI,CAAA;AAC7D,IAAA,IAAI,MAAA,GAAS,QAAA;AACb,IAAA,IAAI,KAAA;AAEJ,IAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,MAAM,OAAO,IAAA,EAAM;AAC9C,MAAA,KAAA,CAAM,YAAY,KAAA,CAAM,KAAA;AACxB,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAClC,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,KAAK,EAAE,OAAA,EAAQ;AACxF,MAAA,MAAM,KAAK,IAAA,CAAK,aAAA,EAAA;AAChB,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,EAAA,EAAI,OAAO,CAAA;AAEnC,MAAA,MAAM,WAAA,GAAc,yBAAyB,EAAE,CAAA,EAAA,CAAA;AAC/C,MAAA,MAAA,GACE,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,GAC3B,WAAA,GACA,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,KAAA,GAAQ,QAAA,CAAS,CAAC,EAAE,MAAM,CAAA;AAElD,MAAA,OAAA,CAAQ,SAAA,GAAY,KAAA,CAAM,KAAA,GAAQ,WAAA,CAAY,MAAA;AAAA,IAChD;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,oBAAoB,QAAA,EAA0B;AACpD,IAAA,MAAM,OAAA,GAAU,IAAI,MAAA,CAAO,CAAA,CAAA,EAAIA,aAAY,iBAAiB,CAAC,KAAK,IAAI,CAAA;AACtE,IAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAA,CAAA,EAAIA,aAAY,eAAe,CAAC,KAAK,IAAI,CAAA;AAClE,IAAA,IAAI,MAAA,GAAS,QAAA;AACb,IAAA,IAAI,KAAA;AAEJ,IAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,MAAM,OAAO,IAAA,EAAM;AAC9C,MAAA,KAAA,CAAM,YAAY,KAAA,CAAM,KAAA;AACxB,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAClC,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,KAAK,CAAA;AAC5E,MAAA,MAAM,OAAA,GAAU,MACb,KAAA,CAAM,IAAI,OAAO,CAAA,CAAA,EAAIA,YAAAA,CAAY,UAAU,CAAC,CAAA,CAAA,CAAA,EAAK,GAAG,CAAC,CAAA,CACrD,IAAI,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,OAAO,CAAA;AAEjB,MAAA,MAAM,KAAK,IAAA,CAAK,aAAA,EAAA;AAChB,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,EAAA,EAAI,OAAO,CAAA;AAEnC,MAAA,MAAM,WAAA,GAAc,0BAA0B,EAAE,CAAA,EAAA,CAAA;AAChD,MAAA,MAAA,GACE,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,GAC3B,WAAA,GACA,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,KAAA,GAAQ,QAAA,CAAS,CAAC,EAAE,MAAM,CAAA;AAElD,MAAA,OAAA,CAAQ,SAAA,GAAY,KAAA,CAAM,KAAA,GAAQ,WAAA,CAAY,MAAA;AAAA,IAChD;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,MAAA,EAAmD;AAC3E,IAAA,MAAM,SAAoB,EAAC;AAE3B,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,wBAAA,CAAyB,KAAK,CAAA;AAC3D,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,MAAA,CAAO,KAAK,eAAe,CAAA;AAC3B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,wBAAA,CAAyB,KAAK,CAAA;AAC3D,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,MAAA,CAAO,KAAK,eAAe,CAAA;AAC3B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,yBAAA,CAA0B,KAAK,CAAA;AAC7D,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,MAAA,CAAO,KAAK,gBAAgB,CAAA;AAC5B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,0BAAA,CAA2B,KAAK,CAAA;AAC5D,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,MAAA,CAAO,KAAK,cAAc,CAAA;AAC1B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,qBAAA,CAAsB,KAAK,CAAA;AACzD,MAAA,MAAA,CAAO,KAAK,gBAAgB,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,yBAAyB,KAAA,EAAgD;AAC/E,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,WAAA,EAAa,OAAO,IAAA;AAEvC,IAAA,MAAM,OAAO,KAAA,CAAM,SAAA;AAGnB,IAAA,MAAM,OAAO,IAAA,EAAM,SAAA,GAAY,CAAC,CAAA,EAAG,MAAM,OAAA,IAAW,EAAA;AAEpD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,+BAA+B,CAAA;AAC9D,IAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AAEzB,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,WAAA,CAAY,CAAC,GAAI,EAAE,CAAA;AACvC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,EAAE,CAAA;AAC1C,IAAA,IAAI,OAAA,KAAY,QAAW,OAAO,IAAA;AAElC,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,WAAW,CAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,UAAA,GAAa,CAAC,CAAA,IAAK,QAAA;AAEjC,IAAA,MAAM,aAAa,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AAC9C,IAAA,MAAM,UAAU,UAAA,CACb,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,WAAW,IAAI,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,CAAE,EAChD,IAAA,CAAK,IAAI,EACT,IAAA,EAAK;AAER,IAAA,MAAM,QAAA,GAAW,OAAA,GAAW,gBAAA,CAAiB,OAAO,IAAuC,EAAC;AAE5F,IAAA,OAAO,kBAAA,CAAmB,MAAA;AAAA,MACxB,kBAAA,CAAmB,SAAS,KAAK,CAAA;AAAA,MACjC,QAAA,CAAS,MAAA,GAAS,CAAA,GAAK,QAAA,GAAwC;AAAA,KACjE;AAAA,EACF;AAAA,EAEQ,yBAAyB,KAAA,EAAgD;AAC/E,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,WAAA,EAAa,OAAO,IAAA;AAEvC,IAAA,MAAM,OAAO,KAAA,CAAM,SAAA;AAGnB,IAAA,MAAM,OAAO,IAAA,EAAM,SAAA,GAAY,CAAC,CAAA,EAAG,MAAM,OAAA,IAAW,EAAA;AAEpD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,gCAAgC,CAAA;AAC5D,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,QAAA,CAAS,CAAC,GAAI,EAAE,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,EAAE,CAAA;AAC1C,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU;AAC1C,MAAA,MAAM,MAAA,GAAS,iBAAiB,KAAK,CAAA;AACrC,MAAA,OAAO,IAAA,CAAK,kBAAkB,MAAM,CAAA;AAAA,IACtC,CAAC,CAAA;AAED,IAAA,OAAO,kBAAA,CAAmB,WAAW,YAAY,CAAA;AAAA,EACnD;AAAA,EAEQ,0BAA0B,KAAA,EAAgD;AAChF,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,WAAA,EAAa,OAAO,IAAA;AAEvC,IAAA,MAAM,OAAO,KAAA,CAAM,SAAA;AAGnB,IAAA,MAAM,OAAO,IAAA,EAAM,SAAA,GAAY,CAAC,CAAA,EAAG,MAAM,OAAA,IAAW,EAAA;AAEpD,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,0BAA0B,CAAA,EAAG;AAC7C,MAAA,OAAO,mBAAmB,OAAA,EAAQ;AAAA,IACpC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,2BAA2B,KAAA,EAAgD;AACjF,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,IAAI,OAAA;AAEJ,IAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,MAAA,MAAM,MAAM,KAAA,CAAM,KAAA;AAGlB,MAAA,GAAA,GAAM,GAAA,EAAK,UAAU,GAAA,IAAO,EAAA;AAC5B,MAAA,OAAA,GAAU,GAAA,EAAK,OAAA,GAAU,CAAC,CAAA,EAAG,IAAA,EAAM,OAAA;AAAA,IACrC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,WAAA,EAAa;AACrC,MAAA,MAAM,OAAO,KAAA,CAAM,SAAA;AAGnB,MAAA,MAAM,KAAA,GAAQ,IAAA,EAAM,SAAA,IAAa,EAAC;AAClC,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,EAAG,MAAM,OAAA,IAAW,EAAA;AAC3C,QAAA,IAAI,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA,EAAG;AAChC,UAAA,GAAA,GAAM,OAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,IAAI,kBAAA,CAAmB,KAAK,CAAC,CAAA,KAAM,EAAE,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG;AAC/C,MAAA,OAAO,kBAAA,CAAmB,KAAA,CAAM,GAAA,EAAK,OAAO,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI,kBAAA,CAAmB,KAAK,CAAC,CAAA,KAAM,EAAE,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG;AAC/C,MAAA,OAAO,kBAAA,CAAmB,KAAA,CAAM,GAAA,EAAK,OAAO,CAAA;AAAA,IAC9C;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,sBAAsB,KAAA,EAAyC;AACrE,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS,OAAO,KAAA;AAEnC,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AAUpB,IAAA,IAAI,CAAC,KAAA,EAAO,SAAA,GAAY,CAAC,GAAG,OAAO,KAAA;AAEnC,IAAA,MAAM,YAAY,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,EAAG,MAAM,OAAA,IAAW,EAAA;AAEvD,IAAA,MAAM,oBAAA,GAAuB;AAAA,MAC3B,WAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,YAAA,GAAe,qBAAqB,IAAA,CAAK,CAAC,MAAM,SAAA,CAAU,UAAA,CAAW,CAAC,CAAC,CAAA;AAC7E,IAAA,IAAI,CAAC,cAAc,OAAO,KAAA;AAE1B,IAAA,MAAM,KAAA,GAAQ,YAAA;AACd,IAAA,MAAM,aAAA,GAAgB,UAAU,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAEtE,IAAA,MAAM,WAAA,GAAc,CAAC,GAAG,KAAA,CAAM,SAAS,CAAA;AACvC,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,WAAA,CAAY,CAAC,CAAA,GAAI;AAAA,QACf,GAAG,YAAY,CAAC,CAAA;AAAA,QAChB,IAAA,EAAM,EAAE,OAAA,EAAS,aAAA,EAAe,MAAM,IAAA;AAAK,OAC7C;AAAA,IACF,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,KAAA,EAAM;AAAA,IACpB;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,SAAA,EAAW,WAAA;AAAA,QACX,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAM;AAAA,QAC7B,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY;AAAC;AAC/B,KACF;AAAA,EACF;AAAA,EAEA,MAAM,uBAAuB,MAAA,EAAiC;AAC5D,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACb,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,eAAe,MAAM,CAAA;AACrD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,gBAAA,CAAiB,QAAQ,CAAA;AACjD,IAAA,OAAO,OAAO,MAAA,IAAU,EAAA;AAAA,EAC1B;AACF;AAEA,IAAM,qBAAA,GAAwB,GAAA;AAC9B,IAAM,qBAAA,GAAwB,CAAA;AAE9B,SAAS,yBACP,MAAA,EACgC;AAChC,EAAA,MAAM,SAAyC,EAAC;AAEhD,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,IACtC,CAAA,MAAA,IAAW,WAAA,CAAY,KAAK,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAe,KAAA,EAAgE;AACtF,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AAQpB,EAAA,IAAI,CAAC,KAAA,EAAO,QAAA,EAAU,OAAO,CAAC,KAAK,CAAA;AAEnC,EAAA,MAAM,OAAO,KAAA,CAAM,QAAA;AACnB,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,CAAC,KAAK,CAAA;AAEpC,EAAA,IAAI,WAAW,KAAA,CAAM,WAAA;AACrB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,KAAK,GAAA,CAAI,SAAA;AACf,IAAA,IAAI,EAAA,EAAI,KAAA,IAAS,EAAA,CAAG,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3C,MAAA,QAAA,GAAW,GAAG,KAAA,CAAM,MAAA;AAAA,IACtB;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACvC,IAAA,MAAM,KAAK,GAAA,CAAI,SAAA;AACf,IAAA,IAAI,CAAC,EAAA,EAAI,KAAA,EAAO,OAAO,GAAA;AAEvB,IAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,EAAA,CAAG,KAAK,CAAA;AAC1B,IAAA,OAAO,KAAA,CAAM,SAAS,QAAA,EAAU;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,EAAE,OAAA,EAAS,EAAA,EAAG,EAAG,CAAC,CAAA;AAAA,IACtD;AACA,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,MAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AAAA,IACjB;AAEA,IAAA,OAAO,EAAE,GAAG,GAAA,EAAK,SAAA,EAAW,EAAE,GAAG,EAAA,EAAI,OAAM,EAAE;AAAA,EAC/C,CAAC,CAAA;AAED,EAAA,IAAI,cAAA,CAAe,UAAU,qBAAA,EAAuB;AAClD,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAG,KAAA;AAAA,QACH,OAAO,EAAE,GAAG,OAAO,WAAA,EAAa,QAAA,EAAU,UAAU,cAAA;AAAe;AACrE,KACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAyC,EAAC;AAChD,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,iBAAA,GAAoB,cAAA,CAAe,CAAC,CAAA,GAAI,IAAA;AAChE,EAAA,MAAM,WAAW,KAAA,CAAM,iBAAA,GAAoB,cAAA,CAAe,KAAA,CAAM,CAAC,CAAA,GAAI,cAAA;AACrE,EAAA,MAAM,SAAA,GAAY,SAAA,GAAY,qBAAA,GAAwB,CAAA,GAAI,qBAAA;AAE1D,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,MAAA,EAAQ,KAAK,SAAA,EAAW;AACnD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,IAAI,SAAS,CAAA;AAC7C,IAAA,MAAM,WAAW,SAAA,GAAY,CAAC,SAAA,EAAW,GAAG,KAAK,CAAA,GAAI,KAAA;AACrD,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,WAAA,EAAa,QAAA;AAAA,QACb,iBAAA,EAAmB,CAAC,CAAC,SAAA;AAAA,QACrB,gBAAgB,KAAA,CAAM,cAAA;AAAA,QACtB;AAAA;AACF,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,KAAA,EAAyC;AAC5D,EAAA,OACE,MAAM,IAAA,KAAS,oBAAA,IACf,MAAM,IAAA,KAAS,oBAAA,IACf,MAAM,IAAA,KAAS,OAAA;AAEnB;AAEA,SAAS,gBAAA,CAAiB,OAAgC,KAAA,EAAwC;AAChG,EAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AACxB,EAAA,MAAM,SAAA,GAAY,MAAM,SAAS,CAAA;AAGjC,EAAA,IAAI,CAAC,SAAA,EAAW,QAAA,IAAY,UAAU,QAAA,CAAS,MAAA,KAAW,GAAG,OAAO,KAAA;AAEpE,EAAA,IAAI,KAAA,IAAS,wBAAwB,CAAA,EAAG;AACtC,IAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,SAAA,CAAU,QAAQ,CAAA;AAC1D,IAAA,OAAO;AAAA,MACL,GAAG,KAAA;AAAA,MACH,CAAC,SAAS,GAAG,EAAE,GAAG,SAAA,EAAW,UAAU,SAAA;AAAU,KACnD;AAAA,EACF;AAEA,EAAA,MAAM,kBAAA,GAAqB,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,KAAU;AAC3D,IAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACtB,MAAA,OAAO,gBAAA,CAAiB,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAA;AAAA,IAC1C;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,CAAC,SAAS,GAAG,EAAE,GAAG,SAAA,EAAW,UAAU,kBAAA;AAAmB,GAC5D;AACF;AAEA,SAAS,sBACP,MAAA,EACgC;AAChC,EAAA,MAAM,SAAyC,EAAC;AAChD,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AACxB,IAAA,MAAM,SAAA,GAAY,MAAM,SAAS,CAAA;AAGjC,IAAA,MAAM,WAAW,SAAA,EAAW,QAAA;AAC5B,IAAA,MAAM,oBAAA,GAAuB,QAAA,GACzB,EAAE,GAAG,OAAO,CAAC,SAAS,GAAG,EAAE,GAAG,SAAA,EAAW,QAAA,EAAU,MAAA,IAAY,GAC/D,KAAA;AACJ,IAAA,MAAA,CAAO,KAAK,oBAAoB,CAAA;AAChC,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACnC,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,qBAAA,CAAsB,QAAQ,CAAC,CAAA;AAAA,IAChD;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;ACp3BA,IAAM,gBAAA,GAA2C;AAAA,EAC/C,WAAA,EAAa,MAAA;AAAA,EACb,YAAA,EAAc,MAAA;AAAA,EACd,WAAA,EAAa,MAAA;AAAA,EACb,YAAA,EAAc,OAAA;AAAA,EACd,eAAA,EAAiB,MAAA;AAAA,EACjB,WAAA,EAAa,MAAA;AAAA,EACb,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,iBAAA,GAA4C;AAAA,EAChD,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,YAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,eAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAEO,IAAM,eAAN,MAAmB;AAAA,EACxB,WAAA,CACmB,OAAA,EACA,gBAAA,GAA2B,aAAA,EAC3B,YAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EAChB;AAAA,EAHgB,OAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EAGnB,MAAM,aAAA,CAAc,GAAA,EAAa,SAAA,EAAiD;AAChF,IAAA,MAAM,UAAA,GAAa,CAAA;AACnB,IAAA,IAAI,SAAA,GAA0B,IAAA;AAE9B,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,UAAA,EAAY,OAAA,EAAA,EAAW;AACrD,MAAA,IAAI;AACF,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,MAAM,IAAI,QAAQ,CAAC,CAAA,KAAM,WAAW,CAAA,EAAG,GAAA,GAAO,OAAO,CAAC,CAAA;AACtD,UAAA,SAAA,EAAU,CAAE,IAAA;AAAA,YACV,kFAAgC,OAAA,GAAU,CAAC,CAAA,CAAA,EAAI,UAAU,MAAM,SAAS,CAAA;AAAA,WAC1E;AAAA,QACF;AACA,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAG,CAAA;AAChC,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,MAAM,CAAA,0DAAA,EAAgB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,QAC1E;AAEA,QAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,WAAA;AAC5D,QAAA,MAAM,YAAY,gBAAA,CAAiB,WAAW,KAAK,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA,IAAK,MAAA;AAE/E,QAAA,MAAM,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,QAAA,CAAS,aAAa,CAAA;AACvD,QAAA,MAAM,IAAA,GAAOC,UAAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC1E,QAAA,MAAM,QAAA,GAAW,SAAA,CACd,OAAA,CAAQ,qBAAA,EAAuB,EAAE,CAAA,CACjC,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAEd,QAAA,MAAM,WAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,GAAG,SAAS,CAAA,CAAA;AAChD,QAAA,MAAM,SAAA,GAAY,CAAA,EAAG,IAAA,CAAK,gBAAgB,IAAI,QAAQ,CAAA,CAAA;AAEtD,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,gBAAgB,CAAA;AACrD,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,SAAA,EAAW,MAAM,CAAA;AAEhD,QAAA,OAAO,EAAE,WAAA,EAAa,GAAA,EAAK,WAAW,IAAA,EAAM,IAAA,EAAM,OAAO,MAAA,EAAO;AAAA,MAClE,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACtE;AAAA,IACF;AACA,IAAA,MAAM,SAAA;AAAA,EACR;AAAA,EAEA,MAAM,iBAAA,CACJ,QAAA,EACA,SAAA,EACgE;AAChE,IAAA,MAAM,UAAA,GAAa,sCAAA;AACnB,IAAA,MAAM,UAAU,CAAC,GAAG,QAAA,CAAS,QAAA,CAAS,UAAU,CAAC,CAAA;AACjD,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA,CAAK,gBAAA,CAAiB,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAE/E,IAAA,MAAM,kBAAA,GAAqB,2CAAA;AAC3B,IAAA,MAAM,kBAAkB,CAAC,GAAG,QAAA,CAAS,QAAA,CAAS,kBAAkB,CAAC,CAAA;AAEjE,IAAA,IAAI,aAAA,CAAc,MAAA,KAAW,CAAA,IAAK,eAAA,CAAgB,WAAW,CAAA,EAAG;AAC9D,MAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,EAAC,EAAE;AAAA,IAC5C;AAEA,IAAA,MAAM,IAAA,GAAO,IAAIC,IAAAA,CAAK,CAAC,CAAA;AACvB,IAAA,MAAM,YAAmC,EAAC;AAC1C,IAAA,IAAI,MAAA,GAAS,QAAA;AAEb,IAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,UAAA;AAAA,MAChC,aAAA,CAAc,GAAA,CAAI,OAAO,KAAA,KAAU;AACjC,QAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,QAAA,IAAI;AACF,UAAA,OAAO;AAAA,YACL,KAAA;AAAA,YACA,UAAU,MAAM,IAAA,CAAK,cAAc,KAAA,CAAM,CAAC,GAAI,SAAS;AAAA,WACzD;AAAA,QACF,CAAA,SAAE;AACA,UAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,QACf;AAAA,MACF,CAAC;AAAA,KACH;AAEA,IAAA,KAAA,MAAW,WAAW,WAAA,EAAa;AACjC,MAAA,IAAI,OAAA,CAAQ,WAAW,WAAA,EAAa;AACpC,MAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,OAAA,CAAQ,KAAA;AACpC,MAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AACvB,MAAA,MAAM,aAAA,GAAgB,CAAA,GAAA,EAAM,QAAA,CAAS,SAAS,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,KAAK,EAAE,CAAA,EAAA,CAAA;AAC/E,MAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,GAAI,aAAa,CAAA;AAAA,IAClD;AAEA,IAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,MAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AAC9C,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,IAAA,CAAK,YAAA,EAAc;AAEnC,QAAA,MAAM,UAAU,MAAM,IAAA,CAAK,YAAA,CAAa,eAAA,CAAgB,OAAO,OAAO,CAAA;AACtE,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,uEAAA,EAAuC,MAAA,CAAO,QAAQ,CAAA,CAAE,CAAA;AACzE,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,SAAS,SAAS,CAAA;AAC5D,QAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AACvB,QAAA,MAAM,aAAA,GAAgB,CAAA,GAAA,EAAM,QAAA,CAAS,SAAS,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,KAAK,EAAE,CAAA,EAAA,CAAA;AAC/E,QAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,GAAI,aAAa,CAAA;AAAA,MAClD,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,uEAAA,EAAmB,KAAK,CAAA,CAAE,CAAA;AAAA,MAC7C,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,MACf;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAU;AAAA,EACtC;AAAA,EAEA,MAAM,iBAAiB,SAAA,EAA+C;AACpE,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA;AACtD,IAAA,MAAM,WAAW,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,WAAA;AAC/C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,sBAAA,CAAuB,QAAQ,CAAA;AACxD,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,MAAM,CAAA,EAAG,EAAE,IAAA,EAAM,WAAA,EAAa,CAAA;AACrD,IAAA,MAAM,eAAe,MAAM,IAAA,CAAK,aAAa,UAAA,CAAW,IAAA,EAAM,UAAU,WAAW,CAAA;AAEnF,IAAA,OAAO,EAAE,WAAW,YAAA,EAAa;AAAA,EACnC;AAAA,EAEA,MAAM,qBAAA,CACJ,MAAA,EACA,MAAA,EAC8B;AAC9B,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAc,OAAO,EAAC;AAEhC,IAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,CAAC,QAAQ,CAAC,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,SAAS,CAAA;AAC3E,IAAA,IAAI,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEtC,IAAA,MAAM,UAA+B,EAAC;AACtC,IAAA,MAAM,cAAyB,EAAC;AAEhC,IAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,gBAAA,CAAiB,IAAI,SAAU,CAAA;AACzD,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UACf,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,aAAA;AAAA,YACN,WAAA,EAAa,EAAE,EAAA,EAAI,MAAA,CAAO,YAAA;AAAa;AACzC,SACD,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,IAAA,CAAK,CAAA,oDAAA,EAAe,GAAA,CAAI,SAAS,MAAM,KAAK,CAAA;AAAA,MAC1D;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,cAAA,CAAe,MAAA,EAAQ,WAAW,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,mBAAmB,SAAA,EAAoC;AACnE,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA;AAAA,IAChD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAM,KAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,IAAA,CAAK,gBAAgB,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAAA,IAC9E;AAAA,EACF;AAAA,EAEQ,uBAAuB,QAAA,EAA0B;AACvD,IAAA,MAAM,MAAM,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA,GAAI,CAAC,GAAG,WAAA,EAAY;AACzD,IAAA,OAAA,CAAQ,GAAA,IAAO,iBAAA,CAAkB,GAAG,CAAA,KAAM,0BAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,gBAAA,CACJ,QAAA,EACA,SAAA,EACgE;AAChE,IAAA,MAAM,WAAA,GAAc,0DAAA;AACpB,IAAA,MAAM,gBAAgB,CAAC,GAAG,QAAA,CAAS,QAAA,CAAS,WAAW,CAAC,CAAA;AACxD,IAAA,MAAM,iBAAA,GAAoB,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA,CAAK,eAAA,CAAgB,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAExF,IAAA,MAAM,eAAA,GAAkB,+DAAA;AACxB,IAAA,MAAM,oBAAoB,CAAC,GAAG,QAAA,CAAS,QAAA,CAAS,eAAe,CAAC,CAAA;AAEhE,IAAA,MAAM,YAAA,GACJ,8FAAA;AACF,IAAA,MAAM,iBAAiB,CAAC,GAAG,QAAA,CAAS,QAAA,CAAS,YAAY,CAAC,CAAA;AAC1D,IAAA,MAAM,oBAAA,GAAuB,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA,CAAK,eAAA,CAAgB,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAE5F,IAAA,MAAM,gBAAA,GACJ,mGAAA;AACF,IAAA,MAAM,qBAAqB,CAAC,GAAG,QAAA,CAAS,QAAA,CAAS,gBAAgB,CAAC,CAAA;AAElE,IAAA,MAAM,eACJ,iBAAA,CAAkB,MAAA,GAClB,kBAAkB,MAAA,GAClB,oBAAA,CAAqB,SACrB,kBAAA,CAAmB,MAAA;AAErB,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,EAAC,EAAE;AAAA,IAC5C;AAEA,IAAA,MAAM,IAAA,GAAO,IAAIA,IAAAA,CAAK,CAAC,CAAA;AACvB,IAAA,MAAM,YAAmC,EAAC;AAC1C,IAAA,IAAI,MAAA,GAAS,QAAA;AAEb,IAAA,KAAA,MAAW,SAAS,iBAAA,EAAmB;AACrC,MAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,EAAG,MAAK,IAAK,MAAA;AACpC,QAAA,MAAM,WAAW,MAAM,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,WAAW,OAAO,CAAA;AAChE,QAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AACvB,QAAA,MAAM,YAAA,GAAe,CAAA,EAAA,EAAK,QAAA,CAAS,SAAS,IAAI,OAAO,CAAA,EAAA,CAAA;AACvD,QAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,GAAI,YAAY,CAAA;AAAA,MACjD,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,oDAAA,EAAe,KAAK,CAAA,CAAE,CAAA;AAAA,MACzC,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,MACf;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,SAAS,iBAAA,EAAmB;AACrC,MAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AAC9C,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,IAAA,CAAK,YAAA,EAAc;AAEnC,QAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,QAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,YAAA,CAAa,gBAAgB,OAAO,CAAA;AAC/D,QAAA,IAAI,CAAC,OAAA,EAAS;AAEd,QAAA,MAAM,UAAU,QAAA,IAAY,KAAA,CAAM,CAAC,CAAA,EAAG,MAAK,IAAK,MAAA;AAChD,QAAA,MAAM,WAAW,MAAM,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,WAAW,OAAO,CAAA;AACpE,QAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AACvB,QAAA,MAAM,YAAA,GAAe,CAAA,EAAA,EAAK,QAAA,CAAS,SAAS,IAAI,OAAO,CAAA,EAAA,CAAA;AACvD,QAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,GAAI,YAAY,CAAA;AAAA,MACjD,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,iEAAA,EAAkB,KAAK,CAAA,CAAE,CAAA;AAAA,MAC5C,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,MACf;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,SAAS,oBAAA,EAAsB;AACxC,MAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,EAAG,MAAK,IAAK,MAAA;AACpC,QAAA,MAAM,WAAW,MAAM,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,WAAW,OAAO,CAAA;AAChE,QAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AACvB,QAAA,MAAM,YAAA,GAAe,CAAA,EAAA,EAAK,QAAA,CAAS,SAAS,IAAI,OAAO,CAAA,EAAA,CAAA;AACvD,QAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,GAAI,YAAY,CAAA;AAAA,MACjD,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,oDAAA,EAAe,KAAK,CAAA,CAAE,CAAA;AAAA,MACzC,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,MACf;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,SAAS,kBAAA,EAAoB;AACtC,MAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AAC9C,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,IAAA,CAAK,YAAA,EAAc;AAEnC,QAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,QAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,YAAA,CAAa,gBAAgB,OAAO,CAAA;AAC/D,QAAA,IAAI,CAAC,OAAA,EAAS;AAEd,QAAA,MAAM,UAAU,QAAA,IAAY,KAAA,CAAM,CAAC,CAAA,EAAG,MAAK,IAAK,MAAA;AAChD,QAAA,MAAM,WAAW,MAAM,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,WAAW,OAAO,CAAA;AACpE,QAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AACvB,QAAA,MAAM,YAAA,GAAe,CAAA,EAAA,EAAK,QAAA,CAAS,SAAS,IAAI,OAAO,CAAA,EAAA,CAAA;AACvD,QAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,GAAI,YAAY,CAAA;AAAA,MACjD,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,iEAAA,EAAkB,KAAK,CAAA,CAAE,CAAA;AAAA,MAC5C,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,MACf;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAU;AAAA,EACtC;AAAA,EAEQ,mBAAmB,OAAA,EAA+D;AACxF,IAAA,IAAI;AACF,MAAA,MAAM,UAAU,kBAAA,CAAmB,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAC,CAAA;AACjE,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAI/B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,EAAkB,EAAA,IAAM,EAAA;AAC7C,MAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,EAAA;AAC9B,MAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,KAAA,CAAM,wBAAwB,CAAA;AAC3D,MAAA,MAAM,WAAW,aAAA,GAAgB,kBAAA,CAAmB,aAAA,CAAc,CAAC,CAAE,CAAA,GAAI,EAAA;AACzE,MAAA,OAAO,OAAA,GAAU,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,IAAA;AAAA,IAC3C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,YAAA,CACZ,GAAA,EACA,UAAA,EACA,OAAA,EAC8B;AAC9B,IAAA,MAAM,UAAA,GAAa,CAAA;AACnB,IAAA,IAAI,SAAA,GAA0B,IAAA;AAE9B,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,UAAA,EAAY,OAAA,EAAA,EAAW;AACrD,MAAA,IAAI;AACF,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,MAAM,IAAI,QAAQ,CAAC,CAAA,KAAM,WAAW,CAAA,EAAG,GAAA,GAAO,OAAO,CAAC,CAAA;AACtD,UAAA,SAAA,EAAU,CAAE,IAAA;AAAA,YACV,4EAA+B,OAAA,GAAU,CAAC,CAAA,CAAA,EAAI,UAAU,MAAM,OAAO,CAAA;AAAA,WACvE;AAAA,QACF;AACA,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAG,CAAA;AAChC,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,MAAM,CAAA,oDAAA,EAAe,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,QACzE;AAEA,QAAA,MAAM,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,QAAA,CAAS,aAAa,CAAA;AACvD,QAAA,MAAM,IAAA,GAAOD,UAAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAE1E,QAAA,MAAM,SAAA,GAAY,KAAK,kBAAA,CAAmB,GAAA,EAAK,SAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAC,CAAA;AACnF,QAAA,MAAM,QAAA,GAAW,OAAA,CACd,OAAA,CAAQ,uBAAA,EAAyB,EAAE,CAAA,CACnC,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACd,QAAA,MAAM,WAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,GAAG,SAAS,CAAA,CAAA;AAChD,QAAA,MAAM,SAAA,GAAY,CAAA,EAAG,IAAA,CAAK,gBAAgB,IAAI,QAAQ,CAAA,CAAA;AAEtD,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,gBAAgB,CAAA;AACrD,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,SAAA,EAAW,MAAM,CAAA;AAEhD,QAAA,OAAO,EAAE,WAAA,EAAa,GAAA,EAAK,WAAW,IAAA,EAAM,IAAA,EAAM,OAAO,MAAA,EAAO;AAAA,MAClE,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACtE;AAAA,IACF;AACA,IAAA,MAAM,SAAA;AAAA,EACR;AAAA,EAEQ,iBAAiB,GAAA,EAAsB;AAC7C,IAAA,OAAO,IAAA,CAAK,gBAAgB,GAAG,CAAA;AAAA,EACjC;AAAA,EAEQ,gBAAgB,GAAA,EAAsB;AAC5C,IAAA,OACE,GAAA,CAAI,QAAA,CAAS,0BAA0B,CAAA,IACvC,GAAA,CAAI,SAAS,mBAAmB,CAAA,IAChC,GAAA,CAAI,QAAA,CAAS,qDAAqD,CAAA;AAAA,EAEtE;AAAA,EAEQ,eAAe,GAAA,EAA4B;AACjD,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,KAAA,CAAM,+CAA+C,CAAA;AAC1E,IAAA,OAAO,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,CAAC,CAAA,CAAG,WAAA,EAAa,CAAA,CAAA,GAAK,IAAA;AAAA,EAC7C;AAAA,EAEQ,kBAAA,CAAmB,KAAa,WAAA,EAAoC;AAC1E,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AAC9B,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,+BAA+B,CAAA;AAC/D,MAAA,IAAI,UAAU,OAAO,CAAA,CAAA,EAAI,SAAS,CAAC,CAAA,CAAG,aAAa,CAAA,CAAA;AAAA,IACrD,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,iBAAA,EAAmB,MAAA;AAAA,MACnB,iBAAA,EAAmB,MAAA;AAAA,MACnB,mEAAA,EAAqE,OAAA;AAAA,MACrE,2EAAA,EAA6E,OAAA;AAAA,MAC7E,yEAAA,EAA2E,OAAA;AAAA,MAC3E,mBAAA,EAAqB,MAAA;AAAA,MACrB,kBAAA,EAAoB;AAAA,KACtB;AACA,IAAA,IAAI,eAAe,OAAA,CAAQ,WAAW,CAAA,EAAG,OAAO,QAAQ,WAAW,CAAA;AACnE,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AC7ZA,IAAM,uBAAA,GAA2D;AAAA,EAC/D,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA,EAAS,OAAA;AAAA,EACT,OAAA,EAAS,OAAA;AAAA,EACT,OAAA,EAAS,OAAA;AAAA,EAET,MAAA,EAAQ,KAAA;AAAA,EAER,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EAER,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA,EAAS,OAAA;AAAA,EACT,OAAA,EAAS;AACX,CAAA;AAEA,IAAME,kBAAAA,GAA4C;AAAA,EAChD,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,YAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,eAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,YAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,iBAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,iBAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,iBAAA;AAAA,EACR,MAAA,EAAQ,kBAAA;AAAA,EACR,MAAA,EAAQ,YAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,OAAA,EAAS,yEAAA;AAAA,EACT,OAAA,EAAS,mEAAA;AAAA,EACT,OAAA,EAAS,2EAAA;AAAA,EACT,MAAA,EAAQ,iBAAA;AAAA,EACR,KAAA,EAAO,kBAAA;AAAA,EACP,MAAA,EAAQ,mBAAA;AAAA,EACR,MAAA,EAAQ,qBAAA;AAAA,EACR,KAAA,EAAO,6BAAA;AAAA,EACP,KAAA,EAAO,eAAA;AAAA,EACP,KAAA,EAAO,iBAAA;AAAA,EACP,KAAA,EAAO,iBAAA;AAAA,EACP,OAAA,EAAS,kBAAA;AAAA,EACT,MAAA,EAAQ,UAAA;AAAA,EACR,MAAA,EAAQ,YAAA;AAAA,EACR,OAAA,EAAS,WAAA;AAAA,EACT,MAAA,EAAQ,iBAAA;AAAA,EACR,MAAA,EAAQ,mBAAA;AAAA,EACR,MAAA,EAAQ,0BAAA;AAAA,EACR,MAAA,EAAQ,oBAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AAEO,SAAS,aAAa,QAAA,EAAmC;AAC9D,EAAA,MAAM,MAAM,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA,GAAI,CAAC,GAAG,WAAA,EAAY;AACzD,EAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AACjB,EAAA,OAAO,uBAAA,CAAwB,GAAG,CAAA,IAAK,MAAA;AACzC;AAEO,SAAS,YAAY,QAAA,EAA0B;AACpD,EAAA,MAAM,MAAM,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA,GAAI,CAAC,GAAG,WAAA,EAAY;AACzD,EAAA,IAAI,CAAC,KAAK,OAAO,0BAAA;AACjB,EAAA,OAAOA,kBAAAA,CAAkB,GAAG,CAAA,IAAK,0BAAA;AACnC;AAEA,SAAS,cAAc,QAAA,EAA0B;AAC/C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AAChC,EAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,EAAA;AAC3D;AAEO,IAAM,cAAN,MAAkB;AAAA,EAGvB,WAAA,CACmB,OAAA,EACA,YAAA,EACA,OAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAHgB,OAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EALF,IAAA,GAAO,IAAID,IAAAA,CAAK,CAAC,CAAA;AAAA,EAQlC,MAAM,kBAAA,CAAmB,YAAA,EAAsB,UAAA,EAAiD;AAC9F,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,oBAAA,EAAqB;AACzD,IAAA,MAAM,WAAA,GAAc,SAAS,MAAA,CAAO,CAAC,MAAM,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,KAAM,UAAU,CAAA;AAE/E,IAAA,IAAI,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEtC,IAAA,MAAM,UAA8B,EAAC;AAErC,IAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA,EAAG;AAC5C,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,KAAK,IAAI,CAAA;AACvD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,KAAK,IAAI,CAAA;AACtD,UAAA,MAAM,WAAA,GAAcD,WAAW,QAAQ,CAAA,CAAE,OAAO,MAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AACpE,UAAA,IAAI,QAAA,CAAS,aAAa,WAAA,EAAa;AAAA,QACzC;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,CAAK,KAAK,OAAA,EAAQ;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,MAAM,YAAY,CAAA;AACvD,QAAA,IAAI,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,MACjC,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,IAAA,CAAK,CAAA,8CAAA,EAAc,IAAA,CAAK,IAAI,MAAM,KAAK,CAAA;AAAA,MACrD,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,KAAK,OAAA,EAAQ;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,YAAA,GAA4C;AAChD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,oBAAA,EAAqB;AACzD,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEnC,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAA6B;AACvD,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACtC,MAAA,MAAM,IAAA,GAAO,aAAA,CAAc,GAAA,CAAI,MAAM,KAAK,EAAC;AAC3C,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,MAAA,aAAA,CAAc,GAAA,CAAI,QAAQ,IAAI,CAAA;AAAA,IAChC;AAEA,IAAA,MAAM,UAA8B,EAAC;AAErC,IAAA,KAAA,MAAW,CAAC,UAAA,EAAY,KAAK,CAAA,IAAK,aAAA,EAAe;AAC/C,MAAA,MAAM,YAAA,GAAe,UAAA,GACjB,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,UAAU,CAAA,GACjC,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,UAAU,CAAA;AAErC,MAAA,MAAM,eAAe,YAAA,EAAc,YAAA;AACnC,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,SAAA,EAAU,CAAE,IAAA;AAAA,UACV,CAAA,yEAAA,EAAqB,UAAA,IAAc,gBAAM,CAAA,EAAA,EAAK,MAAM,MAAM,CAAA,OAAA;AAAA,SAC5D;AACA,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA,EAAG;AAC5C,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,KAAK,IAAI,CAAA;AACvD,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,KAAK,IAAI,CAAA;AACtD,YAAA,MAAM,WAAA,GAAcA,WAAW,QAAQ,CAAA,CAAE,OAAO,MAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AACpE,YAAA,IAAI,QAAA,CAAS,aAAa,WAAA,EAAa;AAAA,UACzC;AAAA,QACF;AAEA,QAAA,MAAM,IAAA,CAAK,KAAK,OAAA,EAAQ;AACxB,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,MAAM,YAAY,CAAA;AACvD,UAAA,IAAI,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,QACjC,SAAS,KAAA,EAAO;AACd,UAAA,SAAA,GAAY,IAAA,CAAK,CAAA,8CAAA,EAAc,IAAA,CAAK,IAAI,MAAM,KAAK,CAAA;AAAA,QACrD,CAAA,SAAE;AACA,UAAA,IAAA,CAAK,KAAK,OAAA,EAAQ;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,iBAAA,CACJ,GAAA,EACA,QAAA,EACA,YAAA,EAC6B;AAC7B,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAG,CAAA;AAChC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,CAAA,oDAAA,EAAe,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACzE;AAEA,IAAA,MAAM,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,QAAA,CAAS,aAAa,CAAA;AACvD,IAAA,MAAM,IAAA,GAAOA,WAAW,QAAQ,CAAA,CAAE,OAAO,MAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAC7D,IAAA,MAAM,YAAY,YAAA,GAAe,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,QAAA;AAEjE,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,YAAA,IAAgB,GAAG,CAAA;AACnD,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,SAAA,EAAW,MAAM,CAAA;AAEhD,IAAA,OAAO,EAAE,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,OAAO,MAAA,EAAO;AAAA,EACrD;AAAA,EAEA,MAAM,kBAAA,CACJ,MAAA,EACA,YAAA,EAC+B;AAC/B,IAAA,MAAM,UAAgC,EAAC;AAEvC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,WAAW,IAAA,CAAK,eAAA,CAAgB,KAAA,CAAM,GAAA,EAAK,MAAM,OAAO,CAAA;AAC9D,MAAA,IAAI,IAAA,CAAK,QAAQ,gBAAA,CAAiB,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAA,EAAG;AAElE,MAAA,MAAM,IAAA,CAAK,KAAK,OAAA,EAAQ;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,kBAAkB,KAAA,CAAM,GAAA,EAAK,UAAU,YAAY,CAAA;AAC7E,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,MACrB,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,IAAA,CAAK,CAAA,oDAAA,EAAe,KAAA,CAAM,GAAG,MAAM,KAAK,CAAA;AAAA,MACtD,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,KAAK,OAAA,EAAQ;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,UAAA,CACZ,IAAA,EACA,YAAA,EACkC;AAClC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,KAAK,IAAI,CAAA;AACtD,IAAA,MAAM,WAAW,IAAA,CAAK,IAAA,CAAK,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,MAAA;AAC/C,IAAA,MAAM,WAAA,GAAc,YAAY,QAAQ,CAAA;AACxC,IAAA,MAAM,SAAA,GAAY,aAAa,QAAQ,CAAA;AACvC,IAAA,MAAM,IAAA,GAAOA,WAAW,QAAQ,CAAA,CAAE,OAAO,MAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAE7D,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,MAAM,CAAA,EAAG,EAAE,IAAA,EAAM,WAAA,EAAa,CAAA;AACrD,IAAA,MAAM,eAAe,MAAM,IAAA,CAAK,aAAa,UAAA,CAAW,IAAA,EAAM,UAAU,WAAW,CAAA;AAEnF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,YAAY,CAAA;AAC1D,IAAA,MAAM,KAAK,YAAA,CAAa,cAAA,CAAe,YAAA,EAAc,CAAC,KAAK,CAAC,CAAA;AAE5D,IAAA,IAAA,CAAK,QAAQ,YAAA,CAAa;AAAA,MACxB,WAAW,IAAA,CAAK,IAAA;AAAA,MAChB,YAAA,EAAc,YAAA;AAAA,MACd,YAAA;AAAA,MACA,QAAA,EAAU,SAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAED,IAAA,SAAA,GAAY,IAAA,CAAK,CAAA,8CAAA,EAAc,KAAK,IAAI,CAAA,QAAA,EAAM,SAAS,CAAA,aAAA,CAAK,CAAA;AAE5D,IAAA,OAAO,EAAE,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,cAAc,SAAA,EAAU;AAAA,EACzD;AAAA,EAEQ,eAAA,CAAgB,WAA4B,YAAA,EAA+B;AACjF,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,IAAA,EAAM,aAAA;AAAA,MACN,WAAA,EAAa,EAAE,EAAA,EAAI,YAAA;AAAa,KAClC;AAEA,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAK,OAAA;AACH,QAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,MACzC,KAAK,KAAA;AACH,QAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,OAAA,EAAQ;AAAA,MACrC,KAAK,OAAA;AACH,QAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,MACzC,KAAK,OAAA;AACH,QAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,MACzC,KAAK,MAAA;AAAA,MACL;AACE,QAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAQ;AAAA;AACzC,EACF;AAAA,EAEQ,eAAA,CAAgB,KAAa,OAAA,EAA0B;AAC7D,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA,CAAQ,uBAAA,EAAyB,EAAE,EAAE,IAAA,EAAK;AAC/D,MAAA,IAAI,MAAM,OAAO,IAAA;AAAA,IACnB;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AAC9B,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AACnC,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AACzC,MAAA,IAAI,QAAQ,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,mBAAmB,IAAI,CAAA;AAAA,IAChE,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,4DAA4D,CAAA;AAClF,IAAA,OAAO,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,EAAG,GAAA,GAAM,CAAA,CAAA,EAAI,GAAA,CAAI,CAAC,CAAC,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,EACrD;AACF;;;AC3UA,IAAM,aAAA,GAAgB,wBAAA;AACtB,IAAM,aAAA,GAAgB,MAAA;AACtB,IAAM,cAAA,uBAAqB,GAAA,CAAI;AAAA,EAC7B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,iBAAiB,IAAA,EAAsB;AACrD,EAAA,IAAI,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAAE,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA,CAAE,IAAA,EAAK,CAAE,KAAA,CAAM,GAAG,GAAG,CAAA;AAE/F,EAAA,IAAI,cAAA,CAAe,GAAA,CAAI,SAAA,CAAU,WAAA,EAAa,CAAA,EAAG;AAC/C,IAAA,SAAA,GAAY,IAAI,SAAS,CAAA,CAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,SAAA,GAAY,WAAA;AAAA,EACd;AAEA,EAAA,OAAO,SAAA;AACT;;;ACxCA,IAAM,iBAAA,GAAoB,iCAAA;AAC1B,IAAM,qBAAA,GAAwB,yCAAA;AAC9B,IAAM,gBAAA,GAAmB,yEAAA;AACzB,IAAM,sBAAA,GAAyB,wDAAA;AAC/B,IAAM,sBAAA,GAAyB,mDAAA;AAC/B,IAAM,sBAAA,GAAyB,2DAAA;AAC/B,IAAM,iBAAA,GAAoB,kCAAA;AAE1B,IAAM,eAAA,GAAkB,iDAAA;AACxB,IAAM,eAAA,GAAkB,iDAAA;AACxB,IAAM,aAAA,GAAgB,6CAAA;AACtB,IAAM,cAAA,GAAiB,+CAAA;AACvB,IAAM,aAAA,GAAgB,yCAAA;AACtB,IAAM,mBAAA,GAAsB,4CAAA;AAE5B,IAAMG,aAAAA,GAAe,+BAAA;AACrB,IAAMC,WAAAA,GAAa,6BAAA;AAEZ,SAAS,yBAAyB,QAAA,EAA0B;AACjE,EAAA,IAAI,MAAA,GAAS,QAAA;AAEb,EAAA,MAAA,GAAS,sBAAsB,MAAM,CAAA;AACrC,EAAA,MAAA,GAAS,0BAA0B,MAAM,CAAA;AACzC,EAAA,MAAA,GAAS,eAAe,MAAM,CAAA;AAC9B,EAAA,MAAA,GAAS,gBAAgB,MAAM,CAAA;AAC/B,EAAA,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACnC,EAAA,MAAA,GAAS,iBAAiB,MAAM,CAAA;AAChC,EAAA,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACnC,EAAA,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACnC,EAAA,MAAA,GAAS,iBAAiB,MAAM,CAAA;AAChC,EAAA,MAAA,GAAS,iBAAiB,MAAM,CAAA;AAChC,EAAA,MAAA,GAAS,sBAAsB,MAAM,CAAA;AACrC,EAAA,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACjC,EAAA,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACnC,EAAA,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACjC,EAAA,MAAA,GAAS,sBAAsB,MAAM,CAAA;AACrC,EAAA,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACnC,EAAA,MAAA,GAAS,sBAAsB,MAAM,CAAA;AACrC,EAAA,MAAA,GAAS,sBAAsB,MAAM,CAAA;AACrC,EAAA,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACjC,EAAA,MAAA,GAAS,cAAc,MAAM,CAAA;AAC7B,EAAA,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACnC,EAAA,MAAA,GAAS,wBAAwB,MAAM,CAAA;AAEvC,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,yBAAyB,QAAA,EAA0B;AACjE,EAAA,IAAI,MAAA,GAAS,QAAA;AAEb,EAAA,MAAA,GAAS,qBAAqB,MAAM,CAAA;AACpC,EAAA,MAAA,GAAS,iBAAiB,MAAM,CAAA;AAChC,EAAA,MAAA,GAAS,wBAAwB,MAAM,CAAA;AACvC,EAAA,MAAA,GAAS,iBAAiB,MAAM,CAAA;AAChC,EAAA,MAAA,GAAS,qBAAqB,MAAM,CAAA;AACpC,EAAA,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACjC,EAAA,MAAA,GAAS,sBAAsB,MAAM,CAAA;AAErC,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,0BAA0B,OAAA,EAAyB;AAC1D,EAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,IACb,2CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,KAAA,EAAe,IAAA,EAAc,IAAA,KAAiB;AACrD,MAAA,MAAM,OAAA,GAAU,OAAO,IAAA,GAAO,EAAA;AAC9B,MAAA,OAAO,CAAA;AAAA,SAAA,EAAuB,KAAA,CAAM,MAAM,CAAA;AAAA,MAAA,EAAqB,OAAO;AAAA,EAAK,IAAI;AAAA;AAAA,UAAA,CAAA;AAAA,IACjF;AAAA,GACF;AACF;AAEA,SAAS,eAAe,OAAA,EAAyB;AAC/C,EAAA,SAAS,cAAc,KAAA,EAAuB;AAC5C,IAAA,MAAM,CAAA,GAAI,wEAAA,CAAyE,IAAA,CAAK,KAAK,CAAA;AAC7F,IAAA,IAAI,CAAC,GAAG,OAAO,KAAA;AAEf,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAG,IAAA,EAAK;AACzB,IAAA,IAAI,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAG,IAAA,EAAK;AAEtB,IAAA,IAAA,GAAO,eAAe,IAAI,CAAA;AAE1B,IAAA,MAAM,WAAA,GAAc,IAAA,CACjB,KAAA,CAAM,IAAI,EACV,GAAA,CAAI,CAAC,IAAA,KAAU,IAAA,GAAO,KAAK,IAAI,CAAA,CAAA,GAAK,GAAI,CAAA,CACxC,KAAK,IAAI,CAAA;AACZ,IAAA,OAAO,gBAAgB,KAAK;AAAA,EAAK,WAAW,CAAA,CAAA;AAAA,EAC9C;AAEA,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,gBAAA,EAAkB,aAAa,CAAA;AACxD;AAEA,SAAS,sBAAsB,IAAA,EAAsB;AACnD,EAAA,MAAM,KAAA,GAAQ,IAAA,CACX,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,CAC/B,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,EAAG,GAAA,KAAQ,EAAE,CAAA,KAAM,CAAA,IAAK,CAAA,KAAM,EAAA,CAAA,IAAO,EAAE,CAAA,KAAM,GAAA,CAAI,MAAA,GAAS,CAAA,IAAK,MAAM,EAAA,CAAG,CAAA;AACtF,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAE9B,EAAA,MAAM,UAAA,GAAa,2BAAA,CAA4B,IAAA,CAAK,SAAS,CAAA;AAC7D,EAAA,MAAM,OAAO,UAAA,GAAa,kBAAA,CAAmB,UAAA,CAAW,CAAC,CAAE,CAAA,GAAI,MAAA;AAC/D,EAAA,MAAM,KAAA,GAAQ,UAAA,GAAa,UAAA,CAAW,CAAC,CAAA,GAAK,SAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,CAAC,EAAE,IAAA,CAAK,IAAI,EAAE,IAAA,EAAK;AAE5C,EAAA,MAAM,YAAA,GAAe,QAAQ,CAAA,IAAA,EAAO,IAAI,KAAK,KAAK,CAAA,CAAA,GAAK,OAAO,IAAI,CAAA,CAAA,CAAA;AAClE,EAAA,MAAM,WAAA,GAAc,OAChB,IAAA,GACA,IAAA,CACG,MAAM,IAAI,CAAA,CACV,IAAI,CAAC,IAAA,KAAU,KAAK,IAAA,EAAK,GAAI,KAAK,IAAI,CAAA,CAAA,GAAK,GAAI,CAAA,CAC/C,IAAA,CAAK,IAAI,CAAA,GACZ,EAAA;AAEJ,EAAA,OAAO,YAAA,GAAe,WAAA;AACxB;AAEA,SAAS,gBAAgB,OAAA,EAAyB;AAChD,EAAA,IAAI,SAAS,OAAA,CAAQ,OAAA;AAAA,IAAQ,qBAAA;AAAA,IAAuB,CAAC,MAAA,EAAQ,IAAA,KAC3D,qBAAA,CAAsB,IAAI;AAAA,GAC5B;AACA,EAAA,MAAA,GAAS,MAAA,CAAO,QAAQ,iBAAA,EAAmB,CAAC,QAAQ,IAAA,KAAiB,qBAAA,CAAsB,IAAI,CAAC,CAAA;AAChG,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,oBAAoB,OAAA,EAAyB;AACpD,EAAA,IAAI,SAAS,OAAA,CAAQ,OAAA,CAAQ,wBAAwB,CAAC,MAAA,EAAQ,KAAa,IAAA,KAAiB;AAC1F,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,OAAO,KAAK,OAAO,CAAA,EAAA,CAAA;AAAA,EACrB,CAAC,CAAA;AACD,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA;AAAA,IACd,gFAAA;AAAA,IACA,CAAC,MAAA,EAAQ,EAAA,KAAe,CAAA,SAAA,EAAY,EAAE,CAAA,EAAA;AAAA,GACxC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,oBAAoB,OAAA,EAAyB;AACpD,EAAA,OAAO,OAAA,CAAQ,QAAQ,sBAAA,EAAwB,CAAC,QAAQ,IAAA,KAAiB,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AACrF;AAEA,SAAS,oBAAoB,OAAA,EAAyB;AACpD,EAAA,OAAO,QAAQ,OAAA,CAAQ,sBAAA,EAAwB,CAAC,MAAA,EAAQ,OAAe,GAAA,KAAiB;AACtF,IAAA,OAAO,GAAA,GAAM,CAAA,EAAG,KAAK,CAAA,QAAA,EAAM,GAAG,CAAA,CAAA,GAAK,KAAA;AAAA,EACrC,CAAC,CAAA;AACH;AAGA,SAAS,sBAAsB,OAAA,EAAyB;AACtD,EAAA,OAAO,QAAQ,OAAA,CAAQ,iBAAA,EAAmB,CAAC,MAAA,EAAQ,IAAY,KAAA,KAAkB;AAC/E,IAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AAC3C,IAAA,MAAM,YAAY,QAAA,GAAW,CAAC,CAAA,IAAK,SAAA,GAAY,CAAC,CAAA,IAAK,SAAA;AACrD,IAAA,OAAO,CAAA,0BAAA,EAA6B,EAAE,CAAA,MAAA,EAAS,SAAS,CAAA,EAAA,CAAA;AAAA,EAC1D,CAAC,CAAA;AACH;AAEA,SAAS,sBAAsB,OAAA,EAAyB;AACtD,EAAA,IAAI,SAAS,OAAA,CAAQ,OAAA;AAAA,IACnB,kEAAA;AAAA,IACA,CAAC,KAAA,KAAU;AACT,MAAA,MAAM,KAAA,GAAQ,KAAA,CACX,OAAA,CAAQ,kCAAA,EAAoC,EAAE,EAC9C,OAAA,CAAQ,4BAAA,EAA8B,EAAE,CAAA,CACxC,KAAA,CAAM,IAAI,EACV,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,CAC/B,IAAA,CAAK,IAAI,CAAA,CACT,IAAA,EAAK;AACR,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AACA,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA;AAAA,IACd,mDAAA;AAAA,IACA,CAAC,MAAA,EAAQ,KAAA,KAAkB,KAAA,CAAM,IAAA;AAAK,GACxC;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,iBAAiB,OAAA,EAAyB;AACjD,EAAA,IAAI,MAAA,GAAS,OAAA;AAEb,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,eAAA,EAAiB,CAAC,MAAA,EAAQ,KAAa,OAAA,KAAoB;AACjF,IAAA,MAAM,GAAA,GAAM,QAAQ,IAAA,EAAK;AACzB,IAAA,OAAO,MAAM,CAAA,WAAA,EAAO,GAAG,KAAK,GAAG,CAAA,CAAA,CAAA,GAAM,qBAAc,GAAG,CAAA,CAAA,CAAA;AAAA,EACxD,CAAC,CAAA;AAED,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,eAAA,EAAiB,CAAC,MAAA,EAAQ,KAAa,OAAA,KAAoB;AACjF,IAAA,MAAM,GAAA,GAAM,QAAQ,IAAA,EAAK;AACzB,IAAA,OAAO,MAAM,CAAA,WAAA,EAAO,GAAG,KAAK,GAAG,CAAA,CAAA,CAAA,GAAM,qBAAc,GAAG,CAAA,CAAA,CAAA;AAAA,EACxD,CAAC,CAAA;AAED,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,aAAA,EAAe,CAAC,MAAA,EAAQ,KAAa,OAAA,KAAoB;AAC/E,IAAA,MAAM,GAAA,GAAM,QAAQ,IAAA,EAAK;AACzB,IAAA,OAAO,MAAM,CAAA,WAAA,EAAO,GAAG,KAAK,GAAG,CAAA,CAAA,CAAA,GAAM,mBAAY,GAAG,CAAA,CAAA,CAAA;AAAA,EACtD,CAAC,CAAA;AAED,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,cAAA,EAAgB,CAAC,MAAA,EAAQ,KAAa,OAAA,KAAoB;AAChF,IAAA,MAAM,GAAA,GAAM,QAAQ,IAAA,EAAK;AACzB,IAAA,OAAO,MAAM,CAAA,WAAA,EAAO,GAAG,KAAK,GAAG,CAAA,CAAA,CAAA,GAAM,oBAAa,GAAG,CAAA,CAAA,CAAA;AAAA,EACvD,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,iBAAiB,OAAA,EAAyB;AACjD,EAAA,OAAO,QAAQ,OAAA,CAAQ,aAAA,EAAe,CAAC,MAAA,EAAQ,OAAe,IAAA,KAAiB;AAC7E,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,MAAM,QAAA,GAAW,OAAA,CACd,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA,CACzB,KAAK,IAAI,CAAA;AACZ,IAAA,OAAO,YAAY,KAAK;AAAA,EAAK,QAAQ,CAAA,CAAA;AAAA,EACvC,CAAC,CAAA;AACH;AAGA,SAAS,sBAAsB,OAAA,EAAyB;AACtD,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,mBAAA,EAAqB,CAAC,QAAQ,IAAA,KAAiB;AACpE,IAAA,OAAO,6BAA6B,IAAI,CAAA,cAAA,CAAA;AAAA,EAC1C,CAAC,CAAA;AACH;AAEA,SAAS,qBAAqB,OAAA,EAAyB;AACrD,EAAA,MAAM,eAAA,GAAkB,yCAAA;AAExB,EAAA,IAAI,MAAA,GAAS,OAAA;AACb,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,OAAO,MAAA,KAAW,IAAA,IAAQ,MAAA,EAAA,GAAW,GAAA,EAAK;AACxC,IAAA,IAAA,GAAO,MAAA;AACP,IAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,eAAA,EAAiB,CAAC,MAAA,EAAQ,OAAe,IAAA,KAAiB;AAChF,MAAA,MAAM,WAAW,IAAA,CACd,KAAA,CAAM,IAAI,CAAA,CACV,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,OAAA,CAAQ,SAAS,EAAE,CAAC,EACvC,IAAA,CAAK,IAAI,EACT,IAAA,EAAK;AACR,MAAA,OAAO,CAAA;AAAA,SAAA,EAAuB,KAAA,CAAM,MAAM,CAAA;;AAAA,EAAiB,QAAQ;;AAAA,UAAA,CAAA;AAAA,IACrE,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,UAAU,IAAI,MAAA,CAAOL,YAAAA,CAAYI,aAAY,GAAG,GAAG,CAAA;AACzD,EAAA,MAAM,QAAQ,IAAI,MAAA,CAAOJ,YAAAA,CAAYK,WAAU,GAAG,GAAG,CAAA;AAErD,EAAA,MAAA,GAAS,CAAA;AACT,EAAA,OAAO,MAAA,CAAO,QAAA,CAASD,aAAY,CAAA,IAAK,WAAW,GAAA,EAAK;AACtD,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQA,aAAY,CAAA;AAC5C,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,MAAA,EAAQ,QAAA,GAAWA,cAAa,MAAM,CAAA;AACrE,IAAA,IAAI,WAAW,EAAA,EAAI;AAEnB,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,CAAM,QAAA,GAAWA,cAAa,MAAA,EAAQ,MAAM,EAAE,IAAA,EAAK;AACxE,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,UAAA,GAAa,UAAA,CAAW,CAAC,CAAA,GAAK,EAAA;AAC5C,IAAA,MAAM,IAAA,GAAO,MACV,KAAA,CAAM,IAAI,EACV,KAAA,CAAM,CAAC,EACP,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,OAAA,CAAQ,SAAS,EAAE,CAAC,EACvC,IAAA,CAAK,IAAI,EACT,IAAA,EAAK;AAER,IAAA,MAAM,IAAA,GAAO,CAAA;AAAA,SAAA,EAAuB,KAAK,CAAA;;AAAA,EAAiB,IAAI;;AAAA,UAAA,CAAA;AAC9D,IAAA,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,GAAI,OAAO,MAAA,CAAO,KAAA,CAAM,MAAA,GAASC,WAAAA,CAAW,MAAM,CAAA;AAAA,EACrF;AAEA,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtD,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAA,CAAgB,SAAiB,SAAA,EAA2B;AACnE,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,GAAA,GAAM,SAAA;AAEV,EAAA,OAAO,GAAA,GAAM,OAAA,CAAQ,MAAA,IAAU,KAAA,GAAQ,CAAA,EAAG;AACxC,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQD,aAAAA,EAAc,GAAG,CAAA;AACnD,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQC,WAAAA,EAAY,GAAG,CAAA;AAE/C,IAAA,IAAI,OAAA,KAAY,IAAI,OAAO,EAAA;AAE3B,IAAA,IAAI,SAAA,KAAc,EAAA,IAAM,SAAA,GAAY,OAAA,EAAS;AAC3C,MAAA,KAAA,EAAA;AACA,MAAA,GAAA,GAAM,YAAYD,aAAAA,CAAa,MAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,KAAA,EAAA;AACA,MAAA,IAAI,KAAA,KAAU,GAAG,OAAO,OAAA;AACxB,MAAA,GAAA,GAAM,UAAUC,WAAAA,CAAW,MAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,wBAAwB,OAAA,EAAyB;AACxD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,WAAA,GAAc,6BAAA,CAA8B,IAAA,CAAK,KAAA,CAAM,CAAC,CAAE,CAAA;AAChE,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,MAAA,MAAM,KAAA,GAAQ,YAAY,CAAC,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,IAAI,CAAA,IAAK,WAAA;AAC1C,MAAA,MAAM,eAAe,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,KAAA;AAEnD,MAAA,MAAM,YAAsB,EAAC;AAC7B,MAAA,CAAA,EAAA;AACA,MAAA,OAAO,CAAA,GAAI,MAAM,MAAA,IAAU,KAAA,CAAM,CAAC,CAAA,CAAG,UAAA,CAAW,IAAI,CAAA,EAAG;AACrD,QAAA,SAAA,CAAU,KAAK,KAAA,CAAM,CAAC,CAAA,CAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AACjC,QAAA,CAAA,EAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,KAAK,aAAa,CAAA;AACzB,MAAA,MAAA,CAAO,KAAK,YAAY,CAAA;AACxB,MAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,SAAS,CAAA;AAAA,MAC1B;AACA,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAE,CAAA;AACrB,MAAA,CAAA,EAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AACzB;AAEA,IAAMC,eAAAA,GAAyC;AAAA,EAC7C,WAAA,EAAM,KAAA;AAAA,EACN,cAAA,EAAI,MAAA;AAAA,EACJ,cAAA,EAAM,SAAA;AAAA,EACN,WAAA,EAAM,QAAA;AAAA,EACN,QAAA,EAAK,SAAA;AAAA,EACL,QAAA,EAAK,SAAA;AAAA,EACL,QAAA,EAAK,UAAA;AAAA,EACL,WAAA,EAAM,MAAA;AAAA,EACN,WAAA,EAAM,UAAA;AAAA,EACN,WAAA,EAAM,KAAA;AAAA,EACN,WAAA,EAAM,OAAA;AAAA,EACN,WAAA,EAAM;AACR,CAAA;AAEA,IAAM,iBAAyC,MAAA,CAAO,WAAA;AAAA,EACpD,MAAA,CAAO,OAAA,CAAQA,eAAc,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAC,CAAA,EAAG,CAAC,CAAC;AACvD,CAAA;AAEA,SAAS,mBAAmB,KAAA,EAAuB;AACjD,EAAA,OAAOA,eAAAA,CAAe,KAAK,CAAA,IAAK,MAAA;AAClC;AAEA,SAAS,mBAAmB,IAAA,EAAkC;AAC5D,EAAA,OAAO,cAAA,CAAe,IAAA,CAAK,WAAA,EAAa,CAAA;AAC1C;AAEA,SAASN,aAAY,GAAA,EAAqB;AACxC,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AAClD;AAEA,IAAM,mBAAA,GAAsB,uCAAA;AAC5B,IAAM,oBAAA,GAAuB,2CAAA;AAC7B,IAAM,qBAAA,GAAwB,yCAAA;AAE9B,SAAS,iBAAiB,OAAA,EAAyB;AACjD,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,mBAAA,EAAqB,CAAC,QAAQ,IAAA,KAAiB;AACpE,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,EAAE,EAAE,IAAA,EAAK;AAC/C,IAAA,OAAO,KAAK,OAAO,CAAA,EAAA,CAAA;AAAA,EACrB,CAAC,CAAA;AACH;AAGA,SAAS,kBAAkB,OAAA,EAAyB;AAClD,EAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,IACb,oBAAA;AAAA,IACA,CAAC,MAAA,EAAQ,KAAA,EAAe,SAAiB,CAAA,qBAAA,EAAwB,KAAK,KAAK,IAAI,CAAA,UAAA;AAAA,GACjF;AACF;AAEA,SAAS,sBAAsB,OAAA,EAAyB;AACtD,EAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,IACb,wCAAA;AAAA,IACA,CAAC,MAAA,EAAQ,KAAA,KAAkB,CAAA,EAAA,EAAK,KAAA,CAAM,MAAM,CAAA,gBAAA;AAAA,GAC9C;AACF;AAEA,SAAS,sBAAsB,OAAA,EAAyB;AACtD,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,uBAAA,EAAyB,EAAE,CAAA;AACpD;AAEA,SAAS,oBAAoB,OAAA,EAAyB;AACpD,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,oCAAA,EAAsC,CAAC,QAAQ,KAAA,KAAkB;AACtF,IAAA,OAAO,KAAA,CACJ,QAAQ,iBAAA,EAAmB,EAAE,EAC7B,OAAA,CAAQ,mBAAA,EAAqB,EAAE,CAAA,CAC/B,IAAA,EAAK;AAAA,EACV,CAAC,CAAA;AACH;AAEA,SAAS,kBAAkB,OAAA,EAAyB;AAClD,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,qBAAA,EAAuB,IAAI,CAAA;AACpD;AAEA,IAAM,qBAAA,GAAwB,gBAAA;AAC9B,IAAM,oBAAA,GAAuB,mCAAA;AAE7B,SAAS,kBAAkB,OAAA,EAAyB;AAClD,EAAA,IAAI,SAAS,OAAA,CAAQ,OAAA,CAAQ,oBAAA,EAAsB,CAAC,QAAQ,EAAA,KAAe;AACzE,IAAA,OAAO,CAAA;AAAA,EAAO,EAAA,CAAG,MAAM;AAAA,EAAA,CAAA;AAAA,EACzB,CAAC,CAAA;AACD,EAAA,MAAA,GAAS,MAAA,CAAO,QAAQ,qBAAA,EAAuB,CAAC,QAAQ,EAAA,KAAe,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,CAAG,CAAA;AAChF,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,mBAAA,EAAqB,CAAC,QAAQ,KAAA,KAAkB;AACtE,IAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACjE,IAAA,OAAO,IAAI,SAAS,CAAA,CAAA,CAAA;AAAA,EACtB,CAAC,CAAA;AACD,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,oBAAoB,OAAA,EAAyB;AACpD,EAAA,OAAO,QAAQ,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,OAAA,CAAQ,SAAS,GAAG,CAAA;AAC1D;AAEA,IAAM,eAAA,GAAkB,kCAAA;AACxB,IAAM,YAAA,GAAe,uBAAA;AACrB,IAAM,aAAA,GAAgB,kCAAA;AAEtB,SAAS,eAAe,KAAA,EAA0B;AAChD,EAAA,OAAO,KAAA,CAAM,MAAM,CAAC,CAAA,KAAM,cAAc,IAAA,CAAK,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AACxD;AAEA,SAAS,oBAAoB,OAAA,EAAyB;AACpD,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,eAAA,EAAiB,CAAC,QAAQ,SAAA,KAAsB;AACrE,IAAA,MAAM,OAAmB,EAAC;AAC1B,IAAA,IAAI,QAAA;AACJ,IAAA,MAAM,QAAQ,IAAI,MAAA,CAAO,YAAA,CAAa,MAAA,EAAQ,aAAa,KAAK,CAAA;AAEhE,IAAA,OAAA,CAAQ,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,SAAS,OAAO,IAAA,EAAM;AAClD,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,IAAI,SAAA;AACJ,MAAA,MAAM,SAAS,IAAI,MAAA,CAAO,aAAA,CAAc,MAAA,EAAQ,cAAc,KAAK,CAAA;AACnE,MAAA,OAAA,CAAQ,YAAY,MAAA,CAAO,IAAA,CAAK,SAAS,CAAC,CAAE,OAAO,IAAA,EAAM;AACvD,QAAA,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,CAAG,MAAM,CAAA;AAAA,MACjC;AACA,MAAA,IAAI,CAAC,cAAA,CAAe,KAAK,CAAA,EAAG;AAC1B,QAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAE9B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AACtD,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,MAAA,GAAS,KAAK,CAAC,CAAA;AACrB,MAAA,OAAO,MAAA,CAAO,MAAA,GAAS,QAAA,EAAU,MAAA,CAAO,KAAK,EAAE,CAAA;AAC/C,MAAA,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA,EAAA,CAAI,CAAA;AACtC,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,MAAA,CAAO,GAAA,CAAI,MAAM,KAAK,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,MACzD;AAAA,IACF;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB,CAAC,CAAA;AACH;AAIA,IAAM,uBAAA,GAA0B,+BAAA;AAChC,IAAM,uBAAA,GAA0B,+BAAA;AAChC,IAAM,qBAAA,GAAwB,+BAAA;AAC9B,IAAM,sBAAA,GAAyB,+BAAA;AAE/B,SAAS,iBAAiB,OAAA,EAAyB;AACjD,EAAA,IAAI,MAAA,GAAS,OAAA;AAEb,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,uBAAA,EAAyB,CAAC,MAAA,EAAQ,SAAiB,GAAA,KAAgB;AACzF,IAAA,OAAO,CAAA,YAAA,EAAe,GAAG,CAAA,EAAA,EAAK,OAAO,CAAA,QAAA,CAAA;AAAA,EACvC,CAAC,CAAA;AAED,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,uBAAA,EAAyB,CAAC,MAAA,EAAQ,SAAiB,GAAA,KAAgB;AACzF,IAAA,OAAO,CAAA,YAAA,EAAe,GAAG,CAAA,EAAA,EAAK,OAAO,CAAA,QAAA,CAAA;AAAA,EACvC,CAAC,CAAA;AAED,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,qBAAA,EAAuB,CAAC,MAAA,EAAQ,SAAiB,GAAA,KAAgB;AACvF,IAAA,OAAO,CAAA,UAAA,EAAa,GAAG,CAAA,EAAA,EAAK,OAAO,CAAA,MAAA,CAAA;AAAA,EACrC,CAAC,CAAA;AAED,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,sBAAA,EAAwB,CAAC,MAAA,EAAQ,SAAiB,GAAA,KAAgB;AACxF,IAAA,OAAO,CAAA,WAAA,EAAc,GAAG,CAAA,EAAA,EAAK,OAAO,CAAA,OAAA,CAAA;AAAA,EACtC,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAEA,IAAM,eAAA,GAAkB,sCAAA;AAExB,SAAS,iBAAiB,OAAA,EAAyB;AACjD,EAAA,OAAO,QAAQ,OAAA,CAAQ,eAAA,EAAiB,CAAC,MAAA,EAAQ,OAAe,IAAA,KAAiB;AAC/E,IAAA,MAAM,WAAW,IAAA,CACd,KAAA,CAAM,IAAI,CAAA,CACV,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAC,EACrC,IAAA,CAAK,IAAI,EACT,IAAA,EAAK;AACR,IAAA,OAAO,CAAA,YAAA,EAAe,KAAK,CAAA,EAAA,EAAK,QAAQ,CAAA,MAAA,CAAA;AAAA,EAC1C,CAAC,CAAA;AACH;AAEA,IAAM,mBAAA,GAAsB,mDAAA;AAE5B,SAAS,qBAAqB,OAAA,EAAyB;AACrD,EAAA,OAAO,QAAQ,OAAA,CAAQ,mBAAA,EAAqB,CAAC,MAAA,EAAQ,IAAY,IAAA,KAAiB;AAChF,IAAA,OAAO,CAAA,aAAA,EAAgB,EAAE,CAAA,QAAA,EAAW,IAAI,CAAA,GAAA,CAAA;AAAA,EAC1C,CAAC,CAAA;AACH;AAEA,IAAM,iBAAA,GAAoB,sDAAA;AAE1B,SAAS,kBAAkB,OAAA,EAAyB;AAClD,EAAA,OAAO,QAAQ,OAAA,CAAQ,iBAAA,EAAmB,CAAC,MAAA,EAAQ,OAAe,IAAA,KAAiB;AACjF,IAAA,OAAO,CAAA,aAAA,EAAgB,KAAK,CAAA,EAAA,EAAK,IAAI,CAAA,OAAA,CAAA;AAAA,EACvC,CAAC,CAAA;AACH;AAEA,IAAM,qBAAA,GAAwB,sDAAA;AAE9B,SAAS,sBAAsB,OAAA,EAAyB;AACtD,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,qBAAA,EAAuB,CAAC,QAAQ,IAAA,KAAiB;AACtE,IAAA,OAAO,0BAA0B,IAAI,CAAA,OAAA,CAAA;AAAA,EACvC,CAAC,CAAA;AACH;AAEA,SAAS,cAAc,OAAA,EAAyB;AAC9C,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,IAAK,eAAA,CAAgB,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AACrE,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,IAAI,OAAA,IAAW,IAAA,CAAK,IAAA,EAAK,KAAM,EAAA,EAAI;AACjC,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ,WAAW,CAAC,KAAA,CAAM,KAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AACnC,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ;AACA,MAAA,MAAA,CAAO,KAAK,OAAA,GAAU,IAAA,GAAO,KAAK,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAC,CAAA;AAAA,IACzD;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AACzB;AAEA,SAAS,wBAAwB,OAAA,EAAyB;AACxD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,IAAA,CAAK,MAAK,KAAM,EAAA,IAAM,IAAI,CAAA,IAAK,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACvD,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA;AAC1C,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA;AAC7B,MAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,IAAK,CAAC,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AAC9D,QAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AACf,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,EAClB;AACA,EAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AACzB;AC7hBO,IAAM,iBAAN,MAAqB;AAAA,EAG1B,YACmB,MAAA,EACA,OAAA,EACA,YAAA,EACA,OAAA,EACA,UACA,YAAA,EACjB;AANiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAEjB,IAAA,IAAA,CAAK,eAAe,mBAAA,CAAoB;AAAA,MACtC,SAAS,CAAC,KAAA,KAAkB,QAAQ,eAAA,CAAgB,KAAK,GAAG,YAAA,IAAgB,IAAA;AAAA,MAC5E,eAAe,CAAC,MAAA,KAAmB,QAAQ,aAAA,CAAc,MAAM,GAAG,KAAA,IAAS;AAAA,KAC5E,CAAA;AAAA,EACH;AAAA,EAXmB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EARF,cAAA,GAAiB,IAAI,cAAA,EAAe;AAAA,EAgBrD,MAAM,OAAA,GAAuC;AAC3C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,SAAA;AACrC,IAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACxC,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAG,MAAA,EAAQ,EAAC,EAAE;AAAA,IAC9C;AAEA,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,MAAM,SAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AAC/C,QAAA,OAAA,IAAW,MAAA,CAAO,OAAA;AAClB,QAAA,OAAA,IAAW,MAAA,CAAO,OAAA;AAClB,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAA,CAAO,MAAM,CAAA;AAAA,MAC9B,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,IAAA,CAAK,CAAA,aAAA,EAAgB,QAAA,CAAS,UAAU,uBAAa,KAAK,CAAA;AACtE,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,MAAM,QAAA,CAAS,WAAA;AAAA,UACf,SAAA,EAAW,QAAA;AAAA,UACX,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,MAAA,EAAO;AAAA,EACpC;AAAA,EAEA,MAAM,OAAA,GAAuC;AAC3C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,SAAA;AACrC,IAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACxC,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAG,MAAA,EAAQ,EAAC,EAAE;AAAA,IAC9C;AAEA,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,MAAM,SAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AAC/C,QAAA,OAAA,IAAW,MAAA,CAAO,OAAA;AAClB,QAAA,OAAA,IAAW,MAAA,CAAO,OAAA;AAClB,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAA,CAAO,MAAM,CAAA;AAAA,MAC9B,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,IAAA,CAAK,CAAA,aAAA,EAAgB,QAAA,CAAS,UAAU,uBAAa,KAAK,CAAA;AACtE,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,MAAM,QAAA,CAAS,WAAA;AAAA,UACf,SAAA,EAAW,QAAA;AAAA,UACX,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,MAAA,EAAO;AAAA,EACpC;AAAA,EAEA,MAAM,aAAa,QAAA,EAA2D;AAC5E,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,YAAA,CAAa,iBAAA,CAAkB,SAAS,UAAU,CAAA;AAC5E,IAAA,IAAA,CAAK,cAAA,CAAe,WAAW,MAAM,CAAA;AAErC,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAA,CAAS,WAAW,CAAA;AAEpD,IAAA,MAAM,IAAA,CAAK,kBAAkB,QAAQ,CAAA;AAErC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,YAAA,CAAa,qBAAA;AAAA,MACpC,QAAA,CAAS,UAAA;AAAA,MACT,QAAA,CAAS;AAAA,KACX;AAEA,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,MAAM,SAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,KAAK,EAAE,CAAA;AAEjD,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAI,IAAA,CAAK,gBAAA,KAAqB,MAAA,CAAO,gBAAA,EAAkB;AACvD,UAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,QAAQ,CAAA;AAC1C,UAAA,OAAA,EAAA;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,QAAQ,CAAA;AAC1C,UAAA,OAAA,EAAA;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,MAAM,CAAA,EAAG,QAAA,CAAS,WAAW,CAAA,CAAA,EAAI,KAAK,EAAE,CAAA,CAAA;AAAA,UACxC,SAAA,EAAW,QAAA;AAAA,UACX,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,SAAA,EAAU,CAAE,KAAK,CAAA,UAAA,EAAa,QAAA,CAAS,WAAW,CAAA,EAAA,EAAK,OAAO,CAAA,eAAA,EAAQ,OAAO,CAAA,yBAAA,CAAO,CAAA;AACpF,IAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,MAAA,EAAO;AAAA,EACpC;AAAA,EAEA,MAAc,kBAAkB,QAAA,EAA6C;AAC3E,IAAA,IAAI;AACF,MAAA,MAAM,cAAc,MAAM,IAAA,CAAK,YAAA,CAAa,sBAAA,CAAuB,SAAS,UAAU,CAAA;AACtF,MAAA,MAAM,UAAA,GAAa,6BAAA;AACnB,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,eAAe,CAAA;AAE/C,MAAA,IAAI,kBAAuD,EAAC;AAC5D,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,UAAU,CAAA;AACvD,QAAA,eAAA,GAAkB,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,MACvC,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,eAAA,CAAgB,QAAA,CAAS,UAAU,CAAA,GAAI,WAAA;AACvC,MAAA,MAAM,IAAA,CAAK,QAAQ,SAAA,CAAU,UAAA,EAAY,KAAK,SAAA,CAAU,eAAA,EAAiB,IAAA,EAAM,CAAC,CAAC,CAAA;AACjF,MAAA,SAAA,EAAU,CAAE,IAAA;AAAA,QACV,iCAAkB,WAAA,CAAY,KAAA,CAAM,MAAM,CAAA,qBAAA,EAAS,SAAS,UAAU,CAAA;AAAA,OACxE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,4EAAA,CAAA,EAAmC,KAAK,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,MAAc,gBAAA,CACZ,IAAA,EACA,QAAA,EACiB;AACjB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,IAAI,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,iBAAiB,KAAK,CAAA;AAEvC,IAAA,MAAM,UAAA,GAAa,KAAK,cAAA,CAAe,oBAAA;AAAA,MACpC,IAAA,CAA4D;AAAA,KAC/D;AACA,IAAA,UAAA,CAAW,KAAA,GAAQ,KAAA;AAEnB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,IAAI,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,WAAA,CAAY,IAAI,CAAA;AAE/C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,YAAA,CAAa,iBAAA;AAAA,UAC1C,CAAA,SAAA,EAAY,MAAM,GAAG,CAAA,CAAA,CAAA;AAAA,UACrB,GAAG,QAAQ,CAAA,MAAA;AAAA,SACb;AACA,QAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,OAAA,CAAQ,KAAA,CAAM,qBAAqB,CAAA;AACrE,QAAA,IAAI,aAAA,GAAgB,CAAC,CAAA,EAAG;AACtB,UAAA,UAAA,CAAW,KAAA,GAAQ,cAAc,CAAC,CAAA;AAAA,QACpC,CAAA,MAAO;AACL,UAAA,UAAA,CAAW,QAAQ,KAAA,CAAM,GAAA;AAAA,QAC3B;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,UAAA,CAAW,QAAQ,KAAA,CAAM,GAAA;AAAA,MAC3B;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,UAAA,CAAW,OAAO,IAAA,CAAK,KAAA;AAAA,IACzB;AAEA,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,YAAA,CAAa,eAAA,CAAgB,KAAK,EAAE,CAAA;AAChE,MAAA,QAAA,GAAW,wBAAA,CAAyB,SAAS,QAAQ,CAAA;AAAA,IACvD,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,aAAA,KAAkB,eAAe,QAAA,EAAU;AACpE,MAAA,MAAM,cAAc,MAAM,IAAA,CAAK,YAAA,CAAa,iBAAA,CAAkB,UAAU,KAAK,CAAA;AAC7E,MAAA,QAAA,GAAW,WAAA,CAAY,OAAA;AAAA,IACzB;AAEA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,aAAa,MAAM,IAAA,CAAK,YAAA,CAAa,gBAAA,CAAiB,UAAU,KAAK,CAAA;AAC3E,MAAA,QAAA,GAAW,UAAA,CAAW,OAAA;AAAA,IACxB;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,KAAK,EAAE,CAAA;AACzD,IAAA,MAAM,WAAW,cAAA,EAAgB,YAAA,IAAgB,GAAG,QAAA,CAAS,WAAW,IAAI,QAAQ,CAAA,GAAA,CAAA;AAEpF,IAAA,MAAM,YAAA,GAAe,KAAK,QAAA,CAAS,iBAAA;AAAA,MACjC,QAAA;AAAA,MACA;AAAA,QACE,SAAA,EAAW,MAAA;AAAA,QACX,IAAA,EAAM,cAAA;AAAA,QACN,QAAA;AAAA,QACA,UAAA,EAAY;AAAA,OACd;AAAA,MACA,EAAE,UAAA;AAAW,KACf;AAEA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAA,CAAS,WAAW,CAAA;AACpD,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,QAAA,EAAU,YAAY,CAAA;AAEnD,IAAA,MAAM,IAAA,GAAO,YAAY,YAAY,CAAA;AACrC,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,MAAM;AAC7B,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO;AAAA,QAClB,YAAA,EAAc,QAAA;AAAA,QACd,cAAc,IAAA,CAAK,EAAA;AAAA,QACnB,gBAAgB,QAAA,CAAS,UAAA;AAAA,QACzB,WAAA,EAAa,IAAA;AAAA,QACb,kBAAkB,IAAA,CAAK,gBAAA;AAAA,QACvB,iBAAA,EAAA,iBAAmB,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAC1C,aAAA,EAAe,MAAA;AAAA,QACf,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ,QAAA;AAAA,QACR,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,YAAA,EAAc,OAAO;AAAA,OAChD,CAAA;AAED,MAAA,IAAA,CAAK,QAAQ,cAAA,CAAe;AAAA,QAC1B,YAAA,EAAc,QAAA;AAAA,QACd,cAAc,IAAA,CAAK,EAAA;AAAA,QACnB,KAAA;AAAA,QACA,OAAA,EAAS,eAAe,UAAU;AAAA,OACnC,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAc,aAAa,QAAA,EAA2D;AACpF,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,YAAA,CAAa,iBAAA,CAAkB,SAAS,UAAU,CAAA;AAC5E,IAAA,IAAA,CAAK,cAAA,CAAe,WAAW,MAAM,CAAA;AAErC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,iBAAA,EAAkB;AACtD,IAAA,MAAM,MAAA,GAAS,SAAS,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,GAC5C,QAAA,CAAS,WAAA,GACT,QAAA,CAAS,WAAA,GAAc,GAAA;AAC3B,IAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA;AAEhE,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,MAAM,SAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,KAAK,IAAI,CAAA;AACrD,QAAA,MAAM,IAAA,GAAO,YAAY,OAAO,CAAA;AAEhC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,KAAK,IAAI,CAAA;AAC/C,QAAA,IAAI,MAAA,EAAQ,gBAAgB,IAAA,EAAM;AAElC,QAAA,MAAM,MAAA,GAASF,QAAO,OAAO,CAAA;AAC7B,QAAA,MAAM,cAAc,MAAA,CAAO,IAAA;AAC3B,QAAA,MAAM,OAAO,MAAA,CAAO,OAAA;AAEpB,QAAA,MAAM,KAAA,GAAS,WAAA,CAAY,KAAA,IAAoB,oBAAA,CAAqB,KAAK,IAAI,CAAA;AAC7E,QAAA,OAAO,WAAA,CAAY,KAAA;AAEnB,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,kBAAA,CAAmB,aAAa,KAAK,CAAA;AAC7E,QAAA,MAAM,QAAA,GAAW,wBAAA,CAAyB,IAAA,CAAK,IAAA,EAAM,CAAA;AAErD,QAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,UAAA,MAAM,IAAA,CAAK,YAAA,CAAa,oBAAA,CAAqB,MAAA,CAAO,cAAc,WAAW,CAAA;AAE7E,UAAA,IAAI;AACF,YAAA,MAAM,IAAA,CAAK,YAAA,CAAa,mBAAA,CAAoB,MAAA,CAAO,cAAc,QAAQ,CAAA;AAAA,UAC3E,CAAA,CAAA,MAAQ;AAAA,UAER;AAEA,UAAA,MAAM,cAAc,MAAM,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,OAAO,YAAY,CAAA;AACvE,UAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,MAAM;AAC7B,YAAA,IAAA,CAAK,OAAA,CAAQ,WAAW,MAAA,CAAO,EAAA,EAAI,MAAM,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,OAAO,CAAC,CAAA;AACtE,YAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,MAAA,CAAO,EAAA,EAAI,QAAQ,CAAA;AAC7C,YAAA,IAAA,CAAK,OAAA,CAAQ,mBAAA,CAAoB,MAAA,CAAO,EAAA,EAAI,YAAY,gBAAgB,CAAA;AAAA,UAC1E,CAAC,CAAA;AACD,UAAA,OAAA,EAAA;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,YAAA,CAAa,sBAAA,CAAuB;AAAA,YAC1D,UAAU,QAAA,CAAS,UAAA;AAAA,YACnB,UAAA,EAAY,UAAA;AAAA,YACZ,KAAA;AAAA,YACA,QAAA,EAAU,QAAA;AAAA,YACV,UAAA,EAAY;AAAA,WACb,CAAA;AAED,UAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,MAAM;AAC7B,YAAA,IAAA,CAAK,QAAQ,MAAA,CAAO;AAAA,cAClB,cAAc,IAAA,CAAK,IAAA;AAAA,cACnB,cAAc,IAAA,CAAK,EAAA;AAAA,cACnB,gBAAgB,QAAA,CAAS,UAAA;AAAA,cACzB,WAAA,EAAa,IAAA;AAAA,cACb,kBAAkB,IAAA,CAAK,gBAAA;AAAA,cACvB,iBAAA,EAAA,iBAAmB,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,cAC1C,aAAA,EAAe,MAAA;AAAA,cACf,QAAA,EAAU,QAAA;AAAA,cACV,MAAA,EAAQ,QAAA;AAAA,cACR,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,OAAO;AAAA,aAC3C,CAAA;AAED,YAAA,IAAA,CAAK,QAAQ,cAAA,CAAe;AAAA,cAC1B,cAAc,IAAA,CAAK,IAAA;AAAA,cACnB,cAAc,IAAA,CAAK,EAAA;AAAA,cACnB,KAAA;AAAA,cACA,OAAA,EAAS,eAAe,WAAW;AAAA,aACpC,CAAA;AAAA,UACH,CAAC,CAAA;AACD,UAAA,OAAA,EAAA;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,SAAA,EAAW,QAAA;AAAA,UACX,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,SAAA,EAAU,CAAE,KAAK,CAAA,UAAA,EAAa,QAAA,CAAS,WAAW,CAAA,EAAA,EAAK,OAAO,CAAA,eAAA,EAAQ,OAAO,CAAA,yBAAA,CAAO,CAAA;AACpF,IAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,MAAA,EAAO;AAAA,EACpC;AACF;AAEA,SAAS,eAAe,UAAA,EAA+C;AACrE,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,OAAA,IAAW,UAAA,CAAW,KAAA;AAC7C,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAO,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAQ,CAAA;AACnF,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA;AACjB,IAAA,OAAO,GAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,OAAO,CAAA;AACnB,EAAA,OAAO,EAAC;AACV;AAEA,SAAS,qBAAqB,QAAA,EAA0B;AACtD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AAChC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA;AAC5C,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AACrC;;;AChVO,IAAM,mBAAN,MAAuB;AAAA,EAU5B,WAAA,CACmB,MAAA,EACA,OAAA,EACA,YAAA,EACA,OAAA,EACjB;AAJiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAEjB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,CAAe,OAAO,CAAA;AAChD,IAAA,IAAA,CAAK,WAAW,qBAAA,CAAsB;AAAA,MACpC,gBAAA,EAAkB,CAAC,IAAA,KAAS,OAAA,CAAQ,gBAAgB,IAAI;AAAA,KACzD,CAAA;AACD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,EAAe;AACzC,IAAA,IAAA,CAAK,eAAe,IAAI,YAAA,CAAa,SAAS,MAAA,CAAO,KAAA,CAAM,aAAa,YAAY,CAAA;AACpF,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,WAAA,CAAY,OAAA,EAAS,cAAc,OAAO,CAAA;AACjE,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,EAAe;AACzC,IAAA,IAAA,CAAK,iBAAiB,IAAI,cAAA;AAAA,MACxB,MAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AACA,IAAA,IAAA,CAAK,eAAe,mBAAA,CAAoB;AAAA,MACtC,SAAS,CAAC,KAAA,KAAkB,QAAQ,eAAA,CAAgB,KAAK,GAAG,YAAA,IAAgB,IAAA;AAAA,MAC5E,eAAe,CAAC,MAAA,KAAmB,QAAQ,aAAA,CAAc,MAAM,GAAG,KAAA,IAAS;AAAA,KAC5E,CAAA;AAED,IAAA,IAAA,CAAK,cAAA,CAAe,cAAA,CAAe,IAAA,CAAK,YAAA,CAAa,mBAAmB,CAAA;AAAA,EAC1E;AAAA,EA3BmB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EAbF,cAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACT,cAAA,GAAiB,KAAA;AAAA,EAgCzB,MAAM,KAAK,OAAA,EAA4C;AACrD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAA,KAAc,MAAA,EAAQ;AACzC,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,GAAG,OAAA,EAAS,CAAA,EAAG,MAAA,EAAQ,EAAC,EAAG,QAAA,EAAU,IAAA,CAAK,GAAA,KAAQ,SAAA,EAAU;AAAA,IAC5F;AAEA,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAE5B,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,iBAAA,EAAkB;AACnD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,kBAAA,CAAmB,KAAK,CAAA;AAE5D,IAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,UAAU,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,CAAC,CAAA;AAC7F,IAAA,MAAM,QAAA,GAAW,OAAA,EAAS,KAAA,GAAQ,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAE5F,IAAA,MAAM,aAAa,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,SAAA,IAAa,EAAC,EAAG,GAAA;AAAA,MAAI,CAAC,CAAA,KAC1D,CAAA,CAAE,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,GAAI,CAAA,CAAE,WAAA,GAAc,CAAA,CAAE,WAAA,GAAc;AAAA,KAChE;AACA,IAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAAiB,SAAA,CAAU,IAAA,CAAK,CAAC,MAAA,KAAW,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA;AAErF,IAAA,MAAM,QAAA,GAAA,CACJ,OAAA,EAAS,KAAA,GACL,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,OAAA,CAAQ,KAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAC,CAAA,GACvE,QAAA,EACJ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,QAAA,CAAS,CAAA,CAAE,IAAI,CAAC,CAAA;AAEjC,IAAA,MAAM,gBAAgB,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,UAAU,CAAA,IAAK,CAAA;AACnE,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,CAAC,YAAA,EAAc;AAC1C,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,GAAG,OAAA,EAAS,CAAA,EAAG,MAAA,EAAQ,EAAC,EAAG,QAAA,EAAU,IAAA,CAAK,GAAA,KAAQ,SAAA,EAAU;AAAA,IAC5F;AAEA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAM,UAAA,GAAa,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,CAAE,MAAA;AAChE,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,CAAA,CAAE,IAAA,KAAS,OAAO,CAAA,CAAE,MAAA;AACvF,MAAA,MAAM,UAAA,GAAa,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,CAAE,MAAA;AAChE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,UAAA;AAAA,QACT,OAAA,EAAS,UAAA;AAAA,QACT,OAAA,EAAS,UAAA;AAAA,QACT,QAAQ,EAAC;AAAA,QACT,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OACzB;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,kBAAA,EAAoB,MAAM,CAAA;AAE/C,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,IAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACnC,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,UAAA,WAAA,CAAY,GAAA,CAAI,MAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,GAAG,WAAW,CAAA,CAAE,IAAA;AAAA,MACrC,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE;AAAA,KAC/C;AACA,IAAA,KAAA,MAAW,cAAc,aAAA,EAAe;AACtC,MAAA,MAAM,IAAA,CAAK,iBAAiB,UAAU,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,OAAO,IAAII,IAAAA,CAAK,IAAA,CAAK,MAAA,CAAO,SAAS,WAAW,CAAA;AACtD,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,MAAM,SAA4B,EAAC;AAEnC,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,MAAM,QAAQ,QAAA,CAAS,MAAA;AAEvB,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,WAAW,YAAY;AACjD,MAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,MAAA,IAAI;AACF,QAAA,OAAA,EAAS,UAAA,GAAa,EAAE,SAAA,EAAW,KAAA,EAAO,OAAO,IAAI,CAAA;AACrD,QAAA,QAAQ,OAAO,IAAA;AAAM,UACnB,KAAK,SAAA;AACH,YAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AACjC,YAAA,OAAA,EAAA;AACA,YAAA;AAAA,UACF,KAAK,UAAA;AACH,YAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AACjC,YAAA,OAAA,EAAA;AACA,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AAC/B,YAAA,OAAA,EAAA;AACA,YAAA;AAAA,UACF,KAAK,SAAA;AACH,YAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AACjC,YAAA,OAAA,EAAA;AACA,YAAA;AAAA;AACJ,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,SAAA,EACE,OAAO,IAAA,KAAS,SAAA,GAAY,WAAW,MAAA,CAAO,IAAA,KAAS,YAAY,QAAA,GAAW,QAAA;AAAA,UAChF,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,MACf;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,OAAA,CAAQ,IAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA;AAEvC,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,OAAO,MAAM,CAAA;AACnD,MAAA,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,oBAAA,EAAuB,YAAA,CAAa,MAAM,CAAA,0CAAA,CAAc,CAAA;AACzE,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,GAAI,CAAC,CAAA;AAE5C,MAAA,KAAA,MAAW,UAAU,YAAA,EAAc;AACjC,QAAA,MAAM,MAAA,GAAS,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,OAAO,IAAI,CAAA;AAC1D,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAClB,UAAA;AAAA,QACF;AACA,QAAA,IAAI;AACF,UAAA,QAAQ,OAAO,IAAA;AAAM,YACnB,KAAK,SAAA;AACH,cAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AACjC,cAAA,OAAA,EAAA;AACA,cAAA;AAAA,YACF,KAAK,UAAA;AACH,cAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AACjC,cAAA,OAAA,EAAA;AACA,cAAA;AAAA,YACF,KAAK,OAAA;AACH,cAAA,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AAC/B,cAAA,OAAA,EAAA;AACA,cAAA;AAAA,YACF,KAAK,SAAA;AACH,cAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AACjC,cAAA,OAAA,EAAA;AACA,cAAA;AAAA;AAEJ,UAAA,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,gDAAA,EAA0B,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,QAC1D,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,WAAW,MAAA,CAAO,SAAA;AAAA,YAClB,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,WAC7D,CAAA;AACD,UAAA,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,gDAAA,EAA0B,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAA,KAAc,KAAA,EAAO;AACxC,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,WAAA,CAAY,YAAA,EAAa;AACxD,QAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,UAAA,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,eAAA,EAAkB,WAAA,CAAY,MAAM,CAAA,mDAAA,CAAa,CAAA;AAAA,QACpE;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,EAAU,CAAE,IAAA,CAAK,qEAAA,EAA+B,KAAK,CAAA;AAAA,MACvD;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAK,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,MAAA,IAAU,KAAK,CAAA,EAAG;AACnD,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,cAAA,CAAe,OAAA,EAAQ;AACnD,QAAA,OAAA,IAAW,QAAA,CAAS,OAAA;AACpB,QAAA,OAAA,IAAW,QAAA,CAAS,OAAA;AACpB,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,QAAA,CAAS,MAAM,CAAA;AAAA,MAChC,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,EAAU,CAAE,IAAA,CAAK,6CAAA,EAAgC,KAAK,CAAA;AAAA,MACxD;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,cAAA,EAAA,qBAAoB,IAAA,EAAK,EAAE,aAAa,CAAA;AAC7D,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,cAAA,EAAA,qBAAoB,IAAA,EAAK,EAAE,aAAa,CAAA;AAC7D,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AAE3C,IAAA,OAAO,EAAE,SAAS,OAAA,EAAS,OAAA,EAAS,QAAQ,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,EAAU;AAAA,EAC/E;AAAA,EAEA,MAAM,KAAK,OAAA,EAA4C;AACrD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,WAAA,GAA0B;AAAA,MAC9B,OAAA,EAAS,CAAA;AAAA,MACT,OAAA,EAAS,CAAA;AAAA,MACT,OAAA,EAAS,CAAA;AAAA,MACT,WAAW,EAAC;AAAA,MACZ,cAAc,EAAC;AAAA,MACf,QAAQ,EAAC;AAAA,MACT,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KACzB;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAA,KAAc,MAAA,EAAQ;AACzC,MAAA,OAAO,WAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAE5B,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,MAAM,YAAwB,EAAC;AAC/B,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,MAAM,SAA4B,EAAC;AAEnC,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,mBAAA,EAAoB;AAErD,IAAA,MAAM,WAAW,OAAA,EAAS,KAAA,GACtB,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,KAAM;AAC1B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,EAAE,MAAM,CAAA;AAClD,MAAA,OAAO,MAAA,IAAU,OAAA,CAAQ,KAAA,CAAO,IAAA,CAAK,CAAC,MAAM,MAAA,CAAO,YAAA,CAAa,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,IAC/E,CAAC,CAAA,GACD,aAAA;AAEJ,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,WAAA;AAAA,IACT;AAEA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAM,UAAA,GAAa,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,CAAE,MAAA;AAChE,MAAA,MAAM,UAAA,GAAa,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,CAAE,MAAA;AACjE,MAAA,MAAM,UAAA,GAAa,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,CAAE,MAAA;AAChE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,UAAA;AAAA,QACT,OAAA,EAAS,UAAA;AAAA,QACT,OAAA,EAAS,UAAA;AAAA,QACT,WAAW,EAAC;AAAA,QACZ,cAAc,EAAC;AAAA,QACf,QAAQ,EAAC;AAAA,QACT,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OACzB;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,kBAAA,EAAoB,MAAM,CAAA;AAE/C,IAAA,MAAM,OAAO,IAAIA,IAAAA,CAAK,IAAA,CAAK,MAAA,CAAO,SAAS,WAAW,CAAA;AAEtD,IAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAA,MAAM,YAAY,QAAA,CAAS,MAAA;AAE3B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,WAAW,YAAY;AACjD,MAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,MAAA,IAAI;AACF,QAAA,OAAA,EAAS,UAAA,GAAa,EAAE,aAAA,EAAe,SAAA,EAAW,OAAO,MAAM,CAAA;AAC/D,QAAA,QAAQ,OAAO,IAAA;AAAM,UACnB,KAAK,SAAA,EAAW;AACd,YAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,MAAM,CAAA;AAChD,YAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AACtB,YAAA,OAAA,EAAA;AACA,YAAA;AAAA,UACF;AAAA,UACA,KAAK,UAAA,EAAY;AACf,YAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AAC3C,YAAA,IAAI,OAAO,QAAA,EAAU;AACnB,cAAA,SAAA,CAAU,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,YAChC,CAAA,MAAA,IAAW,OAAO,IAAA,EAAM;AACtB,cAAA,YAAA,CAAa,IAAA,CAAK,OAAO,IAAI,CAAA;AAC7B,cAAA,OAAA,EAAA;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAAA,UACA,KAAK,SAAA,EAAW;AACd,YAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,MAAM,CAAA;AAChD,YAAA,IAAI,IAAA,EAAM;AACR,cAAA,OAAA,EAAA;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAAA;AACF,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,OAAO,MAAM,CAAA;AACvD,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,MAAA,EAAQ,YAAA,IAAgB,MAAA,CAAO,MAAA;AAAA,UACrC,SAAA,EACE,OAAO,IAAA,KAAS,SAAA,GAAY,WAAW,MAAA,CAAO,IAAA,KAAS,YAAY,QAAA,GAAW,QAAA;AAAA,UAChF,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,MACf;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,OAAA,CAAQ,IAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA;AAEvC,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,OAAO,MAAM,CAAA;AACnD,MAAA,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,oBAAA,EAAuB,YAAA,CAAa,MAAM,CAAA,0CAAA,CAAc,CAAA;AACzE,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,GAAI,CAAC,CAAA;AAE5C,MAAA,KAAA,MAAW,UAAU,YAAA,EAAc;AACjC,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM;AAClC,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,EAAE,MAAM,CAAA;AAClD,UAAA,OAAA,CAAQ,MAAA,EAAQ,YAAA,IAAgB,CAAA,CAAE,MAAA,MAAY,MAAA,CAAO,IAAA;AAAA,QACvD,CAAC,CAAA;AACD,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAClB,UAAA;AAAA,QACF;AACA,QAAA,IAAI;AACF,UAAA,QAAQ,OAAO,IAAA;AAAM,YACnB,KAAK,SAAA,EAAW;AACd,cAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,MAAM,CAAA;AAChD,cAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AACtB,cAAA,OAAA,EAAA;AACA,cAAA;AAAA,YACF;AAAA,YACA,KAAK,UAAA,EAAY;AACf,cAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AAC3C,cAAA,IAAI,OAAO,QAAA,EAAU;AACnB,gBAAA,SAAA,CAAU,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,cAChC,CAAA,MAAA,IAAW,OAAO,IAAA,EAAM;AACtB,gBAAA,YAAA,CAAa,IAAA,CAAK,OAAO,IAAI,CAAA;AAC7B,gBAAA,OAAA,EAAA;AAAA,cACF;AACA,cAAA;AAAA,YACF;AAAA,YACA,KAAK,SAAA,EAAW;AACd,cAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,MAAM,CAAA;AAChD,cAAA,IAAI,IAAA,EAAM,OAAA,EAAA;AACV,cAAA;AAAA,YACF;AAAA;AAEF,UAAA,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,gDAAA,EAA0B,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,QAC1D,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,WAAW,MAAA,CAAO,SAAA;AAAA,YAClB,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,WAC7D,CAAA;AACD,UAAA,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,gDAAA,EAA0B,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAK,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,MAAA,IAAU,KAAK,CAAA,EAAG;AACnD,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,cAAA,CAAe,OAAA,EAAQ;AACnD,QAAA,OAAA,IAAW,QAAA,CAAS,OAAA;AACpB,QAAA,OAAA,IAAW,QAAA,CAAS,OAAA;AACpB,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,QAAA,CAAS,MAAM,CAAA;AAC9B,QAAA,IAAI,QAAA,CAAS,OAAA,GAAU,QAAA,CAAS,OAAA,GAAU,CAAA,EAAG;AAC3C,UAAA,MAAM,UAAU,IAAA,CAAK,OAAA,CAClB,WAAA,CAAY,QAAQ,EACpB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,QAAQ,CAAA,CACrC,IAAI,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAC5B,UAAA,YAAA,CAAa,IAAA,CAAK,GAAG,OAAA,CAAQ,KAAA,CAAM,CAAC,QAAA,CAAS,OAAA,GAAU,QAAA,CAAS,OAAO,CAAC,CAAA;AAAA,QAC1E;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,EAAU,CAAE,IAAA,CAAK,6CAAA,EAAgC,KAAK,CAAA;AAAA,MACxD;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,sBAAA,EAAuB;AACxD,QAAA,MAAM,gBAAgB,IAAI,GAAA;AAAA,UAAA,CACvB,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,SAAA,IAAa,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAC;AAAA,SAChF;AACA,QAAA,MAAM,MAAA,GAAS,aAAA,CAAc,MAAA,CAAO,CAAC,OAAO,CAAC,aAAA,CAAc,GAAA,CAAI,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAC,CAAC,CAAA;AACzF,QAAA,KAAA,MAAW,EAAE,IAAA,EAAM,YAAA,EAAa,IAAK,MAAA,EAAQ;AAC3C,UAAA,IAAI;AACF,YAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,YAAA,CAAa,iBAAiB,IAAI,CAAA;AAC7D,YAAA,MAAM,QAAA,GAAA,CAAY,OAAA,IAAW,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EACzC,OAAA,CAAQ,sBAAA,EAAwB,EAAE,CAAA,CAClC,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACtB,YAAA,MAAM,cAAc,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,YAAY,CAAA,GAAI,IAAA;AAC9E,YAAA,IAAI,YAAA,GAAe,WAAA;AACnB,YAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,cAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA;AAChD,cAAA,KAAA,CAAM,GAAA,EAAI;AACV,cAAA,YAAA,GAAe,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,GAAI,WAAA;AAAA,YACtD;AACA,YAAA,MAAM,UAAA,GAAa,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAC9C,YAAA,MAAM,QAAA,GAAW;AAAA,cACf,UAAA,EAAY,IAAA;AAAA,cACZ,WAAA,EAAa,UAAA;AAAA,cACb,aAAA,EAAe;AAAA,aACjB;AACA,YAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,cAAA,CAAe,aAAa,QAAQ,CAAA;AAChE,YAAA,OAAA,IAAW,QAAA,CAAS,OAAA;AACpB,YAAA,OAAA,IAAW,QAAA,CAAS,OAAA;AACpB,YAAA,MAAA,CAAO,IAAA,CAAK,GAAG,QAAA,CAAS,MAAM,CAAA;AAAA,UAChC,SAAS,KAAA,EAAO;AACd,YAAA,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,4CAAA,EAA2B,IAAI,qCAAY,KAAK,CAAA;AAAA,UACnE;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,EAAU,CAAE,IAAA,CAAK,uEAAA,EAA2C,KAAK,CAAA;AAAA,MACnE;AAAA,IACF;AAEA,IAAA,MAAM,mBAAmB,IAAA,CAAK,OAAA,CAC3B,QAAO,CACP,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAA,EAAc,QAAA,CAAS,KAAK,CAAC,CAAA,CAC7C,IAAI,CAAC,CAAA,KAAM,EAAE,YAAa,CAAA;AAC7B,IAAA,MAAM,IAAA,CAAK,mBAAmB,gBAAgB,CAAA;AAE9C,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,cAAA,EAAA,qBAAoB,IAAA,EAAK,EAAE,aAAa,CAAA;AAC7D,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,cAAA,EAAA,qBAAoB,IAAA,EAAK,EAAE,aAAa,CAAA;AAC7D,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AAE3C,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KACzB;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,OAAA,EAA4C;AACrD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAC1C,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,IAAA,CAAK;AAAA,MACjC,GAAG,OAAA;AAAA,MACH,OAAO,OAAA,EAAS;AAAA,KACjB,CAAA;AAED,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,WAAW,UAAA,CAAW,SAAA;AAAA,MACtB,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KACzB;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,GAAgC;AACpC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,iBAAA,EAAkB;AACnD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,cAAA,CAAe,kBAAA,CAAmB,KAAK,CAAA;AACjE,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,mBAAA,EAAoB;AACrD,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,UAAU,CAAA;AAC3D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,cAAc,CAAA;AAEtD,IAAA,MAAM,SAAA,GAAwB,MAAM,IAAA,CAAK,yBAAA;AAAA,MACvC,eAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,YAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,mBAAmB,eAAA,CAAgB,MAAA;AAAA,MACnC;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAc,yBAAA,CACZ,OAAA,EACA,YAAA,EACA,aAAA,EACqB;AACrB,IAAA,MAAM,YAAwB,EAAC;AAE/B,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,WAAA,GAAc,aAAa,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAA,CAAO,YAAY,CAAA,IAAK;AAAA,QAC9E,MAAM,MAAA,CAAO,YAAA;AAAA,QACb,IAAA,EAAM,UAAA;AAAA,QACN,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,cAAc,MAAA,CAAO;AAAA,OACvB;AAEA,MAAA,MAAM,YAAA,GAAe,cAAc,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,MAAA,CAAO,YAAY,CAAA,IAAK;AAAA,QAClF,MAAA,EAAQ,OAAO,YAAA,IAAgB,EAAA;AAAA,QAC/B,IAAA,EAAM,UAAA;AAAA,QACN,UAAA,EAAY,OAAO,gBAAA,IAAoB,EAAA;AAAA,QACvC,cAAA,EAAgB;AAAA,OAClB;AAEA,MAAA,IAAI,YAAA,GAAe,EAAA;AACnB,MAAA,IAAI;AACF,QAAA,YAAA,GAAe,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,OAAO,YAAY,CAAA;AAAA,MAChE,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,MAAA,IAAI,OAAO,YAAA,EAAc;AACvB,QAAA,IAAI;AACF,UAAA,aAAA,GAAgB,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,YAAY,CAAA;AAAA,QAClE,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,UAAA,EAAY,MAAA;AAAA,QACZ,WAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA,EAAa,MAAA,CAAO,YAAA,EAAc,QAAA,CAAS,OAAO,CAAA,IAAK,IAAA;AAAA,QACvD,YAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEA,IAAY,cAAA,GAA0B;AACpC,IAAA,OAAO,IAAA,CAAK,OAAO,MAAA,CAAO,UAAA,KAAe,cAAc,CAAC,CAAC,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,UAAA;AAAA,EAC9E;AAAA,EAEA,MAAc,sBAAA,GAAiF;AAC7F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,UAAA;AAClC,IAAA,MAAM,SAAwD,EAAC;AAC/D,IAAA,IAAI,YAAA,GAAyB,CAAC,MAAM,CAAA;AAEpC,IAAA,OAAO,YAAA,CAAa,SAAS,CAAA,EAAG;AAC9B,MAAA,MAAM,YAAsB,EAAC;AAC7B,MAAA,KAAA,MAAW,YAAY,YAAA,EAAc;AACnC,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,YAAA,CAAa,oBAAoB,QAAQ,CAAA;AAClE,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,YAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,UAAU,CAAA;AAAA,UAC9C;AACA,UAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,YAAA,CAAa,cAAc,QAAQ,CAAA;AACjE,UAAA,SAAA,CAAU,IAAA,CAAK,GAAG,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,QAC/C,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACA,MAAA,YAAA,GAAe,SAAA;AAAA,IACjB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAc,mBAAmB,KAAA,EAAgC;AAC/D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO;AACvC,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,IAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,MAAA,IAAI,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE,YAAA,EAAc;AACpC,QAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,YAAA,CAAa,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,EAAA;AACtE,QAAA,MAAM,OAAA,GAAU,CAAA,CAAE,YAAA,CAAa,OAAA,CAAQ,MAAM,EAAE,CAAA;AAC/C,QAAA,SAAA,CAAU,GAAA,CAAI,SAAS,KAAK,CAAA;AAC5B,QAAA,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,YAAA,EAAc,KAAK,CAAA;AAAA,MACrC;AAAA,IACF;AACA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AAE1B,IAAA,KAAA,MAAW,YAAY,KAAA,EAAO;AAC5B,MAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,EAAG;AAC/B,MAAA,IAAI;AACF,QAAA,IAAI,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,QAAQ,CAAA;AAClD,QAAA,IAAI,OAAA,GAAU,KAAA;AAEd,QAAA,MAAM,WAAW,OAAA,CAAQ,OAAA,CAAQ,8BAAA,EAAgC,CAAC,QAAQ,EAAA,KAAe;AACvF,UAAA,MAAM,QAAQ,SAAA,CAAU,GAAA,CAAI,GAAG,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAC,CAAA;AAChD,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,OAAA,GAAU,IAAA;AACV,YAAA,OAAO,KAAK,KAAK,CAAA,EAAA,CAAA;AAAA,UACnB;AACA,UAAA,OAAO,MAAA;AAAA,QACT,CAAC,CAAA;AACD,QAAA,OAAA,GAAU,QAAA;AAEV,QAAA,MAAM,YAAY,OAAA,CAAQ,OAAA;AAAA,UACxB,4CAAA;AAAA,UACA,CAAC,MAAA,EAAQ,IAAA,EAAc,EAAA,KAAe;AACpC,YAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AAC9B,YAAA,IAAI,KAAA,EAAO;AACT,cAAA,OAAA,GAAU,IAAA;AACV,cAAA,OAAO,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,CAAA;AAAA,YAC3B;AACA,YAAA,OAAO,MAAA;AAAA,UACT;AAAA,SACF;AACA,QAAA,OAAA,GAAU,SAAA;AAEV,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,QAAA,EAAU,OAAO,CAAA;AAAA,QAChD;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,cAAA,GAAgC;AAC5C,IAAA,IAAI,IAAA,CAAK,cAAA,IAAkB,CAAC,IAAA,CAAK,cAAA,EAAgB;AACjD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,kBAAkB,IAAA,CAAK,MAAA,CAAO,OAAO,UAAW,CAAA;AACvF,IAAA,IAAA,CAAK,cAAA,CAAe,WAAW,MAAM,CAAA;AACrC,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,EACxB;AAAA,EAEA,MAAc,WAAW,IAAA,EAA6B;AACpD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,IAAI,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,mBAAA,CAAoB,IAAI,CAAA;AAEpD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA;AACrD,IAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,MAAA,SAAA,EAAU,CAAE,IAAA;AAAA,QACV,mBAAmB,IAAI,CAAA,wGAAA;AAAA,OACzB;AAAA,IACF;AAEA,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,OAAA,EAAS;AAAA,MAC9D,SAAA,EAAW,MAAA;AAAA,MACX,IAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO;AAAA,KAChC,CAAA;AAED,IAAA,IAAI,iBAAA,GAAoB,QAAA;AACxB,IAAA,IAAI,mBAAA,GAA2C,MAAA;AAC/C,IAAA,IAAI,sBAAsB,gBAAA,CAAiB,UAAA;AAE3C,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,MAAA,iBAAA,GAAoB,IAAA,CAAK,OAAO,MAAA,CAAO,UAAA;AACvC,MAAA,mBAAA,GAAsB,UAAA;AACtB,MAAA,mBAAA,GAAsB,KAAK,cAAA,CAAe,kBAAA;AAAA,QACxC,gBAAA,CAAiB,UAAA;AAAA,QACjB;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,cAAA;AAAA,MACtB,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,KAAA;AAAA,MACA,gBAAA,CAAiB,OAAA;AAAA,MACjB;AAAA,KACF;AAEA,IAAA,MAAM,KAAK,YAAA,CAAa,qBAAA,CAAsB,IAAA,CAAK,EAAA,EAAI,iBAAiB,MAAM,CAAA;AAE9E,IAAA,MAAM,IAAA,GAAO,YAAY,OAAO,CAAA;AAEhC,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,MAAM;AAC7B,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO;AAAA,QAClB,YAAA,EAAc,IAAA;AAAA,QACd,cAAc,IAAA,CAAK,EAAA;AAAA,QACnB,cAAA,EAAgB,QAAA;AAAA,QAChB,WAAA,EAAa,IAAA;AAAA,QACb,kBAAkB,IAAA,CAAK,gBAAA;AAAA,QACvB,iBAAA,EAAA,iBAAmB,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAC1C,aAAA,EAAe,MAAA;AAAA,QACf,QAAA,EAAU,IAAA,CAAK,YAAA,CAAa,IAAI,IAAI,aAAA,GAAgB,MAAA;AAAA,QACpD,MAAA,EAAQ,QAAA;AAAA,QACR,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,OAAO;AAAA,OAC3C,CAAA;AAED,MAAA,MAAM,OAAA,GAAUK,eAAAA,CAAe,gBAAA,CAAiB,UAAU,CAAA;AAC1D,MAAA,IAAA,CAAK,QAAQ,cAAA,CAAe;AAAA,QAC1B,YAAA,EAAc,IAAA;AAAA,QACd,cAAc,IAAA,CAAK,EAAA;AAAA,QACnB,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,IAAA,CAAK,OAAA,CAAQ,oBAAA,CAAqB,IAAA,EAAM,gBAAA,CAAiB,eAAe,CAAA;AAAA,IAC1E,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,WAAW,IAAA,EAA6B;AACpD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,IAAI,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAC,QAAQ,YAAA,EAAc;AAE3B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA;AACnD,IAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,MAAA,SAAA,EAAU,CAAE,IAAA;AAAA,QACV,mBAAmB,IAAI,CAAA,wGAAA;AAAA,OACzB;AAAA,IACF;AAEA,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,OAAA,EAAS;AAAA,MAC9D,SAAA,EAAW,MAAA;AAAA,MACX,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO;AAAA,KAChC,CAAA;AAED,IAAA,MAAM,KAAK,cAAA,CAAe,MAAA,CAAO,cAAc,gBAAA,CAAiB,OAAA,EAAS,OAAO,YAAY,CAAA;AAE5F,IAAA,MAAM,KAAK,YAAA,CAAa,qBAAA,CAAsB,MAAA,CAAO,YAAA,EAAc,iBAAiB,MAAM,CAAA;AAE1F,IAAA,IAAI,gBAAgB,gBAAA,CAAiB,UAAA;AACrC,IAAA,IAAI,IAAA,CAAK,kBAAkB,aAAA,IAAiB,MAAA,CAAO,KAAK,aAAa,CAAA,CAAE,SAAS,CAAA,EAAG;AACjF,MAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,MAAA,MAAMC,MAAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,MAAA,aAAA,GAAgB,IAAA,CAAK,cAAA,CAAe,kBAAA,CAAmB,aAAA,EAAeA,MAAK,CAAA;AAAA,IAC7E;AAEA,IAAA,IAAI,iBAAiB,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1D,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,oBAAA,CAAqB,MAAA,CAAO,cAAc,aAAa,CAAA;AAAA,IACjF;AAEA,IAAA,MAAM,cAAc,MAAM,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,OAAO,YAAY,CAAA;AAEvE,IAAA,MAAM,IAAA,GAAO,YAAY,OAAO,CAAA;AAChC,IAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,IAAA,MAAM,OAAA,GAAUD,eAAAA,CAAe,gBAAA,CAAiB,UAAU,CAAA;AAC1D,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,MAAM;AAC7B,MAAA,IAAA,CAAK,OAAA,CAAQ,WAAW,MAAA,CAAO,EAAA,EAAI,MAAM,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,OAAO,CAAC,CAAA;AACtE,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,MAAA,CAAO,EAAA,EAAI,QAAQ,CAAA;AAC7C,MAAA,IAAA,CAAK,OAAA,CAAQ,mBAAA,CAAoB,MAAA,CAAO,EAAA,EAAI,YAAY,gBAAgB,CAAA;AACxE,MAAA,IAAA,CAAK,OAAA,CAAQ,oBAAA,CAAqB,IAAA,EAAM,gBAAA,CAAiB,eAAe,CAAA;AACxE,MAAA,IAAA,CAAK,QAAQ,cAAA,CAAe;AAAA,QAC1B,YAAA,EAAc,IAAA;AAAA,QACd,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,WAAW,IAAA,EAA6B;AACpD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAC,QAAQ,YAAA,EAAc;AAE3B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY;AAC/B,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,WAAA,CAAY,MAAA,CAAO,YAAY,CAAA;AACvD,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,MAAA,CAAO,EAAA,EAAI,SAAS,CAAA;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,IAAA,EAA6B;AAClD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAC,QAAQ,YAAA,EAAc;AAE3B,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,mBAAA,CAAoB,IAAI,CAAA;AACvD,IAAA,MAAM,kBAAkB,MAAA,CAAO,cAAA;AAE/B,IAAA,IAAI,eAAA,IAAmB,CAAC,cAAA,CAAe,WAAA,EAAa,eAAe,CAAA,EAAG;AACpE,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,GAAiB,UAAA,GAAa,MAAA;AACtD,QAAA,MAAM,KAAK,YAAA,CAAa,QAAA,CAAS,MAAA,CAAO,YAAA,EAAc,aAAa,UAAU,CAAA;AAC7E,QAAA,IAAA,CAAK,OAAA,CAAQ,iBAAA,CAAkB,MAAA,CAAO,EAAA,EAAI,WAAW,CAAA;AAAA,MACvD,CAAA,CAAA,MAAQ;AACN,QAAA,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,6CAAA,EAAiC,IAAI,CAAA,+DAAA,CAAe,CAAA;AAAA,MACvE;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAc,mBAAA,GAA+C;AAC3D,IAAA,MAAM,UAA0B,EAAC;AACjC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,cAAc,CAAA;AACpD,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO;AAC1C,IAAA,MAAM,iBAAiB,IAAI,GAAA;AAAA,MACzB,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,YAAa;AAAA,KACxE;AAEA,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,MAAM,WAA4D,EAAC;AACnE,MAAA,IAAI,MAAA;AACJ,MAAA,GAAG;AACD,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,cAAc,IAAA,CAAK,MAAA,CAAO,OAAO,UAAA,EAAa;AAAA,UACnF,WAAA,EAAa;AAAA,SACd,CAAA;AACD,QAAA,QAAA,CAAS,IAAA;AAAA,UACP,GAAG,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,gBAAA,EAAkB,CAAA,CAAE,kBAAiB,CAAE;AAAA,SACnF;AACA,QAAA,MAAA,GAAS,OAAO,UAAA,IAAc,MAAA;AAAA,MAChC,CAAA,QAAS,MAAA;AACT,MAAA,WAAA,GAAc,QAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,WAAA,GAAc,MAAM,IAAA,CAAK,YAAA,CAAa,uBAAuB,IAAA,CAAK,MAAA,CAAO,OAAO,UAAU,CAAA;AAAA,IAC5F;AAEA,IAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,KAAK,EAAE,CAAA;AAEjD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,IAAA,EAAM,SAAA;AAAA,UACN,YAAY,IAAA,CAAK,gBAAA;AAAA,UACjB,cAAA,EAAgB;AAAA,SACjB,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,IAAA,CAAK,gBAAA,KAAqB,MAAA,CAAO,gBAAA,EAAkB;AAC5D,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,IAAA,EAAM,UAAA;AAAA,UACN,YAAY,IAAA,CAAK,gBAAA;AAAA,UACjB,gBAAgB,MAAA,CAAO;AAAA,SACxB,CAAA;AAAA,MACH;AAEA,MAAA,cAAA,CAAe,MAAA,CAAO,KAAK,EAAE,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,UAAA,IAAc,QAAA,EAAU;AAC3C,MAAA,KAAA,MAAW,YAAY,cAAA,EAAgB;AACrC,QAAA,MAAM,SAAS,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,iBAAiB,QAAQ,CAAA;AACpE,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,MAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAM,SAAA;AAAA,YACN,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YACnC,gBAAgB,MAAA,CAAO;AAAA,WACxB,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,WAAW,MAAA,EAAiC;AACxD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,YAAA,CAAa,QAAQ,MAAM,CAAA;AACnD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,IAAI,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,iBAAiB,KAAK,CAAA;AAEvC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA;AAEpD,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,YAAA,CAAa,qBAAqB,MAAM,CAAA;AACvE,IAAA,MAAM,aAAA,GAAgB,YAAY,IAAA,CAAK,CAAC,MAAM,MAAA,IAAU,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,YAAY,CAAA;AAEpF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AACpD,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA;AAE5C,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,QAAA;AAEJ,IAAA,IAAI,iBAAiB,UAAA,EAAY;AAC/B,MAAA,MAAM,aAAa,UAAA,GAAa,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,QAAA;AAC9D,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,CAAsB,GAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,GAAA,CAAK,CAAA;AAC1E,MAAA,QAAA,GAAW,aAAA;AACX,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,UAAU,CAAA;AAAA,IAC5C,CAAA,MAAA,IAAW,aAAA,IAAiB,CAAC,UAAA,EAAY;AACvC,MAAA,MAAM,aAAa,UAAA,GAAa,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,QAAA;AAC9D,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,CAAsB,GAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,GAAA,CAAK,CAAA;AAC1E,MAAA,QAAA,GAAW,aAAA;AACX,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,UAAU,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,MAAM,QAAA,GAAW,aAAa,CAAA,EAAG,UAAU,IAAI,QAAQ,CAAA,GAAA,CAAA,GAAQ,GAAG,QAAQ,CAAA,GAAA,CAAA;AAC1E,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,CAAsB,QAAQ,CAAA;AACpD,MAAA,QAAA,GAAW,MAAA;AAAA,IACb;AAEA,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,MAAA,UAAA,GAAa,KAAK,cAAA,CAAe,oBAAA;AAAA,QAC9B,IAAA,CAA4D;AAAA,OAC/D;AAAA,IACF,CAAA,MAAO;AACL,MAAA,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,iBAAA,CAAkB,IAAI,CAAA;AAAA,IACvD;AACA,IAAA,UAAA,CAAW,KAAA,GAAQ,KAAA;AAEnB,IAAA,IAAI,iBAAA,GAAoB,QAAA;AACxB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,aAAA,KAAkB,WAAA,EAAa;AACxD,MAAA,MAAM,cAAc,MAAM,IAAA,CAAK,YAAA,CAAa,iBAAA,CAAkB,UAAU,KAAK,CAAA;AAC7E,MAAA,iBAAA,GAAoB,WAAA,CAAY,OAAA;AAAA,IAClC;AAEA,IAAA,MAAM,aAAa,MAAM,IAAA,CAAK,YAAA,CAAa,gBAAA,CAAiB,mBAAmB,KAAK,CAAA;AACpF,IAAA,iBAAA,GAAoB,UAAA,CAAW,OAAA;AAE/B,IAAA,MAAM,YAAA,GAAe,KAAK,QAAA,CAAS,iBAAA;AAAA,MACjC,iBAAA;AAAA,MACA;AAAA,QACE,SAAA,EAAW,MAAA;AAAA,QACX,IAAA,EAAM,cAAA;AAAA,QACN,QAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO;AAAA,OACjC;AAAA,MACA,EAAE,UAAA;AAAW,KACf;AAEA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,QAAA,EAAU,YAAY,CAAA;AAEnD,IAAA,MAAM,IAAA,GAAO,YAAY,YAAY,CAAA;AACrC,IAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AACxD,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,MAAM;AAC7B,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO;AAAA,QAClB,YAAA,EAAc,QAAA;AAAA,QACd,YAAA,EAAc,MAAA;AAAA,QACd,cAAA,EAAgB,gBAAA;AAAA,QAChB,WAAA,EAAa,IAAA;AAAA,QACb,kBAAkB,IAAA,CAAK,gBAAA;AAAA,QACvB,iBAAA,EAAA,iBAAmB,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAC1C,aAAA,EAAe,MAAA;AAAA,QACf,QAAA;AAAA,QACA,MAAA,EAAQ,QAAA;AAAA,QACR,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,YAAA,EAAc,OAAO;AAAA,OAChD,CAAA;AAED,MAAA,MAAM,OAAA,GAAUA,gBAAe,UAAU,CAAA;AACzC,MAAA,IAAA,CAAK,QAAQ,cAAA,CAAe;AAAA,QAC1B,YAAA,EAAc,QAAA;AAAA,QACd,YAAA,EAAc,MAAA;AAAA,QACd,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAc,WAAW,MAAA,EAAuE;AAC9F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,OAAO,MAAM,CAAA;AACvD,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AAErB,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,OAAO,MAAM,CAAA;AAC1D,IAAA,IAAI,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,CAAkB,OAAO,MAAM,CAAA;AAEzD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,IAAI,CAAA;AAEjD,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,MAAA,UAAA,GAAa,KAAK,cAAA,CAAe,oBAAA;AAAA,QAC9B,IAAA,CAA4D;AAAA,OAC/D;AAAA,IACF,CAAA,MAAO;AACL,MAAA,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,iBAAA,CAAkB,IAAI,CAAA;AAAA,IACvD;AACA,IAAA,UAAA,CAAW,KAAA,GAAQ,KAAA;AAEnB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,aAAA,KAAkB,WAAA,EAAa;AACxD,MAAA,MAAM,cAAc,MAAM,IAAA,CAAK,YAAA,CAAa,iBAAA,CAAkB,UAAU,KAAK,CAAA;AAC7E,MAAA,QAAA,GAAW,WAAA,CAAY,OAAA;AAAA,IACzB;AAEA,IAAA,MAAM,aAAa,MAAM,IAAA,CAAK,YAAA,CAAa,gBAAA,CAAiB,UAAU,KAAK,CAAA;AAC3E,IAAA,QAAA,GAAW,UAAA,CAAW,OAAA;AAEtB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,OAAO,YAAY,CAAA;AACxE,IAAA,MAAM,aAAA,GAAgB,KAAK,QAAA,CAAS,iBAAA;AAAA,MAClC,QAAA;AAAA,MACA;AAAA,QACE,SAAA,EAAW,MAAA;AAAA,QACX,IAAA,EAAM,cAAA;AAAA,QACN,UAAU,MAAA,CAAO,YAAA;AAAA,QACjB,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO;AAAA,OACjC;AAAA,MACA,EAAE,UAAA,EAAY,eAAA,EAAiB,aAAa,MAAA,GAAS,CAAA,GAAI,eAAe,MAAA;AAAU,KACpF;AAEA,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI;AACF,MAAA,YAAA,GAAe,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,OAAO,YAAY,CAAA;AAAA,IAChE,CAAA,CAAA,MAAQ;AACN,MAAA,YAAA,GAAe,EAAA;AAAA,IACjB;AAEA,IAAA,MAAM,SAAA,GAAY,YAAY,YAAY,CAAA;AAC1C,IAAA,MAAM,aAAA,GAAgB,cAAc,MAAA,CAAO,WAAA;AAE3C,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,gBAAA;AAElC,MAAA,IAAI,aAAa,cAAA,EAAgB,CAEjC,MAAA,IAAW,aAAa,aAAA,EAAe;AACrC,QAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,YAAA,EAAa;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,GAAqB;AAAA,UACzB,UAAA,EAAY,MAAA;AAAA,UACZ,WAAA,EAAa;AAAA,YACX,MAAM,MAAA,CAAO,YAAA;AAAA,YACb,IAAA,EAAM,UAAA;AAAA,YACN,WAAA,EAAa,SAAA;AAAA,YACb,cAAc,MAAA,CAAO;AAAA,WACvB;AAAA,UACA,YAAA,EAAc,MAAA;AAAA,UACd,WAAA,EAAa,MAAA,CAAO,YAAA,EAAc,QAAA,CAAS,OAAO,CAAA,IAAK,IAAA;AAAA,UACvD,YAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,MAAA,CAAO,EAAA,EAAI,UAAU,CAAA;AAC/C,QAAA,OAAO,EAAE,QAAA,EAAS;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,MAAA,CAAO,cAAc,aAAa,CAAA;AAE/D,IAAA,MAAM,OAAA,GAAU,YAAY,aAAa,CAAA;AACzC,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO;AAAA,MAClB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,cAAc,MAAA,CAAO,MAAA;AAAA,MACrB,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,WAAA,EAAa,OAAA;AAAA,MACb,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,iBAAA,EAAA,iBAAmB,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAC1C,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,MAAA,EAAQ,QAAA;AAAA,MACR,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,aAAA,EAAe,OAAO;AAAA,KACjD,CAAA;AAED,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,YAAA,EAAa;AAAA,EACrC;AAAA,EAEA,MAAc,WAAW,MAAA,EAAwC;AAC/D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,MAAM,CAAA;AAChD,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY;AAC/B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,MAAA,CAAO,YAAY,CAAA;AAAA,MACnD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAC7B,IAAA,OAAO,MAAA,CAAO,YAAA;AAAA,EAChB;AAAA,EAEA,MAAc,iBAAiB,UAAA,EAAmC;AAChE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,UAAU,CAAA;AAClD,IAAA,IAAI,UAAU,YAAA,EAAc;AAE5B,IAAA,MAAM,cAAA,GAAiB,GAAG,UAAU,CAAA,CAAA,EAAI,WAAW,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAK,CAAA,GAAA,CAAA;AACnE,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,cAAc,CAAA;AAC9D,IAAA,IAAI,kBAAkB,cAAA,EAAgB;AACpC,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO;AAAA,QAClB,YAAA,EAAc,UAAA;AAAA,QACd,cAAc,gBAAA,CAAiB,cAAA;AAAA,QAC/B,cAAA,EAAgB,EAAA;AAAA,QAChB,WAAA,EAAa,EAAA;AAAA,QACb,kBAAkB,gBAAA,CAAiB,gBAAA;AAAA,QACnC,iBAAA,EAAA,iBAAmB,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAC1C,aAAA,EAAe,MAAA;AAAA,QACf,QAAA,EAAU,aAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA;AAClC,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAEzC,IAAA,IAAI,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,UAAA;AAClC,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,MAAM,aAAa,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAC9C,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,UAAU,CAAA;AACtD,MAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,QAAA,QAAA,GAAW,YAAA,CAAa,YAAA;AAAA,MAC1B;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW;AAAA,MACpD,QAAA;AAAA,MACA,UAAA,EAAY,MAAA;AAAA,MACZ,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO;AAAA,MAClB,YAAA,EAAc,UAAA;AAAA,MACd,cAAc,UAAA,CAAW,EAAA;AAAA,MACzB,cAAA,EAAgB,QAAA;AAAA,MAChB,WAAA,EAAa,EAAA;AAAA,MACb,kBAAkB,UAAA,CAAW,gBAAA;AAAA,MAC7B,iBAAA,EAAA,iBAAmB,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAC1C,aAAA,EAAe,MAAA;AAAA,MACf,QAAA,EAAU,aAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,oBAAoB,QAAA,EAAmC;AACnE,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AAChC,IAAA,IAAI,MAAM,MAAA,IAAU,CAAA,EAAG,OAAO,IAAA,CAAK,OAAO,MAAA,CAAO,UAAA;AAEjD,IAAA,MAAM,aAAa,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAC9C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,UAAU,CAAA;AACtD,IAAA,IAAI,YAAA,EAAc,YAAA,EAAc,OAAO,YAAA,CAAa,YAAA;AAEpD,IAAA,OAAO,IAAA,CAAK,OAAO,MAAA,CAAO,UAAA;AAAA,EAC5B;AAAA,EAEQ,aAAa,QAAA,EAA2B;AAC9C,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AAChC,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAC7B,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAG,OAAA,CAAQ,SAAS,EAAE,CAAA;AAC7D,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACzC,IAAA,OAAO,QAAA,KAAa,UAAA;AAAA,EACtB;AAAA,EAEA,MAAc,kBAAkB,IAAA,EAA2C;AACzE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAChD,IAAA,IAAI,CAAC,YAAY,cAAA,CAAe,QAAA,EAAU,KAAK,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,EAAG,OAAO,EAAA;AAEjF,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,QAAQ,CAAA;AACxD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAI,YAAA,CAAa,QAAA,KAAa,aAAA,IAAiB,YAAA,CAAa,aAAa,aAAA,EAAe;AACtF,QAAA,MAAME,UAAAA,GAAY,YAAA,CAAa,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA;AACrD,QAAAA,WAAU,GAAA,EAAI;AACd,QAAA,OAAOA,UAAAA,CAAU,KAAK,GAAG,CAAA;AAAA,MAC3B;AACA,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA;AACrD,MAAA,SAAA,CAAU,GAAA,EAAI;AACd,MAAA,MAAM,SAAA,GAAY,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA;AACpC,MAAA,OACE,SAAA,IACA,gBAAA,CAAiB,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,MAAM,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,QAAQ,CAAC,CAAC,CAAA;AAAA,IAE9F;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,YAAA,CAAa,QAAQ,QAAQ,CAAA;AAC3D,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,UAAU,CAAA;AAC7D,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,iBAAA,CAAkB,UAAU,CAAA;AAC/D,MAAA,MAAM,QAAA,GAAW,iBAAiB,WAAW,CAAA;AAC7C,MAAA,OAAO,eAAA,GAAkB,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,QAAA;AAAA,IAC9D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,cAAA,CACZ,QAAA,EACA,UAAA,EACA,KAAA,EACA,iBACA,UAAA,EAC6B;AAC7B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,iBAAA,KAAsB,KAAA,EAAO;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,yBAAyB,eAAe,CAAA;AACzD,QAAA,OAAO,MAAM,IAAA,CAAK,YAAA,CAAa,sBAAA,CAAuB;AAAA,UACpD,QAAA;AAAA,UACA,UAAA;AAAA,UACA,KAAA;AAAA,UACA,QAAA,EAAU,QAAA;AAAA,UACV;AAAA,SACD,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,sBAAA,CAAuB,eAAe,CAAA;AACzE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW;AAAA,MAC9C,QAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,cAAA,CAAe,IAAA,CAAK,IAAI,MAAM,CAAA;AAAA,IACxD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,cAAA,CACZ,MAAA,EACA,eAAA,EACA,YAAA,EACe;AACf,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,iBAAA,KAAsB,KAAA,EAAO;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,yBAAyB,eAAe,CAAA;AAEzD,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,YAAA,GAAe,wBAAA,CAAyB,YAAA,CAAa,QAAA,CAAS,OAAO,CAAC,CAAA;AAC5E,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,YAAA,EAAc,QAAQ,CAAA;AAC1D,UAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,OAAA,CAAQ,UAAU,EAAA,EAAI;AAC9C,YAAA,IAAI;AACF,cAAA,MAAM,IAAA,CAAK,YAAA,CAAa,yBAAA,CAA0B,MAAA,EAAQ,OAAO,CAAA;AACjE,cAAA;AAAA,YACF,CAAA,CAAA,MAAQ;AACN,cAAA,MAAM,IAAA,CAAK,YAAA,CAAa,mBAAA,CAAoB,MAAA,EAAQ,QAAQ,CAAA;AAC5D,cAAA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,IAAA,CAAK,YAAA,CAAa,mBAAA,CAAoB,MAAA,EAAQ,QAAQ,CAAA;AAC5D,QAAA;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,sBAAA,CAAuB,eAAe,CAAA;AACzE,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,YAAA,CAAa,iBAAiB,MAAM,CAAA;AAEtE,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AAAA,IACvD;AACA,IAAA,MAAM,aAAa,IAAIP,IAAAA,CAAK,IAAA,CAAK,MAAA,CAAO,SAAS,WAAW,CAAA;AAC5D,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,cAAA,CAAe,GAAA,CAAI,OAAO,KAAA,KAAU;AAClC,QAAA,MAAM,WAAW,OAAA,EAAQ;AACzB,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,CAAK,YAAA,CAAa,WAAA,CAAY,KAAA,CAAM,EAAE,CAAA;AAAA,QAC9C,CAAA,SAAE;AACA,UAAA,UAAA,CAAW,OAAA,EAAQ;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,KACH;AAAA,EACF;AAAA,EAEQ,cAAA,CACN,YACA,UAAA,EAC2C;AAC3C,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AACtC,IAAA,MAAM,UAAqD,EAAC;AAE5D,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,OAAO,CAAA,GAAI,QAAA,CAAS,MAAA,IAAU,CAAA,GAAI,SAAS,MAAA,EAAQ;AACjD,MAAA,IAAI,QAAA,CAAS,CAAC,CAAA,KAAM,QAAA,CAAS,CAAC,CAAA,EAAG;AAC/B,QAAA,CAAA,EAAA;AACA,QAAA,CAAA,EAAA;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,SAAS,CAAA,GAAI,CAAA;AACjB,MAAA,IAAI,SAAS,CAAA,GAAI,CAAA;AACjB,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,EAAA,EAAI,SAAS,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AACvE,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,SAAA,EAAW,CAAA,EAAA,EAAK;AACnC,QAAA,IAAI,CAAA,GAAI,CAAA,GAAI,QAAA,CAAS,MAAA,IAAU,QAAA,CAAS,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA,EAAG;AAC9D,UAAA,MAAA,GAAS,CAAA,GAAI,CAAA;AACb,UAAA,MAAA,GAAS,CAAA;AACT,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAA,GAAI,CAAA,GAAI,QAAA,CAAS,MAAA,IAAU,QAAA,CAAS,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA,EAAG;AAC9D,UAAA,MAAA,GAAS,CAAA;AACT,UAAA,MAAA,GAAS,CAAA,GAAI,CAAA;AACb,UAAA;AAAA,QACF;AACA,QAAA,MAAA,GAAS,CAAA,GAAI,CAAA;AACb,QAAA,MAAA,GAAS,CAAA,GAAI,CAAA;AAAA,MACf;AAEA,MAAA,MAAM,WAAW,QAAA,CAAS,KAAA,CAAM,GAAG,MAAM,CAAA,CAAE,KAAK,IAAI,CAAA;AACpD,MAAA,MAAM,WAAW,QAAA,CAAS,KAAA,CAAM,GAAG,MAAM,CAAA,CAAE,KAAK,IAAI,CAAA;AACpD,MAAA,IAAI,YAAY,QAAA,EAAU;AACxB,QAAA,OAAA,CAAQ,KAAK,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAA;AAAA,MACrD;AACA,MAAA,CAAA,GAAI,MAAA;AACJ,MAAA,CAAA,GAAI,MAAA;AAAA,IACN;AAEA,IAAA,IAAI,CAAA,GAAI,QAAA,CAAS,MAAA,IAAU,CAAA,GAAI,SAAS,MAAA,EAAQ;AAC9C,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,QAAQ,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,QACnC,QAAQ,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,IAAI;AAAA,OACpC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,kBAAkB,MAAA,EAAiC;AAC/D,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,iBAAA,KAAsB,KAAA,EAAO;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,gBAAgB,MAAM,CAAA;AAC7D,QAAA,OAAO,wBAAA,CAAyB,OAAO,QAAQ,CAAA;AAAA,MACjD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,sBAAA,CAAuB,MAAM,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAc,gBAAgB,IAAA,EAAkD;AAC9E,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAMpB,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,SAAA,EAAW,OAAO,OAAO,OAAA,IAAW,IAAA;AACxD,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,aAAA,EAAe,OAAO,OAAO,WAAA,IAAe,IAAA;AAChE,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,UAAA,IAAc,MAAA,CAAO,QAAA,EAAU;AACjD,MAAA,OAAO,IAAA,CAAK,oBAAA,CAAqB,MAAA,CAAO,QAAQ,CAAA;AAAA,IAClD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,qBAAqB,OAAA,EAAyC;AAC1E,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,YAAA,CAAa,SAAS,OAAO,CAAA;AACtD,QAAA,MAAM,KACJ,KAAA,CACA,MAAA;AACF,QAAA,IAAI,EAAA,CAAG,IAAA,KAAS,SAAA,EAAW,OAAO,GAAG,OAAA,IAAW,IAAA;AAChD,QAAA,IAAI,EAAA,CAAG,IAAA,KAAS,UAAA,IAAc,EAAA,CAAG,QAAA,EAAU;AACzC,UAAA,OAAA,GAAU,EAAA,CAAG,QAAA;AACb,UAAA;AAAA,QACF;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,sBAAA,GAA+B;AACrC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,kBAAkB,CAAA;AAC9D,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,kBAAkB,CAAA;AAE9D,IAAA,IAAI,mBAAmB,MAAA,EAAQ;AAC7B,MAAA,SAAA,EAAU,CAAE,KAAK,qHAA0C,CAAA;AAC3D,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AAAA,IAC7C;AACA,IAAA,IAAI,mBAAmB,MAAA,EAAQ;AAC7B,MAAA,SAAA,EAAU,CAAE,KAAK,qHAA0C,CAAA;AAC3D,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAc,sBAAsB,QAAA,EAAmC;AACrE,IAAA,IAAI,CAAE,MAAM,IAAA,CAAK,QAAQ,MAAA,CAAO,QAAQ,GAAI,OAAO,QAAA;AAEnD,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA,IAAK,CAAA,GAAI,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,QAAA,CAAS,WAAA,CAAY,GAAG,CAAC,CAAA,GAAI,EAAA;AAC5F,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,GAAA,GAAM,GAAA,CAAI,SAAS,CAAA,GAAI,CAAA,EAAG,CAAC,GAAA,CAAI,MAAM,CAAA;AAEjE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,EAAA,EAAI,CAAA,EAAA,EAAK;AAC5B,MAAA,MAAM,YAAY,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,GAAG,KAAK,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,CAAC,IAAI,GAAG,CAAA,CAAA;AAC5E,MAAA,IAAI,CAAE,MAAM,IAAA,CAAK,QAAQ,MAAA,CAAO,SAAS,GAAI,OAAO,SAAA;AAAA,IACtD;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAEA,SAAS,aAAa,QAAA,EAA0B;AAC9C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AAChC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA;AAC5C,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AACrC;AAEA,SAASK,gBAAe,UAAA,EAA+C;AACrE,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,OAAA,IAAW,UAAA,CAAW,KAAA;AAC7C,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAO,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAQ,CAAA;AACnF,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA;AACjB,IAAA,OAAO,GAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,OAAO,CAAA;AACnB,EAAA,OAAO,EAAC;AACV;ACr4CO,IAAM,cAAN,MAAqC;AAAA,EAI1C,WAAA,CACmB,UACjB,UAAA,EACA;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAGjB,IAAA,IAAA,CAAK,eAAA,GAAkB,UAAA,EAAY,OAAA,IAAW,EAAC;AAC/C,IAAA,MAAM,aAAA,GAAgB,UAAA,EAAY,OAAA,IAAW,EAAC;AAC9C,IAAA,MAAM,cAAA,GAAiB,KAAK,qBAAA,EAAsB;AAClD,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAC,GAAG,aAAA,EAAe,GAAG,cAAc,CAAA;AAAA,EAC7D;AAAA,EAPmB,QAAA;AAAA,EAJF,eAAA;AAAA,EACA,eAAA;AAAA,EAYT,qBAAA,GAAkC;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAaG,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,sBAAsB,CAAA;AAC7D,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,UAAA,EAAY,OAAO,CAAA;AAChD,MAAA,OAAO,QACJ,KAAA,CAAM,IAAI,EACV,GAAA,CAAI,CAAC,SAAiB,IAAA,CAAK,IAAA,EAAM,CAAA,CACjC,MAAA,CAAO,CAAC,IAAA,KAAiB,IAAA,IAAQ,CAAC,IAAA,CAAK,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,IAC3D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,IAAA,EAA+B;AAC5C,IAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AACzC,IAAA,OAAOC,QAAAA,CAAS,UAAU,OAAO,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,WAAW,IAAA,EAA+B;AAC9C,IAAA,MAAM,QAAA,GAAWD,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AACzC,IAAA,OAAOC,SAAS,QAAQ,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,SAAA,CAAU,IAAA,EAAc,OAAA,EAAgC;AAC5D,IAAA,MAAM,QAAA,GAAWD,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AACzC,IAAA,MAAME,MAAM,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAClD,IAAA,MAAMC,SAAAA,CAAU,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,WAAA,CAAY,IAAA,EAAc,IAAA,EAA6B;AAC3D,IAAA,MAAM,QAAA,GAAWH,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AACzC,IAAA,MAAME,MAAM,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAClD,IAAA,MAAMC,SAAAA,CAAU,UAAU,IAAI,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,WAAW,IAAA,EAA6B;AAC5C,IAAA,MAAM,QAAA,GAAWH,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AACzC,IAAA,MAAM,OAAO,QAAQ,CAAA;AAAA,EACvB;AAAA,EAEA,MAAM,QAAA,CAAS,IAAA,EAAc,EAAA,EAA2B;AACtD,IAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AACzC,IAAA,MAAM,MAAA,GAASA,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,EAAE,CAAA;AACrC,IAAA,MAAME,MAAM,OAAA,CAAQ,MAAM,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,IAAA,MAAM,MAAA,CAAO,UAAU,MAAM,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,OAAO,IAAA,EAAgC;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAKF,IAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAC,CAAA;AACpC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,IAAA,EAA6B;AAC9C,IAAA,MAAME,KAAAA,CAAMF,KAAK,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,iBAAA,GAAyC;AAC7C,IAAA,MAAM,QAAoB,EAAC;AAC3B,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,KAAK,CAAA;AACvC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,oBAAA,GAAiD;AACrD,IAAA,MAAM,QAAyB,EAAC;AAChC,IAAA,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,KAAK,CAAA;AAC5C,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,cAAA,CAAe,cAAsB,OAAA,EAA0B;AACrE,IAAA,IAAI,OAAA,KAAY,MAAA,IAAU,OAAA,KAAY,IAAA,EAAM,OAAO,IAAA;AAEnD,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC/B,MAAA,OAAO,YAAA,CAAa,UAAA,CAAW,GAAA,GAAM,GAAG,KAAK,YAAA,KAAiB,GAAA;AAAA,IAChE,CAAA,MAAA,IAAW,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AACnC,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA;AAC3B,MAAA,OAAO,YAAA,CAAa,SAAS,GAAG,CAAA;AAAA,IAClC,CAAA,MAAA,IAAW,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAChC,MAAA,MAAM,WAAW,OAAA,CACd,OAAA,CAAQ,KAAA,EAAO,KAAK,EACpB,OAAA,CAAQ,OAAA,EAAS,cAAc,CAAA,CAC/B,QAAQ,KAAA,EAAO,OAAO,CAAA,CACtB,OAAA,CAAQ,qBAAqB,IAAI,CAAA;AACpC,MAAA,OAAO,IAAI,MAAA,CAAO,GAAA,GAAM,WAAW,GAAG,CAAA,CAAE,KAAK,YAAY,CAAA;AAAA,IAC3D,CAAA,MAAO;AACL,MAAA,OAAO,YAAA,KAAiB,OAAA,IAAW,YAAA,CAAa,UAAA,CAAW,UAAU,GAAG,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA,EAEQ,WAAW,YAAA,EAA+B;AAChD,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AACnC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,CAAC,MAAM,IAAA,CAAK,cAAA,CAAe,YAAA,EAAc,CAAC,CAAC,CAAA;AACtF,MAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAAA,IACxB;AAEA,IAAA,OAAO,IAAA,CAAK,gBAAgB,IAAA,CAAK,CAAC,MAAM,IAAA,CAAK,cAAA,CAAe,YAAA,EAAc,CAAC,CAAC,CAAA;AAAA,EAC9E;AAAA,EAEA,MAAc,YAAA,CAAa,GAAA,EAAa,MAAA,EAAwC;AAC9E,IAAA,MAAM,UAAU,MAAM,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAE1D,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AAErC,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAEhC,MAAA,MAAM,YAAA,GAAe,QAAA,CAAS,IAAA,CAAK,QAAA,EAAU,QAAQ,CAAA;AAErD,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA,EAAG;AAEnC,MAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,QAAA,MAAM,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAAA,MAC1C,CAAA,MAAA,IAAW,MAAM,MAAA,EAAO,IAAK,CAAC,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AACxD,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAQ,CAAA;AACpC,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,YAAA;AAAA,UACN,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,KAAA,EAAO,QAAA,CAAS,KAAA,CAAM,WAAA;AAAY,SACnC,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,OAAA,CAAQ,GAAA,EAAa,MAAA,EAAmC;AACpE,IAAA,MAAM,UAAU,MAAM,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAE1D,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AAErC,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAEhC,MAAA,MAAM,YAAA,GAAe,QAAA,CAAS,IAAA,CAAK,QAAA,EAAU,QAAQ,CAAA;AAErD,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA,EAAG;AAEnC,MAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,MAAM,CAAA;AAAA,MACrC,CAAA,MAAA,IAAW,MAAM,MAAA,EAAO,IAAK,MAAM,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AACvD,QAAA,MAAM,OAAA,GAAU,MAAMC,QAAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAChD,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAQ,CAAA;AAEpC,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,YAAA;AAAA,UACN,OAAA;AAAA,UACA,KAAA,EAAO,QAAA,CAAS,KAAA,CAAM,WAAA;AAAY,SACnC,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;AChLA,IAAM,eAAA,GAAkB,wCAAA;AACxB,IAAM,aAAA,GAAgB,yBAAA;AAEf,IAAM,iBAAN,MAA0C;AAAA,EACtC,IAAA,GAAO,gBAAA;AAAA,EACP,KAAA,GAAQ,EAAA;AAAA,EAEjB,QAAQ,KAAA,EAAwC;AAC9C,IAAA,MAAM,iBAAkC,EAAC;AACzC,IAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AAEtB,IAAA,MAAM,eAAe,CAAC,GAAG,OAAA,CAAQ,QAAA,CAAS,eAAe,CAAC,CAAA;AAC1D,IAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,MAAA,MAAM,WAAW,KAAA,CAAM,KAAA;AACvB,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,KAAA,CAAM,CAAC,CAAE,CAAA;AAEpC,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,GAAI,CAAA;AACrD,MAAA,MAAM,WAAW,aAAA,CAAc,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAC,CAAA;AAE7D,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,eAAe,OAAA,CAAQ,KAAA,CAAM,UAAA,EAAY,UAAA,GAAa,SAAS,KAAM,CAAA;AAC3E,QAAA,cAAA,CAAe,IAAA,CAAK;AAAA,UAClB,EAAA,EAAI,MAAA,CAAO,IAAI,CAAA,IAAK,EAAA;AAAA,UACpB,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA,IAAK,EAAA;AAAA,UAC1B,aAAA,EAAe,aAAa,IAAA,EAAK;AAAA,UACjC,QAAA;AAAA,UACA,QAAQ,UAAA,GAAa,QAAA,CAAS,KAAA,GAAS,QAAA,CAAS,CAAC,CAAA,CAAE;AAAA,SACpD,CAAA;AAAA,MACH;AAEA,MAAA,aAAA,CAAc,SAAA,GAAY,CAAA;AAAA,IAC5B;AAEA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,GAAG,KAAA,CAAM,QAAA;AAAA,QACT;AAAA;AACF,KACF;AAAA,EACF;AACF;AAUA,SAAS,YAAY,WAAA,EAA6C;AAChE,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,IAAA,IAAQ,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA,EAAG;AACzC,IAAA,MAAM,CAAC,GAAA,EAAK,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACnC,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,kBAAA,CAAmB,KAAK,CAAA;AAAA,IACxC;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;;;ACnDO,SAAS,aAAA,CAAc,IAAA,EAAc,KAAA,EAAe,MAAA,EAA6B;AACtF,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACjC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AACnC,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAErC,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,SAAA,EAAW,UAAU,CAAA;AACnD,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,SAAA,EAAW,WAAW,CAAA;AAErD,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,YAAmC,EAAC;AAC1C,EAAA,IAAI,OAAA,GAAU,IAAA;AAEd,EAAA,IAAI,OAAA,GAAU,CAAA;AAEd,EAAA,OAAO,OAAA,GAAU,UAAU,MAAA,IAAU,SAAA,CAAU,SAAS,CAAA,IAAK,UAAA,CAAW,SAAS,CAAA,EAAG;AAClF,IAAA,MAAM,cAAc,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,OAAO,CAAA;AACjE,IAAA,MAAM,eAAe,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,OAAO,CAAA;AAEnE,IAAA,IAAI,eAAe,YAAA,EAAc;AAC/B,MAAA,IAAI,WAAA,CAAY,WAAA,CAAY,QAAA,EAAU,YAAA,CAAa,QAAQ,CAAA,EAAG;AAC5D,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAA,CAAY,QAAQ,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,OAAA,GAAU,KAAA;AACV,QAAA,SAAA,CAAU,IAAA,CAAK;AAAA,UACb,YAAY,WAAA,CAAY,QAAA;AAAA,UACxB,aAAa,YAAA,CAAa;AAAA,SAC3B,CAAA;AACD,QAAA,MAAA,CAAO,KAAK,eAAe,CAAA;AAC3B,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAA,CAAY,QAAQ,CAAA;AACnC,QAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AACrB,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,YAAA,CAAa,QAAQ,CAAA;AACpC,QAAA,MAAA,CAAO,KAAK,gBAAgB,CAAA;AAAA,MAC9B;AAEA,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,OAAA,EAAS,aAAa,OAAO,CAAA;AAC5D,MAAA,SAAA,CAAU,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,WAAW,GAAG,CAAC,CAAA;AAClD,MAAA,UAAA,CAAW,MAAA,CAAO,UAAA,CAAW,OAAA,CAAQ,YAAY,GAAG,CAAC,CAAA;AAAA,IACvD,WAAW,WAAA,EAAa;AACtB,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAA,CAAY,QAAQ,CAAA;AACnC,MAAA,OAAA,GAAU,WAAA,CAAY,OAAA;AACtB,MAAA,SAAA,CAAU,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,WAAW,GAAG,CAAC,CAAA;AAAA,IACpD,WAAW,YAAA,EAAc;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,YAAA,CAAa,QAAQ,CAAA;AACpC,MAAA,OAAA,GAAU,YAAA,CAAa,OAAA;AACvB,MAAA,UAAA,CAAW,MAAA,CAAO,UAAA,CAAW,OAAA,CAAQ,YAAY,GAAG,CAAC,CAAA;AAAA,IACvD,CAAA,MAAO;AACL,MAAA,IAAI,OAAA,GAAU,UAAU,MAAA,EAAQ;AAC9B,QAAA,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAE,CAAA;AAAA,MACjC;AACA,MAAA,OAAA,EAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,IACxB;AAAA,GACF;AACF;AAQA,SAAS,WAAA,CAAY,MAAgB,QAAA,EAAgC;AACnE,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,MAAA,GAAS,CAAA;AAEb,EAAA,OAAO,OAAA,GAAU,IAAA,CAAK,MAAA,IAAU,MAAA,GAAS,SAAS,MAAA,EAAQ;AACxD,IAAA,IAAI,IAAA,CAAK,OAAO,CAAA,KAAM,QAAA,CAAS,MAAM,CAAA,EAAG;AACtC,MAAA,OAAA,EAAA;AACA,MAAA,MAAA,EAAA;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,SAAA,GAAY,OAAA;AAClB,MAAA,MAAM,WAAqB,EAAC;AAE5B,MAAA,OAAO,MAAA,GAAS,SAAS,MAAA,IAAU,IAAA,CAAK,OAAO,CAAA,KAAM,QAAA,CAAS,MAAM,CAAA,EAAG;AACrE,QAAA,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,MAAM,CAAE,CAAA;AAC/B,QAAA,MAAA,EAAA;AAAA,MACF;AACA,MAAA,OAAA,EAAA;AAEA,MAAA,KAAA,CAAM,KAAK,EAAE,SAAA,EAAW,WAAW,OAAA,EAAS,OAAA,EAAS,UAAU,CAAA;AAAA,IACjE;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,GAAS,SAAS,MAAA,EAAQ;AAC5B,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,SAAA,EAAW,OAAA;AAAA,MACX,SAAS,IAAA,CAAK,MAAA;AAAA,MACd,QAAA,EAAU,QAAA,CAAS,KAAA,CAAM,MAAM;AAAA,KAChC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,WAAA,CAAY,GAAa,CAAA,EAAsB;AACtD,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,EAAA,OAAO,CAAA,CAAE,MAAM,CAAC,GAAA,EAAK,QAAQ,GAAA,KAAQ,CAAA,CAAE,GAAG,CAAC,CAAA;AAC7C;;;ACnGO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,WAAA,CACmB,SACA,OAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAFgB,OAAA;AAAA,EACA,OAAA;AAAA,EAGnB,MAAM,OAAA,CAAQ,QAAA,EAAoB,MAAA,EAAqD;AACrF,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,aAAa,QAAQ,CAAA;AAAA,MACnC,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,cAAc,QAAQ,CAAA;AAAA,MACpC,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,aAAa,QAAQ,CAAA;AAAA,MACnC,KAAK,WAAA;AACH,QAAA,OAAO,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AAAA;AACzC,EACF;AAAA,EAEA,MAAM,iBAAA,CACJ,QAAA,EACA,QAAA,EAC2B;AAC3B,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAK,aAAA;AACH,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,OAAO,CAAA;AAAA,MACvC,KAAK,cAAA;AACH,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,QAAQ,CAAA;AAAA,MACxC,KAAK,WAAA;AACH,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,WAAW,CAAA;AAAA,MAC3C,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,OAAO,CAAA;AAAA;AACzC,EACF;AAAA,EAEA,MAAM,UAAA,CAAW,SAAA,EAAuB,QAAA,EAAyD;AAC/F,IAAA,MAAM,UAA8B,EAAC;AACrC,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,iBAAA,CAAkB,UAAU,QAAQ,CAAA;AAC9D,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,aAAa,QAAA,EAA+C;AACxE,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,QAAA,CAAS,YAAY,CAAA;AAC9C,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAA;AAAA,MACX,SAAS,UAAA,CAAW,EAAA;AAAA,MACpB,IAAA;AAAA,MACA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,YAAA,EAAc,OAAO;AAAA,KAC5C;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAA,CAAS,UAAA,CAAW,IAAI,QAAQ,CAAA;AAE1D,IAAA,OAAO,EAAE,MAAM,QAAA,CAAS,UAAA,CAAW,cAAc,MAAA,EAAQ,OAAA,EAAS,SAAS,IAAA,EAAK;AAAA,EAClF;AAAA,EAEA,MAAc,cAAc,QAAA,EAA+C;AACzE,IAAA,MAAM,KAAK,OAAA,CAAQ,SAAA,CAAU,SAAS,UAAA,CAAW,YAAA,EAAc,SAAS,aAAa,CAAA;AAErF,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,QAAA,CAAS,aAAa,CAAA;AAC/C,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAA;AAAA,MACX,SAAS,UAAA,CAAW,EAAA;AAAA,MACpB,IAAA;AAAA,MACA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,aAAA,EAAe,OAAO;AAAA,KAC7C;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAA,CAAS,UAAA,CAAW,IAAI,QAAQ,CAAA;AAE1D,IAAA,OAAO,EAAE,MAAM,QAAA,CAAS,UAAA,CAAW,cAAc,MAAA,EAAQ,QAAA,EAAU,SAAS,IAAA,EAAK;AAAA,EACnF;AAAA,EAEA,MAAc,aAAa,QAAA,EAA+C;AACxE,IAAA,MAAM,IAAA,GAAO,SAAS,WAAA,IAAe,EAAA;AACrC,IAAA,MAAM,cAAc,aAAA,CAAc,IAAA,EAAM,QAAA,CAAS,YAAA,EAAc,SAAS,aAAa,CAAA;AAErF,IAAA,MAAM,KAAK,OAAA,CAAQ,SAAA,CAAU,SAAS,UAAA,CAAW,YAAA,EAAc,YAAY,MAAM,CAAA;AAEjF,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,WAAA,CAAY,MAAM,CAAA;AAC3C,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,QAAA,CAAS,UAAA,CAAW,EAAA,EAAI,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,OAAO,CAAC,CAAA;AAE9F,IAAA,IAAI,YAAY,OAAA,EAAS;AACvB,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAA,CAAS,UAAA,CAAW,IAAI,QAAQ,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAS,UAAA,CAAW,YAAA;AAAA,MAC1B,MAAA,EAAQ,OAAA;AAAA,MACR,SAAS,WAAA,CAAY,OAAA;AAAA,MACrB,iBAAA,EAAmB,CAAC,WAAA,CAAY;AAAA,KAClC;AAAA,EACF;AAAA,EAEA,MAAc,iBAAiB,QAAA,EAA+C;AAC5E,IAAA,MAAM,YAAA,GAAe,SAAS,UAAA,CAAW,YAAA;AACzC,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,QAAA,CAAS,KAAK,IAAI,KAAA,GAAQ,EAAA;AACnD,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AACjD,IAAA,MAAM,YAAA,GAAe,CAAA,EAAG,QAAQ,CAAA,SAAA,EAAY,GAAG,CAAA,CAAA;AAE/C,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,YAAA,EAAc,SAAS,aAAa,CAAA;AAEjE,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,QAAA,CAAS,YAAY,CAAA;AACnD,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAA;AAAA,MACX,SAAS,UAAA,CAAW,EAAA;AAAA,MACpB,SAAA;AAAA,MACA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,YAAA,EAAc,OAAO;AAAA,KAC5C;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAA,CAAS,UAAA,CAAW,IAAI,QAAQ,CAAA;AAE1D,IAAA,OAAO,EAAE,IAAA,EAAM,YAAA,EAAc,MAAA,EAAQ,WAAA,EAAa,SAAS,IAAA,EAAK;AAAA,EAClE;AAAA,EAEA,aAAa,QAAA,EAA4B;AACvC,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AACnD,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAA,CAAM,IAAI,CAAA;AACrD,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,QAAA,CAAS,UAAA,CAAW,YAAY,CAAA,CAAE,CAAA;AAC3D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,QAAA,CAAS,YAAA,CAAa,MAAM,CAAA,CAAA,CAAG,CAAA;AACjE,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,MAAA,EAAQ,YAAY,MAAM,CAAA;AAC7D,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,SAAA,GAAY,WAAW,CAAC,CAAA;AAC9B,MAAA,MAAM,UAAA,GAAa,YAAY,CAAC,CAAA;AAEhC,MAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,SAAA,IAAa,EAAE,CAAA,CAAE,CAAA;AAAA,MACnC,CAAA,MAAO;AACL,QAAA,IAAI,cAAc,MAAA,EAAW,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AACxD,QAAA,IAAI,eAAe,MAAA,EAAW,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,UAAU,CAAA,CAAE,CAAA;AAAA,MAC5D;AAAA,IACF;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AACF;;;AC/HO,IAAM,aAAN,MAAiB;AAAA,EACtB,mBAAA,CAAoB,IAAA,EAAsB,QAAA,GAAmB,EAAA,EAAqB;AAChF,IAAA,MAAM,UAA2B,EAAC;AAClC,IAAA,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AACzC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,YAAA,CAAa,IAAA,EAAsB,UAAA,EAAoB,OAAA,EAAgC;AAC7F,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,IAAA,CAAK,KAAA,IAAS,WAAW,CAAA;AAC3D,IAAA,MAAM,cAAc,UAAA,GAAa,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,QAAA;AAE/D,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,iBAAA;AAAA,QACN,YAAA,EAAc,GAAG,WAAW,CAAA,CAAA,CAAA;AAAA,QAC5B,UAAA,EAAY,GAAG,WAAW,CAAA,CAAA,CAAA;AAAA,QAC1B,UAAA,EAAY,GAAG,WAAW,CAAA,YAAA;AAAA,OAC3B,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,WAAA,EAAa;AAC9C,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,aAAA;AAAA,QACN,YAAA,EAAc,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,QAAQ,CAAA,GAAA,CAAA;AAAA,QACxC,UAAA,EAAY,GAAG,WAAW,CAAA,CAAA,CAAA;AAAA,QAC1B,QAAA,EAAU,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,QAAQ,CAAA,GAAA;AAAA,OACrC,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,CAAC,IAAA,CAAK,UAAA,IAAc,KAAK,WAAA,EAAa;AAC/C,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,aAAA;AAAA,QACN,YAAA,EAAc,GAAG,WAAW,CAAA,CAAA,CAAA;AAAA,QAC5B,UAAA,EAAY,GAAG,WAAW,CAAA,CAAA;AAAA,OAC3B,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAM,MAAA;AAAA,QACN,YAAA,EAAc,GAAG,WAAW,CAAA,GAAA;AAAA,OAC7B,CAAA;AAAA,IACH;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,MAAA,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,WAAA,EAAa,OAAO,CAAA;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,mBAAA,CAAoB,SAA4B,YAAA,EAA0C;AACxF,IAAA,MAAM,QAA4B,EAAC;AACnC,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,YAAA,EAAc,KAAK,CAAA;AAC/C,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,aAAA,CACN,OAAA,EACA,YAAA,EACA,KAAA,EACM;AACN,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,MAAM,WAAA,EAAa;AACrB,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAE5C,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,KAAA,CAAM,IAAA,CAAK;AAAA,YACT,IAAA,EAAM,oBAAA;AAAA,YACN,OAAO,KAAA,CAAM,IAAA;AAAA,YACb,YAAA;AAAA,YACA,eAAe,UAAA,CAAW,IAAA;AAAA,YAC1B,UAAA,EAAY;AAAA,WACb,CAAA;AAED,UAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,UAAA,CAAW,IAAI,CAAA;AAC5E,UAAA,IAAA,CAAK,cAAc,YAAA,EAAc,CAAA,YAAA,EAAe,KAAA,CAAM,IAAI,IAAI,KAAK,CAAA;AAAA,QACrE,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,IAAA,CAAK;AAAA,YACT,IAAA,EAAM,0BAAA;AAAA,YACN,OAAO,KAAA,CAAM,IAAA;AAAA,YACb,YAAA;AAAA,YACA,UAAA,EAAY;AAAA,WACb,CAAA;AACD,UAAA,IAAA,CAAK,cAAc,KAAA,CAAM,QAAA,EAAU,eAAe,KAAA,CAAM,IAAI,IAAI,KAAK,CAAA;AAAA,QACvE;AAAA,MACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,IAAK,CAAC,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACpE,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,IAAA,EAAM,WAAA;AAAA,UACN,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,EAAE,CAAA;AAAA,UACrC,YAAA;AAAA,UACA,eAAe,KAAA,CAAM,IAAA;AAAA,UACrB,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAe,GAAA,EAA8C;AACnE,IAAA,OAAO,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,GAAA,CAAA,IAAS,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,IAAK,IAAA;AAAA,EAC3F;AAAA,EAEA,kBAAkB,IAAA,EAIF;AACd,IAAA,IAAI,IAAA,CAAK,YAAY,OAAO,iBAAA;AAC5B,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,WAAA,EAAa,OAAO,aAAA;AAChD,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,aAAa,OAAO,aAAA;AACjD,IAAA,OAAO,MAAA;AAAA,EACT;AACF;ACrHO,IAAM,cAAN,MAAkB;AAAA,EAGvB,WAAA,CACmB,UACA,QAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAChB;AAAA,EAFgB,QAAA;AAAA,EACA,QAAA;AAAA,EAJX,OAAA,GAA4B,IAAA;AAAA,EAOpC,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,QAAA,EAAU;AAAA,MAClC,OAAA,EAAS,CAAC,aAAA,EAAe,oBAAA,EAAsB,qBAAqB,CAAA;AAAA,MACpE,UAAA,EAAY,IAAA;AAAA,MACZ,aAAA,EAAe,IAAA;AAAA,MACf,gBAAA,EAAkB;AAAA,QAChB,kBAAA,EAAoB,GAAA;AAAA,QACpB,YAAA,EAAc;AAAA;AAChB,KACD,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAG,KAAA,EAAO,CAAC,SAAS,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,IAAI,CAAC,CAAA;AAC3D,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAG,QAAA,EAAU,CAAC,SAAS,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,IAAI,CAAC,CAAA;AACjE,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAG,QAAA,EAAU,CAAC,SAAS,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,IAAI,CAAC,CAAA;AAAA,EACnE;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAA,CAAK,QAAQ,KAAA,EAAM;AACzB,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IACjB;AAAA,EACF;AACF;;;ACzBA,IAAM,mBAAA,GAAsB,GAAA;AAErB,IAAM,mBAAN,MAAuB;AAAA,EAU5B,WAAA,CACmB,QAAA,EACA,YAAA,EACjB,OAAA,GAA4B,EAAC,EAC7B;AAHiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAGjB,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,mBAAA;AACxC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EANmB,QAAA;AAAA,EACA,YAAA;AAAA,EAXF,UAAA;AAAA,EACA,OAAA;AAAA,EACT,OAAA,GAA8B,IAAA;AAAA,EAC9B,aAAA,GAAsD,IAAA;AAAA,EACtD,cAAA,uBAA8C,GAAA,EAAI;AAAA,EAClD,OAAA,GAAU,KAAA;AAAA,EACV,UAAA,GAAa,KAAA;AAAA,EACb,OAAA,GAAU,KAAA;AAAA,EAWlB,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,OAAA,EAAS;AAElB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,UAAU,IAAI,WAAA,CAAY,KAAK,QAAA,EAAU,CAAC,OAAO,IAAA,KAAS;AAC7D,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,IAAI,CAAA;AAAA,IACnC,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AAEnB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAE1B,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAA,CAAK,QAAQ,IAAA,EAAK;AACxB,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,eAAA,GAA0B;AACxB,IAAA,OAAO,KAAK,cAAA,CAAe,IAAA;AAAA,EAC7B;AAAA,EAEQ,gBAAA,CAAiB,OAAmB,IAAA,EAAoB;AAC9D,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AAE3B,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AACnC,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,GAAe,KAAA,EAAO,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,IAAA,IAAA,CAAK,aAAA,GAAgB,WAAW,MAAM;AACpC,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,MAAA,KAAK,KAAK,WAAA,EAAY;AAAA,IACxB,CAAA,EAAG,KAAK,UAAU,CAAA;AAAA,EACpB;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AAC/B,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAc,WAAA,GAA6B;AACzC,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,MAAM,eAAe,CAAC,GAAG,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA;AACnD,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAE1B,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,QAAQ,WAAA,IAAc;AAE3B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK;AAAA,QAC1C,KAAA,EAAO,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,YAAA,GAAe,KAAA;AAAA,OACjD,CAAA;AAED,MAAA,IAAA,CAAK,OAAA,CAAQ,iBAAiB,MAAM,CAAA;AAAA,IACtC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,MAAA,IAAA,CAAK,OAAA,CAAQ,cAAc,GAAG,CAAA;AAAA,IAChC,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAEf,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,QAAA,KAAK,KAAK,WAAA,EAAY;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;;;ACzHO,SAAS,WAAA,CACd,SACA,KAAA,EACW;AACX,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,OAAA;AAE/B,EAAA,OAAO,CAAC,GAAG,OAAO,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACjC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,SAAA;AAClC,MAAA,IAAI,CAAC,GAAA,EAAK;AAEV,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,IAAA;AAClC,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,IAAA;AAClC,MAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,EAAM,IAAI,CAAA;AACpC,MAAA,IAAI,QAAQ,CAAA,EAAG,OAAO,KAAK,SAAA,KAAc,WAAA,GAAc,MAAM,CAAC,GAAA;AAAA,IAChE;AACA,IAAA,OAAO,CAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEO,SAAS,YAAA,CACd,OAAA,EACA,eAAA,EACA,OAAA,EACkB;AAClB,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAuB;AAC1C,EAAA,MAAM,YAAuB,EAAC;AAE9B,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,UAAA,CAAW,eAAe,CAAA,IAAK,IAAA;AACjD,IAAA,MAAM,SAAA,GAAY,iBAAiB,GAAG,CAAA;AAEtC,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AACrC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,CAAC,KAAK,CAAC,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,GAA2B,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,MAAO;AAAA,IAClF,SAAA,EAAW,IAAA;AAAA,IACX,OAAA,EAAS;AAAA,GACX,CAAE,CAAA;AAEF,EAAA,IAAI,OAAA,EAAS,SAAS,WAAA,EAAa;AACjC,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,SAAA,CAAU,aAAA,CAAc,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,EAC9D,CAAA,MAAA,IAAW,OAAA,EAAS,IAAA,KAAS,YAAA,EAAc;AACzC,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,SAAA,CAAU,aAAA,CAAc,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,MAAA,CAAO,KAAK,EAAE,SAAA,EAAW,2BAAA,EAAS,OAAA,EAAS,WAAW,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI,SAAS,eAAA,EAAiB;AAC5B,IAAA,MAAA,GAAS,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,EACpD;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,sBAAA,CAAuB,SAAoB,YAAA,EAAuC;AAChG,EAAA,MAAM,SAA0B,EAAC;AAEjC,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,UAAA,CAAW,YAAY,CAAA;AACzC,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,MAAA,MAAM,IAAA,GAAO,UAAU,GAAG,CAAA;AAC1B,MAAA,IAAI,MAAM,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,IACvC,CAAA,MAAA,IAAW,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,IAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,IAAK,OAAA,IAAW,GAAA,EAAK;AAC3F,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAChC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,KAAA;AAAA,UACA,IAAA;AAAA,UACA,SAAS,GAAA,CAAI,GAAA,GAAO,UAAU,GAAA,CAAI,GAAG,KAAK,MAAA,GAAa;AAAA,SACxD,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,aAAA,CACd,eAAA,EACA,IAAA,EACA,KAAA,EACiB;AACjB,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAC1D,EAAA,OAAO,eAAA,CAAgB,OAAO,CAAC,EAAA,KAAO,GAAG,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAC,CAAA;AACpE;AAEO,SAAS,qBACd,UAAA,EACqD;AACrD,EAAA,IAAI,CAAC,UAAA,CAAW,UAAA,EAAY,OAAO,EAAC;AAEpC,EAAA,OAAO,UAAA,CAAW,UAAA,CACf,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,KAAK,CAAA,CACjC,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACX,IAAI,CAAA,CAAE,UAAA;AAAA,IACN,IAAA,EAAM,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE,UAAA;AAAA,IAC1B,OAAO,CAAA,CAAE;AAAA,GACX,CAAE,CAAA;AACN;AAEA,SAAS,aAAA,CAAc,GAAkB,CAAA,EAA0B;AACjE,EAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,EAAM,OAAO,CAAA;AACrC,EAAA,IAAI,CAAA,KAAM,MAAM,OAAO,CAAA;AACvB,EAAA,IAAI,CAAA,KAAM,MAAM,OAAO,EAAA;AAEvB,EAAA,IAAI,OAAO,MAAM,QAAA,IAAY,OAAO,MAAM,QAAA,EAAU,OAAO,CAAA,CAAE,aAAA,CAAc,CAAC,CAAA;AAC5E,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,CAAA,KAAM,QAAA,SAAiB,CAAA,GAAI,CAAA;AAC/D,EAAA,IAAI,OAAO,CAAA,KAAM,SAAA,IAAa,OAAO,CAAA,KAAM,SAAA,EAAW,OAAA,CAAQ,CAAA,GAAI,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA;AAEpF,EAAA,IAAI,MAAM,OAAA,CAAQ,CAAC,KAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AACxC,IAAA,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA,CAAE,cAAc,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,OAAO,MAAM,QAAA,IAAY,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,EAAM;AAC9E,IAAA,IAAI,OAAA,IAAW,CAAA,IAAK,OAAA,IAAW,CAAA,EAAG;AAChC,MAAA,OAAA,CAAQ,EAAE,KAAA,IAAS,EAAA,EAAI,aAAA,CAAc,CAAA,CAAE,SAAS,EAAE,CAAA;AAAA,IACpD;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,CAAC,CAAA,CAAE,aAAA,CAAc,MAAA,CAAO,CAAC,CAAC,CAAA;AAC1C;AAEA,SAAS,iBAAiB,GAAA,EAAmC;AAC3D,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW,OAAO,IAAA;AAC9C,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,GAAA,IAAO,IAAA;AAC3C,EAAA,IAAI,OAAO,GAAA,KAAQ,SAAA,EAAW,OAAO,MAAM,MAAA,GAAS,OAAA;AACpD,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,OAAO,GAAG,CAAA;AAC9C,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAO,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AACjE,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,OAAA,IAAW,GAAA,SAAY,GAAA,CAAI,KAAA;AAC1D,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAU,KAAA,EAA8B;AAC/C,EAAA,MAAM,KAAA,GAAQ,sBAAA,CAAuB,IAAA,CAAK,KAAK,CAAA;AAC/C,EAAA,OAAO,KAAA,GAAQ,CAAC,CAAA,IAAK,IAAA;AACvB;ACjJA,IAAM,aAAA,GAAgB,6BAAA;AAEf,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,OAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAAmB;AAAA,EAAnB,OAAA;AAAA,EAE7B,MAAM,kBAAA,GAAmE;AACvE,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,aAAa,CAAA;AACrD,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,UAAA,EAAyD;AAC5E,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,kBAAA,EAAmB;AAC1C,IAAA,OAAO,GAAA,CAAI,UAAU,CAAA,IAAK,IAAA;AAAA,EAC5B;AAAA,EAEA,MAAM,eAAe,UAAA,EAAwC;AAC3D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,iBAAA,EAAkB;AACtD,IAAA,MAAM,SAAS,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,GAAI,aAAa,UAAA,GAAa,GAAA;AACpE,IAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA;AAEhE,IAAA,MAAM,UAAqB,EAAC;AAE5B,IAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,KAAK,IAAI,CAAA;AACrD,QAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAC3C,QAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAAA,MAC/B,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,aAAA,CACJ,UAAA,EACA,MAAA,EACA,YACA,MAAA,EACgC;AAChC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA;AACrD,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,IAAA,MAAM,UAAA,GAAa,SAAS,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AAC7D,IAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA;AAEpD,IAAA,OAAO,KAAK,eAAA,CAAgB,OAAA,EAAS,YAAY,UAAA,EAAY,QAAA,CAAS,cAAc,MAAM,CAAA;AAAA,EAC5F;AAAA,EAEA,MAAM,oBAAA,CACJ,UAAA,EACA,UAAA,EACA,MAAA,EACgC;AAChC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA;AACrD,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,IAAA;AAErD,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA;AACnC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA;AAEpD,IAAA,OAAO,KAAK,eAAA,CAAgB,OAAA,EAAS,YAAY,UAAA,EAAY,QAAA,CAAS,cAAc,MAAM,CAAA;AAAA,EAC5F;AAAA,EAEA,eAAA,CACE,OAAA,EACA,UAAA,EACA,UAAA,EACA,cACA,MAAA,EACgB;AAChB,IAAA,IAAI,SAAA,GAAY,OAAA;AAEhB,IAAA,IAAI,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,KAAA,CAAM,SAAS,CAAA,EAAG;AACnD,MAAA,SAAA,GAAY,WAAA,CAAY,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,YAAA,GAAe,qBAAqB,UAAU,CAAA;AACpD,IAAA,MAAM,aAAA,GACJ,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,GAAI,oBAAA,CAAqB,SAAS,CAAA;AAE5F,IAAA,MAAM,IAAA,GAAuB;AAAA,MAC3B,UAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA,EAAS,SAAA;AAAA,MACT,aAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,UAAA,CAAW,IAAA,KAAS,OAAA,IAAW,UAAA,CAAW,OAAA,EAAS;AACrD,MAAA,MAAM,OAAA,GAAU,YAAA;AAAA,QACd,SAAA;AAAA,QACA,UAAA,CAAW,OAAA,CAAQ,YAAA,IAAgB,UAAA,CAAW,OAAA,CAAQ,UAAA;AAAA,QACtD;AAAA,UACE,MAAM,UAAA,CAAW,OAAA,CAAQ,SAAS,QAAA,GAAW,MAAA,GAAY,WAAW,OAAA,CAAQ,IAAA;AAAA,UAC5E,eAAA,EAAiB,WAAW,OAAA,CAAQ;AAAA;AACtC,OACF;AACA,MAAA,OAAO,EAAE,GAAG,IAAA,EAAM,OAAA,EAAQ;AAAA,IAC5B;AAEA,IAAA,IAAI,UAAA,CAAW,IAAA,KAAS,UAAA,IAAc,UAAA,CAAW,gBAAA,EAAkB;AACjE,MAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,SAAA,EAAW,UAAA,CAAW,gBAAgB,CAAA;AACrF,MAAA,OAAO,EAAE,GAAG,IAAA,EAAM,eAAA,EAAgB;AAAA,IACpC;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,UAAA,CAAW,MAAc,OAAA,EAAiC;AACjE,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAASb,QAAO,OAAO,CAAA;AAC7B,IAAA,MAAM,KAAK,MAAA,CAAO,IAAA;AAElB,IAAA,MAAM,KAAA,GAAS,EAAA,CAAG,KAAA,IAAoBgB,qBAAAA,CAAqB,IAAI,CAAA;AAC/D,IAAA,MAAM,OAAO,EAAA,CAAG,IAAA;AAChB,IAAA,MAAM,QAAQ,EAAA,CAAG,KAAA;AAEjB,IAAA,MAAM,aAA4C,EAAC;AACnD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,EAAG;AAC7C,MAAA,IAAI,GAAA,KAAQ,OAAA,IAAW,GAAA,KAAQ,MAAA,IAAU,QAAQ,OAAA,EAAS;AAC1D,MAAA,UAAA,CAAW,GAAG,CAAA,GAAI,sBAAA,CAAuB,KAAK,CAAA;AAAA,IAChD;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAO,UAAA,EAAW;AAAA,EAChD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,uBAAuB,KAAA,EAA+B;AAC7D,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,IAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,OAAO,KAAA,KAAU,SAAA,EAAW,OAAO,KAAA;AAEvC,EAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,IAAA,OAAO,MAAM,WAAA,EAAY,CAAE,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAAA,EACzC;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,MAAM,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACnC;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,IAAI,WAAW,GAAA,EAAK;AAClB,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,QACvB,KAAK,GAAA,CAAI,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,GAAI;AAAA,OACnC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAEA,SAASA,sBAAqB,QAAA,EAA0B;AACtD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AAChC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA;AAC5C,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AACrC;AAEA,SAAS,qBAAqB,OAAA,EAA8B;AAC1D,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AAC/C,MAAA,KAAA,CAAM,IAAI,GAAG,CAAA;AAAA,IACf;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AACzB;ACtLO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6B,OAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAAmB;AAAA,EAAnB,OAAA;AAAA,EAE7B,MAAM,cAAA,CACJ,SAAA,EACA,YAAA,EACA,QAAA,EACe;AACf,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,SAAS,CAAA;AACrD,IAAA,MAAM,MAAA,GAAShB,QAAO,OAAO,CAAA;AAE7B,IAAA,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,GAAI,QAAA;AAE5B,IAAA,MAAM,UAAUA,OAAAA,CAAO,SAAA,CAAU,MAAA,CAAO,OAAA,EAAS,OAAO,IAAI,CAAA;AAC5D,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,SAAA,EAAW,OAAO,CAAA;AAAA,EACjD;AAAA,EAEA,MAAM,WAAA,CACJ,UAAA,EACA,KAAA,EACA,UAAA,EACiB;AACjB,IAAA,MAAM,WAAW,KAAA,CAAM,OAAA,CAAQ,iBAAiB,GAAG,CAAA,CAAE,MAAK,IAAK,UAAA;AAC/D,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,GAAA,CAAA;AAE1C,IAAA,MAAM,WAAA,GAAc,EAAE,KAAA,EAAO,GAAG,UAAA,EAAW;AAC3C,IAAA,MAAM,OAAA,GAAUA,OAAAA,CAAO,SAAA,CAAU,EAAA,EAAI,WAAW,CAAA;AAEhD,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,UAAU,CAAA;AAC1C,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,QAAA,EAAU,OAAO,CAAA;AAE9C,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,gBAAA,CACJ,KAAA,EACA,aAAA,EACA,aAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,eAAe,aAAa,CAAA;AAAA,EACpE;AAAA,EAEA,MAAM,UAAA,CAAW,SAAA,EAAmB,YAAA,EAAsB,OAAA,EAAgC;AACxF,IAAA,MAAM,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,YAAA,EAAc,OAAO,CAAA;AAAA,EAC5D;AACF;;;AC/CA,IAAM,aAAA,GAA6C;AAAA,EACjD,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,MAAA,EAAQ,SAAA;AAAA,EACR,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,gBAAA,GAAgD;AAAA,EACpD,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,MAAA,EAAQ,SAAA;AAAA,EACR,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK;AACP,CAAA;AAEO,SAAS,eAAe,KAAA,EAAqC;AAClE,EAAA,OAAO,aAAA,CAAc,KAAoB,CAAA,IAAK,aAAA,CAAc,OAAA;AAC9D;AAEO,SAAS,iBAAiB,KAAA,EAAqC;AACpE,EAAA,OAAO,gBAAA,CAAiB,KAAoB,CAAA,IAAK,gBAAA,CAAiB,OAAA;AACpE;AAEO,SAAS,gBAAA,GAA2B;AACzC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AACvD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,IAAI,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,EAChD;AACA,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AAC1D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,IAAI,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO,CAAA;AAAA,EAAY,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA,CAAA;AACrC","file":"index.js","sourcesContent":["import { z } from \"zod\";\n\nconst DatabaseSyncSchema = z.object({\n databaseId: z.string(),\n localFolder: z.string(),\n propertyMapping: z.record(z.string()).optional(),\n pullFilter: z.unknown().optional(),\n titleProperty: z.string().default(\"Name\"),\n});\n\nexport type DatabaseSyncConfig = z.infer<typeof DatabaseSyncSchema>;\n\nexport const ConfigSchema = z.object({\n version: z.literal(1),\n notion: z.object({\n token: z.string().startsWith(\"ntn_\"),\n rootPageId: z.string(),\n workspaceId: z.string().optional(),\n parentMode: z.enum([\"page\", \"database\"]).default(\"page\"),\n databaseId: z.string().optional(),\n databases: z.array(DatabaseSyncSchema).default([]),\n }),\n sync: z.object({\n direction: z.enum([\"push\", \"pull\", \"both\"]).default(\"both\"),\n conflictStrategy: z\n .enum([\"local-first\", \"remote-first\", \"manual\", \"duplicate\"])\n .default(\"manual\"),\n autoSync: z.boolean().default(false),\n autoSyncInterval: z.number().min(30).max(3600).default(300),\n deleteSync: z.boolean().default(false),\n syncFiles: z.boolean().default(true),\n }),\n paths: z.object({\n include: z.array(z.string()).default([\"**/*\"]),\n exclude: z.array(z.string()).default([]),\n attachments: z.string().default(\"attachments\"),\n }),\n conversion: z.object({\n preferMarkdownApi: z.boolean().default(true),\n preserveMarkers: z.boolean().default(true),\n frontmatterMapping: z.boolean().default(true),\n imageDownload: z.enum([\"immediate\", \"lazy\", \"skip\"]).default(\"immediate\"),\n }),\n advanced: z.object({\n concurrency: z.number().min(1).max(10).default(3),\n maxRetries: z.number().min(0).max(10).default(5),\n timeoutMs: z.number().min(5000).max(60000).default(30000),\n batchSize: z.number().min(1).max(100).default(50),\n }),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n\nexport const DEFAULT_CONFIG: Config = {\n version: 1,\n notion: {\n token: \"\",\n rootPageId: \"\",\n parentMode: \"page\",\n databases: [],\n },\n sync: {\n direction: \"both\",\n conflictStrategy: \"manual\",\n autoSync: false,\n autoSyncInterval: 300,\n deleteSync: false,\n syncFiles: true,\n },\n paths: {\n include: [\"**/*\"],\n exclude: [],\n attachments: \"attachments\",\n },\n conversion: {\n preferMarkdownApi: true,\n preserveMarkers: true,\n frontmatterMapping: true,\n imageDownload: \"immediate\",\n },\n advanced: {\n concurrency: 3,\n maxRetries: 5,\n timeoutMs: 30000,\n batchSize: 50,\n },\n};\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { ConfigSchema, DEFAULT_CONFIG } from \"../types/config.js\";\nimport type { Config } from \"../types/config.js\";\n\nconst CONFIG_FILE = \"config.json\";\nconst IM_NOBSIDIAN_DIR = \".im-nobsidian\";\n\nexport class ConfigManager {\n private config: Config | null = null;\n\n constructor(private readonly vaultRoot: string) {}\n\n get configDir(): string {\n return join(this.vaultRoot, IM_NOBSIDIAN_DIR);\n }\n\n get configPath(): string {\n return join(this.configDir, CONFIG_FILE);\n }\n\n get dbPath(): string {\n return join(this.configDir, \"sync.db\");\n }\n\n async load(): Promise<Config> {\n try {\n const raw = await readFile(this.configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n this.config = ConfigSchema.parse(parsed);\n return this.config;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(`설정 파일의 JSON 형식이 올바르지 않습니다: ${this.configPath}`);\n }\n if (error instanceof Error && error.name === \"ZodError\") {\n throw new Error(`설정 파일 검증 실패: ${error.message}`);\n }\n throw new Error(\n `설정 파일을 찾을 수 없습니다: ${this.configPath}\\n'im-nobsidian init'을 먼저 실행하세요.`,\n );\n }\n }\n\n async save(config: Config): Promise<void> {\n await mkdir(this.configDir, { recursive: true });\n const content = JSON.stringify(config, null, 2);\n await writeFile(this.configPath, content, \"utf-8\");\n this.config = config;\n }\n\n async init(params: { token: string; rootPageId: string }): Promise<Config> {\n const config: Config = {\n ...DEFAULT_CONFIG,\n notion: {\n ...DEFAULT_CONFIG.notion,\n token: params.token,\n rootPageId: params.rootPageId,\n },\n };\n\n await this.save(config);\n await this.ensureGitignore();\n return config;\n }\n\n getConfig(): Config {\n if (!this.config) {\n throw new Error(\"설정이 로드되지 않았습니다. load()를 먼저 호출하세요.\");\n }\n return this.config;\n }\n\n private async ensureGitignore(): Promise<void> {\n const gitignorePath = join(this.vaultRoot, \".gitignore\");\n const entry = \".im-nobsidian/\";\n\n try {\n const content = await readFile(gitignorePath, \"utf-8\");\n if (!content.includes(entry)) {\n await writeFile(gitignorePath, `${content.trimEnd()}\\n${entry}\\n`, \"utf-8\");\n }\n } catch {\n await writeFile(gitignorePath, `${entry}\\n`, \"utf-8\");\n }\n }\n\n async isInitialized(): Promise<boolean> {\n try {\n const { stat } = await import(\"node:fs/promises\");\n await stat(this.configPath);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { randomUUID } from \"node:crypto\";\n\nexport function generateId(): string {\n return randomUUID();\n}\n\nexport function normalizeNotionId(id: string): string {\n const raw = id.replace(/-/g, \"\");\n if (raw.length !== 32) return id;\n return `${raw.slice(0, 8)}-${raw.slice(8, 12)}-${raw.slice(12, 16)}-${raw.slice(16, 20)}-${raw.slice(20)}`;\n}\n\nexport function notionIdsEqual(a: string, b: string): boolean {\n return a.replace(/-/g, \"\") === b.replace(/-/g, \"\");\n}\n","export const INITIAL_MIGRATION = `\nCREATE TABLE IF NOT EXISTS sync_state (\n id TEXT PRIMARY KEY,\n obsidian_path TEXT NOT NULL,\n notion_page_id TEXT,\n notion_parent_id TEXT,\n content_hash TEXT NOT NULL,\n notion_last_edited TEXT,\n local_last_modified TEXT NOT NULL,\n sync_direction TEXT NOT NULL DEFAULT 'both',\n file_type TEXT NOT NULL DEFAULT 'file',\n status TEXT NOT NULL DEFAULT 'pending',\n base_snapshot BLOB,\n version INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n\n CONSTRAINT chk_sync_direction CHECK (sync_direction IN ('push', 'pull', 'both')),\n CONSTRAINT chk_file_type CHECK (file_type IN ('file', 'folder-note', 'folder-only', 'db-row')),\n CONSTRAINT chk_status CHECK (status IN ('synced', 'pending', 'conflict', 'error'))\n);\n\nCREATE UNIQUE INDEX IF NOT EXISTS idx_sync_state_path ON sync_state(obsidian_path);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_sync_state_notion ON sync_state(notion_page_id) WHERE notion_page_id IS NOT NULL;\nCREATE INDEX IF NOT EXISTS idx_sync_state_status ON sync_state(status);\nCREATE INDEX IF NOT EXISTS idx_sync_state_parent ON sync_state(notion_parent_id);\n\nCREATE TABLE IF NOT EXISTS wikilink_map (\n obsidian_path TEXT PRIMARY KEY,\n notion_page_id TEXT NOT NULL UNIQUE,\n title TEXT NOT NULL,\n aliases TEXT DEFAULT '[]',\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_wikilink_title ON wikilink_map(title);\nCREATE INDEX IF NOT EXISTS idx_wikilink_notion ON wikilink_map(notion_page_id);\n\nCREATE TABLE IF NOT EXISTS pending_operations (\n id TEXT PRIMARY KEY,\n sync_state_id TEXT NOT NULL REFERENCES sync_state(id) ON DELETE CASCADE,\n operation TEXT NOT NULL,\n direction TEXT NOT NULL,\n payload TEXT,\n retry_count INTEGER NOT NULL DEFAULT 0,\n error_message TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n completed_at TEXT,\n\n CONSTRAINT chk_operation CHECK (operation IN ('create', 'update', 'delete', 'move')),\n CONSTRAINT chk_direction CHECK (direction IN ('push', 'pull')),\n CONSTRAINT chk_op_status CHECK (status IN ('pending', 'processing', 'completed', 'failed'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_pending_status ON pending_operations(status, created_at);\n\nCREATE TABLE IF NOT EXISTS image_registry (\n id TEXT PRIMARY KEY,\n sync_state_id TEXT NOT NULL REFERENCES sync_state(id) ON DELETE CASCADE,\n notion_file_url TEXT NOT NULL,\n local_path TEXT NOT NULL,\n content_hash TEXT NOT NULL,\n file_size INTEGER NOT NULL,\n mime_type TEXT NOT NULL,\n expires_at TEXT,\n downloaded_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE UNIQUE INDEX IF NOT EXISTS idx_image_hash ON image_registry(content_hash);\nCREATE INDEX IF NOT EXISTS idx_image_sync ON image_registry(sync_state_id);\n\nCREATE TABLE IF NOT EXISTS sync_metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nINSERT OR IGNORE INTO sync_metadata (key, value) VALUES ('schema_version', '1');\n`;\n","export const FILE_REGISTRY_MIGRATION = `\nCREATE TABLE IF NOT EXISTS file_registry (\n id TEXT PRIMARY KEY,\n local_path TEXT NOT NULL,\n notion_page_id TEXT NOT NULL,\n file_upload_id TEXT NOT NULL,\n file_type TEXT NOT NULL DEFAULT 'file',\n file_hash TEXT NOT NULL,\n file_size INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n\n CONSTRAINT chk_file_type CHECK (file_type IN ('image', 'pdf', 'video', 'audio', 'file'))\n);\n\nCREATE UNIQUE INDEX IF NOT EXISTS idx_file_registry_path ON file_registry(local_path);\nCREATE INDEX IF NOT EXISTS idx_file_registry_page ON file_registry(notion_page_id);\n\nUPDATE sync_metadata SET value = '2' WHERE key = 'schema_version';\n`;\n","import Database from \"better-sqlite3\";\nimport type { SyncRecord, SyncStatus, WikilinkEntry, PreserveMarker } from \"../types/index.js\";\nimport { generateId } from \"../utils/id.js\";\nimport { INITIAL_MIGRATION } from \"./migrations/001-initial.js\";\nimport { FILE_REGISTRY_MIGRATION } from \"./migrations/002-file-registry.js\";\n\nexport class StateDB {\n private readonly db: Database.Database;\n\n private constructor(db: Database.Database) {\n this.db = db;\n this.db.pragma(\"journal_mode = WAL\");\n this.db.pragma(\"foreign_keys = ON\");\n }\n\n static open(dbPath: string): StateDB {\n const db = new Database(dbPath);\n const stateDb = new StateDB(db);\n stateDb.migrate();\n return stateDb;\n }\n\n private migrate(): void {\n const version = this.getSchemaVersion();\n if (version < 1) {\n this.db.exec(INITIAL_MIGRATION);\n }\n if (version < 2) {\n this.db.exec(FILE_REGISTRY_MIGRATION);\n }\n }\n\n private getSchemaVersion(): number {\n try {\n const row = this.db\n .prepare(\"SELECT value FROM sync_metadata WHERE key = 'schema_version'\")\n .get() as { value: string } | undefined;\n return row ? Number(row.value) : 0;\n } catch {\n return 0;\n }\n }\n\n close(): void {\n this.db.close();\n }\n\n // --- sync_state ---\n\n getByPath(path: string): SyncRecord | null {\n const row = this.db.prepare(\"SELECT * FROM sync_state WHERE obsidian_path = ?\").get(path) as\n | RawSyncRow\n | undefined;\n return row ? this.mapRow(row) : null;\n }\n\n getByNotionId(pageId: string): SyncRecord | null {\n const row = this.db.prepare(\"SELECT * FROM sync_state WHERE notion_page_id = ?\").get(pageId) as\n | RawSyncRow\n | undefined;\n return row ? this.mapRow(row) : null;\n }\n\n getByStatus(status: SyncStatus): SyncRecord[] {\n const rows = this.db\n .prepare(\"SELECT * FROM sync_state WHERE status = ?\")\n .all(status) as RawSyncRow[];\n return rows.map((r) => this.mapRow(r));\n }\n\n getAll(): SyncRecord[] {\n const rows = this.db.prepare(\"SELECT * FROM sync_state\").all() as RawSyncRow[];\n return rows.map((r) => this.mapRow(r));\n }\n\n upsert(record: UpsertSyncRecord): SyncRecord {\n const existing = this.getByPath(record.obsidianPath);\n\n if (existing) {\n this.db\n .prepare(\n `UPDATE sync_state SET\n notion_page_id = ?, notion_parent_id = ?, content_hash = ?,\n notion_last_edited = ?, local_last_modified = ?,\n sync_direction = ?, file_type = ?, status = ?,\n base_snapshot = ?, version = version + 1,\n updated_at = datetime('now')\n WHERE id = ?`,\n )\n .run(\n record.notionPageId ?? null,\n record.notionParentId ?? null,\n record.contentHash,\n record.notionLastEdited ?? null,\n record.localLastModified,\n record.syncDirection,\n record.fileType,\n record.status,\n record.baseSnapshot ?? null,\n existing.id,\n );\n return this.getByPath(record.obsidianPath)!;\n }\n\n const id = generateId();\n this.db\n .prepare(\n `INSERT INTO sync_state\n (id, obsidian_path, notion_page_id, notion_parent_id, content_hash,\n notion_last_edited, local_last_modified, sync_direction, file_type,\n status, base_snapshot, version)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)`,\n )\n .run(\n id,\n record.obsidianPath,\n record.notionPageId ?? null,\n record.notionParentId ?? null,\n record.contentHash,\n record.notionLastEdited ?? null,\n record.localLastModified,\n record.syncDirection,\n record.fileType,\n record.status,\n record.baseSnapshot ?? null,\n );\n return this.getByPath(record.obsidianPath)!;\n }\n\n updateStatus(id: string, status: SyncStatus): void {\n this.db\n .prepare(\"UPDATE sync_state SET status = ?, updated_at = datetime('now') WHERE id = ?\")\n .run(status, id);\n }\n\n updateHash(id: string, hash: string, snapshot?: Buffer | null): void {\n if (snapshot !== undefined) {\n this.db\n .prepare(\n \"UPDATE sync_state SET content_hash = ?, base_snapshot = ?, updated_at = datetime('now') WHERE id = ?\",\n )\n .run(hash, snapshot, id);\n } else {\n this.db\n .prepare(\n \"UPDATE sync_state SET content_hash = ?, updated_at = datetime('now') WHERE id = ?\",\n )\n .run(hash, id);\n }\n }\n\n setNotionLastEdited(id: string, lastEdited: string): void {\n this.db\n .prepare(\n \"UPDATE sync_state SET notion_last_edited = ?, updated_at = datetime('now') WHERE id = ?\",\n )\n .run(lastEdited, id);\n }\n\n setNotionParentId(id: string, parentId: string): void {\n this.db\n .prepare(\n \"UPDATE sync_state SET notion_parent_id = ?, updated_at = datetime('now') WHERE id = ?\",\n )\n .run(parentId, id);\n }\n\n delete(id: string): void {\n this.db.prepare(\"DELETE FROM sync_state WHERE id = ?\").run(id);\n }\n\n // --- wikilink_map ---\n\n resolveWikilink(text: string): WikilinkEntry | null {\n const byTitle = this.db.prepare(\"SELECT * FROM wikilink_map WHERE title = ?\").get(text) as\n | RawWikilinkRow\n | undefined;\n\n if (byTitle) return this.mapWikilinkRow(byTitle);\n\n const byAlias = this.db\n .prepare(\"SELECT * FROM wikilink_map WHERE aliases LIKE ?\")\n .get(`%\"${text}\"%`) as RawWikilinkRow | undefined;\n\n if (byAlias) return this.mapWikilinkRow(byAlias);\n\n const byFilename = this.db\n .prepare(\"SELECT * FROM wikilink_map WHERE obsidian_path LIKE ?\")\n .get(`%/${text}.md`) as RawWikilinkRow | undefined;\n\n return byFilename ? this.mapWikilinkRow(byFilename) : null;\n }\n\n resolvePageId(pageId: string): WikilinkEntry | null {\n const row = this.db\n .prepare(\"SELECT * FROM wikilink_map WHERE notion_page_id = ?\")\n .get(pageId) as RawWikilinkRow | undefined;\n return row ? this.mapWikilinkRow(row) : null;\n }\n\n upsertWikilink(entry: WikilinkEntry): void {\n this.db\n .prepare(\n `INSERT OR REPLACE INTO wikilink_map (obsidian_path, notion_page_id, title, aliases, updated_at)\n VALUES (?, ?, ?, ?, datetime('now'))`,\n )\n .run(entry.obsidianPath, entry.notionPageId, entry.title, JSON.stringify(entry.aliases));\n }\n\n // --- sync_metadata ---\n\n getMeta(key: string): string | null {\n const row = this.db.prepare(\"SELECT value FROM sync_metadata WHERE key = ?\").get(key) as\n | { value: string }\n | undefined;\n return row?.value ?? null;\n }\n\n setMeta(key: string, value: string): void {\n this.db\n .prepare(\"INSERT OR REPLACE INTO sync_metadata (key, value) VALUES (?, ?)\")\n .run(key, value);\n }\n\n // --- file_registry ---\n\n isFileRegistered(localPath: string): boolean {\n const row = this.db.prepare(\"SELECT 1 FROM file_registry WHERE local_path = ?\").get(localPath);\n return !!row;\n }\n\n getFileRegistry(localPath: string): FileRegistryEntry | null {\n const row = this.db\n .prepare(\"SELECT * FROM file_registry WHERE local_path = ?\")\n .get(localPath) as RawFileRegistryRow | undefined;\n return row ? this.mapFileRegistryRow(row) : null;\n }\n\n getFilesByPageId(notionPageId: string): FileRegistryEntry[] {\n const rows = this.db\n .prepare(\"SELECT * FROM file_registry WHERE notion_page_id = ?\")\n .all(notionPageId) as RawFileRegistryRow[];\n return rows.map((r) => this.mapFileRegistryRow(r));\n }\n\n registerFile(entry: RegisterFileInput): void {\n const id = generateId();\n this.db\n .prepare(\n `INSERT OR REPLACE INTO file_registry\n (id, local_path, notion_page_id, file_upload_id, file_type, file_hash, file_size)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n id,\n entry.localPath,\n entry.notionPageId,\n entry.fileUploadId,\n entry.fileType,\n entry.fileHash,\n entry.fileSize,\n );\n }\n\n deleteFileRegistry(localPath: string): void {\n this.db.prepare(\"DELETE FROM file_registry WHERE local_path = ?\").run(localPath);\n }\n\n private mapFileRegistryRow(row: RawFileRegistryRow): FileRegistryEntry {\n return {\n id: row.id,\n localPath: row.local_path,\n notionPageId: row.notion_page_id,\n fileUploadId: row.file_upload_id,\n fileType: row.file_type,\n fileHash: row.file_hash,\n fileSize: row.file_size,\n };\n }\n\n // --- preserve markers ---\n\n storePreserveMarkers(path: string, markers: PreserveMarker[]): void {\n if (markers.length === 0) {\n this.db.prepare(\"DELETE FROM sync_metadata WHERE key = ?\").run(`preserve_markers:${path}`);\n return;\n }\n this.setMeta(`preserve_markers:${path}`, JSON.stringify(markers));\n }\n\n getPreserveMarkers(path: string): PreserveMarker[] {\n const value = this.getMeta(`preserve_markers:${path}`);\n if (!value) return [];\n try {\n return JSON.parse(value) as PreserveMarker[];\n } catch {\n return [];\n }\n }\n\n // --- transaction ---\n\n transaction<T>(fn: () => T): T {\n return this.db.transaction(fn)();\n }\n\n // --- private ---\n\n private mapRow(row: RawSyncRow): SyncRecord {\n return {\n id: row.id,\n obsidianPath: row.obsidian_path,\n notionPageId: row.notion_page_id,\n notionParentId: row.notion_parent_id,\n contentHash: row.content_hash,\n notionLastEdited: row.notion_last_edited,\n localLastModified: row.local_last_modified,\n syncDirection: row.sync_direction as SyncRecord[\"syncDirection\"],\n fileType: row.file_type as SyncRecord[\"fileType\"],\n status: row.status as SyncRecord[\"status\"],\n baseSnapshot: row.base_snapshot,\n version: row.version,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n }\n\n private mapWikilinkRow(row: RawWikilinkRow): WikilinkEntry {\n return {\n obsidianPath: row.obsidian_path,\n notionPageId: row.notion_page_id,\n title: row.title,\n aliases: JSON.parse(row.aliases || \"[]\") as string[],\n };\n }\n}\n\nexport interface UpsertSyncRecord {\n readonly obsidianPath: string;\n readonly notionPageId?: string | null;\n readonly notionParentId?: string | null;\n readonly contentHash: string;\n readonly notionLastEdited?: string | null;\n readonly localLastModified: string;\n readonly syncDirection: SyncRecord[\"syncDirection\"];\n readonly fileType: SyncRecord[\"fileType\"];\n readonly status: SyncRecord[\"status\"];\n readonly baseSnapshot?: Buffer | null;\n}\n\ninterface RawSyncRow {\n id: string;\n obsidian_path: string;\n notion_page_id: string | null;\n notion_parent_id: string | null;\n content_hash: string;\n notion_last_edited: string | null;\n local_last_modified: string;\n sync_direction: string;\n file_type: string;\n status: string;\n base_snapshot: Buffer | null;\n version: number;\n created_at: string;\n updated_at: string;\n}\n\ninterface RawWikilinkRow {\n obsidian_path: string;\n notion_page_id: string;\n title: string;\n aliases: string;\n updated_at: string;\n}\n\ninterface RawFileRegistryRow {\n id: string;\n local_path: string;\n notion_page_id: string;\n file_upload_id: string;\n file_type: string;\n file_hash: string;\n file_size: number;\n}\n\nexport interface FileRegistryEntry {\n readonly id: string;\n readonly localPath: string;\n readonly notionPageId: string;\n readonly fileUploadId: string;\n readonly fileType: string;\n readonly fileHash: string;\n readonly fileSize: number;\n}\n\nexport interface RegisterFileInput {\n readonly localPath: string;\n readonly notionPageId: string;\n readonly fileUploadId: string;\n readonly fileType: string;\n readonly fileHash: string;\n readonly fileSize: number;\n}\n","type NotionPropertySchema = {\n id: string;\n type: string;\n name: string;\n};\n\ntype NotionPropertyValue = Record<string, unknown>;\n\nconst DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2})?/;\nconst WIKILINK_REGEX = /^\\[\\[(.+?)(?:\\|.+?)?\\]\\]$/;\n\nexport interface WikilinkResolver {\n resolve(title: string): string | null;\n resolvePageId(pageId: string): string | null;\n}\n\nexport class PropertyMapper {\n private schema: Map<string, NotionPropertySchema> = new Map();\n private wikilinkResolver: WikilinkResolver | null = null;\n\n setWikilinkResolver(resolver: WikilinkResolver): void {\n this.wikilinkResolver = resolver;\n }\n\n loadSchema(properties: Record<string, { id: string; type: string }>): void {\n this.schema.clear();\n for (const [name, prop] of Object.entries(properties)) {\n this.schema.set(name, { id: prop.id, type: prop.type, name });\n }\n }\n\n toNotionProperties(\n frontmatter: Record<string, unknown>,\n title: string,\n ): Record<string, NotionPropertyValue> {\n const result: Record<string, NotionPropertyValue> = {\n title: { title: [{ text: { content: title } }] },\n };\n\n for (const [key, value] of Object.entries(frontmatter)) {\n if (key === \"title\") continue;\n if (value === null || value === undefined) continue;\n\n const schemaProp = this.schema.get(key);\n if (schemaProp) {\n const converted = this.convertBySchema(schemaProp.type, value);\n if (converted) result[key] = converted;\n } else {\n const inferred = this.inferAndConvert(value);\n if (inferred) result[key] = inferred;\n }\n }\n\n return result;\n }\n\n fromNotionProperties(notionProps: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, rawProp] of Object.entries(notionProps)) {\n const prop = rawProp as { type: string; [k: string]: unknown };\n if (prop.type === \"title\") continue;\n const value = this.extractValue(prop);\n if (value !== undefined) {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n private convertBySchema(type: string, value: unknown): NotionPropertyValue | null {\n switch (type) {\n case \"rich_text\":\n return { rich_text: [{ text: { content: String(value) } }] };\n\n case \"number\":\n return { number: typeof value === \"number\" ? value : Number(value) };\n\n case \"select\":\n return { select: { name: String(value) } };\n\n case \"multi_select\": {\n const items = Array.isArray(value)\n ? value\n : String(value)\n .split(\",\")\n .map((s) => s.trim());\n return { multi_select: items.map((name: unknown) => ({ name: String(name) })) };\n }\n\n case \"checkbox\":\n return { checkbox: Boolean(value) };\n\n case \"date\": {\n if (typeof value === \"object\" && value !== null && \"start\" in value) {\n const obj = value as { start: string; end?: string | null };\n return { date: { start: obj.start, end: obj.end ?? null } };\n }\n const dateStr = String(value);\n if (DATE_REGEX.test(dateStr)) {\n return { date: { start: dateStr, end: null } };\n }\n return null;\n }\n\n case \"url\":\n return { url: String(value) };\n\n case \"email\":\n return { email: String(value) };\n\n case \"phone_number\":\n return { phone_number: String(value) };\n\n case \"status\":\n return { status: { name: String(value) } };\n\n case \"relation\": {\n const items = Array.isArray(value) ? value : [value];\n const ids: Array<{ id: string }> = [];\n for (const item of items) {\n const str = String(item);\n const match = str.match(WIKILINK_REGEX);\n if (match?.[1] && this.wikilinkResolver) {\n const pageId = this.wikilinkResolver.resolve(match[1]);\n if (pageId) ids.push({ id: pageId });\n } else if (str.match(/^[0-9a-f-]{32,36}$/)) {\n ids.push({ id: str });\n }\n }\n return ids.length > 0 ? { relation: ids } : null;\n }\n\n case \"people\": {\n const users = Array.isArray(value) ? value : [value];\n const peopleArr = users\n .map((u) => {\n const s = String(u);\n if (s.match(/^[0-9a-f-]{32,36}$/)) return { object: \"user\" as const, id: s };\n return null;\n })\n .filter(Boolean);\n return peopleArr.length > 0 ? { people: peopleArr } : null;\n }\n\n case \"files\": {\n const fileList = Array.isArray(value) ? value : [value];\n const filesArr = fileList.map((f) => {\n if (typeof f === \"object\" && f !== null && \"url\" in f) {\n const obj = f as { name?: string; url: string };\n return { type: \"external\", name: obj.name ?? \"file\", external: { url: obj.url } };\n }\n return {\n type: \"external\",\n name: String(f),\n external: { url: String(f) },\n };\n });\n return { files: filesArr };\n }\n\n case \"created_time\":\n case \"last_edited_time\":\n case \"created_by\":\n case \"last_edited_by\":\n case \"formula\":\n case \"rollup\":\n case \"unique_id\":\n case \"verification\":\n return null;\n\n default:\n return { rich_text: [{ text: { content: String(value) } }] };\n }\n }\n\n private inferAndConvert(value: unknown): NotionPropertyValue | null {\n if (typeof value === \"boolean\") {\n return { checkbox: value };\n }\n if (typeof value === \"number\") {\n return { number: value };\n }\n if (Array.isArray(value)) {\n return {\n multi_select: value.map((v) => ({ name: String(v) })),\n };\n }\n if (typeof value === \"string\") {\n if (DATE_REGEX.test(value)) {\n return { date: { start: value, end: null } };\n }\n if (value.startsWith(\"http://\") || value.startsWith(\"https://\")) {\n return { url: value };\n }\n return { rich_text: [{ text: { content: value } }] };\n }\n return null;\n }\n\n private extractValue(prop: { type: string; [k: string]: unknown }): unknown {\n switch (prop.type) {\n case \"rich_text\": {\n const arr = prop.rich_text as Array<{ plain_text: string }> | undefined;\n return arr?.map((t) => t.plain_text).join(\"\") || null;\n }\n case \"number\":\n return prop.number;\n case \"select\": {\n const sel = prop.select as { name: string } | null;\n return sel?.name ?? null;\n }\n case \"multi_select\": {\n const items = prop.multi_select as Array<{ name: string }> | undefined;\n return items?.map((s) => s.name) ?? [];\n }\n case \"checkbox\":\n return prop.checkbox;\n case \"date\": {\n const dateObj = prop.date as { start: string; end?: string | null } | null;\n if (!dateObj) return null;\n if (dateObj.end) return { start: dateObj.start, end: dateObj.end };\n return dateObj.start;\n }\n case \"url\":\n return prop.url;\n case \"email\":\n return prop.email;\n case \"phone_number\":\n return prop.phone_number;\n case \"status\": {\n const status = prop.status as { name: string } | null;\n return status?.name ?? null;\n }\n case \"created_time\":\n return prop.created_time;\n case \"last_edited_time\":\n return prop.last_edited_time;\n case \"people\": {\n const people = prop.people as Array<{ name?: string; id: string }> | undefined;\n return people?.map((p) => p.name ?? p.id) ?? [];\n }\n case \"files\": {\n const files = prop.files as\n | Array<{\n name: string;\n type: string;\n file?: { url: string };\n external?: { url: string };\n }>\n | undefined;\n return (\n files?.map((f) => ({\n name: f.name,\n url: f.type === \"file\" ? f.file?.url : f.external?.url,\n })) ?? []\n );\n }\n case \"formula\": {\n const formula = prop.formula as { type: string; [k: string]: unknown } | undefined;\n if (!formula) return null;\n return formula[formula.type];\n }\n case \"relation\": {\n const rel = prop.relation as Array<{ id: string }> | undefined;\n if (!rel || rel.length === 0) return [];\n return rel.map((r) => {\n if (this.wikilinkResolver) {\n const title = this.wikilinkResolver.resolvePageId(r.id);\n if (title) return `[[${title}]]`;\n }\n return r.id;\n });\n }\n case \"rollup\": {\n const rollup = prop.rollup as { type: string; [k: string]: unknown } | undefined;\n if (!rollup) return null;\n if (rollup.type === \"array\") {\n const arr = rollup.array as Array<{ type: string; [k: string]: unknown }>;\n return arr.map((item) => this.extractValue(item));\n }\n return rollup[rollup.type] ?? null;\n }\n case \"unique_id\": {\n const uid = prop.unique_id as { prefix?: string; number: number } | undefined;\n if (!uid) return null;\n return uid.prefix ? `${uid.prefix}-${uid.number}` : String(uid.number);\n }\n case \"created_by\":\n case \"last_edited_by\": {\n const user = prop[prop.type] as { name?: string; id: string } | undefined;\n return user?.name ?? user?.id ?? null;\n }\n case \"verification\": {\n const v = prop.verification as { state: string } | undefined;\n return v?.state ?? null;\n }\n default:\n return null;\n }\n }\n}\n","import { Client } from \"@notionhq/client\";\nimport { Sema } from \"async-sema\";\nimport type {\n BlockObjectResponse,\n PageObjectResponse,\n PartialBlockObjectResponse,\n PageMarkdownResponse,\n} from \"@notionhq/client/build/src/api-endpoints.js\";\nimport type {\n DataSourceViewObjectResponse,\n ListDatabaseViewsResponse,\n} from \"@notionhq/client/build/src/api-endpoints/views.js\";\nimport { PropertyMapper } from \"./property-mapper.js\";\nimport type { ViewConfig, DatabaseViewsConfig, PageCover, PageIcon } from \"../types/view.js\";\n\nexport interface NotionClientOptions {\n readonly token: string;\n readonly concurrency?: number;\n readonly timeoutMs?: number;\n}\n\nexport class NotionClient {\n private readonly client: Client;\n private readonly sema: Sema;\n private readonly token: string;\n private readonly propertyMapper = new PropertyMapper();\n\n constructor(options: NotionClientOptions) {\n this.client = new Client({\n auth: options.token,\n timeoutMs: options.timeoutMs ?? 30000,\n });\n this.token = options.token;\n this.sema = new Sema(options.concurrency ?? 3);\n }\n\n getInternalClient(): Client {\n return this.client;\n }\n\n // ─── Page CRUD ───\n\n async getPage(pageId: string): Promise<PageObjectResponse> {\n return this.withRateLimit(\n () => this.client.pages.retrieve({ page_id: pageId }) as Promise<PageObjectResponse>,\n );\n }\n\n async createPage(params: {\n parentId: string;\n parentType: \"page\" | \"database\";\n title: string;\n properties?: Record<string, unknown>;\n children?: BlockObjectResponse[];\n }): Promise<PageObjectResponse> {\n const parent =\n params.parentType === \"database\"\n ? { database_id: params.parentId }\n : { page_id: params.parentId };\n\n const properties =\n params.parentType === \"page\"\n ? { title: { title: [{ text: { content: params.title } }] } }\n : ((params.properties as never) ?? {\n title: { title: [{ text: { content: params.title } }] },\n });\n\n return this.withRateLimit(\n () =>\n this.client.pages.create({\n parent,\n properties: properties as never,\n children: params.children as never,\n }) as Promise<PageObjectResponse>,\n );\n }\n\n async createPageWithMarkdown(params: {\n parentId: string;\n parentType: \"page\" | \"database\";\n title: string;\n markdown: string;\n properties?: Record<string, unknown>;\n }): Promise<PageObjectResponse> {\n const parent =\n params.parentType === \"database\"\n ? { database_id: params.parentId }\n : { page_id: params.parentId };\n\n const properties =\n params.parentType === \"page\"\n ? { title: { title: [{ text: { content: params.title } }] } }\n : ((params.properties as never) ?? {\n title: { title: [{ text: { content: params.title } }] },\n });\n\n return this.withRateLimit(\n () =>\n this.client.pages.create({\n parent,\n properties: properties as never,\n markdown: params.markdown,\n }) as Promise<PageObjectResponse>,\n );\n }\n\n async updatePageProperties(\n pageId: string,\n properties: Record<string, unknown>,\n ): Promise<PageObjectResponse> {\n return this.withRateLimit(\n () =>\n this.client.pages.update({\n page_id: pageId,\n properties: properties as never,\n }) as Promise<PageObjectResponse>,\n );\n }\n\n // ─── Markdown API ───\n\n async getPageMarkdown(pageId: string): Promise<PageMarkdownResponse> {\n return this.withRateLimit(() => this.client.pages.retrieveMarkdown({ page_id: pageId }));\n }\n\n async replacePageMarkdown(pageId: string, markdown: string): Promise<PageMarkdownResponse> {\n return this.withRateLimit(() =>\n this.client.pages.updateMarkdown({\n page_id: pageId,\n type: \"replace_content\",\n replace_content: {\n new_str: markdown,\n allow_deleting_content: true,\n },\n }),\n );\n }\n\n async updatePageMarkdownPartial(\n pageId: string,\n patches: Array<{ oldStr: string; newStr: string; replaceAll?: boolean }>,\n ): Promise<PageMarkdownResponse> {\n return this.withRateLimit(() =>\n this.client.pages.updateMarkdown({\n page_id: pageId,\n type: \"update_content\",\n update_content: {\n content_updates: patches.map((p) => ({\n old_str: p.oldStr,\n new_str: p.newStr,\n replace_all_matches: p.replaceAll ?? false,\n })),\n allow_deleting_content: true,\n },\n }),\n );\n }\n\n // ─── Page Move ───\n\n async movePage(\n pageId: string,\n newParentId: string,\n newParentType: \"page\" | \"database\",\n ): Promise<PageObjectResponse> {\n const parent =\n newParentType === \"database\" ? { database_id: newParentId } : { page_id: newParentId };\n return this.withRateLimit(\n () =>\n this.client.pages.update({\n page_id: pageId,\n parent,\n } as never) as Promise<PageObjectResponse>,\n );\n }\n\n // ─── Database / DataSource ───\n\n private async fetchDatabaseLegacy(databaseId: string): Promise<Record<string, unknown>> {\n const cleanId = databaseId.replace(/-/g, \"\");\n const formatted = `${cleanId.slice(0, 8)}-${cleanId.slice(8, 12)}-${cleanId.slice(12, 16)}-${cleanId.slice(16, 20)}-${cleanId.slice(20)}`;\n const resp = await this.withRateLimit(async () => {\n const r = await fetch(`https://api.notion.com/v1/databases/${formatted}`, {\n headers: {\n Authorization: `Bearer ${this.token}`,\n \"Notion-Version\": \"2022-06-28\",\n \"Content-Type\": \"application/json\",\n },\n });\n if (!r.ok) throw new Error(`Database fetch failed: ${r.status}`);\n return (await r.json()) as Record<string, unknown>;\n });\n return resp;\n }\n\n async getDatabaseTitle(databaseId: string): Promise<string> {\n const db = await this.fetchDatabaseLegacy(databaseId);\n const titleArr = db.title as Array<{ plain_text: string }> | undefined;\n return titleArr?.[0]?.plain_text ?? \"\";\n }\n\n async getDatabaseSchema(\n databaseId: string,\n ): Promise<Record<string, { id: string; type: string }>> {\n const db = await this.fetchDatabaseLegacy(databaseId);\n const properties = db.properties as Record<string, { id: string; type: string }> | undefined;\n if (!properties) return {};\n const schema: Record<string, { id: string; type: string }> = {};\n for (const [name, prop] of Object.entries(properties)) {\n schema[name] = { id: prop.id, type: prop.type };\n }\n return schema;\n }\n\n async queryDatabase(\n databaseId: string,\n options?: { startCursor?: string; pageSize?: number; filter?: unknown },\n ): Promise<{ results: PageObjectResponse[]; nextCursor: string | null }> {\n const dsId = await this.getDataSourceId(databaseId);\n const response = await this.withRateLimit(() =>\n this.client.dataSources.query({\n data_source_id: dsId,\n start_cursor: options?.startCursor,\n page_size: options?.pageSize ?? 100,\n filter: options?.filter as never,\n }),\n );\n return {\n results: response.results as PageObjectResponse[],\n nextCursor: response.next_cursor,\n };\n }\n\n async queryAllDatabasePages(databaseId: string, filter?: unknown): Promise<PageObjectResponse[]> {\n const all: PageObjectResponse[] = [];\n let cursor: string | undefined;\n\n do {\n const response = await this.queryDatabase(databaseId, {\n startCursor: cursor,\n pageSize: 100,\n filter,\n });\n all.push(...response.results);\n cursor = response.nextCursor ?? undefined;\n } while (cursor);\n\n return all;\n }\n\n async getDataSourceId(databaseId: string): Promise<string> {\n const db = await this.withRateLimit(() =>\n this.client.databases.retrieve({ database_id: databaseId }),\n );\n const dataSources = (db as unknown as { data_sources?: Array<{ id: string }> }).data_sources;\n return dataSources?.[0]?.id ?? databaseId;\n }\n\n async archivePage(pageId: string): Promise<void> {\n await this.withRateLimit(() => this.client.pages.update({ page_id: pageId, archived: true }));\n }\n\n async getFileBlockUrl(blockId: string): Promise<string | null> {\n try {\n const block = await this.withRateLimit(() =>\n this.client.blocks.retrieve({ block_id: blockId }),\n );\n const b = block as unknown as {\n type: string;\n file?: { file?: { url: string }; external?: { url: string } };\n pdf?: { file?: { url: string }; external?: { url: string } };\n video?: { file?: { url: string }; external?: { url: string } };\n audio?: { file?: { url: string }; external?: { url: string } };\n image?: { file?: { url: string }; external?: { url: string } };\n };\n const media = b.file ?? b.pdf ?? b.video ?? b.audio ?? b.image;\n return media?.file?.url ?? media?.external?.url ?? null;\n } catch {\n return null;\n }\n }\n\n async getBlock(blockId: string): Promise<BlockObjectResponse> {\n return this.withRateLimit(() =>\n this.client.blocks.retrieve({ block_id: blockId }),\n ) as Promise<BlockObjectResponse>;\n }\n\n // ─── Block CRUD ───\n\n async listChildren(\n blockId: string,\n options?: { startCursor?: string; pageSize?: number },\n ): Promise<{\n results: (BlockObjectResponse | PartialBlockObjectResponse)[];\n nextCursor: string | null;\n }> {\n const response = await this.withRateLimit(() =>\n this.client.blocks.children.list({\n block_id: blockId,\n start_cursor: options?.startCursor,\n page_size: options?.pageSize ?? 100,\n }),\n );\n return {\n results: response.results,\n nextCursor: response.next_cursor,\n };\n }\n\n async fetchAllChildren(blockId: string): Promise<BlockObjectResponse[]> {\n const blocks: BlockObjectResponse[] = [];\n let cursor: string | undefined;\n\n do {\n const response = await this.listChildren(blockId, { startCursor: cursor });\n blocks.push(...response.results.filter((b): b is BlockObjectResponse => \"type\" in b));\n cursor = response.nextCursor ?? undefined;\n } while (cursor);\n\n return blocks;\n }\n\n private static readonly CONTAINER_BLOCK_TYPES = new Set([\n \"column_list\",\n \"column\",\n \"callout\",\n \"toggle\",\n \"quote\",\n ]);\n\n async fetchAllChildrenDeep(blockId: string): Promise<BlockObjectResponse[]> {\n const directChildren = await this.fetchAllChildren(blockId);\n const allBlocks: BlockObjectResponse[] = [...directChildren];\n\n const toExpand = directChildren.filter((b) => {\n if (!b.has_children) return false;\n if (b.type === \"child_page\" || b.type === \"child_database\") return false;\n if (NotionClient.CONTAINER_BLOCK_TYPES.has(b.type)) return true;\n if (b.type === \"synced_block\") {\n const sb = b as unknown as { synced_block: { synced_from: { block_id: string } | null } };\n return sb.synced_block?.synced_from === null;\n }\n return true;\n });\n\n for (const container of toExpand) {\n try {\n const nested = await this.fetchAllChildrenDeep(container.id);\n allBlocks.push(...nested);\n } catch {\n // 접근 권한 없는 블록 무시\n }\n }\n\n return allBlocks;\n }\n\n async appendChildren(blockId: string, children: unknown[]): Promise<void> {\n const BATCH_SIZE = 100;\n for (let i = 0; i < children.length; i += BATCH_SIZE) {\n const batch = children.slice(i, i + BATCH_SIZE);\n await this.withRateLimit(() =>\n this.client.blocks.children.append({\n block_id: blockId,\n children: batch as never,\n }),\n );\n }\n }\n\n async deleteBlock(blockId: string): Promise<void> {\n await this.withRateLimit(() => this.client.blocks.delete({ block_id: blockId }));\n }\n\n // ─── File Upload ───\n\n async uploadFile(fileData: Blob, filename: string, contentType: string): Promise<string> {\n const upload = await this.withRateLimit(() =>\n this.client.fileUploads.create({ filename, content_type: contentType }),\n );\n\n const fileUploadId = (upload as unknown as { id: string }).id;\n\n const sendResult = await this.withRateLimit(() =>\n this.client.fileUploads.send({\n file_upload_id: fileUploadId,\n file: { data: fileData, filename },\n }),\n );\n\n const status = (sendResult as unknown as { status: string }).status;\n if (status === \"pending\") {\n await this.withRateLimit(() =>\n this.client.fileUploads.complete({ file_upload_id: fileUploadId }),\n );\n }\n\n return fileUploadId;\n }\n\n // ─── Search & Navigation ───\n\n async search(params: {\n query?: string;\n filter?: { property: \"object\"; value: \"page\" | \"data_source\" };\n startCursor?: string;\n pageSize?: number;\n }): Promise<{ results: PageObjectResponse[]; nextCursor: string | null }> {\n const response = await this.withRateLimit(() =>\n this.client.search({\n query: params.query,\n filter: params.filter,\n start_cursor: params.startCursor,\n page_size: params.pageSize ?? 100,\n }),\n );\n return {\n results: response.results as PageObjectResponse[],\n nextCursor: response.next_cursor,\n };\n }\n\n async getChildPages(parentId: string): Promise<PageObjectResponse[]> {\n const blocks = await this.fetchAllChildrenDeep(parentId);\n const childPageBlocks = blocks.filter((b) => b.type === \"child_page\");\n\n if (childPageBlocks.length === 0) return [];\n\n const pages = await Promise.all(childPageBlocks.map((b) => this.getPage(b.id)));\n return pages;\n }\n\n async getChildDatabaseIds(parentId: string): Promise<string[]> {\n const blocks = await this.fetchAllChildrenDeep(parentId);\n return blocks.filter((b) => b.type === \"child_database\").map((b) => b.id);\n }\n\n async getChildPagesRecursive(parentId: string): Promise<PageObjectResponse[]> {\n const all: PageObjectResponse[] = [];\n let currentLevel: string[] = [parentId];\n\n while (currentLevel.length > 0) {\n const nextLevel: string[] = [];\n\n for (const id of currentLevel) {\n const children = await this.getChildPages(id);\n for (const child of children) {\n all.push(child);\n nextLevel.push(child.id);\n }\n }\n\n currentLevel = nextLevel;\n }\n\n return all;\n }\n\n // ─── Views API ───\n\n async listDatabaseViews(databaseId: string): Promise<ViewConfig[]> {\n const allViews: ViewConfig[] = [];\n let cursor: string | undefined;\n\n do {\n const response = await this.withRateLimit(() =>\n this.client.views.list({\n database_id: databaseId,\n start_cursor: cursor,\n page_size: 100,\n }),\n );\n\n const viewRefs = (response as ListDatabaseViewsResponse).results;\n for (const ref of viewRefs) {\n try {\n const detail = await this.getView(ref.id as string);\n if (detail) allViews.push(detail);\n } catch {\n // 뷰 상세 조회 실패 시 스킵\n }\n }\n\n cursor = (response as ListDatabaseViewsResponse).next_cursor as string | undefined;\n } while (cursor);\n\n return allViews;\n }\n\n async getView(viewId: string): Promise<ViewConfig | null> {\n const view = await this.withRateLimit(() => this.client.views.retrieve({ view_id: viewId }));\n\n const v = view as DataSourceViewObjectResponse;\n if (!v.type) return null;\n\n return parseViewResponse(v);\n }\n\n async getDatabaseViewsConfig(databaseId: string): Promise<DatabaseViewsConfig> {\n const views = await this.listDatabaseViews(databaseId);\n return {\n databaseId,\n lastSynced: new Date().toISOString(),\n views,\n };\n }\n\n // ─── Cover / Icon Extraction ───\n\n extractCover(page: PageObjectResponse): PageCover | null {\n const raw = page as unknown as {\n cover?: {\n type: string;\n file?: { url: string; expiry_time?: string };\n external?: { url: string };\n };\n };\n if (!raw.cover) return null;\n\n if (raw.cover.type === \"file\" && raw.cover.file) {\n return {\n type: \"file\",\n url: raw.cover.file.url,\n expiryTime: raw.cover.file.expiry_time,\n };\n }\n if (raw.cover.type === \"external\" && raw.cover.external) {\n return { type: \"external\", url: raw.cover.external.url };\n }\n return null;\n }\n\n extractIcon(page: PageObjectResponse): PageIcon | null {\n const raw = page as unknown as {\n icon?: {\n type: string;\n emoji?: string;\n external?: { url: string };\n file?: { url: string; expiry_time?: string };\n icon?: { name: string; color?: string };\n };\n };\n if (!raw.icon) return null;\n\n switch (raw.icon.type) {\n case \"emoji\":\n return { type: \"emoji\", value: raw.icon.emoji! };\n case \"external\":\n return { type: \"external\", value: raw.icon.external!.url };\n case \"file\":\n return { type: \"file\", value: raw.icon.file!.url };\n case \"icon\":\n return { type: \"icon\", value: raw.icon.icon!.name, color: raw.icon.icon!.color };\n default:\n return null;\n }\n }\n\n // ─── Property Extraction ───\n\n extractTitle(page: PageObjectResponse): string {\n const props = page.properties as Record<\n string,\n { type: string; title?: Array<{ plain_text?: string }> }\n >;\n for (const prop of Object.values(props)) {\n if (prop.type === \"title\" && prop.title) {\n const joined = prop.title.map((t) => t.plain_text ?? \"\").join(\"\");\n if (joined) return joined;\n }\n }\n return \"제목 없음\";\n }\n\n extractProperties(page: PageObjectResponse): Record<string, unknown> {\n return this.propertyMapper.fromNotionProperties(page.properties as Record<string, unknown>);\n }\n\n // ─── Internal ───\n\n private lastRequestTime = 0;\n private readonly minRequestInterval = 350;\n\n private async withRateLimit<T>(fn: () => Promise<T>): Promise<T> {\n await this.sema.acquire();\n try {\n const now = Date.now();\n const elapsed = now - this.lastRequestTime;\n if (elapsed < this.minRequestInterval) {\n await sleep(this.minRequestInterval - elapsed);\n }\n this.lastRequestTime = Date.now();\n return await this.executeWithRetry(fn);\n } finally {\n this.sema.release();\n }\n }\n\n private async executeWithRetry<T>(fn: () => Promise<T>, attempt: number = 0): Promise<T> {\n try {\n return await fn();\n } catch (error: unknown) {\n if (isRetryable(error) && attempt < 5) {\n const baseDelay = extractRetryAfter(error) ?? 1000 * Math.pow(2, attempt);\n const jitter = baseDelay * (0.5 + Math.random() * 0.5);\n await sleep(jitter);\n return this.executeWithRetry(fn, attempt + 1);\n }\n throw error;\n }\n }\n}\n\nfunction isRetryable(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false;\n const code = (error as { code?: string }).code;\n if (code === \"notionhq_client_request_timeout\" || code === \"ECONNRESET\" || code === \"ETIMEDOUT\") {\n return true;\n }\n if (!(\"status\" in error)) return false;\n const status = (error as { status: number }).status;\n return status === 429 || status === 502 || status === 503 || status === 504;\n}\n\nfunction extractRetryAfter(error: unknown): number | null {\n if (typeof error === \"object\" && error !== null && \"headers\" in error) {\n const headers = (error as { headers: Record<string, string> }).headers;\n const retryAfter = headers?.[\"retry-after\"];\n if (retryAfter) return Number(retryAfter) * 1000;\n }\n return null;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction parseViewResponse(v: DataSourceViewObjectResponse): ViewConfig {\n const config: ViewConfig = {\n id: v.id as string,\n name: v.name,\n type: v.type,\n dataSourceId: v.data_source_id,\n filter: v.filter,\n sorts: v.sorts?.map((s) => {\n if (\"property\" in s) {\n return { property: s.property, direction: s.direction };\n }\n return { timestamp: s.timestamp, direction: s.direction };\n }),\n ...extractViewTypeConfig(v.configuration),\n };\n return config;\n}\n\ntype MutableViewConfig = {\n -readonly [K in keyof ViewConfig]: ViewConfig[K];\n};\n\nfunction extractViewTypeConfig(\n cfg: DataSourceViewObjectResponse[\"configuration\"],\n): Partial<MutableViewConfig> {\n if (!cfg) return {};\n\n const result: Partial<MutableViewConfig> = {};\n\n if (\"properties\" in cfg && cfg.properties) {\n result.properties = cfg.properties.map((p) => ({\n propertyId: p.property_id,\n propertyName: p.property_name,\n visible: p.visible,\n width: p.width,\n wrap: p.wrap,\n }));\n }\n\n if (\"group_by\" in cfg && cfg.group_by) {\n const gb = cfg.group_by;\n result.groupBy = {\n type: gb.type,\n propertyId: gb.property_id,\n propertyName: \"property_name\" in gb ? (gb.property_name as string) : undefined,\n sort:\n \"sort\" in gb && gb.sort\n ? ((gb.sort as { type: string }).type as \"manual\" | \"ascending\" | \"descending\")\n : undefined,\n hideEmptyGroups: \"hide_empty_groups\" in gb ? (gb.hide_empty_groups as boolean) : undefined,\n };\n }\n\n if (\"cover\" in cfg && cfg.cover) {\n result.cover = {\n type: cfg.cover.type,\n propertyId: cfg.cover.property_id,\n };\n }\n\n if (\"cover_size\" in cfg) result.coverSize = cfg.cover_size;\n if (\"cover_aspect\" in cfg) result.coverAspect = cfg.cover_aspect;\n\n if (\"date_property_id\" in cfg) {\n result.datePropertyId = cfg.date_property_id;\n result.datePropertyName = cfg.date_property_name;\n }\n\n if (\"view_range\" in cfg) result.viewRange = cfg.view_range;\n\n return result;\n}\n","const VALID_COLORS = new Set([\n \"default\",\n \"gray\",\n \"brown\",\n \"orange\",\n \"yellow\",\n \"green\",\n \"blue\",\n \"purple\",\n \"pink\",\n \"red\",\n \"gray_background\",\n \"brown_background\",\n \"orange_background\",\n \"yellow_background\",\n \"green_background\",\n \"blue_background\",\n \"purple_background\",\n \"pink_background\",\n \"red_background\",\n]);\n\ntype NotionColor = string;\n\nfunction safeColor(color: string): NotionColor {\n return VALID_COLORS.has(color) ? color : \"default\";\n}\n\nexport interface RichTextSegment {\n content: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n code?: boolean;\n color?: string;\n link?: string;\n}\n\nexport interface NotionRichText {\n type: \"text\";\n text: { content: string; link?: { url: string } | null };\n annotations: {\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strikethrough: boolean;\n code: boolean;\n color: string;\n };\n}\n\nexport interface NotionEquationRichText {\n type: \"equation\";\n equation: { expression: string };\n}\n\nexport interface NotionMentionRichText {\n type: \"mention\";\n mention:\n | { type: \"page\"; page: { id: string } }\n | { type: \"date\"; date: { start: string; end?: string } }\n | { type: \"user\"; user: { id: string } }\n | { type: \"database\"; database: { id: string } };\n}\n\nexport type RichTextItem = NotionRichText | NotionEquationRichText | NotionMentionRichText;\n\nexport interface NotionBlock {\n object?: \"block\";\n type: string;\n [key: string]: unknown;\n}\n\nexport class NotionBlockBuilder {\n // ─── Rich Text ──────────────────────────────────────────\n\n static richText(content: string, options?: Partial<RichTextSegment>): NotionRichText[] {\n const textObj: { content: string; link?: { url: string } | null } = { content };\n if (options?.link) {\n textObj.link = { url: options.link };\n }\n return [\n {\n type: \"text\",\n text: textObj,\n annotations: {\n bold: options?.bold ?? false,\n italic: options?.italic ?? false,\n underline: options?.underline ?? false,\n strikethrough: options?.strikethrough ?? false,\n code: options?.code ?? false,\n color: safeColor(options?.color ?? \"default\"),\n },\n },\n ];\n }\n\n static richTextArray(segments: RichTextSegment[]): NotionRichText[] {\n return segments.map((seg) => {\n const textObj: { content: string; link?: { url: string } | null } = {\n content: seg.content,\n };\n if (seg.link) {\n textObj.link = { url: seg.link };\n }\n return {\n type: \"text\" as const,\n text: textObj,\n annotations: {\n bold: seg.bold ?? false,\n italic: seg.italic ?? false,\n underline: seg.underline ?? false,\n strikethrough: seg.strikethrough ?? false,\n code: seg.code ?? false,\n color: safeColor(seg.color ?? \"default\"),\n },\n };\n });\n }\n\n static richTextEquation(expression: string): NotionEquationRichText[] {\n return [{ type: \"equation\", equation: { expression } }];\n }\n\n static richTextMentionPage(pageId: string): NotionMentionRichText[] {\n return [{ type: \"mention\", mention: { type: \"page\", page: { id: pageId } } }];\n }\n\n static richTextMentionDate(start: string, end?: string): NotionMentionRichText[] {\n const date: { start: string; end?: string } = { start };\n if (end) date.end = end;\n return [{ type: \"mention\", mention: { type: \"date\", date } }];\n }\n\n // ─── Basic Blocks ───────────────────────────────────────\n\n static paragraph(richText: RichTextItem[], color?: string): NotionBlock {\n return {\n object: \"block\",\n type: \"paragraph\",\n paragraph: { rich_text: richText, color: safeColor(color ?? \"default\") },\n };\n }\n\n static heading(\n level: 1 | 2 | 3,\n richText: RichTextItem[],\n options?: { color?: string; isToggleable?: boolean; children?: NotionBlock[] },\n ): NotionBlock {\n const key = `heading_${level}`;\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(options?.color ?? \"default\"),\n is_toggleable: options?.isToggleable ?? false,\n };\n if (options?.isToggleable && options?.children) {\n data.children = options.children;\n }\n return { object: \"block\", type: key, [key]: data };\n }\n\n static callout(\n richText: RichTextItem[],\n icon?: string,\n options?: { color?: string; children?: NotionBlock[] },\n ): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n icon: { type: \"emoji\", emoji: icon ?? \"\\u{1F4CC}\" },\n color: safeColor(options?.color ?? \"default\"),\n };\n if (options?.children) {\n data.children = options.children;\n }\n return { object: \"block\", type: \"callout\", callout: data };\n }\n\n static toggle(richText: RichTextItem[], children?: NotionBlock[], color?: string): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(color ?? \"default\"),\n };\n if (children) {\n data.children = children;\n }\n return { object: \"block\", type: \"toggle\", toggle: data };\n }\n\n static bulletedListItem(\n richText: RichTextItem[],\n children?: NotionBlock[],\n color?: string,\n ): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(color ?? \"default\"),\n };\n if (children) {\n data.children = children;\n }\n return {\n object: \"block\",\n type: \"bulleted_list_item\",\n bulleted_list_item: data,\n };\n }\n\n static numberedListItem(\n richText: RichTextItem[],\n children?: NotionBlock[],\n color?: string,\n ): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(color ?? \"default\"),\n };\n if (children) {\n data.children = children;\n }\n return {\n object: \"block\",\n type: \"numbered_list_item\",\n numbered_list_item: data,\n };\n }\n\n static toDo(richText: RichTextItem[], checked?: boolean, color?: string): NotionBlock {\n return {\n object: \"block\",\n type: \"to_do\",\n to_do: {\n rich_text: richText,\n checked: checked ?? false,\n color: safeColor(color ?? \"default\"),\n },\n };\n }\n\n static quote(richText: RichTextItem[], children?: NotionBlock[], color?: string): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(color ?? \"default\"),\n };\n if (children) {\n data.children = children;\n }\n return { object: \"block\", type: \"quote\", quote: data };\n }\n\n static divider(): NotionBlock {\n return { object: \"block\", type: \"divider\", divider: {} };\n }\n\n static code(code: string, language?: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: NotionBlockBuilder.richText(code),\n language: language ?? \"plain text\",\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"code\", code: data };\n }\n\n static equationBlock(expression: string): NotionBlock {\n return {\n object: \"block\",\n type: \"equation\",\n equation: { expression },\n };\n }\n\n // ─── Media Blocks ───────────────────────────────────────\n\n static image(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"image\", image: data };\n }\n\n static bookmark(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = { url };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"bookmark\", bookmark: data };\n }\n\n static video(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"video\", video: data };\n }\n\n static audio(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"audio\", audio: data };\n }\n\n static fileBlock(url: string, name?: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (name) data.name = name;\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"file\", file: data };\n }\n\n static pdf(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"pdf\", pdf: data };\n }\n\n static embed(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = { url };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"embed\", embed: data };\n }\n\n // ─── Advanced Blocks ────────────────────────────────────\n\n static tableOfContents(color?: string): NotionBlock {\n return {\n object: \"block\",\n type: \"table_of_contents\",\n table_of_contents: { color: safeColor(color ?? \"default\") },\n };\n }\n\n static breadcrumb(): NotionBlock {\n return { object: \"block\", type: \"breadcrumb\", breadcrumb: {} };\n }\n\n static columnList(columns: NotionBlock[][]): NotionBlock {\n const children = columns.map((colBlocks) => ({\n object: \"block\" as const,\n type: \"column\" as const,\n column: { children: colBlocks },\n }));\n return {\n object: \"block\",\n type: \"column_list\",\n column_list: { children },\n };\n }\n\n static syncedBlockOriginal(children: NotionBlock[]): NotionBlock {\n return {\n object: \"block\",\n type: \"synced_block\",\n synced_block: { synced_from: null, children },\n };\n }\n\n static syncedBlockDuplicate(originalBlockId: string): NotionBlock {\n return {\n object: \"block\",\n type: \"synced_block\",\n synced_block: { synced_from: { block_id: originalBlockId } },\n };\n }\n\n static linkToPage(pageId: string): NotionBlock {\n return {\n object: \"block\",\n type: \"link_to_page\",\n link_to_page: { type: \"page_id\", page_id: pageId },\n };\n }\n\n static table(rows: string[][], hasColumnHeader?: boolean, hasRowHeader?: boolean): NotionBlock {\n if (rows.length === 0) rows = [[\"\", \"\"]];\n const width = rows[0]!.length;\n const tableRows = rows.map((row) => {\n const cells = row.map((cell) => NotionBlockBuilder.richText(cell));\n while (cells.length < width) {\n cells.push(NotionBlockBuilder.richText(\"\"));\n }\n return {\n object: \"block\" as const,\n type: \"table_row\" as const,\n table_row: { cells },\n };\n });\n return {\n object: \"block\",\n type: \"table\",\n table: {\n table_width: width,\n has_column_header: hasColumnHeader ?? true,\n has_row_header: hasRowHeader ?? false,\n children: tableRows,\n },\n };\n }\n}\n","import { createHash } from \"node:crypto\";\n\nexport function computeHash(content: string): string {\n return createHash(\"sha256\").update(content, \"utf-8\").digest(\"hex\");\n}\n\nexport function computeBufferHash(buffer: Buffer): string {\n return createHash(\"sha256\").update(buffer).digest(\"hex\");\n}\n","import type { LocalChange } from \"../types/sync.js\";\nimport type { StateDB } from \"../state/state-db.js\";\nimport { computeHash } from \"../utils/hash.js\";\n\nexport interface FileInfo {\n readonly path: string;\n readonly content: string;\n readonly mtime: string;\n}\n\nexport class ChangeDetector {\n constructor(private readonly stateDb: StateDB) {}\n\n detectLocalChanges(currentFiles: FileInfo[]): LocalChange[] {\n const changes: LocalChange[] = [];\n const existingPaths = new Set<string>();\n\n for (const file of currentFiles) {\n existingPaths.add(file.path);\n const record = this.stateDb.getByPath(file.path);\n\n if (!record) {\n changes.push({\n path: file.path,\n type: \"created\",\n currentHash: computeHash(file.content),\n previousHash: null,\n });\n continue;\n }\n\n if (record.localLastModified && file.mtime === record.localLastModified) {\n continue;\n }\n\n const currentHash = computeHash(file.content);\n if (record.contentHash !== currentHash) {\n changes.push({\n path: file.path,\n type: \"modified\",\n currentHash,\n previousHash: record.contentHash,\n });\n }\n }\n\n const syncedRecords = this.stateDb.getByStatus(\"synced\");\n for (const record of syncedRecords) {\n if (!existingPaths.has(record.obsidianPath)) {\n if (record.fileType === \"folder-note\" || record.fileType === \"folder-only\") {\n if (!record.obsidianPath.endsWith(\".md\")) continue;\n }\n changes.push({\n path: record.obsidianPath,\n type: \"deleted\",\n currentHash: \"\",\n previousHash: record.contentHash,\n });\n }\n }\n\n return this.detectMoves(changes);\n }\n\n private detectMoves(changes: LocalChange[]): LocalChange[] {\n const result: LocalChange[] = [];\n const created = changes.filter((c) => c.type === \"created\");\n const deleted = changes.filter((c) => c.type === \"deleted\");\n const others = changes.filter((c) => c.type !== \"created\" && c.type !== \"deleted\");\n\n const matchedCreated = new Set<string>();\n const matchedDeleted = new Set<string>();\n\n for (const del of deleted) {\n const match = created.find(\n (c) => c.currentHash === del.previousHash && !matchedCreated.has(c.path),\n );\n if (match) {\n matchedCreated.add(match.path);\n matchedDeleted.add(del.path);\n result.push({\n path: match.path,\n type: \"moved\",\n currentHash: match.currentHash,\n previousHash: del.previousHash,\n movedFrom: del.path,\n });\n }\n }\n\n for (const c of created) {\n if (!matchedCreated.has(c.path)) result.push(c);\n }\n for (const d of deleted) {\n if (!matchedDeleted.has(d.path)) result.push(d);\n }\n result.push(...others);\n\n return result;\n }\n}\n","export interface Logger {\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n debug(message: string, ...args: unknown[]): void;\n}\n\nconst consoleLogger: Logger = {\n warn: (msg, ...args) => console.warn(msg, ...args),\n error: (msg, ...args) => console.error(msg, ...args),\n info: (msg, ...args) => console.info(msg, ...args),\n debug: () => {},\n};\n\nlet currentLogger: Logger = consoleLogger;\n\nexport function setLogger(logger: Logger): void {\n currentLogger = logger;\n}\n\nexport function getLogger(): Logger {\n return currentLogger;\n}\n","import type {\n ConversionContext,\n ConversionPath,\n ConversionResult,\n Processor,\n ProcessorInput,\n ProcessorMetadata,\n} from \"../types/convert.js\";\nimport { getLogger } from \"../utils/logger.js\";\n\nexport class ConversionPipeline {\n private readonly preProcessors: Processor[] = [];\n private readonly postProcessors: Processor[] = [];\n\n registerPreProcessor(processor: Processor): void {\n this.preProcessors.push(processor);\n this.preProcessors.sort((a, b) => a.order - b.order);\n }\n\n registerPostProcessor(processor: Processor): void {\n this.postProcessors.push(processor);\n this.postProcessors.sort((a, b) => a.order - b.order);\n }\n\n selectPath(content: string): ConversionPath {\n const hasInlineDb = /%% im-nobsidian:inline-db/.test(content);\n const hasColumnLayout = />\\s*\\[!col\\]/.test(content);\n const hasToggleHeading = /%% im-nobsidian:toggle-heading/.test(content);\n\n if (hasInlineDb || hasColumnLayout || hasToggleHeading) {\n return \"block-api\";\n }\n\n return \"markdown-api\";\n }\n\n convertToNotion(markdown: string, context: ConversionContext): ConversionResult {\n let input: ProcessorInput = {\n content: markdown,\n metadata: {},\n context,\n };\n\n for (const processor of this.preProcessors) {\n try {\n const output = processor.process(input);\n input = {\n content: output.content,\n metadata: output.metadata,\n context,\n };\n } catch (error) {\n getLogger().warn(`[${processor.name}] Pre-processor failed:`, error);\n }\n }\n\n return {\n content: input.content,\n properties: (input.metadata.properties as Record<string, unknown>) ?? {},\n images: input.metadata.images ?? [],\n preserveMarkers: input.metadata.preserveMarkers ?? [],\n };\n }\n\n convertToMarkdown(\n content: string,\n context: ConversionContext,\n metadata?: ProcessorMetadata,\n ): string {\n let input: ProcessorInput = {\n content,\n metadata: metadata ?? {},\n context,\n };\n\n for (const processor of this.postProcessors) {\n try {\n const output = processor.process(input);\n input = {\n content: output.content,\n metadata: output.metadata,\n context,\n };\n } catch (error) {\n getLogger().warn(`[${processor.name}] Post-processor failed:`, error);\n }\n }\n\n return input.content;\n }\n}\n","import matter from \"gray-matter\";\nimport type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nexport class FrontmatterExtractor implements Processor {\n readonly name = \"FrontmatterExtractor\";\n readonly order = 10;\n\n process(input: ProcessorInput): ProcessorOutput {\n const { data, content } = matter(input.content);\n\n return {\n content: content.trim(),\n metadata: {\n ...input.metadata,\n properties: data,\n },\n };\n }\n}\n","import type {\n Processor,\n ProcessorInput,\n ProcessorOutput,\n WikilinkEntry,\n PreserveMarker,\n} from \"../../types/convert.js\";\n\nconst WIKILINK_REGEX = /(?<!!)\\[\\[([^\\]|]+)(?:\\|([^\\]]+))?\\]\\]/g;\n\nexport type WikilinkResolverFn = (text: string) => WikilinkEntry | null;\n\nexport class WikilinkResolver implements Processor {\n readonly name = \"WikilinkResolver\";\n readonly order = 20;\n\n constructor(private readonly resolve?: WikilinkResolverFn) {}\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"push\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const preserveMarkers: PreserveMarker[] = input.metadata.preserveMarkers\n ? [...input.metadata.preserveMarkers]\n : [];\n\n const resolved = input.content.replace(\n WIKILINK_REGEX,\n (_match, target: string, display?: string) => {\n const label = display ?? target;\n\n if (this.resolve) {\n const entry = this.resolve(target);\n if (entry) {\n return `<mention-page id=\"${entry.notionPageId}\">${label}</mention-page>`;\n }\n }\n\n preserveMarkers.push({\n type: \"wikilink\",\n params: display ? { text: target, display } : { text: target },\n startIndex: 0,\n });\n\n const encodedTarget = encodeURIComponent(target);\n return `[${label}](im-nobsidian://wikilink/${encodedTarget})`;\n },\n );\n\n return {\n content: resolved,\n metadata: { ...input.metadata, preserveMarkers },\n };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst CALLOUT_REGEX = /^> \\[!(\\w+)\\]([+-])?\\s*(.*)?$/gm;\n\nconst CALLOUT_EMOJI_MAP: Record<string, string> = {\n note: \"\\u{1F4DD}\",\n abstract: \"\\u{1F4CB}\",\n summary: \"\\u{1F4CB}\",\n info: \"\\u{2139}\\u{FE0F}\",\n tip: \"\\u{1F4A1}\",\n hint: \"\\u{1F4A1}\",\n success: \"\\u{2705}\",\n check: \"\\u{2705}\",\n question: \"\\u{2753}\",\n faq: \"\\u{2753}\",\n warning: \"\\u{26A0}\\u{FE0F}\",\n caution: \"\\u{26A0}\\u{FE0F}\",\n failure: \"\\u{274C}\",\n fail: \"\\u{274C}\",\n danger: \"\\u{1F525}\",\n error: \"\\u{1F525}\",\n bug: \"\\u{1F41B}\",\n example: \"\\u{1F4CC}\",\n quote: \"\\u{1F4AC}\",\n cite: \"\\u{1F4AC}\",\n};\n\nexport class CalloutTransformer implements Processor {\n readonly name = \"CalloutTransformer\";\n readonly order = 30;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.path === \"markdown-api\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const content = input.content.replace(\n CALLOUT_REGEX,\n (_match, type: string, foldable: string | undefined, title: string | undefined) => {\n const emoji = CALLOUT_EMOJI_MAP[type.toLowerCase()] ?? \"\\u{1F4DD}\";\n const titleText = title?.trim() || type;\n const foldMeta = foldable\n ? `\\n%% im-nobsidian:callout:type=${type}&foldable=${foldable === \"+\" ? \"open\" : \"closed\"} %%`\n : `\\n%% im-nobsidian:callout:type=${type} %%`;\n\n return `> ${emoji} **${titleText}**${foldMeta}`;\n },\n );\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst BLOCK_MATH_REGEX = /\\$\\$([\\s\\S]+?)\\$\\$/g;\nconst INLINE_MATH_REGEX = /(?<![\\\\$])\\$([^\\n$]+?)\\$(?!\\$)/g;\n\nexport class MathNormalizer implements Processor {\n readonly name = \"MathNormalizer\";\n readonly order = 50;\n\n process(input: ProcessorInput): ProcessorOutput {\n let content = input.content;\n\n content = content.replace(BLOCK_MATH_REGEX, (_match, equation: string) => {\n return `$$\\n${equation.trim()}\\n$$`;\n });\n\n content = content.replace(INLINE_MATH_REGEX, (_match, equation: string) => {\n return `$${equation.trim()}$`;\n });\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\nimport type { ImageReference } from \"../../types/convert.js\";\n\nconst OBSIDIAN_EMBED_REGEX = /!\\[\\[([^\\]]+)\\]\\]/g;\nconst MARKDOWN_IMAGE_REGEX = /!\\[([^\\]]*)\\]\\(([^)]+)\\)/g;\n\nconst VIDEO_HOSTS = [\"youtube.com\", \"youtu.be\", \"vimeo.com\"];\n\nexport class EmbedResolver implements Processor {\n readonly name = \"EmbedResolver\";\n readonly order = 60;\n\n process(input: ProcessorInput): ProcessorOutput {\n const images: ImageReference[] = input.metadata.images ? [...input.metadata.images] : [];\n const isPush = input.context.direction === \"push\";\n\n let content = input.content.replace(OBSIDIAN_EMBED_REGEX, (_match, target: string) => {\n if (isImageFile(target)) {\n images.push({ url: target, localPath: target, isExternal: false });\n if (isPush && !isExternalUrl(target)) {\n const fileName = target.split(\"/\").pop() ?? target;\n return `> 📎 ${fileName}\\n> %% im-nobsidian:local-image:${target} %%`;\n }\n return `![${target}](${encodeURI(target)})`;\n }\n const encoded = encodeURIComponent(target);\n return `[${target}](im-nobsidian://embed/${encoded})`;\n });\n\n content = content.replace(MARKDOWN_IMAGE_REGEX, (_match, alt: string, url: string) => {\n if (isVideoUrl(url)) {\n return `%% im-nobsidian:embed:type=video&url=${encodeURIComponent(url)} %%\\n[${alt || \"Video\"}](${url})`;\n }\n if (isExternalUrl(url)) {\n images.push({ url, isExternal: true });\n }\n return `![${alt}](${url})`;\n });\n\n return {\n content,\n metadata: { ...input.metadata, images },\n };\n }\n}\n\nfunction isImageFile(path: string): boolean {\n return /\\.(png|jpg|jpeg|gif|svg|webp|bmp|ico)$/i.test(path);\n}\n\nfunction isVideoUrl(url: string): boolean {\n return VIDEO_HOSTS.some((host) => url.includes(host));\n}\n\nfunction isExternalUrl(url: string): boolean {\n return url.startsWith(\"http://\") || url.startsWith(\"https://\");\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\nimport type { PreserveMarker } from \"../../types/convert.js\";\n\nconst MARKER_REGEX = /%% im-nobsidian:(\\w[\\w-]*):([^\\s]+?) %%/g;\n\nexport class PreserveMarkerCollector implements Processor {\n readonly name = \"PreserveMarkerCollector\";\n readonly order = 70;\n\n process(input: ProcessorInput): ProcessorOutput {\n const markers: PreserveMarker[] = input.metadata.preserveMarkers\n ? [...input.metadata.preserveMarkers]\n : [];\n\n const matches = [...input.content.matchAll(MARKER_REGEX)];\n for (const match of matches) {\n markers.push({\n type: match[1]!,\n params: parseMarkerParams(match[2]!),\n startIndex: match.index!,\n });\n }\n\n return {\n content: input.content,\n metadata: { ...input.metadata, preserveMarkers: markers },\n };\n }\n}\n\nfunction parseMarkerParams(paramString: string): Record<string, string> {\n const params: Record<string, string> = {};\n for (const pair of paramString.split(\"&\")) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx > 0) {\n params[pair.slice(0, eqIdx)] = decodeURIComponent(pair.slice(eqIdx + 1));\n }\n }\n return params;\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst UNSUPPORTED_CALLOUT_REGEX = /> \\[!im-nobsidian-unsupported\\][^\\n]*\\n(?:>[^\\n]*\\n)*/g;\n\nexport class UnsupportedBlockStripper implements Processor {\n readonly name = \"UnsupportedBlockStripper\";\n readonly order = 5;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"push\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const content = input.content.replace(UNSUPPORTED_CALLOUT_REGEX, \"\");\n\n return {\n content: content.replace(/\\n{3,}/g, \"\\n\\n\"),\n metadata: input.metadata,\n };\n }\n}\n","import matter from \"gray-matter\";\nimport type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nexport class PropertiesTableInjector implements Processor {\n readonly name = \"PropertiesTableInjector\";\n readonly order = 15;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"push\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n if (input.context.parentMode === \"database\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const properties = input.metadata.properties as Record<string, unknown> | undefined;\n if (!properties || Object.keys(properties).length === 0) {\n return { content: input.content, metadata: input.metadata };\n }\n\n const filteredProps: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(properties)) {\n filteredProps[key] = value;\n }\n\n if (Object.keys(filteredProps).length === 0) {\n return { content: input.content, metadata: input.metadata };\n }\n\n const yamlStr = matter.stringify(\"\", filteredProps).trim();\n const yamlBody = yamlStr.slice(4, -3).trim();\n const codeBlock = \"```yaml\\n# im-nobsidian:properties\\n\" + yamlBody + \"\\n```\";\n\n const content = codeBlock + \"\\n\\n---\\n\\n\" + input.content;\n\n return { content, metadata: input.metadata };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst UNDERLINE_REGEX = /<u>([\\s\\S]*?)<\\/u>/g;\n\nconst COLOR_SPAN_REGEX = /<span class=\"notion-(\\w+?)(?:-bg)?\">([\\s\\S]*?)<\\/span>/g;\n\nconst IM_NOBSIDIAN_COLOR_REGEX =\n /%% im-nobsidian:color:(\\w+(?:_background)?) %%([\\s\\S]*?)%% im-nobsidian:end %%/g;\n\nexport class HtmlAnnotationStripper implements Processor {\n readonly name = \"HtmlAnnotationStripper\";\n readonly order = 5;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"push\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n let content = input.content;\n\n content = content.replace(IM_NOBSIDIAN_COLOR_REGEX, (_m, _color: string, text: string) => text);\n\n content = content.replace(UNDERLINE_REGEX, (_m, text: string) => text);\n\n content = content.replace(COLOR_SPAN_REGEX, (_m, _color: string, text: string) => text);\n\n return { content, metadata: input.metadata };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst NOTION_LINK_REGEX =\n /\\[([^\\]]+)\\]\\((?:https:\\/\\/(?:www\\.)?notion\\.so\\/|notion:\\/\\/)([a-f0-9-]+)\\)/g;\n\nconst WIKILINK_PRESERVE_REGEX = /\\[([^\\]]+)\\]\\(im-nobsidian:\\/\\/wikilink\\/([^)]+)\\)/g;\n\nconst EMBED_PRESERVE_REGEX = /\\[([^\\]]+)\\]\\(im-nobsidian:\\/\\/embed\\/([^)]+)\\)/g;\n\nexport class MentionToWikilink implements Processor {\n readonly name = \"MentionToWikilink\";\n readonly order = 10;\n\n process(input: ProcessorInput): ProcessorOutput {\n let content = input.content;\n\n content = content.replace(NOTION_LINK_REGEX, (_match, display: string) => `[[${display}]]`);\n\n content = content.replace(\n WIKILINK_PRESERVE_REGEX,\n (_match, display: string, encodedTarget: string) => {\n const target = decodeURIComponent(encodedTarget);\n return target === display ? `[[${target}]]` : `[[${target}|${display}]]`;\n },\n );\n\n content = content.replace(\n EMBED_PRESERVE_REGEX,\n (_match, _display: string, encodedTarget: string) => {\n const target = decodeURIComponent(encodedTarget);\n return `![[${target}]]`;\n },\n );\n\n return { content, metadata: input.metadata };\n }\n}\n","import type {\n Processor,\n ProcessorInput,\n ProcessorOutput,\n PreserveMarker,\n} from \"../../types/convert.js\";\n\nexport class PreserveMarkerInjector implements Processor {\n readonly name = \"PreserveMarkerInjector\";\n readonly order = 100;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"pull\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const markers = input.metadata.preserveMarkers;\n if (!markers || markers.length === 0) {\n return { content: input.content, metadata: input.metadata };\n }\n\n let content = input.content;\n\n const missingMarkers = markers.filter((m) => !content.includes(this.formatMarker(m)));\n\n if (missingMarkers.length === 0) {\n return { content, metadata: input.metadata };\n }\n\n const markerLines = missingMarkers.map((m) => this.formatMarker(m));\n const suffix = \"\\n\\n\" + markerLines.join(\"\\n\");\n content = content.trimEnd() + suffix + \"\\n\";\n\n return { content, metadata: input.metadata };\n }\n\n private formatMarker(marker: PreserveMarker): string {\n const params = Object.entries(marker.params)\n .map(([k, v]) => `${k}=${encodeURIComponent(v)}`)\n .join(\"&\");\n return `%% im-nobsidian:${marker.type}:${params} %%`;\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst EMOJI_TYPE_MAP: Record<string, string> = {\n \"\\u{1F4DD}\": \"note\",\n \"\\u{1F4CB}\": \"abstract\",\n \"\\u{2139}\\u{FE0F}\": \"info\",\n \"\\u{1F4A1}\": \"tip\",\n \"\\u{2705}\": \"success\",\n \"\\u{2753}\": \"question\",\n \"\\u{26A0}\\u{FE0F}\": \"warning\",\n \"\\u{274C}\": \"failure\",\n \"\\u{1F525}\": \"danger\",\n \"\\u{1F41B}\": \"bug\",\n \"\\u{1F4CC}\": \"example\",\n \"\\u{1F4AC}\": \"quote\",\n};\n\nconst CALLOUT_PRESERVE_REGEX = /%% im-nobsidian:callout:type=(\\w+)(?:&foldable=(open|closed))? %%/g;\n\nexport class CalloutRestorer implements Processor {\n readonly name = \"CalloutRestorer\";\n readonly order = 20;\n\n process(input: ProcessorInput): ProcessorOutput {\n let content = input.content;\n\n content = content.replace(CALLOUT_PRESERVE_REGEX, (_match, type: string, foldable?: string) => {\n if (foldable) {\n const foldChar = foldable === \"open\" ? \"+\" : \"-\";\n return `[!${type}]${foldChar}`;\n }\n return `[!${type}]`;\n });\n\n for (const [emoji, type] of Object.entries(EMOJI_TYPE_MAP)) {\n const pattern = new RegExp(`> ${escapeRegex(emoji)} \\\\*\\\\*(.+?)\\\\*\\\\*`, \"g\");\n content = content.replace(pattern, (_match, title: string) => {\n if (title.toLowerCase() === type) {\n return `> [!${type}]`;\n }\n return `> [!${type}] ${title}`;\n });\n }\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst COLOR_MARKER_REGEX =\n /%% im-nobsidian:color:(\\w+(?:_background)?) %%([\\s\\S]*?)%% im-nobsidian:end %%/g;\n\nexport class ColorAnnotator implements Processor {\n readonly name = \"ColorAnnotator\";\n readonly order = 30;\n\n process(input: ProcessorInput): ProcessorOutput {\n const content = input.content.replace(\n COLOR_MARKER_REGEX,\n (_match, color: string, text: string) => {\n const cssClass = color.endsWith(\"_background\")\n ? `notion-${color.replace(\"_background\", \"-bg\")}`\n : `notion-${color}`;\n return `<span class=\"${cssClass}\">${text}</span>`;\n },\n );\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n","import matter from \"gray-matter\";\nimport type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nexport class FrontmatterGenerator implements Processor {\n readonly name = \"FrontmatterGenerator\";\n readonly order = 90;\n\n process(input: ProcessorInput): ProcessorOutput {\n const properties = input.metadata.properties as Record<string, unknown> | undefined;\n\n if (!properties || Object.keys(properties).length === 0) {\n return { content: input.content, metadata: input.metadata };\n }\n\n const normalized = normalizeProperties(properties);\n const content = matter.stringify(input.content, normalized);\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n\nfunction normalizeProperties(props: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n const normalized = normalizeValue(value);\n if (normalized !== undefined) {\n result[key] = normalized;\n }\n }\n\n return result;\n}\n\nfunction normalizeValue(value: unknown): unknown {\n if (value instanceof Date) {\n return normalizeDate(value.toISOString());\n }\n\n if (typeof value === \"string\") {\n return normalizeDate(value);\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) return undefined;\n return value;\n }\n\n if (typeof value === \"object\" && value !== null && \"start\" in value) {\n const dateObj = value as { start: string; end?: string | null };\n const normalized = {\n start: normalizeDate(dateObj.start),\n ...(dateObj.end ? { end: normalizeDate(dateObj.end) } : {}),\n };\n return normalized;\n }\n\n return value;\n}\n\nconst MIDNIGHT_RE = /T00:00:00(?:\\.\\d{3})?(?:Z|[+-]\\d{2}:\\d{2})/;\n\nfunction normalizeDate(dateStr: string): string {\n if (typeof dateStr !== \"string\") return dateStr;\n if (MIDNIGHT_RE.test(dateStr)) {\n return dateStr.split(\"T\")[0] ?? dateStr;\n }\n return dateStr;\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst LOCAL_IMAGE_MARKER_REGEX =\n />\\s*📎\\s*[^\\n]*\\n>\\s*%%\\s*im-nobsidian:local-image:([^\\s]+)\\s*%%/g;\n\nexport class LocalImageRestorer implements Processor {\n readonly name = \"LocalImageRestorer\";\n readonly order = 15;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"pull\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const content = input.content.replace(LOCAL_IMAGE_MARKER_REGEX, (_match, target: string) => {\n return `![[${target}]]`;\n });\n\n return { content, metadata: input.metadata };\n }\n}\n","import matter from \"gray-matter\";\nimport type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst YAML_PROPERTIES_REGEX = /```yaml\\n# im-nobsidian:properties\\n([\\s\\S]*?)```\\n*(?:---\\n*)?/;\n\nconst LEGACY_TABLE_REGEX =\n /^\\s*\\| Property\\s*\\| Value\\s*\\|\\n\\s*\\|\\s*-{3,}\\s*\\|\\s*-{3,}\\s*\\|\\n((?:\\|[^\\n]+\\|\\n?)+)\\n*---\\n*/;\n\nexport class PropertiesTableRestorer implements Processor {\n readonly name = \"PropertiesTableRestorer\";\n readonly order = 5;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"pull\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const yamlMatch = input.content.match(YAML_PROPERTIES_REGEX);\n if (yamlMatch) {\n return this.restoreFromYaml(input, yamlMatch);\n }\n\n const tableMatch = input.content.match(LEGACY_TABLE_REGEX);\n if (tableMatch) {\n return this.restoreFromTable(input, tableMatch);\n }\n\n return { content: input.content, metadata: input.metadata };\n }\n\n private restoreFromYaml(input: ProcessorInput, match: RegExpMatchArray): ProcessorOutput {\n const yamlContent = match[1]!;\n const fakeDocument = `---\\n${yamlContent}---\\n`;\n\n let parsed: Record<string, unknown>;\n try {\n const result = matter(fakeDocument);\n parsed = result.data;\n } catch {\n return { content: input.content, metadata: input.metadata };\n }\n\n const properties: Record<string, unknown> = {\n ...(input.metadata.properties as Record<string, unknown> | undefined),\n ...parsed,\n };\n\n const content = input.content.replace(YAML_PROPERTIES_REGEX, \"\").trimStart();\n\n return {\n content,\n metadata: { ...input.metadata, properties },\n };\n }\n\n private restoreFromTable(input: ProcessorInput, match: RegExpMatchArray): ProcessorOutput {\n const rows = match[1]!.trim().split(\"\\n\");\n const properties: Record<string, unknown> = {\n ...(input.metadata.properties as Record<string, unknown> | undefined),\n };\n\n for (const row of rows) {\n const cells = row\n .split(\"|\")\n .map((c) => c.trim())\n .filter(Boolean);\n if (cells.length >= 2) {\n const key = cells[0]!;\n const rawValue = cells[1]!;\n properties[key] = parseLegacyValue(rawValue);\n }\n }\n\n const content = input.content.replace(LEGACY_TABLE_REGEX, \"\").trimStart();\n\n return {\n content,\n metadata: { ...input.metadata, properties },\n };\n }\n}\n\nfunction parseLegacyValue(raw: string): unknown {\n if (raw === \"\" || raw === \"null\") return null;\n if (raw === \"true\") return true;\n if (raw === \"false\") return false;\n\n const unquoted = stripQuotes(raw);\n const num = Number(unquoted);\n if (!isNaN(num) && unquoted.trim() !== \"\") return num;\n\n if (unquoted.includes(\", \")) {\n const parts = unquoted.split(\", \");\n const looksLikeArray = parts.every((p) => p.split(/\\s+/).length <= 3);\n if (looksLikeArray) {\n return parts.map((v) => {\n const n = Number(v);\n return !isNaN(n) && v.trim() !== \"\" ? n : v;\n });\n }\n }\n\n if (unquoted.startsWith(\"{\") || unquoted.startsWith(\"[\")) {\n try {\n return JSON.parse(unquoted);\n } catch {\n return unquoted;\n }\n }\n\n return unquoted;\n}\n\nfunction stripQuotes(s: string): string {\n if ((s.startsWith('\"') && s.endsWith('\"')) || (s.startsWith(\"'\") && s.endsWith(\"'\"))) {\n return s.slice(1, -1);\n }\n return s;\n}\n","import { ConversionPipeline } from \"./pipeline.js\";\nimport { FrontmatterExtractor } from \"./pre-processors/frontmatter.js\";\nimport { WikilinkResolver, type WikilinkResolverFn } from \"./pre-processors/wikilink.js\";\nimport { CalloutTransformer } from \"./pre-processors/callout.js\";\nimport { MathNormalizer } from \"./pre-processors/math.js\";\nimport { EmbedResolver } from \"./pre-processors/embed.js\";\nimport { PreserveMarkerCollector } from \"./pre-processors/preserve-marker.js\";\nimport { UnsupportedBlockStripper } from \"./pre-processors/unsupported-block-stripper.js\";\nimport { PropertiesTableInjector } from \"./pre-processors/properties-table.js\";\nimport { HtmlAnnotationStripper } from \"./pre-processors/html-annotation.js\";\nimport { MentionToWikilink } from \"./post-processors/mention-to-wikilink.js\";\nimport { PreserveMarkerInjector } from \"./post-processors/preserve-marker-injector.js\";\nimport { CalloutRestorer } from \"./post-processors/callout-restorer.js\";\nimport { ColorAnnotator } from \"./post-processors/color-annotator.js\";\nimport { FrontmatterGenerator } from \"./post-processors/frontmatter-generator.js\";\nimport { LocalImageRestorer } from \"./post-processors/local-image-restorer.js\";\nimport { PropertiesTableRestorer } from \"./post-processors/properties-table-restorer.js\";\n\nexport interface PipelineOptions {\n readonly wikilinkResolver?: WikilinkResolverFn;\n}\n\nexport function createDefaultPipeline(options?: PipelineOptions): ConversionPipeline {\n const pipeline = new ConversionPipeline();\n\n pipeline.registerPreProcessor(new HtmlAnnotationStripper());\n pipeline.registerPreProcessor(new UnsupportedBlockStripper());\n pipeline.registerPreProcessor(new FrontmatterExtractor());\n pipeline.registerPreProcessor(new PropertiesTableInjector());\n pipeline.registerPreProcessor(new WikilinkResolver(options?.wikilinkResolver));\n pipeline.registerPreProcessor(new CalloutTransformer());\n pipeline.registerPreProcessor(new MathNormalizer());\n pipeline.registerPreProcessor(new EmbedResolver());\n pipeline.registerPreProcessor(new PreserveMarkerCollector());\n\n pipeline.registerPostProcessor(new PropertiesTableRestorer());\n pipeline.registerPostProcessor(new LocalImageRestorer());\n pipeline.registerPostProcessor(new PreserveMarkerInjector());\n pipeline.registerPostProcessor(new MentionToWikilink());\n pipeline.registerPostProcessor(new CalloutRestorer());\n pipeline.registerPostProcessor(new ColorAnnotator());\n pipeline.registerPostProcessor(new FrontmatterGenerator());\n\n return pipeline;\n}\n","import { markdownToBlocks } from \"@tryfabric/martian\";\nimport { NotionToMarkdown } from \"notion-to-md\";\nimport type { Client } from \"@notionhq/client\";\nimport type { BlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints.js\";\nimport { NotionBlockBuilder } from \"../notion/block-builder.js\";\nimport type { NotionBlock } from \"../notion/block-builder.js\";\n\nconst TRULY_UNSUPPORTED_BLOCK_TYPES = [\"unsupported\", \"template\"] as const;\n\nconst DIVIDER_PLACEHOLDER = \"​%%IM-NOBSIDIAN_DIVIDER%%​\";\nconst TOGGLE_START = \"%%im-nobsidian:toggle:start%%\";\nconst TOGGLE_END = \"%%im-nobsidian:toggle:end%%\";\nconst COLUMN_LIST_START = \"%%im-nobsidian:column-list:start%%\";\nconst COLUMN_SEP = \"%%im-nobsidian:column%%\";\nconst COLUMN_LIST_END = \"%%im-nobsidian:column-list:end%%\";\n\nconst VIDEO_URL_PATTERNS = [\n /^https?:\\/\\/(www\\.)?youtube\\.com\\/watch/,\n /^https?:\\/\\/youtu\\.be\\//,\n /^https?:\\/\\/(www\\.)?vimeo\\.com\\//,\n /^https?:\\/\\/(www\\.)?dailymotion\\.com\\//,\n /^https?:\\/\\/(www\\.)?loom\\.com\\/share\\//,\n];\n\nconst EMBED_URL_PATTERNS = [\n /^https?:\\/\\/(www\\.)?figma\\.com\\//,\n /^https?:\\/\\/docs\\.google\\.com\\//,\n /^https?:\\/\\/drive\\.google\\.com\\//,\n /^https?:\\/\\/(www\\.)?miro\\.com\\//,\n /^https?:\\/\\/(www\\.)?twitter\\.com\\//,\n /^https?:\\/\\/(www\\.)?x\\.com\\//,\n /^https?:\\/\\/codepen\\.io\\//,\n /^https?:\\/\\/gist\\.github\\.com\\//,\n /^https?:\\/\\/(www\\.)?spotify\\.com\\//,\n /^https?:\\/\\/(www\\.)?soundcloud\\.com\\//,\n];\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\ntype RichTextItem = { plain_text: string; href?: string | null };\n\nfunction richTextToPlain(richText: RichTextItem[] | undefined): string {\n if (!richText) return \"\";\n return richText.map((t) => t.plain_text).join(\"\");\n}\n\ninterface RichTextAnnotated extends RichTextItem {\n annotations?: Record<string, unknown>;\n type?: string;\n equation?: { expression: string };\n mention?: {\n type: string;\n page?: { id: string };\n date?: { start: string; end?: string | null };\n user?: { id: string; name?: string };\n database?: { id: string };\n };\n}\n\nfunction richTextToMarkdown(richText: RichTextAnnotated[] | undefined): string {\n if (!richText) return \"\";\n return richText\n .map((t) => {\n if (t.type === \"equation\" && t.equation) {\n return `$${t.equation.expression}$`;\n }\n\n if (t.type === \"mention\" && t.mention) {\n return formatMention(t.mention);\n }\n\n let text = t.plain_text;\n const a = t.annotations;\n if (a?.code) text = `\\`${text}\\``;\n if (a?.bold) text = `**${text}**`;\n if (a?.italic) text = `*${text}*`;\n if (a?.strikethrough) text = `~~${text}~~`;\n if (a?.underline) text = `<u>${text}</u>`;\n if (t.href) text = `[${text}](${t.href})`;\n\n const color = a?.color as string | undefined;\n if (color && color !== \"default\") {\n text = `%% im-nobsidian:color:${color} %%${text}%% im-nobsidian:end %%`;\n }\n\n return text;\n })\n .join(\"\");\n}\n\nfunction formatMention(mention: NonNullable<RichTextAnnotated[\"mention\"]>): string {\n switch (mention.type) {\n case \"page\":\n return mention.page ? `[[${mention.page.id}]]` : \"\";\n case \"date\": {\n if (!mention.date) return \"\";\n const start = mention.date.start;\n return mention.date.end ? `${start} → ${mention.date.end}` : start;\n }\n case \"user\":\n return mention.user?.name ? `@${mention.user.name}` : \"@user\";\n case \"database\":\n return mention.database ? `[[${mention.database.id}]]` : \"\";\n default:\n return \"\";\n }\n}\n\nexport class BlockConverter {\n private n2m: NotionToMarkdown | null = null;\n private client: Client | null = null;\n\n initNotionToMd(client: Client): void {\n this.client = client;\n this.n2m = new NotionToMarkdown({ notionClient: client });\n this.registerCustomTransformers();\n }\n\n private registerCustomTransformers(): void {\n if (!this.n2m) return;\n\n for (const blockType of TRULY_UNSUPPORTED_BLOCK_TYPES) {\n this.n2m.setCustomTransformer(blockType, (block) => {\n const id = block.id ?? \"unknown\";\n return Promise.resolve(\n `> [!im-nobsidian-unsupported] Notion 전용 블록\\n> type: ${blockType}, id: ${id}\\n> %%im-nobsidian:unsupported:type=${blockType}&id=${id}%%`,\n );\n });\n }\n\n this.registerToggleTransformer();\n this.registerColumnTransformer();\n this.registerSyncedBlockTransformer();\n this.registerBookmarkTransformer();\n this.registerVideoTransformer();\n this.registerAudioTransformer();\n this.registerFileTransformer();\n this.registerChildPageTransformer();\n this.registerChildDatabaseTransformer();\n this.registerLinkToPageTransformer();\n this.registerTocTransformer();\n this.registerBreadcrumbTransformer();\n this.registerLinkPreviewTransformer();\n this.registerPdfTransformer();\n this.registerEmbedTransformer();\n this.registerCalloutTransformer();\n this.registerToggleHeadingTransformers();\n }\n\n private registerToggleTransformer(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n this.n2m.setCustomTransformer(\"toggle\", async (block) => {\n const b = block as unknown as { toggle: { rich_text: RichTextItem[] } } & BlockObjectResponse;\n const title = richTextToMarkdown(b.toggle?.rich_text as never);\n const children = b.has_children ? await n2m.pageToMarkdown(b.id) : [];\n const childMd = (Array.isArray(children) ? n2m.toMarkdownString(children).parent : \"\") ?? \"\";\n const indented = childMd\n .split(\"\\n\")\n .map((line: string) => (line.trim() ? ` ${line}` : \" \"))\n .join(\"\\n\")\n .trimEnd();\n return `${TOGGLE_START}\\n- ${title}\\n${indented}\\n${TOGGLE_END}`;\n });\n }\n\n private registerToggleHeadingTransformers(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n\n for (const level of [1, 2, 3] as const) {\n const headingKey = `heading_${level}` as const;\n this.n2m.setCustomTransformer(headingKey, async (block) => {\n const b = block as unknown as {\n [K in typeof headingKey]: { rich_text: RichTextItem[]; is_toggleable?: boolean };\n } & BlockObjectResponse;\n const headingData = b[headingKey];\n const text = richTextToMarkdown(headingData?.rich_text as never);\n const prefix = \"#\".repeat(level);\n\n if (headingData?.is_toggleable && b.has_children) {\n const children = await n2m.pageToMarkdown(b.id);\n const childMd =\n (Array.isArray(children) ? n2m.toMarkdownString(children).parent : \"\") ?? \"\";\n return `${prefix} ${text}\\n\\n${childMd.trimEnd()}`;\n }\n\n return `${prefix} ${text}`;\n });\n }\n }\n\n private registerColumnTransformer(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n const client = this.client!;\n\n this.n2m.setCustomTransformer(\"column_list\", async (block) => {\n const b = block as BlockObjectResponse;\n const response = await client.blocks.children.list({ block_id: b.id });\n const columns = response.results as BlockObjectResponse[];\n const parts: string[] = [];\n\n for (let i = 0; i < columns.length; i++) {\n const col = columns[i]!;\n const children = await n2m.pageToMarkdown(col.id);\n const childMd =\n (Array.isArray(children) ? n2m.toMarkdownString(children).parent : \"\") ?? \"\";\n parts.push(`${COLUMN_SEP}\\n${childMd.trimEnd()}`);\n }\n\n return `${COLUMN_LIST_START}\\n${parts.join(\"\\n\")}\\n${COLUMN_LIST_END}`;\n });\n\n this.n2m.setCustomTransformer(\"column\", async () => \"\");\n }\n\n private registerSyncedBlockTransformer(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n const client = this.client!;\n\n this.n2m.setCustomTransformer(\"synced_block\", async (block) => {\n const b = block as unknown as {\n synced_block: { synced_from: { block_id: string } | null };\n } & BlockObjectResponse;\n\n const sourceId = b.synced_block?.synced_from?.block_id ?? b.id;\n\n const response = await client.blocks.children.list({ block_id: sourceId });\n const mdBlocks: unknown[] = [];\n for (const child of response.results as BlockObjectResponse[]) {\n const result = await n2m.blockToMarkdown(child as never);\n if (result) mdBlocks.push(result);\n }\n const childMd = n2m.toMarkdownString(mdBlocks as never).parent ?? \"\";\n return childMd.trimEnd();\n });\n }\n\n private registerBookmarkTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"bookmark\", async (block) => {\n const b = block as unknown as {\n bookmark: { url: string; caption?: RichTextItem[] };\n };\n const url = b.bookmark?.url ?? \"\";\n const caption = richTextToPlain(b.bookmark?.caption);\n if (caption) {\n return `[${caption}](${url})`;\n }\n return `[${url}](${url})`;\n });\n }\n\n private registerVideoTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"video\", async (block) => {\n const b = block as unknown as {\n video: {\n type: string;\n external?: { url: string };\n file?: { url: string };\n caption?: RichTextItem[];\n };\n };\n const url = b.video?.type === \"external\" ? b.video.external?.url : b.video?.file?.url;\n const caption = richTextToPlain(b.video?.caption);\n return `![${caption || \"video\"}](${url ?? \"\"})`;\n });\n }\n\n private registerAudioTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"audio\", async (block) => {\n const b = block as unknown as {\n audio: {\n type: string;\n external?: { url: string };\n file?: { url: string };\n caption?: RichTextItem[];\n };\n };\n const url = b.audio?.type === \"external\" ? b.audio.external?.url : b.audio?.file?.url;\n const caption = richTextToPlain(b.audio?.caption);\n return `![${caption || \"audio\"}](${url ?? \"\"})`;\n });\n }\n\n private registerFileTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"file\", async (block) => {\n const b = block as unknown as {\n file: {\n type: string;\n external?: { url: string };\n file?: { url: string };\n caption?: RichTextItem[];\n name?: string;\n };\n };\n const url = b.file?.type === \"external\" ? b.file.external?.url : b.file?.file?.url;\n const name = b.file?.name ?? richTextToPlain(b.file?.caption) ?? \"file\";\n return `[${name}](${url ?? \"\"})`;\n });\n }\n\n private registerChildPageTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"child_page\", async (block) => {\n const b = block as unknown as { child_page: { title: string } };\n const title = b.child_page?.title ?? \"Untitled\";\n return `[[${title}]]`;\n });\n }\n\n private registerChildDatabaseTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"child_database\", async (block) => {\n const b = block as unknown as {\n child_database: { title: string };\n } & BlockObjectResponse;\n const title = b.child_database?.title ?? \"Database\";\n return `> [!database] ${title}\\n> %%im-nobsidian:child-database:id=${b.id}&title=${encodeURIComponent(title)}%%`;\n });\n }\n\n private registerLinkToPageTransformer(): void {\n if (!this.n2m) return;\n const client = this.client!;\n this.n2m.setCustomTransformer(\"link_to_page\", async (block) => {\n const b = block as unknown as {\n link_to_page: { type: string; page_id?: string; database_id?: string };\n };\n const pageId = b.link_to_page?.page_id ?? b.link_to_page?.database_id;\n if (!pageId) return \"\";\n try {\n const page = await client.pages.retrieve({ page_id: pageId });\n const p = page as {\n properties: Record<string, { type: string; title?: Array<{ plain_text: string }> }>;\n };\n for (const prop of Object.values(p.properties)) {\n if (prop.type === \"title\" && prop.title?.[0]?.plain_text) {\n return `[[${prop.title[0].plain_text}]]`;\n }\n }\n } catch {\n // fallback\n }\n return `[[${pageId}]]`;\n });\n }\n\n private registerTocTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"table_of_contents\", async () => {\n return `%%im-nobsidian:toc%%`;\n });\n }\n\n private registerBreadcrumbTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"breadcrumb\", async () => \"\");\n }\n\n private registerLinkPreviewTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"link_preview\", async (block) => {\n const b = block as unknown as { link_preview: { url: string } };\n const url = b.link_preview?.url ?? \"\";\n return `[${url}](${url})`;\n });\n }\n\n private registerPdfTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"pdf\", async (block) => {\n const b = block as unknown as {\n pdf: {\n type: string;\n file?: { url: string };\n external?: { url: string };\n caption?: RichTextItem[];\n };\n };\n const url = b.pdf?.type === \"file\" ? (b.pdf.file?.url ?? \"\") : (b.pdf?.external?.url ?? \"\");\n const caption = b.pdf?.caption ? richTextToMarkdown(b.pdf.caption as never) : \"\";\n return `[📄 ${caption || \"PDF\"}](${url})`;\n });\n }\n\n private registerEmbedTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"embed\", async (block) => {\n const b = block as unknown as {\n embed: { url: string; caption?: RichTextItem[] };\n };\n const url = b.embed?.url ?? \"\";\n const caption = b.embed?.caption ? richTextToMarkdown(b.embed.caption as never) : \"\";\n return `[${caption || url}](${url})`;\n });\n }\n\n private registerCalloutTransformer(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n this.n2m.setCustomTransformer(\"callout\", async (block) => {\n const b = block as unknown as {\n callout: { rich_text: RichTextItem[]; icon?: { type: string; emoji?: string } };\n } & BlockObjectResponse;\n const text = richTextToMarkdown(b.callout?.rich_text as never);\n const emoji = b.callout?.icon?.emoji ?? \"\";\n\n const children = b.has_children ? await n2m.pageToMarkdown(b.id) : [];\n const childMd = (Array.isArray(children) ? n2m.toMarkdownString(children).parent : \"\") ?? \"\";\n\n const EMOJI_TO_TYPE: Record<string, string> = {\n \"\\u{1F4DD}\": \"note\",\n \"\\u{1F4CB}\": \"abstract\",\n \"\\u{2139}\\u{FE0F}\": \"info\",\n \"\\u{1F4A1}\": \"tip\",\n \"\\u{2705}\": \"success\",\n \"\\u{2753}\": \"question\",\n \"\\u{26A0}\\u{FE0F}\": \"warning\",\n \"\\u{274C}\": \"failure\",\n \"\\u{1F525}\": \"danger\",\n \"\\u{1F41B}\": \"bug\",\n \"\\u{1F4CC}\": \"example\",\n \"\\u{1F4AC}\": \"quote\",\n };\n const calloutType = EMOJI_TO_TYPE[emoji] ?? \"note\";\n\n let result = `> [!${calloutType}] ${text}`;\n if (childMd?.trim()) {\n const lines = childMd\n .trim()\n .split(\"\\n\")\n .map((l: string) => (l.trim() ? `> ${l}` : \">\"));\n result += \"\\n\" + lines.join(\"\\n\");\n }\n return result;\n });\n }\n\n markdownToNotionBlocks(markdown: string): unknown[] {\n const preprocessed = this.preProcessMarkdown(markdown);\n const blocks = markdownToBlocks(preprocessed) as Array<Record<string, unknown>>;\n const processed = this.postProcessBlocks(blocks);\n return normalizeBlocksForNotion(processed as Array<Record<string, unknown>>);\n }\n\n private toggleContents: Map<number, string> = new Map();\n private columnContents: Map<number, string[]> = new Map();\n private toggleCounter = 0;\n private columnCounter = 0;\n\n private preProcessMarkdown(markdown: string): string {\n this.toggleContents.clear();\n this.columnContents.clear();\n this.toggleCounter = 0;\n this.columnCounter = 0;\n\n let processed = this.extractToggleBlocks(markdown);\n processed = this.extractColumnBlocks(processed);\n processed = this.replaceDividers(processed);\n return processed;\n }\n\n private replaceDividers(markdown: string): string {\n const lines = markdown.split(\"\\n\");\n const result: string[] = [];\n let inCodeBlock = false;\n\n for (const line of lines) {\n if (line.trimStart().startsWith(\"```\")) {\n inCodeBlock = !inCodeBlock;\n }\n\n if (!inCodeBlock && /^---\\s*$/.test(line.trim())) {\n result.push(DIVIDER_PLACEHOLDER);\n } else {\n result.push(line);\n }\n }\n\n return result.join(\"\\n\");\n }\n\n private extractToggleBlocks(markdown: string): string {\n const startRe = new RegExp(`^${escapeRegex(TOGGLE_START)}$`, \"gm\");\n const endRe = new RegExp(`^${escapeRegex(TOGGLE_END)}$`, \"gm\");\n let result = markdown;\n let match: RegExpExecArray | null;\n\n while ((match = startRe.exec(result)) !== null) {\n endRe.lastIndex = match.index;\n const endMatch = endRe.exec(result);\n if (!endMatch) break;\n\n const content = result.slice(match.index + match[0].length + 1, endMatch.index).trimEnd();\n const id = this.toggleCounter++;\n this.toggleContents.set(id, content);\n\n const placeholder = `%%IM-NOBSIDIAN_TOGGLE_${id}%%`;\n result =\n result.slice(0, match.index) +\n placeholder +\n result.slice(endMatch.index + endMatch[0].length);\n\n startRe.lastIndex = match.index + placeholder.length;\n }\n\n return result;\n }\n\n private extractColumnBlocks(markdown: string): string {\n const startRe = new RegExp(`^${escapeRegex(COLUMN_LIST_START)}$`, \"gm\");\n const endRe = new RegExp(`^${escapeRegex(COLUMN_LIST_END)}$`, \"gm\");\n let result = markdown;\n let match: RegExpExecArray | null;\n\n while ((match = startRe.exec(result)) !== null) {\n endRe.lastIndex = match.index;\n const endMatch = endRe.exec(result);\n if (!endMatch) break;\n\n const inner = result.slice(match.index + match[0].length + 1, endMatch.index);\n const columns = inner\n .split(new RegExp(`^${escapeRegex(COLUMN_SEP)}$`, \"m\"))\n .map((c) => c.trim())\n .filter(Boolean);\n\n const id = this.columnCounter++;\n this.columnContents.set(id, columns);\n\n const placeholder = `%%IM-NOBSIDIAN_COLLIST_${id}%%`;\n result =\n result.slice(0, match.index) +\n placeholder +\n result.slice(endMatch.index + endMatch[0].length);\n\n startRe.lastIndex = match.index + placeholder.length;\n }\n\n return result;\n }\n\n private postProcessBlocks(blocks: Array<Record<string, unknown>>): unknown[] {\n const result: unknown[] = [];\n\n for (const block of blocks) {\n const toggleConverted = this.convertTogglePlaceholder(block);\n if (toggleConverted) {\n result.push(toggleConverted);\n continue;\n }\n\n const columnConverted = this.convertColumnPlaceholder(block);\n if (columnConverted) {\n result.push(columnConverted);\n continue;\n }\n\n const dividerConverted = this.convertDividerPlaceholder(block);\n if (dividerConverted) {\n result.push(dividerConverted);\n continue;\n }\n\n const videoConverted = this.convertImageToVideoOrEmbed(block);\n if (videoConverted) {\n result.push(videoConverted);\n continue;\n }\n\n const calloutConverted = this.convertQuoteToCallout(block);\n result.push(calloutConverted);\n }\n\n return result;\n }\n\n private convertTogglePlaceholder(block: Record<string, unknown>): unknown | null {\n if (block.type !== \"paragraph\") return null;\n\n const para = block.paragraph as\n | { rich_text?: Array<{ text?: { content: string } }> }\n | undefined;\n const text = para?.rich_text?.[0]?.text?.content ?? \"\";\n\n const toggleMatch = text.match(/%%IM-NOBSIDIAN_TOGGLE_(\\d+)%%/);\n if (!toggleMatch) return null;\n\n const id = parseInt(toggleMatch[1]!, 10);\n const content = this.toggleContents.get(id);\n if (content === undefined) return null;\n\n const titleMatch = content.match(/^- (.+)$/m);\n const title = titleMatch?.[1] ?? \"Toggle\";\n\n const childLines = content.split(\"\\n\").slice(1);\n const childMd = childLines\n .map((l) => (l.startsWith(\" \") ? l.slice(2) : l))\n .join(\"\\n\")\n .trim();\n\n const children = childMd ? (markdownToBlocks(childMd) as Array<Record<string, unknown>>) : [];\n\n return NotionBlockBuilder.toggle(\n NotionBlockBuilder.richText(title),\n children.length > 0 ? (children as unknown as NotionBlock[]) : undefined,\n );\n }\n\n private convertColumnPlaceholder(block: Record<string, unknown>): unknown | null {\n if (block.type !== \"paragraph\") return null;\n\n const para = block.paragraph as\n | { rich_text?: Array<{ text?: { content: string } }> }\n | undefined;\n const text = para?.rich_text?.[0]?.text?.content ?? \"\";\n\n const colMatch = text.match(/%%IM-NOBSIDIAN_COLLIST_(\\d+)%%/);\n if (!colMatch) return null;\n\n const id = parseInt(colMatch[1]!, 10);\n const columns = this.columnContents.get(id);\n if (!columns) return null;\n\n const columnBlocks = columns.map((colMd) => {\n const blocks = markdownToBlocks(colMd) as Array<Record<string, unknown>>;\n return this.postProcessBlocks(blocks) as unknown as NotionBlock[];\n });\n\n return NotionBlockBuilder.columnList(columnBlocks);\n }\n\n private convertDividerPlaceholder(block: Record<string, unknown>): unknown | null {\n if (block.type !== \"paragraph\") return null;\n\n const para = block.paragraph as\n | { rich_text?: Array<{ text?: { content: string } }> }\n | undefined;\n const text = para?.rich_text?.[0]?.text?.content ?? \"\";\n\n if (text.includes(\"%%IM-NOBSIDIAN_DIVIDER%%\")) {\n return NotionBlockBuilder.divider();\n }\n return null;\n }\n\n private convertImageToVideoOrEmbed(block: Record<string, unknown>): unknown | null {\n let url = \"\";\n let caption: string | undefined;\n\n if (block.type === \"image\") {\n const img = block.image as\n | { external?: { url: string }; caption?: Array<{ text?: { content: string } }> }\n | undefined;\n url = img?.external?.url ?? \"\";\n caption = img?.caption?.[0]?.text?.content;\n } else if (block.type === \"paragraph\") {\n const para = block.paragraph as\n | { rich_text?: Array<{ text?: { content: string } }> }\n | undefined;\n const texts = para?.rich_text ?? [];\n if (texts.length === 1) {\n const content = texts[0]?.text?.content ?? \"\";\n if (/^https?:\\/\\//.test(content)) {\n url = content;\n }\n }\n }\n\n if (!url) return null;\n\n if (VIDEO_URL_PATTERNS.some((p) => p.test(url))) {\n return NotionBlockBuilder.video(url, caption);\n }\n\n if (EMBED_URL_PATTERNS.some((p) => p.test(url))) {\n return NotionBlockBuilder.embed(url, caption);\n }\n\n return null;\n }\n\n private convertQuoteToCallout(block: Record<string, unknown>): unknown {\n if (block.type !== \"quote\") return block;\n\n const quote = block.quote as\n | {\n rich_text: Array<{\n type: string;\n text?: { content: string; link?: unknown };\n annotations?: Record<string, boolean>;\n }>;\n children?: Array<Record<string, unknown>>;\n }\n | undefined;\n if (!quote?.rich_text?.[0]) return block;\n\n const firstText = quote.rich_text[0]?.text?.content ?? \"\";\n\n const KNOWN_CALLOUT_EMOJIS = [\n \"\\u{1F4DD}\",\n \"\\u{1F4CB}\",\n \"\\u{2139}\\u{FE0F}\",\n \"\\u{1F4A1}\",\n \"\\u{2705}\",\n \"\\u{2753}\",\n \"\\u{26A0}\\u{FE0F}\",\n \"\\u{274C}\",\n \"\\u{1F525}\",\n \"\\u{1F41B}\",\n \"\\u{1F4CC}\",\n \"\\u{1F4AC}\",\n ];\n const matchedEmoji = KNOWN_CALLOUT_EMOJIS.find((e) => firstText.startsWith(e));\n if (!matchedEmoji) return block;\n\n const emoji = matchedEmoji;\n const remainingText = firstText.slice(emoji.length).replace(/^\\s+/, \"\");\n\n const newRichText = [...quote.rich_text];\n if (remainingText) {\n newRichText[0] = {\n ...newRichText[0]!,\n text: { content: remainingText, link: null },\n };\n } else {\n newRichText.shift();\n }\n\n return {\n type: \"callout\",\n callout: {\n rich_text: newRichText,\n icon: { type: \"emoji\", emoji },\n children: quote.children ?? [],\n },\n };\n }\n\n async notionBlocksToMarkdown(pageId: string): Promise<string> {\n if (!this.n2m) {\n throw new Error(\n \"NotionToMarkdown이 초기화되지 않았습니다. initNotionToMd()를 먼저 호출하세요.\",\n );\n }\n\n const mdBlocks = await this.n2m.pageToMarkdown(pageId);\n const result = this.n2m.toMarkdownString(mdBlocks);\n return result.parent ?? \"\";\n }\n}\n\nconst NOTION_MAX_TABLE_ROWS = 100;\nconst NOTION_MAX_LIST_DEPTH = 3;\n\nfunction normalizeBlocksForNotion(\n blocks: Array<Record<string, unknown>>,\n): Array<Record<string, unknown>> {\n const result: Array<Record<string, unknown>> = [];\n\n for (const block of blocks) {\n if (block.type === \"table\") {\n result.push(...normalizeTable(block));\n } else if (isListBlock(block)) {\n result.push(flattenListDepth(block, 0));\n } else {\n result.push(block);\n }\n }\n\n return result;\n}\n\nfunction normalizeTable(block: Record<string, unknown>): Array<Record<string, unknown>> {\n const table = block.table as\n | {\n table_width: number;\n has_column_header: boolean;\n has_row_header: boolean;\n children: Array<Record<string, unknown>>;\n }\n | undefined;\n if (!table?.children) return [block];\n\n const rows = table.children;\n if (rows.length === 0) return [block];\n\n let maxCells = table.table_width;\n for (const row of rows) {\n const tr = row.table_row as { cells: unknown[][] } | undefined;\n if (tr?.cells && tr.cells.length > maxCells) {\n maxCells = tr.cells.length;\n }\n }\n\n const normalizedRows = rows.map((row) => {\n const tr = row.table_row as { cells: unknown[][] } | undefined;\n if (!tr?.cells) return row;\n\n const cells = [...tr.cells];\n while (cells.length < maxCells) {\n cells.push([{ type: \"text\", text: { content: \"\" } }]);\n }\n if (cells.length > maxCells) {\n cells.length = maxCells;\n }\n\n return { ...row, table_row: { ...tr, cells } };\n });\n\n if (normalizedRows.length <= NOTION_MAX_TABLE_ROWS) {\n return [\n {\n ...block,\n table: { ...table, table_width: maxCells, children: normalizedRows },\n },\n ];\n }\n\n const tables: Array<Record<string, unknown>> = [];\n const headerRow = table.has_column_header ? normalizedRows[0] : null;\n const dataRows = table.has_column_header ? normalizedRows.slice(1) : normalizedRows;\n const chunkSize = headerRow ? NOTION_MAX_TABLE_ROWS - 1 : NOTION_MAX_TABLE_ROWS;\n\n for (let i = 0; i < dataRows.length; i += chunkSize) {\n const chunk = dataRows.slice(i, i + chunkSize);\n const children = headerRow ? [headerRow, ...chunk] : chunk;\n tables.push({\n type: \"table\",\n table: {\n table_width: maxCells,\n has_column_header: !!headerRow,\n has_row_header: table.has_row_header,\n children,\n },\n });\n }\n\n return tables;\n}\n\nfunction isListBlock(block: Record<string, unknown>): boolean {\n return (\n block.type === \"bulleted_list_item\" ||\n block.type === \"numbered_list_item\" ||\n block.type === \"to_do\"\n );\n}\n\nfunction flattenListDepth(block: Record<string, unknown>, depth: number): Record<string, unknown> {\n const blockType = block.type as string;\n const blockData = block[blockType] as\n | { children?: Array<Record<string, unknown>>; [key: string]: unknown }\n | undefined;\n if (!blockData?.children || blockData.children.length === 0) return block;\n\n if (depth >= NOTION_MAX_LIST_DEPTH - 1) {\n const flattened = collectAllDescendants(blockData.children);\n return {\n ...block,\n [blockType]: { ...blockData, children: flattened },\n };\n }\n\n const normalizedChildren = blockData.children.map((child) => {\n if (isListBlock(child)) {\n return flattenListDepth(child, depth + 1);\n }\n return child;\n });\n\n return {\n ...block,\n [blockType]: { ...blockData, children: normalizedChildren },\n };\n}\n\nfunction collectAllDescendants(\n blocks: Array<Record<string, unknown>>,\n): Array<Record<string, unknown>> {\n const result: Array<Record<string, unknown>> = [];\n for (const block of blocks) {\n const blockType = block.type as string;\n const blockData = block[blockType] as\n | { children?: Array<Record<string, unknown>>; [key: string]: unknown }\n | undefined;\n const children = blockData?.children;\n const blockWithoutChildren = children\n ? { ...block, [blockType]: { ...blockData, children: undefined } }\n : block;\n result.push(blockWithoutChildren);\n if (children && children.length > 0) {\n result.push(...collectAllDescendants(children));\n }\n }\n return result;\n}\n","import { createHash } from \"node:crypto\";\nimport { Sema } from \"async-sema\";\nimport type { VaultFS } from \"./vault-fs.js\";\nimport type { NotionClient } from \"../notion/client.js\";\nimport type { ImageReference } from \"../types/convert.js\";\nimport { getLogger } from \"../utils/logger.js\";\n\nexport interface ImageDownloadResult {\n readonly originalUrl: string;\n readonly localPath: string;\n readonly hash: string;\n readonly size: number;\n}\n\nexport interface ImageUploadResult {\n readonly localPath: string;\n readonly fileUploadId: string;\n}\n\nconst IMAGE_EXTENSIONS: Record<string, string> = {\n \"image/png\": \".png\",\n \"image/jpeg\": \".jpg\",\n \"image/gif\": \".gif\",\n \"image/webp\": \".webp\",\n \"image/svg+xml\": \".svg\",\n \"image/bmp\": \".bmp\",\n \"image/tiff\": \".tiff\",\n};\n\nconst EXTENSION_TO_MIME: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".bmp\": \"image/bmp\",\n \".ico\": \"image/x-icon\",\n \".tiff\": \"image/tiff\",\n};\n\nexport class ImageHandler {\n constructor(\n private readonly vaultFs: VaultFS,\n private readonly attachmentFolder: string = \"attachments\",\n private readonly notionClient?: NotionClient,\n ) {}\n\n async downloadImage(url: string, pageTitle: string): Promise<ImageDownloadResult> {\n const maxRetries = 3;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n await new Promise((r) => setTimeout(r, 1000 * attempt));\n getLogger().info(\n `[Im-Nobsidian] 이미지 다운로드 재시도 (${attempt + 1}/${maxRetries}): ${pageTitle}`,\n );\n }\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`이미지 다운로드 실패: ${response.status} ${response.statusText}`);\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"image/png\";\n const extension = IMAGE_EXTENSIONS[contentType] ?? this.guessExtension(url) ?? \".png\";\n\n const buffer = Buffer.from(await response.arrayBuffer());\n const hash = createHash(\"sha256\").update(buffer).digest(\"hex\").slice(0, 12);\n const safeName = pageTitle\n .replace(/[^a-zA-Z0-9가-힣\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .slice(0, 50);\n\n const fileName = `${safeName}-${hash}${extension}`;\n const localPath = `${this.attachmentFolder}/${fileName}`;\n\n await this.vaultFs.ensureFolder(this.attachmentFolder);\n await this.vaultFs.writeBinary(localPath, buffer);\n\n return { originalUrl: url, localPath, hash, size: buffer.length };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n }\n }\n throw lastError!;\n }\n\n async downloadAllImages(\n markdown: string,\n pageTitle: string,\n ): Promise<{ content: string; downloads: ImageDownloadResult[] }> {\n const imageRegex = /!\\[([^\\]]*)\\]\\((https?:\\/\\/[^)]+)\\)/g;\n const matches = [...markdown.matchAll(imageRegex)];\n const notionMatches = matches.filter((m) => m[2] && this.isNotionImageUrl(m[2]));\n\n const internalImageRegex = /!\\[([^\\]]*)\\]\\((file:\\/\\/%7B.*?%7D%7D)\\)/g;\n const internalMatches = [...markdown.matchAll(internalImageRegex)];\n\n if (notionMatches.length === 0 && internalMatches.length === 0) {\n return { content: markdown, downloads: [] };\n }\n\n const sema = new Sema(3);\n const downloads: ImageDownloadResult[] = [];\n let result = markdown;\n\n const httpResults = await Promise.allSettled(\n notionMatches.map(async (match) => {\n await sema.acquire();\n try {\n return {\n match,\n download: await this.downloadImage(match[2]!, pageTitle),\n };\n } finally {\n sema.release();\n }\n }),\n );\n\n for (const settled of httpResults) {\n if (settled.status !== \"fulfilled\") continue;\n const { match, download } = settled.value;\n downloads.push(download);\n const obsidianEmbed = `![[${download.localPath}${match[1] ? `|${match[1]}` : \"\"}]]`;\n result = result.replace(match[0]!, obsidianEmbed);\n }\n\n for (const match of internalMatches) {\n await sema.acquire();\n try {\n const fileUrl = match[2]!;\n const parsed = this.parseNotionFileUrl(fileUrl);\n if (!parsed || !this.notionClient) continue;\n\n const realUrl = await this.notionClient.getFileBlockUrl(parsed.blockId);\n if (!realUrl) {\n getLogger().warn(`[Im-Nobsidian] 이미지 Block URL 조회 실패: ${parsed.fileName}`);\n continue;\n }\n\n const download = await this.downloadImage(realUrl, pageTitle);\n downloads.push(download);\n const obsidianEmbed = `![[${download.localPath}${match[1] ? `|${match[1]}` : \"\"}]]`;\n result = result.replace(match[0]!, obsidianEmbed);\n } catch (error) {\n getLogger().warn(`내부 이미지 다운로드 실패: ${error}`);\n } finally {\n sema.release();\n }\n }\n\n return { content: result, downloads };\n }\n\n async uploadLocalImage(localPath: string): Promise<ImageUploadResult> {\n if (!this.notionClient) {\n throw new Error(\"NotionClient required for image upload\");\n }\n\n const buffer = await this.readImageFromVault(localPath);\n const filename = localPath.split(\"/\").pop() ?? \"image.png\";\n const contentType = this.getContentTypeFromPath(filename);\n const blob = new Blob([buffer], { type: contentType });\n const fileUploadId = await this.notionClient.uploadFile(blob, filename, contentType);\n\n return { localPath, fileUploadId };\n }\n\n async uploadAndAppendImages(\n pageId: string,\n images: ImageReference[],\n ): Promise<ImageUploadResult[]> {\n if (!this.notionClient) return [];\n\n const localImages = images.filter((img) => !img.isExternal && img.localPath);\n if (localImages.length === 0) return [];\n\n const results: ImageUploadResult[] = [];\n const imageBlocks: unknown[] = [];\n\n for (const img of localImages) {\n try {\n const result = await this.uploadLocalImage(img.localPath!);\n results.push(result);\n imageBlocks.push({\n type: \"image\",\n image: {\n type: \"file_upload\",\n file_upload: { id: result.fileUploadId },\n },\n });\n } catch (error) {\n getLogger().warn(`이미지 업로드 실패 (${img.localPath}):`, error);\n }\n }\n\n if (imageBlocks.length > 0) {\n await this.notionClient.appendChildren(pageId, imageBlocks);\n }\n\n return results;\n }\n\n private async readImageFromVault(localPath: string): Promise<Buffer> {\n try {\n return await this.vaultFs.readBinary(localPath);\n } catch {\n return await this.vaultFs.readBinary(`${this.attachmentFolder}/${localPath}`);\n }\n }\n\n private getContentTypeFromPath(filename: string): string {\n const ext = filename.match(/\\.[^.]+$/)?.[0]?.toLowerCase();\n return (ext && EXTENSION_TO_MIME[ext]) ?? \"application/octet-stream\";\n }\n\n async downloadAllFiles(\n markdown: string,\n pageTitle: string,\n ): Promise<{ content: string; downloads: ImageDownloadResult[] }> {\n const mdLinkRegex = /\\[(?:📎|🎬|🎞|📄|🔊)\\s*([^\\]]*)\\]\\((https?:\\/\\/[^)]+)\\)/g;\n const mdHttpMatches = [...markdown.matchAll(mdLinkRegex)];\n const notionHttpMatches = mdHttpMatches.filter((m) => m[2] && this.isNotionFileUrl(m[2]));\n\n const mdInternalRegex = /\\[(?:📎|🎬|🎞|📄|🔊)\\s*([^\\]]*)\\]\\((file:\\/\\/%7B.*?%7D%7D)\\)/g;\n const mdInternalMatches = [...markdown.matchAll(mdInternalRegex)];\n\n const xmlHttpRegex =\n /<(?:file|video|audio|pdf)\\s+src=\"(https?:\\/\\/[^\"]+)\">([\\s\\S]*?)<\\/(?:file|video|audio|pdf)>/g;\n const xmlHttpMatches = [...markdown.matchAll(xmlHttpRegex)];\n const notionXmlHttpMatches = xmlHttpMatches.filter((m) => m[1] && this.isNotionFileUrl(m[1]));\n\n const xmlInternalRegex =\n /<(?:file|video|audio|pdf)\\s+src=\"(file:\\/\\/%7B.*?%7D%7D)\">([\\s\\S]*?)<\\/(?:file|video|audio|pdf)>/g;\n const xmlInternalMatches = [...markdown.matchAll(xmlInternalRegex)];\n\n const totalMatches =\n notionHttpMatches.length +\n mdInternalMatches.length +\n notionXmlHttpMatches.length +\n xmlInternalMatches.length;\n\n if (totalMatches === 0) {\n return { content: markdown, downloads: [] };\n }\n\n const sema = new Sema(3);\n const downloads: ImageDownloadResult[] = [];\n let result = markdown;\n\n for (const match of notionHttpMatches) {\n await sema.acquire();\n try {\n const url = match[2]!;\n const caption = match[1]?.trim() || \"file\";\n const download = await this.downloadFile(url, pageTitle, caption);\n downloads.push(download);\n const obsidianLink = `[[${download.localPath}|${caption}]]`;\n result = result.replace(match[0]!, obsidianLink);\n } catch (error) {\n getLogger().warn(`파일 다운로드 실패: ${error}`);\n } finally {\n sema.release();\n }\n }\n\n for (const match of mdInternalMatches) {\n await sema.acquire();\n try {\n const fileUrl = match[2]!;\n const parsed = this.parseNotionFileUrl(fileUrl);\n if (!parsed || !this.notionClient) continue;\n\n const blockId = parsed.blockId;\n const fileName = parsed.fileName;\n const realUrl = await this.notionClient.getFileBlockUrl(blockId);\n if (!realUrl) continue;\n\n const caption = fileName || match[1]?.trim() || \"file\";\n const download = await this.downloadFile(realUrl, pageTitle, caption);\n downloads.push(download);\n const obsidianLink = `[[${download.localPath}|${caption}]]`;\n result = result.replace(match[0]!, obsidianLink);\n } catch (error) {\n getLogger().warn(`내부 파일 다운로드 실패: ${error}`);\n } finally {\n sema.release();\n }\n }\n\n for (const match of notionXmlHttpMatches) {\n await sema.acquire();\n try {\n const url = match[1]!;\n const caption = match[2]?.trim() || \"file\";\n const download = await this.downloadFile(url, pageTitle, caption);\n downloads.push(download);\n const obsidianLink = `[[${download.localPath}|${caption}]]`;\n result = result.replace(match[0]!, obsidianLink);\n } catch (error) {\n getLogger().warn(`파일 다운로드 실패: ${error}`);\n } finally {\n sema.release();\n }\n }\n\n for (const match of xmlInternalMatches) {\n await sema.acquire();\n try {\n const fileUrl = match[1]!;\n const parsed = this.parseNotionFileUrl(fileUrl);\n if (!parsed || !this.notionClient) continue;\n\n const blockId = parsed.blockId;\n const fileName = parsed.fileName;\n const realUrl = await this.notionClient.getFileBlockUrl(blockId);\n if (!realUrl) continue;\n\n const caption = fileName || match[2]?.trim() || \"file\";\n const download = await this.downloadFile(realUrl, pageTitle, caption);\n downloads.push(download);\n const obsidianLink = `[[${download.localPath}|${caption}]]`;\n result = result.replace(match[0]!, obsidianLink);\n } catch (error) {\n getLogger().warn(`내부 파일 다운로드 실패: ${error}`);\n } finally {\n sema.release();\n }\n }\n\n return { content: result, downloads };\n }\n\n private parseNotionFileUrl(fileUrl: string): { blockId: string; fileName: string } | null {\n try {\n const decoded = decodeURIComponent(fileUrl.replace(\"file://\", \"\"));\n const json = JSON.parse(decoded) as {\n source?: string;\n permissionRecord?: { id?: string };\n };\n const blockId = json.permissionRecord?.id ?? \"\";\n const source = json.source ?? \"\";\n const fileNameMatch = source.match(/attachment:[^:]+:(.+)$/);\n const fileName = fileNameMatch ? decodeURIComponent(fileNameMatch[1]!) : \"\";\n return blockId ? { blockId, fileName } : null;\n } catch {\n return null;\n }\n }\n\n private async downloadFile(\n url: string,\n _pageTitle: string,\n caption: string,\n ): Promise<ImageDownloadResult> {\n const maxRetries = 3;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n await new Promise((r) => setTimeout(r, 1000 * attempt));\n getLogger().info(\n `[Im-Nobsidian] 파일 다운로드 재시도 (${attempt + 1}/${maxRetries}): ${caption}`,\n );\n }\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`파일 다운로드 실패: ${response.status} ${response.statusText}`);\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n const hash = createHash(\"sha256\").update(buffer).digest(\"hex\").slice(0, 12);\n\n const extension = this.guessFileExtension(url, response.headers.get(\"content-type\"));\n const safeName = caption\n .replace(/[^a-zA-Z0-9가-힣\\s._-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .slice(0, 80);\n const fileName = `${safeName}-${hash}${extension}`;\n const localPath = `${this.attachmentFolder}/${fileName}`;\n\n await this.vaultFs.ensureFolder(this.attachmentFolder);\n await this.vaultFs.writeBinary(localPath, buffer);\n\n return { originalUrl: url, localPath, hash, size: buffer.length };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n }\n }\n throw lastError!;\n }\n\n private isNotionImageUrl(url: string): boolean {\n return this.isNotionFileUrl(url);\n }\n\n private isNotionFileUrl(url: string): boolean {\n return (\n url.includes(\"secure.notion-static.com\") ||\n url.includes(\"prod-files-secure\") ||\n url.includes(\"s3.us-west-2.amazonaws.com/secure.notion-static.com\")\n );\n }\n\n private guessExtension(url: string): string | null {\n const pathname = new URL(url).pathname;\n const ext = pathname.match(/\\.(png|jpg|jpeg|gif|webp|svg|bmp|tiff)(\\?|$)/i);\n return ext ? `.${ext[1]!.toLowerCase()}` : null;\n }\n\n private guessFileExtension(url: string, contentType: string | null): string {\n try {\n const pathname = new URL(url).pathname;\n const extMatch = pathname.match(/\\.([a-zA-Z0-9]{1,10})(?:\\?|$)/);\n if (extMatch) return `.${extMatch[1]!.toLowerCase()}`;\n } catch {\n // URL 파싱 실패 시 MIME 타입으로 폴백\n }\n\n const mimeMap: Record<string, string> = {\n \"application/pdf\": \".pdf\",\n \"application/zip\": \".zip\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": \".xlsx\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\": \".pptx\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": \".docx\",\n \"application/x-hwp\": \".hwp\",\n \"application/gzip\": \".gz\",\n };\n if (contentType && mimeMap[contentType]) return mimeMap[contentType]!;\n return \"\";\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { Sema } from \"async-sema\";\nimport type { VaultFS, NonMdFileInfo } from \"./vault-fs.js\";\nimport type { NotionClient } from \"../notion/client.js\";\nimport type { StateDB } from \"../state/state-db.js\";\nimport { getLogger } from \"../utils/logger.js\";\n\nexport type NotionBlockType = \"image\" | \"pdf\" | \"video\" | \"audio\" | \"file\";\n\nexport interface FileUploadResult {\n readonly localPath: string;\n readonly fileUploadId: string;\n readonly blockType: NotionBlockType;\n}\n\nexport interface FileDownloadResult {\n readonly url: string;\n readonly localPath: string;\n readonly hash: string;\n readonly size: number;\n}\n\nconst EXTENSION_TO_BLOCK_TYPE: Record<string, NotionBlockType> = {\n \".png\": \"image\",\n \".jpg\": \"image\",\n \".jpeg\": \"image\",\n \".gif\": \"image\",\n \".svg\": \"image\",\n \".webp\": \"image\",\n \".ico\": \"image\",\n \".bmp\": \"image\",\n \".tiff\": \"image\",\n \".tif\": \"image\",\n \".avif\": \"image\",\n \".apng\": \"image\",\n \".heic\": \"image\",\n\n \".pdf\": \"pdf\",\n\n \".mp4\": \"video\",\n \".mov\": \"video\",\n \".webm\": \"video\",\n \".avi\": \"video\",\n \".mkv\": \"video\",\n \".flv\": \"video\",\n \".wmv\": \"video\",\n \".m4v\": \"video\",\n \".mpeg\": \"video\",\n \".ogv\": \"video\",\n \".3gp\": \"video\",\n\n \".mp3\": \"audio\",\n \".wav\": \"audio\",\n \".ogg\": \"audio\",\n \".m4a\": \"audio\",\n \".flac\": \"audio\",\n \".aac\": \"audio\",\n \".wma\": \"audio\",\n \".opus\": \"audio\",\n \".weba\": \"audio\",\n};\n\nconst EXTENSION_TO_MIME: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".bmp\": \"image/bmp\",\n \".ico\": \"image/x-icon\",\n \".tiff\": \"image/tiff\",\n \".tif\": \"image/tiff\",\n \".avif\": \"image/avif\",\n \".heic\": \"image/heic\",\n \".pdf\": \"application/pdf\",\n \".mp4\": \"video/mp4\",\n \".mov\": \"video/quicktime\",\n \".webm\": \"video/webm\",\n \".avi\": \"video/x-msvideo\",\n \".mkv\": \"video/x-matroska\",\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".ogg\": \"audio/ogg\",\n \".m4a\": \"audio/mp4\",\n \".flac\": \"audio/flac\",\n \".aac\": \"audio/aac\",\n \".docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \".pptx\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \".zip\": \"application/zip\",\n \".gz\": \"application/gzip\",\n \".tar\": \"application/x-tar\",\n \".rar\": \"application/vnd.rar\",\n \".7z\": \"application/x-7z-compressed\",\n \".py\": \"text/x-python\",\n \".js\": \"text/javascript\",\n \".ts\": \"text/typescript\",\n \".json\": \"application/json\",\n \".csv\": \"text/csv\",\n \".txt\": \"text/plain\",\n \".html\": \"text/html\",\n \".xml\": \"application/xml\",\n \".hwp\": \"application/x-hwp\",\n \".xls\": \"application/vnd.ms-excel\",\n \".doc\": \"application/msword\",\n \".ppt\": \"application/vnd.ms-powerpoint\",\n};\n\nexport function getBlockType(filename: string): NotionBlockType {\n const ext = filename.match(/\\.[^.]+$/)?.[0]?.toLowerCase();\n if (!ext) return \"file\";\n return EXTENSION_TO_BLOCK_TYPE[ext] ?? \"file\";\n}\n\nexport function getMimeType(filename: string): string {\n const ext = filename.match(/\\.[^.]+$/)?.[0]?.toLowerCase();\n if (!ext) return \"application/octet-stream\";\n return EXTENSION_TO_MIME[ext] ?? \"application/octet-stream\";\n}\n\nfunction getFolderPath(filePath: string): string {\n const parts = filePath.split(\"/\");\n return parts.length > 1 ? parts.slice(0, -1).join(\"/\") : \"\";\n}\n\nexport class FileHandler {\n private readonly sema = new Sema(2);\n\n constructor(\n private readonly vaultFs: VaultFS,\n private readonly notionClient: NotionClient,\n private readonly stateDb: StateDB,\n ) {}\n\n async pushFilesForFolder(folderPageId: string, folderPath: string): Promise<FileUploadResult[]> {\n const allFiles = await this.vaultFs.listNonMarkdownFiles();\n const folderFiles = allFiles.filter((f) => getFolderPath(f.path) === folderPath);\n\n if (folderFiles.length === 0) return [];\n\n const results: FileUploadResult[] = [];\n\n for (const file of folderFiles) {\n if (this.stateDb.isFileRegistered(file.path)) {\n const existing = this.stateDb.getFileRegistry(file.path);\n if (existing) {\n const buffer = await this.vaultFs.readBinary(file.path);\n const currentHash = createHash(\"sha256\").update(buffer).digest(\"hex\");\n if (existing.fileHash === currentHash) continue;\n }\n }\n\n await this.sema.acquire();\n try {\n const result = await this.uploadFile(file, folderPageId);\n if (result) results.push(result);\n } catch (error) {\n getLogger().warn(`파일 업로드 실패 (${file.path}):`, error);\n } finally {\n this.sema.release();\n }\n }\n\n return results;\n }\n\n async pushAllFiles(): Promise<FileUploadResult[]> {\n const allFiles = await this.vaultFs.listNonMarkdownFiles();\n if (allFiles.length === 0) return [];\n\n const filesByFolder = new Map<string, NonMdFileInfo[]>();\n for (const file of allFiles) {\n const folder = getFolderPath(file.path);\n const list = filesByFolder.get(folder) ?? [];\n list.push(file);\n filesByFolder.set(folder, list);\n }\n\n const results: FileUploadResult[] = [];\n\n for (const [folderPath, files] of filesByFolder) {\n const folderRecord = folderPath\n ? this.stateDb.getByPath(folderPath)\n : this.stateDb.getByPath(\"__root__\");\n\n const folderPageId = folderRecord?.notionPageId;\n if (!folderPageId) {\n getLogger().warn(\n `폴더 페이지 없음, 파일 스킵: ${folderPath || \"(루트)\"} (${files.length}개)`,\n );\n continue;\n }\n\n for (const file of files) {\n if (this.stateDb.isFileRegistered(file.path)) {\n const existing = this.stateDb.getFileRegistry(file.path);\n if (existing) {\n const buffer = await this.vaultFs.readBinary(file.path);\n const currentHash = createHash(\"sha256\").update(buffer).digest(\"hex\");\n if (existing.fileHash === currentHash) continue;\n }\n }\n\n await this.sema.acquire();\n try {\n const result = await this.uploadFile(file, folderPageId);\n if (result) results.push(result);\n } catch (error) {\n getLogger().warn(`파일 업로드 실패 (${file.path}):`, error);\n } finally {\n this.sema.release();\n }\n }\n }\n\n return results;\n }\n\n async downloadFileBlock(\n url: string,\n filename: string,\n targetFolder: string,\n ): Promise<FileDownloadResult> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`파일 다운로드 실패: ${response.status} ${response.statusText}`);\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n const hash = createHash(\"sha256\").update(buffer).digest(\"hex\");\n const localPath = targetFolder ? `${targetFolder}/${filename}` : filename;\n\n await this.vaultFs.ensureFolder(targetFolder || \".\");\n await this.vaultFs.writeBinary(localPath, buffer);\n\n return { url, localPath, hash, size: buffer.length };\n }\n\n async downloadFileBlocks(\n blocks: Array<{ type: string; url: string; caption?: string }>,\n targetFolder: string,\n ): Promise<FileDownloadResult[]> {\n const results: FileDownloadResult[] = [];\n\n for (const block of blocks) {\n const filename = this.extractFilename(block.url, block.caption);\n if (this.stateDb.isFileRegistered(`${targetFolder}/${filename}`)) continue;\n\n await this.sema.acquire();\n try {\n const result = await this.downloadFileBlock(block.url, filename, targetFolder);\n results.push(result);\n } catch (error) {\n getLogger().warn(`파일 다운로드 실패 (${block.url}):`, error);\n } finally {\n this.sema.release();\n }\n }\n\n return results;\n }\n\n private async uploadFile(\n file: NonMdFileInfo,\n parentPageId: string,\n ): Promise<FileUploadResult | null> {\n const buffer = await this.vaultFs.readBinary(file.path);\n const filename = file.path.split(\"/\").pop() ?? \"file\";\n const contentType = getMimeType(filename);\n const blockType = getBlockType(filename);\n const hash = createHash(\"sha256\").update(buffer).digest(\"hex\");\n\n const blob = new Blob([buffer], { type: contentType });\n const fileUploadId = await this.notionClient.uploadFile(blob, filename, contentType);\n\n const block = this.createFileBlock(blockType, fileUploadId);\n await this.notionClient.appendChildren(parentPageId, [block]);\n\n this.stateDb.registerFile({\n localPath: file.path,\n notionPageId: parentPageId,\n fileUploadId,\n fileType: blockType,\n fileHash: hash,\n fileSize: file.size,\n });\n\n getLogger().info(`파일 업로드 완료: ${file.path} → ${blockType} 블록`);\n\n return { localPath: file.path, fileUploadId, blockType };\n }\n\n private createFileBlock(blockType: NotionBlockType, fileUploadId: string): unknown {\n const fileRef = {\n type: \"file_upload\" as const,\n file_upload: { id: fileUploadId },\n };\n\n switch (blockType) {\n case \"image\":\n return { type: \"image\", image: fileRef };\n case \"pdf\":\n return { type: \"pdf\", pdf: fileRef };\n case \"video\":\n return { type: \"video\", video: fileRef };\n case \"audio\":\n return { type: \"audio\", audio: fileRef };\n case \"file\":\n default:\n return { type: \"file\", file: fileRef };\n }\n }\n\n private extractFilename(url: string, caption?: string): string {\n if (caption) {\n const safe = caption.replace(/[^a-zA-Z0-9가-힣._\\s-]/g, \"\").trim();\n if (safe) return safe;\n }\n\n try {\n const pathname = new URL(url).pathname;\n const segments = pathname.split(\"/\");\n const last = segments[segments.length - 1];\n if (last && last.includes(\".\")) return decodeURIComponent(last);\n } catch {\n // fallback\n }\n\n const ext = url.match(/\\.(png|jpg|jpeg|gif|pdf|mp4|mp3|docx|xlsx|zip|webp)(\\?|$)/i);\n return `file-${Date.now()}${ext ? `.${ext[1]}` : \"\"}`;\n }\n}\n","// eslint-disable-next-line no-control-regex\nconst INVALID_CHARS = /[<>:\"/\\\\|?*\\x00-\\x1f]/g;\nconst TRAILING_DOTS = /\\.+$/;\nconst RESERVED_NAMES = new Set([\n \"CON\",\n \"PRN\",\n \"AUX\",\n \"NUL\",\n \"COM1\",\n \"COM2\",\n \"COM3\",\n \"COM4\",\n \"COM5\",\n \"COM6\",\n \"COM7\",\n \"COM8\",\n \"COM9\",\n \"LPT1\",\n \"LPT2\",\n \"LPT3\",\n \"LPT4\",\n \"LPT5\",\n \"LPT6\",\n \"LPT7\",\n \"LPT8\",\n \"LPT9\",\n]);\n\nexport function sanitizeFileName(name: string): string {\n let sanitized = name.replace(INVALID_CHARS, \"_\").replace(TRAILING_DOTS, \"\").trim().slice(0, 200);\n\n if (RESERVED_NAMES.has(sanitized.toUpperCase())) {\n sanitized = `_${sanitized}`;\n }\n\n if (sanitized.length === 0) {\n sanitized = \"_untitled\";\n }\n\n return sanitized;\n}\n","const NOTION_CALLOUT_RE = /^::: callout\\n([\\s\\S]*?)\\n:::/gm;\nconst NOTION_CALLOUT_TAG_RE = /<callout[^>]*>\\n?([\\s\\S]*?)<\\/callout>/g;\nconst NOTION_TOGGLE_RE = /[\\t ]*<details>\\s*<summary>([\\s\\S]*?)<\\/summary>([\\s\\S]*?)<\\/details>/gs;\nconst NOTION_PAGE_MENTION_RE = /<mention-page id=\"([^\"]+)\">([\\s\\S]*?)<\\/mention-page>/g;\nconst NOTION_USER_MENTION_RE = /<mention-user id=\"[^\"]*\">([^<]*)<\\/mention-user>/g;\nconst NOTION_DATE_MENTION_RE = /<mention-date start=\"([^\"]*)\"(?: end=\"([^\"]*)\")?[^>]*\\/>/g;\nconst NOTION_UNKNOWN_RE = /<unknown id=\"([^\"]*)\"([^>]*)\\/>/g;\n\nconst NOTION_AUDIO_RE = /[\\t ]*<audio src=\"([^\"]*)\">([\\s\\S]*?)<\\/audio>/g;\nconst NOTION_VIDEO_RE = /[\\t ]*<video src=\"([^\"]*)\">([\\s\\S]*?)<\\/video>/g;\nconst NOTION_PDF_RE = /[\\t ]*<pdf src=\"([^\"]*)\">([\\s\\S]*?)<\\/pdf>/g;\nconst NOTION_FILE_RE = /[\\t ]*<file src=\"([^\"]*)\">([\\s\\S]*?)<\\/file>/g;\nconst NOTION_TAB_RE = /<tab title=\"([^\"]*)\">([\\s\\S]*?)<\\/tab>/g;\nconst NOTION_UNDERLINE_RE = /<span underline=\"true\">([\\s\\S]*?)<\\/span>/g;\n\nconst TOGGLE_START = \"%%im-nobsidian:toggle:start%%\";\nconst TOGGLE_END = \"%%im-nobsidian:toggle:end%%\";\n\nexport function notionEnhancedToObsidian(enhanced: string): string {\n let result = enhanced;\n\n result = convertSyncedBlockRef(result);\n result = normalizeCodeBlockToggles(result);\n result = convertToggles(result);\n result = convertCallouts(result);\n result = convertPageMentions(result);\n result = convertPageLinks(result);\n result = convertUserMentions(result);\n result = convertDateMentions(result);\n result = convertMediaTags(result);\n result = convertTabBlocks(result);\n result = preserveUnknownBlocks(result);\n result = convertNotionMath(result);\n result = convertNotionTables(result);\n result = convertColorSpans(result);\n result = convertUnderlineSpans(result);\n result = convertColumnBlocks(result);\n result = convertDatabaseBlocks(result);\n result = cleanInlineColorAttrs(result);\n result = removeEmptyBlocks(result);\n result = unescapePipes(result);\n result = unescapeNotionChars(result);\n result = ensureCalloutContinuity(result);\n\n return result;\n}\n\nexport function obsidianToNotionEnhanced(obsidian: string): string {\n let result = obsidian;\n\n result = convertTogglesToHtml(result);\n result = restoreTabBlocks(result);\n result = convertObsidianCallouts(result);\n result = restoreMediaTags(result);\n result = restoreUnknownBlocks(result);\n result = restoreColorSpans(result);\n result = restoreUnderlineSpans(result);\n\n return result;\n}\n\nfunction normalizeCodeBlockToggles(content: string): string {\n return content.replace(\n /^- (.+)\\n\\t```(\\w*)\\n([\\s\\S]*?)\\n\\t```$/gm,\n (_match, title: string, lang: string, body: string) => {\n const langTag = lang ? lang : \"\";\n return `<details>\\n<summary>${title.trim()}</summary>\\n\\`\\`\\`${langTag}\\n${body}\\n\\`\\`\\`\\n</details>`;\n },\n );\n}\n\nfunction convertToggles(content: string): string {\n function replaceToggle(match: string): string {\n const m = /[\\t ]*<details>\\s*<summary>([\\s\\S]*?)<\\/summary>([\\s\\S]*?)<\\/details>/s.exec(match);\n if (!m) return match;\n\n const title = m[1]!.trim();\n let body = m[2]!.trim();\n\n body = convertToggles(body);\n\n const calloutBody = body\n .split(\"\\n\")\n .map((line) => (line ? `> ${line}` : \">\"))\n .join(\"\\n\");\n return `> [!toggle]- ${title}\\n${calloutBody}`;\n }\n\n return content.replace(NOTION_TOGGLE_RE, replaceToggle);\n}\n\nfunction calloutBodyToObsidian(body: string): string {\n const lines = body\n .split(\"\\n\")\n .map((l) => l.replace(/^\\t/, \"\"))\n .filter((l, i, arr) => !(i === 0 && l === \"\") && !(i === arr.length - 1 && l === \"\"));\n const firstLine = lines[0] ?? \"\";\n\n const emojiMatch = /^([\\p{Emoji}️‍]+)\\s*(.*)/u.exec(firstLine);\n const type = emojiMatch ? emojiToCalloutType(emojiMatch[1]!) : \"note\";\n const title = emojiMatch ? emojiMatch[2]! : firstLine;\n const rest = lines.slice(1).join(\"\\n\").trim();\n\n const calloutTitle = title ? `> [!${type}] ${title}` : `> [!${type}]`;\n const calloutBody = rest\n ? \"\\n\" +\n rest\n .split(\"\\n\")\n .map((line) => (line.trim() ? `> ${line}` : \">\"))\n .join(\"\\n\")\n : \"\";\n\n return calloutTitle + calloutBody;\n}\n\nfunction convertCallouts(content: string): string {\n let result = content.replace(NOTION_CALLOUT_TAG_RE, (_match, body: string) =>\n calloutBodyToObsidian(body),\n );\n result = result.replace(NOTION_CALLOUT_RE, (_match, body: string) => calloutBodyToObsidian(body));\n return result;\n}\n\nfunction convertPageMentions(content: string): string {\n let result = content.replace(NOTION_PAGE_MENTION_RE, (_match, _id: string, text: string) => {\n const cleaned = text.trim();\n return `[[${cleaned}]]`;\n });\n result = result.replace(\n /<mention-page\\s+url=\"https?:\\/\\/(?:www\\.)?notion\\.so\\/([a-f0-9]{32})\"[^>]*\\/>/g,\n (_match, id: string) => `[[notion:${id}]]`,\n );\n return result;\n}\n\nfunction convertUserMentions(content: string): string {\n return content.replace(NOTION_USER_MENTION_RE, (_match, name: string) => `@${name}`);\n}\n\nfunction convertDateMentions(content: string): string {\n return content.replace(NOTION_DATE_MENTION_RE, (_match, start: string, end?: string) => {\n return end ? `${start} → ${end}` : start;\n });\n}\n\n// 2D: <unknown> → 보존 마커 (삭제 대신 보존)\nfunction preserveUnknownBlocks(content: string): string {\n return content.replace(NOTION_UNKNOWN_RE, (_match, id: string, attrs: string) => {\n const typeMatch = /type=\"([^\"]*)\"/.exec(attrs);\n const altMatch = /alt=\"([^\"]*)\"/.exec(attrs);\n const blockType = altMatch?.[1] ?? typeMatch?.[1] ?? \"unknown\";\n return `%%im-nobsidian:unknown:id=${id}&type=${blockType}%%`;\n });\n}\n\nfunction convertSyncedBlockRef(content: string): string {\n let result = content.replace(\n /<synced_block_reference[^>]*>[\\s\\S]*?<\\/synced_block_reference>/g,\n (match) => {\n const inner = match\n .replace(/<synced_block_reference[^>]*>\\n?/, \"\")\n .replace(/<\\/synced_block_reference>/, \"\")\n .split(\"\\n\")\n .map((l) => l.replace(/^\\t/, \"\"))\n .join(\"\\n\")\n .trim();\n return inner;\n },\n );\n result = result.replace(\n /<synced_block[^>]*>\\n?([\\s\\S]*?)<\\/synced_block>/g,\n (_match, inner: string) => inner.trim(),\n );\n return result;\n}\n\n// 2A: 미디어 태그 → Obsidian 마크다운\nfunction convertMediaTags(content: string): string {\n let result = content;\n\n result = result.replace(NOTION_AUDIO_RE, (_match, src: string, caption: string) => {\n const cap = caption.trim();\n return cap ? `[🔊 ${cap}](${src})` : `[🔊 audio](${src})`;\n });\n\n result = result.replace(NOTION_VIDEO_RE, (_match, src: string, caption: string) => {\n const cap = caption.trim();\n return cap ? `[🎬 ${cap}](${src})` : `[🎬 video](${src})`;\n });\n\n result = result.replace(NOTION_PDF_RE, (_match, src: string, caption: string) => {\n const cap = caption.trim();\n return cap ? `[📄 ${cap}](${src})` : `[📄 pdf](${src})`;\n });\n\n result = result.replace(NOTION_FILE_RE, (_match, src: string, caption: string) => {\n const cap = caption.trim();\n return cap ? `[📎 ${cap}](${src})` : `[📎 file](${src})`;\n });\n\n return result;\n}\n\n// 2B: <tab> → 보존 마커\nfunction convertTabBlocks(content: string): string {\n return content.replace(NOTION_TAB_RE, (_match, title: string, body: string) => {\n const trimmed = body.trim();\n const indented = trimmed\n .split(\"\\n\")\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n return `> [!tab] ${title}\\n${indented}`;\n });\n}\n\n// 2C: <span underline> → 보존 마커\nfunction convertUnderlineSpans(content: string): string {\n return content.replace(NOTION_UNDERLINE_RE, (_match, text: string) => {\n return `%%im-nobsidian:underline%%${text}%%/underline%%`;\n });\n}\n\nfunction convertTogglesToHtml(content: string): string {\n const calloutToggleRe = /^> \\[!toggle\\]-\\s*(.+)\\n((?:>.*\\n?)*)/gm;\n\n let result = content;\n let prev = \"\";\n let safety = 0;\n while (result !== prev && safety++ < 100) {\n prev = result;\n result = result.replace(calloutToggleRe, (_match, title: string, body: string) => {\n const bodyText = body\n .split(\"\\n\")\n .map((line) => line.replace(/^>\\s?/, \"\"))\n .join(\"\\n\")\n .trim();\n return `<details>\\n<summary>${title.trim()}</summary>\\n\\n${bodyText}\\n\\n</details>`;\n });\n }\n\n const startRe = new RegExp(escapeRegex(TOGGLE_START), \"g\");\n const endRe = new RegExp(escapeRegex(TOGGLE_END), \"g\");\n\n safety = 0;\n while (result.includes(TOGGLE_START) && safety++ < 100) {\n const startIdx = result.indexOf(TOGGLE_START);\n const endIdx = findMatchingEnd(result, startIdx + TOGGLE_START.length);\n if (endIdx === -1) break;\n\n const inner = result.slice(startIdx + TOGGLE_START.length, endIdx).trim();\n const titleMatch = /^- (.+)$/m.exec(inner);\n const title = titleMatch ? titleMatch[1]! : \"\";\n const body = inner\n .split(\"\\n\")\n .slice(1)\n .map((line) => line.replace(/^ {2}/, \"\"))\n .join(\"\\n\")\n .trim();\n\n const html = `<details>\\n<summary>${title}</summary>\\n\\n${body}\\n\\n</details>`;\n result = result.slice(0, startIdx) + html + result.slice(endIdx + TOGGLE_END.length);\n }\n\n result = result.replace(startRe, \"\").replace(endRe, \"\");\n return result;\n}\n\nfunction findMatchingEnd(content: string, startFrom: number): number {\n let depth = 1;\n let pos = startFrom;\n\n while (pos < content.length && depth > 0) {\n const nextStart = content.indexOf(TOGGLE_START, pos);\n const nextEnd = content.indexOf(TOGGLE_END, pos);\n\n if (nextEnd === -1) return -1;\n\n if (nextStart !== -1 && nextStart < nextEnd) {\n depth++;\n pos = nextStart + TOGGLE_START.length;\n } else {\n depth--;\n if (depth === 0) return nextEnd;\n pos = nextEnd + TOGGLE_END.length;\n }\n }\n\n return -1;\n}\n\nfunction convertObsidianCallouts(content: string): string {\n const lines = content.split(\"\\n\");\n const result: string[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const headerMatch = /^> \\[!(\\w+)\\]([-+])?\\s*(.*)/.exec(lines[i]!);\n if (headerMatch) {\n const type = headerMatch[1]!;\n const title = headerMatch[3]!;\n const emoji = calloutTypeToEmoji(type) ?? \"💡\";\n const calloutTitle = title ? `${emoji} ${title}` : emoji;\n\n const bodyLines: string[] = [];\n i++;\n while (i < lines.length && lines[i]!.startsWith(\"> \")) {\n bodyLines.push(lines[i]!.slice(2));\n i++;\n }\n\n result.push(\"::: callout\");\n result.push(calloutTitle);\n if (bodyLines.length > 0) {\n result.push(...bodyLines);\n }\n result.push(\":::\");\n } else {\n result.push(lines[i]!);\n i++;\n }\n }\n\n return result.join(\"\\n\");\n}\n\nconst EMOJI_TYPE_MAP: Record<string, string> = {\n \"💡\": \"tip\",\n ℹ️: \"info\",\n \"⚠️\": \"warning\",\n \"🔥\": \"danger\",\n \"✅\": \"success\",\n \"❌\": \"failure\",\n \"❓\": \"question\",\n \"📝\": \"note\",\n \"📌\": \"abstract\",\n \"🐛\": \"bug\",\n \"💬\": \"quote\",\n \"📋\": \"example\",\n};\n\nconst TYPE_EMOJI_MAP: Record<string, string> = Object.fromEntries(\n Object.entries(EMOJI_TYPE_MAP).map(([k, v]) => [v, k]),\n);\n\nfunction emojiToCalloutType(emoji: string): string {\n return EMOJI_TYPE_MAP[emoji] ?? \"note\";\n}\n\nfunction calloutTypeToEmoji(type: string): string | undefined {\n return TYPE_EMOJI_MAP[type.toLowerCase()];\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nconst NOTION_PAGE_LINK_RE = /<page url=\"[^\"]*\">([\\s\\S]*?)<\\/page>/g;\nconst NOTION_COLOR_SPAN_RE = /<span color=\"([^\"]+)\">([\\s\\S]*?)<\\/span>/g;\nconst NOTION_EMPTY_BLOCK_RE = /^(?:>[\\t ]*)*[\\t ]*<empty-block\\/>\\n?/gm;\n\nfunction convertPageLinks(content: string): string {\n return content.replace(NOTION_PAGE_LINK_RE, (_match, text: string) => {\n const cleaned = text.replace(/\\*\\*/g, \"\").trim();\n return `[[${cleaned}]]`;\n });\n}\n\n// 2C: <span color> → 보존 마커 (색상 제거 대신 보존)\nfunction convertColorSpans(content: string): string {\n return content.replace(\n NOTION_COLOR_SPAN_RE,\n (_match, color: string, text: string) => `%%im-nobsidian:color:${color}%%${text}%%/color%%`,\n );\n}\n\nfunction convertDatabaseBlocks(content: string): string {\n return content.replace(\n /<database[^>]*>([\\s\\S]*?)<\\/database>/g,\n (_match, title: string) => `**${title.trim()}** *(Notion DB)*`,\n );\n}\n\nfunction cleanInlineColorAttrs(content: string): string {\n return content.replace(/\\s*\\{color=\"[^\"]*\"\\}/g, \"\");\n}\n\nfunction convertColumnBlocks(content: string): string {\n return content.replace(/<columns>\\n?([\\s\\S]*?)<\\/columns>/g, (_match, inner: string) => {\n return inner\n .replace(/\\t?<column>\\n?/g, \"\")\n .replace(/\\t?<\\/column>\\n?/g, \"\")\n .trim();\n });\n}\n\nfunction removeEmptyBlocks(content: string): string {\n return content.replace(NOTION_EMPTY_BLOCK_RE, \"\\n\");\n}\n\nconst NOTION_INLINE_MATH_RE = /\\$`([^`]+)`\\$/g;\nconst NOTION_BLOCK_MATH_RE = /\\$\\$\\n```\\n([\\s\\S]*?)\\n```\\n\\$\\$/g;\n\nfunction convertNotionMath(content: string): string {\n let result = content.replace(NOTION_BLOCK_MATH_RE, (_match, eq: string) => {\n return `$$\\n${eq.trim()}\\n$$`;\n });\n result = result.replace(NOTION_INLINE_MATH_RE, (_match, eq: string) => `$${eq}$`);\n result = result.replace(/\\\\\\$([^$]+?)\\\\\\$/g, (_match, inner: string) => {\n const unescaped = inner.replace(/\\\\\\^/g, \"^\").replace(/\\\\~/g, \"~\");\n return `$${unescaped}$`;\n });\n return result;\n}\n\nfunction unescapeNotionChars(content: string): string {\n return content.replace(/\\\\~/g, \"~\").replace(/\\\\\\^/g, \"^\");\n}\n\nconst NOTION_TABLE_RE = /<table[^>]*>([\\s\\S]*?)<\\/table>/g;\nconst TABLE_ROW_RE = /<tr>([\\s\\S]*?)<\\/tr>/g;\nconst TABLE_CELL_RE = /<t[dh][^>]*>([\\s\\S]*?)<\\/t[dh]>/g;\n\nfunction isAlignmentRow(cells: string[]): boolean {\n return cells.every((c) => /^:?-{2,}:?$/.test(c.trim()));\n}\n\nfunction convertNotionTables(content: string): string {\n return content.replace(NOTION_TABLE_RE, (_match, tableBody: string) => {\n const rows: string[][] = [];\n let rowMatch: RegExpExecArray | null;\n const rowRe = new RegExp(TABLE_ROW_RE.source, TABLE_ROW_RE.flags);\n\n while ((rowMatch = rowRe.exec(tableBody)) !== null) {\n const cells: string[] = [];\n let cellMatch: RegExpExecArray | null;\n const cellRe = new RegExp(TABLE_CELL_RE.source, TABLE_CELL_RE.flags);\n while ((cellMatch = cellRe.exec(rowMatch[1]!)) !== null) {\n cells.push(cellMatch[1]!.trim());\n }\n if (!isAlignmentRow(cells)) {\n rows.push(cells);\n }\n }\n\n if (rows.length === 0) return _match;\n\n const colCount = Math.max(...rows.map((r) => r.length));\n const lines: string[] = [];\n\n for (let i = 0; i < rows.length; i++) {\n const padded = rows[i]!;\n while (padded.length < colCount) padded.push(\"\");\n lines.push(`| ${padded.join(\" | \")} |`);\n if (i === 0) {\n lines.push(`| ${padded.map(() => \"---\").join(\" | \")} |`);\n }\n }\n\n return lines.join(\"\\n\");\n });\n}\n\n// ─── Push 방향: 보존 마커 → Enhanced MD 복원 ───\n\nconst OBSIDIAN_MEDIA_AUDIO_RE = /\\[🔊\\s*([^\\]]*)\\]\\(([^)]+)\\)/g;\nconst OBSIDIAN_MEDIA_VIDEO_RE = /\\[🎬\\s*([^\\]]*)\\]\\(([^)]+)\\)/g;\nconst OBSIDIAN_MEDIA_PDF_RE = /\\[📄\\s*([^\\]]*)\\]\\(([^)]+)\\)/g;\nconst OBSIDIAN_MEDIA_FILE_RE = /\\[📎\\s*([^\\]]*)\\]\\(([^)]+)\\)/g;\n\nfunction restoreMediaTags(content: string): string {\n let result = content;\n\n result = result.replace(OBSIDIAN_MEDIA_AUDIO_RE, (_match, caption: string, src: string) => {\n return `<audio src=\"${src}\">${caption}</audio>`;\n });\n\n result = result.replace(OBSIDIAN_MEDIA_VIDEO_RE, (_match, caption: string, src: string) => {\n return `<video src=\"${src}\">${caption}</video>`;\n });\n\n result = result.replace(OBSIDIAN_MEDIA_PDF_RE, (_match, caption: string, src: string) => {\n return `<pdf src=\"${src}\">${caption}</pdf>`;\n });\n\n result = result.replace(OBSIDIAN_MEDIA_FILE_RE, (_match, caption: string, src: string) => {\n return `<file src=\"${src}\">${caption}</file>`;\n });\n\n return result;\n}\n\nconst OBSIDIAN_TAB_RE = /^> \\[!tab\\]\\s*(.+)\\n((?:> .*\\n?)*)/gm;\n\nfunction restoreTabBlocks(content: string): string {\n return content.replace(OBSIDIAN_TAB_RE, (_match, title: string, body: string) => {\n const unquoted = body\n .split(\"\\n\")\n .map((line) => line.replace(/^> /, \"\"))\n .join(\"\\n\")\n .trim();\n return `<tab title=\"${title}\">${unquoted}</tab>`;\n });\n}\n\nconst OBSIDIAN_UNKNOWN_RE = /%%im-nobsidian:unknown:id=([^&]+)&type=([^%]+)%%/g;\n\nfunction restoreUnknownBlocks(content: string): string {\n return content.replace(OBSIDIAN_UNKNOWN_RE, (_match, id: string, type: string) => {\n return `<unknown id=\"${id}\" type=\"${type}\"/>`;\n });\n}\n\nconst OBSIDIAN_COLOR_RE = /%%im-nobsidian:color:([^%]+)%%([\\s\\S]*?)%%\\/color%%/g;\n\nfunction restoreColorSpans(content: string): string {\n return content.replace(OBSIDIAN_COLOR_RE, (_match, color: string, text: string) => {\n return `<span color=\"${color}\">${text}</span>`;\n });\n}\n\nconst OBSIDIAN_UNDERLINE_RE = /%%im-nobsidian:underline%%([\\s\\S]*?)%%\\/underline%%/g;\n\nfunction restoreUnderlineSpans(content: string): string {\n return content.replace(OBSIDIAN_UNDERLINE_RE, (_match, text: string) => {\n return `<span underline=\"true\">${text}</span>`;\n });\n}\n\nfunction unescapePipes(content: string): string {\n const lines = content.split(\"\\n\");\n const result: string[] = [];\n let inTable = false;\n\n for (const line of lines) {\n if (/^\\|.*\\|$/.test(line.trim()) || /^\\|[\\s-|]+\\|$/.test(line.trim())) {\n inTable = true;\n result.push(line);\n } else {\n if (inTable && line.trim() === \"\") {\n inTable = false;\n } else if (!/^\\|/.test(line.trim())) {\n inTable = false;\n }\n result.push(inTable ? line : line.replace(/\\\\\\|/g, \"|\"));\n }\n }\n\n return result.join(\"\\n\");\n}\n\nfunction ensureCalloutContinuity(content: string): string {\n const lines = content.split(\"\\n\");\n const result: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n if (line.trim() === \"\" && i > 0 && i < lines.length - 1) {\n const prev = result[result.length - 1] ?? \"\";\n const next = lines[i + 1] ?? \"\";\n if (/^>/.test(prev) && /^>/.test(next) && !/^> \\[!/.test(next)) {\n result.push(\">\");\n continue;\n }\n }\n result.push(line);\n }\n return result.join(\"\\n\");\n}\n","import type { Config, DatabaseSyncConfig } from \"../types/config.js\";\nimport type { StateDB } from \"../state/state-db.js\";\nimport type { NotionClient } from \"../notion/client.js\";\nimport type { VaultFS } from \"./vault-fs.js\";\nimport type { ConversionPipeline } from \"../converter/pipeline.js\";\nimport type { FailedOperation } from \"../types/sync.js\";\nimport type { DatabaseViewsConfig } from \"../types/view.js\";\nimport type { PageObjectResponse } from \"@notionhq/client/build/src/api-endpoints.js\";\nimport { PropertyMapper } from \"../notion/property-mapper.js\";\nimport type { ImageHandler } from \"./image-handler.js\";\nimport { computeHash } from \"../utils/hash.js\";\nimport { sanitizeFileName } from \"../utils/sanitize.js\";\nimport { getLogger } from \"../utils/logger.js\";\nimport {\n notionEnhancedToObsidian,\n obsidianToNotionEnhanced,\n} from \"../converter/enhanced-md-converter.js\";\nimport matter from \"gray-matter\";\n\nexport interface DatabaseSyncResult {\n created: number;\n updated: number;\n failed: FailedOperation[];\n}\n\nexport class DatabaseSyncer {\n private readonly propertyMapper = new PropertyMapper();\n\n constructor(\n private readonly config: Config,\n private readonly stateDb: StateDB,\n private readonly notionClient: NotionClient,\n private readonly vaultFs: VaultFS,\n private readonly pipeline: ConversionPipeline,\n private readonly imageHandler: ImageHandler,\n ) {\n this.propertyMapper.setWikilinkResolver({\n resolve: (title: string) => stateDb.resolveWikilink(title)?.notionPageId ?? null,\n resolvePageId: (pageId: string) => stateDb.resolvePageId(pageId)?.title ?? null,\n });\n }\n\n async pullAll(): Promise<DatabaseSyncResult> {\n const databases = this.config.notion.databases;\n if (!databases || databases.length === 0) {\n return { created: 0, updated: 0, failed: [] };\n }\n\n let created = 0;\n let updated = 0;\n const failed: FailedOperation[] = [];\n\n for (const dbConfig of databases) {\n try {\n const result = await this.pullDatabase(dbConfig);\n created += result.created;\n updated += result.updated;\n failed.push(...result.failed);\n } catch (error) {\n getLogger().warn(`[DB Sync] DB ${dbConfig.databaseId} pull 실패:`, error);\n failed.push({\n path: dbConfig.localFolder,\n operation: \"create\",\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return { created, updated, failed };\n }\n\n async pushAll(): Promise<DatabaseSyncResult> {\n const databases = this.config.notion.databases;\n if (!databases || databases.length === 0) {\n return { created: 0, updated: 0, failed: [] };\n }\n\n let created = 0;\n let updated = 0;\n const failed: FailedOperation[] = [];\n\n for (const dbConfig of databases) {\n try {\n const result = await this.pushDatabase(dbConfig);\n created += result.created;\n updated += result.updated;\n failed.push(...result.failed);\n } catch (error) {\n getLogger().warn(`[DB Sync] DB ${dbConfig.databaseId} push 실패:`, error);\n failed.push({\n path: dbConfig.localFolder,\n operation: \"create\",\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return { created, updated, failed };\n }\n\n async pullDatabase(dbConfig: DatabaseSyncConfig): Promise<DatabaseSyncResult> {\n const schema = await this.notionClient.getDatabaseSchema(dbConfig.databaseId);\n this.propertyMapper.loadSchema(schema);\n\n await this.vaultFs.ensureFolder(dbConfig.localFolder);\n\n await this.pullDatabaseViews(dbConfig);\n\n const pages = await this.notionClient.queryAllDatabasePages(\n dbConfig.databaseId,\n dbConfig.pullFilter,\n );\n\n let created = 0;\n let updated = 0;\n const failed: FailedOperation[] = [];\n\n for (const page of pages) {\n try {\n const record = this.stateDb.getByNotionId(page.id);\n\n if (record) {\n if (page.last_edited_time === record.notionLastEdited) continue;\n await this.pullDatabasePage(page, dbConfig);\n updated++;\n } else {\n await this.pullDatabasePage(page, dbConfig);\n created++;\n }\n } catch (error) {\n failed.push({\n path: `${dbConfig.localFolder}/${page.id}`,\n operation: \"create\",\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n getLogger().info(`[DB Sync] ${dbConfig.localFolder}: ${created} 생성, ${updated} 업데이트`);\n return { created, updated, failed };\n }\n\n private async pullDatabaseViews(dbConfig: DatabaseSyncConfig): Promise<void> {\n try {\n const viewsConfig = await this.notionClient.getDatabaseViewsConfig(dbConfig.databaseId);\n const configPath = \".im-nobsidian/db-views.json\";\n await this.vaultFs.ensureFolder(\".im-nobsidian\");\n\n let allViewsConfigs: Record<string, DatabaseViewsConfig> = {};\n try {\n const existing = await this.vaultFs.readFile(configPath);\n allViewsConfigs = JSON.parse(existing) as Record<string, DatabaseViewsConfig>;\n } catch {\n // 파일 없으면 빈 객체\n }\n\n allViewsConfigs[dbConfig.databaseId] = viewsConfig;\n await this.vaultFs.writeFile(configPath, JSON.stringify(allViewsConfigs, null, 2));\n getLogger().info(\n `[DB Sync] 뷰 설정 ${viewsConfig.views.length}개 저장: ${dbConfig.databaseId}`,\n );\n } catch (error) {\n getLogger().warn(`[DB Sync] 뷰 설정 Pull 실패 (계속 진행):`, error);\n }\n }\n\n private async pullDatabasePage(\n page: PageObjectResponse,\n dbConfig: DatabaseSyncConfig,\n ): Promise<string> {\n const title = this.notionClient.extractTitle(page);\n const safeName = sanitizeFileName(title);\n\n const properties = this.propertyMapper.fromNotionProperties(\n (page as unknown as { properties: Record<string, unknown> }).properties,\n );\n properties.title = title;\n\n const cover = this.notionClient.extractCover(page);\n const icon = this.notionClient.extractIcon(page);\n\n if (cover) {\n try {\n const coverResult = await this.imageHandler.downloadAllImages(\n `![cover](${cover.url})`,\n `${safeName}-cover`,\n );\n const localUrlMatch = coverResult.content.match(/!\\[cover\\]\\((.+?)\\)/);\n if (localUrlMatch?.[1]) {\n properties.cover = localUrlMatch[1];\n } else {\n properties.cover = cover.url;\n }\n } catch {\n properties.cover = cover.url;\n }\n }\n\n if (icon) {\n properties.icon = icon.value;\n }\n\n let markdown = \"\";\n try {\n const mdResult = await this.notionClient.getPageMarkdown(page.id);\n markdown = notionEnhancedToObsidian(mdResult.markdown);\n } catch {\n // Markdown API 실패 시 빈 내용\n }\n\n if (this.config.conversion.imageDownload === \"immediate\" && markdown) {\n const imageResult = await this.imageHandler.downloadAllImages(markdown, title);\n markdown = imageResult.content;\n }\n\n if (markdown) {\n const fileResult = await this.imageHandler.downloadAllFiles(markdown, title);\n markdown = fileResult.content;\n }\n\n const existingRecord = this.stateDb.getByNotionId(page.id);\n const filePath = existingRecord?.obsidianPath ?? `${dbConfig.localFolder}/${safeName}.md`;\n\n const finalContent = this.pipeline.convertToMarkdown(\n markdown,\n {\n direction: \"pull\",\n path: \"markdown-api\",\n filePath,\n parentMode: \"database\",\n },\n { properties },\n );\n\n await this.vaultFs.ensureFolder(dbConfig.localFolder);\n await this.vaultFs.writeFile(filePath, finalContent);\n\n const hash = computeHash(finalContent);\n this.stateDb.transaction(() => {\n this.stateDb.upsert({\n obsidianPath: filePath,\n notionPageId: page.id,\n notionParentId: dbConfig.databaseId,\n contentHash: hash,\n notionLastEdited: page.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType: \"db-row\",\n status: \"synced\",\n baseSnapshot: Buffer.from(finalContent, \"utf-8\"),\n });\n\n this.stateDb.upsertWikilink({\n obsidianPath: filePath,\n notionPageId: page.id,\n title,\n aliases: extractAliases(properties),\n });\n });\n\n return filePath;\n }\n\n private async pushDatabase(dbConfig: DatabaseSyncConfig): Promise<DatabaseSyncResult> {\n const schema = await this.notionClient.getDatabaseSchema(dbConfig.databaseId);\n this.propertyMapper.loadSchema(schema);\n\n const allFiles = await this.vaultFs.listMarkdownFiles();\n const prefix = dbConfig.localFolder.endsWith(\"/\")\n ? dbConfig.localFolder\n : dbConfig.localFolder + \"/\";\n const dbFiles = allFiles.filter((f) => f.path.startsWith(prefix));\n\n let created = 0;\n let updated = 0;\n const failed: FailedOperation[] = [];\n\n for (const file of dbFiles) {\n try {\n const content = await this.vaultFs.readFile(file.path);\n const hash = computeHash(content);\n\n const record = this.stateDb.getByPath(file.path);\n if (record?.contentHash === hash) continue;\n\n const parsed = matter(content);\n const frontmatter = parsed.data as Record<string, unknown>;\n const body = parsed.content;\n\n const title = (frontmatter.title as string) ?? extractTitleFromPath(file.path);\n delete frontmatter.title;\n\n const notionProps = this.propertyMapper.toNotionProperties(frontmatter, title);\n const enhanced = obsidianToNotionEnhanced(body.trim());\n\n if (record?.notionPageId) {\n await this.notionClient.updatePageProperties(record.notionPageId, notionProps);\n\n try {\n await this.notionClient.replacePageMarkdown(record.notionPageId, enhanced);\n } catch {\n // Markdown API 실패 시 무시\n }\n\n const updatedPage = await this.notionClient.getPage(record.notionPageId);\n this.stateDb.transaction(() => {\n this.stateDb.updateHash(record.id, hash, Buffer.from(content, \"utf-8\"));\n this.stateDb.updateStatus(record.id, \"synced\");\n this.stateDb.setNotionLastEdited(record.id, updatedPage.last_edited_time);\n });\n updated++;\n } else {\n const page = await this.notionClient.createPageWithMarkdown({\n parentId: dbConfig.databaseId,\n parentType: \"database\",\n title,\n markdown: enhanced,\n properties: notionProps,\n });\n\n this.stateDb.transaction(() => {\n this.stateDb.upsert({\n obsidianPath: file.path,\n notionPageId: page.id,\n notionParentId: dbConfig.databaseId,\n contentHash: hash,\n notionLastEdited: page.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType: \"db-row\",\n status: \"synced\",\n baseSnapshot: Buffer.from(content, \"utf-8\"),\n });\n\n this.stateDb.upsertWikilink({\n obsidianPath: file.path,\n notionPageId: page.id,\n title,\n aliases: extractAliases(frontmatter),\n });\n });\n created++;\n }\n } catch (error) {\n failed.push({\n path: file.path,\n operation: \"create\",\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n getLogger().info(`[DB Sync] ${dbConfig.localFolder}: ${created} 생성, ${updated} 업데이트`);\n return { created, updated, failed };\n }\n}\n\nfunction extractAliases(properties: Record<string, unknown>): string[] {\n const raw = properties.aliases ?? properties.alias;\n if (!raw) return [];\n if (Array.isArray(raw)) return raw.filter((a): a is string => typeof a === \"string\");\n if (typeof raw === \"string\")\n return raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return [];\n}\n\nfunction extractTitleFromPath(filePath: string): string {\n const parts = filePath.split(\"/\");\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.md$/, \"\");\n}\n","import type {\n PushOptions,\n PushResult,\n PullOptions,\n PullResult,\n SyncOptions,\n SyncResult,\n StatusResult,\n SyncRecord,\n LocalChange,\n RemoteChange,\n Conflict,\n FailedOperation,\n} from \"../types/sync.js\";\nimport type { Config } from \"../types/config.js\";\nimport type { StateDB } from \"../state/state-db.js\";\nimport type { NotionClient } from \"../notion/client.js\";\nimport type { PageObjectResponse } from \"@notionhq/client/build/src/api-endpoints.js\";\nimport { Sema } from \"async-sema\";\nimport { ChangeDetector } from \"./change-detector.js\";\nimport type { ConversionPipeline } from \"../converter/pipeline.js\";\nimport { createDefaultPipeline } from \"../converter/pipeline-factory.js\";\nimport { BlockConverter } from \"../converter/block-converter.js\";\nimport { ImageHandler } from \"./image-handler.js\";\nimport { FileHandler } from \"./file-handler.js\";\nimport { DatabaseSyncer } from \"./database-syncer.js\";\nimport { PropertyMapper } from \"../notion/property-mapper.js\";\nimport { computeHash } from \"../utils/hash.js\";\nimport { getLogger } from \"../utils/logger.js\";\nimport { sanitizeFileName } from \"../utils/sanitize.js\";\nimport { notionIdsEqual } from \"../utils/id.js\";\nimport type { VaultFS } from \"./vault-fs.js\";\nimport {\n notionEnhancedToObsidian,\n obsidianToNotionEnhanced,\n} from \"../converter/enhanced-md-converter.js\";\n\nexport class SyncOrchestrator {\n private readonly changeDetector: ChangeDetector;\n private readonly pipeline: ConversionPipeline;\n private readonly blockConverter: BlockConverter;\n private readonly imageHandler: ImageHandler;\n private readonly fileHandler: FileHandler;\n private readonly databaseSyncer: DatabaseSyncer;\n private readonly propertyMapper: PropertyMapper;\n private dbSchemaLoaded = false;\n\n constructor(\n private readonly config: Config,\n private readonly stateDb: StateDB,\n private readonly notionClient: NotionClient,\n private readonly vaultFs: VaultFS,\n ) {\n this.changeDetector = new ChangeDetector(stateDb);\n this.pipeline = createDefaultPipeline({\n wikilinkResolver: (text) => stateDb.resolveWikilink(text),\n });\n this.blockConverter = new BlockConverter();\n this.imageHandler = new ImageHandler(vaultFs, config.paths.attachments, notionClient);\n this.fileHandler = new FileHandler(vaultFs, notionClient, stateDb);\n this.propertyMapper = new PropertyMapper();\n this.databaseSyncer = new DatabaseSyncer(\n config,\n stateDb,\n notionClient,\n vaultFs,\n this.pipeline,\n this.imageHandler,\n );\n this.propertyMapper.setWikilinkResolver({\n resolve: (title: string) => stateDb.resolveWikilink(title)?.notionPageId ?? null,\n resolvePageId: (pageId: string) => stateDb.resolvePageId(pageId)?.title ?? null,\n });\n\n this.blockConverter.initNotionToMd(this.notionClient.getInternalClient());\n }\n\n async push(options?: PushOptions): Promise<PushResult> {\n const startTime = Date.now();\n\n if (this.config.sync.direction === \"pull\") {\n return { created: 0, updated: 0, deleted: 0, failed: [], duration: Date.now() - startTime };\n }\n\n this.cleanupInterruptedSync();\n\n const files = await this.vaultFs.listMarkdownFiles();\n const changes = this.changeDetector.detectLocalChanges(files);\n\n const conflictPaths = new Set(this.stateDb.getByStatus(\"conflict\").map((r) => r.obsidianPath));\n const eligible = options?.force ? changes : changes.filter((c) => !conflictPaths.has(c.path));\n\n const dbFolders = (this.config.notion.databases ?? []).map((d) =>\n d.localFolder.endsWith(\"/\") ? d.localFolder : d.localFolder + \"/\",\n );\n const isDbPath = (path: string) => dbFolders.some((prefix) => path.startsWith(prefix));\n\n const filtered = (\n options?.paths\n ? eligible.filter((c) => options.paths!.some((p) => c.path.startsWith(p)))\n : eligible\n ).filter((c) => !isDbPath(c.path));\n\n const hasDbConfigs = (this.config.notion.databases?.length ?? 0) > 0;\n if (filtered.length === 0 && !hasDbConfigs) {\n return { created: 0, updated: 0, deleted: 0, failed: [], duration: Date.now() - startTime };\n }\n\n if (options?.dryRun) {\n const dryCreated = filtered.filter((c) => c.type === \"created\").length;\n const dryUpdated = filtered.filter((c) => c.type === \"modified\" || c.type === \"moved\").length;\n const dryDeleted = filtered.filter((c) => c.type === \"deleted\").length;\n return {\n created: dryCreated,\n updated: dryUpdated,\n deleted: dryDeleted,\n failed: [],\n duration: Date.now() - startTime,\n };\n }\n\n this.stateDb.setMeta(\"push_in_progress\", \"true\");\n\n const folderPaths = new Set<string>();\n for (const change of filtered) {\n const parts = change.path.split(\"/\");\n if (parts.length > 1) {\n for (let i = 1; i < parts.length; i++) {\n folderPaths.add(parts.slice(0, i).join(\"/\"));\n }\n }\n }\n\n const sortedFolders = [...folderPaths].sort(\n (a, b) => a.split(\"/\").length - b.split(\"/\").length,\n );\n for (const folderPath of sortedFolders) {\n await this.ensureFolderPage(folderPath);\n }\n\n const sema = new Sema(this.config.advanced.concurrency);\n let created = 0;\n let updated = 0;\n let deleted = 0;\n const failed: FailedOperation[] = [];\n\n let completed = 0;\n const total = filtered.length;\n\n const tasks = filtered.map((change) => async () => {\n await sema.acquire();\n try {\n options?.onProgress?.(++completed, total, change.path);\n switch (change.type) {\n case \"created\":\n await this.pushCreate(change.path);\n created++;\n break;\n case \"modified\":\n await this.pushUpdate(change.path);\n updated++;\n break;\n case \"moved\":\n await this.pushMove(change.path);\n updated++;\n break;\n case \"deleted\":\n await this.pushDelete(change.path);\n deleted++;\n break;\n }\n } catch (error) {\n failed.push({\n path: change.path,\n operation:\n change.type === \"created\" ? \"create\" : change.type === \"deleted\" ? \"delete\" : \"update\",\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n sema.release();\n }\n });\n\n await Promise.all(tasks.map((t) => t()));\n\n if (failed.length > 0) {\n const retryTargets = failed.splice(0, failed.length);\n getLogger().info(`[Im-Nobsidian] Push ${retryTargets.length}건 재시도 (2초 후)`);\n await new Promise((r) => setTimeout(r, 2000));\n\n for (const target of retryTargets) {\n const change = filtered.find((c) => c.path === target.path);\n if (!change) {\n failed.push(target);\n continue;\n }\n try {\n switch (change.type) {\n case \"created\":\n await this.pushCreate(change.path);\n created++;\n break;\n case \"modified\":\n await this.pushUpdate(change.path);\n updated++;\n break;\n case \"moved\":\n await this.pushMove(change.path);\n updated++;\n break;\n case \"deleted\":\n await this.pushDelete(change.path);\n deleted++;\n break;\n }\n getLogger().info(`[Im-Nobsidian] 재시도 성공: ${change.path}`);\n } catch (error) {\n failed.push({\n path: change.path,\n operation: target.operation,\n error: error instanceof Error ? error.message : String(error),\n });\n getLogger().warn(`[Im-Nobsidian] 재시도 실패: ${change.path}`);\n }\n }\n }\n\n if (this.config.sync.syncFiles !== false) {\n try {\n const fileResults = await this.fileHandler.pushAllFiles();\n if (fileResults.length > 0) {\n getLogger().info(`[Im-Nobsidian] ${fileResults.length}개 파일 업로드 완료`);\n }\n } catch (error) {\n getLogger().warn(\"[Im-Nobsidian] 파일 업로드 중 오류:\", error);\n }\n }\n\n if ((this.config.notion.databases?.length ?? 0) > 0) {\n try {\n const dbResult = await this.databaseSyncer.pushAll();\n created += dbResult.created;\n updated += dbResult.updated;\n failed.push(...dbResult.failed);\n } catch (error) {\n getLogger().warn(\"[Im-Nobsidian] DB Push 중 오류:\", error);\n }\n }\n\n this.stateDb.setMeta(\"last_push_at\", new Date().toISOString());\n this.stateDb.setMeta(\"last_sync_at\", new Date().toISOString());\n this.stateDb.setMeta(\"push_in_progress\", \"\");\n\n return { created, updated, deleted, failed, duration: Date.now() - startTime };\n }\n\n async pull(options?: PullOptions): Promise<PullResult> {\n const startTime = Date.now();\n const emptyResult: PullResult = {\n created: 0,\n updated: 0,\n deleted: 0,\n conflicts: [],\n writtenPaths: [],\n failed: [],\n duration: Date.now() - startTime,\n };\n\n if (this.config.sync.direction === \"push\") {\n return emptyResult;\n }\n\n this.cleanupInterruptedSync();\n\n let created = 0;\n let updated = 0;\n let deleted = 0;\n const conflicts: Conflict[] = [];\n const writtenPaths: string[] = [];\n const failed: FailedOperation[] = [];\n\n const remoteChanges = await this.detectRemoteChanges();\n\n const filtered = options?.paths\n ? remoteChanges.filter((c) => {\n const record = this.stateDb.getByNotionId(c.pageId);\n return record && options.paths!.some((p) => record.obsidianPath.startsWith(p));\n })\n : remoteChanges;\n\n if (filtered.length === 0) {\n return emptyResult;\n }\n\n if (options?.dryRun) {\n const dryCreated = filtered.filter((c) => c.type === \"created\").length;\n const dryUpdated = filtered.filter((c) => c.type === \"modified\").length;\n const dryDeleted = filtered.filter((c) => c.type === \"deleted\").length;\n return {\n created: dryCreated,\n updated: dryUpdated,\n deleted: dryDeleted,\n conflicts: [],\n writtenPaths: [],\n failed: [],\n duration: Date.now() - startTime,\n };\n }\n\n this.stateDb.setMeta(\"pull_in_progress\", \"true\");\n\n const sema = new Sema(this.config.advanced.concurrency);\n\n let pullCompleted = 0;\n const pullTotal = filtered.length;\n\n const tasks = filtered.map((change) => async () => {\n await sema.acquire();\n try {\n options?.onProgress?.(++pullCompleted, pullTotal, change.pageId);\n switch (change.type) {\n case \"created\": {\n const path = await this.pullCreate(change.pageId);\n writtenPaths.push(path);\n created++;\n break;\n }\n case \"modified\": {\n const result = await this.pullUpdate(change);\n if (result.conflict) {\n conflicts.push(result.conflict);\n } else if (result.path) {\n writtenPaths.push(result.path);\n updated++;\n }\n break;\n }\n case \"deleted\": {\n const path = await this.pullDelete(change.pageId);\n if (path) {\n deleted++;\n }\n break;\n }\n }\n } catch (error) {\n const record = this.stateDb.getByNotionId(change.pageId);\n failed.push({\n path: record?.obsidianPath ?? change.pageId,\n operation:\n change.type === \"created\" ? \"create\" : change.type === \"deleted\" ? \"delete\" : \"update\",\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n sema.release();\n }\n });\n\n await Promise.all(tasks.map((t) => t()));\n\n if (failed.length > 0) {\n const retryTargets = failed.splice(0, failed.length);\n getLogger().info(`[Im-Nobsidian] Pull ${retryTargets.length}건 재시도 (2초 후)`);\n await new Promise((r) => setTimeout(r, 2000));\n\n for (const target of retryTargets) {\n const change = filtered.find((c) => {\n const record = this.stateDb.getByNotionId(c.pageId);\n return (record?.obsidianPath ?? c.pageId) === target.path;\n });\n if (!change) {\n failed.push(target);\n continue;\n }\n try {\n switch (change.type) {\n case \"created\": {\n const path = await this.pullCreate(change.pageId);\n writtenPaths.push(path);\n created++;\n break;\n }\n case \"modified\": {\n const result = await this.pullUpdate(change);\n if (result.conflict) {\n conflicts.push(result.conflict);\n } else if (result.path) {\n writtenPaths.push(result.path);\n updated++;\n }\n break;\n }\n case \"deleted\": {\n const path = await this.pullDelete(change.pageId);\n if (path) deleted++;\n break;\n }\n }\n getLogger().info(`[Im-Nobsidian] 재시도 성공: ${target.path}`);\n } catch (error) {\n failed.push({\n path: target.path,\n operation: target.operation,\n error: error instanceof Error ? error.message : String(error),\n });\n getLogger().warn(`[Im-Nobsidian] 재시도 실패: ${target.path}`);\n }\n }\n }\n\n if ((this.config.notion.databases?.length ?? 0) > 0) {\n try {\n const dbResult = await this.databaseSyncer.pullAll();\n created += dbResult.created;\n updated += dbResult.updated;\n failed.push(...dbResult.failed);\n if (dbResult.created + dbResult.updated > 0) {\n const dbPaths = this.stateDb\n .getByStatus(\"synced\")\n .filter((r) => r.fileType === \"db-row\")\n .map((r) => r.obsidianPath);\n writtenPaths.push(...dbPaths.slice(-dbResult.created - dbResult.updated));\n }\n } catch (error) {\n getLogger().warn(\"[Im-Nobsidian] DB Pull 중 오류:\", error);\n }\n }\n\n if (!this.isDatabaseMode) {\n try {\n const discoveredDbs = await this.discoverChildDatabases();\n const configuredIds = new Set(\n (this.config.notion.databases ?? []).map((d) => d.databaseId.replace(/-/g, \"\")),\n );\n const newDbs = discoveredDbs.filter((db) => !configuredIds.has(db.dbId.replace(/-/g, \"\")));\n for (const { dbId, parentPageId } of newDbs) {\n try {\n const dbTitle = await this.notionClient.getDatabaseTitle(dbId);\n const safeName = (dbTitle || dbId.slice(0, 8))\n .replace(/[^a-zA-Z0-9가-힣\\s_-]/g, \"\")\n .replace(/\\s+/g, \"-\");\n const parentEntry = parentPageId ? this.stateDb.getByNotionId(parentPageId) : null;\n let parentFolder = \"databases\";\n if (parentEntry?.obsidianPath) {\n const parts = parentEntry.obsidianPath.split(\"/\");\n parts.pop();\n parentFolder = parts.length > 0 ? parts.join(\"/\") : \"databases\";\n }\n const folderName = `${parentFolder}/${safeName}`;\n const dbConfig = {\n databaseId: dbId,\n localFolder: folderName,\n titleProperty: \"Name\",\n };\n const dbResult = await this.databaseSyncer.pullDatabase(dbConfig);\n created += dbResult.created;\n updated += dbResult.updated;\n failed.push(...dbResult.failed);\n } catch (error) {\n getLogger().warn(`[Im-Nobsidian] 자동 발견 DB ${dbId} 동기화 실패:`, error);\n }\n }\n } catch (error) {\n getLogger().warn(\"[Im-Nobsidian] child_database 자동 발견 실패:\", error);\n }\n }\n\n const allSyncedMdPaths = this.stateDb\n .getAll()\n .filter((r) => r.obsidianPath?.endsWith(\".md\"))\n .map((r) => r.obsidianPath!);\n await this.resolveNotionLinks(allSyncedMdPaths);\n\n this.stateDb.setMeta(\"last_pull_at\", new Date().toISOString());\n this.stateDb.setMeta(\"last_sync_at\", new Date().toISOString());\n this.stateDb.setMeta(\"pull_in_progress\", \"\");\n\n return {\n created,\n updated,\n deleted,\n conflicts,\n writtenPaths,\n failed,\n duration: Date.now() - startTime,\n };\n }\n\n async sync(options?: SyncOptions): Promise<SyncResult> {\n const startTime = Date.now();\n const pullResult = await this.pull(options);\n const pushResult = await this.push({\n ...options,\n paths: options?.paths,\n });\n\n return {\n pull: pullResult,\n push: pushResult,\n conflicts: pullResult.conflicts,\n duration: Date.now() - startTime,\n };\n }\n\n async status(): Promise<StatusResult> {\n const files = await this.vaultFs.listMarkdownFiles();\n const localChanges = this.changeDetector.detectLocalChanges(files);\n const remoteChanges = await this.detectRemoteChanges();\n const conflictRecords = this.stateDb.getByStatus(\"conflict\");\n const lastSyncAt = this.stateDb.getMeta(\"last_sync_at\");\n\n const conflicts: Conflict[] = await this.buildConflictsFromRecords(\n conflictRecords,\n localChanges,\n remoteChanges,\n );\n\n return {\n localChanges,\n remoteChanges,\n conflicts,\n conflictRecords,\n pendingOperations: conflictRecords.length,\n lastSyncAt,\n };\n }\n\n private async buildConflictsFromRecords(\n records: SyncRecord[],\n localChanges: LocalChange[],\n remoteChanges: RemoteChange[],\n ): Promise<Conflict[]> {\n const conflicts: Conflict[] = [];\n\n for (const record of records) {\n const localChange = localChanges.find((c) => c.path === record.obsidianPath) ?? {\n path: record.obsidianPath,\n type: \"modified\" as const,\n currentHash: record.contentHash,\n previousHash: record.contentHash,\n };\n\n const remoteChange = remoteChanges.find((c) => c.pageId === record.notionPageId) ?? {\n pageId: record.notionPageId ?? \"\",\n type: \"modified\" as const,\n lastEdited: record.notionLastEdited ?? \"\",\n previousEdited: null,\n };\n\n let localContent = \"\";\n try {\n localContent = await this.vaultFs.readFile(record.obsidianPath);\n } catch {\n // 파일이 삭제된 경우\n }\n\n let remoteContent = \"\";\n if (record.notionPageId) {\n try {\n remoteContent = await this.fetchPageMarkdown(record.notionPageId);\n } catch {\n // 페이지가 삭제된 경우\n }\n }\n\n conflicts.push({\n syncRecord: record,\n localChange,\n remoteChange,\n baseContent: record.baseSnapshot?.toString(\"utf-8\") ?? null,\n localContent,\n remoteContent,\n });\n }\n\n return conflicts;\n }\n\n private get isDatabaseMode(): boolean {\n return this.config.notion.parentMode === \"database\" && !!this.config.notion.databaseId;\n }\n\n private async discoverChildDatabases(): Promise<Array<{ dbId: string; parentPageId: string }>> {\n const rootId = this.config.notion.rootPageId;\n const allDbs: Array<{ dbId: string; parentPageId: string }> = [];\n let currentLevel: string[] = [rootId];\n\n while (currentLevel.length > 0) {\n const nextLevel: string[] = [];\n for (const parentId of currentLevel) {\n try {\n const dbIds = await this.notionClient.getChildDatabaseIds(parentId);\n for (const dbId of dbIds) {\n allDbs.push({ dbId, parentPageId: parentId });\n }\n const childPages = await this.notionClient.getChildPages(parentId);\n nextLevel.push(...childPages.map((p) => p.id));\n } catch {\n // 접근 권한 없는 블록 무시\n }\n }\n currentLevel = nextLevel;\n }\n\n return allDbs;\n }\n\n private async resolveNotionLinks(paths: string[]): Promise<void> {\n const allRecords = this.stateDb.getAll();\n const idToTitle = new Map<string, string>();\n for (const r of allRecords) {\n if (r.notionPageId && r.obsidianPath) {\n const title = r.obsidianPath.replace(/\\.md$/, \"\").split(\"/\").pop() ?? \"\";\n const cleanId = r.notionPageId.replace(/-/g, \"\");\n idToTitle.set(cleanId, title);\n idToTitle.set(r.notionPageId, title);\n }\n }\n if (idToTitle.size === 0) return;\n\n for (const filePath of paths) {\n if (!filePath.endsWith(\".md\")) continue;\n try {\n let content = await this.vaultFs.readFile(filePath);\n let changed = false;\n\n const resolved = content.replace(/\\[\\[notion:([a-f0-9-]+)\\]\\]/g, (_match, id: string) => {\n const title = idToTitle.get(id.replace(/-/g, \"\"));\n if (title) {\n changed = true;\n return `[[${title}]]`;\n }\n return _match;\n });\n content = resolved;\n\n const resolved2 = content.replace(\n /\\[([^\\]]+)\\]\\(\\/([a-f0-9]{32})\\?pvs=\\d+\\)/g,\n (_match, text: string, id: string) => {\n const title = idToTitle.get(id);\n if (title) {\n changed = true;\n return `[[${title}|${text}]]`;\n }\n return _match;\n },\n );\n content = resolved2;\n\n if (changed) {\n await this.vaultFs.writeFile(filePath, content);\n }\n } catch {\n // 파일 읽기/쓰기 실패 무시\n }\n }\n }\n\n private async ensureDbSchema(): Promise<void> {\n if (this.dbSchemaLoaded || !this.isDatabaseMode) return;\n const schema = await this.notionClient.getDatabaseSchema(this.config.notion.databaseId!);\n this.propertyMapper.loadSchema(schema);\n this.dbSchemaLoaded = true;\n }\n\n private async pushCreate(path: string): Promise<void> {\n const content = await this.vaultFs.readFile(path);\n const title = extractTitle(path);\n const parentId = await this.resolveNotionParent(path);\n\n const selectedPath = this.pipeline.selectPath(content);\n if (selectedPath === \"block-api\") {\n getLogger().warn(\n `[Im-Nobsidian] \"${path}\" contains block-api features (inline-db/column/toggle) — converted with reduced fidelity in v0.1.0`,\n );\n }\n\n const conversionResult = this.pipeline.convertToNotion(content, {\n direction: \"push\",\n path: selectedPath,\n filePath: path,\n parentMode: this.config.notion.parentMode,\n });\n\n let effectiveParentId = parentId;\n let effectiveParentType: \"page\" | \"database\" = \"page\";\n let effectiveProperties = conversionResult.properties;\n\n if (this.isDatabaseMode) {\n await this.ensureDbSchema();\n effectiveParentId = this.config.notion.databaseId!;\n effectiveParentType = \"database\";\n effectiveProperties = this.propertyMapper.toNotionProperties(\n conversionResult.properties,\n title,\n );\n }\n\n const page = await this.pushCreatePage(\n effectiveParentId,\n effectiveParentType,\n title,\n conversionResult.content,\n effectiveProperties,\n );\n\n await this.imageHandler.uploadAndAppendImages(page.id, conversionResult.images);\n\n const hash = computeHash(content);\n\n this.stateDb.transaction(() => {\n this.stateDb.upsert({\n obsidianPath: path,\n notionPageId: page.id,\n notionParentId: parentId,\n contentHash: hash,\n notionLastEdited: page.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType: this.isFolderNote(path) ? \"folder-note\" : \"file\",\n status: \"synced\",\n baseSnapshot: Buffer.from(content, \"utf-8\"),\n });\n\n const aliases = extractAliases(conversionResult.properties);\n this.stateDb.upsertWikilink({\n obsidianPath: path,\n notionPageId: page.id,\n title,\n aliases,\n });\n\n this.stateDb.storePreserveMarkers(path, conversionResult.preserveMarkers);\n });\n }\n\n private async pushUpdate(path: string): Promise<void> {\n const content = await this.vaultFs.readFile(path);\n const record = this.stateDb.getByPath(path);\n if (!record?.notionPageId) return;\n\n const updatePath = this.pipeline.selectPath(content);\n if (updatePath === \"block-api\") {\n getLogger().warn(\n `[Im-Nobsidian] \"${path}\" contains block-api features (inline-db/column/toggle) — converted with reduced fidelity in v0.1.0`,\n );\n }\n\n const conversionResult = this.pipeline.convertToNotion(content, {\n direction: \"push\",\n path: updatePath,\n filePath: path,\n parentMode: this.config.notion.parentMode,\n });\n\n await this.pushUpdatePage(record.notionPageId, conversionResult.content, record.baseSnapshot);\n\n await this.imageHandler.uploadAndAppendImages(record.notionPageId, conversionResult.images);\n\n let propsToUpdate = conversionResult.properties;\n if (this.isDatabaseMode && propsToUpdate && Object.keys(propsToUpdate).length > 0) {\n await this.ensureDbSchema();\n const title = extractTitle(path);\n propsToUpdate = this.propertyMapper.toNotionProperties(propsToUpdate, title);\n }\n\n if (propsToUpdate && Object.keys(propsToUpdate).length > 0) {\n await this.notionClient.updatePageProperties(record.notionPageId, propsToUpdate);\n }\n\n const updatedPage = await this.notionClient.getPage(record.notionPageId);\n\n const hash = computeHash(content);\n const title = extractTitle(path);\n const aliases = extractAliases(conversionResult.properties);\n this.stateDb.transaction(() => {\n this.stateDb.updateHash(record.id, hash, Buffer.from(content, \"utf-8\"));\n this.stateDb.updateStatus(record.id, \"synced\");\n this.stateDb.setNotionLastEdited(record.id, updatedPage.last_edited_time);\n this.stateDb.storePreserveMarkers(path, conversionResult.preserveMarkers);\n this.stateDb.upsertWikilink({\n obsidianPath: path,\n notionPageId: record.notionPageId!,\n title,\n aliases,\n });\n });\n }\n\n private async pushDelete(path: string): Promise<void> {\n const record = this.stateDb.getByPath(path);\n if (!record?.notionPageId) return;\n\n if (this.config.sync.deleteSync) {\n await this.notionClient.archivePage(record.notionPageId);\n this.stateDb.delete(record.id);\n } else {\n this.stateDb.updateStatus(record.id, \"pending\");\n }\n }\n\n private async pushMove(path: string): Promise<void> {\n const record = this.stateDb.getByPath(path);\n if (!record?.notionPageId) return;\n\n const newParentId = await this.resolveNotionParent(path);\n const currentParentId = record.notionParentId;\n\n if (currentParentId && !notionIdsEqual(newParentId, currentParentId)) {\n try {\n const parentType = this.isDatabaseMode ? \"database\" : \"page\";\n await this.notionClient.movePage(record.notionPageId, newParentId, parentType);\n this.stateDb.setNotionParentId(record.id, newParentId);\n } catch {\n getLogger().warn(`[Im-Nobsidian] Move API 실패 — \"${path}\" 내용만 업데이트합니다`);\n }\n }\n\n await this.pushUpdate(path);\n }\n\n private async detectRemoteChanges(): Promise<RemoteChange[]> {\n const changes: RemoteChange[] = [];\n const lastPull = this.stateDb.getMeta(\"last_pull_at\");\n const syncedRecords = this.stateDb.getAll();\n const trackedPageIds = new Set(\n syncedRecords.filter((r) => r.notionPageId).map((r) => r.notionPageId!),\n );\n\n let remotePages: Array<{ id: string; last_edited_time: string }>;\n if (this.isDatabaseMode) {\n const allPages: Array<{ id: string; last_edited_time: string }> = [];\n let cursor: string | undefined;\n do {\n const result = await this.notionClient.queryDatabase(this.config.notion.databaseId!, {\n startCursor: cursor,\n });\n allPages.push(\n ...result.results.map((p) => ({ id: p.id, last_edited_time: p.last_edited_time })),\n );\n cursor = result.nextCursor ?? undefined;\n } while (cursor);\n remotePages = allPages;\n } else {\n remotePages = await this.notionClient.getChildPagesRecursive(this.config.notion.rootPageId);\n }\n\n for (const page of remotePages) {\n const record = this.stateDb.getByNotionId(page.id);\n\n if (!record) {\n changes.push({\n pageId: page.id,\n type: \"created\",\n lastEdited: page.last_edited_time,\n previousEdited: null,\n });\n } else if (page.last_edited_time !== record.notionLastEdited) {\n changes.push({\n pageId: page.id,\n type: \"modified\",\n lastEdited: page.last_edited_time,\n previousEdited: record.notionLastEdited,\n });\n }\n\n trackedPageIds.delete(page.id);\n }\n\n if (this.config.sync.deleteSync && lastPull) {\n for (const orphanId of trackedPageIds) {\n const record = syncedRecords.find((r) => r.notionPageId === orphanId);\n if (record) {\n changes.push({\n pageId: orphanId,\n type: \"deleted\",\n lastEdited: new Date().toISOString(),\n previousEdited: record.notionLastEdited,\n });\n }\n }\n }\n\n return changes;\n }\n\n private async pullCreate(pageId: string): Promise<string> {\n const page = await this.notionClient.getPage(pageId);\n const title = this.notionClient.extractTitle(page);\n const safeName = sanitizeFileName(title);\n\n const parentPath = await this.resolveParentPath(page);\n\n const allChildren = await this.notionClient.fetchAllChildrenDeep(pageId);\n const hasChildPages = allChildren.some((b) => \"type\" in b && b.type === \"child_page\");\n\n const markdown = await this.fetchPageMarkdown(pageId);\n const hasContent = markdown.trim().length > 0;\n\n let filePath: string;\n let fileType: \"file\" | \"folder-note\" | \"folder-only\";\n\n if (hasChildPages && hasContent) {\n const folderPath = parentPath ? `${parentPath}/${safeName}` : safeName;\n filePath = await this.resolveUniqueFilePath(`${folderPath}/${safeName}.md`);\n fileType = \"folder-note\";\n await this.vaultFs.ensureFolder(folderPath);\n } else if (hasChildPages && !hasContent) {\n const folderPath = parentPath ? `${parentPath}/${safeName}` : safeName;\n filePath = await this.resolveUniqueFilePath(`${folderPath}/${safeName}.md`);\n fileType = \"folder-only\";\n await this.vaultFs.ensureFolder(folderPath);\n } else {\n const basePath = parentPath ? `${parentPath}/${safeName}.md` : `${safeName}.md`;\n filePath = await this.resolveUniqueFilePath(basePath);\n fileType = \"file\";\n }\n\n let properties: Record<string, unknown>;\n if (this.isDatabaseMode) {\n await this.ensureDbSchema();\n properties = this.propertyMapper.fromNotionProperties(\n (page as unknown as { properties: Record<string, unknown> }).properties,\n );\n } else {\n properties = this.notionClient.extractProperties(page);\n }\n properties.title = title;\n\n let processedMarkdown = markdown;\n if (this.config.conversion.imageDownload === \"immediate\") {\n const imageResult = await this.imageHandler.downloadAllImages(markdown, title);\n processedMarkdown = imageResult.content;\n }\n\n const fileResult = await this.imageHandler.downloadAllFiles(processedMarkdown, title);\n processedMarkdown = fileResult.content;\n\n const finalContent = this.pipeline.convertToMarkdown(\n processedMarkdown,\n {\n direction: \"pull\",\n path: \"markdown-api\",\n filePath,\n parentMode: this.config.notion.parentMode,\n },\n { properties },\n );\n\n await this.vaultFs.writeFile(filePath, finalContent);\n\n const hash = computeHash(finalContent);\n const resolvedParentId = await this.extractParentId(page);\n this.stateDb.transaction(() => {\n this.stateDb.upsert({\n obsidianPath: filePath,\n notionPageId: pageId,\n notionParentId: resolvedParentId,\n contentHash: hash,\n notionLastEdited: page.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType,\n status: \"synced\",\n baseSnapshot: Buffer.from(finalContent, \"utf-8\"),\n });\n\n const aliases = extractAliases(properties);\n this.stateDb.upsertWikilink({\n obsidianPath: filePath,\n notionPageId: pageId,\n title,\n aliases,\n });\n });\n\n return filePath;\n }\n\n private async pullUpdate(change: RemoteChange): Promise<{ path?: string; conflict?: Conflict }> {\n const record = this.stateDb.getByNotionId(change.pageId);\n if (!record) return {};\n\n const page = await this.notionClient.getPage(change.pageId);\n let markdown = await this.fetchPageMarkdown(change.pageId);\n\n const title = this.notionClient.extractTitle(page);\n\n let properties: Record<string, unknown>;\n if (this.isDatabaseMode) {\n await this.ensureDbSchema();\n properties = this.propertyMapper.fromNotionProperties(\n (page as unknown as { properties: Record<string, unknown> }).properties,\n );\n } else {\n properties = this.notionClient.extractProperties(page);\n }\n properties.title = title;\n\n if (this.config.conversion.imageDownload === \"immediate\") {\n const imageResult = await this.imageHandler.downloadAllImages(markdown, title);\n markdown = imageResult.content;\n }\n\n const fileResult = await this.imageHandler.downloadAllFiles(markdown, title);\n markdown = fileResult.content;\n\n const savedMarkers = this.stateDb.getPreserveMarkers(record.obsidianPath);\n const remoteContent = this.pipeline.convertToMarkdown(\n markdown,\n {\n direction: \"pull\",\n path: \"markdown-api\",\n filePath: record.obsidianPath,\n parentMode: this.config.notion.parentMode,\n },\n { properties, preserveMarkers: savedMarkers.length > 0 ? savedMarkers : undefined },\n );\n\n let localContent: string;\n try {\n localContent = await this.vaultFs.readFile(record.obsidianPath);\n } catch {\n localContent = \"\";\n }\n\n const localHash = computeHash(localContent);\n const localModified = localHash !== record.contentHash;\n\n if (localModified) {\n const strategy = this.config.sync.conflictStrategy;\n\n if (strategy === \"remote-first\") {\n // 리모트 우선: 로컬 변경 무시, 리모트 내용으로 덮어쓰기\n } else if (strategy === \"local-first\") {\n return { path: record.obsidianPath };\n } else {\n const conflict: Conflict = {\n syncRecord: record,\n localChange: {\n path: record.obsidianPath,\n type: \"modified\",\n currentHash: localHash,\n previousHash: record.contentHash,\n },\n remoteChange: change,\n baseContent: record.baseSnapshot?.toString(\"utf-8\") ?? null,\n localContent,\n remoteContent,\n };\n\n this.stateDb.updateStatus(record.id, \"conflict\");\n return { conflict };\n }\n }\n\n await this.vaultFs.writeFile(record.obsidianPath, remoteContent);\n\n const newHash = computeHash(remoteContent);\n this.stateDb.upsert({\n obsidianPath: record.obsidianPath,\n notionPageId: change.pageId,\n notionParentId: record.notionParentId,\n contentHash: newHash,\n notionLastEdited: page.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: record.syncDirection,\n fileType: record.fileType,\n status: \"synced\",\n baseSnapshot: Buffer.from(remoteContent, \"utf-8\"),\n });\n\n return { path: record.obsidianPath };\n }\n\n private async pullDelete(pageId: string): Promise<string | null> {\n const record = this.stateDb.getByNotionId(pageId);\n if (!record) return null;\n\n if (this.config.sync.deleteSync) {\n try {\n await this.vaultFs.deleteFile(record.obsidianPath);\n } catch {\n // 이미 삭제된 경우 무시\n }\n }\n\n this.stateDb.delete(record.id);\n return record.obsidianPath;\n }\n\n private async ensureFolderPage(folderPath: string): Promise<void> {\n const existing = this.stateDb.getByPath(folderPath);\n if (existing?.notionPageId) return;\n\n const folderNotePath = `${folderPath}/${folderPath.split(\"/\").pop()}.md`;\n const folderNoteRecord = this.stateDb.getByPath(folderNotePath);\n if (folderNoteRecord?.notionParentId) {\n this.stateDb.upsert({\n obsidianPath: folderPath,\n notionPageId: folderNoteRecord.notionParentId,\n notionParentId: \"\",\n contentHash: \"\",\n notionLastEdited: folderNoteRecord.notionLastEdited,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType: \"folder-note\",\n status: \"synced\",\n });\n return;\n }\n\n const parts = folderPath.split(\"/\");\n const folderName = parts[parts.length - 1]!;\n\n let parentId = this.config.notion.rootPageId;\n if (parts.length > 1) {\n const parentPath = parts.slice(0, -1).join(\"/\");\n const parentRecord = this.stateDb.getByPath(parentPath);\n if (parentRecord?.notionPageId) {\n parentId = parentRecord.notionPageId;\n }\n }\n\n const folderPage = await this.notionClient.createPage({\n parentId,\n parentType: \"page\",\n title: folderName,\n });\n\n this.stateDb.upsert({\n obsidianPath: folderPath,\n notionPageId: folderPage.id,\n notionParentId: parentId,\n contentHash: \"\",\n notionLastEdited: folderPage.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType: \"folder-note\",\n status: \"synced\",\n });\n }\n\n private async resolveNotionParent(filePath: string): Promise<string> {\n const parts = filePath.split(\"/\");\n if (parts.length <= 1) return this.config.notion.rootPageId;\n\n const folderPath = parts.slice(0, -1).join(\"/\");\n const folderRecord = this.stateDb.getByPath(folderPath);\n if (folderRecord?.notionPageId) return folderRecord.notionPageId;\n\n return this.config.notion.rootPageId;\n }\n\n private isFolderNote(filePath: string): boolean {\n const parts = filePath.split(\"/\");\n if (parts.length < 2) return false;\n const fileName = parts[parts.length - 1]!.replace(/\\.md$/, \"\");\n const folderName = parts[parts.length - 2]!;\n return fileName === folderName;\n }\n\n private async resolveParentPath(page: PageObjectResponse): Promise<string> {\n const parentId = await this.extractParentId(page);\n if (!parentId || notionIdsEqual(parentId, this.config.notion.rootPageId)) return \"\";\n\n const parentRecord = this.stateDb.getByNotionId(parentId);\n if (parentRecord) {\n if (parentRecord.fileType === \"folder-note\" || parentRecord.fileType === \"folder-only\") {\n const pathParts = parentRecord.obsidianPath.split(\"/\");\n pathParts.pop();\n return pathParts.join(\"/\");\n }\n const pathParts = parentRecord.obsidianPath.split(\"/\");\n pathParts.pop();\n const parentDir = pathParts.join(\"/\");\n return (\n parentDir ||\n sanitizeFileName(this.notionClient.extractTitle(await this.notionClient.getPage(parentId)))\n );\n }\n\n try {\n const parentPage = await this.notionClient.getPage(parentId);\n const parentTitle = this.notionClient.extractTitle(parentPage);\n const grandparentPath = await this.resolveParentPath(parentPage);\n const safeName = sanitizeFileName(parentTitle);\n return grandparentPath ? `${grandparentPath}/${safeName}` : safeName;\n } catch {\n return \"\";\n }\n }\n\n private async pushCreatePage(\n parentId: string,\n parentType: \"page\" | \"database\",\n title: string,\n markdownContent: string,\n properties?: Record<string, unknown>,\n ): Promise<PageObjectResponse> {\n if (this.config.conversion.preferMarkdownApi !== false) {\n try {\n const enhanced = obsidianToNotionEnhanced(markdownContent);\n return await this.notionClient.createPageWithMarkdown({\n parentId,\n parentType,\n title,\n markdown: enhanced,\n properties,\n });\n } catch {\n // Markdown API 실패 시 blocks API fallback\n }\n }\n\n const blocks = this.blockConverter.markdownToNotionBlocks(markdownContent);\n const page = await this.notionClient.createPage({\n parentId,\n parentType,\n title,\n properties,\n });\n if (blocks.length > 0) {\n await this.notionClient.appendChildren(page.id, blocks);\n }\n return page;\n }\n\n private async pushUpdatePage(\n pageId: string,\n markdownContent: string,\n baseSnapshot?: Buffer | null,\n ): Promise<void> {\n if (this.config.conversion.preferMarkdownApi !== false) {\n try {\n const enhanced = obsidianToNotionEnhanced(markdownContent);\n\n if (baseSnapshot) {\n const baseEnhanced = obsidianToNotionEnhanced(baseSnapshot.toString(\"utf-8\"));\n const patches = this.computePatches(baseEnhanced, enhanced);\n if (patches.length > 0 && patches.length <= 20) {\n try {\n await this.notionClient.updatePageMarkdownPartial(pageId, patches);\n return;\n } catch {\n await this.notionClient.replacePageMarkdown(pageId, enhanced);\n return;\n }\n }\n }\n\n await this.notionClient.replacePageMarkdown(pageId, enhanced);\n return;\n } catch {\n // Markdown API 실패 시 blocks API fallback\n }\n }\n\n const blocks = this.blockConverter.markdownToNotionBlocks(markdownContent);\n const existingBlocks = await this.notionClient.fetchAllChildren(pageId);\n\n if (blocks.length > 0) {\n await this.notionClient.appendChildren(pageId, blocks);\n }\n const deleteSema = new Sema(this.config.advanced.concurrency);\n await Promise.all(\n existingBlocks.map(async (block) => {\n await deleteSema.acquire();\n try {\n await this.notionClient.deleteBlock(block.id);\n } finally {\n deleteSema.release();\n }\n }),\n );\n }\n\n private computePatches(\n oldContent: string,\n newContent: string,\n ): Array<{ oldStr: string; newStr: string }> {\n const oldLines = oldContent.split(\"\\n\");\n const newLines = newContent.split(\"\\n\");\n const patches: Array<{ oldStr: string; newStr: string }> = [];\n\n let i = 0;\n let j = 0;\n while (i < oldLines.length && j < newLines.length) {\n if (oldLines[i] === newLines[j]) {\n i++;\n j++;\n continue;\n }\n\n let oldEnd = i + 1;\n let newEnd = j + 1;\n const lookahead = Math.min(10, oldLines.length - i, newLines.length - j);\n for (let k = 1; k <= lookahead; k++) {\n if (i + k < oldLines.length && newLines[j] === oldLines[i + k]) {\n oldEnd = i + k;\n newEnd = j;\n break;\n }\n if (j + k < newLines.length && oldLines[i] === newLines[j + k]) {\n oldEnd = i;\n newEnd = j + k;\n break;\n }\n oldEnd = i + k;\n newEnd = j + k;\n }\n\n const oldChunk = oldLines.slice(i, oldEnd).join(\"\\n\");\n const newChunk = newLines.slice(j, newEnd).join(\"\\n\");\n if (oldChunk || newChunk) {\n patches.push({ oldStr: oldChunk, newStr: newChunk });\n }\n i = oldEnd;\n j = newEnd;\n }\n\n if (i < oldLines.length || j < newLines.length) {\n patches.push({\n oldStr: oldLines.slice(i).join(\"\\n\"),\n newStr: newLines.slice(j).join(\"\\n\"),\n });\n }\n\n return patches;\n }\n\n private async fetchPageMarkdown(pageId: string): Promise<string> {\n if (this.config.conversion.preferMarkdownApi !== false) {\n try {\n const result = await this.notionClient.getPageMarkdown(pageId);\n return notionEnhancedToObsidian(result.markdown);\n } catch {\n // Markdown API 실패 시 blocks API fallback\n }\n }\n return this.blockConverter.notionBlocksToMarkdown(pageId);\n }\n\n private async extractParentId(page: PageObjectResponse): Promise<string | null> {\n const parent = page.parent as {\n type: string;\n page_id?: string;\n database_id?: string;\n block_id?: string;\n };\n if (parent.type === \"page_id\") return parent.page_id ?? null;\n if (parent.type === \"database_id\") return parent.database_id ?? null;\n if (parent.type === \"block_id\" && parent.block_id) {\n return this.resolveBlockToPageId(parent.block_id);\n }\n return null;\n }\n\n private async resolveBlockToPageId(blockId: string): Promise<string | null> {\n for (let i = 0; i < 10; i++) {\n try {\n const block = await this.notionClient.getBlock(blockId);\n const bp = (\n block as unknown as { parent: { type: string; page_id?: string; block_id?: string } }\n ).parent;\n if (bp.type === \"page_id\") return bp.page_id ?? null;\n if (bp.type === \"block_id\" && bp.block_id) {\n blockId = bp.block_id;\n continue;\n }\n return null;\n } catch {\n return null;\n }\n }\n return null;\n }\n\n private cleanupInterruptedSync(): void {\n const pushInProgress = this.stateDb.getMeta(\"push_in_progress\");\n const pullInProgress = this.stateDb.getMeta(\"pull_in_progress\");\n\n if (pushInProgress === \"true\") {\n getLogger().warn(\"[Im-Nobsidian] 이전 push가 비정상 종료됨 — 플래그 정리\");\n this.stateDb.setMeta(\"push_in_progress\", \"\");\n }\n if (pullInProgress === \"true\") {\n getLogger().warn(\"[Im-Nobsidian] 이전 pull이 비정상 종료됨 — 플래그 정리\");\n this.stateDb.setMeta(\"pull_in_progress\", \"\");\n }\n }\n\n private async resolveUniqueFilePath(basePath: string): Promise<string> {\n if (!(await this.vaultFs.exists(basePath))) return basePath;\n\n const dir = basePath.lastIndexOf(\"/\") >= 0 ? basePath.slice(0, basePath.lastIndexOf(\"/\")) : \"\";\n const ext = \".md\";\n const name = basePath.slice(dir ? dir.length + 1 : 0, -ext.length);\n\n for (let i = 1; i <= 99; i++) {\n const candidate = dir ? `${dir}/${name} (${i})${ext}` : `${name} (${i})${ext}`;\n if (!(await this.vaultFs.exists(candidate))) return candidate;\n }\n\n return basePath;\n }\n}\n\nfunction extractTitle(filePath: string): string {\n const parts = filePath.split(\"/\");\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.md$/, \"\");\n}\n\nfunction extractAliases(properties: Record<string, unknown>): string[] {\n const raw = properties.aliases ?? properties.alias;\n if (!raw) return [];\n if (Array.isArray(raw)) return raw.filter((a): a is string => typeof a === \"string\");\n if (typeof raw === \"string\")\n return raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return [];\n}\n","import { readFile, writeFile, unlink, rename, mkdir, readdir, stat } from \"node:fs/promises\";\nimport { readFileSync } from \"node:fs\";\nimport { join, relative, dirname } from \"node:path\";\nimport type { VaultFS, NonMdFileInfo } from \"./vault-fs.js\";\nimport type { FileInfo } from \"./change-detector.js\";\n\nexport interface PathFilterConfig {\n readonly include?: string[];\n readonly exclude?: string[];\n}\n\nexport class NodeVaultFS implements VaultFS {\n private readonly includePatterns: string[];\n private readonly excludePatterns: string[];\n\n constructor(\n private readonly rootPath: string,\n pathConfig?: PathFilterConfig,\n ) {\n this.includePatterns = pathConfig?.include ?? [];\n const configExclude = pathConfig?.exclude ?? [];\n const ignorePatterns = this.loadImNobsidianIgnore();\n this.excludePatterns = [...configExclude, ...ignorePatterns];\n }\n\n private loadImNobsidianIgnore(): string[] {\n try {\n const ignorePath = join(this.rootPath, \".im-nobsidian-ignore\");\n const content = readFileSync(ignorePath, \"utf-8\");\n return content\n .split(\"\\n\")\n .map((line: string) => line.trim())\n .filter((line: string) => line && !line.startsWith(\"#\"));\n } catch {\n return [];\n }\n }\n\n async readFile(path: string): Promise<string> {\n const fullPath = join(this.rootPath, path);\n return readFile(fullPath, \"utf-8\");\n }\n\n async readBinary(path: string): Promise<Buffer> {\n const fullPath = join(this.rootPath, path);\n return readFile(fullPath);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n const fullPath = join(this.rootPath, path);\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, content, \"utf-8\");\n }\n\n async writeBinary(path: string, data: Buffer): Promise<void> {\n const fullPath = join(this.rootPath, path);\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, data);\n }\n\n async deleteFile(path: string): Promise<void> {\n const fullPath = join(this.rootPath, path);\n await unlink(fullPath);\n }\n\n async moveFile(from: string, to: string): Promise<void> {\n const fromPath = join(this.rootPath, from);\n const toPath = join(this.rootPath, to);\n await mkdir(dirname(toPath), { recursive: true });\n await rename(fromPath, toPath);\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await stat(join(this.rootPath, path));\n return true;\n } catch {\n return false;\n }\n }\n\n async ensureFolder(path: string): Promise<void> {\n await mkdir(join(this.rootPath, path), { recursive: true });\n }\n\n async listMarkdownFiles(): Promise<FileInfo[]> {\n const files: FileInfo[] = [];\n await this.walkDir(this.rootPath, files);\n return files;\n }\n\n async listNonMarkdownFiles(): Promise<NonMdFileInfo[]> {\n const files: NonMdFileInfo[] = [];\n await this.walkDirNonMd(this.rootPath, files);\n return files;\n }\n\n private matchesPattern(relativePath: string, pattern: string): boolean {\n if (pattern === \"**/*\" || pattern === \"**\") return true;\n\n if (pattern.endsWith(\"/**\")) {\n const dir = pattern.slice(0, -3);\n return relativePath.startsWith(dir + \"/\") || relativePath === dir;\n } else if (pattern.startsWith(\"*.\")) {\n const ext = pattern.slice(1);\n return relativePath.endsWith(ext);\n } else if (pattern.includes(\"*\")) {\n const regexStr = pattern\n .replace(/\\./g, \"\\\\.\")\n .replace(/\\*\\*/g, \"{{GLOBSTAR}}\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\{\\{GLOBSTAR\\}\\}/g, \".*\");\n return new RegExp(\"^\" + regexStr + \"$\").test(relativePath);\n } else {\n return relativePath === pattern || relativePath.startsWith(pattern + \"/\");\n }\n }\n\n private isExcluded(relativePath: string): boolean {\n if (this.includePatterns.length > 0) {\n const included = this.includePatterns.some((p) => this.matchesPattern(relativePath, p));\n if (!included) return true;\n }\n\n return this.excludePatterns.some((p) => this.matchesPattern(relativePath, p));\n }\n\n private async walkDirNonMd(dir: string, result: NonMdFileInfo[]): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.name.startsWith(\".\")) continue;\n\n const relativePath = relative(this.rootPath, fullPath);\n\n if (this.isExcluded(relativePath)) continue;\n\n if (entry.isDirectory()) {\n await this.walkDirNonMd(fullPath, result);\n } else if (entry.isFile() && !entry.name.endsWith(\".md\")) {\n const fileStat = await stat(fullPath);\n result.push({\n path: relativePath,\n size: fileStat.size,\n mtime: fileStat.mtime.toISOString(),\n });\n }\n }\n }\n\n private async walkDir(dir: string, result: FileInfo[]): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.name.startsWith(\".\")) continue;\n\n const relativePath = relative(this.rootPath, fullPath);\n\n if (this.isExcluded(relativePath)) continue;\n\n if (entry.isDirectory()) {\n await this.walkDir(fullPath, result);\n } else if (entry.isFile() && entry.name.endsWith(\".md\")) {\n const content = await readFile(fullPath, \"utf-8\");\n const fileStat = await stat(fullPath);\n\n result.push({\n path: relativePath,\n content,\n mtime: fileStat.mtime.toISOString(),\n });\n }\n }\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst INLINE_DB_START = /%% im-nobsidian:inline-db:([^\\s]+) %%/g;\nconst INLINE_DB_END = /%% im-nobsidian:end %%/g;\n\nexport class InlineDBParser implements Processor {\n readonly name = \"InlineDBParser\";\n readonly order = 40;\n\n process(input: ProcessorInput): ProcessorOutput {\n const inlineDbBlocks: InlineDBBlock[] = [];\n const content = input.content;\n\n const startMatches = [...content.matchAll(INLINE_DB_START)];\n for (const match of startMatches) {\n const startIdx = match.index!;\n const params = parseParams(match[1]!);\n\n const afterStart = content.indexOf(\"\\n\", startIdx) + 1;\n const endMatch = INLINE_DB_END.exec(content.slice(afterStart));\n\n if (endMatch) {\n const tableContent = content.slice(afterStart, afterStart + endMatch.index!);\n inlineDbBlocks.push({\n id: params[\"id\"] ?? \"\",\n title: params[\"title\"] ?? \"\",\n tableMarkdown: tableContent.trim(),\n startIdx,\n endIdx: afterStart + endMatch.index! + endMatch[0].length,\n });\n }\n\n INLINE_DB_END.lastIndex = 0;\n }\n\n return {\n content,\n metadata: {\n ...input.metadata,\n inlineDbBlocks,\n },\n };\n }\n}\n\ninterface InlineDBBlock {\n readonly id: string;\n readonly title: string;\n readonly tableMarkdown: string;\n readonly startIdx: number;\n readonly endIdx: number;\n}\n\nfunction parseParams(paramString: string): Record<string, string> {\n const params: Record<string, string> = {};\n for (const pair of paramString.split(\"&\")) {\n const [key, value] = pair.split(\"=\");\n if (key && value) {\n params[key] = decodeURIComponent(value);\n }\n }\n return params;\n}\n","export interface MergeResult {\n readonly success: boolean;\n readonly merged: string;\n readonly conflicts: MergeConflictRegion[];\n}\n\nexport interface MergeConflictRegion {\n readonly localLines: string[];\n readonly remoteLines: string[];\n}\n\nexport function threeWayMerge(base: string, local: string, remote: string): MergeResult {\n const baseLines = base.split(\"\\n\");\n const localLines = local.split(\"\\n\");\n const remoteLines = remote.split(\"\\n\");\n\n const localDiff = computeDiff(baseLines, localLines);\n const remoteDiff = computeDiff(baseLines, remoteLines);\n\n const merged: string[] = [];\n const conflicts: MergeConflictRegion[] = [];\n let success = true;\n\n let baseIdx = 0;\n\n while (baseIdx < baseLines.length || localDiff.length > 0 || remoteDiff.length > 0) {\n const localChange = localDiff.find((d) => d.baseStart === baseIdx);\n const remoteChange = remoteDiff.find((d) => d.baseStart === baseIdx);\n\n if (localChange && remoteChange) {\n if (arraysEqual(localChange.newLines, remoteChange.newLines)) {\n merged.push(...localChange.newLines);\n } else {\n success = false;\n conflicts.push({\n localLines: localChange.newLines,\n remoteLines: remoteChange.newLines,\n });\n merged.push(\"<<<<<<< LOCAL\");\n merged.push(...localChange.newLines);\n merged.push(\"=======\");\n merged.push(...remoteChange.newLines);\n merged.push(\">>>>>>> REMOTE\");\n }\n\n baseIdx = Math.max(localChange.baseEnd, remoteChange.baseEnd);\n localDiff.splice(localDiff.indexOf(localChange), 1);\n remoteDiff.splice(remoteDiff.indexOf(remoteChange), 1);\n } else if (localChange) {\n merged.push(...localChange.newLines);\n baseIdx = localChange.baseEnd;\n localDiff.splice(localDiff.indexOf(localChange), 1);\n } else if (remoteChange) {\n merged.push(...remoteChange.newLines);\n baseIdx = remoteChange.baseEnd;\n remoteDiff.splice(remoteDiff.indexOf(remoteChange), 1);\n } else {\n if (baseIdx < baseLines.length) {\n merged.push(baseLines[baseIdx]!);\n }\n baseIdx++;\n }\n }\n\n return {\n success,\n merged: merged.join(\"\\n\"),\n conflicts,\n };\n}\n\ninterface DiffHunk {\n baseStart: number;\n baseEnd: number;\n newLines: string[];\n}\n\nfunction computeDiff(base: string[], modified: string[]): DiffHunk[] {\n const hunks: DiffHunk[] = [];\n let baseIdx = 0;\n let modIdx = 0;\n\n while (baseIdx < base.length && modIdx < modified.length) {\n if (base[baseIdx] === modified[modIdx]) {\n baseIdx++;\n modIdx++;\n } else {\n const hunkStart = baseIdx;\n const newLines: string[] = [];\n\n while (modIdx < modified.length && base[baseIdx] !== modified[modIdx]) {\n newLines.push(modified[modIdx]!);\n modIdx++;\n }\n baseIdx++;\n\n hunks.push({ baseStart: hunkStart, baseEnd: baseIdx, newLines });\n }\n }\n\n if (modIdx < modified.length) {\n hunks.push({\n baseStart: baseIdx,\n baseEnd: base.length,\n newLines: modified.slice(modIdx),\n });\n }\n\n return hunks;\n}\n\nfunction arraysEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false;\n return a.every((val, idx) => val === b[idx]);\n}\n","import type { Conflict, ConflictStrategy } from \"../types/sync.js\";\nimport type { StateDB } from \"../state/state-db.js\";\nimport type { VaultFS } from \"../sync/vault-fs.js\";\nimport { threeWayMerge } from \"./merger.js\";\nimport { computeHash } from \"../utils/hash.js\";\n\nexport type ResolutionChoice = \"local\" | \"remote\" | \"merge\" | \"duplicate\";\n\nexport interface ResolutionResult {\n readonly path: string;\n readonly choice: ResolutionChoice;\n readonly success: boolean;\n readonly mergeHadConflicts?: boolean;\n}\n\nexport class ConflictResolver {\n constructor(\n private readonly stateDb: StateDB,\n private readonly vaultFs: VaultFS,\n ) {}\n\n async resolve(conflict: Conflict, choice: ResolutionChoice): Promise<ResolutionResult> {\n switch (choice) {\n case \"local\":\n return this.resolveLocal(conflict);\n case \"remote\":\n return this.resolveRemote(conflict);\n case \"merge\":\n return this.resolveMerge(conflict);\n case \"duplicate\":\n return this.resolveDuplicate(conflict);\n }\n }\n\n async resolveByStrategy(\n conflict: Conflict,\n strategy: ConflictStrategy,\n ): Promise<ResolutionResult> {\n switch (strategy) {\n case \"local-first\":\n return this.resolve(conflict, \"local\");\n case \"remote-first\":\n return this.resolve(conflict, \"remote\");\n case \"duplicate\":\n return this.resolve(conflict, \"duplicate\");\n case \"manual\":\n return this.resolve(conflict, \"merge\");\n }\n }\n\n async resolveAll(conflicts: Conflict[], strategy: ConflictStrategy): Promise<ResolutionResult[]> {\n const results: ResolutionResult[] = [];\n for (const conflict of conflicts) {\n const result = await this.resolveByStrategy(conflict, strategy);\n results.push(result);\n }\n return results;\n }\n\n private async resolveLocal(conflict: Conflict): Promise<ResolutionResult> {\n const hash = computeHash(conflict.localContent);\n this.stateDb.updateHash(\n conflict.syncRecord.id,\n hash,\n Buffer.from(conflict.localContent, \"utf-8\"),\n );\n this.stateDb.updateStatus(conflict.syncRecord.id, \"synced\");\n\n return { path: conflict.syncRecord.obsidianPath, choice: \"local\", success: true };\n }\n\n private async resolveRemote(conflict: Conflict): Promise<ResolutionResult> {\n await this.vaultFs.writeFile(conflict.syncRecord.obsidianPath, conflict.remoteContent);\n\n const hash = computeHash(conflict.remoteContent);\n this.stateDb.updateHash(\n conflict.syncRecord.id,\n hash,\n Buffer.from(conflict.remoteContent, \"utf-8\"),\n );\n this.stateDb.updateStatus(conflict.syncRecord.id, \"synced\");\n\n return { path: conflict.syncRecord.obsidianPath, choice: \"remote\", success: true };\n }\n\n private async resolveMerge(conflict: Conflict): Promise<ResolutionResult> {\n const base = conflict.baseContent ?? \"\";\n const mergeResult = threeWayMerge(base, conflict.localContent, conflict.remoteContent);\n\n await this.vaultFs.writeFile(conflict.syncRecord.obsidianPath, mergeResult.merged);\n\n const hash = computeHash(mergeResult.merged);\n this.stateDb.updateHash(conflict.syncRecord.id, hash, Buffer.from(mergeResult.merged, \"utf-8\"));\n\n if (mergeResult.success) {\n this.stateDb.updateStatus(conflict.syncRecord.id, \"synced\");\n }\n\n return {\n path: conflict.syncRecord.obsidianPath,\n choice: \"merge\",\n success: mergeResult.success,\n mergeHadConflicts: !mergeResult.success,\n };\n }\n\n private async resolveDuplicate(conflict: Conflict): Promise<ResolutionResult> {\n const originalPath = conflict.syncRecord.obsidianPath;\n const ext = originalPath.endsWith(\".md\") ? \".md\" : \"\";\n const baseName = originalPath.replace(/\\.md$/, \"\");\n const conflictPath = `${baseName}.conflict${ext}`;\n\n await this.vaultFs.writeFile(conflictPath, conflict.remoteContent);\n\n const localHash = computeHash(conflict.localContent);\n this.stateDb.updateHash(\n conflict.syncRecord.id,\n localHash,\n Buffer.from(conflict.localContent, \"utf-8\"),\n );\n this.stateDb.updateStatus(conflict.syncRecord.id, \"synced\");\n\n return { path: originalPath, choice: \"duplicate\", success: true };\n }\n\n generateDiff(conflict: Conflict): string {\n const localLines = conflict.localContent.split(\"\\n\");\n const remoteLines = conflict.remoteContent.split(\"\\n\");\n const lines: string[] = [];\n\n lines.push(`--- local: ${conflict.syncRecord.obsidianPath}`);\n lines.push(`+++ remote: Notion (${conflict.remoteChange.pageId})`);\n lines.push(\"\");\n\n const maxLen = Math.max(localLines.length, remoteLines.length);\n for (let i = 0; i < maxLen; i++) {\n const localLine = localLines[i];\n const remoteLine = remoteLines[i];\n\n if (localLine === remoteLine) {\n lines.push(` ${localLine ?? \"\"}`);\n } else {\n if (localLine !== undefined) lines.push(`- ${localLine}`);\n if (remoteLine !== undefined) lines.push(`+ ${remoteLine}`);\n }\n }\n\n return lines.join(\"\\n\");\n }\n}\n","import { sanitizeFileName } from \"../utils/sanitize.js\";\n\nexport interface NotionPageNode {\n readonly id: string;\n readonly title: string;\n readonly hasContent: boolean;\n readonly hasChildren: boolean;\n readonly isDatabase: boolean;\n readonly parentId: string | null;\n readonly children: NotionPageNode[];\n}\n\nexport type MappingType = \"file\" | \"folder-note\" | \"folder-only\" | \"database-folder\";\n\nexport interface MappingResult {\n readonly type: MappingType;\n readonly obsidianPath: string;\n readonly folderPath?: string;\n readonly notePath?: string;\n readonly schemaPath?: string;\n}\n\nexport class TreeMapper {\n mapNotionToObsidian(root: NotionPageNode, basePath: string = \"\"): MappingResult[] {\n const results: MappingResult[] = [];\n this.mapRecursive(root, basePath, results);\n return results;\n }\n\n private mapRecursive(node: NotionPageNode, parentPath: string, results: MappingResult[]): void {\n const safeName = sanitizeFileName(node.title || \"_untitled\");\n const currentPath = parentPath ? `${parentPath}/${safeName}` : safeName;\n\n if (node.isDatabase) {\n results.push({\n type: \"database-folder\",\n obsidianPath: `${currentPath}/`,\n folderPath: `${currentPath}/`,\n schemaPath: `${currentPath}/_schema.yml`,\n });\n } else if (node.hasContent && node.hasChildren) {\n results.push({\n type: \"folder-note\",\n obsidianPath: `${currentPath}/${safeName}.md`,\n folderPath: `${currentPath}/`,\n notePath: `${currentPath}/${safeName}.md`,\n });\n } else if (!node.hasContent && node.hasChildren) {\n results.push({\n type: \"folder-only\",\n obsidianPath: `${currentPath}/`,\n folderPath: `${currentPath}/`,\n });\n } else {\n results.push({\n type: \"file\",\n obsidianPath: `${currentPath}.md`,\n });\n }\n\n for (const child of node.children) {\n this.mapRecursive(child, currentPath, results);\n }\n }\n\n mapObsidianToNotion(entries: FileSystemEntry[], parentPageId: string): PageCreationPlan[] {\n const plans: PageCreationPlan[] = [];\n this.planRecursive(entries, parentPageId, plans);\n return plans;\n }\n\n private planRecursive(\n entries: FileSystemEntry[],\n parentPageId: string,\n plans: PageCreationPlan[],\n ): void {\n for (const entry of entries) {\n if (entry.isDirectory) {\n const folderNote = this.findFolderNote(entry);\n\n if (folderNote) {\n plans.push({\n type: \"page-with-children\",\n title: entry.name,\n parentPageId,\n contentSource: folderNote.path,\n hasContent: true,\n });\n\n const childEntries = entry.children.filter((c) => c.path !== folderNote.path);\n this.planRecursive(childEntries, `placeholder:${entry.path}`, plans);\n } else {\n plans.push({\n type: \"empty-page-with-children\",\n title: entry.name,\n parentPageId,\n hasContent: false,\n });\n this.planRecursive(entry.children, `placeholder:${entry.path}`, plans);\n }\n } else if (entry.name.endsWith(\".md\") && !entry.name.startsWith(\"_\")) {\n plans.push({\n type: \"leaf-page\",\n title: entry.name.replace(/\\.md$/, \"\"),\n parentPageId,\n contentSource: entry.path,\n hasContent: true,\n });\n }\n }\n }\n\n private findFolderNote(dir: FileSystemEntry): FileSystemEntry | null {\n return dir.children.find((c) => c.name === `${dir.name}.md` || c.name === \"index.md\") ?? null;\n }\n\n determineFileType(page: {\n hasContent: boolean;\n hasChildren: boolean;\n isDatabase: boolean;\n }): MappingType {\n if (page.isDatabase) return \"database-folder\";\n if (page.hasContent && page.hasChildren) return \"folder-note\";\n if (!page.hasContent && page.hasChildren) return \"folder-only\";\n return \"file\";\n }\n}\n\nexport interface FileSystemEntry {\n readonly name: string;\n readonly path: string;\n readonly isDirectory: boolean;\n readonly children: FileSystemEntry[];\n}\n\nexport interface PageCreationPlan {\n readonly type: \"page-with-children\" | \"empty-page-with-children\" | \"leaf-page\";\n readonly title: string;\n readonly parentPageId: string;\n readonly contentSource?: string;\n readonly hasContent: boolean;\n}\n","import { watch } from \"chokidar\";\nimport type { FSWatcher } from \"chokidar\";\n\nexport type WatchEvent = \"add\" | \"change\" | \"unlink\";\n\nexport interface WatchCallback {\n (event: WatchEvent, path: string): void;\n}\n\nexport class FileWatcher {\n private watcher: FSWatcher | null = null;\n\n constructor(\n private readonly rootPath: string,\n private readonly callback: WatchCallback,\n ) {}\n\n start(): void {\n this.watcher = watch(this.rootPath, {\n ignored: [/(^|[/\\\\])\\./, \"**/node_modules/**\", \"**/.im-nobsidian/**\"],\n persistent: true,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 500,\n pollInterval: 100,\n },\n });\n\n this.watcher.on(\"add\", (path) => this.callback(\"add\", path));\n this.watcher.on(\"change\", (path) => this.callback(\"change\", path));\n this.watcher.on(\"unlink\", (path) => this.callback(\"unlink\", path));\n }\n\n async stop(): Promise<void> {\n if (this.watcher) {\n await this.watcher.close();\n this.watcher = null;\n }\n }\n}\n","import type { SyncOrchestrator } from \"../sync/orchestrator.js\";\nimport type { SyncResult } from \"../types/sync.js\";\nimport { FileWatcher } from \"./file-watcher.js\";\nimport type { WatchEvent } from \"./file-watcher.js\";\n\nexport interface WatchSyncOptions {\n readonly debounceMs?: number;\n readonly syncDirection?: \"push\" | \"pull\" | \"both\";\n readonly onSyncStart?: () => void;\n readonly onSyncComplete?: (result: SyncResult) => void;\n readonly onSyncError?: (error: Error) => void;\n readonly onFileChange?: (event: WatchEvent, path: string) => void;\n}\n\nconst DEFAULT_DEBOUNCE_MS = 2000;\n\nexport class WatchSyncService {\n private readonly debounceMs: number;\n private readonly options: WatchSyncOptions;\n private watcher: FileWatcher | null = null;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private pendingChanges: Map<string, WatchEvent> = new Map();\n private syncing = false;\n private syncQueued = false;\n private running = false;\n\n constructor(\n private readonly rootPath: string,\n private readonly orchestrator: SyncOrchestrator,\n options: WatchSyncOptions = {},\n ) {\n this.debounceMs = options.debounceMs ?? DEFAULT_DEBOUNCE_MS;\n this.options = options;\n }\n\n start(): void {\n if (this.running) return;\n\n this.running = true;\n this.watcher = new FileWatcher(this.rootPath, (event, path) => {\n this.handleFileChange(event, path);\n });\n this.watcher.start();\n }\n\n async stop(): Promise<void> {\n if (!this.running) return;\n\n this.running = false;\n this.clearDebounce();\n this.pendingChanges.clear();\n\n if (this.watcher) {\n await this.watcher.stop();\n this.watcher = null;\n }\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n isSyncing(): boolean {\n return this.syncing;\n }\n\n getPendingCount(): number {\n return this.pendingChanges.size;\n }\n\n private handleFileChange(event: WatchEvent, path: string): void {\n if (!path.endsWith(\".md\")) return;\n\n this.pendingChanges.set(path, event);\n this.options.onFileChange?.(event, path);\n this.scheduleSync();\n }\n\n private scheduleSync(): void {\n this.clearDebounce();\n\n this.debounceTimer = setTimeout(() => {\n this.debounceTimer = null;\n void this.executeSync();\n }, this.debounceMs);\n }\n\n private clearDebounce(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n }\n\n private async executeSync(): Promise<void> {\n if (this.syncing) {\n this.syncQueued = true;\n return;\n }\n\n this.syncing = true;\n const changedPaths = [...this.pendingChanges.keys()];\n this.pendingChanges.clear();\n\n try {\n this.options.onSyncStart?.();\n\n const result = await this.orchestrator.sync({\n paths: changedPaths.length > 0 ? changedPaths : undefined,\n });\n\n this.options.onSyncComplete?.(result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.options.onSyncError?.(err);\n } finally {\n this.syncing = false;\n\n if (this.syncQueued) {\n this.syncQueued = false;\n void this.executeSync();\n }\n }\n }\n}\n","import type { ViewConfig } from \"../types/view.js\";\nimport type { DBEntry, PropertyValue, GroupedEntries, CalendarEntry } from \"./types.js\";\n\nexport function sortEntries(\n entries: DBEntry[],\n sorts: NonNullable<ViewConfig[\"sorts\"]>,\n): DBEntry[] {\n if (sorts.length === 0) return entries;\n\n return [...entries].sort((a, b) => {\n for (const sort of sorts) {\n const key = sort.property ?? sort.timestamp;\n if (!key) continue;\n\n const aVal = a.properties[key] ?? null;\n const bVal = b.properties[key] ?? null;\n const cmp = compareValues(aVal, bVal);\n if (cmp !== 0) return sort.direction === \"ascending\" ? cmp : -cmp;\n }\n return 0;\n });\n}\n\nexport function groupEntries(\n entries: DBEntry[],\n groupByProperty: string,\n options?: { sort?: \"ascending\" | \"descending\"; hideEmptyGroups?: boolean },\n): GroupedEntries[] {\n const groups = new Map<string, DBEntry[]>();\n const ungrouped: DBEntry[] = [];\n\n for (const entry of entries) {\n const val = entry.properties[groupByProperty] ?? null;\n const groupName = extractGroupName(val);\n\n if (groupName === null) {\n ungrouped.push(entry);\n } else {\n const existing = groups.get(groupName);\n if (existing) {\n existing.push(entry);\n } else {\n groups.set(groupName, [entry]);\n }\n }\n }\n\n let result: GroupedEntries[] = Array.from(groups.entries()).map(([name, items]) => ({\n groupName: name,\n entries: items,\n }));\n\n if (options?.sort === \"ascending\") {\n result.sort((a, b) => a.groupName.localeCompare(b.groupName));\n } else if (options?.sort === \"descending\") {\n result.sort((a, b) => b.groupName.localeCompare(a.groupName));\n }\n\n if (ungrouped.length > 0) {\n result.push({ groupName: \"그룹 없음\", entries: ungrouped });\n }\n\n if (options?.hideEmptyGroups) {\n result = result.filter((g) => g.entries.length > 0);\n }\n\n return result;\n}\n\nexport function extractCalendarEntries(entries: DBEntry[], dateProperty: string): CalendarEntry[] {\n const result: CalendarEntry[] = [];\n\n for (const entry of entries) {\n const val = entry.properties[dateProperty];\n if (!val) continue;\n\n if (typeof val === \"string\") {\n const date = parseDate(val);\n if (date) result.push({ entry, date });\n } else if (typeof val === \"object\" && val !== null && !Array.isArray(val) && \"start\" in val) {\n const date = parseDate(val.start);\n if (date) {\n result.push({\n entry,\n date,\n endDate: val.end ? (parseDate(val.end) ?? undefined) : undefined,\n });\n }\n }\n }\n\n return result;\n}\n\nexport function filterByMonth(\n calendarEntries: CalendarEntry[],\n year: number,\n month: number,\n): CalendarEntry[] {\n const monthStr = `${year}-${String(month).padStart(2, \"0\")}`;\n return calendarEntries.filter((ce) => ce.date.startsWith(monthStr));\n}\n\nexport function getVisibleProperties(\n viewConfig: ViewConfig,\n): Array<{ id: string; name: string; width?: number }> {\n if (!viewConfig.properties) return [];\n\n return viewConfig.properties\n .filter((p) => p.visible !== false)\n .map((p) => ({\n id: p.propertyId,\n name: p.propertyName ?? p.propertyId,\n width: p.width,\n }));\n}\n\nfunction compareValues(a: PropertyValue, b: PropertyValue): number {\n if (a === null && b === null) return 0;\n if (a === null) return 1;\n if (b === null) return -1;\n\n if (typeof a === \"string\" && typeof b === \"string\") return a.localeCompare(b);\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (typeof a === \"boolean\" && typeof b === \"boolean\") return (a ? 1 : 0) - (b ? 1 : 0);\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.join(\",\").localeCompare(b.join(\",\"));\n }\n\n if (typeof a === \"object\" && typeof b === \"object\" && a !== null && b !== null) {\n if (\"start\" in a && \"start\" in b) {\n return (a.start ?? \"\").localeCompare(b.start ?? \"\");\n }\n }\n\n return String(a).localeCompare(String(b));\n}\n\nfunction extractGroupName(val: PropertyValue): string | null {\n if (val === null || val === undefined) return null;\n if (typeof val === \"string\") return val || null;\n if (typeof val === \"boolean\") return val ? \"true\" : \"false\";\n if (typeof val === \"number\") return String(val);\n if (Array.isArray(val)) return val.length > 0 ? val.join(\", \") : null;\n if (typeof val === \"object\" && \"start\" in val) return val.start;\n return null;\n}\n\nfunction parseDate(value: string): string | null {\n const match = /^(\\d{4}-\\d{2}-\\d{2})/.exec(value);\n return match?.[1] ?? null;\n}\n","import type { VaultFS } from \"../sync/vault-fs.js\";\nimport type { DatabaseViewsConfig, ViewConfig } from \"../types/view.js\";\nimport type { DBEntry, PropertyValue, ViewRenderData, PropertySchema } from \"./types.js\";\nimport { sortEntries, groupEntries, extractCalendarEntries } from \"./filter-engine.js\";\nimport { getVisibleProperties } from \"./filter-engine.js\";\nimport matter from \"gray-matter\";\n\nconst DB_VIEWS_PATH = \".im-nobsidian/db-views.json\";\n\nexport class ViewDataProvider {\n constructor(private readonly vaultFs: VaultFS) {}\n\n async loadAllViewConfigs(): Promise<Record<string, DatabaseViewsConfig>> {\n try {\n const raw = await this.vaultFs.readFile(DB_VIEWS_PATH);\n return JSON.parse(raw) as Record<string, DatabaseViewsConfig>;\n } catch {\n return {};\n }\n }\n\n async getViewConfigs(databaseId: string): Promise<DatabaseViewsConfig | null> {\n const all = await this.loadAllViewConfigs();\n return all[databaseId] ?? null;\n }\n\n async collectEntries(folderPath: string): Promise<DBEntry[]> {\n const allFiles = await this.vaultFs.listMarkdownFiles();\n const prefix = folderPath.endsWith(\"/\") ? folderPath : folderPath + \"/\";\n const dbFiles = allFiles.filter((f) => f.path.startsWith(prefix));\n\n const entries: DBEntry[] = [];\n\n for (const file of dbFiles) {\n try {\n const content = await this.vaultFs.readFile(file.path);\n const entry = parseEntry(file.path, content);\n if (entry) entries.push(entry);\n } catch {\n // 파일 읽기 실패 시 스킵\n }\n }\n\n return entries;\n }\n\n async buildViewData(\n databaseId: string,\n viewId: string,\n folderPath: string,\n schema?: Record<string, PropertySchema>,\n ): Promise<ViewRenderData | null> {\n const dbConfig = await this.getViewConfigs(databaseId);\n if (!dbConfig) return null;\n\n const viewConfig = dbConfig.views.find((v) => v.id === viewId);\n if (!viewConfig) return null;\n\n const entries = await this.collectEntries(folderPath);\n\n return this.processViewData(entries, viewConfig, databaseId, dbConfig.databaseName, schema);\n }\n\n async buildDefaultViewData(\n databaseId: string,\n folderPath: string,\n schema?: Record<string, PropertySchema>,\n ): Promise<ViewRenderData | null> {\n const dbConfig = await this.getViewConfigs(databaseId);\n if (!dbConfig || dbConfig.views.length === 0) return null;\n\n const viewConfig = dbConfig.views[0]!;\n const entries = await this.collectEntries(folderPath);\n\n return this.processViewData(entries, viewConfig, databaseId, dbConfig.databaseName, schema);\n }\n\n processViewData(\n entries: DBEntry[],\n viewConfig: ViewConfig,\n databaseId: string,\n databaseName?: string,\n schema?: Record<string, PropertySchema>,\n ): ViewRenderData {\n let processed = entries;\n\n if (viewConfig.sorts && viewConfig.sorts.length > 0) {\n processed = sortEntries(processed, viewConfig.sorts);\n }\n\n const visibleProps = getVisibleProperties(viewConfig);\n const propertyNames =\n visibleProps.length > 0 ? visibleProps.map((p) => p.name) : collectPropertyNames(processed);\n\n const data: ViewRenderData = {\n databaseId,\n databaseName,\n viewConfig,\n entries: processed,\n propertyNames,\n schema,\n };\n\n if (viewConfig.type === \"board\" && viewConfig.groupBy) {\n const grouped = groupEntries(\n processed,\n viewConfig.groupBy.propertyName ?? viewConfig.groupBy.propertyId,\n {\n sort: viewConfig.groupBy.sort === \"manual\" ? undefined : viewConfig.groupBy.sort,\n hideEmptyGroups: viewConfig.groupBy.hideEmptyGroups,\n },\n );\n return { ...data, grouped };\n }\n\n if (viewConfig.type === \"calendar\" && viewConfig.datePropertyName) {\n const calendarEntries = extractCalendarEntries(processed, viewConfig.datePropertyName);\n return { ...data, calendarEntries };\n }\n\n return data;\n }\n}\n\nfunction parseEntry(path: string, content: string): DBEntry | null {\n try {\n const parsed = matter(content);\n const fm = parsed.data as Record<string, unknown>;\n\n const title = (fm.title as string) ?? extractTitleFromPath(path);\n const icon = fm.icon as string | undefined;\n const cover = fm.cover as string | undefined;\n\n const properties: Record<string, PropertyValue> = {};\n for (const [key, value] of Object.entries(fm)) {\n if (key === \"title\" || key === \"icon\" || key === \"cover\") continue;\n properties[key] = normalizePropertyValue(value);\n }\n\n return { path, title, icon, cover, properties };\n } catch {\n return null;\n }\n}\n\nfunction normalizePropertyValue(value: unknown): PropertyValue {\n if (value === null || value === undefined) return null;\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return value;\n if (typeof value === \"boolean\") return value;\n\n if (value instanceof Date) {\n return value.toISOString().split(\"T\")[0]!;\n }\n\n if (Array.isArray(value)) {\n return value.map((v) => String(v));\n }\n\n if (typeof value === \"object\" && value !== null) {\n const obj = value as Record<string, unknown>;\n if (\"start\" in obj) {\n return {\n start: String(obj.start),\n end: obj.end ? String(obj.end) : undefined,\n };\n }\n }\n\n return String(value);\n}\n\nfunction extractTitleFromPath(filePath: string): string {\n const parts = filePath.split(\"/\");\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.md$/, \"\");\n}\n\nfunction collectPropertyNames(entries: DBEntry[]): string[] {\n const names = new Set<string>();\n for (const entry of entries) {\n for (const key of Object.keys(entry.properties)) {\n names.add(key);\n }\n }\n return Array.from(names);\n}\n","import type { VaultFS } from \"../sync/vault-fs.js\";\nimport type { DBEntry, PropertyValue } from \"./types.js\";\nimport matter from \"gray-matter\";\n\nexport class EntryEditor {\n constructor(private readonly vaultFs: VaultFS) {}\n\n async updateProperty(\n entryPath: string,\n propertyName: string,\n newValue: PropertyValue,\n ): Promise<void> {\n const content = await this.vaultFs.readFile(entryPath);\n const parsed = matter(content);\n\n parsed.data[propertyName] = newValue;\n\n const updated = matter.stringify(parsed.content, parsed.data);\n await this.vaultFs.writeFile(entryPath, updated);\n }\n\n async createEntry(\n folderPath: string,\n title: string,\n properties: Record<string, PropertyValue>,\n ): Promise<string> {\n const safeName = title.replace(/[\\\\/:*?\"<>|]/g, \"_\").trim() || \"Untitled\";\n const filePath = `${folderPath}/${safeName}.md`;\n\n const frontmatter = { title, ...properties };\n const content = matter.stringify(\"\", frontmatter);\n\n await this.vaultFs.ensureFolder(folderPath);\n await this.vaultFs.writeFile(filePath, content);\n\n return filePath;\n }\n\n async moveEntryToGroup(\n entry: DBEntry,\n groupProperty: string,\n newGroupValue: string,\n ): Promise<void> {\n await this.updateProperty(entry.path, groupProperty, newGroupValue);\n }\n\n async updateDate(entryPath: string, dateProperty: string, newDate: string): Promise<void> {\n await this.updateProperty(entryPath, dateProperty, newDate);\n }\n}\n","import type { NotionColor } from \"./types.js\";\n\nconst NOTION_COLORS: Record<NotionColor, string> = {\n default: \"#37352F\",\n gray: \"#787774\",\n brown: \"#9F6B53\",\n orange: \"#D9730D\",\n yellow: \"#CB912F\",\n green: \"#448361\",\n blue: \"#337EA9\",\n purple: \"#9065B0\",\n pink: \"#C14C8A\",\n red: \"#D44C47\",\n};\n\nconst NOTION_BG_COLORS: Record<NotionColor, string> = {\n default: \"#F1F1EF\",\n gray: \"#F1F1EF\",\n brown: \"#F4EEEE\",\n orange: \"#FBECDD\",\n yellow: \"#FBF3DB\",\n green: \"#EDF3EC\",\n blue: \"#E7F3F8\",\n purple: \"#F4F0F7\",\n pink: \"#F9F0F5\",\n red: \"#FDEBEC\",\n};\n\nexport function getNotionColor(color: NotionColor | string): string {\n return NOTION_COLORS[color as NotionColor] ?? NOTION_COLORS.default;\n}\n\nexport function getNotionBgColor(color: NotionColor | string): string {\n return NOTION_BG_COLORS[color as NotionColor] ?? NOTION_BG_COLORS.default;\n}\n\nexport function generateColorCSS(): string {\n const lines: string[] = [];\n for (const [name, hex] of Object.entries(NOTION_COLORS)) {\n lines.push(` --notion-color-${name}: ${hex};`);\n }\n for (const [name, hex] of Object.entries(NOTION_BG_COLORS)) {\n lines.push(` --notion-bg-${name}: ${hex};`);\n }\n return `:root {\\n${lines.join(\"\\n\")}\\n}`;\n}\n"]}
1
+ {"version":3,"sources":["../src/types/config.ts","../src/config/manager.ts","../src/utils/id.ts","../src/state/migrations/001-initial.ts","../src/state/migrations/002-file-registry.ts","../src/state/migrations/003-stat-cache.ts","../src/state/state-db.ts","../src/notion/property-mapper.ts","../src/notion/client.ts","../src/notion/block-builder.ts","../src/utils/hash.ts","../src/sync/change-detector.ts","../src/utils/logger.ts","../src/converter/pipeline.ts","../src/converter/pre-processors/frontmatter.ts","../src/converter/pre-processors/wikilink.ts","../src/converter/pre-processors/callout.ts","../src/converter/pre-processors/math.ts","../src/converter/pre-processors/embed.ts","../src/converter/pre-processors/preserve-marker.ts","../src/converter/pre-processors/unsupported-block-stripper.ts","../src/converter/pre-processors/properties-table.ts","../src/converter/pre-processors/html-annotation.ts","../src/converter/post-processors/mention-to-wikilink.ts","../src/converter/post-processors/preserve-marker-injector.ts","../src/converter/post-processors/callout-restorer.ts","../src/converter/post-processors/color-annotator.ts","../src/converter/post-processors/frontmatter-generator.ts","../src/converter/post-processors/local-image-restorer.ts","../src/converter/post-processors/properties-table-restorer.ts","../src/converter/pipeline-factory.ts","../src/converter/block-converter.ts","../src/sync/image-handler.ts","../src/sync/file-handler.ts","../src/utils/sanitize.ts","../src/converter/enhanced-md-converter.ts","../src/sync/database-syncer.ts","../src/sync/orchestrator.ts","../src/sync/node-vault-fs.ts","../src/converter/pre-processors/inline-db.ts","../src/conflict/merger.ts","../src/conflict/resolver.ts","../src/structure/tree-mapper.ts","../src/watcher/file-watcher.ts","../src/watcher/watch-sync-service.ts","../src/view/filter-engine.ts","../src/view/view-data-provider.ts","../src/view/entry-editor.ts","../src/view/color-map.ts"],"names":["stat","readFile","content","matter","WIKILINK_REGEX","escapeRegex","createHash","Sema","EXTENSION_TO_MIME","TOGGLE_START","TOGGLE_END","EMOJI_TYPE_MAP","record","extractAliases","title","existing","pathParts","join","mkdir","writeFile","extractTitleFromPath"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\n\nconst DatabaseSyncSchema = z.object({\n databaseId: z.string(),\n localFolder: z.string(),\n propertyMapping: z.record(z.string()).optional(),\n pullFilter: z.unknown().optional(),\n titleProperty: z.string().default(\"Name\"),\n});\n\nexport type DatabaseSyncConfig = z.infer<typeof DatabaseSyncSchema>;\n\nexport const ConfigSchema = z.object({\n version: z.literal(1),\n notion: z.object({\n token: z.string().startsWith(\"ntn_\"),\n rootPageId: z.string(),\n workspaceId: z.string().optional(),\n parentMode: z.enum([\"page\", \"database\"]).default(\"page\"),\n databaseId: z.string().optional(),\n databases: z.array(DatabaseSyncSchema).default([]),\n }),\n sync: z.object({\n direction: z.enum([\"push\", \"pull\", \"both\"]).default(\"both\"),\n conflictStrategy: z\n .enum([\"local-first\", \"remote-first\", \"manual\", \"duplicate\"])\n .default(\"manual\"),\n autoSync: z.boolean().default(false),\n autoSyncInterval: z.number().min(30).max(3600).default(300),\n deleteSync: z.boolean().default(false),\n syncFiles: z.boolean().default(true),\n }),\n paths: z.object({\n include: z.array(z.string()).default([\"**/*\"]),\n exclude: z.array(z.string()).default([]),\n attachments: z.string().default(\"attachments\"),\n }),\n conversion: z.object({\n preferMarkdownApi: z.boolean().default(true),\n preserveMarkers: z.boolean().default(true),\n frontmatterMapping: z.boolean().default(true),\n imageDownload: z.enum([\"immediate\", \"lazy\", \"skip\"]).default(\"immediate\"),\n }),\n advanced: z.object({\n concurrency: z.number().min(1).max(10).default(3),\n maxRetries: z.number().min(0).max(10).default(5),\n timeoutMs: z.number().min(5000).max(60000).default(30000),\n batchSize: z.number().min(1).max(100).default(50),\n }),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n\nexport const DEFAULT_CONFIG: Config = {\n version: 1,\n notion: {\n token: \"\",\n rootPageId: \"\",\n parentMode: \"page\",\n databases: [],\n },\n sync: {\n direction: \"both\",\n conflictStrategy: \"manual\",\n autoSync: false,\n autoSyncInterval: 300,\n deleteSync: false,\n syncFiles: true,\n },\n paths: {\n include: [\"**/*\"],\n exclude: [],\n attachments: \"attachments\",\n },\n conversion: {\n preferMarkdownApi: true,\n preserveMarkers: true,\n frontmatterMapping: true,\n imageDownload: \"immediate\",\n },\n advanced: {\n concurrency: 3,\n maxRetries: 5,\n timeoutMs: 30000,\n batchSize: 50,\n },\n};\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { ConfigSchema, DEFAULT_CONFIG } from \"../types/config.js\";\nimport type { Config } from \"../types/config.js\";\n\nconst CONFIG_FILE = \"config.json\";\nconst IM_NOBSIDIAN_DIR = \".im-nobsidian\";\n\nexport class ConfigManager {\n private config: Config | null = null;\n\n constructor(private readonly vaultRoot: string) {}\n\n get configDir(): string {\n return join(this.vaultRoot, IM_NOBSIDIAN_DIR);\n }\n\n get configPath(): string {\n return join(this.configDir, CONFIG_FILE);\n }\n\n get dbPath(): string {\n return join(this.configDir, \"sync.db\");\n }\n\n async load(): Promise<Config> {\n try {\n const raw = await readFile(this.configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n this.config = ConfigSchema.parse(parsed);\n return this.config;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(`설정 파일의 JSON 형식이 올바르지 않습니다: ${this.configPath}`);\n }\n if (error instanceof Error && error.name === \"ZodError\") {\n throw new Error(`설정 파일 검증 실패: ${error.message}`);\n }\n throw new Error(\n `설정 파일을 찾을 수 없습니다: ${this.configPath}\\n'im-nobsidian init'을 먼저 실행하세요.`,\n );\n }\n }\n\n async save(config: Config): Promise<void> {\n await mkdir(this.configDir, { recursive: true });\n const content = JSON.stringify(config, null, 2);\n await writeFile(this.configPath, content, \"utf-8\");\n this.config = config;\n }\n\n async init(params: { token: string; rootPageId: string }): Promise<Config> {\n const config: Config = {\n ...DEFAULT_CONFIG,\n notion: {\n ...DEFAULT_CONFIG.notion,\n token: params.token,\n rootPageId: params.rootPageId,\n },\n };\n\n await this.save(config);\n await this.ensureGitignore();\n return config;\n }\n\n getConfig(): Config {\n if (!this.config) {\n throw new Error(\"설정이 로드되지 않았습니다. load()를 먼저 호출하세요.\");\n }\n return this.config;\n }\n\n private async ensureGitignore(): Promise<void> {\n const gitignorePath = join(this.vaultRoot, \".gitignore\");\n const entry = \".im-nobsidian/\";\n\n try {\n const content = await readFile(gitignorePath, \"utf-8\");\n if (!content.includes(entry)) {\n await writeFile(gitignorePath, `${content.trimEnd()}\\n${entry}\\n`, \"utf-8\");\n }\n } catch {\n await writeFile(gitignorePath, `${entry}\\n`, \"utf-8\");\n }\n }\n\n async isInitialized(): Promise<boolean> {\n try {\n const { stat } = await import(\"node:fs/promises\");\n await stat(this.configPath);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { randomUUID } from \"node:crypto\";\n\nexport function generateId(): string {\n return randomUUID();\n}\n\nexport function normalizeNotionId(id: string): string {\n const raw = id.replace(/-/g, \"\");\n if (raw.length !== 32) return id;\n return `${raw.slice(0, 8)}-${raw.slice(8, 12)}-${raw.slice(12, 16)}-${raw.slice(16, 20)}-${raw.slice(20)}`;\n}\n\nexport function notionIdsEqual(a: string, b: string): boolean {\n return a.replace(/-/g, \"\") === b.replace(/-/g, \"\");\n}\n","export const INITIAL_MIGRATION = `\nCREATE TABLE IF NOT EXISTS sync_state (\n id TEXT PRIMARY KEY,\n obsidian_path TEXT NOT NULL,\n notion_page_id TEXT,\n notion_parent_id TEXT,\n content_hash TEXT NOT NULL,\n notion_last_edited TEXT,\n local_last_modified TEXT NOT NULL,\n sync_direction TEXT NOT NULL DEFAULT 'both',\n file_type TEXT NOT NULL DEFAULT 'file',\n status TEXT NOT NULL DEFAULT 'pending',\n base_snapshot BLOB,\n version INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n\n CONSTRAINT chk_sync_direction CHECK (sync_direction IN ('push', 'pull', 'both')),\n CONSTRAINT chk_file_type CHECK (file_type IN ('file', 'folder-note', 'folder-only', 'db-row')),\n CONSTRAINT chk_status CHECK (status IN ('synced', 'pending', 'conflict', 'error'))\n);\n\nCREATE UNIQUE INDEX IF NOT EXISTS idx_sync_state_path ON sync_state(obsidian_path);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_sync_state_notion ON sync_state(notion_page_id) WHERE notion_page_id IS NOT NULL;\nCREATE INDEX IF NOT EXISTS idx_sync_state_status ON sync_state(status);\nCREATE INDEX IF NOT EXISTS idx_sync_state_parent ON sync_state(notion_parent_id);\n\nCREATE TABLE IF NOT EXISTS wikilink_map (\n obsidian_path TEXT PRIMARY KEY,\n notion_page_id TEXT NOT NULL UNIQUE,\n title TEXT NOT NULL,\n aliases TEXT DEFAULT '[]',\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_wikilink_title ON wikilink_map(title);\nCREATE INDEX IF NOT EXISTS idx_wikilink_notion ON wikilink_map(notion_page_id);\n\nCREATE TABLE IF NOT EXISTS pending_operations (\n id TEXT PRIMARY KEY,\n sync_state_id TEXT NOT NULL REFERENCES sync_state(id) ON DELETE CASCADE,\n operation TEXT NOT NULL,\n direction TEXT NOT NULL,\n payload TEXT,\n retry_count INTEGER NOT NULL DEFAULT 0,\n error_message TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n completed_at TEXT,\n\n CONSTRAINT chk_operation CHECK (operation IN ('create', 'update', 'delete', 'move')),\n CONSTRAINT chk_direction CHECK (direction IN ('push', 'pull')),\n CONSTRAINT chk_op_status CHECK (status IN ('pending', 'processing', 'completed', 'failed'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_pending_status ON pending_operations(status, created_at);\n\nCREATE TABLE IF NOT EXISTS image_registry (\n id TEXT PRIMARY KEY,\n sync_state_id TEXT NOT NULL REFERENCES sync_state(id) ON DELETE CASCADE,\n notion_file_url TEXT NOT NULL,\n local_path TEXT NOT NULL,\n content_hash TEXT NOT NULL,\n file_size INTEGER NOT NULL,\n mime_type TEXT NOT NULL,\n expires_at TEXT,\n downloaded_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE UNIQUE INDEX IF NOT EXISTS idx_image_hash ON image_registry(content_hash);\nCREATE INDEX IF NOT EXISTS idx_image_sync ON image_registry(sync_state_id);\n\nCREATE TABLE IF NOT EXISTS sync_metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nINSERT OR IGNORE INTO sync_metadata (key, value) VALUES ('schema_version', '1');\n`;\n","export const FILE_REGISTRY_MIGRATION = `\nCREATE TABLE IF NOT EXISTS file_registry (\n id TEXT PRIMARY KEY,\n local_path TEXT NOT NULL,\n notion_page_id TEXT NOT NULL,\n file_upload_id TEXT NOT NULL,\n file_type TEXT NOT NULL DEFAULT 'file',\n file_hash TEXT NOT NULL,\n file_size INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n\n CONSTRAINT chk_file_type CHECK (file_type IN ('image', 'pdf', 'video', 'audio', 'file'))\n);\n\nCREATE UNIQUE INDEX IF NOT EXISTS idx_file_registry_path ON file_registry(local_path);\nCREATE INDEX IF NOT EXISTS idx_file_registry_page ON file_registry(notion_page_id);\n\nUPDATE sync_metadata SET value = '2' WHERE key = 'schema_version';\n`;\n","export const STAT_CACHE_MIGRATION = `\nALTER TABLE sync_state ADD COLUMN local_mtime TEXT;\nALTER TABLE sync_state ADD COLUMN local_file_size INTEGER;\n\nUPDATE sync_metadata SET value = '3' WHERE key = 'schema_version';\n`;\n","import Database from \"better-sqlite3\";\nimport type { SyncRecord, SyncStatus, WikilinkEntry, PreserveMarker } from \"../types/index.js\";\nimport { generateId } from \"../utils/id.js\";\nimport { INITIAL_MIGRATION } from \"./migrations/001-initial.js\";\nimport { FILE_REGISTRY_MIGRATION } from \"./migrations/002-file-registry.js\";\nimport { STAT_CACHE_MIGRATION } from \"./migrations/003-stat-cache.js\";\n\nexport class StateDB {\n private readonly db: Database.Database;\n\n private constructor(db: Database.Database) {\n this.db = db;\n this.db.pragma(\"journal_mode = WAL\");\n this.db.pragma(\"foreign_keys = ON\");\n }\n\n static open(dbPath: string): StateDB {\n const db = new Database(dbPath);\n const stateDb = new StateDB(db);\n stateDb.migrate();\n return stateDb;\n }\n\n private migrate(): void {\n const version = this.getSchemaVersion();\n if (version < 1) {\n this.db.exec(INITIAL_MIGRATION);\n }\n if (version < 2) {\n this.db.exec(FILE_REGISTRY_MIGRATION);\n }\n if (version < 3) {\n this.db.exec(STAT_CACHE_MIGRATION);\n }\n }\n\n private getSchemaVersion(): number {\n try {\n const row = this.db\n .prepare(\"SELECT value FROM sync_metadata WHERE key = 'schema_version'\")\n .get() as { value: string } | undefined;\n return row ? Number(row.value) : 0;\n } catch {\n return 0;\n }\n }\n\n close(): void {\n this.db.close();\n }\n\n // --- sync_state ---\n\n getByPath(path: string): SyncRecord | null {\n const row = this.db.prepare(\"SELECT * FROM sync_state WHERE obsidian_path = ?\").get(path) as\n | RawSyncRow\n | undefined;\n return row ? this.mapRow(row) : null;\n }\n\n getByNotionId(pageId: string): SyncRecord | null {\n const row = this.db.prepare(\"SELECT * FROM sync_state WHERE notion_page_id = ?\").get(pageId) as\n | RawSyncRow\n | undefined;\n return row ? this.mapRow(row) : null;\n }\n\n getByStatus(status: SyncStatus): SyncRecord[] {\n const rows = this.db\n .prepare(\"SELECT * FROM sync_state WHERE status = ?\")\n .all(status) as RawSyncRow[];\n return rows.map((r) => this.mapRow(r));\n }\n\n getAll(): SyncRecord[] {\n const rows = this.db.prepare(\"SELECT * FROM sync_state\").all() as RawSyncRow[];\n return rows.map((r) => this.mapRow(r));\n }\n\n upsert(record: UpsertSyncRecord): SyncRecord {\n const existing = this.getByPath(record.obsidianPath);\n\n if (existing) {\n this.db\n .prepare(\n `UPDATE sync_state SET\n notion_page_id = ?, notion_parent_id = ?, content_hash = ?,\n notion_last_edited = ?, local_last_modified = ?,\n sync_direction = ?, file_type = ?, status = ?,\n base_snapshot = ?, local_mtime = ?, local_file_size = ?,\n version = version + 1, updated_at = datetime('now')\n WHERE id = ?`,\n )\n .run(\n record.notionPageId ?? null,\n record.notionParentId ?? null,\n record.contentHash,\n record.notionLastEdited ?? null,\n record.localLastModified,\n record.syncDirection,\n record.fileType,\n record.status,\n record.baseSnapshot ?? null,\n record.localMtime ?? null,\n record.localFileSize ?? null,\n existing.id,\n );\n return this.getByPath(record.obsidianPath)!;\n }\n\n const id = generateId();\n this.db\n .prepare(\n `INSERT INTO sync_state\n (id, obsidian_path, notion_page_id, notion_parent_id, content_hash,\n notion_last_edited, local_last_modified, sync_direction, file_type,\n status, base_snapshot, local_mtime, local_file_size, version)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)`,\n )\n .run(\n id,\n record.obsidianPath,\n record.notionPageId ?? null,\n record.notionParentId ?? null,\n record.contentHash,\n record.notionLastEdited ?? null,\n record.localLastModified,\n record.syncDirection,\n record.fileType,\n record.status,\n record.baseSnapshot ?? null,\n record.localMtime ?? null,\n record.localFileSize ?? null,\n );\n return this.getByPath(record.obsidianPath)!;\n }\n\n updateStatus(id: string, status: SyncStatus): void {\n this.db\n .prepare(\"UPDATE sync_state SET status = ?, updated_at = datetime('now') WHERE id = ?\")\n .run(status, id);\n }\n\n updateHash(id: string, hash: string, snapshot?: Buffer | null): void {\n if (snapshot !== undefined) {\n this.db\n .prepare(\n \"UPDATE sync_state SET content_hash = ?, base_snapshot = ?, updated_at = datetime('now') WHERE id = ?\",\n )\n .run(hash, snapshot, id);\n } else {\n this.db\n .prepare(\n \"UPDATE sync_state SET content_hash = ?, updated_at = datetime('now') WHERE id = ?\",\n )\n .run(hash, id);\n }\n }\n\n setNotionLastEdited(id: string, lastEdited: string): void {\n this.db\n .prepare(\n \"UPDATE sync_state SET notion_last_edited = ?, updated_at = datetime('now') WHERE id = ?\",\n )\n .run(lastEdited, id);\n }\n\n updateStatCache(id: string, mtime: string, fileSize: number): void {\n this.db\n .prepare(\n \"UPDATE sync_state SET local_mtime = ?, local_file_size = ?, updated_at = datetime('now') WHERE id = ?\",\n )\n .run(mtime, fileSize, id);\n }\n\n setNotionParentId(id: string, parentId: string): void {\n this.db\n .prepare(\n \"UPDATE sync_state SET notion_parent_id = ?, updated_at = datetime('now') WHERE id = ?\",\n )\n .run(parentId, id);\n }\n\n delete(id: string): void {\n this.db.prepare(\"DELETE FROM sync_state WHERE id = ?\").run(id);\n }\n\n // --- wikilink_map ---\n\n resolveWikilink(text: string): WikilinkEntry | null {\n const byTitle = this.db.prepare(\"SELECT * FROM wikilink_map WHERE title = ?\").get(text) as\n | RawWikilinkRow\n | undefined;\n\n if (byTitle) return this.mapWikilinkRow(byTitle);\n\n const byAlias = this.db\n .prepare(\"SELECT * FROM wikilink_map WHERE aliases LIKE ?\")\n .get(`%\"${text}\"%`) as RawWikilinkRow | undefined;\n\n if (byAlias) return this.mapWikilinkRow(byAlias);\n\n const byFilename = this.db\n .prepare(\"SELECT * FROM wikilink_map WHERE obsidian_path LIKE ?\")\n .get(`%/${text}.md`) as RawWikilinkRow | undefined;\n\n return byFilename ? this.mapWikilinkRow(byFilename) : null;\n }\n\n resolvePageId(pageId: string): WikilinkEntry | null {\n const row = this.db\n .prepare(\"SELECT * FROM wikilink_map WHERE notion_page_id = ?\")\n .get(pageId) as RawWikilinkRow | undefined;\n return row ? this.mapWikilinkRow(row) : null;\n }\n\n upsertWikilink(entry: WikilinkEntry): void {\n this.db\n .prepare(\n `INSERT OR REPLACE INTO wikilink_map (obsidian_path, notion_page_id, title, aliases, updated_at)\n VALUES (?, ?, ?, ?, datetime('now'))`,\n )\n .run(entry.obsidianPath, entry.notionPageId, entry.title, JSON.stringify(entry.aliases));\n }\n\n // --- sync_metadata ---\n\n getMeta(key: string): string | null {\n const row = this.db.prepare(\"SELECT value FROM sync_metadata WHERE key = ?\").get(key) as\n | { value: string }\n | undefined;\n return row?.value ?? null;\n }\n\n setMeta(key: string, value: string): void {\n this.db\n .prepare(\"INSERT OR REPLACE INTO sync_metadata (key, value) VALUES (?, ?)\")\n .run(key, value);\n }\n\n // --- file_registry ---\n\n isFileRegistered(localPath: string): boolean {\n const row = this.db.prepare(\"SELECT 1 FROM file_registry WHERE local_path = ?\").get(localPath);\n return !!row;\n }\n\n getFileRegistry(localPath: string): FileRegistryEntry | null {\n const row = this.db\n .prepare(\"SELECT * FROM file_registry WHERE local_path = ?\")\n .get(localPath) as RawFileRegistryRow | undefined;\n return row ? this.mapFileRegistryRow(row) : null;\n }\n\n getFilesByPageId(notionPageId: string): FileRegistryEntry[] {\n const rows = this.db\n .prepare(\"SELECT * FROM file_registry WHERE notion_page_id = ?\")\n .all(notionPageId) as RawFileRegistryRow[];\n return rows.map((r) => this.mapFileRegistryRow(r));\n }\n\n registerFile(entry: RegisterFileInput): void {\n const id = generateId();\n this.db\n .prepare(\n `INSERT OR REPLACE INTO file_registry\n (id, local_path, notion_page_id, file_upload_id, file_type, file_hash, file_size)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n id,\n entry.localPath,\n entry.notionPageId,\n entry.fileUploadId,\n entry.fileType,\n entry.fileHash,\n entry.fileSize,\n );\n }\n\n deleteFileRegistry(localPath: string): void {\n this.db.prepare(\"DELETE FROM file_registry WHERE local_path = ?\").run(localPath);\n }\n\n private mapFileRegistryRow(row: RawFileRegistryRow): FileRegistryEntry {\n return {\n id: row.id,\n localPath: row.local_path,\n notionPageId: row.notion_page_id,\n fileUploadId: row.file_upload_id,\n fileType: row.file_type,\n fileHash: row.file_hash,\n fileSize: row.file_size,\n };\n }\n\n // --- preserve markers ---\n\n storePreserveMarkers(path: string, markers: PreserveMarker[]): void {\n if (markers.length === 0) {\n this.db.prepare(\"DELETE FROM sync_metadata WHERE key = ?\").run(`preserve_markers:${path}`);\n return;\n }\n this.setMeta(`preserve_markers:${path}`, JSON.stringify(markers));\n }\n\n getPreserveMarkers(path: string): PreserveMarker[] {\n const value = this.getMeta(`preserve_markers:${path}`);\n if (!value) return [];\n try {\n return JSON.parse(value) as PreserveMarker[];\n } catch {\n return [];\n }\n }\n\n // --- transaction ---\n\n transaction<T>(fn: () => T): T {\n return this.db.transaction(fn)();\n }\n\n // --- private ---\n\n private mapRow(row: RawSyncRow): SyncRecord {\n return {\n id: row.id,\n obsidianPath: row.obsidian_path,\n notionPageId: row.notion_page_id,\n notionParentId: row.notion_parent_id,\n contentHash: row.content_hash,\n notionLastEdited: row.notion_last_edited,\n localLastModified: row.local_last_modified,\n syncDirection: row.sync_direction as SyncRecord[\"syncDirection\"],\n fileType: row.file_type as SyncRecord[\"fileType\"],\n status: row.status as SyncRecord[\"status\"],\n baseSnapshot: row.base_snapshot,\n localMtime: row.local_mtime,\n localFileSize: row.local_file_size,\n version: row.version,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n }\n\n private mapWikilinkRow(row: RawWikilinkRow): WikilinkEntry {\n return {\n obsidianPath: row.obsidian_path,\n notionPageId: row.notion_page_id,\n title: row.title,\n aliases: JSON.parse(row.aliases || \"[]\") as string[],\n };\n }\n}\n\nexport interface UpsertSyncRecord {\n readonly obsidianPath: string;\n readonly notionPageId?: string | null;\n readonly notionParentId?: string | null;\n readonly contentHash: string;\n readonly notionLastEdited?: string | null;\n readonly localLastModified: string;\n readonly syncDirection: SyncRecord[\"syncDirection\"];\n readonly fileType: SyncRecord[\"fileType\"];\n readonly status: SyncRecord[\"status\"];\n readonly baseSnapshot?: Buffer | null;\n readonly localMtime?: string | null;\n readonly localFileSize?: number | null;\n}\n\ninterface RawSyncRow {\n id: string;\n obsidian_path: string;\n notion_page_id: string | null;\n notion_parent_id: string | null;\n content_hash: string;\n notion_last_edited: string | null;\n local_last_modified: string;\n sync_direction: string;\n file_type: string;\n status: string;\n base_snapshot: Buffer | null;\n local_mtime: string | null;\n local_file_size: number | null;\n version: number;\n created_at: string;\n updated_at: string;\n}\n\ninterface RawWikilinkRow {\n obsidian_path: string;\n notion_page_id: string;\n title: string;\n aliases: string;\n updated_at: string;\n}\n\ninterface RawFileRegistryRow {\n id: string;\n local_path: string;\n notion_page_id: string;\n file_upload_id: string;\n file_type: string;\n file_hash: string;\n file_size: number;\n}\n\nexport interface FileRegistryEntry {\n readonly id: string;\n readonly localPath: string;\n readonly notionPageId: string;\n readonly fileUploadId: string;\n readonly fileType: string;\n readonly fileHash: string;\n readonly fileSize: number;\n}\n\nexport interface RegisterFileInput {\n readonly localPath: string;\n readonly notionPageId: string;\n readonly fileUploadId: string;\n readonly fileType: string;\n readonly fileHash: string;\n readonly fileSize: number;\n}\n","type NotionPropertySchema = {\n id: string;\n type: string;\n name: string;\n};\n\ntype NotionPropertyValue = Record<string, unknown>;\n\nconst DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2})?/;\nconst WIKILINK_REGEX = /^\\[\\[(.+?)(?:\\|.+?)?\\]\\]$/;\n\nexport interface WikilinkResolver {\n resolve(title: string): string | null;\n resolvePageId(pageId: string): string | null;\n}\n\nexport class PropertyMapper {\n private schema: Map<string, NotionPropertySchema> = new Map();\n private wikilinkResolver: WikilinkResolver | null = null;\n\n setWikilinkResolver(resolver: WikilinkResolver): void {\n this.wikilinkResolver = resolver;\n }\n\n loadSchema(properties: Record<string, { id: string; type: string }>): void {\n this.schema.clear();\n for (const [name, prop] of Object.entries(properties)) {\n this.schema.set(name, { id: prop.id, type: prop.type, name });\n }\n }\n\n toNotionProperties(\n frontmatter: Record<string, unknown>,\n title: string,\n ): Record<string, NotionPropertyValue> {\n const result: Record<string, NotionPropertyValue> = {\n title: { title: [{ text: { content: title } }] },\n };\n\n for (const [key, value] of Object.entries(frontmatter)) {\n if (key === \"title\") continue;\n if (value === null || value === undefined) continue;\n\n const schemaProp = this.schema.get(key);\n if (schemaProp) {\n const converted = this.convertBySchema(schemaProp.type, value);\n if (converted) result[key] = converted;\n } else {\n const inferred = this.inferAndConvert(value);\n if (inferred) result[key] = inferred;\n }\n }\n\n return result;\n }\n\n fromNotionProperties(notionProps: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, rawProp] of Object.entries(notionProps)) {\n const prop = rawProp as { type: string; [k: string]: unknown };\n if (prop.type === \"title\") continue;\n const value = this.extractValue(prop);\n if (value !== undefined) {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n private convertBySchema(type: string, value: unknown): NotionPropertyValue | null {\n switch (type) {\n case \"rich_text\":\n return { rich_text: [{ text: { content: String(value) } }] };\n\n case \"number\":\n return { number: typeof value === \"number\" ? value : Number(value) };\n\n case \"select\":\n return { select: { name: String(value) } };\n\n case \"multi_select\": {\n const items = Array.isArray(value)\n ? value\n : String(value)\n .split(\",\")\n .map((s) => s.trim());\n return { multi_select: items.map((name: unknown) => ({ name: String(name) })) };\n }\n\n case \"checkbox\":\n return { checkbox: Boolean(value) };\n\n case \"date\": {\n if (typeof value === \"object\" && value !== null && \"start\" in value) {\n const obj = value as { start: string; end?: string | null };\n return { date: { start: obj.start, end: obj.end ?? null } };\n }\n const dateStr = String(value);\n if (DATE_REGEX.test(dateStr)) {\n return { date: { start: dateStr, end: null } };\n }\n return null;\n }\n\n case \"url\":\n return { url: String(value) };\n\n case \"email\":\n return { email: String(value) };\n\n case \"phone_number\":\n return { phone_number: String(value) };\n\n case \"status\":\n return { status: { name: String(value) } };\n\n case \"relation\": {\n const items = Array.isArray(value) ? value : [value];\n const ids: Array<{ id: string }> = [];\n for (const item of items) {\n const str = String(item);\n const match = str.match(WIKILINK_REGEX);\n if (match?.[1] && this.wikilinkResolver) {\n const pageId = this.wikilinkResolver.resolve(match[1]);\n if (pageId) ids.push({ id: pageId });\n } else if (str.match(/^[0-9a-f-]{32,36}$/)) {\n ids.push({ id: str });\n }\n }\n return ids.length > 0 ? { relation: ids } : null;\n }\n\n case \"people\": {\n const users = Array.isArray(value) ? value : [value];\n const peopleArr = users\n .map((u) => {\n const s = String(u);\n if (s.match(/^[0-9a-f-]{32,36}$/)) return { object: \"user\" as const, id: s };\n return null;\n })\n .filter(Boolean);\n return peopleArr.length > 0 ? { people: peopleArr } : null;\n }\n\n case \"files\": {\n const fileList = Array.isArray(value) ? value : [value];\n const filesArr = fileList.map((f) => {\n if (typeof f === \"object\" && f !== null && \"url\" in f) {\n const obj = f as { name?: string; url: string };\n return { type: \"external\", name: obj.name ?? \"file\", external: { url: obj.url } };\n }\n return {\n type: \"external\",\n name: String(f),\n external: { url: String(f) },\n };\n });\n return { files: filesArr };\n }\n\n case \"created_time\":\n case \"last_edited_time\":\n case \"created_by\":\n case \"last_edited_by\":\n case \"formula\":\n case \"rollup\":\n case \"unique_id\":\n case \"verification\":\n return null;\n\n default:\n return { rich_text: [{ text: { content: String(value) } }] };\n }\n }\n\n private inferAndConvert(value: unknown): NotionPropertyValue | null {\n if (typeof value === \"boolean\") {\n return { checkbox: value };\n }\n if (typeof value === \"number\") {\n return { number: value };\n }\n if (Array.isArray(value)) {\n return {\n multi_select: value.map((v) => ({ name: String(v) })),\n };\n }\n if (typeof value === \"string\") {\n if (DATE_REGEX.test(value)) {\n return { date: { start: value, end: null } };\n }\n if (value.startsWith(\"http://\") || value.startsWith(\"https://\")) {\n return { url: value };\n }\n return { rich_text: [{ text: { content: value } }] };\n }\n return null;\n }\n\n private extractValue(prop: { type: string; [k: string]: unknown }): unknown {\n switch (prop.type) {\n case \"rich_text\": {\n const arr = prop.rich_text as Array<{ plain_text: string }> | undefined;\n return arr?.map((t) => t.plain_text).join(\"\") || null;\n }\n case \"number\":\n return prop.number;\n case \"select\": {\n const sel = prop.select as { name: string } | null;\n return sel?.name ?? null;\n }\n case \"multi_select\": {\n const items = prop.multi_select as Array<{ name: string }> | undefined;\n return items?.map((s) => s.name) ?? [];\n }\n case \"checkbox\":\n return prop.checkbox;\n case \"date\": {\n const dateObj = prop.date as { start: string; end?: string | null } | null;\n if (!dateObj) return null;\n if (dateObj.end) return { start: dateObj.start, end: dateObj.end };\n return dateObj.start;\n }\n case \"url\":\n return prop.url;\n case \"email\":\n return prop.email;\n case \"phone_number\":\n return prop.phone_number;\n case \"status\": {\n const status = prop.status as { name: string } | null;\n return status?.name ?? null;\n }\n case \"created_time\":\n return prop.created_time;\n case \"last_edited_time\":\n return prop.last_edited_time;\n case \"people\": {\n const people = prop.people as Array<{ name?: string; id: string }> | undefined;\n return people?.map((p) => p.name ?? p.id) ?? [];\n }\n case \"files\": {\n const files = prop.files as\n | Array<{\n name: string;\n type: string;\n file?: { url: string };\n external?: { url: string };\n }>\n | undefined;\n return (\n files?.map((f) => ({\n name: f.name,\n url: f.type === \"file\" ? f.file?.url : f.external?.url,\n })) ?? []\n );\n }\n case \"formula\": {\n const formula = prop.formula as { type: string; [k: string]: unknown } | undefined;\n if (!formula) return null;\n return formula[formula.type];\n }\n case \"relation\": {\n const rel = prop.relation as Array<{ id: string }> | undefined;\n if (!rel || rel.length === 0) return [];\n return rel.map((r) => {\n if (this.wikilinkResolver) {\n const title = this.wikilinkResolver.resolvePageId(r.id);\n if (title) return `[[${title}]]`;\n }\n return r.id;\n });\n }\n case \"rollup\": {\n const rollup = prop.rollup as { type: string; [k: string]: unknown } | undefined;\n if (!rollup) return null;\n if (rollup.type === \"array\") {\n const arr = rollup.array as Array<{ type: string; [k: string]: unknown }>;\n return arr.map((item) => this.extractValue(item));\n }\n return rollup[rollup.type] ?? null;\n }\n case \"unique_id\": {\n const uid = prop.unique_id as { prefix?: string; number: number } | undefined;\n if (!uid) return null;\n return uid.prefix ? `${uid.prefix}-${uid.number}` : String(uid.number);\n }\n case \"created_by\":\n case \"last_edited_by\": {\n const user = prop[prop.type] as { name?: string; id: string } | undefined;\n return user?.name ?? user?.id ?? null;\n }\n case \"verification\": {\n const v = prop.verification as { state: string } | undefined;\n return v?.state ?? null;\n }\n default:\n return null;\n }\n }\n}\n","import { Client, LogLevel } from \"@notionhq/client\";\nimport { Sema } from \"async-sema\";\nimport type {\n BlockObjectResponse,\n PageObjectResponse,\n PartialBlockObjectResponse,\n PageMarkdownResponse,\n} from \"@notionhq/client/build/src/api-endpoints.js\";\nimport type {\n DataSourceViewObjectResponse,\n ListDatabaseViewsResponse,\n} from \"@notionhq/client/build/src/api-endpoints/views.js\";\nimport { PropertyMapper } from \"./property-mapper.js\";\nimport type { ViewConfig, DatabaseViewsConfig, PageCover, PageIcon } from \"../types/view.js\";\n\nexport interface NotionClientOptions {\n readonly token: string;\n readonly concurrency?: number;\n readonly timeoutMs?: number;\n}\n\nexport class NotionClient {\n private readonly client: Client;\n private readonly sema: Sema;\n private readonly token: string;\n private readonly propertyMapper = new PropertyMapper();\n\n constructor(options: NotionClientOptions) {\n this.client = new Client({\n auth: options.token,\n timeoutMs: options.timeoutMs ?? 30000,\n logLevel: LogLevel.ERROR,\n });\n this.token = options.token;\n this.sema = new Sema(options.concurrency ?? 3);\n }\n\n getInternalClient(): Client {\n return this.client;\n }\n\n // ─── Page CRUD ───\n\n async getPage(pageId: string): Promise<PageObjectResponse> {\n return this.withRateLimit(\n () => this.client.pages.retrieve({ page_id: pageId }) as Promise<PageObjectResponse>,\n );\n }\n\n async createPage(params: {\n parentId: string;\n parentType: \"page\" | \"database\";\n title: string;\n properties?: Record<string, unknown>;\n children?: BlockObjectResponse[];\n }): Promise<PageObjectResponse> {\n const parent =\n params.parentType === \"database\"\n ? { database_id: params.parentId }\n : { page_id: params.parentId };\n\n const properties =\n params.parentType === \"page\"\n ? { title: { title: [{ text: { content: params.title } }] } }\n : ((params.properties as never) ?? {\n title: { title: [{ text: { content: params.title } }] },\n });\n\n return this.withRateLimit(\n () =>\n this.client.pages.create({\n parent,\n properties: properties as never,\n children: params.children as never,\n }) as Promise<PageObjectResponse>,\n );\n }\n\n async createPageWithMarkdown(params: {\n parentId: string;\n parentType: \"page\" | \"database\";\n title: string;\n markdown: string;\n properties?: Record<string, unknown>;\n }): Promise<PageObjectResponse> {\n const parent =\n params.parentType === \"database\"\n ? { database_id: params.parentId }\n : { page_id: params.parentId };\n\n const properties =\n params.parentType === \"page\"\n ? { title: { title: [{ text: { content: params.title } }] } }\n : ((params.properties as never) ?? {\n title: { title: [{ text: { content: params.title } }] },\n });\n\n return this.withRateLimit(\n () =>\n this.client.pages.create({\n parent,\n properties: properties as never,\n markdown: params.markdown,\n }) as Promise<PageObjectResponse>,\n );\n }\n\n async updatePageProperties(\n pageId: string,\n properties: Record<string, unknown>,\n ): Promise<PageObjectResponse> {\n return this.withRateLimit(\n () =>\n this.client.pages.update({\n page_id: pageId,\n properties: properties as never,\n }) as Promise<PageObjectResponse>,\n );\n }\n\n // ─── Markdown API ───\n\n async getPageMarkdown(pageId: string): Promise<PageMarkdownResponse> {\n return this.withRateLimit(() => this.client.pages.retrieveMarkdown({ page_id: pageId }));\n }\n\n async replacePageMarkdown(pageId: string, markdown: string): Promise<PageMarkdownResponse> {\n return this.withRateLimit(() =>\n this.client.pages.updateMarkdown({\n page_id: pageId,\n type: \"replace_content\",\n replace_content: {\n new_str: markdown,\n allow_deleting_content: true,\n },\n }),\n );\n }\n\n async updatePageMarkdownPartial(\n pageId: string,\n patches: Array<{ oldStr: string; newStr: string; replaceAll?: boolean }>,\n ): Promise<PageMarkdownResponse> {\n return this.withRateLimit(() =>\n this.client.pages.updateMarkdown({\n page_id: pageId,\n type: \"update_content\",\n update_content: {\n content_updates: patches.map((p) => ({\n old_str: p.oldStr,\n new_str: p.newStr,\n replace_all_matches: p.replaceAll ?? false,\n })),\n allow_deleting_content: true,\n },\n }),\n );\n }\n\n // ─── Page Move ───\n\n async movePage(\n pageId: string,\n newParentId: string,\n newParentType: \"page\" | \"database\",\n ): Promise<PageObjectResponse> {\n const parent =\n newParentType === \"database\" ? { database_id: newParentId } : { page_id: newParentId };\n return this.withRateLimit(\n () =>\n this.client.pages.update({\n page_id: pageId,\n parent,\n } as never) as Promise<PageObjectResponse>,\n );\n }\n\n // ─── Database / DataSource ───\n\n private async fetchDatabaseLegacy(databaseId: string): Promise<Record<string, unknown>> {\n const cleanId = databaseId.replace(/-/g, \"\");\n const formatted = `${cleanId.slice(0, 8)}-${cleanId.slice(8, 12)}-${cleanId.slice(12, 16)}-${cleanId.slice(16, 20)}-${cleanId.slice(20)}`;\n const resp = await this.withRateLimit(async () => {\n const r = await fetch(`https://api.notion.com/v1/databases/${formatted}`, {\n headers: {\n Authorization: `Bearer ${this.token}`,\n \"Notion-Version\": \"2022-06-28\",\n \"Content-Type\": \"application/json\",\n },\n });\n if (!r.ok) throw new Error(`Database fetch failed: ${r.status}`);\n return (await r.json()) as Record<string, unknown>;\n });\n return resp;\n }\n\n async getDatabaseTitle(databaseId: string): Promise<string> {\n const db = await this.fetchDatabaseLegacy(databaseId);\n const titleArr = db.title as Array<{ plain_text: string }> | undefined;\n return titleArr?.[0]?.plain_text ?? \"\";\n }\n\n async getDatabaseSchema(\n databaseId: string,\n ): Promise<Record<string, { id: string; type: string }>> {\n const db = await this.fetchDatabaseLegacy(databaseId);\n const properties = db.properties as Record<string, { id: string; type: string }> | undefined;\n if (!properties) return {};\n const schema: Record<string, { id: string; type: string }> = {};\n for (const [name, prop] of Object.entries(properties)) {\n schema[name] = { id: prop.id, type: prop.type };\n }\n return schema;\n }\n\n async queryDatabase(\n databaseId: string,\n options?: { startCursor?: string; pageSize?: number; filter?: unknown },\n ): Promise<{ results: PageObjectResponse[]; nextCursor: string | null }> {\n const dsId = await this.getDataSourceId(databaseId);\n const response = await this.withRateLimit(() =>\n this.client.dataSources.query({\n data_source_id: dsId,\n start_cursor: options?.startCursor,\n page_size: options?.pageSize ?? 100,\n filter: options?.filter as never,\n }),\n );\n return {\n results: response.results as PageObjectResponse[],\n nextCursor: response.next_cursor,\n };\n }\n\n async queryAllDatabasePages(databaseId: string, filter?: unknown): Promise<PageObjectResponse[]> {\n const all: PageObjectResponse[] = [];\n let cursor: string | undefined;\n\n do {\n const response = await this.queryDatabase(databaseId, {\n startCursor: cursor,\n pageSize: 100,\n filter,\n });\n all.push(...response.results);\n cursor = response.nextCursor ?? undefined;\n } while (cursor);\n\n return all;\n }\n\n async getDataSourceId(databaseId: string): Promise<string> {\n const db = await this.withRateLimit(() =>\n this.client.databases.retrieve({ database_id: databaseId }),\n );\n const dataSources = (db as unknown as { data_sources?: Array<{ id: string }> }).data_sources;\n return dataSources?.[0]?.id ?? databaseId;\n }\n\n async archivePage(pageId: string): Promise<void> {\n await this.withRateLimit(() => this.client.pages.update({ page_id: pageId, archived: true }));\n }\n\n async getFileBlockUrl(blockId: string): Promise<string | null> {\n try {\n const block = await this.withRateLimit(() =>\n this.client.blocks.retrieve({ block_id: blockId }),\n );\n const b = block as unknown as {\n type: string;\n file?: { file?: { url: string }; external?: { url: string } };\n pdf?: { file?: { url: string }; external?: { url: string } };\n video?: { file?: { url: string }; external?: { url: string } };\n audio?: { file?: { url: string }; external?: { url: string } };\n image?: { file?: { url: string }; external?: { url: string } };\n };\n const media = b.file ?? b.pdf ?? b.video ?? b.audio ?? b.image;\n return media?.file?.url ?? media?.external?.url ?? null;\n } catch {\n return null;\n }\n }\n\n async getBlock(blockId: string): Promise<BlockObjectResponse> {\n return this.withRateLimit(() =>\n this.client.blocks.retrieve({ block_id: blockId }),\n ) as Promise<BlockObjectResponse>;\n }\n\n // ─── Block CRUD ───\n\n async listChildren(\n blockId: string,\n options?: { startCursor?: string; pageSize?: number },\n ): Promise<{\n results: (BlockObjectResponse | PartialBlockObjectResponse)[];\n nextCursor: string | null;\n }> {\n const response = await this.withRateLimit(() =>\n this.client.blocks.children.list({\n block_id: blockId,\n start_cursor: options?.startCursor,\n page_size: options?.pageSize ?? 100,\n }),\n );\n return {\n results: response.results,\n nextCursor: response.next_cursor,\n };\n }\n\n async fetchAllChildren(blockId: string): Promise<BlockObjectResponse[]> {\n const blocks: BlockObjectResponse[] = [];\n let cursor: string | undefined;\n\n do {\n const response = await this.listChildren(blockId, { startCursor: cursor });\n blocks.push(...response.results.filter((b): b is BlockObjectResponse => \"type\" in b));\n cursor = response.nextCursor ?? undefined;\n } while (cursor);\n\n return blocks;\n }\n\n private static readonly CONTAINER_BLOCK_TYPES = new Set([\n \"column_list\",\n \"column\",\n \"callout\",\n \"toggle\",\n \"quote\",\n ]);\n\n async fetchAllChildrenDeep(blockId: string): Promise<BlockObjectResponse[]> {\n const directChildren = await this.fetchAllChildren(blockId);\n const allBlocks: BlockObjectResponse[] = [...directChildren];\n\n const toExpand = directChildren.filter((b) => {\n if (!b.has_children) return false;\n if (b.type === \"child_page\" || b.type === \"child_database\") return false;\n if (NotionClient.CONTAINER_BLOCK_TYPES.has(b.type)) return true;\n if (b.type === \"synced_block\") {\n const sb = b as unknown as { synced_block: { synced_from: { block_id: string } | null } };\n return sb.synced_block?.synced_from === null;\n }\n return true;\n });\n\n for (const container of toExpand) {\n try {\n const nested = await this.fetchAllChildrenDeep(container.id);\n allBlocks.push(...nested);\n } catch {\n // 접근 권한 없는 블록 무시\n }\n }\n\n return allBlocks;\n }\n\n async appendChildren(blockId: string, children: unknown[]): Promise<void> {\n const BATCH_SIZE = 100;\n for (let i = 0; i < children.length; i += BATCH_SIZE) {\n const batch = children.slice(i, i + BATCH_SIZE);\n await this.withRateLimit(() =>\n this.client.blocks.children.append({\n block_id: blockId,\n children: batch as never,\n }),\n );\n }\n }\n\n async deleteBlock(blockId: string): Promise<void> {\n await this.withRateLimit(() => this.client.blocks.delete({ block_id: blockId }));\n }\n\n // ─── File Upload ───\n\n async uploadFile(fileData: Blob, filename: string, contentType: string): Promise<string> {\n const upload = await this.withRateLimit(() =>\n this.client.fileUploads.create({ filename, content_type: contentType }),\n );\n\n const fileUploadId = (upload as unknown as { id: string }).id;\n\n const sendResult = await this.withRateLimit(() =>\n this.client.fileUploads.send({\n file_upload_id: fileUploadId,\n file: { data: fileData, filename },\n }),\n );\n\n const status = (sendResult as unknown as { status: string }).status;\n if (status === \"pending\") {\n await this.withRateLimit(() =>\n this.client.fileUploads.complete({ file_upload_id: fileUploadId }),\n );\n }\n\n return fileUploadId;\n }\n\n // ─── Search & Navigation ───\n\n async search(params: {\n query?: string;\n filter?: { property: \"object\"; value: \"page\" | \"data_source\" };\n startCursor?: string;\n pageSize?: number;\n }): Promise<{ results: PageObjectResponse[]; nextCursor: string | null }> {\n const response = await this.withRateLimit(() =>\n this.client.search({\n query: params.query,\n filter: params.filter,\n start_cursor: params.startCursor,\n page_size: params.pageSize ?? 100,\n }),\n );\n return {\n results: response.results as PageObjectResponse[],\n nextCursor: response.next_cursor,\n };\n }\n\n async searchRecentPages(since: string): Promise<Array<{ id: string; last_edited_time: string }>> {\n const results: Array<{ id: string; last_edited_time: string }> = [];\n let cursor: string | undefined;\n const sinceDate = new Date(since);\n\n outer: do {\n const response = await this.withRateLimit(() =>\n this.client.search({\n filter: { property: \"object\", value: \"page\" },\n sort: { direction: \"descending\", timestamp: \"last_edited_time\" },\n start_cursor: cursor,\n page_size: 100,\n }),\n );\n\n for (const page of response.results) {\n const p = page as PageObjectResponse;\n if (new Date(p.last_edited_time) <= sinceDate) {\n break outer;\n }\n results.push({ id: p.id, last_edited_time: p.last_edited_time });\n }\n\n cursor = response.next_cursor ?? undefined;\n } while (cursor);\n\n return results;\n }\n\n async getChildPages(parentId: string): Promise<PageObjectResponse[]> {\n const blocks = await this.fetchAllChildrenDeep(parentId);\n const childPageBlocks = blocks.filter((b) => b.type === \"child_page\");\n\n if (childPageBlocks.length === 0) return [];\n\n const pages = await Promise.all(childPageBlocks.map((b) => this.getPage(b.id)));\n return pages;\n }\n\n async getChildDatabaseIds(parentId: string): Promise<string[]> {\n const children = await this.fetchAllChildren(parentId);\n return children.filter((b) => b.type === \"child_database\").map((b) => b.id);\n }\n\n async getChildPagesRecursive(parentId: string): Promise<PageObjectResponse[]> {\n const all: PageObjectResponse[] = [];\n let currentLevel: string[] = [parentId];\n\n while (currentLevel.length > 0) {\n const nextLevel: string[] = [];\n\n for (const id of currentLevel) {\n const children = await this.getChildPages(id);\n for (const child of children) {\n all.push(child);\n nextLevel.push(child.id);\n }\n }\n\n currentLevel = nextLevel;\n }\n\n return all;\n }\n\n // ─── Views API ───\n\n async listDatabaseViews(databaseId: string): Promise<ViewConfig[]> {\n const allViews: ViewConfig[] = [];\n let cursor: string | undefined;\n\n do {\n const response = await this.withRateLimit(() =>\n this.client.views.list({\n database_id: databaseId,\n start_cursor: cursor,\n page_size: 100,\n }),\n );\n\n const viewRefs = (response as ListDatabaseViewsResponse).results;\n for (const ref of viewRefs) {\n try {\n const detail = await this.getView(ref.id as string);\n if (detail) allViews.push(detail);\n } catch {\n // 뷰 상세 조회 실패 시 스킵\n }\n }\n\n cursor = (response as ListDatabaseViewsResponse).next_cursor as string | undefined;\n } while (cursor);\n\n return allViews;\n }\n\n async getView(viewId: string): Promise<ViewConfig | null> {\n const view = await this.withRateLimit(() => this.client.views.retrieve({ view_id: viewId }));\n\n const v = view as DataSourceViewObjectResponse;\n if (!v.type) return null;\n\n return parseViewResponse(v);\n }\n\n async getDatabaseViewsConfig(databaseId: string): Promise<DatabaseViewsConfig> {\n const views = await this.listDatabaseViews(databaseId);\n return {\n databaseId,\n lastSynced: new Date().toISOString(),\n views,\n };\n }\n\n // ─── Cover / Icon Extraction ───\n\n extractCover(page: PageObjectResponse): PageCover | null {\n const raw = page as unknown as {\n cover?: {\n type: string;\n file?: { url: string; expiry_time?: string };\n external?: { url: string };\n };\n };\n if (!raw.cover) return null;\n\n if (raw.cover.type === \"file\" && raw.cover.file) {\n return {\n type: \"file\",\n url: raw.cover.file.url,\n expiryTime: raw.cover.file.expiry_time,\n };\n }\n if (raw.cover.type === \"external\" && raw.cover.external) {\n return { type: \"external\", url: raw.cover.external.url };\n }\n return null;\n }\n\n extractIcon(page: PageObjectResponse): PageIcon | null {\n const raw = page as unknown as {\n icon?: {\n type: string;\n emoji?: string;\n external?: { url: string };\n file?: { url: string; expiry_time?: string };\n icon?: { name: string; color?: string };\n };\n };\n if (!raw.icon) return null;\n\n switch (raw.icon.type) {\n case \"emoji\":\n return { type: \"emoji\", value: raw.icon.emoji! };\n case \"external\":\n return { type: \"external\", value: raw.icon.external!.url };\n case \"file\":\n return { type: \"file\", value: raw.icon.file!.url };\n case \"icon\":\n return { type: \"icon\", value: raw.icon.icon!.name, color: raw.icon.icon!.color };\n default:\n return null;\n }\n }\n\n // ─── Property Extraction ───\n\n extractTitle(page: PageObjectResponse): string {\n const props = page.properties as Record<\n string,\n { type: string; title?: Array<{ plain_text?: string }> }\n >;\n for (const prop of Object.values(props)) {\n if (prop.type === \"title\" && prop.title) {\n const joined = prop.title.map((t) => t.plain_text ?? \"\").join(\"\");\n if (joined) return joined;\n }\n }\n return \"제목 없음\";\n }\n\n extractProperties(page: PageObjectResponse): Record<string, unknown> {\n return this.propertyMapper.fromNotionProperties(page.properties as Record<string, unknown>);\n }\n\n // ─── Internal ───\n\n private lastRequestTime = 0;\n private readonly minRequestInterval = 350;\n\n private async withRateLimit<T>(fn: () => Promise<T>): Promise<T> {\n await this.sema.acquire();\n try {\n const now = Date.now();\n const elapsed = now - this.lastRequestTime;\n if (elapsed < this.minRequestInterval) {\n await sleep(this.minRequestInterval - elapsed);\n }\n this.lastRequestTime = Date.now();\n return await this.executeWithRetry(fn);\n } finally {\n this.sema.release();\n }\n }\n\n private async executeWithRetry<T>(fn: () => Promise<T>, attempt: number = 0): Promise<T> {\n try {\n return await fn();\n } catch (error: unknown) {\n if (isRetryable(error) && attempt < 5) {\n const baseDelay = extractRetryAfter(error) ?? 1000 * Math.pow(2, attempt);\n const jitter = baseDelay * (0.5 + Math.random() * 0.5);\n await sleep(jitter);\n return this.executeWithRetry(fn, attempt + 1);\n }\n throw error;\n }\n }\n}\n\nfunction isRetryable(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false;\n const code = (error as { code?: string }).code;\n if (code === \"notionhq_client_request_timeout\" || code === \"ECONNRESET\" || code === \"ETIMEDOUT\") {\n return true;\n }\n if (!(\"status\" in error)) return false;\n const status = (error as { status: number }).status;\n return status === 429 || status === 502 || status === 503 || status === 504;\n}\n\nfunction extractRetryAfter(error: unknown): number | null {\n if (typeof error === \"object\" && error !== null && \"headers\" in error) {\n const headers = (error as { headers: Record<string, string> }).headers;\n const retryAfter = headers?.[\"retry-after\"];\n if (retryAfter) return Number(retryAfter) * 1000;\n }\n return null;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction parseViewResponse(v: DataSourceViewObjectResponse): ViewConfig {\n const config: ViewConfig = {\n id: v.id as string,\n name: v.name,\n type: v.type,\n dataSourceId: v.data_source_id,\n filter: v.filter,\n sorts: v.sorts?.map((s) => {\n if (\"property\" in s) {\n return { property: s.property, direction: s.direction };\n }\n return { timestamp: s.timestamp, direction: s.direction };\n }),\n ...extractViewTypeConfig(v.configuration),\n };\n return config;\n}\n\ntype MutableViewConfig = {\n -readonly [K in keyof ViewConfig]: ViewConfig[K];\n};\n\nfunction extractViewTypeConfig(\n cfg: DataSourceViewObjectResponse[\"configuration\"],\n): Partial<MutableViewConfig> {\n if (!cfg) return {};\n\n const result: Partial<MutableViewConfig> = {};\n\n if (\"properties\" in cfg && cfg.properties) {\n result.properties = cfg.properties.map((p) => ({\n propertyId: p.property_id,\n propertyName: p.property_name,\n visible: p.visible,\n width: p.width,\n wrap: p.wrap,\n }));\n }\n\n if (\"group_by\" in cfg && cfg.group_by) {\n const gb = cfg.group_by;\n result.groupBy = {\n type: gb.type,\n propertyId: gb.property_id,\n propertyName: \"property_name\" in gb ? (gb.property_name as string) : undefined,\n sort:\n \"sort\" in gb && gb.sort\n ? ((gb.sort as { type: string }).type as \"manual\" | \"ascending\" | \"descending\")\n : undefined,\n hideEmptyGroups: \"hide_empty_groups\" in gb ? (gb.hide_empty_groups as boolean) : undefined,\n };\n }\n\n if (\"cover\" in cfg && cfg.cover) {\n result.cover = {\n type: cfg.cover.type,\n propertyId: cfg.cover.property_id,\n };\n }\n\n if (\"cover_size\" in cfg) result.coverSize = cfg.cover_size;\n if (\"cover_aspect\" in cfg) result.coverAspect = cfg.cover_aspect;\n\n if (\"date_property_id\" in cfg) {\n result.datePropertyId = cfg.date_property_id;\n result.datePropertyName = cfg.date_property_name;\n }\n\n if (\"view_range\" in cfg) result.viewRange = cfg.view_range;\n\n return result;\n}\n","const VALID_COLORS = new Set([\n \"default\",\n \"gray\",\n \"brown\",\n \"orange\",\n \"yellow\",\n \"green\",\n \"blue\",\n \"purple\",\n \"pink\",\n \"red\",\n \"gray_background\",\n \"brown_background\",\n \"orange_background\",\n \"yellow_background\",\n \"green_background\",\n \"blue_background\",\n \"purple_background\",\n \"pink_background\",\n \"red_background\",\n]);\n\ntype NotionColor = string;\n\nfunction safeColor(color: string): NotionColor {\n return VALID_COLORS.has(color) ? color : \"default\";\n}\n\nexport interface RichTextSegment {\n content: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n code?: boolean;\n color?: string;\n link?: string;\n}\n\nexport interface NotionRichText {\n type: \"text\";\n text: { content: string; link?: { url: string } | null };\n annotations: {\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strikethrough: boolean;\n code: boolean;\n color: string;\n };\n}\n\nexport interface NotionEquationRichText {\n type: \"equation\";\n equation: { expression: string };\n}\n\nexport interface NotionMentionRichText {\n type: \"mention\";\n mention:\n | { type: \"page\"; page: { id: string } }\n | { type: \"date\"; date: { start: string; end?: string } }\n | { type: \"user\"; user: { id: string } }\n | { type: \"database\"; database: { id: string } };\n}\n\nexport type RichTextItem = NotionRichText | NotionEquationRichText | NotionMentionRichText;\n\nexport interface NotionBlock {\n object?: \"block\";\n type: string;\n [key: string]: unknown;\n}\n\nexport class NotionBlockBuilder {\n // ─── Rich Text ──────────────────────────────────────────\n\n static richText(content: string, options?: Partial<RichTextSegment>): NotionRichText[] {\n const textObj: { content: string; link?: { url: string } | null } = { content };\n if (options?.link) {\n textObj.link = { url: options.link };\n }\n return [\n {\n type: \"text\",\n text: textObj,\n annotations: {\n bold: options?.bold ?? false,\n italic: options?.italic ?? false,\n underline: options?.underline ?? false,\n strikethrough: options?.strikethrough ?? false,\n code: options?.code ?? false,\n color: safeColor(options?.color ?? \"default\"),\n },\n },\n ];\n }\n\n static richTextArray(segments: RichTextSegment[]): NotionRichText[] {\n return segments.map((seg) => {\n const textObj: { content: string; link?: { url: string } | null } = {\n content: seg.content,\n };\n if (seg.link) {\n textObj.link = { url: seg.link };\n }\n return {\n type: \"text\" as const,\n text: textObj,\n annotations: {\n bold: seg.bold ?? false,\n italic: seg.italic ?? false,\n underline: seg.underline ?? false,\n strikethrough: seg.strikethrough ?? false,\n code: seg.code ?? false,\n color: safeColor(seg.color ?? \"default\"),\n },\n };\n });\n }\n\n static richTextEquation(expression: string): NotionEquationRichText[] {\n return [{ type: \"equation\", equation: { expression } }];\n }\n\n static richTextMentionPage(pageId: string): NotionMentionRichText[] {\n return [{ type: \"mention\", mention: { type: \"page\", page: { id: pageId } } }];\n }\n\n static richTextMentionDate(start: string, end?: string): NotionMentionRichText[] {\n const date: { start: string; end?: string } = { start };\n if (end) date.end = end;\n return [{ type: \"mention\", mention: { type: \"date\", date } }];\n }\n\n // ─── Basic Blocks ───────────────────────────────────────\n\n static paragraph(richText: RichTextItem[], color?: string): NotionBlock {\n return {\n object: \"block\",\n type: \"paragraph\",\n paragraph: { rich_text: richText, color: safeColor(color ?? \"default\") },\n };\n }\n\n static heading(\n level: 1 | 2 | 3,\n richText: RichTextItem[],\n options?: { color?: string; isToggleable?: boolean; children?: NotionBlock[] },\n ): NotionBlock {\n const key = `heading_${level}`;\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(options?.color ?? \"default\"),\n is_toggleable: options?.isToggleable ?? false,\n };\n if (options?.isToggleable && options?.children) {\n data.children = options.children;\n }\n return { object: \"block\", type: key, [key]: data };\n }\n\n static callout(\n richText: RichTextItem[],\n icon?: string,\n options?: { color?: string; children?: NotionBlock[] },\n ): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n icon: { type: \"emoji\", emoji: icon ?? \"\\u{1F4CC}\" },\n color: safeColor(options?.color ?? \"default\"),\n };\n if (options?.children) {\n data.children = options.children;\n }\n return { object: \"block\", type: \"callout\", callout: data };\n }\n\n static toggle(richText: RichTextItem[], children?: NotionBlock[], color?: string): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(color ?? \"default\"),\n };\n if (children) {\n data.children = children;\n }\n return { object: \"block\", type: \"toggle\", toggle: data };\n }\n\n static bulletedListItem(\n richText: RichTextItem[],\n children?: NotionBlock[],\n color?: string,\n ): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(color ?? \"default\"),\n };\n if (children) {\n data.children = children;\n }\n return {\n object: \"block\",\n type: \"bulleted_list_item\",\n bulleted_list_item: data,\n };\n }\n\n static numberedListItem(\n richText: RichTextItem[],\n children?: NotionBlock[],\n color?: string,\n ): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(color ?? \"default\"),\n };\n if (children) {\n data.children = children;\n }\n return {\n object: \"block\",\n type: \"numbered_list_item\",\n numbered_list_item: data,\n };\n }\n\n static toDo(richText: RichTextItem[], checked?: boolean, color?: string): NotionBlock {\n return {\n object: \"block\",\n type: \"to_do\",\n to_do: {\n rich_text: richText,\n checked: checked ?? false,\n color: safeColor(color ?? \"default\"),\n },\n };\n }\n\n static quote(richText: RichTextItem[], children?: NotionBlock[], color?: string): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: richText,\n color: safeColor(color ?? \"default\"),\n };\n if (children) {\n data.children = children;\n }\n return { object: \"block\", type: \"quote\", quote: data };\n }\n\n static divider(): NotionBlock {\n return { object: \"block\", type: \"divider\", divider: {} };\n }\n\n static code(code: string, language?: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n rich_text: NotionBlockBuilder.richText(code),\n language: language ?? \"plain text\",\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"code\", code: data };\n }\n\n static equationBlock(expression: string): NotionBlock {\n return {\n object: \"block\",\n type: \"equation\",\n equation: { expression },\n };\n }\n\n // ─── Media Blocks ───────────────────────────────────────\n\n static image(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"image\", image: data };\n }\n\n static bookmark(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = { url };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"bookmark\", bookmark: data };\n }\n\n static video(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"video\", video: data };\n }\n\n static audio(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"audio\", audio: data };\n }\n\n static fileBlock(url: string, name?: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (name) data.name = name;\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"file\", file: data };\n }\n\n static pdf(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = {\n type: \"external\",\n external: { url },\n };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"pdf\", pdf: data };\n }\n\n static embed(url: string, caption?: string): NotionBlock {\n const data: Record<string, unknown> = { url };\n if (caption) {\n data.caption = NotionBlockBuilder.richText(caption);\n }\n return { object: \"block\", type: \"embed\", embed: data };\n }\n\n // ─── Advanced Blocks ────────────────────────────────────\n\n static tableOfContents(color?: string): NotionBlock {\n return {\n object: \"block\",\n type: \"table_of_contents\",\n table_of_contents: { color: safeColor(color ?? \"default\") },\n };\n }\n\n static breadcrumb(): NotionBlock {\n return { object: \"block\", type: \"breadcrumb\", breadcrumb: {} };\n }\n\n static columnList(columns: NotionBlock[][]): NotionBlock {\n const children = columns.map((colBlocks) => ({\n object: \"block\" as const,\n type: \"column\" as const,\n column: { children: colBlocks },\n }));\n return {\n object: \"block\",\n type: \"column_list\",\n column_list: { children },\n };\n }\n\n static syncedBlockOriginal(children: NotionBlock[]): NotionBlock {\n return {\n object: \"block\",\n type: \"synced_block\",\n synced_block: { synced_from: null, children },\n };\n }\n\n static syncedBlockDuplicate(originalBlockId: string): NotionBlock {\n return {\n object: \"block\",\n type: \"synced_block\",\n synced_block: { synced_from: { block_id: originalBlockId } },\n };\n }\n\n static linkToPage(pageId: string): NotionBlock {\n return {\n object: \"block\",\n type: \"link_to_page\",\n link_to_page: { type: \"page_id\", page_id: pageId },\n };\n }\n\n static table(rows: string[][], hasColumnHeader?: boolean, hasRowHeader?: boolean): NotionBlock {\n if (rows.length === 0) rows = [[\"\", \"\"]];\n const width = rows[0]!.length;\n const tableRows = rows.map((row) => {\n const cells = row.map((cell) => NotionBlockBuilder.richText(cell));\n while (cells.length < width) {\n cells.push(NotionBlockBuilder.richText(\"\"));\n }\n return {\n object: \"block\" as const,\n type: \"table_row\" as const,\n table_row: { cells },\n };\n });\n return {\n object: \"block\",\n type: \"table\",\n table: {\n table_width: width,\n has_column_header: hasColumnHeader ?? true,\n has_row_header: hasRowHeader ?? false,\n children: tableRows,\n },\n };\n }\n}\n","import { createHash } from \"node:crypto\";\n\nexport function computeHash(content: string): string {\n return createHash(\"sha256\").update(content, \"utf-8\").digest(\"hex\");\n}\n\nexport function computeBufferHash(buffer: Buffer): string {\n return createHash(\"sha256\").update(buffer).digest(\"hex\");\n}\n","import type { LocalChange } from \"../types/sync.js\";\nimport type { StateDB } from \"../state/state-db.js\";\nimport type { FileStatInfo } from \"./vault-fs.js\";\nimport { computeHash } from \"../utils/hash.js\";\n\nexport interface FileInfo {\n readonly path: string;\n readonly content: string;\n readonly mtime: string;\n}\n\nexport class ChangeDetector {\n constructor(private readonly stateDb: StateDB) {}\n\n async detectLocalChangesFast(\n stats: FileStatInfo[],\n readFile: (path: string) => Promise<string>,\n ): Promise<LocalChange[]> {\n const changes: LocalChange[] = [];\n const existingPaths = new Set<string>();\n\n for (const file of stats) {\n existingPaths.add(file.path);\n const record = this.stateDb.getByPath(file.path);\n\n if (!record) {\n const content = await readFile(file.path);\n changes.push({\n path: file.path,\n type: \"created\",\n currentHash: computeHash(content),\n previousHash: null,\n });\n continue;\n }\n\n if (record.localMtime === file.mtime && record.localFileSize === file.size) {\n continue;\n }\n\n const content = await readFile(file.path);\n const currentHash = computeHash(content);\n if (record.contentHash !== currentHash) {\n changes.push({\n path: file.path,\n type: \"modified\",\n currentHash,\n previousHash: record.contentHash,\n });\n }\n }\n\n const syncedRecords = this.stateDb.getByStatus(\"synced\");\n for (const record of syncedRecords) {\n if (!existingPaths.has(record.obsidianPath)) {\n if (record.fileType === \"folder-note\" || record.fileType === \"folder-only\") {\n if (!record.obsidianPath.endsWith(\".md\")) continue;\n }\n changes.push({\n path: record.obsidianPath,\n type: \"deleted\",\n currentHash: \"\",\n previousHash: record.contentHash,\n });\n }\n }\n\n return this.detectMoves(changes);\n }\n\n detectLocalChanges(currentFiles: FileInfo[]): LocalChange[] {\n const changes: LocalChange[] = [];\n const existingPaths = new Set<string>();\n\n for (const file of currentFiles) {\n existingPaths.add(file.path);\n const record = this.stateDb.getByPath(file.path);\n\n if (!record) {\n changes.push({\n path: file.path,\n type: \"created\",\n currentHash: computeHash(file.content),\n previousHash: null,\n });\n continue;\n }\n\n if (record.localMtime && record.localMtime === file.mtime) {\n continue;\n }\n\n const currentHash = computeHash(file.content);\n if (record.contentHash !== currentHash) {\n changes.push({\n path: file.path,\n type: \"modified\",\n currentHash,\n previousHash: record.contentHash,\n });\n }\n }\n\n const syncedRecords = this.stateDb.getByStatus(\"synced\");\n for (const record of syncedRecords) {\n if (!existingPaths.has(record.obsidianPath)) {\n if (record.fileType === \"folder-note\" || record.fileType === \"folder-only\") {\n if (!record.obsidianPath.endsWith(\".md\")) continue;\n }\n changes.push({\n path: record.obsidianPath,\n type: \"deleted\",\n currentHash: \"\",\n previousHash: record.contentHash,\n });\n }\n }\n\n return this.detectMoves(changes);\n }\n\n private detectMoves(changes: LocalChange[]): LocalChange[] {\n const result: LocalChange[] = [];\n const created = changes.filter((c) => c.type === \"created\");\n const deleted = changes.filter((c) => c.type === \"deleted\");\n const others = changes.filter((c) => c.type !== \"created\" && c.type !== \"deleted\");\n\n const matchedCreated = new Set<string>();\n const matchedDeleted = new Set<string>();\n\n for (const del of deleted) {\n const match = created.find(\n (c) => c.currentHash === del.previousHash && !matchedCreated.has(c.path),\n );\n if (match) {\n matchedCreated.add(match.path);\n matchedDeleted.add(del.path);\n result.push({\n path: match.path,\n type: \"moved\",\n currentHash: match.currentHash,\n previousHash: del.previousHash,\n movedFrom: del.path,\n });\n }\n }\n\n for (const c of created) {\n if (!matchedCreated.has(c.path)) result.push(c);\n }\n for (const d of deleted) {\n if (!matchedDeleted.has(d.path)) result.push(d);\n }\n result.push(...others);\n\n return result;\n }\n}\n","export interface Logger {\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n debug(message: string, ...args: unknown[]): void;\n}\n\nconst consoleLogger: Logger = {\n warn: (msg, ...args) => console.warn(msg, ...args),\n error: (msg, ...args) => console.error(msg, ...args),\n info: (msg, ...args) => console.info(msg, ...args),\n debug: () => {},\n};\n\nlet currentLogger: Logger = consoleLogger;\n\nexport function setLogger(logger: Logger): void {\n currentLogger = logger;\n}\n\nexport function getLogger(): Logger {\n return currentLogger;\n}\n","import type {\n ConversionContext,\n ConversionPath,\n ConversionResult,\n Processor,\n ProcessorInput,\n ProcessorMetadata,\n} from \"../types/convert.js\";\nimport { getLogger } from \"../utils/logger.js\";\n\nexport class ConversionPipeline {\n private readonly preProcessors: Processor[] = [];\n private readonly postProcessors: Processor[] = [];\n\n registerPreProcessor(processor: Processor): void {\n this.preProcessors.push(processor);\n this.preProcessors.sort((a, b) => a.order - b.order);\n }\n\n registerPostProcessor(processor: Processor): void {\n this.postProcessors.push(processor);\n this.postProcessors.sort((a, b) => a.order - b.order);\n }\n\n selectPath(content: string): ConversionPath {\n const hasInlineDb = /%% im-nobsidian:inline-db/.test(content);\n const hasColumnLayout = />\\s*\\[!col\\]/.test(content);\n const hasToggleHeading = /%% im-nobsidian:toggle-heading/.test(content);\n\n if (hasInlineDb || hasColumnLayout || hasToggleHeading) {\n return \"block-api\";\n }\n\n return \"markdown-api\";\n }\n\n convertToNotion(markdown: string, context: ConversionContext): ConversionResult {\n let input: ProcessorInput = {\n content: markdown,\n metadata: {},\n context,\n };\n\n for (const processor of this.preProcessors) {\n try {\n const output = processor.process(input);\n input = {\n content: output.content,\n metadata: output.metadata,\n context,\n };\n } catch (error) {\n getLogger().warn(`[${processor.name}] Pre-processor failed:`, error);\n }\n }\n\n return {\n content: input.content,\n properties: (input.metadata.properties as Record<string, unknown>) ?? {},\n images: input.metadata.images ?? [],\n preserveMarkers: input.metadata.preserveMarkers ?? [],\n };\n }\n\n convertToMarkdown(\n content: string,\n context: ConversionContext,\n metadata?: ProcessorMetadata,\n ): string {\n let input: ProcessorInput = {\n content,\n metadata: metadata ?? {},\n context,\n };\n\n for (const processor of this.postProcessors) {\n try {\n const output = processor.process(input);\n input = {\n content: output.content,\n metadata: output.metadata,\n context,\n };\n } catch (error) {\n getLogger().warn(`[${processor.name}] Post-processor failed:`, error);\n }\n }\n\n return input.content;\n }\n}\n","import matter from \"gray-matter\";\nimport type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nexport class FrontmatterExtractor implements Processor {\n readonly name = \"FrontmatterExtractor\";\n readonly order = 10;\n\n process(input: ProcessorInput): ProcessorOutput {\n const { data, content } = matter(input.content);\n\n return {\n content: content.trim(),\n metadata: {\n ...input.metadata,\n properties: data,\n },\n };\n }\n}\n","import type {\n Processor,\n ProcessorInput,\n ProcessorOutput,\n WikilinkEntry,\n PreserveMarker,\n} from \"../../types/convert.js\";\n\nconst WIKILINK_REGEX = /(?<!!)\\[\\[([^\\]|]+)(?:\\|([^\\]]+))?\\]\\]/g;\n\nexport type WikilinkResolverFn = (text: string) => WikilinkEntry | null;\n\nexport class WikilinkResolver implements Processor {\n readonly name = \"WikilinkResolver\";\n readonly order = 20;\n\n constructor(private readonly resolve?: WikilinkResolverFn) {}\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"push\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const preserveMarkers: PreserveMarker[] = input.metadata.preserveMarkers\n ? [...input.metadata.preserveMarkers]\n : [];\n\n const resolved = input.content.replace(\n WIKILINK_REGEX,\n (_match, target: string, display?: string) => {\n const label = display ?? target;\n\n if (this.resolve) {\n const entry = this.resolve(target);\n if (entry) {\n return `<mention-page id=\"${entry.notionPageId}\">${label}</mention-page>`;\n }\n }\n\n preserveMarkers.push({\n type: \"wikilink\",\n params: display ? { text: target, display } : { text: target },\n startIndex: 0,\n });\n\n const encodedTarget = encodeURIComponent(target);\n return `[${label}](im-nobsidian://wikilink/${encodedTarget})`;\n },\n );\n\n return {\n content: resolved,\n metadata: { ...input.metadata, preserveMarkers },\n };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst CALLOUT_REGEX = /^> \\[!(\\w+)\\]([+-])?\\s*(.*)?$/gm;\n\nconst CALLOUT_EMOJI_MAP: Record<string, string> = {\n note: \"\\u{1F4DD}\",\n abstract: \"\\u{1F4CB}\",\n summary: \"\\u{1F4CB}\",\n info: \"\\u{2139}\\u{FE0F}\",\n tip: \"\\u{1F4A1}\",\n hint: \"\\u{1F4A1}\",\n success: \"\\u{2705}\",\n check: \"\\u{2705}\",\n question: \"\\u{2753}\",\n faq: \"\\u{2753}\",\n warning: \"\\u{26A0}\\u{FE0F}\",\n caution: \"\\u{26A0}\\u{FE0F}\",\n failure: \"\\u{274C}\",\n fail: \"\\u{274C}\",\n danger: \"\\u{1F525}\",\n error: \"\\u{1F525}\",\n bug: \"\\u{1F41B}\",\n example: \"\\u{1F4CC}\",\n quote: \"\\u{1F4AC}\",\n cite: \"\\u{1F4AC}\",\n};\n\nexport class CalloutTransformer implements Processor {\n readonly name = \"CalloutTransformer\";\n readonly order = 30;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.path === \"markdown-api\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const content = input.content.replace(\n CALLOUT_REGEX,\n (_match, type: string, foldable: string | undefined, title: string | undefined) => {\n const emoji = CALLOUT_EMOJI_MAP[type.toLowerCase()] ?? \"\\u{1F4DD}\";\n const titleText = title?.trim() || type;\n const foldMeta = foldable\n ? `\\n%% im-nobsidian:callout:type=${type}&foldable=${foldable === \"+\" ? \"open\" : \"closed\"} %%`\n : `\\n%% im-nobsidian:callout:type=${type} %%`;\n\n return `> ${emoji} **${titleText}**${foldMeta}`;\n },\n );\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst BLOCK_MATH_REGEX = /\\$\\$([\\s\\S]+?)\\$\\$/g;\nconst INLINE_MATH_REGEX = /(?<![\\\\$])\\$([^\\n$]+?)\\$(?!\\$)/g;\n\nexport class MathNormalizer implements Processor {\n readonly name = \"MathNormalizer\";\n readonly order = 50;\n\n process(input: ProcessorInput): ProcessorOutput {\n let content = input.content;\n\n content = content.replace(BLOCK_MATH_REGEX, (_match, equation: string) => {\n return `$$\\n${equation.trim()}\\n$$`;\n });\n\n content = content.replace(INLINE_MATH_REGEX, (_match, equation: string) => {\n return `$${equation.trim()}$`;\n });\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\nimport type { ImageReference } from \"../../types/convert.js\";\n\nconst OBSIDIAN_EMBED_REGEX = /!\\[\\[([^\\]]+)\\]\\]/g;\nconst MARKDOWN_IMAGE_REGEX = /!\\[([^\\]]*)\\]\\(([^)]+)\\)/g;\n\nconst VIDEO_HOSTS = [\"youtube.com\", \"youtu.be\", \"vimeo.com\"];\n\nexport class EmbedResolver implements Processor {\n readonly name = \"EmbedResolver\";\n readonly order = 60;\n\n process(input: ProcessorInput): ProcessorOutput {\n const images: ImageReference[] = input.metadata.images ? [...input.metadata.images] : [];\n const isPush = input.context.direction === \"push\";\n\n let content = input.content.replace(OBSIDIAN_EMBED_REGEX, (_match, target: string) => {\n if (isImageFile(target)) {\n images.push({ url: target, localPath: target, isExternal: false });\n if (isPush && !isExternalUrl(target)) {\n const fileName = target.split(\"/\").pop() ?? target;\n return `> 📎 ${fileName}\\n> %% im-nobsidian:local-image:${target} %%`;\n }\n return `![${target}](${encodeURI(target)})`;\n }\n const encoded = encodeURIComponent(target);\n return `[${target}](im-nobsidian://embed/${encoded})`;\n });\n\n content = content.replace(MARKDOWN_IMAGE_REGEX, (_match, alt: string, url: string) => {\n if (isVideoUrl(url)) {\n return `%% im-nobsidian:embed:type=video&url=${encodeURIComponent(url)} %%\\n[${alt || \"Video\"}](${url})`;\n }\n if (isExternalUrl(url)) {\n images.push({ url, isExternal: true });\n }\n return `![${alt}](${url})`;\n });\n\n return {\n content,\n metadata: { ...input.metadata, images },\n };\n }\n}\n\nfunction isImageFile(path: string): boolean {\n return /\\.(png|jpg|jpeg|gif|svg|webp|bmp|ico)$/i.test(path);\n}\n\nfunction isVideoUrl(url: string): boolean {\n return VIDEO_HOSTS.some((host) => url.includes(host));\n}\n\nfunction isExternalUrl(url: string): boolean {\n return url.startsWith(\"http://\") || url.startsWith(\"https://\");\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\nimport type { PreserveMarker } from \"../../types/convert.js\";\n\nconst MARKER_REGEX = /%% im-nobsidian:(\\w[\\w-]*):([^\\s]+?) %%/g;\n\nexport class PreserveMarkerCollector implements Processor {\n readonly name = \"PreserveMarkerCollector\";\n readonly order = 70;\n\n process(input: ProcessorInput): ProcessorOutput {\n const markers: PreserveMarker[] = input.metadata.preserveMarkers\n ? [...input.metadata.preserveMarkers]\n : [];\n\n const matches = [...input.content.matchAll(MARKER_REGEX)];\n for (const match of matches) {\n markers.push({\n type: match[1]!,\n params: parseMarkerParams(match[2]!),\n startIndex: match.index!,\n });\n }\n\n return {\n content: input.content,\n metadata: { ...input.metadata, preserveMarkers: markers },\n };\n }\n}\n\nfunction parseMarkerParams(paramString: string): Record<string, string> {\n const params: Record<string, string> = {};\n for (const pair of paramString.split(\"&\")) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx > 0) {\n params[pair.slice(0, eqIdx)] = decodeURIComponent(pair.slice(eqIdx + 1));\n }\n }\n return params;\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst UNSUPPORTED_CALLOUT_REGEX = /> \\[!im-nobsidian-unsupported\\][^\\n]*\\n(?:>[^\\n]*\\n)*/g;\n\nexport class UnsupportedBlockStripper implements Processor {\n readonly name = \"UnsupportedBlockStripper\";\n readonly order = 5;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"push\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const content = input.content.replace(UNSUPPORTED_CALLOUT_REGEX, \"\");\n\n return {\n content: content.replace(/\\n{3,}/g, \"\\n\\n\"),\n metadata: input.metadata,\n };\n }\n}\n","import matter from \"gray-matter\";\nimport type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nexport class PropertiesTableInjector implements Processor {\n readonly name = \"PropertiesTableInjector\";\n readonly order = 15;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"push\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n if (input.context.parentMode === \"database\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const properties = input.metadata.properties as Record<string, unknown> | undefined;\n if (!properties || Object.keys(properties).length === 0) {\n return { content: input.content, metadata: input.metadata };\n }\n\n const filteredProps: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(properties)) {\n filteredProps[key] = value;\n }\n\n if (Object.keys(filteredProps).length === 0) {\n return { content: input.content, metadata: input.metadata };\n }\n\n const yamlStr = matter.stringify(\"\", filteredProps).trim();\n const yamlBody = yamlStr.slice(4, -3).trim();\n const codeBlock = \"```yaml\\n# im-nobsidian:properties\\n\" + yamlBody + \"\\n```\";\n\n const content = codeBlock + \"\\n\\n---\\n\\n\" + input.content;\n\n return { content, metadata: input.metadata };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst UNDERLINE_REGEX = /<u>([\\s\\S]*?)<\\/u>/g;\n\nconst COLOR_SPAN_REGEX = /<span class=\"notion-(\\w+?)(?:-bg)?\">([\\s\\S]*?)<\\/span>/g;\n\nconst IM_NOBSIDIAN_COLOR_REGEX =\n /%% im-nobsidian:color:(\\w+(?:_background)?) %%([\\s\\S]*?)%% im-nobsidian:end %%/g;\n\nexport class HtmlAnnotationStripper implements Processor {\n readonly name = \"HtmlAnnotationStripper\";\n readonly order = 5;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"push\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n let content = input.content;\n\n content = content.replace(IM_NOBSIDIAN_COLOR_REGEX, (_m, _color: string, text: string) => text);\n\n content = content.replace(UNDERLINE_REGEX, (_m, text: string) => text);\n\n content = content.replace(COLOR_SPAN_REGEX, (_m, _color: string, text: string) => text);\n\n return { content, metadata: input.metadata };\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst NOTION_LINK_REGEX =\n /\\[([^\\]]+)\\]\\((?:https:\\/\\/(?:www\\.)?notion\\.so\\/|notion:\\/\\/)([a-f0-9-]+)\\)/g;\n\nconst WIKILINK_PRESERVE_REGEX = /\\[([^\\]]+)\\]\\(im-nobsidian:\\/\\/wikilink\\/([^)]+)\\)/g;\n\nconst EMBED_PRESERVE_REGEX = /\\[([^\\]]+)\\]\\(im-nobsidian:\\/\\/embed\\/([^)]+)\\)/g;\n\nexport class MentionToWikilink implements Processor {\n readonly name = \"MentionToWikilink\";\n readonly order = 10;\n\n process(input: ProcessorInput): ProcessorOutput {\n let content = input.content;\n\n content = content.replace(NOTION_LINK_REGEX, (_match, display: string) => `[[${display}]]`);\n\n content = content.replace(\n WIKILINK_PRESERVE_REGEX,\n (_match, display: string, encodedTarget: string) => {\n const target = decodeURIComponent(encodedTarget);\n return target === display ? `[[${target}]]` : `[[${target}|${display}]]`;\n },\n );\n\n content = content.replace(\n EMBED_PRESERVE_REGEX,\n (_match, _display: string, encodedTarget: string) => {\n const target = decodeURIComponent(encodedTarget);\n return `![[${target}]]`;\n },\n );\n\n return { content, metadata: input.metadata };\n }\n}\n","import type {\n Processor,\n ProcessorInput,\n ProcessorOutput,\n PreserveMarker,\n} from \"../../types/convert.js\";\n\nexport class PreserveMarkerInjector implements Processor {\n readonly name = \"PreserveMarkerInjector\";\n readonly order = 100;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"pull\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const markers = input.metadata.preserveMarkers;\n if (!markers || markers.length === 0) {\n return { content: input.content, metadata: input.metadata };\n }\n\n let content = input.content;\n\n const missingMarkers = markers.filter((m) => !content.includes(this.formatMarker(m)));\n\n if (missingMarkers.length === 0) {\n return { content, metadata: input.metadata };\n }\n\n const markerLines = missingMarkers.map((m) => this.formatMarker(m));\n const suffix = \"\\n\\n\" + markerLines.join(\"\\n\");\n content = content.trimEnd() + suffix + \"\\n\";\n\n return { content, metadata: input.metadata };\n }\n\n private formatMarker(marker: PreserveMarker): string {\n const params = Object.entries(marker.params)\n .map(([k, v]) => `${k}=${encodeURIComponent(v)}`)\n .join(\"&\");\n return `%% im-nobsidian:${marker.type}:${params} %%`;\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst EMOJI_TYPE_MAP: Record<string, string> = {\n \"\\u{1F4DD}\": \"note\",\n \"\\u{1F4CB}\": \"abstract\",\n \"\\u{2139}\\u{FE0F}\": \"info\",\n \"\\u{1F4A1}\": \"tip\",\n \"\\u{2705}\": \"success\",\n \"\\u{2753}\": \"question\",\n \"\\u{26A0}\\u{FE0F}\": \"warning\",\n \"\\u{274C}\": \"failure\",\n \"\\u{1F525}\": \"danger\",\n \"\\u{1F41B}\": \"bug\",\n \"\\u{1F4CC}\": \"example\",\n \"\\u{1F4AC}\": \"quote\",\n};\n\nconst CALLOUT_PRESERVE_REGEX = /%% im-nobsidian:callout:type=(\\w+)(?:&foldable=(open|closed))? %%/g;\n\nexport class CalloutRestorer implements Processor {\n readonly name = \"CalloutRestorer\";\n readonly order = 20;\n\n process(input: ProcessorInput): ProcessorOutput {\n let content = input.content;\n\n content = content.replace(CALLOUT_PRESERVE_REGEX, (_match, type: string, foldable?: string) => {\n if (foldable) {\n const foldChar = foldable === \"open\" ? \"+\" : \"-\";\n return `[!${type}]${foldChar}`;\n }\n return `[!${type}]`;\n });\n\n for (const [emoji, type] of Object.entries(EMOJI_TYPE_MAP)) {\n const pattern = new RegExp(`> ${escapeRegex(emoji)} \\\\*\\\\*(.+?)\\\\*\\\\*`, \"g\");\n content = content.replace(pattern, (_match, title: string) => {\n if (title.toLowerCase() === type) {\n return `> [!${type}]`;\n }\n return `> [!${type}] ${title}`;\n });\n }\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst COLOR_MARKER_REGEX =\n /%% im-nobsidian:color:(\\w+(?:_background)?) %%([\\s\\S]*?)%% im-nobsidian:end %%/g;\n\nexport class ColorAnnotator implements Processor {\n readonly name = \"ColorAnnotator\";\n readonly order = 30;\n\n process(input: ProcessorInput): ProcessorOutput {\n const content = input.content.replace(\n COLOR_MARKER_REGEX,\n (_match, color: string, text: string) => {\n const cssClass = color.endsWith(\"_background\")\n ? `notion-${color.replace(\"_background\", \"-bg\")}`\n : `notion-${color}`;\n return `<span class=\"${cssClass}\">${text}</span>`;\n },\n );\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n","import matter from \"gray-matter\";\nimport type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nexport class FrontmatterGenerator implements Processor {\n readonly name = \"FrontmatterGenerator\";\n readonly order = 90;\n\n process(input: ProcessorInput): ProcessorOutput {\n const properties = input.metadata.properties as Record<string, unknown> | undefined;\n\n if (!properties || Object.keys(properties).length === 0) {\n return { content: input.content, metadata: input.metadata };\n }\n\n const normalized = normalizeProperties(properties);\n const content = matter.stringify(input.content, normalized);\n\n return {\n content,\n metadata: input.metadata,\n };\n }\n}\n\nfunction normalizeProperties(props: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n const normalized = normalizeValue(value);\n if (normalized !== undefined) {\n result[key] = normalized;\n }\n }\n\n return result;\n}\n\nfunction normalizeValue(value: unknown): unknown {\n if (value instanceof Date) {\n return normalizeDate(value.toISOString());\n }\n\n if (typeof value === \"string\") {\n return normalizeDate(value);\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) return undefined;\n return value;\n }\n\n if (typeof value === \"object\" && value !== null && \"start\" in value) {\n const dateObj = value as { start: string; end?: string | null };\n const normalized = {\n start: normalizeDate(dateObj.start),\n ...(dateObj.end ? { end: normalizeDate(dateObj.end) } : {}),\n };\n return normalized;\n }\n\n return value;\n}\n\nconst MIDNIGHT_RE = /T00:00:00(?:\\.\\d{3})?(?:Z|[+-]\\d{2}:\\d{2})/;\n\nfunction normalizeDate(dateStr: string): string {\n if (typeof dateStr !== \"string\") return dateStr;\n if (MIDNIGHT_RE.test(dateStr)) {\n return dateStr.split(\"T\")[0] ?? dateStr;\n }\n return dateStr;\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst LOCAL_IMAGE_MARKER_REGEX =\n />\\s*📎\\s*[^\\n]*\\n>\\s*%%\\s*im-nobsidian:local-image:([^\\s]+)\\s*%%/g;\n\nexport class LocalImageRestorer implements Processor {\n readonly name = \"LocalImageRestorer\";\n readonly order = 15;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"pull\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const content = input.content.replace(LOCAL_IMAGE_MARKER_REGEX, (_match, target: string) => {\n return `![[${target}]]`;\n });\n\n return { content, metadata: input.metadata };\n }\n}\n","import matter from \"gray-matter\";\nimport type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst YAML_PROPERTIES_REGEX = /```yaml\\n# im-nobsidian:properties\\n([\\s\\S]*?)```\\n*(?:---\\n*)?/;\n\nconst LEGACY_TABLE_REGEX =\n /^\\s*\\| Property\\s*\\| Value\\s*\\|\\n\\s*\\|\\s*-{3,}\\s*\\|\\s*-{3,}\\s*\\|\\n((?:\\|[^\\n]+\\|\\n?)+)\\n*---\\n*/;\n\nexport class PropertiesTableRestorer implements Processor {\n readonly name = \"PropertiesTableRestorer\";\n readonly order = 5;\n\n process(input: ProcessorInput): ProcessorOutput {\n if (input.context.direction !== \"pull\") {\n return { content: input.content, metadata: input.metadata };\n }\n\n const yamlMatch = input.content.match(YAML_PROPERTIES_REGEX);\n if (yamlMatch) {\n return this.restoreFromYaml(input, yamlMatch);\n }\n\n const tableMatch = input.content.match(LEGACY_TABLE_REGEX);\n if (tableMatch) {\n return this.restoreFromTable(input, tableMatch);\n }\n\n return { content: input.content, metadata: input.metadata };\n }\n\n private restoreFromYaml(input: ProcessorInput, match: RegExpMatchArray): ProcessorOutput {\n const yamlContent = match[1]!;\n const fakeDocument = `---\\n${yamlContent}---\\n`;\n\n let parsed: Record<string, unknown>;\n try {\n const result = matter(fakeDocument);\n parsed = result.data;\n } catch {\n return { content: input.content, metadata: input.metadata };\n }\n\n const properties: Record<string, unknown> = {\n ...(input.metadata.properties as Record<string, unknown> | undefined),\n ...parsed,\n };\n\n const content = input.content.replace(YAML_PROPERTIES_REGEX, \"\").trimStart();\n\n return {\n content,\n metadata: { ...input.metadata, properties },\n };\n }\n\n private restoreFromTable(input: ProcessorInput, match: RegExpMatchArray): ProcessorOutput {\n const rows = match[1]!.trim().split(\"\\n\");\n const properties: Record<string, unknown> = {\n ...(input.metadata.properties as Record<string, unknown> | undefined),\n };\n\n for (const row of rows) {\n const cells = row\n .split(\"|\")\n .map((c) => c.trim())\n .filter(Boolean);\n if (cells.length >= 2) {\n const key = cells[0]!;\n const rawValue = cells[1]!;\n properties[key] = parseLegacyValue(rawValue);\n }\n }\n\n const content = input.content.replace(LEGACY_TABLE_REGEX, \"\").trimStart();\n\n return {\n content,\n metadata: { ...input.metadata, properties },\n };\n }\n}\n\nfunction parseLegacyValue(raw: string): unknown {\n if (raw === \"\" || raw === \"null\") return null;\n if (raw === \"true\") return true;\n if (raw === \"false\") return false;\n\n const unquoted = stripQuotes(raw);\n const num = Number(unquoted);\n if (!isNaN(num) && unquoted.trim() !== \"\") return num;\n\n if (unquoted.includes(\", \")) {\n const parts = unquoted.split(\", \");\n const looksLikeArray = parts.every((p) => p.split(/\\s+/).length <= 3);\n if (looksLikeArray) {\n return parts.map((v) => {\n const n = Number(v);\n return !isNaN(n) && v.trim() !== \"\" ? n : v;\n });\n }\n }\n\n if (unquoted.startsWith(\"{\") || unquoted.startsWith(\"[\")) {\n try {\n return JSON.parse(unquoted);\n } catch {\n return unquoted;\n }\n }\n\n return unquoted;\n}\n\nfunction stripQuotes(s: string): string {\n if ((s.startsWith('\"') && s.endsWith('\"')) || (s.startsWith(\"'\") && s.endsWith(\"'\"))) {\n return s.slice(1, -1);\n }\n return s;\n}\n","import { ConversionPipeline } from \"./pipeline.js\";\nimport { FrontmatterExtractor } from \"./pre-processors/frontmatter.js\";\nimport { WikilinkResolver, type WikilinkResolverFn } from \"./pre-processors/wikilink.js\";\nimport { CalloutTransformer } from \"./pre-processors/callout.js\";\nimport { MathNormalizer } from \"./pre-processors/math.js\";\nimport { EmbedResolver } from \"./pre-processors/embed.js\";\nimport { PreserveMarkerCollector } from \"./pre-processors/preserve-marker.js\";\nimport { UnsupportedBlockStripper } from \"./pre-processors/unsupported-block-stripper.js\";\nimport { PropertiesTableInjector } from \"./pre-processors/properties-table.js\";\nimport { HtmlAnnotationStripper } from \"./pre-processors/html-annotation.js\";\nimport { MentionToWikilink } from \"./post-processors/mention-to-wikilink.js\";\nimport { PreserveMarkerInjector } from \"./post-processors/preserve-marker-injector.js\";\nimport { CalloutRestorer } from \"./post-processors/callout-restorer.js\";\nimport { ColorAnnotator } from \"./post-processors/color-annotator.js\";\nimport { FrontmatterGenerator } from \"./post-processors/frontmatter-generator.js\";\nimport { LocalImageRestorer } from \"./post-processors/local-image-restorer.js\";\nimport { PropertiesTableRestorer } from \"./post-processors/properties-table-restorer.js\";\n\nexport interface PipelineOptions {\n readonly wikilinkResolver?: WikilinkResolverFn;\n}\n\nexport function createDefaultPipeline(options?: PipelineOptions): ConversionPipeline {\n const pipeline = new ConversionPipeline();\n\n pipeline.registerPreProcessor(new HtmlAnnotationStripper());\n pipeline.registerPreProcessor(new UnsupportedBlockStripper());\n pipeline.registerPreProcessor(new FrontmatterExtractor());\n pipeline.registerPreProcessor(new PropertiesTableInjector());\n pipeline.registerPreProcessor(new WikilinkResolver(options?.wikilinkResolver));\n pipeline.registerPreProcessor(new CalloutTransformer());\n pipeline.registerPreProcessor(new MathNormalizer());\n pipeline.registerPreProcessor(new EmbedResolver());\n pipeline.registerPreProcessor(new PreserveMarkerCollector());\n\n pipeline.registerPostProcessor(new PropertiesTableRestorer());\n pipeline.registerPostProcessor(new LocalImageRestorer());\n pipeline.registerPostProcessor(new PreserveMarkerInjector());\n pipeline.registerPostProcessor(new MentionToWikilink());\n pipeline.registerPostProcessor(new CalloutRestorer());\n pipeline.registerPostProcessor(new ColorAnnotator());\n pipeline.registerPostProcessor(new FrontmatterGenerator());\n\n return pipeline;\n}\n","import { markdownToBlocks } from \"@tryfabric/martian\";\nimport { NotionToMarkdown } from \"notion-to-md\";\nimport type { Client } from \"@notionhq/client\";\nimport type { BlockObjectResponse } from \"@notionhq/client/build/src/api-endpoints.js\";\nimport { NotionBlockBuilder } from \"../notion/block-builder.js\";\nimport type { NotionBlock } from \"../notion/block-builder.js\";\n\nconst TRULY_UNSUPPORTED_BLOCK_TYPES = [\"unsupported\", \"template\"] as const;\n\nconst DIVIDER_PLACEHOLDER = \"​%%IM-NOBSIDIAN_DIVIDER%%​\";\nconst TOGGLE_START = \"%%im-nobsidian:toggle:start%%\";\nconst TOGGLE_END = \"%%im-nobsidian:toggle:end%%\";\nconst COLUMN_LIST_START = \"%%im-nobsidian:column-list:start%%\";\nconst COLUMN_SEP = \"%%im-nobsidian:column%%\";\nconst COLUMN_LIST_END = \"%%im-nobsidian:column-list:end%%\";\n\nconst VIDEO_URL_PATTERNS = [\n /^https?:\\/\\/(www\\.)?youtube\\.com\\/watch/,\n /^https?:\\/\\/youtu\\.be\\//,\n /^https?:\\/\\/(www\\.)?vimeo\\.com\\//,\n /^https?:\\/\\/(www\\.)?dailymotion\\.com\\//,\n /^https?:\\/\\/(www\\.)?loom\\.com\\/share\\//,\n];\n\nconst EMBED_URL_PATTERNS = [\n /^https?:\\/\\/(www\\.)?figma\\.com\\//,\n /^https?:\\/\\/docs\\.google\\.com\\//,\n /^https?:\\/\\/drive\\.google\\.com\\//,\n /^https?:\\/\\/(www\\.)?miro\\.com\\//,\n /^https?:\\/\\/(www\\.)?twitter\\.com\\//,\n /^https?:\\/\\/(www\\.)?x\\.com\\//,\n /^https?:\\/\\/codepen\\.io\\//,\n /^https?:\\/\\/gist\\.github\\.com\\//,\n /^https?:\\/\\/(www\\.)?spotify\\.com\\//,\n /^https?:\\/\\/(www\\.)?soundcloud\\.com\\//,\n];\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\ntype RichTextItem = { plain_text: string; href?: string | null };\n\nfunction richTextToPlain(richText: RichTextItem[] | undefined): string {\n if (!richText) return \"\";\n return richText.map((t) => t.plain_text).join(\"\");\n}\n\ninterface RichTextAnnotated extends RichTextItem {\n annotations?: Record<string, unknown>;\n type?: string;\n equation?: { expression: string };\n mention?: {\n type: string;\n page?: { id: string };\n date?: { start: string; end?: string | null };\n user?: { id: string; name?: string };\n database?: { id: string };\n };\n}\n\nfunction richTextToMarkdown(richText: RichTextAnnotated[] | undefined): string {\n if (!richText) return \"\";\n return richText\n .map((t) => {\n if (t.type === \"equation\" && t.equation) {\n return `$${t.equation.expression}$`;\n }\n\n if (t.type === \"mention\" && t.mention) {\n return formatMention(t.mention);\n }\n\n let text = t.plain_text;\n const a = t.annotations;\n if (a?.code) text = `\\`${text}\\``;\n if (a?.bold) text = `**${text}**`;\n if (a?.italic) text = `*${text}*`;\n if (a?.strikethrough) text = `~~${text}~~`;\n if (a?.underline) text = `<u>${text}</u>`;\n if (t.href) text = `[${text}](${t.href})`;\n\n const color = a?.color as string | undefined;\n if (color && color !== \"default\") {\n text = `%% im-nobsidian:color:${color} %%${text}%% im-nobsidian:end %%`;\n }\n\n return text;\n })\n .join(\"\");\n}\n\nfunction formatMention(mention: NonNullable<RichTextAnnotated[\"mention\"]>): string {\n switch (mention.type) {\n case \"page\":\n return mention.page ? `[[${mention.page.id}]]` : \"\";\n case \"date\": {\n if (!mention.date) return \"\";\n const start = mention.date.start;\n return mention.date.end ? `${start} → ${mention.date.end}` : start;\n }\n case \"user\":\n return mention.user?.name ? `@${mention.user.name}` : \"@user\";\n case \"database\":\n return mention.database ? `[[${mention.database.id}]]` : \"\";\n default:\n return \"\";\n }\n}\n\nexport class BlockConverter {\n private n2m: NotionToMarkdown | null = null;\n private client: Client | null = null;\n\n initNotionToMd(client: Client): void {\n this.client = client;\n this.n2m = new NotionToMarkdown({ notionClient: client });\n this.registerCustomTransformers();\n }\n\n private registerCustomTransformers(): void {\n if (!this.n2m) return;\n\n for (const blockType of TRULY_UNSUPPORTED_BLOCK_TYPES) {\n this.n2m.setCustomTransformer(blockType, (block) => {\n const id = block.id ?? \"unknown\";\n return Promise.resolve(\n `> [!im-nobsidian-unsupported] Notion 전용 블록\\n> type: ${blockType}, id: ${id}\\n> %%im-nobsidian:unsupported:type=${blockType}&id=${id}%%`,\n );\n });\n }\n\n this.registerToggleTransformer();\n this.registerColumnTransformer();\n this.registerSyncedBlockTransformer();\n this.registerBookmarkTransformer();\n this.registerVideoTransformer();\n this.registerAudioTransformer();\n this.registerFileTransformer();\n this.registerChildPageTransformer();\n this.registerChildDatabaseTransformer();\n this.registerLinkToPageTransformer();\n this.registerTocTransformer();\n this.registerBreadcrumbTransformer();\n this.registerLinkPreviewTransformer();\n this.registerPdfTransformer();\n this.registerEmbedTransformer();\n this.registerCalloutTransformer();\n this.registerToggleHeadingTransformers();\n }\n\n private registerToggleTransformer(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n this.n2m.setCustomTransformer(\"toggle\", async (block) => {\n const b = block as unknown as { toggle: { rich_text: RichTextItem[] } } & BlockObjectResponse;\n const title = richTextToMarkdown(b.toggle?.rich_text as never);\n const children = b.has_children ? await n2m.pageToMarkdown(b.id) : [];\n const childMd = (Array.isArray(children) ? n2m.toMarkdownString(children).parent : \"\") ?? \"\";\n const indented = childMd\n .split(\"\\n\")\n .map((line: string) => (line.trim() ? ` ${line}` : \" \"))\n .join(\"\\n\")\n .trimEnd();\n return `${TOGGLE_START}\\n- ${title}\\n${indented}\\n${TOGGLE_END}`;\n });\n }\n\n private registerToggleHeadingTransformers(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n\n for (const level of [1, 2, 3] as const) {\n const headingKey = `heading_${level}` as const;\n this.n2m.setCustomTransformer(headingKey, async (block) => {\n const b = block as unknown as {\n [K in typeof headingKey]: { rich_text: RichTextItem[]; is_toggleable?: boolean };\n } & BlockObjectResponse;\n const headingData = b[headingKey];\n const text = richTextToMarkdown(headingData?.rich_text as never);\n const prefix = \"#\".repeat(level);\n\n if (headingData?.is_toggleable && b.has_children) {\n const children = await n2m.pageToMarkdown(b.id);\n const childMd =\n (Array.isArray(children) ? n2m.toMarkdownString(children).parent : \"\") ?? \"\";\n return `${prefix} ${text}\\n\\n${childMd.trimEnd()}`;\n }\n\n return `${prefix} ${text}`;\n });\n }\n }\n\n private registerColumnTransformer(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n const client = this.client!;\n\n this.n2m.setCustomTransformer(\"column_list\", async (block) => {\n const b = block as BlockObjectResponse;\n const response = await client.blocks.children.list({ block_id: b.id });\n const columns = response.results as BlockObjectResponse[];\n const parts: string[] = [];\n\n for (let i = 0; i < columns.length; i++) {\n const col = columns[i]!;\n const children = await n2m.pageToMarkdown(col.id);\n const childMd =\n (Array.isArray(children) ? n2m.toMarkdownString(children).parent : \"\") ?? \"\";\n parts.push(`${COLUMN_SEP}\\n${childMd.trimEnd()}`);\n }\n\n return `${COLUMN_LIST_START}\\n${parts.join(\"\\n\")}\\n${COLUMN_LIST_END}`;\n });\n\n this.n2m.setCustomTransformer(\"column\", async () => \"\");\n }\n\n private registerSyncedBlockTransformer(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n const client = this.client!;\n\n this.n2m.setCustomTransformer(\"synced_block\", async (block) => {\n const b = block as unknown as {\n synced_block: { synced_from: { block_id: string } | null };\n } & BlockObjectResponse;\n\n const sourceId = b.synced_block?.synced_from?.block_id ?? b.id;\n\n const response = await client.blocks.children.list({ block_id: sourceId });\n const mdBlocks: unknown[] = [];\n for (const child of response.results as BlockObjectResponse[]) {\n const result = await n2m.blockToMarkdown(child as never);\n if (result) mdBlocks.push(result);\n }\n const childMd = n2m.toMarkdownString(mdBlocks as never).parent ?? \"\";\n return childMd.trimEnd();\n });\n }\n\n private registerBookmarkTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"bookmark\", async (block) => {\n const b = block as unknown as {\n bookmark: { url: string; caption?: RichTextItem[] };\n };\n const url = b.bookmark?.url ?? \"\";\n const caption = richTextToPlain(b.bookmark?.caption);\n if (caption) {\n return `[${caption}](${url})`;\n }\n return `[${url}](${url})`;\n });\n }\n\n private registerVideoTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"video\", async (block) => {\n const b = block as unknown as {\n video: {\n type: string;\n external?: { url: string };\n file?: { url: string };\n caption?: RichTextItem[];\n };\n };\n const url = b.video?.type === \"external\" ? b.video.external?.url : b.video?.file?.url;\n const caption = richTextToPlain(b.video?.caption);\n return `![${caption || \"video\"}](${url ?? \"\"})`;\n });\n }\n\n private registerAudioTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"audio\", async (block) => {\n const b = block as unknown as {\n audio: {\n type: string;\n external?: { url: string };\n file?: { url: string };\n caption?: RichTextItem[];\n };\n };\n const url = b.audio?.type === \"external\" ? b.audio.external?.url : b.audio?.file?.url;\n const caption = richTextToPlain(b.audio?.caption);\n return `![${caption || \"audio\"}](${url ?? \"\"})`;\n });\n }\n\n private registerFileTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"file\", async (block) => {\n const b = block as unknown as {\n file: {\n type: string;\n external?: { url: string };\n file?: { url: string };\n caption?: RichTextItem[];\n name?: string;\n };\n };\n const url = b.file?.type === \"external\" ? b.file.external?.url : b.file?.file?.url;\n const name = b.file?.name ?? richTextToPlain(b.file?.caption) ?? \"file\";\n return `[${name}](${url ?? \"\"})`;\n });\n }\n\n private registerChildPageTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"child_page\", async (block) => {\n const b = block as unknown as { child_page: { title: string } };\n const title = b.child_page?.title ?? \"Untitled\";\n return `[[${title}]]`;\n });\n }\n\n private registerChildDatabaseTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"child_database\", async (block) => {\n const b = block as unknown as {\n child_database: { title: string };\n } & BlockObjectResponse;\n const title = b.child_database?.title ?? \"Database\";\n return `> [!database] ${title}\\n> %%im-nobsidian:child-database:id=${b.id}&title=${encodeURIComponent(title)}%%`;\n });\n }\n\n private registerLinkToPageTransformer(): void {\n if (!this.n2m) return;\n const client = this.client!;\n this.n2m.setCustomTransformer(\"link_to_page\", async (block) => {\n const b = block as unknown as {\n link_to_page: { type: string; page_id?: string; database_id?: string };\n };\n const pageId = b.link_to_page?.page_id ?? b.link_to_page?.database_id;\n if (!pageId) return \"\";\n try {\n const page = await client.pages.retrieve({ page_id: pageId });\n const p = page as {\n properties: Record<string, { type: string; title?: Array<{ plain_text: string }> }>;\n };\n for (const prop of Object.values(p.properties)) {\n if (prop.type === \"title\" && prop.title?.[0]?.plain_text) {\n return `[[${prop.title[0].plain_text}]]`;\n }\n }\n } catch {\n // fallback\n }\n return `[[${pageId}]]`;\n });\n }\n\n private registerTocTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"table_of_contents\", async () => {\n return `%%im-nobsidian:toc%%`;\n });\n }\n\n private registerBreadcrumbTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"breadcrumb\", async () => \"\");\n }\n\n private registerLinkPreviewTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"link_preview\", async (block) => {\n const b = block as unknown as { link_preview: { url: string } };\n const url = b.link_preview?.url ?? \"\";\n return `[${url}](${url})`;\n });\n }\n\n private registerPdfTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"pdf\", async (block) => {\n const b = block as unknown as {\n pdf: {\n type: string;\n file?: { url: string };\n external?: { url: string };\n caption?: RichTextItem[];\n };\n };\n const url = b.pdf?.type === \"file\" ? (b.pdf.file?.url ?? \"\") : (b.pdf?.external?.url ?? \"\");\n const caption = b.pdf?.caption ? richTextToMarkdown(b.pdf.caption as never) : \"\";\n return `[📄 ${caption || \"PDF\"}](${url})`;\n });\n }\n\n private registerEmbedTransformer(): void {\n if (!this.n2m) return;\n this.n2m.setCustomTransformer(\"embed\", async (block) => {\n const b = block as unknown as {\n embed: { url: string; caption?: RichTextItem[] };\n };\n const url = b.embed?.url ?? \"\";\n const caption = b.embed?.caption ? richTextToMarkdown(b.embed.caption as never) : \"\";\n return `[${caption || url}](${url})`;\n });\n }\n\n private registerCalloutTransformer(): void {\n if (!this.n2m) return;\n const n2m = this.n2m;\n this.n2m.setCustomTransformer(\"callout\", async (block) => {\n const b = block as unknown as {\n callout: { rich_text: RichTextItem[]; icon?: { type: string; emoji?: string } };\n } & BlockObjectResponse;\n const text = richTextToMarkdown(b.callout?.rich_text as never);\n const emoji = b.callout?.icon?.emoji ?? \"\";\n\n const children = b.has_children ? await n2m.pageToMarkdown(b.id) : [];\n const childMd = (Array.isArray(children) ? n2m.toMarkdownString(children).parent : \"\") ?? \"\";\n\n const EMOJI_TO_TYPE: Record<string, string> = {\n \"\\u{1F4DD}\": \"note\",\n \"\\u{1F4CB}\": \"abstract\",\n \"\\u{2139}\\u{FE0F}\": \"info\",\n \"\\u{1F4A1}\": \"tip\",\n \"\\u{2705}\": \"success\",\n \"\\u{2753}\": \"question\",\n \"\\u{26A0}\\u{FE0F}\": \"warning\",\n \"\\u{274C}\": \"failure\",\n \"\\u{1F525}\": \"danger\",\n \"\\u{1F41B}\": \"bug\",\n \"\\u{1F4CC}\": \"example\",\n \"\\u{1F4AC}\": \"quote\",\n };\n const calloutType = EMOJI_TO_TYPE[emoji] ?? \"note\";\n\n let result = `> [!${calloutType}] ${text}`;\n if (childMd?.trim()) {\n const lines = childMd\n .trim()\n .split(\"\\n\")\n .map((l: string) => (l.trim() ? `> ${l}` : \">\"));\n result += \"\\n\" + lines.join(\"\\n\");\n }\n return result;\n });\n }\n\n markdownToNotionBlocks(markdown: string): unknown[] {\n const preprocessed = this.preProcessMarkdown(markdown);\n const blocks = markdownToBlocks(preprocessed) as Array<Record<string, unknown>>;\n const processed = this.postProcessBlocks(blocks);\n return normalizeBlocksForNotion(processed as Array<Record<string, unknown>>);\n }\n\n private toggleContents: Map<number, string> = new Map();\n private columnContents: Map<number, string[]> = new Map();\n private toggleCounter = 0;\n private columnCounter = 0;\n\n private preProcessMarkdown(markdown: string): string {\n this.toggleContents.clear();\n this.columnContents.clear();\n this.toggleCounter = 0;\n this.columnCounter = 0;\n\n let processed = this.extractToggleBlocks(markdown);\n processed = this.extractColumnBlocks(processed);\n processed = this.replaceDividers(processed);\n return processed;\n }\n\n private replaceDividers(markdown: string): string {\n const lines = markdown.split(\"\\n\");\n const result: string[] = [];\n let inCodeBlock = false;\n\n for (const line of lines) {\n if (line.trimStart().startsWith(\"```\")) {\n inCodeBlock = !inCodeBlock;\n }\n\n if (!inCodeBlock && /^---\\s*$/.test(line.trim())) {\n result.push(DIVIDER_PLACEHOLDER);\n } else {\n result.push(line);\n }\n }\n\n return result.join(\"\\n\");\n }\n\n private extractToggleBlocks(markdown: string): string {\n const startRe = new RegExp(`^${escapeRegex(TOGGLE_START)}$`, \"gm\");\n const endRe = new RegExp(`^${escapeRegex(TOGGLE_END)}$`, \"gm\");\n let result = markdown;\n let match: RegExpExecArray | null;\n\n while ((match = startRe.exec(result)) !== null) {\n endRe.lastIndex = match.index;\n const endMatch = endRe.exec(result);\n if (!endMatch) break;\n\n const content = result.slice(match.index + match[0].length + 1, endMatch.index).trimEnd();\n const id = this.toggleCounter++;\n this.toggleContents.set(id, content);\n\n const placeholder = `%%IM-NOBSIDIAN_TOGGLE_${id}%%`;\n result =\n result.slice(0, match.index) +\n placeholder +\n result.slice(endMatch.index + endMatch[0].length);\n\n startRe.lastIndex = match.index + placeholder.length;\n }\n\n return result;\n }\n\n private extractColumnBlocks(markdown: string): string {\n const startRe = new RegExp(`^${escapeRegex(COLUMN_LIST_START)}$`, \"gm\");\n const endRe = new RegExp(`^${escapeRegex(COLUMN_LIST_END)}$`, \"gm\");\n let result = markdown;\n let match: RegExpExecArray | null;\n\n while ((match = startRe.exec(result)) !== null) {\n endRe.lastIndex = match.index;\n const endMatch = endRe.exec(result);\n if (!endMatch) break;\n\n const inner = result.slice(match.index + match[0].length + 1, endMatch.index);\n const columns = inner\n .split(new RegExp(`^${escapeRegex(COLUMN_SEP)}$`, \"m\"))\n .map((c) => c.trim())\n .filter(Boolean);\n\n const id = this.columnCounter++;\n this.columnContents.set(id, columns);\n\n const placeholder = `%%IM-NOBSIDIAN_COLLIST_${id}%%`;\n result =\n result.slice(0, match.index) +\n placeholder +\n result.slice(endMatch.index + endMatch[0].length);\n\n startRe.lastIndex = match.index + placeholder.length;\n }\n\n return result;\n }\n\n private postProcessBlocks(blocks: Array<Record<string, unknown>>): unknown[] {\n const result: unknown[] = [];\n\n for (const block of blocks) {\n const toggleConverted = this.convertTogglePlaceholder(block);\n if (toggleConverted) {\n result.push(toggleConverted);\n continue;\n }\n\n const columnConverted = this.convertColumnPlaceholder(block);\n if (columnConverted) {\n result.push(columnConverted);\n continue;\n }\n\n const dividerConverted = this.convertDividerPlaceholder(block);\n if (dividerConverted) {\n result.push(dividerConverted);\n continue;\n }\n\n const videoConverted = this.convertImageToVideoOrEmbed(block);\n if (videoConverted) {\n result.push(videoConverted);\n continue;\n }\n\n const calloutConverted = this.convertQuoteToCallout(block);\n result.push(calloutConverted);\n }\n\n return result;\n }\n\n private convertTogglePlaceholder(block: Record<string, unknown>): unknown | null {\n if (block.type !== \"paragraph\") return null;\n\n const para = block.paragraph as\n | { rich_text?: Array<{ text?: { content: string } }> }\n | undefined;\n const text = para?.rich_text?.[0]?.text?.content ?? \"\";\n\n const toggleMatch = text.match(/%%IM-NOBSIDIAN_TOGGLE_(\\d+)%%/);\n if (!toggleMatch) return null;\n\n const id = parseInt(toggleMatch[1]!, 10);\n const content = this.toggleContents.get(id);\n if (content === undefined) return null;\n\n const titleMatch = content.match(/^- (.+)$/m);\n const title = titleMatch?.[1] ?? \"Toggle\";\n\n const childLines = content.split(\"\\n\").slice(1);\n const childMd = childLines\n .map((l) => (l.startsWith(\" \") ? l.slice(2) : l))\n .join(\"\\n\")\n .trim();\n\n const children = childMd ? (markdownToBlocks(childMd) as Array<Record<string, unknown>>) : [];\n\n return NotionBlockBuilder.toggle(\n NotionBlockBuilder.richText(title),\n children.length > 0 ? (children as unknown as NotionBlock[]) : undefined,\n );\n }\n\n private convertColumnPlaceholder(block: Record<string, unknown>): unknown | null {\n if (block.type !== \"paragraph\") return null;\n\n const para = block.paragraph as\n | { rich_text?: Array<{ text?: { content: string } }> }\n | undefined;\n const text = para?.rich_text?.[0]?.text?.content ?? \"\";\n\n const colMatch = text.match(/%%IM-NOBSIDIAN_COLLIST_(\\d+)%%/);\n if (!colMatch) return null;\n\n const id = parseInt(colMatch[1]!, 10);\n const columns = this.columnContents.get(id);\n if (!columns) return null;\n\n const columnBlocks = columns.map((colMd) => {\n const blocks = markdownToBlocks(colMd) as Array<Record<string, unknown>>;\n return this.postProcessBlocks(blocks) as unknown as NotionBlock[];\n });\n\n return NotionBlockBuilder.columnList(columnBlocks);\n }\n\n private convertDividerPlaceholder(block: Record<string, unknown>): unknown | null {\n if (block.type !== \"paragraph\") return null;\n\n const para = block.paragraph as\n | { rich_text?: Array<{ text?: { content: string } }> }\n | undefined;\n const text = para?.rich_text?.[0]?.text?.content ?? \"\";\n\n if (text.includes(\"%%IM-NOBSIDIAN_DIVIDER%%\")) {\n return NotionBlockBuilder.divider();\n }\n return null;\n }\n\n private convertImageToVideoOrEmbed(block: Record<string, unknown>): unknown | null {\n let url = \"\";\n let caption: string | undefined;\n\n if (block.type === \"image\") {\n const img = block.image as\n | { external?: { url: string }; caption?: Array<{ text?: { content: string } }> }\n | undefined;\n url = img?.external?.url ?? \"\";\n caption = img?.caption?.[0]?.text?.content;\n } else if (block.type === \"paragraph\") {\n const para = block.paragraph as\n | { rich_text?: Array<{ text?: { content: string } }> }\n | undefined;\n const texts = para?.rich_text ?? [];\n if (texts.length === 1) {\n const content = texts[0]?.text?.content ?? \"\";\n if (/^https?:\\/\\//.test(content)) {\n url = content;\n }\n }\n }\n\n if (!url) return null;\n\n if (VIDEO_URL_PATTERNS.some((p) => p.test(url))) {\n return NotionBlockBuilder.video(url, caption);\n }\n\n if (EMBED_URL_PATTERNS.some((p) => p.test(url))) {\n return NotionBlockBuilder.embed(url, caption);\n }\n\n return null;\n }\n\n private convertQuoteToCallout(block: Record<string, unknown>): unknown {\n if (block.type !== \"quote\") return block;\n\n const quote = block.quote as\n | {\n rich_text: Array<{\n type: string;\n text?: { content: string; link?: unknown };\n annotations?: Record<string, boolean>;\n }>;\n children?: Array<Record<string, unknown>>;\n }\n | undefined;\n if (!quote?.rich_text?.[0]) return block;\n\n const firstText = quote.rich_text[0]?.text?.content ?? \"\";\n\n const KNOWN_CALLOUT_EMOJIS = [\n \"\\u{1F4DD}\",\n \"\\u{1F4CB}\",\n \"\\u{2139}\\u{FE0F}\",\n \"\\u{1F4A1}\",\n \"\\u{2705}\",\n \"\\u{2753}\",\n \"\\u{26A0}\\u{FE0F}\",\n \"\\u{274C}\",\n \"\\u{1F525}\",\n \"\\u{1F41B}\",\n \"\\u{1F4CC}\",\n \"\\u{1F4AC}\",\n ];\n const matchedEmoji = KNOWN_CALLOUT_EMOJIS.find((e) => firstText.startsWith(e));\n if (!matchedEmoji) return block;\n\n const emoji = matchedEmoji;\n const remainingText = firstText.slice(emoji.length).replace(/^\\s+/, \"\");\n\n const newRichText = [...quote.rich_text];\n if (remainingText) {\n newRichText[0] = {\n ...newRichText[0]!,\n text: { content: remainingText, link: null },\n };\n } else {\n newRichText.shift();\n }\n\n return {\n type: \"callout\",\n callout: {\n rich_text: newRichText,\n icon: { type: \"emoji\", emoji },\n children: quote.children ?? [],\n },\n };\n }\n\n async notionBlocksToMarkdown(pageId: string): Promise<string> {\n if (!this.n2m) {\n throw new Error(\n \"NotionToMarkdown이 초기화되지 않았습니다. initNotionToMd()를 먼저 호출하세요.\",\n );\n }\n\n const mdBlocks = await this.n2m.pageToMarkdown(pageId);\n const result = this.n2m.toMarkdownString(mdBlocks);\n return result.parent ?? \"\";\n }\n}\n\nconst NOTION_MAX_TABLE_ROWS = 100;\nconst NOTION_MAX_LIST_DEPTH = 3;\n\nfunction normalizeBlocksForNotion(\n blocks: Array<Record<string, unknown>>,\n): Array<Record<string, unknown>> {\n const result: Array<Record<string, unknown>> = [];\n\n for (const block of blocks) {\n if (block.type === \"table\") {\n result.push(...normalizeTable(block));\n } else if (isListBlock(block)) {\n result.push(flattenListDepth(block, 0));\n } else {\n result.push(block);\n }\n }\n\n return result;\n}\n\nfunction normalizeTable(block: Record<string, unknown>): Array<Record<string, unknown>> {\n const table = block.table as\n | {\n table_width: number;\n has_column_header: boolean;\n has_row_header: boolean;\n children: Array<Record<string, unknown>>;\n }\n | undefined;\n if (!table?.children) return [block];\n\n const rows = table.children;\n if (rows.length === 0) return [block];\n\n let maxCells = table.table_width;\n for (const row of rows) {\n const tr = row.table_row as { cells: unknown[][] } | undefined;\n if (tr?.cells && tr.cells.length > maxCells) {\n maxCells = tr.cells.length;\n }\n }\n\n const normalizedRows = rows.map((row) => {\n const tr = row.table_row as { cells: unknown[][] } | undefined;\n if (!tr?.cells) return row;\n\n const cells = [...tr.cells];\n while (cells.length < maxCells) {\n cells.push([{ type: \"text\", text: { content: \"\" } }]);\n }\n if (cells.length > maxCells) {\n cells.length = maxCells;\n }\n\n return { ...row, table_row: { ...tr, cells } };\n });\n\n if (normalizedRows.length <= NOTION_MAX_TABLE_ROWS) {\n return [\n {\n ...block,\n table: { ...table, table_width: maxCells, children: normalizedRows },\n },\n ];\n }\n\n const tables: Array<Record<string, unknown>> = [];\n const headerRow = table.has_column_header ? normalizedRows[0] : null;\n const dataRows = table.has_column_header ? normalizedRows.slice(1) : normalizedRows;\n const chunkSize = headerRow ? NOTION_MAX_TABLE_ROWS - 1 : NOTION_MAX_TABLE_ROWS;\n\n for (let i = 0; i < dataRows.length; i += chunkSize) {\n const chunk = dataRows.slice(i, i + chunkSize);\n const children = headerRow ? [headerRow, ...chunk] : chunk;\n tables.push({\n type: \"table\",\n table: {\n table_width: maxCells,\n has_column_header: !!headerRow,\n has_row_header: table.has_row_header,\n children,\n },\n });\n }\n\n return tables;\n}\n\nfunction isListBlock(block: Record<string, unknown>): boolean {\n return (\n block.type === \"bulleted_list_item\" ||\n block.type === \"numbered_list_item\" ||\n block.type === \"to_do\"\n );\n}\n\nfunction flattenListDepth(block: Record<string, unknown>, depth: number): Record<string, unknown> {\n const blockType = block.type as string;\n const blockData = block[blockType] as\n | { children?: Array<Record<string, unknown>>; [key: string]: unknown }\n | undefined;\n if (!blockData?.children || blockData.children.length === 0) return block;\n\n if (depth >= NOTION_MAX_LIST_DEPTH - 1) {\n const flattened = collectAllDescendants(blockData.children);\n return {\n ...block,\n [blockType]: { ...blockData, children: flattened },\n };\n }\n\n const normalizedChildren = blockData.children.map((child) => {\n if (isListBlock(child)) {\n return flattenListDepth(child, depth + 1);\n }\n return child;\n });\n\n return {\n ...block,\n [blockType]: { ...blockData, children: normalizedChildren },\n };\n}\n\nfunction collectAllDescendants(\n blocks: Array<Record<string, unknown>>,\n): Array<Record<string, unknown>> {\n const result: Array<Record<string, unknown>> = [];\n for (const block of blocks) {\n const blockType = block.type as string;\n const blockData = block[blockType] as\n | { children?: Array<Record<string, unknown>>; [key: string]: unknown }\n | undefined;\n const children = blockData?.children;\n const blockWithoutChildren = children\n ? { ...block, [blockType]: { ...blockData, children: undefined } }\n : block;\n result.push(blockWithoutChildren);\n if (children && children.length > 0) {\n result.push(...collectAllDescendants(children));\n }\n }\n return result;\n}\n","import { createHash } from \"node:crypto\";\nimport { Sema } from \"async-sema\";\nimport type { VaultFS } from \"./vault-fs.js\";\nimport type { NotionClient } from \"../notion/client.js\";\nimport type { ImageReference } from \"../types/convert.js\";\nimport { getLogger } from \"../utils/logger.js\";\n\nexport interface ImageDownloadResult {\n readonly originalUrl: string;\n readonly localPath: string;\n readonly hash: string;\n readonly size: number;\n}\n\nexport interface ImageUploadResult {\n readonly localPath: string;\n readonly fileUploadId: string;\n}\n\nconst IMAGE_EXTENSIONS: Record<string, string> = {\n \"image/png\": \".png\",\n \"image/jpeg\": \".jpg\",\n \"image/gif\": \".gif\",\n \"image/webp\": \".webp\",\n \"image/svg+xml\": \".svg\",\n \"image/bmp\": \".bmp\",\n \"image/tiff\": \".tiff\",\n};\n\nconst EXTENSION_TO_MIME: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".bmp\": \"image/bmp\",\n \".ico\": \"image/x-icon\",\n \".tiff\": \"image/tiff\",\n};\n\nexport class ImageHandler {\n constructor(\n private readonly vaultFs: VaultFS,\n private readonly attachmentFolder: string = \"attachments\",\n private readonly notionClient?: NotionClient,\n ) {}\n\n async downloadImage(url: string, pageTitle: string): Promise<ImageDownloadResult> {\n const maxRetries = 3;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n await new Promise((r) => setTimeout(r, 1000 * attempt));\n getLogger().info(\n `[Im-Nobsidian] 이미지 다운로드 재시도 (${attempt + 1}/${maxRetries}): ${pageTitle}`,\n );\n }\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`이미지 다운로드 실패: ${response.status} ${response.statusText}`);\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"image/png\";\n const extension = IMAGE_EXTENSIONS[contentType] ?? this.guessExtension(url) ?? \".png\";\n\n const buffer = Buffer.from(await response.arrayBuffer());\n const hash = createHash(\"sha256\").update(buffer).digest(\"hex\").slice(0, 12);\n const safeName = pageTitle\n .replace(/[^a-zA-Z0-9가-힣\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .slice(0, 50);\n\n const fileName = `${safeName}-${hash}${extension}`;\n const localPath = `${this.attachmentFolder}/${fileName}`;\n\n await this.vaultFs.ensureFolder(this.attachmentFolder);\n await this.vaultFs.writeBinary(localPath, buffer);\n\n return { originalUrl: url, localPath, hash, size: buffer.length };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n }\n }\n throw lastError!;\n }\n\n async downloadAllImages(\n markdown: string,\n pageTitle: string,\n ): Promise<{ content: string; downloads: ImageDownloadResult[] }> {\n const imageRegex = /!\\[([^\\]]*)\\]\\((https?:\\/\\/[^)]+)\\)/g;\n const matches = [...markdown.matchAll(imageRegex)];\n const notionMatches = matches.filter((m) => m[2] && this.isNotionImageUrl(m[2]));\n\n const internalImageRegex = /!\\[([^\\]]*)\\]\\((file:\\/\\/%7B.*?%7D%7D)\\)/g;\n const internalMatches = [...markdown.matchAll(internalImageRegex)];\n\n if (notionMatches.length === 0 && internalMatches.length === 0) {\n return { content: markdown, downloads: [] };\n }\n\n const sema = new Sema(3);\n const downloads: ImageDownloadResult[] = [];\n let result = markdown;\n\n const httpResults = await Promise.allSettled(\n notionMatches.map(async (match) => {\n await sema.acquire();\n try {\n return {\n match,\n download: await this.downloadImage(match[2]!, pageTitle),\n };\n } finally {\n sema.release();\n }\n }),\n );\n\n for (const settled of httpResults) {\n if (settled.status !== \"fulfilled\") continue;\n const { match, download } = settled.value;\n downloads.push(download);\n const obsidianEmbed = `![[${download.localPath}${match[1] ? `|${match[1]}` : \"\"}]]`;\n result = result.replace(match[0]!, obsidianEmbed);\n }\n\n for (const match of internalMatches) {\n await sema.acquire();\n try {\n const fileUrl = match[2]!;\n const parsed = this.parseNotionFileUrl(fileUrl);\n if (!parsed || !this.notionClient) continue;\n\n const realUrl = await this.notionClient.getFileBlockUrl(parsed.blockId);\n if (!realUrl) {\n getLogger().warn(`[Im-Nobsidian] 이미지 Block URL 조회 실패: ${parsed.fileName}`);\n continue;\n }\n\n const download = await this.downloadImage(realUrl, pageTitle);\n downloads.push(download);\n const obsidianEmbed = `![[${download.localPath}${match[1] ? `|${match[1]}` : \"\"}]]`;\n result = result.replace(match[0]!, obsidianEmbed);\n } catch (error) {\n getLogger().warn(`내부 이미지 다운로드 실패: ${error}`);\n } finally {\n sema.release();\n }\n }\n\n return { content: result, downloads };\n }\n\n async uploadLocalImage(localPath: string): Promise<ImageUploadResult> {\n if (!this.notionClient) {\n throw new Error(\"NotionClient required for image upload\");\n }\n\n const buffer = await this.readImageFromVault(localPath);\n const filename = localPath.split(\"/\").pop() ?? \"image.png\";\n const contentType = this.getContentTypeFromPath(filename);\n const blob = new Blob([buffer], { type: contentType });\n const fileUploadId = await this.notionClient.uploadFile(blob, filename, contentType);\n\n return { localPath, fileUploadId };\n }\n\n async uploadAndAppendImages(\n pageId: string,\n images: ImageReference[],\n ): Promise<ImageUploadResult[]> {\n if (!this.notionClient) return [];\n\n const localImages = images.filter((img) => !img.isExternal && img.localPath);\n if (localImages.length === 0) return [];\n\n const results: ImageUploadResult[] = [];\n const imageBlocks: unknown[] = [];\n\n for (const img of localImages) {\n try {\n const result = await this.uploadLocalImage(img.localPath!);\n results.push(result);\n imageBlocks.push({\n type: \"image\",\n image: {\n type: \"file_upload\",\n file_upload: { id: result.fileUploadId },\n },\n });\n } catch (error) {\n getLogger().warn(`이미지 업로드 실패 (${img.localPath}):`, error);\n }\n }\n\n if (imageBlocks.length > 0) {\n await this.notionClient.appendChildren(pageId, imageBlocks);\n }\n\n return results;\n }\n\n private async readImageFromVault(localPath: string): Promise<Buffer> {\n try {\n return await this.vaultFs.readBinary(localPath);\n } catch {\n return await this.vaultFs.readBinary(`${this.attachmentFolder}/${localPath}`);\n }\n }\n\n private getContentTypeFromPath(filename: string): string {\n const ext = filename.match(/\\.[^.]+$/)?.[0]?.toLowerCase();\n return (ext && EXTENSION_TO_MIME[ext]) ?? \"application/octet-stream\";\n }\n\n async downloadAllFiles(\n markdown: string,\n pageTitle: string,\n ): Promise<{ content: string; downloads: ImageDownloadResult[] }> {\n const mdLinkRegex = /\\[(?:📎|🎬|🎞|📄|🔊)\\s*([^\\]]*)\\]\\((https?:\\/\\/[^)]+)\\)/g;\n const mdHttpMatches = [...markdown.matchAll(mdLinkRegex)];\n const notionHttpMatches = mdHttpMatches.filter((m) => m[2] && this.isNotionFileUrl(m[2]));\n\n const mdInternalRegex = /\\[(?:📎|🎬|🎞|📄|🔊)\\s*([^\\]]*)\\]\\((file:\\/\\/%7B.*?%7D%7D)\\)/g;\n const mdInternalMatches = [...markdown.matchAll(mdInternalRegex)];\n\n const xmlHttpRegex =\n /<(?:file|video|audio|pdf)\\s+src=\"(https?:\\/\\/[^\"]+)\">([\\s\\S]*?)<\\/(?:file|video|audio|pdf)>/g;\n const xmlHttpMatches = [...markdown.matchAll(xmlHttpRegex)];\n const notionXmlHttpMatches = xmlHttpMatches.filter((m) => m[1] && this.isNotionFileUrl(m[1]));\n\n const xmlInternalRegex =\n /<(?:file|video|audio|pdf)\\s+src=\"(file:\\/\\/%7B.*?%7D%7D)\">([\\s\\S]*?)<\\/(?:file|video|audio|pdf)>/g;\n const xmlInternalMatches = [...markdown.matchAll(xmlInternalRegex)];\n\n const totalMatches =\n notionHttpMatches.length +\n mdInternalMatches.length +\n notionXmlHttpMatches.length +\n xmlInternalMatches.length;\n\n if (totalMatches === 0) {\n return { content: markdown, downloads: [] };\n }\n\n const sema = new Sema(3);\n const downloads: ImageDownloadResult[] = [];\n let result = markdown;\n\n for (const match of notionHttpMatches) {\n await sema.acquire();\n try {\n const url = match[2]!;\n const caption = match[1]?.trim() || \"file\";\n const download = await this.downloadFile(url, pageTitle, caption);\n if (!download.localPath) continue;\n downloads.push(download);\n const obsidianLink = `[[${download.localPath}|${caption}]]`;\n result = result.replace(match[0]!, obsidianLink);\n } catch (error) {\n getLogger().warn(`파일 다운로드 실패: ${error}`);\n } finally {\n sema.release();\n }\n }\n\n for (const match of mdInternalMatches) {\n await sema.acquire();\n try {\n const fileUrl = match[2]!;\n const parsed = this.parseNotionFileUrl(fileUrl);\n if (!parsed || !this.notionClient) continue;\n\n const blockId = parsed.blockId;\n const fileName = parsed.fileName;\n const realUrl = await this.notionClient.getFileBlockUrl(blockId);\n if (!realUrl) continue;\n\n const caption = fileName || match[1]?.trim() || \"file\";\n const download = await this.downloadFile(realUrl, pageTitle, caption);\n if (!download.localPath) continue;\n downloads.push(download);\n const obsidianLink = `[[${download.localPath}|${caption}]]`;\n result = result.replace(match[0]!, obsidianLink);\n } catch (error) {\n getLogger().warn(`내부 파일 다운로드 실패: ${error}`);\n } finally {\n sema.release();\n }\n }\n\n for (const match of notionXmlHttpMatches) {\n await sema.acquire();\n try {\n const url = match[1]!;\n const caption = match[2]?.trim() || \"file\";\n const download = await this.downloadFile(url, pageTitle, caption);\n if (!download.localPath) continue;\n downloads.push(download);\n const obsidianLink = `[[${download.localPath}|${caption}]]`;\n result = result.replace(match[0]!, obsidianLink);\n } catch (error) {\n getLogger().warn(`파일 다운로드 실패: ${error}`);\n } finally {\n sema.release();\n }\n }\n\n for (const match of xmlInternalMatches) {\n await sema.acquire();\n try {\n const fileUrl = match[1]!;\n const parsed = this.parseNotionFileUrl(fileUrl);\n if (!parsed || !this.notionClient) continue;\n\n const blockId = parsed.blockId;\n const fileName = parsed.fileName;\n const realUrl = await this.notionClient.getFileBlockUrl(blockId);\n if (!realUrl) continue;\n\n const caption = fileName || match[2]?.trim() || \"file\";\n const download = await this.downloadFile(realUrl, pageTitle, caption);\n if (!download.localPath) continue;\n downloads.push(download);\n const obsidianLink = `[[${download.localPath}|${caption}]]`;\n result = result.replace(match[0]!, obsidianLink);\n } catch (error) {\n getLogger().warn(`내부 파일 다운로드 실패: ${error}`);\n } finally {\n sema.release();\n }\n }\n\n return { content: result, downloads };\n }\n\n private parseNotionFileUrl(fileUrl: string): { blockId: string; fileName: string } | null {\n try {\n const decoded = decodeURIComponent(fileUrl.replace(\"file://\", \"\"));\n const json = JSON.parse(decoded) as {\n source?: string;\n permissionRecord?: { id?: string };\n };\n const blockId = json.permissionRecord?.id ?? \"\";\n const source = json.source ?? \"\";\n const fileNameMatch = source.match(/attachment:[^:]+:(.+)$/);\n const fileName = fileNameMatch ? decodeURIComponent(fileNameMatch[1]!) : \"\";\n return blockId ? { blockId, fileName } : null;\n } catch {\n return null;\n }\n }\n\n private async downloadFile(\n url: string,\n _pageTitle: string,\n caption: string,\n ): Promise<ImageDownloadResult> {\n const maxRetries = 3;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n await new Promise((r) => setTimeout(r, 1000 * attempt));\n getLogger().info(\n `[Im-Nobsidian] 파일 다운로드 재시도 (${attempt + 1}/${maxRetries}): ${caption}`,\n );\n }\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`파일 다운로드 실패: ${response.status} ${response.statusText}`);\n }\n\n const contentLength = response.headers.get(\"content-length\");\n const MAX_FILE_SIZE = 100 * 1024 * 1024;\n if (contentLength && parseInt(contentLength, 10) > MAX_FILE_SIZE) {\n const sizeMB = Math.round(parseInt(contentLength, 10) / 1024 / 1024);\n getLogger().debug(`[Im-Nobsidian] 파일 스킵 — 너무 큼 (${sizeMB}MB): ${caption}`);\n return { originalUrl: url, localPath: \"\", hash: \"\", size: 0 };\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n const hash = createHash(\"sha256\").update(buffer).digest(\"hex\").slice(0, 12);\n\n const extension = this.guessFileExtension(url, response.headers.get(\"content-type\"));\n const safeName = caption\n .replace(/[^a-zA-Z0-9가-힣\\s._-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .slice(0, 80);\n const fileName = `${safeName}-${hash}${extension}`;\n const localPath = `${this.attachmentFolder}/${fileName}`;\n\n await this.vaultFs.ensureFolder(this.attachmentFolder);\n await this.vaultFs.writeBinary(localPath, buffer);\n\n return { originalUrl: url, localPath, hash, size: buffer.length };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n }\n }\n throw lastError!;\n }\n\n private isNotionImageUrl(url: string): boolean {\n return this.isNotionFileUrl(url);\n }\n\n private isNotionFileUrl(url: string): boolean {\n return (\n url.includes(\"secure.notion-static.com\") ||\n url.includes(\"prod-files-secure\") ||\n url.includes(\"s3.us-west-2.amazonaws.com/secure.notion-static.com\")\n );\n }\n\n private guessExtension(url: string): string | null {\n const pathname = new URL(url).pathname;\n const ext = pathname.match(/\\.(png|jpg|jpeg|gif|webp|svg|bmp|tiff)(\\?|$)/i);\n return ext ? `.${ext[1]!.toLowerCase()}` : null;\n }\n\n private guessFileExtension(url: string, contentType: string | null): string {\n try {\n const pathname = new URL(url).pathname;\n const extMatch = pathname.match(/\\.([a-zA-Z0-9]{1,10})(?:\\?|$)/);\n if (extMatch) return `.${extMatch[1]!.toLowerCase()}`;\n } catch {\n // URL 파싱 실패 시 MIME 타입으로 폴백\n }\n\n const mimeMap: Record<string, string> = {\n \"application/pdf\": \".pdf\",\n \"application/zip\": \".zip\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": \".xlsx\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\": \".pptx\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": \".docx\",\n \"application/x-hwp\": \".hwp\",\n \"application/gzip\": \".gz\",\n };\n if (contentType && mimeMap[contentType]) return mimeMap[contentType]!;\n return \"\";\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { Sema } from \"async-sema\";\nimport type { VaultFS, NonMdFileInfo } from \"./vault-fs.js\";\nimport type { NotionClient } from \"../notion/client.js\";\nimport type { StateDB } from \"../state/state-db.js\";\nimport { getLogger } from \"../utils/logger.js\";\n\nexport type NotionBlockType = \"image\" | \"pdf\" | \"video\" | \"audio\" | \"file\";\n\nexport interface FileUploadResult {\n readonly localPath: string;\n readonly fileUploadId: string;\n readonly blockType: NotionBlockType;\n}\n\nexport interface FileDownloadResult {\n readonly url: string;\n readonly localPath: string;\n readonly hash: string;\n readonly size: number;\n}\n\nconst EXTENSION_TO_BLOCK_TYPE: Record<string, NotionBlockType> = {\n \".png\": \"image\",\n \".jpg\": \"image\",\n \".jpeg\": \"image\",\n \".gif\": \"image\",\n \".svg\": \"image\",\n \".webp\": \"image\",\n \".ico\": \"image\",\n \".bmp\": \"image\",\n \".tiff\": \"image\",\n \".tif\": \"image\",\n \".avif\": \"image\",\n \".apng\": \"image\",\n \".heic\": \"image\",\n\n \".pdf\": \"pdf\",\n\n \".mp4\": \"video\",\n \".mov\": \"video\",\n \".webm\": \"video\",\n \".avi\": \"video\",\n \".mkv\": \"video\",\n \".flv\": \"video\",\n \".wmv\": \"video\",\n \".m4v\": \"video\",\n \".mpeg\": \"video\",\n \".ogv\": \"video\",\n \".3gp\": \"video\",\n\n \".mp3\": \"audio\",\n \".wav\": \"audio\",\n \".ogg\": \"audio\",\n \".m4a\": \"audio\",\n \".flac\": \"audio\",\n \".aac\": \"audio\",\n \".wma\": \"audio\",\n \".opus\": \"audio\",\n \".weba\": \"audio\",\n};\n\nconst EXTENSION_TO_MIME: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".bmp\": \"image/bmp\",\n \".ico\": \"image/x-icon\",\n \".tiff\": \"image/tiff\",\n \".tif\": \"image/tiff\",\n \".avif\": \"image/avif\",\n \".heic\": \"image/heic\",\n \".pdf\": \"application/pdf\",\n \".mp4\": \"video/mp4\",\n \".mov\": \"video/quicktime\",\n \".webm\": \"video/webm\",\n \".avi\": \"video/x-msvideo\",\n \".mkv\": \"video/x-matroska\",\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".ogg\": \"audio/ogg\",\n \".m4a\": \"audio/mp4\",\n \".flac\": \"audio/flac\",\n \".aac\": \"audio/aac\",\n \".docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \".pptx\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \".zip\": \"application/zip\",\n \".gz\": \"application/gzip\",\n \".tar\": \"application/x-tar\",\n \".rar\": \"application/vnd.rar\",\n \".7z\": \"application/x-7z-compressed\",\n \".py\": \"text/x-python\",\n \".js\": \"text/javascript\",\n \".ts\": \"text/typescript\",\n \".json\": \"application/json\",\n \".csv\": \"text/csv\",\n \".txt\": \"text/plain\",\n \".html\": \"text/html\",\n \".xml\": \"application/xml\",\n \".hwp\": \"application/x-hwp\",\n \".xls\": \"application/vnd.ms-excel\",\n \".doc\": \"application/msword\",\n \".ppt\": \"application/vnd.ms-powerpoint\",\n};\n\nexport function getBlockType(filename: string): NotionBlockType {\n const ext = filename.match(/\\.[^.]+$/)?.[0]?.toLowerCase();\n if (!ext) return \"file\";\n return EXTENSION_TO_BLOCK_TYPE[ext] ?? \"file\";\n}\n\nexport function getMimeType(filename: string): string {\n const ext = filename.match(/\\.[^.]+$/)?.[0]?.toLowerCase();\n if (!ext) return \"application/octet-stream\";\n return EXTENSION_TO_MIME[ext] ?? \"application/octet-stream\";\n}\n\nfunction getFolderPath(filePath: string): string {\n const parts = filePath.split(\"/\");\n return parts.length > 1 ? parts.slice(0, -1).join(\"/\") : \"\";\n}\n\nexport class FileHandler {\n private readonly sema = new Sema(2);\n\n constructor(\n private readonly vaultFs: VaultFS,\n private readonly notionClient: NotionClient,\n private readonly stateDb: StateDB,\n ) {}\n\n async pushFilesForFolder(folderPageId: string, folderPath: string): Promise<FileUploadResult[]> {\n const allFiles = await this.vaultFs.listNonMarkdownFiles();\n const folderFiles = allFiles.filter((f) => getFolderPath(f.path) === folderPath);\n\n if (folderFiles.length === 0) return [];\n\n const results: FileUploadResult[] = [];\n\n for (const file of folderFiles) {\n const existing = this.stateDb.getFileRegistry(file.path);\n if (existing) {\n if (existing.fileSize === file.size) continue;\n const buffer = await this.vaultFs.readBinary(file.path);\n const currentHash = createHash(\"sha256\").update(buffer).digest(\"hex\");\n if (existing.fileHash === currentHash) continue;\n }\n\n await this.sema.acquire();\n try {\n const result = await this.uploadFile(file, folderPageId);\n if (result) results.push(result);\n } catch (error) {\n getLogger().warn(`파일 업로드 실패 (${file.path}):`, error);\n } finally {\n this.sema.release();\n }\n }\n\n return results;\n }\n\n async pushAllFiles(): Promise<FileUploadResult[]> {\n const allFiles = await this.vaultFs.listNonMarkdownFiles();\n if (allFiles.length === 0) return [];\n\n const filesByFolder = new Map<string, NonMdFileInfo[]>();\n for (const file of allFiles) {\n const folder = getFolderPath(file.path);\n const list = filesByFolder.get(folder) ?? [];\n list.push(file);\n filesByFolder.set(folder, list);\n }\n\n const results: FileUploadResult[] = [];\n\n for (const [folderPath, files] of filesByFolder) {\n const folderRecord = folderPath\n ? this.stateDb.getByPath(folderPath)\n : this.stateDb.getByPath(\"__root__\");\n\n const folderPageId = folderRecord?.notionPageId;\n if (!folderPageId) {\n if (files.length > 0) {\n getLogger().debug(\n `폴더 페이지 없음, 파일 스킵: ${folderPath || \"(루트)\"} (${files.length}개)`,\n );\n }\n continue;\n }\n\n for (const file of files) {\n const existing = this.stateDb.getFileRegistry(file.path);\n if (existing) {\n if (existing.fileSize === file.size) continue;\n const buffer = await this.vaultFs.readBinary(file.path);\n const currentHash = createHash(\"sha256\").update(buffer).digest(\"hex\");\n if (existing.fileHash === currentHash) continue;\n }\n\n await this.sema.acquire();\n try {\n const result = await this.uploadFile(file, folderPageId);\n if (result) results.push(result);\n } catch (error) {\n getLogger().warn(`파일 업로드 실패 (${file.path}):`, error);\n } finally {\n this.sema.release();\n }\n }\n }\n\n return results;\n }\n\n async downloadFileBlock(\n url: string,\n filename: string,\n targetFolder: string,\n ): Promise<FileDownloadResult> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`파일 다운로드 실패: ${response.status} ${response.statusText}`);\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n const hash = createHash(\"sha256\").update(buffer).digest(\"hex\");\n const localPath = targetFolder ? `${targetFolder}/${filename}` : filename;\n\n await this.vaultFs.ensureFolder(targetFolder || \".\");\n await this.vaultFs.writeBinary(localPath, buffer);\n\n return { url, localPath, hash, size: buffer.length };\n }\n\n async downloadFileBlocks(\n blocks: Array<{ type: string; url: string; caption?: string }>,\n targetFolder: string,\n ): Promise<FileDownloadResult[]> {\n const results: FileDownloadResult[] = [];\n\n for (const block of blocks) {\n const filename = this.extractFilename(block.url, block.caption);\n if (this.stateDb.isFileRegistered(`${targetFolder}/${filename}`)) continue;\n\n await this.sema.acquire();\n try {\n const result = await this.downloadFileBlock(block.url, filename, targetFolder);\n results.push(result);\n } catch (error) {\n getLogger().warn(`파일 다운로드 실패 (${block.url}):`, error);\n } finally {\n this.sema.release();\n }\n }\n\n return results;\n }\n\n private async uploadFile(\n file: NonMdFileInfo,\n parentPageId: string,\n ): Promise<FileUploadResult | null> {\n const buffer = await this.vaultFs.readBinary(file.path);\n const filename = file.path.split(\"/\").pop() ?? \"file\";\n const contentType = getMimeType(filename);\n const blockType = getBlockType(filename);\n const hash = createHash(\"sha256\").update(buffer).digest(\"hex\");\n\n const blob = new Blob([buffer], { type: contentType });\n const fileUploadId = await this.notionClient.uploadFile(blob, filename, contentType);\n\n const block = this.createFileBlock(blockType, fileUploadId);\n await this.notionClient.appendChildren(parentPageId, [block]);\n\n this.stateDb.registerFile({\n localPath: file.path,\n notionPageId: parentPageId,\n fileUploadId,\n fileType: blockType,\n fileHash: hash,\n fileSize: file.size,\n });\n\n getLogger().info(`파일 업로드 완료: ${file.path} → ${blockType} 블록`);\n\n return { localPath: file.path, fileUploadId, blockType };\n }\n\n private createFileBlock(blockType: NotionBlockType, fileUploadId: string): unknown {\n const fileRef = {\n type: \"file_upload\" as const,\n file_upload: { id: fileUploadId },\n };\n\n switch (blockType) {\n case \"image\":\n return { type: \"image\", image: fileRef };\n case \"pdf\":\n return { type: \"pdf\", pdf: fileRef };\n case \"video\":\n return { type: \"video\", video: fileRef };\n case \"audio\":\n return { type: \"audio\", audio: fileRef };\n case \"file\":\n default:\n return { type: \"file\", file: fileRef };\n }\n }\n\n private extractFilename(url: string, caption?: string): string {\n if (caption) {\n const safe = caption.replace(/[^a-zA-Z0-9가-힣._\\s-]/g, \"\").trim();\n if (safe) return safe;\n }\n\n try {\n const pathname = new URL(url).pathname;\n const segments = pathname.split(\"/\");\n const last = segments[segments.length - 1];\n if (last && last.includes(\".\")) return decodeURIComponent(last);\n } catch {\n // fallback\n }\n\n const ext = url.match(/\\.(png|jpg|jpeg|gif|pdf|mp4|mp3|docx|xlsx|zip|webp)(\\?|$)/i);\n return `file-${Date.now()}${ext ? `.${ext[1]}` : \"\"}`;\n }\n}\n","// eslint-disable-next-line no-control-regex\nconst INVALID_CHARS = /[<>:\"/\\\\|?*\\x00-\\x1f]/g;\nconst TRAILING_DOTS = /\\.+$/;\nconst RESERVED_NAMES = new Set([\n \"CON\",\n \"PRN\",\n \"AUX\",\n \"NUL\",\n \"COM1\",\n \"COM2\",\n \"COM3\",\n \"COM4\",\n \"COM5\",\n \"COM6\",\n \"COM7\",\n \"COM8\",\n \"COM9\",\n \"LPT1\",\n \"LPT2\",\n \"LPT3\",\n \"LPT4\",\n \"LPT5\",\n \"LPT6\",\n \"LPT7\",\n \"LPT8\",\n \"LPT9\",\n]);\n\nexport function sanitizeFileName(name: string): string {\n let sanitized = name.replace(INVALID_CHARS, \"_\").replace(TRAILING_DOTS, \"\").trim().slice(0, 200);\n\n if (RESERVED_NAMES.has(sanitized.toUpperCase())) {\n sanitized = `_${sanitized}`;\n }\n\n if (sanitized.length === 0) {\n sanitized = \"_untitled\";\n }\n\n return sanitized;\n}\n","const NOTION_CALLOUT_RE = /^::: callout\\n([\\s\\S]*?)\\n:::/gm;\nconst NOTION_CALLOUT_TAG_RE = /<callout[^>]*>\\n?([\\s\\S]*?)<\\/callout>/g;\nconst NOTION_TOGGLE_RE = /[\\t ]*<details>\\s*<summary>([\\s\\S]*?)<\\/summary>([\\s\\S]*?)<\\/details>/gs;\nconst NOTION_PAGE_MENTION_RE = /<mention-page id=\"([^\"]+)\">([\\s\\S]*?)<\\/mention-page>/g;\nconst NOTION_USER_MENTION_RE = /<mention-user id=\"[^\"]*\">([^<]*)<\\/mention-user>/g;\nconst NOTION_DATE_MENTION_RE = /<mention-date start=\"([^\"]*)\"(?: end=\"([^\"]*)\")?[^>]*\\/>/g;\nconst NOTION_UNKNOWN_RE = /<unknown id=\"([^\"]*)\"([^>]*)\\/>/g;\n\nconst NOTION_AUDIO_RE = /[\\t ]*<audio src=\"([^\"]*)\">([\\s\\S]*?)<\\/audio>/g;\nconst NOTION_VIDEO_RE = /[\\t ]*<video src=\"([^\"]*)\">([\\s\\S]*?)<\\/video>/g;\nconst NOTION_PDF_RE = /[\\t ]*<pdf src=\"([^\"]*)\">([\\s\\S]*?)<\\/pdf>/g;\nconst NOTION_FILE_RE = /[\\t ]*<file src=\"([^\"]*)\">([\\s\\S]*?)<\\/file>/g;\nconst NOTION_TAB_RE = /<tab title=\"([^\"]*)\">([\\s\\S]*?)<\\/tab>/g;\nconst NOTION_UNDERLINE_RE = /<span underline=\"true\">([\\s\\S]*?)<\\/span>/g;\n\nconst TOGGLE_START = \"%%im-nobsidian:toggle:start%%\";\nconst TOGGLE_END = \"%%im-nobsidian:toggle:end%%\";\n\nexport function notionEnhancedToObsidian(enhanced: string): string {\n let result = enhanced;\n\n result = convertSyncedBlockRef(result);\n result = normalizeCodeBlockToggles(result);\n result = convertToggles(result);\n result = convertCallouts(result);\n result = convertPageMentions(result);\n result = convertPageLinks(result);\n result = convertUserMentions(result);\n result = convertDateMentions(result);\n result = convertMediaTags(result);\n result = convertTabBlocks(result);\n result = preserveUnknownBlocks(result);\n result = convertNotionMath(result);\n result = convertNotionTables(result);\n result = convertColorSpans(result);\n result = convertUnderlineSpans(result);\n result = convertColumnBlocks(result);\n result = convertDatabaseBlocks(result);\n result = cleanInlineColorAttrs(result);\n result = removeEmptyBlocks(result);\n result = unescapePipes(result);\n result = unescapeNotionChars(result);\n result = ensureCalloutContinuity(result);\n\n return result;\n}\n\nexport function obsidianToNotionEnhanced(obsidian: string): string {\n let result = obsidian;\n\n result = convertTogglesToHtml(result);\n result = restoreTabBlocks(result);\n result = convertObsidianCallouts(result);\n result = restoreMediaTags(result);\n result = restoreUnknownBlocks(result);\n result = restoreColorSpans(result);\n result = restoreUnderlineSpans(result);\n\n return result;\n}\n\nfunction normalizeCodeBlockToggles(content: string): string {\n return content.replace(\n /^- (.+)\\n\\t```(\\w*)\\n([\\s\\S]*?)\\n\\t```$/gm,\n (_match, title: string, lang: string, body: string) => {\n const langTag = lang ? lang : \"\";\n return `<details>\\n<summary>${title.trim()}</summary>\\n\\`\\`\\`${langTag}\\n${body}\\n\\`\\`\\`\\n</details>`;\n },\n );\n}\n\nfunction convertToggles(content: string): string {\n function replaceToggle(match: string): string {\n const m = /[\\t ]*<details>\\s*<summary>([\\s\\S]*?)<\\/summary>([\\s\\S]*?)<\\/details>/s.exec(match);\n if (!m) return match;\n\n const title = m[1]!.trim();\n let body = m[2]!.trim();\n\n body = convertToggles(body);\n\n const calloutBody = body\n .split(\"\\n\")\n .map((line) => (line ? `> ${line}` : \">\"))\n .join(\"\\n\");\n return `> [!toggle]- ${title}\\n${calloutBody}`;\n }\n\n return content.replace(NOTION_TOGGLE_RE, replaceToggle);\n}\n\nfunction calloutBodyToObsidian(body: string): string {\n const lines = body\n .split(\"\\n\")\n .map((l) => l.replace(/^\\t/, \"\"))\n .filter((l, i, arr) => !(i === 0 && l === \"\") && !(i === arr.length - 1 && l === \"\"));\n const firstLine = lines[0] ?? \"\";\n\n const emojiMatch = /^([\\p{Emoji}️‍]+)\\s*(.*)/u.exec(firstLine);\n const type = emojiMatch ? emojiToCalloutType(emojiMatch[1]!) : \"note\";\n const title = emojiMatch ? emojiMatch[2]! : firstLine;\n const rest = lines.slice(1).join(\"\\n\").trim();\n\n const calloutTitle = title ? `> [!${type}] ${title}` : `> [!${type}]`;\n const calloutBody = rest\n ? \"\\n\" +\n rest\n .split(\"\\n\")\n .map((line) => (line.trim() ? `> ${line}` : \">\"))\n .join(\"\\n\")\n : \"\";\n\n return calloutTitle + calloutBody;\n}\n\nfunction convertCallouts(content: string): string {\n let result = content.replace(NOTION_CALLOUT_TAG_RE, (_match, body: string) =>\n calloutBodyToObsidian(body),\n );\n result = result.replace(NOTION_CALLOUT_RE, (_match, body: string) => calloutBodyToObsidian(body));\n return result;\n}\n\nfunction convertPageMentions(content: string): string {\n let result = content.replace(NOTION_PAGE_MENTION_RE, (_match, _id: string, text: string) => {\n const cleaned = text.trim();\n return `[[${cleaned}]]`;\n });\n result = result.replace(\n /<mention-page\\s+url=\"https?:\\/\\/(?:www\\.)?notion\\.so\\/([a-f0-9]{32})\"[^>]*\\/>/g,\n (_match, id: string) => `[[notion:${id}]]`,\n );\n return result;\n}\n\nfunction convertUserMentions(content: string): string {\n return content.replace(NOTION_USER_MENTION_RE, (_match, name: string) => `@${name}`);\n}\n\nfunction convertDateMentions(content: string): string {\n return content.replace(NOTION_DATE_MENTION_RE, (_match, start: string, end?: string) => {\n return end ? `${start} → ${end}` : start;\n });\n}\n\n// 2D: <unknown> → 보존 마커 (삭제 대신 보존)\nfunction preserveUnknownBlocks(content: string): string {\n return content.replace(NOTION_UNKNOWN_RE, (_match, id: string, attrs: string) => {\n const typeMatch = /type=\"([^\"]*)\"/.exec(attrs);\n const altMatch = /alt=\"([^\"]*)\"/.exec(attrs);\n const blockType = altMatch?.[1] ?? typeMatch?.[1] ?? \"unknown\";\n return `%%im-nobsidian:unknown:id=${id}&type=${blockType}%%`;\n });\n}\n\nfunction convertSyncedBlockRef(content: string): string {\n let result = content.replace(\n /<synced_block_reference[^>]*>[\\s\\S]*?<\\/synced_block_reference>/g,\n (match) => {\n const inner = match\n .replace(/<synced_block_reference[^>]*>\\n?/, \"\")\n .replace(/<\\/synced_block_reference>/, \"\")\n .split(\"\\n\")\n .map((l) => l.replace(/^\\t/, \"\"))\n .join(\"\\n\")\n .trim();\n return inner;\n },\n );\n result = result.replace(\n /<synced_block[^>]*>\\n?([\\s\\S]*?)<\\/synced_block>/g,\n (_match, inner: string) => inner.trim(),\n );\n return result;\n}\n\n// 2A: 미디어 태그 → Obsidian 마크다운\nfunction convertMediaTags(content: string): string {\n let result = content;\n\n result = result.replace(NOTION_AUDIO_RE, (_match, src: string, caption: string) => {\n const cap = caption.trim();\n return cap ? `[🔊 ${cap}](${src})` : `[🔊 audio](${src})`;\n });\n\n result = result.replace(NOTION_VIDEO_RE, (_match, src: string, caption: string) => {\n const cap = caption.trim();\n return cap ? `[🎬 ${cap}](${src})` : `[🎬 video](${src})`;\n });\n\n result = result.replace(NOTION_PDF_RE, (_match, src: string, caption: string) => {\n const cap = caption.trim();\n return cap ? `[📄 ${cap}](${src})` : `[📄 pdf](${src})`;\n });\n\n result = result.replace(NOTION_FILE_RE, (_match, src: string, caption: string) => {\n const cap = caption.trim();\n return cap ? `[📎 ${cap}](${src})` : `[📎 file](${src})`;\n });\n\n return result;\n}\n\n// 2B: <tab> → 보존 마커\nfunction convertTabBlocks(content: string): string {\n return content.replace(NOTION_TAB_RE, (_match, title: string, body: string) => {\n const trimmed = body.trim();\n const indented = trimmed\n .split(\"\\n\")\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n return `> [!tab] ${title}\\n${indented}`;\n });\n}\n\n// 2C: <span underline> → 보존 마커\nfunction convertUnderlineSpans(content: string): string {\n return content.replace(NOTION_UNDERLINE_RE, (_match, text: string) => {\n return `%%im-nobsidian:underline%%${text}%%/underline%%`;\n });\n}\n\nfunction convertTogglesToHtml(content: string): string {\n const calloutToggleRe = /^> \\[!toggle\\]-\\s*(.+)\\n((?:>.*\\n?)*)/gm;\n\n let result = content;\n let prev = \"\";\n let safety = 0;\n while (result !== prev && safety++ < 100) {\n prev = result;\n result = result.replace(calloutToggleRe, (_match, title: string, body: string) => {\n const bodyText = body\n .split(\"\\n\")\n .map((line) => line.replace(/^>\\s?/, \"\"))\n .join(\"\\n\")\n .trim();\n return `<details>\\n<summary>${title.trim()}</summary>\\n\\n${bodyText}\\n\\n</details>`;\n });\n }\n\n const startRe = new RegExp(escapeRegex(TOGGLE_START), \"g\");\n const endRe = new RegExp(escapeRegex(TOGGLE_END), \"g\");\n\n safety = 0;\n while (result.includes(TOGGLE_START) && safety++ < 100) {\n const startIdx = result.indexOf(TOGGLE_START);\n const endIdx = findMatchingEnd(result, startIdx + TOGGLE_START.length);\n if (endIdx === -1) break;\n\n const inner = result.slice(startIdx + TOGGLE_START.length, endIdx).trim();\n const titleMatch = /^- (.+)$/m.exec(inner);\n const title = titleMatch ? titleMatch[1]! : \"\";\n const body = inner\n .split(\"\\n\")\n .slice(1)\n .map((line) => line.replace(/^ {2}/, \"\"))\n .join(\"\\n\")\n .trim();\n\n const html = `<details>\\n<summary>${title}</summary>\\n\\n${body}\\n\\n</details>`;\n result = result.slice(0, startIdx) + html + result.slice(endIdx + TOGGLE_END.length);\n }\n\n result = result.replace(startRe, \"\").replace(endRe, \"\");\n return result;\n}\n\nfunction findMatchingEnd(content: string, startFrom: number): number {\n let depth = 1;\n let pos = startFrom;\n\n while (pos < content.length && depth > 0) {\n const nextStart = content.indexOf(TOGGLE_START, pos);\n const nextEnd = content.indexOf(TOGGLE_END, pos);\n\n if (nextEnd === -1) return -1;\n\n if (nextStart !== -1 && nextStart < nextEnd) {\n depth++;\n pos = nextStart + TOGGLE_START.length;\n } else {\n depth--;\n if (depth === 0) return nextEnd;\n pos = nextEnd + TOGGLE_END.length;\n }\n }\n\n return -1;\n}\n\nfunction convertObsidianCallouts(content: string): string {\n const lines = content.split(\"\\n\");\n const result: string[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const headerMatch = /^> \\[!(\\w+)\\]([-+])?\\s*(.*)/.exec(lines[i]!);\n if (headerMatch) {\n const type = headerMatch[1]!;\n const title = headerMatch[3]!;\n const emoji = calloutTypeToEmoji(type) ?? \"💡\";\n const calloutTitle = title ? `${emoji} ${title}` : emoji;\n\n const bodyLines: string[] = [];\n i++;\n while (i < lines.length && lines[i]!.startsWith(\"> \")) {\n bodyLines.push(lines[i]!.slice(2));\n i++;\n }\n\n result.push(\"::: callout\");\n result.push(calloutTitle);\n if (bodyLines.length > 0) {\n result.push(...bodyLines);\n }\n result.push(\":::\");\n } else {\n result.push(lines[i]!);\n i++;\n }\n }\n\n return result.join(\"\\n\");\n}\n\nconst EMOJI_TYPE_MAP: Record<string, string> = {\n \"💡\": \"tip\",\n ℹ️: \"info\",\n \"⚠️\": \"warning\",\n \"🔥\": \"danger\",\n \"✅\": \"success\",\n \"❌\": \"failure\",\n \"❓\": \"question\",\n \"📝\": \"note\",\n \"📌\": \"abstract\",\n \"🐛\": \"bug\",\n \"💬\": \"quote\",\n \"📋\": \"example\",\n};\n\nconst TYPE_EMOJI_MAP: Record<string, string> = Object.fromEntries(\n Object.entries(EMOJI_TYPE_MAP).map(([k, v]) => [v, k]),\n);\n\nfunction emojiToCalloutType(emoji: string): string {\n return EMOJI_TYPE_MAP[emoji] ?? \"note\";\n}\n\nfunction calloutTypeToEmoji(type: string): string | undefined {\n return TYPE_EMOJI_MAP[type.toLowerCase()];\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nconst NOTION_PAGE_LINK_RE = /<page url=\"[^\"]*\">([\\s\\S]*?)<\\/page>/g;\nconst NOTION_COLOR_SPAN_RE = /<span color=\"([^\"]+)\">([\\s\\S]*?)<\\/span>/g;\nconst NOTION_EMPTY_BLOCK_RE = /^(?:>[\\t ]*)*[\\t ]*<empty-block\\/>\\n?/gm;\n\nfunction convertPageLinks(content: string): string {\n return content.replace(NOTION_PAGE_LINK_RE, (_match, text: string) => {\n const cleaned = text.replace(/\\*\\*/g, \"\").trim();\n return `[[${cleaned}]]`;\n });\n}\n\n// 2C: <span color> → 보존 마커 (색상 제거 대신 보존)\nfunction convertColorSpans(content: string): string {\n return content.replace(\n NOTION_COLOR_SPAN_RE,\n (_match, color: string, text: string) => `%%im-nobsidian:color:${color}%%${text}%%/color%%`,\n );\n}\n\nfunction convertDatabaseBlocks(content: string): string {\n return content.replace(\n /<database[^>]*>([\\s\\S]*?)<\\/database>/g,\n (_match, title: string) => `**${title.trim()}** *(Notion DB)*`,\n );\n}\n\nfunction cleanInlineColorAttrs(content: string): string {\n return content.replace(/\\s*\\{color=\"[^\"]*\"\\}/g, \"\");\n}\n\nfunction convertColumnBlocks(content: string): string {\n return content.replace(/<columns>\\n?([\\s\\S]*?)<\\/columns>/g, (_match, inner: string) => {\n return inner\n .replace(/\\t?<column>\\n?/g, \"\")\n .replace(/\\t?<\\/column>\\n?/g, \"\")\n .trim();\n });\n}\n\nfunction removeEmptyBlocks(content: string): string {\n return content.replace(NOTION_EMPTY_BLOCK_RE, \"\\n\");\n}\n\nconst NOTION_INLINE_MATH_RE = /\\$`([^`]+)`\\$/g;\nconst NOTION_BLOCK_MATH_RE = /\\$\\$\\n```\\n([\\s\\S]*?)\\n```\\n\\$\\$/g;\n\nfunction convertNotionMath(content: string): string {\n let result = content.replace(NOTION_BLOCK_MATH_RE, (_match, eq: string) => {\n return `$$\\n${eq.trim()}\\n$$`;\n });\n result = result.replace(NOTION_INLINE_MATH_RE, (_match, eq: string) => `$${eq}$`);\n result = result.replace(/\\\\\\$([^$]+?)\\\\\\$/g, (_match, inner: string) => {\n const unescaped = inner.replace(/\\\\\\^/g, \"^\").replace(/\\\\~/g, \"~\");\n return `$${unescaped}$`;\n });\n return result;\n}\n\nfunction unescapeNotionChars(content: string): string {\n return content.replace(/\\\\~/g, \"~\").replace(/\\\\\\^/g, \"^\");\n}\n\nconst NOTION_TABLE_RE = /<table[^>]*>([\\s\\S]*?)<\\/table>/g;\nconst TABLE_ROW_RE = /<tr>([\\s\\S]*?)<\\/tr>/g;\nconst TABLE_CELL_RE = /<t[dh][^>]*>([\\s\\S]*?)<\\/t[dh]>/g;\n\nfunction isAlignmentRow(cells: string[]): boolean {\n return cells.every((c) => /^:?-{2,}:?$/.test(c.trim()));\n}\n\nfunction convertNotionTables(content: string): string {\n return content.replace(NOTION_TABLE_RE, (_match, tableBody: string) => {\n const rows: string[][] = [];\n let rowMatch: RegExpExecArray | null;\n const rowRe = new RegExp(TABLE_ROW_RE.source, TABLE_ROW_RE.flags);\n\n while ((rowMatch = rowRe.exec(tableBody)) !== null) {\n const cells: string[] = [];\n let cellMatch: RegExpExecArray | null;\n const cellRe = new RegExp(TABLE_CELL_RE.source, TABLE_CELL_RE.flags);\n while ((cellMatch = cellRe.exec(rowMatch[1]!)) !== null) {\n cells.push(cellMatch[1]!.trim());\n }\n if (!isAlignmentRow(cells)) {\n rows.push(cells);\n }\n }\n\n if (rows.length === 0) return _match;\n\n const colCount = Math.max(...rows.map((r) => r.length));\n const lines: string[] = [];\n\n for (let i = 0; i < rows.length; i++) {\n const padded = rows[i]!;\n while (padded.length < colCount) padded.push(\"\");\n lines.push(`| ${padded.join(\" | \")} |`);\n if (i === 0) {\n lines.push(`| ${padded.map(() => \"---\").join(\" | \")} |`);\n }\n }\n\n return lines.join(\"\\n\");\n });\n}\n\n// ─── Push 방향: 보존 마커 → Enhanced MD 복원 ───\n\nconst OBSIDIAN_MEDIA_AUDIO_RE = /\\[🔊\\s*([^\\]]*)\\]\\(([^)]+)\\)/g;\nconst OBSIDIAN_MEDIA_VIDEO_RE = /\\[🎬\\s*([^\\]]*)\\]\\(([^)]+)\\)/g;\nconst OBSIDIAN_MEDIA_PDF_RE = /\\[📄\\s*([^\\]]*)\\]\\(([^)]+)\\)/g;\nconst OBSIDIAN_MEDIA_FILE_RE = /\\[📎\\s*([^\\]]*)\\]\\(([^)]+)\\)/g;\n\nfunction restoreMediaTags(content: string): string {\n let result = content;\n\n result = result.replace(OBSIDIAN_MEDIA_AUDIO_RE, (_match, caption: string, src: string) => {\n return `<audio src=\"${src}\">${caption}</audio>`;\n });\n\n result = result.replace(OBSIDIAN_MEDIA_VIDEO_RE, (_match, caption: string, src: string) => {\n return `<video src=\"${src}\">${caption}</video>`;\n });\n\n result = result.replace(OBSIDIAN_MEDIA_PDF_RE, (_match, caption: string, src: string) => {\n return `<pdf src=\"${src}\">${caption}</pdf>`;\n });\n\n result = result.replace(OBSIDIAN_MEDIA_FILE_RE, (_match, caption: string, src: string) => {\n return `<file src=\"${src}\">${caption}</file>`;\n });\n\n return result;\n}\n\nconst OBSIDIAN_TAB_RE = /^> \\[!tab\\]\\s*(.+)\\n((?:> .*\\n?)*)/gm;\n\nfunction restoreTabBlocks(content: string): string {\n return content.replace(OBSIDIAN_TAB_RE, (_match, title: string, body: string) => {\n const unquoted = body\n .split(\"\\n\")\n .map((line) => line.replace(/^> /, \"\"))\n .join(\"\\n\")\n .trim();\n return `<tab title=\"${title}\">${unquoted}</tab>`;\n });\n}\n\nconst OBSIDIAN_UNKNOWN_RE = /%%im-nobsidian:unknown:id=([^&]+)&type=([^%]+)%%/g;\n\nfunction restoreUnknownBlocks(content: string): string {\n return content.replace(OBSIDIAN_UNKNOWN_RE, (_match, id: string, type: string) => {\n return `<unknown id=\"${id}\" type=\"${type}\"/>`;\n });\n}\n\nconst OBSIDIAN_COLOR_RE = /%%im-nobsidian:color:([^%]+)%%([\\s\\S]*?)%%\\/color%%/g;\n\nfunction restoreColorSpans(content: string): string {\n return content.replace(OBSIDIAN_COLOR_RE, (_match, color: string, text: string) => {\n return `<span color=\"${color}\">${text}</span>`;\n });\n}\n\nconst OBSIDIAN_UNDERLINE_RE = /%%im-nobsidian:underline%%([\\s\\S]*?)%%\\/underline%%/g;\n\nfunction restoreUnderlineSpans(content: string): string {\n return content.replace(OBSIDIAN_UNDERLINE_RE, (_match, text: string) => {\n return `<span underline=\"true\">${text}</span>`;\n });\n}\n\nfunction unescapePipes(content: string): string {\n const lines = content.split(\"\\n\");\n const result: string[] = [];\n let inTable = false;\n\n for (const line of lines) {\n if (/^\\|.*\\|$/.test(line.trim()) || /^\\|[\\s-|]+\\|$/.test(line.trim())) {\n inTable = true;\n result.push(line);\n } else {\n if (inTable && line.trim() === \"\") {\n inTable = false;\n } else if (!/^\\|/.test(line.trim())) {\n inTable = false;\n }\n result.push(inTable ? line : line.replace(/\\\\\\|/g, \"|\"));\n }\n }\n\n return result.join(\"\\n\");\n}\n\nfunction ensureCalloutContinuity(content: string): string {\n const lines = content.split(\"\\n\");\n const result: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n if (line.trim() === \"\" && i > 0 && i < lines.length - 1) {\n const prev = result[result.length - 1] ?? \"\";\n const next = lines[i + 1] ?? \"\";\n if (/^>/.test(prev) && /^>/.test(next) && !/^> \\[!/.test(next)) {\n result.push(\">\");\n continue;\n }\n }\n result.push(line);\n }\n return result.join(\"\\n\");\n}\n","import type { Config, DatabaseSyncConfig } from \"../types/config.js\";\nimport type { StateDB } from \"../state/state-db.js\";\nimport type { NotionClient } from \"../notion/client.js\";\nimport type { VaultFS } from \"./vault-fs.js\";\nimport type { ConversionPipeline } from \"../converter/pipeline.js\";\nimport type { FailedOperation } from \"../types/sync.js\";\nimport type { DatabaseViewsConfig } from \"../types/view.js\";\nimport type { PageObjectResponse } from \"@notionhq/client/build/src/api-endpoints.js\";\nimport { PropertyMapper } from \"../notion/property-mapper.js\";\nimport type { ImageHandler } from \"./image-handler.js\";\nimport { computeHash } from \"../utils/hash.js\";\nimport { sanitizeFileName } from \"../utils/sanitize.js\";\nimport { getLogger } from \"../utils/logger.js\";\nimport {\n notionEnhancedToObsidian,\n obsidianToNotionEnhanced,\n} from \"../converter/enhanced-md-converter.js\";\nimport matter from \"gray-matter\";\n\nexport interface DatabaseSyncResult {\n created: number;\n updated: number;\n failed: FailedOperation[];\n}\n\nexport class DatabaseSyncer {\n private readonly propertyMapper = new PropertyMapper();\n\n constructor(\n private readonly config: Config,\n private readonly stateDb: StateDB,\n private readonly notionClient: NotionClient,\n private readonly vaultFs: VaultFS,\n private readonly pipeline: ConversionPipeline,\n private readonly imageHandler: ImageHandler,\n ) {\n this.propertyMapper.setWikilinkResolver({\n resolve: (title: string) => stateDb.resolveWikilink(title)?.notionPageId ?? null,\n resolvePageId: (pageId: string) => stateDb.resolvePageId(pageId)?.title ?? null,\n });\n }\n\n async pullAll(): Promise<DatabaseSyncResult> {\n const databases = this.config.notion.databases;\n if (!databases || databases.length === 0) {\n return { created: 0, updated: 0, failed: [] };\n }\n\n let created = 0;\n let updated = 0;\n const failed: FailedOperation[] = [];\n\n for (const dbConfig of databases) {\n try {\n const result = await this.pullDatabase(dbConfig);\n created += result.created;\n updated += result.updated;\n failed.push(...result.failed);\n } catch (error) {\n getLogger().warn(`[DB Sync] DB ${dbConfig.databaseId} pull 실패:`, error);\n failed.push({\n path: dbConfig.localFolder,\n operation: \"create\",\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return { created, updated, failed };\n }\n\n async pushAll(): Promise<DatabaseSyncResult> {\n const databases = this.config.notion.databases;\n if (!databases || databases.length === 0) {\n return { created: 0, updated: 0, failed: [] };\n }\n\n let created = 0;\n let updated = 0;\n const failed: FailedOperation[] = [];\n\n for (const dbConfig of databases) {\n try {\n const result = await this.pushDatabase(dbConfig);\n created += result.created;\n updated += result.updated;\n failed.push(...result.failed);\n } catch (error) {\n getLogger().warn(`[DB Sync] DB ${dbConfig.databaseId} push 실패:`, error);\n failed.push({\n path: dbConfig.localFolder,\n operation: \"create\",\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return { created, updated, failed };\n }\n\n async pullDatabase(dbConfig: DatabaseSyncConfig): Promise<DatabaseSyncResult> {\n const schema = await this.notionClient.getDatabaseSchema(dbConfig.databaseId);\n this.propertyMapper.loadSchema(schema);\n\n await this.vaultFs.ensureFolder(dbConfig.localFolder);\n\n await this.pullDatabaseViews(dbConfig);\n\n const pages = await this.notionClient.queryAllDatabasePages(\n dbConfig.databaseId,\n dbConfig.pullFilter,\n );\n\n let created = 0;\n let updated = 0;\n const failed: FailedOperation[] = [];\n\n for (const page of pages) {\n try {\n const record = this.stateDb.getByNotionId(page.id);\n\n if (record) {\n if (page.last_edited_time === record.notionLastEdited) continue;\n await this.pullDatabasePage(page, dbConfig);\n updated++;\n } else {\n await this.pullDatabasePage(page, dbConfig);\n created++;\n }\n } catch (error) {\n failed.push({\n path: `${dbConfig.localFolder}/${page.id}`,\n operation: \"create\",\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n getLogger().debug(`[DB Sync] ${dbConfig.localFolder}: ${created} 생성, ${updated} 업데이트`);\n return { created, updated, failed };\n }\n\n private async pullDatabaseViews(dbConfig: DatabaseSyncConfig, force = false): Promise<void> {\n try {\n const configPath = \".im-nobsidian/db-views.json\";\n\n if (!force) {\n try {\n const existing = await this.vaultFs.readFile(configPath);\n const parsed = JSON.parse(existing) as Record<string, DatabaseViewsConfig>;\n if (parsed[dbConfig.databaseId]) return;\n } catch {\n // 파일 없으면 계속 진행\n }\n }\n\n const viewsConfig = await this.notionClient.getDatabaseViewsConfig(dbConfig.databaseId);\n await this.vaultFs.ensureFolder(\".im-nobsidian\");\n\n let allViewsConfigs: Record<string, DatabaseViewsConfig> = {};\n try {\n const existing = await this.vaultFs.readFile(configPath);\n allViewsConfigs = JSON.parse(existing) as Record<string, DatabaseViewsConfig>;\n } catch {\n // 파일 없으면 빈 객체\n }\n\n allViewsConfigs[dbConfig.databaseId] = viewsConfig;\n await this.vaultFs.writeFile(configPath, JSON.stringify(allViewsConfigs, null, 2));\n getLogger().debug(\n `[DB Sync] 뷰 설정 ${viewsConfig.views.length}개 저장: ${dbConfig.databaseId}`,\n );\n } catch (error) {\n getLogger().warn(`[DB Sync] 뷰 설정 Pull 실패 (계속 진행):`, error);\n }\n }\n\n private async pullDatabasePage(\n page: PageObjectResponse,\n dbConfig: DatabaseSyncConfig,\n ): Promise<string> {\n const title = this.notionClient.extractTitle(page);\n const safeName = sanitizeFileName(title);\n\n const properties = this.propertyMapper.fromNotionProperties(\n (page as unknown as { properties: Record<string, unknown> }).properties,\n );\n properties.title = title;\n\n const cover = this.notionClient.extractCover(page);\n const icon = this.notionClient.extractIcon(page);\n\n if (cover) {\n try {\n const coverResult = await this.imageHandler.downloadAllImages(\n `![cover](${cover.url})`,\n `${safeName}-cover`,\n );\n const localUrlMatch = coverResult.content.match(/!\\[cover\\]\\((.+?)\\)/);\n if (localUrlMatch?.[1]) {\n properties.cover = localUrlMatch[1];\n } else {\n properties.cover = cover.url;\n }\n } catch {\n properties.cover = cover.url;\n }\n }\n\n if (icon) {\n properties.icon = icon.value;\n }\n\n let markdown = \"\";\n try {\n const mdResult = await this.notionClient.getPageMarkdown(page.id);\n markdown = notionEnhancedToObsidian(mdResult.markdown);\n } catch {\n // Markdown API 실패 시 빈 내용\n }\n\n if (this.config.conversion.imageDownload === \"immediate\" && markdown) {\n try {\n const imageResult = await this.imageHandler.downloadAllImages(markdown, title);\n markdown = imageResult.content;\n } catch (error) {\n getLogger().warn(`[DB Sync] 이미지 다운로드 실패 (${title}):`, error);\n }\n }\n\n if (markdown) {\n try {\n const fileResult = await this.imageHandler.downloadAllFiles(markdown, title);\n markdown = fileResult.content;\n } catch (error) {\n getLogger().warn(`[DB Sync] 파일 다운로드 실패 (${title}):`, error);\n }\n }\n\n const existingRecord = this.stateDb.getByNotionId(page.id);\n let filePath: string;\n if (existingRecord?.obsidianPath) {\n filePath = existingRecord.obsidianPath;\n } else {\n filePath = `${dbConfig.localFolder}/${safeName}.md`;\n const existingByPath = this.stateDb.getByPath(filePath);\n if (existingByPath && existingByPath.notionPageId !== page.id) {\n filePath = `${dbConfig.localFolder}/${safeName} (${page.id.slice(0, 8)}).md`;\n }\n }\n\n const finalContent = this.pipeline.convertToMarkdown(\n markdown,\n {\n direction: \"pull\",\n path: \"markdown-api\",\n filePath,\n parentMode: \"database\",\n },\n { properties },\n );\n\n await this.vaultFs.ensureFolder(dbConfig.localFolder);\n await this.vaultFs.writeFile(filePath, finalContent);\n\n const hash = computeHash(finalContent);\n this.stateDb.transaction(() => {\n this.stateDb.upsert({\n obsidianPath: filePath,\n notionPageId: page.id,\n notionParentId: dbConfig.databaseId,\n contentHash: hash,\n notionLastEdited: page.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType: \"db-row\",\n status: \"synced\",\n baseSnapshot: Buffer.from(finalContent, \"utf-8\"),\n });\n\n this.stateDb.upsertWikilink({\n obsidianPath: filePath,\n notionPageId: page.id,\n title,\n aliases: extractAliases(properties),\n });\n });\n\n return filePath;\n }\n\n private async pushDatabase(dbConfig: DatabaseSyncConfig): Promise<DatabaseSyncResult> {\n const schema = await this.notionClient.getDatabaseSchema(dbConfig.databaseId);\n this.propertyMapper.loadSchema(schema);\n\n const allFiles = await this.vaultFs.listMarkdownFiles();\n const prefix = dbConfig.localFolder.endsWith(\"/\")\n ? dbConfig.localFolder\n : dbConfig.localFolder + \"/\";\n const dbFiles = allFiles.filter((f) => f.path.startsWith(prefix));\n\n let created = 0;\n let updated = 0;\n const failed: FailedOperation[] = [];\n\n for (const file of dbFiles) {\n try {\n const content = await this.vaultFs.readFile(file.path);\n const hash = computeHash(content);\n\n const record = this.stateDb.getByPath(file.path);\n if (record?.contentHash === hash) continue;\n\n const parsed = matter(content);\n const frontmatter = parsed.data as Record<string, unknown>;\n const body = parsed.content;\n\n const title = (frontmatter.title as string) ?? extractTitleFromPath(file.path);\n delete frontmatter.title;\n\n const notionProps = this.propertyMapper.toNotionProperties(frontmatter, title);\n const enhanced = obsidianToNotionEnhanced(body.trim());\n\n if (record?.notionPageId) {\n await this.notionClient.updatePageProperties(record.notionPageId, notionProps);\n\n try {\n await this.notionClient.replacePageMarkdown(record.notionPageId, enhanced);\n } catch {\n // Markdown API 실패 시 무시\n }\n\n const updatedPage = await this.notionClient.getPage(record.notionPageId);\n this.stateDb.transaction(() => {\n this.stateDb.updateHash(record.id, hash, Buffer.from(content, \"utf-8\"));\n this.stateDb.updateStatus(record.id, \"synced\");\n this.stateDb.setNotionLastEdited(record.id, updatedPage.last_edited_time);\n });\n updated++;\n } else {\n const page = await this.notionClient.createPageWithMarkdown({\n parentId: dbConfig.databaseId,\n parentType: \"database\",\n title,\n markdown: enhanced,\n properties: notionProps,\n });\n\n this.stateDb.transaction(() => {\n this.stateDb.upsert({\n obsidianPath: file.path,\n notionPageId: page.id,\n notionParentId: dbConfig.databaseId,\n contentHash: hash,\n notionLastEdited: page.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType: \"db-row\",\n status: \"synced\",\n baseSnapshot: Buffer.from(content, \"utf-8\"),\n });\n\n this.stateDb.upsertWikilink({\n obsidianPath: file.path,\n notionPageId: page.id,\n title,\n aliases: extractAliases(frontmatter),\n });\n });\n created++;\n }\n } catch (error) {\n failed.push({\n path: file.path,\n operation: \"create\",\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n getLogger().debug(`[DB Sync] ${dbConfig.localFolder}: ${created} 생성, ${updated} 업데이트`);\n return { created, updated, failed };\n }\n}\n\nfunction extractAliases(properties: Record<string, unknown>): string[] {\n const raw = properties.aliases ?? properties.alias;\n if (!raw) return [];\n if (Array.isArray(raw)) return raw.filter((a): a is string => typeof a === \"string\");\n if (typeof raw === \"string\")\n return raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return [];\n}\n\nfunction extractTitleFromPath(filePath: string): string {\n const parts = filePath.split(\"/\");\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.md$/, \"\");\n}\n","import type {\n PushOptions,\n PushResult,\n PullOptions,\n PullResult,\n SyncOptions,\n SyncResult,\n StatusResult,\n SyncRecord,\n LocalChange,\n RemoteChange,\n Conflict,\n FailedOperation,\n} from \"../types/sync.js\";\nimport type { Config } from \"../types/config.js\";\nimport type { StateDB } from \"../state/state-db.js\";\nimport type { NotionClient } from \"../notion/client.js\";\nimport type { PageObjectResponse } from \"@notionhq/client/build/src/api-endpoints.js\";\nimport { Sema } from \"async-sema\";\nimport { ChangeDetector } from \"./change-detector.js\";\nimport type { ConversionPipeline } from \"../converter/pipeline.js\";\nimport { createDefaultPipeline } from \"../converter/pipeline-factory.js\";\nimport { BlockConverter } from \"../converter/block-converter.js\";\nimport { ImageHandler } from \"./image-handler.js\";\nimport { FileHandler } from \"./file-handler.js\";\nimport { DatabaseSyncer } from \"./database-syncer.js\";\nimport { PropertyMapper } from \"../notion/property-mapper.js\";\nimport { computeHash } from \"../utils/hash.js\";\nimport { getLogger } from \"../utils/logger.js\";\nimport { sanitizeFileName } from \"../utils/sanitize.js\";\nimport { notionIdsEqual } from \"../utils/id.js\";\nimport type { VaultFS } from \"./vault-fs.js\";\nimport {\n notionEnhancedToObsidian,\n obsidianToNotionEnhanced,\n} from \"../converter/enhanced-md-converter.js\";\n\nexport class SyncOrchestrator {\n private readonly changeDetector: ChangeDetector;\n private readonly pipeline: ConversionPipeline;\n private readonly blockConverter: BlockConverter;\n private readonly imageHandler: ImageHandler;\n private readonly fileHandler: FileHandler;\n private readonly databaseSyncer: DatabaseSyncer;\n private readonly propertyMapper: PropertyMapper;\n private dbSchemaLoaded = false;\n private _pullImageCount = 0;\n private _pullFileCount = 0;\n\n constructor(\n private readonly config: Config,\n private readonly stateDb: StateDB,\n private readonly notionClient: NotionClient,\n private readonly vaultFs: VaultFS,\n ) {\n this.changeDetector = new ChangeDetector(stateDb);\n this.pipeline = createDefaultPipeline({\n wikilinkResolver: (text) => stateDb.resolveWikilink(text),\n });\n this.blockConverter = new BlockConverter();\n this.imageHandler = new ImageHandler(vaultFs, config.paths.attachments, notionClient);\n this.fileHandler = new FileHandler(vaultFs, notionClient, stateDb);\n this.propertyMapper = new PropertyMapper();\n this.databaseSyncer = new DatabaseSyncer(\n config,\n stateDb,\n notionClient,\n vaultFs,\n this.pipeline,\n this.imageHandler,\n );\n this.propertyMapper.setWikilinkResolver({\n resolve: (title: string) => stateDb.resolveWikilink(title)?.notionPageId ?? null,\n resolvePageId: (pageId: string) => stateDb.resolvePageId(pageId)?.title ?? null,\n });\n\n this.blockConverter.initNotionToMd(this.notionClient.getInternalClient());\n }\n\n async push(options?: PushOptions): Promise<PushResult> {\n const startTime = Date.now();\n\n if (this.config.sync.direction === \"pull\") {\n return { created: 0, updated: 0, deleted: 0, failed: [], duration: Date.now() - startTime };\n }\n\n this.cleanupInterruptedSync();\n this.repairFolderRecords();\n\n const stats = await this.vaultFs.listMarkdownFileStats();\n const changes = await this.changeDetector.detectLocalChangesFast(stats, (path) =>\n this.vaultFs.readFile(path),\n );\n\n const conflictPaths = new Set(this.stateDb.getByStatus(\"conflict\").map((r) => r.obsidianPath));\n const eligible = options?.force ? changes : changes.filter((c) => !conflictPaths.has(c.path));\n\n const dbFolders = (this.config.notion.databases ?? []).map((d) =>\n d.localFolder.endsWith(\"/\") ? d.localFolder : d.localFolder + \"/\",\n );\n const isDbPath = (path: string) => dbFolders.some((prefix) => path.startsWith(prefix));\n\n const excludeSet = options?.excludePaths ? new Set(options.excludePaths) : null;\n const filtered = (\n options?.paths\n ? eligible.filter((c) => options.paths!.some((p) => c.path.startsWith(p)))\n : eligible\n ).filter((c) => !isDbPath(c.path) && (!excludeSet || !excludeSet.has(c.path)));\n\n const hasDbConfigs = (this.config.notion.databases?.length ?? 0) > 0;\n if (filtered.length === 0 && !hasDbConfigs) {\n return { created: 0, updated: 0, deleted: 0, failed: [], duration: Date.now() - startTime };\n }\n\n if (options?.dryRun) {\n const dryCreated = filtered.filter((c) => c.type === \"created\").length;\n const dryUpdated = filtered.filter((c) => c.type === \"modified\" || c.type === \"moved\").length;\n const dryDeleted = filtered.filter((c) => c.type === \"deleted\").length;\n let dryProgress = 0;\n const dryTotal = filtered.length;\n for (const change of filtered) {\n const op =\n change.type === \"created\"\n ? (\"create\" as const)\n : change.type === \"deleted\"\n ? (\"delete\" as const)\n : (\"update\" as const);\n options?.onProgress?.(++dryProgress, dryTotal, { path: change.path, operation: op });\n }\n return {\n created: dryCreated,\n updated: dryUpdated,\n deleted: dryDeleted,\n failed: [],\n duration: Date.now() - startTime,\n };\n }\n\n this.stateDb.setMeta(\"push_in_progress\", \"true\");\n\n const folderPaths = new Set<string>();\n for (const change of filtered) {\n const parts = change.path.split(\"/\");\n if (parts.length > 1) {\n for (let i = 1; i < parts.length; i++) {\n folderPaths.add(parts.slice(0, i).join(\"/\"));\n }\n }\n }\n\n const sortedFolders = [...folderPaths].sort(\n (a, b) => a.split(\"/\").length - b.split(\"/\").length,\n );\n for (const folderPath of sortedFolders) {\n await this.ensureFolderPage(folderPath);\n }\n\n const sema = new Sema(this.config.advanced.concurrency);\n let created = 0;\n let updated = 0;\n let deleted = 0;\n const failed: FailedOperation[] = [];\n\n let completed = 0;\n const total = filtered.length;\n\n const tasks = filtered.map((change) => async () => {\n await sema.acquire();\n try {\n const op =\n change.type === \"created\"\n ? (\"create\" as const)\n : change.type === \"deleted\"\n ? (\"delete\" as const)\n : (\"update\" as const);\n options?.onProgress?.(++completed, total, { path: change.path, operation: op });\n switch (change.type) {\n case \"created\":\n await this.pushCreate(change.path);\n created++;\n break;\n case \"modified\":\n await this.pushUpdate(change.path);\n updated++;\n break;\n case \"moved\":\n await this.pushMove(change.path);\n updated++;\n break;\n case \"deleted\":\n await this.pushDelete(change.path);\n deleted++;\n break;\n }\n } catch (error) {\n failed.push({\n path: change.path,\n operation:\n change.type === \"created\" ? \"create\" : change.type === \"deleted\" ? \"delete\" : \"update\",\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n sema.release();\n }\n });\n\n await Promise.all(tasks.map((t) => t()));\n\n if (failed.length > 0) {\n const retryTargets = failed.splice(0, failed.length);\n getLogger().info(`[Im-Nobsidian] Push ${retryTargets.length}건 재시도 (2초 후)`);\n await new Promise((r) => setTimeout(r, 2000));\n\n for (const target of retryTargets) {\n const change = filtered.find((c) => c.path === target.path);\n if (!change) {\n failed.push(target);\n continue;\n }\n try {\n switch (change.type) {\n case \"created\":\n await this.pushCreate(change.path);\n created++;\n break;\n case \"modified\":\n await this.pushUpdate(change.path);\n updated++;\n break;\n case \"moved\":\n await this.pushMove(change.path);\n updated++;\n break;\n case \"deleted\":\n await this.pushDelete(change.path);\n deleted++;\n break;\n }\n getLogger().info(`[Im-Nobsidian] 재시도 성공: ${change.path}`);\n } catch (error) {\n failed.push({\n path: change.path,\n operation: target.operation,\n error: error instanceof Error ? error.message : String(error),\n });\n getLogger().warn(`[Im-Nobsidian] 재시도 실패: ${change.path}`);\n }\n }\n }\n\n if (this.config.sync.syncFiles !== false) {\n try {\n const fileResults = await this.fileHandler.pushAllFiles();\n if (fileResults.length > 0) {\n getLogger().info(`[Im-Nobsidian] ${fileResults.length}개 파일 업로드 완료`);\n }\n } catch (error) {\n getLogger().warn(\"[Im-Nobsidian] 파일 업로드 중 오류:\", error);\n }\n }\n\n if ((this.config.notion.databases?.length ?? 0) > 0) {\n try {\n const dbResult = await this.databaseSyncer.pushAll();\n created += dbResult.created;\n updated += dbResult.updated;\n failed.push(...dbResult.failed);\n } catch (error) {\n getLogger().warn(\"[Im-Nobsidian] DB Push 중 오류:\", error);\n }\n }\n\n this.stateDb.setMeta(\"last_push_at\", new Date().toISOString());\n this.stateDb.setMeta(\"last_sync_at\", new Date().toISOString());\n this.stateDb.setMeta(\"push_in_progress\", \"\");\n\n return { created, updated, deleted, failed, duration: Date.now() - startTime };\n }\n\n async pull(options?: PullOptions): Promise<PullResult> {\n const startTime = Date.now();\n const emptyResult: PullResult = {\n created: 0,\n updated: 0,\n deleted: 0,\n conflicts: [],\n writtenPaths: [],\n failed: [],\n duration: Date.now() - startTime,\n imageCount: 0,\n fileCount: 0,\n linkCount: 0,\n };\n\n if (this.config.sync.direction === \"push\") {\n return emptyResult;\n }\n\n this.cleanupInterruptedSync();\n\n let created = 0;\n let updated = 0;\n let deleted = 0;\n this._pullImageCount = 0;\n this._pullFileCount = 0;\n const conflicts: Conflict[] = [];\n const writtenPaths: string[] = [];\n const failed: FailedOperation[] = [];\n\n const lastPull = this.stateDb.getMeta(\"last_pull_at\") ?? this.stateDb.getMeta(\"last_sync_at\");\n const trackedCount = this.stateDb.getAll().length;\n const remoteChanges =\n !this.isDatabaseMode && lastPull && trackedCount > 0 && !options?.force\n ? await this.detectRemoteChangesIncremental(lastPull)\n : await this.detectRemoteChanges();\n\n const filtered = options?.paths\n ? remoteChanges.filter((c) => {\n const record = this.stateDb.getByNotionId(c.pageId);\n return record && options.paths!.some((p) => record.obsidianPath.startsWith(p));\n })\n : remoteChanges;\n\n if (filtered.length === 0 && (this.config.notion.databases?.length ?? 0) === 0) {\n const hasDbResults = await this.pullDiscoveredDatabases(writtenPaths, failed);\n if (!hasDbResults.created && !hasDbResults.updated) {\n this.stateDb.setMeta(\"last_pull_at\", new Date().toISOString());\n this.stateDb.setMeta(\"last_sync_at\", new Date().toISOString());\n this.stateDb.setMeta(\"pull_in_progress\", \"\");\n return emptyResult;\n }\n this.stateDb.setMeta(\"last_pull_at\", new Date().toISOString());\n this.stateDb.setMeta(\"last_sync_at\", new Date().toISOString());\n this.stateDb.setMeta(\"pull_in_progress\", \"\");\n return {\n created: hasDbResults.created,\n updated: hasDbResults.updated,\n deleted: 0,\n conflicts: [],\n writtenPaths,\n failed,\n duration: Date.now() - startTime,\n imageCount: 0,\n fileCount: 0,\n linkCount: 0,\n };\n }\n if (filtered.length === 0) {\n return emptyResult;\n }\n\n if (options?.dryRun) {\n const dryCreated = filtered.filter((c) => c.type === \"created\").length;\n const dryUpdated = filtered.filter((c) => c.type === \"modified\").length;\n const dryDeleted = filtered.filter((c) => c.type === \"deleted\").length;\n let dryProgress = 0;\n const dryTotal = filtered.length;\n for (const change of filtered) {\n const op =\n change.type === \"created\"\n ? (\"create\" as const)\n : change.type === \"deleted\"\n ? (\"delete\" as const)\n : (\"update\" as const);\n const record = this.stateDb.getByNotionId(change.pageId);\n const displayPath = record?.obsidianPath ?? change.pageId;\n options?.onProgress?.(++dryProgress, dryTotal, { path: displayPath, operation: op });\n }\n return {\n created: dryCreated,\n updated: dryUpdated,\n deleted: dryDeleted,\n conflicts: [],\n writtenPaths: [],\n failed: [],\n duration: Date.now() - startTime,\n imageCount: 0,\n fileCount: 0,\n linkCount: 0,\n };\n }\n\n this.stateDb.setMeta(\"pull_in_progress\", \"true\");\n\n const sema = new Sema(this.config.advanced.concurrency);\n\n let pullCompleted = 0;\n const pullTotal = filtered.length;\n\n const tasks = filtered.map((change) => async () => {\n await sema.acquire();\n try {\n let resultPath: string | undefined;\n switch (change.type) {\n case \"created\": {\n const path = await this.pullCreate(change.pageId);\n writtenPaths.push(path);\n created++;\n resultPath = path;\n break;\n }\n case \"modified\": {\n const result = await this.pullUpdate(change);\n if (result.conflict) {\n conflicts.push(result.conflict);\n } else if (result.path) {\n writtenPaths.push(result.path);\n updated++;\n }\n resultPath = result.path;\n break;\n }\n case \"deleted\": {\n const record = this.stateDb.getByNotionId(change.pageId);\n resultPath = record?.obsidianPath;\n const path = await this.pullDelete(change.pageId);\n if (path) {\n deleted++;\n resultPath = path;\n }\n break;\n }\n }\n const record = this.stateDb.getByNotionId(change.pageId);\n const displayPath = resultPath ?? record?.obsidianPath ?? change.pageId;\n const op =\n change.type === \"created\"\n ? (\"create\" as const)\n : change.type === \"deleted\"\n ? (\"delete\" as const)\n : (\"update\" as const);\n options?.onProgress?.(++pullCompleted, pullTotal, { path: displayPath, operation: op });\n } catch (error) {\n const record = this.stateDb.getByNotionId(change.pageId);\n failed.push({\n path: record?.obsidianPath ?? change.pageId,\n operation:\n change.type === \"created\" ? \"create\" : change.type === \"deleted\" ? \"delete\" : \"update\",\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n sema.release();\n }\n });\n\n await Promise.all(tasks.map((t) => t()));\n\n if (failed.length > 0) {\n const retryTargets = failed.splice(0, failed.length);\n getLogger().info(`[Im-Nobsidian] Pull ${retryTargets.length}건 재시도 (2초 후)`);\n await new Promise((r) => setTimeout(r, 2000));\n\n for (const target of retryTargets) {\n const change = filtered.find((c) => {\n const record = this.stateDb.getByNotionId(c.pageId);\n return (record?.obsidianPath ?? c.pageId) === target.path;\n });\n if (!change) {\n failed.push(target);\n continue;\n }\n try {\n switch (change.type) {\n case \"created\": {\n const path = await this.pullCreate(change.pageId);\n writtenPaths.push(path);\n created++;\n break;\n }\n case \"modified\": {\n const result = await this.pullUpdate(change);\n if (result.conflict) {\n conflicts.push(result.conflict);\n } else if (result.path) {\n writtenPaths.push(result.path);\n updated++;\n }\n break;\n }\n case \"deleted\": {\n const path = await this.pullDelete(change.pageId);\n if (path) deleted++;\n break;\n }\n }\n getLogger().info(`[Im-Nobsidian] 재시도 성공: ${target.path}`);\n } catch (error) {\n failed.push({\n path: target.path,\n operation: target.operation,\n error: error instanceof Error ? error.message : String(error),\n });\n getLogger().warn(`[Im-Nobsidian] 재시도 실패: ${target.path}`);\n }\n }\n }\n\n if ((this.config.notion.databases?.length ?? 0) > 0) {\n try {\n const dbResult = await this.databaseSyncer.pullAll();\n created += dbResult.created;\n updated += dbResult.updated;\n failed.push(...dbResult.failed);\n if (dbResult.created + dbResult.updated > 0) {\n const dbPaths = this.stateDb\n .getByStatus(\"synced\")\n .filter((r) => r.fileType === \"db-row\")\n .map((r) => r.obsidianPath);\n writtenPaths.push(...dbPaths.slice(-dbResult.created - dbResult.updated));\n }\n } catch (error) {\n getLogger().warn(\"[Im-Nobsidian] DB Pull 중 오류:\", error);\n }\n }\n\n {\n const dbDiscovery = await this.pullDiscoveredDatabases(writtenPaths, failed);\n created += dbDiscovery.created;\n updated += dbDiscovery.updated;\n }\n\n const linkTargetPaths = writtenPaths.length > 0 ? writtenPaths : [];\n const linkCount =\n linkTargetPaths.length > 0 ? await this.resolveNotionLinks(linkTargetPaths) : 0;\n\n this.stateDb.setMeta(\"last_pull_at\", new Date().toISOString());\n this.stateDb.setMeta(\"last_sync_at\", new Date().toISOString());\n this.stateDb.setMeta(\"pull_in_progress\", \"\");\n\n return {\n created,\n updated,\n deleted,\n conflicts,\n writtenPaths,\n failed,\n duration: Date.now() - startTime,\n imageCount: this._pullImageCount,\n fileCount: this._pullFileCount,\n linkCount,\n };\n }\n\n async sync(options?: SyncOptions): Promise<SyncResult> {\n const startTime = Date.now();\n const pullResult = await this.pull(options);\n const pushResult = await this.push({\n ...options,\n paths: options?.paths,\n excludePaths: pullResult.writtenPaths,\n });\n\n return {\n pull: pullResult,\n push: pushResult,\n conflicts: pullResult.conflicts,\n duration: Date.now() - startTime,\n };\n }\n\n async status(): Promise<StatusResult> {\n const files = await this.vaultFs.listMarkdownFiles();\n const localChanges = this.changeDetector.detectLocalChanges(files);\n const remoteChanges = await this.detectRemoteChanges();\n const conflictRecords = this.stateDb.getByStatus(\"conflict\");\n const lastSyncAt = this.stateDb.getMeta(\"last_sync_at\");\n\n const conflicts: Conflict[] = await this.buildConflictsFromRecords(\n conflictRecords,\n localChanges,\n remoteChanges,\n );\n\n return {\n localChanges,\n remoteChanges,\n conflicts,\n conflictRecords,\n pendingOperations: conflictRecords.length,\n lastSyncAt,\n };\n }\n\n async statusLocal(): Promise<StatusResult> {\n const stats = await this.vaultFs.listMarkdownFileStats();\n const localChanges = await this.changeDetector.detectLocalChangesFast(stats, (path) =>\n this.vaultFs.readFile(path),\n );\n const conflictRecords = this.stateDb.getByStatus(\"conflict\");\n const lastSyncAt = this.stateDb.getMeta(\"last_sync_at\");\n\n return {\n localChanges,\n remoteChanges: [],\n conflicts: [],\n conflictRecords,\n pendingOperations: conflictRecords.length,\n lastSyncAt,\n };\n }\n\n async fetch(): Promise<{\n newPages: number;\n deletedPages: number;\n modifiedPages: number;\n duration: number;\n }> {\n const startTime = Date.now();\n const changes = await this.detectRemoteChanges();\n this.stateDb.setMeta(\"last_fetch_at\", new Date().toISOString());\n return {\n newPages: changes.filter((c) => c.type === \"created\").length,\n modifiedPages: changes.filter((c) => c.type === \"modified\").length,\n deletedPages: changes.filter((c) => c.type === \"deleted\").length,\n duration: Date.now() - startTime,\n };\n }\n\n private async buildConflictsFromRecords(\n records: SyncRecord[],\n localChanges: LocalChange[],\n remoteChanges: RemoteChange[],\n ): Promise<Conflict[]> {\n const conflicts: Conflict[] = [];\n\n for (const record of records) {\n const localChange = localChanges.find((c) => c.path === record.obsidianPath) ?? {\n path: record.obsidianPath,\n type: \"modified\" as const,\n currentHash: record.contentHash,\n previousHash: record.contentHash,\n };\n\n const remoteChange = remoteChanges.find((c) => c.pageId === record.notionPageId) ?? {\n pageId: record.notionPageId ?? \"\",\n type: \"modified\" as const,\n lastEdited: record.notionLastEdited ?? \"\",\n previousEdited: null,\n };\n\n let localContent = \"\";\n try {\n localContent = await this.vaultFs.readFile(record.obsidianPath);\n } catch {\n // 파일이 삭제된 경우\n }\n\n let remoteContent = \"\";\n if (record.notionPageId) {\n try {\n remoteContent = await this.fetchPageMarkdown(record.notionPageId);\n } catch {\n // 페이지가 삭제된 경우\n }\n }\n\n conflicts.push({\n syncRecord: record,\n localChange,\n remoteChange,\n baseContent: record.baseSnapshot?.toString(\"utf-8\") ?? null,\n localContent,\n remoteContent,\n });\n }\n\n return conflicts;\n }\n\n private get isDatabaseMode(): boolean {\n return this.config.notion.parentMode === \"database\" && !!this.config.notion.databaseId;\n }\n\n private async discoverChildDatabases(): Promise<Array<{ dbId: string; parentPageId: string }>> {\n const allDbs: Array<{ dbId: string; parentPageId: string }> = [];\n const trackedPages = this.stateDb.getAll().filter((r) => r.notionPageId);\n const pageIds = [this.config.notion.rootPageId, ...trackedPages.map((r) => r.notionPageId!)];\n const seen = new Set<string>();\n\n for (const parentId of pageIds) {\n if (seen.has(parentId)) continue;\n seen.add(parentId);\n try {\n const dbIds = await this.notionClient.getChildDatabaseIds(parentId);\n for (const dbId of dbIds) {\n allDbs.push({ dbId, parentPageId: parentId });\n }\n } catch {\n // 접근 권한 없는 블록 무시\n }\n }\n\n return allDbs;\n }\n\n private async pullDiscoveredDatabases(\n writtenPaths: string[],\n failed: FailedOperation[],\n ): Promise<{ created: number; updated: number }> {\n if (this.isDatabaseMode) return { created: 0, updated: 0 };\n\n let created = 0;\n let updated = 0;\n\n try {\n const cachedRaw = this.stateDb.getMeta(\"discovered_dbs\");\n let dbConfigs: Array<{ databaseId: string; localFolder: string; titleProperty: string }> = [];\n\n if (cachedRaw) {\n try {\n dbConfigs = JSON.parse(cachedRaw);\n } catch {\n dbConfigs = [];\n }\n }\n\n if (dbConfigs.length === 0) {\n const discoveredDbs = await this.discoverChildDatabases();\n const configuredIds = new Set(\n (this.config.notion.databases ?? []).map((d) => d.databaseId.replace(/-/g, \"\")),\n );\n const newDbs = discoveredDbs.filter((db) => !configuredIds.has(db.dbId.replace(/-/g, \"\")));\n for (const { dbId, parentPageId } of newDbs) {\n try {\n const dbTitle = await this.notionClient.getDatabaseTitle(dbId);\n const parentEntry = parentPageId ? this.stateDb.getByNotionId(parentPageId) : null;\n let parentFolder = \"\";\n if (parentEntry?.obsidianPath) {\n const obsPath = parentEntry.obsidianPath;\n if (obsPath.endsWith(\".md\")) {\n const parts = obsPath.split(\"/\");\n parts.pop();\n parentFolder = parts.length > 0 ? parts.join(\"/\") : obsPath.replace(/\\.md$/, \"\");\n } else {\n parentFolder = obsPath;\n }\n }\n let safeName: string;\n if (dbTitle) {\n safeName = dbTitle.replace(/[^a-zA-Z0-9가-힣\\s_-]/g, \"\").replace(/\\s+/g, \"-\");\n } else {\n const parentName = parentFolder.split(\"/\").pop() || \"\";\n safeName = parentName ? `${parentName}-DB` : `db-${dbId.slice(0, 8)}`;\n }\n if (!parentFolder) parentFolder = \"databases\";\n dbConfigs.push({\n databaseId: dbId,\n localFolder: `${parentFolder}/${safeName}`,\n titleProperty: \"Name\",\n });\n } catch (error) {\n getLogger().warn(`[Im-Nobsidian] 자동 발견 DB ${dbId} 동기화 실패:`, error);\n }\n }\n if (dbConfigs.length > 0) {\n this.stateDb.setMeta(\"discovered_dbs\", JSON.stringify(dbConfigs));\n }\n }\n\n for (const dbConfig of dbConfigs) {\n try {\n const dbResult = await this.databaseSyncer.pullDatabase(dbConfig);\n created += dbResult.created;\n updated += dbResult.updated;\n failed.push(...dbResult.failed);\n if (dbResult.created + dbResult.updated > 0) {\n const dbPaths = this.stateDb\n .getByStatus(\"synced\")\n .filter((r) => r.fileType === \"db-row\")\n .map((r) => r.obsidianPath);\n writtenPaths.push(...dbPaths.slice(-dbResult.created - dbResult.updated));\n }\n } catch (error) {\n getLogger().warn(`[Im-Nobsidian] DB ${dbConfig.databaseId} 동기화 실패:`, error);\n }\n }\n } catch (error) {\n getLogger().warn(\"[Im-Nobsidian] child_database 자동 발견 실패:\", error);\n }\n\n return { created, updated };\n }\n\n private async resolveNotionLinks(paths: string[]): Promise<number> {\n let totalResolved = 0;\n const allRecords = this.stateDb.getAll();\n const idToTitle = new Map<string, string>();\n for (const r of allRecords) {\n if (r.notionPageId && r.obsidianPath) {\n const title = r.obsidianPath.replace(/\\.md$/, \"\").split(\"/\").pop() ?? \"\";\n const cleanId = r.notionPageId.replace(/-/g, \"\");\n idToTitle.set(cleanId, title);\n idToTitle.set(r.notionPageId, title);\n }\n }\n if (idToTitle.size === 0) return 0;\n\n for (const filePath of paths) {\n if (!filePath.endsWith(\".md\")) continue;\n try {\n let content = await this.vaultFs.readFile(filePath);\n let changed = false;\n\n const resolved = content.replace(/\\[\\[notion:([a-f0-9-]+)\\]\\]/g, (_match, id: string) => {\n const title = idToTitle.get(id.replace(/-/g, \"\"));\n if (title) {\n totalResolved++;\n changed = true;\n return `[[${title}]]`;\n }\n return _match;\n });\n content = resolved;\n\n const resolved2 = content.replace(\n /\\[([^\\]]+)\\]\\(\\/([a-f0-9]{32})\\?pvs=\\d+\\)/g,\n (_match, text: string, id: string) => {\n const title = idToTitle.get(id);\n if (title) {\n totalResolved++;\n changed = true;\n return `[[${title}|${text}]]`;\n }\n return _match;\n },\n );\n content = resolved2;\n\n if (changed) {\n await this.vaultFs.writeFile(filePath, content);\n }\n } catch {\n // 파일 읽기/쓰기 실패 무시\n }\n }\n return totalResolved;\n }\n\n private async ensureDbSchema(): Promise<void> {\n if (this.dbSchemaLoaded || !this.isDatabaseMode) return;\n const schema = await this.notionClient.getDatabaseSchema(this.config.notion.databaseId!);\n this.propertyMapper.loadSchema(schema);\n this.dbSchemaLoaded = true;\n }\n\n private async pushCreate(path: string): Promise<void> {\n const content = await this.vaultFs.readFile(path);\n const title = extractTitle(path);\n const parentId = await this.resolveNotionParent(path);\n\n const selectedPath = this.pipeline.selectPath(content);\n if (selectedPath === \"block-api\") {\n getLogger().warn(\n `[Im-Nobsidian] \"${path}\" contains block-api features (inline-db/column/toggle) — converted with reduced fidelity in v0.1.0`,\n );\n }\n\n const conversionResult = this.pipeline.convertToNotion(content, {\n direction: \"push\",\n path: selectedPath,\n filePath: path,\n parentMode: this.config.notion.parentMode,\n });\n\n let effectiveParentId = parentId;\n let effectiveParentType: \"page\" | \"database\" = \"page\";\n let effectiveProperties = conversionResult.properties;\n\n if (this.isDatabaseMode) {\n await this.ensureDbSchema();\n effectiveParentId = this.config.notion.databaseId!;\n effectiveParentType = \"database\";\n effectiveProperties = this.propertyMapper.toNotionProperties(\n conversionResult.properties,\n title,\n );\n }\n\n const page = await this.pushCreatePage(\n effectiveParentId,\n effectiveParentType,\n title,\n conversionResult.content,\n effectiveProperties,\n );\n\n await this.imageHandler.uploadAndAppendImages(page.id, conversionResult.images);\n\n const hash = computeHash(content);\n const fileStat = await this.vaultFs.getFileStat(path);\n\n this.stateDb.transaction(() => {\n this.stateDb.upsert({\n obsidianPath: path,\n notionPageId: page.id,\n notionParentId: parentId,\n contentHash: hash,\n notionLastEdited: page.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType: this.isFolderNote(path) ? \"folder-note\" : \"file\",\n status: \"synced\",\n baseSnapshot: Buffer.from(content, \"utf-8\"),\n localMtime: fileStat?.mtime ?? null,\n localFileSize: fileStat?.size ?? null,\n });\n\n const aliases = extractAliases(conversionResult.properties);\n this.stateDb.upsertWikilink({\n obsidianPath: path,\n notionPageId: page.id,\n title,\n aliases,\n });\n\n this.stateDb.storePreserveMarkers(path, conversionResult.preserveMarkers);\n });\n }\n\n private async pushUpdate(path: string): Promise<void> {\n const content = await this.vaultFs.readFile(path);\n const record = this.stateDb.getByPath(path);\n if (!record?.notionPageId) return;\n\n const updatePath = this.pipeline.selectPath(content);\n if (updatePath === \"block-api\") {\n getLogger().warn(\n `[Im-Nobsidian] \"${path}\" contains block-api features (inline-db/column/toggle) — converted with reduced fidelity in v0.1.0`,\n );\n }\n\n const conversionResult = this.pipeline.convertToNotion(content, {\n direction: \"push\",\n path: updatePath,\n filePath: path,\n parentMode: this.config.notion.parentMode,\n });\n\n await this.pushUpdatePage(record.notionPageId, conversionResult.content, record.baseSnapshot);\n\n await this.imageHandler.uploadAndAppendImages(record.notionPageId, conversionResult.images);\n\n let propsToUpdate: Record<string, unknown> | undefined;\n if (\n this.isDatabaseMode &&\n conversionResult.properties &&\n Object.keys(conversionResult.properties).length > 0\n ) {\n await this.ensureDbSchema();\n const title = extractTitle(path);\n propsToUpdate = this.propertyMapper.toNotionProperties(conversionResult.properties, title);\n } else if (conversionResult.properties?.title) {\n const titleStr = String(conversionResult.properties.title);\n propsToUpdate = {\n title: { title: [{ text: { content: titleStr } }] },\n };\n }\n\n let lastEditedTime = new Date().toISOString();\n if (propsToUpdate && Object.keys(propsToUpdate).length > 0) {\n const updatedPage = await this.notionClient.updatePageProperties(\n record.notionPageId,\n propsToUpdate,\n );\n lastEditedTime = updatedPage.last_edited_time;\n }\n\n const hash = computeHash(content);\n const fileStat = await this.vaultFs.getFileStat(path);\n const title = extractTitle(path);\n const aliases = extractAliases(conversionResult.properties);\n this.stateDb.transaction(() => {\n this.stateDb.updateHash(record.id, hash, Buffer.from(content, \"utf-8\"));\n this.stateDb.updateStatus(record.id, \"synced\");\n this.stateDb.setNotionLastEdited(record.id, lastEditedTime);\n if (fileStat) {\n this.stateDb.updateStatCache(record.id, fileStat.mtime, fileStat.size);\n }\n this.stateDb.storePreserveMarkers(path, conversionResult.preserveMarkers);\n this.stateDb.upsertWikilink({\n obsidianPath: path,\n notionPageId: record.notionPageId!,\n title,\n aliases,\n });\n });\n }\n\n private async pushDelete(path: string): Promise<void> {\n const record = this.stateDb.getByPath(path);\n if (!record?.notionPageId) return;\n\n if (this.config.sync.deleteSync) {\n await this.notionClient.archivePage(record.notionPageId);\n this.stateDb.delete(record.id);\n } else {\n this.stateDb.updateStatus(record.id, \"pending\");\n }\n }\n\n private async pushMove(path: string): Promise<void> {\n const record = this.stateDb.getByPath(path);\n if (!record?.notionPageId) return;\n\n const newParentId = await this.resolveNotionParent(path);\n const currentParentId = record.notionParentId;\n\n if (currentParentId && !notionIdsEqual(newParentId, currentParentId)) {\n try {\n const parentType = this.isDatabaseMode ? \"database\" : \"page\";\n await this.notionClient.movePage(record.notionPageId, newParentId, parentType);\n this.stateDb.setNotionParentId(record.id, newParentId);\n } catch {\n getLogger().warn(`[Im-Nobsidian] Move API 실패 — \"${path}\" 내용만 업데이트합니다`);\n }\n }\n\n await this.pushUpdate(path);\n }\n\n private async detectRemoteChanges(): Promise<RemoteChange[]> {\n const changes: RemoteChange[] = [];\n const lastPull = this.stateDb.getMeta(\"last_pull_at\");\n const syncedRecords = this.stateDb.getAll();\n const trackedPageIds = new Set(\n syncedRecords.filter((r) => r.notionPageId).map((r) => r.notionPageId!),\n );\n\n let remotePages: Array<{ id: string; last_edited_time: string }>;\n if (this.isDatabaseMode) {\n const allPages: Array<{ id: string; last_edited_time: string }> = [];\n let cursor: string | undefined;\n do {\n const result = await this.notionClient.queryDatabase(this.config.notion.databaseId!, {\n startCursor: cursor,\n });\n allPages.push(\n ...result.results.map((p) => ({ id: p.id, last_edited_time: p.last_edited_time })),\n );\n cursor = result.nextCursor ?? undefined;\n } while (cursor);\n remotePages = allPages;\n } else {\n remotePages = await this.notionClient.getChildPagesRecursive(this.config.notion.rootPageId);\n }\n\n for (const page of remotePages) {\n const record = this.stateDb.getByNotionId(page.id);\n\n if (!record) {\n changes.push({\n pageId: page.id,\n type: \"created\",\n lastEdited: page.last_edited_time,\n previousEdited: null,\n });\n } else if (page.last_edited_time !== record.notionLastEdited) {\n changes.push({\n pageId: page.id,\n type: \"modified\",\n lastEdited: page.last_edited_time,\n previousEdited: record.notionLastEdited,\n });\n }\n\n trackedPageIds.delete(page.id);\n }\n\n if (this.config.sync.deleteSync && lastPull) {\n for (const orphanId of trackedPageIds) {\n const record = syncedRecords.find((r) => r.notionPageId === orphanId);\n if (record) {\n changes.push({\n pageId: orphanId,\n type: \"deleted\",\n lastEdited: new Date().toISOString(),\n previousEdited: record.notionLastEdited,\n });\n }\n }\n }\n\n return changes;\n }\n\n private async detectRemoteChangesIncremental(since: string): Promise<RemoteChange[]> {\n const changes: RemoteChange[] = [];\n const recentPages = await this.notionClient.searchRecentPages(since);\n\n for (const page of recentPages) {\n const record = this.stateDb.getByNotionId(page.id);\n if (!record) {\n try {\n const fullPage = await this.notionClient.getPage(page.id);\n const parentId = await this.extractParentId(fullPage);\n if (parentId && this.isTrackedParent(parentId)) {\n changes.push({\n pageId: page.id,\n type: \"created\",\n lastEdited: page.last_edited_time,\n previousEdited: null,\n });\n }\n } catch {\n // inaccessible page\n }\n continue;\n }\n if (page.last_edited_time !== record.notionLastEdited) {\n changes.push({\n pageId: page.id,\n type: \"modified\",\n lastEdited: page.last_edited_time,\n previousEdited: record.notionLastEdited,\n });\n }\n }\n\n return changes;\n }\n\n private isTrackedParent(parentId: string): boolean {\n if (notionIdsEqual(parentId, this.config.notion.rootPageId)) return true;\n return !!this.stateDb.getByNotionId(parentId);\n }\n\n private async pullCreate(pageId: string): Promise<string> {\n const page = await this.notionClient.getPage(pageId);\n const title = this.notionClient.extractTitle(page);\n const safeName = sanitizeFileName(title);\n\n const parentPath = await this.resolveParentPath(page);\n\n const firstChildren = await this.notionClient.listChildren(pageId, { pageSize: 100 });\n const hasChildPages = firstChildren.results.some((b) => \"type\" in b && b.type === \"child_page\");\n\n const markdown = await this.fetchPageMarkdown(pageId);\n const hasContent = markdown.trim().length > 0;\n\n let filePath: string;\n let fileType: \"file\" | \"folder-note\" | \"folder-only\";\n\n if (hasChildPages && hasContent) {\n const folderPath = parentPath ? `${parentPath}/${safeName}` : safeName;\n filePath = await this.resolveUniqueFilePath(`${folderPath}/${safeName}.md`);\n fileType = \"folder-note\";\n await this.vaultFs.ensureFolder(folderPath);\n } else if (hasChildPages && !hasContent) {\n const folderPath = parentPath ? `${parentPath}/${safeName}` : safeName;\n filePath = await this.resolveUniqueFilePath(`${folderPath}/${safeName}.md`);\n fileType = \"folder-only\";\n await this.vaultFs.ensureFolder(folderPath);\n } else {\n const basePath = parentPath ? `${parentPath}/${safeName}.md` : `${safeName}.md`;\n filePath = await this.resolveUniqueFilePath(basePath);\n fileType = \"file\";\n }\n\n let properties: Record<string, unknown>;\n if (this.isDatabaseMode) {\n await this.ensureDbSchema();\n properties = this.propertyMapper.fromNotionProperties(\n (page as unknown as { properties: Record<string, unknown> }).properties,\n );\n } else {\n properties = this.notionClient.extractProperties(page);\n }\n properties.title = title;\n\n let processedMarkdown = markdown;\n if (this.config.conversion.imageDownload === \"immediate\") {\n const imageResult = await this.imageHandler.downloadAllImages(markdown, title);\n processedMarkdown = imageResult.content;\n this._pullImageCount += imageResult.downloads.length;\n }\n\n const fileResult = await this.imageHandler.downloadAllFiles(processedMarkdown, title);\n processedMarkdown = fileResult.content;\n this._pullFileCount += fileResult.downloads.length;\n\n const finalContent = this.pipeline.convertToMarkdown(\n processedMarkdown,\n {\n direction: \"pull\",\n path: \"markdown-api\",\n filePath,\n parentMode: this.config.notion.parentMode,\n },\n { properties },\n );\n\n await this.vaultFs.writeFile(filePath, finalContent);\n\n const hash = computeHash(finalContent);\n const pullStat = await this.vaultFs.getFileStat(filePath);\n const resolvedParentId = await this.extractParentId(page);\n this.stateDb.transaction(() => {\n this.stateDb.upsert({\n obsidianPath: filePath,\n notionPageId: pageId,\n notionParentId: resolvedParentId,\n contentHash: hash,\n notionLastEdited: page.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType,\n status: \"synced\",\n baseSnapshot: Buffer.from(finalContent, \"utf-8\"),\n localMtime: pullStat?.mtime ?? null,\n localFileSize: pullStat?.size ?? null,\n });\n\n const aliases = extractAliases(properties);\n this.stateDb.upsertWikilink({\n obsidianPath: filePath,\n notionPageId: pageId,\n title,\n aliases,\n });\n });\n\n return filePath;\n }\n\n private async pullUpdate(change: RemoteChange): Promise<{ path?: string; conflict?: Conflict }> {\n const record = this.stateDb.getByNotionId(change.pageId);\n if (!record) return {};\n\n const page = await this.notionClient.getPage(change.pageId);\n let markdown = await this.fetchPageMarkdown(change.pageId);\n\n const title = this.notionClient.extractTitle(page);\n\n let properties: Record<string, unknown>;\n if (this.isDatabaseMode) {\n await this.ensureDbSchema();\n properties = this.propertyMapper.fromNotionProperties(\n (page as unknown as { properties: Record<string, unknown> }).properties,\n );\n } else {\n properties = this.notionClient.extractProperties(page);\n }\n properties.title = title;\n\n if (this.config.conversion.imageDownload === \"immediate\") {\n const imageResult = await this.imageHandler.downloadAllImages(markdown, title);\n markdown = imageResult.content;\n this._pullImageCount += imageResult.downloads.length;\n }\n\n const fileResult = await this.imageHandler.downloadAllFiles(markdown, title);\n markdown = fileResult.content;\n this._pullFileCount += fileResult.downloads.length;\n\n const savedMarkers = this.stateDb.getPreserveMarkers(record.obsidianPath);\n const remoteContent = this.pipeline.convertToMarkdown(\n markdown,\n {\n direction: \"pull\",\n path: \"markdown-api\",\n filePath: record.obsidianPath,\n parentMode: this.config.notion.parentMode,\n },\n { properties, preserveMarkers: savedMarkers.length > 0 ? savedMarkers : undefined },\n );\n\n let localContent: string;\n try {\n localContent = await this.vaultFs.readFile(record.obsidianPath);\n } catch {\n localContent = \"\";\n }\n\n const localHash = computeHash(localContent);\n const localModified = localHash !== record.contentHash;\n\n if (localModified) {\n const strategy = this.config.sync.conflictStrategy;\n\n if (strategy === \"remote-first\") {\n // 리모트 우선: 로컬 변경 무시, 리모트 내용으로 덮어쓰기\n } else if (strategy === \"local-first\") {\n return { path: record.obsidianPath };\n } else {\n const conflict: Conflict = {\n syncRecord: record,\n localChange: {\n path: record.obsidianPath,\n type: \"modified\",\n currentHash: localHash,\n previousHash: record.contentHash,\n },\n remoteChange: change,\n baseContent: record.baseSnapshot?.toString(\"utf-8\") ?? null,\n localContent,\n remoteContent,\n };\n\n this.stateDb.updateStatus(record.id, \"conflict\");\n return { conflict };\n }\n }\n\n await this.vaultFs.writeFile(record.obsidianPath, remoteContent);\n\n const updateStat = await this.vaultFs.getFileStat(record.obsidianPath);\n const newHash = computeHash(remoteContent);\n this.stateDb.upsert({\n obsidianPath: record.obsidianPath,\n notionPageId: change.pageId,\n notionParentId: record.notionParentId,\n contentHash: newHash,\n notionLastEdited: page.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: record.syncDirection,\n fileType: record.fileType,\n status: \"synced\",\n baseSnapshot: Buffer.from(remoteContent, \"utf-8\"),\n localMtime: updateStat?.mtime ?? null,\n localFileSize: updateStat?.size ?? null,\n });\n\n return { path: record.obsidianPath };\n }\n\n private async pullDelete(pageId: string): Promise<string | null> {\n const record = this.stateDb.getByNotionId(pageId);\n if (!record) return null;\n\n if (this.config.sync.deleteSync) {\n try {\n await this.vaultFs.deleteFile(record.obsidianPath);\n } catch {\n // 이미 삭제된 경우 무시\n }\n }\n\n this.stateDb.delete(record.id);\n return record.obsidianPath;\n }\n\n private async ensureFolderPage(folderPath: string): Promise<void> {\n const folderNotePath = `${folderPath}/${folderPath.split(\"/\").pop()}.md`;\n const folderNoteRecord = this.stateDb.getByPath(folderNotePath);\n\n if (folderNoteRecord?.notionPageId) {\n const existing = this.stateDb.getByPath(folderPath);\n if (existing) this.stateDb.delete(existing.id);\n return;\n }\n\n const existing = this.stateDb.getByPath(folderPath);\n if (existing?.notionPageId) return;\n\n const parts = folderPath.split(\"/\");\n const folderName = parts[parts.length - 1]!;\n\n let parentId = this.config.notion.rootPageId;\n if (parts.length > 1) {\n const parentPath = parts.slice(0, -1).join(\"/\");\n await this.ensureFolderPage(parentPath);\n const parentNotePath = `${parentPath}/${parentPath.split(\"/\").pop()}.md`;\n const parentNote = this.stateDb.getByPath(parentNotePath);\n const parentRecord = this.stateDb.getByPath(parentPath);\n if (parentNote?.notionPageId) {\n parentId = parentNote.notionPageId;\n } else if (parentRecord?.notionPageId) {\n parentId = parentRecord.notionPageId;\n }\n }\n\n const folderPage = await this.notionClient.createPage({\n parentId,\n parentType: \"page\",\n title: folderName,\n });\n\n this.stateDb.upsert({\n obsidianPath: folderPath,\n notionPageId: folderPage.id,\n notionParentId: parentId,\n contentHash: \"\",\n notionLastEdited: folderPage.last_edited_time,\n localLastModified: new Date().toISOString(),\n syncDirection: \"both\",\n fileType: \"folder-note\",\n status: \"synced\",\n });\n }\n\n private async resolveNotionParent(filePath: string): Promise<string> {\n const parts = filePath.split(\"/\");\n if (parts.length <= 1) return this.config.notion.rootPageId;\n\n const folderPath = parts.slice(0, -1).join(\"/\");\n const folderRecord = this.stateDb.getByPath(folderPath);\n if (folderRecord?.notionPageId) return folderRecord.notionPageId;\n\n const folderName = parts[parts.length - 2]!;\n const folderNotePath = `${folderPath}/${folderName}.md`;\n const folderNoteRecord = this.stateDb.getByPath(folderNotePath);\n if (folderNoteRecord?.notionPageId) return folderNoteRecord.notionPageId;\n\n return this.config.notion.rootPageId;\n }\n\n private repairFolderRecords(): void {\n const allRecords = this.stateDb.getAll();\n const folderRecords = allRecords.filter(\n (r) => r.fileType === \"folder-note\" && !r.obsidianPath.endsWith(\".md\"),\n );\n for (const folder of folderRecords) {\n const folderName = folder.obsidianPath.split(\"/\").pop()!;\n const folderNotePath = `${folder.obsidianPath}/${folderName}.md`;\n const noteRecord = this.stateDb.getByPath(folderNotePath);\n if (noteRecord?.notionPageId) {\n this.stateDb.delete(folder.id);\n }\n }\n }\n\n private isFolderNote(filePath: string): boolean {\n const parts = filePath.split(\"/\");\n if (parts.length < 2) return false;\n const fileName = parts[parts.length - 1]!.replace(/\\.md$/, \"\");\n const folderName = parts[parts.length - 2]!;\n return fileName === folderName;\n }\n\n private async resolveParentPath(page: PageObjectResponse): Promise<string> {\n const parentId = await this.extractParentId(page);\n if (!parentId || notionIdsEqual(parentId, this.config.notion.rootPageId)) return \"\";\n\n const parentRecord = this.stateDb.getByNotionId(parentId);\n if (parentRecord) {\n if (parentRecord.fileType === \"folder-note\" || parentRecord.fileType === \"folder-only\") {\n const pathParts = parentRecord.obsidianPath.split(\"/\");\n pathParts.pop();\n return pathParts.join(\"/\");\n }\n const pathParts = parentRecord.obsidianPath.split(\"/\");\n pathParts.pop();\n const parentDir = pathParts.join(\"/\");\n return (\n parentDir ||\n sanitizeFileName(this.notionClient.extractTitle(await this.notionClient.getPage(parentId)))\n );\n }\n\n try {\n const parentPage = await this.notionClient.getPage(parentId);\n const parentTitle = this.notionClient.extractTitle(parentPage);\n const grandparentPath = await this.resolveParentPath(parentPage);\n const safeName = sanitizeFileName(parentTitle);\n return grandparentPath ? `${grandparentPath}/${safeName}` : safeName;\n } catch {\n return \"\";\n }\n }\n\n private async pushCreatePage(\n parentId: string,\n parentType: \"page\" | \"database\",\n title: string,\n markdownContent: string,\n properties?: Record<string, unknown>,\n ): Promise<PageObjectResponse> {\n if (this.config.conversion.preferMarkdownApi !== false) {\n const enhanced = obsidianToNotionEnhanced(markdownContent);\n return await this.notionClient.createPageWithMarkdown({\n parentId,\n parentType,\n title,\n markdown: enhanced,\n properties,\n });\n }\n\n const blocks = this.blockConverter.markdownToNotionBlocks(markdownContent);\n const page = await this.notionClient.createPage({\n parentId,\n parentType,\n title,\n properties,\n });\n if (blocks.length > 0) {\n await this.notionClient.appendChildren(page.id, blocks);\n }\n return page;\n }\n\n private async pushUpdatePage(\n pageId: string,\n markdownContent: string,\n _baseSnapshot?: Buffer | null,\n ): Promise<void> {\n if (this.config.conversion.preferMarkdownApi !== false) {\n const enhanced = obsidianToNotionEnhanced(markdownContent);\n await this.notionClient.replacePageMarkdown(pageId, enhanced);\n return;\n }\n\n const blocks = this.blockConverter.markdownToNotionBlocks(markdownContent);\n const existingBlocks = await this.notionClient.fetchAllChildren(pageId);\n\n if (blocks.length > 0) {\n await this.notionClient.appendChildren(pageId, blocks);\n }\n const deleteSema = new Sema(this.config.advanced.concurrency);\n await Promise.all(\n existingBlocks.map(async (block) => {\n await deleteSema.acquire();\n try {\n await this.notionClient.deleteBlock(block.id);\n } finally {\n deleteSema.release();\n }\n }),\n );\n }\n\n private async fetchPageMarkdown(pageId: string): Promise<string> {\n if (this.config.conversion.preferMarkdownApi !== false) {\n try {\n const result = await this.notionClient.getPageMarkdown(pageId);\n return notionEnhancedToObsidian(result.markdown);\n } catch {\n // Markdown API 실패 시 blocks API fallback\n }\n }\n return this.blockConverter.notionBlocksToMarkdown(pageId);\n }\n\n private async extractParentId(page: PageObjectResponse): Promise<string | null> {\n const parent = page.parent as {\n type: string;\n page_id?: string;\n database_id?: string;\n block_id?: string;\n };\n if (parent.type === \"page_id\") return parent.page_id ?? null;\n if (parent.type === \"database_id\") return parent.database_id ?? null;\n if (parent.type === \"block_id\" && parent.block_id) {\n return this.resolveBlockToPageId(parent.block_id);\n }\n return null;\n }\n\n private async resolveBlockToPageId(blockId: string): Promise<string | null> {\n for (let i = 0; i < 10; i++) {\n try {\n const block = await this.notionClient.getBlock(blockId);\n const bp = (\n block as unknown as { parent: { type: string; page_id?: string; block_id?: string } }\n ).parent;\n if (bp.type === \"page_id\") return bp.page_id ?? null;\n if (bp.type === \"block_id\" && bp.block_id) {\n blockId = bp.block_id;\n continue;\n }\n return null;\n } catch {\n return null;\n }\n }\n return null;\n }\n\n private cleanupInterruptedSync(): void {\n const pushInProgress = this.stateDb.getMeta(\"push_in_progress\");\n const pullInProgress = this.stateDb.getMeta(\"pull_in_progress\");\n\n if (pushInProgress === \"true\") {\n getLogger().warn(\"[Im-Nobsidian] 이전 push가 비정상 종료됨 — 플래그 정리\");\n this.stateDb.setMeta(\"push_in_progress\", \"\");\n }\n if (pullInProgress === \"true\") {\n getLogger().warn(\"[Im-Nobsidian] 이전 pull이 비정상 종료됨 — 플래그 정리\");\n this.stateDb.setMeta(\"pull_in_progress\", \"\");\n }\n }\n\n private async resolveUniqueFilePath(basePath: string): Promise<string> {\n if (!(await this.vaultFs.exists(basePath))) return basePath;\n\n const dir = basePath.lastIndexOf(\"/\") >= 0 ? basePath.slice(0, basePath.lastIndexOf(\"/\")) : \"\";\n const ext = \".md\";\n const name = basePath.slice(dir ? dir.length + 1 : 0, -ext.length);\n\n for (let i = 1; i <= 99; i++) {\n const candidate = dir ? `${dir}/${name} (${i})${ext}` : `${name} (${i})${ext}`;\n if (!(await this.vaultFs.exists(candidate))) return candidate;\n }\n\n return basePath;\n }\n}\n\nfunction extractTitle(filePath: string): string {\n const parts = filePath.split(\"/\");\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.md$/, \"\");\n}\n\nfunction extractAliases(properties: Record<string, unknown>): string[] {\n const raw = properties.aliases ?? properties.alias;\n if (!raw) return [];\n if (Array.isArray(raw)) return raw.filter((a): a is string => typeof a === \"string\");\n if (typeof raw === \"string\")\n return raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return [];\n}\n","import { readFile, writeFile, unlink, rename, mkdir, readdir, stat } from \"node:fs/promises\";\nimport { readFileSync } from \"node:fs\";\nimport { join, relative, dirname } from \"node:path\";\nimport type { VaultFS, NonMdFileInfo, FileStatInfo } from \"./vault-fs.js\";\nimport type { FileInfo } from \"./change-detector.js\";\n\nexport interface PathFilterConfig {\n readonly include?: string[];\n readonly exclude?: string[];\n}\n\nexport class NodeVaultFS implements VaultFS {\n private readonly includePatterns: string[];\n private readonly excludePatterns: string[];\n\n constructor(\n private readonly rootPath: string,\n pathConfig?: PathFilterConfig,\n ) {\n this.includePatterns = pathConfig?.include ?? [];\n const configExclude = pathConfig?.exclude ?? [];\n const ignorePatterns = this.loadImNobsidianIgnore();\n this.excludePatterns = [...configExclude, ...ignorePatterns];\n }\n\n private loadImNobsidianIgnore(): string[] {\n try {\n const ignorePath = join(this.rootPath, \".im-nobsidian-ignore\");\n const content = readFileSync(ignorePath, \"utf-8\");\n return content\n .split(\"\\n\")\n .map((line: string) => line.trim())\n .filter((line: string) => line && !line.startsWith(\"#\"));\n } catch {\n return [];\n }\n }\n\n async readFile(path: string): Promise<string> {\n const fullPath = join(this.rootPath, path);\n return readFile(fullPath, \"utf-8\");\n }\n\n async readBinary(path: string): Promise<Buffer> {\n const fullPath = join(this.rootPath, path);\n return readFile(fullPath);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n const fullPath = join(this.rootPath, path);\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, content, \"utf-8\");\n }\n\n async writeBinary(path: string, data: Buffer): Promise<void> {\n const fullPath = join(this.rootPath, path);\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, data);\n }\n\n async deleteFile(path: string): Promise<void> {\n const fullPath = join(this.rootPath, path);\n await unlink(fullPath);\n }\n\n async moveFile(from: string, to: string): Promise<void> {\n const fromPath = join(this.rootPath, from);\n const toPath = join(this.rootPath, to);\n await mkdir(dirname(toPath), { recursive: true });\n await rename(fromPath, toPath);\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n await stat(join(this.rootPath, path));\n return true;\n } catch {\n return false;\n }\n }\n\n async ensureFolder(path: string): Promise<void> {\n await mkdir(join(this.rootPath, path), { recursive: true });\n }\n\n async listMarkdownFiles(): Promise<FileInfo[]> {\n const files: FileInfo[] = [];\n await this.walkDir(this.rootPath, files);\n return files;\n }\n\n async listMarkdownFileStats(): Promise<FileStatInfo[]> {\n const stats: FileStatInfo[] = [];\n await this.walkDirStats(this.rootPath, stats);\n return stats;\n }\n\n async getFileStat(path: string): Promise<FileStatInfo | null> {\n try {\n const fullPath = join(this.rootPath, path);\n const fileStat = await stat(fullPath);\n return { path, mtime: fileStat.mtime.toISOString(), size: fileStat.size };\n } catch {\n return null;\n }\n }\n\n async listNonMarkdownFiles(): Promise<NonMdFileInfo[]> {\n const files: NonMdFileInfo[] = [];\n await this.walkDirNonMd(this.rootPath, files);\n return files;\n }\n\n private matchesPattern(relativePath: string, pattern: string): boolean {\n if (pattern === \"**/*\" || pattern === \"**\") return true;\n\n if (pattern.endsWith(\"/**\")) {\n const dir = pattern.slice(0, -3);\n return relativePath.startsWith(dir + \"/\") || relativePath === dir;\n } else if (pattern.startsWith(\"*.\")) {\n const ext = pattern.slice(1);\n return relativePath.endsWith(ext);\n } else if (pattern.includes(\"*\")) {\n const regexStr = pattern\n .replace(/\\./g, \"\\\\.\")\n .replace(/\\*\\*/g, \"{{GLOBSTAR}}\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\{\\{GLOBSTAR\\}\\}/g, \".*\");\n return new RegExp(\"^\" + regexStr + \"$\").test(relativePath);\n } else {\n return relativePath === pattern || relativePath.startsWith(pattern + \"/\");\n }\n }\n\n private isExcluded(relativePath: string): boolean {\n if (this.includePatterns.length > 0) {\n const included = this.includePatterns.some((p) => this.matchesPattern(relativePath, p));\n if (!included) return true;\n }\n\n return this.excludePatterns.some((p) => this.matchesPattern(relativePath, p));\n }\n\n private async walkDirNonMd(dir: string, result: NonMdFileInfo[]): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.name.startsWith(\".\")) continue;\n\n const relativePath = relative(this.rootPath, fullPath);\n\n if (this.isExcluded(relativePath)) continue;\n\n if (entry.isDirectory()) {\n await this.walkDirNonMd(fullPath, result);\n } else if (entry.isFile() && !entry.name.endsWith(\".md\")) {\n const fileStat = await stat(fullPath);\n result.push({\n path: relativePath,\n size: fileStat.size,\n mtime: fileStat.mtime.toISOString(),\n });\n }\n }\n }\n\n private async walkDirStats(dir: string, result: FileStatInfo[]): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.name.startsWith(\".\")) continue;\n\n const relativePath = relative(this.rootPath, fullPath);\n\n if (this.isExcluded(relativePath)) continue;\n\n if (entry.isDirectory()) {\n await this.walkDirStats(fullPath, result);\n } else if (entry.isFile() && entry.name.endsWith(\".md\")) {\n const fileStat = await stat(fullPath);\n result.push({\n path: relativePath,\n mtime: fileStat.mtime.toISOString(),\n size: fileStat.size,\n });\n }\n }\n }\n\n private async walkDir(dir: string, result: FileInfo[]): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.name.startsWith(\".\")) continue;\n\n const relativePath = relative(this.rootPath, fullPath);\n\n if (this.isExcluded(relativePath)) continue;\n\n if (entry.isDirectory()) {\n await this.walkDir(fullPath, result);\n } else if (entry.isFile() && entry.name.endsWith(\".md\")) {\n const content = await readFile(fullPath, \"utf-8\");\n const fileStat = await stat(fullPath);\n\n result.push({\n path: relativePath,\n content,\n mtime: fileStat.mtime.toISOString(),\n });\n }\n }\n }\n}\n","import type { Processor, ProcessorInput, ProcessorOutput } from \"../../types/convert.js\";\n\nconst INLINE_DB_START = /%% im-nobsidian:inline-db:([^\\s]+) %%/g;\nconst INLINE_DB_END = /%% im-nobsidian:end %%/g;\n\nexport class InlineDBParser implements Processor {\n readonly name = \"InlineDBParser\";\n readonly order = 40;\n\n process(input: ProcessorInput): ProcessorOutput {\n const inlineDbBlocks: InlineDBBlock[] = [];\n const content = input.content;\n\n const startMatches = [...content.matchAll(INLINE_DB_START)];\n for (const match of startMatches) {\n const startIdx = match.index!;\n const params = parseParams(match[1]!);\n\n const afterStart = content.indexOf(\"\\n\", startIdx) + 1;\n const endMatch = INLINE_DB_END.exec(content.slice(afterStart));\n\n if (endMatch) {\n const tableContent = content.slice(afterStart, afterStart + endMatch.index!);\n inlineDbBlocks.push({\n id: params[\"id\"] ?? \"\",\n title: params[\"title\"] ?? \"\",\n tableMarkdown: tableContent.trim(),\n startIdx,\n endIdx: afterStart + endMatch.index! + endMatch[0].length,\n });\n }\n\n INLINE_DB_END.lastIndex = 0;\n }\n\n return {\n content,\n metadata: {\n ...input.metadata,\n inlineDbBlocks,\n },\n };\n }\n}\n\ninterface InlineDBBlock {\n readonly id: string;\n readonly title: string;\n readonly tableMarkdown: string;\n readonly startIdx: number;\n readonly endIdx: number;\n}\n\nfunction parseParams(paramString: string): Record<string, string> {\n const params: Record<string, string> = {};\n for (const pair of paramString.split(\"&\")) {\n const [key, value] = pair.split(\"=\");\n if (key && value) {\n params[key] = decodeURIComponent(value);\n }\n }\n return params;\n}\n","export interface MergeResult {\n readonly success: boolean;\n readonly merged: string;\n readonly conflicts: MergeConflictRegion[];\n}\n\nexport interface MergeConflictRegion {\n readonly localLines: string[];\n readonly remoteLines: string[];\n}\n\nexport function threeWayMerge(base: string, local: string, remote: string): MergeResult {\n const baseLines = base.split(\"\\n\");\n const localLines = local.split(\"\\n\");\n const remoteLines = remote.split(\"\\n\");\n\n const localDiff = computeDiff(baseLines, localLines);\n const remoteDiff = computeDiff(baseLines, remoteLines);\n\n const merged: string[] = [];\n const conflicts: MergeConflictRegion[] = [];\n let success = true;\n\n let baseIdx = 0;\n\n while (baseIdx < baseLines.length || localDiff.length > 0 || remoteDiff.length > 0) {\n const localChange = localDiff.find((d) => d.baseStart === baseIdx);\n const remoteChange = remoteDiff.find((d) => d.baseStart === baseIdx);\n\n if (localChange && remoteChange) {\n if (arraysEqual(localChange.newLines, remoteChange.newLines)) {\n merged.push(...localChange.newLines);\n } else {\n success = false;\n conflicts.push({\n localLines: localChange.newLines,\n remoteLines: remoteChange.newLines,\n });\n merged.push(\"<<<<<<< LOCAL\");\n merged.push(...localChange.newLines);\n merged.push(\"=======\");\n merged.push(...remoteChange.newLines);\n merged.push(\">>>>>>> REMOTE\");\n }\n\n baseIdx = Math.max(localChange.baseEnd, remoteChange.baseEnd);\n localDiff.splice(localDiff.indexOf(localChange), 1);\n remoteDiff.splice(remoteDiff.indexOf(remoteChange), 1);\n } else if (localChange) {\n merged.push(...localChange.newLines);\n baseIdx = localChange.baseEnd;\n localDiff.splice(localDiff.indexOf(localChange), 1);\n } else if (remoteChange) {\n merged.push(...remoteChange.newLines);\n baseIdx = remoteChange.baseEnd;\n remoteDiff.splice(remoteDiff.indexOf(remoteChange), 1);\n } else {\n if (baseIdx < baseLines.length) {\n merged.push(baseLines[baseIdx]!);\n }\n baseIdx++;\n }\n }\n\n return {\n success,\n merged: merged.join(\"\\n\"),\n conflicts,\n };\n}\n\ninterface DiffHunk {\n baseStart: number;\n baseEnd: number;\n newLines: string[];\n}\n\nfunction computeDiff(base: string[], modified: string[]): DiffHunk[] {\n const hunks: DiffHunk[] = [];\n let baseIdx = 0;\n let modIdx = 0;\n\n while (baseIdx < base.length && modIdx < modified.length) {\n if (base[baseIdx] === modified[modIdx]) {\n baseIdx++;\n modIdx++;\n } else {\n const hunkStart = baseIdx;\n const newLines: string[] = [];\n\n while (modIdx < modified.length && base[baseIdx] !== modified[modIdx]) {\n newLines.push(modified[modIdx]!);\n modIdx++;\n }\n baseIdx++;\n\n hunks.push({ baseStart: hunkStart, baseEnd: baseIdx, newLines });\n }\n }\n\n if (modIdx < modified.length) {\n hunks.push({\n baseStart: baseIdx,\n baseEnd: base.length,\n newLines: modified.slice(modIdx),\n });\n }\n\n return hunks;\n}\n\nfunction arraysEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false;\n return a.every((val, idx) => val === b[idx]);\n}\n","import type { Conflict, ConflictStrategy } from \"../types/sync.js\";\nimport type { StateDB } from \"../state/state-db.js\";\nimport type { VaultFS } from \"../sync/vault-fs.js\";\nimport { threeWayMerge } from \"./merger.js\";\nimport { computeHash } from \"../utils/hash.js\";\n\nexport type ResolutionChoice = \"local\" | \"remote\" | \"merge\" | \"duplicate\";\n\nexport interface ResolutionResult {\n readonly path: string;\n readonly choice: ResolutionChoice;\n readonly success: boolean;\n readonly mergeHadConflicts?: boolean;\n}\n\nexport class ConflictResolver {\n constructor(\n private readonly stateDb: StateDB,\n private readonly vaultFs: VaultFS,\n ) {}\n\n async resolve(conflict: Conflict, choice: ResolutionChoice): Promise<ResolutionResult> {\n switch (choice) {\n case \"local\":\n return this.resolveLocal(conflict);\n case \"remote\":\n return this.resolveRemote(conflict);\n case \"merge\":\n return this.resolveMerge(conflict);\n case \"duplicate\":\n return this.resolveDuplicate(conflict);\n }\n }\n\n async resolveByStrategy(\n conflict: Conflict,\n strategy: ConflictStrategy,\n ): Promise<ResolutionResult> {\n switch (strategy) {\n case \"local-first\":\n return this.resolve(conflict, \"local\");\n case \"remote-first\":\n return this.resolve(conflict, \"remote\");\n case \"duplicate\":\n return this.resolve(conflict, \"duplicate\");\n case \"manual\":\n return this.resolve(conflict, \"merge\");\n }\n }\n\n async resolveAll(conflicts: Conflict[], strategy: ConflictStrategy): Promise<ResolutionResult[]> {\n const results: ResolutionResult[] = [];\n for (const conflict of conflicts) {\n const result = await this.resolveByStrategy(conflict, strategy);\n results.push(result);\n }\n return results;\n }\n\n private async resolveLocal(conflict: Conflict): Promise<ResolutionResult> {\n const hash = computeHash(conflict.localContent);\n this.stateDb.updateHash(\n conflict.syncRecord.id,\n hash,\n Buffer.from(conflict.localContent, \"utf-8\"),\n );\n this.stateDb.updateStatus(conflict.syncRecord.id, \"synced\");\n\n return { path: conflict.syncRecord.obsidianPath, choice: \"local\", success: true };\n }\n\n private async resolveRemote(conflict: Conflict): Promise<ResolutionResult> {\n await this.vaultFs.writeFile(conflict.syncRecord.obsidianPath, conflict.remoteContent);\n\n const hash = computeHash(conflict.remoteContent);\n this.stateDb.updateHash(\n conflict.syncRecord.id,\n hash,\n Buffer.from(conflict.remoteContent, \"utf-8\"),\n );\n this.stateDb.updateStatus(conflict.syncRecord.id, \"synced\");\n\n return { path: conflict.syncRecord.obsidianPath, choice: \"remote\", success: true };\n }\n\n private async resolveMerge(conflict: Conflict): Promise<ResolutionResult> {\n const base = conflict.baseContent ?? \"\";\n const mergeResult = threeWayMerge(base, conflict.localContent, conflict.remoteContent);\n\n await this.vaultFs.writeFile(conflict.syncRecord.obsidianPath, mergeResult.merged);\n\n const hash = computeHash(mergeResult.merged);\n this.stateDb.updateHash(conflict.syncRecord.id, hash, Buffer.from(mergeResult.merged, \"utf-8\"));\n\n if (mergeResult.success) {\n this.stateDb.updateStatus(conflict.syncRecord.id, \"synced\");\n }\n\n return {\n path: conflict.syncRecord.obsidianPath,\n choice: \"merge\",\n success: mergeResult.success,\n mergeHadConflicts: !mergeResult.success,\n };\n }\n\n private async resolveDuplicate(conflict: Conflict): Promise<ResolutionResult> {\n const originalPath = conflict.syncRecord.obsidianPath;\n const ext = originalPath.endsWith(\".md\") ? \".md\" : \"\";\n const baseName = originalPath.replace(/\\.md$/, \"\");\n const conflictPath = `${baseName}.conflict${ext}`;\n\n await this.vaultFs.writeFile(conflictPath, conflict.remoteContent);\n\n const localHash = computeHash(conflict.localContent);\n this.stateDb.updateHash(\n conflict.syncRecord.id,\n localHash,\n Buffer.from(conflict.localContent, \"utf-8\"),\n );\n this.stateDb.updateStatus(conflict.syncRecord.id, \"synced\");\n\n return { path: originalPath, choice: \"duplicate\", success: true };\n }\n\n generateDiff(conflict: Conflict): string {\n const localLines = conflict.localContent.split(\"\\n\");\n const remoteLines = conflict.remoteContent.split(\"\\n\");\n const lines: string[] = [];\n\n lines.push(`--- local: ${conflict.syncRecord.obsidianPath}`);\n lines.push(`+++ remote: Notion (${conflict.remoteChange.pageId})`);\n lines.push(\"\");\n\n const maxLen = Math.max(localLines.length, remoteLines.length);\n for (let i = 0; i < maxLen; i++) {\n const localLine = localLines[i];\n const remoteLine = remoteLines[i];\n\n if (localLine === remoteLine) {\n lines.push(` ${localLine ?? \"\"}`);\n } else {\n if (localLine !== undefined) lines.push(`- ${localLine}`);\n if (remoteLine !== undefined) lines.push(`+ ${remoteLine}`);\n }\n }\n\n return lines.join(\"\\n\");\n }\n}\n","import { sanitizeFileName } from \"../utils/sanitize.js\";\n\nexport interface NotionPageNode {\n readonly id: string;\n readonly title: string;\n readonly hasContent: boolean;\n readonly hasChildren: boolean;\n readonly isDatabase: boolean;\n readonly parentId: string | null;\n readonly children: NotionPageNode[];\n}\n\nexport type MappingType = \"file\" | \"folder-note\" | \"folder-only\" | \"database-folder\";\n\nexport interface MappingResult {\n readonly type: MappingType;\n readonly obsidianPath: string;\n readonly folderPath?: string;\n readonly notePath?: string;\n readonly schemaPath?: string;\n}\n\nexport class TreeMapper {\n mapNotionToObsidian(root: NotionPageNode, basePath: string = \"\"): MappingResult[] {\n const results: MappingResult[] = [];\n this.mapRecursive(root, basePath, results);\n return results;\n }\n\n private mapRecursive(node: NotionPageNode, parentPath: string, results: MappingResult[]): void {\n const safeName = sanitizeFileName(node.title || \"_untitled\");\n const currentPath = parentPath ? `${parentPath}/${safeName}` : safeName;\n\n if (node.isDatabase) {\n results.push({\n type: \"database-folder\",\n obsidianPath: `${currentPath}/`,\n folderPath: `${currentPath}/`,\n schemaPath: `${currentPath}/_schema.yml`,\n });\n } else if (node.hasContent && node.hasChildren) {\n results.push({\n type: \"folder-note\",\n obsidianPath: `${currentPath}/${safeName}.md`,\n folderPath: `${currentPath}/`,\n notePath: `${currentPath}/${safeName}.md`,\n });\n } else if (!node.hasContent && node.hasChildren) {\n results.push({\n type: \"folder-only\",\n obsidianPath: `${currentPath}/`,\n folderPath: `${currentPath}/`,\n });\n } else {\n results.push({\n type: \"file\",\n obsidianPath: `${currentPath}.md`,\n });\n }\n\n for (const child of node.children) {\n this.mapRecursive(child, currentPath, results);\n }\n }\n\n mapObsidianToNotion(entries: FileSystemEntry[], parentPageId: string): PageCreationPlan[] {\n const plans: PageCreationPlan[] = [];\n this.planRecursive(entries, parentPageId, plans);\n return plans;\n }\n\n private planRecursive(\n entries: FileSystemEntry[],\n parentPageId: string,\n plans: PageCreationPlan[],\n ): void {\n for (const entry of entries) {\n if (entry.isDirectory) {\n const folderNote = this.findFolderNote(entry);\n\n if (folderNote) {\n plans.push({\n type: \"page-with-children\",\n title: entry.name,\n parentPageId,\n contentSource: folderNote.path,\n hasContent: true,\n });\n\n const childEntries = entry.children.filter((c) => c.path !== folderNote.path);\n this.planRecursive(childEntries, `placeholder:${entry.path}`, plans);\n } else {\n plans.push({\n type: \"empty-page-with-children\",\n title: entry.name,\n parentPageId,\n hasContent: false,\n });\n this.planRecursive(entry.children, `placeholder:${entry.path}`, plans);\n }\n } else if (entry.name.endsWith(\".md\") && !entry.name.startsWith(\"_\")) {\n plans.push({\n type: \"leaf-page\",\n title: entry.name.replace(/\\.md$/, \"\"),\n parentPageId,\n contentSource: entry.path,\n hasContent: true,\n });\n }\n }\n }\n\n private findFolderNote(dir: FileSystemEntry): FileSystemEntry | null {\n return dir.children.find((c) => c.name === `${dir.name}.md` || c.name === \"index.md\") ?? null;\n }\n\n determineFileType(page: {\n hasContent: boolean;\n hasChildren: boolean;\n isDatabase: boolean;\n }): MappingType {\n if (page.isDatabase) return \"database-folder\";\n if (page.hasContent && page.hasChildren) return \"folder-note\";\n if (!page.hasContent && page.hasChildren) return \"folder-only\";\n return \"file\";\n }\n}\n\nexport interface FileSystemEntry {\n readonly name: string;\n readonly path: string;\n readonly isDirectory: boolean;\n readonly children: FileSystemEntry[];\n}\n\nexport interface PageCreationPlan {\n readonly type: \"page-with-children\" | \"empty-page-with-children\" | \"leaf-page\";\n readonly title: string;\n readonly parentPageId: string;\n readonly contentSource?: string;\n readonly hasContent: boolean;\n}\n","import { watch } from \"chokidar\";\nimport type { FSWatcher } from \"chokidar\";\n\nexport type WatchEvent = \"add\" | \"change\" | \"unlink\";\n\nexport interface WatchCallback {\n (event: WatchEvent, path: string): void;\n}\n\nexport class FileWatcher {\n private watcher: FSWatcher | null = null;\n\n constructor(\n private readonly rootPath: string,\n private readonly callback: WatchCallback,\n ) {}\n\n start(): void {\n this.watcher = watch(this.rootPath, {\n ignored: [/(^|[/\\\\])\\./, \"**/node_modules/**\", \"**/.im-nobsidian/**\"],\n persistent: true,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 500,\n pollInterval: 100,\n },\n });\n\n this.watcher.on(\"add\", (path) => this.callback(\"add\", path));\n this.watcher.on(\"change\", (path) => this.callback(\"change\", path));\n this.watcher.on(\"unlink\", (path) => this.callback(\"unlink\", path));\n }\n\n async stop(): Promise<void> {\n if (this.watcher) {\n await this.watcher.close();\n this.watcher = null;\n }\n }\n}\n","import type { SyncOrchestrator } from \"../sync/orchestrator.js\";\nimport type { SyncResult } from \"../types/sync.js\";\nimport { FileWatcher } from \"./file-watcher.js\";\nimport type { WatchEvent } from \"./file-watcher.js\";\n\nexport interface WatchSyncOptions {\n readonly debounceMs?: number;\n readonly syncDirection?: \"push\" | \"pull\" | \"both\";\n readonly onSyncStart?: () => void;\n readonly onSyncComplete?: (result: SyncResult) => void;\n readonly onSyncError?: (error: Error) => void;\n readonly onFileChange?: (event: WatchEvent, path: string) => void;\n}\n\nconst DEFAULT_DEBOUNCE_MS = 2000;\n\nexport class WatchSyncService {\n private readonly debounceMs: number;\n private readonly options: WatchSyncOptions;\n private watcher: FileWatcher | null = null;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private pendingChanges: Map<string, WatchEvent> = new Map();\n private syncing = false;\n private syncQueued = false;\n private running = false;\n\n constructor(\n private readonly rootPath: string,\n private readonly orchestrator: SyncOrchestrator,\n options: WatchSyncOptions = {},\n ) {\n this.debounceMs = options.debounceMs ?? DEFAULT_DEBOUNCE_MS;\n this.options = options;\n }\n\n start(): void {\n if (this.running) return;\n\n this.running = true;\n this.watcher = new FileWatcher(this.rootPath, (event, path) => {\n this.handleFileChange(event, path);\n });\n this.watcher.start();\n }\n\n async stop(): Promise<void> {\n if (!this.running) return;\n\n this.running = false;\n this.clearDebounce();\n this.pendingChanges.clear();\n\n if (this.watcher) {\n await this.watcher.stop();\n this.watcher = null;\n }\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n isSyncing(): boolean {\n return this.syncing;\n }\n\n getPendingCount(): number {\n return this.pendingChanges.size;\n }\n\n private handleFileChange(event: WatchEvent, path: string): void {\n if (!path.endsWith(\".md\")) return;\n\n this.pendingChanges.set(path, event);\n this.options.onFileChange?.(event, path);\n this.scheduleSync();\n }\n\n private scheduleSync(): void {\n this.clearDebounce();\n\n this.debounceTimer = setTimeout(() => {\n this.debounceTimer = null;\n void this.executeSync();\n }, this.debounceMs);\n }\n\n private clearDebounce(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n }\n\n private async executeSync(): Promise<void> {\n if (this.syncing) {\n this.syncQueued = true;\n return;\n }\n\n this.syncing = true;\n const changedPaths = [...this.pendingChanges.keys()];\n this.pendingChanges.clear();\n\n try {\n this.options.onSyncStart?.();\n\n const result = await this.orchestrator.sync({\n paths: changedPaths.length > 0 ? changedPaths : undefined,\n });\n\n this.options.onSyncComplete?.(result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.options.onSyncError?.(err);\n } finally {\n this.syncing = false;\n\n if (this.syncQueued) {\n this.syncQueued = false;\n void this.executeSync();\n }\n }\n }\n}\n","import type { ViewConfig } from \"../types/view.js\";\nimport type { DBEntry, PropertyValue, GroupedEntries, CalendarEntry } from \"./types.js\";\n\nexport function sortEntries(\n entries: DBEntry[],\n sorts: NonNullable<ViewConfig[\"sorts\"]>,\n): DBEntry[] {\n if (sorts.length === 0) return entries;\n\n return [...entries].sort((a, b) => {\n for (const sort of sorts) {\n const key = sort.property ?? sort.timestamp;\n if (!key) continue;\n\n const aVal = a.properties[key] ?? null;\n const bVal = b.properties[key] ?? null;\n const cmp = compareValues(aVal, bVal);\n if (cmp !== 0) return sort.direction === \"ascending\" ? cmp : -cmp;\n }\n return 0;\n });\n}\n\nexport function groupEntries(\n entries: DBEntry[],\n groupByProperty: string,\n options?: { sort?: \"ascending\" | \"descending\"; hideEmptyGroups?: boolean },\n): GroupedEntries[] {\n const groups = new Map<string, DBEntry[]>();\n const ungrouped: DBEntry[] = [];\n\n for (const entry of entries) {\n const val = entry.properties[groupByProperty] ?? null;\n const groupName = extractGroupName(val);\n\n if (groupName === null) {\n ungrouped.push(entry);\n } else {\n const existing = groups.get(groupName);\n if (existing) {\n existing.push(entry);\n } else {\n groups.set(groupName, [entry]);\n }\n }\n }\n\n let result: GroupedEntries[] = Array.from(groups.entries()).map(([name, items]) => ({\n groupName: name,\n entries: items,\n }));\n\n if (options?.sort === \"ascending\") {\n result.sort((a, b) => a.groupName.localeCompare(b.groupName));\n } else if (options?.sort === \"descending\") {\n result.sort((a, b) => b.groupName.localeCompare(a.groupName));\n }\n\n if (ungrouped.length > 0) {\n result.push({ groupName: \"그룹 없음\", entries: ungrouped });\n }\n\n if (options?.hideEmptyGroups) {\n result = result.filter((g) => g.entries.length > 0);\n }\n\n return result;\n}\n\nexport function extractCalendarEntries(entries: DBEntry[], dateProperty: string): CalendarEntry[] {\n const result: CalendarEntry[] = [];\n\n for (const entry of entries) {\n const val = entry.properties[dateProperty];\n if (!val) continue;\n\n if (typeof val === \"string\") {\n const date = parseDate(val);\n if (date) result.push({ entry, date });\n } else if (typeof val === \"object\" && val !== null && !Array.isArray(val) && \"start\" in val) {\n const date = parseDate(val.start);\n if (date) {\n result.push({\n entry,\n date,\n endDate: val.end ? (parseDate(val.end) ?? undefined) : undefined,\n });\n }\n }\n }\n\n return result;\n}\n\nexport function filterByMonth(\n calendarEntries: CalendarEntry[],\n year: number,\n month: number,\n): CalendarEntry[] {\n const monthStr = `${year}-${String(month).padStart(2, \"0\")}`;\n return calendarEntries.filter((ce) => ce.date.startsWith(monthStr));\n}\n\nexport function getVisibleProperties(\n viewConfig: ViewConfig,\n): Array<{ id: string; name: string; width?: number }> {\n if (!viewConfig.properties) return [];\n\n return viewConfig.properties\n .filter((p) => p.visible !== false)\n .map((p) => ({\n id: p.propertyId,\n name: p.propertyName ?? p.propertyId,\n width: p.width,\n }));\n}\n\nfunction compareValues(a: PropertyValue, b: PropertyValue): number {\n if (a === null && b === null) return 0;\n if (a === null) return 1;\n if (b === null) return -1;\n\n if (typeof a === \"string\" && typeof b === \"string\") return a.localeCompare(b);\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (typeof a === \"boolean\" && typeof b === \"boolean\") return (a ? 1 : 0) - (b ? 1 : 0);\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.join(\",\").localeCompare(b.join(\",\"));\n }\n\n if (typeof a === \"object\" && typeof b === \"object\" && a !== null && b !== null) {\n if (\"start\" in a && \"start\" in b) {\n return (a.start ?? \"\").localeCompare(b.start ?? \"\");\n }\n }\n\n return String(a).localeCompare(String(b));\n}\n\nfunction extractGroupName(val: PropertyValue): string | null {\n if (val === null || val === undefined) return null;\n if (typeof val === \"string\") return val || null;\n if (typeof val === \"boolean\") return val ? \"true\" : \"false\";\n if (typeof val === \"number\") return String(val);\n if (Array.isArray(val)) return val.length > 0 ? val.join(\", \") : null;\n if (typeof val === \"object\" && \"start\" in val) return val.start;\n return null;\n}\n\nfunction parseDate(value: string): string | null {\n const match = /^(\\d{4}-\\d{2}-\\d{2})/.exec(value);\n return match?.[1] ?? null;\n}\n","import type { VaultFS } from \"../sync/vault-fs.js\";\nimport type { DatabaseViewsConfig, ViewConfig } from \"../types/view.js\";\nimport type { DBEntry, PropertyValue, ViewRenderData, PropertySchema } from \"./types.js\";\nimport { sortEntries, groupEntries, extractCalendarEntries } from \"./filter-engine.js\";\nimport { getVisibleProperties } from \"./filter-engine.js\";\nimport matter from \"gray-matter\";\n\nconst DB_VIEWS_PATH = \".im-nobsidian/db-views.json\";\n\nexport class ViewDataProvider {\n constructor(private readonly vaultFs: VaultFS) {}\n\n async loadAllViewConfigs(): Promise<Record<string, DatabaseViewsConfig>> {\n try {\n const raw = await this.vaultFs.readFile(DB_VIEWS_PATH);\n return JSON.parse(raw) as Record<string, DatabaseViewsConfig>;\n } catch {\n return {};\n }\n }\n\n async getViewConfigs(databaseId: string): Promise<DatabaseViewsConfig | null> {\n const all = await this.loadAllViewConfigs();\n return all[databaseId] ?? null;\n }\n\n async collectEntries(folderPath: string): Promise<DBEntry[]> {\n const allFiles = await this.vaultFs.listMarkdownFiles();\n const prefix = folderPath.endsWith(\"/\") ? folderPath : folderPath + \"/\";\n const dbFiles = allFiles.filter((f) => f.path.startsWith(prefix));\n\n const entries: DBEntry[] = [];\n\n for (const file of dbFiles) {\n try {\n const content = await this.vaultFs.readFile(file.path);\n const entry = parseEntry(file.path, content);\n if (entry) entries.push(entry);\n } catch {\n // 파일 읽기 실패 시 스킵\n }\n }\n\n return entries;\n }\n\n async buildViewData(\n databaseId: string,\n viewId: string,\n folderPath: string,\n schema?: Record<string, PropertySchema>,\n ): Promise<ViewRenderData | null> {\n const dbConfig = await this.getViewConfigs(databaseId);\n if (!dbConfig) return null;\n\n const viewConfig = dbConfig.views.find((v) => v.id === viewId);\n if (!viewConfig) return null;\n\n const entries = await this.collectEntries(folderPath);\n\n return this.processViewData(entries, viewConfig, databaseId, dbConfig.databaseName, schema);\n }\n\n async buildDefaultViewData(\n databaseId: string,\n folderPath: string,\n schema?: Record<string, PropertySchema>,\n ): Promise<ViewRenderData | null> {\n const dbConfig = await this.getViewConfigs(databaseId);\n if (!dbConfig || dbConfig.views.length === 0) return null;\n\n const viewConfig = dbConfig.views[0]!;\n const entries = await this.collectEntries(folderPath);\n\n return this.processViewData(entries, viewConfig, databaseId, dbConfig.databaseName, schema);\n }\n\n processViewData(\n entries: DBEntry[],\n viewConfig: ViewConfig,\n databaseId: string,\n databaseName?: string,\n schema?: Record<string, PropertySchema>,\n ): ViewRenderData {\n let processed = entries;\n\n if (viewConfig.sorts && viewConfig.sorts.length > 0) {\n processed = sortEntries(processed, viewConfig.sorts);\n }\n\n const visibleProps = getVisibleProperties(viewConfig);\n const propertyNames =\n visibleProps.length > 0 ? visibleProps.map((p) => p.name) : collectPropertyNames(processed);\n\n const data: ViewRenderData = {\n databaseId,\n databaseName,\n viewConfig,\n entries: processed,\n propertyNames,\n schema,\n };\n\n if (viewConfig.type === \"board\" && viewConfig.groupBy) {\n const grouped = groupEntries(\n processed,\n viewConfig.groupBy.propertyName ?? viewConfig.groupBy.propertyId,\n {\n sort: viewConfig.groupBy.sort === \"manual\" ? undefined : viewConfig.groupBy.sort,\n hideEmptyGroups: viewConfig.groupBy.hideEmptyGroups,\n },\n );\n return { ...data, grouped };\n }\n\n if (viewConfig.type === \"calendar\" && viewConfig.datePropertyName) {\n const calendarEntries = extractCalendarEntries(processed, viewConfig.datePropertyName);\n return { ...data, calendarEntries };\n }\n\n return data;\n }\n}\n\nfunction parseEntry(path: string, content: string): DBEntry | null {\n try {\n const parsed = matter(content);\n const fm = parsed.data as Record<string, unknown>;\n\n const title = (fm.title as string) ?? extractTitleFromPath(path);\n const icon = fm.icon as string | undefined;\n const cover = fm.cover as string | undefined;\n\n const properties: Record<string, PropertyValue> = {};\n for (const [key, value] of Object.entries(fm)) {\n if (key === \"title\" || key === \"icon\" || key === \"cover\") continue;\n properties[key] = normalizePropertyValue(value);\n }\n\n return { path, title, icon, cover, properties };\n } catch {\n return null;\n }\n}\n\nfunction normalizePropertyValue(value: unknown): PropertyValue {\n if (value === null || value === undefined) return null;\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return value;\n if (typeof value === \"boolean\") return value;\n\n if (value instanceof Date) {\n return value.toISOString().split(\"T\")[0]!;\n }\n\n if (Array.isArray(value)) {\n return value.map((v) => String(v));\n }\n\n if (typeof value === \"object\" && value !== null) {\n const obj = value as Record<string, unknown>;\n if (\"start\" in obj) {\n return {\n start: String(obj.start),\n end: obj.end ? String(obj.end) : undefined,\n };\n }\n }\n\n return String(value);\n}\n\nfunction extractTitleFromPath(filePath: string): string {\n const parts = filePath.split(\"/\");\n const filename = parts[parts.length - 1] ?? \"\";\n return filename.replace(/\\.md$/, \"\");\n}\n\nfunction collectPropertyNames(entries: DBEntry[]): string[] {\n const names = new Set<string>();\n for (const entry of entries) {\n for (const key of Object.keys(entry.properties)) {\n names.add(key);\n }\n }\n return Array.from(names);\n}\n","import type { VaultFS } from \"../sync/vault-fs.js\";\nimport type { DBEntry, PropertyValue } from \"./types.js\";\nimport matter from \"gray-matter\";\n\nexport class EntryEditor {\n constructor(private readonly vaultFs: VaultFS) {}\n\n async updateProperty(\n entryPath: string,\n propertyName: string,\n newValue: PropertyValue,\n ): Promise<void> {\n const content = await this.vaultFs.readFile(entryPath);\n const parsed = matter(content);\n\n parsed.data[propertyName] = newValue;\n\n const updated = matter.stringify(parsed.content, parsed.data);\n await this.vaultFs.writeFile(entryPath, updated);\n }\n\n async createEntry(\n folderPath: string,\n title: string,\n properties: Record<string, PropertyValue>,\n ): Promise<string> {\n const safeName = title.replace(/[\\\\/:*?\"<>|]/g, \"_\").trim() || \"Untitled\";\n const filePath = `${folderPath}/${safeName}.md`;\n\n const frontmatter = { title, ...properties };\n const content = matter.stringify(\"\", frontmatter);\n\n await this.vaultFs.ensureFolder(folderPath);\n await this.vaultFs.writeFile(filePath, content);\n\n return filePath;\n }\n\n async moveEntryToGroup(\n entry: DBEntry,\n groupProperty: string,\n newGroupValue: string,\n ): Promise<void> {\n await this.updateProperty(entry.path, groupProperty, newGroupValue);\n }\n\n async updateDate(entryPath: string, dateProperty: string, newDate: string): Promise<void> {\n await this.updateProperty(entryPath, dateProperty, newDate);\n }\n}\n","import type { NotionColor } from \"./types.js\";\n\nconst NOTION_COLORS: Record<NotionColor, string> = {\n default: \"#37352F\",\n gray: \"#787774\",\n brown: \"#9F6B53\",\n orange: \"#D9730D\",\n yellow: \"#CB912F\",\n green: \"#448361\",\n blue: \"#337EA9\",\n purple: \"#9065B0\",\n pink: \"#C14C8A\",\n red: \"#D44C47\",\n};\n\nconst NOTION_BG_COLORS: Record<NotionColor, string> = {\n default: \"#F1F1EF\",\n gray: \"#F1F1EF\",\n brown: \"#F4EEEE\",\n orange: \"#FBECDD\",\n yellow: \"#FBF3DB\",\n green: \"#EDF3EC\",\n blue: \"#E7F3F8\",\n purple: \"#F4F0F7\",\n pink: \"#F9F0F5\",\n red: \"#FDEBEC\",\n};\n\nexport function getNotionColor(color: NotionColor | string): string {\n return NOTION_COLORS[color as NotionColor] ?? NOTION_COLORS.default;\n}\n\nexport function getNotionBgColor(color: NotionColor | string): string {\n return NOTION_BG_COLORS[color as NotionColor] ?? NOTION_BG_COLORS.default;\n}\n\nexport function generateColorCSS(): string {\n const lines: string[] = [];\n for (const [name, hex] of Object.entries(NOTION_COLORS)) {\n lines.push(` --notion-color-${name}: ${hex};`);\n }\n for (const [name, hex] of Object.entries(NOTION_BG_COLORS)) {\n lines.push(` --notion-bg-${name}: ${hex};`);\n }\n return `:root {\\n${lines.join(\"\\n\")}\\n}`;\n}\n"]}