@openclaw/crabline 0.1.17 → 0.1.18

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.
Files changed (33) hide show
  1. package/README.md +8 -0
  2. package/dist/src/openclaw/private-file.js +71 -24
  3. package/dist/src/openclaw/private-file.js.map +1 -1
  4. package/dist/src/platform/process-owned-lock.d.ts +5 -2
  5. package/dist/src/platform/process-owned-lock.js +20 -10
  6. package/dist/src/platform/process-owned-lock.js.map +1 -1
  7. package/dist/src/servers/discord.js +25 -35
  8. package/dist/src/servers/discord.js.map +1 -1
  9. package/dist/src/servers/http.d.ts +3 -0
  10. package/dist/src/servers/http.js +15 -0
  11. package/dist/src/servers/http.js.map +1 -1
  12. package/dist/src/servers/matrix.js +8 -8
  13. package/dist/src/servers/matrix.js.map +1 -1
  14. package/dist/src/servers/mattermost.js +7 -10
  15. package/dist/src/servers/mattermost.js.map +1 -1
  16. package/dist/src/servers/recorder.d.ts +16 -6
  17. package/dist/src/servers/recorder.js +52 -12
  18. package/dist/src/servers/recorder.js.map +1 -1
  19. package/dist/src/servers/signal.js +8 -8
  20. package/dist/src/servers/signal.js.map +1 -1
  21. package/dist/src/servers/slack.js +8 -8
  22. package/dist/src/servers/slack.js.map +1 -1
  23. package/dist/src/servers/telegram.d.ts +2 -2
  24. package/dist/src/servers/telegram.js +8 -8
  25. package/dist/src/servers/telegram.js.map +1 -1
  26. package/dist/src/servers/whatsapp-baileys-websocket.js +1 -1
  27. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  28. package/dist/src/servers/whatsapp.js +13 -18
  29. package/dist/src/servers/whatsapp.js.map +1 -1
  30. package/dist/src/servers/zalo.js +8 -7
  31. package/dist/src/servers/zalo.js.map +1 -1
  32. package/docs/channel-setup.md +14 -1
  33. package/package.json +11 -11
