@source-repo/rpc-cli 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1131 -0
- package/dist/bench.d.ts +66 -0
- package/dist/bench.d.ts.map +1 -0
- package/dist/bench.js +109 -0
- package/dist/bench.js.map +1 -0
- package/dist/broker.d.ts +61 -0
- package/dist/broker.d.ts.map +1 -0
- package/dist/broker.js +56 -0
- package/dist/broker.js.map +1 -0
- package/dist/bus.d.ts +142 -0
- package/dist/bus.d.ts.map +1 -0
- package/dist/bus.js +272 -0
- package/dist/bus.js.map +1 -0
- package/dist/bus.types.json +269 -0
- package/dist/conform.d.ts +75 -0
- package/dist/conform.d.ts.map +1 -0
- package/dist/conform.js +152 -0
- package/dist/conform.js.map +1 -0
- package/dist/console.d.ts +285 -0
- package/dist/console.d.ts.map +1 -0
- package/dist/console.js +686 -0
- package/dist/console.js.map +1 -0
- package/dist/console.types.json +1730 -0
- package/dist/extract.d.ts +37 -0
- package/dist/extract.d.ts.map +1 -0
- package/dist/extract.js +272 -0
- package/dist/extract.js.map +1 -0
- package/dist/fake.d.ts +58 -0
- package/dist/fake.d.ts.map +1 -0
- package/dist/fake.js +164 -0
- package/dist/fake.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +905 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +15 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +507 -0
- package/dist/mcp.js.map +1 -0
- package/dist/network.d.ts +58 -0
- package/dist/network.d.ts.map +1 -0
- package/dist/network.js +64 -0
- package/dist/network.js.map +1 -0
- package/dist/record.d.ts +74 -0
- package/dist/record.d.ts.map +1 -0
- package/dist/record.js +221 -0
- package/dist/record.js.map +1 -0
- package/dist/tapping.d.ts +11 -0
- package/dist/tapping.d.ts.map +1 -0
- package/dist/tapping.js +71 -0
- package/dist/tapping.js.map +1 -0
- package/dist/verbs.d.ts +59 -0
- package/dist/verbs.d.ts.map +1 -0
- package/dist/verbs.js +324 -0
- package/dist/verbs.js.map +1 -0
- package/dist/web/app.css +1 -0
- package/dist/web/app.js +2063 -0
- package/dist/web/app.js.map +1 -0
- package/dist/web/index.html +13 -0
- package/package.json +65 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EACH,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACpB,0BAA0B,EAC1B,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EAKlB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAc,aAAa,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACpF,OAAO,EAAE,SAAS,EAAmB,MAAM,WAAW,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAElD;;;;;;;GAOG;AAEH,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgIb,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,IAAc,EAAE,IAAY,EAAE,QAAgB,EAAE,EAAE;IAChE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAA;AAClE,CAAC,CAAA;AAED,wFAAwF;AACxF,MAAM,YAAY,GAAG,CAAC,IAAc,EAAE,IAAY,EAAE,EAAE,CAClD,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;AAE1H,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAE3B,MAAM,iBAAiB,GAAG,CAAC,WAAyB,EAAE,EAAE;IACpD,KAAK,MAAM,UAAU,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,EAAE,CAAC;QAC9D,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;QAC5E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,CAAA;IAC7E,CAAC;IACD,2FAA2F;IAC3F,IAAI,WAAW,CAAC,MAAM,GAAG,gBAAgB;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,WAAW,CAAC,MAAM,GAAG,gBAAgB,SAAS,CAAC,CAAA;AAC9H,CAAC,CAAA;AAED,MAAM,UAAU,GAAG,CAAC,IAAY,EAAa,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAc,CAAA;AAEnG,0FAA0F;AAC1F,MAAM,WAAW,GAAG,CAAC,IAAe,EAAE,QAA+B,EAAa,EAAE;IAChF,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAA;IAC1B,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACxC,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO;YAAE,SAAQ;QACtE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAA;QACjD,SAAS,CAAC,OAAO,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAA;IACvG,CAAC;IACD,OAAO,IAAI,CAAA;AACf,CAAC,CAAA;AAiBD,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,EAAE;IACtD,IAAI,IAAiB,CAAA;IACrB,IAAI,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAgB,CAAA;IAChE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,2BAA2B,IAAI,KAAM,CAAW,CAAC,OAAO,IAAI,CAAC,CAAA;QACvG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,KAAK,IAAI,oBAAoB,CAAC,CAAA;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IACD,IAAI,CAAC;QACD,6EAA6E;QAC7E,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,KAAK,IAAI,+BAA+B,CAAC,CAAA;IACxH,CAAC;IAAC,MAAM,CAAC;QACL,qDAAqD;IACzD,CAAC;IACD,MAAM,IAAI,GAAkB,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACzD,MAAM,MAAM,GAAgC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACrH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AACjC,CAAC,CAAA;AAqBD;;;;;;;;GAQG;AACH,MAAM,OAAO,GAAG,CAAC,IAAc,EAAE,OAAe,EAAE,EAAE;IAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;IACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;IACvC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IACnC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,4CAA4C,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAA;QACpH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IACD,IAAI,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAA;IAC/D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,yCAA0C,CAAW,CAAC,OAAO,IAAI,CAAC,CAAA;QAC5G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;AACL,CAAC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,aAAa,GAAG,CAAC,IAAc,EAAE,MAAe,EAAE,KAAa,EAAE,SAAiB,EAAE,EAAE,CACxF,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAExE,MAAM,QAAQ,GAAG,CAAC,IAAc,EAAE,OAAe,EAAY,EAAE;IAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAA;QACvD,IAAI,MAA0B,CAAA;QAC9B,IAAI,iBAAiB,EAAE,CAAC;YACpB,IAAI,CAAC;gBACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAuB,CAAA;YAChE,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,oCAAqC,CAAW,CAAC,OAAO,IAAI,CAAC,CAAA;gBACvG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACnB,CAAC;QACL,CAAC;QACD,OAAO;YACH,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChC,CAAA;IACL,CAAC;IAED,IAAI,IAAc,CAAA;IAClB,IAAI,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAa,CAAA;IAC7D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,6BAA6B,IAAI,KAAM,CAAW,CAAC,OAAO,IAAI,CAAC,CAAA;QACzG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,2FAA2F;QAC3F,kFAAkF;QAClF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,KAAK,IAAI,qCAAqC,CAAC,CAAA;QACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IACD,IAAI,CAAC;QACD,wEAAwE;QACxE,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,KAAK,IAAI,+BAA+B,CAAC,CAAA;IACxH,CAAC;IAAC,MAAM,CAAC;QACL,qDAAqD;IACzD,CAAC;IACD,OAAO,IAAI,CAAA;AACf,CAAC,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,mBAAmB,GAAG,CAAC,IAAc,EAAE,OAAe,EAAE,iBAAyB,EAAE,EAAE;IACvF,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,CAAA;IAC7C,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;IACvC,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,sCAAsC,CAAC,CAAA;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACvE,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;IAClD,IAAI,OAAO,EAAE,IAAI,CAAC,IAAI,IAAI,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAC7E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,YAAY,aAAa,oBAAoB,OAAO,CAAC,IAAI,CAAC,IAAI,QAAQ,OAAO,IAAI,CAAC,CAAA;QAC5H,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IACD,2FAA2F;IAC3F,yEAAyE;IACzE,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACzC,OAAO;QACH,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,IAAI,EAAE,aAAa,IAAI,OAAO,EAAE,IAAI,CAAC,IAAI,IAAI,eAAe,CAAC,iBAAiB,CAAC;QAC/E,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACzD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO;KACV,CAAA;AACL,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IACxB,UAAU;IACV,OAAO;IACP,UAAU;IACV,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,aAAa;IACb,QAAQ;IACR,WAAW;IACX,OAAO;IACP,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,aAAa;IACb,OAAO;IACP,WAAW;IACX,SAAS;IACT,aAAa;IACb,QAAQ;IACR,eAAe;IACf,mBAAmB;IACnB,QAAQ;IACR,OAAO;CACV,CAAC,CAAA;AAEF,MAAM,WAAW,GAAG,CAAC,IAAc,EAAE,EAAE;IACnC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;QACxB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,KAAK,EAAE,CAAA;YAClC,SAAQ;QACZ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,KAAK,CAAA;AAChB,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,OAAO,GAAG,KAAK,EAAE,OAAe,EAAE,IAAc,EAAE,EAAE;IACtD,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;IACvD,MAAM,OAAO,GAAG;QACZ,GAAG,KAAK;QACR,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC7B,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClH,CAAA;IACD,uFAAuF;IACvF,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IAE1C,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAA;IAEvD,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,6DAA6D,CAAC,CAAA;QACxG,OAAO,CAAC,CAAA;IACZ,CAAC;IACD,IAAI,OAAO,KAAK,UAAU;QAAE,OAAO,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAEnE,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,0BAA0B,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,iBAAiB,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAA;QACjL,OAAO,CAAC,CAAA;IACZ,CAAC;IACD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACtB,0FAA0F;QAC1F,mCAAmC;QACnC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC1C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;YACrC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;QACF,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,CAAA;IACxE,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACpF,OAAO,MAAM,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;AACjI,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,OAAO,GAAG,KAAK,EAAE,IAAc,EAAE,EAAE;IACrC,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,CAAC,CAAA;IACrD,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAA;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IACD,IAAI,MAAiB,CAAA;IACrB,IAAI,CAAC;QACD,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAA;IAC9C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,YAAY,KAAM,CAAW,CAAC,OAAO,IAAI,CAAC,CAAA;QAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,CAAA;IACjD,IAAI,MAAM,GAAe,EAAE,CAAA;IAC3B,IAAI,UAAU,EAAE,CAAC;QACb,IAAI,CAAC;YACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAe,CAAA;QAChF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,UAAU,KAAM,CAAW,CAAC,OAAO,IAAI,CAAC,CAAA;YAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,CAAC;IACL,CAAC;IACD,8FAA8F;IAC9F,kBAAkB;IAClB,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAChC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oEAAoE,IAAI,KAAK,CAAC,CAAA;YACnG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,CAAC;QACD,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CAAA;IACvG,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,GAAG,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IACjF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IAC1G,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,OAAO,CAAC,IAAI,cAAc,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,YAAY,IAAI,CAAC,CAAA;IAC3H,gGAAgG;IAChG,+CAA+C;IAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sFAAsF,CAAC,CAAA;IAE5G,MAAM,IAAI,GAAG,GAAG,EAAE,CACd,KAAK,OAAO;SACP,KAAK,EAAE;SACP,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACrC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC1B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAC3B,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;AAC/B,CAAC,CAAA;AAED,oGAAoG;AACpG,MAAM,SAAS,GAAG,KAAK,EAAE,IAAc,EAAE,EAAE;IACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;IACvC,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAA;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,GAAG,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;IACtF,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;IAC/C,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;IACzD,4FAA4F;IAC5F,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAA;IAChD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC;QACjC,GAAG,OAAO;QACV,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;QACjB,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE;KAC3I,CAAC,CAAA;IACF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uGAAuG,CAAC,CAAA;QAC7H,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,GAAG,kBAAkB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACvG,IAAI,QAAQ;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gHAAgH,CAAC,CAAA;IAEpJ,MAAM,IAAI,GAAG,GAAG,EAAE,CACd,KAAK,OAAO;SACP,KAAK,EAAE;SACP,IAAI,CAAC,GAAG,EAAE;QACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACrC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC1B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;IAClD,IAAI,KAAK,GAAG,CAAC;QAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACtC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;AAC/B,CAAC,CAAA;AAED,qGAAqG;AACrG,MAAM,SAAS,GAAG,KAAK,EAAE,IAAc,EAAE,EAAE;IACvC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACjC,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAA;QAC7D,OAAO,CAAC,CAAA;IACZ,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,GAAG,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;IACtF,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;IAE/C,IAAI,OAAO,CAAA;IACX,IAAI,CAAC;QACD,OAAO,GAAG,MAAM,aAAa,CACzB,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EACnH,IAAI;YACA,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;gBACL,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;oBAAE,OAAM;gBACtC,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,CAAA;gBAC/D,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ;oBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;qBAC/E,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM;oBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,uCAAuC,CAAC,CAAA;;oBACtG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,cAAc,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC3H,CAAC,CACV,CAAA;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC1F,OAAO,CAAC,CAAA;IACZ,CAAC;IAED,IAAI,IAAI;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;;QAEnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAChB,sBAAsB,OAAO,CAAC,KAAK,CAAC,MAAM,QAAQ,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI;YACvF,GAAG,OAAO,CAAC,OAAO,aAAa,OAAO,CAAC,QAAQ,cAAc,OAAO,CAAC,MAAM,YAAY,OAAO,CAAC,IAAI,eAAe,CACzH,CAAA;IACL,0FAA0F;IAC1F,OAAO,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACrD,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,YAAY,GAAG,KAAK,EAAE,IAAc,EAAE,IAAY,EAAE,EAAE;IACxD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC,CAAA;IACzE,IAAI,MAAiB,CAAA;IACrB,IAAI,CAAC;QACD,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,OAAO,IAAI,CAAC,CAAA;QAClE,OAAO,CAAC,CAAA;IACZ,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,GAAG,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;IAChF,IAAI,MAAM,CAAA;IACV,IAAI,CAAC;QACD,MAAM,GAAG,MAAM,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAA;IAC1G,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACzF,OAAO,CAAC,CAAA;IACZ,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;QAC5D,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAClE,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,qBAAqB,IAAI,IAAI,CAAC,CAAA;IAC/F,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAAA;IAC1H,0FAA0F;IAC1F,6FAA6F;IAC7F,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,kEAAkE,CAAC,CAAA;IAExI,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAA;IAC5D,IAAI,KAAK,EAAE,CAAC;QACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,KAAK,mBAAmB,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,YAAY,OAAO,QAAQ,IAAI,IAAI,CAAC,CAAA;QACtH,OAAO,CAAC,CAAA;IACZ,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,WAAW,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,oBAAoB,OAAO,IAAI,CAAC,CAAA;IAChJ,OAAO,CAAC,CAAA;AACZ,CAAC,CAAA;AAED,wFAAwF;AACxF,MAAM,OAAO,GAAG,KAAK,EAAE,IAAc,EAAE,EAAE;IACrC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IACzC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAA;QAC5D,OAAO,CAAC,CAAA;IACZ,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,GAAG,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IAC/E,IAAI,MAAM,CAAA;IACV,IAAI,CAAC;QACD,MAAM,GAAG,MAAM,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAA;IACzG,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACxF,OAAO,CAAC,CAAA;IACZ,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;QAC5D,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,IAAI,QAAQ,KAAK,0BAA0B,CAAC,CAAA;QACrF,OAAO,CAAC,CAAA;IACZ,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,SAAS,KAAK,IAAI,CAAC,CAAA;IAC/C,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QAC1C,sFAAsF;QACtF,mCAAmC;QACnC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;QACpF,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAA;QAC9H,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,SAAS,IAAI,KAAK,UAAU,CAAC,IAAI,IAAI,GAAG,SAAS,KAAK,KAAK,UAAU,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC,CAAA;IAC3H,CAAC;IACD,6FAA6F;IAC7F,+BAA+B;IAC/B,OAAO,CAAC,CAAA;AACZ,CAAC,CAAA;AAED,+FAA+F;AAC/F,MAAM,QAAQ,GAAG,KAAK,EAAE,IAAc,EAAE,EAAE;IACtC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACrB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACvB,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAA;QACnF,OAAO,CAAC,CAAA;IACZ,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IACnC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,MAAM,oCAAoC,CAAC,CAAA;QACtF,OAAO,CAAC,CAAA;IACZ,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;IACpC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,GAAG,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAElF,IAAI,IAAe,CAAA;IACnB,IAAI,CAAC;QACD,IAAI,GAAG,MAAM,cAAc,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAC/F,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACzF,OAAO,CAAC,CAAA;IACZ,CAAC;IAED,IAAI,MAAM,CAAA;IACV,IAAI,CAAC;QACD,MAAM,GAAG,MAAM,KAAK,CAAC;YACjB,GAAG,OAAO;YACV,IAAI;YACJ,SAAS;YACT,MAAM;YACN,IAAI;YACJ,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC5C,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;YAC1D,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;SACjD,CAAC,CAAA;IACN,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACzF,OAAO,CAAC,CAAA;IACZ,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;SACpF,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,CAAA;QACxJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAChB,cAAc,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAChJ,CAAA;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,EAAE,aAAa,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAChI,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,KAAK,IAAI,CAAC,CAAA;IAChH,CAAC;IACD,+DAA+D;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAChC,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,KAAK,EAAE,IAAc,EAAE,EAAE;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACnC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,oBAAoB,EAAE,0BAA0B,CAAC,CAAA;IACzF,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;IACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAA;IAChE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACrC,IAAI,YAAY,CAAA;IAChB,IAAI,CAAC;QACD,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAClF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,wFAAwF;QACxF,8EAA8E;QAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAuB,CAAW,CAAC,OAAO,IAAI,CAAC,CAAA;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC;QAC9B,IAAI;QACJ,IAAI;QACJ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC;KACzI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE;QAClB,mFAAmF;QACnF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,IAAI,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAA;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAChB,qBAAqB,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAC7K,CAAA;IACD,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,6FAA6F;QAC7F,kEAAkE;QAClE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qIAAqI,CAAC,CAAA;QAC3J,gGAAgG;QAChG,0FAA0F;QAC1F,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yHAAyH,CAAC,CAAA;IACnJ,CAAC;IAED,8FAA8F;IAC9F,sFAAsF;IACtF,MAAM,IAAI,GAAG,GAAG,EAAE,CACd,KAAK,OAAO;SACP,KAAK,EAAE;SACP,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACpG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;IACV,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC1B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAC3B,4DAA4D;IAC5D,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;AAC/B,CAAC,CAAA;AAED,MAAM,MAAM,GAAG,KAAK,EAAE,IAAc,EAAE,EAAE;IACpC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,GAAG,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAC9E,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;IACnD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACvG,0EAA0E;IAC1E,MAAM,IAAI,GAAG,GAAG,EAAE,CACd,KAAK,OAAO;SACP,KAAK,EAAE;SACP,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACrC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC1B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAC3B,6DAA6D;IAC7D,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;AACjC,CAAC,CAAA;AAED,MAAM,UAAU,GAAG,KAAK,EAAE,IAAc,EAAE,EAAE;IACxC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;IAC/E,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;IAElD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;IAClD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IACpC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC;QAC/B,GAAG,OAAO;QACV,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,cAAc,EAAE,oBAAoB,CAAC;QACtE,IAAI;QACJ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpC,CAAC,CAAA;IACF,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,OAAO,CAAC,GAAG,cAAc,QAAQ,OAAO,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IAC3I,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,WAAW;QAC5C,oFAAoF;QACpF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,IAAI,mFAAmF,CAAC,CAAA;IACjJ,8FAA8F;IAC9F,sFAAsF;IACtF,MAAM,IAAI,GAAG,GAAG,EAAE,CACd,KAAK,OAAO;SACP,KAAK,EAAE;SACP,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACpG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;IACV,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC1B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;AAC/B,CAAC,CAAA;AAED,MAAM,IAAI,GAAG,GAAG,EAAE;IACd,2FAA2F;IAC3F,4FAA4F;IAC5F,6FAA6F;IAC7F,+EAA+E;IAC/E,KAAK,MAAM,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;QACjD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAwB,EAAE,EAAE;YAC5C,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACvC,MAAM,CAAC,CAAA;QACX,CAAC,CAAC,CAAA;IAEN,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACvB,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC,CAAA;IAErE,+FAA+F;IAC/F,kEAAkE;IAClE,MAAM,IAAI,GAAG,CAAC,CAAU,EAAE,EAAE;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC,CAAA;IACD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvB,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChC,OAAM;IACV,CAAC;IACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACjC,OAAM;IACV,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC7B,OAAM;IACV,CAAC;IACD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACtB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC9B,OAAM;IACV,CAAC;IACD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACtB,KAAK,QAAQ,CAAC,IAAI,CAAC;aACd,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAClC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChB,OAAM;IACV,CAAC;IACD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACrB,KAAK,OAAO,CAAC,IAAI,CAAC;aACb,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAClC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChB,OAAM;IACV,CAAC;IACD,IAAI,OAAO,KAAK,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC;QACtD,KAAK,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;aAChD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAClC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChB,OAAM;IACV,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvB,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChC,OAAM;IACV,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvB,KAAK,SAAS,CAAC,IAAI,CAAC;aACf,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAClC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChB,OAAM;IACV,CAAC;IACD,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QAC7F,yFAAyF;QACzF,iEAAiE;QACjE,KAAK,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;aACtB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAClC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChB,OAAM;IACV,CAAC;IACD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC3B,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACjC,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IACtD,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACrB,uFAAuF;QACvF,8EAA8E;QAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,WAAW,CAAC,MAAM,QAAQ,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,2BAA2B,CAAC,CAAA;QAC7H,iBAAiB,CAAC,WAAW,CAAC,CAAA;QAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAA;QACjE,IAAI,QAA+B,CAAA;QACnC,IAAI,CAAC;YACD,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;QAC9B,CAAC;QAAC,MAAM,CAAC;YACL,QAAQ,GAAG,SAAS,CAAA;QACxB,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;QACxF,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;QAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAA;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,KAAK,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,CAAA;QACjG,OAAM;IACV,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC,CAAA;IACzE,IAAI,MAAiB,CAAA;IACrB,IAAI,CAAC;QACD,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,OAAO,IAAI,CAAC,CAAA;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACf,OAAM;IACV,CAAC;IAED,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,wBAAwB,CAAC,CAAA;YACvD,QAAQ,EAAE,CAAA;YACV,SAAQ;QACZ,CAAC;QACD,iFAAiF;QACjF,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QACrF,KAAK,MAAM,OAAO,IAAI,QAAQ;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAAA;QACtG,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAA;IAC/B,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,QAAQ,mBAAmB,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,YAAY,OAAO,IAAI,CAAC,CAAA;QAChH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,OAAO,IAAI,CAAC,CAAA;AAChF,CAAC,CAAA;AAED,IAAI,EAAE,CAAA"}
|
package/dist/mcp.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type NetworkOptions } from './network.js';
|
|
2
|
+
export interface McpOptions extends NetworkOptions {
|
|
3
|
+
/**
|
|
4
|
+
* Where contracts may be written and read. Absent means the contract tools are not offered at
|
|
5
|
+
* all, which is why it is a flag: a model that cannot write files should not be shown tools
|
|
6
|
+
* that claim it can, and a directory says exactly where the writing is allowed to happen.
|
|
7
|
+
*/
|
|
8
|
+
contracts?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const startMcp: (options: McpOptions) => Promise<{
|
|
11
|
+
network: import("@source-repo/rpc").NodeRpcServer;
|
|
12
|
+
close: () => Promise<void>;
|
|
13
|
+
peers: Set<string>;
|
|
14
|
+
}>;
|
|
15
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAyBlE,MAAM,WAAW,UAAW,SAAQ,cAAc;IAC9C;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAgND,eAAO,MAAM,QAAQ,YAAmB,UAAU;;;;EA0RjD,CAAA"}
|
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
import { readFileSync, readdirSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join, resolve, sep } from 'node:path';
|
|
3
|
+
import { readableNameFor } from '@source-repo/rpc';
|
|
4
|
+
import { connectNetwork } from './network.js';
|
|
5
|
+
import { looksLikeSchema, startFake } from './fake.js';
|
|
6
|
+
import { checkPeerOn, diffPeersOn } from './conform.js';
|
|
7
|
+
import { openTap } from './tapping.js';
|
|
8
|
+
/**
|
|
9
|
+
* An msgrpc network as an MCP server, so a model can look at a plant the way a person looks at the
|
|
10
|
+
* console: who is out there, what each one exposes, and call it.
|
|
11
|
+
*
|
|
12
|
+
* MCP is JSON-RPC 2.0 over stdio, newline-delimited. That is little enough to speak directly, and
|
|
13
|
+
* doing so keeps the CLI free of a second RPC framework - this package is, after all, about not
|
|
14
|
+
* needing one. The consequence is the rule everything here obeys: **stdout carries protocol and
|
|
15
|
+
* nothing else**. A stray console.log corrupts the stream and the client sees a parse error rather
|
|
16
|
+
* than whatever was printed, so every diagnostic goes to stderr.
|
|
17
|
+
*
|
|
18
|
+
* The tools are the console's three verbs rather than one tool per method on the network. A peer
|
|
19
|
+
* set that changes while a model is mid-conversation would mean re-issuing the tool list on every
|
|
20
|
+
* arrival and departure; describe_peer hands over the argument types instead, which is the same
|
|
21
|
+
* information in a form that does not go stale.
|
|
22
|
+
*/
|
|
23
|
+
/** What we answer initialize with when the client asks for something we do not recognise. */
|
|
24
|
+
const FALLBACK_PROTOCOL_VERSION = '2025-06-18';
|
|
25
|
+
/**
|
|
26
|
+
* How long a watching tool may hold the client waiting. A model asking for an hour would get one,
|
|
27
|
+
* and the conversation would look like it had hung.
|
|
28
|
+
*/
|
|
29
|
+
const MAX_WATCH_SECONDS = 60;
|
|
30
|
+
/** Contracts are named, not pathed. A name that could climb out of the directory is refused. */
|
|
31
|
+
const SAFE_CONTRACT_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
|
|
32
|
+
const contractPath = (directory, name) => {
|
|
33
|
+
if (!SAFE_CONTRACT_NAME.test(name))
|
|
34
|
+
throw new Error(`'${name}' is not a usable contract name`);
|
|
35
|
+
const file = resolve(join(directory, `${name}.types.json`));
|
|
36
|
+
// Proven to stay inside rather than assumed to, the same way the console proves an asset path.
|
|
37
|
+
if (!file.startsWith(resolve(directory) + sep))
|
|
38
|
+
throw new Error(`'${name}' would write outside the contracts directory`);
|
|
39
|
+
return file;
|
|
40
|
+
};
|
|
41
|
+
/** JSON-RPC 2.0 error codes. Only the ones a well-behaved client can actually provoke. */
|
|
42
|
+
const METHOD_NOT_FOUND = -32601;
|
|
43
|
+
const INVALID_PARAMS = -32602;
|
|
44
|
+
const INTERNAL_ERROR = -32603;
|
|
45
|
+
/**
|
|
46
|
+
* The tools, which depend on what this server was started with.
|
|
47
|
+
*
|
|
48
|
+
* The three read-and-call verbs are always here. The ones that stand a peer up are here because a
|
|
49
|
+
* model asked to try something against a device that does not exist yet would otherwise need a
|
|
50
|
+
* shell; the ones that write a contract to disk appear only when a directory was named, so a server
|
|
51
|
+
* that cannot write files does not advertise tools claiming it can.
|
|
52
|
+
*/
|
|
53
|
+
const toolsFor = (contracts) => [
|
|
54
|
+
{
|
|
55
|
+
name: 'list_peers',
|
|
56
|
+
description: 'List the peers currently on the msgrpc network, with the ones this server can reach right now.',
|
|
57
|
+
inputSchema: { type: 'object', properties: {}, additionalProperties: false }
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: 'describe_peer',
|
|
61
|
+
description: 'Describe what one peer exposes: its namespaces, the methods in each, their argument names and types, and the events it emits. ' +
|
|
62
|
+
'Call this before call_method - it is where the argument types come from. A peer whose server was started without introspection cannot answer.',
|
|
63
|
+
inputSchema: {
|
|
64
|
+
type: 'object',
|
|
65
|
+
properties: { peer: { type: 'string', description: 'The peer name, as returned by list_peers.' } },
|
|
66
|
+
required: ['peer'],
|
|
67
|
+
additionalProperties: false
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: 'call_method',
|
|
72
|
+
description: 'Call a method on a peer and return what it returns. Arguments are positional, in the order describe_peer reports them. ' +
|
|
73
|
+
'A call the peer refuses comes back as an error with its reason rather than as a failure of this tool.',
|
|
74
|
+
inputSchema: {
|
|
75
|
+
type: 'object',
|
|
76
|
+
properties: {
|
|
77
|
+
peer: { type: 'string', description: 'The peer name.' },
|
|
78
|
+
namespace: { type: 'string', description: 'The namespace holding the method, e.g. "plant".' },
|
|
79
|
+
method: { type: 'string', description: 'The method name.' },
|
|
80
|
+
args: { type: 'array', description: 'Positional arguments, in the order describe_peer reports them. Omit for a method that takes none.', items: {} }
|
|
81
|
+
},
|
|
82
|
+
required: ['peer', 'namespace', 'method'],
|
|
83
|
+
additionalProperties: false
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: 'start_fake',
|
|
88
|
+
description: 'Stand a peer up from a contract and put it on this network, so something can be called that does not exist yet. ' +
|
|
89
|
+
'It answers every method the contract declares with a value of the declared shape, and refuses arguments the contract would refuse. ' +
|
|
90
|
+
'Give it `schema` directly - no file is needed' +
|
|
91
|
+
(contracts ? ", or `contract` to load one saved with save_contract" : '') +
|
|
92
|
+
'. `script` can supply canned returns, deliberate failures and events on a timer: ' +
|
|
93
|
+
'{"returns":{"plant.read":{"celsius":84}},"fails":{"plant.halt":"Unauthorized"},"emits":[{"event":"plant.alarm","every":2000}]}. ' +
|
|
94
|
+
'The failure code "Timeout" is the special one - that method never answers at all, which is how a caller\'s own timeout is staged. ' +
|
|
95
|
+
'This joins the real network, so it will not take a name a peer already answers to.',
|
|
96
|
+
inputSchema: {
|
|
97
|
+
type: 'object',
|
|
98
|
+
properties: {
|
|
99
|
+
name: { type: 'string', description: 'The peer name to serve under. Defaults to fake-<three words>.' },
|
|
100
|
+
schema: { type: 'object', description: 'The contract, as an msgrpc schema: {"schema":1,"namespaces":{...}}.' },
|
|
101
|
+
...(contracts ? { contract: { type: 'string', description: 'The name of a saved contract to serve instead of passing one inline.' } } : {}),
|
|
102
|
+
script: { type: 'object', description: 'Canned returns, deliberate failures and timed events. Optional.' }
|
|
103
|
+
},
|
|
104
|
+
additionalProperties: false
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: 'stop_fake',
|
|
109
|
+
description: 'Stop a peer started with start_fake and take it off the network. Fakes are stopped anyway when this server exits.',
|
|
110
|
+
inputSchema: { type: 'object', properties: { name: { type: 'string', description: 'The peer name it was started under.' } }, required: ['name'], additionalProperties: false }
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: 'list_fakes',
|
|
114
|
+
description: 'The peers this server is standing up, and what each serves.',
|
|
115
|
+
inputSchema: { type: 'object', properties: {}, additionalProperties: false }
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: 'check_peer',
|
|
119
|
+
description: 'Compare what a live peer serves with a contract callers were built against, and report what would break. ' +
|
|
120
|
+
'Runs the same comparison the server applies to a caller declaring an older version, so "argument 0 narrowed" means here what it means in CI. ' +
|
|
121
|
+
'A peer running without a schema is reported as unchecked rather than as passing. Give `schema` inline' +
|
|
122
|
+
(contracts ? ', or `contract` naming a saved one' : '') +
|
|
123
|
+
'.',
|
|
124
|
+
inputSchema: {
|
|
125
|
+
type: 'object',
|
|
126
|
+
properties: {
|
|
127
|
+
peer: { type: 'string', description: 'The peer to ask.' },
|
|
128
|
+
schema: { type: 'object', description: 'The contract to compare against, as an msgrpc schema.' },
|
|
129
|
+
...(contracts ? { contract: { type: 'string', description: 'The name of a saved contract to compare against.' } } : {})
|
|
130
|
+
},
|
|
131
|
+
required: ['peer'],
|
|
132
|
+
additionalProperties: false
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
name: 'diff_peers',
|
|
137
|
+
description: 'What two live peers expose differently: contract versions, methods one has and the other does not, signatures that changed, ' +
|
|
138
|
+
'events one no longer emits. The usual answer to "why does this cell behave differently from that one".',
|
|
139
|
+
inputSchema: {
|
|
140
|
+
type: 'object',
|
|
141
|
+
properties: { left: { type: 'string' }, right: { type: 'string' } },
|
|
142
|
+
required: ['left', 'right'],
|
|
143
|
+
additionalProperties: false
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: 'watch_traffic',
|
|
148
|
+
description: 'Watch what the network carries between other peers for a few seconds and return the frames - calls paired with their replies, ' +
|
|
149
|
+
'each with the method it answers and the time it took. This is traffic this server is not part of, so it is how to see what an HMI ' +
|
|
150
|
+
'and a device are actually saying to each other. Needs a broker exposing a bus, or an MQTT link.',
|
|
151
|
+
inputSchema: {
|
|
152
|
+
type: 'object',
|
|
153
|
+
properties: {
|
|
154
|
+
seconds: { type: 'number', description: `How long to watch. 1 to ${MAX_WATCH_SECONDS}, default 5.` },
|
|
155
|
+
peer: { type: 'string', description: 'Only frames this peer sent or received.' },
|
|
156
|
+
namespace: { type: 'string', description: 'Only this namespace.' },
|
|
157
|
+
payloads: { type: 'boolean', description: 'Include arguments and results. Default true.' }
|
|
158
|
+
},
|
|
159
|
+
additionalProperties: false
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
name: 'watch_events',
|
|
164
|
+
description: "Subscribe to one of a peer's events for a few seconds and return what it emitted. The subscription is dropped again afterwards, " +
|
|
165
|
+
'so looking does not leave a listener behind on the device.',
|
|
166
|
+
inputSchema: {
|
|
167
|
+
type: 'object',
|
|
168
|
+
properties: {
|
|
169
|
+
peer: { type: 'string' },
|
|
170
|
+
namespace: { type: 'string', description: 'The namespace holding the event, e.g. "plant".' },
|
|
171
|
+
event: { type: 'string' },
|
|
172
|
+
seconds: { type: 'number', description: `How long to listen. 1 to ${MAX_WATCH_SECONDS}, default 5.` }
|
|
173
|
+
},
|
|
174
|
+
required: ['peer', 'namespace', 'event'],
|
|
175
|
+
additionalProperties: false
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
...(contracts
|
|
179
|
+
? [
|
|
180
|
+
{
|
|
181
|
+
name: 'save_contract',
|
|
182
|
+
description: 'Write a contract to the contracts directory so it survives this conversation, can be committed, and can be served later with ' +
|
|
183
|
+
'`source-rpc serve --contract <file>` or checked against a device with `source-rpc check --peer`. Returns the path written.',
|
|
184
|
+
inputSchema: {
|
|
185
|
+
type: 'object',
|
|
186
|
+
properties: {
|
|
187
|
+
name: { type: 'string', description: 'A name; the file becomes <name>.types.json in the contracts directory.' },
|
|
188
|
+
schema: { type: 'object', description: 'The contract, as an msgrpc schema: {"schema":1,"namespaces":{...}}.' }
|
|
189
|
+
},
|
|
190
|
+
required: ['name', 'schema'],
|
|
191
|
+
additionalProperties: false
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
name: 'list_contracts',
|
|
196
|
+
description: 'The contracts saved in the contracts directory, with the namespaces each describes.',
|
|
197
|
+
inputSchema: { type: 'object', properties: {}, additionalProperties: false }
|
|
198
|
+
}
|
|
199
|
+
]
|
|
200
|
+
: [])
|
|
201
|
+
];
|
|
202
|
+
const failureText = (e) => {
|
|
203
|
+
const error = e;
|
|
204
|
+
return error?.code ? `${error.code}: ${error.message ?? ''}`.trim() : e instanceof Error ? e.message : String(e);
|
|
205
|
+
};
|
|
206
|
+
export const startMcp = async (options) => {
|
|
207
|
+
if (!options.broker && !options.hub)
|
|
208
|
+
throw new Error('startMcp: give it a broker, a hub, or both');
|
|
209
|
+
// Exposes nothing. This is a window onto the network, not a peer offering anything to it.
|
|
210
|
+
const connected = await connectNetwork(options);
|
|
211
|
+
const { network, online } = connected;
|
|
212
|
+
/** Peers this server is standing up, stopped when it exits so none outlive the conversation. */
|
|
213
|
+
const fakes = new Map();
|
|
214
|
+
/** A contract given inline, or the name of one saved in the contracts directory. */
|
|
215
|
+
const contractFrom = async (args) => {
|
|
216
|
+
if (args.schema) {
|
|
217
|
+
if (!looksLikeSchema(args.schema))
|
|
218
|
+
return { problem: 'schema must be an msgrpc contract: {"schema":1,"namespaces":{…}}.' };
|
|
219
|
+
return { schema: args.schema };
|
|
220
|
+
}
|
|
221
|
+
if (!args.contract)
|
|
222
|
+
return { problem: 'Give it `schema` directly, or `contract` naming a saved one.' };
|
|
223
|
+
if (!options.contracts)
|
|
224
|
+
return { problem: 'This server was started without a contracts directory, so it cannot load a saved contract.' };
|
|
225
|
+
try {
|
|
226
|
+
const schema = JSON.parse(readFileSync(contractPath(options.contracts, String(args.contract)), 'utf8'));
|
|
227
|
+
if (!looksLikeSchema(schema))
|
|
228
|
+
return { problem: `${String(args.contract)} is not an msgrpc contract.` };
|
|
229
|
+
return { schema };
|
|
230
|
+
}
|
|
231
|
+
catch (e) {
|
|
232
|
+
return { problem: failureText(e) };
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
const startFakeTool = async (args) => {
|
|
236
|
+
const stored = await contractFrom(args);
|
|
237
|
+
if ('problem' in stored)
|
|
238
|
+
return { text: stored.problem, isError: true };
|
|
239
|
+
const name = String(args.name ?? readableNameFor('fake'));
|
|
240
|
+
// The guard that matters. A fake taking a name a device already answers to would displace
|
|
241
|
+
// it, and calls meant for the plant would reach a stand-in that agrees with everything.
|
|
242
|
+
if (online.has(name))
|
|
243
|
+
return { text: `'${name}' is already a peer on this network. Standing a fake up under that name would take its place; choose another.`, isError: true };
|
|
244
|
+
if (fakes.has(name))
|
|
245
|
+
return { text: `'${name}' is already being served here. Stop it first, or use another name.`, isError: true };
|
|
246
|
+
try {
|
|
247
|
+
const running = await startFake({ ...options, name, schema: stored.schema, ...(args.script ? { script: args.script } : {}) });
|
|
248
|
+
fakes.set(name, { namespaces: running.namespaces, close: running.close });
|
|
249
|
+
return { text: `${name} is on the network, answering ${running.namespaces.join(', ')} from the contract. It is a fake: it answers from the contract, not from a device.` };
|
|
250
|
+
}
|
|
251
|
+
catch (e) {
|
|
252
|
+
return { text: `could not stand up ${name}: ${failureText(e)}`, isError: true };
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
const describe = async (peer) => {
|
|
256
|
+
const proxy = await network.proxy('msgrpc', peer);
|
|
257
|
+
return await proxy.remote.describe();
|
|
258
|
+
};
|
|
259
|
+
const callTool = async (name, args) => {
|
|
260
|
+
if (name === 'list_peers')
|
|
261
|
+
return { text: JSON.stringify({ peers: [...online].sort() }, null, 2) };
|
|
262
|
+
if (name === 'describe_peer') {
|
|
263
|
+
const peer = String(args.peer ?? '');
|
|
264
|
+
if (!peer)
|
|
265
|
+
return { text: 'describe_peer needs a peer name.', isError: true };
|
|
266
|
+
try {
|
|
267
|
+
return { text: JSON.stringify(await describe(peer), null, 2) };
|
|
268
|
+
}
|
|
269
|
+
catch (e) {
|
|
270
|
+
// An error from the peer is an answer about the peer, not a broken tool call: the
|
|
271
|
+
// model should read "it exposes no introspection" and move on, not retry.
|
|
272
|
+
return { text: `${peer} could not be described: ${failureText(e)}`, isError: true };
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
if (name === 'call_method') {
|
|
276
|
+
const peer = String(args.peer ?? '');
|
|
277
|
+
const namespace = String(args.namespace ?? '');
|
|
278
|
+
const method = String(args.method ?? '');
|
|
279
|
+
const parameters = Array.isArray(args.args) ? args.args : [];
|
|
280
|
+
if (!peer || !namespace || !method)
|
|
281
|
+
return { text: 'call_method needs peer, namespace and method.', isError: true };
|
|
282
|
+
try {
|
|
283
|
+
const proxy = await network.proxy(namespace, peer);
|
|
284
|
+
const result = await proxy.remote[method](...parameters);
|
|
285
|
+
return { text: result === undefined ? 'The method returned nothing.' : JSON.stringify(result, null, 2) };
|
|
286
|
+
}
|
|
287
|
+
catch (e) {
|
|
288
|
+
return { text: `${peer}.${namespace}.${method} failed: ${failureText(e)}`, isError: true };
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (name === 'start_fake')
|
|
292
|
+
return await startFakeTool(args);
|
|
293
|
+
if (name === 'stop_fake') {
|
|
294
|
+
const fake = fakes.get(String(args.name ?? ''));
|
|
295
|
+
if (!fake)
|
|
296
|
+
return { text: `Nothing called '${String(args.name ?? '')}' was started here.`, isError: true };
|
|
297
|
+
await fake.close();
|
|
298
|
+
fakes.delete(String(args.name));
|
|
299
|
+
return { text: `${String(args.name)} stopped and taken off the network.` };
|
|
300
|
+
}
|
|
301
|
+
if (name === 'list_fakes')
|
|
302
|
+
return { text: JSON.stringify({ fakes: [...fakes.entries()].map(([peer, fake]) => ({ peer, namespaces: fake.namespaces })) }, null, 2) };
|
|
303
|
+
if (name === 'save_contract') {
|
|
304
|
+
if (!options.contracts)
|
|
305
|
+
return { text: 'This server was started without a contracts directory, so it cannot write one.', isError: true };
|
|
306
|
+
try {
|
|
307
|
+
if (!looksLikeSchema(args.schema))
|
|
308
|
+
return { text: 'schema must be an msgrpc contract: {"schema":1,"namespaces":{…}}.', isError: true };
|
|
309
|
+
const file = contractPath(options.contracts, String(args.name ?? ''));
|
|
310
|
+
writeFileSync(file, JSON.stringify(args.schema, null, 2) + '\n');
|
|
311
|
+
return { text: `Wrote ${file}. Serve it with \`source-rpc serve --contract ${file}\`, or check a device against it with \`source-rpc check --peer <name> --against ${file}\`.` };
|
|
312
|
+
}
|
|
313
|
+
catch (e) {
|
|
314
|
+
return { text: failureText(e), isError: true };
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
if (name === 'list_contracts') {
|
|
318
|
+
if (!options.contracts)
|
|
319
|
+
return { text: 'This server was started without a contracts directory.', isError: true };
|
|
320
|
+
try {
|
|
321
|
+
const saved = readdirSync(options.contracts)
|
|
322
|
+
.filter((entry) => entry.endsWith('.types.json'))
|
|
323
|
+
.map((entry) => {
|
|
324
|
+
const contract = entry.replace(/\.types\.json$/, '');
|
|
325
|
+
try {
|
|
326
|
+
const schema = JSON.parse(readFileSync(join(options.contracts, entry), 'utf8'));
|
|
327
|
+
return { contract, namespaces: Object.keys(schema.namespaces ?? {}) };
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
return { contract, namespaces: [], unreadable: true };
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
return { text: JSON.stringify({ directory: resolve(options.contracts), contracts: saved }, null, 2) };
|
|
334
|
+
}
|
|
335
|
+
catch (e) {
|
|
336
|
+
return { text: failureText(e), isError: true };
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
if (name === 'check_peer') {
|
|
340
|
+
const peer = String(args.peer ?? '');
|
|
341
|
+
if (!peer)
|
|
342
|
+
return { text: 'check_peer needs a peer name.', isError: true };
|
|
343
|
+
const stored = await contractFrom(args);
|
|
344
|
+
if ('problem' in stored)
|
|
345
|
+
return { text: stored.problem, isError: true };
|
|
346
|
+
try {
|
|
347
|
+
const report = await checkPeerOn(connected, { peer, stored: stored.schema });
|
|
348
|
+
const count = report.problems.length + report.missing.length;
|
|
349
|
+
return {
|
|
350
|
+
text: JSON.stringify(report, null, 2),
|
|
351
|
+
// A device behind its contract is an answer about the device, and the model
|
|
352
|
+
// should read it rather than treat the tool as broken - but it is not a pass.
|
|
353
|
+
...(count ? { isError: true } : {})
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
catch (e) {
|
|
357
|
+
return { text: failureText(e), isError: true };
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
if (name === 'diff_peers') {
|
|
361
|
+
const left = String(args.left ?? '');
|
|
362
|
+
const right = String(args.right ?? '');
|
|
363
|
+
if (!left || !right)
|
|
364
|
+
return { text: 'diff_peers needs two peer names.', isError: true };
|
|
365
|
+
try {
|
|
366
|
+
return { text: JSON.stringify(await diffPeersOn(connected, { left, right }), null, 2) };
|
|
367
|
+
}
|
|
368
|
+
catch (e) {
|
|
369
|
+
return { text: failureText(e), isError: true };
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
if (name === 'watch_traffic') {
|
|
373
|
+
const seconds = Math.min(Math.max(Number(args.seconds ?? 5), 1), MAX_WATCH_SECONDS);
|
|
374
|
+
const frames = [];
|
|
375
|
+
const filter = {
|
|
376
|
+
payloads: args.payloads !== false,
|
|
377
|
+
...(args.peer ? { peer: String(args.peer) } : {}),
|
|
378
|
+
...(args.namespace ? { namespace: String(args.namespace) } : {}),
|
|
379
|
+
ttl: Math.ceil(seconds) + 10
|
|
380
|
+
};
|
|
381
|
+
const tap = await openTap(connected, options, filter, (frame) => void frames.push(frame));
|
|
382
|
+
if (!tap.sources.length) {
|
|
383
|
+
await tap.close();
|
|
384
|
+
return { text: 'Nothing here can watch traffic: no broker exposing a bus, and no --broker link.', isError: true };
|
|
385
|
+
}
|
|
386
|
+
await new Promise((resolve) => setTimeout(resolve, seconds * 1000));
|
|
387
|
+
await tap.close();
|
|
388
|
+
return { text: JSON.stringify({ watchedFor: seconds, sources: tap.sources, frames }, null, 2) };
|
|
389
|
+
}
|
|
390
|
+
if (name === 'watch_events') {
|
|
391
|
+
const peer = String(args.peer ?? '');
|
|
392
|
+
const namespace = String(args.namespace ?? '');
|
|
393
|
+
const event = String(args.event ?? '');
|
|
394
|
+
if (!peer || !namespace || !event)
|
|
395
|
+
return { text: 'watch_events needs peer, namespace and event.', isError: true };
|
|
396
|
+
const seconds = Math.min(Math.max(Number(args.seconds ?? 5), 1), MAX_WATCH_SECONDS);
|
|
397
|
+
const heard = [];
|
|
398
|
+
const handler = (...emitted) => void heard.push({ at: Date.now(), args: emitted });
|
|
399
|
+
try {
|
|
400
|
+
const proxy = await network.proxy(namespace, peer);
|
|
401
|
+
await proxy.remote.on(event, handler);
|
|
402
|
+
await new Promise((resolve) => setTimeout(resolve, seconds * 1000));
|
|
403
|
+
// Dropped again, so a look does not leave a subscription behind on the device.
|
|
404
|
+
await proxy.remote.off(event, handler).catch(() => undefined);
|
|
405
|
+
return { text: JSON.stringify({ watchedFor: seconds, event: `${peer}.${namespace}.${event}`, heard }, null, 2) };
|
|
406
|
+
}
|
|
407
|
+
catch (e) {
|
|
408
|
+
return { text: `cannot watch ${peer}.${namespace}.${event}: ${failureText(e)}`, isError: true };
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return { text: `Unknown tool '${name}'.`, isError: true };
|
|
412
|
+
};
|
|
413
|
+
const write = (message) => process.stdout.write(JSON.stringify(message) + '\n');
|
|
414
|
+
const respond = (id, result) => write({ jsonrpc: '2.0', id, result });
|
|
415
|
+
const fail = (id, code, message) => write({ jsonrpc: '2.0', id, error: { code, message } });
|
|
416
|
+
const handle = async (request) => {
|
|
417
|
+
// A notification has no id and must not be answered at all, not even with an error.
|
|
418
|
+
const isNotification = request.id === undefined || request.id === null;
|
|
419
|
+
switch (request.method) {
|
|
420
|
+
case 'initialize': {
|
|
421
|
+
// Echo the client's version when it names one. This server is thin enough to speak
|
|
422
|
+
// any revision that still calls tools the same way, and refusing a version we have
|
|
423
|
+
// simply never heard of would be worse than answering it.
|
|
424
|
+
const asked = request.params?.protocolVersion;
|
|
425
|
+
respond(request.id, {
|
|
426
|
+
protocolVersion: typeof asked === 'string' && asked ? asked : FALLBACK_PROTOCOL_VERSION,
|
|
427
|
+
capabilities: { tools: {} },
|
|
428
|
+
// Bumped with the package. Clients show it when reporting which server said what.
|
|
429
|
+
serverInfo: { name: 'source-rpc', version: '3.0.0' },
|
|
430
|
+
instructions: 'This is a live Source RPC network. Start with list_peers, then describe_peer to learn a peer' +
|
|
431
|
+
' contract before calling it. Calls reach real devices, so treat anything that writes as consequential.' +
|
|
432
|
+
' start_fake puts a peer of your own on the same network, built from a contract you supply - use it to try something' +
|
|
433
|
+
' against a device that does not exist yet, rather than against one that does. watch_traffic shows what other peers' +
|
|
434
|
+
' are saying to each other, which is most of what is happening.'
|
|
435
|
+
});
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
case 'notifications/initialized':
|
|
439
|
+
case 'notifications/cancelled':
|
|
440
|
+
return;
|
|
441
|
+
case 'ping':
|
|
442
|
+
if (!isNotification)
|
|
443
|
+
respond(request.id, {});
|
|
444
|
+
return;
|
|
445
|
+
case 'tools/list':
|
|
446
|
+
respond(request.id, { tools: toolsFor(options.contracts) });
|
|
447
|
+
return;
|
|
448
|
+
case 'tools/call': {
|
|
449
|
+
const name = String(request.params?.name ?? '');
|
|
450
|
+
const args = (request.params?.arguments ?? {});
|
|
451
|
+
if (!name) {
|
|
452
|
+
fail(request.id, INVALID_PARAMS, 'tools/call needs a tool name');
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
const { text, isError } = await callTool(name, args);
|
|
456
|
+
respond(request.id, { content: [{ type: 'text', text }], ...(isError ? { isError: true } : {}) });
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
default:
|
|
460
|
+
if (!isNotification)
|
|
461
|
+
fail(request.id, METHOD_NOT_FOUND, `unknown method '${request.method}'`);
|
|
462
|
+
}
|
|
463
|
+
};
|
|
464
|
+
let buffered = '';
|
|
465
|
+
process.stdin.setEncoding('utf8');
|
|
466
|
+
process.stdin.on('data', (chunk) => {
|
|
467
|
+
buffered += chunk;
|
|
468
|
+
// Newline-delimited, and a chunk boundary can fall anywhere, so the tail is kept for next
|
|
469
|
+
// time rather than parsed as a truncated message.
|
|
470
|
+
let newline = buffered.indexOf('\n');
|
|
471
|
+
while (newline !== -1) {
|
|
472
|
+
const line = buffered.slice(0, newline).trim();
|
|
473
|
+
buffered = buffered.slice(newline + 1);
|
|
474
|
+
newline = buffered.indexOf('\n');
|
|
475
|
+
if (!line)
|
|
476
|
+
continue;
|
|
477
|
+
let request;
|
|
478
|
+
try {
|
|
479
|
+
request = JSON.parse(line);
|
|
480
|
+
}
|
|
481
|
+
catch {
|
|
482
|
+
// No id to answer to, so there is nowhere to send a parse error that the client
|
|
483
|
+
// could match up. Said on stderr, which is where a person will look.
|
|
484
|
+
process.stderr.write('source-rpc mcp: ignoring a line that is not JSON\n');
|
|
485
|
+
continue;
|
|
486
|
+
}
|
|
487
|
+
void handle(request).catch((e) => {
|
|
488
|
+
if (request.id !== undefined && request.id !== null)
|
|
489
|
+
fail(request.id, INTERNAL_ERROR, failureText(e));
|
|
490
|
+
else
|
|
491
|
+
process.stderr.write(`source-rpc mcp: ${failureText(e)}\n`);
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
const close = async () => {
|
|
496
|
+
process.stdin.removeAllListeners('data');
|
|
497
|
+
// Before the network goes: a fake left running would hold a link this is about to drop.
|
|
498
|
+
for (const fake of fakes.values())
|
|
499
|
+
await fake.close().catch(() => undefined);
|
|
500
|
+
fakes.clear();
|
|
501
|
+
await connected.close();
|
|
502
|
+
};
|
|
503
|
+
// Not stdout: see the note at the top. A client learns what is here from initialize.
|
|
504
|
+
process.stderr.write(`source-rpc mcp: ${options.name} on ${options.broker ?? ''}${options.broker && options.hub ? ' and ' : ''}${options.hub ?? ''}\n`);
|
|
505
|
+
return { network, close, peers: online };
|
|
506
|
+
};
|
|
507
|
+
//# sourceMappingURL=mcp.js.map
|