@@ -1 +1 @@
1
- {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/servers/slack.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,uBAAuB,EACvB,WAAW,EACX,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,GAEpB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,aAAa,EACb,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,GAElB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,8BAA8B,EAC9B,qBAAqB,GAItB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,iCAAiC,GAAG,CAAC,GAAG,EAAE,CAAC;AACjD,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAClC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AACpC,MAAM,2BAA2B,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAU,CAAC;AA2DrE,MAAM,mBAAoB,SAAQ,KAAK;IAChB,MAAM;IAA3B,YAAqB,MAAc;QACjC,KAAK,CAAC,8CAA8C,MAAM,GAAG,CAAC,CAAC;sBAD5C,MAAM;QAEzB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,qBAAsB,SAAQ,KAAK;IAE5B,WAAW;IADtB,YACW,WAA6B,EACtC,WAA+B;QAE/B,KAAK,CAAC,qCAAqC,WAAW,EAAE,CAAC,CAAC;2BAHjD,WAAW;QAIpB,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AA8CD,SAAS,OAAO,CAAC,MAAM,GAA4B,EAAE;IACnD,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,UAAU,CAAC,KAAa,EAAE,MAAM,GAAG,GAAG;IAC7C,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,gBAAgB,CAAC,iBAAiB,GAAG,CAAC;IAC7C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;QACvE,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,MAAM,CAAC,iBAAiB,CAAC;SACzC;QACD,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;AACL,CAAC;AAED,SAAS,+BAA+B,CACtC,KAAyD;IAEzD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,iBAAiB,CACxB,OAAwB,EACxB,IAA6B,EAC7B,KAAuB;IAEvB,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;IACpD,IAAI,eAAmC,CAAC;IACxC,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACnF,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,OAAO,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAE,CAAC,EAAE,CAAC;gBACvE,UAAU,IAAI,CAAC,CAAC;YAClB,CAAC;YACD,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;QAClE,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,UAAU,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,KAAK,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC,cAAc,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,WAAW,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACrE,OAAO,UAAU,CAAC,mBAAmB,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC9C,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,WAAW,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACzE,OAAO,UAAU,CAAC,mBAAmB,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,WAAW,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAClE,OAAO,UAAU,CAAC,eAAe,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7C,OAAO,UAAU,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IAC5D,IAAI,WAAW,KAAK,MAAM,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,WAAW,KAAK,OAAO,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;QACnD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAY,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc,EAAE,KAAa;IACxD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,MAAM,GAAY,KAAK,CAAC;IAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,UAAU,CAAC,yBAAyB,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,UAAU,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QACjF,OAAO,UAAU,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAc;IACjD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAuB,EAAE,OAAe;IAClE,OAAO,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,eAAe,CACtB,KAAuB,EACvB,MAGC;IAED,OAAO,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CACnD,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,CAC/E,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,KAAuB,EACvB,MAGC;IAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAC5D,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAC1C,CAAC;IACF,OAAO,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,WAAW,CAAC,KAAuB;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,OAAO,GAAG,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC1G,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc;IACzC,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,eAAe,CAAC,KAAuB;IAC9C,SAAS,CAAC;QACR,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACvD,IACE,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC;YACvC,CAAC,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EACvD,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAuB;IAChD,SAAS,CAAC;QACR,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACvD,IACE,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC;YACvC,CAAC,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,EACjF,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAuB,EAAE,MAAc;IAC/D,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACzC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAuB,EAAE,MAAc,EAAE,SAAiB;IACnF,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3F,IAAI,UAAU,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QACxC,OAAO;IACT,CAAC;IACD,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAuB,EACvB,KAAe;IAEf,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,EAAE,EAAE,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;IACpE,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACzC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc,EAAE,SAAiB;IAC1D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,UAAU,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QACzC,OAAO,UAAU,CAAC,0BAA0B,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC,0BAA0B,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,MAAM,KAAK,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;QACtD,OAAO,UAAU,CAAC,eAAe,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc,EAAE,IAAqB;IAC9D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAClE,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;QAC1B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,aAAa,GACjB,IAAI,KAAK,MAAM;YACb,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC9C,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,OAAO,aAAa,IAAI,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,MAAM;YAClE,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAqB,EAAE,QAAgB;IAChE,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,aAAa,CAAC,KAAuB,EAAE,OAAqB;IACnE,MAAM,QAAQ,GAAG,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACpE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CACxB,KAAuB,EACvB,SAAiB;IAEjB,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IAClG,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,EAAE,EAAE,SAAS;YACb,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,MAAM;SACb,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,EAAE,CAAC;QACT,OAAO;YACL,EAAE,EAAE,SAAS;YACb,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;YACzC,IAAI,EAAE,UAAU;SACjB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,EAAE,EAAE,SAAS;QACb,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QACrC,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QACnC,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QAChC,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,UAAU;KACjB,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAuB;IACjD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;QAClB,GAAG,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE;QACjC,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE;QAChC,GAAG,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;KACrE,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,GAAG,CAAC;SACZ,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;SACvD,MAAM,CAAC,CAAC,OAAO,EAAsC,EAAE,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,6BAA6B,CAAC,KAAc;IACnD,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC;SAC3C,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;IACF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AAC/F,CAAC;AAED,SAAS,qBAAqB,CAAC,YAAqC;IAClE,IAAI,YAAY,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,YAAY,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,YAAY,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC/E,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,KAAuB,EAAE,KAAyB,EAAE,SAAS,GAAG,KAAK;IAC9F,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;IACnF,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,qBAAqB,CAAC,KAA8B;IAC3D,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QAC1C,GAAG;QACH,GAAG,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK;KACrD,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAA6B;IACzD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QAC1C,GAAG;QACH,GAAG,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK;KACrD,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAuB,EACvB,MAaC;IAED,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO;QACL,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,GAAG,CAAC,MAAM,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1F,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,EAAE;QACF,IAAI,EAAE,SAAS;QACf,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;QACjF,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;QACjF,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;KAClE,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAuB,EAAE,OAAqB;IAC1E,OAAO;QACL,UAAU,EAAE,WAAW;QACvB,cAAc,EAAE;YACd;gBACE,aAAa,EAAE,IAAI;gBACnB,MAAM,EAAE,IAAI;gBACZ,qBAAqB,EAAE,KAAK;gBAC5B,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,KAAK,CAAC,SAAS;aACzB;SACF;QACD,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QAC5C,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3C,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,sBAAsB;QAC7B,IAAI,EAAE,gBAAgB;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,aAAqB,EAAE,SAAiB,EAAE,IAAY;IACnF,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,aAAa,CAAC;SAC/C,MAAM,CAAC,MAAM,SAAS,IAAI,IAAI,EAAE,CAAC;SACjC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjB,OAAO,MAAM,MAAM,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,8BAA8B,CACrC,OAAwB,EACxB,KAAuB,EACvB,OAAe;IAEf,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACrE,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;IACxF,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;IACxF,MAAM,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IACpE,IACE,CAAC,SAAS;QACV,CAAC,SAAS;QACV,CAAC,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,gBAAgB,CAAC,GAAG,iCAAiC,EAClF,CAAC;QACD,OAAO,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7F,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC5E,OAAO,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,MAAM,KAAK,GAAmC,EAAE,CAAC;IACjD,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,MAAM,KAAK,GAAG,OAAkC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;IACxB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;QACzC,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,KAAK,YAAY,qBAAqB,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC,WAAW,CAAC;IAC3B,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACjF,IACE,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAClC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,EACvE,CAAC;QACD,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IACD,IACE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,cAAc,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAClB,CAAC,WAAW,EAAE,sBAAsB,EAAE,yBAAyB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAChF,EACD,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IACE,KAAK,CAAC,IAAI,CACR,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,KAAK,iCAAiC,CAC7C,EACD,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IACE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAClB;QACE,WAAW;QACX,cAAc;QACd,YAAY;QACZ,cAAc;QACd,aAAa;QACb,WAAW;QACX,yBAAyB;QACzB,gBAAgB;KACjB,CAAC,QAAQ,CAAC,IAAI,CAAC,CACjB,EACD,CAAC;QACD,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAyB,EAAE,IAAY;IAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACjD,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAyB;IACvD,OAAO,KAAK,KAAK,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC;AACxE,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,MAQ/C;IACC,MAAM,SAAS,GACb,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACxF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,8BAA8B,CAAC;IACjE,IAAI,SAAkB,CAAC;IACvB,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QACnD,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAClD,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,YAAY,CAAC,qCAAqC,EAAE,cAAc,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,iBAAiB,GAAG,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC;QACnD,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC;gBACnB,OAAO;gBACP,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,iBAAiB,CAAC,CAAC;gBACnE,GAAG,EAAE,MAAM,CAAC,GAAG;aAChB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC1B,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,MAOpC;IACC,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC;QACzC,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,uBAAuB;QACvD,wBAAwB,EAAE,MAAM,CAAC,KAAK,CAAC,oBAAoB;QAC3D,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,GAAG,EAAE,MAAM,CAAC,GAAG;KAChB,CAAC,CAAC;IACH,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;QACtB,MAAM,IAAI,qBAAqB,CAAC,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,MAAM,yBAAyB,CAAC;QACrC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,GAAG,EAAE,MAAM,CAAC,GAAG;KAChB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,OAAe,EAAE,MAAmB;IACnE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;QAC5C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,SAAkB,EAAE,EAAE;YACpC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,OAAO,CAAC,SAAS,CAAC,CAAC;QACrB,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QACtD,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,KAAuB,EACvB,KAA8C,EAC9C,eAA4B;IAE5B,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,WAAyC,CAAC;IAC9C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,uBAAuB,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QACvE,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC3D,MAAM,aAAa,GAAG;gBACpB,CAAC,cAAc,EAAE,kBAAkB,CAAC;gBACpC,GAAG,CAAC,OAAO,GAAG,CAAC;oBACb,CAAC,CAAE;wBACC,CAAC,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;wBACtC,CAAC,sBAAsB,EAAE,WAAW,IAAI,eAAe,CAAC;qBAC/C;oBACb,CAAC,CAAC,EAAE,CAAC;gBACP,CAAC,2BAA2B,EAAE,SAAS,CAAC;gBACxC,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;aAC1E,CAAC;YACX,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACrC,IAAI,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACjD,IAAI,QAAqC,CAAC;YAC1C,KAAK,IAAI,aAAa,GAAG,CAAC,GAAI,aAAa,IAAI,CAAC,EAAE,CAAC;gBACjD,QAAQ,GAAG,MAAM,qBAAqB,CAAC;oBACrC,IAAI;oBACJ,aAAa;oBACb,MAAM;oBACN,KAAK;oBACL,SAAS;oBACT,GAAG,EAAE,UAAU;iBAChB,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,CAAC,KAAK,GAAG,CAAC;gBAC1E,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO;gBACT,CAAC;gBACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAC3D,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACvD,MAAM;gBACR,CAAC;gBACD,IAAI,aAAa,IAAI,yBAAyB,EAAE,CAAC;oBAC/C,QAAQ,GAAG,SAAS,CAAC;oBACrB,WAAW,GAAG,oBAAoB,CAAC;oBACnC,MAAM;gBACR,CAAC;gBACD,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAC7C,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBACpD,OAAO;gBACT,CAAC;gBACD,MAAM,IAAI,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC;gBAC5B,OAAO;YACT,CAAC;YACD,WAAW,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,UAAU,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,iBAAiB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;YACxF,OAAO;QACT,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CACjC,KAAuB,EACvB,KAA8C;IAE9C,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,OAAO,CAC5F,GAAG,EAAE;QACH,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC,CACF,CAAC;IACF,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAI7B;IACC,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,WAAW;YACd,OAAO,OAAO,CAAC;gBACb,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK;gBAC1B,iBAAiB,EAAE;oBACjB,MAAM,EAAE;wBACN,YAAY;wBACZ,kBAAkB;wBAClB,gBAAgB;wBAChB,YAAY;wBACZ,cAAc;qBACf;iBACF;gBACD,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,WAAW;gBACpB,GAAG,EAAE,8BAA8B;gBACnC,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS;aAChC,CAAC,CAAC;QACL,KAAK,kBAAkB,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC;YACxD,IAAI,SAAS,IAAI,SAAS,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;gBAC1C,OAAO,gBAAgB,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YACvD,CAAC;YACD,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,SAAS,IAAI,CAAC,CAAC;YAC3B,CAAC;YACD,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvE,IAAI,gBAAgB,YAAY,QAAQ,EAAE,CAAC;gBACzC,OAAO,gBAAgB,CAAC;YAC1B,CAAC;YACD,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC;gBAC/D,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC;gBAClD,CAAC,CAAC,gBAAgB,CAAC;YACrB,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACnD,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;YACxF,IAAI,WAAW,YAAY,QAAQ,EAAE,CAAC;gBACpC,OAAO,WAAW,CAAC;YACrB,CAAC;YACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YACzE,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzD,IAAI,QAAQ,YAAY,QAAQ,EAAE,CAAC;gBACjC,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,IACE,CAAC,IAAI;gBACL,CAAC,2BAA2B,CAAC,MAAM,CAAC;gBACpC,CAAC,2BAA2B,CAAC,WAAW,CAAC,EACzC,CAAC;gBACD,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;YAC/B,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;gBACzB,OAAO,UAAU,CAAC,cAAc,CAAC,CAAC;YACpC,CAAC;YACD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7D,IAAI,QAAQ,YAAY,QAAQ,EAAE,CAAC;gBACjC,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,IAAI,QAAQ,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;gBACtE,OAAO,UAAU,CAAC,kBAAkB,CAAC,CAAC;YACxC,CAAC;YACD,MAAM,OAAO,GAAG,aAAa,CAC3B,MAAM,CAAC,KAAK,EACZ,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC/B,WAAW;gBACX,MAAM;gBACN,GAAG,EAAE,IAAI;gBACT,OAAO;gBACP,QAAQ;gBACR,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;gBACxD,IAAI;gBACJ,QAAQ;gBACR,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;gBAClD,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;aACnD,CAAC,CACH,CAAC;YACF,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,KAAK,oBAAoB,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC3E,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;gBAC9B,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACzD,OAAO,OAAO,CAAC;oBACb,OAAO,EAAE;wBACP,EAAE,EAAE,OAAO,CAAC,EAAE;wBACd,QAAQ,EAAE,KAAK;wBACf,OAAO,EAAE,IAAI;wBACb,UAAU,EAAE,IAAI;wBAChB,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;qBACpD;iBACF,CAAC,CAAC;YACL,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACvB,OAAO,OAAO,CAAC;gBACb,OAAO,EAAE;oBACP,EAAE,EAAE,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC;oBACxC,KAAK,EAAE,IAAI;oBACX,IAAI;iBACL;aACF,CAAC,CAAC;QACL,CAAC;QACD,KAAK,oBAAoB,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3D,IAAI,OAAO,YAAY,QAAQ,EAAE,CAAC;gBAChC,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9D,OAAO,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;QAC7F,CAAC;QACD,KAAK,oBAAoB,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,6BAA6B,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/D,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;gBAC9B,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnD,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;gBAC9B,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC/D,IAAI,QAAQ,YAAY,QAAQ,EAAE,CAAC;gBACjC,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE;gBACzE,MAAM,SAAS,GAAG,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBACrD,OAAO,SAAS,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,SAAS,GAAG,QAAQ,CAAC,CAAC;YACvE,CAAC,CAAC,CAAC;YACH,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE,CACnD,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC,CAC/C,CAAC;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;YACtD,MAAM,YAAY,GAAG,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/D,OAAO,OAAO,CAAC;gBACb,QAAQ;gBACR,iBAAiB,EAAE;oBACjB,WAAW,EAAE,OAAO,IAAI,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE;iBACpF;aACF,CAAC,CAAC;QACL,CAAC;QACD,KAAK,uBAAuB,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3D,IAAI,OAAO,YAAY,QAAQ,EAAE,CAAC;gBAChC,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC9C,OAAO,UAAU,CAAC,mBAAmB,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxD,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxD,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnD,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;gBAC9B,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAClE,IAAI,QAAQ,YAAY,QAAQ,EAAE,CAAC;gBACjC,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC5E,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;oBACxE,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,IAAI,MAAM,IAAI,OAAO,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;oBACnC,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,IAAI,MAAM,IAAI,OAAO,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;oBACnC,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC;iBAC1B,OAAO,EAAE;iBACT,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;YACxE,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACrC,OAAO,OAAO,CAAC;gBACb,QAAQ,EAAE,OAAO;gBACjB,QAAQ,EAAE,IAAI;gBACd,iBAAiB,EAAE;oBACjB,WAAW,EAAE,OAAO,IAAI,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE;iBACvF;aACF,CAAC,CAAC;QACL,CAAC;QACD,KAAK,uBAAuB,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3D,IAAI,OAAO,YAAY,QAAQ,EAAE,CAAC;gBAChC,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC9C,OAAO,UAAU,CAAC,mBAAmB,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,EAAE,GAAG,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChD,IAAI,EAAE,YAAY,QAAQ,EAAE,CAAC;gBAC3B,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,UAAU,CAAC,mBAAmB,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,UAAU,CAAC,kBAAkB,CAAC,CAAC;YACxC,CAAC;YACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnD,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;gBAC9B,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAClE,IAAI,QAAQ,YAAY,QAAQ,EAAE,CAAC;gBACjC,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,MAAM,CAC/D,CAAC,OAAO,EAAE,EAAE,CACV,CAAC,OAAO,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,CAAC;gBAC3D,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,EAAE,GAAG,QAAQ,CAAC,CACpD,CAAC;YACF,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACrC,OAAO,OAAO,CAAC;gBACb,QAAQ,EAAE,OAAO;gBACjB,QAAQ,EAAE,IAAI;gBACd,iBAAiB,EAAE;oBACjB,WAAW,EAAE,OAAO,IAAI,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE;iBACvF;aACF,CAAC,CAAC;QACL,CAAC;QACD;YACE,OAAO,UAAU,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,MAGjC;IACC,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,OAAO,YAAY,QAAQ,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3E,OAAO,UAAU,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACnD,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IACxF,IAAI,WAAW,YAAY,QAAQ,EAAE,CAAC;QACpC,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACzE,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC,CAAC;IACjE,IAAI,IAAI,YAAY,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrF,IAAI,QAAQ,YAAY,QAAQ,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,QAAQ,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACtE,OAAO,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,EAAE,GAAG,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChD,IAAI,EAAE,YAAY,QAAQ,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GAAG,aAAa,CAC3B,MAAM,CAAC,KAAK,EACZ,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE;QAC/B,WAAW;QACX,MAAM;QACN,OAAO;QACP,IAAI;QACJ,QAAQ;QACR,EAAE;QACF,IAAI;KACL,CAAC,CACH,CAAC;IACF,MAAM,KAAK,GAAG,oBAAoB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1D,0BAA0B,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAA6D;IACxF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACnE,IAAI,GAAG,CAAC,QAAQ,KAAK,yBAAyB,EAAE,CAAC;QAC/C,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACrC,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,OAAO,cAAc,EAAE,CAAC;QAC1B,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,UAAU,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE;YAC9B,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,IAAI;YACJ,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;YAC7B,IAAI,EAAE,GAAG,CAAC,QAAQ;YAClB,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC;YACvB,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;QACH,OAAO,MAAM,kBAAkB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,GAAG,CAAC,QAAQ,KAAK,eAAe,EAAE,CAAC;QACrC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,OAAO,IAAI,QAAQ,CAAC,oBAAoB,EAAE;gBACxC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;gBAC1B,MAAM,EAAE,GAAG;aACZ,CAAC,CAAC;QACL,CAAC;QACD,IACE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC;YACpD,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAC5C,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,OAAO,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,8BAA8B,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACxF,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,OAAO,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,UAAU,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACrC,OAAO,YAAY,CAAC,EAAE,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO,UAAU,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,WAAW,GAAG,oCAAoC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5E,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;IACrD,IAAI,aAAa,KAAK,KAAK,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACxB,OAAO,IAAI,QAAQ,CAAC,oBAAoB,EAAE;YACxC,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;YAC/B,MAAM,EAAE,GAAG;SACZ,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,OAAO,eAAe,CAAC;QACzB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7F,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,UAAU,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACxE,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAuB;QAChC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,IAAI,EAAE,qBAAqB,CAAC,IAAI,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK;QACtC,IAAI,EAAE,GAAG,CAAC,QAAQ;QAClB,KAAK,EAAE,oBAAoB,CAAC,KAAK,CAAC;QAClC,IAAI,EAAE,KAAK;KACZ,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC;QACpC,IAAI;QACJ,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,MAAM,iBAAiB,GAAG,QAAQ,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC;IACrE,MAAM,OAAO,GAAG,iBAAiB;QAC/B,CAAC,CAAE,CAAC,MAAM,QAAQ;aACb,KAAK,EAAE;aACP,IAAI,EAAE;aACN,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAa;QACxC,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,WAAW,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,kBAAkB,EAAE,CAAC;QAC5E,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC7B,CAAC;IACD,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,IAAI,SAAS,CAAC,CAAC;IAC9D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAM,GAA2B,EAAE;IAEnC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC;IACxC,MAAM,eAAe,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAqB;QAC9B,qBAAqB,EAAE,IAAI,GAAG,EAAE;QAChC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;QACtE,uBAAuB,EAAE,cAAc,CAAC,IAAI,CAAC;QAC7C,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,WAAW;QAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,2BAA2B;QACxD,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,UAAU;QACzC,wBAAwB,EAAE,+BAA+B,CAAC,MAAM,CAAC,wBAAwB,CAAC;QAC1F,OAAO,EAAE,KAAK;QACd,uBAAuB,EAAE,IAAI,eAAe,EAAE;QAC9C,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,WAAW,EAAE,CAAC;QACd,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,GAAG;QAChB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,CAAC;QACxF,oBAAoB,EAAE,IAAI;QAC1B,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,+BAA+B;QACtE,cAAc,EAAE,IAAI,GAAG,EAAE;QACzB,gBAAgB,EAAE,IAAI,GAAG,EAAE;QAC3B,iBAAiB,EAAE,IAAI,GAAG,EAAE;KAC7B,CAAC;IACF,IAAI,eAAe,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxC,MAAM,iBAAiB,GAAG,QAAQ,mBAAmB,CAAC,EAAE,CAAC,IAAI,mBAAmB,CAAC,EAAE,CAAC,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAChI,KAAK,CAAC,QAAQ,GAAG,iBAAiB,CAAC;IACrC,CAAC;IACD,IAAI,eAAe,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC7C,MAAM,qBAAqB,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9D,KAAK,CAAC,aAAa,GAAG,qBAAqB,CAAC;IAC9C,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC;QAC3C,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACtD,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;YACrB,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;gBAC1C,OAAO,UAAU,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,KAAK,YAAY,wBAAwB,EAAE,CAAC;gBAC9C,OAAO,UAAU,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI;QACJ,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC;QACtB,UAAU,EAAE,OAAO;KACpB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;IACnC,MAAM,OAAO,GAAG,GAAG,OAAO,OAAO,CAAC;IAClC,OAAO;QACL,KAAK,CAAC,KAAK;YACT,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;YACrB,KAAK,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;YACtC,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACtD,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;QACD,QAAQ,EAAE;YACR,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,OAAO;YACP,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE;gBACT,eAAe,EAAE,GAAG,OAAO,yBAAyB;gBACpD,OAAO;gBACP,SAAS,EAAE,GAAG,OAAO,eAAe;aACrC;YACD,GAAG,EAAE;gBACH,aAAa,EAAE,OAAO;gBACtB,eAAe,EAAE,KAAK,CAAC,QAAQ;gBAC/B,oBAAoB,EAAE,KAAK,CAAC,aAAa;aAC1C;YACD,QAAQ,EAAE,OAAO;YACjB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,OAAO,EAAE,CAAC;SACX;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { IncomingMessage } from \"node:http\";\nimport { createHmac, randomBytes, randomInt, timingSafeEqual } from \"node:crypto\";\nimport path from \"node:path\";\nimport {\n adminAuthError,\n hasAdminToken,\n InvalidJsonBodyError,\n isJsonObject,\n isLoopbackHost,\n jsonResponse,\n parseUnknownRequestBody,\n queryRecord,\n readBody,\n readInteger,\n readTrimmedString,\n RequestBodyTooLargeError,\n startHttpJsonServer,\n type ServerRequestEvent,\n} from \"./http.js\";\nimport {\n SLACK_CHANNEL_ID_RULE,\n SLACK_SEND_TARGET_ID_RULE,\n SLACK_TS_RULE,\n SLACK_USER_ID_RULE,\n} from \"../providers/slack-ids.js\";\nimport {\n recordCommittedServerEvent,\n recordServerEvent,\n type ServerEventObserver,\n} from \"./recorder.js\";\nimport {\n postWebhookRequestWithResponse,\n validateWebhookTarget,\n type WebhookAddress,\n type WebhookResponse,\n type WebhookTargetError,\n} from \"./webhook-target.js\";\n\nconst SLACK_SIGNATURE_TOLERANCE_SECONDS = 5 * 60;\nconst SLACK_EVENT_MAX_RETRIES = 3;\nconst SLACK_EVENT_MAX_REDIRECTS = 2;\nconst SLACK_EVENT_RETRY_DELAYS_MS = [0, 60_000, 5 * 60_000] as const;\n\ntype SlackMessage = {\n attachments?: unknown;\n blocks?: unknown;\n bot_id?: string;\n channel: string;\n metadata?: unknown;\n reply_broadcast?: boolean;\n text: string;\n thread_ts?: string;\n ts: string;\n type: \"message\";\n unfurl_links?: boolean;\n unfurl_media?: boolean;\n user: string;\n};\n\ntype SlackServerState = {\n activeEventDeliveries: Set<Promise<void>>;\n adminToken: string;\n allowLoopbackHttpEvents: boolean;\n botId: string;\n botToken: string;\n botUserId: string;\n chatPostMessageRateLimit:\n | {\n remaining: number;\n retryAfterSeconds: number;\n }\n | undefined;\n closing: boolean;\n deliveryAbortController: AbortController;\n eventsRequestUrl: string | undefined;\n nextDmIndex: number;\n nextMpimIndex: number;\n nextTsIndex: number;\n onEvent: ServerEventObserver | undefined;\n recorderPath: string;\n restrictEventTargets: boolean;\n signingSecret: string;\n userDmChannels: Map<string, string>;\n userMpimChannels: Map<string, { id: string; users: string[] }>;\n messagesByChannel: Map<string, SlackMessage[]>;\n};\ntype SlackRecorderEvent = ServerRequestEvent & {\n accepted?: boolean | undefined;\n};\n\ntype SlackRetryReason =\n | \"connection_failed\"\n | \"http_error\"\n | \"http_timeout\"\n | \"ssl_error\"\n | \"too_many_redirects\"\n | \"unknown_error\";\n\ntype SlackCursorKind = \"history\" | \"list\" | \"replies\";\n\nclass SlackEventHttpError extends Error {\n constructor(readonly status: number) {\n super(`Slack Events API delivery failed with HTTP ${status}.`);\n this.name = \"SlackEventHttpError\";\n }\n}\n\nclass SlackEventTargetError extends Error {\n constructor(\n readonly retryReason: SlackRetryReason,\n targetError: WebhookTargetError,\n ) {\n super(`Slack Events API target rejected: ${targetError}`);\n this.name = \"SlackEventTargetError\";\n }\n}\n\nexport type SlackServerManifest = {\n adminToken: string;\n baseUrl: string;\n botToken: string;\n endpoints: {\n adminInboundUrl: string;\n apiRoot: string;\n eventsUrl: string;\n };\n env: {\n SLACK_API_URL: string;\n SLACK_BOT_TOKEN: string;\n SLACK_SIGNING_SECRET: string;\n };\n provider: \"slack\";\n recorderPath: string;\n signingSecret: string;\n version: 1;\n};\n\nexport type StartedSlackServer = {\n close(): Promise<void>;\n manifest: SlackServerManifest;\n};\n\nexport type StartSlackServerParams = {\n adminToken?: string | undefined;\n botId?: string | undefined;\n botToken?: string | undefined;\n botUserId?: string | undefined;\n chatPostMessageRateLimit?:\n | {\n remaining: number;\n retryAfterSeconds: number;\n }\n | undefined;\n eventsRequestUrl?: string | undefined;\n host?: string | undefined;\n onEvent?: ServerEventObserver | undefined;\n port?: number | undefined;\n recorderPath?: string | undefined;\n signingSecret?: string | undefined;\n};\n\nfunction slackOk(result: Record<string, unknown> = {}): Response {\n return jsonResponse({ ok: true, ...result });\n}\n\nfunction slackError(error: string, status = 200): Response {\n return jsonResponse({ error, ok: false }, status);\n}\n\nfunction slackRateLimited(retryAfterSeconds = 1): Response {\n return new Response(JSON.stringify({ error: \"ratelimited\", ok: false }), {\n headers: {\n \"content-type\": \"application/json\",\n \"retry-after\": String(retryAfterSeconds),\n },\n status: 429,\n });\n}\n\nfunction resolveChatPostMessageRateLimit(\n value: StartSlackServerParams[\"chatPostMessageRateLimit\"],\n): SlackServerState[\"chatPostMessageRateLimit\"] {\n if (value === undefined) {\n return undefined;\n }\n if (!Number.isSafeInteger(value.remaining) || value.remaining < 0) {\n throw new Error(\"chatPostMessageRateLimit.remaining must be a non-negative safe integer.\");\n }\n if (!Number.isSafeInteger(value.retryAfterSeconds) || value.retryAfterSeconds < 1) {\n throw new Error(\"chatPostMessageRateLimit.retryAfterSeconds must be a positive safe integer.\");\n }\n return { ...value };\n}\n\nfunction requireSlackToken(\n request: IncomingMessage,\n body: Record<string, unknown>,\n state: SlackServerState,\n): Response | undefined {\n const authorization = request.headers.authorization;\n let tokenFromHeader: string | undefined;\n if (typeof authorization === \"string\") {\n const trimmed = authorization.trim();\n if (trimmed.slice(0, 6).toLowerCase() === \"bearer\" && /\\s/u.test(trimmed[6] ?? \"\")) {\n let tokenStart = 7;\n while (tokenStart < trimmed.length && /\\s/u.test(trimmed[tokenStart]!)) {\n tokenStart += 1;\n }\n tokenFromHeader = trimmed.slice(tokenStart).trim() || undefined;\n }\n }\n const token = tokenFromHeader ?? readTrimmedString(body.token);\n if (!token) {\n return slackError(\"not_authed\");\n }\n if (token !== state.botToken) {\n return slackError(\"invalid_auth\");\n }\n return undefined;\n}\n\nfunction requireSlackChannelId(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n if (!stringValue || !SLACK_CHANNEL_ID_RULE.pattern.test(stringValue)) {\n return slackError(\"channel_not_found\");\n }\n return stringValue;\n}\n\nfunction requireSlackSendTargetId(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n if (!stringValue || !SLACK_SEND_TARGET_ID_RULE.pattern.test(stringValue)) {\n return slackError(\"channel_not_found\");\n }\n return stringValue;\n}\n\nfunction requireSlackUserId(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n if (!stringValue || !SLACK_USER_ID_RULE.pattern.test(stringValue)) {\n return slackError(\"invalid_users\");\n }\n return stringValue;\n}\n\nfunction requireSlackThreadTs(value: unknown): string | Response | undefined {\n const stringValue = readTrimmedString(value);\n if (!stringValue) {\n return undefined;\n }\n if (!SLACK_TS_RULE.pattern.test(stringValue)) {\n return slackError(\"invalid_ts\");\n }\n return stringValue;\n}\n\nfunction readBoolean(value: unknown): boolean | undefined {\n if (typeof value === \"boolean\") {\n return value;\n }\n const stringValue = readTrimmedString(value)?.toLowerCase();\n if (stringValue === \"true\" || stringValue === \"1\") {\n return true;\n }\n if (stringValue === \"false\" || stringValue === \"0\") {\n return false;\n }\n return undefined;\n}\n\nfunction readSlackText(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction readStructuredValue(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n const stringValue = value.trim();\n if (!stringValue) {\n return undefined;\n }\n try {\n return JSON.parse(stringValue) as unknown;\n } catch {\n return value;\n }\n}\n\nfunction readStructuredArray(value: unknown, error: string): unknown[] | Response | undefined {\n if (value === undefined) {\n return undefined;\n }\n const parsed = readStructuredValue(value);\n return Array.isArray(parsed) ? parsed : slackError(error);\n}\n\nfunction readSlackMetadata(value: unknown): Record<string, unknown> | Response | undefined {\n if (value === undefined) {\n return undefined;\n }\n let parsed: unknown = value;\n if (typeof value === \"string\") {\n try {\n parsed = JSON.parse(value) as unknown;\n } catch {\n return slackError(\"invalid_metadata_format\");\n }\n }\n if (!isJsonObject(parsed)) {\n return slackError(\"invalid_metadata_format\");\n }\n if (!readTrimmedString(parsed.event_type) || !isJsonObject(parsed.event_payload)) {\n return slackError(\"invalid_metadata_schema\");\n }\n return parsed;\n}\n\nfunction hasStructuredMessageContent(value: unknown): boolean {\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n return Boolean(value && typeof value === \"object\");\n}\n\nfunction messagesForChannel(state: SlackServerState, channel: string): SlackMessage[] {\n return state.messagesByChannel.get(channel) ?? [];\n}\n\nfunction hasThreadParent(\n state: SlackServerState,\n params: {\n channel: string;\n threadTs: string;\n },\n): boolean {\n return messagesForChannel(state, params.channel).some(\n (message) => message.ts === params.threadTs && message.thread_ts === undefined,\n );\n}\n\nfunction resolveThreadTs(\n state: SlackServerState,\n params: {\n channel: string;\n ts: string;\n },\n): string | undefined {\n const message = messagesForChannel(state, params.channel).find(\n (candidate) => candidate.ts === params.ts,\n );\n return message?.thread_ts ?? message?.ts;\n}\n\nfunction nextSlackTs(state: SlackServerState): string {\n const index = state.nextTsIndex++;\n return `${1_700_000_000 + Math.floor(index / 1_000_000)}.${String(index % 1_000_000).padStart(6, \"0\")}`;\n}\n\nfunction randomDecimalDigits(length: number): string {\n return Array.from({ length }, () => randomInt(10)).join(\"\");\n}\n\nfunction nextDmChannelId(state: SlackServerState): string {\n for (;;) {\n const index = state.nextDmIndex++;\n const channelId = `D${String(index).padStart(9, \"0\")}`;\n if (\n !state.messagesByChannel.has(channelId) &&\n ![...state.userDmChannels.values()].includes(channelId)\n ) {\n return channelId;\n }\n }\n}\n\nfunction nextMpimChannelId(state: SlackServerState): string {\n for (;;) {\n const index = state.nextMpimIndex++;\n const channelId = `G${String(index).padStart(9, \"0\")}`;\n if (\n !state.messagesByChannel.has(channelId) &&\n ![...state.userMpimChannels.values()].some((channel) => channel.id === channelId)\n ) {\n return channelId;\n }\n }\n}\n\nfunction dmChannelForUser(state: SlackServerState, userId: string): string {\n const existing = state.userDmChannels.get(userId);\n if (existing) {\n return existing;\n }\n const channelId = nextDmChannelId(state);\n state.userDmChannels.set(userId, channelId);\n return channelId;\n}\n\nfunction rememberDmChannel(state: SlackServerState, userId: string, channelId: string): void {\n if (!channelId.startsWith(\"D\")) {\n return;\n }\n const mappedUser = [...state.userDmChannels].find(([, value]) => value === channelId)?.[0];\n if (mappedUser && mappedUser !== userId) {\n return;\n }\n state.userDmChannels.set(userId, channelId);\n}\n\nfunction mpimChannelForUsers(\n state: SlackServerState,\n users: string[],\n): { id: string; users: string[] } {\n const key = [...users].sort().join(\",\");\n const existing = state.userMpimChannels.get(key);\n if (existing) {\n return existing;\n }\n const channel = { id: nextMpimChannelId(state), users: [...users] };\n state.userMpimChannels.set(key, channel);\n return channel;\n}\n\nfunction requireSlackUsers(value: unknown, botUserId: string): string[] | Response {\n const rawUsers = readTrimmedString(value);\n if (!rawUsers) {\n return slackError(\"users_list_not_supplied\");\n }\n const users = rawUsers.split(\",\").map((user) => user.trim());\n if (users.length > 8) {\n return slackError(\"too_many_users\");\n }\n if (users.some((user) => !SLACK_USER_ID_RULE.pattern.test(user))) {\n return slackError(\"user_not_found\");\n }\n if (new Set(users).size !== users.length) {\n return slackError(\"invalid_user_combination\");\n }\n if (users.includes(botUserId)) {\n return slackError(\"invalid_user_combination\");\n }\n return users;\n}\n\nfunction requireSlackLimit(value: unknown): number | Response {\n const limit = value === undefined ? 100 : readInteger(value);\n if (limit === undefined || limit < 1 || limit > 1_000) {\n return slackError(\"invalid_limit\");\n }\n return limit;\n}\n\nfunction decodeSlackCursor(value: unknown, kind: SlackCursorKind): string | Response | undefined {\n if (value === undefined || value === \"\") {\n return undefined;\n }\n if (typeof value !== \"string\" || !/^[A-Za-z0-9_-]+$/u.test(value)) {\n return slackError(\"invalid_cursor\");\n }\n const cursor = value;\n try {\n const decoded = Buffer.from(cursor, \"base64url\").toString(\"utf8\");\n const prefix = `${kind}:`;\n if (!decoded.startsWith(prefix)) {\n return slackError(\"invalid_cursor\");\n }\n const boundary = decoded.slice(prefix.length);\n const validBoundary =\n kind === \"list\"\n ? SLACK_CHANNEL_ID_RULE.pattern.test(boundary)\n : SLACK_TS_RULE.pattern.test(boundary);\n return validBoundary && encodeSlackCursor(kind, boundary) === cursor\n ? boundary\n : slackError(\"invalid_cursor\");\n } catch {\n return slackError(\"invalid_cursor\");\n }\n}\n\nfunction encodeSlackCursor(kind: SlackCursorKind, boundary: string): string {\n return Buffer.from(`${kind}:${boundary}`, \"utf8\").toString(\"base64url\");\n}\n\nfunction appendMessage(state: SlackServerState, message: SlackMessage): SlackMessage {\n const messages = state.messagesByChannel.get(message.channel) ?? [];\n messages.push(message);\n state.messagesByChannel.set(message.channel, messages);\n return message;\n}\n\nfunction slackConversation(\n state: SlackServerState,\n channelId: string,\n): Record<string, unknown> | undefined {\n const dmUser = [...state.userDmChannels].find(([, value]) => value === channelId)?.[0];\n const mpim = [...state.userMpimChannels.values()].find((candidate) => candidate.id === channelId);\n const hasMessages = state.messagesByChannel.has(channelId);\n if (!dmUser && !mpim && !hasMessages) {\n return undefined;\n }\n if (dmUser) {\n return {\n id: channelId,\n is_channel: false,\n is_group: false,\n is_im: true,\n is_mpim: false,\n user: dmUser,\n };\n }\n if (mpim) {\n return {\n id: channelId,\n is_channel: false,\n is_group: false,\n is_im: false,\n is_mpim: true,\n is_private: true,\n members: [state.botUserId, ...mpim.users],\n name: \"crabline\",\n };\n }\n return {\n id: channelId,\n is_channel: channelId.startsWith(\"C\"),\n is_group: channelId.startsWith(\"G\"),\n is_im: channelId.startsWith(\"D\"),\n is_mpim: false,\n name: \"crabline\",\n };\n}\n\nfunction slackConversations(state: SlackServerState): Record<string, unknown>[] {\n const ids = new Set([\n ...state.messagesByChannel.keys(),\n ...state.userDmChannels.values(),\n ...[...state.userMpimChannels.values()].map((channel) => channel.id),\n ]);\n return [...ids]\n .sort()\n .map((channelId) => slackConversation(state, channelId))\n .filter((channel): channel is Record<string, unknown> => channel !== undefined);\n}\n\nfunction requireSlackConversationTypes(value: unknown): Set<string> | Response {\n const types = new Set(\n (readTrimmedString(value) ?? \"public_channel\")\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean),\n );\n const supported = new Set([\"im\", \"mpim\", \"private_channel\", \"public_channel\"]);\n return [...types].every((type) => supported.has(type)) ? types : slackError(\"invalid_types\");\n}\n\nfunction slackConversationType(conversation: Record<string, unknown>): string {\n if (conversation.is_im === true) {\n return \"im\";\n }\n if (conversation.is_mpim === true) {\n return \"mpim\";\n }\n return conversation.is_group === true ? \"private_channel\" : \"public_channel\";\n}\n\nasync function appendEvent(state: SlackServerState, event: ServerRequestEvent, committed = false) {\n const params = { event, onEvent: state.onEvent, recorderPath: state.recorderPath };\n await (committed ? recordCommittedServerEvent(params) : recordServerEvent(params));\n}\n\nfunction redactSlackAuthFields(value: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n key.toLowerCase() === \"token\" ? \"[redacted]\" : entry,\n ]),\n );\n}\n\nfunction redactSlackAuthQuery(value: Record<string, string>): Record<string, string> {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n key.toLowerCase() === \"token\" ? \"[redacted]\" : entry,\n ]),\n );\n}\n\nfunction createSlackMessage(\n state: SlackServerState,\n params: {\n channel: string;\n text: string;\n threadTs?: string | undefined;\n user?: string | undefined;\n bot?: boolean | undefined;\n ts?: string | undefined;\n attachments?: unknown;\n blocks?: unknown;\n metadata?: unknown;\n replyBroadcast?: boolean | undefined;\n unfurlLinks?: boolean | undefined;\n unfurlMedia?: boolean | undefined;\n },\n): SlackMessage {\n const ts = params.ts ?? nextSlackTs(state);\n return {\n ...(params.attachments ? { attachments: params.attachments } : {}),\n ...(params.blocks ? { blocks: params.blocks } : {}),\n ...(params.bot ? { bot_id: state.botId } : {}),\n channel: params.channel,\n ...(params.metadata ? { metadata: params.metadata } : {}),\n ...(params.replyBroadcast === undefined ? {} : { reply_broadcast: params.replyBroadcast }),\n text: params.text,\n ...(params.threadTs ? { thread_ts: params.threadTs } : {}),\n ts,\n type: \"message\",\n ...(params.unfurlLinks === undefined ? {} : { unfurl_links: params.unfurlLinks }),\n ...(params.unfurlMedia === undefined ? {} : { unfurl_media: params.unfurlMedia }),\n user: params.user ?? (params.bot ? state.botUserId : \"UCRABUSER\"),\n };\n}\n\nfunction asSlackEventCallback(state: SlackServerState, message: SlackMessage) {\n return {\n api_app_id: \"ACRABLINE\",\n authorizations: [\n {\n enterprise_id: null,\n is_bot: true,\n is_enterprise_install: false,\n team_id: \"TCRABLINE\",\n user_id: state.botUserId,\n },\n ],\n event: message,\n event_id: `Ev${message.ts.replace(\".\", \"\")}`,\n event_time: Number(message.ts.slice(0, 10)),\n team_id: \"TCRABLINE\",\n token: \"crabline-event-token\",\n type: \"event_callback\",\n };\n}\n\nfunction slackRequestSignature(signingSecret: string, timestamp: string, body: string): string {\n const digest = createHmac(\"sha256\", signingSecret)\n .update(`v0:${timestamp}:${body}`)\n .digest(\"hex\");\n return `v0=${digest}`;\n}\n\nfunction authenticateSlackEventsRequest(\n request: IncomingMessage,\n state: SlackServerState,\n rawBody: string,\n): Response | undefined {\n const timestampHeader = request.headers[\"x-slack-request-timestamp\"];\n const signatureHeader = request.headers[\"x-slack-signature\"];\n const timestamp = Array.isArray(timestampHeader) ? timestampHeader[0] : timestampHeader;\n const signature = Array.isArray(signatureHeader) ? signatureHeader[0] : signatureHeader;\n const timestampSeconds = timestamp ? Number(timestamp) : Number.NaN;\n if (\n !timestamp ||\n !signature ||\n !Number.isSafeInteger(timestampSeconds) ||\n Math.abs(Date.now() / 1000 - timestampSeconds) > SLACK_SIGNATURE_TOLERANCE_SECONDS\n ) {\n return new Response(\"unauthorized\", { status: 401 });\n }\n const expected = Buffer.from(slackRequestSignature(state.signingSecret, timestamp, rawBody));\n const actual = Buffer.from(signature);\n if (actual.length !== expected.length || !timingSafeEqual(actual, expected)) {\n return new Response(\"unauthorized\", { status: 401 });\n }\n return undefined;\n}\n\nfunction errorChain(error: unknown): Array<Record<string, unknown>> {\n const chain: Array<Record<string, unknown>> = [];\n let current = error;\n while (current && typeof current === \"object\" && chain.length < 4) {\n const entry = current as Record<string, unknown>;\n chain.push(entry);\n current = entry.cause;\n }\n return chain;\n}\n\n/** @internal */\nexport function classifySlackRetryReason(error: unknown): SlackRetryReason {\n if (error instanceof SlackEventHttpError) {\n return \"http_error\";\n }\n if (error instanceof SlackEventTargetError) {\n return error.retryReason;\n }\n const chain = errorChain(error);\n const names = chain.map((entry) => String(entry.name ?? \"\"));\n const codes = chain.map((entry) => String(entry.code ?? \"\").toUpperCase());\n const messages = chain.map((entry) => String(entry.message ?? \"\").toLowerCase());\n if (\n codes.includes(\"UND_ERR_REDIRECT\") ||\n messages.some((message) => message.includes(\"redirect count exceeded\"))\n ) {\n return \"too_many_redirects\";\n }\n if (\n names.some((name) => name === \"AbortError\" || name === \"TimeoutError\") ||\n codes.some((code) =>\n [\"ETIMEDOUT\", \"UND_ERR_BODY_TIMEOUT\", \"UND_ERR_HEADERS_TIMEOUT\"].includes(code),\n )\n ) {\n return \"http_timeout\";\n }\n if (\n codes.some(\n (code) =>\n code.includes(\"CERT\") ||\n code.includes(\"SSL\") ||\n code.includes(\"TLS\") ||\n code === \"UNABLE_TO_VERIFY_LEAF_SIGNATURE\",\n )\n ) {\n return \"ssl_error\";\n }\n if (\n codes.some((code) =>\n [\n \"EAI_AGAIN\",\n \"ECONNREFUSED\",\n \"ECONNRESET\",\n \"EHOSTUNREACH\",\n \"ENETUNREACH\",\n \"ENOTFOUND\",\n \"UND_ERR_CONNECT_TIMEOUT\",\n \"UND_ERR_SOCKET\",\n ].includes(code),\n )\n ) {\n return \"connection_failed\";\n }\n return \"unknown_error\";\n}\n\nfunction slackResponseHeader(response: WebhookResponse, name: string): string | undefined {\n const value = response.headers[name];\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction slackTargetRetryReason(error: WebhookTargetError): SlackRetryReason {\n return error === \"https-required\" ? \"ssl_error\" : \"connection_failed\";\n}\n\n/** @internal */\nexport async function postSlackEventToAddresses(params: {\n addresses?: ReadonlyArray<WebhookAddress> | undefined;\n body: string;\n headerEntries: ReadonlyArray<readonly [string, string]>;\n request?: typeof postWebhookRequestWithResponse;\n signal: AbortSignal;\n timeoutAt: number;\n url: URL;\n}): Promise<WebhookResponse> {\n const addresses: Array<WebhookAddress | undefined> =\n params.addresses && params.addresses.length > 0 ? [...params.addresses] : [undefined];\n const request = params.request ?? postWebhookRequestWithResponse;\n let lastError: unknown;\n for (const [index, address] of addresses.entries()) {\n const remainingMs = params.timeoutAt - Date.now();\n if (remainingMs <= 0) {\n throw new DOMException(\"Slack Events API delivery timed out\", \"TimeoutError\");\n }\n const attemptsRemaining = addresses.length - index;\n try {\n return await request({\n address,\n body: params.body,\n headerEntries: params.headerEntries,\n signal: params.signal,\n timeoutMs: Math.max(1, Math.floor(remainingMs / attemptsRemaining)),\n url: params.url,\n });\n } catch (error) {\n lastError = error;\n if (params.signal.aborted) {\n throw error;\n }\n }\n }\n throw lastError;\n}\n\nasync function postSlackEventRequest(params: {\n body: string;\n headerEntries: ReadonlyArray<readonly [string, string]>;\n signal: AbortSignal;\n state: SlackServerState;\n timeoutAt: number;\n url: URL;\n}): Promise<WebhookResponse> {\n const target = await validateWebhookTarget({\n allowLoopbackHttp: params.state.allowLoopbackHttpEvents,\n restrictPrivateAddresses: params.state.restrictEventTargets,\n signal: params.signal,\n url: params.url,\n });\n if (\"error\" in target) {\n throw new SlackEventTargetError(slackTargetRetryReason(target.error), target.error);\n }\n\n return await postSlackEventToAddresses({\n addresses: target.addresses,\n body: params.body,\n headerEntries: params.headerEntries,\n signal: params.signal,\n timeoutAt: params.timeoutAt,\n url: params.url,\n });\n}\n\nasync function waitForSlackRetry(delayMs: number, signal: AbortSignal): Promise<boolean> {\n if (signal.aborted) {\n return false;\n }\n return await new Promise<boolean>((resolve) => {\n let settled = false;\n const finish = (completed: boolean) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", onAbort);\n resolve(completed);\n };\n const onAbort = () => finish(false);\n const timer = setTimeout(() => finish(true), delayMs);\n timer.unref();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted) {\n onAbort();\n }\n });\n}\n\nasync function deliverSlackEvent(\n state: SlackServerState,\n event: ReturnType<typeof asSlackEventCallback>,\n lifecycleSignal: AbortSignal,\n): Promise<void> {\n if (!state.eventsRequestUrl) {\n return undefined;\n }\n const body = JSON.stringify(event);\n let retryReason: SlackRetryReason | undefined;\n for (let attempt = 0; attempt <= SLACK_EVENT_MAX_RETRIES; attempt += 1) {\n if (lifecycleSignal.aborted) {\n return;\n }\n try {\n const timestamp = Math.floor(Date.now() / 1000).toString();\n const headerEntries = [\n [\"content-type\", \"application/json\"],\n ...(attempt > 0\n ? ([\n [\"x-slack-retry-num\", String(attempt)],\n [\"x-slack-retry-reason\", retryReason ?? \"unknown_error\"],\n ] as const)\n : []),\n [\"x-slack-request-timestamp\", timestamp],\n [\"x-slack-signature\", slackRequestSignature(state.signingSecret, timestamp, body)],\n ] as const;\n const signal = AbortSignal.any([lifecycleSignal, AbortSignal.timeout(3_000)]);\n const timeoutAt = Date.now() + 3_000;\n let requestUrl = new URL(state.eventsRequestUrl);\n let response: WebhookResponse | undefined;\n for (let redirectCount = 0; ; redirectCount += 1) {\n response = await postSlackEventRequest({\n body,\n headerEntries,\n signal,\n state,\n timeoutAt,\n url: requestUrl,\n });\n const noRetry = slackResponseHeader(response, \"x-slack-no-retry\") === \"1\";\n if (noRetry) {\n return;\n }\n const location = slackResponseHeader(response, \"location\");\n if (![301, 302].includes(response.status) || !location) {\n break;\n }\n if (redirectCount >= SLACK_EVENT_MAX_REDIRECTS) {\n response = undefined;\n retryReason = \"too_many_redirects\";\n break;\n }\n requestUrl = new URL(location, requestUrl);\n }\n if (response) {\n if (response.status >= 200 && response.status < 300) {\n return;\n }\n throw new SlackEventHttpError(response.status);\n }\n } catch (error) {\n if (lifecycleSignal.aborted) {\n return;\n }\n retryReason = classifySlackRetryReason(error);\n }\n const retryDelay = SLACK_EVENT_RETRY_DELAYS_MS[attempt];\n if (retryDelay !== undefined && !(await waitForSlackRetry(retryDelay, lifecycleSignal))) {\n return;\n }\n }\n}\n\nfunction scheduleSlackEventDelivery(\n state: SlackServerState,\n event: ReturnType<typeof asSlackEventCallback>,\n): void {\n if (!state.eventsRequestUrl || state.closing) {\n return;\n }\n const delivery = deliverSlackEvent(state, event, state.deliveryAbortController.signal).finally(\n () => {\n state.activeEventDeliveries.delete(delivery);\n },\n );\n state.activeEventDeliveries.add(delivery);\n}\n\nasync function handleSlackApi(params: {\n body: Record<string, unknown>;\n method: string;\n state: SlackServerState;\n}): Promise<Response> {\n switch (params.method) {\n case \"auth.test\":\n return slackOk({\n bot_id: params.state.botId,\n response_metadata: {\n scopes: [\n \"chat:write\",\n \"channels:history\",\n \"groups:history\",\n \"im:history\",\n \"mpim:history\",\n ],\n },\n team: \"Crabline\",\n team_id: \"TCRABLINE\",\n url: \"https://crabline.slack.test/\",\n user: \"crabline\",\n user_id: params.state.botUserId,\n });\n case \"chat.postMessage\": {\n const rateLimit = params.state.chatPostMessageRateLimit;\n if (rateLimit && rateLimit.remaining <= 0) {\n return slackRateLimited(rateLimit.retryAfterSeconds);\n }\n if (rateLimit) {\n rateLimit.remaining -= 1;\n }\n const requestedChannel = requireSlackSendTargetId(params.body.channel);\n if (requestedChannel instanceof Response) {\n return requestedChannel;\n }\n const channel = SLACK_USER_ID_RULE.pattern.test(requestedChannel)\n ? dmChannelForUser(params.state, requestedChannel)\n : requestedChannel;\n const text = readSlackText(params.body.text) ?? \"\";\n const attachments = readStructuredArray(params.body.attachments, \"invalid_attachments\");\n if (attachments instanceof Response) {\n return attachments;\n }\n const blocks = readStructuredArray(params.body.blocks, \"invalid_blocks\");\n if (blocks instanceof Response) {\n return blocks;\n }\n const metadata = readSlackMetadata(params.body.metadata);\n if (metadata instanceof Response) {\n return metadata;\n }\n if (\n !text &&\n !hasStructuredMessageContent(blocks) &&\n !hasStructuredMessageContent(attachments)\n ) {\n return slackError(\"no_text\");\n }\n if (text.length > 40_000) {\n return slackError(\"msg_too_long\");\n }\n const threadTs = requireSlackThreadTs(params.body.thread_ts);\n if (threadTs instanceof Response) {\n return threadTs;\n }\n if (threadTs && !hasThreadParent(params.state, { channel, threadTs })) {\n return slackError(\"thread_not_found\");\n }\n const message = appendMessage(\n params.state,\n createSlackMessage(params.state, {\n attachments,\n blocks,\n bot: true,\n channel,\n metadata,\n replyBroadcast: readBoolean(params.body.reply_broadcast),\n text,\n threadTs,\n unfurlLinks: readBoolean(params.body.unfurl_links),\n unfurlMedia: readBoolean(params.body.unfurl_media),\n }),\n );\n return slackOk({ channel, message, ts: message.ts });\n }\n case \"conversations.open\": {\n const users = requireSlackUsers(params.body.users, params.state.botUserId);\n if (users instanceof Response) {\n return users;\n }\n if (users.length > 1) {\n const channel = mpimChannelForUsers(params.state, users);\n return slackOk({\n channel: {\n id: channel.id,\n is_group: false,\n is_mpim: true,\n is_private: true,\n members: [params.state.botUserId, ...channel.users],\n },\n });\n }\n const user = users[0]!;\n return slackOk({\n channel: {\n id: dmChannelForUser(params.state, user),\n is_im: true,\n user,\n },\n });\n }\n case \"conversations.info\": {\n const channel = requireSlackChannelId(params.body.channel);\n if (channel instanceof Response) {\n return channel;\n }\n const conversation = slackConversation(params.state, channel);\n return conversation ? slackOk({ channel: conversation }) : slackError(\"channel_not_found\");\n }\n case \"conversations.list\": {\n const types = requireSlackConversationTypes(params.body.types);\n if (types instanceof Response) {\n return types;\n }\n const limit = requireSlackLimit(params.body.limit);\n if (limit instanceof Response) {\n return limit;\n }\n const boundary = decodeSlackCursor(params.body.cursor, \"list\");\n if (boundary instanceof Response) {\n return boundary;\n }\n const remaining = slackConversations(params.state).filter((conversation) => {\n const channelId = readTrimmedString(conversation.id);\n return channelId && (boundary === undefined || channelId > boundary);\n });\n const virtualPage = remaining.slice(0, limit);\n const channels = virtualPage.filter((conversation) =>\n types.has(slackConversationType(conversation)),\n );\n const hasMore = virtualPage.length < remaining.length;\n const nextBoundary = readTrimmedString(virtualPage.at(-1)?.id);\n return slackOk({\n channels,\n response_metadata: {\n next_cursor: hasMore && nextBoundary ? encodeSlackCursor(\"list\", nextBoundary) : \"\",\n },\n });\n }\n case \"conversations.history\": {\n const channel = requireSlackChannelId(params.body.channel);\n if (channel instanceof Response) {\n return channel;\n }\n if (!slackConversation(params.state, channel)) {\n return slackError(\"channel_not_found\");\n }\n const oldest = requireSlackThreadTs(params.body.oldest);\n if (oldest instanceof Response) {\n return oldest;\n }\n const latest = requireSlackThreadTs(params.body.latest);\n if (latest instanceof Response) {\n return latest;\n }\n const limit = requireSlackLimit(params.body.limit);\n if (limit instanceof Response) {\n return limit;\n }\n const boundary = decodeSlackCursor(params.body.cursor, \"history\");\n if (boundary instanceof Response) {\n return boundary;\n }\n const messages = messagesForChannel(params.state, channel).filter((message) => {\n if (message.thread_ts !== undefined && message.reply_broadcast !== true) {\n return false;\n }\n if (oldest && message.ts <= oldest) {\n return false;\n }\n if (latest && message.ts >= latest) {\n return false;\n }\n return true;\n });\n const ordered = [...messages]\n .reverse()\n .filter((message) => boundary === undefined || message.ts < boundary);\n const page = ordered.slice(0, limit);\n const hasMore = page.length < ordered.length;\n const nextBoundary = page.at(-1)?.ts;\n return slackOk({\n has_more: hasMore,\n messages: page,\n response_metadata: {\n next_cursor: hasMore && nextBoundary ? encodeSlackCursor(\"history\", nextBoundary) : \"\",\n },\n });\n }\n case \"conversations.replies\": {\n const channel = requireSlackChannelId(params.body.channel);\n if (channel instanceof Response) {\n return channel;\n }\n if (!slackConversation(params.state, channel)) {\n return slackError(\"channel_not_found\");\n }\n const ts = requireSlackThreadTs(params.body.ts);\n if (ts instanceof Response) {\n return ts;\n }\n if (!ts) {\n return slackError(\"message_not_found\");\n }\n const threadTs = resolveThreadTs(params.state, { channel, ts });\n if (!threadTs) {\n return slackError(\"thread_not_found\");\n }\n const limit = requireSlackLimit(params.body.limit);\n if (limit instanceof Response) {\n return limit;\n }\n const boundary = decodeSlackCursor(params.body.cursor, \"replies\");\n if (boundary instanceof Response) {\n return boundary;\n }\n const messages = messagesForChannel(params.state, channel).filter(\n (message) =>\n (message.ts === threadTs || message.thread_ts === threadTs) &&\n (boundary === undefined || message.ts > boundary),\n );\n const page = messages.slice(0, limit);\n const hasMore = page.length < messages.length;\n const nextBoundary = page.at(-1)?.ts;\n return slackOk({\n has_more: hasMore,\n messages: page,\n response_metadata: {\n next_cursor: hasMore && nextBoundary ? encodeSlackCursor(\"replies\", nextBoundary) : \"\",\n },\n });\n }\n default:\n return slackError(\"unknown_method\", 404);\n }\n}\n\nasync function handleAdminInbound(params: {\n body: Record<string, unknown>;\n state: SlackServerState;\n}): Promise<Response> {\n const channel = requireSlackChannelId(params.body.channel);\n if (channel instanceof Response) {\n return channel;\n }\n if (params.body.text !== undefined && typeof params.body.text !== \"string\") {\n return slackError(\"invalid_text\", 400);\n }\n const text = readSlackText(params.body.text) ?? \"\";\n const attachments = readStructuredArray(params.body.attachments, \"invalid_attachments\");\n if (attachments instanceof Response) {\n return attachments;\n }\n const blocks = readStructuredArray(params.body.blocks, \"invalid_blocks\");\n if (blocks instanceof Response) {\n return blocks;\n }\n const user = requireSlackUserId(params.body.user ?? \"UCRABUSER\");\n if (user instanceof Response) {\n return user;\n }\n rememberDmChannel(params.state, user, channel);\n const threadTs = requireSlackThreadTs(params.body.threadTs ?? params.body.thread_ts);\n if (threadTs instanceof Response) {\n return threadTs;\n }\n if (threadTs && !hasThreadParent(params.state, { channel, threadTs })) {\n return slackError(\"thread_not_found\");\n }\n const ts = requireSlackThreadTs(params.body.ts);\n if (ts instanceof Response) {\n return ts;\n }\n const message = appendMessage(\n params.state,\n createSlackMessage(params.state, {\n attachments,\n blocks,\n channel,\n text,\n threadTs,\n ts,\n user,\n }),\n );\n const event = asSlackEventCallback(params.state, message);\n scheduleSlackEventDelivery(params.state, event);\n return slackOk({ event, message });\n}\n\nasync function handleRequest(params: { request: IncomingMessage; state: SlackServerState }) {\n const url = new URL(params.request.url ?? \"/\", \"http://127.0.0.1\");\n if (url.pathname === \"/crabline/slack/inbound\") {\n if (params.request.method !== \"POST\") {\n return new Response(\"not found\", { status: 404 });\n }\n if (!hasAdminToken(params.request, params.state.adminToken)) {\n params.request.resume();\n return adminAuthError();\n }\n const body = await parseUnknownRequestBody(params.request);\n if (!isJsonObject(body)) {\n return slackError(\"invalid_json\", 400);\n }\n await appendEvent(params.state, {\n at: new Date().toISOString(),\n body,\n method: params.request.method,\n path: url.pathname,\n query: queryRecord(url),\n type: \"admin\",\n });\n return await handleAdminInbound({ body, state: params.state });\n }\n\n const query = queryRecord(url);\n if (url.pathname === \"/slack/events\") {\n if (params.request.method !== \"POST\") {\n params.request.resume();\n return new Response(\"method not allowed\", {\n headers: { allow: \"POST\" },\n status: 405,\n });\n }\n if (\n !params.request.headers[\"x-slack-request-timestamp\"] ||\n !params.request.headers[\"x-slack-signature\"]\n ) {\n params.request.resume();\n return new Response(\"unauthorized\", { status: 401 });\n }\n const rawBody = (await readBody(params.request)).toString(\"utf8\");\n const authError = authenticateSlackEventsRequest(params.request, params.state, rawBody);\n if (authError) {\n return authError;\n }\n let body: unknown;\n try {\n body = rawBody ? (JSON.parse(rawBody) as unknown) : {};\n } catch (error) {\n throw new InvalidJsonBodyError(error);\n }\n if (!isJsonObject(body)) {\n return slackError(\"invalid_json\", 400);\n }\n if (body.type === \"url_verification\") {\n return jsonResponse({ challenge: readTrimmedString(body.challenge) ?? \"\" });\n }\n if (!readTrimmedString(body.type)) {\n return slackError(\"invalid_payload\", 400);\n }\n return new Response(null, { status: 200 });\n }\n\n const methodMatch = /^\\/api\\/([a-z]+(?:\\.[a-zA-Z]+)*)$/u.exec(url.pathname);\n if (!methodMatch?.[1]) {\n return new Response(\"not found\", { status: 404 });\n }\n const requestMethod = params.request.method ?? \"GET\";\n if (requestMethod !== \"GET\" && requestMethod !== \"POST\") {\n params.request.resume();\n return new Response(\"method not allowed\", {\n headers: { allow: \"GET, POST\" },\n status: 405,\n });\n }\n\n if (params.request.headers.authorization) {\n const headerAuthError = requireSlackToken(params.request, {}, params.state);\n if (headerAuthError) {\n params.request.resume();\n return headerAuthError;\n }\n }\n const body = requestMethod === \"GET\" ? query : await parseUnknownRequestBody(params.request);\n if (!isJsonObject(body)) {\n return slackError(\"json_not_object\", 400);\n }\n const authError = requireSlackToken(params.request, body, params.state);\n if (authError) {\n return authError;\n }\n const event: SlackRecorderEvent = {\n at: new Date().toISOString(),\n body: redactSlackAuthFields(body),\n method: params.request.method ?? \"GET\",\n path: url.pathname,\n query: redactSlackAuthQuery(query),\n type: \"api\",\n };\n const response = await handleSlackApi({\n body,\n method: methodMatch[1],\n state: params.state,\n });\n const mutation = [\"chat.postMessage\", \"conversations.open\"].includes(methodMatch[1]);\n const recordsAcceptance = mutation || methodMatch[1] === \"auth.test\";\n const payload = recordsAcceptance\n ? ((await response\n .clone()\n .json()\n .catch(() => undefined)) as unknown)\n : undefined;\n const committed = isJsonObject(payload) && payload.ok === true;\n if (methodMatch[1] === \"auth.test\" || methodMatch[1] === \"chat.postMessage\") {\n event.accepted = committed;\n }\n await appendEvent(params.state, event, mutation && committed);\n return response;\n}\n\nexport async function startSlackServer(\n params: StartSlackServerParams = {},\n): Promise<StartedSlackServer> {\n const host = params.host ?? \"127.0.0.1\";\n const externallyBound = !isLoopbackHost(host);\n const state: SlackServerState = {\n activeEventDeliveries: new Set(),\n adminToken: params.adminToken ?? randomBytes(24).toString(\"base64url\"),\n allowLoopbackHttpEvents: isLoopbackHost(host),\n botId: params.botId ?? \"BCRABLINE\",\n botToken: params.botToken ?? \"xoxb-crabline-slack-token\",\n botUserId: params.botUserId ?? \"UCRABBOT\",\n chatPostMessageRateLimit: resolveChatPostMessageRateLimit(params.chatPostMessageRateLimit),\n closing: false,\n deliveryAbortController: new AbortController(),\n eventsRequestUrl: params.eventsRequestUrl,\n nextDmIndex: 1,\n nextMpimIndex: 1,\n nextTsIndex: 100,\n onEvent: params.onEvent,\n recorderPath: params.recorderPath ?? path.resolve(\".crabline\", \"servers\", \"slack.jsonl\"),\n restrictEventTargets: true,\n signingSecret: params.signingSecret ?? \"crabline-slack-signing-secret\",\n userDmChannels: new Map(),\n userMpimChannels: new Map(),\n messagesByChannel: new Map(),\n };\n if (externallyBound && !params.botToken) {\n const generatedBotValue = `xoxb-${randomDecimalDigits(12)}-${randomDecimalDigits(12)}-${randomBytes(18).toString(\"base64url\")}`;\n state.botToken = generatedBotValue;\n }\n if (externallyBound && !params.signingSecret) {\n const generatedSigningValue = randomBytes(16).toString(\"hex\");\n state.signingSecret = generatedSigningValue;\n }\n const httpServer = await startHttpJsonServer({\n handle: (request) => handleRequest({ request, state }),\n handleError: (error) => {\n if (error instanceof InvalidJsonBodyError) {\n return slackError(\"invalid_json\", 400);\n }\n if (error instanceof RequestBodyTooLargeError) {\n return slackError(\"request_too_large\", 413);\n }\n return undefined;\n },\n host,\n port: params.port ?? 0,\n serverName: \"Slack\",\n });\n const baseUrl = httpServer.baseUrl;\n const apiRoot = `${baseUrl}/api/`;\n return {\n async close() {\n state.closing = true;\n state.deliveryAbortController.abort();\n await Promise.allSettled(state.activeEventDeliveries);\n await httpServer.close();\n },\n manifest: {\n adminToken: state.adminToken,\n baseUrl,\n botToken: state.botToken,\n endpoints: {\n adminInboundUrl: `${baseUrl}/crabline/slack/inbound`,\n apiRoot,\n eventsUrl: `${baseUrl}/slack/events`,\n },\n env: {\n SLACK_API_URL: apiRoot,\n SLACK_BOT_TOKEN: state.botToken,\n SLACK_SIGNING_SECRET: state.signingSecret,\n },\n provider: \"slack\",\n recorderPath: state.recorderPath,\n signingSecret: state.signingSecret,\n version: 1,\n },\n };\n}\n"]}
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/servers/slack.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage } from \"node:http\";\nimport { createHmac, randomBytes, randomInt, timingSafeEqual } from \"node:crypto\";\nimport path from \"node:path\";\nimport {\n adminAuthError,\n createServerClose,\n hasAdminToken,\n InvalidJsonBodyError,\n isJsonObject,\n isLoopbackHost,\n jsonResponse,\n parseUnknownRequestBody,\n queryRecord,\n readBody,\n readInteger,\n readTrimmedString,\n RequestBodyTooLargeError,\n startHttpJsonServer,\n type ServerRequestEvent,\n} from \"./http.js\";\nimport {\n SLACK_CHANNEL_ID_RULE,\n SLACK_SEND_TARGET_ID_RULE,\n SLACK_TS_RULE,\n SLACK_USER_ID_RULE,\n} from \"../providers/slack-ids.js\";\nimport { createServerRecorder, type ServerRecorder, type ServerEventObserver } from \"./recorder.js\";\nimport {\n postWebhookRequestWithResponse,\n validateWebhookTarget,\n type WebhookAddress,\n type WebhookResponse,\n type WebhookTargetError,\n} from \"./webhook-target.js\";\n\nconst SLACK_SIGNATURE_TOLERANCE_SECONDS = 5 * 60;\nconst SLACK_EVENT_MAX_RETRIES = 3;\nconst SLACK_EVENT_MAX_REDIRECTS = 2;\nconst SLACK_EVENT_RETRY_DELAYS_MS = [0, 60_000, 5 * 60_000] as const;\n\ntype SlackMessage = {\n attachments?: unknown;\n blocks?: unknown;\n bot_id?: string;\n channel: string;\n metadata?: unknown;\n reply_broadcast?: boolean;\n text: string;\n thread_ts?: string;\n ts: string;\n type: \"message\";\n unfurl_links?: boolean;\n unfurl_media?: boolean;\n user: string;\n};\n\ntype SlackServerState = {\n activeEventDeliveries: Set<Promise<void>>;\n adminToken: string;\n allowLoopbackHttpEvents: boolean;\n botId: string;\n botToken: string;\n botUserId: string;\n chatPostMessageRateLimit:\n | {\n remaining: number;\n retryAfterSeconds: number;\n }\n | undefined;\n closing: boolean;\n deliveryAbortController: AbortController;\n eventsRequestUrl: string | undefined;\n nextDmIndex: number;\n nextMpimIndex: number;\n nextTsIndex: number;\n recorder: ServerRecorder;\n recorderPath: string;\n restrictEventTargets: boolean;\n signingSecret: string;\n userDmChannels: Map<string, string>;\n userMpimChannels: Map<string, { id: string; users: string[] }>;\n messagesByChannel: Map<string, SlackMessage[]>;\n};\ntype SlackRecorderEvent = ServerRequestEvent & {\n accepted?: boolean | undefined;\n};\n\ntype SlackRetryReason =\n | \"connection_failed\"\n | \"http_error\"\n | \"http_timeout\"\n | \"ssl_error\"\n | \"too_many_redirects\"\n | \"unknown_error\";\n\ntype SlackCursorKind = \"history\" | \"list\" | \"replies\";\n\nclass SlackEventHttpError extends Error {\n constructor(readonly status: number) {\n super(`Slack Events API delivery failed with HTTP ${status}.`);\n this.name = \"SlackEventHttpError\";\n }\n}\n\nclass SlackEventTargetError extends Error {\n constructor(\n readonly retryReason: SlackRetryReason,\n targetError: WebhookTargetError,\n ) {\n super(`Slack Events API target rejected: ${targetError}`);\n this.name = \"SlackEventTargetError\";\n }\n}\n\nexport type SlackServerManifest = {\n adminToken: string;\n baseUrl: string;\n botToken: string;\n endpoints: {\n adminInboundUrl: string;\n apiRoot: string;\n eventsUrl: string;\n };\n env: {\n SLACK_API_URL: string;\n SLACK_BOT_TOKEN: string;\n SLACK_SIGNING_SECRET: string;\n };\n provider: \"slack\";\n recorderPath: string;\n signingSecret: string;\n version: 1;\n};\n\nexport type StartedSlackServer = {\n close(): Promise<void>;\n manifest: SlackServerManifest;\n};\n\nexport type StartSlackServerParams = {\n adminToken?: string | undefined;\n botId?: string | undefined;\n botToken?: string | undefined;\n botUserId?: string | undefined;\n chatPostMessageRateLimit?:\n | {\n remaining: number;\n retryAfterSeconds: number;\n }\n | undefined;\n eventsRequestUrl?: string | undefined;\n host?: string | undefined;\n onEvent?: ServerEventObserver | undefined;\n port?: number | undefined;\n recorderPath?: string | undefined;\n signingSecret?: string | undefined;\n};\n\nfunction slackOk(result: Record<string, unknown> = {}): Response {\n return jsonResponse({ ok: true, ...result });\n}\n\nfunction slackError(error: string, status = 200): Response {\n return jsonResponse({ error, ok: false }, status);\n}\n\nfunction slackRateLimited(retryAfterSeconds = 1): Response {\n return new Response(JSON.stringify({ error: \"ratelimited\", ok: false }), {\n headers: {\n \"content-type\": \"application/json\",\n \"retry-after\": String(retryAfterSeconds),\n },\n status: 429,\n });\n}\n\nfunction resolveChatPostMessageRateLimit(\n value: StartSlackServerParams[\"chatPostMessageRateLimit\"],\n): SlackServerState[\"chatPostMessageRateLimit\"] {\n if (value === undefined) {\n return undefined;\n }\n if (!Number.isSafeInteger(value.remaining) || value.remaining < 0) {\n throw new Error(\"chatPostMessageRateLimit.remaining must be a non-negative safe integer.\");\n }\n if (!Number.isSafeInteger(value.retryAfterSeconds) || value.retryAfterSeconds < 1) {\n throw new Error(\"chatPostMessageRateLimit.retryAfterSeconds must be a positive safe integer.\");\n }\n return { ...value };\n}\n\nfunction requireSlackToken(\n request: IncomingMessage,\n body: Record<string, unknown>,\n state: SlackServerState,\n): Response | undefined {\n const authorization = request.headers.authorization;\n let tokenFromHeader: string | undefined;\n if (typeof authorization === \"string\") {\n const trimmed = authorization.trim();\n if (trimmed.slice(0, 6).toLowerCase() === \"bearer\" && /\\s/u.test(trimmed[6] ?? \"\")) {\n let tokenStart = 7;\n while (tokenStart < trimmed.length && /\\s/u.test(trimmed[tokenStart]!)) {\n tokenStart += 1;\n }\n tokenFromHeader = trimmed.slice(tokenStart).trim() || undefined;\n }\n }\n const token = tokenFromHeader ?? readTrimmedString(body.token);\n if (!token) {\n return slackError(\"not_authed\");\n }\n if (token !== state.botToken) {\n return slackError(\"invalid_auth\");\n }\n return undefined;\n}\n\nfunction requireSlackChannelId(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n if (!stringValue || !SLACK_CHANNEL_ID_RULE.pattern.test(stringValue)) {\n return slackError(\"channel_not_found\");\n }\n return stringValue;\n}\n\nfunction requireSlackSendTargetId(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n if (!stringValue || !SLACK_SEND_TARGET_ID_RULE.pattern.test(stringValue)) {\n return slackError(\"channel_not_found\");\n }\n return stringValue;\n}\n\nfunction requireSlackUserId(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n if (!stringValue || !SLACK_USER_ID_RULE.pattern.test(stringValue)) {\n return slackError(\"invalid_users\");\n }\n return stringValue;\n}\n\nfunction requireSlackThreadTs(value: unknown): string | Response | undefined {\n const stringValue = readTrimmedString(value);\n if (!stringValue) {\n return undefined;\n }\n if (!SLACK_TS_RULE.pattern.test(stringValue)) {\n return slackError(\"invalid_ts\");\n }\n return stringValue;\n}\n\nfunction readBoolean(value: unknown): boolean | undefined {\n if (typeof value === \"boolean\") {\n return value;\n }\n const stringValue = readTrimmedString(value)?.toLowerCase();\n if (stringValue === \"true\" || stringValue === \"1\") {\n return true;\n }\n if (stringValue === \"false\" || stringValue === \"0\") {\n return false;\n }\n return undefined;\n}\n\nfunction readSlackText(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction readStructuredValue(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n const stringValue = value.trim();\n if (!stringValue) {\n return undefined;\n }\n try {\n return JSON.parse(stringValue) as unknown;\n } catch {\n return value;\n }\n}\n\nfunction readStructuredArray(value: unknown, error: string): unknown[] | Response | undefined {\n if (value === undefined) {\n return undefined;\n }\n const parsed = readStructuredValue(value);\n return Array.isArray(parsed) ? parsed : slackError(error);\n}\n\nfunction readSlackMetadata(value: unknown): Record<string, unknown> | Response | undefined {\n if (value === undefined) {\n return undefined;\n }\n let parsed: unknown = value;\n if (typeof value === \"string\") {\n try {\n parsed = JSON.parse(value) as unknown;\n } catch {\n return slackError(\"invalid_metadata_format\");\n }\n }\n if (!isJsonObject(parsed)) {\n return slackError(\"invalid_metadata_format\");\n }\n if (!readTrimmedString(parsed.event_type) || !isJsonObject(parsed.event_payload)) {\n return slackError(\"invalid_metadata_schema\");\n }\n return parsed;\n}\n\nfunction hasStructuredMessageContent(value: unknown): boolean {\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n return Boolean(value && typeof value === \"object\");\n}\n\nfunction messagesForChannel(state: SlackServerState, channel: string): SlackMessage[] {\n return state.messagesByChannel.get(channel) ?? [];\n}\n\nfunction hasThreadParent(\n state: SlackServerState,\n params: {\n channel: string;\n threadTs: string;\n },\n): boolean {\n return messagesForChannel(state, params.channel).some(\n (message) => message.ts === params.threadTs && message.thread_ts === undefined,\n );\n}\n\nfunction resolveThreadTs(\n state: SlackServerState,\n params: {\n channel: string;\n ts: string;\n },\n): string | undefined {\n const message = messagesForChannel(state, params.channel).find(\n (candidate) => candidate.ts === params.ts,\n );\n return message?.thread_ts ?? message?.ts;\n}\n\nfunction nextSlackTs(state: SlackServerState): string {\n const index = state.nextTsIndex++;\n return `${1_700_000_000 + Math.floor(index / 1_000_000)}.${String(index % 1_000_000).padStart(6, \"0\")}`;\n}\n\nfunction randomDecimalDigits(length: number): string {\n return Array.from({ length }, () => randomInt(10)).join(\"\");\n}\n\nfunction nextDmChannelId(state: SlackServerState): string {\n for (;;) {\n const index = state.nextDmIndex++;\n const channelId = `D${String(index).padStart(9, \"0\")}`;\n if (\n !state.messagesByChannel.has(channelId) &&\n ![...state.userDmChannels.values()].includes(channelId)\n ) {\n return channelId;\n }\n }\n}\n\nfunction nextMpimChannelId(state: SlackServerState): string {\n for (;;) {\n const index = state.nextMpimIndex++;\n const channelId = `G${String(index).padStart(9, \"0\")}`;\n if (\n !state.messagesByChannel.has(channelId) &&\n ![...state.userMpimChannels.values()].some((channel) => channel.id === channelId)\n ) {\n return channelId;\n }\n }\n}\n\nfunction dmChannelForUser(state: SlackServerState, userId: string): string {\n const existing = state.userDmChannels.get(userId);\n if (existing) {\n return existing;\n }\n const channelId = nextDmChannelId(state);\n state.userDmChannels.set(userId, channelId);\n return channelId;\n}\n\nfunction rememberDmChannel(state: SlackServerState, userId: string, channelId: string): void {\n if (!channelId.startsWith(\"D\")) {\n return;\n }\n const mappedUser = [...state.userDmChannels].find(([, value]) => value === channelId)?.[0];\n if (mappedUser && mappedUser !== userId) {\n return;\n }\n state.userDmChannels.set(userId, channelId);\n}\n\nfunction mpimChannelForUsers(\n state: SlackServerState,\n users: string[],\n): { id: string; users: string[] } {\n const key = [...users].sort().join(\",\");\n const existing = state.userMpimChannels.get(key);\n if (existing) {\n return existing;\n }\n const channel = { id: nextMpimChannelId(state), users: [...users] };\n state.userMpimChannels.set(key, channel);\n return channel;\n}\n\nfunction requireSlackUsers(value: unknown, botUserId: string): string[] | Response {\n const rawUsers = readTrimmedString(value);\n if (!rawUsers) {\n return slackError(\"users_list_not_supplied\");\n }\n const users = rawUsers.split(\",\").map((user) => user.trim());\n if (users.length > 8) {\n return slackError(\"too_many_users\");\n }\n if (users.some((user) => !SLACK_USER_ID_RULE.pattern.test(user))) {\n return slackError(\"user_not_found\");\n }\n if (new Set(users).size !== users.length) {\n return slackError(\"invalid_user_combination\");\n }\n if (users.includes(botUserId)) {\n return slackError(\"invalid_user_combination\");\n }\n return users;\n}\n\nfunction requireSlackLimit(value: unknown): number | Response {\n const limit = value === undefined ? 100 : readInteger(value);\n if (limit === undefined || limit < 1 || limit > 1_000) {\n return slackError(\"invalid_limit\");\n }\n return limit;\n}\n\nfunction decodeSlackCursor(value: unknown, kind: SlackCursorKind): string | Response | undefined {\n if (value === undefined || value === \"\") {\n return undefined;\n }\n if (typeof value !== \"string\" || !/^[A-Za-z0-9_-]+$/u.test(value)) {\n return slackError(\"invalid_cursor\");\n }\n const cursor = value;\n try {\n const decoded = Buffer.from(cursor, \"base64url\").toString(\"utf8\");\n const prefix = `${kind}:`;\n if (!decoded.startsWith(prefix)) {\n return slackError(\"invalid_cursor\");\n }\n const boundary = decoded.slice(prefix.length);\n const validBoundary =\n kind === \"list\"\n ? SLACK_CHANNEL_ID_RULE.pattern.test(boundary)\n : SLACK_TS_RULE.pattern.test(boundary);\n return validBoundary && encodeSlackCursor(kind, boundary) === cursor\n ? boundary\n : slackError(\"invalid_cursor\");\n } catch {\n return slackError(\"invalid_cursor\");\n }\n}\n\nfunction encodeSlackCursor(kind: SlackCursorKind, boundary: string): string {\n return Buffer.from(`${kind}:${boundary}`, \"utf8\").toString(\"base64url\");\n}\n\nfunction appendMessage(state: SlackServerState, message: SlackMessage): SlackMessage {\n const messages = state.messagesByChannel.get(message.channel) ?? [];\n messages.push(message);\n state.messagesByChannel.set(message.channel, messages);\n return message;\n}\n\nfunction slackConversation(\n state: SlackServerState,\n channelId: string,\n): Record<string, unknown> | undefined {\n const dmUser = [...state.userDmChannels].find(([, value]) => value === channelId)?.[0];\n const mpim = [...state.userMpimChannels.values()].find((candidate) => candidate.id === channelId);\n const hasMessages = state.messagesByChannel.has(channelId);\n if (!dmUser && !mpim && !hasMessages) {\n return undefined;\n }\n if (dmUser) {\n return {\n id: channelId,\n is_channel: false,\n is_group: false,\n is_im: true,\n is_mpim: false,\n user: dmUser,\n };\n }\n if (mpim) {\n return {\n id: channelId,\n is_channel: false,\n is_group: false,\n is_im: false,\n is_mpim: true,\n is_private: true,\n members: [state.botUserId, ...mpim.users],\n name: \"crabline\",\n };\n }\n return {\n id: channelId,\n is_channel: channelId.startsWith(\"C\"),\n is_group: channelId.startsWith(\"G\"),\n is_im: channelId.startsWith(\"D\"),\n is_mpim: false,\n name: \"crabline\",\n };\n}\n\nfunction slackConversations(state: SlackServerState): Record<string, unknown>[] {\n const ids = new Set([\n ...state.messagesByChannel.keys(),\n ...state.userDmChannels.values(),\n ...[...state.userMpimChannels.values()].map((channel) => channel.id),\n ]);\n return [...ids]\n .sort()\n .map((channelId) => slackConversation(state, channelId))\n .filter((channel): channel is Record<string, unknown> => channel !== undefined);\n}\n\nfunction requireSlackConversationTypes(value: unknown): Set<string> | Response {\n const types = new Set(\n (readTrimmedString(value) ?? \"public_channel\")\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean),\n );\n const supported = new Set([\"im\", \"mpim\", \"private_channel\", \"public_channel\"]);\n return [...types].every((type) => supported.has(type)) ? types : slackError(\"invalid_types\");\n}\n\nfunction slackConversationType(conversation: Record<string, unknown>): string {\n if (conversation.is_im === true) {\n return \"im\";\n }\n if (conversation.is_mpim === true) {\n return \"mpim\";\n }\n return conversation.is_group === true ? \"private_channel\" : \"public_channel\";\n}\n\nasync function appendEvent(state: SlackServerState, event: ServerRequestEvent, committed = false) {\n await (committed ? state.recorder.recordCommitted(event) : state.recorder.record(event));\n}\n\nfunction redactSlackAuthFields(value: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n key.toLowerCase() === \"token\" ? \"[redacted]\" : entry,\n ]),\n );\n}\n\nfunction redactSlackAuthQuery(value: Record<string, string>): Record<string, string> {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n key.toLowerCase() === \"token\" ? \"[redacted]\" : entry,\n ]),\n );\n}\n\nfunction createSlackMessage(\n state: SlackServerState,\n params: {\n channel: string;\n text: string;\n threadTs?: string | undefined;\n user?: string | undefined;\n bot?: boolean | undefined;\n ts?: string | undefined;\n attachments?: unknown;\n blocks?: unknown;\n metadata?: unknown;\n replyBroadcast?: boolean | undefined;\n unfurlLinks?: boolean | undefined;\n unfurlMedia?: boolean | undefined;\n },\n): SlackMessage {\n const ts = params.ts ?? nextSlackTs(state);\n return {\n ...(params.attachments ? { attachments: params.attachments } : {}),\n ...(params.blocks ? { blocks: params.blocks } : {}),\n ...(params.bot ? { bot_id: state.botId } : {}),\n channel: params.channel,\n ...(params.metadata ? { metadata: params.metadata } : {}),\n ...(params.replyBroadcast === undefined ? {} : { reply_broadcast: params.replyBroadcast }),\n text: params.text,\n ...(params.threadTs ? { thread_ts: params.threadTs } : {}),\n ts,\n type: \"message\",\n ...(params.unfurlLinks === undefined ? {} : { unfurl_links: params.unfurlLinks }),\n ...(params.unfurlMedia === undefined ? {} : { unfurl_media: params.unfurlMedia }),\n user: params.user ?? (params.bot ? state.botUserId : \"UCRABUSER\"),\n };\n}\n\nfunction asSlackEventCallback(state: SlackServerState, message: SlackMessage) {\n return {\n api_app_id: \"ACRABLINE\",\n authorizations: [\n {\n enterprise_id: null,\n is_bot: true,\n is_enterprise_install: false,\n team_id: \"TCRABLINE\",\n user_id: state.botUserId,\n },\n ],\n event: message,\n event_id: `Ev${message.ts.replace(\".\", \"\")}`,\n event_time: Number(message.ts.slice(0, 10)),\n team_id: \"TCRABLINE\",\n token: \"crabline-event-token\",\n type: \"event_callback\",\n };\n}\n\nfunction slackRequestSignature(signingSecret: string, timestamp: string, body: string): string {\n const digest = createHmac(\"sha256\", signingSecret)\n .update(`v0:${timestamp}:${body}`)\n .digest(\"hex\");\n return `v0=${digest}`;\n}\n\nfunction authenticateSlackEventsRequest(\n request: IncomingMessage,\n state: SlackServerState,\n rawBody: string,\n): Response | undefined {\n const timestampHeader = request.headers[\"x-slack-request-timestamp\"];\n const signatureHeader = request.headers[\"x-slack-signature\"];\n const timestamp = Array.isArray(timestampHeader) ? timestampHeader[0] : timestampHeader;\n const signature = Array.isArray(signatureHeader) ? signatureHeader[0] : signatureHeader;\n const timestampSeconds = timestamp ? Number(timestamp) : Number.NaN;\n if (\n !timestamp ||\n !signature ||\n !Number.isSafeInteger(timestampSeconds) ||\n Math.abs(Date.now() / 1000 - timestampSeconds) > SLACK_SIGNATURE_TOLERANCE_SECONDS\n ) {\n return new Response(\"unauthorized\", { status: 401 });\n }\n const expected = Buffer.from(slackRequestSignature(state.signingSecret, timestamp, rawBody));\n const actual = Buffer.from(signature);\n if (actual.length !== expected.length || !timingSafeEqual(actual, expected)) {\n return new Response(\"unauthorized\", { status: 401 });\n }\n return undefined;\n}\n\nfunction errorChain(error: unknown): Array<Record<string, unknown>> {\n const chain: Array<Record<string, unknown>> = [];\n let current = error;\n while (current && typeof current === \"object\" && chain.length < 4) {\n const entry = current as Record<string, unknown>;\n chain.push(entry);\n current = entry.cause;\n }\n return chain;\n}\n\n/** @internal */\nexport function classifySlackRetryReason(error: unknown): SlackRetryReason {\n if (error instanceof SlackEventHttpError) {\n return \"http_error\";\n }\n if (error instanceof SlackEventTargetError) {\n return error.retryReason;\n }\n const chain = errorChain(error);\n const names = chain.map((entry) => String(entry.name ?? \"\"));\n const codes = chain.map((entry) => String(entry.code ?? \"\").toUpperCase());\n const messages = chain.map((entry) => String(entry.message ?? \"\").toLowerCase());\n if (\n codes.includes(\"UND_ERR_REDIRECT\") ||\n messages.some((message) => message.includes(\"redirect count exceeded\"))\n ) {\n return \"too_many_redirects\";\n }\n if (\n names.some((name) => name === \"AbortError\" || name === \"TimeoutError\") ||\n codes.some((code) =>\n [\"ETIMEDOUT\", \"UND_ERR_BODY_TIMEOUT\", \"UND_ERR_HEADERS_TIMEOUT\"].includes(code),\n )\n ) {\n return \"http_timeout\";\n }\n if (\n codes.some(\n (code) =>\n code.includes(\"CERT\") ||\n code.includes(\"SSL\") ||\n code.includes(\"TLS\") ||\n code === \"UNABLE_TO_VERIFY_LEAF_SIGNATURE\",\n )\n ) {\n return \"ssl_error\";\n }\n if (\n codes.some((code) =>\n [\n \"EAI_AGAIN\",\n \"ECONNREFUSED\",\n \"ECONNRESET\",\n \"EHOSTUNREACH\",\n \"ENETUNREACH\",\n \"ENOTFOUND\",\n \"UND_ERR_CONNECT_TIMEOUT\",\n \"UND_ERR_SOCKET\",\n ].includes(code),\n )\n ) {\n return \"connection_failed\";\n }\n return \"unknown_error\";\n}\n\nfunction slackResponseHeader(response: WebhookResponse, name: string): string | undefined {\n const value = response.headers[name];\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction slackTargetRetryReason(error: WebhookTargetError): SlackRetryReason {\n return error === \"https-required\" ? \"ssl_error\" : \"connection_failed\";\n}\n\n/** @internal */\nexport async function postSlackEventToAddresses(params: {\n addresses?: ReadonlyArray<WebhookAddress> | undefined;\n body: string;\n headerEntries: ReadonlyArray<readonly [string, string]>;\n request?: typeof postWebhookRequestWithResponse;\n signal: AbortSignal;\n timeoutAt: number;\n url: URL;\n}): Promise<WebhookResponse> {\n const addresses: Array<WebhookAddress | undefined> =\n params.addresses && params.addresses.length > 0 ? [...params.addresses] : [undefined];\n const request = params.request ?? postWebhookRequestWithResponse;\n let lastError: unknown;\n for (const [index, address] of addresses.entries()) {\n const remainingMs = params.timeoutAt - Date.now();\n if (remainingMs <= 0) {\n throw new DOMException(\"Slack Events API delivery timed out\", \"TimeoutError\");\n }\n const attemptsRemaining = addresses.length - index;\n try {\n return await request({\n address,\n body: params.body,\n headerEntries: params.headerEntries,\n signal: params.signal,\n timeoutMs: Math.max(1, Math.floor(remainingMs / attemptsRemaining)),\n url: params.url,\n });\n } catch (error) {\n lastError = error;\n if (params.signal.aborted) {\n throw error;\n }\n }\n }\n throw lastError;\n}\n\nasync function postSlackEventRequest(params: {\n body: string;\n headerEntries: ReadonlyArray<readonly [string, string]>;\n signal: AbortSignal;\n state: SlackServerState;\n timeoutAt: number;\n url: URL;\n}): Promise<WebhookResponse> {\n const target = await validateWebhookTarget({\n allowLoopbackHttp: params.state.allowLoopbackHttpEvents,\n restrictPrivateAddresses: params.state.restrictEventTargets,\n signal: params.signal,\n url: params.url,\n });\n if (\"error\" in target) {\n throw new SlackEventTargetError(slackTargetRetryReason(target.error), target.error);\n }\n\n return await postSlackEventToAddresses({\n addresses: target.addresses,\n body: params.body,\n headerEntries: params.headerEntries,\n signal: params.signal,\n timeoutAt: params.timeoutAt,\n url: params.url,\n });\n}\n\nasync function waitForSlackRetry(delayMs: number, signal: AbortSignal): Promise<boolean> {\n if (signal.aborted) {\n return false;\n }\n return await new Promise<boolean>((resolve) => {\n let settled = false;\n const finish = (completed: boolean) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", onAbort);\n resolve(completed);\n };\n const onAbort = () => finish(false);\n const timer = setTimeout(() => finish(true), delayMs);\n timer.unref();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted) {\n onAbort();\n }\n });\n}\n\nasync function deliverSlackEvent(\n state: SlackServerState,\n event: ReturnType<typeof asSlackEventCallback>,\n lifecycleSignal: AbortSignal,\n): Promise<void> {\n if (!state.eventsRequestUrl) {\n return undefined;\n }\n const body = JSON.stringify(event);\n let retryReason: SlackRetryReason | undefined;\n for (let attempt = 0; attempt <= SLACK_EVENT_MAX_RETRIES; attempt += 1) {\n if (lifecycleSignal.aborted) {\n return;\n }\n try {\n const timestamp = Math.floor(Date.now() / 1000).toString();\n const headerEntries = [\n [\"content-type\", \"application/json\"],\n ...(attempt > 0\n ? ([\n [\"x-slack-retry-num\", String(attempt)],\n [\"x-slack-retry-reason\", retryReason ?? \"unknown_error\"],\n ] as const)\n : []),\n [\"x-slack-request-timestamp\", timestamp],\n [\"x-slack-signature\", slackRequestSignature(state.signingSecret, timestamp, body)],\n ] as const;\n const signal = AbortSignal.any([lifecycleSignal, AbortSignal.timeout(3_000)]);\n const timeoutAt = Date.now() + 3_000;\n let requestUrl = new URL(state.eventsRequestUrl);\n let response: WebhookResponse | undefined;\n for (let redirectCount = 0; ; redirectCount += 1) {\n response = await postSlackEventRequest({\n body,\n headerEntries,\n signal,\n state,\n timeoutAt,\n url: requestUrl,\n });\n const noRetry = slackResponseHeader(response, \"x-slack-no-retry\") === \"1\";\n if (noRetry) {\n return;\n }\n const location = slackResponseHeader(response, \"location\");\n if (![301, 302].includes(response.status) || !location) {\n break;\n }\n if (redirectCount >= SLACK_EVENT_MAX_REDIRECTS) {\n response = undefined;\n retryReason = \"too_many_redirects\";\n break;\n }\n requestUrl = new URL(location, requestUrl);\n }\n if (response) {\n if (response.status >= 200 && response.status < 300) {\n return;\n }\n throw new SlackEventHttpError(response.status);\n }\n } catch (error) {\n if (lifecycleSignal.aborted) {\n return;\n }\n retryReason = classifySlackRetryReason(error);\n }\n const retryDelay = SLACK_EVENT_RETRY_DELAYS_MS[attempt];\n if (retryDelay !== undefined && !(await waitForSlackRetry(retryDelay, lifecycleSignal))) {\n return;\n }\n }\n}\n\nfunction scheduleSlackEventDelivery(\n state: SlackServerState,\n event: ReturnType<typeof asSlackEventCallback>,\n): void {\n if (!state.eventsRequestUrl || state.closing) {\n return;\n }\n const delivery = deliverSlackEvent(state, event, state.deliveryAbortController.signal).finally(\n () => {\n state.activeEventDeliveries.delete(delivery);\n },\n );\n state.activeEventDeliveries.add(delivery);\n}\n\nasync function handleSlackApi(params: {\n body: Record<string, unknown>;\n method: string;\n state: SlackServerState;\n}): Promise<Response> {\n switch (params.method) {\n case \"auth.test\":\n return slackOk({\n bot_id: params.state.botId,\n response_metadata: {\n scopes: [\n \"chat:write\",\n \"channels:history\",\n \"groups:history\",\n \"im:history\",\n \"mpim:history\",\n ],\n },\n team: \"Crabline\",\n team_id: \"TCRABLINE\",\n url: \"https://crabline.slack.test/\",\n user: \"crabline\",\n user_id: params.state.botUserId,\n });\n case \"chat.postMessage\": {\n const rateLimit = params.state.chatPostMessageRateLimit;\n if (rateLimit && rateLimit.remaining <= 0) {\n return slackRateLimited(rateLimit.retryAfterSeconds);\n }\n if (rateLimit) {\n rateLimit.remaining -= 1;\n }\n const requestedChannel = requireSlackSendTargetId(params.body.channel);\n if (requestedChannel instanceof Response) {\n return requestedChannel;\n }\n const channel = SLACK_USER_ID_RULE.pattern.test(requestedChannel)\n ? dmChannelForUser(params.state, requestedChannel)\n : requestedChannel;\n const text = readSlackText(params.body.text) ?? \"\";\n const attachments = readStructuredArray(params.body.attachments, \"invalid_attachments\");\n if (attachments instanceof Response) {\n return attachments;\n }\n const blocks = readStructuredArray(params.body.blocks, \"invalid_blocks\");\n if (blocks instanceof Response) {\n return blocks;\n }\n const metadata = readSlackMetadata(params.body.metadata);\n if (metadata instanceof Response) {\n return metadata;\n }\n if (\n !text &&\n !hasStructuredMessageContent(blocks) &&\n !hasStructuredMessageContent(attachments)\n ) {\n return slackError(\"no_text\");\n }\n if (text.length > 40_000) {\n return slackError(\"msg_too_long\");\n }\n const threadTs = requireSlackThreadTs(params.body.thread_ts);\n if (threadTs instanceof Response) {\n return threadTs;\n }\n if (threadTs && !hasThreadParent(params.state, { channel, threadTs })) {\n return slackError(\"thread_not_found\");\n }\n const message = appendMessage(\n params.state,\n createSlackMessage(params.state, {\n attachments,\n blocks,\n bot: true,\n channel,\n metadata,\n replyBroadcast: readBoolean(params.body.reply_broadcast),\n text,\n threadTs,\n unfurlLinks: readBoolean(params.body.unfurl_links),\n unfurlMedia: readBoolean(params.body.unfurl_media),\n }),\n );\n return slackOk({ channel, message, ts: message.ts });\n }\n case \"conversations.open\": {\n const users = requireSlackUsers(params.body.users, params.state.botUserId);\n if (users instanceof Response) {\n return users;\n }\n if (users.length > 1) {\n const channel = mpimChannelForUsers(params.state, users);\n return slackOk({\n channel: {\n id: channel.id,\n is_group: false,\n is_mpim: true,\n is_private: true,\n members: [params.state.botUserId, ...channel.users],\n },\n });\n }\n const user = users[0]!;\n return slackOk({\n channel: {\n id: dmChannelForUser(params.state, user),\n is_im: true,\n user,\n },\n });\n }\n case \"conversations.info\": {\n const channel = requireSlackChannelId(params.body.channel);\n if (channel instanceof Response) {\n return channel;\n }\n const conversation = slackConversation(params.state, channel);\n return conversation ? slackOk({ channel: conversation }) : slackError(\"channel_not_found\");\n }\n case \"conversations.list\": {\n const types = requireSlackConversationTypes(params.body.types);\n if (types instanceof Response) {\n return types;\n }\n const limit = requireSlackLimit(params.body.limit);\n if (limit instanceof Response) {\n return limit;\n }\n const boundary = decodeSlackCursor(params.body.cursor, \"list\");\n if (boundary instanceof Response) {\n return boundary;\n }\n const remaining = slackConversations(params.state).filter((conversation) => {\n const channelId = readTrimmedString(conversation.id);\n return channelId && (boundary === undefined || channelId > boundary);\n });\n const virtualPage = remaining.slice(0, limit);\n const channels = virtualPage.filter((conversation) =>\n types.has(slackConversationType(conversation)),\n );\n const hasMore = virtualPage.length < remaining.length;\n const nextBoundary = readTrimmedString(virtualPage.at(-1)?.id);\n return slackOk({\n channels,\n response_metadata: {\n next_cursor: hasMore && nextBoundary ? encodeSlackCursor(\"list\", nextBoundary) : \"\",\n },\n });\n }\n case \"conversations.history\": {\n const channel = requireSlackChannelId(params.body.channel);\n if (channel instanceof Response) {\n return channel;\n }\n if (!slackConversation(params.state, channel)) {\n return slackError(\"channel_not_found\");\n }\n const oldest = requireSlackThreadTs(params.body.oldest);\n if (oldest instanceof Response) {\n return oldest;\n }\n const latest = requireSlackThreadTs(params.body.latest);\n if (latest instanceof Response) {\n return latest;\n }\n const limit = requireSlackLimit(params.body.limit);\n if (limit instanceof Response) {\n return limit;\n }\n const boundary = decodeSlackCursor(params.body.cursor, \"history\");\n if (boundary instanceof Response) {\n return boundary;\n }\n const messages = messagesForChannel(params.state, channel).filter((message) => {\n if (message.thread_ts !== undefined && message.reply_broadcast !== true) {\n return false;\n }\n if (oldest && message.ts <= oldest) {\n return false;\n }\n if (latest && message.ts >= latest) {\n return false;\n }\n return true;\n });\n const ordered = [...messages]\n .reverse()\n .filter((message) => boundary === undefined || message.ts < boundary);\n const page = ordered.slice(0, limit);\n const hasMore = page.length < ordered.length;\n const nextBoundary = page.at(-1)?.ts;\n return slackOk({\n has_more: hasMore,\n messages: page,\n response_metadata: {\n next_cursor: hasMore && nextBoundary ? encodeSlackCursor(\"history\", nextBoundary) : \"\",\n },\n });\n }\n case \"conversations.replies\": {\n const channel = requireSlackChannelId(params.body.channel);\n if (channel instanceof Response) {\n return channel;\n }\n if (!slackConversation(params.state, channel)) {\n return slackError(\"channel_not_found\");\n }\n const ts = requireSlackThreadTs(params.body.ts);\n if (ts instanceof Response) {\n return ts;\n }\n if (!ts) {\n return slackError(\"message_not_found\");\n }\n const threadTs = resolveThreadTs(params.state, { channel, ts });\n if (!threadTs) {\n return slackError(\"thread_not_found\");\n }\n const limit = requireSlackLimit(params.body.limit);\n if (limit instanceof Response) {\n return limit;\n }\n const boundary = decodeSlackCursor(params.body.cursor, \"replies\");\n if (boundary instanceof Response) {\n return boundary;\n }\n const messages = messagesForChannel(params.state, channel).filter(\n (message) =>\n (message.ts === threadTs || message.thread_ts === threadTs) &&\n (boundary === undefined || message.ts > boundary),\n );\n const page = messages.slice(0, limit);\n const hasMore = page.length < messages.length;\n const nextBoundary = page.at(-1)?.ts;\n return slackOk({\n has_more: hasMore,\n messages: page,\n response_metadata: {\n next_cursor: hasMore && nextBoundary ? encodeSlackCursor(\"replies\", nextBoundary) : \"\",\n },\n });\n }\n default:\n return slackError(\"unknown_method\", 404);\n }\n}\n\nasync function handleAdminInbound(params: {\n body: Record<string, unknown>;\n state: SlackServerState;\n}): Promise<Response> {\n const channel = requireSlackChannelId(params.body.channel);\n if (channel instanceof Response) {\n return channel;\n }\n if (params.body.text !== undefined && typeof params.body.text !== \"string\") {\n return slackError(\"invalid_text\", 400);\n }\n const text = readSlackText(params.body.text) ?? \"\";\n const attachments = readStructuredArray(params.body.attachments, \"invalid_attachments\");\n if (attachments instanceof Response) {\n return attachments;\n }\n const blocks = readStructuredArray(params.body.blocks, \"invalid_blocks\");\n if (blocks instanceof Response) {\n return blocks;\n }\n const user = requireSlackUserId(params.body.user ?? \"UCRABUSER\");\n if (user instanceof Response) {\n return user;\n }\n rememberDmChannel(params.state, user, channel);\n const threadTs = requireSlackThreadTs(params.body.threadTs ?? params.body.thread_ts);\n if (threadTs instanceof Response) {\n return threadTs;\n }\n if (threadTs && !hasThreadParent(params.state, { channel, threadTs })) {\n return slackError(\"thread_not_found\");\n }\n const ts = requireSlackThreadTs(params.body.ts);\n if (ts instanceof Response) {\n return ts;\n }\n const message = appendMessage(\n params.state,\n createSlackMessage(params.state, {\n attachments,\n blocks,\n channel,\n text,\n threadTs,\n ts,\n user,\n }),\n );\n const event = asSlackEventCallback(params.state, message);\n scheduleSlackEventDelivery(params.state, event);\n return slackOk({ event, message });\n}\n\nasync function handleRequest(params: { request: IncomingMessage; state: SlackServerState }) {\n const url = new URL(params.request.url ?? \"/\", \"http://127.0.0.1\");\n if (url.pathname === \"/crabline/slack/inbound\") {\n if (params.request.method !== \"POST\") {\n return new Response(\"not found\", { status: 404 });\n }\n if (!hasAdminToken(params.request, params.state.adminToken)) {\n params.request.resume();\n return adminAuthError();\n }\n const body = await parseUnknownRequestBody(params.request);\n if (!isJsonObject(body)) {\n return slackError(\"invalid_json\", 400);\n }\n await appendEvent(params.state, {\n at: new Date().toISOString(),\n body,\n method: params.request.method,\n path: url.pathname,\n query: queryRecord(url),\n type: \"admin\",\n });\n return await handleAdminInbound({ body, state: params.state });\n }\n\n const query = queryRecord(url);\n if (url.pathname === \"/slack/events\") {\n if (params.request.method !== \"POST\") {\n params.request.resume();\n return new Response(\"method not allowed\", {\n headers: { allow: \"POST\" },\n status: 405,\n });\n }\n if (\n !params.request.headers[\"x-slack-request-timestamp\"] ||\n !params.request.headers[\"x-slack-signature\"]\n ) {\n params.request.resume();\n return new Response(\"unauthorized\", { status: 401 });\n }\n const rawBody = (await readBody(params.request)).toString(\"utf8\");\n const authError = authenticateSlackEventsRequest(params.request, params.state, rawBody);\n if (authError) {\n return authError;\n }\n let body: unknown;\n try {\n body = rawBody ? (JSON.parse(rawBody) as unknown) : {};\n } catch (error) {\n throw new InvalidJsonBodyError(error);\n }\n if (!isJsonObject(body)) {\n return slackError(\"invalid_json\", 400);\n }\n if (body.type === \"url_verification\") {\n return jsonResponse({ challenge: readTrimmedString(body.challenge) ?? \"\" });\n }\n if (!readTrimmedString(body.type)) {\n return slackError(\"invalid_payload\", 400);\n }\n return new Response(null, { status: 200 });\n }\n\n const methodMatch = /^\\/api\\/([a-z]+(?:\\.[a-zA-Z]+)*)$/u.exec(url.pathname);\n if (!methodMatch?.[1]) {\n return new Response(\"not found\", { status: 404 });\n }\n const requestMethod = params.request.method ?? \"GET\";\n if (requestMethod !== \"GET\" && requestMethod !== \"POST\") {\n params.request.resume();\n return new Response(\"method not allowed\", {\n headers: { allow: \"GET, POST\" },\n status: 405,\n });\n }\n\n if (params.request.headers.authorization) {\n const headerAuthError = requireSlackToken(params.request, {}, params.state);\n if (headerAuthError) {\n params.request.resume();\n return headerAuthError;\n }\n }\n const body = requestMethod === \"GET\" ? query : await parseUnknownRequestBody(params.request);\n if (!isJsonObject(body)) {\n return slackError(\"json_not_object\", 400);\n }\n const authError = requireSlackToken(params.request, body, params.state);\n if (authError) {\n return authError;\n }\n const event: SlackRecorderEvent = {\n at: new Date().toISOString(),\n body: redactSlackAuthFields(body),\n method: params.request.method ?? \"GET\",\n path: url.pathname,\n query: redactSlackAuthQuery(query),\n type: \"api\",\n };\n const response = await handleSlackApi({\n body,\n method: methodMatch[1],\n state: params.state,\n });\n const mutation = [\"chat.postMessage\", \"conversations.open\"].includes(methodMatch[1]);\n const recordsAcceptance = mutation || methodMatch[1] === \"auth.test\";\n const payload = recordsAcceptance\n ? ((await response\n .clone()\n .json()\n .catch(() => undefined)) as unknown)\n : undefined;\n const committed = isJsonObject(payload) && payload.ok === true;\n if (methodMatch[1] === \"auth.test\" || methodMatch[1] === \"chat.postMessage\") {\n event.accepted = committed;\n }\n await appendEvent(params.state, event, mutation && committed);\n return response;\n}\n\nexport async function startSlackServer(\n params: StartSlackServerParams = {},\n): Promise<StartedSlackServer> {\n const host = params.host ?? \"127.0.0.1\";\n const externallyBound = !isLoopbackHost(host);\n const recorderPath = params.recorderPath ?? path.resolve(\".crabline\", \"servers\", \"slack.jsonl\");\n const state: SlackServerState = {\n activeEventDeliveries: new Set(),\n adminToken: params.adminToken ?? randomBytes(24).toString(\"base64url\"),\n allowLoopbackHttpEvents: isLoopbackHost(host),\n botId: params.botId ?? \"BCRABLINE\",\n botToken: params.botToken ?? \"xoxb-crabline-slack-token\",\n botUserId: params.botUserId ?? \"UCRABBOT\",\n chatPostMessageRateLimit: resolveChatPostMessageRateLimit(params.chatPostMessageRateLimit),\n closing: false,\n deliveryAbortController: new AbortController(),\n eventsRequestUrl: params.eventsRequestUrl,\n nextDmIndex: 1,\n nextMpimIndex: 1,\n nextTsIndex: 100,\n recorder: createServerRecorder({ recorderPath, onEvent: params.onEvent }),\n recorderPath,\n restrictEventTargets: true,\n signingSecret: params.signingSecret ?? \"crabline-slack-signing-secret\",\n userDmChannels: new Map(),\n userMpimChannels: new Map(),\n messagesByChannel: new Map(),\n };\n if (externallyBound && !params.botToken) {\n const generatedBotValue = `xoxb-${randomDecimalDigits(12)}-${randomDecimalDigits(12)}-${randomBytes(18).toString(\"base64url\")}`;\n state.botToken = generatedBotValue;\n }\n if (externallyBound && !params.signingSecret) {\n const generatedSigningValue = randomBytes(16).toString(\"hex\");\n state.signingSecret = generatedSigningValue;\n }\n const httpServer = await startHttpJsonServer({\n handle: (request) => handleRequest({ request, state }),\n handleError: (error) => {\n if (error instanceof InvalidJsonBodyError) {\n return slackError(\"invalid_json\", 400);\n }\n if (error instanceof RequestBodyTooLargeError) {\n return slackError(\"request_too_large\", 413);\n }\n return undefined;\n },\n host,\n port: params.port ?? 0,\n serverName: \"Slack\",\n });\n const baseUrl = httpServer.baseUrl;\n const apiRoot = `${baseUrl}/api/`;\n return {\n close: createServerClose(state.recorder, async () => {\n state.closing = true;\n state.deliveryAbortController.abort();\n await Promise.allSettled(state.activeEventDeliveries);\n await httpServer.close();\n }),\n manifest: {\n adminToken: state.adminToken,\n baseUrl,\n botToken: state.botToken,\n endpoints: {\n adminInboundUrl: `${baseUrl}/crabline/slack/inbound`,\n apiRoot,\n eventsUrl: `${baseUrl}/slack/events`,\n },\n env: {\n SLACK_API_URL: apiRoot,\n SLACK_BOT_TOKEN: state.botToken,\n SLACK_SIGNING_SECRET: state.signingSecret,\n },\n provider: \"slack\",\n recorderPath: state.recorderPath,\n signingSecret: state.signingSecret,\n version: 1,\n },\n };\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { type IncomingMessage } from "node:http";
2
- import { type ServerEventObserver } from "./recorder.js";
2
+ import { type ServerEventObserver, type ServerRecorder } from "./recorder.js";
3
3
  type TelegramWebhook = {
4
4
  lastErrorDate?: number;
5
5
  lastErrorMessage?: string;
@@ -23,7 +23,7 @@ type TelegramServerState = {
23
23
  maxPendingInboundEvents: number;
24
24
  nextMessageIds: Map<string, number>;
25
25
  nextUpdateId: number;
26
- onEvent: ServerEventObserver | undefined;
26
+ recorder: ServerRecorder;
27
27
  recorderPath: string;
28
28
  restrictWebhookTargets: boolean;
29
29
  updates: TelegramUpdate[];
@@ -3,8 +3,8 @@ import { createHash, randomBytes } from "node:crypto";
3
3
  import { Buffer } from "node:buffer";
4
4
  import path from "node:path";
5
5
  import { CrablineError } from "../core/errors.js";
6
- import { adminAuthError, closeServer, drainRequestBody, formatUrlHost, hasAdminToken, InvalidJsonBodyError, isJsonObject, isJsonMediaType, isLoopbackHost, jsonResponse, queryRecord, readBody, RequestBodyTooLargeError, writeResponse, } from "./http.js";
7
- import { recordServerEvent } from "./recorder.js";
6
+ import { adminAuthError, closeServer, createServerClose, drainRequestBody, formatUrlHost, hasAdminToken, InvalidJsonBodyError, isJsonObject, isJsonMediaType, isLoopbackHost, jsonResponse, queryRecord, readBody, RequestBodyTooLargeError, writeResponse, } from "./http.js";
7
+ import { createServerRecorder } from "./recorder.js";
8
8
  import { resolveMaxPendingInboundEvents } from "./pending-events.js";
9
9
  import { postWebhookRequest, validateWebhookTarget, } from "./webhook-target.js";
10
10
  import { canonicalizeTelegramUsername, isTelegramUsernameChatId, TELEGRAM_BOT_USERNAME_PATTERN, TELEGRAM_NATIVE_CHAT_ID_MAX, telegramUsernameChatId, } from "./telegram-identity.js";
@@ -600,7 +600,7 @@ function telegramStoredChatId(value) {
600
600
  return chatId !== undefined && isTelegramUsernameChatId(chatId) ? chatId : undefined;
601
601
  }
602
602
  async function appendEvent(state, event) {
603
- await recordServerEvent({ event, onEvent: state.onEvent, recorderPath: state.recorderPath });
603
+ await state.recorder.record(event);
604
604
  }
605
605
  function isTelegramMultipartFile(value) {
606
606
  return (typeof value === "object" &&
@@ -2102,6 +2102,7 @@ export async function startTelegramServer(params = {}) {
2102
2102
  if (!TELEGRAM_BOT_USERNAME_PATTERN.test(`@${botUsername}`)) {
2103
2103
  throw new Error("botUsername must be a valid 5-32 character Telegram username.");
2104
2104
  }
2105
+ const recorderPath = params.recorderPath ?? path.resolve(".crabline", "servers", "telegram.jsonl");
2105
2106
  const state = {
2106
2107
  activeUpdatePoll: undefined,
2107
2108
  activeWebhookDeliveries: new Set(),
@@ -2121,8 +2122,8 @@ export async function startTelegramServer(params = {}) {
2121
2122
  maxPendingInboundEvents: resolveMaxPendingInboundEvents(params.maxPendingInboundEvents),
2122
2123
  nextMessageIds: new Map(),
2123
2124
  nextUpdateId: 1,
2124
- onEvent: params.onEvent,
2125
- recorderPath: params.recorderPath ?? path.resolve(".crabline", "servers", "telegram.jsonl"),
2125
+ recorder: createServerRecorder({ recorderPath, onEvent: params.onEvent }),
2126
+ recorderPath,
2126
2127
  restrictWebhookTargets: true,
2127
2128
  closing: false,
2128
2129
  updates: [],
@@ -2152,7 +2153,7 @@ export async function startTelegramServer(params = {}) {
2152
2153
  }
2153
2154
  const baseUrl = `http://${formatUrlHost(host)}:${address.port}`;
2154
2155
  return {
2155
- async close() {
2156
+ close: createServerClose(state.recorder, async () => {
2156
2157
  state.closing = true;
2157
2158
  finishTelegramUpdatePoll(state, "shutdown");
2158
2159
  clearTelegramWebhookRetry(state);
@@ -2164,9 +2165,8 @@ export async function startTelegramServer(params = {}) {
2164
2165
  }
2165
2166
  await state.webhookDelivery;
2166
2167
  await state.webhookAdmission;
2167
- await state.inboundAdmission;
2168
2168
  await closeServer(server);
2169
- },
2169
+ }),
2170
2170
  manifest: {
2171
2171
  adminToken: state.adminToken,
2172
2172
  baseUrl,